UNPKG

@radial-color-picker/angular-color-picker

Version:
155 lines 21.2 kB
import { __decorate } from "tslib"; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { Platform } from '@angular/cdk/platform'; import { AfterViewInit, Directive, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core'; import { fromEvent, merge } from 'rxjs'; import { filter, takeUntil, tap } from 'rxjs/operators'; import { calculateQuadrant, determineCSSRotationAngle } from '../helpers/helpers'; let RotatableDirective = class RotatableDirective { constructor(el, renderer, platform) { this.el = el; this.renderer = renderer; this.platform = platform; this.dragging = false; this.rotateStart = new EventEmitter(); this.rotating = new EventEmitter(); this.rotateStop = new EventEmitter(); if (this.platform.IOS || this.platform.ANDROID) { this.mouseDownEv = 'touchstart'; this.mouseUpEv = 'touchend'; this.mouseMoveEv = 'touchmove'; this.cancelEv = 'touchcancel'; } else { this.mouseDownEv = 'mousedown'; this.mouseUpEv = 'mouseup'; this.mouseMoveEv = 'mousemove'; this.cancelEv = 'mouseout'; } } get isDisabled() { return this.disable ? coerceBooleanProperty(this.disable) : false; } ngOnInit() { } ngOnChanges(changes) { if (changes.angle && changes.angle.currentValue) { // console.log(changes.angle.currentValue); const angle = changes.angle.currentValue + 90; this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${angle}deg)`); } } ngAfterViewInit() { // console.log(this.isDisabled); requestAnimationFrame(this.initialRender.bind(this)); this.rect = this.el.nativeElement.getBoundingClientRect(); this.mouseUp$ = fromEvent(this.el.nativeElement, this.mouseUpEv, { passive: true }); this.mouseOut$ = fromEvent(this.el.nativeElement, this.cancelEv, { passive: true }); this.mouseDownSub = fromEvent(this.el.nativeElement, this.mouseDownEv, { passive: true }) .pipe(filter((val) => { return this.active && !this.isDisabled; })) .subscribe((downEvent) => { this.dragging = true; this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse down', downEvent, this.rect); this.point = this.createPoint(downEvent); this.rotateStart.emit(this.point); this.applyRotation(); this.mouseMoveSub = fromEvent(this.el.nativeElement, this.mouseMoveEv).pipe(takeUntil(merge(this.mouseOut$, this.mouseUp$).pipe(tap((upEvent) => { this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse up', upEvent, this.rect); this.dragging = false; this.mouseMoveSub.unsubscribe(); this.rotateStop.emit(this.point); })))).subscribe((moveEvent) => { this.rect = this.el.nativeElement.getBoundingClientRect(); // console.log('mouse move', moveEvent, this.rect); this.point = this.createPoint(moveEvent); // console.log(this.point); this.applyRotation(); }); }); } initialRender() { const angle = this.angle + 90; this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${angle}deg)`); } rotationRender() { // console.log(this.rotation); this.renderer.setStyle(this.el.nativeElement, 'transform', `rotate(${this.rotation}deg)`); } ngOnDestroy() { if (this.mouseDownSub) { this.mouseDownSub.unsubscribe(); } if (this.mouseMoveSub) { this.mouseMoveSub.unsubscribe(); } if (this.mouseUpSub) { this.mouseUpSub.unsubscribe(); } // console.log('directive destroy'); } applyRotation() { const quadrant = calculateQuadrant(this.point); const rotation = determineCSSRotationAngle(this.point, quadrant); // console.log(rotation); this.rotating.emit(rotation); this.rotation = rotation; requestAnimationFrame(this.rotationRender.bind(this)); } createPoint(mouseEvent) { let point; if (mouseEvent.targetTouches) { point = { x: this._normalizeX(mouseEvent.targetTouches[0].clientX), y: this._normalizeY(mouseEvent.targetTouches[0].clientY) }; } else { point = { x: this._normalizeX(mouseEvent.clientX), y: this._normalizeY(mouseEvent.clientY) }; } // console.log('point', point); return point; } _normalizeX(coordX) { return coordX - this.rect.left - this.rect.width / 2; } _normalizeY(coordY) { return ((coordY - this.rect.top) * -1) + this.rect.height / 2; } }; RotatableDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: Platform } ]; __decorate([ Input() ], RotatableDirective.prototype, "angle", void 0); __decorate([ Input() ], RotatableDirective.prototype, "disable", void 0); __decorate([ Input() ], RotatableDirective.prototype, "active", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotateStart", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotating", void 0); __decorate([ Output() ], RotatableDirective.prototype, "rotateStop", void 0); RotatableDirective = __decorate([ Directive({ selector: '[rcpRotatable]' }) ], RotatableDirective); export { RotatableDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0ByYWRpYWwtY29sb3ItcGlja2VyL2FuZ3VsYXItY29sb3ItcGlja2VyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvcm90YXRhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFDTCxhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsYUFBYSxFQUNkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQTRCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUtsRixJQUFhLGtCQUFrQixHQUEvQixNQUFhLGtCQUFrQjtJQTZCN0IsWUFDVSxFQUFjLEVBQ2QsUUFBbUIsRUFDbkIsUUFBa0I7UUFGbEIsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQTlCckIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQW1CUCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFXcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxD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LENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQzthQUN6RCxDQUFDO1NBQ0g7YUFBTTtZQUNMLEtBQUssR0FBRztnQkFDTixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUN2QyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2FBQ3hDLENBQUM7U0FDSDtRQUNELCtCQUErQjtRQUMvQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxXQUFXLENBQUMsTUFBTTtRQUN4QixPQUFPLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFNO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7Q0FFRixDQUFBOztZQXJJZSxVQUFVO1lBQ0osU0FBUztZQUNULFFBQVE7O0FBbkJuQjtJQUFSLEtBQUssRUFBRTtpREFBZTtBQUNkO0lBQVIsS0FBSyxFQUFFO21EQUFrQjtBQUNqQjtJQUFSLEtBQUssRUFBRTtrREFBaUI7QUFNZjtJQUFULE1BQU0sRUFBRTt1REFBOEM7QUFDN0M7SUFBVCxNQUFNLEVBQUU7b0RBQTJDO0FBQzFDO0lBQVQsTUFBTSxFQUFFO3NEQUE2QztBQXZCM0Msa0JBQWtCO0lBSDlCLFNBQVMsQ0FBQztRQUNULFFBQVEsRUFBRSxnQkFBZ0I7S0FDM0IsQ0FBQztHQUNXLGtCQUFrQixDQW1LOUI7U0FuS1ksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlc1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgbWVyZ2UgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgY2FsY3VsYXRlUXVhZHJhbnQsIGRldGVybWluZUNTU1JvdGF0aW9uQW5nbGUgfSBmcm9tICcuLi9oZWxwZXJzL2hlbHBlcnMnO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcmNwUm90YXRhYmxlXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFJvdGF0YWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIHB1YmxpYyByb3RhdGlvbjogYW55O1xyXG4gIHB1YmxpYyBkcmFnZ2luZyA9IGZhbHNlO1xyXG4gIHB1YmxpYyBtb3VzZURvd25TdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwdWJsaWMgbW91c2VNb3ZlU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcHVibGljIG1vdXNlVXBTdWI6IFN1YnNjcmlwdGlvbjtcclxuICBwdWJsaWMgcmVjdDogYW55O1xyXG5cclxuICBwdWJsaWMgY2FuY2VsRXY6IHN0cmluZztcclxuICBwdWJsaWMgbW91c2VEb3duRXY6IHN0cmluZztcclxuICBwdWJsaWMgbW91c2VNb3ZlRXY6IHN0cmluZztcclxuICBwdWJsaWMgbW91c2VVcEV2OiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIGFuZ2xlOiBudW1iZXI7XHJcbiAgQElucHV0KCkgZGlzYWJsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhY3RpdmU6IGJvb2xlYW47XHJcblxyXG4gIGdldCBpc0Rpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZSA/IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh0aGlzLmRpc2FibGUpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIHJvdGF0ZVN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyByb3RhdGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgcm90YXRlU3RvcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIHBvaW50OiBhbnk7XHJcbiAgcHJpdmF0ZSBtb3VzZVVwJDogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gIHByaXZhdGUgbW91c2VPdXQkOiBPYnNlcnZhYmxlPGFueT47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5JT1MgfHwgdGhpcy5wbGF0Zm9ybS5BTkRST0lEKSB7XHJcbiAgICAgIHRoaXMubW91c2VEb3duRXYgPSAndG91Y2hzdGFydCc7XHJcbiAgICAgIHRoaXMubW91c2VVcEV2ID0gJ3RvdWNoZW5kJztcclxuICAgICAgdGhpcy5tb3VzZU1vdmVFdiA9ICd0b3VjaG1vdmUnO1xyXG4gICAgICB0aGlzLmNhbmNlbEV2ID0gJ3RvdWNoY2FuY2VsJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubW91c2VEb3duRXYgPSAnbW91c2Vkb3duJztcclxuICAgICAgdGhpcy5tb3VzZVVwRXYgPSAnbW91c2V1cCc7XHJcbiAgICAgIHRoaXMubW91c2VNb3ZlRXYgPSAnbW91c2Vtb3ZlJztcclxuICAgICAgdGhpcy5jYW5jZWxFdiA9ICdtb3VzZW91dCc7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMuYW5nbGUgJiYgY2hhbmdlcy5hbmdsZS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coY2hhbmdlcy5hbmdsZS5jdXJyZW50VmFsdWUpO1xyXG4gICAgICBjb25zdCBhbmdsZSA9IGNoYW5nZXMuYW5nbGUuY3VycmVudFZhbHVlICsgOTA7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndHJhbnNmb3JtJywgYHJvdGF0ZSgke2FuZ2xlfWRlZylgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNEaXNhYmxlZCk7XHJcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5pbml0aWFsUmVuZGVyLmJpbmQodGhpcykpO1xyXG4gICAgdGhpcy5yZWN0ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgdGhpcy5tb3VzZVVwJCA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMubW91c2VVcEV2LCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB0aGlzLm1vdXNlT3V0JCA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMuY2FuY2VsRXYsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLm1vdXNlRG93blN1YiA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMubW91c2VEb3duRXYsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoKHZhbCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlICYmICF0aGlzLmlzRGlzYWJsZWQ7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKChkb3duRXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlY3QgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ21vdXNlIGRvd24nLCBkb3duRXZlbnQsIHRoaXMucmVjdCk7XHJcbiAgICAgICAgdGhpcy5wb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoZG93bkV2ZW50KTtcclxuICAgICAgICB0aGlzLnJvdGF0ZVN0YXJ0LmVtaXQodGhpcy5wb2ludCk7XHJcbiAgICAgICAgdGhpcy5hcHBseVJvdGF0aW9uKCk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLm1vdXNlTW92ZVN1YiA9IGZyb21FdmVudCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMubW91c2VNb3ZlRXYpLnBpcGUoXHJcbiAgICAgICAgICB0YWtlVW50aWwobWVyZ2UodGhpcy5tb3VzZU91dCQsIHRoaXMubW91c2VVcCQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgodXBFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVjdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW91c2UgdXAnLCB1cEV2ZW50LCB0aGlzLnJlY3QpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLm1vdXNlTW92ZVN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMucm90YXRlU3RvcC5lbWl0KHRoaXMucG9pbnQpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKSlcclxuICAgICAgICApLnN1YnNjcmliZSgobW92ZUV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlY3QgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW91c2UgbW92ZScsIG1vdmVFdmVudCwgdGhpcy5yZWN0KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChtb3ZlRXZlbnQpO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5wb2ludCk7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5Um90YXRpb24oKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW5pdGlhbFJlbmRlcigpIHtcclxuICAgIGNvbnN0IGFuZ2xlID0gdGhpcy5hbmdsZSArIDkwO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCBgcm90YXRlKCR7YW5nbGV9ZGVnKWApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvdGF0aW9uUmVuZGVyKCkge1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5yb3RhdGlvbik7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGByb3RhdGUoJHt0aGlzLnJvdGF0aW9ufWRlZylgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMubW91c2VEb3duU3ViKSB7XHJcbiAgICAgIHRoaXMubW91c2VEb3duU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tb3VzZU1vdmVTdWIpIHtcclxuICAgICAgdGhpcy5tb3VzZU1vdmVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vdXNlVXBTdWIpIHtcclxuICAgICAgdGhpcy5tb3VzZVVwU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZygnZGlyZWN0aXZlIGRlc3Ryb3knKTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBhcHBseVJvdGF0aW9uKCkge1xyXG4gICAgY29uc3QgcXVhZHJhbnQgPSBjYWxjdWxhdGVRdWFkcmFudCh0aGlzLnBvaW50KTtcclxuICAgIGNvbnN0IHJvdGF0aW9uID0gZGV0ZXJtaW5lQ1NTUm90YXRpb25BbmdsZSh0aGlzLnBvaW50LCBxdWFkcmFudCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhyb3RhdGlvbik7XHJcbiAgICB0aGlzLnJvdGF0aW5nLmVtaXQocm90YXRpb24pO1xyXG4gICAgdGhpcy5yb3RhdGlvbiA9IHJvdGF0aW9uO1xyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucm90YXRpb25SZW5kZXIuYmluZCh0aGlzKSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVQb2ludChtb3VzZUV2ZW50KSB7XHJcbiAgICBsZXQgcG9pbnQ7XHJcbiAgICBpZiAobW91c2VFdmVudC50YXJnZXRUb3VjaGVzKSB7XHJcbiAgICAgIHBvaW50ID0ge1xyXG4gICAgICAgIHg6IHRoaXMuX25vcm1hbGl6ZVgobW91c2VFdmVudC50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFgpLFxyXG4gICAgICAgIHk6IHRoaXMuX25vcm1hbGl6ZVkobW91c2VFdmVudC50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFkpXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwb2ludCA9IHtcclxuICAgICAgICB4OiB0aGlzLl9ub3JtYWxpemVYKG1vdXNlRXZlbnQuY2xpZW50WCksXHJcbiAgICAgICAgeTogdGhpcy5fbm9ybWFsaXplWShtb3VzZUV2ZW50LmNsaWVudFkpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZygncG9pbnQnLCBwb2ludCk7XHJcbiAgICByZXR1cm4gcG9pbnQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9ub3JtYWxpemVYKGNvb3JkWCkge1xyXG4gICAgcmV0dXJuIGNvb3JkWCAtIHRoaXMucmVjdC5sZWZ0IC0gdGhpcy5yZWN0LndpZHRoIC8gMjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25vcm1hbGl6ZVkoY29vcmRZKSB7XHJcbiAgICByZXR1cm4gKChjb29yZFkgLSB0aGlzLnJlY3QudG9wKSAqIC0xKSArIHRoaXMucmVjdC5oZWlnaHQgLyAyO1xyXG4gIH1cclxuXHJcbn1cclxuIl19