@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
132 lines • 22.8 kB
JavaScript
import { Component, Inject, Optional } from "@angular/core";
import { TaskRefDashboardConstants } from "../model/task-ref-dashboard-constants";
import { TaskRefDashboardTileConstants } from "../model/task-ref-dashboard-tile-constants";
import { AbstractBaseDataFieldComponent } from "../../base-component/abstract-base-data-field.component";
import { DATA_FIELD_PORTAL_DATA } from "../../models/data-field-portal-data-injection-token";
import * as i0 from "@angular/core";
import * as i1 from "../../../logger/services/logger.service";
export class AbstractTaskRefDashboardFieldComponent extends AbstractBaseDataFieldComponent {
_logger;
dashboardTiles;
constructor(_logger, dataFieldPortalData) {
super(dataFieldPortalData);
this._logger = _logger;
}
ngOnInit() {
this.createDashboardTiles();
}
createDashboardTiles() {
const gridRows = this.dataField.dashboardRows;
if (gridRows === undefined) {
this._logger.error(`TaskRef Dashboard '${this.dataField.stringId}' does not specify grid height! Add a number field with id '${TaskRefDashboardConstants.DASHBOARD_ROWS}' to the same task as the task ref field, to specify the height.`);
}
const gridCols = this.dataField.dashboardCols;
if (gridCols === undefined) {
this._logger.error(`TaskRef Dashboard '${this.dataField.stringId}' does not specify grid width! Add a number field with id '${TaskRefDashboardConstants.DASHBOARD_COLS}' to the same task as the task ref field, to specify the width.`);
}
const occupiedTiles = this.createFlagGrid(gridRows, gridCols);
this.dashboardTiles = [];
if (this.dataField.dashboardTiles && this.dataField.dashboardTiles.length > 0) {
for (const extractedTile of this.dataField.dashboardTiles) {
const tile = this.createDashboardTile(extractedTile);
this.dashboardTiles.push(tile);
this.occupySpace(occupiedTiles, tile.y, tile.x, tile.cols, tile.rows);
}
}
for (let y = 0; y < occupiedTiles.length; y++) {
for (let x = 0; x < occupiedTiles[y].length; x++) {
if (!occupiedTiles[y][x]) {
this.dashboardTiles.push(this.createEmptyDashboardTile(x, y));
}
}
}
}
createFlagGrid(rows = 1, cols = 1) {
const result = [];
for (let r = 0; r < rows; r++) {
result.push(Array(cols).fill(false));
}
return result;
}
createDashboardTile(tile) {
const result = {
dataGroups: tile.dataGroups
};
for (const dg of tile.dataGroups) {
for (const field of dg.fields) {
switch (field.stringId) {
case TaskRefDashboardTileConstants.DASHBOARD_TILE_X:
result.x = field.value;
break;
case TaskRefDashboardTileConstants.DASHBOARD_TILE_Y:
result.y = field.value;
break;
case TaskRefDashboardTileConstants.DASHBOARD_TILE_ROWS:
result.rows = field.value;
break;
case TaskRefDashboardTileConstants.DASHBOARD_TILE_COLS:
result.cols = field.value;
break;
}
}
}
if (result.x === undefined) {
if (tile.dataGroups.length > 0) {
this._logger.error(`Task ref dashboard tile from task '${tile.dataGroups[0].parentTaskId}' transition '${tile.dataGroups[0].parentTransitionId}' case '${tile.dataGroups[0].parentCaseId}' does not specify tile grid X coordinate! Add a number field with ID '${TaskRefDashboardTileConstants.DASHBOARD_TILE_X}' to the referenced task to specify it.`);
}
result.x = 0;
}
if (result.y === undefined) {
if (tile.dataGroups.length > 0) {
this._logger.error(`Task ref dashboard tile from task '${tile.dataGroups[0].parentTaskId}' transition '${tile.dataGroups[0].parentTransitionId}' case '${tile.dataGroups[0].parentCaseId}' does not specify tile grid Y coordinate! Add a number field with ID '${TaskRefDashboardTileConstants.DASHBOARD_TILE_Y}' to the referenced task to specify it.`);
}
result.y = 0;
}
if (result.rows === undefined) {
if (tile.dataGroups.length > 0) {
this._logger.error(`Task ref dashboard tile from task '${tile.dataGroups[0].parentTaskId}' transition '${tile.dataGroups[0].parentTransitionId}' case '${tile.dataGroups[0].parentCaseId}' does not specify tile height coordinate! Add a number field with ID '${TaskRefDashboardTileConstants.DASHBOARD_TILE_ROWS}' to the referenced task to specify it.`);
}
result.rows = 1;
}
if (result.cols === undefined) {
if (tile.dataGroups.length > 0) {
this._logger.error(`Task ref dashboard tile from task '${tile.dataGroups[0].parentTaskId}' transition '${tile.dataGroups[0].parentTransitionId}' case '${tile.dataGroups[0].parentCaseId}' does not specify tile width coordinate! Add a number field with ID '${TaskRefDashboardTileConstants.DASHBOARD_TILE_COLS}' to the referenced task to specify it.`);
}
result.cols = 1;
}
return result;
}
// TODO a modified copy of a method of the same name from AbstractTaskContentComponent
occupySpace(grid, y, x, width, height) {
for (let j = y; j < y + height; j++) {
for (let i = x; i < x + width; i++) {
grid[j][i] = true;
}
}
}
createEmptyDashboardTile(x, y) {
return {
dataGroups: [],
x,
y,
rows: 1,
cols: 1,
isEmpty: true
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractTaskRefDashboardFieldComponent, deps: [{ token: i1.LoggerService }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractTaskRefDashboardFieldComponent, selector: "ncc-abstract-task-ref-dashboard", usesInheritance: true, ngImport: i0, template: '', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractTaskRefDashboardFieldComponent, decorators: [{
type: Component,
args: [{
selector: 'ncc-abstract-task-ref-dashboard',
template: ''
}]
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [DATA_FIELD_PORTAL_DATA]
}] }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtdGFzay1yZWYtZGFzaGJvYXJkLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvZGF0YS1maWVsZHMvdGFzay1yZWYtZmllbGQvdGFzay1yZWYtZGFzaGJvYXJkLWZpZWxkL2Fic3RyYWN0LXRhc2stcmVmLWRhc2hib2FyZC1maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQVUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSWxFLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyw4QkFBOEIsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxzQkFBc0IsRUFBc0IsTUFBTSxxREFBcUQsQ0FBQzs7O0FBTWhILE1BQU0sT0FBZ0Isc0NBQXVDLFNBQVEsOEJBQTRDO0lBRzdFO0lBRGhDLGNBQWMsQ0FBOEI7SUFDNUMsWUFBZ0MsT0FBc0IsRUFDWSxtQkFBc0Q7UUFDcEgsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFGQyxZQUFPLEdBQVAsT0FBTyxDQUFlO0lBR3RELENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVTLG9CQUFvQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSwr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QUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNyQjtTQUNKO0lBQ0wsQ0FBQztJQUVTLHdCQUF3QixDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ25ELE9BQU87WUFDSCxVQUFVLEVBQUUsRUFBRTtZQUNkLENBQUM7WUFDRCxDQUFDO1lBQ0QsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsQ0FBQztZQUNQLE9BQU8sRUFBRSxJQUFJO1NBQ2hCLENBQUE7SUFDTCxDQUFDO3dHQXRIaUIsc0NBQXNDLCtDQUlkLHNCQUFzQjs0RkFKOUMsc0NBQXNDLDhGQUY5QyxFQUFFOzs0RkFFTSxzQ0FBc0M7a0JBSjNELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGlDQUFpQztvQkFDM0MsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7OzBCQUswQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1Rhc2tSZWZGaWVsZH0gZnJvbSBcIi4uL21vZGVsL3Rhc2stcmVmLWZpZWxkXCI7XG5pbXBvcnQge1Rhc2tSZWZEYXNoYm9hcmRUaWxlfSBmcm9tIFwiLi4vbW9kZWwvdGFzay1yZWYtZGFzaGJvYXJkLXRpbGVcIjtcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZVwiO1xuaW1wb3J0IHtUYXNrUmVmRGFzaGJvYXJkQ29uc3RhbnRzfSBmcm9tIFwiLi4vbW9kZWwvdGFzay1yZWYtZGFzaGJvYXJkLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtUYXNrUmVmRGFzaGJvYXJkVGlsZUNvbnN0YW50c30gZnJvbSBcIi4uL21vZGVsL3Rhc2stcmVmLWRhc2hib2FyZC10aWxlLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtBYnN0cmFjdEJhc2VEYXRhRmllbGRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9iYXNlLWNvbXBvbmVudC9hYnN0cmFjdC1iYXNlLWRhdGEtZmllbGQuY29tcG9uZW50XCI7XG5pbXBvcnQge0RBVEFfRklFTERfUE9SVEFMX0RBVEEsIERhdGFGaWVsZFBvcnRhbERhdGF9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGF0YS1maWVsZC1wb3J0YWwtZGF0YS1pbmplY3Rpb24tdG9rZW5cIjtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtdGFzay1yZWYtZGFzaGJvYXJkJyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYXNrUmVmRGFzaGJvYXJkRmllbGRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEJhc2VEYXRhRmllbGRDb21wb25lbnQ8VGFza1JlZkZpZWxkPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBkYXNoYm9hcmRUaWxlczogQXJyYXk8VGFza1JlZkRhc2hib2FyZFRpbGU+O1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2xvZ2dlcjogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEQVRBX0ZJRUxEX1BPUlRBTF9EQVRBKSBkYXRhRmllbGRQb3J0YWxEYXRhOiBEYXRhRmllbGRQb3J0YWxEYXRhPFRhc2tSZWZGaWVsZD4pIHtcbiAgICAgICAgc3VwZXIoZGF0YUZpZWxkUG9ydGFsRGF0YSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlRGFzaGJvYXJkVGlsZXMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRGFzaGJvYXJkVGlsZXMoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRSb3dzID0gdGhpcy5kYXRhRmllbGQuZGFzaGJvYXJkUm93cztcbiAgICAgICAgaWYgKGdyaWRSb3dzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihgVGFza1JlZiBEYXNoYm9hcmQgJyR7dGhpcy5kYXRhRmllbGQuc3RyaW5nSWR9JyBkb2VzIG5vdCBzcGVjaWZ5IGdyaWQgaGVpZ2h0ISBBZGQgYSBudW1iZXIgZmllbGQgd2l0aCBpZCAnJHtUYXNrUmVmRGFzaGJvYXJkQ29uc3RhbnRzLkRBU0hCT0FSRF9ST1dTfScgdG8gdGhlIHNhbWUgdGFzayBhcyB0aGUgdGFzayByZWYgZmllbGQsIHRvIHNwZWNpZnkgdGhlIGhlaWdodC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBncmlkQ29scyA9IHRoaXMuZGF0YUZpZWxkLmRhc2hib2FyZENvbHM7XG4gICAgICAgIGlmIChncmlkQ29scyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoYFRhc2tSZWYgRGFzaGJvYXJkICcke3RoaXMuZGF0YUZpZWxkLnN0cmluZ0lkfScgZG9lcyBub3Qgc3BlY2lmeSBncmlkIHdpZHRoISBBZGQgYSBudW1iZXIgZmllbGQgd2l0aCBpZCAnJHtUYXNrUmVmRGFzaGJvYXJkQ29uc3RhbnRzLkRBU0hCT0FSRF9DT0xTfScgdG8gdGhlIHNhbWUgdGFzayBhcyB0aGUgdGFzayByZWYgZmllbGQsIHRvIHNwZWNpZnkgdGhlIHdpZHRoLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9jY3VwaWVkVGlsZXMgPSB0aGlzLmNyZWF0ZUZsYWdHcmlkKGdyaWRSb3dzLCBncmlkQ29scyk7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkVGlsZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YUZpZWxkLmRhc2hib2FyZFRpbGVzICYmIHRoaXMuZGF0YUZpZWxkLmRhc2hib2FyZFRpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXh0cmFjdGVkVGlsZSBvZiB0aGlzLmRhdGFGaWVsZC5kYXNoYm9hcmRUaWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNyZWF0ZURhc2hib2FyZFRpbGUoZXh0cmFjdGVkVGlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXNoYm9hcmRUaWxlcy5wdXNoKHRpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMub2NjdXB5U3BhY2Uob2NjdXBpZWRUaWxlcywgdGlsZS55LCB0aWxlLngsIHRpbGUuY29scywgdGlsZS5yb3dzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IG9jY3VwaWVkVGlsZXMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgb2NjdXBpZWRUaWxlc1t5XS5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGlmICghb2NjdXBpZWRUaWxlc1t5XVt4XSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhc2hib2FyZFRpbGVzLnB1c2godGhpcy5jcmVhdGVFbXB0eURhc2hib2FyZFRpbGUoeCwgeSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVGbGFnR3JpZChyb3dzOiBudW1iZXIgPSAxLCBjb2xzOiBudW1iZXIgPSAxKTogQXJyYXk8QXJyYXk8Ym9vbGVhbj4+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93czsgcisrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChBcnJheShjb2xzKS5maWxsKGZhbHNlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlRGFzaGJvYXJkVGlsZSh0aWxlOiBUYXNrUmVmRGFzaGJvYXJkVGlsZSk6IFRhc2tSZWZEYXNoYm9hcmRUaWxlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBUYXNrUmVmRGFzaGJvYXJkVGlsZSA9IHtcbiAgICAgICAgICAgIGRhdGFHcm91cHM6IHRpbGUuZGF0YUdyb3Vwc1xuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAoY29uc3QgZGcgb2YgdGlsZS5kYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRnLmZpZWxkcykge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuc3RyaW5nSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUYXNrUmVmRGFzaGJvYXJkVGlsZUNvbnN0YW50cy5EQVNIQk9BUkRfVElMRV9YOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnggPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFRhc2tSZWZEYXNoYm9hcmRUaWxlQ29uc3RhbnRzLkRBU0hCT0FSRF9USUxFX1k6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQueSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgVGFza1JlZkRhc2hib2FyZFRpbGVDb25zdGFudHMuREFTSEJPQVJEX1RJTEVfUk9XUzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yb3dzID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBUYXNrUmVmRGFzaGJvYXJkVGlsZUNvbnN0YW50cy5EQVNIQk9BUkRfVElMRV9DT0xTOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbHMgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC54ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aWxlLmRhdGFHcm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihgVGFzayByZWYgZGFzaGJvYXJkIHRpbGUgZnJvbSB0YXNrICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUYXNrSWR9JyB0cmFuc2l0aW9uICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUcmFuc2l0aW9uSWR9JyBjYXNlICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRDYXNlSWR9JyBkb2VzIG5vdCBzcGVjaWZ5IHRpbGUgZ3JpZCBYIGNvb3JkaW5hdGUhIEFkZCBhIG51bWJlciBmaWVsZCB3aXRoIElEICcke1Rhc2tSZWZEYXNoYm9hcmRUaWxlQ29uc3RhbnRzLkRBU0hCT0FSRF9USUxFX1h9JyB0byB0aGUgcmVmZXJlbmNlZCB0YXNrIHRvIHNwZWNpZnkgaXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQueCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC55ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aWxlLmRhdGFHcm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihgVGFzayByZWYgZGFzaGJvYXJkIHRpbGUgZnJvbSB0YXNrICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUYXNrSWR9JyB0cmFuc2l0aW9uICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUcmFuc2l0aW9uSWR9JyBjYXNlICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRDYXNlSWR9JyBkb2VzIG5vdCBzcGVjaWZ5IHRpbGUgZ3JpZCBZIGNvb3JkaW5hdGUhIEFkZCBhIG51bWJlciBmaWVsZCB3aXRoIElEICcke1Rhc2tSZWZEYXNoYm9hcmRUaWxlQ29uc3RhbnRzLkRBU0hCT0FSRF9USUxFX1l9JyB0byB0aGUgcmVmZXJlbmNlZCB0YXNrIHRvIHNwZWNpZnkgaXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQueSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5yb3dzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aWxlLmRhdGFHcm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihgVGFzayByZWYgZGFzaGJvYXJkIHRpbGUgZnJvbSB0YXNrICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUYXNrSWR9JyB0cmFuc2l0aW9uICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUcmFuc2l0aW9uSWR9JyBjYXNlICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRDYXNlSWR9JyBkb2VzIG5vdCBzcGVjaWZ5IHRpbGUgaGVpZ2h0IGNvb3JkaW5hdGUhIEFkZCBhIG51bWJlciBmaWVsZCB3aXRoIElEICcke1Rhc2tSZWZEYXNoYm9hcmRUaWxlQ29uc3RhbnRzLkRBU0hCT0FSRF9USUxFX1JPV1N9JyB0byB0aGUgcmVmZXJlbmNlZCB0YXNrIHRvIHNwZWNpZnkgaXQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQucm93cyA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5jb2xzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aWxlLmRhdGFHcm91cHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZ2dlci5lcnJvcihgVGFzayByZWYgZGFzaGJvYXJkIHRpbGUgZnJvbSB0YXNrICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUYXNrSWR9JyB0cmFuc2l0aW9uICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRUcmFuc2l0aW9uSWR9JyBjYXNlICcke3RpbGUuZGF0YUdyb3Vwc1swXS5wYXJlbnRDYXNlSWR9JyBkb2VzIG5vdCBzcGVjaWZ5IHRpbGUgd2lkdGggY29vcmRpbmF0ZSEgQWRkIGEgbnVtYmVyIGZpZWxkIHdpdGggSUQgJyR7VGFza1JlZkRhc2hib2FyZFRpbGVDb25zdGFudHMuREFTSEJPQVJEX1RJTEVfQ09MU30nIHRvIHRoZSByZWZlcmVuY2VkIHRhc2sgdG8gc3BlY2lmeSBpdC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5jb2xzID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETyBhIG1vZGlmaWVkIGNvcHkgb2YgYSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSBmcm9tIEFic3RyYWN0VGFza0NvbnRlbnRDb21wb25lbnRcbiAgICBwcm90ZWN0ZWQgb2NjdXB5U3BhY2UoZ3JpZDogQXJyYXk8QXJyYXk8Ym9vbGVhbj4+LCB5OiBudW1iZXIsIHg6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IHk7IGogPCB5ICsgaGVpZ2h0OyBqKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDwgeCArIHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBncmlkW2pdW2ldID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBjcmVhdGVFbXB0eURhc2hib2FyZFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBUYXNrUmVmRGFzaGJvYXJkVGlsZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhR3JvdXBzOiBbXSxcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICAgICAgcm93czogMSxcbiAgICAgICAgICAgIGNvbHM6IDEsXG4gICAgICAgICAgICBpc0VtcHR5OiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=