UNPKG

angular-resize-element

Version:

An angular 4.0+ directive that allows an element to be resized

204 lines 29.3 kB
import { Directive, ElementRef, EventEmitter, HostBinding, Input, Output, Renderer2 } from '@angular/core'; import { AngularResizeElementDirection } from './angular-resize-element.enum'; export class AngularResizeElementDirective { constructor(elementRef, renderer2) { this.elementRef = elementRef; this.renderer2 = renderer2; this.applyClass = 'resizing'; this.resizeStart = new EventEmitter(); this.resize = new EventEmitter(); this.resizeEnd = new EventEmitter(); this.listenMouseDownEvent(); } ngOnChanges(changes) { if (changes.useDrag) { this.listenMouseDownEvent(); } } ngOnDestroy() { if (this.mouseClickListener) { this.mouseClickListener(); } if (this.mouseUpListener) { this.mouseUpListener(); } if (this.mouseMoveListener) { this.mouseMoveListener(); } } listenMouseDownEvent() { if (this.mouseClickListener) { this.mouseClickListener(); } const event = this.useDrag ? 'dragstart' : 'mousedown'; this.mouseClickListener = this.renderer2.listen(this.elementRef.nativeElement, event, evt => this.onMouseDown(evt)); } onMouseDown(evt) { evt.preventDefault(); this.setOriginalData(evt); this.resizeStart.emit(this.generateValuesForEvent(evt)); this.mouseUpListener = this.renderer2.listen('document', 'mouseup', event => this.onMouseUp(event)); this.mouseMoveListener = this.renderer2.listen('document', 'mousemove', event => this.onMouseMove(event)); this.renderer2.addClass(this.targetNativeElement, this.applyClass); } onMouseUp(evt) { const eventValues = this.generateValuesForEvent(evt); this.resize.emit(eventValues); this.mouseMoveListener(); this.mouseUpListener(); this.renderer2.removeClass(this.targetNativeElement, this.applyClass); this.resizeEnd.emit(eventValues); } onMouseMove(evt) { this.resize.emit(this.generateValuesForEvent(evt)); } setOriginalData(originalEvent) { this.originalEvent = originalEvent; if (this.targetElement) { const dataSource = this.targetNativeElement; this.targetElementWidthValue = dataSource.offsetWidth; this.targetElementHeightValue = dataSource.offsetHeight; this.targetElementTopValue = dataSource.offsetTop; this.targetElementLeftValue = dataSource.offsetLeft; } else { this.targetElementWidthValue = 0; this.targetElementHeightValue = 0; this.targetElementTopValue = 0; this.targetElementLeftValue = 0; } } get targetNativeElement() { return this.targetElement instanceof ElementRef ? this.targetElement.nativeElement : this.targetElement; } generateValuesForEvent(evt) { const originalXValue = this.originalEvent.clientX; const originalYValue = this.originalEvent.clientY; let diffWidthValue = evt.clientX - originalXValue; let diffHeightValue = evt.clientY - originalYValue; let diffTopValue = diffHeightValue; let diffLeftValue = diffWidthValue; switch (this.direction) { case AngularResizeElementDirection.TOP: { diffHeightValue *= -1; diffWidthValue = 0; diffLeftValue = 0; break; } case AngularResizeElementDirection.TOP_RIGHT: { diffHeightValue *= -1; diffLeftValue = 0; break; } case AngularResizeElementDirection.RIGHT: { diffHeightValue = 0; diffTopValue = 0; diffLeftValue = 0; break; } case AngularResizeElementDirection.BOTTOM_RIGHT: { diffTopValue = 0; diffLeftValue = 0; break; } case AngularResizeElementDirection.BOTTOM: { diffWidthValue = 0; diffLeftValue = 0; diffTopValue = 0; break; } case AngularResizeElementDirection.BOTTOM_LEFT: { diffWidthValue *= -1; diffTopValue = 0; break; } case AngularResizeElementDirection.LEFT: { diffWidthValue *= -1; diffHeightValue = 0; diffTopValue = 0; break; } case AngularResizeElementDirection.TOP_LEFT: { diffHeightValue *= -1; diffWidthValue *= -1; } } let currentWidthValue = this.targetElementWidthValue + diffWidthValue; let currentHeightValue = this.targetElementHeightValue + diffHeightValue; if (this.proportionalResize) { if (currentWidthValue > currentHeightValue) { currentWidthValue = currentHeightValue; } else { currentHeightValue = currentWidthValue; } } if (currentHeightValue <= 1) { diffTopValue += currentHeightValue; } if (currentWidthValue <= 1) { diffLeftValue += currentWidthValue; } if (currentWidthValue <= 0) { currentWidthValue = 0; } if (currentHeightValue <= 0) { currentHeightValue = 0; } let currentTopValue = this.targetElementTopValue + diffTopValue; let currentLeftValue = this.targetElementLeftValue + diffLeftValue; if (this.rect) { if (currentTopValue < this.rect.top) { currentHeightValue = this.targetElementHeightValue + this.targetElementTopValue - this.rect.top; currentTopValue = this.rect.top; } if (currentHeightValue + currentTopValue > this.rect.height) { currentHeightValue = this.rect.height - currentTopValue; } if (currentLeftValue < this.rect.left) { currentWidthValue = this.targetElementWidthValue + this.targetElementLeftValue - this.rect.left; currentLeftValue = this.rect.left; } if (currentWidthValue + currentLeftValue > this.rect.width) { currentWidthValue = this.rect.width - currentLeftValue; } } return { originalEvent: this.originalEvent, currentWidthValue, currentHeightValue, currentTopValue, currentLeftValue, originalWidthValue: this.targetElementWidthValue, originalHeightValue: this.targetElementHeightValue, originalTopValue: this.targetElementTopValue, originalLeftValue: this.targetElementLeftValue, differenceWidthValue: currentWidthValue - this.targetElementWidthValue, differenceHeightValue: currentHeightValue - this.targetElementHeightValue, differenceTopValue: currentTopValue - this.targetElementTopValue, differenceLeftValue: currentLeftValue - this.targetElementLeftValue, direction: this.direction, }; } } AngularResizeElementDirective.decorators = [ { type: Directive, args: [{ selector: '[resize], [resizeStart], [resizeEnd]' },] } ]; AngularResizeElementDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 } ]; AngularResizeElementDirective.propDecorators = { targetElement: [{ type: Input }], direction: [{ type: Input }], proportionalResize: [{ type: Input }], rect: [{ type: Input }], applyClass: [{ type: Input }], resizeStart: [{ type: Output }], resize: [{ type: Output }], resizeEnd: [{ type: Output }], useDrag: [{ type: Input }, { type: HostBinding, args: ['attr.draggable',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZXNpemUtZWxlbWVudC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiRDovYW5ndWxhci1saWJzL3Byb2plY3RzL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQvc3JjLyIsInNvdXJjZXMiOlsibGliL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVosTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFLNUUsTUFBTSxPQUFPLDZCQUE2QjtJQXlDdEMsWUFBNkIsVUFBc0IsRUFDdEIsU0FBb0I7UUFEcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBaEIxQyxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBR2YsZ0JBQVcsR0FBNEMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxRSxXQUFNLEdBQTRDLElBQUksWUFBWSxFQUFFLENBQUM7UUFHckUsY0FBUyxHQUE0QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBU3BGLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDckMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3QjtRQUNELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLElBQUks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SUFBSSxDQUFDLElBQUksQ0FBQzthQUNyQztZQUNELElBQUksaUJBQWlCLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3hELGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLGdCQUFnQixDQUFDO2FBQzFEO1NBQ0o7UUFFRCxPQUFPO1lBQ0gsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGlCQUFpQjtZQUNqQixrQkFBa0I7WUFDbEIsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCO1lBQ2hELG1CQUFtQixFQUFFLElBQUksQ0FBQyx3QkFBd0I7WUFDbEQsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUM1QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQzlDLG9CQUFvQixFQUFFLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUI7WUFDdEUscUJBQXFCLEVBQUUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QjtZQUN6RSxrQkFBa0IsRUFBRSxlQUFlLEdBQUcsSUFBSSxDQUFDLHFCQUFxQjtZQUNoRSxtQkFBbUIsRUFBRSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztTQUM1QixDQUFDO0lBQ04sQ0FBQzs7O1lBdFBKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsc0NBQXNDO2FBQ25EOzs7WUFmRyxVQUFVO1lBT1YsU0FBUzs7OzRCQXNCUixLQUFLO3dCQUdMLEtBQUs7aUNBR0wsS0FBSzttQkFHTCxLQUFLO3lCQUdMLEtBQUs7MEJBR0wsTUFBTTtxQkFHTixNQUFNO3dCQUdOLE1BQU07c0JBR04sS0FBSyxZQUNMLFdBQVcsU0FBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgRGlyZWN0aXZlLFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3RCaW5kaW5nLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPdXRwdXQsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QW5ndWxhclJlc2l6ZUVsZW1lbnRFdmVudCwgUG9zaXRpb259IGZyb20gJy4vYW5ndWxhci1yZXNpemUtZWxlbWVudC1ldmVudC5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0FuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9ufSBmcm9tICcuL2FuZ3VsYXItcmVzaXplLWVsZW1lbnQuZW51bSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW3Jlc2l6ZV0sIFtyZXNpemVTdGFydF0sIFtyZXNpemVFbmRdJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclJlc2l6ZUVsZW1lbnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIG1vdXNlQ2xpY2tMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgbW91c2VVcExpc3RlbmVyOiAoKSA9PiB2b2lkO1xyXG4gICAgcHJpdmF0ZSBtb3VzZU1vdmVMaXN0ZW5lcjogKCkgPT4gdm9pZDtcclxuXHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRXaWR0aFZhbHVlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRIZWlnaHRWYWx1ZTogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgdGFyZ2V0RWxlbWVudFRvcFZhbHVlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIHRhcmdldEVsZW1lbnRMZWZ0VmFsdWU6IG51bWJlcjtcclxuXHJcbiAgICBwcml2YXRlIG9yaWdpbmFsRXZlbnQ6IE1vdXNlRXZlbnQ7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXJlY3Rpb246IEFuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcHJvcG9ydGlvbmFsUmVzaXplOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVjdDogUG9zaXRpb247XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhcHBseUNsYXNzID0gJ3Jlc2l6aW5nJztcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyByZWFkb25seSByZXNpemVTdGFydDogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2l6ZTogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc2l6ZUVuZDogRXZlbnRFbWl0dGVyPEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZHJhZ2dhYmxlJylcclxuICAgIHB1YmxpYyB1c2VEcmFnO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIyOiBSZW5kZXJlcjJcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMubGlzdGVuTW91c2VEb3duRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLnVzZURyYWcpIHtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5Nb3VzZURvd25FdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW91c2VDbGlja0xpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW91c2VDbGlja0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1vdXNlVXBMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1vdXNlVXBMaXN0ZW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5tb3VzZU1vdmVMaXN0ZW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLm1vdXNlTW92ZUxpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBsaXN0ZW5Nb3VzZURvd25FdmVudCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5tb3VzZUNsaWNrTGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5tb3VzZUNsaWNrTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy51c2VEcmFnID8gJ2RyYWdzdGFydCcgOiAnbW91c2Vkb3duJztcclxuICAgICAgICB0aGlzLm1vdXNlQ2xpY2tMaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZXZlbnQsIGV2dCA9PiB0aGlzLm9uTW91c2VEb3duKGV2dCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbk1vdXNlRG93bihldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRPcmlnaW5hbERhdGEoZXZ0KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNpemVTdGFydC5lbWl0KHRoaXMuZ2VuZXJhdGVWYWx1ZXNGb3JFdmVudChldnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb3VzZVVwTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNldXAnLCBldmVudCA9PiB0aGlzLm9uTW91c2VVcChldmVudCkpO1xyXG4gICAgICAgIHRoaXMubW91c2VNb3ZlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyMi5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlbW92ZScsIGV2ZW50ID0+IHRoaXMub25Nb3VzZU1vdmUoZXZlbnQpKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5hZGRDbGFzcyh0aGlzLnRhcmdldE5hdGl2ZUVsZW1lbnQsIHRoaXMuYXBwbHlDbGFzcyk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByaXZhdGUgb25Nb3VzZVVwKGV2dDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50VmFsdWVzID0gdGhpcy5nZW5lcmF0ZVZhbHVlc0ZvckV2ZW50KGV2dCk7XHJcbiAgICAgICAgdGhpcy5yZXNpemUuZW1pdChldmVudFZhbHVlcyk7XHJcbiAgICAgICAgdGhpcy5tb3VzZU1vdmVMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMubW91c2VVcExpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnJlbW92ZUNsYXNzKHRoaXMudGFyZ2V0TmF0aXZlRWxlbWVudCwgdGhpcy5hcHBseUNsYXNzKTtcclxuICAgICAgICB0aGlzLnJlc2l6ZUVuZC5lbWl0KGV2ZW50VmFsdWVzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBvbk1vdXNlTW92ZShldnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZS5lbWl0KHRoaXMuZ2VuZXJhdGVWYWx1ZXNGb3JFdmVudChldnQpKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSBzZXRPcmlnaW5hbERhdGEob3JpZ2luYWxFdmVudDogTW91c2VFdmVudCkge1xyXG4gICAgICAgIHRoaXMub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRhcmdldEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHRoaXMudGFyZ2V0TmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50V2lkdGhWYWx1ZSA9IGRhdGFTb3VyY2Uub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudEhlaWdodFZhbHVlID0gZGF0YVNvdXJjZS5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudFRvcFZhbHVlID0gZGF0YVNvdXJjZS5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSA9IGRhdGFTb3VyY2Uub2Zmc2V0TGVmdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHRhcmdldE5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50UmVmID8gdGhpcy50YXJnZXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLnRhcmdldEVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVZhbHVlc0ZvckV2ZW50KGV2dDogTW91c2VFdmVudCk6IEFuZ3VsYXJSZXNpemVFbGVtZW50RXZlbnQge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsWFZhbHVlID0gdGhpcy5vcmlnaW5hbEV2ZW50LmNsaWVudFg7XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxZVmFsdWUgPSB0aGlzLm9yaWdpbmFsRXZlbnQuY2xpZW50WTtcclxuXHJcbiAgICAgICAgbGV0IGRpZmZXaWR0aFZhbHVlID0gZXZ0LmNsaWVudFggLSBvcmlnaW5hbFhWYWx1ZTtcclxuICAgICAgICBsZXQgZGlmZkhlaWdodFZhbHVlID0gZXZ0LmNsaWVudFkgLSBvcmlnaW5hbFlWYWx1ZTtcclxuICAgICAgICBsZXQgZGlmZlRvcFZhbHVlID0gZGlmZkhlaWdodFZhbHVlO1xyXG4gICAgICAgIGxldCBkaWZmTGVmdFZhbHVlID0gZGlmZldpZHRoVmFsdWU7XHJcblxyXG4gICAgICAgIHN3aXRjaCAodGhpcy5kaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1A6IHtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGRpZmZMZWZ0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1BfUklHSFQ6IHtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZMZWZ0VmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5SSUdIVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZkhlaWdodFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGRpZmZUb3BWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmTGVmdFZhbHVlID0gMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgQW5ndWxhclJlc2l6ZUVsZW1lbnREaXJlY3Rpb24uQk9UVE9NX1JJR0hUOiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIEFuZ3VsYXJSZXNpemVFbGVtZW50RGlyZWN0aW9uLkJPVFRPTToge1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5CT1RUT01fTEVGVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgKj0gLTE7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5MRUZUOiB7XHJcbiAgICAgICAgICAgICAgICBkaWZmV2lkdGhWYWx1ZSAqPSAtMTtcclxuICAgICAgICAgICAgICAgIGRpZmZIZWlnaHRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgICAgICBkaWZmVG9wVmFsdWUgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBBbmd1bGFyUmVzaXplRWxlbWVudERpcmVjdGlvbi5UT1BfTEVGVDoge1xyXG4gICAgICAgICAgICAgICAgZGlmZkhlaWdodFZhbHVlICo9IC0xO1xyXG4gICAgICAgICAgICAgICAgZGlmZldpZHRoVmFsdWUgKj0gLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUgKyBkaWZmV2lkdGhWYWx1ZTtcclxuICAgICAgICBsZXQgY3VycmVudEhlaWdodFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgKyBkaWZmSGVpZ2h0VmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByb3BvcnRpb25hbFJlc2l6ZSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoVmFsdWUgPiBjdXJyZW50SGVpZ2h0VmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRXaWR0aFZhbHVlID0gY3VycmVudEhlaWdodFZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodFZhbHVlID0gY3VycmVudFdpZHRoVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgPD0gMSkge1xyXG4gICAgICAgICAgICBkaWZmVG9wVmFsdWUgKz0gY3VycmVudEhlaWdodFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGN1cnJlbnRXaWR0aFZhbHVlIDw9IDEpIHtcclxuICAgICAgICAgICAgZGlmZkxlZnRWYWx1ZSArPSBjdXJyZW50V2lkdGhWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50V2lkdGhWYWx1ZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRXaWR0aFZhbHVlID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgPD0gMCkge1xyXG4gICAgICAgICAgICBjdXJyZW50SGVpZ2h0VmFsdWUgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRUb3BWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFRvcFZhbHVlICsgZGlmZlRvcFZhbHVlO1xyXG4gICAgICAgIGxldCBjdXJyZW50TGVmdFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50TGVmdFZhbHVlICsgZGlmZkxlZnRWYWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVjdCkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFRvcFZhbHVlIDwgdGhpcy5yZWN0LnRvcCkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudEhlaWdodFZhbHVlID0gdGhpcy50YXJnZXRFbGVtZW50SGVpZ2h0VmFsdWUgKyB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSAtIHRoaXMucmVjdC50b3A7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50VG9wVmFsdWUgPSB0aGlzLnJlY3QudG9wO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50SGVpZ2h0VmFsdWUgKyBjdXJyZW50VG9wVmFsdWUgPiB0aGlzLnJlY3QuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0VmFsdWUgPSB0aGlzLnJlY3QuaGVpZ2h0IC0gY3VycmVudFRvcFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3VycmVudExlZnRWYWx1ZSA8IHRoaXMucmVjdC5sZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUgKyB0aGlzLnRhcmdldEVsZW1lbnRMZWZ0VmFsdWUgLSB0aGlzLnJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRMZWZ0VmFsdWUgPSB0aGlzLnJlY3QubGVmdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoY3VycmVudFdpZHRoVmFsdWUgKyBjdXJyZW50TGVmdFZhbHVlID4gdGhpcy5yZWN0LndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGhWYWx1ZSA9IHRoaXMucmVjdC53aWR0aCAtIGN1cnJlbnRMZWZ0VmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IHRoaXMub3JpZ2luYWxFdmVudCxcclxuICAgICAgICAgICAgY3VycmVudFdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHRWYWx1ZSxcclxuICAgICAgICAgICAgY3VycmVudFRvcFZhbHVlLFxyXG4gICAgICAgICAgICBjdXJyZW50TGVmdFZhbHVlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbFdpZHRoVmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudFdpZHRoVmFsdWUsXHJcbiAgICAgICAgICAgIG9yaWdpbmFsSGVpZ2h0VmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudEhlaWdodFZhbHVlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbFRvcFZhbHVlOiB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSxcclxuICAgICAgICAgICAgb3JpZ2luYWxMZWZ0VmFsdWU6IHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZVdpZHRoVmFsdWU6IGN1cnJlbnRXaWR0aFZhbHVlIC0gdGhpcy50YXJnZXRFbGVtZW50V2lkdGhWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZUhlaWdodFZhbHVlOiBjdXJyZW50SGVpZ2h0VmFsdWUgLSB0aGlzLnRhcmdldEVsZW1lbnRIZWlnaHRWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZVRvcFZhbHVlOiBjdXJyZW50VG9wVmFsdWUgLSB0aGlzLnRhcmdldEVsZW1lbnRUb3BWYWx1ZSxcclxuICAgICAgICAgICAgZGlmZmVyZW5jZUxlZnRWYWx1ZTogY3VycmVudExlZnRWYWx1ZSAtIHRoaXMudGFyZ2V0RWxlbWVudExlZnRWYWx1ZSxcclxuICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=