@messaia/cdk 13.3.8 → 13.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/table/components/dynamic-table/dynamic-table.component.mjs +21 -3
- package/fesm2015/messaia-cdk.mjs +20 -2
- package/fesm2015/messaia-cdk.mjs.map +1 -1
- package/fesm2020/messaia-cdk.mjs +20 -2
- package/fesm2020/messaia-cdk.mjs.map +1 -1
- package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +7 -0
- package/package.json +1 -1
|
@@ -301,6 +301,24 @@ export class VdDynamicTableComponent {
|
|
|
301
301
|
'gt-xxl': column.showGtXxl
|
|
302
302
|
};
|
|
303
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Gets row classes
|
|
306
|
+
* @param column
|
|
307
|
+
* @param row
|
|
308
|
+
* @returns
|
|
309
|
+
*/
|
|
310
|
+
getRowClasses(column, row) {
|
|
311
|
+
return Object.assign({
|
|
312
|
+
'gt-xs': column.showGtXs,
|
|
313
|
+
'gt-sm': column.showGtSm,
|
|
314
|
+
'gt-md': column.showGtMd,
|
|
315
|
+
'gt-lg': column.showGtLg,
|
|
316
|
+
'gt-xl': column.showGtXl,
|
|
317
|
+
'gt-xxl': column.showGtXxl,
|
|
318
|
+
'hidden': column.hidden,
|
|
319
|
+
'text-right': column.arrowBefore
|
|
320
|
+
}, column.cellNgClass ? column.cellNgClass(row, this.context) : {});
|
|
321
|
+
}
|
|
304
322
|
/**
|
|
305
323
|
* Responds to user-initiated events
|
|
306
324
|
* @param event
|
|
@@ -323,7 +341,7 @@ export class VdDynamicTableComponent {
|
|
|
323
341
|
}
|
|
324
342
|
}
|
|
325
343
|
/** @nocollapse */ VdDynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: VdDynamicTableComponent, deps: [{ token: i1.DynamicBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
326
|
-
/** @nocollapse */ VdDynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, host: { listeners: { "document:contextmenu": "handleContextMenuEvent($event)" } }, 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: "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<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\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<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<!-- column.cellNgClass ? column.cellNgClass(row, context) : { 'text-right': column.arrowBefore } -->\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = index\" [matTooltip]=\"column.tooltip?column.tooltip(row, context):null\" [matTooltipClass]=\"column.tooltipClass\" [hidden]=\"column.hidden\" [ngClass]=\"{'gt-xs': column.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [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<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\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, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\" i18n=\"@@selection\">{column.content(row) | enum:column.enumType:column.enumPrefix, select, type {type} other {{{column.content(row, context) | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t<mat-slide-toggle *ngSwitchCase=\"ColumnType.Toggle\" [(ngModel)]=\"row[column.name]\" (click)=\"$event.stopPropagation();\" (ngModelChange)=\"column.event?(column.eventArgs?column.event(row,column.eventArgs):column.event(row, context)):null\" [disabled]=\"readonly || (column.disable && column.disable(row, context))\" color=\"primary\"></mat-slide-toggle>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{column.content(row, context) | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text Input column -->\r\n\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<input type=\"{{column.inputType}}\" autocomplete=\"none\" matInput name=\"{{column.name}}{{rowIndex}}\" [(ngModel)]=\"row[column.name]\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, context)))\" (ngModelChange)=\"column.change?column.change(row, context):patch(row, [column.name], row[column.name], column.patchIncludes)\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"$event.target.blur();false\">\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\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<vd-dynamic-menu [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"column.content ? column.content(row, context):''\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</ng-container>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\">\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number || column.type == ColumnType.Menu\" filter-input [onlyNumber]=\"column.filterInputNumber\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Select || column.type == ColumnType.Enum || column.type == ColumnType.Toggle\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date\" filter-date></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"(displayedColumns$ | async).length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate></div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\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<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\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<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-table .mat-row .mat-cell .mat-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-table [gt-xs],::ng-deep .mat-table .gt-xs{display:none}::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}\n"], components: [{ type: i2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i4.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i8.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["menu", "item", "context"] }, { type: i9.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { type: i10.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enum", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { type: i11.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { type: i12.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i15.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["sticky", "cdkColumnDef", "stickyEnd"] }, { type: i16.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i16.CdkCellDef, selector: "[cdkCellDef]" }, { type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i17.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i18.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i19.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"] }, { type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i20.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i21.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { type: i3.MatCellDef, selector: "[matCellDef]" }, { type: i16.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { type: i16.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }], pipes: { "async": i14.AsyncPipe, "enum": i22.EnumPipe, "date": i14.DatePipe }, animations: [
|
|
344
|
+
/** @nocollapse */ VdDynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, host: { listeners: { "document:contextmenu": "handleContextMenuEvent($event)" } }, 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: "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<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\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<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<!-- column.cellNgClass ? column.cellNgClass(row, context) : { 'text-right': column.arrowBefore } -->\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = index\" [matTooltip]=\"column.tooltip?column.tooltip(row, 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<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\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, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\" i18n=\"@@selection\">{column.content(row) | enum:column.enumType:column.enumPrefix, select, type {type} other {{{column.content(row, context) | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t<mat-slide-toggle *ngSwitchCase=\"ColumnType.Toggle\" [(ngModel)]=\"row[column.name]\" (click)=\"$event.stopPropagation();\" (ngModelChange)=\"column.event?(column.eventArgs?column.event(row,column.eventArgs):column.event(row, context)):null\" [disabled]=\"readonly || (column.disable && column.disable(row, context))\" color=\"primary\"></mat-slide-toggle>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{column.content(row, context) | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text Input column -->\r\n\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<input type=\"{{column.inputType}}\" autocomplete=\"none\" matInput name=\"{{column.name}}{{rowIndex}}\" [(ngModel)]=\"row[column.name]\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, context)))\" (ngModelChange)=\"column.change?column.change(row, context):patch(row, [column.name], row[column.name], column.patchIncludes)\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"$event.target.blur();false\">\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\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<vd-dynamic-menu [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"column.content ? column.content(row, context):''\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</ng-container>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\">\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number || column.type == ColumnType.Menu\" filter-input [onlyNumber]=\"column.filterInputNumber\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Select || column.type == ColumnType.Enum || column.type == ColumnType.Toggle\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date\" filter-date></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"(displayedColumns$ | async).length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate></div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\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<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\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<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-table .mat-row .mat-cell .mat-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-table [gt-xs],::ng-deep .mat-table .gt-xs{display:none}::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}\n"], components: [{ type: i2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i4.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i8.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["menu", "item", "context"] }, { type: i9.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { type: i10.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enum", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { type: i11.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { type: i12.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i13.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i14.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i15.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { type: i14.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i14.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i16.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["sticky", "cdkColumnDef", "stickyEnd"] }, { type: i16.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i14.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i16.CdkCellDef, selector: "[cdkCellDef]" }, { type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i17.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i14.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i18.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i19.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"] }, { type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i20.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i14.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i21.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { type: i3.MatCellDef, selector: "[matCellDef]" }, { type: i16.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { type: i16.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }], pipes: { "async": i14.AsyncPipe, "enum": i22.EnumPipe, "date": i14.DatePipe }, animations: [
|
|
327
345
|
trigger('detailExpand', [
|
|
328
346
|
state('collapsed', style({ display: 'none' })),
|
|
329
347
|
state('expanded', style({ display: 'initial' })),
|
|
@@ -338,7 +356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImpor
|
|
|
338
356
|
state('expanded', style({ display: 'initial' })),
|
|
339
357
|
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
340
358
|
]),
|
|
341
|
-
], 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<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\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<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<!-- column.cellNgClass ? column.cellNgClass(row, context) : { 'text-right': column.arrowBefore } -->\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = index\" [matTooltip]=\"column.tooltip?column.tooltip(row, context):null\" [matTooltipClass]=\"column.tooltipClass\" [hidden]=\"column.hidden\" [ngClass]=\"{'gt-xs': column.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [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<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\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, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\" i18n=\"@@selection\">{column.content(row) | enum:column.enumType:column.enumPrefix, select, type {type} other {{{column.content(row, context) | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t<mat-slide-toggle *ngSwitchCase=\"ColumnType.Toggle\" [(ngModel)]=\"row[column.name]\" (click)=\"$event.stopPropagation();\" (ngModelChange)=\"column.event?(column.eventArgs?column.event(row,column.eventArgs):column.event(row, context)):null\" [disabled]=\"readonly || (column.disable && column.disable(row, context))\" color=\"primary\"></mat-slide-toggle>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{column.content(row, context) | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text Input column -->\r\n\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<input type=\"{{column.inputType}}\" autocomplete=\"none\" matInput name=\"{{column.name}}{{rowIndex}}\" [(ngModel)]=\"row[column.name]\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, context)))\" (ngModelChange)=\"column.change?column.change(row, context):patch(row, [column.name], row[column.name], column.patchIncludes)\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"$event.target.blur();false\">\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\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<vd-dynamic-menu [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"column.content ? column.content(row, context):''\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</ng-container>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\">\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number || column.type == ColumnType.Menu\" filter-input [onlyNumber]=\"column.filterInputNumber\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Select || column.type == ColumnType.Enum || column.type == ColumnType.Toggle\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date\" filter-date></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"(displayedColumns$ | async).length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate></div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\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<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\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<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-table .mat-row .mat-cell .mat-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-table [gt-xs],::ng-deep .mat-table .gt-xs{display:none}::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}\n"] }]
|
|
359
|
+
], 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<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !detailsTemplate}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t<!-- #region Column def -->\r\n\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\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<span *ngIf=\"column.type != ColumnType.Checkbox\">{{column.header}}</span>\r\n\t\t\t</th>\r\n\r\n\t\t\t<!-- column.cellNgClass ? column.cellNgClass(row, context) : { 'text-right': column.arrowBefore } -->\r\n\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = index\" [matTooltip]=\"column.tooltip?column.tooltip(row, 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<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\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, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\" i18n=\"@@selection\">{column.content(row) | enum:column.enumType:column.enumPrefix, select, type {type} other {{{column.content(row, context) | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t<mat-slide-toggle *ngSwitchCase=\"ColumnType.Toggle\" [(ngModel)]=\"row[column.name]\" (click)=\"$event.stopPropagation();\" (ngModelChange)=\"column.event?(column.eventArgs?column.event(row,column.eventArgs):column.event(row, context)):null\" [disabled]=\"readonly || (column.disable && column.disable(row, context))\" color=\"primary\"></mat-slide-toggle>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{column.content(row, context) | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Text Input column -->\r\n\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<input type=\"{{column.inputType}}\" autocomplete=\"none\" matInput name=\"{{column.name}}{{rowIndex}}\" [(ngModel)]=\"row[column.name]\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, context)))\" (ngModelChange)=\"column.change?column.change(row, context):patch(row, [column.name], row[column.name], column.patchIncludes)\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"$event.target.blur();false\">\r\n\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\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<vd-dynamic-menu [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [menu]=\"column.menu\" [item]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"column.content ? column.content(row, context):''\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</ng-container>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</ng-container>\r\n\r\n\t<!-- #region Filter row -->\r\n\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\">\r\n\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.showGtXs, 'gt-sm': column.showGtSm, 'gt-md': column.showGtMd, 'gt-lg': column.showGtLg, 'gt-xl': column.showGtXl, 'gt-xxl': column.showGtXxl}\">\r\n\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number || column.type == ColumnType.Menu\" filter-input [onlyNumber]=\"column.filterInputNumber\" [operator]=\"column.filterOperator\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Select || column.type == ColumnType.Enum || column.type == ColumnType.Toggle\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date\" filter-date></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t</th>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Details column -->\r\n\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"(displayedColumns$ | async).length\">\r\n\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate></div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<!-- #region Filter header -->\r\n\t<ng-container *ngIf=\"filterable\">\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n\r\n\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\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<!-- #region Detrails row -->\r\n\t<ng-container *ngIf=\"detailsTemplate\">\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t</ng-container>\r\n\t<!-- #endregion -->\r\n</table>\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<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-table .mat-row .mat-cell .mat-form-field .mat-form-field-wrapper{width:100%}@media (max-width: 389px){::ng-deep .mat-table [gt-xs],::ng-deep .mat-table .gt-xs{display:none}::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-table [gt-sm],::ng-deep .mat-table .gt-sm{display:none}::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-table [gt-md],::ng-deep .mat-table .gt-md{display:none}::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-table [gt-lg],::ng-deep .mat-table .gt-lg{display:none}::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-table [gt-xl],::ng-deep .mat-table .gt-xl{display:none}::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-table [gt-xxl],::ng-deep .mat-table .gt-xxl{display:none}}\n"] }]
|
|
342
360
|
}], ctorParameters: function () { return [{ type: i1.DynamicBuilder }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { table: [{
|
|
343
361
|
type: ViewChild,
|
|
344
362
|
args: ['table']
|
|
@@ -404,4 +422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImpor
|
|
|
404
422
|
type: HostListener,
|
|
405
423
|
args: ['document:contextmenu', ['$event']]
|
|
406
424
|
}] } });
|
|
407
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjdkUsTUFBTSxPQUFPLHVCQUF1QjtJQW9PbkM7OztPQUdHO0lBQ0gsWUFBb0IsY0FBOEIsRUFBVSxjQUFpQztRQUF6RSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUE3TDdGOztXQUVHO1FBRUkscUJBQWdCLEdBQVEsRUFBRSxDQUFDO1FBRWxDOztXQUVHO1FBRUksV0FBTSxHQUFZLEtBQUssQ0FBQztRQUUvQjs7V0FFRztRQUVJLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFFSSxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRWxDOztXQUVHO1FBRUksZUFBVSxHQUFZLEtBQUssQ0FBQztRQWNuQzs7V0FFRztRQUVJLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRXBDOztXQUVHO1FBRUksaUJBQVksR0FBWSxJQUFJLENBQUM7UUFFcEM7O1dBRUc7UUFFSSxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFjN0Q7O1dBRUc7UUFDSSxjQUFTLEdBQVksS0FBSyxDQUFDO1FBc0NsQzs7V0FFRztRQUNLLGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBU3JDOztXQUVHO1FBQ0ksbUJBQWMsR0FBOEMsSUFBSSxlQUFlLENBQTJCLEVBQUUsQ0FBQyxDQUFDO1FBRXJIOztXQUVHO1FBQ0ksYUFBUSxHQUF5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBWTNGOztXQUVHO1FBRUksaUJBQVksR0FBb0IsRUFBRSxDQUFDO1FBRTFDOztXQUVHO1FBRUksb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFRdEM7O1dBRUc7UUFDSSxlQUFVLEdBQTJCLGVBQWUsQ0FBQztRQU81RDs7V0FFRztRQUVJLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFFSSxvQkFBZSxHQUFrQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQU11QixDQUFDO0lBck5sRzs7T0FFRztJQUNILElBQ0ksSUFBSSxDQUFDLElBQVM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBQUEsQ0FBQztJQTJGRjs7T0FFRztJQUNILElBQ0ksUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxRQUFRLENBQUMsUUFBUTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFtQkQ7O09BRUc7SUFDSCxJQUNJLFNBQVMsQ0FBQyxTQUF1QjtRQUNwQyxJQUFJLFNBQVMsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUN0QztJQUNGLENBQUM7SUFBQSxDQUFDO0lBT0Y7O09BRUc7SUFDSCxJQUNJLE9BQU8sS0FBb0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDdkQsSUFBSSxPQUFPLENBQUMsT0FBc0IsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFBQSxDQUFDO0lBVTBCLENBQUM7SUEwRDVGOzs7Ozs7T0FNRztJQUNILFFBQVE7UUFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsbURBQW1EO1lBQ25ELElBQUksZUFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6RCxJQUFJLGVBQWUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbEMsK0NBQStDO29CQUMvQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUM7b0JBRWhFLDBDQUEwQztvQkFDMUMsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO3dCQUN6QixZQUFZLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRTtvQkFFRCw2QkFBNkI7eUJBQ3hCO3dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDOzRCQUNsQyxLQUFLLEVBQUUsSUFBSTs0QkFDWCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxJQUFJLEVBQUUsZUFBZSxDQUFDLE1BQU07NEJBQzVCLFFBQVEsRUFBRSxJQUFJOzRCQUNkLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTs0QkFDL0IsWUFBWSxFQUFFLEtBQUs7eUJBQ25CLENBQUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNEO2dCQUVELHlCQUF5QjtnQkFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUN6RTthQUNEO1NBQ0Q7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25KLENBQUMsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ25CLCtCQUErQjtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTdDLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsR0FBUSxFQUFFLE1BQW1CO1FBQzFELE9BQU8sTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFRO1FBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0Y7YUFBTTtZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxtQkFBbUIsQ0FBQyxLQUFpQixFQUFFLElBQVM7UUFDdEQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hKLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN4Qiw2RUFBNkU7WUFDN0UsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLGtDQUFrQztZQUNsQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLFlBQVksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFFcEkseUNBQXlDO1lBQ3pDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUE7WUFFckMsbUJBQW1CO1lBQ25CLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjtJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxHQUFRLEVBQUUsTUFBcUIsRUFBRSxLQUFVLEVBQUUsUUFBYTtRQUN0RSxzQkFBc0I7UUFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQU8sQ0FBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxNQUFNLEVBQUU7WUFDWCx5QkFBeUI7WUFDekIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0gsa0JBQWtCO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTztpQkFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUMxSSxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVU7UUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sWUFBWSxDQUFDLE1BQW1CLEVBQUUsR0FBUTtRQUNuRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVJLENBQUM7SUFFRDs7O09BR0c7SUFDTyxrQkFBa0IsQ0FBQyxNQUFtQjtRQUMvQyxPQUFPO1lBQ04sT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFFSCxzQkFBc0IsQ0FBQyxLQUFtQjtRQUN6Qyw2RUFBNkU7UUFDN0UsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLDBCQUEwQjtRQUMxQixJQUFLLEtBQUssQ0FBQyxNQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNwRTtJQUNGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckMsQ0FBQzs7dUlBN2FXLHVCQUF1QjsySEFBdkIsdUJBQXVCLDA0QkEwSXhCLE9BQU8sMEZBV1AsWUFBWSxzSEEzSWtCLGdCQUFnQix5REFpTTNDLGNBQWMsZ0RDeE83Qiw0NVNBc0hNLDB3TkRqR087UUFDWCxPQUFPLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDckYsQ0FBQztLQUNGOzJGQUVXLHVCQUF1QjtrQkFabkMsU0FBUzsrQkFDQyxrQkFBa0IsY0FHaEI7d0JBQ1gsT0FBTyxDQUFDLGNBQWMsRUFBRTs0QkFDdkIsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs0QkFDOUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzs0QkFDaEQsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3lCQUNyRixDQUFDO3FCQUNGO3FJQU9NLEtBQUs7c0JBRFgsU0FBUzt1QkFBQyxPQUFPO2dCQU9YLGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPcEQsVUFBVTtzQkFEaEIsS0FBSztnQkFPRixJQUFJO3NCQURQLEtBQUs7Z0JBYUMsU0FBUztzQkFEZixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBT0MsTUFBTTtzQkFEWixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsU0FBUztzQkFEZixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0MsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxRQUFRO3NCQURkLE1BQU07Z0JBT0EsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkFVQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLE9BQU87c0JBRGIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVloQyxTQUFTO3NCQURaLFNBQVM7dUJBQUMsWUFBWTtnQkFnQm5CLE9BQU87c0JBRFYsS0FBSztnQkE0QkMsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLHNCQUFzQjtzQkFENUIsWUFBWTt1QkFBQyxjQUFjO2dCQWlCckIsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUs7Z0JBMkxOLHNCQUFzQjtzQkFEckIsWUFBWTt1QkFBQyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgRHluYW1pY0J1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaGVscGVycy9keW5hbWljLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90YWJsZS1jb2x1bW4tdHlwZSc7XHJcbmltcG9ydCB7IGdldFRhYmxlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS1jb2x1bW4nO1xyXG5pbXBvcnQgeyBUYWJsZU1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLW1lbnUtaXRlbSc7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVGFibGVTdGF0aWNEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuc3RhdGljLWRhdGEtc291cmNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtZHluYW1pYy10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICdkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdGFuaW1hdGlvbnM6IFtcclxuXHRcdHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuXHRcdFx0c3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgZGlzcGxheTogJ25vbmUnIH0pKSxcclxuXHRcdFx0c3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBkaXNwbGF5OiAnaW5pdGlhbCcgfSkpLFxyXG5cdFx0XHR0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxyXG5cdFx0XSksXHJcblx0XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKCd0YWJsZScpXHJcblx0cHVibGljIHRhYmxlOiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdkZXRhaWxzVGVtcGxhdGUnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlUmVmOiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YS10YWJsZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPGFueSwgYW55PiB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgZGF0YVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0c2V0IGRhdGEoZGF0YTogYW55KSB7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UgPSBuZXcgVGFibGVTdGF0aWNEYXRhU291cmNlKGRhdGEpO1xyXG5cdFx0dGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLm1hdFNvcnQ7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5fcGFnaW5hdG9yO1xyXG5cdFx0dGhpcy5wYWdpbmFibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5zdGF0aWMgPSB0cnVlO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsYXNzIHR5cGVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBjb250ZXh0IFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogZGF0YVNvdXJjZUZpbHRlcjogYW55XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGF0YVNvdXJjZUZpbHRlcjogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXRpYyB0YWJsZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0YXRpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBmaWx0ZXJhYmxlP1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBwYWdpbmFibGU/XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIHRoZSBjb2x1bW4gJ0NoZWNrYm94J1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGNvbHVtblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnRBY3RpdmU6IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGRpcmVjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnREaXJlY3Rpb246IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3RpY2t5IGhlYWRlclxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0aWNreUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0aWNreSBmaWx0ZXJcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBSb3cgY2xpY2sgZXZlbnRcclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJvd05nQ2xhc3M6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TmdDbGFzczogRnVuY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIGRldGFpbHNUZW1wbGF0ZTogRnVuY3Rpb25cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU6IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogX3JlYWRvbmx5OiBib29sZWFuO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogcmVhZG9ubHk6IGJvb2xlYW47XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcmVhZG9ubHkoKSB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cdHNldCByZWFkb25seShyZWFkb25seSkge1xyXG5cdFx0dGhpcy5fcmVhZG9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVhZG9ubHkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogc2VsZWN0QWxsRmlsdGVyOiBGdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdEFsbEZpbHRlcjogKHZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4gdW5rbm93bjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRTb3J0IGF0dHJpYnV0ZVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgbWF0U29ydDogTWF0U29ydDtcclxuXHJcblx0LyoqXHJcblx0ICogX3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXHJcblx0c2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG5cdFx0aWYgKHBhZ2luYXRvcikge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gcGFnaW5hdG9yO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfY29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBjb2x1bW5zOiBDb2x1bW5bXVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9O1xyXG5cdHNldCBjb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnNTdWJqZWN0OiBTdWJqZWN0PChUYWJsZUNvbHVtbiB8IHN0cmluZylbXT5cclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1uc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+KFtdKTtcclxuXHJcblx0LyoqXHJcblx0ICogY29sdW1ucyQ6IE9ic2VydmFibGU8KFRhYmxlQ29sdW1uIHwgc3RyaW5nKVtdPlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zJDogT2JzZXJ2YWJsZTwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+ID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKTs7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BsYXllZCBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZENvbHVtbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGZpbHRlciBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgcm93IG1lbnUgaXRlbXNcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dNZW51SXRlbXM6IFRhYmxlTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb2x1bW5zIHRvIGV4Y2x1ZGVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBleGNsdWRlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgTWF0TWVudVRyaWdnZXIgaW4gdGhlIERPTVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0TWVudVRyaWdnZXIpXHJcblx0cHVibGljIHJvd0NvbnRleHRNZW51VHJpZ2dlcnM6IFF1ZXJ5TGlzdDxNYXRNZW51VHJpZ2dlcj47XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtblR5cGU6IENvbHVtblR5cGVcclxuXHQgKi9cclxuXHRwdWJsaWMgQ29sdW1uVHlwZTogdHlwZW9mIFRhYmxlQ29sdW1uVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcclxuXHJcblx0LyoqXHJcblx0ICogZXhwYW5kZWRSb3c6IGFueVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBleHBhbmRlZFJvdzogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBEZWZhdWx0IHBhZ2Ugc2l6ZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSAxNTtcclxuXHJcblx0LyoqXHJcblx0ICogUGFnZSBzaXplIG9wdGlvbnNcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbNSwgMTAsIDE1LCAyMCwgMzAsIDUwLCAxMDAsIDIwMF07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIGR5bmFtaWNCdWlsZGVyIFxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZHluYW1pY0J1aWxkZXI6IER5bmFtaWNCdWlsZGVyLCBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuXHQgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG5cdCAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSB2aWV3IG9yIGNvbnRlbnQgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuXHJcblx0ICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNsYXNzVHlwZSkge1xyXG5cdFx0XHQvKiBHZXQgdGhlIHRhYmxlIGRlZmluaXRpb24gdXNpbmcgdGhlIGNsYXNzIHR5cGUgKi9cclxuXHRcdFx0dmFyIHRhYmxlRGVmaW5pdGlvbiA9IGdldFRhYmxlRGVmaW5pdGlvbih0aGlzLmNsYXNzVHlwZSk7XHJcblx0XHRcdGlmICh0YWJsZURlZmluaXRpb24pIHtcclxuXHRcdFx0XHR0aGlzLmNvbHVtbnMgPSBbLi4udGFibGVEZWZpbml0aW9uLmNvbHVtbnNdO1xyXG5cdFx0XHRcdGlmICh0aGlzLnJvd01lbnVJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGFjdGlvbiBjb2x1bW4gYWxyZWFkeSBleGlzdHMgKi9cclxuXHRcdFx0XHRcdHZhciBhY3Rpb25Db2xtdW4gPSB0aGlzLl9jb2x1bW5zPy5maW5kKHggPT4geC5uYW1lID09ICdhY3Rpb24nKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBzbywganVzdCBhZGQgdGhlIG1lbnUgaXRlbXMgdG8gaXQgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb25Db2xtdW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRhY3Rpb25Db2xtdW4ucm93TWVudUl0ZW1zID0gW107XHJcblx0XHRcdFx0XHRcdHRoaXMucm93TWVudUl0ZW1zLmZvckVhY2goeSA9PiBhY3Rpb25Db2xtdW4ucm93TWVudUl0ZW1zLnVuc2hpZnQoeSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSBhZGQgYSBuZXcgb25lICovXHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVGFibGVDb2x1bW5UeXBlLkFjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRyb3dNZW51SXRlbXM6IHRoaXMucm93TWVudUl0ZW1zLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogQWRkIGNoZWNrYm94IGNvbHVtbiAqL1xyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sdW1ucy51bnNoaWZ0KHsgbmFtZTogJ3NlbGVjdCcsIHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5DaGVja2JveCB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBCdWlsZCBkaXNwbGF5ZWQgY29sdW1ucyAmIGZpbHRlciAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zJD8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2YodGhpcy5jb2x1bW5zPy5maWx0ZXIoeCA9PiAhdGhpcy5leGNsdWRlZENvbHVtbnM/LmluY2x1ZGVzKHgubmFtZSkpPy5tYXAoYyA9PiBjLm5hbWUpKTtcclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHRoaXMuY29sdW1ucz8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKT8ubWFwKGMgPT4gYGZpbHRlci4keyhjLmZpbHRlciB8fCBjLm5hbWUpfWApKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgdGFibGUgY29sdW1ucyAqL1xyXG5cdFx0dGhpcy51cGRhdGVDb2x1bW5zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0YWJsZSBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIHVwZGF0ZUNvbHVtbnMoKTogdm9pZCB7XHJcblx0XHQvKiBTb3J0IHRoZSBjb2x1bW5zIGJ5IGluZGV4ICovXHJcblx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy5jb2x1bW5zIHx8IFtdLCAnaW5kZXgnKTtcclxuXHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ291bnRzIHZpc2libGUgYWN0aW9uIG1lbnVzXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdzogYW55LCBjb2x1bW46IFRhYmxlQ29sdW1uKSB7XHJcblx0XHRyZXR1cm4gY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID4gMDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYCR7aXRlbS5pZH1gO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyByb3cgY2xpY2sgZXZlbnRcclxuXHQgKiBAcGFyYW0gaW5kZXggXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93Q2xpY2soaW5kZXg6IGFueSwgcm93OiBhbnkpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmRldGFpbHNUZW1wbGF0ZSkge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdFx0dGhpcy5keW5hbWljQnVpbGRlci5jb21waWxlSHRtbCh0aGlzLmRldGFpbHNUZW1wbGF0ZVJlZi5nZXQoaW5kZXgpLCB0aGlzLmRldGFpbHNUZW1wbGF0ZSwgcm93KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrIHdpdGggdGhlIHJpZ2h0IGJ1dHRvblxyXG5cdCAqIEBwYXJhbSBldmVudCBNb3VzZUV2ZW50LCBpdCBjb250YWlucyB0aGUgY29vcmRpbmF0ZXNcclxuXHQgKiBAcGFyYW0gaXRlbSBPdXIgZGF0YSBjb250YWluZWQgaW4gdGhlIHJvdyBvZiB0aGUgdGFibGVcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93UmlnaHRDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcblx0XHR0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZm9yRWFjaCh4ID0+IHguY2xvc2VNZW51KCkpO1xyXG5cdFx0dmFyIG1lbnVUcmlnZ2VyID0gdGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZpbHRlcih4ID0+IHhbJ19lbGVtZW50J10/Lm5hdGl2ZUVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnaWQnKSA9PSBgbWVudS0ke2l0ZW0uaWR9YClbMF07XHJcblx0XHRpZiAobWVudVRyaWdnZXIgIT0gbnVsbCkge1xyXG5cdFx0XHQvKiBBdm9pZHMgdG8gc2hvdyB0aGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgcmlnaHQtY2xpY2sgbWVudSBvZiB0aGUgYnJvd3NlciAqL1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0LyogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlclsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6ICR7ZXZlbnQuY2xpZW50WH1weDsgdG9wOiAke2V2ZW50LmNsaWVudFl9cHhgKTtcclxuXHJcblx0XHRcdC8qIFBhc3MgdG8gdGhlIG1lbnUgdGhlIGN1cnJlbnQgb2JqZWN0ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyLm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH1cclxuXHJcblx0XHRcdC8qIE9wZW4gdGhlIG1lbnUgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIub3Blbk1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdGNoZXMgYW4gZW50aXR5XHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gZmllbGROYW1lIFxyXG5cdCAqIEBwYXJhbSBwYXRoIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaChyb3c6IGFueSwgZmllbGRzOiBBcnJheTxzdHJpbmc+LCB2YWx1ZTogYW55LCBpbmNsdWRlczogYW55KTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZW50aXR5IGJ5IElEICovXHJcblx0XHRsZXQgZW50aXR5ID0gdGhpcy5kYXRhU291cmNlLml0ZW1zPy5maWx0ZXIoeCA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlLnJlbmRlclJvd3MoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgY2VsbCBjbGFzc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldENlbGxDbGFzcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihjb2x1bW4uY2VsbE5nQ2xhc3MgPyBjb2x1bW4uY2VsbE5nQ2xhc3Mocm93KSA6IHsgJ3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmUgfSwgdGhpcy5nZXRWaXNpYmlsaXR5Q2xhc3MoY29sdW1uKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIGNlbGwgY2xhc3NcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRWaXNpYmlsaXR5Q2xhc3MoY29sdW1uOiBUYWJsZUNvbHVtbik6IGFueSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHQnZ3QteHMnOiBjb2x1bW4uc2hvd0d0WHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5zaG93R3RTbSxcclxuXHRcdFx0J2d0LW1kJzogY29sdW1uLnNob3dHdE1kLFxyXG5cdFx0XHQnZ3QtbGcnOiBjb2x1bW4uc2hvd0d0TGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5zaG93R3RYbCxcclxuXHRcdFx0J2d0LXh4bCc6IGNvbHVtbi5zaG93R3RYeGxcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBldmVudHNcclxuXHQgKiBAcGFyYW0gZXZlbnQgXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y29udGV4dG1lbnUnLCBbJyRldmVudCddKVxyXG5cdGhhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG5cdFx0LyogQXZvaWRzIHRvIHNob3cgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIHJpZ2h0LWNsaWNrIG1lbnUgb2YgdGhlIGJyb3dzZXIgKi9cclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0LyogQ2xvc2UgYWxsIG9wZW4gbWVudXMgKi9cclxuXHRcdGlmICgoZXZlbnQudGFyZ2V0IGFzIGFueSk/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2Nkay1vdmVybGF5LWJhY2tkcm9wJykpIHtcclxuXHRcdFx0dGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZvckVhY2goeCA9PiB4LmNsb3NlTWVudSgpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxufSIsIjxkaXYgY2xhc3M9XCJsb2FkaW5nLXByb2dyZXNzXCIgKm5nSWY9XCIhc3RhdGljXCI+XHJcblx0PG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImRhdGFTb3VyY2U/LmlzTG9hZGluZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuPC9kaXY+XHJcblxyXG48IS0tICNyZWdpb24gRGF0YSB0YWJsZSAtLT5cclxuPHRhYmxlIG1hdC10YWJsZSAjdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFtkYXRhU291cmNlRmlsdGVyXT1cImRhdGFTb3VyY2VGaWx0ZXJcIiBbbmdDbGFzc109XCJ7J3RhYmxlLWZpeGVkJzogIWRldGFpbHNUZW1wbGF0ZX1cIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCIgbXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxyXG5cdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHQ8IS0tICNyZWdpb24gQ29sdW1uIGRlZiAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiIFtzdGlja3ldPVwiY29sdW1uLnN0aWNreVwiIFtzdGlja3lFbmRdPVwiY29sdW1uLnN0aWNreUVuZFwiPlxyXG5cdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLnNob3dHdFhzLCAnZ3Qtc20nOiBjb2x1bW4uc2hvd0d0U20sICdndC1tZCc6IGNvbHVtbi5zaG93R3RNZCwgJ2d0LWxnJzogY29sdW1uLnNob3dHdExnLCAnZ3QteGwnOiBjb2x1bW4uc2hvd0d0WGwsICdndC14eGwnOiBjb2x1bW4uc2hvd0d0WHhsfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQ2hlY2tib3hcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2UudG9nZ2xlU2VsZWN0KCRldmVudCwgc2VsZWN0QWxsRmlsdGVyKSA6IG51bGxcIiBbZGlzYWJsZWRdPVwiIWRhdGFTb3VyY2UucGFnaW5hdG9yPy5sZW5ndGhcIiBbY2hlY2tlZF09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgZGF0YVNvdXJjZS5pc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgIWRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCI+PC9tYXQtY2hlY2tib3g+XHJcblx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSAhPSBDb2x1bW5UeXBlLkNoZWNrYm94XCI+e3tjb2x1bW4uaGVhZGVyfX08L3NwYW4+XHJcblx0XHRcdDwvdGg+XHJcblxyXG5cdFx0XHQ8IS0tIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIGNvbnRleHQpIDogeyAndGV4dC1yaWdodCc6IGNvbHVtbi5hcnJvd0JlZm9yZSB9IC0tPlxyXG5cdFx0XHQ8dGQgbWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93OyBsZXQgcm93SW5kZXggPSBpbmRleFwiIFttYXRUb29sdGlwXT1cImNvbHVtbi50b29sdGlwP2NvbHVtbi50b29sdGlwKHJvdywgY29udGV4dCk6bnVsbFwiIFttYXRUb29sdGlwQ2xhc3NdPVwiY29sdW1uLnRvb2x0aXBDbGFzc1wiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uc2hvd0d0WHMsICdndC1zbSc6IGNvbHVtbi5zaG93R3RTbSwgJ2d0LW1kJzogY29sdW1uLnNob3dHdE1kLCAnZ3QtbGcnOiBjb2x1bW4uc2hvd0d0TGcsICdndC14bCc6IGNvbHVtbi5zaG93R3RYbCwgJ2d0LXh4bCc6IGNvbHVtbi5zaG93R3RYeGx9XCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRW51bSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHQ8bWF0LWNoZWNrYm94ICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC50b2dnbGUocm93KSA6IG51bGxcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRW51bSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2NvbHVtbi5jb250ZW50KHJvdykgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tjb2x1bW4uY29udGVudChyb3csIGNvbnRleHQpIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUb2dnbGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVG9nZ2xlXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIiAobmdNb2RlbENoYW5nZSk9XCJjb2x1bW4uZXZlbnQ/KGNvbHVtbi5ldmVudEFyZ3M/Y29sdW1uLmV2ZW50KHJvdyxjb2x1bW4uZXZlbnRBcmdzKTpjb2x1bW4uZXZlbnQocm93LCBjb250ZXh0KSk6bnVsbFwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCBjb250ZXh0KSlcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7Y29sdW1uLmNvbnRlbnQocm93LCBjb250ZXh0KSB8IGRhdGU6Y29sdW1uLnNob3J0RGF0ZT8nZGQuTU0ueXl5eSc6J2RkLk1NLnl5eXkgSEg6bW06c3MnfX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ7e2NvbHVtbi5pbnB1dFR5cGV9fVwiIGF1dG9jb21wbGV0ZT1cIm5vbmVcIiBtYXRJbnB1dCBuYW1lPVwie3tjb2x1bW4ubmFtZX19e3tyb3dJbmRleH19XCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgY29udGV4dCkpKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgcm93W2NvbHVtbi5uYW1lXSwgY29sdW1uLnBhdGNoSW5jbHVkZXMpXCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cIiRldmVudC50YXJnZXQuYmx1cigpO2ZhbHNlXCI+XHJcblx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkFjdGlvblwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51XCIgKm5nSWY9XCJtZW51Py5tYXRNZW51ICYmICFyb3cubG9ja2VkICYmIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93LCBjb2x1bW4pXCI+PC9kaXY+XHJcblx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgW21lbnVdPVwiY29sdW1uLm1lbnVcIiBbaXRlbV09XCJyb3dcIiBbY29udGV4dF09XCJjb250ZXh0XCIgI21lbnU+PC92ZC1keW5hbWljLW1lbnU+XHJcblx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFttZW51XT1cImNvbHVtbi5tZW51XCIgW2l0ZW1dPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IFtpbm5lckh0bWxdPVwiY29sdW1uLmNvbnRlbnQgPyBjb2x1bW4uY29udGVudChyb3csIGNvbnRleHQpOicnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBGaWx0ZXIgcm93IC0tPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIGZpbHRlcmFibGVcIj5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgY2RrQ29sdW1uRGVmPVwiZmlsdGVyLnt7Y29sdW1uLmZpbHRlciB8fCBjb2x1bW4ubmFtZX19XCI+XHJcblx0XHRcdFx0PHRoIG1hdC1oZWFkZXItY2VsbCAqY2RrSGVhZGVyQ2VsbERlZiBbaGlkZGVuXT1cImNvbHVtbi5oaWRkZW5cIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCIgW25nQ2xhc3NdPVwieydndC14cyc6IGNvbHVtbi5zaG93R3RYcywgJ2d0LXNtJzogY29sdW1uLnNob3dHdFNtLCAnZ3QtbWQnOiBjb2x1bW4uc2hvd0d0TWQsICdndC1sZyc6IGNvbHVtbi5zaG93R3RMZywgJ2d0LXhsJzogY29sdW1uLnNob3dHdFhsLCAnZ3QteHhsJzogY29sdW1uLnNob3dHdFh4bH1cIj5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUZXh0IGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0IHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuVGV4dElucHV0IHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuTnVtYmVyIHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuTWVudVwiIGZpbHRlci1pbnB1dCBbb25seU51bWJlcl09XCJjb2x1bW4uZmlsdGVySW5wdXROdW1iZXJcIiBbb3BlcmF0b3JdPVwiY29sdW1uLmZpbHRlck9wZXJhdG9yXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlNlbGVjdCB8fCBjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkVudW0gfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5Ub2dnbGVcIiBmaWx0ZXItc2VsZWN0IFtlbmRwb2ludF09XCJjb2x1bW4uZW5kcG9pbnRcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbdGV4dF09XCJjb2x1bW4uZmlsdGVyT3B0aW9uVGV4dCB8fCAnbmFtZSdcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkRhdGVcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEFjdGlvbiBmaWx0ZXIgKGNsZWFyKSAtLT5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5BY3Rpb25cIiBmaWx0ZXItY2xlYXI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdDwvdGg+XHJcblx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxyXG5cdFx0PHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFthdHRyLmNvbHNwYW5dPVwiKGRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmMpLmxlbmd0aFwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93LWRldGFpbFwiIFtAZGV0YWlsRXhwYW5kXT1cInJvdyA9PSBleHBhbmRlZFJvdyA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiICNkZXRhaWxzVGVtcGxhdGU+PC9kaXY+XHJcblx0XHQ8L3RkPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmFibGVcIj5cclxuXHRcdDx0ciBtYXQtaGVhZGVyLXJvdyAqY2RrSGVhZGVyUm93RGVmPVwiZGlzcGxheWVkRmlsdGVyQ29sdW1ucyQgfCBhc3luY1wiPjwvdHI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmM7IHN0aWNreTogc3RpY2t5RmlsdGVyXCI+PC90cj5cclxuXHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBEZXRyYWlscyByb3cgLS0+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbHNUZW1wbGF0ZVwiPlxyXG5cdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuPC90YWJsZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIFJvdyBzaG93biB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGRhdGEuLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtY2VsbCBwYWQgdGFibGUtZW1wdHkgdHh0LWl0YWxpY1wiICpuZ0lmPVwiIWRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoICYmICFkYXRhU291cmNlPy50b3RhbFwiIGkxOG49XCJAQG5vUmVzdWx0c0ZvdW5kXCI+Tm8gcmVzdWx0cyB3ZXJlIGZvdW5kLjwvZGl2PlxyXG48IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG48ZGl2IGNsYXNzPVwidGFibGUtZm9vdGVyXCIgbGF5b3V0PVwicm93XCI+XHJcblx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RhYmxlLWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XHJcblx0PHNwYW4gZmxleD48L3NwYW4+XHJcblx0PG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJwYWdpbmFibGVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiIHNob3dGaXJzdExhc3RCdXR0b25zPVwidHJ1ZVwiPjwvbWF0LXBhZ2luYXRvcj5cclxuPC9kaXY+Il19
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4TCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjdkUsTUFBTSxPQUFPLHVCQUF1QjtJQW9PbkM7OztPQUdHO0lBQ0gsWUFBb0IsY0FBOEIsRUFBVSxjQUFpQztRQUF6RSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUE3TDdGOztXQUVHO1FBRUkscUJBQWdCLEdBQVEsRUFBRSxDQUFDO1FBRWxDOztXQUVHO1FBRUksV0FBTSxHQUFZLEtBQUssQ0FBQztRQUUvQjs7V0FFRztRQUVJLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFFbEM7O1dBRUc7UUFFSSxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRWxDOztXQUVHO1FBRUksZUFBVSxHQUFZLEtBQUssQ0FBQztRQWNuQzs7V0FFRztRQUVJLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBRXBDOztXQUVHO1FBRUksaUJBQVksR0FBWSxJQUFJLENBQUM7UUFFcEM7O1dBRUc7UUFFSSxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFjN0Q7O1dBRUc7UUFDSSxjQUFTLEdBQVksS0FBSyxDQUFDO1FBc0NsQzs7V0FFRztRQUNLLGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBU3JDOztXQUVHO1FBQ0ksbUJBQWMsR0FBOEMsSUFBSSxlQUFlLENBQTJCLEVBQUUsQ0FBQyxDQUFDO1FBRXJIOztXQUVHO1FBQ0ksYUFBUSxHQUF5QyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBWTNGOztXQUVHO1FBRUksaUJBQVksR0FBb0IsRUFBRSxDQUFDO1FBRTFDOztXQUVHO1FBRUksb0JBQWUsR0FBYSxFQUFFLENBQUM7UUFRdEM7O1dBRUc7UUFDSSxlQUFVLEdBQTJCLGVBQWUsQ0FBQztRQU81RDs7V0FFRztRQUVJLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFFSSxvQkFBZSxHQUFrQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQU11QixDQUFDO0lBck5sRzs7T0FFRztJQUNILElBQ0ksSUFBSSxDQUFDLElBQVM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBQUEsQ0FBQztJQTJGRjs7T0FFRztJQUNILElBQ0ksUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekMsSUFBSSxRQUFRLENBQUMsUUFBUTtRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFtQkQ7O09BRUc7SUFDSCxJQUNJLFNBQVMsQ0FBQyxTQUF1QjtRQUNwQyxJQUFJLFNBQVMsRUFBRTtZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztTQUN0QztJQUNGLENBQUM7SUFBQSxDQUFDO0lBT0Y7O09BRUc7SUFDSCxJQUNJLE9BQU8sS0FBb0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUFBLENBQUM7SUFDdkQsSUFBSSxPQUFPLENBQUMsT0FBc0IsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFBQSxDQUFDO0lBVTBCLENBQUM7SUEwRDVGOzs7Ozs7T0FNRztJQUNILFFBQVE7UUFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsbURBQW1EO1lBQ25ELElBQUksZUFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6RCxJQUFJLGVBQWUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbEMsK0NBQStDO29CQUMvQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLENBQUM7b0JBRWhFLDBDQUEwQztvQkFDMUMsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO3dCQUN6QixZQUFZLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzt3QkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNyRTtvQkFFRCw2QkFBNkI7eUJBQ3hCO3dCQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDOzRCQUNsQyxLQUFLLEVBQUUsSUFBSTs0QkFDWCxJQUFJLEVBQUUsUUFBUTs0QkFDZCxJQUFJLEVBQUUsZUFBZSxDQUFDLE1BQU07NEJBQzVCLFFBQVEsRUFBRSxJQUFJOzRCQUNkLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTs0QkFDL0IsWUFBWSxFQUFFLEtBQUs7eUJBQ25CLENBQUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNEO2dCQUVELHlCQUF5QjtnQkFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2lCQUN6RTthQUNEO1NBQ0Q7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25KLENBQUMsQ0FBQyxDQUFDO1FBRUgsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ25CLCtCQUErQjtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTdDLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksc0JBQXNCLENBQUMsR0FBUSxFQUFFLE1BQW1CO1FBQzFELE9BQU8sTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU8sQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUN0QyxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFRO1FBQ3pDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0Y7YUFBTTtZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxtQkFBbUIsQ0FBQyxLQUFpQixFQUFFLElBQVM7UUFDdEQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hKLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN4Qiw2RUFBNkU7WUFDN0UsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLGtDQUFrQztZQUNsQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLFlBQVksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFFcEkseUNBQXlDO1lBQ3pDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUE7WUFFckMsbUJBQW1CO1lBQ25CLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN2QjtJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLEtBQUssQ0FBQyxHQUFRLEVBQUUsTUFBcUIsRUFBRSxLQUFVLEVBQUUsUUFBYTtRQUN0RSxzQkFBc0I7UUFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQU8sQ0FBRSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxNQUFNLEVBQUU7WUFDWCx5QkFBeUI7WUFDekIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFM0gsa0JBQWtCO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTztpQkFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUMxSSxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNsRDtJQUNGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVU7UUFDaEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sWUFBWSxDQUFDLE1BQW1CLEVBQUUsR0FBUTtRQUNuRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVJLENBQUM7SUFFRDs7O09BR0c7SUFDTyxrQkFBa0IsQ0FBQyxNQUFtQjtRQUMvQyxPQUFPO1lBQ04sT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVM7U0FDMUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGFBQWEsQ0FBQyxNQUFtQixFQUFFLEdBQVE7UUFDakQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN4QixPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDeEIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQzFCLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTTtZQUN2QixZQUFZLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDaEMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7O09BR0c7SUFFSCxzQkFBc0IsQ0FBQyxLQUFtQjtRQUN6Qyw2RUFBNkU7UUFDN0UsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLDBCQUEwQjtRQUMxQixJQUFLLEtBQUssQ0FBQyxNQUFjLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztTQUNwRTtJQUNGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDckMsQ0FBQzs7dUlBaGNXLHVCQUF1QjsySEFBdkIsdUJBQXVCLDA0QkEwSXhCLE9BQU8sMEZBV1AsWUFBWSxzSEEzSWtCLGdCQUFnQix5REFpTTNDLGNBQWMsZ0RDeE83Qix3eFNBc0hNLDB3TkRqR087UUFDWCxPQUFPLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNoRCxVQUFVLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDckYsQ0FBQztLQUNGOzJGQUVXLHVCQUF1QjtrQkFabkMsU0FBUzsrQkFDQyxrQkFBa0IsY0FHaEI7d0JBQ1gsT0FBTyxDQUFDLGNBQWMsRUFBRTs0QkFDdkIsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs0QkFDOUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzs0QkFDaEQsVUFBVSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3lCQUNyRixDQUFDO3FCQUNGO3FJQU9NLEtBQUs7c0JBRFgsU0FBUzt1QkFBQyxPQUFPO2dCQU9YLGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFPcEQsVUFBVTtzQkFEaEIsS0FBSztnQkFPRixJQUFJO3NCQURQLEtBQUs7Z0JBYUMsU0FBUztzQkFEZixLQUFLO2dCQU9DLE9BQU87c0JBRGIsS0FBSztnQkFPQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBT0MsTUFBTTtzQkFEWixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsU0FBUztzQkFEZixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLEtBQUs7Z0JBT0MsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQU9DLFlBQVk7c0JBRGxCLEtBQUs7Z0JBT0MsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxRQUFRO3NCQURkLE1BQU07Z0JBT0EsVUFBVTtzQkFEaEIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkFVQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLE9BQU87c0JBRGIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVloQyxTQUFTO3NCQURaLFNBQVM7dUJBQUMsWUFBWTtnQkFnQm5CLE9BQU87c0JBRFYsS0FBSztnQkE0QkMsWUFBWTtzQkFEbEIsS0FBSztnQkFPQyxlQUFlO3NCQURyQixLQUFLO2dCQU9DLHNCQUFzQjtzQkFENUIsWUFBWTt1QkFBQyxjQUFjO2dCQWlCckIsUUFBUTtzQkFEZCxLQUFLO2dCQU9DLGVBQWU7c0JBRHJCLEtBQUs7Z0JBOE1OLHNCQUFzQjtzQkFEckIsWUFBWTt1QkFBQyxzQkFBc0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQgeyBBZnRlclZpZXdDaGVja2VkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgRHluYW1pY0J1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaGVscGVycy9keW5hbWljLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtblR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90YWJsZS1jb2x1bW4tdHlwZSc7XHJcbmltcG9ydCB7IGdldFRhYmxlRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBUYWJsZUNvbHVtbiB9IGZyb20gJy4uLy4uL21vZGVscy90YWJsZS1jb2x1bW4nO1xyXG5pbXBvcnQgeyBUYWJsZU1lbnVJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxlLW1lbnUtaXRlbSc7XHJcbmltcG9ydCB7IFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL3RhYmxlLmRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgVGFibGVTdGF0aWNEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuc3RhdGljLWRhdGEtc291cmNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAndmQtZHluYW1pYy10YWJsZScsXHJcblx0dGVtcGxhdGVVcmw6ICdkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnZHluYW1pYy10YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG5cdGFuaW1hdGlvbnM6IFtcclxuXHRcdHRyaWdnZXIoJ2RldGFpbEV4cGFuZCcsIFtcclxuXHRcdFx0c3RhdGUoJ2NvbGxhcHNlZCcsIHN0eWxlKHsgZGlzcGxheTogJ25vbmUnIH0pKSxcclxuXHRcdFx0c3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBkaXNwbGF5OiAnaW5pdGlhbCcgfSkpLFxyXG5cdFx0XHR0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMjI1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxyXG5cdFx0XSksXHJcblx0XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZkRHluYW1pY1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkKCd0YWJsZScpXHJcblx0cHVibGljIHRhYmxlOiBNYXRUYWJsZTxhbnk+O1xyXG5cclxuXHQvKipcclxuXHQgKiBkZXRhaWxzVGVtcGxhdGU6IFZpZXdDb250YWluZXJSZWZcclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdkZXRhaWxzVGVtcGxhdGUnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuXHRwdWJsaWMgZGV0YWlsc1RlbXBsYXRlUmVmOiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YS10YWJsZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGF0YVNvdXJjZTogVGFibGVEYXRhU291cmNlPGFueSwgYW55PiB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgZGF0YVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0c2V0IGRhdGEoZGF0YTogYW55KSB7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UgPSBuZXcgVGFibGVTdGF0aWNEYXRhU291cmNlKGRhdGEpO1xyXG5cdFx0dGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLm1hdFNvcnQ7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5fcGFnaW5hdG9yO1xyXG5cdFx0dGhpcy5wYWdpbmFibGUgPSB0cnVlO1xyXG5cdFx0dGhpcy5zdGF0aWMgPSB0cnVlO1xyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsYXNzIHR5cGVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBjb250ZXh0IFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogZGF0YVNvdXJjZUZpbHRlcjogYW55XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZGF0YVNvdXJjZUZpbHRlcjogYW55ID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0YXRpYyB0YWJsZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0YXRpYzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBmaWx0ZXJhYmxlP1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBwYWdpbmFibGU/XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIHRoZSBjb2x1bW4gJ0NoZWNrYm94J1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGNvbHVtblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnRBY3RpdmU6IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogQ3VycmVudCBzb3J0IGRpcmVjdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNvcnREaXJlY3Rpb246IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3RpY2t5IGhlYWRlclxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHN0aWNreUhlYWRlcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFN0aWNreSBmaWx0ZXJcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBSb3cgY2xpY2sgZXZlbnRcclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHJvd05nQ2xhc3M6IEZ1bmN0aW9uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TmdDbGFzczogRnVuY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIGRldGFpbHNUZW1wbGF0ZTogRnVuY3Rpb25cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU6IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogX3JlYWRvbmx5OiBib29sZWFuO1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogcmVhZG9ubHk6IGJvb2xlYW47XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcmVhZG9ubHkoKSB7IHJldHVybiB0aGlzLl9yZWFkb25seTsgfVxyXG5cdHNldCByZWFkb25seShyZWFkb25seSkge1xyXG5cdFx0dGhpcy5fcmVhZG9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVhZG9ubHkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogc2VsZWN0QWxsRmlsdGVyOiBGdW5jdGlvblxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdEFsbEZpbHRlcjogKHZhbHVlOiBhbnksIGluZGV4OiBudW1iZXIsIGFycmF5OiBhbnlbXSkgPT4gdW5rbm93bjtcclxuXHJcblx0LyoqXHJcblx0ICogQSByZWZlcmVuY2UgdG8gTWRTb3J0IGF0dHJpYnV0ZVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0U29ydCwgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgbWF0U29ydDogTWF0U29ydDtcclxuXHJcblx0LyoqXHJcblx0ICogX3BhZ2luYXRvcjogTWF0UGFnaW5hdG9yXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcblxyXG5cdC8qKlxyXG5cdCAqIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpXHJcblx0c2V0IHBhZ2luYXRvcihwYWdpbmF0b3I6IE1hdFBhZ2luYXRvcikge1xyXG5cdFx0aWYgKHBhZ2luYXRvcikge1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gcGFnaW5hdG9yO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdXHJcblx0ICovXHJcblx0cHJpdmF0ZSBfY29sdW1uczogVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBjb2x1bW5zOiBDb2x1bW5bXVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9O1xyXG5cdHNldCBjb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIGNvbHVtbnNTdWJqZWN0OiBTdWJqZWN0PChUYWJsZUNvbHVtbiB8IHN0cmluZylbXT5cclxuXHQgKi9cclxuXHRwdWJsaWMgY29sdW1uc1N1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+KFtdKTtcclxuXHJcblx0LyoqXHJcblx0ICogY29sdW1ucyQ6IE9ic2VydmFibGU8KFRhYmxlQ29sdW1uIHwgc3RyaW5nKVtdPlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zJDogT2JzZXJ2YWJsZTwoVGFibGVDb2x1bW4gfCBzdHJpbmcpW10+ID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKTs7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BsYXllZCBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZENvbHVtbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzcGxheWVkIGZpbHRlciBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogVGFibGUgcm93IG1lbnUgaXRlbXNcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dNZW51SXRlbXM6IFRhYmxlTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb2x1bW5zIHRvIGV4Y2x1ZGVcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBleGNsdWRlZENvbHVtbnM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgTWF0TWVudVRyaWdnZXIgaW4gdGhlIERPTVxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0TWVudVRyaWdnZXIpXHJcblx0cHVibGljIHJvd0NvbnRleHRNZW51VHJpZ2dlcnM6IFF1ZXJ5TGlzdDxNYXRNZW51VHJpZ2dlcj47XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbHVtblR5cGU6IENvbHVtblR5cGVcclxuXHQgKi9cclxuXHRwdWJsaWMgQ29sdW1uVHlwZTogdHlwZW9mIFRhYmxlQ29sdW1uVHlwZSA9IFRhYmxlQ29sdW1uVHlwZTtcclxuXHJcblx0LyoqXHJcblx0ICogZXhwYW5kZWRSb3c6IGFueVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBleHBhbmRlZFJvdzogYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBEZWZhdWx0IHBhZ2Ugc2l6ZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHBhZ2VTaXplOiBudW1iZXIgPSAxNTtcclxuXHJcblx0LyoqXHJcblx0ICogUGFnZSBzaXplIG9wdGlvbnNcclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbNSwgMTAsIDE1LCAyMCwgMzAsIDUwLCAxMDAsIDIwMF07XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIGR5bmFtaWNCdWlsZGVyIFxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgZHluYW1pY0J1aWxkZXI6IER5bmFtaWNCdWlsZGVyLCBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZikgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuXHQgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG5cdCAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSB2aWV3IG9yIGNvbnRlbnQgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuXHJcblx0ICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNsYXNzVHlwZSkge1xyXG5cdFx0XHQvKiBHZXQgdGhlIHRhYmxlIGRlZmluaXRpb24gdXNpbmcgdGhlIGNsYXNzIHR5cGUgKi9cclxuXHRcdFx0dmFyIHRhYmxlRGVmaW5pdGlvbiA9IGdldFRhYmxlRGVmaW5pdGlvbih0aGlzLmNsYXNzVHlwZSk7XHJcblx0XHRcdGlmICh0YWJsZURlZmluaXRpb24pIHtcclxuXHRcdFx0XHR0aGlzLmNvbHVtbnMgPSBbLi4udGFibGVEZWZpbml0aW9uLmNvbHVtbnNdO1xyXG5cdFx0XHRcdGlmICh0aGlzLnJvd01lbnVJdGVtcz8ubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0LyogQ2hlY2sgaWYgdGhlIGFjdGlvbiBjb2x1bW4gYWxyZWFkeSBleGlzdHMgKi9cclxuXHRcdFx0XHRcdHZhciBhY3Rpb25Db2xtdW4gPSB0aGlzLl9jb2x1bW5zPy5maW5kKHggPT4geC5uYW1lID09ICdhY3Rpb24nKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBzbywganVzdCBhZGQgdGhlIG1lbnUgaXRlbXMgdG8gaXQgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb25Db2xtdW4gIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRhY3Rpb25Db2xtdW4ucm93TWVudUl0ZW1zID0gW107XHJcblx0XHRcdFx0XHRcdHRoaXMucm93TWVudUl0ZW1zLmZvckVhY2goeSA9PiBhY3Rpb25Db2xtdW4ucm93TWVudUl0ZW1zLnVuc2hpZnQoeSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSBhZGQgYSBuZXcgb25lICovXHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVGFibGVDb2x1bW5UeXBlLkFjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRyb3dNZW51SXRlbXM6IHRoaXMucm93TWVudUl0ZW1zLFxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogQWRkIGNoZWNrYm94IGNvbHVtbiAqL1xyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29sdW1ucy51bnNoaWZ0KHsgbmFtZTogJ3NlbGVjdCcsIHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5DaGVja2JveCB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBCdWlsZCBkaXNwbGF5ZWQgY29sdW1ucyAmIGZpbHRlciAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zJD8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2YodGhpcy5jb2x1bW5zPy5maWx0ZXIoeCA9PiAhdGhpcy5leGNsdWRlZENvbHVtbnM/LmluY2x1ZGVzKHgubmFtZSkpPy5tYXAoYyA9PiBjLm5hbWUpKTtcclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHRoaXMuY29sdW1ucz8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKT8ubWFwKGMgPT4gYGZpbHRlci4keyhjLmZpbHRlciB8fCBjLm5hbWUpfWApKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIFNldCB0aGUgdGFibGUgY29sdW1ucyAqL1xyXG5cdFx0dGhpcy51cGRhdGVDb2x1bW5zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSB0YWJsZSBjb2x1bW5zXHJcblx0ICovXHJcblx0cHVibGljIHVwZGF0ZUNvbHVtbnMoKTogdm9pZCB7XHJcblx0XHQvKiBTb3J0IHRoZSBjb2x1bW5zIGJ5IGluZGV4ICovXHJcblx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy5jb2x1bW5zIHx8IFtdLCAnaW5kZXgnKTtcclxuXHJcblx0XHQvKiBUcmlnZ2VyIGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY29sdW1uc1N1YmplY3QubmV4dCh0aGlzLmNvbHVtbnMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ291bnRzIHZpc2libGUgYWN0aW9uIG1lbnVzXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdzogYW55LCBjb2x1bW46IFRhYmxlQ29sdW1uKSB7XHJcblx0XHRyZXR1cm4gY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID4gMDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0cmFja0J5KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gYCR7aXRlbS5pZH1gO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyByb3cgY2xpY2sgZXZlbnRcclxuXHQgKiBAcGFyYW0gaW5kZXggXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93Q2xpY2soaW5kZXg6IGFueSwgcm93OiBhbnkpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmRldGFpbHNUZW1wbGF0ZSkge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdFx0dGhpcy5keW5hbWljQnVpbGRlci5jb21waWxlSHRtbCh0aGlzLmRldGFpbHNUZW1wbGF0ZVJlZi5nZXQoaW5kZXgpLCB0aGlzLmRldGFpbHNUZW1wbGF0ZSwgcm93KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMucm93Q2xpY2suZW1pdChyb3cpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTWV0aG9kIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrIHdpdGggdGhlIHJpZ2h0IGJ1dHRvblxyXG5cdCAqIEBwYXJhbSBldmVudCBNb3VzZUV2ZW50LCBpdCBjb250YWlucyB0aGUgY29vcmRpbmF0ZXNcclxuXHQgKiBAcGFyYW0gaXRlbSBPdXIgZGF0YSBjb250YWluZWQgaW4gdGhlIHJvdyBvZiB0aGUgdGFibGVcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlUm93UmlnaHRDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcblx0XHR0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZm9yRWFjaCh4ID0+IHguY2xvc2VNZW51KCkpO1xyXG5cdFx0dmFyIG1lbnVUcmlnZ2VyID0gdGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZpbHRlcih4ID0+IHhbJ19lbGVtZW50J10/Lm5hdGl2ZUVsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnaWQnKSA9PSBgbWVudS0ke2l0ZW0uaWR9YClbMF07XHJcblx0XHRpZiAobWVudVRyaWdnZXIgIT0gbnVsbCkge1xyXG5cdFx0XHQvKiBBdm9pZHMgdG8gc2hvdyB0aGUgdmlzdWFsaXphdGlvbiBvZiB0aGUgcmlnaHQtY2xpY2sgbWVudSBvZiB0aGUgYnJvd3NlciAqL1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0LyogU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlclsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdzdHlsZScsIGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6ICR7ZXZlbnQuY2xpZW50WH1weDsgdG9wOiAke2V2ZW50LmNsaWVudFl9cHhgKTtcclxuXHJcblx0XHRcdC8qIFBhc3MgdG8gdGhlIG1lbnUgdGhlIGN1cnJlbnQgb2JqZWN0ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyLm1lbnVEYXRhID0geyBpdGVtOiBpdGVtIH1cclxuXHJcblx0XHRcdC8qIE9wZW4gdGhlIG1lbnUgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIub3Blbk1lbnUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdGNoZXMgYW4gZW50aXR5XHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcGFyYW0gZmllbGROYW1lIFxyXG5cdCAqIEBwYXJhbSBwYXRoIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaChyb3c6IGFueSwgZmllbGRzOiBBcnJheTxzdHJpbmc+LCB2YWx1ZTogYW55LCBpbmNsdWRlczogYW55KTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZW50aXR5IGJ5IElEICovXHJcblx0XHRsZXQgZW50aXR5ID0gdGhpcy5kYXRhU291cmNlLml0ZW1zPy5maWx0ZXIoeCA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlLnJlbmRlclJvd3MoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgY2VsbCBjbGFzc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldENlbGxDbGFzcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbihjb2x1bW4uY2VsbE5nQ2xhc3MgPyBjb2x1bW4uY2VsbE5nQ2xhc3Mocm93KSA6IHsgJ3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmUgfSwgdGhpcy5nZXRWaXNpYmlsaXR5Q2xhc3MoY29sdW1uKSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIGNlbGwgY2xhc3NcclxuXHQgKiBAcGFyYW0gY29sdW1uIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRWaXNpYmlsaXR5Q2xhc3MoY29sdW1uOiBUYWJsZUNvbHVtbik6IGFueSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHQnZ3QteHMnOiBjb2x1bW4uc2hvd0d0WHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5zaG93R3RTbSxcclxuXHRcdFx0J2d0LW1kJzogY29sdW1uLnNob3dHdE1kLFxyXG5cdFx0XHQnZ3QtbGcnOiBjb2x1bW4uc2hvd0d0TGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5zaG93R3RYbCxcclxuXHRcdFx0J2d0LXh4bCc6IGNvbHVtbi5zaG93R3RYeGxcclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHJvdyBjbGFzc2VzXHJcblx0ICogQHBhcmFtIGNvbHVtbiBcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEByZXR1cm5zIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRSb3dDbGFzc2VzKGNvbHVtbjogVGFibGVDb2x1bW4sIHJvdzogYW55KTogYW55IHtcclxuXHRcdHJldHVybiBPYmplY3QuYXNzaWduKHtcclxuXHRcdFx0J2d0LXhzJzogY29sdW1uLnNob3dHdFhzLFxyXG5cdFx0XHQnZ3Qtc20nOiBjb2x1bW4uc2hvd0d0U20sXHJcblx0XHRcdCdndC1tZCc6IGNvbHVtbi5zaG93R3RNZCxcclxuXHRcdFx0J2d0LWxnJzogY29sdW1uLnNob3dHdExnLFxyXG5cdFx0XHQnZ3QteGwnOiBjb2x1bW4uc2hvd0d0WGwsXHJcblx0XHRcdCdndC14eGwnOiBjb2x1bW4uc2hvd0d0WHhsLFxyXG5cdFx0XHQnaGlkZGVuJzogY29sdW1uLmhpZGRlbixcclxuXHRcdFx0J3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmVcclxuXHRcdH0sIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIHRoaXMuY29udGV4dCkgOiB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBldmVudHNcclxuXHQgKiBAcGFyYW0gZXZlbnQgXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y29udGV4dG1lbnUnLCBbJyRldmVudCddKVxyXG5cdGhhbmRsZUNvbnRleHRNZW51RXZlbnQoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG5cdFx0LyogQXZvaWRzIHRvIHNob3cgdGhlIHZpc3VhbGl6YXRpb24gb2YgdGhlIHJpZ2h0LWNsaWNrIG1lbnUgb2YgdGhlIGJyb3dzZXIgKi9cclxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0LyogQ2xvc2UgYWxsIG9wZW4gbWVudXMgKi9cclxuXHRcdGlmICgoZXZlbnQudGFyZ2V0IGFzIGFueSk/LmNsYXNzTGlzdD8uY29udGFpbnMoJ2Nkay1vdmVybGF5LWJhY2tkcm9wJykpIHtcclxuXHRcdFx0dGhpcy5yb3dDb250ZXh0TWVudVRyaWdnZXJzPy50b0FycmF5KCk/LmZvckVhY2goeCA9PiB4LmNsb3NlTWVudSgpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxufSIsIjxkaXYgY2xhc3M9XCJsb2FkaW5nLXByb2dyZXNzXCIgKm5nSWY9XCIhc3RhdGljXCI+XHJcblx0PG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiAqbmdJZj1cImRhdGFTb3VyY2U/LmlzTG9hZGluZ1wiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuPC9kaXY+XHJcblxyXG48IS0tICNyZWdpb24gRGF0YSB0YWJsZSAtLT5cclxuPHRhYmxlIG1hdC10YWJsZSAjdGFibGUgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiIFtkYXRhU291cmNlRmlsdGVyXT1cImRhdGFTb3VyY2VGaWx0ZXJcIiBbbmdDbGFzc109XCJ7J3RhYmxlLWZpeGVkJzogIWRldGFpbHNUZW1wbGF0ZX1cIiBbdHJhY2tCeV09XCJ0cmFja0J5XCIgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyIFttYXRTb3J0QWN0aXZlXT1cInNvcnRBY3RpdmV8fCdpZCdcIiBbbWF0U29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCIgbXVsdGlUZW1wbGF0ZURhdGFSb3dzPlxyXG5cdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHQ8IS0tICNyZWdpb24gQ29sdW1uIGRlZiAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgW2Nka0NvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiIFtzdGlja3ldPVwiY29sdW1uLnN0aWNreVwiIFtzdGlja3lFbmRdPVwiY29sdW1uLnN0aWNreUVuZFwiPlxyXG5cdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLnNob3dHdFhzLCAnZ3Qtc20nOiBjb2x1bW4uc2hvd0d0U20sICdndC1tZCc6IGNvbHVtbi5zaG93R3RNZCwgJ2d0LWxnJzogY29sdW1uLnNob3dHdExnLCAnZ3QteGwnOiBjb2x1bW4uc2hvd0d0WGwsICdndC14eGwnOiBjb2x1bW4uc2hvd0d0WHhsfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQ2hlY2tib3hcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2UudG9nZ2xlU2VsZWN0KCRldmVudCwgc2VsZWN0QWxsRmlsdGVyKSA6IG51bGxcIiBbZGlzYWJsZWRdPVwiIWRhdGFTb3VyY2UucGFnaW5hdG9yPy5sZW5ndGhcIiBbY2hlY2tlZF09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgZGF0YVNvdXJjZS5pc0FsbFNlbGVjdGVkKClcIiBbaW5kZXRlcm1pbmF0ZV09XCJkYXRhU291cmNlLnNlbGVjdGlvbk1vZGVsLmhhc1ZhbHVlKCkgJiYgIWRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCI+PC9tYXQtY2hlY2tib3g+XHJcblx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSAhPSBDb2x1bW5UeXBlLkNoZWNrYm94XCI+e3tjb2x1bW4uaGVhZGVyfX08L3NwYW4+XHJcblx0XHRcdDwvdGg+XHJcblxyXG5cdFx0XHQ8IS0tIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIGNvbnRleHQpIDogeyAndGV4dC1yaWdodCc6IGNvbHVtbi5hcnJvd0JlZm9yZSB9IC0tPlxyXG5cdFx0XHQ8dGQgbWF0LWNlbGwgKmNka0NlbGxEZWY9XCJsZXQgcm93OyBsZXQgcm93SW5kZXggPSBpbmRleFwiIFttYXRUb29sdGlwXT1cImNvbHVtbi50b29sdGlwP2NvbHVtbi50b29sdGlwKHJvdywgY29udGV4dCk6bnVsbFwiIFttYXRUb29sdGlwQ2xhc3NdPVwiY29sdW1uLnRvb2x0aXBDbGFzc1wiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ0NsYXNzXT1cImdldFJvd0NsYXNzZXMoY29sdW1uLCByb3cpXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbHVtbi50eXBlXCI+XHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRW51bSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHQ8bWF0LWNoZWNrYm94ICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC50b2dnbGUocm93KSA6IG51bGxcIiBbZGlzYWJsZWRdPVwicmVhZG9ubHkgfHwgKGNvbHVtbi5kaXNhYmxlZCB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRW51bSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2NvbHVtbi5jb250ZW50KHJvdykgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tjb2x1bW4uY29udGVudChyb3csIGNvbnRleHQpIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUb2dnbGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVG9nZ2xlXCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIiAobmdNb2RlbENoYW5nZSk9XCJjb2x1bW4uZXZlbnQ/KGNvbHVtbi5ldmVudEFyZ3M/Y29sdW1uLmV2ZW50KHJvdyxjb2x1bW4uZXZlbnRBcmdzKTpjb2x1bW4uZXZlbnQocm93LCBjb250ZXh0KSk6bnVsbFwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGUgJiYgY29sdW1uLmRpc2FibGUocm93LCBjb250ZXh0KSlcIiBjb2xvcj1cInByaW1hcnlcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7Y29sdW1uLmNvbnRlbnQocm93LCBjb250ZXh0KSB8IGRhdGU6Y29sdW1uLnNob3J0RGF0ZT8nZGQuTU0ueXl5eSc6J2RkLk1NLnl5eXkgSEg6bW06c3MnfX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ7e2NvbHVtbi5pbnB1dFR5cGV9fVwiIGF1dG9jb21wbGV0ZT1cIm5vbmVcIiBtYXRJbnB1dCBuYW1lPVwie3tjb2x1bW4ubmFtZX19e3tyb3dJbmRleH19XCIgWyhuZ01vZGVsKV09XCJyb3dbY29sdW1uLm5hbWVdXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgY29udGV4dCkpKVwiIChuZ01vZGVsQ2hhbmdlKT1cImNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgcm93W2NvbHVtbi5uYW1lXSwgY29sdW1uLnBhdGNoSW5jbHVkZXMpXCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cIiRldmVudC50YXJnZXQuYmx1cigpO2ZhbHNlXCI+XHJcblx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLkFjdGlvblwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51XCIgKm5nSWY9XCJtZW51Py5tYXRNZW51ICYmICFyb3cubG9ja2VkICYmIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93LCBjb2x1bW4pXCI+PC9kaXY+XHJcblx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgW21lbnVdPVwiY29sdW1uLm1lbnVcIiBbaXRlbV09XCJyb3dcIiBbY29udGV4dF09XCJjb250ZXh0XCIgI21lbnU+PC92ZC1keW5hbWljLW1lbnU+XHJcblx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFttZW51XT1cImNvbHVtbi5tZW51XCIgW2l0ZW1dPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IFtpbm5lckh0bWxdPVwiY29sdW1uLmNvbnRlbnQgPyBjb2x1bW4uY29udGVudChyb3csIGNvbnRleHQpOicnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBGaWx0ZXIgcm93IC0tPlxyXG5cdDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIGZpbHRlcmFibGVcIj5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgY2RrQ29sdW1uRGVmPVwiZmlsdGVyLnt7Y29sdW1uLmZpbHRlciB8fCBjb2x1bW4ubmFtZX19XCI+XHJcblx0XHRcdFx0PHRoIG1hdC1oZWFkZXItY2VsbCAqY2RrSGVhZGVyQ2VsbERlZiBbaGlkZGVuXT1cImNvbHVtbi5oaWRkZW5cIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCIgW25nQ2xhc3NdPVwieydndC14cyc6IGNvbHVtbi5zaG93R3RYcywgJ2d0LXNtJzogY29sdW1uLnNob3dHdFNtLCAnZ3QtbWQnOiBjb2x1bW4uc2hvd0d0TWQsICdndC1sZyc6IGNvbHVtbi5zaG93R3RMZywgJ2d0LXhsJzogY29sdW1uLnNob3dHdFhsLCAnZ3QteHhsJzogY29sdW1uLnNob3dHdFh4bH1cIj5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBUZXh0IGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0IHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuVGV4dElucHV0IHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuTnVtYmVyIHx8IGNvbHVtbi50eXBlID09IENvbHVtblR5cGUuTWVudVwiIGZpbHRlci1pbnB1dCBbb25seU51bWJlcl09XCJjb2x1bW4uZmlsdGVySW5wdXROdW1iZXJcIiBbb3BlcmF0b3JdPVwiY29sdW1uLmZpbHRlck9wZXJhdG9yXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlNlbGVjdCB8fCBjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkVudW0gfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5Ub2dnbGVcIiBmaWx0ZXItc2VsZWN0IFtlbmRwb2ludF09XCJjb2x1bW4uZW5kcG9pbnRcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbdGV4dF09XCJjb2x1bW4uZmlsdGVyT3B0aW9uVGV4dCB8fCAnbmFtZSdcIj48L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIERhdGUgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkRhdGVcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0PCEtLSAjcmVnaW9uIEFjdGlvbiBmaWx0ZXIgKGNsZWFyKSAtLT5cclxuXHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5BY3Rpb25cIiBmaWx0ZXItY2xlYXI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdDwvdGg+XHJcblx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJleHBhbmRlZERldGFpbFwiPlxyXG5cdFx0PHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFthdHRyLmNvbHNwYW5dPVwiKGRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmMpLmxlbmd0aFwiPlxyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93LWRldGFpbFwiIFtAZGV0YWlsRXhwYW5kXT1cInJvdyA9PSBleHBhbmRlZFJvdyA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiICNkZXRhaWxzVGVtcGxhdGU+PC9kaXY+XHJcblx0XHQ8L3RkPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmFibGVcIj5cclxuXHRcdDx0ciBtYXQtaGVhZGVyLXJvdyAqY2RrSGVhZGVyUm93RGVmPVwiZGlzcGxheWVkRmlsdGVyQ29sdW1ucyQgfCBhc3luY1wiPjwvdHI+XHJcblx0PC9uZy1jb250YWluZXI+XHJcblx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnMkIHwgYXN5bmM7IHN0aWNreTogc3RpY2t5RmlsdGVyXCI+PC90cj5cclxuXHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdDwhLS0gI3JlZ2lvbiBEZXRyYWlscyByb3cgLS0+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImRldGFpbHNUZW1wbGF0ZVwiPlxyXG5cdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG5cdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuPC90YWJsZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIFJvdyBzaG93biB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGRhdGEuLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtY2VsbCBwYWQgdGFibGUtZW1wdHkgdHh0LWl0YWxpY1wiICpuZ0lmPVwiIWRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YT8ubGVuZ3RoICYmICFkYXRhU291cmNlPy50b3RhbFwiIGkxOG49XCJAQG5vUmVzdWx0c0ZvdW5kXCI+Tm8gcmVzdWx0cyB3ZXJlIGZvdW5kLjwvZGl2PlxyXG48IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG48ZGl2IGNsYXNzPVwidGFibGUtZm9vdGVyXCIgbGF5b3V0PVwicm93XCI+XHJcblx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RhYmxlLWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XHJcblx0PHNwYW4gZmxleD48L3NwYW4+XHJcblx0PG1hdC1wYWdpbmF0b3IgKm5nSWY9XCJwYWdpbmFibGVcIiBbcGFnZVNpemVdPVwicGFnZVNpemVcIiBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiIHNob3dGaXJzdExhc3RCdXR0b25zPVwidHJ1ZVwiPjwvbWF0LXBhZ2luYXRvcj5cclxuPC9kaXY+Il19
|