@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
111 lines • 23.6 kB
JavaScript
import { Component, Input, ViewChildren } from '@angular/core';
import { ParameterViewModel, PropertyViewModel } from '@nakedobjects/view-models';
import { BaseDialogComponent } from '../base-dialog/base-dialog.component';
import some from 'lodash-es/some';
import map from 'lodash-es/map';
import fromPairs from 'lodash-es/fromPairs';
import { EditParameterComponent } from '../edit-parameter/edit-parameter.component';
import * as i0 from "@angular/core";
import * as i1 from "@nakedobjects/view-models";
import * as i2 from "@nakedobjects/services";
import * as i3 from "@angular/forms";
import * as i4 from "@angular/common";
import * as i5 from "../view-property/view-property.component";
import * as i6 from "../edit-parameter/edit-parameter.component";
import * as i7 from "../click.directive";
export class EditDialogComponent extends BaseDialogComponent {
constructor(viewModelFactory, error, context, formBuilder) {
super(viewModelFactory, error, context, formBuilder);
}
properties;
parmComponents;
set parentObject(obj) {
this.parent = obj;
}
get parentObject() {
return this.parent;
}
get parametersProperties() {
const parmMap = fromPairs(this.parameters.map((p) => [p.id.toLowerCase(), p]));
return map(this.properties, (p) => parmMap[p.id.toLowerCase()] ?? p);
}
isParameter(parmprop) {
return parmprop instanceof ParameterViewModel;
}
asParameter(parmprop) {
return parmprop;
}
isLastParameter(parmprop) {
return parmprop === this.parameters[this.parameters.length - 1];
}
isProperty(parmprop) {
return parmprop instanceof PropertyViewModel;
}
asProperty(parmprop) {
return parmprop;
}
hasHint(parm) {
return parm?.presentationHint !== null && parm.presentationHint !== undefined;
}
classes(parmprop) {
if (parmprop instanceof PropertyViewModel) {
const hint = parmprop.presentationHint ?? '';
return `property ${hint}`.trim();
}
return ({ parameter: true, [parmprop.presentationHint]: this.hasHint(parmprop) });
}
doNextEditByAction(i) {
const property = this.properties[i];
if (property.isEditByAction && !property.isEditActionDisabled) {
property.doEditByAction();
return true;
}
return false;
}
onSubmitNext(right) {
this.onSubmit(right);
const merged = this.parametersProperties;
const lastParameter = this.parameters[this.parameters.length - 1];
const lastParameterIndex = merged.indexOf(lastParameter);
const nextMergedIndex = lastParameterIndex + 1;
const nextProperty = (nextMergedIndex > merged.length - 1) ? this.properties[0] : merged[nextMergedIndex];
const nextPropertyIndex = this.properties.indexOf(nextProperty);
for (let i = nextPropertyIndex; i < this.properties.length; i++) {
if (this.doNextEditByAction(i)) {
return;
}
}
for (let i = 0; i < nextPropertyIndex; i++) {
if (this.doNextEditByAction(i)) {
return;
}
}
}
ngAfterViewInit() {
this.sub = this.parmComponents?.changes.subscribe(() => this.focus());
}
focus() {
const parms = this.parmComponents;
if (parms && parms.length > 0) {
// until first element returns true
return some(parms.toArray(), i => i.focus());
}
return false;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: EditDialogComponent, deps: [{ token: i1.ViewModelFactoryService }, { token: i2.ErrorService }, { token: i2.ContextService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: EditDialogComponent, selector: "nof-edit-dialog", inputs: { properties: "properties", parentObject: "parentObject" }, viewQueries: [{ propertyName: "parmComponents", predicate: EditParameterComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"dialog\">\n\t<form *ngIf=\"form\" (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\" autocomplete=\"off\">\n\t\t<ng-container *ngFor=\"let parmprop of parametersProperties\">\n\t\t\t<nof-edit-parameter *ngIf=\"isParameter(parmprop)\" [ngClass]=\"classes(parmprop)\" [parameter]=\"asParameter(parmprop)\" [parent]=\"parentObject\" [form]=\"form\"></nof-edit-parameter>\n\t\t\t<ng-container *ngIf=\"isLastParameter(parmprop)\">\n\t\t\t\t<div class=\"co-validation\">{{message}}</div>\n\t\t\t\t<div class=\"form-row\">\n\t\t\t\t\t<input class=\"ok\" tabindex=\"0\" type=\"submit\" value=\"OK\" title=\"{{tooltip}}\" nofClick (leftClick)=\"onSubmit()\" (rightClick)=\"onSubmit(true)\" [disabled]=\"!form.valid\" />\n\t\t\t\t\t<input class=\"cancel\" tabindex=\"0\" type=\"button\" nofClick (leftClick)=\"close()\" value=\"Cancel\"/>\n\t\t\t\t\t<input class=\"next\" tabindex=\"0\" type=\"submit\" value=\"Next\" title=\"{{tooltip}}\" nofClick (leftClick)=\"onSubmitNext()\" (rightClick)=\"onSubmitNext(true)\" [disabled]=\"!form.valid\" />\n\t\t\t\t</div>\n\t\t\t</ng-container>\t\t\n\t\t\t<nof-view-property *ngIf=\"isProperty(parmprop)\" [ngClass]=\"classes(parmprop)\" [property]=\"asProperty(parmprop)\"></nof-view-property>\n\t\t</ng-container>\t\t\n\t</form>\n</div>", styles: [".dialog{display:block;overflow-y:auto;border-style:solid;border-color:#000;border-width:1px}.dialog select{margin-bottom:var(--space-4);border-style:solid;border-color:gray;border-width:1px}input[type=text]{padding-right:var(--space-4);padding-left:var(--space-3);margin-bottom:var(--space-4);border-style:solid;border-color:gray;border-width:1px}input[type=button],input[type=reset],input[type=submit]{margin-left:var(--space-3);margin-top:var(--space-4);margin-right:var(--space-3);margin-bottom:var(--space-3);padding:var(--space-3) 1var(--space-1);text-align:center;vertical-align:middle;border:1px transparent solid;cursor:pointer;width:auto;float:right;outline:solid;outline-color:#d3d3d3;outline-width:1px}input[type=button]:focus,input[type=button]:hover,input[type=submit]:focus,input[type=submit]:hover{outline:solid;outline-width:1px;outline-color:#000;background-color:#fff;color:var(--dialog-contrast-text-color)}input[value=Next]{display:none}input[type=button]:disabled,input[type=submit]:disabled{color:var(--disabled-color)}.parameter .name{width:var(--field-name-width)}.parameter{overflow:hidden;display:block}.form-row{height:40px}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.ViewPropertyComponent, selector: "nof-view-property", inputs: ["property", "propertyName"] }, { kind: "component", type: i6.EditParameterComponent, selector: "nof-edit-parameter", inputs: ["parent", "parameter", "form"] }, { kind: "directive", type: i7.ClickDirective, selector: "[nofClick]", outputs: ["leftClick", "rightClick"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: EditDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'nof-edit-dialog', template: "<div *ngIf=\"dialog\">\n\t<form *ngIf=\"form\" (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\" autocomplete=\"off\">\n\t\t<ng-container *ngFor=\"let parmprop of parametersProperties\">\n\t\t\t<nof-edit-parameter *ngIf=\"isParameter(parmprop)\" [ngClass]=\"classes(parmprop)\" [parameter]=\"asParameter(parmprop)\" [parent]=\"parentObject\" [form]=\"form\"></nof-edit-parameter>\n\t\t\t<ng-container *ngIf=\"isLastParameter(parmprop)\">\n\t\t\t\t<div class=\"co-validation\">{{message}}</div>\n\t\t\t\t<div class=\"form-row\">\n\t\t\t\t\t<input class=\"ok\" tabindex=\"0\" type=\"submit\" value=\"OK\" title=\"{{tooltip}}\" nofClick (leftClick)=\"onSubmit()\" (rightClick)=\"onSubmit(true)\" [disabled]=\"!form.valid\" />\n\t\t\t\t\t<input class=\"cancel\" tabindex=\"0\" type=\"button\" nofClick (leftClick)=\"close()\" value=\"Cancel\"/>\n\t\t\t\t\t<input class=\"next\" tabindex=\"0\" type=\"submit\" value=\"Next\" title=\"{{tooltip}}\" nofClick (leftClick)=\"onSubmitNext()\" (rightClick)=\"onSubmitNext(true)\" [disabled]=\"!form.valid\" />\n\t\t\t\t</div>\n\t\t\t</ng-container>\t\t\n\t\t\t<nof-view-property *ngIf=\"isProperty(parmprop)\" [ngClass]=\"classes(parmprop)\" [property]=\"asProperty(parmprop)\"></nof-view-property>\n\t\t</ng-container>\t\t\n\t</form>\n</div>", styles: [".dialog{display:block;overflow-y:auto;border-style:solid;border-color:#000;border-width:1px}.dialog select{margin-bottom:var(--space-4);border-style:solid;border-color:gray;border-width:1px}input[type=text]{padding-right:var(--space-4);padding-left:var(--space-3);margin-bottom:var(--space-4);border-style:solid;border-color:gray;border-width:1px}input[type=button],input[type=reset],input[type=submit]{margin-left:var(--space-3);margin-top:var(--space-4);margin-right:var(--space-3);margin-bottom:var(--space-3);padding:var(--space-3) 1var(--space-1);text-align:center;vertical-align:middle;border:1px transparent solid;cursor:pointer;width:auto;float:right;outline:solid;outline-color:#d3d3d3;outline-width:1px}input[type=button]:focus,input[type=button]:hover,input[type=submit]:focus,input[type=submit]:hover{outline:solid;outline-width:1px;outline-color:#000;background-color:#fff;color:var(--dialog-contrast-text-color)}input[value=Next]{display:none}input[type=button]:disabled,input[type=submit]:disabled{color:var(--disabled-color)}.parameter .name{width:var(--field-name-width)}.parameter{overflow:hidden;display:block}.form-row{height:40px}\n"] }]
}], ctorParameters: () => [{ type: i1.ViewModelFactoryService }, { type: i2.ErrorService }, { type: i2.ContextService }, { type: i3.FormBuilder }], propDecorators: { properties: [{
type: Input,
args: [{ required: true }]
}], parmComponents: [{
type: ViewChildren,
args: [EditParameterComponent]
}], parentObject: [{
type: Input,
args: [{ required: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZ2VtaW5pL3NyYy9lZGl0LWRpYWxvZy9lZGl0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9nZW1pbmkvc3JjL2VkaXQtZGlhbG9nL2VkaXQtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBd0IsWUFBWSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRy9HLE9BQU8sRUFFSCxrQkFBa0IsRUFDbEIsaUJBQWlCLEVBRXBCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxJQUFJLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEMsT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ2hDLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOzs7Ozs7Ozs7QUFPcEYsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjtJQUV4RCxZQUNJLGdCQUF5QyxFQUN6QyxLQUFtQixFQUNuQixPQUF1QixFQUN2QixXQUF3QjtRQUNwQixLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBR0QsVUFBVSxDQUF1QjtJQUdqQyxjQUFjLENBQXFDO0lBRW5ELElBQ0ksWUFBWSxDQUFDLEdBQTJCO1FBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxNQUErQixDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUNwQixNQUFNLE9BQU8s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QUFDLHNCQUFzQjtnQkFJaEMsWUFBWTtzQkFEZixLQUFLO3VCQUFDLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSwgRXJyb3JTZXJ2aWNlIH0gZnJvbSAnQG5ha2Vkb2JqZWN0cy9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICAgIERvbWFpbk9iamVjdFZpZXdNb2RlbCxcbiAgICBQYXJhbWV0ZXJWaWV3TW9kZWwsXG4gICAgUHJvcGVydHlWaWV3TW9kZWwsXG4gICAgVmlld01vZGVsRmFjdG9yeVNlcnZpY2Vcbn0gZnJvbSAnQG5ha2Vkb2JqZWN0cy92aWV3LW1vZGVscyc7XG5pbXBvcnQgeyBCYXNlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vYmFzZS1kaWFsb2cvYmFzZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCBzb21lIGZyb20gJ2xvZGFzaC1lcy9zb21lJztcbmltcG9ydCBtYXAgZnJvbSAnbG9kYXNoLWVzL21hcCc7XG5pbXBvcnQgZnJvbVBhaXJzIGZyb20gJ2xvZGFzaC1lcy9mcm9tUGFpcnMnO1xuaW1wb3J0IHsgRWRpdFBhcmFtZXRlckNvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtcGFyYW1ldGVyL2VkaXQtcGFyYW1ldGVyLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbm9mLWVkaXQtZGlhbG9nJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2VkaXQtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZWRpdC1kaWFsb2cuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEVkaXREaWFsb2dDb21wb25lbnQgZXh0ZW5kcyBCYXNlRGlhbG9nQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHZpZXdNb2RlbEZhY3Rvcnk6IFZpZXdNb2RlbEZhY3RvcnlTZXJ2aWNlLFxuICAgICAgICBlcnJvcjogRXJyb3JTZXJ2aWNlLFxuICAgICAgICBjb250ZXh0OiBDb250ZXh0U2VydmljZSxcbiAgICAgICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XG4gICAgICAgICAgICBzdXBlcih2aWV3TW9kZWxGYWN0b3J5LCBlcnJvciwgY29udGV4dCwgZm9ybUJ1aWxkZXIpO1xuICAgIH1cblxuICAgIEBJbnB1dCh7cmVxdWlyZWQ6IHRydWV9KVxuICAgIHByb3BlcnRpZXMhOiBQcm9wZXJ0eVZpZXdNb2RlbFtdO1xuXG4gICAgQFZpZXdDaGlsZHJlbihFZGl0UGFyYW1ldGVyQ29tcG9uZW50KVxuICAgIHBhcm1Db21wb25lbnRzPzogUXVlcnlMaXN0PEVkaXRQYXJhbWV0ZXJDb21wb25lbnQ+O1xuXG4gICAgQElucHV0KHtyZXF1aXJlZDogdHJ1ZX0pXG4gICAgc2V0IHBhcmVudE9iamVjdChvYmogOiBEb21haW5PYmplY3RWaWV3TW9kZWwpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBvYmo7XG4gICAgfVxuXG4gICAgZ2V0IHBhcmVudE9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50IGFzIERvbWFpbk9iamVjdFZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICBnZXQgcGFyYW1ldGVyc1Byb3BlcnRpZXMoKTogKFBhcmFtZXRlclZpZXdNb2RlbCB8IFByb3BlcnR5Vmlld01vZGVsKVtdIHtcbiAgICAgICAgY29uc3QgcGFybU1hcCA9IGZyb21QYWlycyh0aGlzLnBhcmFtZXRlcnMubWFwKChwKSA9PiBbcC5pZC50b0xvd2VyQ2FzZSgpLCBwXSkpO1xuICAgICAgICByZXR1cm4gbWFwKHRoaXMucHJvcGVydGllcywgKHApID0+IHBhcm1NYXBbcC5pZC50b0xvd2VyQ2FzZSgpXSA/PyBwKTtcbiAgICB9XG5cbiAgICBpc1BhcmFtZXRlcihwYXJtcHJvcDogUHJvcGVydHlWaWV3TW9kZWwgfCBQYXJhbWV0ZXJWaWV3TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHBhcm1wcm9wIGluc3RhbmNlb2YgUGFyYW1ldGVyVmlld01vZGVsO1xuICAgIH1cblxuICAgIGFzUGFyYW1ldGVyKHBhcm1wcm9wOiBQcm9wZXJ0eVZpZXdNb2RlbCB8IFBhcmFtZXRlclZpZXdNb2RlbCkge1xuICAgICAgICByZXR1cm4gcGFybXByb3AgYXMgUGFyYW1ldGVyVmlld01vZGVsO1xuICAgIH1cblxuICAgIGlzTGFzdFBhcmFtZXRlcihwYXJtcHJvcDogUHJvcGVydHlWaWV3TW9kZWwgfCBQYXJhbWV0ZXJWaWV3TW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIHBhcm1wcm9wID09PSB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIGlzUHJvcGVydHkocGFybXByb3A6IFByb3BlcnR5Vmlld01vZGVsIHwgUGFyYW1ldGVyVmlld01vZGVsKSB7XG4gICAgICAgIHJldHVybiBwYXJtcHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5Vmlld01vZGVsO1xuICAgIH1cblxuICAgIGFzUHJvcGVydHkocGFybXByb3A6IFByb3BlcnR5Vmlld01vZGVsIHwgUGFyYW1ldGVyVmlld01vZGVsKSB7XG4gICAgICAgIHJldHVybiBwYXJtcHJvcCBhcyBQcm9wZXJ0eVZpZXdNb2RlbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0hpbnQocGFybTogUGFyYW1ldGVyVmlld01vZGVsKSB7XG4gICAgICAgIHJldHVybiBwYXJtPy5wcmVzZW50YXRpb25IaW50ICE9PSBudWxsICYmIHBhcm0ucHJlc2VudGF0aW9uSGludCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNsYXNzZXMocGFybXByb3A6IFByb3BlcnR5Vmlld01vZGVsIHwgUGFyYW1ldGVyVmlld01vZGVsKSB7XG4gICAgICAgIGlmIChwYXJtcHJvcCBpbnN0YW5jZW9mIFByb3BlcnR5Vmlld01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBoaW50ID0gcGFybXByb3AucHJlc2VudGF0aW9uSGludCA/PyAnJztcbiAgICAgICAgICAgIHJldHVybiBgcHJvcGVydHkgJHtoaW50fWAudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoeyBwYXJhbWV0ZXI6IHRydWUsIFtwYXJtcHJvcC5wcmVzZW50YXRpb25IaW50XTogdGhpcy5oYXNIaW50KHBhcm1wcm9wKX0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZG9OZXh0RWRpdEJ5QWN0aW9uKGk6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllc1tpXTtcbiAgICAgICAgaWYgKHByb3BlcnR5LmlzRWRpdEJ5QWN0aW9uICYmICFwcm9wZXJ0eS5pc0VkaXRBY3Rpb25EaXNhYmxlZCkge1xuICAgICAgICAgICAgcHJvcGVydHkuZG9FZGl0QnlBY3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdE5leHQocmlnaHQ/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMub25TdWJtaXQocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMucGFyYW1ldGVyc1Byb3BlcnRpZXM7XG4gICAgICAgIGNvbnN0IGxhc3RQYXJhbWV0ZXIgPSB0aGlzLnBhcmFtZXRlcnNbdGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjb25zdCBsYXN0UGFyYW1ldGVySW5kZXggPSBtZXJnZWQuaW5kZXhPZihsYXN0UGFyYW1ldGVyKTtcbiAgICAgICAgY29uc3QgbmV4dE1lcmdlZEluZGV4ID0gbGFzdFBhcmFtZXRlckluZGV4ICsgMTtcbiAgICAgICAgY29uc3QgbmV4dFByb3BlcnR5ID0gKG5leHRNZXJnZWRJbmRleCA+IG1lcmdlZC5sZW5ndGggLSAxKSA/IHRoaXMucHJvcGVydGllc1swXSA6IG1lcmdlZFtuZXh0TWVyZ2VkSW5kZXhdIGFzIFByb3BlcnR5Vmlld01vZGVsO1xuICAgICAgICBjb25zdCBuZXh0UHJvcGVydHlJbmRleCA9IHRoaXMucHJvcGVydGllcy5pbmRleE9mKG5leHRQcm9wZXJ0eSk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IG5leHRQcm9wZXJ0eUluZGV4OyBpIDwgdGhpcy5wcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb05leHRFZGl0QnlBY3Rpb24oaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHRQcm9wZXJ0eUluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvTmV4dEVkaXRCeUFjdGlvbihpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdWIgPSB0aGlzLnBhcm1Db21wb25lbnRzPy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvY3VzKCkpO1xuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICBjb25zdCBwYXJtcyA9IHRoaXMucGFybUNvbXBvbmVudHM7XG4gICAgICAgIGlmIChwYXJtcyAmJiBwYXJtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB1bnRpbCBmaXJzdCBlbGVtZW50IHJldHVybnMgdHJ1ZVxuICAgICAgICAgICAgcmV0dXJuIHNvbWUocGFybXMudG9BcnJheSgpLCBpID0+IGkuZm9jdXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJkaWFsb2dcIj5cblx0PGZvcm0gKm5nSWY9XCJmb3JtXCIgKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYXJtcHJvcCBvZiBwYXJhbWV0ZXJzUHJvcGVydGllc1wiPlxuXHRcdFx0PG5vZi1lZGl0LXBhcmFtZXRlciAqbmdJZj1cImlzUGFyYW1ldGVyKHBhcm1wcm9wKVwiIFtuZ0NsYXNzXT1cImNsYXNzZXMocGFybXByb3ApXCIgW3BhcmFtZXRlcl09XCJhc1BhcmFtZXRlcihwYXJtcHJvcClcIiBbcGFyZW50XT1cInBhcmVudE9iamVjdFwiIFtmb3JtXT1cImZvcm1cIj48L25vZi1lZGl0LXBhcmFtZXRlcj5cblx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0xhc3RQYXJhbWV0ZXIocGFybXByb3ApXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjby12YWxpZGF0aW9uXCI+e3ttZXNzYWdlfX08L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG5cdFx0XHRcdFx0PGlucHV0IGNsYXNzPVwib2tcIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJPS1wiIHRpdGxlPVwie3t0b29sdGlwfX1cIiBub2ZDbGljayAobGVmdENsaWNrKT1cIm9uU3VibWl0KClcIiAocmlnaHRDbGljayk9XCJvblN1Ym1pdCh0cnVlKVwiIFtkaXNhYmxlZF09XCIhZm9ybS52YWxpZFwiIC8+XG5cdFx0XHRcdFx0PGlucHV0IGNsYXNzPVwiY2FuY2VsXCIgdGFiaW5kZXg9XCIwXCIgdHlwZT1cImJ1dHRvblwiIG5vZkNsaWNrIChsZWZ0Q2xpY2spPVwiY2xvc2UoKVwiIHZhbHVlPVwiQ2FuY2VsXCIvPlxuXHRcdFx0XHRcdDxpbnB1dCBjbGFzcz1cIm5leHRcIiB0YWJpbmRleD1cIjBcIiB0eXBlPVwic3VibWl0XCIgdmFsdWU9XCJOZXh0XCIgdGl0bGU9XCJ7e3Rvb2x0aXB9fVwiIG5vZkNsaWNrIChsZWZ0Q2xpY2spPVwib25TdWJtaXROZXh0KClcIiAocmlnaHRDbGljayk9XCJvblN1Ym1pdE5leHQodHJ1ZSlcIiBbZGlzYWJsZWRdPVwiIWZvcm0udmFsaWRcIiAvPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvbmctY29udGFpbmVyPlx0XHRcblx0XHRcdDxub2Ytdmlldy1wcm9wZXJ0eSAgKm5nSWY9XCJpc1Byb3BlcnR5KHBhcm1wcm9wKVwiIFtuZ0NsYXNzXT1cImNsYXNzZXMocGFybXByb3ApXCIgIFtwcm9wZXJ0eV09XCJhc1Byb3BlcnR5KHBhcm1wcm9wKVwiPjwvbm9mLXZpZXctcHJvcGVydHk+XG5cdFx0PC9uZy1jb250YWluZXI+XHRcdFxuXHQ8L2Zvcm0+XG48L2Rpdj4iXX0=