angular-duo-pane
Version:
A library for Angular projects to easily add a two pane view for desktops, foldables and dual screen devices.
247 lines • 31.1 kB
JavaScript
import { __decorate } from "tslib";
import { ComponentFactoryResolver, ComponentRef, Directive, EventEmitter, Input, Output, TemplateRef, ViewContainerRef } from '@angular/core';
import { DuoPaneComponent } from '../components/duo-pane/duo-pane.component';
import { DuoPaneInformationService } from '../services/duo-pane-information.service';
import { Segment } from '../models/Segment';
var DuoPaneDirective = /** @class */ (function () {
function DuoPaneDirective(componentfactoryResolver, templateRef, viewContainer, dualScreenInformationService) {
var _this = this;
this.componentfactoryResolver = componentfactoryResolver;
this.templateRef = templateRef;
this.viewContainer = viewContainer;
this.dualScreenInformationService = dualScreenInformationService;
this.secondaryPaneTemplateRef = null;
this.EnsureSecondaryPaneVisible = false;
/* Variables set to control two pane if only one window segment is available-*/
this.TwoPaneMinWidthSingleSegment = 0;
this.TwoPaneMinHeightSingleSegment = 0;
this.TwoPaneSpanningModeSingleSegment = 'none';
this.PrimaryPanePercentageSingleSegment = 50;
this.paneFactory = this.componentfactoryResolver.resolveComponentFactory(DuoPaneComponent);
this.primaryPaneRef = null;
this.secondaryPaneRef = null;
this.secondaryPaneVisibilityHandler = new EventEmitter();
this.secondaryPaneVisible = undefined;
dualScreenInformationService.addEventListener('change', function () {
_this.updateView();
});
this.updateView();
}
Object.defineProperty(DuoPaneDirective.prototype, "primaryPanePercentageSingleSegment", {
get: function () {
return this.PrimaryPanePercentageSingleSegment;
},
set: function (value) {
if (typeof value === 'string') {
var fractionValue = Number(value);
if (!isNaN(fractionValue) && fractionValue >= 0 && fractionValue <= 100) {
this.PrimaryPanePercentageSingleSegment = fractionValue;
this.updateView();
}
}
else if (typeof value === 'number') {
if (value >= 0 && value <= 100) {
this.PrimaryPanePercentageSingleSegment = value;
this.updateView();
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneDirective.prototype, "secondaryPane", {
set: function (secondaryPane) {
this.secondaryPaneTemplateRef = secondaryPane;
this.destroySecondaryPaneRef();
this.updateView();
},
enumerable: true,
configurable: true
});
DuoPaneDirective.prototype.destroySecondaryPaneRef = function () {
if (this.secondaryPaneRef) {
var secondaryPaneIndex = this.viewContainer.indexOf(this.secondaryPaneRef.hostView);
if (secondaryPaneIndex >= 0) {
this.viewContainer.remove(secondaryPaneIndex);
}
this.secondaryPaneRef.destroy();
this.secondaryPaneRef = null;
}
};
DuoPaneDirective.prototype.destroyPrimaryPaneRef = function () {
if (this.primaryPaneRef) {
var primaryPaneIndex = this.viewContainer.indexOf(this.primaryPaneRef.hostView);
if (primaryPaneIndex >= 0) {
this.viewContainer.remove(primaryPaneIndex);
}
this.primaryPaneRef.destroy();
this.primaryPaneRef = null;
}
};
Object.defineProperty(DuoPaneDirective.prototype, "ensureSecondaryPaneVisible", {
set: function (value) {
this.EnsureSecondaryPaneVisible = value;
this.updateView();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneDirective.prototype, "twoPaneMinWidthSingleSegment", {
set: function (minWidth) {
if (typeof minWidth === 'string') {
var minWidthValue = Number(minWidth);
if (minWidthValue >= 0 && !isNaN(minWidthValue)) {
this.TwoPaneMinWidthSingleSegment = minWidthValue;
this.updateView();
}
}
else if (typeof minWidth === 'number' && minWidth >= 0) {
this.TwoPaneMinWidthSingleSegment = minWidth;
this.updateView();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneDirective.prototype, "twoPaneMinHeightSingleSegment", {
set: function (minHeight) {
if (typeof minHeight === 'string') {
var minHeightValue = Number(minHeight);
if (minHeightValue >= 0 && !isNaN(minHeightValue)) {
this.TwoPaneMinHeightSingleSegment = minHeightValue;
this.updateView();
}
}
else if (typeof minHeight === 'number' && minHeight >= 0) {
this.TwoPaneMinHeightSingleSegment = minHeight;
this.updateView();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DuoPaneDirective.prototype, "twoPaneSpanningModeSingleSegment", {
set: function (spanningMode) {
if (spanningMode) {
this.TwoPaneSpanningModeSingleSegment = spanningMode;
this.updateView();
}
},
enumerable: true,
configurable: true
});
DuoPaneDirective.prototype.emitSecondaryPaneVisibility = function (visible) {
if (this.secondaryPaneVisible === undefined || this.secondaryPaneVisible === null || visible !== this.secondaryPaneVisible) {
this.secondaryPaneVisible = visible;
this.secondaryPaneVisibilityHandler.emit(visible);
}
};
DuoPaneDirective.prototype.updateView = function () {
/*this.viewContainer.createEmbeddedView(this.templateRef);
if(this.secondaryPaneTemplateRef != null) {
this.viewContainer.createEmbeddedView(this.secondaryPaneTemplateRef);
}*/
var windowSegements = this.dualScreenInformationService.windowSegments;
if (windowSegements.length > 0) {
if (windowSegements.length > 1) {
this.renderDualPanes(this.dualScreenInformationService.getTwoLargestSegments());
}
else if (windowSegements[0].height >= this.TwoPaneMinHeightSingleSegment
&& windowSegements[0].width >= this.TwoPaneMinWidthSingleSegment
&& this.TwoPaneSpanningModeSingleSegment !== 'none') {
this.renderBothPanes(windowSegements[0]);
}
else {
if (this.EnsureSecondaryPaneVisible) {
this.destroyPrimaryPaneRef();
this.renderSecondaryPane(windowSegements[0]);
}
else {
this.destroySecondaryPaneRef();
this.renderPrimaryPane(windowSegements[0]);
this.emitSecondaryPaneVisibility(false);
}
}
}
};
DuoPaneDirective.prototype.renderBothPanes = function (windowSegment) {
var primarySegment;
var secondarySegment;
if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-horizontal') {
var fraction = this.PrimaryPanePercentageSingleSegment / 100;
primarySegment = new Segment(windowSegment.width, windowSegment.height * fraction, 0, 0);
secondarySegment = new Segment(windowSegment.width, windowSegment.height * (1 - fraction), windowSegment.height * fraction, 0);
}
else if (this.TwoPaneSpanningModeSingleSegment === 'single-fold-vertical') {
var fraction = this.PrimaryPanePercentageSingleSegment / 100;
primarySegment = new Segment(windowSegment.width * fraction, windowSegment.height, 0, 0);
secondarySegment = new Segment(windowSegment.width * (1 - fraction), windowSegment.height, 0, windowSegment.width * fraction);
}
else {
return;
}
this.renderDualPanes([primarySegment, secondarySegment]);
};
DuoPaneDirective.prototype.renderDualPanes = function (windowSegments) {
if (windowSegments.length > 0) {
this.renderPrimaryPane(windowSegments[0]);
}
if (windowSegments.length > 1) {
this.renderSecondaryPane(windowSegments[1]);
}
};
DuoPaneDirective.prototype.renderPrimaryPane = function (segment) {
// const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent);
if (!this.primaryPaneRef) {
this.primaryPaneRef = this.viewContainer.createComponent(this.paneFactory);
}
this.primaryPaneRef.instance.segment = segment;
this.primaryPaneRef.instance.contentTemplateRef = this.templateRef;
};
DuoPaneDirective.prototype.renderSecondaryPane = function (segment) {
if (this.secondaryPaneTemplateRef !== null && this.secondaryPaneTemplateRef !== undefined) {
// const paneFactory = this.componentfactoryResolver.resolveComponentFactory(PrimaryPaneComponent);
if (!this.secondaryPaneRef) {
this.secondaryPaneRef = this.viewContainer.createComponent(this.paneFactory);
}
this.secondaryPaneRef.instance.segment = segment;
this.secondaryPaneRef.instance.contentTemplateRef = this.secondaryPaneTemplateRef;
this.emitSecondaryPaneVisibility(true);
}
};
DuoPaneDirective.ctorParameters = function () { return [
{ type: ComponentFactoryResolver },
{ type: TemplateRef },
{ type: ViewContainerRef },
{ type: DuoPaneInformationService }
]; };
__decorate([
Input()
], DuoPaneDirective.prototype, "primaryPanePercentageSingleSegment", null);
__decorate([
Output()
], DuoPaneDirective.prototype, "secondaryPaneVisibilityHandler", void 0);
__decorate([
Input()
], DuoPaneDirective.prototype, "secondaryPane", null);
__decorate([
Input()
], DuoPaneDirective.prototype, "ensureSecondaryPaneVisible", null);
__decorate([
Input()
], DuoPaneDirective.prototype, "twoPaneMinWidthSingleSegment", null);
__decorate([
Input()
], DuoPaneDirective.prototype, "twoPaneMinHeightSingleSegment", null);
__decorate([
Input()
], DuoPaneDirective.prototype, "twoPaneSpanningModeSingleSegment", null);
DuoPaneDirective = __decorate([
Directive({
selector: '[duoPane]'
})
], DuoPaneDirective);
return DuoPaneDirective;
}());
export { DuoPaneDirective };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVvLXBhbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1kdW8tcGFuZS8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmVzL2R1by1wYW5lLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBR3JGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUs1QztJQW1DRSwwQkFDVSx3QkFBa0QsRUFDbEQsV0FBNkIsRUFDN0IsYUFBK0IsRUFDL0IsNEJBQXVEO1FBSmpFLGlCQVdDO1FBVlMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQWtCO1FBQy9CLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBMkI7UUFyQ3pELDZCQUF3QixHQUFxQixJQUFJLENBQUM7UUFDbEQsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRTNDLCtFQUErRTtRQUN2RSxpQ0FBNEIsR0FBRyxDQUFDLENBQUM7UUFDakMsa0NBQTZCLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLHFDQUFnQyxHQUFHLE1BQU0sQ0FBQztRQUMxQyx1Q0FBa0MsR0FBRyxFQUFFLENBQUM7UUFxQi9CLGdCQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDL0YsbUJBQWMsR0FBbUMsSUFBSSxDQUFDO1FBQ3RELHFCQUFnQixHQUFtQyxJQUFJ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QkFBZ0IsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ2xGLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7O2dCQXRMbUMsd0JBQXdCO2dCQUNyQyxXQUFXO2dCQUNULGdCQUFnQjtnQkFDRCx5QkFBeUI7O0lBMUJ4RDtRQUFSLEtBQUssRUFBRTs4RUFnQlA7SUFtQlM7UUFBVCxNQUFNLEVBQUU7NEVBQXFFO0lBUXJFO1FBQVIsS0FBSyxFQUFFO3lEQUlQO0lBd0JRO1FBQVIsS0FBSyxFQUFFO3NFQUdQO0lBRVE7UUFBUixLQUFLLEVBQUU7d0VBYVA7SUFFUTtRQUFSLEtBQUssRUFBRTt5RUFZUDtJQUlRO1FBQVIsS0FBSyxFQUFFOzRFQUtQO0lBN0hVLGdCQUFnQjtRQUg1QixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsV0FBVztTQUN0QixDQUFDO09BQ1csZ0JBQWdCLENBOE41QjtJQUFELHVCQUFDO0NBQUEsQUE5TkQsSUE4TkM7U0E5TlksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHVvUGFuZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZHVvLXBhbmUvZHVvLXBhbmUuY29tcG9uZW50JztcbmltcG9ydCB7IER1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kdW8tcGFuZS1pbmZvcm1hdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IFNwYW5uaW5nTW9kZSB9IGZyb20gJy4uL21vZGVscy9TcGFubmluZ01vZGUnO1xuaW1wb3J0IHsgSVNlZ21lbnQgfSBmcm9tICcuLi9tb2RlbHMvSVNlZ21lbnQnO1xuaW1wb3J0IHsgU2VnbWVudCB9IGZyb20gJy4uL21vZGVscy9TZWdtZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2R1b1BhbmVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEdW9QYW5lRGlyZWN0aXZlIHtcblxuICBwcml2YXRlIHNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgRW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUgPSBmYWxzZTtcblxuICAvKiBWYXJpYWJsZXMgc2V0IHRvIGNvbnRyb2wgdHdvIHBhbmUgaWYgb25seSBvbmUgd2luZG93IHNlZ21lbnQgaXMgYXZhaWxhYmxlLSovXG4gIHByaXZhdGUgVHdvUGFuZU1pbldpZHRoU2luZ2xlU2VnbWVudCA9IDA7XG4gIHByaXZhdGUgVHdvUGFuZU1pbkhlaWdodFNpbmdsZVNlZ21lbnQgPSAwO1xuICBwcml2YXRlIFR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50ID0gJ25vbmUnO1xuICBwcml2YXRlIFByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgPSA1MDtcbiAgcHVibGljIGdldCBwcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50KCkge1xuICAgIHJldHVybiB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQ7XG4gIH1cbiAgQElucHV0KCkgcHVibGljIHNldCBwcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZnJhY3Rpb25WYWx1ZSA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKGZyYWN0aW9uVmFsdWUpICYmIGZyYWN0aW9uVmFsdWUgPj0gMCAmJiBmcmFjdGlvblZhbHVlIDw9IDEwMCkge1xuICAgICAgICB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgPSBmcmFjdGlvblZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSAxMDApIHtcbiAgICAgICAgdGhpcy5QcmltYXJ5UGFuZVBlcmNlbnRhZ2VTaW5nbGVTZWdtZW50ID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFuZUZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudGZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShEdW9QYW5lQ29tcG9uZW50KTtcbiAgcHJpdmF0ZSBwcmltYXJ5UGFuZVJlZjogQ29tcG9uZW50UmVmPER1b1BhbmVDb21wb25lbnQ+ID0gbnVsbDtcbiAgcHJpdmF0ZSBzZWNvbmRhcnlQYW5lUmVmOiBDb21wb25lbnRSZWY8RHVvUGFuZUNvbXBvbmVudD4gPSBudWxsO1xuXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb21wb25lbnRmYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2U6IER1b1BhbmVJbmZvcm1hdGlvblNlcnZpY2UpIHtcbiAgICBkdWFsU2NyZWVuSW5mb3JtYXRpb25TZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XG5cbiAgfVxuXG4gIEBPdXRwdXQoKSBwdWJsaWMgc2Vjb25kYXJ5UGFuZVZpc2liaWxpdHlIYW5kbGVyID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG5cblxuICBwcml2YXRlIHNlY29uZGFyeVBhbmVWaXNpYmxlOiBib29sZWFuID0gdW5kZWZpbmVkO1xuXG5cblxuICBASW5wdXQoKSBzZXQgc2Vjb25kYXJ5UGFuZShzZWNvbmRhcnlQYW5lOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgdGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgPSBzZWNvbmRhcnlQYW5lO1xuICAgIHRoaXMuZGVzdHJveVNlY29uZGFyeVBhbmVSZWYoKTtcbiAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVNlY29uZGFyeVBhbmVSZWYoKSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5UGFuZVJlZikge1xuICAgICAgY29uc3Qgc2Vjb25kYXJ5UGFuZUluZGV4ID0gdGhpcy52aWV3Q29udGFpbmVyLmluZGV4T2YodGhpcy5zZWNvbmRhcnlQYW5lUmVmLmhvc3RWaWV3KTtcbiAgICAgIGlmIChzZWNvbmRhcnlQYW5lSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVtb3ZlKHNlY29uZGFyeVBhbmVJbmRleCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVSZWYuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lQcmltYXJ5UGFuZVJlZigpIHtcbiAgICBpZiAodGhpcy5wcmltYXJ5UGFuZVJlZikge1xuICAgICAgY29uc3QgcHJpbWFyeVBhbmVJbmRleCA9IHRoaXMudmlld0NvbnRhaW5lci5pbmRleE9mKHRoaXMucHJpbWFyeVBhbmVSZWYuaG9zdFZpZXcpO1xuICAgICAgaWYgKHByaW1hcnlQYW5lSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIucmVtb3ZlKHByaW1hcnlQYW5lSW5kZXgpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcmltYXJ5UGFuZVJlZi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnByaW1hcnlQYW5lUmVmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLkVuc3VyZVNlY29uZGFyeVBhbmVWaXNpYmxlID0gdmFsdWU7XG4gICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdHdvUGFuZU1pbldpZHRoU2luZ2xlU2VnbWVudChtaW5XaWR0aDogbnVtYmVyKSB7XG4gICAgaWYgKHR5cGVvZiBtaW5XaWR0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IG1pbldpZHRoVmFsdWUgPSBOdW1iZXIobWluV2lkdGgpO1xuICAgICAgaWYgKG1pbldpZHRoVmFsdWUgPj0gMCAmJiAhaXNOYU4obWluV2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50ID0gbWluV2lkdGhWYWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG5cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtaW5XaWR0aCA9PT0gJ251bWJlcicgJiYgbWluV2lkdGggPj0gMCkge1xuICAgICAgdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50ID0gbWluV2lkdGg7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG5cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0d29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudChtaW5IZWlnaHQ6IG51bWJlcikge1xuICAgIGlmICh0eXBlb2YgbWluSGVpZ2h0ID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgbWluSGVpZ2h0VmFsdWUgPSBOdW1iZXIobWluSGVpZ2h0KTtcbiAgICAgIGlmIChtaW5IZWlnaHRWYWx1ZSA+PSAwICYmICFpc05hTihtaW5IZWlnaHRWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5Ud29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudCA9IG1pbkhlaWdodFZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1pbkhlaWdodCA9PT0gJ251bWJlcicgJiYgbWluSGVpZ2h0ID49IDApIHtcbiAgICAgIHRoaXMuVHdvUGFuZU1pbkhlaWdodFNpbmdsZVNlZ21lbnQgPSBtaW5IZWlnaHQ7XG4gICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG4gIH1cblxuXG5cbiAgQElucHV0KCkgc2V0IHR3b1BhbmVTcGFubmluZ01vZGVTaW5nbGVTZWdtZW50KHNwYW5uaW5nTW9kZTogU3Bhbm5pbmdNb2RlKSB7XG4gICAgaWYgKHNwYW5uaW5nTW9kZSkge1xuICAgICAgdGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCA9IHNwYW5uaW5nTW9kZTtcbiAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW1pdFNlY29uZGFyeVBhbmVWaXNpYmlsaXR5KHZpc2libGU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuc2Vjb25kYXJ5UGFuZVZpc2libGUgPT09IG51bGwgfHwgdmlzaWJsZSAhPT0gdGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSkge1xuICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lVmlzaWJsZSA9IHZpc2libGU7XG4gICAgICB0aGlzLnNlY29uZGFyeVBhbmVWaXNpYmlsaXR5SGFuZGxlci5lbWl0KHZpc2libGUpO1xuICAgIH1cbiAgfVxuXG5cblxuICBwcml2YXRlIHVwZGF0ZVZpZXcoKSB7XG5cbiAgICAvKnRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XG4gICAgaWYodGhpcy5zZWNvbmRhcnlQYW5lVGVtcGxhdGVSZWYgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmKTtcbiAgICB9Ki9cbiAgICBjb25zdCB3aW5kb3dTZWdlbWVudHMgPSB0aGlzLmR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2Uud2luZG93U2VnbWVudHM7XG4gICAgaWYgKHdpbmRvd1NlZ2VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAod2luZG93U2VnZW1lbnRzLmxlbmd0aCA+IDEpIHtcblxuICAgICAgICB0aGlzLnJlbmRlckR1YWxQYW5lcyh0aGlzLmR1YWxTY3JlZW5JbmZvcm1hdGlvblNlcnZpY2UuZ2V0VHdvTGFyZ2VzdFNlZ21lbnRzKCkpO1xuXG4gICAgICB9IGVsc2UgaWYgKHdpbmRvd1NlZ2VtZW50c1swXS5oZWlnaHQgPj0gdGhpcy5Ud29QYW5lTWluSGVpZ2h0U2luZ2xlU2VnbWVudFxuICAgICAgICAmJiB3aW5kb3dTZWdlbWVudHNbMF0ud2lkdGggPj0gdGhpcy5Ud29QYW5lTWluV2lkdGhTaW5nbGVTZWdtZW50XG4gICAgICAgICYmIHRoaXMuVHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQgIT09ICdub25lJykge1xuICAgICAgICB0aGlzLnJlbmRlckJvdGhQYW5lcyh3aW5kb3dTZWdlbWVudHNbMF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuRW5zdXJlU2Vjb25kYXJ5UGFuZVZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmRlc3Ryb3lQcmltYXJ5UGFuZVJlZigpO1xuICAgICAgICAgIHRoaXMucmVuZGVyU2Vjb25kYXJ5UGFuZSh3aW5kb3dTZWdlbWVudHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgdGhpcy5kZXN0cm95U2Vjb25kYXJ5UGFuZVJlZigpO1xuICAgICAgICAgIHRoaXMucmVuZGVyUHJpbWFyeVBhbmUod2luZG93U2VnZW1lbnRzWzBdKTtcbiAgICAgICAgICB0aGlzLmVtaXRTZWNvbmRhcnlQYW5lVmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQm90aFBhbmVzKHdpbmRvd1NlZ21lbnQ6IElTZWdtZW50KSB7XG4gICAgbGV0IHByaW1hcnlTZWdtZW50OiBJU2VnbWVudDtcbiAgICBsZXQgc2Vjb25kYXJ5U2VnbWVudDogSVNlZ21lbnQ7XG4gICAgaWYgKHRoaXMuVHdvUGFuZVNwYW5uaW5nTW9kZVNpbmdsZVNlZ21lbnQgPT09ICdzaW5nbGUtZm9sZC1ob3Jpem9udGFsJykge1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgLyAxMDA7XG4gICAgICBwcmltYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGgsIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogZnJhY3Rpb24sIDAsIDApO1xuICAgICAgc2Vjb25kYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGgsIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogKDEgLSBmcmFjdGlvbiksIHdpbmRvd1NlZ21lbnQuaGVpZ2h0ICogZnJhY3Rpb24sIDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5Ud29QYW5lU3Bhbm5pbmdNb2RlU2luZ2xlU2VnbWVudCA9PT0gJ3NpbmdsZS1mb2xkLXZlcnRpY2FsJykge1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSB0aGlzLlByaW1hcnlQYW5lUGVyY2VudGFnZVNpbmdsZVNlZ21lbnQgLyAxMDA7XG4gICAgICBwcmltYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGggKiBmcmFjdGlvbiwgd2luZG93U2VnbWVudC5oZWlnaHQsIDAsIDApO1xuICAgICAgc2Vjb25kYXJ5U2VnbWVudCA9IG5ldyBTZWdtZW50KHdpbmRvd1NlZ21lbnQud2lkdGggKiAoMSAtIGZyYWN0aW9uKSwgd2luZG93U2VnbWVudC5oZWlnaHQsIDAsIHdpbmRvd1NlZ21lbnQud2lkdGggKiBmcmFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlckR1YWxQYW5lcyhbcHJpbWFyeVNlZ21lbnQsIHNlY29uZGFyeVNlZ21lbnRdKTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJEdWFsUGFuZXMod2luZG93U2VnbWVudHM6IElTZWdtZW50W10pIHtcbiAgICBpZiAod2luZG93U2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yZW5kZXJQcmltYXJ5UGFuZSh3aW5kb3dTZWdtZW50c1swXSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvd1NlZ21lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMucmVuZGVyU2Vjb25kYXJ5UGFuZSh3aW5kb3dTZWdtZW50c1sxXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJQcmltYXJ5UGFuZShzZWdtZW50OiBJU2VnbWVudCkge1xuICAgIC8vIGNvbnN0IHBhbmVGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUHJpbWFyeVBhbmVDb21wb25lbnQpO1xuICAgIGlmICghdGhpcy5wcmltYXJ5UGFuZVJlZikge1xuICAgICAgdGhpcy5wcmltYXJ5UGFuZVJlZiA9IHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodGhpcy5wYW5lRmFjdG9yeSk7XG5cbiAgICB9XG5cbiAgICB0aGlzLnByaW1hcnlQYW5lUmVmLmluc3RhbmNlLnNlZ21lbnQgPSBzZWdtZW50O1xuICAgIHRoaXMucHJpbWFyeVBhbmVSZWYuaW5zdGFuY2UuY29udGVudFRlbXBsYXRlUmVmID0gdGhpcy50ZW1wbGF0ZVJlZjtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJTZWNvbmRhcnlQYW5lKHNlZ21lbnQ6IElTZWdtZW50KSB7XG4gICAgaWYgKHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmICE9PSBudWxsICYmIHRoaXMuc2Vjb25kYXJ5UGFuZVRlbXBsYXRlUmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNvbnN0IHBhbmVGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRmYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUHJpbWFyeVBhbmVDb21wb25lbnQpO1xuICAgICAgaWYgKCF0aGlzLnNlY29uZGFyeVBhbmVSZWYpIHtcbiAgICAgICAgdGhpcy5zZWNvbmRhcnlQYW5lUmVmID0gdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudCh0aGlzLnBhbmVGYWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVJlZi5pbnN0YW5jZS5zZWdtZW50ID0gc2VnbWVudDtcbiAgICAgIHRoaXMuc2Vjb25kYXJ5UGFuZVJlZi5pbnN0YW5jZS5jb250ZW50VGVtcGxhdGVSZWYgPSB0aGlzLnNlY29uZGFyeVBhbmVUZW1wbGF0ZVJlZjtcbiAgICAgIHRoaXMuZW1pdFNlY29uZGFyeVBhbmVWaXNpYmlsaXR5KHRydWUpO1xuICAgIH1cbiAgfVxuXG5cblxufVxuIl19