UNPKG

@rybos/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

241 lines 32 kB
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: "15.1.0", ngImport: i0, type: GridsterItemPrototypeDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i1.GridsterPrototypeService }], target: i0.ɵɵFactoryTarget.Directive }); GridsterItemPrototypeDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.1.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: "15.1.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjJncmlkc3Rlci9zcmMvbGliL2dyaWRzdGVyLXByb3RvdHlwZS9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsTUFBTSxFQUFlLFlBQVksRUFDN0QsTUFBTSxlQUFlLENBQUM7QUFDakMsT0FBTyxFQUE0QixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUt2QyxNQUFNLE9BQU8sOEJBQThCO0lBNkR2QyxZQUFvQixJQUFZLEVBQ1osVUFBc0IsRUFDdEIsaUJBQTJDO1FBRjNDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUE5RHJELFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzVCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLFFBQUcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRzFCLFdBQU0sR0FBUSxFQUFFLENBQUM7UUFFbkIsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFlYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBY2pCLGVB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LEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUlHLENBQUM7c0JBQVQsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csQ0FBQztzQkFBVCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgSG9zdEJpbmRpbmcsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbiAgICBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlIH0gZnJvbSAnLi9ncmlkc3Rlci1wcm90b3R5cGUuc2VydmljZSc7XHJcbmltcG9ydCB7IEdyaWRMaXN0SXRlbSB9IGZyb20gJy4uL2dyaWRMaXN0L0dyaWRMaXN0SXRlbSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4uL3V0aWxzL0RyYWdnYWJsZUV2ZW50JztcclxuaW1wb3J0IHsgRHJhZ2dhYmxlIH0gZnJvbSAnLi4vdXRpbHMvZHJhZ2dhYmxlJztcclxuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW25neEdyaWRzdGVySXRlbVByb3RvdHlwZV0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAT3V0cHV0KCkgZHJvcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBzdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgb3V0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuICAgIEBJbnB1dCgpIGNvbmZpZzogYW55ID0ge307XHJcblxyXG4gICAgcHVibGljIHggPSAwO1xyXG4gICAgcHVibGljIHkgPSAwO1xyXG4gICAgQElucHV0KCkgdzogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgd1NtOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSB3TWQ6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHdMZzogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgd1hsOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBoOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBoU206IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIGhNZDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgaExnOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBoWGw6IG51bWJlcjtcclxuXHJcbiAgICBwb3NpdGlvblg6IG51bWJlcjtcclxuICAgIHBvc2l0aW9uWTogbnVtYmVyO1xyXG5cclxuICAgIGF1dG9TaXplID0gZmFsc2U7XHJcblxyXG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW91c2UgZHJhZyBvYnNlcnZhYmxlXHJcbiAgICAgKi9cclxuICAgIGRyYWc6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFN1YnNjcmlidGlvbiBmb3IgZHJhZyBvYnNlcnZhYmxlXHJcbiAgICAgKi9cclxuICAgIGRyYWdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgaXRlbTogR3JpZExpc3RJdGVtO1xyXG5cclxuICAgIGNvbnRhaW5lclJlY3RhbmdlOiBDbGllbnRSZWN0O1xyXG5cclxuICAgIHByaXZhdGUgZHJhZ0NvbnRleHRHcmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlO1xyXG4gICAgcHJpdmF0ZSBwYXJlbnRSZWN0OiBDbGllbnRSZWN0O1xyXG4gICAgcHJpdmF0ZSBwYXJlbnRPZmZzZXQ6IHtsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyfTtcclxuXHJcbiAgICBwcml2YXRlIHN1YnNjcmlidGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuXHJcbiAgICAvLyBtdXN0IGJlIHNldCB0byB0cnVlIGJlY2F1c2Ugb2YgaXRlbSBkcmFnQW5kRHJvcCBjb25maWd1cmF0aW9uXHJcbiAgICBnZXQgZHJhZ0FuZERyb3AoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdyaWRzdGVyKCk6IEdyaWRzdGVyU2VydmljZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0NvbnRleHRHcmlkc3RlcjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZ3JpZHN0ZXJQcm90b3R5cGU6IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSkge1xyXG5cclxuICAgICAgICB0aGlzLml0ZW0gPSAobmV3IEdyaWRMaXN0SXRlbSgpKS5zZXRGcm9tR3JpZHN0ZXJJdGVtUHJvdG90eXBlKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMud1NtID0gdGhpcy53U20gfHwgdGhpcy53O1xyXG4gICAgICAgIHRoaXMuaFNtID0gdGhpcy5oU20gfHwgdGhpcy5oO1xyXG4gICAgICAgIHRoaXMud01kID0gdGhpcy53TWQgfHwgdGhpcy53O1xyXG4gICAgICAgIHRoaXMuaE1kID0gdGhpcy5oTWQgfHwgdGhpcy5oO1xyXG4gICAgICAgIHRoaXMud0xnID0gdGhpcy53TGcgfHwgdGhpcy53O1xyXG4gICAgICAgIHRoaXMuaExnID0gdGhpcy5oTGcgfHwgdGhpcy5oO1xyXG4gICAgICAgIHRoaXMud1hsID0gdGhpcy53WGwgfHwgdGhpcy53O1xyXG4gICAgICAgIHRoaXMuaFhsID0gdGhpcy5oWGwgfHwgdGhpcy5oO1xyXG4gICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRHJhZ0Ryb3AoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlidGlvbnMuZm9yRWFjaCgoc3ViOiBTdWJzY3JpcHRpb24pID0+IHtcclxuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ecm9wIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5oZWxwZXIpIHtcclxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kcm9wLmVtaXQoe1xyXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXHJcbiAgICAgICAgICAgIGdyaWRzdGVyOiBncmlkc3RlclxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsICgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkVudGVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbnRlci5lbWl0KHtcclxuICAgICAgICAgICAgaXRlbTogdGhpcy5pdGVtLFxyXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbk92ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHt9XHJcblxyXG4gICAgb25PdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm91dC5lbWl0KHtcclxuICAgICAgICAgICAgaXRlbTogdGhpcy5pdGVtLFxyXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQb3NpdGlvblRvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSkge1xyXG4gICAgICAgIGNvbnN0IHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzID0gdGhpcy5nZXRDb250YWluZXJDb29yZHNUb0dyaWRzdGVyKGdyaWRzdGVyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeTogdGhpcy5wb3NpdGlvblkgLSByZWxhdGl2ZUNvbnRhaW5lckNvb3Jkcy50b3AsXHJcbiAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb25YIC0gcmVsYXRpdmVDb250YWluZXJDb29yZHMubGVmdFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RHJhZ0NvbnRleHRHcmlkc3Rlcihncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5kcmFnQ29udGV4dEdyaWRzdGVyID0gZ3JpZHN0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb250YWluZXJDb29yZHNUb0dyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB7dG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlcn0ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGdyaWRzdGVyLmdyaWRzdGVyUmVjdC5sZWZ0IC0gdGhpcy5wYXJlbnRSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogZ3JpZHN0ZXIuZ3JpZHN0ZXJSZWN0LnRvcCAtIHRoaXMucGFyZW50UmVjdC50b3BcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZW5hYmxlRHJhZ0Ryb3AoKSB7XHJcbiAgICAgICAgbGV0IGN1cnNvclRvRWxlbWVudFBvc2l0aW9uO1xyXG4gICAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IG5ldyBEcmFnZ2FibGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBkcmFnU3RhcnRTdWIgPSBkcmFnZ2FibGUuZHJhZ1N0YXJ0XHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudCA9IHRoaXMucHJvdmlkZURyYWdFbGVtZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXJSZWN0YW5nZSA9IHRoaXMuJGVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblN0YXJ0KGV2ZW50KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yVG9FbGVtZW50UG9zaXRpb24gPSBldmVudC5nZXRSZWxhdGl2ZUNvb3JkaW5hdGVzKHRoaXMuJGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBkcmFnU3ViID0gZHJhZ2dhYmxlLmRyYWdNb3ZlXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBEcmFnZ2FibGVFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RWxlbWVudFBvc2l0aW9uKHRoaXMuJGVsZW1lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYIC0gY3Vyc29yVG9FbGVtZW50UG9zaXRpb24ueCAgLSB0aGlzLnBhcmVudFJlY3QubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gY3Vyc29yVG9FbGVtZW50UG9zaXRpb24ueSAgLSB0aGlzLnBhcmVudFJlY3QudG9wXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZyhldmVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBkcmFnU3RvcFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RvcFxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudDogRHJhZ2dhYmxlRXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdG9wKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsU3ViID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4kZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWxlbWVudERhdGEoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucyA9IHRoaXMuc3Vic2NyaWJ0aW9ucy5jb25jYXQoW2RyYWdTdGFydFN1YiwgZHJhZ1N1YiwgZHJhZ1N0b3BTdWIsIHNjcm9sbFN1Yl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0RWxlbWVudFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjoge3g6IG51bWJlciwgeTogbnVtYmVyfSkge1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25YID0gcG9zaXRpb24ueDtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uWSA9IHBvc2l0aW9uLnk7XHJcbiAgICAgICAgdXRpbHMuc2V0Q3NzRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQsIHBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50UmVjdCA9IHRoaXMuJGVsZW1lbnQucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICB0aGlzLnBhcmVudE9mZnNldCA9IHtcclxuICAgICAgICAgICAgbGVmdDogdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblN0YXJ0IChldmVudDogRHJhZ2dhYmxlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcblxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUuZHJhZ0l0ZW1TdGFydCh0aGlzLCBldmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhcnQuZW1pdCh7aXRlbTogdGhpcy5pdGVtfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkRyYWcgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXJQcm90b3R5cGUudXBkYXRlUHJvdG90eXBlUG9zaXRpb24odGhpcywgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25TdG9wIChldmVudDogRHJhZ2dhYmxlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlLmRyYWdJdGVtU3RvcCh0aGlzLCBldmVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcclxuICAgICAgICB0aGlzLiRlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJyc7XHJcbiAgICAgICAgdXRpbHMucmVzZXRDU1NFbGVtZW50UG9zaXRpb24odGhpcy4kZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5oZWxwZXIpIHtcclxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuJGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb3ZpZGVEcmFnRWxlbWVudCAoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBkcmFnRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XHJcbiAgICAgICAgICAgIGRyYWdFbGVtZW50ID0gPGFueT4oZHJhZ0VsZW1lbnQpLmNsb25lTm9kZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5maXhTdHlsZXNGb3JCb2R5SGVscGVyKGRyYWdFbGVtZW50KSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZHJhZ0VsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZml4U3R5bGVzRm9yUmVsYXRpdmVFbGVtZW50KGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWN0YW5nZSA9IGVsLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbihlbCwge1xyXG4gICAgICAgICAgICB4OiByZWN0LmxlZnQgLSB0aGlzLmNvbnRhaW5lclJlY3RhbmdlLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gdGhpcy5jb250YWluZXJSZWN0YW5nZS50b3BcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hlbiBlbGVtZW50IGlzIGNsb25lZCBhbmQgYXBwZW5kIHRvIGJvZHkgaXQgc2hvdWxkIGhhdmUgcG9zaXRpb24gYWJzb2x1dGUgYW5kIGNvb3JkcyBzZXQgYnkgb3JpZ2luYWxcclxuICAgICAqIHJlbGF0aXZlIHByb3RvdHlwZSBlbGVtZW50IHBvc2l0aW9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZpeFN0eWxlc0ZvckJvZHlIZWxwZXIgKGVsOiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGJvZHlSZWN0ID0gZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbihlbCwge1xyXG4gICAgICAgICAgICB4OiByZWN0LmxlZnQgLSBib2R5UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICB5OiByZWN0LnRvcCAtIGJvZHlSZWN0LnRvcFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZWw7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==