@senx/warpview
Version:
WarpView Elements
234 lines • 48 kB
JavaScript
/*
* Copyright 2021 SenX S.A.S.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import { Component, ElementRef, EventEmitter, Input, NgZone, Output, Renderer2, ViewChild, ViewEncapsulation } from '@angular/core';
import { WarpViewComponent } from '../warp-view-component';
import { SizeService } from '../../services/resize.service';
import { Logger } from '../../utils/logger';
import deepEqual from 'deep-equal';
import { ChartLib } from '../../utils/chart-lib';
import { ColorLib } from '../../utils/color-lib';
import * as d3 from 'd3';
import eventDrops from 'event-drops';
import { GTSLib } from '../../utils/gts.lib';
import moment from 'moment-timezone';
import { select } from 'd3-selection';
import * as i0 from "@angular/core";
import * as i1 from "../../services/resize.service";
import * as i2 from "../warp-view-spinner/warp-view-spinner.component";
import * as i3 from "@angular/common";
export class WarpViewEventDropComponent extends WarpViewComponent {
constructor(el, renderer, sizeService, ngZone) {
super(el, renderer, sizeService, ngZone);
this.el = el;
this.renderer = renderer;
this.sizeService = sizeService;
this.ngZone = ngZone;
this.pointHover = new EventEmitter();
this.warpViewChartResize = new EventEmitter();
this.chartDraw = new EventEmitter();
this.boundsDidChange = new EventEmitter();
this.visibility = [];
this.maxTick = Number.MIN_VALUE;
this.minTick = Number.MAX_VALUE;
this.visibleGtsId = [];
this._type = 'drops';
this.eventConf = {
d3,
axis: {
verticalGrid: true,
tickPadding: 6,
},
line: {
height: 20,
},
indicator: false,
label: {
text: row => row.name,
},
metaballs: {
blurDeviation: 7
},
drop: {
radius: 4,
date: d => d.date.toDate(),
color: d => d.color,
onMouseOver: g => {
this.LOG.debug(['onMouseOver'], g);
this.pointHover.emit({
x: d3.event.offsetX,
y: d3.event.offsetY
});
const t = d3.select(this.toolTip.nativeElement);
t.transition()
.duration(200)
.style('opacity', 1)
.style('pointer-events', 'auto');
t.html(`<div class="tooltip-body">
<b class="tooltip-date">${this._options.timeMode === 'timestamp'
? g.date
: (g.date.toISOString() || '')}</b>
<div><i class="chip" style="background-color: ${g.color};border: 2px solid ${g.color};"></i>
${GTSLib.formatLabel(g.name)}: <span class="value">${g.value}</span>
</div></div>`)
.style('left', `${d3.event.offsetX + 10}px`)
.style('top', `${d3.event.offsetY + 10}px`);
},
onMouseOut: () => {
select(this.toolTip.nativeElement)
.transition()
.duration(500)
.style('opacity', 0)
.style('pointer-events', 'none');
},
},
};
this.LOG = new Logger(WarpViewEventDropComponent, this._debug);
}
set type(type) {
this._type = type;
this.drawChart();
}
set hiddenData(hiddenData) {
const previousVisibility = JSON.stringify(this.visibility);
this.LOG.debug(['hiddenData', 'previousVisibility'], previousVisibility);
this._hiddenData = hiddenData;
this.visibility = [];
this.visibleGtsId.forEach(id => this.visibility.push(hiddenData.indexOf(id) < 0 && (id !== -1)));
this.LOG.debug(['hiddenData', 'hiddendygraphfullv'], this.visibility);
const newVisibility = JSON.stringify(this.visibility);
this.LOG.debug(['hiddenData', 'json'], previousVisibility, newVisibility);
if (previousVisibility !== newVisibility) {
this.drawChart();
this.LOG.debug(['hiddendygraphtrig', 'destroy'], 'redraw by visibility change');
}
}
ngOnInit() {
this._options = this._options || this.defOptions;
}
ngOnDestroy() {
if (!!this.elemChart) {
select(this.elemChart.nativeElement).remove();
}
}
update(options, refresh) {
this.LOG.debug(['onOptions', 'before'], this._options, options);
if (!deepEqual(options, this._options)) {
this.LOG.debug(['options', 'changed'], options);
this._options = ChartLib.mergeDeep(this._options, options);
}
this.drawChart();
}
updateBounds(min, max) {
this.LOG.debug(['updateBounds'], min, max, this._options);
this._options.bounds.minDate = min;
this._options.bounds.maxDate = max;
if (this._options.timeMode && this._options.timeMode === 'timestamp') {
this.eventConf['range'] = { start: min, end: max };
}
else {
this.eventConf['range'] = {
start: moment.tz(moment.utc(this.minTick / this.divider), this._options.timeZone).toDate(),
end: moment.tz(moment.utc(this.maxTick / this.divider), this._options.timeZone).toDate(),
};
}
this.eventConf = { ...this.eventConf };
this.LOG.debug(['updateBounds'], this.eventConf);
}
drawChart() {
if (!this.initChart(this.el)) {
return;
}
this.loading = false;
this.LOG.debug(['drawChart', 'plotlyData'], this.plotlyData, this._type);
if (this.elemChart.nativeElement) {
setTimeout(() => select(this.elemChart.nativeElement).data([this.plotlyData]).call(eventDrops(this.eventConf)));
this.loading = false;
this.chartDraw.emit();
}
}
convert(data) {
this.LOG.debug(['convert'], data);
const gtsList = GTSLib.flatDeep(data.data);
const dataList = [];
this.LOG.debug(['convert', 'gtsList'], gtsList);
if (!gtsList || gtsList.length === 0 || gtsList[0].length < 2) {
return;
}
gtsList.forEach((gts, i) => {
const c = ColorLib.getColor(gts.id || i, this._options.scheme);
const color = ((data.params || [])[i] || { datasetColor: c }).datasetColor || c;
const gtsName = GTSLib.serializeGtsMetadata(gts);
const dataSet = { name: '', color, data: [] };
const size = (gts.v || []).length;
for (let v = 0; v < size; v++) {
const point = (gts.v || [])[v];
const ts = point[0];
this.minTick = Math.min(this.minTick, ts);
this.maxTick = Math.max(this.maxTick, ts);
let value = point[point.length - 1];
if (isNaN(value)) {
value = 1;
}
dataSet.data.push({
date: moment.tz(moment.utc(ts / this.divider), this._options.timeZone),
color: ColorLib.transparentize(color),
value,
name: gtsName
});
}
dataList.push(dataSet);
});
this.LOG.debug(['convert', 'dataList'], dataList);
this.eventConf.label['width'] = 0;
this.eventConf['range'] = {
start: moment.tz(moment.utc(this.minTick / this.divider), this._options.timeZone).toDate(),
end: moment.tz(moment.utc(this.maxTick / this.divider), this._options.timeZone).toDate(),
};
return dataList;
}
resize(layout) {
//
}
}
WarpViewEventDropComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewEventDropComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.SizeService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
WarpViewEventDropComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: WarpViewEventDropComponent, selector: "warpview-event-drop", inputs: { type: "type", hiddenData: "hiddenData" }, outputs: { pointHover: "pointHover", warpViewChartResize: "warpViewChartResize", chartDraw: "chartDraw", boundsDidChange: "boundsDidChange" }, viewQueries: [{ propertyName: "elemChart", first: true, predicate: ["elemChart"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n\n<div id=\"chartContainer\">\n <warpview-spinner *ngIf=\"loading\" message=\"Parsing data\"></warpview-spinner>\n <div #toolTip class=\"wv-tooltip\"></div>\n <p class=\"noData\" *ngIf=\"noData\">No data to display</p>\n <div #elemChart style=\"width: 100%;height: 100%\"></div>\n</div>\n", styles: ["@import\"~event-drops/dist/style.css\";:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */.gts-classname{color:var(--gts-classname-font-color)}.gts-labelname{color:var(--gts-labelname-font-color)}.gts-attrname{color:var(--gts-attrname-font-color)}.gts-separator{color:var(--gts-separator-font-color)}.gts-labelvalue{color:var(--gts-labelvalue-font-color);font-style:italic}.gts-attrvalue{color:var(--gts-attrvalue-font-color);font-style:italic}:host,warpview-event-drop,warp-view-event-drop{display:block;height:100%;width:100%}:host text.line-label,:host g.bound text,warpview-event-drop text.line-label,warpview-event-drop g.bound text,warp-view-event-drop text.line-label,warp-view-event-drop g.bound text{fill:var(--warp-view-font-color)!important}:host #chartContainer,warpview-event-drop #chartContainer,warp-view-event-drop #chartContainer{height:100%;width:100%;position:relative}:host div.chart,warpview-event-drop div.chart,warp-view-event-drop div.chart{width:var(--warp-view-chart-width);height:var(--warp-view-chart-height)}:host .wv-tooltip,warpview-event-drop .wv-tooltip,warp-view-event-drop .wv-tooltip{position:absolute;background-color:var(--warp-view-tooltip-bg)!important;color:var(--warp-view-tooltip-color)!important;line-height:1.4rem;padding:10px;border:1px solid grey;border-radius:5px;box-shadow:none;pointer-events:none;font-size:10px;min-width:100px;width:auto;z-index:999;height:auto!important;opacity:0;display:block}:host .wv-tooltip .chip,warpview-event-drop .wv-tooltip .chip,warp-view-event-drop .wv-tooltip .chip{border-radius:50%;background-color:#bbb;display:inline-block;width:5px;height:5px;border:2px solid #454545;margin-top:auto;margin-bottom:auto;vertical-align:middle;cursor:pointer;padding:2px}\n"], components: [{ type: i2.WarpViewSpinnerComponent, selector: "warpview-spinner", inputs: ["message"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: WarpViewEventDropComponent, decorators: [{
type: Component,
args: [{ selector: 'warpview-event-drop', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2021 SenX S.A.S.\n ~\n ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ http://www.apache.org/licenses/LICENSE-2.0\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n ~\n -->\n\n<div id=\"chartContainer\">\n <warpview-spinner *ngIf=\"loading\" message=\"Parsing data\"></warpview-spinner>\n <div #toolTip class=\"wv-tooltip\"></div>\n <p class=\"noData\" *ngIf=\"noData\">No data to display</p>\n <div #elemChart style=\"width: 100%;height: 100%\"></div>\n</div>\n", styles: ["@import\"~event-drops/dist/style.css\";:root{--warp-view-chart-width: 100%;--warp-view-chart-height: 100%;--warp-view-datagrid-cell-padding: 5px;--warp-view-map-margin: 0;--warp-view-switch-height: 30px;--warp-view-switch-width: 100px;--warp-view-switch-radius: 18px;--warp-view-plot-chart-height: 100%;--warp-view-slider-pointer-size: 65px;--warp-view-resize-handle-height: 10px;--warp-view-tile-width: 100%;--warp-view-tile-height: 100%;--warp-view-font-color: #000000;--warp-view-bar-color: #dc3545;--warp-view-datagrid-odd-bg-color: #ffffff;--warp-view-datagrid-odd-color: #404040;--warp-view-datagrid-even-bg-color: #c0c0c0;--warp-view-datagrid-even-color: #000000;--warp-view-pagination-border-color: #c0c0c0;--warp-view-pagination-bg-color: #ffffff;--warp-view-pagination-active-bg-color: #4CAF50;--warp-view-pagination-active-color: #ffffff;--warp-view-pagination-active-border-color: #4CAF50;--warp-view-pagination-hover-bg-color: #c0c0c0;--warp-view-pagination-hover-color: #000000;--warp-view-pagination-hover-border-color: #c0c0c0;--warp-view-pagination-disabled-color: #c0c0c0;--warp-view-switch-inset-color: #c0c0c0;--warp-view-switch-inset-checked-color: #00cd00;--warp-view-switch-handle-color: radial-gradient(#ffffff 15%, #c0c0c0 100%);--warp-view-switch-handle-checked-color: radial-gradient(#ffffff 15%, #00cd00 100%);--warp-view-resize-handle-color: #c0c0c0;--warp-view-chart-legend-bg: #ffffff;--warp-view-chart-legend-color: #404040;--gts-classname-font-color: #004eff;--gts-labelname-font-color: #19A979;--gts-attrname-font-color: #ED4A7B;--gts-separator-font-color: #a0a0a0;--gts-labelvalue-font-color: #000000;--gts-attrvalue-font-color: #000000;--gts-stack-font-color: #000000;--gts-tree-expanded-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7klEQVQ4T82TMW7CQBBF/0g+QOpINEkVCmpaLoBm5COk5QYoaeAY3MDSei2LGu4QKakiBA1tCpTK8kS2sLVe2xSh8XSrnf9m/s4s4c6gO/UYGEBEXlT1bK396bFGIjIJguA7iqJLkVNbYOZXItoQ0QHAzBhz9CCFeAVgCeAjy7Jpmqa/NUBEEgDzktqGuOKKO47j+KsGhGH4lOf5HsDIg5ycyqVYVd+steuGheLAzM9EtPMgW1VdVGWJ6N0YU1gpozVGH+K+gy/uBHR1crXUqNzbQXXhduJ69sd7cxOZ+UFVH5Mk+exb+YGt8n9+5h8up1sReYC0WAAAAABJRU5ErkJggg==);--gts-tree-collapsed-icon: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0UlEQVQ4T6WTUW7CQAxEPQdozxYb9Qb94Aj9gQSoVCp6lMr21doDZFCQiFCU3YDY//d2PeOFPHnwJC+zAlVdA/jp+/6YmZ+1S0qCPxF5HUAAO3fvSpKS4ENEvm6gfUS0c5JiBma2Ibm/QiQPmbmdSqohquoA7GqSxRaapmkBjBkAeHP336t0UWBmHcnb+VcR4XcJpjDJLjPHkS4tleqZubmNiDHU6gumDQDYuvvh7hpV9V9EXgaA5Ka2jbMjmNk7yZOIfEfE8eFVfuSDLda4JDsD3FNdEckTC0YAAAAASUVORK5CYII=);--warp-view-popup-bg-color: #ffffff;--warp-view-popup-border-color: rgba(0, 0, 0, .2);--warp-view-popup-header-bg-color: #c0c0c0;--warp-view-popup-title-color: #404040;--warp-view-popup-close-color: #404040;--warp-view-popup-body-bg-color: #ffffff;--warp-view-popup-body-color: #000000;--warp-view-annotationtooltip-value-font-color: #004eff;--warp-view-annotationtooltip-font-color: #404040;--warp-view-spinner-color: #ff9900;--warp-view-tooltip-bg: #ffffff;--warp-view-tooltip-color: #000000;--warp-slider-connect-color: #ff9900;--warp-slider-handle-bg-color: #ffffff;--warp-slider-handle-color: #004eff;--warp-slider-handle-shadow: inset 0 0 1px #ffffff, inset 0 1px 7px #c0c0c0, 0 3px 6px -3px #a0a0a0}.noData{width:100%;text-align:center;color:var(--warp-view-chart-legend-color);position:relative}.js-plotly-plot .plotly .cursor-ew-resize{cursor:default!important}/*!\n * Copyright 2021 SenX S.A.S.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */.gts-classname{color:var(--gts-classname-font-color)}.gts-labelname{color:var(--gts-labelname-font-color)}.gts-attrname{color:var(--gts-attrname-font-color)}.gts-separator{color:var(--gts-separator-font-color)}.gts-labelvalue{color:var(--gts-labelvalue-font-color);font-style:italic}.gts-attrvalue{color:var(--gts-attrvalue-font-color);font-style:italic}:host,warpview-event-drop,warp-view-event-drop{display:block;height:100%;width:100%}:host text.line-label,:host g.bound text,warpview-event-drop text.line-label,warpview-event-drop g.bound text,warp-view-event-drop text.line-label,warp-view-event-drop g.bound text{fill:var(--warp-view-font-color)!important}:host #chartContainer,warpview-event-drop #chartContainer,warp-view-event-drop #chartContainer{height:100%;width:100%;position:relative}:host div.chart,warpview-event-drop div.chart,warp-view-event-drop div.chart{width:var(--warp-view-chart-width);height:var(--warp-view-chart-height)}:host .wv-tooltip,warpview-event-drop .wv-tooltip,warp-view-event-drop .wv-tooltip{position:absolute;background-color:var(--warp-view-tooltip-bg)!important;color:var(--warp-view-tooltip-color)!important;line-height:1.4rem;padding:10px;border:1px solid grey;border-radius:5px;box-shadow:none;pointer-events:none;font-size:10px;min-width:100px;width:auto;z-index:999;height:auto!important;opacity:0;display:block}:host .wv-tooltip .chip,warpview-event-drop .wv-tooltip .chip,warp-view-event-drop .wv-tooltip .chip{border-radius:50%;background-color:#bbb;display:inline-block;width:5px;height:5px;border:2px solid #454545;margin-top:auto;margin-bottom:auto;vertical-align:middle;cursor:pointer;padding:2px}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.SizeService }, { type: i0.NgZone }]; }, propDecorators: { elemChart: [{
type: ViewChild,
args: ['elemChart', { static: true }]
}], type: [{
type: Input,
args: ['type']
}], hiddenData: [{
type: Input,
args: ['hiddenData']
}], pointHover: [{
type: Output,
args: ['pointHover']
}], warpViewChartResize: [{
type: Output,
args: ['warpViewChartResize']
}], chartDraw: [{
type: Output,
args: ['chartDraw']
}], boundsDidChange: [{
type: Output,
args: ['boundsDidChange']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FycC12aWV3LWV2ZW50LWRyb3AuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2FycHZpZXctbmcvc3JjL2xpYi9lbGVtZW50cy93YXJwLXZpZXctZXZlbnQtZHJvcC93YXJwLXZpZXctZXZlbnQtZHJvcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93YXJwdmlldy1uZy9zcmMvbGliL2VsZW1lbnRzL3dhcnAtdmlldy1ldmVudC1kcm9wL3dhcnAtdmlldy1ldmVudC1kcm9wLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sU0FBUyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLE1BQU0s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QUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUMxRixHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFO1NBQ3pGLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU0sTUFBTSxDQUFDLE1BQXNDO1FBQ2xELEVBQUU7SUFDSixDQUFDOzt1SEE3TFUsMEJBQTBCOzJHQUExQiwwQkFBMEIsMllDbER2QywyNkJBdUJBOzJGRDJCYSwwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UscUJBQXFCLGlCQUdoQixpQkFBaUIsQ0FBQyxJQUFJO3dLQUdHLFNBQVM7c0JBQWhELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFbkIsSUFBSTtzQkFBdEIsS0FBSzt1QkFBQyxNQUFNO2dCQU1ZLFVBQVU7c0JBQWxDLEtBQUs7dUJBQUMsWUFBWTtnQkFlRyxVQUFVO3NCQUEvQixNQUFNO3VCQUFDLFlBQVk7Z0JBQ1csbUJBQW1CO3NCQUFqRCxNQUFNO3VCQUFDLHFCQUFxQjtnQkFDUixTQUFTO3NCQUE3QixNQUFNO3VCQUFDLFdBQVc7Z0JBQ1EsZUFBZTtzQkFBekMsTUFBTTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogIENvcHlyaWdodCAyMDIxICBTZW5YIFMuQS5TLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dhcnBWaWV3Q29tcG9uZW50fSBmcm9tICcuLi93YXJwLXZpZXctY29tcG9uZW50JztcbmltcG9ydCB7U2l6ZVNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc2l6ZS5zZXJ2aWNlJztcbmltcG9ydCB7TG9nZ2VyfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IGRlZXBFcXVhbCBmcm9tICdkZWVwLWVxdWFsJztcbmltcG9ydCB7Q2hhcnRMaWJ9IGZyb20gJy4uLy4uL3V0aWxzL2NoYXJ0LWxpYic7XG5pbXBvcnQge1BhcmFtfSBmcm9tICcuLi8uLi9tb2RlbC9wYXJhbSc7XG5pbXBvcnQge0RhdGFNb2RlbH0gZnJvbSAnLi4vLi4vbW9kZWwvZGF0YU1vZGVsJztcbmltcG9ydCB7Q29sb3JMaWJ9IGZyb20gJy4uLy4uL3V0aWxzL2NvbG9yLWxpYic7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgZXZlbnREcm9wcyBmcm9tICdldmVudC1kcm9wcyc7XG5pbXBvcnQge0dUU0xpYn0gZnJvbSAnLi4vLi4vdXRpbHMvZ3RzLmxpYic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC10aW1lem9uZSc7XG5pbXBvcnQge3NlbGVjdH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2FycHZpZXctZXZlbnQtZHJvcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93YXJwLXZpZXctZXZlbnQtZHJvcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3dhcnAtdmlldy1ldmVudC1kcm9wLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgV2FycFZpZXdFdmVudERyb3BDb21wb25lbnQgZXh0ZW5kcyBXYXJwVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZWxlbUNoYXJ0Jywge3N0YXRpYzogdHJ1ZX0pIGVsZW1DaGFydDogRWxlbWVudFJlZjtcblxuICBASW5wdXQoJ3R5cGUnKSBzZXQgdHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB0aGlzLmRyYXdDaGFydCgpO1xuICB9XG5cblxuICBASW5wdXQoJ2hpZGRlbkRhdGEnKSBzZXQgaGlkZGVuRGF0YShoaWRkZW5EYXRhOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IHByZXZpb3VzVmlzaWJpbGl0eSA9IEpTT04uc3RyaW5naWZ5KHRoaXMudmlzaWJpbGl0eSk7XG4gICAgdGhpcy5MT0cuZGVidWcoWydoaWRkZW5EYXRhJywgJ3ByZXZpb3VzVmlzaWJpbGl0eSddLCBwcmV2aW91c1Zpc2liaWxpdHkpO1xuICAgIHRoaXMuX2hpZGRlbkRhdGEgPSBoaWRkZW5EYXRhO1xuICAgIHRoaXMudmlzaWJpbGl0eSA9IFtdO1xuICAgIHRoaXMudmlzaWJsZUd0c0lkLmZvckVhY2goaWQgPT4gdGhpcy52aXNpYmlsaXR5LnB1c2goaGlkZGVuRGF0YS5pbmRleE9mKGlkKSA8IDAgJiYgKGlkICE9PSAtMSkpKTtcbiAgICB0aGlzLkxPRy5kZWJ1ZyhbJ2hpZGRlbkRhdGEnLCAnaGlkZGVuZHlncmFwaGZ1bGx2J10sIHRoaXMudmlzaWJpbGl0eSk7XG4gICAgY29uc3QgbmV3VmlzaWJpbGl0eSA9IEpTT04uc3RyaW5naWZ5KHRoaXMudmlzaWJpbGl0eSk7XG4gICAgdGhpcy5MT0cuZGVidWcoWydoaWRkZW5EYXRhJywgJ2pzb24nXSwgcHJldmlvdXNWaXNpYmlsaXR5LCBuZXdWaXNpYmlsaXR5KTtcbiAgICBpZiAocHJldmlvdXNWaXNpYmlsaXR5ICE9PSBuZXdWaXNpYmlsaXR5KSB7XG4gICAgICB0aGlzLmRyYXdDaGFydCgpO1xuICAgICAgdGhpcy5MT0cuZGVidWcoWydoaWRkZW5keWdyYXBodHJpZycsICdkZXN0cm95J10sICdyZWRyYXcgYnkgdmlzaWJpbGl0eSBjaGFuZ2UnKTtcbiAgICB9XG4gIH1cblxuICBAT3V0cHV0KCdwb2ludEhvdmVyJykgcG9pbnRIb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCd3YXJwVmlld0NoYXJ0UmVzaXplJykgd2FycFZpZXdDaGFydFJlc2l6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdjaGFydERyYXcnKSBjaGFydERyYXcgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnYm91bmRzRGlkQ2hhbmdlJykgYm91bmRzRGlkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSB2aXNpYmlsaXR5OiBib29sZWFuW10gPSBbXTtcbiAgcHJpdmF0ZSBtYXhUaWNrID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgcHJpdmF0ZSBtaW5UaWNrID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgcHJpdmF0ZSB2aXNpYmxlR3RzSWQgPSBbXTtcbiAgcHJvdGVjdGVkIF90eXBlID0gJ2Ryb3BzJztcbiAgcHJpdmF0ZSBldmVudENvbmYgPSB7XG4gICAgZDMsXG4gICAgYXhpczoge1xuICAgICAgdmVydGljYWxHcmlkOiB0cnVlLFxuICAgICAgdGlja1BhZGRpbmc6IDYsXG4gICAgfSxcbiAgICBsaW5lOiB7XG4gICAgICBoZWlnaHQ6IDIwLFxuICAgIH0sXG4gICAgaW5kaWNhdG9yOiBmYWxzZSxcbiAgICBsYWJlbDoge1xuICAgICAgdGV4dDogcm93ID0+IHJvdy5uYW1lLFxuICAgIH0sXG4gICAgbWV0YWJhbGxzOiB7XG4gICAgICBibHVyRGV2aWF0aW9uOiA3XG4gICAgfSxcbiAgICBkcm9wOiB7XG4gICAgICByYWRpdXM6IDQsXG4gICAgICBkYXRlOiBkID0+IGQuZGF0ZS50b0RhdGUoKSxcbiAgICAgIGNvbG9yOiBkID0+IGQuY29sb3IsXG4gICAgICBvbk1vdXNlT3ZlcjogZyA9PiB7XG4gICAgICAgIHRoaXMuTE9HLmRlYnVnKFsnb25Nb3VzZU92ZXInXSwgZyk7XG4gICAgICAgIHRoaXMucG9pbnRIb3Zlci5lbWl0KHtcbiAgICAgICAgICB4OiBkMy5ldmVudC5vZmZzZXRYLFxuICAgICAgICAgIHk6IGQzLmV2ZW50Lm9mZnNldFlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHQgPSBkMy5zZWxlY3QodGhpcy50b29sVGlwLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0LnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbigyMDApXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMSlcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ2F1dG8nKTtcbiAgICAgICAgdC5odG1sKGA8ZGl2IGNsYXNzPVwidG9vbHRpcC1ib2R5XCI+XG48YiBjbGFzcz1cInRvb2x0aXAtZGF0ZVwiPiR7dGhpcy5fb3B0aW9ucy50aW1lTW9kZSA9PT0gJ3RpbWVzdGFtcCdcbiAgICAgICAgICA/IGcuZGF0ZVxuICAgICAgICAgIDogKGcuZGF0ZS50b0lTT1N0cmluZygpIHx8ICcnKX08L2I+XG48ZGl2PjxpIGNsYXNzPVwiY2hpcFwiICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICR7Zy5jb2xvcn07Ym9yZGVyOiAycHggc29saWQgJHtnLmNvbG9yfTtcIj48L2k+XG4ke0dUU0xpYi5mb3JtYXRMYWJlbChnLm5hbWUpfTogPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiPiR7Zy52YWx1ZX08L3NwYW4+XG48L2Rpdj48L2Rpdj5gXG4gICAgICAgIClcbiAgICAgICAgICAuc3R5bGUoJ2xlZnQnLCBgJHtkMy5ldmVudC5vZmZzZXRYICsgMTB9cHhgKVxuICAgICAgICAgIC5zdHlsZSgndG9wJywgYCR7ZDMuZXZlbnQub2Zmc2V0WSArIDEwfXB4YCk7XG4gICAgICB9LFxuICAgICAgb25Nb3VzZU91dDogKCkgPT4ge1xuICAgICAgICBzZWxlY3QodGhpcy50b29sVGlwLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgICAgLnRyYW5zaXRpb24oKVxuICAgICAgICAgIC5kdXJhdGlvbig1MDApXG4gICAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMClcbiAgICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHVibGljIHNpemVTZXJ2aWNlOiBTaXplU2VydmljZSxcbiAgICBwdWJsaWMgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgc3VwZXIoZWwsIHJlbmRlcmVyLCBzaXplU2VydmljZSwgbmdab25lKTtcbiAgICB0aGlzLkxPRyA9IG5ldyBMb2dnZXIoV2FycFZpZXdFdmVudERyb3BDb21wb25lbnQsIHRoaXMuX2RlYnVnKTtcbiAgfVxuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHRoaXMuX29wdGlvbnMgfHwgdGhpcy5kZWZPcHRpb25zO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKCEhdGhpcy5lbGVtQ2hhcnQpIHtcbiAgICAgIHNlbGVjdCh0aGlzLmVsZW1DaGFydC5uYXRpdmVFbGVtZW50KS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUob3B0aW9ucywgcmVmcmVzaCk6IHZvaWQge1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnb25PcHRpb25zJywgJ2JlZm9yZSddLCB0aGlzLl9vcHRpb25zLCBvcHRpb25zKTtcbiAgICBpZiAoIWRlZXBFcXVhbChvcHRpb25zLCB0aGlzLl9vcHRpb25zKSkge1xuICAgICAgdGhpcy5MT0cuZGVidWcoWydvcHRpb25zJywgJ2NoYW5nZWQnXSwgb3B0aW9ucyk7XG4gICAgICB0aGlzLl9vcHRpb25zID0gQ2hhcnRMaWIubWVyZ2VEZWVwKHRoaXMuX29wdGlvbnMsIG9wdGlvbnMgYXMgUGFyYW0pIGFzIFBhcmFtO1xuICAgIH1cbiAgICB0aGlzLmRyYXdDaGFydCgpO1xuICB9XG5cbiAgdXBkYXRlQm91bmRzKG1pbiwgbWF4KSB7XG4gICAgdGhpcy5MT0cuZGVidWcoWyd1cGRhdGVCb3VuZHMnXSwgbWluLCBtYXgsIHRoaXMuX29wdGlvbnMpO1xuICAgIHRoaXMuX29wdGlvbnMuYm91bmRzLm1pbkRhdGUgPSBtaW47XG4gICAgdGhpcy5fb3B0aW9ucy5ib3VuZHMubWF4RGF0ZSA9IG1heDtcblxuICAgIGlmICh0aGlzLl9vcHRpb25zLnRpbWVNb2RlICYmIHRoaXMuX29wdGlvbnMudGltZU1vZGUgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICB0aGlzLmV2ZW50Q29uZlsncmFuZ2UnXSA9IHtzdGFydDogbWluLCBlbmQ6IG1heH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXZlbnRDb25mWydyYW5nZSddID0ge1xuICAgICAgICBzdGFydDogbW9tZW50LnR6KG1vbWVudC51dGModGhpcy5taW5UaWNrIC8gdGhpcy5kaXZpZGVyKSwgdGhpcy5fb3B0aW9ucy50aW1lWm9uZSkudG9EYXRlKCksXG4gICAgICAgIGVuZDogbW9tZW50LnR6KG1vbWVudC51dGModGhpcy5tYXhUaWNrIC8gdGhpcy5kaXZpZGVyKSwgdGhpcy5fb3B0aW9ucy50aW1lWm9uZSkudG9EYXRlKCksXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmV2ZW50Q29uZiA9IHsuLi50aGlzLmV2ZW50Q29uZn07XG4gICAgdGhpcy5MT0cuZGVidWcoWyd1cGRhdGVCb3VuZHMnXSwgdGhpcy5ldmVudENvbmYpO1xuICB9XG5cbiAgZHJhd0NoYXJ0KCkge1xuICAgIGlmICghdGhpcy5pbml0Q2hhcnQodGhpcy5lbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5MT0cuZGVidWcoWydkcmF3Q2hhcnQnLCAncGxvdGx5RGF0YSddLCB0aGlzLnBsb3RseURhdGEsIHRoaXMuX3R5cGUpO1xuICAgIGlmICh0aGlzLmVsZW1DaGFydC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGVjdCh0aGlzLmVsZW1DaGFydC5uYXRpdmVFbGVtZW50KS5kYXRhKFt0aGlzLnBsb3RseURhdGFdKS5jYWxsKGV2ZW50RHJvcHModGhpcy5ldmVudENvbmYpKSk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2hhcnREcmF3LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY29udmVydChkYXRhOiBEYXRhTW9kZWwpOiBhbnlbXSB7XG4gICAgdGhpcy5MT0cuZGVidWcoWydjb252ZXJ0J10sIGRhdGEpO1xuICAgIGNvbnN0IGd0c0xpc3QgPSBHVFNMaWIuZmxhdERlZXAoZGF0YS5kYXRhIGFzIGFueVtdKTtcbiAgICBjb25zdCBkYXRhTGlzdCA9IFtdO1xuICAgIHRoaXMuTE9HLmRlYnVnKFsnY29udmVydCcsICdndHNMaXN0J10sIGd0c0xpc3QpO1xuICAgIGlmICghZ3RzTGlzdCB8fCBndHNMaXN0Lmxlbmd0aCA9PT0gMCB8fCBndHNMaXN0WzBdLmxlbmd0aCA8IDIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZ3RzTGlzdC5mb3JFYWNoKChndHMsIGkpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBDb2xvckxpYi5nZXRDb2xvcihndHMuaWQgfHwgaSwgdGhpcy5fb3B0aW9ucy5zY2hlbWUpO1xuICAgICAgY29uc3QgY29sb3IgPSAoKGRhdGEucGFyYW1zIHx8IFtdKVtpXSB8fCB7ZGF0YXNldENvbG9yOiBjfSkuZGF0YXNldENvbG9yIHx8IGM7XG4gICAgICBjb25zdCBndHNOYW1lID0gR1RTTGliLnNlcmlhbGl6ZUd0c01ldGFkYXRhKGd0cyk7XG4gICAgICBjb25zdCBkYXRhU2V0ID0ge25hbWU6ICcnLCBjb2xvciwgZGF0YTogW119O1xuICAgICAgY29uc3Qgc2l6ZSA9IChndHMudiB8fCBbXSkubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCBzaXplOyB2KyspIHtcbiAgICAgICAgY29uc3QgcG9pbnQgPSAoZ3RzLnYgfHwgW10pW3ZdO1xuICAgICAgICBjb25zdCB0cyA9IHBvaW50WzBdO1xuICAgICAgICB0aGlzLm1pblRpY2sgPSBNYXRoLm1pbih0aGlzLm1pblRpY2ssIHRzKTtcbiAgICAgICAgdGhpcy5tYXhUaWNrID0gTWF0aC5tYXgodGhpcy5tYXhUaWNrLCB0cyk7XG4gICAgICAgIGxldCB2YWx1ZSA9IHBvaW50W3BvaW50Lmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFTZXQuZGF0YS5wdXNoKHtcbiAgICAgICAgICBkYXRlOiBtb21lbnQudHoobW9tZW50LnV0Yyh0cyAvIHRoaXMuZGl2aWRlciksIHRoaXMuX29wdGlvbnMudGltZVpvbmUpLFxuICAgICAgICAgIGNvbG9yOiBDb2xvckxpYi50cmFuc3BhcmVudGl6ZShjb2xvciksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbmFtZTogZ3RzTmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRhdGFMaXN0LnB1c2goZGF0YVNldCk7XG4gICAgfSk7XG4gICAgdGhpcy5MT0cuZGVidWcoWydjb252ZXJ0JywgJ2RhdGFMaXN0J10sIGRhdGFMaXN0KTtcbiAgICB0aGlzLmV2ZW50Q29uZi5sYWJlbCBbJ3dpZHRoJ10gPSAwO1xuICAgIHRoaXMuZXZlbnRDb25mICBbJ3JhbmdlJ10gPSB7XG4gICAgICBzdGFydDogbW9tZW50LnR6KG1vbWVudC51dGModGhpcy5taW5UaWNrIC8gdGhpcy5kaXZpZGVyKSwgdGhpcy5fb3B0aW9ucy50aW1lWm9uZSkudG9EYXRlKCksXG4gICAgICBlbmQ6IG1vbWVudC50eihtb21lbnQudXRjKHRoaXMubWF4VGljayAvIHRoaXMuZGl2aWRlciksIHRoaXMuX29wdGlvbnMudGltZVpvbmUpLnRvRGF0ZSgpLFxuICAgIH07XG4gICAgcmV0dXJuIGRhdGFMaXN0O1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZShsYXlvdXQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBhbnkgfSkge1xuICAgIC8vXG4gIH1cbn1cbiIsIjwhLS1cbiAgfiAgQ29weXJpZ2h0IDIwMjEgIFNlblggUy5BLlMuXG4gIH5cbiAgfiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+ICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+ICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICB+XG4gIH4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICB+ICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+ICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgflxuICAtLT5cblxuPGRpdiBpZD1cImNoYXJ0Q29udGFpbmVyXCI+XG4gIDx3YXJwdmlldy1zcGlubmVyICpuZ0lmPVwibG9hZGluZ1wiIG1lc3NhZ2U9XCJQYXJzaW5nIGRhdGFcIj48L3dhcnB2aWV3LXNwaW5uZXI+XG4gIDxkaXYgI3Rvb2xUaXAgY2xhc3M9XCJ3di10b29sdGlwXCI+PC9kaXY+XG4gIDxwIGNsYXNzPVwibm9EYXRhXCIgKm5nSWY9XCJub0RhdGFcIj5ObyBkYXRhIHRvIGRpc3BsYXk8L3A+XG4gIDxkaXYgI2VsZW1DaGFydCBzdHlsZT1cIndpZHRoOiAxMDAlO2hlaWdodDogMTAwJVwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=