UNPKG

ng-d3-graphs

Version:

<img src="./assets/ng-d3.png" alt="drawing" width="250" height="250"/>

216 lines 31.5 kB
import * as tslib_1 from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, HostListener, Input, OnInit, ViewEncapsulation, } from '@angular/core'; import * as d3 from 'd3'; import { Subject } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import { axisConfig } from '../shared/config/axis.config'; import { D3Service } from '../shared/services/d3.service'; var LineComponent = /** @class */ (function () { function LineComponent(container, d3Service) { this.container = container; this.d3Service = d3Service; this.data = []; this.labels = []; this.options = {}; this._options = { width: 879, height: 804, margin: { top: 50, right: 50, bottom: 50, left: 50 }, gridTicks: 0, yAxisLabel: '', xAxisLabel: '', timeParser: axisConfig.xAxisTimeParser, timeFormat: axisConfig.xAxisTimeFormat, xAxisTicks: axisConfig.xAxisTicks, }; this.parseTime = d3.timeParse(this.options.timeParser); this.formatTime = d3.timeFormat(this.options.timeFormat); this.viewBox = {}; this.labelsAndData = []; this.AxisDataX = []; this.onResize$ = new Subject(); } LineComponent.prototype.onResize = function () { this.onResize$.next(); }; LineComponent.prototype.ngOnInit = function () { var _this = this; this.options = tslib_1.__assign({}, this._options, this.options); this.viewBox = this.d3Service.getViewBoxDefault(this.options); this.parseTime = d3.timeParse(this.options.timeParser); this.formatTime = d3.timeFormat(this.options.timeFormat); this.labels = this.labels.map(function (d) { return _this.parseTime(d); }); this.labelsAndData = this.combineLabelsDataToOne(); this.onResizeEvent(); this.render(); }; LineComponent.prototype.render = function () { var currentWidth = parseInt(d3.select(this.container.nativeElement).select('div').style('width'), 10); var currentHeight = parseInt(d3.select(this.container.nativeElement).select('div').style('height'), 10); var width = this.options.width - this.options.margin.left - this.options.margin.right; var height = this.options.height - this.options.margin.top - this.options.margin.bottom; this.viewBox = { minX: -this.options.margin.left, minY: -10, width: this.options.width, height: this.options.height - this.options.margin.top, }; var svg = d3.select(this.container.nativeElement) .select('div') .append('svg') .attr('width', currentWidth) .attr('height', currentHeight) .attr('viewBox', this.viewBox.minX + " " + this.viewBox.minY + " " + this.viewBox.width + " " + this.viewBox.height) .classed('svg-content', true) .append('g'); var x = d3.scaleTime().range([0, width]); var y = d3.scaleLinear().range([height, 0]).nice(); var valueline = d3.line().x(function (d) { return x(d.x); }).y(function (d) { return y(d.y); }); x.domain(d3.extent(this.labels, function (d) { return (d); })); y.domain([0, d3.max(this.data, function (d) { return d; })]); // add the X gridlines svg.append('g') .attr('class', 'grid') .call(this.make_x_gridlines(x).tickSize(height) // .tickFormat('') ); // add the Y gridlines svg.append('g') .attr('class', 'grid') .call(this.make_y_gridlines(y).tickSize(-width) // .tickFormat('') ); svg.append('path') .datum(this.labelsAndData) .attr('class', 'line') .attr('d', valueline); // add the X Axis var xAxis = this.d3Service.getXaxisTime(svg, height, x, this.options.timeFormat, this.options.xAxisTicks); // text label for the x axis this.addLabelAxisX(svg, width, height); // add the Y Axis var yAxis = svg.append('g').call(d3.axisLeft(y)); // text label for the y axis this.addLabelAxisY(svg, height); this.removeAxisTicks(xAxis); this.removeAxisTicks(yAxis); this.changeAxisColor(xAxis, axisConfig); this.changeAxisColor(yAxis, axisConfig); this.addDots(svg, x, y); }; LineComponent.prototype.addDots = function (svg, x, y) { var _this = this; var dotRadius = 3; var dotColor = '#4682b4'; // add tootlip var _a = this.d3Service.addTooltip(this.container), tooltip = _a.tooltip, tooltipRect = _a.tooltipRect, tooltipText = _a.tooltipText, tooltipConfig = _a.tooltipConfig; svg.selectAll('dot') .data(this.labelsAndData) .enter() .append('circle') .attr('r', dotRadius) .attr('fill', dotColor) .attr('cx', function (d) { return x(d.x); }) .attr('cy', function (d) { return y(d.y); }) .on('mouseover', function (d) { _this.onMouseOver(d, x, y, tooltip, tooltipRect, tooltipText); }) .on('mouseout', function (d) { _this.onMouseOut(d, tooltip, tooltipText, tooltipConfig); }); }; LineComponent.prototype.onMouseOver = function (d, xScale, yScale, tooltip, tooltipRect, tooltipText) { // show tooltip if (tooltip) { this.d3Service.showTooltip(d, xScale, yScale, tooltip, tooltipRect, tooltipText, this.formatTime); } }; LineComponent.prototype.onMouseOut = function (d, tooltip, tooltipText, tooltipConfig) { // hide tooltip if (tooltip) { this.d3Service.hideTooltip(tooltipText, tooltip); } }; LineComponent.prototype.changeAxisColor = function (axis, config) { this.d3Service.changeAxisColor(axis, config); }; LineComponent.prototype.removeAxisTicks = function (axis) { this.d3Service.removeAxisTicks(axis); }; LineComponent.prototype.addLabelAxisY = function (svg, height) { svg.append('text') .attr('transform', 'rotate(0)') .attr('y', 0 - this.options.margin.top / 2) .attr('x', 0) .attr('dy', '1em') .style('text-anchor', 'start') .text(this.options.yAxisLabel); }; LineComponent.prototype.addLabelAxisX = function (svg, width, height) { svg.append('text') .attr('transform', 'translate(' + width / 2 + ' ,' + (height + this.options.margin.top - 15) + ')') .style('text-anchor', 'middle') .text(this.options.xAxisLabel); }; LineComponent.prototype.combineLabelsDataToOne = function () { var result = []; var N = this.data.length; for (var index = 0; index < N; index++) { result.push({ x: this.labels[index], y: this.data[index] }); } return result; }; // gridlines in x axis function LineComponent.prototype.make_x_gridlines = function (x) { return d3.axisBottom(x).ticks(this.options.gridTicks); }; // gridlines in y axis function LineComponent.prototype.make_y_gridlines = function (y) { return d3.axisLeft(y).ticks(this.options.gridTicks); }; LineComponent.prototype.onResizeEvent = function () { var _this = this; this.onResize$.pipe(debounceTime(200)).subscribe(function () { var svgExist = d3.select(_this.container.nativeElement).select('svg'); if (svgExist) { svgExist.remove(); } _this.render(); }); }; LineComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: D3Service } ]; }; tslib_1.__decorate([ Input() ], LineComponent.prototype, "data", void 0); tslib_1.__decorate([ Input() ], LineComponent.prototype, "labels", void 0); tslib_1.__decorate([ Input() ], LineComponent.prototype, "options", void 0); tslib_1.__decorate([ HostListener('window:resize') ], LineComponent.prototype, "onResize", null); LineComponent = tslib_1.__decorate([ Component({ selector: 'ng-line', template: "<div class=\"svg-container\"></div>\n", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".svg-container{display:inline-block;position:relative;width:100%;height:100%;padding-bottom:100%;vertical-align:top;overflow:hidden}.svg-content{display:inline-block;position:absolute;top:0;left:0}.grid line{stroke:#d3d3d3;stroke-opacity:.4;shape-rendering:crispEdges}.grid path{stroke-width:0}.grid text{display:none}.line{fill:none;stroke:#4682b4;stroke-width:2px}div.tooltip{position:absolute;text-align:center;min-width:60px;min-height:28px;padding:5px;font:12px sans-serif;background:#b0c4de;border:0;border-radius:5px;pointer-events:none;color:#000}"] }) ], LineComponent); return LineComponent; }()); export { LineComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kMy1ncmFwaHMvIiwic291cmNlcyI6WyJsaW5lL2xpbmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsR0FBRSxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFHeEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBdUJ4RDtJQStCRSx1QkFBb0IsU0FBcUIsRUFBVSxTQUFvQjtRQUFuRCxjQUFTLEdBQVQsU0FBUyxDQUFZO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQTlCOUQsU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUNqQixXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLFlBQU8sR0FBaUIsRUFBaUIsQ0FBQztRQUUzQyxhQUFRLEdBQWdCO1lBQzlCLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLEdBQUc7WUFDWCxNQUFNLEVBQUUsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDO1lBQ2xELFNBQVMsRUFBRSxDQUFDO1lBQ1osVUFBVSxFQUFFLEVBQUU7WUFDZCxVQUFVLEVBQUUsRUFBRTtZQUNkLFVBQVUsRUFBRSxVQUFVLENBQUMsZUFBZTtZQUN0QyxVQUFVLEVBQUUsVUFBVSxDQUFDLGVBQWU7WUFDdEMs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S0FBSyxFQUFFOytDQUFrQjtJQUNqQjtRQUFSLEtBQUssRUFBRTtpREFBb0I7SUFDbkI7UUFBUixLQUFLLEVBQUU7a0RBQTJDO0lBd0JuRDtRQURDLFlBQVksQ0FBQyxlQUFlLENBQUM7aURBRzdCO0lBN0JVLGFBQWE7UUFQekIsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLFNBQVM7WUFDbkIsaURBQW9DO1lBRXBDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3JDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztTQUNoRCxDQUFDO09BQ1csYUFBYSxDQXVQekI7SUFBRCxvQkFBQztDQUFBLEFBdlBELElBdVBDO1NBdlBZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24sfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge2F4aXNDb25maWd9IGZyb20gJy4uL3NoYXJlZC9jb25maWcvYXhpcy5jb25maWcnO1xuaW1wb3J0IHtHcmFwaE9wdGlvbnN9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZ3JhcGgtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtWaWV3Qm94fSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3ZpZXdib3guaW50ZXJmYWNlJztcbmltcG9ydCB7RDNTZXJ2aWNlfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvZDMuc2VydmljZSc7XG5cbmludGVyZmFjZSBMYWJlbHNBbmREYXRhIHtcbiAgeDogYW55O1xuICB5OiBhbnk7XG59XG5cbmludGVyZmFjZSBBeGlzRGF0YVgge1xuICBpZDogbnVtYmVyO1xuICB2YWx1ZTogYW55O1xufVxuXG5pbnRlcmZhY2UgTGluZU9wdGlvbnMgZXh0ZW5kcyBHcmFwaE9wdGlvbnMge1xuICBncmlkVGlja3M/OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWxpbmUnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmUuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIExpbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBsYWJlbHM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIG9wdGlvbnM/OiBMaW5lT3B0aW9ucyA9IHt9IGFzIExpbmVPcHRpb25zO1xuXG4gIHByaXZhdGUgX29wdGlvbnM6IExpbmVPcHRpb25zID0ge1xuICAgIHdpZHRoOiA4NzksXG4gICAgaGVpZ2h0OiA4MDQsXG4gICAgbWFyZ2luOiB7dG9wOiA1MCwgcmlnaHQ6IDUwLCBib3R0b206IDUwLCBsZWZ0OiA1MH0sXG4gICAgZ3JpZFRpY2tzOiAwLFxuICAgIHlBeGlzTGFiZWw6ICcnLFxuICAgIHhBeGlzTGFiZWw6ICcnLFxuICAgIHRpbWVQYXJzZXI6IGF4aXNDb25maWcueEF4aXNUaW1lUGFyc2VyLFxuICAgIHRpbWVGb3JtYXQ6IGF4aXNDb25maWcueEF4aXNUaW1lRm9ybWF0LFxuICAgIHhBeGlzVGlja3M6IGF4aXNDb25maWcueEF4aXNUaWNrcyxcbiAgfTtcblxuICBwYXJzZVRpbWUgPSBkMy50aW1lUGFyc2UodGhpcy5vcHRpb25zLnRpbWVQYXJzZXIpO1xuICBmb3JtYXRUaW1lID0gZDMudGltZUZvcm1hdCh0aGlzLm9wdGlvbnMudGltZUZvcm1hdCk7XG5cbiAgcHJpdmF0ZSB2aWV3Qm94OiBWaWV3Qm94ID0ge30gYXMgVmlld0JveDtcblxuICBsYWJlbHNBbmREYXRhOiBMYWJlbHNBbmREYXRhW10gPSBbXTtcbiAgQXhpc0RhdGFYOiBBeGlzRGF0YVhbXSA9IFtdO1xuXG4gIG9uUmVzaXplJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVzaXplJC5uZXh0KCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRhaW5lcjogRWxlbWVudFJlZiwgcHJpdmF0ZSBkM1NlcnZpY2U6IEQzU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucywgLi4udGhpcy5vcHRpb25zfTtcbiAgICB0aGlzLnZpZXdCb3ggPSB0aGlzLmQzU2VydmljZS5nZXRWaWV3Qm94RGVmYXVsdCh0aGlzLm9wdGlvbnMpO1xuXG4gICAgdGhpcy5wYXJzZVRpbWUgPSBkMy50aW1lUGFyc2UodGhpcy5vcHRpb25zLnRpbWVQYXJzZXIpO1xuICAgIHRoaXMuZm9ybWF0VGltZSA9IGQzLnRpbWVGb3JtYXQodGhpcy5vcHRpb25zLnRpbWVGb3JtYXQpO1xuXG5cbiAgICB0aGlzLmxhYmVscyA9IHRoaXMubGFiZWxzLm1hcChkID0+IHRoaXMucGFyc2VUaW1lKGQpKTtcblxuICAgIHRoaXMubGFiZWxzQW5kRGF0YSA9IHRoaXMuY29tYmluZUxhYmVsc0RhdGFUb09uZSgpO1xuXG4gICAgdGhpcy5vblJlc2l6ZUV2ZW50KCk7XG5cbiAgICB0aGlzLnJlbmRlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gcGFyc2VJbnQoXG4gICAgICAgIGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ2RpdicpLnN0eWxlKCd3aWR0aCcpLFxuICAgICAgICAxMCk7XG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IHBhcnNlSW50KFxuICAgICAgICBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdkaXYnKS5zdHlsZSgnaGVpZ2h0JyksXG4gICAgICAgIDEwKTtcblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoIC0gdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0IC1cbiAgICAgICAgdGhpcy5vcHRpb25zLm1hcmdpbi5yaWdodDtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0IC0gdGhpcy5vcHRpb25zLm1hcmdpbi50b3AgLVxuICAgICAgICB0aGlzLm9wdGlvbnMubWFyZ2luLmJvdHRvbTtcbiAgICB0aGlzLnZpZXdCb3ggPSB7XG4gICAgICBtaW5YOiAtdGhpcy5vcHRpb25zLm1hcmdpbi5sZWZ0LFxuICAgICAgbWluWTogLTEwLFxuICAgICAgd2lkdGg6IHRoaXMub3B0aW9ucy53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5vcHRpb25zLmhlaWdodCAtIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wLFxuICAgIH07XG5cbiAgICBjb25zdCBzdmcgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnZGl2JylcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3ZnJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgY3VycmVudFdpZHRoKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgY3VycmVudEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAndmlld0JveCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLnZpZXdCb3gubWluWH0gJHt0aGlzLnZpZXdCb3gubWluWX0gJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdCb3gud2lkdGh9ICR7dGhpcy52aWV3Qm94LmhlaWdodH1gKVxuICAgICAgICAgICAgICAgICAgICAuY2xhc3NlZCgnc3ZnLWNvbnRlbnQnLCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJyk7XG5cbiAgICBjb25zdCB4ID0gZDMuc2NhbGVUaW1lKCkucmFuZ2UoWzAsIHdpZHRoXSk7XG4gICAgY29uc3QgeSA9IGQzLnNjYWxlTGluZWFyKCkucmFuZ2UoW2hlaWdodCwgMF0pLm5pY2UoKTtcbiAgICBjb25zdCB2YWx1ZWxpbmUgPSBkMy5saW5lPGFueT4oKS54KChkKSA9PiB4KGQueCkpLnkoKGQpID0+IHkoZC55KSk7XG5cbiAgICB4LmRvbWFpbihkMy5leHRlbnQodGhpcy5sYWJlbHMsIChkKSA9PiAoZCkpKTtcbiAgICB5LmRvbWFpbihbMCwgZDMubWF4KHRoaXMuZGF0YSwgKGQpID0+IGQpXSk7XG5cbiAgICAvLyBhZGQgdGhlIFggZ3JpZGxpbmVzXG4gICAgc3ZnLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICB0aGlzLm1ha2VfeF9ncmlkbGluZXMoeCkudGlja1NpemUoaGVpZ2h0KVxuICAgICAgICAgICAgLy8gLnRpY2tGb3JtYXQoJycpXG4gICAgICAgICk7XG5cbiAgICAvLyBhZGQgdGhlIFkgZ3JpZGxpbmVzXG4gICAgc3ZnLmFwcGVuZCgnZycpXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdncmlkJylcbiAgICAgICAgLmNhbGwoXG4gICAgICAgICAgICB0aGlzLm1ha2VfeV9ncmlkbGluZXMoeSkudGlja1NpemUoLXdpZHRoKVxuICAgICAgICAgICAgLy8gLnRpY2tGb3JtYXQoJycpXG4gICAgICAgICk7XG5cbiAgICBzdmcuYXBwZW5kKCdwYXRoJylcbiAgICAgICAgLmRhdHVtKHRoaXMubGFiZWxzQW5kRGF0YSlcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpbmUnKVxuICAgICAgICAuYXR0cignZCcsIHZhbHVlbGluZSk7XG5cbiAgICAvLyBhZGQgdGhlIFggQXhpc1xuICAgIGNvbnN0IHhBeGlzID0gdGhpcy5kM1NlcnZpY2UuZ2V0WGF4aXNUaW1lKFxuICAgICAgICBzdmcsIGhlaWdodCwgeCwgdGhpcy5vcHRpb25zLnRpbWVGb3JtYXQsIHRoaXMub3B0aW9ucy54QXhpc1RpY2tzKTtcblxuXG4gICAgLy8gdGV4dCBsYWJlbCBmb3IgdGhlIHggYXhpc1xuICAgIHRoaXMuYWRkTGFiZWxBeGlzWChzdmcsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgLy8gYWRkIHRoZSBZIEF4aXNcbiAgICBjb25zdCB5QXhpcyA9IHN2Zy5hcHBlbmQoJ2cnKS5jYWxsKGQzLmF4aXNMZWZ0KHkpKTtcblxuICAgIC8vIHRleHQgbGFiZWwgZm9yIHRoZSB5IGF4aXNcbiAgICB0aGlzLmFkZExhYmVsQXhpc1koc3ZnLCBoZWlnaHQpO1xuXG4gICAgdGhpcy5yZW1vdmVBeGlzVGlja3MoeEF4aXMpO1xuICAgIHRoaXMucmVtb3ZlQXhpc1RpY2tzKHlBeGlzKTtcblxuICAgIHRoaXMuY2hhbmdlQXhpc0NvbG9yKHhBeGlzLCBheGlzQ29uZmlnKTtcbiAgICB0aGlzLmNoYW5nZUF4aXNDb2xvcih5QXhpcywgYXhpc0NvbmZpZyk7XG5cbiAgICB0aGlzLmFkZERvdHMoc3ZnLCB4LCB5KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRG90cyhcbiAgICAgIHN2ZzogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LFxuICAgICAgeDogZDMuU2NhbGVUaW1lPG51bWJlciwgbnVtYmVyPiwgeTogZDMuU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+KSB7XG4gICAgY29uc3QgZG90UmFkaXVzID0gMztcbiAgICBjb25zdCBkb3RDb2xvciA9ICcjNDY4MmI0JztcblxuICAgIC8vIGFkZCB0b290bGlwXG4gICAgY29uc3Qge3Rvb2x0aXAsIHRvb2x0aXBSZWN0LCB0b29sdGlwVGV4dCwgdG9vbHRpcENvbmZpZ30gPVxuICAgICAgICB0aGlzLmQzU2VydmljZS5hZGRUb29sdGlwKHRoaXMuY29udGFpbmVyKTtcblxuICAgIHN2Zy5zZWxlY3RBbGwoJ2RvdCcpXG4gICAgICAgIC5kYXRhKHRoaXMubGFiZWxzQW5kRGF0YSlcbiAgICAgICAgLmVudGVyKClcbiAgICAgICAgLmFwcGVuZCgnY2lyY2xlJylcbiAgICAgICAgLmF0dHIoJ3InLCBkb3RSYWRpdXMpXG4gICAgICAgIC5hdHRyKCdmaWxsJywgZG90Q29sb3IpXG4gICAgICAgIC5hdHRyKFxuICAgICAgICAgICAgJ2N4JyxcbiAgICAgICAgICAgIChkKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB4KGQueCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICdjeScsXG4gICAgICAgICAgICAoZCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4geShkLnkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW92ZXInLFxuICAgICAgICAgICAgKGQpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbk1vdXNlT3ZlcihkLCB4LCB5LCB0b29sdGlwLCB0b29sdGlwUmVjdCwgdG9vbHRpcFRleHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgLm9uKCdtb3VzZW91dCcsIChkKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbk1vdXNlT3V0KGQsIHRvb2x0aXAsIHRvb2x0aXBUZXh0LCB0b29sdGlwQ29uZmlnKTtcbiAgICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VPdmVyKGQsIHhTY2FsZSwgeVNjYWxlLCB0b29sdGlwPywgdG9vbHRpcFJlY3Q/LCB0b29sdGlwVGV4dD8pIHtcbiAgICAvLyBzaG93IHRvb2x0aXBcbiAgICBpZiAodG9vbHRpcCkge1xuICAgICAgdGhpcy5kM1NlcnZpY2Uuc2hvd1Rvb2x0aXAoXG4gICAgICAgICAgZCwgeFNjYWxlLCB5U2NhbGUsIHRvb2x0aXAsIHRvb2x0aXBSZWN0LCB0b29sdGlwVGV4dCxcbiAgICAgICAgICB0aGlzLmZvcm1hdFRpbWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgcHJpdmF0ZSBvbk1vdXNlT3V0KGQsIHRvb2x0aXA/LCB0b29sdGlwVGV4dD8sIHRvb2x0aXBDb25maWc/KSB7XG4gICAgLy8gaGlkZSB0b29sdGlwXG4gICAgaWYgKHRvb2x0aXApIHtcbiAgICAgIHRoaXMuZDNTZXJ2aWNlLmhpZGVUb29sdGlwKHRvb2x0aXBUZXh0LCB0b29sdGlwKTtcbiAgICB9XG4gIH1cblxuXG4gIHByaXZhdGUgY2hhbmdlQXhpc0NvbG9yKFxuICAgICAgYXhpczogZDMuU2VsZWN0aW9uPFNWR0dFbGVtZW50LCB1bmtub3duLCBudWxsLCB1bmRlZmluZWQ+LCBjb25maWc6IGFueSkge1xuICAgIHRoaXMuZDNTZXJ2aWNlLmNoYW5nZUF4aXNDb2xvcihheGlzLCBjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBeGlzVGlja3MoXG4gICAgICBheGlzOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4pIHtcbiAgICB0aGlzLmQzU2VydmljZS5yZW1vdmVBeGlzVGlja3MoYXhpcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZExhYmVsQXhpc1koXG4gICAgICBzdmc6IGQzLlNlbGVjdGlvbjxTVkdHRWxlbWVudCwgdW5rbm93biwgbnVsbCwgdW5kZWZpbmVkPixcbiAgICAgIGhlaWdodDogbnVtYmVyKSB7XG4gICAgc3ZnLmFwcGVuZCgndGV4dCcpXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKDApJylcbiAgICAgICAgLmF0dHIoJ3knLCAwIC0gdGhpcy5vcHRpb25zLm1hcmdpbi50b3AgLyAyKVxuICAgICAgICAuYXR0cigneCcsIDApXG4gICAgICAgIC5hdHRyKCdkeScsICcxZW0nKVxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ3N0YXJ0JylcbiAgICAgICAgLnRleHQodGhpcy5vcHRpb25zLnlBeGlzTGFiZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMYWJlbEF4aXNYKFxuICAgICAgc3ZnOiBkMy5TZWxlY3Rpb248U1ZHR0VsZW1lbnQsIHVua25vd24sIG51bGwsIHVuZGVmaW5lZD4sIHdpZHRoOiBudW1iZXIsXG4gICAgICBoZWlnaHQ6IG51bWJlcikge1xuICAgIHN2Zy5hcHBlbmQoJ3RleHQnKVxuICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgd2lkdGggLyAyICsgJyAsJyArXG4gICAgICAgICAgICAgICAgKGhlaWdodCArIHRoaXMub3B0aW9ucy5tYXJnaW4udG9wIC0gMTUpICsgJyknKVxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXG4gICAgICAgIC50ZXh0KHRoaXMub3B0aW9ucy54QXhpc0xhYmVsKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tYmluZUxhYmVsc0RhdGFUb09uZSgpOiBMYWJlbHNBbmREYXRhW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IE4gPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBOOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHQucHVzaCh7eDogdGhpcy5sYWJlbHNbaW5kZXhdLCB5OiB0aGlzLmRhdGFbaW5kZXhdfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBncmlkbGluZXMgaW4geCBheGlzIGZ1bmN0aW9uXG4gIHByaXZhdGUgbWFrZV94X2dyaWRsaW5lcyh4KSB7XG4gICAgcmV0dXJuIGQzLmF4aXNCb3R0b20oeCkudGlja3ModGhpcy5vcHRpb25zLmdyaWRUaWNrcyk7XG4gIH1cblxuICAvLyBncmlkbGluZXMgaW4geSBheGlzIGZ1bmN0aW9uXG4gIHByaXZhdGUgbWFrZV95X2dyaWRsaW5lcyh5KSB7XG4gICAgcmV0dXJuIGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHRoaXMub3B0aW9ucy5ncmlkVGlja3MpO1xuICB9XG5cbiAgb25SZXNpemVFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uUmVzaXplJC5waXBlKGRlYm91bmNlVGltZSgyMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3Qgc3ZnRXhpc3QgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdzdmcnKTtcbiAgICAgIGlmIChzdmdFeGlzdCkge1xuICAgICAgICBzdmdFeGlzdC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==