ngx-hana-nameserver-history-viewer 1.2.1 → 21.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/{fesm2020 → fesm2022}/ngx-hana-nameserver-history-viewer.mjs +2898 -3983
- package/fesm2022/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/ngx-hana-nameserver-history-viewer-21.1.0.tgz +0 -0
- package/package.json +20 -27
- package/types/ngx-hana-nameserver-history-viewer.d.ts +545 -0
- package/esm2020/ngx-hana-nameserver-history-viewer.mjs +0 -5
- package/esm2020/public-api.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +0 -68
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +0 -22
- package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +0 -3
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +0 -112
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/index.mjs +0 -9
- package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +0 -42
- package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +0 -557
- package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +0 -69
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +0 -41
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +0 -40
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +0 -70
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +0 -88
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +0 -47
- package/esm2020/src/nameserver-history-viewer/index.mjs +0 -3
- package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +0 -63
- package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +0 -328
- package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +0 -390
- package/esm2020/src/nameserver-history-viewer/services/index.mjs +0 -4
- package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +0 -557
- package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +0 -6
- package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +0 -8
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +0 -9
- package/esm2020/src/nameserver-history-viewer/types/index.mjs +0 -28
- package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +0 -14
- package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +0 -17
- package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +0 -10
- package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +0 -14
- package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +0 -25
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +0 -56
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +0 -139
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +0 -41
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +0 -106
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +0 -167
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +0 -114
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +0 -527
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +0 -2
- package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +0 -161
- package/esm2020/src/nameserver-history-viewer/utils/index.mjs +0 -5
- package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +0 -99
- package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +0 -162
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +0 -4098
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +0 -1
- package/ngx-hana-nameserver-history-viewer.d.ts +0 -5
- package/public-api.d.ts +0 -1
- package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +0 -21
- package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +0 -8
- package/src/nameserver-history-viewer/components/alert/index.d.ts +0 -2
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +0 -16
- package/src/nameserver-history-viewer/components/file-drop-input/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/index.d.ts +0 -8
- package/src/nameserver-history-viewer/components/instruction/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +0 -17
- package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +0 -262
- package/src/nameserver-history-viewer/components/port-selector/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +0 -31
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +0 -14
- package/src/nameserver-history-viewer/components/progress-bar/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +0 -6
- package/src/nameserver-history-viewer/components/time-range-selector/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +0 -19
- package/src/nameserver-history-viewer/components/timezone-selector/index.d.ts +0 -1
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +0 -26
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +0 -21
- package/src/nameserver-history-viewer/index.d.ts +0 -2
- package/src/nameserver-history-viewer/nameserver-history.module.d.ts +0 -19
- package/src/nameserver-history-viewer/services/chart.service.d.ts +0 -59
- package/src/nameserver-history-viewer/services/file.service.d.ts +0 -63
- package/src/nameserver-history-viewer/services/index.d.ts +0 -3
- package/src/nameserver-history-viewer/services/ui.service.d.ts +0 -88
- package/src/nameserver-history-viewer/types/abort.types.d.ts +0 -4
- package/src/nameserver-history-viewer/types/alert.types.d.ts +0 -6
- package/src/nameserver-history-viewer/types/chart-content-data-item.types.d.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-data.types.d.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-header.types.d.ts +0 -4
- package/src/nameserver-history-viewer/types/chart-content-time.types.d.ts +0 -3
- package/src/nameserver-history-viewer/types/chart-content.types.d.ts +0 -10
- package/src/nameserver-history-viewer/types/color-rgba.types.d.ts +0 -6
- package/src/nameserver-history-viewer/types/html-element.type.d.ts +0 -7
- package/src/nameserver-history-viewer/types/index.d.ts +0 -27
- package/src/nameserver-history-viewer/types/item.types.d.ts +0 -12
- package/src/nameserver-history-viewer/types/legend-color.types.d.ts +0 -4
- package/src/nameserver-history-viewer/types/load-history-info-backup.types.d.ts +0 -7
- package/src/nameserver-history-viewer/types/load-history-info-columnstore.types.d.ts +0 -7
- package/src/nameserver-history-viewer/types/load-history-info-host.types.d.ts +0 -15
- package/src/nameserver-history-viewer/types/load-history-info-item.types.d.ts +0 -13
- package/src/nameserver-history-viewer/types/load-history-info-persistence.types.d.ts +0 -11
- package/src/nameserver-history-viewer/types/load-history-info-rowstore.types.d.ts +0 -5
- package/src/nameserver-history-viewer/types/load-history-info-server.types.d.ts +0 -10
- package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +0 -10
- package/src/nameserver-history-viewer/types/load-history-info-sql.types.d.ts +0 -16
- package/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.d.ts +0 -5
- package/src/nameserver-history-viewer/types/load-history-info-threads.types.d.ts +0 -9
- package/src/nameserver-history-viewer/types/load-history-info.types.d.ts +0 -22
- package/src/nameserver-history-viewer/types/port.types.d.ts +0 -5
- package/src/nameserver-history-viewer/types/scale-group.types.d.ts +0 -15
- package/src/nameserver-history-viewer/types/unit-category.types.d.ts +0 -8
- package/src/nameserver-history-viewer/types/unit.types.d.ts +0 -12
- package/src/nameserver-history-viewer/utils/chart-util.d.ts +0 -14
- package/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.d.ts +0 -89
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.d.ts +0 -32
- package/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.d.ts +0 -78
- package/src/nameserver-history-viewer/utils/chartjs-downsample/index.d.ts +0 -1
- package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +0 -57
- package/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.d.ts +0 -55
- package/src/nameserver-history-viewer/utils/chartjs-downsample/utils.d.ts +0 -64
- package/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.d.ts +0 -30
- package/src/nameserver-history-viewer/utils/chartjs-zoom/index.d.ts +0 -1
- package/src/nameserver-history-viewer/utils/file-util.d.ts +0 -68
- package/src/nameserver-history-viewer/utils/index.d.ts +0 -4
- package/src/nameserver-history-viewer/utils/time-util.d.ts +0 -23
- package/src/nameserver-history-viewer/utils/ui-util.d.ts +0 -41
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import * as utils from './utils';
|
|
2
|
-
import { DataMipmap } from './data_mipmap';
|
|
3
|
-
/**
|
|
4
|
-
* A mipmap data structure that uses Largest-Triangle-Three-Buckets algorithm to downsample data
|
|
5
|
-
*/
|
|
6
|
-
export class LTTBDataMipmap extends DataMipmap {
|
|
7
|
-
getMipMapIndexForResolution(resolution) {
|
|
8
|
-
if (utils.isNil(resolution)) {
|
|
9
|
-
return 0;
|
|
10
|
-
}
|
|
11
|
-
let index = utils.findIndexInArray(this.resolutions, (levelResolution) => levelResolution >= resolution);
|
|
12
|
-
if (index === -1) {
|
|
13
|
-
// use smallest mipmap as fallback
|
|
14
|
-
index = this.resolutions.length - 1;
|
|
15
|
-
}
|
|
16
|
-
return index;
|
|
17
|
-
}
|
|
18
|
-
createMipMap() {
|
|
19
|
-
super.createMipMap();
|
|
20
|
-
this.resolutions = this.mipMaps.map((level) => this.computeAverageResolution(level));
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* This method is adapted from: https://github.com/sveinn-steinarsson/flot-downsample
|
|
24
|
-
*
|
|
25
|
-
* The MIT License
|
|
26
|
-
* Copyright (c) 2013 by Sveinn Steinarsson
|
|
27
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
28
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
29
|
-
* in the Software without restriction, including without limitation the rights
|
|
30
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
31
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
32
|
-
* furnished to do so, subject to the following conditions:
|
|
33
|
-
* The above copyright notice and this permission notice shall be included in
|
|
34
|
-
* all copies or substantial portions of the Software.
|
|
35
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
36
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
37
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
38
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
39
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
40
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
41
|
-
* THE SOFTWARE.
|
|
42
|
-
*/
|
|
43
|
-
downsampleToResolution(data, targetResolution, targetLength) {
|
|
44
|
-
const dataLength = data.length;
|
|
45
|
-
if (targetLength >= dataLength || targetLength === 0) {
|
|
46
|
-
return data; // data has target size
|
|
47
|
-
}
|
|
48
|
-
const output = [];
|
|
49
|
-
// bucket size, leave room for start and end data points
|
|
50
|
-
const bucksetSize = (dataLength - 2) / (targetLength - 2);
|
|
51
|
-
let a = 0; // initially a is the first point in the triangle
|
|
52
|
-
let maxAreaPoint;
|
|
53
|
-
let maxArea;
|
|
54
|
-
let area;
|
|
55
|
-
let nextA;
|
|
56
|
-
// always add the first point
|
|
57
|
-
output.push(data[a]);
|
|
58
|
-
for (let i = 0; i < targetLength - 2; ++i) {
|
|
59
|
-
// Calculate point average for next bucket (containing c)
|
|
60
|
-
let avgX = 0;
|
|
61
|
-
let avgY = 0;
|
|
62
|
-
let avgRangeStart = Math.floor((i + 1) * bucksetSize) + 1;
|
|
63
|
-
let avgRangeEnd = Math.floor((i + 2) * bucksetSize) + 1;
|
|
64
|
-
avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;
|
|
65
|
-
const avgRangeLength = avgRangeEnd - avgRangeStart;
|
|
66
|
-
for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {
|
|
67
|
-
avgX += this.getTime(data[avgRangeStart]);
|
|
68
|
-
avgY += data[avgRangeStart].y * 1;
|
|
69
|
-
}
|
|
70
|
-
avgX /= avgRangeLength;
|
|
71
|
-
avgY /= avgRangeLength;
|
|
72
|
-
// Get the range for this bucket
|
|
73
|
-
let rangeOffs = Math.floor((i + 0) * bucksetSize) + 1;
|
|
74
|
-
const rangeTo = Math.floor((i + 1) * bucksetSize) + 1;
|
|
75
|
-
// Point a
|
|
76
|
-
const pointA = data[a];
|
|
77
|
-
const pointAX = this.getTime(pointA);
|
|
78
|
-
const pointAY = pointA.y * 1;
|
|
79
|
-
maxArea = area = -1;
|
|
80
|
-
for (; rangeOffs < rangeTo; rangeOffs++) {
|
|
81
|
-
// Calculate triangle area over three buckets
|
|
82
|
-
area = Math.abs((pointAX - avgX) * (data[rangeOffs].y - pointAY) -
|
|
83
|
-
(pointAX - this.getTime(data[rangeOffs])) * (avgY - pointAY)) * 0.5;
|
|
84
|
-
if (area > maxArea) {
|
|
85
|
-
maxArea = area;
|
|
86
|
-
maxAreaPoint = data[rangeOffs];
|
|
87
|
-
nextA = rangeOffs; // Next a is this b
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
output.push(maxAreaPoint); // Pick this point from the bucket
|
|
91
|
-
a = nextA; // This a is the next a (chosen b)
|
|
92
|
-
}
|
|
93
|
-
output.push(data[dataLength - 1]); // Always add last
|
|
94
|
-
return output;
|
|
95
|
-
}
|
|
96
|
-
computeAverageResolution(data) {
|
|
97
|
-
let timeDistances = 0;
|
|
98
|
-
for (let i = 0, end = this.originalData.length - 1; i < end; ++i) {
|
|
99
|
-
const current = this.originalData[i];
|
|
100
|
-
const next = this.originalData[i + 1];
|
|
101
|
-
timeDistances += Math.abs(this.getTime(current) - this.getTime(next));
|
|
102
|
-
}
|
|
103
|
-
return timeDistances / (data.length - 1);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHR0Yl9kYXRhX21pcG1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9sdHRiX2RhdGFfbWlwbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQSxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWUsU0FBUSxVQUFVO0lBRzFDLDJCQUEyQixDQUFDLFVBQWtCO1FBQzFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQUU7UUFFMUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsQ0FBQztRQUN6RyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLGtDQUFrQztZQUNsQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLFlBQVk7UUFDbEIsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDTyxzQkFBc0IsQ0FDNUIsSUFBa0IsRUFDbEIsZ0JBQXdCLEVBQ3hCLFlBQW9CO1FBRXBCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxZQUFZLElBQUksVUFBVSxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUMsQ0FBQyx1QkFBdUI7U0FDdkM7UUFFRCxNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1FBRWhDLHdEQUF3RDtRQUN4RCxNQUFNLFdBQVcsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBRSxpREFBaUQ7UUFDN0QsSUFBSSxZQUF3QixDQUFDO1FBQzdCLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksSUFBWSxDQUFDO1FBQ2pCLElBQUksS0FBYSxDQUFDO1FBRWxCLDZCQUE2QjtRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3ZDLHlEQUF5RDtZQUN6RCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4RCxXQUFXLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFFbEUsTUFBTSxjQUFjLEdBQUcsV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUVuRCxPQUFPLGFBQWEsR0FBRyxXQUFXLEVBQUUsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQVcsR0FBRyxDQUFDLENBQUM7YUFDL0M7WUFDRCxJQUFJLElBQUksY0FBYyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxjQUFjLENBQUM7WUFFdkIsZ0NBQWdDO1lBQ2hDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXRELFVBQVU7WUFDVixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBVyxHQUFHLENBQUMsQ0FBQztZQUV2QyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXBCLE9BQU8sU0FBUyxHQUFHLE9BQU8sRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDckMsNkNBQTZDO2dCQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFXLEdBQUcsT0FBTyxDQUFDO29CQUN0RSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQy9ELEdBQUcsR0FBRyxDQUFDO2dCQUVSLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRTtvQkFDaEIsT0FBTyxHQUFHLElBQUksQ0FBQztvQkFDZixZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUMvQixLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsbUJBQW1CO2lCQUN6QzthQUNKO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztZQUM3RCxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsa0NBQWtDO1NBQ2hEO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFFckQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVTLHdCQUF3QixDQUFDLElBQWtCO1FBQ2pELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUV0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUV0QyxhQUFhLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RTtRQUNELE9BQU8sYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5pbXBvcnQgeyBDaGFydFBvaW50IH0gZnJvbSAnY2hhcnQuanMnO1xyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgRGF0YU1pcG1hcCB9IGZyb20gJy4vZGF0YV9taXBtYXAnO1xyXG5cclxuLyoqXHJcbiAqIEEgbWlwbWFwIGRhdGEgc3RydWN0dXJlIHRoYXQgdXNlcyBMYXJnZXN0LVRyaWFuZ2xlLVRocmVlLUJ1Y2tldHMgYWxnb3JpdGhtIHRvIGRvd25zYW1wbGUgZGF0YVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIExUVEJEYXRhTWlwbWFwIGV4dGVuZHMgRGF0YU1pcG1hcCB7XHJcbiAgICBwcm90ZWN0ZWQgcmVzb2x1dGlvbnM6IG51bWJlcltdO1xyXG5cclxuICAgIGdldE1pcE1hcEluZGV4Rm9yUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGlmICh1dGlscy5pc05pbChyZXNvbHV0aW9uKSkgeyByZXR1cm4gMDsgfVxyXG5cclxuICAgICAgICBsZXQgaW5kZXggPSB1dGlscy5maW5kSW5kZXhJbkFycmF5KHRoaXMucmVzb2x1dGlvbnMsIChsZXZlbFJlc29sdXRpb24pID0+IGxldmVsUmVzb2x1dGlvbiA+PSByZXNvbHV0aW9uKTtcclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIC8vIHVzZSBzbWFsbGVzdCBtaXBtYXAgYXMgZmFsbGJhY2tcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlc29sdXRpb25zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNyZWF0ZU1pcE1hcCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5jcmVhdGVNaXBNYXAoKTtcclxuICAgICAgICB0aGlzLnJlc29sdXRpb25zID0gdGhpcy5taXBNYXBzLm1hcCgobGV2ZWwpID0+IHRoaXMuY29tcHV0ZUF2ZXJhZ2VSZXNvbHV0aW9uKGxldmVsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBhZGFwdGVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9zdmVpbm4tc3RlaW5hcnNzb24vZmxvdC1kb3duc2FtcGxlXHJcbiAgICAgKlxyXG4gICAgICogVGhlIE1JVCBMaWNlbnNlXHJcbiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTMgYnkgU3ZlaW5uIFN0ZWluYXJzc29uXHJcbiAgICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAgICAgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAgICAgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAgICAgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAgICAgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICAgICAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAgICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxyXG4gICAgICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAgICAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAgICAgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICAgICAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gICAgICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gICAgICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICAgICAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cclxuICAgICAqIFRIRSBTT0ZUV0FSRS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGRvd25zYW1wbGVUb1Jlc29sdXRpb24oXHJcbiAgICAgICAgZGF0YTogQ2hhcnRQb2ludFtdLFxyXG4gICAgICAgIHRhcmdldFJlc29sdXRpb246IG51bWJlcixcclxuICAgICAgICB0YXJnZXRMZW5ndGg6IG51bWJlclxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgIGlmICh0YXJnZXRMZW5ndGggPj0gZGF0YUxlbmd0aCB8fCB0YXJnZXRMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7IC8vIGRhdGEgaGFzIHRhcmdldCBzaXplXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvdXRwdXQ6IENoYXJ0UG9pbnRbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBidWNrZXQgc2l6ZSwgbGVhdmUgcm9vbSBmb3Igc3RhcnQgYW5kIGVuZCBkYXRhIHBvaW50c1xyXG4gICAgICAgIGNvbnN0IGJ1Y2tzZXRTaXplID0gKGRhdGFMZW5ndGggLSAyKSAvICh0YXJnZXRMZW5ndGggLSAyKTtcclxuXHJcbiAgICAgICAgbGV0IGEgPSAwOyAgLy8gaW5pdGlhbGx5IGEgaXMgdGhlIGZpcnN0IHBvaW50IGluIHRoZSB0cmlhbmdsZVxyXG4gICAgICAgIGxldCBtYXhBcmVhUG9pbnQ6IENoYXJ0UG9pbnQ7XHJcbiAgICAgICAgbGV0IG1heEFyZWE6IG51bWJlcjtcclxuICAgICAgICBsZXQgYXJlYTogbnVtYmVyO1xyXG4gICAgICAgIGxldCBuZXh0QTogbnVtYmVyO1xyXG5cclxuICAgICAgICAvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBwb2ludFxyXG4gICAgICAgIG91dHB1dC5wdXNoKGRhdGFbYV0pO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldExlbmd0aCAtIDI7ICsraSkge1xyXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9pbnQgYXZlcmFnZSBmb3IgbmV4dCBidWNrZXQgKGNvbnRhaW5pbmcgYylcclxuICAgICAgICAgICAgbGV0IGF2Z1ggPSAwO1xyXG4gICAgICAgICAgICBsZXQgYXZnWSA9IDA7XHJcbiAgICAgICAgICAgIGxldCBhdmdSYW5nZVN0YXJ0ID0gTWF0aC5mbG9vcigoaSArIDEpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgbGV0IGF2Z1JhbmdlRW5kID0gTWF0aC5mbG9vcigoaSArIDIpICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgYXZnUmFuZ2VFbmQgPSBhdmdSYW5nZUVuZCA8IGRhdGFMZW5ndGggPyBhdmdSYW5nZUVuZCA6IGRhdGFMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhdmdSYW5nZUxlbmd0aCA9IGF2Z1JhbmdlRW5kIC0gYXZnUmFuZ2VTdGFydDtcclxuXHJcbiAgICAgICAgICAgIGZvciAoOyBhdmdSYW5nZVN0YXJ0IDwgYXZnUmFuZ2VFbmQ7IGF2Z1JhbmdlU3RhcnQrKykge1xyXG4gICAgICAgICAgICAgICAgYXZnWCArPSB0aGlzLmdldFRpbWUoZGF0YVthdmdSYW5nZVN0YXJ0XSk7XHJcbiAgICAgICAgICAgICAgICBhdmdZICs9IGRhdGFbYXZnUmFuZ2VTdGFydF0ueSBhcyBudW1iZXIgKiAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF2Z1ggLz0gYXZnUmFuZ2VMZW5ndGg7XHJcbiAgICAgICAgICAgIGF2Z1kgLz0gYXZnUmFuZ2VMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJhbmdlIGZvciB0aGlzIGJ1Y2tldFxyXG4gICAgICAgICAgICBsZXQgcmFuZ2VPZmZzID0gTWF0aC5mbG9vcigoaSArIDApICogYnVja3NldFNpemUpICsgMTtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VUbyA9IE1hdGguZmxvb3IoKGkgKyAxKSAqIGJ1Y2tzZXRTaXplKSArIDE7XHJcblxyXG4gICAgICAgICAgICAvLyBQb2ludCBhXHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QSA9IGRhdGFbYV07XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50QVggPSB0aGlzLmdldFRpbWUocG9pbnRBKTtcclxuICAgICAgICAgICAgY29uc3QgcG9pbnRBWSA9IHBvaW50QS55IGFzIG51bWJlciAqIDE7XHJcblxyXG4gICAgICAgICAgICBtYXhBcmVhID0gYXJlYSA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yICg7IHJhbmdlT2ZmcyA8IHJhbmdlVG87IHJhbmdlT2ZmcysrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdHJpYW5nbGUgYXJlYSBvdmVyIHRocmVlIGJ1Y2tldHNcclxuICAgICAgICAgICAgICAgIGFyZWEgPSBNYXRoLmFicygocG9pbnRBWCAtIGF2Z1gpICogKGRhdGFbcmFuZ2VPZmZzXS55IGFzIG51bWJlciAtIHBvaW50QVkpIC1cclxuICAgICAgICAgICAgICAgICAgICAocG9pbnRBWCAtIHRoaXMuZ2V0VGltZShkYXRhW3JhbmdlT2Zmc10pKSAqIChhdmdZIC0gcG9pbnRBWSlcclxuICAgICAgICAgICAgICAgICkgKiAwLjU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFyZWEgPiBtYXhBcmVhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYSA9IGFyZWE7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF4QXJlYVBvaW50ID0gZGF0YVtyYW5nZU9mZnNdO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRBID0gcmFuZ2VPZmZzOyAvLyBOZXh0IGEgaXMgdGhpcyBiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKG1heEFyZWFQb2ludCk7IC8vIFBpY2sgdGhpcyBwb2ludCBmcm9tIHRoZSBidWNrZXRcclxuICAgICAgICAgICAgYSA9IG5leHRBOyAvLyBUaGlzIGEgaXMgdGhlIG5leHQgYSAoY2hvc2VuIGIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvdXRwdXQucHVzaChkYXRhW2RhdGFMZW5ndGggLSAxXSk7IC8vIEFsd2F5cyBhZGQgbGFzdFxyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjb21wdXRlQXZlcmFnZVJlc29sdXRpb24oZGF0YTogQ2hhcnRQb2ludFtdKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgdGltZURpc3RhbmNlcyA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlbmQgPSB0aGlzLm9yaWdpbmFsRGF0YS5sZW5ndGggLSAxOyBpIDwgZW5kOyArK2kpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMub3JpZ2luYWxEYXRhW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5vcmlnaW5hbERhdGFbaSArIDFdO1xyXG5cclxuICAgICAgICAgICAgdGltZURpc3RhbmNlcyArPSBNYXRoLmFicyh0aGlzLmdldFRpbWUoY3VycmVudCkgLSB0aGlzLmdldFRpbWUobmV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGltZURpc3RhbmNlcyAvIChkYXRhLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
|
|
3
|
-
* for controlling the radius of point.
|
|
4
|
-
*
|
|
5
|
-
* MIT License
|
|
6
|
-
* Copyright (c) 2018 3D Content Logistics
|
|
7
|
-
*
|
|
8
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
10
|
-
* in the Software without restriction, including without limitation the rights
|
|
11
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
13
|
-
* furnished to do so, subject to the following conditions:
|
|
14
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
-
* copies or substantial portions of the Software.
|
|
16
|
-
*
|
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
-
* SOFTWARE.
|
|
24
|
-
*/
|
|
25
|
-
import moment from 'moment';
|
|
26
|
-
import * as utils from './utils';
|
|
27
|
-
import { DataMipmap } from './data_mipmap';
|
|
28
|
-
import { LTTBDataMipmap } from './lttb_data_mipmap';
|
|
29
|
-
import * as data_culling from './data_culling';
|
|
30
|
-
// Using dynamic flag to fix the issue of ng-packagr #696: Lambda not supported
|
|
31
|
-
// @dynamic
|
|
32
|
-
/**
|
|
33
|
-
* Chart js Plugin for downsampling data
|
|
34
|
-
*/
|
|
35
|
-
export class ResponsiveDownsamplePlugin {
|
|
36
|
-
static getPluginOptions(chart) {
|
|
37
|
-
const options = chart.options.responsiveDownsample || {};
|
|
38
|
-
utils.defaultsDeep(options, {
|
|
39
|
-
enabled: false,
|
|
40
|
-
aggregationAlgorithm: 'LTTB',
|
|
41
|
-
desiredDataPointDistance: 1,
|
|
42
|
-
minNumPoints: 100,
|
|
43
|
-
maxNumPointsToDraw: 100,
|
|
44
|
-
cullData: true
|
|
45
|
-
});
|
|
46
|
-
if (options.enabled) {
|
|
47
|
-
chart.options.responsiveDownsample = options;
|
|
48
|
-
}
|
|
49
|
-
return options;
|
|
50
|
-
}
|
|
51
|
-
static hasDataChanged(chart) {
|
|
52
|
-
return !utils.isNil(utils.findInArray(chart.data.datasets, (dataset) => {
|
|
53
|
-
return utils.isNil(dataset.mipMap);
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
static createDataMipMap(chart, options) {
|
|
57
|
-
chart.data.datasets.forEach((dataset) => {
|
|
58
|
-
// @ts-ignore
|
|
59
|
-
const data = !utils.isNil(dataset.originalData) ? dataset.originalData : dataset.data;
|
|
60
|
-
const mipMap = (options.aggregationAlgorithm === 'LTTB')
|
|
61
|
-
? new LTTBDataMipmap(data, options.minNumPoints)
|
|
62
|
-
: new DataMipmap(data, options.minNumPoints);
|
|
63
|
-
dataset.originalData = data;
|
|
64
|
-
dataset.mipMap = mipMap;
|
|
65
|
-
// @ts-ignore
|
|
66
|
-
dataset.data = mipMap.getMipMapLevel(mipMap.getNumLevel() - 1); // set last level for first render pass
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
static restoreOriginalData(chart) {
|
|
70
|
-
let updated = false;
|
|
71
|
-
chart.data.datasets.forEach((dataset) => {
|
|
72
|
-
// @ts-ignore
|
|
73
|
-
if (!utils.isNil(dataset.originalData) && dataset.data !== dataset.originalData) {
|
|
74
|
-
// @ts-ignore
|
|
75
|
-
dataset.data = dataset.originalData;
|
|
76
|
-
updated = true;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
return updated;
|
|
80
|
-
}
|
|
81
|
-
static getTargetResolution(chart, options) {
|
|
82
|
-
const xScale = chart.scales['x-axis-0'];
|
|
83
|
-
if (utils.isNil(xScale)) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
const start = moment(xScale.getValueForPixel(xScale.left));
|
|
87
|
-
const end = moment(xScale.getValueForPixel(xScale.left + 1));
|
|
88
|
-
const targetResolution = end.diff(start);
|
|
89
|
-
return targetResolution * options.desiredDataPointDistance;
|
|
90
|
-
}
|
|
91
|
-
static updateMipMap(chart, options, rangeChanged) {
|
|
92
|
-
let updated = false;
|
|
93
|
-
chart.data.datasets.forEach((dataset) => {
|
|
94
|
-
const mipMap = dataset.mipMap;
|
|
95
|
-
if (utils.isNil(mipMap)) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const mipMalLevel = mipMap.getMipMapIndexForResolution(options.targetResolution);
|
|
99
|
-
if (mipMalLevel === dataset.currentMipMapLevel && !rangeChanged) {
|
|
100
|
-
// skip update if mip map level and data range did not change
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
updated = true;
|
|
104
|
-
dataset.currentMipMapLevel = mipMalLevel;
|
|
105
|
-
let newData = mipMap.getMipMapLevel(mipMalLevel);
|
|
106
|
-
if (options.cullData) {
|
|
107
|
-
newData = data_culling.cullData(newData, options.scaleRange);
|
|
108
|
-
}
|
|
109
|
-
// @ts-ignore
|
|
110
|
-
dataset.data = newData;
|
|
111
|
-
});
|
|
112
|
-
return updated;
|
|
113
|
-
}
|
|
114
|
-
beforeInit(chart) {
|
|
115
|
-
const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
|
|
116
|
-
if (!options.enabled) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
|
|
120
|
-
options.needsUpdate = true;
|
|
121
|
-
}
|
|
122
|
-
beforeDatasetsUpdate(chart) {
|
|
123
|
-
const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
|
|
124
|
-
if (!options.enabled) {
|
|
125
|
-
// restore original data and remove state from options
|
|
126
|
-
options.needsUpdate = ResponsiveDownsamplePlugin.restoreOriginalData(chart);
|
|
127
|
-
delete options.targetResolution;
|
|
128
|
-
delete options.scaleRange;
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
// only update mip map if data set was reloaded externally
|
|
132
|
-
if (ResponsiveDownsamplePlugin.hasDataChanged(chart)) {
|
|
133
|
-
ResponsiveDownsamplePlugin.createDataMipMap(chart, options);
|
|
134
|
-
options.needsUpdate = true;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
beforeRender(chart) {
|
|
138
|
-
const options = ResponsiveDownsamplePlugin.getPluginOptions(chart);
|
|
139
|
-
if (!options.enabled) {
|
|
140
|
-
// update chart if data was restored from original data
|
|
141
|
-
if (options.needsUpdate) {
|
|
142
|
-
options.needsUpdate = false;
|
|
143
|
-
chart.update(0);
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const targetResolution = ResponsiveDownsamplePlugin.getTargetResolution(chart, options);
|
|
149
|
-
const xScale = chart.scales['x-axis-0'];
|
|
150
|
-
const scaleRange = data_culling.getScaleRange(xScale);
|
|
151
|
-
const rangeChanged = !data_culling.rangeIsEqual(options.scaleRange, scaleRange);
|
|
152
|
-
if (options.needsUpdate ||
|
|
153
|
-
options.targetResolution !== targetResolution ||
|
|
154
|
-
rangeChanged) {
|
|
155
|
-
options.targetResolution = targetResolution;
|
|
156
|
-
options.scaleRange = scaleRange;
|
|
157
|
-
options.needsUpdate = false;
|
|
158
|
-
if (ResponsiveDownsamplePlugin.updateMipMap(chart, options, rangeChanged)) {
|
|
159
|
-
utils.changePointRadius(chart, options);
|
|
160
|
-
// update chart and cancel current render
|
|
161
|
-
chart.update(0);
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9kb3duc2FtcGxlX3BsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtZG93bnNhbXBsZS9yZXNwb25zaXZlX2Rvd25zYW1wbGVfcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUc1QixPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUVqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssWUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBK0MvQywrRUFBK0U7QUFDL0UsV0FBVztBQUNYOztHQUVHO0FBQ0gsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBVTtRQUNoQyxNQUFNLE9BQU8sR0FBc0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFDNUYsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDMUIsT0FBTyxFQUFFLEtBQUs7WUFDZCxvQkFBb0IsRUFBRSxNQUFNO1lBQzVCLHdCQUF3QixFQUFFLENBQUM7WUFDM0IsWUFBWSxFQUFFLEdBQUc7WUFDakIsa0JBQWtCLEVBQUUsR0FBRztZQUN2QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLE9BQU8sQ0FBQztTQUM5QztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMs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R0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVoRixJQUFJLE9BQU8sQ0FBQyxXQUFXO1lBQ3JCLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxnQkFBZ0I7WUFDN0MsWUFBWSxFQUNaO1lBQ0EsT0FBTyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1lBQzVDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRTVCLElBQUksMEJBQTBCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEVBQUU7Z0JBQ3pFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3hDLHlDQUF5QztnQkFDekMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFaEIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFRoaXMgcGx1Z2luIGlzIGFkYXB0ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tLzNkY2wvY2hhcnRqcy1wbHVnaW4tcmVzcG9uc2l2ZS1kb3duc2FtcGxlXHJcbiAqIGZvciBjb250cm9sbGluZyB0aGUgcmFkaXVzIG9mIHBvaW50LlxyXG4gKlxyXG4gKiBNSVQgTGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggM0QgQ29udGVudCBMb2dpc3RpY3NcclxuICpcclxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXHJcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXHJcbiAqXHJcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcclxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXHJcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxyXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXHJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXHJcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXHJcbiAqIFNPRlRXQVJFLlxyXG4gKi9cclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBDaGFydCwgQ2hhcnREYXRhU2V0cywgQ2hhcnRQb2ludCB9IGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgSUNoYXJ0UGx1Z2luLCBUaW1lU2NhbGUgfSBmcm9tICcuL2NoYXJ0anNfZXh0JztcclxuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBEYXRhTWlwbWFwIH0gZnJvbSAnLi9kYXRhX21pcG1hcCc7XHJcbmltcG9ydCB7IExUVEJEYXRhTWlwbWFwIH0gZnJvbSAnLi9sdHRiX2RhdGFfbWlwbWFwJztcclxuaW1wb3J0ICogYXMgZGF0YV9jdWxsaW5nIGZyb20gJy4vZGF0YV9jdWxsaW5nJztcclxuXHJcbmludGVyZmFjZSBNaXBNYXBEYXRhU2V0cyBleHRlbmRzIENoYXJ0RGF0YVNldHMge1xyXG4gIG9yaWdpbmFsRGF0YT86IENoYXJ0UG9pbnRbXTtcclxuICBjdXJyZW50TWlwTWFwTGV2ZWw/OiBudW1iZXI7XHJcbiAgbWlwTWFwPzogRGF0YU1pcG1hcDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMge1xyXG4gIC8qKlxyXG4gICAqIEVuYWJsZS9kaXNhYmxlIHBsdWdpblxyXG4gICAqL1xyXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRoZSBhZ2dyZWdhdGlvbiBhbGdvcml0aG0gdG8gdGhpbiBvdXQgZGF0YS4gRGVmYXVsdDogTFRUQlxyXG4gICAqL1xyXG4gIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtPzogJ0FWRycgfCAnTFRUQic7XHJcbiAgLyoqXHJcbiAgICogRGVzaXJlZCBtaW5pbWFsIGRpc3RhbmNlIGJldHdlZW4gZGF0YSBwb2ludHMgaW4gcGl4ZWxzLiBEZWZhdWx0OiAxIHBpeGVsXHJcbiAgICovXHJcbiAgZGVzaXJlZERhdGFQb2ludERpc3RhbmNlPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIE1pbmltYWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzLiBMaW1pdHNcclxuICAgKi9cclxuICBtaW5OdW1Qb2ludHM/OiBudW1iZXI7XHJcbiAgLyoqXHJcbiAgICogQ3VsbCBkYXRhIHRvIGRpc3BsYXllZCByYW5nZSBvZiB4IHNjYWxlXHJcbiAgICovXHJcbiAgY3VsbERhdGE/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEZsYWcgaXMgc2V0IGJ5IHBsdWdpbiB0byB0cmlnZ2VyIHJlbG9hZCBvZiBkYXRhXHJcbiAgICovXHJcbiAgbmVlZHNVcGRhdGU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIEN1cnJlbnQgdGFyZ2V0IHJlc29sdXRpb24oU2V0IGJ5IHBsdWdpbilcclxuICAgKi9cclxuICB0YXJnZXRSZXNvbHV0aW9uPzogbnVtYmVyO1xyXG4gIC8qKlxyXG4gICAqIFNjYWxlIHJhbmdlIG9mIHggYXhpc1xyXG4gICAqL1xyXG4gIHNjYWxlUmFuZ2U/OiBkYXRhX2N1bGxpbmcuUmFuZ2U7XHJcbiAgLyoqXHJcbiAgICogRHJhdyBwb2ludHMgb25seSBpZiB0aGUgcG9pbnRzIG51bWJlciBsZXNzIHRoYW4gdGhlIGxpbWl0YXRpb25cclxuICAgKi9cclxuICBtYXhOdW1Qb2ludHNUb0RyYXc/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8vIFVzaW5nIGR5bmFtaWMgZmxhZyB0byBmaXggdGhlIGlzc3VlIG9mIG5nLXBhY2thZ3IgIzY5NjogTGFtYmRhIG5vdCBzdXBwb3J0ZWRcclxuLy8gQGR5bmFtaWNcclxuLyoqXHJcbiAqIENoYXJ0IGpzIFBsdWdpbiBmb3IgZG93bnNhbXBsaW5nIGRhdGFcclxuICovXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbiBpbXBsZW1lbnRzIElDaGFydFBsdWdpbiB7XHJcbiAgc3RhdGljIGdldFBsdWdpbk9wdGlvbnMoY2hhcnQ6IGFueSk6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyB7XHJcbiAgICBjb25zdCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMgPSBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlIHx8IHt9O1xyXG4gICAgdXRpbHMuZGVmYXVsdHNEZWVwKG9wdGlvbnMsIHtcclxuICAgICAgZW5hYmxlZDogZmFsc2UsXHJcbiAgICAgIGFnZ3JlZ2F0aW9uQWxnb3JpdGhtOiAnTFRUQicsXHJcbiAgICAgIGRlc2lyZWREYXRhUG9pbnREaXN0YW5jZTogMSxcclxuICAgICAgbWluTnVtUG9pbnRzOiAxMDAsXHJcbiAgICAgIG1heE51bVBvaW50c1RvRHJhdzogMTAwLFxyXG4gICAgICBjdWxsRGF0YTogdHJ1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZW5hYmxlZCkge1xyXG4gICAgICBjaGFydC5vcHRpb25zLnJlc3BvbnNpdmVEb3duc2FtcGxlID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3B0aW9ucztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBoYXNEYXRhQ2hhbmdlZChjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdXRpbHMuaXNOaWwoXHJcbiAgICAgIHV0aWxzLmZpbmRJbkFycmF5KFxyXG4gICAgICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMgYXMgTWlwTWFwRGF0YVNldHNbXSxcclxuICAgICAgICAoZGF0YXNldCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHV0aWxzLmlzTmlsKGRhdGFzZXQubWlwTWFwKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlRGF0YU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucyk6IHZvaWQge1xyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGNvbnN0IGRhdGEgPSAhdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpID8gZGF0YXNldC5vcmlnaW5hbERhdGEgOiBkYXRhc2V0LmRhdGEgYXMgQ2hhcnRQb2ludFtdO1xyXG5cclxuICAgICAgY29uc3QgbWlwTWFwID0gKG9wdGlvbnMuYWdncmVnYXRpb25BbGdvcml0aG0gPT09ICdMVFRCJylcclxuICAgICAgICA/IG5ldyBMVFRCRGF0YU1pcG1hcChkYXRhLCBvcHRpb25zLm1pbk51bVBvaW50cylcclxuICAgICAgICA6IG5ldyBEYXRhTWlwbWFwKGRhdGEsIG9wdGlvbnMubWluTnVtUG9pbnRzKTtcclxuXHJcbiAgICAgIGRhdGFzZXQub3JpZ2luYWxEYXRhID0gZGF0YTtcclxuICAgICAgZGF0YXNldC5taXBNYXAgPSBtaXBNYXA7XHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hcC5nZXROdW1MZXZlbCgpIC0gMSk7IC8vIHNldCBsYXN0IGxldmVsIGZvciBmaXJzdCByZW5kZXIgcGFzc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgcmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGxldCB1cGRhdGVkID0gZmFsc2U7XHJcblxyXG4gICAgY2hhcnQuZGF0YS5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0OiBNaXBNYXBEYXRhU2V0cykgPT4ge1xyXG4gICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgIGlmICghdXRpbHMuaXNOaWwoZGF0YXNldC5vcmlnaW5hbERhdGEpICYmIGRhdGFzZXQuZGF0YSAhPT0gZGF0YXNldC5vcmlnaW5hbERhdGEpIHtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgZGF0YXNldC5kYXRhID0gZGF0YXNldC5vcmlnaW5hbERhdGE7XHJcbiAgICAgICAgdXBkYXRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFRhcmdldFJlc29sdXRpb24oY2hhcnQ6IENoYXJ0LCBvcHRpb25zOiBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbk9wdGlvbnMpOiBudW1iZXIge1xyXG4gICAgY29uc3QgeFNjYWxlOiBUaW1lU2NhbGUgPSAoY2hhcnQgYXMgYW55KS5zY2FsZXNbJ3gtYXhpcy0wJ107XHJcblxyXG4gICAgaWYgKHV0aWxzLmlzTmlsKHhTY2FsZSkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhcnQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQpIGFzIGFueSk7XHJcbiAgICBjb25zdCBlbmQgPSBtb21lbnQoeFNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoeFNjYWxlLmxlZnQgKyAxKSBhcyBhbnkpO1xyXG4gICAgY29uc3QgdGFyZ2V0UmVzb2x1dGlvbiA9IGVuZC5kaWZmKHN0YXJ0KTtcclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0UmVzb2x1dGlvbiAqIG9wdGlvbnMuZGVzaXJlZERhdGFQb2ludERpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIHVwZGF0ZU1pcE1hcChjaGFydDogQ2hhcnQsIG9wdGlvbnM6IFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luT3B0aW9ucywgcmFuZ2VDaGFuZ2VkOiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldDogTWlwTWFwRGF0YVNldHMpID0+IHtcclxuICAgICAgY29uc3QgbWlwTWFwID0gZGF0YXNldC5taXBNYXA7XHJcbiAgICAgIGlmICh1dGlscy5pc05pbChtaXBNYXApKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBtaXBNYWxMZXZlbCA9IG1pcE1hcC5nZXRNaXBNYXBJbmRleEZvclJlc29sdXRpb24ob3B0aW9ucy50YXJnZXRSZXNvbHV0aW9uKTtcclxuICAgICAgaWYgKG1pcE1hbExldmVsID09PSBkYXRhc2V0LmN1cnJlbnRNaXBNYXBMZXZlbCAmJiAhcmFuZ2VDaGFuZ2VkKSB7XHJcbiAgICAgICAgLy8gc2tpcCB1cGRhdGUgaWYgbWlwIG1hcCBsZXZlbCBhbmQgZGF0YSByYW5nZSBkaWQgbm90IGNoYW5nZVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB1cGRhdGVkID0gdHJ1ZTtcclxuICAgICAgZGF0YXNldC5jdXJyZW50TWlwTWFwTGV2ZWwgPSBtaXBNYWxMZXZlbDtcclxuXHJcbiAgICAgIGxldCBuZXdEYXRhID0gbWlwTWFwLmdldE1pcE1hcExldmVsKG1pcE1hbExldmVsKTtcclxuICAgICAgaWYgKG9wdGlvbnMuY3VsbERhdGEpIHtcclxuICAgICAgICBuZXdEYXRhID0gZGF0YV9jdWxsaW5nLmN1bGxEYXRhKG5ld0RhdGEsIG9wdGlvbnMuc2NhbGVSYW5nZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgZGF0YXNldC5kYXRhID0gbmV3RGF0YTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB1cGRhdGVkO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlSW5pdChjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7IHJldHVybjsgfVxyXG5cclxuICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgb3B0aW9ucy5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBiZWZvcmVEYXRhc2V0c1VwZGF0ZShjaGFydDogQ2hhcnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBhbmQgcmVtb3ZlIHN0YXRlIGZyb20gb3B0aW9uc1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4ucmVzdG9yZU9yaWdpbmFsRGF0YShjaGFydCk7XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnRhcmdldFJlc29sdXRpb247XHJcbiAgICAgIGRlbGV0ZSBvcHRpb25zLnNjYWxlUmFuZ2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBvbmx5IHVwZGF0ZSBtaXAgbWFwIGlmIGRhdGEgc2V0IHdhcyByZWxvYWRlZCBleHRlcm5hbGx5XHJcbiAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4uaGFzRGF0YUNoYW5nZWQoY2hhcnQpKSB7XHJcbiAgICAgIFJlc3BvbnNpdmVEb3duc2FtcGxlUGx1Z2luLmNyZWF0ZURhdGFNaXBNYXAoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJlZm9yZVJlbmRlcihjaGFydDogQ2hhcnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRQbHVnaW5PcHRpb25zKGNoYXJ0KTtcclxuICAgIGlmICghb3B0aW9ucy5lbmFibGVkKSB7XHJcbiAgICAgIC8vIHVwZGF0ZSBjaGFydCBpZiBkYXRhIHdhcyByZXN0b3JlZCBmcm9tIG9yaWdpbmFsIGRhdGFcclxuICAgICAgaWYgKG9wdGlvbnMubmVlZHNVcGRhdGUpIHtcclxuICAgICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRhcmdldFJlc29sdXRpb24gPSBSZXNwb25zaXZlRG93bnNhbXBsZVBsdWdpbi5nZXRUYXJnZXRSZXNvbHV0aW9uKGNoYXJ0LCBvcHRpb25zKTtcclxuICAgIGNvbnN0IHhTY2FsZTogVGltZVNjYWxlID0gKGNoYXJ0IGFzIGFueSkuc2NhbGVzWyd4LWF4aXMtMCddO1xyXG4gICAgY29uc3Qgc2NhbGVSYW5nZSA9IGRhdGFfY3VsbGluZy5nZXRTY2FsZVJhbmdlKHhTY2FsZSk7XHJcbiAgICBjb25zdCByYW5nZUNoYW5nZWQgPSAhZGF0YV9jdWxsaW5nLnJhbmdlSXNFcXVhbChvcHRpb25zLnNjYWxlUmFuZ2UsIHNjYWxlUmFuZ2UpO1xyXG5cclxuICAgIGlmIChvcHRpb25zLm5lZWRzVXBkYXRlIHx8XHJcbiAgICAgIG9wdGlvbnMudGFyZ2V0UmVzb2x1dGlvbiAhPT0gdGFyZ2V0UmVzb2x1dGlvbiB8fFxyXG4gICAgICByYW5nZUNoYW5nZWRcclxuICAgICkge1xyXG4gICAgICBvcHRpb25zLnRhcmdldFJlc29sdXRpb24gPSB0YXJnZXRSZXNvbHV0aW9uO1xyXG4gICAgICBvcHRpb25zLnNjYWxlUmFuZ2UgPSBzY2FsZVJhbmdlO1xyXG4gICAgICBvcHRpb25zLm5lZWRzVXBkYXRlID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoUmVzcG9uc2l2ZURvd25zYW1wbGVQbHVnaW4udXBkYXRlTWlwTWFwKGNoYXJ0LCBvcHRpb25zLCByYW5nZUNoYW5nZWQpKSB7XHJcbiAgICAgICAgdXRpbHMuY2hhbmdlUG9pbnRSYWRpdXMoY2hhcnQsIG9wdGlvbnMpO1xyXG4gICAgICAgIC8vIHVwZGF0ZSBjaGFydCBhbmQgY2FuY2VsIGN1cnJlbnQgcmVuZGVyXHJcbiAgICAgICAgY2hhcnQudXBkYXRlKDApO1xyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This plugin is adapted from: https://github.com/3dcl/chartjs-plugin-responsive-downsample
|
|
3
|
-
* for controlling the radius of point.
|
|
4
|
-
*
|
|
5
|
-
* MIT License
|
|
6
|
-
* Copyright (c) 2018 3D Content Logistics
|
|
7
|
-
*
|
|
8
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
9
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
10
|
-
* in the Software without restriction, including without limitation the rights
|
|
11
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
12
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
13
|
-
* furnished to do so, subject to the following conditions:
|
|
14
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
-
* copies or substantial portions of the Software.
|
|
16
|
-
*
|
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
-
* SOFTWARE.
|
|
24
|
-
*/
|
|
25
|
-
/**
|
|
26
|
-
* Check if a value is null or undefined
|
|
27
|
-
*/
|
|
28
|
-
export function isNil(value) {
|
|
29
|
-
return (typeof value === 'undefined') || value === null;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Clamp a number to a range
|
|
33
|
-
* @param value
|
|
34
|
-
* @param min
|
|
35
|
-
* @param max
|
|
36
|
-
*/
|
|
37
|
-
export function clamp(value, min, max) {
|
|
38
|
-
return Math.min(Math.max(value, min), max);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Recursively assign default values to an object if object is missing the keys.
|
|
42
|
-
* @param object The destination object to assign default values to
|
|
43
|
-
* @param defaults The default values for the object
|
|
44
|
-
* @return The destination object
|
|
45
|
-
*/
|
|
46
|
-
export function defaultsDeep(object, defaults) {
|
|
47
|
-
for (const key in defaults) {
|
|
48
|
-
if (defaults.hasOwnProperty(key)) {
|
|
49
|
-
const value = object[key];
|
|
50
|
-
if (typeof value === 'undefined') {
|
|
51
|
-
object[key] = defaults[key];
|
|
52
|
-
}
|
|
53
|
-
else if (value !== null && typeof value === 'object') {
|
|
54
|
-
object[key] = defaultsDeep(value, defaults[key]);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return object;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Finds the first element in an array for that the comaperator functions returns true
|
|
62
|
-
*
|
|
63
|
-
* @export
|
|
64
|
-
* @param array An array
|
|
65
|
-
* @param compareFunction Comperator function returning true for the element seeked
|
|
66
|
-
* @returns The found element or undefined
|
|
67
|
-
*/
|
|
68
|
-
export function findInArray(array, compareFunction) {
|
|
69
|
-
if (isNil(array)) {
|
|
70
|
-
return undefined;
|
|
71
|
-
}
|
|
72
|
-
for (let i = 0; i < array.length; i++) {
|
|
73
|
-
if (compareFunction(array[i]) === true) {
|
|
74
|
-
return array[i];
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Finds the first index in an array for that the comaperator function for an element returns true
|
|
81
|
-
*
|
|
82
|
-
* @export
|
|
83
|
-
* @param array An array of elements
|
|
84
|
-
* @param compareFunction Comperator function returning true for the element seeked
|
|
85
|
-
* @returns Index of the matched element or -1 if no element was found
|
|
86
|
-
*/
|
|
87
|
-
export function findIndexInArray(array, compareFunction) {
|
|
88
|
-
if (isNil(array)) {
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
for (let i = 0; i < array.length; i++) {
|
|
92
|
-
if (compareFunction(array[i]) === true) {
|
|
93
|
-
return i;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return -1;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* If points number is less than minNumPoints, show radius for all points.
|
|
100
|
-
*/
|
|
101
|
-
export function changePointRadius(chart, options) {
|
|
102
|
-
if (chart && chart.data && chart.data.datasets && options) {
|
|
103
|
-
let pointRadiusChangeFlag = false;
|
|
104
|
-
const maxNumPointsToDraw = options.maxNumPointsToDraw == null ? 100 : options.maxNumPointsToDraw;
|
|
105
|
-
for (const dataset of chart.data.datasets) {
|
|
106
|
-
if (dataset.data.length < maxNumPointsToDraw) {
|
|
107
|
-
pointRadiusChangeFlag = true;
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
chart.options.elements.point.radius = pointRadiusChangeFlag ? 2 : 0;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLWRvd25zYW1wbGUvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFDLEtBQVU7SUFDNUIsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUksTUFBUyxFQUFFLFFBQW9CO0lBQzNELEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFO1FBQzFCLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7Z0JBQ2hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDN0I7aUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEQ7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFJLEtBQWUsRUFBRSxlQUF3QztJQUNwRixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNoQixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjtLQUNKO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUdEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksS0FBZSxFQUFFLGVBQXdDO0lBQ3pGLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3BDLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7S0FDSjtJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU87SUFDOUMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUU7UUFDekQsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRyxLQUFLLE1BQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3pDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLEVBQUU7Z0JBQzVDLHFCQUFxQixHQUFHLElBQUksQ0FBQztnQkFDN0IsTUFBTTthQUNQO1NBQ0Y7UUFDRCxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vM2RjbC9jaGFydGpzLXBsdWdpbi1yZXNwb25zaXZlLWRvd25zYW1wbGVcclxuICogZm9yIGNvbnRyb2xsaW5nIHRoZSByYWRpdXMgb2YgcG9pbnQuXHJcbiAqXHJcbiAqIE1JVCBMaWNlbnNlXHJcbiAqIENvcHlyaWdodCAoYykgMjAxOCAzRCBDb250ZW50IExvZ2lzdGljc1xyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGEgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05pbCh2YWx1ZTogYW55KTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHx8IHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogQ2xhbXAgYSBudW1iZXIgdG8gYSByYW5nZVxyXG4gKiBAcGFyYW0gdmFsdWVcclxuICogQHBhcmFtIG1pblxyXG4gKiBAcGFyYW0gbWF4XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY2xhbXAodmFsdWU6IG51bWJlciwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlY3Vyc2l2ZWx5IGFzc2lnbiBkZWZhdWx0IHZhbHVlcyB0byBhbiBvYmplY3QgaWYgb2JqZWN0IGlzIG1pc3NpbmcgdGhlIGtleXMuXHJcbiAqIEBwYXJhbSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdCB0byBhc3NpZ24gZGVmYXVsdCB2YWx1ZXMgdG9cclxuICogQHBhcmFtIGRlZmF1bHRzIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG9iamVjdFxyXG4gKiBAcmV0dXJuIFRoZSBkZXN0aW5hdGlvbiBvYmplY3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0c0RlZXA8VD4ob2JqZWN0OiBULCBkZWZhdWx0czogUGFydGlhbDxUPik6IFQge1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcclxuICAgICAgaWYgKGRlZmF1bHRzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c1trZXldO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgb2JqZWN0W2tleV0gPSBkZWZhdWx0c0RlZXAodmFsdWUsIGRlZmF1bHRzW2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYW4gYXJyYXkgZm9yIHRoYXQgdGhlIGNvbWFwZXJhdG9yIGZ1bmN0aW9ucyByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXlcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgVGhlIGZvdW5kIGVsZW1lbnQgb3IgdW5kZWZpbmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogVCB7XHJcbiAgICBpZiAoaXNOaWwoYXJyYXkpKSB7XHJcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGNvbXBhcmVGdW5jdGlvbihhcnJheVtpXSkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGFycmF5W2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcblxyXG4vKipcclxuICogRmluZHMgdGhlIGZpcnN0IGluZGV4IGluIGFuIGFycmF5IGZvciB0aGF0IHRoZSBjb21hcGVyYXRvciBmdW5jdGlvbiBmb3IgYW4gZWxlbWVudCByZXR1cm5zIHRydWVcclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0gYXJyYXkgQW4gYXJyYXkgb2YgZWxlbWVudHNcclxuICogQHBhcmFtIGNvbXBhcmVGdW5jdGlvbiBDb21wZXJhdG9yIGZ1bmN0aW9uIHJldHVybmluZyB0cnVlIGZvciB0aGUgZWxlbWVudCBzZWVrZWRcclxuICogQHJldHVybnMgSW5kZXggb2YgdGhlIG1hdGNoZWQgZWxlbWVudCBvciAtMSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRJbmRleEluQXJyYXk8VD4oYXJyYXk6IEFycmF5PFQ+LCBjb21wYXJlRnVuY3Rpb246IChlbGVtZW50OiBUKSA9PiBib29sZWFuKTogbnVtYmVyIHtcclxuICAgIGlmIChpc05pbChhcnJheSkpIHtcclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoY29tcGFyZUZ1bmN0aW9uKGFycmF5W2ldKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJZiBwb2ludHMgbnVtYmVyIGlzIGxlc3MgdGhhbiBtaW5OdW1Qb2ludHMsIHNob3cgcmFkaXVzIGZvciBhbGwgcG9pbnRzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVBvaW50UmFkaXVzKGNoYXJ0LCBvcHRpb25zKTogdm9pZCB7XHJcbiAgaWYgKGNoYXJ0ICYmIGNoYXJ0LmRhdGEgJiYgY2hhcnQuZGF0YS5kYXRhc2V0cyAmJiBvcHRpb25zKSB7XHJcbiAgICBsZXQgcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID0gZmFsc2U7XHJcbiAgICBjb25zdCBtYXhOdW1Qb2ludHNUb0RyYXcgPSBvcHRpb25zLm1heE51bVBvaW50c1RvRHJhdyA9PSBudWxsID8gMTAwIDogb3B0aW9ucy5tYXhOdW1Qb2ludHNUb0RyYXc7XHJcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hhcnQuZGF0YS5kYXRhc2V0cykge1xyXG4gICAgICBpZiAoZGF0YXNldC5kYXRhLmxlbmd0aCA8IG1heE51bVBvaW50c1RvRHJhdykge1xyXG4gICAgICAgIHBvaW50UmFkaXVzQ2hhbmdlRmxhZyA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQucmFkaXVzID0gcG9pbnRSYWRpdXNDaGFuZ2VGbGFnID8gMiA6IDA7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|