UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

146 lines 18.9 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, Input, Output } from '@angular/core'; import { select } from 'd3-selection'; import { transition as d3Transition } from 'd3-transition'; import { zoom, zoomIdentity, zoomTransform } from 'd3-zoom'; import { Subject } from 'rxjs'; import { calculateTransform } from './core/utils'; Selection.bind('transition', d3Transition); export class NzGraphZoomDirective { constructor(element, cdr) { this.element = element; this.cdr = cdr; this.nzMinZoom = 0.1; this.nzMaxZoom = 10; this.nzTransformEvent = new EventEmitter(); this.nzZoomChange = new EventEmitter(); this.destroy$ = new Subject(); } ngAfterViewInit() { this.bind(); } ngOnDestroy() { this.unbind(); this.destroy$.next(); this.destroy$.complete(); } bind() { this.svgElement = this.element.nativeElement.querySelector('svg'); this.gZoomElement = this.element.nativeElement.querySelector('svg > g'); const { width, height } = this.element.nativeElement.getBoundingClientRect(); this.svgSelection = select(this.svgElement); this.zoomBehavior = zoom() .extent([ [0, 0], [width, height] ]) .scaleExtent([this.nzMinZoom, this.nzMaxZoom]) .on('zoom', e => { this.zoomed(e); }); this.svgSelection.call(this.zoomBehavior, zoomIdentity.translate(0, 0).scale(this.nzZoom || 1)); // Init with nzZoom this.reScale(0, this.nzZoom); } unbind() { var _a; // Destroy listener (_a = this.svgSelection) === null || _a === void 0 ? void 0 : _a.interrupt().selectAll('*').interrupt(); if (this.zoomBehavior) { this.zoomBehavior.on('end', null).on('zoom', null); } } // Methods fitCenter(duration = 0) { this.reScale(duration); } focus(id, duration = 0) { // Make sure this node is under SVG container if (!this.svgElement.getElementById(`${id}`)) { return; } const node = this.svgElement.getElementById(`${id}`); const svgRect = this.svgElement.getBoundingClientRect(); const position = this.getRelativePositionInfo(node); const svgTransform = zoomTransform(this.svgElement); const centerX = (position.topLeft.x + position.bottomRight.x) / 2; const centerY = (position.topLeft.y + position.bottomRight.y) / 2; const dx = svgRect.left + svgRect.width / 2 - centerX; const dy = svgRect.top + svgRect.height / 2 - centerY; this.svgSelection .transition() .duration(duration) .call(this.zoomBehavior.translateBy, dx / svgTransform.k, dy / svgTransform.k); } /** * Handle zoom event * @param transform */ zoomed({ transform }) { const { x, y, k } = transform; // Update g element transform this.gZoomElement.setAttribute('transform', `translate(${x}, ${y})scale(${k})`); this.nzZoom = k; this.nzZoomChange.emit(this.nzZoom); this.nzTransformEvent.emit(transform); this.cdr.markForCheck(); } /** * Scale with zoom and duration * @param duration * @param scale * @private */ reScale(duration, scale) { const transform = calculateTransform(this.svgElement, this.gZoomElement, scale); if (!transform) { return; } const { x, y, k } = transform; const zTransform = zoomIdentity.translate(x, y).scale(Math.max(k, this.nzMinZoom)); this.svgSelection .transition() .duration(duration) .call(this.zoomBehavior.transform, zTransform) .on('end.fitted', () => { this.zoomBehavior.on('end.fitted', null); }); } getRelativePositionInfo(node) { const nodeBox = node.getBBox(); const nodeCtm = node.getScreenCTM(); let pointTL = this.svgElement.createSVGPoint(); let pointBR = this.svgElement.createSVGPoint(); pointTL.x = nodeBox.x; pointTL.y = nodeBox.y; pointBR.x = nodeBox.x + nodeBox.width; pointBR.y = nodeBox.y + nodeBox.height; pointTL = pointTL.matrixTransform(nodeCtm); pointBR = pointBR.matrixTransform(nodeCtm); return { topLeft: pointTL, bottomRight: pointBR }; } } NzGraphZoomDirective.decorators = [ { type: Directive, args: [{ selector: '[nz-graph-zoom]', exportAs: 'nzGraphZoom' },] } ]; NzGraphZoomDirective.ctorParameters = () => [ { type: ElementRef }, { type: ChangeDetectorRef } ]; NzGraphZoomDirective.propDecorators = { nzZoom: [{ type: Input }], nzMinZoom: [{ type: Input }], nzMaxZoom: [{ type: Input }], nzTransformEvent: [{ type: Output }], nzZoomChange: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtem9vbS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL2dyYXBoL2dyYXBoLXpvb20uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSSxPQUFPLEVBQUUsTUFBTSxFQUFhLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLElBQUksWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQWdCLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFNM0MsTUFBTSxPQUFPLG9CQUFvQjtJQWtCL0IsWUFBb0IsT0FBbUIsRUFBVSxHQUFzQjtRQUFuRCxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoQjlELGNBQVMsR0FBRyxHQUFHLENBQUM7UUFDaEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVMLHFCQUFnQixHQUFrQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JFLGlCQUFZLEdBQXlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFVbkUsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFbUMsQ0FBQztJQUUzRSxlQUFlO1FBQ2IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMs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LE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDdEMsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDdkMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBUSxDQUFDLENBQUM7UUFDNUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBUSxDQUFDLENBQUM7UUFDNUMsT0FBTztZQUNMLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFdBQVcsRUFBRSxPQUFPO1NBQ3JCLENBQUM7SUFDSixDQUFDOzs7WUE1SUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLFFBQVEsRUFBRSxhQUFhO2FBQ3hCOzs7WUFicUQsVUFBVTtZQUF4QyxpQkFBaUI7OztxQkFldEMsS0FBSzt3QkFDTCxLQUFLO3dCQUNMLEtBQUs7K0JBRUwsTUFBTTsyQkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHNlbGVjdCwgU2VsZWN0aW9uIH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7IHRyYW5zaXRpb24gYXMgZDNUcmFuc2l0aW9uIH0gZnJvbSAnZDMtdHJhbnNpdGlvbic7XG5pbXBvcnQgeyB6b29tLCBab29tQmVoYXZpb3IsIHpvb21JZGVudGl0eSwgem9vbVRyYW5zZm9ybSB9IGZyb20gJ2QzLXpvb20nO1xuaW1wb3J0IHsgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhbGN1bGF0ZVRyYW5zZm9ybSB9IGZyb20gJy4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBOelpvb21UcmFuc2Zvcm0sIFJlbGF0aXZlUG9zaXRpb25JbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuU2VsZWN0aW9uLmJpbmQoJ3RyYW5zaXRpb24nLCBkM1RyYW5zaXRpb24pO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnotZ3JhcGgtem9vbV0nLFxuICBleHBvcnRBczogJ256R3JhcGhab29tJ1xufSlcbmV4cG9ydCBjbGFzcyBOekdyYXBoWm9vbURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIG56Wm9vbT86IG51bWJlcjtcbiAgQElucHV0KCkgbnpNaW5ab29tID0gMC4xO1xuICBASW5wdXQoKSBuek1heFpvb20gPSAxMDtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpUcmFuc2Zvcm1FdmVudDogRXZlbnRFbWl0dGVyPE56Wm9vbVRyYW5zZm9ybT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuelpvb21DaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHN2Z1NlbGVjdGlvbiE6IFNlbGVjdGlvbjxOelNhZmVBbnksIE56U2FmZUFueSwgTnpTYWZlQW55LCBOelNhZmVBbnk+O1xuICB6b29tQmVoYXZpb3IhOiBab29tQmVoYXZpb3I8TnpTYWZlQW55LCBOelNhZmVBbnk+O1xuXG4gIC8vIFRPRE9cbiAgLy8gU3VwcG9ydCBzdmcgZWxlbWVudCBvbmx5IG5vd1xuICBzdmdFbGVtZW50ITogU1ZHU1ZHRWxlbWVudDtcbiAgZ1pvb21FbGVtZW50ITogU1ZHR0VsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYmluZCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmJpbmQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBiaW5kKCk6IHZvaWQge1xuICAgIHRoaXMuc3ZnRWxlbWVudCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpIGFzIFNWR1NWR0VsZW1lbnQ7XG4gICAgdGhpcy5nWm9vbUVsZW1lbnQgPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcgPiBnJykgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLnN2Z1NlbGVjdGlvbiA9IHNlbGVjdCh0aGlzLnN2Z0VsZW1lbnQpO1xuICAgIHRoaXMuem9vbUJlaGF2aW9yID0gem9vbSgpXG4gICAgICAuZXh0ZW50KFtcbiAgICAgICAgWzAsIDBdLFxuICAgICAgICBbd2lkdGgsIGhlaWdodF1cbiAgICAgIF0pXG4gICAgICAuc2NhbGVFeHRlbnQoW3RoaXMubnpNaW5ab29tLCB0aGlzLm56TWF4Wm9vbV0pXG4gICAgICAub24oJ3pvb20nLCBlID0+IHtcbiAgICAgICAgdGhpcy56b29tZWQoZSk7XG4gICAgICB9KTtcbiAgICB0aGlzLnN2Z1NlbGVjdGlvbi5jYWxsKHRoaXMuem9vbUJlaGF2aW9yLCB6b29tSWRlbnRpdHkudHJhbnNsYXRlKDAsIDApLnNjYWxlKHRoaXMubnpab29tIHx8IDEpKTtcbiAgICAvLyBJbml0IHdpdGggbnpab29tXG4gICAgdGhpcy5yZVNjYWxlKDAsIHRoaXMubnpab29tKTtcbiAgfVxuXG4gIHVuYmluZCgpOiB2b2lkIHtcbiAgICAvLyBEZXN0cm95IGxpc3RlbmVyXG4gICAgdGhpcy5zdmdTZWxlY3Rpb24/LmludGVycnVwdCgpLnNlbGVjdEFsbCgnKicpLmludGVycnVwdCgpO1xuICAgIGlmICh0aGlzLnpvb21CZWhhdmlvcikge1xuICAgICAgdGhpcy56b29tQmVoYXZpb3Iub24oJ2VuZCcsIG51bGwpLm9uKCd6b29tJywgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWV0aG9kc1xuICBmaXRDZW50ZXIoZHVyYXRpb246IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICB0aGlzLnJlU2NhbGUoZHVyYXRpb24pO1xuICB9XG5cbiAgZm9jdXMoaWQ6IE56U2FmZUFueSwgZHVyYXRpb246IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhpcyBub2RlIGlzIHVuZGVyIFNWRyBjb250YWluZXJcbiAgICBpZiAoIXRoaXMuc3ZnRWxlbWVudC5nZXRFbGVtZW50QnlJZChgJHtpZH1gKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLnN2Z0VsZW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7aWR9YCkgYXMgU1ZHR0VsZW1lbnQ7XG4gICAgY29uc3Qgc3ZnUmVjdCA9IHRoaXMuc3ZnRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuZ2V0UmVsYXRpdmVQb3NpdGlvbkluZm8obm9kZSk7XG4gICAgY29uc3Qgc3ZnVHJhbnNmb3JtID0gem9vbVRyYW5zZm9ybSh0aGlzLnN2Z0VsZW1lbnQpO1xuXG4gICAgY29uc3QgY2VudGVyWCA9IChwb3NpdGlvbi50b3BMZWZ0LnggKyBwb3NpdGlvbi5ib3R0b21SaWdodC54KSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9IChwb3NpdGlvbi50b3BMZWZ0LnkgKyBwb3NpdGlvbi5ib3R0b21SaWdodC55KSAvIDI7XG4gICAgY29uc3QgZHggPSBzdmdSZWN0LmxlZnQgKyBzdmdSZWN0LndpZHRoIC8gMiAtIGNlbnRlclg7XG4gICAgY29uc3QgZHkgPSBzdmdSZWN0LnRvcCArIHN2Z1JlY3QuaGVpZ2h0IC8gMiAtIGNlbnRlclk7XG5cbiAgICB0aGlzLnN2Z1NlbGVjdGlvblxuICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKVxuICAgICAgLmNhbGwodGhpcy56b29tQmVoYXZpb3IudHJhbnNsYXRlQnksIGR4IC8gc3ZnVHJhbnNmb3JtLmssIGR5IC8gc3ZnVHJhbnNmb3JtLmspO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB6b29tIGV2ZW50XG4gICAqIEBwYXJhbSB0cmFuc2Zvcm1cbiAgICovXG4gIHByaXZhdGUgem9vbWVkKHsgdHJhbnNmb3JtIH06IE56U2FmZUFueSk6IHZvaWQge1xuICAgIGNvbnN0IHsgeCwgeSwgayB9ID0gdHJhbnNmb3JtO1xuICAgIC8vIFVwZGF0ZSBnIGVsZW1lbnQgdHJhbnNmb3JtXG4gICAgKHRoaXMuZ1pvb21FbGVtZW50IGFzIFNWR0dFbGVtZW50KS5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt4fSwgJHt5fSlzY2FsZSgke2t9KWApO1xuICAgIHRoaXMubnpab29tID0gaztcbiAgICB0aGlzLm56Wm9vbUNoYW5nZS5lbWl0KHRoaXMubnpab29tKTtcbiAgICB0aGlzLm56VHJhbnNmb3JtRXZlbnQuZW1pdCh0cmFuc2Zvcm0pO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYWxlIHdpdGggem9vbSBhbmQgZHVyYXRpb25cbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqIEBwYXJhbSBzY2FsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZVNjYWxlKGR1cmF0aW9uOiBudW1iZXIsIHNjYWxlPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gY2FsY3VsYXRlVHJhbnNmb3JtKHRoaXMuc3ZnRWxlbWVudCwgdGhpcy5nWm9vbUVsZW1lbnQsIHNjYWxlKTtcbiAgICBpZiAoIXRyYW5zZm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHgsIHksIGsgfSA9IHRyYW5zZm9ybTtcbiAgICBjb25zdCB6VHJhbnNmb3JtID0gem9vbUlkZW50aXR5LnRyYW5zbGF0ZSh4LCB5KS5zY2FsZShNYXRoLm1heChrLCB0aGlzLm56TWluWm9vbSkpO1xuICAgIHRoaXMuc3ZnU2VsZWN0aW9uXG4gICAgICAudHJhbnNpdGlvbigpXG4gICAgICAuZHVyYXRpb24oZHVyYXRpb24pXG4gICAgICAuY2FsbCh0aGlzLnpvb21CZWhhdmlvci50cmFuc2Zvcm0sIHpUcmFuc2Zvcm0pXG4gICAgICAub24oJ2VuZC5maXR0ZWQnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuem9vbUJlaGF2aW9yLm9uKCdlbmQuZml0dGVkJywgbnVsbCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVQb3NpdGlvbkluZm8obm9kZTogU1ZHR0VsZW1lbnQpOiBSZWxhdGl2ZVBvc2l0aW9uSW5mbyB7XG4gICAgY29uc3Qgbm9kZUJveCA9IG5vZGUuZ2V0QkJveCgpO1xuICAgIGNvbnN0IG5vZGVDdG0gPSBub2RlLmdldFNjcmVlbkNUTSgpO1xuICAgIGxldCBwb2ludFRMID0gdGhpcy5zdmdFbGVtZW50LmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgbGV0IHBvaW50QlIgPSB0aGlzLnN2Z0VsZW1lbnQuY3JlYXRlU1ZHUG9pbnQoKTtcblxuICAgIHBvaW50VEwueCA9IG5vZGVCb3gueDtcbiAgICBwb2ludFRMLnkgPSBub2RlQm94Lnk7XG4gICAgcG9pbnRCUi54ID0gbm9kZUJveC54ICsgbm9kZUJveC53aWR0aDtcbiAgICBwb2ludEJSLnkgPSBub2RlQm94LnkgKyBub2RlQm94LmhlaWdodDtcbiAgICBwb2ludFRMID0gcG9pbnRUTC5tYXRyaXhUcmFuc2Zvcm0obm9kZUN0bSEpO1xuICAgIHBvaW50QlIgPSBwb2ludEJSLm1hdHJpeFRyYW5zZm9ybShub2RlQ3RtISk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcExlZnQ6IHBvaW50VEwsXG4gICAgICBib3R0b21SaWdodDogcG9pbnRCUlxuICAgIH07XG4gIH1cbn1cbiJdfQ==