angular2gridsterv3
Version:
241 lines • 32 kB
JavaScript
import { Directive, Input, Output, EventEmitter } from '@angular/core';
import { fromEvent } from 'rxjs';
import { GridListItem } from '../gridList/GridListItem';
import { Draggable } from '../utils/draggable';
import { utils } from '../utils/utils';
import * as i0 from "@angular/core";
import * as i1 from "./gridster-prototype.service";
export class GridsterItemPrototypeDirective {
constructor(zone, elementRef, gridsterPrototype) {
this.zone = zone;
this.elementRef = elementRef;
this.gridsterPrototype = gridsterPrototype;
this.drop = new EventEmitter();
this.start = new EventEmitter();
this.cancel = new EventEmitter();
this.enter = new EventEmitter();
this.out = new EventEmitter();
this.config = {};
this.x = 0;
this.y = 0;
this.autoSize = false;
this.isDragging = false;
this.subscribtions = [];
this.item = (new GridListItem()).setFromGridsterItemPrototype(this);
}
// must be set to true because of item dragAndDrop configuration
get dragAndDrop() {
return true;
}
get gridster() {
return this.dragContextGridster;
}
ngOnInit() {
this.wSm = this.wSm || this.w;
this.hSm = this.hSm || this.h;
this.wMd = this.wMd || this.w;
this.hMd = this.hMd || this.h;
this.wLg = this.wLg || this.w;
this.hLg = this.hLg || this.h;
this.wXl = this.wXl || this.w;
this.hXl = this.hXl || this.h;
this.zone.runOutsideAngular(() => {
this.enableDragDrop();
});
}
ngOnDestroy() {
this.subscribtions.forEach((sub) => {
sub.unsubscribe();
});
}
onDrop(gridster) {
if (!this.config.helper) {
this.$element.parentNode.removeChild(this.$element);
}
this.drop.emit({
item: this.item,
gridster: gridster
});
}
onCancel() {
this.cancel.emit({ item: this.item });
}
onEnter(gridster) {
this.enter.emit({
item: this.item,
gridster: gridster
});
}
onOver(gridster) { }
onOut(gridster) {
this.out.emit({
item: this.item,
gridster: gridster
});
}
getPositionToGridster(gridster) {
const relativeContainerCoords = this.getContainerCoordsToGridster(gridster);
return {
y: this.positionY - relativeContainerCoords.top,
x: this.positionX - relativeContainerCoords.left
};
}
setDragContextGridster(gridster) {
this.dragContextGridster = gridster;
}
getContainerCoordsToGridster(gridster) {
return {
left: gridster.gridsterRect.left - this.parentRect.left,
top: gridster.gridsterRect.top - this.parentRect.top
};
}
enableDragDrop() {
let cursorToElementPosition;
const draggable = new Draggable(this.elementRef.nativeElement);
const dragStartSub = draggable.dragStart
.subscribe((event) => {
this.zone.run(() => {
this.$element = this.provideDragElement();
this.containerRectange = this.$element.parentElement.getBoundingClientRect();
this.updateParentElementData();
this.onStart(event);
cursorToElementPosition = event.getRelativeCoordinates(this.$element);
});
});
const dragSub = draggable.dragMove
.subscribe((event) => {
this.setElementPosition(this.$element, {
x: event.clientX - cursorToElementPosition.x - this.parentRect.left,
y: event.clientY - cursorToElementPosition.y - this.parentRect.top
});
this.onDrag(event);
});
const dragStopSub = draggable.dragStop
.subscribe((event) => {
this.zone.run(() => {
this.onStop(event);
this.$element = null;
});
});
const scrollSub = fromEvent(document, 'scroll')
.subscribe(() => {
if (this.$element) {
this.updateParentElementData();
}
});
this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]);
}
setElementPosition(element, position) {
this.positionX = position.x;
this.positionY = position.y;
utils.setCssElementPosition(element, position);
}
updateParentElementData() {
this.parentRect = this.$element.parentElement.getBoundingClientRect();
this.parentOffset = {
left: this.$element.parentElement.offsetLeft,
top: this.$element.parentElement.offsetTop
};
}
onStart(event) {
this.isDragging = true;
this.$element.style.pointerEvents = 'none';
this.$element.style.position = 'absolute';
this.gridsterPrototype.dragItemStart(this, event);
this.start.emit({ item: this.item });
}
onDrag(event) {
this.gridsterPrototype.updatePrototypePosition(this, event);
}
onStop(event) {
this.gridsterPrototype.dragItemStop(this, event);
this.isDragging = false;
this.$element.style.pointerEvents = 'auto';
this.$element.style.position = '';
utils.resetCSSElementPosition(this.$element);
if (this.config.helper) {
this.$element.parentNode.removeChild(this.$element);
}
}
provideDragElement() {
let dragElement = this.elementRef.nativeElement;
if (this.config.helper) {
dragElement = (dragElement).cloneNode(true);
document.body.appendChild(this.fixStylesForBodyHelper(dragElement));
}
else {
this.fixStylesForRelativeElement(dragElement);
}
return dragElement;
}
fixStylesForRelativeElement(el) {
if (window.getComputedStyle(el).position === 'absolute') {
return el;
}
const rect = this.elementRef.nativeElement.getBoundingClientRect();
this.containerRectange = el.parentElement.getBoundingClientRect();
el.style.position = 'absolute';
this.setElementPosition(el, {
x: rect.left - this.containerRectange.left,
y: rect.top - this.containerRectange.top
});
return el;
}
/**
* When element is cloned and append to body it should have position absolute and coords set by original
* relative prototype element position.
*/
fixStylesForBodyHelper(el) {
const bodyRect = document.body.getBoundingClientRect();
const rect = this.elementRef.nativeElement.getBoundingClientRect();
el.style.position = 'absolute';
this.setElementPosition(el, {
x: rect.left - bodyRect.left,
y: rect.top - bodyRect.top
});
return el;
}
}
GridsterItemPrototypeDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterItemPrototypeDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.GridsterPrototypeService }], target: i0.ɵɵFactoryTarget.Directive });
GridsterItemPrototypeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.4.0", type: GridsterItemPrototypeDirective, selector: "[ngxGridsterItemPrototype]", inputs: { data: "data", config: "config", w: "w", wSm: "wSm", wMd: "wMd", wLg: "wLg", wXl: "wXl", h: "h", hSm: "hSm", hMd: "hMd", hLg: "hLg", hXl: "hXl" }, outputs: { drop: "drop", start: "start", cancel: "cancel", enter: "enter", out: "out" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterItemPrototypeDirective, decorators: [{
type: Directive,
args: [{
selector: '[ngxGridsterItemPrototype]'
}]
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i1.GridsterPrototypeService }]; }, propDecorators: { drop: [{
type: Output
}], start: [{
type: Output
}], cancel: [{
type: Output
}], enter: [{
type: Output
}], out: [{
type: Output
}], data: [{
type: Input
}], config: [{
type: Input
}], w: [{
type: Input
}], wSm: [{
type: Input
}], wMd: [{
type: Input
}], wLg: [{
type: Input
}], wXl: [{
type: Input
}], h: [{
type: Input
}], hSm: [{
type: Input
}], hMd: [{
type: Input
}], hLg: [{
type: Input
}], hXl: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3RlcnYzL3NyYy9saWIvZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQWUsWUFBWSxFQUM3RCxNQUFNLGVBQWUsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUczRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS3ZDLE1BQU0sT0FBTyw4QkFBOEI7SUE2RHZDLFlBQW9CLElBQVksRUFDWixVQUFzQixFQUN0QixpQkFBMkM7UUFGM0MsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQTlEckQsU0FBSSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsUUFBRyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFHMUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUVuQixNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQWViLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFjakIs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QVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBSUcsQ0FBQztzQkFBVCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxDQUFDO3NCQUFULEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBIb3N0QmluZGluZywgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSxcclxuICAgIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2UgfSBmcm9tICcuL2dyaWRzdGVyLXByb3RvdHlwZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi4vZ3JpZExpc3QvR3JpZExpc3RJdGVtJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JpZHN0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvRHJhZ2dhYmxlRXZlbnQnO1xyXG5pbXBvcnQgeyBEcmFnZ2FibGUgfSBmcm9tICcuLi91dGlscy9kcmFnZ2FibGUnO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbbmd4R3JpZHN0ZXJJdGVtUHJvdG90eXBlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIHN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBlbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBvdXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBhbnkgPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgeCA9IDA7XHJcbiAgICBwdWJsaWMgeSA9IDA7XHJcbiAgICBASW5wdXQoKSB3OiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSB3U206IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHdNZDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgd0xnOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSB3WGw6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGg6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGhTbTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgaE1kOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBoTGc6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGhYbDogbnVtYmVyO1xyXG5cclxuICAgIHBvc2l0aW9uWDogbnVtYmVyO1xyXG4gICAgcG9zaXRpb25ZOiBudW1iZXI7XHJcblxyXG4gICAgYXV0b1NpemUgPSBmYWxzZTtcclxuXHJcbiAgICAkZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3VzZSBkcmFnIG9ic2VydmFibGVcclxuICAgICAqL1xyXG4gICAgZHJhZzogT2JzZXJ2YWJsZTxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3Vic2NyaWJ0aW9uIGZvciBkcmFnIG9ic2VydmFibGVcclxuICAgICAqL1xyXG4gICAgZHJhZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpdGVtOiBHcmlkTGlzdEl0ZW07XHJcblxyXG4gICAgY29udGFpbmVyUmVjdGFuZ2U6IENsaWVudFJlY3Q7XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnQ29udGV4dEdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHBhcmVudFJlY3Q6IENsaWVudFJlY3Q7XHJcbiAgICBwcml2YXRlIHBhcmVudE9mZnNldDoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9O1xyXG5cclxuICAgIHByaXZhdGUgc3Vic2NyaWJ0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xyXG5cclxuICAgIC8vIG11c3QgYmUgc2V0IHRvIHRydWUgYmVjYXVzZSBvZiBpdGVtIGRyYWdBbmREcm9wIGNvbmZpZ3VyYXRpb25cclxuICAgIGdldCBkcmFnQW5kRHJvcCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ3JpZHN0ZXIoKTogR3JpZHN0ZXJTZXJ2aWNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnQ29udGV4dEdyaWRzdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBncmlkc3RlclByb3RvdHlwZTogR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbSA9IChuZXcgR3JpZExpc3RJdGVtKCkpLnNldEZyb21Hcmlkc3Rlckl0ZW1Qcm90b3R5cGUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy53U20gPSB0aGlzLndTbSB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oU20gPSB0aGlzLmhTbSB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53TWQgPSB0aGlzLndNZCB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oTWQgPSB0aGlzLmhNZCB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53TGcgPSB0aGlzLndMZyB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oTGcgPSB0aGlzLmhMZyB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy53WGwgPSB0aGlzLndYbCB8fCB0aGlzLnc7XHJcbiAgICAgICAgdGhpcy5oWGwgPSB0aGlzLmhYbCB8fCB0aGlzLmg7XHJcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnRHJvcCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucy5mb3JFYWNoKChzdWI6IFN1YnNjcmlwdGlvbikgPT4ge1xyXG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkRyb3AgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmhlbHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRyb3AuZW1pdCh7XHJcbiAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSxcclxuICAgICAgICAgICAgZ3JpZHN0ZXI6IGdyaWRzdGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwgKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2FuY2VsLmVtaXQoe2l0ZW06IHRoaXMuaXRlbX0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRW50ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVudGVyLmVtaXQoe1xyXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXHJcbiAgICAgICAgICAgIGdyaWRzdGVyOiBncmlkc3RlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uT3ZlciAoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge31cclxuXHJcbiAgICBvbk91dCAoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub3V0LmVtaXQoe1xyXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXHJcbiAgICAgICAgICAgIGdyaWRzdGVyOiBncmlkc3RlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc2l0aW9uVG9Hcmlkc3Rlcihncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVsYXRpdmVDb250YWluZXJDb29yZHMgPSB0aGlzLmdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uWSAtIHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzLnRvcCxcclxuICAgICAgICAgICAgeDogdGhpcy5wb3NpdGlvblggLSByZWxhdGl2ZUNvbnRhaW5lckNvb3Jkcy5sZWZ0XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREcmFnQ29udGV4dEdyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcclxuICAgICAgICB0aGlzLmRyYWdDb250ZXh0R3JpZHN0ZXIgPSBncmlkc3RlcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGVmdDogZ3JpZHN0ZXIuZ3JpZHN0ZXJSZWN0LmxlZnQgLSB0aGlzLnBhcmVudFJlY3QubGVmdCxcclxuICAgICAgICAgICAgdG9wOiBncmlkc3Rlci5ncmlkc3RlclJlY3QudG9wIC0gdGhpcy5wYXJlbnRSZWN0LnRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbmFibGVEcmFnRHJvcCgpIHtcclxuICAgICAgICBsZXQgY3Vyc29yVG9FbGVtZW50UG9zaXRpb247XHJcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdGFydFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RhcnRcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50ID0gdGhpcy5wcm92aWRlRHJhZ0VsZW1lbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWxlbWVudERhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU3RhcnQoZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbiA9IGV2ZW50LmdldFJlbGF0aXZlQ29vcmRpbmF0ZXModGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdWIgPSBkcmFnZ2FibGUuZHJhZ01vdmVcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50UG9zaXRpb24odGhpcy4kZWxlbWVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi54ICAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi55ICAtIHRoaXMucGFyZW50UmVjdC50b3BcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnKGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdTdG9wU3ViID0gZHJhZ2dhYmxlLmRyYWdTdG9wXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN0b3AoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxTdWIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbGVtZW50RGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25zID0gdGhpcy5zdWJzY3JpYnRpb25zLmNvbmNhdChbZHJhZ1N0YXJ0U3ViLCBkcmFnU3ViLCBkcmFnU3RvcFN1Yiwgc2Nyb2xsU3ViXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRFbGVtZW50UG9zaXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQsIHBvc2l0aW9uOiB7eDogbnVtYmVyLCB5OiBudW1iZXJ9KSB7XHJcbiAgICAgICAgdGhpcy5wb3NpdGlvblggPSBwb3NpdGlvbi54O1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25ZID0gcG9zaXRpb24ueTtcclxuICAgICAgICB1dGlscy5zZXRDc3NFbGVtZW50UG9zaXRpb24oZWxlbWVudCwgcG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlUGFyZW50RWxlbWVudERhdGEoKSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRSZWN0ID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0ge1xyXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0TGVmdCxcclxuICAgICAgICAgICAgdG9wOiB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQub2Zmc2V0VG9wXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uU3RhcnQgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuXHJcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS5kcmFnSXRlbVN0YXJ0KHRoaXMsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGFydC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZyAoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS51cGRhdGVQcm90b3R5cGVQb3NpdGlvbih0aGlzLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblN0b3AgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUuZHJhZ0l0ZW1TdG9wKHRoaXMsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJztcclxuICAgICAgICB1dGlscy5yZXNldENTU0VsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmhlbHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvdmlkZURyYWdFbGVtZW50ICgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgbGV0IGRyYWdFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5oZWxwZXIpIHtcclxuICAgICAgICAgICAgZHJhZ0VsZW1lbnQgPSA8YW55PihkcmFnRWxlbWVudCkuY2xvbmVOb2RlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLmZpeFN0eWxlc0ZvckJvZHlIZWxwZXIoZHJhZ0VsZW1lbnQpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmZpeFN0eWxlc0ZvclJlbGF0aXZlRWxlbWVudChkcmFnRWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZHJhZ0VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gZWwucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudFBvc2l0aW9uKGVsLCB7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UubGVmdCxcclxuICAgICAgICAgICAgeTogcmVjdC50b3AgLSB0aGlzLmNvbnRhaW5lclJlY3RhbmdlLnRvcFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIGVsZW1lbnQgaXMgY2xvbmVkIGFuZCBhcHBlbmQgdG8gYm9keSBpdCBzaG91bGQgaGF2ZSBwb3NpdGlvbiBhYnNvbHV0ZSBhbmQgY29vcmRzIHNldCBieSBvcmlnaW5hbFxyXG4gICAgICogcmVsYXRpdmUgcHJvdG90eXBlIGVsZW1lbnQgcG9zaXRpb24uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZml4U3R5bGVzRm9yQm9keUhlbHBlciAoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudFBvc2l0aW9uKGVsLCB7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIGJvZHlSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gYm9keVJlY3QudG9wXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBlbDtcclxuICAgIH1cclxuXHJcbn1cclxuIl19