UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

266 lines (264 loc) 38.8 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Input, ContentChildren, Component, forwardRef, ViewChild, Output, EventEmitter } from '@angular/core'; import { TlView } from './view/view'; import * as i0 from "@angular/core"; const globalListeners = []; export class TlMultiView { constructor(renderer) { this.renderer = renderer; this.transitionTime = '300ms'; this.height = '100%'; this.backdroungColor = 'transparent'; this.selectedChange = new EventEmitter(); this.moving = false; this.viewBounding = []; this.currentTranslatePosition = 0; this.movement = ''; } ngOnChanges(changes) { if (!(changes['modelValue'].firstChange)) { this.changeModelValue(changes['modelValue'].currentValue); } } changeModelValue(value) { this.modelValue = value; this.selectedChange.emit(value); this.changeViewSelected(value); } ngAfterContentInit() { this.handleViewBounding(); this.listenMouseDown(); this.listenMouseUp(); this.listenMouseMove(); this.listenMouseLeave(); const selectedView = this.views.find(view => view.selected); if (!selectedView && this.views.first) { this.views.first.selected = true; } } ngAfterViewInit() { this.setWidthMultiView(); this.setWidthEachView(); this.handleSelectedView(); } setWidthEachView() { this.views.forEach((item, index) => { item.viewComponents.nativeElement.style.width = this.multiViewContainer.nativeElement.offsetWidth + 'px'; if (index > 0) { item.viewComponents.nativeElement.style.left = this.multiViewContainer.nativeElement.offsetWidth + 'px'; } }); } handleSelectedView() { if (!this.selectedView) { this.selectedView = this.viewBounding[0]; } } handleViewBounding() { this.views.forEach((item, index) => { if (!item.value) { item.value = index + 1; } this.viewBounding.push({ viewItem: item, viewPosition: Math.round(this.multiViewContainer.nativeElement.offsetWidth * (index)) }); }); this.changeViewSelected(this.modelValue); } setWidthMultiView() { this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'width', this.multiViewContainer.nativeElement.offsetWidth * this.views.toArray().length + 'px'); } listenMouseDown() { globalListeners.push(this.renderer.listen(this.multiViewContainer.nativeElement, 'mousedown', ($event) => { this.mouseClickPositionX = $event.clientX; this.moving = true; })); } listenMouseLeave() { this.renderer.listen(this.multiViewContainer.nativeElement, 'mouseleave', () => { this.moving = false; this.snapViewPosition(); }); } listenMouseUp() { globalListeners.push(this.renderer.listen(document, 'mouseup', () => { this.moving = false; this.snapViewPosition(); })); } snapViewPosition() { const translateSnap = this.multiViewTranslate.nativeElement.offsetWidth / this.views.length; this.translateAreaWidth = translateSnap * (this.views.length - 1); if (this.isDistanceMovedEnoughToSnap(this.getDistanceMoved(), translateSnap)) { this.isForwardMove() ? this.handleDragForward() : this.handleDragBackward(); } else { this.translateSection('-' + this.selectedView.viewPosition, this.transitionTime); } } getDistanceMoved() { let distanceMoved = parseInt(String(this.movementPosition).replace('-', ''), 10); if (!this.isSelectedViewIndexGreaterThanZero()) { return distanceMoved; } distanceMoved = this.isForwardMove() ? (distanceMoved - this.selectedView.viewPosition) : (this.selectedView.viewPosition - distanceMoved); return distanceMoved; } isSelectedViewIndexGreaterThanZero() { return this.viewBounding.indexOf(this.selectedView) > 0; } isDistanceMovedEnoughToSnap(distanceMoved, translateSnap) { return distanceMoved > (translateSnap / 3); } isForwardMove() { return this.movement === 'forward'; } handleDragForward() { const translatePos = parseInt(String(this.currentTranslatePosition).replace('-', ''), 10); if ((translatePos > this.selectedView.viewPosition)) { const index = this.viewBounding.indexOf(this.selectedView) + 1; if (this.viewBounding[index]) { this.changeModelValue(this.viewBounding[index].viewItem.value); } } } handleDragBackward() { const translatePos = parseInt(String(this.currentTranslatePosition).replace('-', ''), 10); if (translatePos < this.selectedView.viewPosition) { const index = this.viewBounding.indexOf(this.selectedView) - 1; if (this.viewBounding[index]) { this.changeModelValue(this.viewBounding[index].viewItem.value); } } } listenMouseMove() { globalListeners.push(this.renderer.listen(window, 'mousemove', ($event) => { if (this.moving) { this.translateMove($event); } })); } translateSection(translate, time) { this.currentTranslatePosition = translate; this.handleDuration(time); this.setTranslate(this.currentTranslatePosition); } translateMove($event, time) { this.movementPosition = this.getMousePosition($event); const translatePos = this.getTranslateCurrentPosition(); this.setMoveDirection($event); if (this.isMoving(translatePos)) { this.movementPosition = $event.movementX - translatePos; } if (this.isFirstAndFinished($event, translatePos)) { this.setTranslate('-' + this.viewBounding[0].viewPosition); return; } if (this.isLastAndFinished($event, translatePos)) { this.setTranslate('-' + this.viewBounding[this.viewBounding.length - 1].viewPosition); return; } this.handleMovingSlow(time); } getTranslateCurrentPosition() { return parseInt(String(this.currentTranslatePosition).replace('-', ''), 10); } handleMovingSlow(time) { this.handleDuration(time); this.setTranslate(this.movementPosition); this.currentTranslatePosition = this.movementPosition; } getMousePosition($event) { return this.multiViewTranslate.nativeElement.offsetLeft + $event.clientX - this.mouseClickPositionX; } setTranslate(value) { this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'transform', 'translateX(' + value + 'px)'); } isLastAndFinished($event, translatePos) { return ($event.movementX <= 0) && (translatePos >= this.translateAreaWidth); } isMoving(translatePos) { return translatePos > 0; } isFirstAndFinished($event, translatePos) { return (translatePos === 0) && ($event.movementX >= 0); } setMoveDirection($event) { $event.movementX < 0 ? this.movement = 'forward' : this.movement = 'backward'; } handleDuration(time) { time ? this.setTransitionStyle(time) : this.removeTransitionStyle(); } setTransitionStyle(time) { this.renderer.setStyle(this.multiViewTranslate.nativeElement, 'transition', 'all ' + time); } removeTransitionStyle() { this.renderer.removeStyle(this.multiViewTranslate.nativeElement, 'transition'); } selectView(view) { if (!view) { return console.warn('TlView with value [' + this.modelValue + '] not found.'); } this.viewBounding.forEach(item => item.viewItem.selected = false); this.selectedView = view; view.selected = true; } changeViewSelected(value) { if ((this.viewBounding.length > 0) && (value)) { const view = this.viewBounding.filter((item) => item.viewItem.value === value); this.selectView(view[0]); this.translateSection('-' + view[0].viewPosition, this.transitionTime); } } ngOnDestroy() { globalListeners.forEach((value) => { value(); }); } } /** @nocollapse */ TlMultiView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMultiView, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlMultiView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlMultiView, selector: "tl-multiview", inputs: { modelValue: "modelValue", transitionTime: "transitionTime", height: "height", backdroungColor: "backdroungColor" }, outputs: { selectedChange: "selectedChange" }, queries: [{ propertyName: "views", predicate: i0.forwardRef(function () { return TlView; }) }], viewQueries: [{ propertyName: "multiViewContainer", first: true, predicate: ["multiViewContainer"], descendants: true, static: true }, { propertyName: "multiViewTranslate", first: true, predicate: ["multiViewTranslate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-multiview-wrapper\">\n <div class=\"ui-multiview-container\" #multiViewContainer>\n <div class=\"ui-multiview-translate\" #multiViewTranslate [style.height]=\"height\" [style.background]=\"backdroungColor\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: ["*{-webkit-user-select:none;user-select:none;cursor:pointer}.ui-multiview-wrapper{overflow:hidden;width:100%;height:100%;touch-action:pinch-zoom}.ui-multiview-container{position:relative;overflow:visible;width:100%;height:100%}.ui-multiview-translate{position:relative;display:flex}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlMultiView, decorators: [{ type: Component, args: [{ selector: 'tl-multiview', template: "<div class=\"ui-multiview-wrapper\">\n <div class=\"ui-multiview-container\" #multiViewContainer>\n <div class=\"ui-multiview-translate\" #multiViewTranslate [style.height]=\"height\" [style.background]=\"backdroungColor\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: ["*{-webkit-user-select:none;user-select:none;cursor:pointer}.ui-multiview-wrapper{overflow:hidden;width:100%;height:100%;touch-action:pinch-zoom}.ui-multiview-container{position:relative;overflow:visible;width:100%;height:100%}.ui-multiview-translate{position:relative;display:flex}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { modelValue: [{ type: Input }], transitionTime: [{ type: Input }], height: [{ type: Input }], backdroungColor: [{ type: Input }], views: [{ type: ContentChildren, args: [forwardRef(() => TlView)] }], multiViewContainer: [{ type: ViewChild, args: ['multiViewContainer', { static: true }] }], multiViewTranslate: [{ type: ViewChild, args: ['multiViewTranslate', { static: true }] }], selectedChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGl2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvbXVsdGl2aWV3L211bHRpdmlldy50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL211bHRpdmlldy9tdWx0aXZpZXcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBQ0wsS0FBSyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWEsVUFBVSxFQUErQixTQUFTLEVBQ2hHLE1BQU0sRUFBYSxZQUFZLEVBQ2hDLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBRXJDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQU8zQixNQUFNLE9BQU8sV0FBVztJQWtDdEIsWUFBcUIsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTlCL0IsbUJBQWMsR0FBRyxPQUFPLENBQUM7UUFFekIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUVoQixvQkFBZSxHQUFHLGFBQWEsQ0FBQztRQVF2QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpFLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQU1sQiw2QkFBd0IsR0FBRyxDQUFDLENBQUM7UUFJN0IsYUFBUSxHQUFHLEVBQUUsQ0FBQztJQUlzQixDQUFDO0lBRzdDLFdBQVcsQ0FBRSxPQUFzQjtRQUNqQyxJQUFNLENBQUMsQ0FBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxZQUFZLENBQUUsQ0FBQztTQUM3RDtJQUNILENB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QkFBb0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRTlCLGNBQWM7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIE1JVCBMaWNlbnNlXG5cbiBDb3B5cmlnaHQgKGMpIDIwMTkgVGVtYWluZm8gU29mdHdhcmVcblxuIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gU09GVFdBUkUuXG4gKi9cbmltcG9ydCB7XG4gIElucHV0LCBDb250ZW50Q2hpbGRyZW4sIENvbXBvbmVudCwgUXVlcnlMaXN0LCBmb3J3YXJkUmVmLCBBZnRlckNvbnRlbnRJbml0LCBSZW5kZXJlcjIsIFZpZXdDaGlsZCwgQWZ0ZXJWaWV3SW5pdCxcbiAgT3V0cHV0LCBPbkRlc3Ryb3ksIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBUbFZpZXcgfSBmcm9tICcuL3ZpZXcvdmlldyc7XG5cbmNvbnN0IGdsb2JhbExpc3RlbmVycyA9IFtdO1xuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndGwtbXVsdGl2aWV3JyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpdmlldy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbICcuL211bHRpdmlldy5zY3NzJyBdLFxufSApXG5leHBvcnQgY2xhc3MgVGxNdWx0aVZpZXcgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgbW9kZWxWYWx1ZTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHRyYW5zaXRpb25UaW1lID0gJzMwMG1zJztcblxuICBASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSc7XG5cbiAgQElucHV0KCkgYmFja2Ryb3VuZ0NvbG9yID0gJ3RyYW5zcGFyZW50JztcblxuICBAQ29udGVudENoaWxkcmVuKCBmb3J3YXJkUmVmKCAoKSA9PiBUbFZpZXcgKSApIHZpZXdzOiBRdWVyeUxpc3Q8VGxWaWV3PjtcblxuICBAVmlld0NoaWxkKCAnbXVsdGlWaWV3Q29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0gKSBtdWx0aVZpZXdDb250YWluZXI7XG5cbiAgQFZpZXdDaGlsZCggJ211bHRpVmlld1RyYW5zbGF0ZScsIHtzdGF0aWM6IHRydWV9ICkgbXVsdGlWaWV3VHJhbnNsYXRlO1xuXG4gIEBPdXRwdXQoKSBwcml2YXRlIHNlbGVjdGVkQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcml2YXRlIG1vdmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgdmlld0JvdW5kaW5nID0gW107XG5cbiAgcHJpdmF0ZSBtb3VzZUNsaWNrUG9zaXRpb25YO1xuXG4gIHByaXZhdGUgc2VsZWN0ZWRWaWV3O1xuXG4gIHByaXZhdGUgY3VycmVudFRyYW5zbGF0ZVBvc2l0aW9uID0gMDtcblxuICBwcml2YXRlIHRyYW5zbGF0ZUFyZWFXaWR0aDtcblxuICBwcml2YXRlIG1vdmVtZW50ID0gJyc7XG5cbiAgcHJpdmF0ZSBtb3ZlbWVudFBvc2l0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIgKSB7fVxuXG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKSB7XG4gICAgaWYgKCAgISggY2hhbmdlc1snbW9kZWxWYWx1ZSddLmZpcnN0Q2hhbmdlKSkge1xuICAgICAgdGhpcy5jaGFuZ2VNb2RlbFZhbHVlKCBjaGFuZ2VzWydtb2RlbFZhbHVlJ10uY3VycmVudFZhbHVlICk7XG4gICAgfVxuICB9XG5cbiAgY2hhbmdlTW9kZWxWYWx1ZSggdmFsdWUgKSB7XG4gICAgdGhpcy5tb2RlbFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KCB2YWx1ZSApO1xuICAgIHRoaXMuY2hhbmdlVmlld1NlbGVjdGVkKCB2YWx1ZSApO1xuICB9XG5cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5oYW5kbGVWaWV3Qm91bmRpbmcoKTtcbiAgICB0aGlzLmxpc3Rlbk1vdXNlRG93bigpO1xuICAgIHRoaXMubGlzdGVuTW91c2VVcCgpO1xuICAgIHRoaXMubGlzdGVuTW91c2VNb3ZlKCk7XG4gICAgdGhpcy5saXN0ZW5Nb3VzZUxlYXZlKCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRWaWV3ID0gdGhpcy52aWV3cy5maW5kKCB2aWV3ID0+IHZpZXcuc2VsZWN0ZWQgKTtcbiAgICBpZiAoICFzZWxlY3RlZFZpZXcgJiYgdGhpcy52aWV3cy5maXJzdCApIHtcbiAgICAgIHRoaXMudmlld3MuZmlyc3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNldFdpZHRoTXVsdGlWaWV3KCk7XG4gICAgdGhpcy5zZXRXaWR0aEVhY2hWaWV3KCk7XG4gICAgdGhpcy5oYW5kbGVTZWxlY3RlZFZpZXcoKTtcbiAgfVxuXG4gIHNldFdpZHRoRWFjaFZpZXcoKSB7XG4gICAgdGhpcy52aWV3cy5mb3JFYWNoKCAoIGl0ZW0sIGluZGV4ICkgPT4ge1xuICAgICAgaXRlbS52aWV3Q29tcG9uZW50cy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XG4gICAgICBpZiAoIGluZGV4ID4gMCApIHtcbiAgICAgICAgaXRlbS52aWV3Q29tcG9uZW50cy5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLm11bHRpVmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcbiAgICAgIH1cbiAgICB9ICk7XG4gIH1cblxuICBoYW5kbGVTZWxlY3RlZFZpZXcoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVmlldykge1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLnZpZXdCb3VuZGluZ1sgMCBdO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVZpZXdCb3VuZGluZygpIHtcbiAgICB0aGlzLnZpZXdzLmZvckVhY2goICggaXRlbSwgaW5kZXggKSA9PiB7XG4gICAgICBpZiAoICFpdGVtLnZhbHVlICkge1xuICAgICAgICBpdGVtLnZhbHVlID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgICAgdGhpcy52aWV3Qm91bmRpbmcucHVzaCgge1xuICAgICAgICB2aWV3SXRlbTogaXRlbSxcbiAgICAgICAgdmlld1Bvc2l0aW9uOiBNYXRoLnJvdW5kKCB0aGlzLm11bHRpVmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogKGluZGV4KSApXG4gICAgICB9ICk7XG4gICAgfSApO1xuICAgIHRoaXMuY2hhbmdlVmlld1NlbGVjdGVkKHRoaXMubW9kZWxWYWx1ZSk7XG4gIH1cblxuICBzZXRXaWR0aE11bHRpVmlldygpIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKCB0aGlzLm11bHRpVmlld1RyYW5zbGF0ZS5uYXRpdmVFbGVtZW50LCAnd2lkdGgnLFxuICAgICAgdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCAqIHRoaXMudmlld3MudG9BcnJheSgpLmxlbmd0aCArICdweCcgKTtcbiAgfVxuXG4gIGxpc3Rlbk1vdXNlRG93bigpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIHRoaXMubXVsdGlWaWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nLCAoICRldmVudCApID0+IHtcbiAgICAgIHRoaXMubW91c2VDbGlja1Bvc2l0aW9uWCA9ICRldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgIH0gKSApO1xuICB9XG5cbiAgbGlzdGVuTW91c2VMZWF2ZSgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbiggdGhpcy5tdWx0aVZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zbmFwVmlld1Bvc2l0aW9uKCk7XG4gICAgfSApO1xuICB9XG5cbiAgbGlzdGVuTW91c2VVcCgpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMucHVzaCggdGhpcy5yZW5kZXJlci5saXN0ZW4oIGRvY3VtZW50LCAnbW91c2V1cCcsICgpID0+IHtcbiAgICAgIHRoaXMubW92aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNuYXBWaWV3UG9zaXRpb24oKTtcbiAgICB9ICkgKTtcbiAgfVxuXG4gIHNuYXBWaWV3UG9zaXRpb24oKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlU25hcCA9IHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyB0aGlzLnZpZXdzLmxlbmd0aDtcbiAgICB0aGlzLnRyYW5zbGF0ZUFyZWFXaWR0aCA9IHRyYW5zbGF0ZVNuYXAgKiAodGhpcy52aWV3cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoIHRoaXMuaXNEaXN0YW5jZU1vdmVkRW5vdWdoVG9TbmFwKHRoaXMuZ2V0RGlzdGFuY2VNb3ZlZCgpLCB0cmFuc2xhdGVTbmFwKSApIHtcbiAgICAgIHRoaXMuaXNGb3J3YXJkTW92ZSgpID8gdGhpcy5oYW5kbGVEcmFnRm9yd2FyZCgpIDogdGhpcy5oYW5kbGVEcmFnQmFja3dhcmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2xhdGVTZWN0aW9uKCAnLScgKyB0aGlzLnNlbGVjdGVkVmlldy52aWV3UG9zaXRpb24sIHRoaXMudHJhbnNpdGlvblRpbWUgKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXN0YW5jZU1vdmVkKCkge1xuICAgIGxldCBkaXN0YW5jZU1vdmVkID0gcGFyc2VJbnQoIFN0cmluZyggdGhpcy5tb3ZlbWVudFBvc2l0aW9uICkucmVwbGFjZSggJy0nLCAnJyApLCAxMCApO1xuICAgIGlmICggIXRoaXMuaXNTZWxlY3RlZFZpZXdJbmRleEdyZWF0ZXJUaGFuWmVybygpICkge1xuICAgICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQ7XG4gICAgfVxuICAgIGRpc3RhbmNlTW92ZWQgPSB0aGlzLmlzRm9yd2FyZE1vdmUoKSA/IChkaXN0YW5jZU1vdmVkIC0gdGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uKSA6XG4gICAgICAodGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uIC0gZGlzdGFuY2VNb3ZlZCk7XG4gICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQ7XG4gIH1cblxuICBpc1NlbGVjdGVkVmlld0luZGV4R3JlYXRlclRoYW5aZXJvKCkge1xuICAgIHJldHVybiB0aGlzLnZpZXdCb3VuZGluZy5pbmRleE9mKCB0aGlzLnNlbGVjdGVkVmlldyApID4gMDtcbiAgfVxuXG4gIGlzRGlzdGFuY2VNb3ZlZEVub3VnaFRvU25hcChkaXN0YW5jZU1vdmVkLCB0cmFuc2xhdGVTbmFwKSB7XG4gICAgcmV0dXJuIGRpc3RhbmNlTW92ZWQgPiAodHJhbnNsYXRlU25hcCAvIDMpO1xuICB9XG5cbiAgaXNGb3J3YXJkTW92ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tb3ZlbWVudCA9PT0gJ2ZvcndhcmQnO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0ZvcndhcmQoKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlUG9zID0gcGFyc2VJbnQoIFN0cmluZyggdGhpcy5jdXJyZW50VHJhbnNsYXRlUG9zaXRpb24gKS5yZXBsYWNlKCAnLScsICcnICksIDEwICk7XG4gICAgaWYgKCAodHJhbnNsYXRlUG9zID4gdGhpcy5zZWxlY3RlZFZpZXcudmlld1Bvc2l0aW9uKSApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aWV3Qm91bmRpbmcuaW5kZXhPZiggdGhpcy5zZWxlY3RlZFZpZXcgKSArIDE7XG4gICAgICBpZiAoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdICkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vZGVsVmFsdWUodGhpcy52aWV3Qm91bmRpbmdbIGluZGV4IF0udmlld0l0ZW0udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZURyYWdCYWNrd2FyZCgpIHtcbiAgICBjb25zdCB0cmFuc2xhdGVQb3MgPSBwYXJzZUludCggU3RyaW5nKCB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiApLnJlcGxhY2UoICctJywgJycgKSwgMTAgKTtcbiAgICBpZiAoIHRyYW5zbGF0ZVBvcyA8IHRoaXMuc2VsZWN0ZWRWaWV3LnZpZXdQb3NpdGlvbiApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aWV3Qm91bmRpbmcuaW5kZXhPZiggdGhpcy5zZWxlY3RlZFZpZXcgKSAtIDE7XG4gICAgICBpZiAoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdICkge1xuICAgICAgICB0aGlzLmNoYW5nZU1vZGVsVmFsdWUoIHRoaXMudmlld0JvdW5kaW5nWyBpbmRleCBdLnZpZXdJdGVtLnZhbHVlICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGlzdGVuTW91c2VNb3ZlKCkge1xuICAgIGdsb2JhbExpc3RlbmVycy5wdXNoKCB0aGlzLnJlbmRlcmVyLmxpc3Rlbiggd2luZG93LCAnbW91c2Vtb3ZlJywgKCAkZXZlbnQgKSA9PiB7XG4gICAgICBpZiAoIHRoaXMubW92aW5nICkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZU1vdmUoICRldmVudCApO1xuICAgICAgfVxuICAgIH0gKSApO1xuICB9XG5cbiAgdHJhbnNsYXRlU2VjdGlvbiggdHJhbnNsYXRlOiBhbnksIHRpbWU6IHN0cmluZyApIHtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiA9IHRyYW5zbGF0ZTtcbiAgICB0aGlzLmhhbmRsZUR1cmF0aW9uKCB0aW1lICk7XG4gICAgdGhpcy5zZXRUcmFuc2xhdGUoIHRoaXMuY3VycmVudFRyYW5zbGF0ZVBvc2l0aW9uICk7XG4gIH1cblxuICB0cmFuc2xhdGVNb3ZlKCAkZXZlbnQsIHRpbWU/ICkge1xuICAgIHRoaXMubW92ZW1lbnRQb3NpdGlvbiA9IHRoaXMuZ2V0TW91c2VQb3NpdGlvbiggJGV2ZW50ICk7XG4gICAgY29uc3QgdHJhbnNsYXRlUG9zID0gdGhpcy5nZXRUcmFuc2xhdGVDdXJyZW50UG9zaXRpb24oKTtcbiAgICB0aGlzLnNldE1vdmVEaXJlY3Rpb24oICRldmVudCApO1xuXG4gICAgaWYgKCB0aGlzLmlzTW92aW5nKCB0cmFuc2xhdGVQb3MgKSApIHtcbiAgICAgIHRoaXMubW92ZW1lbnRQb3NpdGlvbiA9ICRldmVudC5tb3ZlbWVudFggLSB0cmFuc2xhdGVQb3M7XG4gICAgfVxuICAgIGlmICggdGhpcy5pc0ZpcnN0QW5kRmluaXNoZWQoICRldmVudCwgdHJhbnNsYXRlUG9zICkgKSB7XG4gICAgICB0aGlzLnNldFRyYW5zbGF0ZSggJy0nICsgdGhpcy52aWV3Qm91bmRpbmdbIDAgXS52aWV3UG9zaXRpb24gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCB0aGlzLmlzTGFzdEFuZEZpbmlzaGVkKCAkZXZlbnQsIHRyYW5zbGF0ZVBvcyApICkge1xuICAgICAgdGhpcy5zZXRUcmFuc2xhdGUoICctJyArIHRoaXMudmlld0JvdW5kaW5nWyB0aGlzLnZpZXdCb3VuZGluZy5sZW5ndGggLSAxIF0udmlld1Bvc2l0aW9uICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlTW92aW5nU2xvdyggdGltZSApO1xuICB9XG5cbiAgZ2V0VHJhbnNsYXRlQ3VycmVudFBvc2l0aW9uKCkge1xuICAgIHJldHVybiBwYXJzZUludCggU3RyaW5nKCB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiApLnJlcGxhY2UoICctJywgJycgKSwgMTAgKTtcbiAgfVxuXG4gIGhhbmRsZU1vdmluZ1Nsb3coIHRpbWUgKSB7XG4gICAgdGhpcy5oYW5kbGVEdXJhdGlvbiggdGltZSApO1xuICAgIHRoaXMuc2V0VHJhbnNsYXRlKCB0aGlzLm1vdmVtZW50UG9zaXRpb24gKTtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2xhdGVQb3NpdGlvbiA9IHRoaXMubW92ZW1lbnRQb3NpdGlvbjtcbiAgfVxuXG4gIGdldE1vdXNlUG9zaXRpb24oICRldmVudCApIHtcbiAgICByZXR1cm4gdGhpcy5tdWx0aVZpZXdUcmFuc2xhdGUubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0ICsgJGV2ZW50LmNsaWVudFggLSB0aGlzLm1vdXNlQ2xpY2tQb3NpdGlvblg7XG4gIH1cblxuICBzZXRUcmFuc2xhdGUoIHZhbHVlOiBhbnkgKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSggdGhpcy5tdWx0aVZpZXdUcmFuc2xhdGUubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsICd0cmFuc2xhdGVYKCcgKyB2YWx1ZSArICdweCknICk7XG4gIH1cblxuICBpc0xhc3RBbmRGaW5pc2hlZCggJGV2ZW50OiBNb3VzZUV2ZW50LCB0cmFuc2xhdGVQb3M6IG51bWJlciApIHtcbiAgICByZXR1cm4gKCRldmVudC5tb3ZlbWVudFggPD0gMCkgJiYgKHRyYW5zbGF0ZVBvcyA+PSB0aGlzLnRyYW5zbGF0ZUFyZWFXaWR0aCk7XG4gIH1cblxuICBpc01vdmluZyggdHJhbnNsYXRlUG9zOiBudW1iZXIgKSB7XG4gICAgcmV0dXJuIHRyYW5zbGF0ZVBvcyA+IDA7XG4gIH1cblxuICBpc0ZpcnN0QW5kRmluaXNoZWQoICRldmVudDogTW91c2VFdmVudCwgdHJhbnNsYXRlUG9zOiBudW1iZXIgKSB7XG4gICAgcmV0dXJuICh0cmFuc2xhdGVQb3MgPT09IDApICYmICggJGV2ZW50Lm1vdmVtZW50WCA+PSAwICk7XG4gIH1cblxuICBzZXRNb3ZlRGlyZWN0aW9uKCAkZXZlbnQ6IE1vdXNlRXZlbnQgKSB7XG4gICAgJGV2ZW50Lm1vdmVtZW50WCA8IDAgPyB0aGlzLm1vdmVtZW50ID0gJ2ZvcndhcmQnIDogdGhpcy5tb3ZlbWVudCA9ICdiYWNrd2FyZCc7XG4gIH1cblxuICBoYW5kbGVEdXJhdGlvbiggdGltZTogc3RyaW5nICkge1xuICAgIHRpbWUgPyB0aGlzLnNldFRyYW5zaXRpb25TdHlsZSggdGltZSApIDogdGhpcy5yZW1vdmVUcmFuc2l0aW9uU3R5bGUoKTtcbiAgfVxuXG4gIHNldFRyYW5zaXRpb25TdHlsZSggdGltZTogc3RyaW5nICkge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoIHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJywgJ2FsbCAnICsgdGltZSApO1xuICB9XG5cbiAgcmVtb3ZlVHJhbnNpdGlvblN0eWxlKCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUoIHRoaXMubXVsdGlWaWV3VHJhbnNsYXRlLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uJyApO1xuICB9XG5cbiAgc2VsZWN0VmlldyggdmlldzogVGxWaWV3ICkge1xuICAgIGlmICggIXZpZXcgKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCAnVGxWaWV3IHdpdGggdmFsdWUgWycgKyB0aGlzLm1vZGVsVmFsdWUgKyAnXSBub3QgZm91bmQuJyApO1xuICAgIH1cbiAgICB0aGlzLnZpZXdCb3VuZGluZy5mb3JFYWNoKCBpdGVtID0+IGl0ZW0udmlld0l0ZW0uc2VsZWN0ZWQgPSBmYWxzZSApO1xuICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldztcbiAgICB2aWV3LnNlbGVjdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGNoYW5nZVZpZXdTZWxlY3RlZCggdmFsdWU6IHN0cmluZyApIHtcbiAgICBpZiAoICh0aGlzLnZpZXdCb3VuZGluZy5sZW5ndGggPiAwKSAmJiAodmFsdWUpICkge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0JvdW5kaW5nLmZpbHRlciggKCBpdGVtICkgPT4gaXRlbS52aWV3SXRlbS52YWx1ZSA9PT0gdmFsdWUgKTtcbiAgICAgIHRoaXMuc2VsZWN0Vmlldyggdmlld1sgMCBdICk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlY3Rpb24oICctJyArIHZpZXdbIDAgXS52aWV3UG9zaXRpb24sIHRoaXMudHJhbnNpdGlvblRpbWUgKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBnbG9iYWxMaXN0ZW5lcnMuZm9yRWFjaCggKCB2YWx1ZSApID0+IHtcbiAgICAgIHZhbHVlKCk7XG4gICAgfSApO1xuICB9XG5cbn1cblxuIiwiPGRpdiBjbGFzcz1cInVpLW11bHRpdmlldy13cmFwcGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJ1aS1tdWx0aXZpZXctY29udGFpbmVyXCIgI211bHRpVmlld0NvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1tdWx0aXZpZXctdHJhbnNsYXRlXCIgI211bHRpVmlld1RyYW5zbGF0ZSBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImJhY2tkcm91bmdDb2xvclwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19