UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

233 lines (232 loc) 19.2 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import { Subject, merge, map, takeUntil } from 'rxjs'; import { ContextChartService } from '../../chart.service'; import { Orientation } from '../../types'; import * as i0 from "@angular/core"; import * as i1 from "../../chart.service"; const _c0 = ["aclYAxisTicks", ""]; function YAxisTicksComponent_ng_container_0__svg_g_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 4); i0.ɵɵtext(2); i0.ɵɵpipe(3, "pure"); i0.ɵɵelementEnd(); i0.ɵɵelement(4, "line", 5)(5, "line", 6); i0.ɵɵelementEnd(); } if (rf & 2) { const tick_r1 = ctx.$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("y", tick_r1.y); i0.ɵɵadvance(); i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 8, tick_r1.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " "); i0.ɵɵadvance(2); i0.ɵɵattribute("y1", tick_r1.y)("y2", tick_r1.y); i0.ɵɵadvance(); i0.ɵɵattribute("x2", ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.width)("y1", tick_r1.y)("y2", tick_r1.y); } } function YAxisTicksComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, YAxisTicksComponent_ng_container_0__svg_g_1_Template, 6, 11, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(2, "g"); i0.ɵɵelement(3, "path", 3); i0.ɵɵelementEnd(); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵproperty("ngForOf", ctx_r1.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r1.yAxisLine); } } function YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelement(0, "line", 9); } if (rf & 2) { const tick_r3 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵattribute("x1", tick_r3.x)("x2", tick_r3.x)("y1", 0)("y2", -(ctx_r1.context == null ? null : ctx_r1.context.chartView == null ? null : ctx_r1.context.chartView.height)); } } function YAxisTicksComponent_ng_template_1__svg_g_0_Template(rf, ctx) { if (rf & 1) { i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "text", 7); i0.ɵɵtext(2); i0.ɵɵpipe(3, "pure"); i0.ɵɵelementEnd(); i0.ɵɵtemplate(4, YAxisTicksComponent_ng_template_1__svg_g_0__svg_line_4_Template, 1, 4, "line", 8); i0.ɵɵelementEnd(); } if (rf & 2) { const tick_r3 = ctx.$implicit; const i_r4 = ctx.index; const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(); i0.ɵɵattribute("x", i_r4 === 0 && ctx_r1.suffix ? tick_r3.x - 5 : tick_r3.x)("y", tick_r3.y + 16)("text-anchor", ctx_r1.textAnchor); i0.ɵɵadvance(); i0.ɵɵtextInterpolate2(" ", i0.ɵɵpipeBind2(3, 6, tick_r3.value, ctx_r1.conversionMaximum), "", ctx_r1.suffix, " "); i0.ɵɵadvance(2); i0.ɵɵproperty("ngIf", i_r4 !== ctx_r1.ticks.length - 1); } } function YAxisTicksComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, YAxisTicksComponent_ng_template_1__svg_g_0_Template, 5, 9, "g", 2); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(1, "g"); i0.ɵɵelement(2, "path", 3); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵproperty("ngForOf", ctx_r1.ticks); i0.ɵɵadvance(2); i0.ɵɵattribute("d", ctx_r1.xAxisLine); } } export class YAxisTicksComponent { get yAxisLine() { return `M${0} ${0}L${0} ${this.context.chartView.height}Z`; } get xAxisLine() { const { width } = this.context.chartView; return `M0 0L${width} 0Z`; } getTicks() { const ticks = this.context.y.ticks(this.getMaxTicks(this.intervalWidth)); return ticks.map(value => { const res = this.context.y(value); return { value, y: this.context.horizontal ? 0 : res, x: res, }; }); } getMaxTicks(tickHeight) { const height = this.context.horizontal ? this.context.chartView.width : this.context.chartView.height; return Math.floor(height / tickHeight); } constructor(context, cd) { this.context = context; this.cd = cd; this.intervalWidth = 40; this.orientation = Orientation; this.textAnchor = 'middle'; this.destroy$$ = new Subject(); } ngOnInit() { this.ticks = this.getTicks(); this.cd.detectChanges(); merge(this.context.seriesData$, this.context.legendChange$$) .pipe(takeUntil(this.destroy$$), map(() => this.getTicks())) .subscribe(res => { this.ticks = res; this.cd.detectChanges(); }); } conversionMaximum(value) { const unit = 'k'; if (value >= 1000) { const num = +(value / 1000).toFixed(2); return `${num}${unit}`; } return value; } ngOnDestroy() { this.destroy$$.next(); } static { this.ɵfac = function YAxisTicksComponent_Factory(t) { return new (t || YAxisTicksComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: YAxisTicksComponent, selectors: [["g", "aclYAxisTicks", ""]], inputs: { intervalWidth: "intervalWidth", suffix: "suffix" }, attrs: _c0, decls: 3, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], [4, "ngFor", "ngForOf"], ["stroke", "#ccd6eb", "fill", "none"], ["x", "-8", "fill", "#666", "text-anchor", "end", "font-size", "11", "alignment-baseline", "middle"], ["x1", "-4", "x2", "0", "stroke-width", "1", "stroke", "#ccd6eb"], ["x1", "0", "stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"], ["fill", "#666", "font-size", "11"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8", 4, "ngIf"], ["stroke-width", "1", "stroke-dasharray", "4 1", "stroke", "#e8e8e8"]], template: function YAxisTicksComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, YAxisTicksComponent_ng_container_0_Template, 4, 2, "ng-container", 1)(1, YAxisTicksComponent_ng_template_1_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor); } if (rf & 2) { const elseTemplate_r5 = i0.ɵɵreference(2); i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r5); } }, encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(YAxisTicksComponent, [{ type: Component, args: [{ // eslint-disable-next-line @angular-eslint/component-selector selector: 'g[aclYAxisTicks]', template: ` <ng-container *ngIf=" context.barOptions.orientation === orientation.VERTICAL; else elseTemplate " > <svg:g *ngFor="let tick of ticks"> <text x="-8" [attr.y]="tick.y" fill="#666" text-anchor="end" font-size="11" alignment-baseline="middle" > {{ tick.value | pure: conversionMaximum }}{{ suffix }} </text> <line x1="-4" x2="0" [attr.y1]="tick.y" [attr.y2]="tick.y" stroke-width="1" stroke="#ccd6eb" ></line> <line x1="0" [attr.x2]="context?.chartView?.width" [attr.y1]="tick.y" [attr.y2]="tick.y" stroke-width="1" stroke-dasharray="4 1" stroke="#e8e8e8" ></line> </svg:g> <svg:g> <path [attr.d]="yAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-container> <ng-template #elseTemplate> <svg:g *ngFor="let tick of ticks; let i = index"> <text [attr.x]="i === 0 && suffix ? tick.x - 5 : tick.x" [attr.y]="tick.y + 16" fill="#666" [attr.text-anchor]="textAnchor" font-size="11" > {{ tick.value | pure: conversionMaximum }}{{ suffix }} </text> <line *ngIf="i !== ticks.length - 1" [attr.x1]="tick.x" [attr.x2]="tick.x" [attr.y1]="0" [attr.y2]="-context?.chartView?.height" stroke-width="1" stroke-dasharray="4 1" stroke="#e8e8e8" ></line> </svg:g> <svg:g> <path [attr.d]="xAxisLine" stroke="#ccd6eb" fill="none" /> </svg:g> </ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, }] }], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { intervalWidth: [{ type: Input }], suffix: [{ type: Input }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(YAxisTicksComponent, { className: "YAxisTicksComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieS1heGlzLXRpY2tzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vYXhpcy95LWF4aXMtdGlja3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBR04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7SUFhbEMsQUFERix5QkFBa0MsY0FRL0I7SUFDQyxZQUNGOztJQUFBLGlCQUFPO0lBU1AsQUFSQSwwQkFPUSxjQVNBO0lBQ1YsaUJBQVE7Ozs7SUF6QkosY0FBaUI7O0lBTWpCLGNBQ0Y7SUFERSxpSEFDRjtJQUlFLGVBQWtCOztJQU9sQixjQUFxQzs7OztJQTNCM0MsNkJBS0M7SUFDQyxxRkFBa0M7O0lBNkJsQyx5QkFBTztJQUNMLDBCQUlFO0lBQ0osaUJBQVE7Ozs7SUFuQ2dCLGNBQVE7SUFBUixzQ0FBUTtJQStCNUIsZUFBb0I7Ozs7O0lBa0J0QiwwQkFTUTs7Ozs7Ozs7SUFsQlIsQUFERix5QkFBaUQsY0FPOUM7SUFDQyxZQUNGOztJQUFBLGlCQUFPO0lBQ1Asa0dBU0M7SUFDSCxpQkFBUTs7Ozs7SUFsQkosY0FBa0Q7O0lBTWxELGNBQ0Y7SUFERSxpSEFDRjtJQUVHLGVBQTRCO0lBQTVCLHVEQUE0Qjs7O0lBWGpDLG1GQUFpRDs7SUFxQmpELHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7O0lBM0JnQixzQ0FBVTtJQXVCOUIsZUFBb0I7OztB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Q0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztvRkFyRVUsbUJBQW1CO29FQUFuQixtQkFBbUI7WUFqQzVCLEFBNUNBLHNGQUtDLHdHQXVDMEI7OztZQXpDZCxBQUZWLHNGQUVVLDZCQUVqQjs7O2lGQXdFYSxtQkFBbUI7Y0FqRi9CLFNBQVM7ZUFBQztnQkFDVCw4REFBOEQ7Z0JBQzlELFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkVUO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO29GQUVVLGFBQWE7a0JBQXJCLEtBQUs7WUFFRyxNQUFNO2tCQUFkLEtBQUs7O2tGQUhLLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgbWVyZ2UsIG1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRleHRDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWVudGF0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFlBeGlzVGlja3NdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBjb250ZXh0LmJhck9wdGlvbnMub3JpZW50YXRpb24gPT09IG9yaWVudGF0aW9uLlZFUlRJQ0FMO1xuICAgICAgICBlbHNlIGVsc2VUZW1wbGF0ZVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8c3ZnOmcgKm5nRm9yPVwibGV0IHRpY2sgb2YgdGlja3NcIj5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICB4PVwiLThcIlxuICAgICAgICAgIFthdHRyLnldPVwidGljay55XCJcbiAgICAgICAgICBmaWxsPVwiIzY2NlwiXG4gICAgICAgICAgdGV4dC1hbmNob3I9XCJlbmRcIlxuICAgICAgICAgIGZvbnQtc2l6ZT1cIjExXCJcbiAgICAgICAgICBhbGlnbm1lbnQtYmFzZWxpbmU9XCJtaWRkbGVcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGljay52YWx1ZSB8IHB1cmU6IGNvbnZlcnNpb25NYXhpbXVtIH19e3sgc3VmZml4IH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIi00XCJcbiAgICAgICAgICB4Mj1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cInRpY2sueVwiXG4gICAgICAgICAgW2F0dHIueTJdPVwidGljay55XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICBzdHJva2U9XCIjY2NkNmViXCJcbiAgICAgICAgPjwvbGluZT5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImNvbnRleHQ/LmNoYXJ0Vmlldz8ud2lkdGhcIlxuICAgICAgICAgIFthdHRyLnkxXT1cInRpY2sueVwiXG4gICAgICAgICAgW2F0dHIueTJdPVwidGljay55XCJcbiAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiNCAxXCJcbiAgICAgICAgICBzdHJva2U9XCIjZThlOGU4XCJcbiAgICAgICAgPjwvbGluZT5cbiAgICAgIDwvc3ZnOmc+XG4gICAgICA8c3ZnOmc+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgW2F0dHIuZF09XCJ5QXhpc0xpbmVcIlxuICAgICAgICAgIHN0cm9rZT1cIiNjY2Q2ZWJcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3ZnOmc+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cbiAgICAgIDxzdmc6ZyAqbmdGb3I9XCJsZXQgdGljayBvZiB0aWNrczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8dGV4dFxuICAgICAgICAgIFthdHRyLnhdPVwiaSA9PT0gMCAmJiBzdWZmaXggPyB0aWNrLnggLSA1IDogdGljay54XCJcbiAgICAgICAgICBbYXR0ci55XT1cInRpY2sueSArIDE2XCJcbiAgICAgICAgICBmaWxsPVwiIzY2NlwiXG4gICAgICAgICAgW2F0dHIudGV4dC1hbmNob3JdPVwidGV4dEFuY2hvclwiXG4gICAgICAgICAgZm9udC1zaXplPVwiMTFcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdGljay52YWx1ZSB8IHB1cmU6IGNvbnZlcnNpb25NYXhpbXVtIH19e3sgc3VmZml4IH19XG4gICAgICAgIDwvdGV4dD5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICAqbmdJZj1cImkgIT09IHRpY2tzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgIFthdHRyLngxXT1cInRpY2sueFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwidGljay54XCJcbiAgICAgICAgICBbYXR0ci55MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci55Ml09XCItY29udGV4dD8uY2hhcnRWaWV3Py5oZWlnaHRcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0IDFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNlOGU4ZThcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDxzdmc6Zz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInhBeGlzTGluZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2NjZDZlYlwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgWUF4aXNUaWNrc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgaW50ZXJ2YWxXaWR0aCA9IDQwO1xuXG4gIEBJbnB1dCgpIHN1ZmZpeDogc3RyaW5nO1xuXG4gIHRpY2tzOiBBcnJheTx7IHZhbHVlOiBudW1iZXI7IHk6IG51bWJlcjsgeDogbnVtYmVyIH0+O1xuICBvcmllbnRhdGlvbiA9IE9yaWVudGF0aW9uO1xuICB0ZXh0QW5jaG9yID0gJ21pZGRsZSc7XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgeUF4aXNMaW5lKCkge1xuICAgIHJldHVybiBgTSR7MH0gJHswfUwkezB9ICR7dGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHR9WmA7XG4gIH1cblxuICBnZXQgeEF4aXNMaW5lKCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IHRoaXMuY29udGV4dC5jaGFydFZpZXc7XG4gICAgcmV0dXJuIGBNMCAwTCR7d2lkdGh9IDBaYDtcbiAgfVxuXG4gIGdldFRpY2tzKCkge1xuICAgIGNvbnN0IHRpY2tzID0gdGhpcy5jb250ZXh0LnkudGlja3ModGhpcy5nZXRNYXhUaWNrcyh0aGlzLmludGVydmFsV2lkdGgpKTtcbiAgICByZXR1cm4gdGlja3MubWFwKHZhbHVlID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IHRoaXMuY29udGV4dC55KHZhbHVlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB5OiB0aGlzLmNvbnRleHQuaG9yaXpvbnRhbCA/IDAgOiByZXMsXG4gICAgICAgIHg6IHJlcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRNYXhUaWNrcyh0aWNrSGVpZ2h0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuY29udGV4dC5ob3Jpem9udGFsXG4gICAgICA/IHRoaXMuY29udGV4dC5jaGFydFZpZXcud2lkdGhcbiAgICAgIDogdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHQ7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoaGVpZ2h0IC8gdGlja0hlaWdodCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudGlja3MgPSB0aGlzLmdldFRpY2tzKCk7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgbWVyZ2UodGhpcy5jb250ZXh0LnNlcmllc0RhdGEkLCB0aGlzLmNvbnRleHQubGVnZW5kQ2hhbmdlJCQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuZ2V0VGlja3MoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMudGlja3MgPSByZXM7XG4gICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICBjb252ZXJzaW9uTWF4aW11bSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgdW5pdCA9ICdrJztcbiAgICBpZiAodmFsdWUgPj0gMTAwMCkge1xuICAgICAgY29uc3QgbnVtID0gKyh2YWx1ZSAvIDEwMDApLnRvRml4ZWQoMik7XG4gICAgICByZXR1cm4gYCR7bnVtfSR7dW5pdH1gO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gIH1cbn1cbiJdfQ==