@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
508 lines • 54.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewChild, NgZone, Input, Output, EventEmitter, ChangeDetectionStrategy, HostBinding, ViewEncapsulation } from '@angular/core';
import { Subscription, fromEvent } from 'rxjs';
import { debounceTime, filter, publish } from 'rxjs/operators';
import { utils } from './utils/utils';
import { GridsterService } from './gridster.service';
import { GridsterPrototypeService } from './gridster-prototype/gridster-prototype.service';
import { GridsterOptions } from './GridsterOptions';
var GridsterComponent = /** @class */ (function () {
function GridsterComponent(zone, elementRef, gridster, gridsterPrototype) {
this.zone = zone;
this.gridsterPrototype = gridsterPrototype;
this.optionsChange = new EventEmitter();
this.ready = new EventEmitter();
this.reflow = new EventEmitter();
this.prototypeDrop = new EventEmitter();
this.prototypeEnter = new EventEmitter();
this.prototypeOut = new EventEmitter();
this.draggableOptions = {};
this.isDragging = false;
this.isResizing = false;
this.isReady = false;
this.isPrototypeEntered = false;
this.isDisabled = false;
this.subscription = new Subscription();
this.gridster = gridster;
this.$element = elementRef.nativeElement;
}
/**
* @return {?}
*/
GridsterComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.gridsterOptions = new GridsterOptions(this.options, this.container);
if (this.options.useCSSTransforms) {
this.$element.classList.add('css-transform');
}
this.subscription.add(this.gridsterOptions.change.subscribe(function (options) {
_this.gridster.options = options;
if (_this.gridster.gridList) {
_this.gridster.gridList.options = options;
}
_this.optionsChange.emit(options);
}));
this.gridster.init(this);
this.subscription.add(fromEvent(window, 'resize')
.pipe(debounceTime(this.gridster.options.responsiveDebounce || 0), filter(function () { return _this.gridster.options.responsiveView; }))
.subscribe(function () { return _this.reload(); }));
this.zone.runOutsideAngular(function () {
_this.subscription.add(fromEvent(document, 'scroll', { passive: true }).subscribe(function () {
return _this.updateGridsterElementData();
}));
/** @type {?} */
var scrollableContainer = utils.getScrollableContainer(_this.$element);
if (scrollableContainer) {
_this.subscription.add(fromEvent(scrollableContainer, 'scroll', { passive: true })
.subscribe(function () {
return _this.updateGridsterElementData();
}));
}
});
};
/**
* @return {?}
*/
GridsterComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.gridster.start();
this.updateGridsterElementData();
this.connectGridsterPrototype();
this.gridster.$positionHighlight = this.$positionHighlight.nativeElement;
};
/**
* @return {?}
*/
GridsterComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.subscription.unsubscribe();
};
/**
* Change gridster config option and rebuild
* @param string name
* @param any value
* @return GridsterComponent
*/
/**
* Change gridster config option and rebuild
* @template THIS
* @this {THIS}
* @param {?} name
* @param {?} value
* @return {THIS}
*/
GridsterComponent.prototype.setOption = /**
* Change gridster config option and rebuild
* @template THIS
* @this {THIS}
* @param {?} name
* @param {?} value
* @return {THIS}
*/
function (name, value) {
if (name === 'dragAndDrop') {
if (value) {
(/** @type {?} */ (this)).enableDraggable();
}
else {
(/** @type {?} */ (this)).disableDraggable();
}
}
if (name === 'resizable') {
if (value) {
(/** @type {?} */ (this)).enableResizable();
}
else {
(/** @type {?} */ (this)).disableResizable();
}
}
if (name === 'lanes') {
(/** @type {?} */ (this)).gridster.options.lanes = value;
(/** @type {?} */ (this)).gridster.gridList.fixItemsPositions((/** @type {?} */ (this)).gridster.options);
(/** @type {?} */ (this)).reflowGridster();
}
if (name === 'direction') {
(/** @type {?} */ (this)).gridster.options.direction = value;
(/** @type {?} */ (this)).gridster.gridList.pullItemsToLeft();
}
if (name === 'widthHeightRatio') {
(/** @type {?} */ (this)).gridster.options.widthHeightRatio = parseFloat(value || 1);
}
if (name === 'responsiveView') {
(/** @type {?} */ (this)).gridster.options.responsiveView = !!value;
}
(/** @type {?} */ (this)).gridster.gridList.setOption(name, value);
return (/** @type {?} */ (this));
};
/**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
GridsterComponent.prototype.reload = /**
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
var _this = this;
setTimeout(function () {
(/** @type {?} */ (_this)).gridster.fixItemsPositions();
(/** @type {?} */ (_this)).reflowGridster();
});
return (/** @type {?} */ (this));
};
/**
* @param {?=} isInit
* @return {?}
*/
GridsterComponent.prototype.reflowGridster = /**
* @param {?=} isInit
* @return {?}
*/
function (isInit) {
if (isInit === void 0) { isInit = false; }
this.gridster.reflow();
this.reflow.emit({
isInit: isInit,
gridsterComponent: this
});
};
/**
* @return {?}
*/
GridsterComponent.prototype.updateGridsterElementData = /**
* @return {?}
*/
function () {
this.gridster.gridsterScrollData = this.getScrollPositionFromParents(this.$element);
this.gridster.gridsterRect = this.$element.getBoundingClientRect();
};
/**
* @return {?}
*/
GridsterComponent.prototype.setReady = /**
* @return {?}
*/
function () {
var _this = this;
setTimeout(function () { return (_this.isReady = true); });
this.ready.emit();
};
/**
* @param {?=} scrollableItemElementSelector
* @return {?}
*/
GridsterComponent.prototype.adjustItemsHeightToContent = /**
* @param {?=} scrollableItemElementSelector
* @return {?}
*/
function (scrollableItemElementSelector) {
var _this = this;
if (scrollableItemElementSelector === void 0) { scrollableItemElementSelector = '.gridster-item-inner'; }
this.gridster.items
// convert each item to object with information about content height and scroll height
.map(function (item) {
/** @type {?} */
var scrollEl = item.$element.querySelector(scrollableItemElementSelector);
/** @type {?} */
var contentEl = scrollEl.lastElementChild;
/** @type {?} */
var scrollElDistance = utils.getRelativeCoordinates(scrollEl, item.$element);
/** @type {?} */
var scrollElRect = scrollEl.getBoundingClientRect();
/** @type {?} */
var contentRect = contentEl.getBoundingClientRect();
return {
item: item,
contentHeight: contentRect.bottom - scrollElRect.top,
scrollElDistance: scrollElDistance
};
})
// calculate required height in lanes amount and update item "h"
.forEach(function (data) {
data.item.h = Math.ceil((/** @type {?} */ (((data.contentHeight /
(_this.gridster.cellHeight - data.scrollElDistance.top))))));
});
this.gridster.fixItemsPositions();
this.gridster.reflow();
};
/**
* @param {?} item
* @return {?}
*/
GridsterComponent.prototype.disable = /**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var itemIdx = this.gridster.items.indexOf(item.itemComponent);
this.isDisabled = true;
if (itemIdx >= 0) {
delete this.gridster.items[this.gridster.items.indexOf(item.itemComponent)];
}
this.gridster.onDragOut(item);
};
/**
* @return {?}
*/
GridsterComponent.prototype.enable = /**
* @return {?}
*/
function () {
this.isDisabled = false;
};
/**
* @param {?} element
* @param {?=} data
* @return {?}
*/
GridsterComponent.prototype.getScrollPositionFromParents = /**
* @param {?} element
* @param {?=} data
* @return {?}
*/
function (element, data) {
if (data === void 0) { data = { scrollTop: 0, scrollLeft: 0 }; }
if (element.parentElement && element.parentElement !== document.body) {
data.scrollTop += element.parentElement.scrollTop;
data.scrollLeft += element.parentElement.scrollLeft;
return this.getScrollPositionFromParents(element.parentElement, data);
}
return {
scrollTop: data.scrollTop,
scrollLeft: data.scrollLeft
};
};
/**
* Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop).
*/
/**
* Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop).
* @return {?}
*/
GridsterComponent.prototype.connectGridsterPrototype = /**
* Connect gridster prototype item to gridster dragging hooks (onStart, onDrag, onStop).
* @return {?}
*/
function () {
var _this = this;
this.gridsterPrototype.observeDropOut(this.gridster).subscribe();
/** @type {?} */
var dropOverObservable = (/** @type {?} */ ((this.gridsterPrototype
.observeDropOver(this.gridster)
.pipe(publish()))));
/** @type {?} */
var dragObservable = this.gridsterPrototype.observeDragOver(this.gridster);
dragObservable.dragOver
.pipe(filter(function () { return !_this.isDisabled; }))
.subscribe(function (prototype) {
if (!_this.isPrototypeEntered) {
return;
}
_this.gridster.onDrag(prototype.item);
});
dragObservable.dragEnter
.pipe(filter(function () { return !_this.isDisabled; }))
.subscribe(function (prototype) {
_this.isPrototypeEntered = true;
if (_this.gridster.items.indexOf(prototype.item) < 0) {
_this.gridster.items.push(prototype.item);
}
_this.gridster.onStart(prototype.item);
prototype.setDragContextGridster(_this.gridster);
if (_this.parent) {
_this.parent.disable(prototype.item);
}
_this.prototypeEnter.emit({ item: prototype.item });
});
dragObservable.dragOut
.pipe(filter(function () { return !_this.isDisabled; }))
.subscribe(function (prototype) {
if (!_this.isPrototypeEntered) {
return;
}
_this.gridster.onDragOut(prototype.item);
_this.isPrototypeEntered = false;
_this.prototypeOut.emit({ item: prototype.item });
if (_this.parent) {
_this.parent.enable();
_this.parent.isPrototypeEntered = true;
if (_this.parent.gridster.items.indexOf(prototype.item) < 0) {
_this.parent.gridster.items.push(prototype.item);
}
_this.parent.gridster.onStart(prototype.item);
prototype.setDragContextGridster(_this.parent.gridster);
// timeout is needed to be sure that "enter" event is fired after "out"
setTimeout(function () {
_this.parent.prototypeEnter.emit({
item: prototype.item
});
prototype.onEnter(_this.parent.gridster);
});
}
});
dropOverObservable
.pipe(filter(function () { return !_this.isDisabled; }))
.subscribe(function (data) {
if (!_this.isPrototypeEntered) {
return;
}
_this.gridster.onStop(data.item.item);
_this.gridster.removeItem(data.item.item);
_this.isPrototypeEntered = false;
if (_this.parent) {
_this.parent.enable();
}
_this.prototypeDrop.emit({ item: data.item.item });
});
dropOverObservable.connect();
};
/**
* @return {?}
*/
GridsterComponent.prototype.enableDraggable = /**
* @return {?}
*/
function () {
this.gridster.options.dragAndDrop = true;
this.gridster.items
.filter(function (item) { return item.itemComponent && item.itemComponent.dragAndDrop; })
.forEach(function (item) {
return item.itemComponent.enableDragDrop();
});
};
/**
* @return {?}
*/
GridsterComponent.prototype.disableDraggable = /**
* @return {?}
*/
function () {
this.gridster.options.dragAndDrop = false;
this.gridster.items
.filter(function (item) { return item.itemComponent; })
.forEach(function (item) {
return item.itemComponent.disableDraggable();
});
};
/**
* @return {?}
*/
GridsterComponent.prototype.enableResizable = /**
* @return {?}
*/
function () {
this.gridster.options.resizable = true;
this.gridster.items
.filter(function (item) { return item.itemComponent && item.itemComponent.resizable; })
.forEach(function (item) {
return item.itemComponent.enableResizable();
});
};
/**
* @return {?}
*/
GridsterComponent.prototype.disableResizable = /**
* @return {?}
*/
function () {
this.gridster.options.resizable = false;
this.gridster.items.forEach(function (item) {
return item.itemComponent.disableResizable();
});
};
GridsterComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-gridster',
template: "<div class=\"gridster-container\" #container>\n <ng-content></ng-content>\n <div class=\"position-highlight\" style=\"display:none;\" #positionHighlight>\n <div class=\"inner\"></div>\n </div>\n </div>",
providers: [GridsterService],
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
styles: ["\n ngx-gridster {\n position: relative;\n display: block;\n left: 0;\n width: 100%;\n }\n\n ngx-gridster.gridster--dragging {\n -moz-user-select: none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n\n ngx-gridster .gridster-container {\n position: relative;\n width: 100%;\n list-style: none;\n -webkit-transition: width 0.2s, height 0.2s;\n transition: width 0.2s, height 0.2s;\n }\n\n ngx-gridster .position-highlight {\n display: block;\n position: absolute;\n z-index: 1;\n }\n "]
}] }
];
/** @nocollapse */
GridsterComponent.ctorParameters = function () { return [
{ type: NgZone },
{ type: ElementRef },
{ type: GridsterService },
{ type: GridsterPrototypeService }
]; };
GridsterComponent.propDecorators = {
options: [{ type: Input }],
optionsChange: [{ type: Output }],
ready: [{ type: Output }],
reflow: [{ type: Output }],
prototypeDrop: [{ type: Output }],
prototypeEnter: [{ type: Output }],
prototypeOut: [{ type: Output }],
draggableOptions: [{ type: Input }],
parent: [{ type: Input }],
$positionHighlight: [{ type: ViewChild, args: ['positionHighlight',] }],
isDragging: [{ type: HostBinding, args: ['class.gridster--dragging',] }],
isResizing: [{ type: HostBinding, args: ['class.gridster--resizing',] }],
isReady: [{ type: HostBinding, args: ['class.gridster--ready',] }],
container: [{ type: ViewChild, args: ['container',] }]
};
return GridsterComponent;
}());
export { GridsterComponent };
if (false) {
/** @type {?} */
GridsterComponent.prototype.options;
/** @type {?} */
GridsterComponent.prototype.optionsChange;
/** @type {?} */
GridsterComponent.prototype.ready;
/** @type {?} */
GridsterComponent.prototype.reflow;
/** @type {?} */
GridsterComponent.prototype.prototypeDrop;
/** @type {?} */
GridsterComponent.prototype.prototypeEnter;
/** @type {?} */
GridsterComponent.prototype.prototypeOut;
/** @type {?} */
GridsterComponent.prototype.draggableOptions;
/** @type {?} */
GridsterComponent.prototype.parent;
/** @type {?} */
GridsterComponent.prototype.$positionHighlight;
/** @type {?} */
GridsterComponent.prototype.isDragging;
/** @type {?} */
GridsterComponent.prototype.isResizing;
/** @type {?} */
GridsterComponent.prototype.isReady;
/** @type {?} */
GridsterComponent.prototype.container;
/** @type {?} */
GridsterComponent.prototype.gridster;
/** @type {?} */
GridsterComponent.prototype.$element;
/** @type {?} */
GridsterComponent.prototype.gridsterOptions;
/** @type {?} */
GridsterComponent.prototype.isPrototypeEntered;
/** @type {?} */
GridsterComponent.prototype.isDisabled;
/** @type {?} */
GridsterComponent.prototype.subscription;
/** @type {?} */
GridsterComponent.prototype.zone;
/** @type {?} */
GridsterComponent.prototype.gridsterPrototype;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUlULFVBQVUsRUFDVixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLHVCQUF1QixFQUN2QixXQUFXLEVBQ1gsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFSCxZQUFZLEVBQ1osU0FBUyxFQUVaLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHckQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFHM0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBEO0lBc0VJLDJCQUNZLElBQVksRUFDcEIsVUFBc0IsRUFDdEIsUUFBeUIsRUFDakIsaUJBQTJDO1FBSDNDLFNBQUksR0FBSixJQUFJLENBQVE7UUFHWixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBNUI3QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDeEMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDakMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUMzRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBQzVELGlCQUFZLEdBQUcsSUFB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aUNBQ04sTUFBTTsrQkFDTixNQUFNO21DQUNOLEtBQUs7eUJBQ0wsS0FBSztxQ0FFTCxTQUFTLFNBQUMsbUJBQW1COzZCQUM3QixXQUFXLFNBQUMsMEJBQTBCOzZCQUN0QyxXQUFXLFNBQUMsMEJBQTBCOzBCQUV0QyxXQUFXLFNBQUMsdUJBQXVCOzRCQUVuQyxTQUFTLFNBQUMsV0FBVzs7SUFrVzFCLHdCQUFDO0NBQUEsQUEvWkQsSUErWkM7U0FuWFksaUJBQWlCOzs7SUFDMUIsb0NBQW1DOztJQUNuQywwQ0FBa0Q7O0lBQ2xELGtDQUEwQzs7SUFDMUMsbUNBQTJDOztJQUMzQywwQ0FBcUU7O0lBQ3JFLDJDQUFzRTs7SUFDdEUseUNBQW9FOztJQUNwRSw2Q0FBMEQ7O0lBQzFELG1DQUFtQzs7SUFFbkMsK0NBQW1EOztJQUNuRCx1Q0FBNEQ7O0lBQzVELHVDQUE0RDs7SUFFNUQsb0NBQXNEOztJQUV0RCxzQ0FBOEM7O0lBQzlDLHFDQUEwQjs7SUFDMUIscUNBQXNCOztJQUV0Qiw0Q0FBaUM7O0lBQ2pDLCtDQUEyQjs7SUFDM0IsdUNBQTJCOztJQUMzQix5Q0FBMEM7O0lBR3RDLGlDQUFvQjs7SUFHcEIsOENBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT25Jbml0LFxuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgT25EZXN0cm95LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIE5nWm9uZSxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBPYnNlcnZhYmxlLFxuICAgIFN1YnNjcmlwdGlvbixcbiAgICBmcm9tRXZlbnQsXG4gICAgQ29ubmVjdGFibGVPYnNlcnZhYmxlXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHB1Ymxpc2ggfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBHcmlkc3RlclNlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUdyaWRzdGVyT3B0aW9ucyB9IGZyb20gJy4vSUdyaWRzdGVyT3B0aW9ucyc7XG5pbXBvcnQgeyBJR3JpZHN0ZXJEcmFnZ2FibGVPcHRpb25zIH0gZnJvbSAnLi9JR3JpZHN0ZXJEcmFnZ2FibGVPcHRpb25zJztcbmltcG9ydCB7IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLXByb3RvdHlwZS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBHcmlkTGlzdEl0ZW0gfSBmcm9tICcuL2dyaWRMaXN0L0dyaWRMaXN0SXRlbSc7XG5pbXBvcnQgeyBHcmlkc3Rlck9wdGlvbnMgfSBmcm9tICcuL0dyaWRzdGVyT3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWdyaWRzdGVyJyxcbiAgICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJncmlkc3Rlci1jb250YWluZXJcIiAjY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLWhpZ2hsaWdodFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiICNwb3NpdGlvbkhpZ2hsaWdodD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlubmVyXCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICBuZ3gtZ3JpZHN0ZXIge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZ3gtZ3JpZHN0ZXIuZ3JpZHN0ZXItLWRyYWdnaW5nIHtcbiAgICAgICAgICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgICAgIC1raHRtbC11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAgICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmd4LWdyaWRzdGVyIC5ncmlkc3Rlci1jb250YWluZXIge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogd2lkdGggMC4ycywgaGVpZ2h0IDAuMnM7XG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4ycywgaGVpZ2h0IDAuMnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5neC1ncmlkc3RlciAucG9zaXRpb24taGlnaGxpZ2h0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbR3JpZHN0ZXJTZXJ2aWNlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIG9wdGlvbnM6IElHcmlkc3Rlck9wdGlvbnM7XG4gICAgQE91dHB1dCgpIG9wdGlvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVmbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHByb3RvdHlwZURyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbTogR3JpZExpc3RJdGVtIH0+KCk7XG4gICAgQE91dHB1dCgpIHByb3RvdHlwZUVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjx7IGl0ZW06IEdyaWRMaXN0SXRlbSB9PigpO1xuICAgIEBPdXRwdXQoKSBwcm90b3R5cGVPdXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgaXRlbTogR3JpZExpc3RJdGVtIH0+KCk7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlT3B0aW9uczogSUdyaWRzdGVyRHJhZ2dhYmxlT3B0aW9ucyA9IHt9O1xuICAgIEBJbnB1dCgpIHBhcmVudDogR3JpZHN0ZXJDb21wb25lbnQ7XG5cbiAgICBAVmlld0NoaWxkKCdwb3NpdGlvbkhpZ2hsaWdodCcpICRwb3NpdGlvbkhpZ2hsaWdodDtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdyaWRzdGVyLS1kcmFnZ2luZycpIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmdyaWRzdGVyLS1yZXNpemluZycpIGlzUmVzaXppbmcgPSBmYWxzZTtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuZ3JpZHN0ZXItLXJlYWR5JykgaXNSZWFkeSA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2U7XG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgZ3JpZHN0ZXJPcHRpb25zOiBHcmlkc3Rlck9wdGlvbnM7XG4gICAgaXNQcm90b3R5cGVFbnRlcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZ3JpZHN0ZXJQcm90b3R5cGU6IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXI7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJPcHRpb25zID0gbmV3IEdyaWRzdGVyT3B0aW9ucyh0aGlzLm9wdGlvbnMsIHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUNTU1RyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY3NzLXRyYW5zZm9ybScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlck9wdGlvbnMuY2hhbmdlLnN1YnNjcmliZShvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLmdyaWRMaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3Qub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZS5lbWl0KG9wdGlvbnMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLmluaXQodGhpcyk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgICAgICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZURlYm91bmNlIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5ncmlkc3Rlci5vcHRpb25zLnJlc3BvbnNpdmVWaWV3KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVsb2FkKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnLCB7IHBhc3NpdmU6IHRydWUgfSkuc3Vic2NyaWJlKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGFibGVDb250YWluZXIgPSB1dGlscy5nZXRTY3JvbGxhYmxlQ29udGFpbmVyKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGFibGVDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoXG4gICAgICAgICAgICAgICAgICAgIGZyb21FdmVudChzY3JvbGxhYmxlQ29udGFpbmVyLCAnc2Nyb2xsJywgeyBwYXNzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuc3RhcnQoKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRzdGVyRWxlbWVudERhdGEoKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3RHcmlkc3RlclByb3RvdHlwZSgpO1xuXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJHBvc2l0aW9uSGlnaGxpZ2h0ID0gdGhpcy4kcG9zaXRpb25IaWdobGlnaHQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgZ3JpZHN0ZXIgY29uZmlnIG9wdGlvbiBhbmQgcmVidWlsZFxuICAgICAqIEBwYXJhbSBzdHJpbmcgbmFtZVxuICAgICAqIEBwYXJhbSBhbnkgdmFsdWVcbiAgICAgKiBAcmV0dXJuIEdyaWRzdGVyQ29tcG9uZW50XG4gICAgICovXG4gICAgc2V0T3B0aW9uKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBpZiAobmFtZSA9PT0gJ2RyYWdBbmREcm9wJykge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnZ2FibGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRHJhZ2dhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICdyZXNpemFibGUnKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlc2l6YWJsZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVSZXNpemFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ2xhbmVzJykge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLmxhbmVzID0gdmFsdWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3QuZml4SXRlbXNQb3NpdGlvbnModGhpcy5ncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMucmVmbG93R3JpZHN0ZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ2RpcmVjdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub3B0aW9ucy5kaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3QucHVsbEl0ZW1zVG9MZWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd3aWR0aEhlaWdodFJhdGlvJykge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vcHRpb25zLndpZHRoSGVpZ2h0UmF0aW8gPSBwYXJzZUZsb2F0KHZhbHVlIHx8IDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAncmVzcG9uc2l2ZVZpZXcnKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyLm9wdGlvbnMucmVzcG9uc2l2ZVZpZXcgPSAhIXZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZExpc3Quc2V0T3B0aW9uKG5hbWUsIHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5maXhJdGVtc1Bvc2l0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5yZWZsb3dHcmlkc3RlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZWZsb3dHcmlkc3Rlcihpc0luaXQgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLmdyaWRzdGVyLnJlZmxvdygpO1xuICAgICAgICB0aGlzLnJlZmxvdy5lbWl0KHtcbiAgICAgICAgICAgIGlzSW5pdDogaXNJbml0LFxuICAgICAgICAgICAgZ3JpZHN0ZXJDb21wb25lbnQ6IHRoaXNcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlR3JpZHN0ZXJFbGVtZW50RGF0YSgpIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5ncmlkc3RlclNjcm9sbERhdGEgPSB0aGlzLmdldFNjcm9sbFBvc2l0aW9uRnJvbVBhcmVudHMoXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZHN0ZXJSZWN0ID0gdGhpcy4kZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICBzZXRSZWFkeSgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiAodGhpcy5pc1JlYWR5ID0gdHJ1ZSkpO1xuICAgICAgICB0aGlzLnJlYWR5LmVtaXQoKTtcbiAgICB9XG5cbiAgICBhZGp1c3RJdGVtc0hlaWdodFRvQ29udGVudChcbiAgICAgICAgc2Nyb2xsYWJsZUl0ZW1FbGVtZW50U2VsZWN0b3I6IHN0cmluZyA9ICcuZ3JpZHN0ZXItaXRlbS1pbm5lcidcbiAgICApIHtcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtc1xuICAgICAgICAgICAgLy8gY29udmVydCBlYWNoIGl0ZW0gdG8gb2JqZWN0IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBoZWlnaHQgYW5kIHNjcm9sbCBoZWlnaHRcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IEdyaWRMaXN0SXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEVsID0gaXRlbS4kZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxhYmxlSXRlbUVsZW1lbnRTZWxlY3RvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEVsID0gc2Nyb2xsRWwubGFzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxFbERpc3RhbmNlID0gdXRpbHMuZ2V0UmVsYXRpdmVDb29yZGluYXRlcyhcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRWwsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uJGVsZW1lbnRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEVsUmVjdCA9IHNjcm9sbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZWN0ID0gY29udGVudEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEhlaWdodDogY29udGVudFJlY3QuYm90dG9tIC0gc2Nyb2xsRWxSZWN0LnRvcCxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRWxEaXN0YW5jZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHJlcXVpcmVkIGhlaWdodCBpbiBsYW5lcyBhbW91bnQgYW5kIHVwZGF0ZSBpdGVtIFwiaFwiXG4gICAgICAgICAgICAuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW0uaCA9IE1hdGguY2VpbCg8YW55PihcbiAgICAgICAgICAgICAgICAgICAgKGRhdGEuY29udGVudEhlaWdodCAvXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5ncmlkc3Rlci5jZWxsSGVpZ2h0IC0gZGF0YS5zY3JvbGxFbERpc3RhbmNlLnRvcCkpXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmdyaWRzdGVyLmZpeEl0ZW1zUG9zaXRpb25zKCk7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIucmVmbG93KCk7XG4gICAgfVxuXG4gICAgZGlzYWJsZShpdGVtKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1JZHggPSB0aGlzLmdyaWRzdGVyLml0ZW1zLmluZGV4T2YoaXRlbS5pdGVtQ29tcG9uZW50KTtcblxuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBpZiAoaXRlbUlkeCA+PSAwKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5ncmlkc3Rlci5pdGVtc1tcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRzdGVyLml0ZW1zLmluZGV4T2YoaXRlbS5pdGVtQ29tcG9uZW50KVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRzdGVyLm9uRHJhZ091dChpdGVtKTtcbiAgICB9XG5cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsUG9zaXRpb25Gcm9tUGFyZW50cyhcbiAgICAgICAgZWxlbWVudDogRWxlbWVudCxcbiAgICAgICAgZGF0YSA9IHsgc2Nyb2xsVG9wOiAwLCBzY3JvbGxMZWZ0OiAwIH1cbiAgICApOiB7IHNjcm9sbFRvcDogbnVtYmVyOyBzY3JvbGxMZWZ0OiBudW1iZXIgfSB7XG4gICAgICAgIGlmIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgICAgICBkYXRhLnNjcm9sbFRvcCArPSBlbGVtZW50LnBhcmVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgZGF0YS5zY3JvbGxMZWZ0ICs9IGVsZW1lbnQucGFyZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxQb3NpdGlvbkZyb21QYXJlbnRzKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNjcm9sbFRvcDogZGF0YS5zY3JvbGxUb3AsXG4gICAgICAgICAgICBzY3JvbGxMZWZ0OiBkYXRhLnNjcm9sbExlZnRcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IGdyaWRzdGVyIHByb3RvdHlwZSBpdGVtIHRvIGdyaWRzdGVyIGRyYWdnaW5nIGhvb2tzIChvblN0YXJ0LCBvbkRyYWcsIG9uU3RvcCkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb25uZWN0R3JpZHN0ZXJQcm90b3R5cGUoKSB7XG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUub2JzZXJ2ZURyb3BPdXQodGhpcy5ncmlkc3Rlcikuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgY29uc3QgZHJvcE92ZXJPYnNlcnZhYmxlID0gPENvbm5lY3RhYmxlT2JzZXJ2YWJsZTxhbnk+PihcbiAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGVcbiAgICAgICAgICAgICAgICAub2JzZXJ2ZURyb3BPdmVyKHRoaXMuZ3JpZHN0ZXIpXG4gICAgICAgICAgICAgICAgLnBpcGUocHVibGlzaCgpKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRyYWdPYnNlcnZhYmxlID0gdGhpcy5ncmlkc3RlclByb3RvdHlwZS5vYnNlcnZlRHJhZ092ZXIoXG4gICAgICAgICAgICB0aGlzLmdyaWRzdGVyXG4gICAgICAgICk7XG5cbiAgICAgICAgZHJhZ09ic2VydmFibGUuZHJhZ092ZXJcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5pc0Rpc2FibGVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByb3RvdHlwZTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZHN0ZXIub25EcmFnKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRyYWdPYnNlcnZhYmxlLmRyYWdFbnRlclxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLmlzRGlzYWJsZWQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocHJvdG90eXBlOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUHJvdG90eXBlRW50ZXJlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5pdGVtcy5pbmRleE9mKHByb3RvdHlwZS5pdGVtKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5pdGVtcy5wdXNoKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkc3Rlci5vblN0YXJ0KHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICBwcm90b3R5cGUuc2V0RHJhZ0NvbnRleHRHcmlkc3Rlcih0aGlzLmdyaWRzdGVyKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5kaXNhYmxlKHByb3RvdHlwZS5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b3R5cGVFbnRlci5lbWl0KHsgaXRlbTogcHJvdG90eXBlLml0ZW0gfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBkcmFnT2JzZXJ2YWJsZS5kcmFnT3V0XG4gICAgICAgICAgICAucGlwZShmaWx0ZXIoKCkgPT4gIXRoaXMuaXNEaXNhYmxlZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChw