UNPKG

ngx-explorer-dnd

Version:

## _Drag & Drop in Angular like in a desktop explorer!_

217 lines 26.7 kB
import { DOCUMENT } from '@angular/common'; import { Directive, EventEmitter, HostListener, Inject, Input, Output, } from '@angular/core'; import { EXPLORER_DND_CONTAINER, } from './ngx-explorer-container.directive'; import { extendStyles } from '../core/css-helper'; import * as i0 from "@angular/core"; import * as i1 from "./ngx-explorer-container.directive"; export class NgxDragSelectionDirective { //#endregion constructor(_document, _parentDrag) { this._document = _document; this._parentDrag = _parentDrag; /** The current x position of the selection div. */ this.startX = 0; /** The current y position of the selection div. */ this.startY = 0; /** * The initial x position of the selection div. * Will be used to handle negative x position. */ this.initialX = 0; /** * The initial y position of the selection div. * Will be used to handle negative y position. */ this.initialY = 0; /** * Will be used to set current selected elements to check has * the current selected elements changed to before. */ this.selectedElements = new Set(); /** The current x position from the fired event. */ this.currentX = 0; /** the current y position from the fired event. */ this.currentY = 0; /** The current calculated width of the selection div. */ this.currentWidth = 0; /** The current calculated height of the selection div. */ this.currentHeight = 0; /** Will be true if selection in progress. */ this.selectingInProgress = false; /** Sets whether ngx-drag-selection can be used. */ this.selectionAllowed = true; /** Event emitted when the selected elements are changed. */ this.selectedElementsChange = new EventEmitter(); } //#region Helper /** Checks if a registered element of type `ngx-explorer-item` inside the selection div rect. */ checkIfElementInsideRect(rect, selectionBorder) { if (((selectionBorder.x >= rect.x && selectionBorder.x <= rect.x + rect.width) || (selectionBorder.x <= rect.x && selectionBorder.x + selectionBorder.width >= rect.x)) && ((selectionBorder.y >= rect.y && selectionBorder.y <= rect.y + rect.height) || (selectionBorder.y <= rect.y && selectionBorder.y + selectionBorder.height >= rect.y))) { return true; } else { return false; } } /** Checks whether the selected elements have changed. */ checkIfSelectedElementsChanged(items) { let changed = false; for (let item of items) { if (!this.selectedElements.has(item)) { // data has changed... changed = true; } } if (!changed) { if (this.selectedElements.size !== items.length) changed = true; } if (changed) // Changed? So "reset" selectedElements this.selectedElements = new Set(items); return changed; } /** Creates the selection div into document.body. */ createSelectionDiv() { if (this.selectionDivElement) { this.selectionDiv = this.selectionDivElement; extendStyles(this.selectionDiv.style, { display: 'none', position: 'fixed', top: '0', left: '0', width: '0px', height: '0px', }); } else { this.selectionDiv = document.createElement('div'); extendStyles(this.selectionDiv.style, { display: 'none', position: 'fixed', opacity: '0.5', top: '0', left: '0', 'border-style': 'solid', 'border-radius': '6px', 'border-width': '0', 'border-color': '#7a7afa', 'background-color': '#add8e6', width: '0px', height: '0px', }); } this._document.body.appendChild(this.selectionDiv); } /** On `mousemove` this will set the current position and width of the selection div. */ setSelectionDivPosition(mouseX, mouseY) { this.currentX = mouseX; this.currentY = mouseY; this.currentWidth = this.currentX - this.startX; this.currentHeight = this.currentY - this.startY; if (this.initialX >= this.currentX) { this.currentWidth = this.initialX - this.currentX; this.startX = this.currentX; } if (this.initialY >= this.currentY) { this.currentHeight = this.initialY - this.currentY; this.startY = this.currentY; } // div is not visible on start if (this.selectionDiv.style.display === 'none') { this.selectionDiv.style.display = 'unset'; } extendStyles(this.selectionDiv.style, { left: this.startX + 'px', top: this.startY + 'px', width: this.currentWidth + 'px', height: this.currentHeight + 'px', }); } //#region HostListener onMouseDown(ev) { if (!this.selectionAllowed) { ev.preventDefault(); return; } if (!this.selectingInProgress) { this.startX = ev.x; this.startY = ev.y; this.initialX = this.startX; this.initialY = this.startY; this.selectingInProgress = true; this.createSelectionDiv(); this.setSelectionDivPosition(this.startX, this.startY); } } onMouseMove(ev) { if (!this.selectingInProgress || !this.selectionAllowed) { ev.preventDefault(); return; } this.setSelectionDivPosition(ev.clientX, ev.clientY); if (this._parentDrag) { const data = this._parentDrag.getElementsInsideSelectionDiv(this.startX, this.startY, this.currentWidth, this.currentHeight); const result = []; if (data.length > 0) { for (let _data of data) { const fileFolderComponent = _data.getHostComponent(); if (fileFolderComponent) { result.push(fileFolderComponent); } } } if (this.checkIfSelectedElementsChanged(result.map((data) => { return data.__ngContext__; }))) { this.selectedElementsChange.emit({ count: result.length, data: result, }); } } } onMouseUp(ev) { if (this.selectingInProgress) { this.selectingInProgress = false; this._document.body.removeChild(this.selectionDiv); } } } NgxDragSelectionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: NgxDragSelectionDirective, deps: [{ token: DOCUMENT }, { token: EXPLORER_DND_CONTAINER }], target: i0.ɵɵFactoryTarget.Directive }); NgxDragSelectionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: NgxDragSelectionDirective, selector: "[ngxDragSelection]", inputs: { selectionAllowed: "selectionAllowed", selectionDivElement: "selectionDivElement" }, outputs: { selectedElementsChange: "selectedElementsChange" }, host: { listeners: { "document:mousedown": "onMouseDown($event)", "document:mousemove": "onMouseMove($event)", "document:mouseup": "onMouseUp($event)" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: NgxDragSelectionDirective, decorators: [{ type: Directive, args: [{ selector: '[ngxDragSelection]', }] }], ctorParameters: function () { return [{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i1.NgxExplorerContainerDirective, decorators: [{ type: Inject, args: [EXPLORER_DND_CONTAINER] }] }]; }, propDecorators: { selectionAllowed: [{ type: Input }], selectionDivElement: [{ type: Input }], selectedElementsChange: [{ type: Output }], onMouseDown: [{ type: HostListener, args: ['document:mousedown', ['$event']] }], onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event']] }], onMouseUp: [{ type: HostListener, args: ['document:mouseup', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyYWctc2VsZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHBsb3Jlci1kbmQvc3JjL2xpYi9kaXJlY3RpdmVzL25neC1kcmFnLXNlbGVjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFNbEQsTUFBTSxPQUFPLHlCQUF5QjtJQWdLcEMsWUFBWTtJQUVaLFlBQzRCLFNBQW1CLEVBRXJDLFdBQTJDO1FBRnpCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFFckMsZ0JBQVcsR0FBWCxXQUFXLENBQWdDO1FBcEtyRCxtREFBbUQ7UUFDM0MsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUUzQixtREFBbUQ7UUFDM0MsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUUzQjs7O1dBR0c7UUFDSyxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBRTdCOzs7V0FHRztRQUNLLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0I7OztXQUdHO1FBQ0sscUJBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7UUFFMUQsbURBQW1EO1FBQzNDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0IsbURBQW1EO1FBQzNDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0IseURBQXlEO1FBQ2pELGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRWpDLDBEQUEwRDtRQUNsRCxrQkFBYSxHQUFXLENBQUMs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VSx5QkFBeUIsa0JBbUsxQixRQUFRLGFBQ1Isc0JBQXNCOzBHQXBLckIseUJBQXlCOzJGQUF6Qix5QkFBeUI7a0JBSHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7OzBCQW9LSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsc0JBQXNCOzRDQXhIdkIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBd0hQLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQjlDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF5QzlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBFWFBMT1JFUl9ETkRfQ09OVEFJTkVSLFxuICBOZ3hFeHBsb3JlckNvbnRhaW5lckRpcmVjdGl2ZSxcbn0gZnJvbSAnLi9uZ3gtZXhwbG9yZXItY29udGFpbmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBleHRlbmRTdHlsZXMgfSBmcm9tICcuLi9jb3JlL2Nzcy1oZWxwZXInO1xuaW1wb3J0IHsgRmlsZUZvbGRlciB9IGZyb20gJy4uL2NvcmUvZmlsZS1mb2xkZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RHJhZ1NlbGVjdGlvbl0nLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hEcmFnU2VsZWN0aW9uRGlyZWN0aXZlIHtcbiAgLyoqIFRoZSBjdXJyZW50IHggcG9zaXRpb24gb2YgdGhlIHNlbGVjdGlvbiBkaXYuICovXG4gIHByaXZhdGUgc3RhcnRYOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBUaGUgY3VycmVudCB5IHBvc2l0aW9uIG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBwcml2YXRlIHN0YXJ0WTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgeCBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0aW9uIGRpdi5cbiAgICogV2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBuZWdhdGl2ZSB4IHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsWDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgeSBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0aW9uIGRpdi5cbiAgICogV2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBuZWdhdGl2ZSB5IHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsWTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogV2lsbCBiZSB1c2VkIHRvIHNldCBjdXJyZW50IHNlbGVjdGVkIGVsZW1lbnRzIHRvIGNoZWNrIGhhc1xuICAgKiB0aGUgY3VycmVudCBzZWxlY3RlZCBlbGVtZW50cyBjaGFuZ2VkIHRvIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50czogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvKiogVGhlIGN1cnJlbnQgeCBwb3NpdGlvbiBmcm9tIHRoZSBmaXJlZCBldmVudC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WDogbnVtYmVyID0gMDtcblxuICAvKiogdGhlIGN1cnJlbnQgeSBwb3NpdGlvbiBmcm9tIHRoZSBmaXJlZCBldmVudC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WTogbnVtYmVyID0gMDtcblxuICAvKiogVGhlIGN1cnJlbnQgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgc2VsZWN0aW9uIGRpdi4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50V2lkdGg6IG51bWJlciA9IDA7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGNhbGN1bGF0ZWQgaGVpZ2h0IG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBwcml2YXRlIGN1cnJlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIFdpbGwgYmUgdHJ1ZSBpZiBzZWxlY3Rpb24gaW4gcHJvZ3Jlc3MuICovXG4gIHByaXZhdGUgc2VsZWN0aW5nSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VsZWN0aW9uIGJvcmRlciBjcmVhdGVkIGJ5IHRoaXMgZGlyZWN0aXZlLiAqL1xuICBwcml2YXRlIHNlbGVjdGlvbkRpdiE6IEhUTUxFbGVtZW50O1xuXG4gIC8qKiBTZXRzIHdoZXRoZXIgbmd4LWRyYWctc2VsZWN0aW9uIGNhbiBiZSB1c2VkLiAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uQWxsb3dlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFNldCBhIGN1c3RvbSBzZWxlY3Rpb24gZGl2IGBIVE1MRWxlbWVudGAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkRpdkVsZW1lbnQhOiBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgYXJlIGNoYW5nZWQuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8e1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgZGF0YTogRmlsZUZvbGRlcltdO1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyNyZWdpb24gSGVscGVyXG4gIC8qKiBDaGVja3MgaWYgYSByZWdpc3RlcmVkIGVsZW1lbnQgb2YgdHlwZSBgbmd4LWV4cGxvcmVyLWl0ZW1gIGluc2lkZSB0aGUgc2VsZWN0aW9uIGRpdiByZWN0LiAqL1xuICBjaGVja0lmRWxlbWVudEluc2lkZVJlY3QoXG4gICAgcmVjdDogYW55LFxuICAgIHNlbGVjdGlvbkJvcmRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICAoKHNlbGVjdGlvbkJvcmRlci54ID49IHJlY3QueCAmJlxuICAgICAgICBzZWxlY3Rpb25Cb3JkZXIueCA8PSByZWN0LnggKyByZWN0LndpZHRoKSB8fFxuICAgICAgICAoc2VsZWN0aW9uQm9yZGVyLnggPD0gcmVjdC54ICYmXG4gICAgICAgICAgc2VsZWN0aW9uQm9yZGVyLnggKyBzZWxlY3Rpb25Cb3JkZXIud2lkdGggPj0gcmVjdC54KSkgJiZcbiAgICAgICgoc2VsZWN0aW9uQm9yZGVyLnkgPj0gcmVjdC55ICYmXG4gICAgICAgIHNlbGVjdGlvbkJvcmRlci55IDw9IHJlY3QueSArIHJlY3QuaGVpZ2h0KSB8fFxuICAgICAgICAoc2VsZWN0aW9uQm9yZGVyLnkgPD0gcmVjdC55ICYmXG4gICAgICAgICAgc2VsZWN0aW9uQm9yZGVyLnkgKyBzZWxlY3Rpb25Cb3JkZXIuaGVpZ2h0ID49IHJlY3QueSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgaGF2ZSBjaGFuZ2VkLiAgKi9cbiAgY2hlY2tJZlNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkKGl0ZW1zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50cy5oYXMoaXRlbSkpIHtcbiAgICAgICAgLy8gZGF0YSBoYXMgY2hhbmdlZC4uLlxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWQpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudHMuc2l6ZSAhPT0gaXRlbXMubGVuZ3RoKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZClcbiAgICAgIC8vIENoYW5nZWQ/IFNvIFwicmVzZXRcIiBzZWxlY3RlZEVsZW1lbnRzXG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBuZXcgU2V0KGl0ZW1zKTtcblxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHNlbGVjdGlvbiBkaXYgaW50byBkb2N1bWVudC5ib2R5LiAqL1xuICBjcmVhdGVTZWxlY3Rpb25EaXYoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRGl2RWxlbWVudCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25EaXYgPSB0aGlzLnNlbGVjdGlvbkRpdkVsZW1lbnQ7XG5cbiAgICAgIGV4dGVuZFN0eWxlcyh0aGlzLnNlbGVjdGlvbkRpdi5zdHlsZSwge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICB3aWR0aDogJzBweCcsXG4gICAgICAgIGhlaWdodDogJzBweCcsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuc2VsZWN0aW9uRGl2LnN0eWxlLCB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIG9wYWNpdHk6ICcwLjUnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNnB4JyxcbiAgICAgICAgJ2JvcmRlci13aWR0aCc6ICcwJyxcbiAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjN2E3YWZhJyxcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2FkZDhlNicsXG4gICAgICAgIHdpZHRoOiAnMHB4JyxcbiAgICAgICAgaGVpZ2h0OiAnMHB4JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3Rpb25EaXYpO1xuICB9XG5cbiAgLyoqIE9uIGBtb3VzZW1vdmVgIHRoaXMgd2lsbCBzZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHdpZHRoIG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBzZXRTZWxlY3Rpb25EaXZQb3NpdGlvbihtb3VzZVg6IG51bWJlciwgbW91c2VZOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRYID0gbW91c2VYO1xuICAgIHRoaXMuY3VycmVudFkgPSBtb3VzZVk7XG4gICAgdGhpcy5jdXJyZW50V2lkdGggPSB0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gdGhpcy5jdXJyZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGlmICh0aGlzLmluaXRpYWxYID49IHRoaXMuY3VycmVudFgpIHtcbiAgICAgIHRoaXMuY3VycmVudFdpZHRoID0gdGhpcy5pbml0aWFsWCAtIHRoaXMuY3VycmVudFg7XG4gICAgICB0aGlzLnN0YXJ0WCA9IHRoaXMuY3VycmVudFg7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxZID49IHRoaXMuY3VycmVudFkpIHtcbiAgICAgIHRoaXMuY3VycmVudEhlaWdodCA9IHRoaXMuaW5pdGlhbFkgLSB0aGlzLmN1cnJlbnRZO1xuICAgICAgdGhpcy5zdGFydFkgPSB0aGlzLmN1cnJlbnRZO1xuICAgIH1cblxuICAgIC8vIGRpdiBpcyBub3QgdmlzaWJsZSBvbiBzdGFydFxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkRpdi5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRGl2LnN0eWxlLmRpc3BsYXkgPSAndW5zZXQnO1xuICAgIH1cbiAgICBleHRlbmRTdHlsZXModGhpcy5zZWxlY3Rpb25EaXYuc3R5bGUsIHtcbiAgICAgIGxlZnQ6IHRoaXMuc3RhcnRYICsgJ3B4JyxcbiAgICAgIHRvcDogdGhpcy5zdGFydFkgKyAncHgnLFxuICAgICAgd2lkdGg6IHRoaXMuY3VycmVudFdpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0ICsgJ3B4JyxcbiAgICB9KTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChFWFBMT1JFUl9ETkRfQ09OVEFJTkVSKVxuICAgIHByaXZhdGUgX3BhcmVudERyYWc/OiBOZ3hFeHBsb3JlckNvbnRhaW5lckRpcmVjdGl2ZVxuICApIHt9XG5cbiAgLy8jcmVnaW9uIEhvc3RMaXN0ZW5lclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvbk1vdXNlRG93bihldjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbkFsbG93ZWQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGluZ0luUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMuc3RhcnRYID0gZXYueDtcbiAgICAgIHRoaXMuc3RhcnRZID0gZXYueTtcbiAgICAgIHRoaXMuaW5pdGlhbFggPSB0aGlzLnN0YXJ0WDtcbiAgICAgIHRoaXMuaW5pdGlhbFkgPSB0aGlzLnN0YXJ0WTtcblxuICAgICAgdGhpcy5zZWxlY3RpbmdJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3JlYXRlU2VsZWN0aW9uRGl2KCk7XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkRpdlBvc2l0aW9uKHRoaXMuc3RhcnRYLCB0aGlzLnN0YXJ0WSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZU1vdmUoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RpbmdJblByb2dyZXNzIHx8ICF0aGlzLnNlbGVjdGlvbkFsbG93ZWQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0U2VsZWN0aW9uRGl2UG9zaXRpb24oZXYuY2xpZW50WCwgZXYuY2xpZW50WSk7XG5cbiAgICBpZiAodGhpcy5fcGFyZW50RHJhZykge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3BhcmVudERyYWcuZ2V0RWxlbWVudHNJbnNpZGVTZWxlY3Rpb25EaXYoXG4gICAgICAgIHRoaXMuc3RhcnRYLFxuICAgICAgICB0aGlzLnN0YXJ0WSxcbiAgICAgICAgdGhpcy5jdXJyZW50V2lkdGgsXG4gICAgICAgIHRoaXMuY3VycmVudEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogRmlsZUZvbGRlcltdID0gW107XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IF9kYXRhIG9mIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBmaWxlRm9sZGVyQ29tcG9uZW50ID0gX2RhdGEuZ2V0SG9zdENvbXBvbmVudCgpO1xuICAgICAgICAgIGlmIChmaWxlRm9sZGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChmaWxlRm9sZGVyQ29tcG9uZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNoZWNrSWZTZWxlY3RlZEVsZW1lbnRzQ2hhbmdlZChcbiAgICAgICAgICByZXN1bHQubWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGRhdGEgYXMgYW55KS5fX25nQ29udGV4dF9fO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHNDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY291bnQ6IHJlc3VsdC5sZW5ndGgsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2OiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RpbmdJblByb2dyZXNzKSB7XG4gICAgICB0aGlzLnNlbGVjdGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5zZWxlY3Rpb25EaXYpO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==