@nakedobjects/gemini
Version:
Single Page Application client for a Naked Objects application.
293 lines • 39.4 kB
JavaScript
import { Component, ElementRef } from '@angular/core';
import * as Ro from '@nakedobjects/restful-objects';
import { ChoiceViewModel } from '@nakedobjects/view-models';
import every from 'lodash-es/every';
import find from 'lodash-es/find';
import keys from 'lodash-es/keys';
import mapValues from 'lodash-es/mapValues';
import omit from 'lodash-es/omit';
import { BehaviorSubject } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import { accept, dropOn, focus, paste, safeUnsubscribe } from '../helpers-components';
import * as i0 from "@angular/core";
import * as i1 from "@nakedobjects/services";
import * as i2 from "@nakedobjects/view-models";
export class FieldComponent {
loggerService;
renderer;
dragAndDrop;
constructor(loggerService, renderer, dragAndDrop) {
this.loggerService = loggerService;
this.renderer = renderer;
this.dragAndDrop = dragAndDrop;
}
set formGroup(fm) {
this.formGrp = fm;
this.formGrp.valueChanges.pipe(debounceTime(200)).subscribe(_ => this.onValueChanged());
this.onValueChanged(); // (re)set validation messages now
}
get formGroup() {
return this.formGrp;
}
get message() {
return this.model.getMessage();
}
get isBoolean() {
return this.model.returnType === 'boolean';
}
get subject() {
if (!this.bSubject) {
const initialValue = this.control.value;
this.bSubject = new BehaviorSubject(initialValue);
this.sub = this.control.valueChanges.subscribe((data) => {
this.bSubject.next(data);
});
}
return this.bSubject;
}
formGrp;
vmParent;
model;
isConditionalChoices;
isAutoComplete;
bSubject;
sub;
lastArgs;
control;
currentOptions = [];
pArgs;
paneId;
canDrop = false;
dragOver = false;
init(vmParent, vm, control) {
this.vmParent = vmParent;
this.model = vm;
this.control = control;
this.paneId = this.model.onPaneId;
this.isConditionalChoices = (this.model.entryType === Ro.EntryType.ConditionalChoices ||
this.model.entryType === Ro.EntryType.MultipleConditionalChoices);
this.isAutoComplete = this.model.entryType === Ro.EntryType.AutoComplete;
if (this.isConditionalChoices) {
this.pArgs = omit(this.model.promptArguments, 'x-ro-nof-members');
this.populateDropdown();
}
}
get accept() {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const _this = this;
return (cdkDrag, _cdkDropList) => {
return accept(_this.model, _this, cdkDrag.data);
};
}
drop(event) {
const cdkDrag = event.item;
if (event.isPointerOverContainer) {
dropOn(cdkDrag.data, this.model, this);
}
this.canDrop = false;
this.dragOver = false;
}
exit() {
this.canDrop = false;
this.dragOver = false;
}
enter() {
this.dragOver = true;
}
isDomainObjectViewModel(object) {
return !!(object && object instanceof Object && 'properties' in object);
}
mapValues(args, parmsOrProps) {
return mapValues(args, (v, n) => {
const pop = find(parmsOrProps, p => p.argId === n);
return pop.getValue();
});
}
populateArguments() {
const dialog = this.vmParent;
const object = this.vmParent;
if (!dialog && !object) {
this.loggerService.throw('FieldComponent:populateArguments Expect dialog or object');
}
let parmsOrProps;
if (this.isDomainObjectViewModel(object)) {
parmsOrProps = object.properties;
}
else {
parmsOrProps = dialog.parameters;
}
return this.mapValues(this.pArgs, parmsOrProps);
}
argsChanged(newArgs) {
const same = this.lastArgs &&
keys(this.lastArgs).length === keys(newArgs).length &&
every(this.lastArgs, (v, k) => newArgs[k].toValueString() === v.toValueString());
this.lastArgs = newArgs;
return !same;
}
populateDropdown() {
const nArgs = this.populateArguments();
if (this.argsChanged(nArgs)) {
const prompts = this.model.conditionalChoices;
if (prompts) {
prompts(nArgs).
then((cvms) => {
// if unchanged return
if (cvms.length === this.currentOptions.length && every(cvms, (c, i) => c.equals(this.currentOptions[i]))) {
return;
}
this.model.choices = cvms;
this.currentOptions = cvms;
if (this.isConditionalChoices) {
// need to reset control to find the selected options
if (this.model.entryType === Ro.EntryType.MultipleConditionalChoices) {
this.control.reset(this.model.selectedMultiChoices);
}
else {
this.control.reset(this.model.selectedChoice);
}
}
}).
catch(() => {
// error clear everything
this.model.selectedChoice = null;
this.currentOptions = [];
});
}
}
}
onChange() {
if (this.isConditionalChoices) {
this.populateDropdown();
}
else if (this.isAutoComplete) {
this.populateAutoComplete();
}
else if (this.isBoolean) {
this.populateBoolean();
}
}
onValueChanged() {
if (this.model) {
this.onChange();
}
}
populateAutoComplete() {
const input = this.control.value;
if (input instanceof ChoiceViewModel) {
return;
}
const prompt = this.model.prompt;
if (prompt && input && input.length > 0 && input.length >= (this.model.minLength ?? 0)) {
prompt(input)
.then((cvms) => {
if (cvms.length === this.currentOptions.length && every(cvms, (c, i) => c.equals(this.currentOptions[i]))) {
return;
}
this.model.choices = cvms;
this.currentOptions = cvms;
this.model.selectedChoice = null;
})
.catch(() => {
this.model.choices = [];
this.currentOptions = [];
this.model.selectedChoice = null;
});
}
else {
this.model.choices = [];
this.currentOptions = [];
this.model.selectedChoice = null;
}
}
populateBoolean() {
// editable booleans only
if (this.isBoolean && this.control) {
const input = this.control.value;
const element = this.checkboxList?.first.nativeElement;
if (input == null) {
this.renderer.setProperty(element, 'indeterminate', true);
this.renderer.setProperty(element, 'checked', null);
}
else {
this.renderer.setProperty(element, 'indeterminate', false);
this.renderer.setProperty(element, 'checked', !!input);
}
}
}
select(item) {
this.model.choices = [];
this.model.selectedChoice = item;
this.control.reset(item);
}
fileUpload(evt) {
const file = evt.target.files[0];
const fileReader = new FileReader();
fileReader.onloadend = () => {
const link = new Ro.Link({
href: fileReader.result,
type: file.type,
title: file.name
});
this.control.reset(link);
this.model.file = link;
};
fileReader.readAsDataURL(file);
}
paste(event) {
paste(event, this.model, this, () => this.dragAndDrop.getCopyViewModel(), () => this.dragAndDrop.setCopyViewModel(null));
}
clear() {
if (this.model.isEditable) {
this.control.reset('');
this.model.clear();
}
}
filterEnter(event) {
const enterKeyCode = 13;
if (event && event.keyCode === enterKeyCode) {
event.preventDefault();
}
}
handleKeyEvents(event, isMultiline) {
this.paste(event);
// catch and filter enters or they will submit form - ok for multiline
if (!isMultiline) {
this.filterEnter(event);
}
}
triStateClick = (currentValue) => {
switch (currentValue) {
case false:
return true;
case true:
return null;
default: // null
return false;
}
};
handleClick(event) {
if (this.isBoolean && this.model.optional) {
const currentValue = this.control.value;
setTimeout(() => this.control.setValue(this.triStateClick(currentValue)));
event.preventDefault();
}
}
focus() {
const first = this.focusList && this.focusList.first;
if (first instanceof ElementRef) {
return focus(first);
}
return first && first.focus();
}
ngOnDestroy() {
safeUnsubscribe(this.sub);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FieldComponent, deps: [{ token: i1.LoggerService }, { token: i0.Renderer2 }, { token: i2.DragAndDropService }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: FieldComponent, selector: "ng-component", ngImport: i0, template: '<div></div>', isInline: true });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FieldComponent, decorators: [{
type: Component,
args: [{ template: '<div></div>' }]
}], ctorParameters: () => [{ type: i1.LoggerService }, { type: i0.Renderer2 }, { type: i2.DragAndDropService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZ2VtaW5pL3NyYy9maWVsZC9maWVsZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQW1DLE1BQU0sZUFBZSxDQUFDO0FBRXZGLE9BQU8sS0FBSyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFcEQsT0FBTyxFQUNILGVBQWUsRUFRbEIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUNwQyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFxQyxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUt0RixNQUFNLE9BQWdCLGNBQWM7SUFHWDtJQUNBO0lBQ0U7SUFIdkIsWUFDcUIsYUFBNEIsRUFDNUIsUUFBbUIsRUFDakIsV0FBK0I7UUFGakMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBb0I7SUFDbEQsQ0FBQztJQUVMLElBQUksU0FBUyxDQUFDLEVBQWE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxH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QUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ3hDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUVyRCxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsQ0FBQztZQUM5QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1AsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO3VHQW5VaUIsY0FBYzsyRkFBZCxjQUFjLG9EQURiLGFBQWE7OzJGQUNkLGNBQWM7a0JBRG5DLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCAqIGFzIFJvIGZyb20gJ0BuYWtlZG9iamVjdHMvcmVzdGZ1bC1vYmplY3RzJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UsIFBhbmUgfSBmcm9tICdAbmFrZWRvYmplY3RzL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gICAgQ2hvaWNlVmlld01vZGVsLFxuICAgIERpYWxvZ1ZpZXdNb2RlbCxcbiAgICBEb21haW5PYmplY3RWaWV3TW9kZWwsXG4gICAgRHJhZ0FuZERyb3BTZXJ2aWNlLFxuICAgIElEcmFnZ2FibGVWaWV3TW9kZWwsXG4gICAgTWVudVZpZXdNb2RlbCxcbiAgICBQYXJhbWV0ZXJWaWV3TW9kZWwsXG4gICAgUHJvcGVydHlWaWV3TW9kZWxcbn0gZnJvbSAnQG5ha2Vkb2JqZWN0cy92aWV3LW1vZGVscyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBldmVyeSBmcm9tICdsb2Rhc2gtZXMvZXZlcnknO1xuaW1wb3J0IGZpbmQgZnJvbSAnbG9kYXNoLWVzL2ZpbmQnO1xuaW1wb3J0IGtleXMgZnJvbSAnbG9kYXNoLWVzL2tleXMnO1xuaW1wb3J0IG1hcFZhbHVlcyBmcm9tICdsb2Rhc2gtZXMvbWFwVmFsdWVzJztcbmltcG9ydCBvbWl0IGZyb20gJ2xvZGFzaC1lcy9vbWl0JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uTGlrZSBhcyBJU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi9hdXRvLWNvbXBsZXRlL2F1dG8tY29tcGxldGUuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJGYWNhZGVDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlLXBpY2tlci1mYWNhZGUvZGF0ZS1waWNrZXItZmFjYWRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhY2NlcHQsIGRyb3BPbiwgZm9jdXMsIHBhc3RlLCBzYWZlVW5zdWJzY3JpYmUgfSBmcm9tICcuLi9oZWxwZXJzLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVGltZVBpY2tlckZhY2FkZUNvbXBvbmVudCB9IGZyb20gJy4uL3RpbWUtcGlja2VyLWZhY2FkZS90aW1lLXBpY2tlci1mYWNhZGUuY29tcG9uZW50JztcbmltcG9ydCB7IENka0RyYWcsIENka0Ryb3BMaXN0LCBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5AQ29tcG9uZW50KHsgdGVtcGxhdGU6ICc8ZGl2PjwvZGl2PicgfSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZTogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZHJhZ0FuZERyb3A6IERyYWdBbmREcm9wU2VydmljZVxuICAgICkgeyB9XG5cbiAgICBzZXQgZm9ybUdyb3VwKGZtOiBGb3JtR3JvdXApIHtcbiAgICAgICAgdGhpcy5mb3JtR3JwID0gZm07XG4gICAgICAgIHRoaXMuZm9ybUdycC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKF8gPT4gdGhpcy5vblZhbHVlQ2hhbmdlZCgpKTtcbiAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlZCgpOyAvLyAocmUpc2V0IHZhbGlkYXRpb24gbWVzc2FnZXMgbm93XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1Hcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybUdycDtcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0TWVzc2FnZSgpO1xuICAgIH1cblxuICAgIGdldCBpc0Jvb2xlYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLnJldHVyblR5cGUgPT09ICdib29sZWFuJztcbiAgICB9XG5cbiAgICBnZXQgc3ViamVjdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJTdWJqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLnN1YiA9IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5iU3ViamVjdCEubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYlN1YmplY3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JtR3JwITogRm9ybUdyb3VwO1xuICAgIHByaXZhdGUgdm1QYXJlbnQ/OiBEaWFsb2dWaWV3TW9kZWwgfCBEb21haW5PYmplY3RWaWV3TW9kZWwgfCBNZW51Vmlld01vZGVsO1xuICAgIHByaXZhdGUgbW9kZWwhOiBQYXJhbWV0ZXJWaWV3TW9kZWwgfCBQcm9wZXJ0eVZpZXdNb2RlbDtcbiAgICBwcml2YXRlIGlzQ29uZGl0aW9uYWxDaG9pY2VzPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGlzQXV0b0NvbXBsZXRlPzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGJTdWJqZWN0PzogQmVoYXZpb3JTdWJqZWN0PHVua25vd24+O1xuICAgIHByaXZhdGUgc3ViPzogSVN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGxhc3RBcmdzPzogRGljdGlvbmFyeTxSby5WYWx1ZT47XG5cbiAgICBjb250cm9sITogQWJzdHJhY3RDb250cm9sO1xuICAgIGN1cnJlbnRPcHRpb25zOiBDaG9pY2VWaWV3TW9kZWxbXSA9IFtdO1xuICAgIHBBcmdzPzogRGljdGlvbmFyeTxSby5WYWx1ZT47XG4gICAgcGFuZUlkPzogUGFuZTtcbiAgICBjYW5Ecm9wID0gZmFsc2U7XG4gICAgZHJhZ092ZXIgPSBmYWxzZTtcblxuICAgIGFic3RyYWN0IGNoZWNrYm94TGlzdD86IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBhYnN0cmFjdCBmb2N1c0xpc3Q/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZiB8IERhdGVQaWNrZXJGYWNhZGVDb21wb25lbnQgfCBUaW1lUGlja2VyRmFjYWRlQ29tcG9uZW50IHwgQXV0b0NvbXBsZXRlQ29tcG9uZW50PjtcblxuICAgIHByb3RlY3RlZCBpbml0KFxuICAgICAgICB2bVBhcmVudDogRGlhbG9nVmlld01vZGVsIHwgRG9tYWluT2JqZWN0Vmlld01vZGVsIHwgTWVudVZpZXdNb2RlbCB8IHVuZGVmaW5lZCxcbiAgICAgICAgdm06IFBhcmFtZXRlclZpZXdNb2RlbCB8IFByb3BlcnR5Vmlld01vZGVsLFxuICAgICAgICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcblxuICAgICAgICB0aGlzLnZtUGFyZW50ID0gdm1QYXJlbnQ7XG4gICAgICAgIHRoaXMubW9kZWwgPSB2bTtcbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcblxuICAgICAgICB0aGlzLnBhbmVJZCA9IHRoaXMubW9kZWwub25QYW5lSWQ7XG5cbiAgICAgICAgdGhpcy5pc0NvbmRpdGlvbmFsQ2hvaWNlcyA9ICh0aGlzLm1vZGVsLmVudHJ5VHlwZSA9PT0gUm8uRW50cnlUeXBlLkNvbmRpdGlvbmFsQ2hvaWNlcyB8fFxuICAgICAgICAgICAgdGhpcy5tb2RlbC5lbnRyeVR5cGUgPT09IFJvLkVudHJ5VHlwZS5NdWx0aXBsZUNvbmRpdGlvbmFsQ2hvaWNlcyk7XG5cbiAgICAgICAgdGhpcy5pc0F1dG9Db21wbGV0ZSA9IHRoaXMubW9kZWwuZW50cnlUeXBlID09PSBSby5FbnRyeVR5cGUuQXV0b0NvbXBsZXRlO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQ29uZGl0aW9uYWxDaG9pY2VzKSB7XG4gICAgICAgICAgICB0aGlzLnBBcmdzID0gb21pdCh0aGlzLm1vZGVsLnByb21wdEFyZ3VtZW50cywgJ3gtcm8tbm9mLW1lbWJlcnMnKSBhcyBEaWN0aW9uYXJ5PFJvLlZhbHVlPjtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFjY2VwdCgpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChjZGtEcmFnOiBDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+LCBfY2RrRHJvcExpc3Q6IENka0Ryb3BMaXN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWNjZXB0KF90aGlzLm1vZGVsLCBfdGhpcywgY2RrRHJhZy5kYXRhKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+Pikge1xuICAgICAgICBjb25zdCBjZGtEcmFnOiBDZGtEcmFnPElEcmFnZ2FibGVWaWV3TW9kZWw+ID0gZXZlbnQuaXRlbTtcbiAgICAgICAgaWYgKGV2ZW50LmlzUG9pbnRlck92ZXJDb250YWluZXIpIHtcbiAgICAgICAgICAgIGRyb3BPbihjZGtEcmFnLmRhdGEsIHRoaXMubW9kZWwsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FuRHJvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRyYWdPdmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgZXhpdCgpIHtcbiAgICAgICAgdGhpcy5jYW5Ecm9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZHJhZ092ZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBlbnRlcigpIHtcbiAgICAgICAgdGhpcy5kcmFnT3ZlciA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RvbWFpbk9iamVjdFZpZXdNb2RlbChvYmplY3Q6IHVua25vd24pOiBvYmplY3QgaXMgRG9tYWluT2JqZWN0Vmlld01vZGVsIHtcbiAgICAgICAgcmV0dXJuICEhKG9iamVjdCAmJiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgJiYgJ3Byb3BlcnRpZXMnIGluIG9iamVjdCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBWYWx1ZXMoYXJnczogRGljdGlvbmFyeTxSby5WYWx1ZT4gfCB1bmRlZmluZWQsIHBhcm1zT3JQcm9wczogeyBhcmdJZDogc3RyaW5nLCBnZXRWYWx1ZTogKCkgPT4gUm8uVmFsdWUgfVtdKSB7XG4gICAgICAgIHJldHVybiBtYXBWYWx1ZXMoYXJncyxcbiAgICAgICAgICAgICh2LCBuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9wID0gZmluZChwYXJtc09yUHJvcHMsIHAgPT4gcC5hcmdJZCA9PT0gbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcCEuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhdGVBcmd1bWVudHMoKSB7XG5cbiAgICAgICAgY29uc3QgZGlhbG9nID0gdGhpcy52bVBhcmVudCBhcyBEaWFsb2dWaWV3TW9kZWw7XG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMudm1QYXJlbnQgYXMgRG9tYWluT2JqZWN0Vmlld01vZGVsO1xuXG4gICAgICAgIGlmICghZGlhbG9nICYmICFvYmplY3QpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS50aHJvdygnRmllbGRDb21wb25lbnQ6cG9wdWxhdGVBcmd1bWVudHMgRXhwZWN0IGRpYWxvZyBvciBvYmplY3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJtc09yUHJvcHM6IHsgYXJnSWQ6IHN0cmluZywgZ2V0VmFsdWU6ICgpID0+IFJvLlZhbHVlIH1bXTtcblxuICAgICAgICBpZiAodGhpcy5pc0RvbWFpbk9iamVjdFZpZXdNb2RlbChvYmplY3QpKSB7XG4gICAgICAgICAgICBwYXJtc09yUHJvcHMgPSBvYmplY3QucHJvcGVydGllcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhcm1zT3JQcm9wcyA9IGRpYWxvZy5wYXJhbWV0ZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWFwVmFsdWVzKHRoaXMucEFyZ3MsIHBhcm1zT3JQcm9wcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcmdzQ2hhbmdlZChuZXdBcmdzOiBEaWN0aW9uYXJ5PFJvLlZhbHVlPikge1xuICAgICAgICBjb25zdCBzYW1lID0gdGhpcy5sYXN0QXJncyAmJlxuICAgICAgICAgICAga2V5cyh0aGlzLmxhc3RBcmdzKS5sZW5ndGggPT09IGtleXMobmV3QXJncykubGVuZ3RoICYmXG4gICAgICAgICAgICBldmVyeSh0aGlzLmxhc3RBcmdzLCAodiwgaykgPT4gbmV3QXJnc1trXS50b1ZhbHVlU3RyaW5nKCkgPT09IHYudG9WYWx1ZVN0cmluZygpKTtcblxuICAgICAgICB0aGlzLmxhc3RBcmdzID0gbmV3QXJncztcbiAgICAgICAgcmV0dXJuICFzYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgcG9wdWxhdGVEcm9wZG93bigpIHtcbiAgICAgICAgY29uc3QgbkFyZ3MgPSB0aGlzLnBvcHVsYXRlQXJndW1lbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLmFyZ3NDaGFuZ2VkKG5BcmdzKSkge1xuICAgICAgICAgICAgY29uc3QgcHJvbXB0cyA9IHRoaXMubW9kZWwuY29uZGl0aW9uYWxDaG9pY2VzO1xuICAgICAgICAgICAgaWYgKHByb21wdHMpIHtcbiAgICAgICAgICAgICAgICBwcm9tcHRzKG5BcmdzKS5cbiAgICAgICAgICAgICAgICAgICAgdGhlbigoY3ZtczogQ2hvaWNlVmlld01vZGVsW10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHVuY2hhbmdlZCByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdm1zLmxlbmd0aCA9PT0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGggJiYgZXZlcnkoY3ZtcywgKGMsIGkpID0+IGMuZXF1YWxzKHRoaXMuY3VycmVudE9wdGlvbnNbaV0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IGN2bXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gY3ZtcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25kaXRpb25hbENob2ljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHJlc2V0IGNvbnRyb2wgdG8gZmluZCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGVsLmVudHJ5VHlwZSA9PT0gUm8uRW50cnlUeXBlLk11bHRpcGxlQ29uZGl0aW9uYWxDaG9pY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZXNldCh0aGlzLm1vZGVsLnNlbGVjdGVkTXVsdGlDaG9pY2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQodGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KS5cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgY2xlYXIgZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZWxlY3RlZENob2ljZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25kaXRpb25hbENob2ljZXMpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVEcm9wZG93bigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBdXRvQ29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMucG9wdWxhdGVBdXRvQ29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQm9vbGVhbikge1xuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZUJvb2xlYW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHBvcHVsYXRlQXV0b0NvbXBsZXRlKCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udHJvbC52YWx1ZTtcblxuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDaG9pY2VWaWV3TW9kZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb21wdCA9IHRoaXMubW9kZWwucHJvbXB0O1xuXG4gICAgICAgIGlmIChwcm9tcHQgJiYgaW5wdXQgJiYgaW5wdXQubGVuZ3RoID4gMCAmJiBpbnB1dC5sZW5ndGggPj0gKHRoaXMubW9kZWwubWluTGVuZ3RoID8/IDApKSB7XG4gICAgICAgICAgICBwcm9tcHQoaW5wdXQpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGN2bXM6IENob2ljZVZpZXdNb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdm1zLmxlbmd0aCA9PT0gdGhpcy5jdXJyZW50T3B0aW9ucy5sZW5ndGggJiYgZXZlcnkoY3ZtcywgKGMsIGkpID0+IGMuZXF1YWxzKHRoaXMuY3VycmVudE9wdGlvbnNbaV0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IGN2bXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9wdGlvbnMgPSBjdm1zO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkQ2hvaWNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hvaWNlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRDaG9pY2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5jaG9pY2VzID0gW107XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb25zID0gW107XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNlbGVjdGVkQ2hvaWNlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3B1bGF0ZUJvb2xlYW4oKSB7XG5cbiAgICAgICAgLy8gZWRpdGFibGUgYm9vbGVhbnMgb25seVxuICAgICAgICBpZiAodGhpcy5pc0Jvb2xlYW4gJiYgdGhpcy5jb250cm9sKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dCA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNoZWNrYm94TGlzdD8uZmlyc3QubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtZW50LCAnaW5kZXRlcm1pbmF0ZScsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkoZWxlbWVudCwgJ2NoZWNrZWQnLCBudWxsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShlbGVtZW50LCAnaW5kZXRlcm1pbmF0ZScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnQsICdjaGVja2VkJywgISFpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdChpdGVtOiBDaG9pY2VWaWV3TW9kZWwpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5jaG9pY2VzID0gW107XG4gICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRDaG9pY2UgPSBpdGVtO1xuICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQoaXRlbSk7XG4gICAgfVxuXG4gICAgZmlsZVVwbG9hZChldnQ6IEV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgZmlsZTogRmlsZSA9IChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpIS5maWxlcyFbMF07XG4gICAgICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBuZXcgUm8uTGluayh7XG4gICAgICAgICAgICAgICAgaHJlZjogZmlsZVJlYWRlci5yZXN1bHQgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogZmlsZS5uYW1lXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb250cm9sLnJlc2V0KGxpbmspO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5maWxlID0gbGluaztcbiAgICAgICAgfTtcblxuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgfVxuXG4gICAgcGFzdGUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgcGFzdGUoZXZlbnQsIHRoaXMubW9kZWwsIHRoaXMsICgpID0+IHRoaXMuZHJhZ0FuZERyb3AuZ2V0Q29weVZpZXdNb2RlbCgpLCAoKSA9PiB0aGlzLmRyYWdBbmREcm9wLnNldENvcHlWaWV3TW9kZWwobnVsbCkpO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5pc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wucmVzZXQoJycpO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaWx0ZXJFbnRlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBjb25zdCBlbnRlcktleUNvZGUgPSAxMztcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgPT09IGVudGVyS2V5Q29kZSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVLZXlFdmVudHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGlzTXVsdGlsaW5lOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMucGFzdGUoZXZlbnQpO1xuICAgICAgICAvLyBjYXRjaCBhbmQgZmlsdGVyIGVudGVycyBvciB0aGV5IHdpbGwgc3VibWl0IGZvcm0gLSBvayBmb3IgbXVsdGlsaW5lXG4gICAgICAgIGlmICghaXNNdWx0aWxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyRW50ZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlTdGF0ZUNsaWNrID0gKGN1cnJlbnRWYWx1ZTogdW5rbm93bikgPT4ge1xuXG4gICAgICAgIHN3aXRjaCAoY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIGZhbHNlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSB0cnVlOlxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZGVmYXVsdDogLy8gbnVsbFxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzQm9vbGVhbiAmJiB0aGlzLm1vZGVsLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuY29udHJvbC5zZXRWYWx1ZSh0aGlzLnRyaVN0YXRlQ2xpY2soY3VycmVudFZhbHVlKSkpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzKCkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuZm9jdXNMaXN0ICYmIHRoaXMuZm9jdXNMaXN0LmZpcnN0O1xuXG4gICAgICAgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiBmb2N1cyhmaXJzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHNhZmVVbnN1YnNjcmliZSh0aGlzLnN1Yik7XG4gICAgfVxufVxuIl19