@alauda-fe/common
Version:
Alauda frontend team common codes.
166 lines • 22.4 kB
JavaScript
import { ChangeDetectorRef, Directive, Injector, Input, } from '@angular/core';
import { area, curveMonotoneX, line, } from 'd3';
import { cloneDeep } from 'lodash-es';
import { Subject, skip, takeUntil } from 'rxjs';
import { ContextChartService } from '../../chart.service';
import { defined, generateUID } from '../../utils';
import * as i0 from "@angular/core";
export class ChartSeriesComponent {
get disabledLegend() {
return this.context.disabledLegend;
}
get hasBar() {
return this.seriesType === 'bar';
}
constructor(injector) {
this.injector = injector;
this.x = (d) => d.x;
this.y = (d) => d.y;
this.type = 'standard';
this.lineWidth = 1.5;
this.cdr = this.injector.get(ChangeDetectorRef);
this.context = this.injector.get(ContextChartService);
this.destroy$$ = new Subject();
this.handleOpacity = (name, activateLegend) => activateLegend ? (activateLegend === name ? 1 : 0.2) : 1;
this.handleStrokeWidth = (name, activateLegend, width = 1.5) => activateLegend ? (activateLegend === name ? width + 0.5 : width) : width;
}
ngOnInit() {
this.initSeries();
}
initSeries() {
this.context.chartData$
.pipe(takeUntil(this.destroy$$))
.subscribe(chartData => {
this.context.chartData = chartData;
});
this.context.triggerInitData$
.pipe(takeUntil(this.destroy$$))
.subscribe(chartData => {
this.context.initContext();
this.handleChatData(chartData);
setTimeout(() => {
this.handleSeriesData();
}, 300);
});
this.context.update$$
.pipe(takeUntil(this.destroy$$))
.pipe(skip(1))
.subscribe(() => {
this.handleSeriesData();
});
this.legendActivate();
}
legendActivate() {
this.context.legendActivate$$
.pipe(takeUntil(this.destroy$$))
.subscribe(legend => {
this.activateLegend = legend;
this.cdr.detectChanges();
});
}
handleChatData(data) {
const chartData = data.map((d, index) => {
if (this.hasBar) {
this.context.xSeriesValue = [
...new Set([...this.context.xSeriesValue, d.name]),
];
}
this.type === 'stacked' &&
this.context.ySeriesValue.push(d.values.reduce((acc, curr) => {
const y = this.y(curr);
return y + acc;
}, 0));
return {
...d,
color: d.color || this.context.getChartDefaultColor(index),
values: d.values.map(v => {
const x = this.x(v);
const y = this.y(v);
if (!this.hasBar) {
this.context.xSeriesValue = [
...new Set([...this.context.xSeriesValue, x]),
];
}
if (this.type !== 'stacked') {
this.context.ySeriesValue.push(y);
}
return { ...v, x, y };
}),
};
});
this.context.setChartData(chartData);
}
// eslint-disable-next-line sonarjs/cognitive-complexity
handleSeriesData() {
const seriesData = cloneDeep(this.context.chartData);
const sliceValue = 30;
const sliceTotal = Math.ceil(seriesData.length / sliceValue);
const lineG = ['area', 'line'].includes(this.seriesType) && this.getLineGenerator();
const areaG = this.seriesType === 'area' && this.getAraGenerator();
for (let index = 0; index < sliceTotal; index++) {
requestAnimationFrame(() => {
[...seriesData].splice(0, sliceValue).forEach((_, i) => {
const tIndex = index * sliceValue + i;
const d = seriesData[tIndex];
if (d) {
d.visibility = this.disabledLegend.has(d.name) ? 'hidden' : '';
if (this.seriesType === 'area') {
d.areaPath = areaG(d.values);
d.gradientFillId = generateUID();
}
if (['area', 'line'].includes(this.seriesType)) {
d.path = lineG(d.values);
}
if (tIndex === seriesData.length - 1) {
this.seriesData = seriesData;
this.context.seriesData$.next(seriesData);
this.cdr.detectChanges();
}
}
});
});
}
}
getLineGenerator() {
const { x, y } = this.context;
return line()
.defined(defined)
.curve(this.curveType || curveMonotoneX)
.x(d => x(d.x))
.y(d => y(d.y) || 0);
}
getAraGenerator() {
const { x, y } = this.context;
return area()
.defined(defined)
.curve((this.curveType || curveMonotoneX))
.x(d => x(d.x))
.y0(y.range()[0])
.y1(d => y(d.y) || 0);
}
ngOnDestroy() {
this.destroy$$.next();
}
static { this.ɵfac = function ChartSeriesComponent_Factory(t) { return new (t || ChartSeriesComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; }
static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ChartSeriesComponent, inputs: { x: "x", y: "y", categories: "categories", unit: "unit", curveType: "curveType", type: "type", lineWidth: "lineWidth", seriesType: "seriesType" } }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChartSeriesComponent, [{
type: Directive
}], () => [{ type: i0.Injector }], { x: [{
type: Input
}], y: [{
type: Input
}], categories: [{
type: Input
}], unit: [{
type: Input
}], curveType: [{
type: Input
}], type: [{
type: Input
}], lineWidth: [{
type: Input
}], seriesType: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vc2VyaWVzL3Nlcmllcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsSUFBSSxFQUNKLGNBQWMsRUFDZCxJQUFJLEdBQ0wsTUFBTSxJQUFJLENBQUM7QUFDWixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFHbkQsTUFBTSxPQUFnQixvQkFBb0I7SUE4QnhDLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBckMvQixNQUFDLEdBQTJDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFRyxNQUFDLEdBQTRCLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQVF2RCxTQUFJLEdBQTJCLFVBQVUsQ0FBQztRQUUxQyxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBSXpCLFFBQUcsR0FB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QVcsQ0FBQyxDQUFDO2FBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsT0FBTyxJQUFJLEVBQWlCO2FBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDaEIsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQWlCLENBQUM7YUFDekQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQTZCLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBVyxDQUFDLENBQUM7YUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO3FGQTVLbUIsb0JBQW9CO29FQUFwQixvQkFBb0I7O2lGQUFwQixvQkFBb0I7Y0FEekMsU0FBUzt5Q0FFQyxDQUFDO2tCQUFULEtBQUs7WUFHRyxDQUFDO2tCQUFULEtBQUs7WUFFRyxVQUFVO2tCQUFsQixLQUFLO1lBRUcsSUFBSTtrQkFBWixLQUFLO1lBRUcsU0FBUztrQkFBakIsS0FBSztZQUVHLElBQUk7a0JBQVosS0FBSztZQUVHLFNBQVM7a0JBQWpCLEtBQUs7WUFFRyxVQUFVO2tCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJ2ZUZhY3RvcnksXG4gIEN1cnZlRmFjdG9yeUxpbmVPbmx5LFxuICBTY2FsZVRpbWUsXG4gIGFyZWEsXG4gIGN1cnZlTW9ub3RvbmVYLFxuICBsaW5lLFxufSBmcm9tICdkMyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgc2tpcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnREYXRhSXRlbSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY2hhcnQvdHlwZXMnO1xuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VyaWVzRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGRlZmluZWQsIGdlbmVyYXRlVUlEIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGFydFNlcmllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgeDogKGQ6IHVua25vd24pID0+IG51bWJlciB8IERhdGUgfCBzdHJpbmcgPSAoZDogQ2hhcnREYXRhSXRlbSkgPT5cbiAgICBkLng7XG5cbiAgQElucHV0KCkgeT86IChkOiB1bmtub3duKSA9PiBudW1iZXIgPSAoZDogQ2hhcnREYXRhSXRlbSkgPT4gZC55O1xuXG4gIEBJbnB1dCgpIGNhdGVnb3JpZXM6IHN0cmluZztcblxuICBASW5wdXQoKSB1bml0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY3VydmVUeXBlOiBDdXJ2ZUZhY3RvcnkgfCBDdXJ2ZUZhY3RvcnlMaW5lT25seTtcblxuICBASW5wdXQoKSB0eXBlOiAnc3RhbmRhcmQnIHwgJ3N0YWNrZWQnID0gJ3N0YW5kYXJkJztcblxuICBASW5wdXQoKSBsaW5lV2lkdGggPSAxLjU7XG5cbiAgQElucHV0KCkgc2VyaWVzVHlwZTogJ2xpbmUnIHwgJ2FyZWEnIHwgJ2Jhcic7XG5cbiAgY2RyID0gdGhpcy5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnRleHQgPSB0aGlzLmluamVjdG9yLmdldChDb250ZXh0Q2hhcnRTZXJ2aWNlKTtcblxuICByZXN1bHRzOiBDaGFydERhdGE7XG5cbiAgYWN0aXZhdGVMZWdlbmQ6IHN0cmluZztcblxuICBzZXJpZXNEYXRhOiBTZXJpZXNEYXRhW107XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgZGlzYWJsZWRMZWdlbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5kaXNhYmxlZExlZ2VuZDtcbiAgfVxuXG4gIGdldCBoYXNCYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzVHlwZSA9PT0gJ2Jhcic7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFNlcmllcygpO1xuICB9XG5cbiAgaW5pdFNlcmllcygpIHtcbiAgICB0aGlzLmNvbnRleHQuY2hhcnREYXRhJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5zdWJzY3JpYmUoY2hhcnREYXRhID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNoYXJ0RGF0YSA9IGNoYXJ0RGF0YTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC50cmlnZ2VySW5pdERhdGEkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpKVxuICAgICAgLnN1YnNjcmliZShjaGFydERhdGEgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5pdENvbnRleHQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDaGF0RGF0YShjaGFydERhdGEpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlcmllc0RhdGEoKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC51cGRhdGUkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXJpZXNEYXRhKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmxlZ2VuZEFjdGl2YXRlKCk7XG4gIH1cblxuICBsZWdlbmRBY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmNvbnRleHQubGVnZW5kQWN0aXZhdGUkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5zdWJzY3JpYmUobGVnZW5kID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxlZ2VuZCA9IGxlZ2VuZDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICBoYW5kbGVPcGFjaXR5ID0gKG5hbWU6IHN0cmluZywgYWN0aXZhdGVMZWdlbmQ6IHN0cmluZykgPT5cbiAgICBhY3RpdmF0ZUxlZ2VuZCA/IChhY3RpdmF0ZUxlZ2VuZCA9PT0gbmFtZSA/IDEgOiAwLjIpIDogMTtcblxuICBoYW5kbGVTdHJva2VXaWR0aCA9IChuYW1lOiBzdHJpbmcsIGFjdGl2YXRlTGVnZW5kOiBzdHJpbmcsIHdpZHRoID0gMS41KSA9PlxuICAgIGFjdGl2YXRlTGVnZW5kID8gKGFjdGl2YXRlTGVnZW5kID09PSBuYW1lID8gd2lkdGggKyAwLjUgOiB3aWR0aCkgOiB3aWR0aDtcblxuICBoYW5kbGVDaGF0RGF0YShkYXRhOiBDaGFydERhdGFbXSkge1xuICAgIGNvbnN0IGNoYXJ0RGF0YSA9IGRhdGEubWFwKChkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQmFyKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC54U2VyaWVzVmFsdWUgPSBbXG4gICAgICAgICAgLi4ubmV3IFNldChbLi4udGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSwgZC5uYW1lXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICB0aGlzLnR5cGUgPT09ICdzdGFja2VkJyAmJlxuICAgICAgICB0aGlzLmNvbnRleHQueVNlcmllc1ZhbHVlLnB1c2goXG4gICAgICAgICAgZC52YWx1ZXMucmVkdWNlKChhY2M6IG51bWJlciwgY3VycikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeTogbnVtYmVyID0gdGhpcy55KGN1cnIpO1xuICAgICAgICAgICAgcmV0dXJuIHkgKyBhY2M7XG4gICAgICAgICAgfSwgMCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kLFxuICAgICAgICBjb2xvcjogZC5jb2xvciB8fCB0aGlzLmNvbnRleHQuZ2V0Q2hhcnREZWZhdWx0Q29sb3IoaW5kZXgpLFxuICAgICAgICB2YWx1ZXM6IGQudmFsdWVzLm1hcCh2ID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gdGhpcy54KHYpO1xuICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnkodik7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0Jhcikge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSA9IFtcbiAgICAgICAgICAgICAgLi4ubmV3IFNldChbLi4udGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSwgeF0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3N0YWNrZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQueVNlcmllc1ZhbHVlLnB1c2goeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IC4uLnYsIHgsIHkgfTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC5zZXRDaGFydERhdGEoY2hhcnREYXRhKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG4gIGhhbmRsZVNlcmllc0RhdGEoKSB7XG4gICAgY29uc3Qgc2VyaWVzRGF0YTogU2VyaWVzRGF0YVtdID0gY2xvbmVEZWVwKHRoaXMuY29udGV4dC5jaGFydERhdGEpO1xuICAgIGNvbnN0IHNsaWNlVmFsdWUgPSAzMDtcbiAgICBjb25zdCBzbGljZVRvdGFsID0gTWF0aC5jZWlsKHNlcmllc0RhdGEubGVuZ3RoIC8gc2xpY2VWYWx1ZSk7XG4gICAgY29uc3QgbGluZUcgPVxuICAgICAgWydhcmVhJywgJ2xpbmUnXS5pbmNsdWRlcyh0aGlzLnNlcmllc1R5cGUpICYmIHRoaXMuZ2V0TGluZUdlbmVyYXRvcigpO1xuICAgIGNvbnN0IGFyZWFHID0gdGhpcy5zZXJpZXNUeXBlID09PSAnYXJlYScgJiYgdGhpcy5nZXRBcmFHZW5lcmF0b3IoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2xpY2VUb3RhbDsgaW5kZXgrKykge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgWy4uLnNlcmllc0RhdGFdLnNwbGljZSgwLCBzbGljZVZhbHVlKS5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgdEluZGV4ID0gaW5kZXggKiBzbGljZVZhbHVlICsgaTtcbiAgICAgICAgICBjb25zdCBkID0gc2VyaWVzRGF0YVt0SW5kZXhdO1xuICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICBkLnZpc2liaWxpdHkgPSB0aGlzLmRpc2FibGVkTGVnZW5kLmhhcyhkLm5hbWUpID8gJ2hpZGRlbicgOiAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1R5cGUgPT09ICdhcmVhJykge1xuICAgICAgICAgICAgICBkLmFyZWFQYXRoID0gYXJlYUcoZC52YWx1ZXMpO1xuICAgICAgICAgICAgICBkLmdyYWRpZW50RmlsbElkID0gZ2VuZXJhdGVVSUQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChbJ2FyZWEnLCAnbGluZSddLmluY2x1ZGVzKHRoaXMuc2VyaWVzVHlwZSkpIHtcbiAgICAgICAgICAgICAgZC5wYXRoID0gbGluZUcoZC52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRJbmRleCA9PT0gc2VyaWVzRGF0YS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VyaWVzRGF0YSA9IHNlcmllc0RhdGE7XG4gICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zZXJpZXNEYXRhJC5uZXh0KHNlcmllc0RhdGEpO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldExpbmVHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGxpbmU8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSh0aGlzLmN1cnZlVHlwZSB8fCBjdXJ2ZU1vbm90b25lWClcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkoZCA9PiB5KGQueSkgfHwgMCk7XG4gIH1cblxuICBnZXRBcmFHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGFyZWE8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSgodGhpcy5jdXJ2ZVR5cGUgfHwgY3VydmVNb25vdG9uZVgpIGFzIEN1cnZlRmFjdG9yeSlcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkwKHkucmFuZ2UoKVswXSlcbiAgICAgIC55MShkID0+IHkoZC55KSB8fCAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgfVxufVxuIl19