@hpe/angular-toolkit
Version:
Hewlett-Packard Enterprise : Angular toolkit for rapid project development
657 lines (656 loc) • 66.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
//=============================================================================
//===
//=== (C) Copyright 2018 Hewlett Packard Enterprise Development LP.
//===
//=== Use of this source code is governed by an MIT-style license that can be
//=== found in the LICENSE file
//=============================================================================
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { ContextMenu, DataTable } from "primeng/primeng";
import { FilterChangeEvent } from "@hpe/angular-toolkit/model";
import { RowSelectedEvent } from "@hpe/angular-toolkit/model";
import { RowUnselectedEvent } from "@hpe/angular-toolkit/model";
import { MenuSelectionMode } from "@hpe/angular-toolkit/model";
import { Lib } from "@hpe/angular-toolkit/lib";
import { AbstractSubscriber } from "@hpe/angular-toolkit/service";
import { EventBusService } from "@hpe/angular-toolkit/service";
import { LabelService } from "@hpe/angular-toolkit/service";
var ListTable = /** @class */ (function (_super) {
tslib_1.__extends(ListTable, _super);
//-------------------------------------------------------------------------
//---
//--- Constructor
//---
//-------------------------------------------------------------------------
function ListTable(eventBusService, labelService) {
var _this = _super.call(this, eventBusService) || this;
_this.labelService = labelService;
//-------------------------------------------------------------------------
_this.onFilterChange = new EventEmitter();
_this.onRowSelected = new EventEmitter();
_this.onRowUnselected = new EventEmitter();
_this.alignMap = {
'left': 'alignLeft',
'center': 'alignCenter',
'right': 'alignRight'
};
_this.rowsPerPage = 8;
_this.rowSet = [4, 8, 12, 16, 20, 50];
_this.loading = false;
_this.multiSelection = false;
return _this;
}
/**
* @return {?}
*/
ListTable.prototype.exportAll = /**
* @return {?}
*/
function () {
this.pTable.exportCSV();
};
/**
* @return {?}
*/
ListTable.prototype.exportSelected = /**
* @return {?}
*/
function () {
this.pTable.exportCSV({ selectionOnly: true });
};
Object.defineProperty(ListTable.prototype, "allValue", {
//-------------------------------------------------------------------------
//--- Localization methods
//-------------------------------------------------------------------------
get: /**
* @return {?}
*/
function () {
return this.labelService.getLabel("list-table", "all");
},
enumerable: true,
configurable: true
});
Object.defineProperty(ListTable.prototype, "noRecords", {
//-------------------------------------------------------------------------
get: /**
* @return {?}
*/
function () {
return this.labelService.getLabel("list-table", "noRecords");
},
enumerable: true,
configurable: true
});
//-------------------------------------------------------------------------
//---
//--- Lifecycle events
//---
//-------------------------------------------------------------------------
/**
* @param {?} changes
* @return {?}
*/
ListTable.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var /** @type {?} */ rebuildColumnValues = false;
if (changes["columns"]) {
this.initColumns();
rebuildColumnValues = true;
}
if (changes["data"]) {
this.initData();
rebuildColumnValues = true;
}
if (changes["visibleColumns"]) {
this.initVisibleColumns();
}
if (rebuildColumnValues) {
this.initColumnValues();
}
// "labels" ???
};
//-------------------------------------------------------------------------
//---
//--- Events
//---
//-------------------------------------------------------------------------
/**
* @param {?} event
* @return {?}
*/
ListTable.prototype.onRowSelect = /**
* @param {?} event
* @return {?}
*/
function (event) {
//--- In case of multi-selection, the selectedRow variable is an array of rows
var /** @type {?} */ row = this.restoreRow(event.data);
var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow);
this.onRowSelected.emit(new RowSelectedEvent(row, rows));
};
//-------------------------------------------------------------------------
/**
* @param {?} event
* @return {?}
*/
ListTable.prototype.onRowUnselect = /**
* @param {?} event
* @return {?}
*/
function (event) {
//--- In case of multi-selection, the selectedRow variable is an array of rows
var /** @type {?} */ row = this.restoreRow(event.data);
var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow);
this.onRowUnselected.emit(new RowUnselectedEvent(row, rows));
};
//-------------------------------------------------------------------------
/**
* @param {?} event
* @return {?}
*/
ListTable.prototype.onContextMenuSelect = /**
* @param {?} event
* @return {?}
*/
function (event) {
//--- In case of multi-selection, the selectedRow variable is an array of rows
var /** @type {?} */ row = this.restoreRow(event.data);
var /** @type {?} */ rows = this.calcSelectedRows(this.selectedRow);
var /** @type {?} */ rse = new RowSelectedEvent(row, rows);
//--- Emit event
this.onRowSelected.emit(rse);
//--- Setup context menu
this.activeMenu = this.selectMenuItems(this.contextMenu, rse, null);
};
//-------------------------------------------------------------------------
/**
* @param {?} event
* @return {?}
*/
ListTable.prototype.onFilter = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.onFilterChange.emit(new FilterChangeEvent(this.getFilteredSize()));
};
//-------------------------------------------------------------------------
//---
//--- Local methods
//---
//-------------------------------------------------------------------------
/**
* @param {?} value
* @param {?} col
* @return {?}
*/
ListTable.prototype.filter = /**
* @param {?} value
* @param {?} col
* @return {?}
*/
function (value, col) {
this.pTable.filter(value, col.field, col.filterMatchMode);
};
/**
* @return {?}
*/
ListTable.prototype.initColumns = /**
* @return {?}
*/
function () {
var _this = this;
console.log("Initializing columns : " + JSON.stringify(this.columns));
this.colToIndex = new Map();
if (this.columns == null) {
//--- Do nothing for now
}
else {
var /** @type {?} */ index_1 = 0;
this.columns.forEach(function (col) {
_this.colToIndex.set(col.field, index_1++);
col.displayHeader = _this.calcHeader(col);
col.filterMatchMode = _this.calcFilterMatchMode(col);
});
}
};
/**
* @param {?} col
* @return {?}
*/
ListTable.prototype.calcHeader = /**
* @param {?} col
* @return {?}
*/
function (col) {
return col.header
|| (this.labelGroup && this.labelService.getLabel(this.labelGroup, col.field))
|| col.field;
};
/**
* @param {?} col
* @return {?}
*/
ListTable.prototype.calcFilterMatchMode = /**
* @param {?} col
* @return {?}
*/
function (col) {
if (col.filter == null) {
return "contains";
}
if (col.filter == "select") {
return "equals";
}
if (col.filter == "list") {
return "in";
}
return null;
};
/**
* @return {?}
*/
ListTable.prototype.initData = /**
* @return {?}
*/
function () {
var _this = this;
console.log("Initializing data : " + JSON.stringify(this.data));
if (this.columns == null || this.data == null) {
this.displayData = null;
}
else {
this.displayData = [];
this.data.forEach(function (row) {
var /** @type {?} */ displayRow = {};
_this.displayData.push(displayRow);
for (var /** @type {?} */ key in row) {
var /** @type {?} */ cell = new ListTableCell();
displayRow[key] = cell;
var /** @type {?} */ value = row[key];
var /** @type {?} */ colNdx = _this.colToIndex.get(key);
var /** @type {?} */ col = _this.columns[colNdx];
cell.originalValue = value;
cell.displayValue = _this.calcDisplayValue(row, col, value);
cell.style = _this.calcDisplayStyle(row, col, value);
}
});
}
};
/**
* @param {?} row
* @param {?} col
* @param {?} value
* @return {?}
*/
ListTable.prototype.calcDisplayValue = /**
* @param {?} row
* @param {?} col
* @param {?} value
* @return {?}
*/
function (row, col, value) {
if (col.transcoder != null) {
value = col.transcoder.transcode(value);
}
return (value != null)
? value.toString()
: null;
};
/**
* @param {?} row
* @param {?} col
* @param {?} value
* @return {?}
*/
ListTable.prototype.calcDisplayStyle = /**
* @param {?} row
* @param {?} col
* @param {?} value
* @return {?}
*/
function (row, col, value) {
var /** @type {?} */ styles = ['cell'];
if (col.alignment != null) {
styles.push(this.alignMap[col.alignment]);
}
if (col.styler != null) {
var /** @type {?} */ style = col.styler.style(value, row);
if (style.icon != null) {
styles.push("fa");
styles.push(style.icon);
}
if (style.extraClass != null) {
styles.push(style.extraClass);
}
}
return styles;
};
/**
* @return {?}
*/
ListTable.prototype.initVisibleColumns = /**
* @return {?}
*/
function () {
var _this = this;
console.log("Initializing visible columns : " + JSON.stringify(this.visibleColumns));
if (this.columns == null || this.visibleColumns == null) {
this.displayColumns = null;
}
else {
this.displayColumns = [];
this.visibleColumns.forEach(function (name) {
var /** @type {?} */ index = _this.colToIndex.get(name);
if (index != null) {
_this.displayColumns.push(_this.columns[index]);
}
});
}
};
/**
* @return {?}
*/
ListTable.prototype.initColumnValues = /**
* @return {?}
*/
function () {
var _this = this;
this.columnValues = new Map();
//--- exit if we still do not have columns or values
if (this.columns == null || this.data == null) {
return null;
}
console.log("Calculating column values for : ");
this.columns.forEach(function (col) {
console.log(" --> " + col.field);
_this.columnValues.set(col.field, _this.getColumnValues(col));
});
};
/**
* @param {?} col
* @return {?}
*/
ListTable.prototype.getColumnValues = /**
* @param {?} col
* @return {?}
*/
function (col) {
var /** @type {?} */ field = col.field;
var /** @type {?} */ values = new Set();
//--- first, collect distinct values
this.data.forEach(function (row) {
var /** @type {?} */ value = row[field];
//--- null values causes issues with filters
if (value != null) {
values.add(value);
}
});
//--- second, build final list as an array of (value, label) entries
var /** @type {?} */ list = [];
//--- only the dropdown filter needs the "All" option
if (col.filter == "select") {
list.push({
label: this.allValue,
value: null
});
}
values.forEach(function (value) {
if (col.transcoder != null) {
value = col.transcoder.transcode(value);
}
var /** @type {?} */ label = (value != null)
? value.toString()
: null;
list.push({
label: label,
value: label
});
});
return list;
};
/**
* @return {?}
*/
ListTable.prototype.getFilteredSize = /**
* @return {?}
*/
function () {
if (this.pTable) {
if (this.pTable.filteredValue) {
return this.pTable.filteredValue.length;
}
}
if (this.data) {
return this.data.length;
}
return null;
};
/**
* @param {?} data
* @return {?}
*/
ListTable.prototype.restoreRow = /**
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ row = {};
for (var /** @type {?} */ key in data) {
row[key] = data[key].originalValue;
}
return row;
};
/**
* @param {?} rows
* @return {?}
*/
ListTable.prototype.calcSelectedRows = /**
* @param {?} rows
* @return {?}
*/
function (rows) {
var _this = this;
var /** @type {?} */ result = [];
if (rows != null) {
rows.forEach(function (row) {
result.push(_this.restoreRow(row));
});
}
return result;
};
/**
* @param {?} menu
* @param {?} rse
* @param {?} parentId
* @return {?}
*/
ListTable.prototype.selectMenuItems = /**
* @param {?} menu
* @param {?} rse
* @param {?} parentId
* @return {?}
*/
function (menu, rse, parentId) {
var _this = this;
//--- Filter menu items depending on selector
var /** @type {?} */ result = [];
menu.forEach(function (menu) {
var /** @type {?} */ m = Lib.menu.clone(menu);
//--- Concatenate parentId
if (parentId != null) {
m.id = parentId + "." + m.id;
}
m.command = function (event) {
_this.fireEvent(m.id, rse);
};
if (_this.menuSelector == null) {
result.push(m);
}
else {
var /** @type {?} */ mode = _this.menuSelector.select(m.id, rse);
m.disabled = (mode == MenuSelectionMode.DISABLE);
if (mode == MenuSelectionMode.EXCLUDE) {
//--- Exclude menu from list
}
else {
//--- Mode is INCLUDE or DISABLE
result.push(m);
}
}
//--- Recurse on children
if (menu.items != null) {
m.items = _this.selectMenuItems(menu.items, rse, m.id);
if (menu.items != null && m.items == null) {
m.disabled = true;
}
}
});
return (result.length != 0)
? result
: null;
};
/**
* @param {?} code
* @param {?} event
* @return {?}
*/
ListTable.prototype.fireEvent = /**
* @param {?} code
* @param {?} event
* @return {?}
*/
function (code, event) {
//--- Hide context-menu (it seems that with our config it does not disappear automatically)
this.pContextMenu.hide();
var /** @type {?} */ tableEvent = {
code: code,
params: event
};
_super.prototype.emitToApp.call(this, tableEvent);
};
ListTable.decorators = [
{ type: Component, args: [{
selector: 'hpe-list-table',
template: "<!--\n=============================================================================\n===\n=== (C) Copyright 2018 Hewlett Packard Enterprise Development LP.\n===\n=== Use of this source code is governed by an MIT-style license that can be\n=== found in the LICENSE file\n=============================================================================\n-->\n\n<p-table #tt\n\t\t[columns] = \"displayColumns\"\n\t\t[value] = \"displayData\"\n\t\t[dataKey] = \"rowId\"\n\t\t[selectionMode] = \"multiSelection ? 'multiple' : 'single'\"\n\t\t[paginator] = \"true\"\n\t\t[rows] = \"rowsPerPage\"\n\t\t[rowsPerPageOptions] = \"rowSet\"\n\t\t[pageLinks] = \"10\"\n\t\t[loading] = \"loading\"\n\t\t[metaKeySelection] = \"true\"\n\t\t[contextMenu] = \"cm\"\n\t\t[(selection)] = \"selectedRow\"\n\t\t(onRowSelect) = \"onRowSelect($event)\"\n\t\t(onRowUnselect) = \"onRowUnselect($event)\"\n\t\tcontextMenuSelectionMode = \"joint\"\n\t\t(onContextMenuSelect) = \"onContextMenuSelect($event)\"\n\t\t(onFilter) = \"onFilter($event)\">\n\n\t<ng-template pTemplate=\"header\" let-columns>\n\t\t<tr>\n\t\t\t<th *ngFor=\"let col of columns\" [pSortableColumn]=\"col.field\">\n\t\t\t\t{{col.displayHeader}}\n\t\t\t\t<p-sortIcon [field]=\"col.field\"></p-sortIcon>\n\t\t\t</th>\n\t\t</tr>\n\n\t\t<tr class=\"ui-fluid\">\n\t\t\t<th *ngFor=\"let col of columns\">\n\n\t\t\t\t<input *ngIf=\"col.filter == null\"\n\t\t\t\t\t\t\t\tpInputText\n\t\t\t\t\t\t\t\ttype = \"text\"\n\t\t\t\t\t\t\t\t(input) = \"filter($event.target.value, col)\"\n\t\t\t\t\t\t\t\tclass = \"filter\">\n\n\t\t\t\t<p-dropdown *ngIf = \"col.filter == 'select'\"\n\t\t\t\t\t\t\t\t[options] = \"columnValues.get(col.field)\"\n\t\t\t\t\t\t\t\t[style] = \"{'width':'100%'}\"\n\t\t\t\t\t\t\t\t(onChange) = \"filter($event.value, col)\"\n\t\t\t\t\t\t\t\t></p-dropdown>\n\n\t\t\t\t<p-multiSelect *ngIf = \"col.filter == 'list'\"\n\t\t\t\t\t\t\t\t[options] = \"columnValues.get(col.field)\"\n\t\t\t\t\t\t\t\t[defaultLabel] = \"allValue\"\n\t\t\t\t\t\t\t\t(onChange) = \"filter($event.value, col)\"\n\t\t\t\t\t\t\t\tclass = \"filter\"></p-multiSelect>\n\n\t\t\t</th>\n\t\t</tr>\n\t</ng-template>\n\n\t<ng-template pTemplate=\"body\" let-row let-columns=\"columns\">\n\t\t<tr [pSelectableRow]=\"row\" [pContextMenuRow]=\"row\">\n\t\t\t<td *ngFor=\"let col of columns\">\n\t\t\t\t<span [ngClass]=\"row[col.field].style\">{{row[col.field]}}</span>\n\t\t\t</td>\n\t\t</tr>\n\t</ng-template>\n\n\t<ng-template pTemplate=\"emptymessage\" let-columns>\n\t\t<tr>\n\t\t\t<td [attr.colspan]=\"columns.length\">\n\t\t\t\t{{noRecords}}\n\t\t\t</td>\n\t\t</tr>\n\t</ng-template>\n</p-table>\n\n<p-contextMenu #cm [model]=\"activeMenu\" appendTo=\"body\"></p-contextMenu>\n",
styles: [".cell{width:100%;display:inline-block;padding:.7em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filter{width:100%}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}:host ::ng-deep .ui-paginator{border:none;background-image:inherit}:host ::ng-deep .ui-table .ui-table-thead>tr>th{border:none}:host ::ng-deep .ui-table .ui-table-thead>tr>th:not(.ui-state-highlight){background-color:#fff}:host ::ng-deep .ui-table .ui-table-thead>tr>th:hover{background-color:#c6c9ca}:host ::ng-deep .ui-table .ui-table-tbody>tr.ui-state-highlight{background-color:#a0c0c0}:host ::ng-deep .ui-table .ui-table-thead>tr:last-child{border-bottom:2px solid #c6c9ca}:host ::ng-deep .ui-table .ui-sortable-column.ui-state-highlight{background-color:#5f7a76}:host ::ng-deep .ui-table .ui-table-tbody>tr>td{border-left:none;border-right:none}"]
},] },
];
/** @nocollapse */
ListTable.ctorParameters = function () { return [
{ type: EventBusService, },
{ type: LabelService, },
]; };
ListTable.propDecorators = {
"rowId": [{ type: Input },],
"columns": [{ type: Input },],
"data": [{ type: Input },],
"visibleColumns": [{ type: Input },],
"multiSelection": [{ type: Input },],
"rowsPerPage": [{ type: Input },],
"rowSet": [{ type: Input },],
"loading": [{ type: Input },],
"labelGroup": [{ type: Input },],
"contextMenu": [{ type: Input },],
"menuSelector": [{ type: Input },],
"onFilterChange": [{ type: Output },],
"onRowSelected": [{ type: Output },],
"onRowUnselected": [{ type: Output },],
"pTable": [{ type: ViewChild, args: ['tt',] },],
"pContextMenu": [{ type: ViewChild, args: ['cm',] },],
};
return ListTable;
}(AbstractSubscriber));
export { ListTable };
function ListTable_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ListTable.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ListTable.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ListTable.propDecorators;
/** @type {?} */
ListTable.prototype.rowId;
/** @type {?} */
ListTable.prototype.columns;
/** @type {?} */
ListTable.prototype.data;
/** @type {?} */
ListTable.prototype.visibleColumns;
/** @type {?} */
ListTable.prototype.multiSelection;
/** @type {?} */
ListTable.prototype.rowsPerPage;
/** @type {?} */
ListTable.prototype.rowSet;
/** @type {?} */
ListTable.prototype.loading;
/** @type {?} */
ListTable.prototype.labelGroup;
/** @type {?} */
ListTable.prototype.contextMenu;
/** @type {?} */
ListTable.prototype.menuSelector;
/** @type {?} */
ListTable.prototype.onFilterChange;
/** @type {?} */
ListTable.prototype.onRowSelected;
/** @type {?} */
ListTable.prototype.onRowUnselected;
/** @type {?} */
ListTable.prototype.pTable;
/** @type {?} */
ListTable.prototype.pContextMenu;
/** @type {?} */
ListTable.prototype.selectedRow;
/** @type {?} */
ListTable.prototype.displayColumns;
/** @type {?} */
ListTable.prototype.displayData;
/** @type {?} */
ListTable.prototype.activeMenu;
/** @type {?} */
ListTable.prototype.columnValues;
/** @type {?} */
ListTable.prototype.colToIndex;
/** @type {?} */
ListTable.prototype.alignMap;
/** @type {?} */
ListTable.prototype.labelService;
}
var ListTableCell = /** @class */ (function () {
function ListTableCell() {
}
/**
* @return {?}
*/
ListTableCell.prototype.toString = /**
* @return {?}
*/
function () {
return this.displayValue;
};
return ListTableCell;
}());
function ListTableCell_tsickle_Closure_declarations() {
/** @type {?} */
ListTableCell.prototype.originalValue;
/** @type {?} */
ListTableCell.prototype.displayValue;
/** @type {?} */
ListTableCell.prototype.style;
}
//=============================================================================
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC10YWJsZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BocGUvYW5ndWxhci10b29sa2l0L2d1aS9wYW5lbC8iLCJzb3VyY2VzIjpbImxpc3QtdGFibGUvbGlzdC10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFMUcsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQVF2RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTyw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBUSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTyw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQXFCLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBUyw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQVksOEJBQThCLENBQUM7O0lBNEZqQyxxQ0FBa0I7SUF3RGhELDJFQUEyRTtJQUN4RSxLQUFLO0lBQ0wsaUJBQWlCO0lBQ2pCLEtBQUs7SUFDTCwyRUFBMkU7SUFFM0UsbUJBQW9CLGVBQWlDLEVBQ2pDO1FBRHBCLFlBR0Msa0JBQU0sZUFBZSxDQUFDLFNBTXpCO1FBUnNCLGtCQUFZLEdBQVosWUFBWTs7K0JBekMyQixJQUFJLFlBQVksRUFBcUI7OEJBQ3JDLElBQUksWUFBWSxFQUFvQjtnQ0FDcEMsSUFBSSxZQUFZLEVBQXNCO3lCQTBCakY7WUFDbEIsTUFBTSxFQUFL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QUFZOzs7MEJBb0dsQixLQUFLOzRCQUNGLEtBQUs7eUJBQ0wsS0FBSzttQ0FDTCxLQUFLO21DQUNSLEtBQUs7Z0NBQ0wsS0FBSzsyQkFDTCxLQUFLOzRCQUNMLEtBQUs7K0JBQ0wsS0FBSztnQ0FDTCxLQUFLO2lDQUNMLEtBQUs7bUNBSUwsTUFBTTtrQ0FDTixNQUFNO29DQUNOLE1BQU07MkJBSU4sU0FBUyxTQUFDLElBQUk7aUNBQ2QsU0FBUyxTQUFDLElBQUk7O29CQWxKaEI7RUFxSCtCLGtCQUFrQjtTQUFwQyxTQUFTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3aEJ0QixJQUFBOzs7Ozs7SUFRUSxnQ0FBUTs7OztRQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOzt3QkF0cEIzQjtJQXdwQkMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vPT09XG4vLz09PSAoQykgQ29weXJpZ2h0IDIwMTggSGV3bGV0dCBQYWNrYXJkIEVudGVycHJpc2UgRGV2ZWxvcG1lbnQgTFAuXG4vLz09PVxuLy89PT0gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbi8vPT09IGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGVcbi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge0NvbnRleHRNZW51LCBEYXRhVGFibGV9IGZyb20gXCJwcmltZW5nL3ByaW1lbmdcIjtcblxuaW1wb3J0IHtBcHBFdmVudH0gICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtDZWxsU3R5bGV9ICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtEcm9wZG93bkl0ZW19ICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51fSAgICAgICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtMaXN0VGFibGVDb2x1bW59ICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51U2VsZWN0b3J9ICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtGaWx0ZXJDaGFuZ2VFdmVudH0gIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtSb3dTZWxlY3RlZEV2ZW50fSAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtSb3dVbnNlbGVjdGVkRXZlbnR9IGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtNZW51U2VsZWN0aW9uTW9kZX0gIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9tb2RlbFwiO1xuaW1wb3J0IHtMaWJ9ICAgICAgICAgICAgICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9saWJcIjtcbmltcG9ydCB7QWJzdHJhY3RTdWJzY3JpYmVyfSBmcm9tIFwiQGhwZS9hbmd1bGFyLXRvb2xraXQvc2VydmljZVwiO1xuaW1wb3J0IHtFdmVudEJ1c1NlcnZpY2V9ICAgIGZyb20gXCJAaHBlL2FuZ3VsYXItdG9vbGtpdC9zZXJ2aWNlXCI7XG5pbXBvcnQge0xhYmVsU2VydmljZX0gICAgICAgZnJvbSBcIkBocGUvYW5ndWxhci10b29sa2l0L3NlcnZpY2VcIjtcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciAgICA6ICAgICAnaHBlLWxpc3QtdGFibGUnLFxuICAgIHRlbXBsYXRlOiBgPCEtLVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PVxuPT09IChDKSBDb3B5cmlnaHQgMjAxOCBIZXdsZXR0IFBhY2thcmQgRW50ZXJwcmlzZSBEZXZlbG9wbWVudCBMUC5cbj09PVxuPT09IFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG49PT0gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi0tPlxuXG48cC10YWJsZSAjdHRcblx0XHRbY29sdW1uc10gICAgICAgICAgICAgICAgPSBcImRpc3BsYXlDb2x1bW5zXCJcblx0XHRbdmFsdWVdICAgICAgICAgICAgICAgICAgPSBcImRpc3BsYXlEYXRhXCJcblx0XHRbZGF0YUtleV0gICAgICAgICAgICAgICAgPSBcInJvd0lkXCJcblx0XHRbc2VsZWN0aW9uTW9kZV0gICAgICAgICAgPSBcIm11bHRpU2VsZWN0aW9uID8gJ211bHRpcGxlJyA6ICdzaW5nbGUnXCJcblx0XHRbcGFnaW5hdG9yXSAgICAgICAgICAgICAgPSBcInRydWVcIlxuXHRcdFtyb3dzXSAgICAgICAgICAgICAgICAgICA9IFwicm93c1BlclBhZ2VcIlxuXHRcdFtyb3dzUGVyUGFnZU9wdGlvbnNdICAgICA9IFwicm93U2V0XCJcblx0XHRbcGFnZUxpbmtzXSAgICAgICAgICAgICAgPSBcIjEwXCJcblx0XHRbbG9hZGluZ10gICAgICAgICAgICAgICAgPSBcImxvYWRpbmdcIlxuXHRcdFttZXRhS2V5U2VsZWN0aW9uXSAgICAgICA9IFwidHJ1ZVwiXG5cdFx0W2NvbnRleHRNZW51XSAgICAgICAgICAgID0gXCJjbVwiXG5cdFx0WyhzZWxlY3Rpb24pXSAgICAgICAgICAgID0gXCJzZWxlY3RlZFJvd1wiXG5cdFx0KG9uUm93U2VsZWN0KSAgICAgICAgICAgID0gXCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcblx0XHQob25Sb3dVbnNlbGVjdCkgICAgICAgICAgPSBcIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXG5cdFx0Y29udGV4dE1lbnVTZWxlY3Rpb25Nb2RlID0gXCJqb2ludFwiXG5cdFx0KG9uQ29udGV4dE1lbnVTZWxlY3QpICAgID0gXCJvbkNvbnRleHRNZW51U2VsZWN0KCRldmVudClcIlxuXHRcdChvbkZpbHRlcikgICAgICAgICAgICAgICA9IFwib25GaWx0ZXIoJGV2ZW50KVwiPlxuXG5cdDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cblx0XHQ8dHI+XG5cdFx0XHQ8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wuZmllbGRcIj5cblx0XHRcdFx0e3tjb2wuZGlzcGxheUhlYWRlcn19XG5cdFx0XHRcdDxwLXNvcnRJY29uIFtmaWVsZF09XCJjb2wuZmllbGRcIj48L3Atc29ydEljb24+XG5cdFx0XHQ8L3RoPlxuXHRcdDwvdHI+XG5cblx0XHQ8dHIgY2xhc3M9XCJ1aS1mbHVpZFwiPlxuXHRcdFx0PHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxuXG5cdFx0XHRcdDxpbnB1dCAgICAgICAgICAqbmdJZj1cImNvbC5maWx0ZXIgPT0gbnVsbFwiXG5cdFx0XHRcdFx0XHRcdFx0cElucHV0VGV4dFxuXHRcdFx0XHRcdFx0XHRcdHR5cGUgICAgPSBcInRleHRcIlxuXHRcdFx0XHRcdFx0XHRcdChpbnB1dCkgPSBcImZpbHRlcigkZXZlbnQudGFyZ2V0LnZhbHVlLCBjb2wpXCJcblx0XHRcdFx0XHRcdFx0XHRjbGFzcyAgID0gXCJmaWx0ZXJcIj5cblxuXHRcdFx0XHQ8cC1kcm9wZG93biAgICAgKm5nSWYgPSBcImNvbC5maWx0ZXIgPT0gJ3NlbGVjdCdcIlxuXHRcdFx0XHRcdFx0XHRcdFtvcHRpb25zXSAgPSBcImNvbHVtblZhbHVlcy5nZXQoY29sLmZpZWxkKVwiXG5cdFx0XHRcdFx0XHRcdFx0W3N0eWxlXSAgICA9IFwieyd3aWR0aCc6JzEwMCUnfVwiXG5cdFx0XHRcdFx0XHRcdFx0KG9uQ2hhbmdlKSA9IFwiZmlsdGVyKCRldmVudC52YWx1ZSwgY29sKVwiXG5cdFx0XHRcdFx0XHRcdFx0PjwvcC1kcm9wZG93bj5cblxuXHRcdFx0XHQ8cC1tdWx0aVNlbGVjdCAgKm5nSWYgPSBcImNvbC5maWx0ZXIgPT0gJ2xpc3QnXCJcblx0XHRcdFx0XHRcdFx0XHRbb3B0aW9uc10gICAgICA9IFwiY29sdW1uVmFsdWVzLmdldChjb2wuZmllbGQpXCJcblx0XHRcdFx0XHRcdFx0XHRbZGVmYXVsdExhYmVsXSA9IFwiYWxsVmFsdWVcIlxuXHRcdFx0XHRcdFx0XHRcdChvbkNoYW5nZSkgICAgID0gXCJmaWx0ZXIoJGV2ZW50LnZhbHVlLCBjb2wpXCJcblx0XHRcdFx0XHRcdFx0XHRjbGFzcyAgICAgICAgICA9IFwiZmlsdGVyXCI+PC9wLW11bHRpU2VsZWN0PlxuXG5cdFx0XHQ8L3RoPlxuXHRcdDwvdHI+XG5cdDwvbmctdGVtcGxhdGU+XG5cblx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxuXHRcdDx0ciBbcFNlbGVjdGFibGVSb3ddPVwicm93XCIgW3BDb250ZXh0TWVudVJvd109XCJyb3dcIj5cblx0XHRcdDx0ZCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cblx0XHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwicm93W2NvbC5maWVsZF0uc3R5bGVcIj57e3Jvd1tjb2wuZmllbGRdfX08L3NwYW4+XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdDwvbmctdGVtcGxhdGU+XG5cblx0PG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImVtcHR5bWVzc2FnZVwiIGxldC1jb2x1bW5zPlxuXHRcdDx0cj5cblx0XHRcdDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbHVtbnMubGVuZ3RoXCI+XG5cdFx0XHRcdHt7bm9SZWNvcmRzfX1cblx0XHRcdDwvdGQ+XG5cdFx0PC90cj5cblx0PC9uZy10ZW1wbGF0ZT5cbjwvcC10YWJsZT5cblxuPHAtY29udGV4dE1lbnUgI2NtIFttb2RlbF09XCJhY3RpdmVNZW51XCIgYXBwZW5kVG89XCJib2R5XCI+PC9wLWNvbnRleHRNZW51PlxuYCxcbiAgICBzdHlsZXM6IFtgLmNlbGx7d2lkdGg6MTAwJTtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOi43ZW07b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5maWx0ZXJ7d2lkdGg6MTAwJX0uYWxpZ25MZWZ0e3RleHQtYWxpZ246bGVmdH0uYWxpZ25DZW50ZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LmFsaWduUmlnaHR7dGV4dC1hbGlnbjpyaWdodH06aG9zdCA6Om5nLWRlZXAgLnVpLXBhZ2luYXRvcntib3JkZXI6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOmluaGVyaXR9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGhlYWQ+dHI+dGh7Ym9yZGVyOm5vbmV9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGhlYWQ+dHI+dGg6bm90KC51aS1zdGF0ZS1oaWdobGlnaHQpe2JhY2tncm91bmQtY29sb3I6I2ZmZn06aG9zdCA6Om5nLWRlZXAgLnVpLXRhYmxlIC51aS10YWJsZS10aGVhZD50cj50aDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjNmM5Y2F9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGJvZHk+dHIudWktc3RhdGUtaGlnaGxpZ2h0e2JhY2tncm91bmQtY29sb3I6I2EwYzBjMH06aG9zdCA6Om5nLWRlZXAgLnVpLXRhYmxlIC51aS10YWJsZS10aGVhZD50cjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNjNmM5Y2F9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktc29ydGFibGUtY29sdW1uLnVpLXN0YXRlLWhpZ2hsaWdodHtiYWNrZ3JvdW5kLWNvbG9yOiM1ZjdhNzZ9Omhvc3QgOjpuZy1kZWVwIC51aS10YWJsZSAudWktdGFibGUtdGJvZHk+dHI+dGR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZX1gXVxufSlcblxuLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgTGlzdFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RTdWJzY3JpYmVyIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vLS0tXG4gICAgLy8tLS0gVmFyaWFibGVzXG4gICAgLy8tLS1cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRASW5wdXQoKSByb3dJZCAgICAgICAgICA6IGFueTtcbiAgICBASW5wdXQoKSBjb2x1bW5zICAgICAgICA6IExpc3RUYWJsZUNvbHVtbltdO1xuICAgIEBJbnB1dCgpIGRhdGEgICAgICAgICAgIDogYW55W107XG4gICAgQElucHV0KCkgdmlzaWJsZUNvbHVtbnMgOiBzdHJpbmdbXTtcblx0QElucHV0KCkgbXVsdGlTZWxlY3Rpb24gOiBib29sZWFuO1xuXHRASW5wdXQoKSByb3dzUGVyUGFnZSAgICA6IG51bWJlcjtcblx0QElucHV0KCkgcm93U2V0ICAgICAgICAgOiBudW1iZXJbXTtcblx0QElucHV0KCkgbG9hZGluZyAgICAgICAgOiBib29sZWFuO1xuXHRASW5wdXQoKSBsYWJlbEdyb3VwICAgICA6IHN0cmluZztcblx0QElucHV0KCkgY29udGV4dE1lbnUgICAgOiBNZW51W107XG5cdEBJbnB1dCgpIG1lbnVTZWxlY3RvciAgIDogTWVudVNlbGVjdG9yO1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdEBPdXRwdXQoKSBvbkZpbHRlckNoYW5nZSA6IEV2ZW50RW1pdHRlcjxGaWx0ZXJDaGFuZ2VFdmVudD4gID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJDaGFuZ2VFdmVudD4oKTtcblx0QE91dHB1dCgpIG9uUm93U2VsZWN0ZWQgIDogRXZlbnRFbWl0dGVyPFJvd1NlbGVjdGVkRXZlbnQ+ICAgPSBuZXcgRXZlbnRFbWl0dGVyPFJvd1NlbGVjdGVkRXZlbnQ+KCk7XG5cdEBPdXRwdXQoKSBvblJvd1Vuc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxSb3dVbnNlbGVjdGVkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dVbnNlbGVjdGVkRXZlbnQ+KCk7XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0QFZpZXdDaGlsZCgndHQnKSBwcml2YXRlIHBUYWJsZSAgICAgICA6IERhdGFUYWJsZTtcblx0QFZpZXdDaGlsZCgnY20nKSBwcml2YXRlIHBDb250ZXh0TWVudSA6IENvbnRleHRNZW51O1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHNlbGVjdGVkUm93ICAgIDogYW55O1xuXHRkaXNwbGF5Q29sdW1ucyA6IExpc3RUYWJsZUNvbHVtbltdO1xuXHRkaXNwbGF5RGF0YSAgICA6IGFueVtdO1xuXHRhY3RpdmVNZW51ICAgICA6IE1lbnVbXTtcblxuXHQvLy0tLSBNYXAgY29udGFpbmluZyBmb3Igb25lIGNvbHVtbiBhIGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzLiBUaGUga2V5XG5cdC8vLS0tIGlzIHRoZSBhY3R1YWwgY29sdW1uJ3MgdmFsdWUgd2hpbGUgdGhlIHZhbHVlIGlzIHRoZSB0cmFuc2NvZGVkIG9uZS5cblx0Ly8tLS0gSXQgaXMgdXNlZCB0byBkaXNwbGF5IGRyb3Bkb3duIGZpbHRlcnNcblxuXHRjb2x1bW5WYWx1ZXM6IE1hcDxzdHJpbmcsIERyb3Bkb3duSXRlbVtdPjtcblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGNvbFRvSW5kZXggOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgYWxpZ25NYXAgPSB7XG5cdFx0J2xlZnQnICAgOiAnYWxpZ25MZWZ0Jyxcblx0XHQnY2VudGVyJyA6ICdhbGlnbkNlbnRlcicsXG5cdFx0J3JpZ2h0JyAgOiAnYWxpZ25SaWdodCdcblx0fTtcblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLy0tLVxuICAgIC8vLS0tIENvbnN0cnVjdG9yXG4gICAgLy8tLS1cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIGNvbnN0cnVjdG9yKCAgICAgICAgZXZlbnRCdXNTZXJ2aWNlIDogRXZlbnRCdXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbGFiZWxTZXJ2aWNlICAgIDogTGFiZWxTZXJ2aWNlKSB7XG5cbiAgICBcdHN1cGVyKGV2ZW50QnVzU2VydmljZSk7XG5cbiAgICBcdHRoaXMucm93c1BlclBhZ2UgICAgPSA4O1xuXHRcdHRoaXMucm93U2V0ICAgICAgICAgPSBbNCwgOCwgMTIsIDE2LCAyMCwgNTBdO1xuXHRcdHRoaXMubG9hZGluZyAgICAgICAgPSBmYWxzZTtcblx0XHR0aGlzLm11bHRpU2VsZWN0aW9uID0gZmFsc