@ngx-dynamic-components/tools
Version:
@ngx-dynamic-components/tools is Angular 7+ library what contains a core interfaces to build a configuration driven web pages.
88 lines • 19.5 kB
JavaScript
import { Component, Input, Output, EventEmitter } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { AddDialogComponent } from '../add-dialog/add-dialog.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@angular/material/button";
import * as i3 from "@angular/material/icon";
import * as i4 from "@angular/material/tooltip";
import * as i5 from "../properties-editor/properties-editor.component";
export class ControlEditorComponent {
dialog;
uiModel;
uiModelChanged = new EventEmitter();
uiModelRemoved = new EventEmitter();
constructor(dialog) {
this.dialog = dialog;
}
openAddDialog() {
const dialogRef = this.dialog.open(AddDialogComponent);
dialogRef.afterClosed().subscribe(item => {
this.uiModel.children.push(item);
this.uiModelChanged.emit();
});
}
onHover(evt) {
const dragEl = this.getParentDrag(evt.target);
dragEl.classList.add('drag-selected');
}
onMouseLeave(evt) {
const dragEl = this.getParentDrag(evt.target);
dragEl.classList.remove('drag-selected');
}
getDragTooltip() {
return this.uiModel.type === 'material:flex-container' ? 'Drag container' : 'Drag component';
}
getParentDrag(el) {
let dragEl = el;
while (!['item', 'row', 'col-sm'].some(c => Array.from(dragEl.classList).includes(c))) {
dragEl = dragEl.parentNode;
}
return dragEl;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ControlEditorComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.6", type: ControlEditorComponent, selector: "dc-control-editor", inputs: { uiModel: "uiModel" }, outputs: { uiModelChanged: "uiModelChanged", uiModelRemoved: "uiModelRemoved" }, ngImport: i0, template: `
<dc-properties-editor [uiModel]="uiModel" (updatedProperty)="uiModelChanged.emit()"></dc-properties-editor>
<button mat-icon-button [matTooltip]="getDragTooltip()"
(mouseover)="onHover($event)" (focus)="onHover($event)" (mouseleave)="onMouseLeave($event)" class="handle">
<svg width="24px" fill="currentColor" viewBox="0 0 24 24">
<path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z">
</path>
<path d="M0 0h24v24H0z" fill="none"></path>
</svg>
</button>
<button mat-icon-button class="add-component" matTooltip="Add component" (click)="openAddDialog()">
<mat-icon>add</mat-icon>
</button>
<button mat-icon-button matTooltip="Remove" (click)="uiModelRemoved.emit()">
<mat-icon>clear</mat-icon>
</button>
`, isInline: true, styles: ["::ng-deep .preview dc-container dc-container-row.row{min-height:100px;border:1px dashed rgba(0,0,0,0)}::ng-deep .preview dc-container dc-container-row.row.active{border-color:gray}::ng-deep .preview.edit-mode dc-container dc-container-row.row{border-color:#00000040}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor{left:-50px}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor .handle{display:none}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor .add-component{display:inline-block}::ng-deep .preview.edit-mode dc-container dc-container-row.row .col-sm dc-ui-flex-container+dc-control-editor{left:60px}::ng-deep .preview dc-ui-flex-container .item,::ng-deep .preview dc-container .item,::ng-deep .preview dc-container dc-container-row.row,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]{position:relative;border:1px dashed rgba(0,0,0,0)}::ng-deep .preview dc-ui-flex-container .item:hover>dc-control-editor,::ng-deep .preview dc-container .item:hover>dc-control-editor,::ng-deep .preview dc-container dc-container-row.row:hover>dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]:hover>dc-control-editor{display:block}::ng-deep .preview dc-ui-flex-container .item.drag-selected,::ng-deep .preview dc-container .item.drag-selected,::ng-deep .preview dc-container dc-container-row.row.drag-selected,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-].drag-selected{border-color:gray}::ng-deep .preview dc-ui-flex-container .item.drag-selected dc-control-editor,::ng-deep .preview dc-container .item.drag-selected dc-control-editor,::ng-deep .preview dc-container dc-container-row.row.drag-selected dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-].drag-selected dc-control-editor{display:block!important}::ng-deep .preview dc-ui-flex-container .item dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container .item dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-] dc-ui-flex-container+dc-control-editor>.handle{color:#000000bf}::ng-deep .preview dc-ui-flex-container .item:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container .item:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]:hover dc-ui-flex-container+dc-control-editor>.handle{color:#000c}::ng-deep .preview dc-ui-flex-container .item dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container .item dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container dc-container-row.row dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-] dc-ui-flex-container+dc-control-editor{left:-50px}::ng-deep .preview dc-container.container dc-container-row.row>dc-control-editor{left:-50px}::ng-deep .gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)\";filter:alpha(opacity=80);pointer-events:none;box-sizing:border-box;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;background:#eeeeee}::ng-deep .gu-mirror>dc-control-editor{display:block!important}::ng-deep .gu-mirror>dc-ui-flex-container+dc-control-editor{left:-50px}::ng-deep .gu-hide{left:-9999px!important}::ng-deep .gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}::ng-deep .gu-transit{position:relative;transition:transform .25s cubic-bezier(0,0,.2,1)}::ng-deep .gu-transit:after{content:\" \";top:0;display:block;position:absolute;background:#ccc;width:100%;height:100%;z-index:1}::ng-deep .gu-transit dc-control-editor{display:none!important}:host{position:absolute;color:#00000080;top:0;right:0;z-index:2;max-width:105px;display:none;background:rgba(0,0,0,.25);border-radius:4px}:host:hover{cursor:move;color:#000000bf}:host ::ng-deep button{height:35px;line-height:35px;width:35px}:host .add-component{display:none}\n"], dependencies: [{ kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i5.PropertiesEditorComponent, selector: "dc-properties-editor", inputs: ["uiModel"], outputs: ["updatedProperty"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.6", ngImport: i0, type: ControlEditorComponent, decorators: [{
type: Component,
args: [{ selector: 'dc-control-editor', template: `
<dc-properties-editor [uiModel]="uiModel" (updatedProperty)="uiModelChanged.emit()"></dc-properties-editor>
<button mat-icon-button [matTooltip]="getDragTooltip()"
(mouseover)="onHover($event)" (focus)="onHover($event)" (mouseleave)="onMouseLeave($event)" class="handle">
<svg width="24px" fill="currentColor" viewBox="0 0 24 24">
<path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z">
</path>
<path d="M0 0h24v24H0z" fill="none"></path>
</svg>
</button>
<button mat-icon-button class="add-component" matTooltip="Add component" (click)="openAddDialog()">
<mat-icon>add</mat-icon>
</button>
<button mat-icon-button matTooltip="Remove" (click)="uiModelRemoved.emit()">
<mat-icon>clear</mat-icon>
</button>
`, styles: ["::ng-deep .preview dc-container dc-container-row.row{min-height:100px;border:1px dashed rgba(0,0,0,0)}::ng-deep .preview dc-container dc-container-row.row.active{border-color:gray}::ng-deep .preview.edit-mode dc-container dc-container-row.row{border-color:#00000040}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor{left:-50px}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor .handle{display:none}::ng-deep .preview.edit-mode dc-container dc-container-row.row>dc-control-editor .add-component{display:inline-block}::ng-deep .preview.edit-mode dc-container dc-container-row.row .col-sm dc-ui-flex-container+dc-control-editor{left:60px}::ng-deep .preview dc-ui-flex-container .item,::ng-deep .preview dc-container .item,::ng-deep .preview dc-container dc-container-row.row,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]{position:relative;border:1px dashed rgba(0,0,0,0)}::ng-deep .preview dc-ui-flex-container .item:hover>dc-control-editor,::ng-deep .preview dc-container .item:hover>dc-control-editor,::ng-deep .preview dc-container dc-container-row.row:hover>dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]:hover>dc-control-editor{display:block}::ng-deep .preview dc-ui-flex-container .item.drag-selected,::ng-deep .preview dc-container .item.drag-selected,::ng-deep .preview dc-container dc-container-row.row.drag-selected,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-].drag-selected{border-color:gray}::ng-deep .preview dc-ui-flex-container .item.drag-selected dc-control-editor,::ng-deep .preview dc-container .item.drag-selected dc-control-editor,::ng-deep .preview dc-container dc-container-row.row.drag-selected dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-].drag-selected dc-control-editor{display:block!important}::ng-deep .preview dc-ui-flex-container .item dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container .item dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-] dc-ui-flex-container+dc-control-editor>.handle{color:#000000bf}::ng-deep .preview dc-ui-flex-container .item:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container .item:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row:hover dc-ui-flex-container+dc-control-editor>.handle,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-]:hover dc-ui-flex-container+dc-control-editor>.handle{color:#000c}::ng-deep .preview dc-ui-flex-container .item dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container .item dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container dc-container-row.row dc-ui-flex-container+dc-control-editor,::ng-deep .preview dc-container dc-container-row.row>div[class*=col-] dc-ui-flex-container+dc-control-editor{left:-50px}::ng-deep .preview dc-container.container dc-container-row.row>dc-control-editor{left:-50px}::ng-deep .gu-mirror{position:fixed!important;margin:0!important;z-index:9999!important;opacity:.8;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)\";filter:alpha(opacity=80);pointer-events:none;box-sizing:border-box;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;background:#eeeeee}::ng-deep .gu-mirror>dc-control-editor{display:block!important}::ng-deep .gu-mirror>dc-ui-flex-container+dc-control-editor{left:-50px}::ng-deep .gu-hide{left:-9999px!important}::ng-deep .gu-unselectable{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}::ng-deep .gu-transit{position:relative;transition:transform .25s cubic-bezier(0,0,.2,1)}::ng-deep .gu-transit:after{content:\" \";top:0;display:block;position:absolute;background:#ccc;width:100%;height:100%;z-index:1}::ng-deep .gu-transit dc-control-editor{display:none!important}:host{position:absolute;color:#00000080;top:0;right:0;z-index:2;max-width:105px;display:none;background:rgba(0,0,0,.25);border-radius:4px}:host:hover{cursor:move;color:#000000bf}:host ::ng-deep button{height:35px;line-height:35px;width:35px}:host .add-component{display:none}\n"] }]
}], ctorParameters: function () { return [{ type: i1.MatDialog }]; }, propDecorators: { uiModel: [{
type: Input
}], uiModelChanged: [{
type: Output
}], uiModelRemoved: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9vbHMvc3JjL2xpYi9jb21wb25lbnRzL2NvbnRyb2wtZWRpdG9yL2NvbnRyb2wtZWRpdG9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7OztBQXVCeEUsTUFBTSxPQUFPLHNCQUFzQjtJQU1iO0lBSlgsT0FBTyxDQUFVO0lBQ2hCLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3BDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBRTlDLFlBQW9CLE1BQWlCO1FBQWpCLFdBQU0sR0FBTixNQUFNLENBQVc7SUFBRyxDQUFDO0lBRXpDLGFBQWE7UUFDWCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXZELFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUc7UUFDVCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFxQixDQUFDLENBQUM7UUFDN0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFlBQVksQ0FBQyxHQUFVO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQXFCLENBQUMsQ0FBQztRQUM3RCxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvRixDQUFDO0lBRU8sYUFBYSxDQUFDLEVBQWU7UUFDbkMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDckYsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUF5QixDQUFDO1NBQzNDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzt1R0F2Q1Usc0JBQXNCOzJGQUF0QixzQkFBc0IsMEtBbkJ2Qjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCVDs7MkZBR1Usc0JBQXNCO2tCQXJCbEMsU0FBUzsrQkFDRSxtQkFBbUIsWUFDbkI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQlQ7Z0dBS1EsT0FBTztzQkFBZixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB0eXBlIHsgVUlNb2RlbCB9IGZyb20gJ0BuZ3gtZHluYW1pYy1jb21wb25lbnRzL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBBZGREaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9hZGQtZGlhbG9nL2FkZC1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZGMtY29udHJvbC1lZGl0b3InLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGMtcHJvcGVydGllcy1lZGl0b3IgW3VpTW9kZWxdPVwidWlNb2RlbFwiICh1cGRhdGVkUHJvcGVydHkpPVwidWlNb2RlbENoYW5nZWQuZW1pdCgpXCI+PC9kYy1wcm9wZXJ0aWVzLWVkaXRvcj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFttYXRUb29sdGlwXT1cImdldERyYWdUb29sdGlwKClcIlxyXG4gICAgIChtb3VzZW92ZXIpPVwib25Ib3ZlcigkZXZlbnQpXCIgKGZvY3VzKT1cIm9uSG92ZXIoJGV2ZW50KVwiIChtb3VzZWxlYXZlKT1cIm9uTW91c2VMZWF2ZSgkZXZlbnQpXCIgY2xhc3M9XCJoYW5kbGVcIj5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjI0cHhcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3pcIj5cclxuICAgICAgICA8L3BhdGg+XHJcbiAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiPjwvcGF0aD5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiYWRkLWNvbXBvbmVudFwiIG1hdFRvb2x0aXA9XCJBZGQgY29tcG9uZW50XCIgKGNsaWNrKT1cIm9wZW5BZGREaWFsb2coKVwiPlxyXG4gICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlbW92ZVwiIChjbGljayk9XCJ1aU1vZGVsUmVtb3ZlZC5lbWl0KClcIj5cclxuICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29udHJvbC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29udHJvbEVkaXRvckNvbXBvbmVudCB7XHJcblxyXG4gIEBJbnB1dCgpIHVpTW9kZWw6IFVJTW9kZWw7XHJcbiAgQE91dHB1dCgpIHVpTW9kZWxDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSB1aU1vZGVsUmVtb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZykge31cclxuXHJcbiAgb3BlbkFkZERpYWxvZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWRkRGlhbG9nQ29tcG9uZW50KTtcclxuXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoaXRlbSA9PiB7XHJcbiAgICAgIHRoaXMudWlNb2RlbC5jaGlsZHJlbi5wdXNoKGl0ZW0pO1xyXG4gICAgICB0aGlzLnVpTW9kZWxDaGFuZ2VkLmVtaXQoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25Ib3ZlcihldnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRyYWdFbCA9IHRoaXMuZ2V0UGFyZW50RHJhZyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcclxuICAgIGRyYWdFbC5jbGFzc0xpc3QuYWRkKCdkcmFnLXNlbGVjdGVkJyk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlTGVhdmUoZXZ0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZHJhZ0VsID0gdGhpcy5nZXRQYXJlbnREcmFnKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xyXG4gICAgZHJhZ0VsLmNsYXNzTGlzdC5yZW1vdmUoJ2RyYWctc2VsZWN0ZWQnKTtcclxuICB9XHJcblxyXG4gIGdldERyYWdUb29sdGlwKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy51aU1vZGVsLnR5cGUgPT09ICdtYXRlcmlhbDpmbGV4LWNvbnRhaW5lcicgPyAnRHJhZyBjb250YWluZXInIDogJ0RyYWcgY29tcG9uZW50JztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFyZW50RHJhZyhlbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICBsZXQgZHJhZ0VsID0gZWw7XHJcblxyXG4gICAgd2hpbGUgKCFbJ2l0ZW0nLCAncm93JywgJ2NvbC1zbSddLnNvbWUoYyA9PiBBcnJheS5mcm9tKGRyYWdFbC5jbGFzc0xpc3QpLmluY2x1ZGVzKGMpKSkge1xyXG4gICAgICBkcmFnRWwgPSBkcmFnRWwucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZHJhZ0VsO1xyXG4gIH1cclxufVxyXG4iXX0=