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,527 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* this plugin is adapted from: https://github.com/chartjs/chartjs-plugin-zoom
|
|
3
|
-
* for following two open issues:
|
|
4
|
-
* https://github.com/chartjs/chartjs-plugin-zoom/pull/155
|
|
5
|
-
* https://github.com/chartjs/chartjs-plugin-zoom/pull/150
|
|
6
|
-
*
|
|
7
|
-
* The MIT License (MIT) Copyright (c) 2013-2016 Nick Downie
|
|
8
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
|
9
|
-
* software and associated documentation files (the "Software"), to deal in the Software
|
|
10
|
-
* without restriction, including without limitation the rights to use, copy, modify, merge,
|
|
11
|
-
* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
|
12
|
-
* to whom the Software is furnished to do so, subject to the following conditions:
|
|
13
|
-
*
|
|
14
|
-
* The above copyright notice and this permission notice shall be included in all copies or
|
|
15
|
-
* substantial portions of the Software.
|
|
16
|
-
*
|
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
|
18
|
-
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
-
* AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
20
|
-
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
21
|
-
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
-
* THE SOFTWARE.
|
|
23
|
-
*/
|
|
24
|
-
/*jslint browser:true, devel:true, white:true, vars:true */
|
|
25
|
-
/*global require*/
|
|
26
|
-
// hammer JS for touch support
|
|
27
|
-
import * as hammerjs from 'hammerjs';
|
|
28
|
-
const Hammer = window && window.Hammer ? window.Hammer : hammerjs.Hammer;
|
|
29
|
-
// Get the chart variable
|
|
30
|
-
import * as chartjs from 'chart.js';
|
|
31
|
-
const Chart = window && window.Chart ? window.Chart : chartjs.Chart;
|
|
32
|
-
const helpers = Chart.helpers;
|
|
33
|
-
// Take the zoom namespace of Chart
|
|
34
|
-
const zoomNS = Chart.Zoom = Chart.Zoom || {};
|
|
35
|
-
// Where we store functions to handle different scale types
|
|
36
|
-
const zoomFunctions = zoomNS.zoomFunctions = zoomNS.zoomFunctions || {};
|
|
37
|
-
const panFunctions = zoomNS.panFunctions = zoomNS.panFunctions || {};
|
|
38
|
-
// Default options if none are provided
|
|
39
|
-
const defaultOptions = zoomNS.defaults = {
|
|
40
|
-
pan: {
|
|
41
|
-
enabled: true,
|
|
42
|
-
mode: 'xy',
|
|
43
|
-
speed: 20,
|
|
44
|
-
threshold: 10
|
|
45
|
-
},
|
|
46
|
-
zoom: {
|
|
47
|
-
enabled: true,
|
|
48
|
-
mode: 'xy',
|
|
49
|
-
sensitivity: 3
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
function directionEnabled(mode, dir) {
|
|
53
|
-
if (mode === undefined) {
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
else if (typeof mode === 'string') {
|
|
57
|
-
return mode.indexOf(dir) !== -1;
|
|
58
|
-
}
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
function rangeMaxLimiter(zoomPanOptions, newMax) {
|
|
62
|
-
if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMax &&
|
|
63
|
-
!helpers.isNullOrUndef(zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes])) {
|
|
64
|
-
const rangeMax = zoomPanOptions.rangeMax[zoomPanOptions.scaleAxes];
|
|
65
|
-
if (newMax > rangeMax) {
|
|
66
|
-
newMax = rangeMax;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return newMax;
|
|
70
|
-
}
|
|
71
|
-
function rangeMinLimiter(zoomPanOptions, newMin) {
|
|
72
|
-
if (zoomPanOptions.scaleAxes && zoomPanOptions.rangeMin &&
|
|
73
|
-
!helpers.isNullOrUndef(zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes])) {
|
|
74
|
-
const rangeMin = zoomPanOptions.rangeMin[zoomPanOptions.scaleAxes];
|
|
75
|
-
if (newMin < rangeMin) {
|
|
76
|
-
newMin = rangeMin;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return newMin;
|
|
80
|
-
}
|
|
81
|
-
function zoomIndexScale(scale, zoom, center, zoomOptions) {
|
|
82
|
-
const labels = scale.chart.data.labels;
|
|
83
|
-
let minIndex = scale.minIndex;
|
|
84
|
-
const lastLabelIndex = labels.length - 1;
|
|
85
|
-
let maxIndex = scale.maxIndex;
|
|
86
|
-
const sensitivity = zoomOptions.sensitivity;
|
|
87
|
-
const chartCenter = scale.isHorizontal() ? scale.left + (scale.width / 2) : scale.top + (scale.height / 2);
|
|
88
|
-
const centerPointer = scale.isHorizontal() ? center.x : center.y;
|
|
89
|
-
zoomNS.zoomCumulativeDelta = zoom > 1 ? zoomNS.zoomCumulativeDelta + 1 : zoomNS.zoomCumulativeDelta - 1;
|
|
90
|
-
if (Math.abs(zoomNS.zoomCumulativeDelta) > sensitivity) {
|
|
91
|
-
if (zoomNS.zoomCumulativeDelta < 0) {
|
|
92
|
-
if (centerPointer >= chartCenter) {
|
|
93
|
-
if (minIndex <= 0) {
|
|
94
|
-
maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
minIndex = Math.max(0, minIndex - 1);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
else if (centerPointer < chartCenter) {
|
|
101
|
-
if (maxIndex >= lastLabelIndex) {
|
|
102
|
-
minIndex = Math.max(0, minIndex - 1);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
maxIndex = Math.min(lastLabelIndex, maxIndex + 1);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
109
|
-
}
|
|
110
|
-
else if (zoomNS.zoomCumulativeDelta > 0) {
|
|
111
|
-
if (centerPointer >= chartCenter) {
|
|
112
|
-
minIndex = minIndex < maxIndex ? minIndex = Math.min(maxIndex, minIndex + 1) : minIndex;
|
|
113
|
-
}
|
|
114
|
-
else if (centerPointer < chartCenter) {
|
|
115
|
-
maxIndex = maxIndex > minIndex ? maxIndex = Math.max(minIndex, maxIndex - 1) : maxIndex;
|
|
116
|
-
}
|
|
117
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
118
|
-
}
|
|
119
|
-
scale.options.ticks.min = rangeMinLimiter(zoomOptions, labels[minIndex]);
|
|
120
|
-
scale.options.ticks.max = rangeMaxLimiter(zoomOptions, labels[maxIndex]);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
function zoomTimeScale(scale, zoom, center, zoomOptions) {
|
|
124
|
-
const options = scale.options;
|
|
125
|
-
// var range;
|
|
126
|
-
// var min_percent;
|
|
127
|
-
// if (scale.isHorizontal()) {
|
|
128
|
-
// range = scale.right - scale.left;
|
|
129
|
-
// min_percent = (center.x - scale.left) / range;
|
|
130
|
-
// } else {
|
|
131
|
-
// range = scale.bottom - scale.top;
|
|
132
|
-
// min_percent = (center.y - scale.top) / range;
|
|
133
|
-
// }
|
|
134
|
-
//
|
|
135
|
-
// var max_percent = 1 - min_percent;
|
|
136
|
-
const range = scale.max - scale.min;
|
|
137
|
-
const newDiff = range * (zoom - 1);
|
|
138
|
-
const cursorPixel = scale.isHorizontal() ? center.x : center.y;
|
|
139
|
-
const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
|
|
140
|
-
const max_percent = 1 - min_percent;
|
|
141
|
-
const minDelta = newDiff * min_percent;
|
|
142
|
-
const maxDelta = newDiff * max_percent;
|
|
143
|
-
const newMin = scale.min + minDelta;
|
|
144
|
-
const newMax = scale.max - maxDelta;
|
|
145
|
-
const diffMinMax = newMax - newMin;
|
|
146
|
-
const minLimitExceeded = rangeMinLimiter(zoomOptions, diffMinMax) !== diffMinMax;
|
|
147
|
-
const maxLimitExceeded = rangeMaxLimiter(zoomOptions, diffMinMax) !== diffMinMax;
|
|
148
|
-
if (!minLimitExceeded && !maxLimitExceeded) {
|
|
149
|
-
options.time.min = newMin;
|
|
150
|
-
options.time.max = newMax;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
function zoomNumericalScale(scale, zoom, center, zoomOptions) {
|
|
154
|
-
const range = scale.max - scale.min;
|
|
155
|
-
const newDiff = range * (zoom - 1);
|
|
156
|
-
const cursorPixel = scale.isHorizontal() ? center.x : center.y;
|
|
157
|
-
const min_percent = (scale.getValueForPixel(cursorPixel) - scale.min) / range;
|
|
158
|
-
const max_percent = 1 - min_percent;
|
|
159
|
-
const minDelta = newDiff * min_percent;
|
|
160
|
-
const maxDelta = newDiff * max_percent;
|
|
161
|
-
scale.options.ticks.min = rangeMinLimiter(zoomOptions, scale.min + minDelta);
|
|
162
|
-
scale.options.ticks.max = rangeMaxLimiter(zoomOptions, scale.max - maxDelta);
|
|
163
|
-
}
|
|
164
|
-
function zoomScale(scale, zoom, center, zoomOptions) {
|
|
165
|
-
const fn = zoomFunctions[scale.options.type];
|
|
166
|
-
if (fn) {
|
|
167
|
-
fn(scale, zoom, center, zoomOptions);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
function doZoom(chartInstance, zoom, center, whichAxes) {
|
|
171
|
-
const ca = chartInstance.chartArea;
|
|
172
|
-
if (!center) {
|
|
173
|
-
center = {
|
|
174
|
-
x: (ca.left + ca.right) / 2,
|
|
175
|
-
y: (ca.top + ca.bottom) / 2,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
const zoomOptions = chartInstance.options.zoom;
|
|
179
|
-
if (zoomOptions && helpers.getValueOrDefault(zoomOptions.enabled, defaultOptions.zoom.enabled)) {
|
|
180
|
-
// Do the zoom here
|
|
181
|
-
const zoomMode = helpers.getValueOrDefault(chartInstance.options.zoom.mode, defaultOptions.zoom.mode);
|
|
182
|
-
zoomOptions.sensitivity = helpers.getValueOrDefault(chartInstance.options.zoom.sensitivity, defaultOptions.zoom.sensitivity);
|
|
183
|
-
// Which axe should be modified when figers were used.
|
|
184
|
-
let _whichAxes;
|
|
185
|
-
if (zoomMode === 'xy' && whichAxes !== undefined) {
|
|
186
|
-
// based on fingers positions
|
|
187
|
-
_whichAxes = whichAxes;
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
// no effect
|
|
191
|
-
_whichAxes = 'xy';
|
|
192
|
-
}
|
|
193
|
-
helpers.each(chartInstance.scales, function (scale, id) {
|
|
194
|
-
if (scale.isHorizontal() && directionEnabled(zoomMode, 'x') && directionEnabled(_whichAxes, 'x')) {
|
|
195
|
-
zoomOptions.scaleAxes = 'x';
|
|
196
|
-
zoomScale(scale, zoom, center, zoomOptions);
|
|
197
|
-
}
|
|
198
|
-
else if (!scale.isHorizontal() && directionEnabled(zoomMode, 'y') && directionEnabled(_whichAxes, 'y')) {
|
|
199
|
-
// Do Y zoom
|
|
200
|
-
zoomOptions.scaleAxes = 'y';
|
|
201
|
-
zoomScale(scale, zoom, center, zoomOptions);
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
chartInstance.update(0);
|
|
205
|
-
if (typeof zoomOptions.onZoom === 'function') {
|
|
206
|
-
zoomOptions.onZoom();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
function panIndexScale(scale, delta, panOptions) {
|
|
211
|
-
const labels = scale.chart.data.labels;
|
|
212
|
-
const lastLabelIndex = labels.length - 1;
|
|
213
|
-
const offsetAmt = Math.max((scale.ticks.length - ((scale.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
|
|
214
|
-
const panSpeed = panOptions.speed;
|
|
215
|
-
let minIndex = scale.minIndex;
|
|
216
|
-
const step = Math.round(scale.width / (offsetAmt * panSpeed));
|
|
217
|
-
let maxIndex;
|
|
218
|
-
zoomNS.panCumulativeDelta += delta;
|
|
219
|
-
minIndex = zoomNS.panCumulativeDelta > step ? Math.max(0, minIndex - 1) : zoomNS.panCumulativeDelta < -step ? Math.min(lastLabelIndex - offsetAmt + 1, minIndex + 1) : minIndex;
|
|
220
|
-
zoomNS.panCumulativeDelta = minIndex !== scale.minIndex ? 0 : zoomNS.panCumulativeDelta;
|
|
221
|
-
maxIndex = Math.min(lastLabelIndex, minIndex + offsetAmt - 1);
|
|
222
|
-
scale.options.ticks.min = rangeMinLimiter(panOptions, labels[minIndex]);
|
|
223
|
-
scale.options.ticks.max = rangeMaxLimiter(panOptions, labels[maxIndex]);
|
|
224
|
-
}
|
|
225
|
-
function panTimeScale(scale, delta, panOptions) {
|
|
226
|
-
const options = scale.options;
|
|
227
|
-
const limitedMax = rangeMaxLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.max) - delta));
|
|
228
|
-
const limitedMin = rangeMinLimiter(panOptions, scale.getValueForPixel(scale.getPixelForValue(scale.min) - delta));
|
|
229
|
-
const limitedTimeDelta = delta < 0 ? limitedMax - scale.max : limitedMin - scale.min;
|
|
230
|
-
options.time.max = scale.max + limitedTimeDelta;
|
|
231
|
-
options.time.min = scale.min + limitedTimeDelta;
|
|
232
|
-
}
|
|
233
|
-
function panNumericalScale(scale, delta, panOptions) {
|
|
234
|
-
const tickOpts = scale.options.ticks;
|
|
235
|
-
const start = scale.start, end = scale.end;
|
|
236
|
-
if (tickOpts.reverse) {
|
|
237
|
-
tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
|
|
238
|
-
tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
tickOpts.min = scale.getValueForPixel(scale.getPixelForValue(start) - delta);
|
|
242
|
-
tickOpts.max = scale.getValueForPixel(scale.getPixelForValue(end) - delta);
|
|
243
|
-
}
|
|
244
|
-
tickOpts.min = rangeMinLimiter(panOptions, tickOpts.min);
|
|
245
|
-
tickOpts.max = rangeMaxLimiter(panOptions, tickOpts.max);
|
|
246
|
-
}
|
|
247
|
-
function panScale(scale, delta, panOptions) {
|
|
248
|
-
const fn = panFunctions[scale.options.type];
|
|
249
|
-
if (fn) {
|
|
250
|
-
fn(scale, delta, panOptions);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
function doPan(chartInstance, deltaX, deltaY) {
|
|
254
|
-
const panOptions = chartInstance.options.pan;
|
|
255
|
-
if (panOptions && helpers.getValueOrDefault(panOptions.enabled, defaultOptions.pan.enabled)) {
|
|
256
|
-
const panMode = helpers.getValueOrDefault(chartInstance.options.pan.mode, defaultOptions.pan.mode);
|
|
257
|
-
panOptions.speed = helpers.getValueOrDefault(chartInstance.options.pan.speed, defaultOptions.pan.speed);
|
|
258
|
-
helpers.each(chartInstance.scales, function (scale, id) {
|
|
259
|
-
if (scale.isHorizontal() && directionEnabled(panMode, 'x') && deltaX !== 0) {
|
|
260
|
-
panOptions.scaleAxes = 'x';
|
|
261
|
-
panScale(scale, deltaX, panOptions);
|
|
262
|
-
}
|
|
263
|
-
else if (!scale.isHorizontal() && directionEnabled(panMode, 'y') && deltaY !== 0) {
|
|
264
|
-
panOptions.scaleAxes = 'y';
|
|
265
|
-
panScale(scale, deltaY, panOptions);
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
chartInstance.update(0);
|
|
269
|
-
if (typeof panOptions.onPan === 'function') {
|
|
270
|
-
panOptions.onPan();
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
function positionInChartArea(chartInstance, position) {
|
|
275
|
-
return (position.x >= chartInstance.chartArea.left && position.x <= chartInstance.chartArea.right) &&
|
|
276
|
-
(position.y >= chartInstance.chartArea.top && position.y <= chartInstance.chartArea.bottom);
|
|
277
|
-
}
|
|
278
|
-
function getYAxis(chartInstance) {
|
|
279
|
-
const scales = chartInstance.scales;
|
|
280
|
-
for (const scaleId in scales) {
|
|
281
|
-
if (scales.hasOwnProperty(scaleId)) {
|
|
282
|
-
const scale = scales[scaleId];
|
|
283
|
-
if (!scale.isHorizontal()) {
|
|
284
|
-
return scale;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
// Store these for later
|
|
290
|
-
zoomNS.zoomFunctions.category = zoomIndexScale;
|
|
291
|
-
zoomNS.zoomFunctions.time = zoomTimeScale;
|
|
292
|
-
zoomNS.zoomFunctions.linear = zoomNumericalScale;
|
|
293
|
-
zoomNS.zoomFunctions.logarithmic = zoomNumericalScale;
|
|
294
|
-
zoomNS.panFunctions.category = panIndexScale;
|
|
295
|
-
zoomNS.panFunctions.time = panTimeScale;
|
|
296
|
-
zoomNS.panFunctions.linear = panNumericalScale;
|
|
297
|
-
zoomNS.panFunctions.logarithmic = panNumericalScale;
|
|
298
|
-
// Globals for catergory pan and zoom
|
|
299
|
-
zoomNS.panCumulativeDelta = 0;
|
|
300
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
301
|
-
// Chartjs Zoom Plugin
|
|
302
|
-
export const zoomPlugin = {
|
|
303
|
-
afterInit: function (chartInstance) {
|
|
304
|
-
helpers.each(chartInstance.scales, function (scale) {
|
|
305
|
-
scale.originalOptions = helpers.clone(scale.options);
|
|
306
|
-
});
|
|
307
|
-
chartInstance.resetZoom = function () {
|
|
308
|
-
helpers.each(chartInstance.scales, function (scale, id) {
|
|
309
|
-
const timeOptions = scale.options.time;
|
|
310
|
-
const tickOptions = scale.options.ticks;
|
|
311
|
-
if (timeOptions) {
|
|
312
|
-
timeOptions.min = scale.originalOptions.time.min;
|
|
313
|
-
timeOptions.max = scale.originalOptions.time.max;
|
|
314
|
-
}
|
|
315
|
-
if (tickOptions) {
|
|
316
|
-
tickOptions.min = scale.originalOptions.ticks.min;
|
|
317
|
-
tickOptions.max = scale.originalOptions.ticks.max;
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
helpers.each(chartInstance.data.datasets, function (dataset, id) {
|
|
321
|
-
dataset._meta = null;
|
|
322
|
-
});
|
|
323
|
-
chartInstance.update();
|
|
324
|
-
};
|
|
325
|
-
},
|
|
326
|
-
beforeInit: function (chartInstance) {
|
|
327
|
-
chartInstance.zoom = {};
|
|
328
|
-
const node = chartInstance.zoom.node = chartInstance.chart.ctx.canvas;
|
|
329
|
-
const options = chartInstance.options;
|
|
330
|
-
const panThreshold = helpers.getValueOrDefault(options.pan ? options.pan.threshold : undefined, zoomNS.defaults.pan.threshold);
|
|
331
|
-
if (!options.zoom || !options.zoom.enabled) {
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
if (options.zoom.drag) {
|
|
335
|
-
// Only want to zoom horizontal axis
|
|
336
|
-
options.zoom.mode = 'x';
|
|
337
|
-
chartInstance.zoom._mouseDownHandler = function (event) {
|
|
338
|
-
chartInstance.zoom._dragZoomStart = event;
|
|
339
|
-
};
|
|
340
|
-
node.addEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
|
|
341
|
-
chartInstance.zoom._mouseMoveHandler = function (event) {
|
|
342
|
-
if (chartInstance.zoom._dragZoomStart) {
|
|
343
|
-
chartInstance.zoom._dragZoomEnd = event;
|
|
344
|
-
chartInstance.update(0);
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
node.addEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
|
|
348
|
-
chartInstance.zoom._mouseUpHandler = function (event) {
|
|
349
|
-
if (chartInstance.zoom._dragZoomStart) {
|
|
350
|
-
const chartArea = chartInstance.chartArea;
|
|
351
|
-
const yAxis = getYAxis(chartInstance);
|
|
352
|
-
const beginPoint = chartInstance.zoom._dragZoomStart;
|
|
353
|
-
const offsetX = beginPoint.target.getBoundingClientRect().left;
|
|
354
|
-
const startX = Math.max(Math.min(beginPoint.clientX, event.clientX) - offsetX, chartArea.left);
|
|
355
|
-
const endX = Math.min(Math.max(beginPoint.clientX, event.clientX) - offsetX, chartArea.right);
|
|
356
|
-
const dragDistance = endX - startX;
|
|
357
|
-
const chartDistance = chartArea.right - chartArea.left;
|
|
358
|
-
const zoom = 1 + (chartDistance - dragDistance) / chartDistance;
|
|
359
|
-
const centerX = chartArea.left + (startX - chartArea.left) / (zoom - 1);
|
|
360
|
-
// Remove drag start and end before chart update to stop drawing selected area
|
|
361
|
-
chartInstance.zoom._dragZoomStart = null;
|
|
362
|
-
chartInstance.zoom._dragZoomEnd = null;
|
|
363
|
-
if (dragDistance > 0) {
|
|
364
|
-
doZoom(chartInstance, zoom, {
|
|
365
|
-
x: centerX,
|
|
366
|
-
y: (yAxis.bottom - yAxis.top) / 2,
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
};
|
|
371
|
-
// node.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
372
|
-
node.ownerDocument.addEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
chartInstance.zoom._wheelHandler = function (event) {
|
|
376
|
-
const rect = event.target.getBoundingClientRect();
|
|
377
|
-
const offsetX = event.clientX - rect.left;
|
|
378
|
-
const offsetY = event.clientY - rect.top;
|
|
379
|
-
const center = {
|
|
380
|
-
x: offsetX,
|
|
381
|
-
y: offsetY
|
|
382
|
-
};
|
|
383
|
-
if (event.deltaY < 0) {
|
|
384
|
-
doZoom(chartInstance, 1.1, center);
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
doZoom(chartInstance, 0.909, center);
|
|
388
|
-
}
|
|
389
|
-
// Prevent the event from triggering the default behavior (eg. Content scrolling).
|
|
390
|
-
event.preventDefault();
|
|
391
|
-
};
|
|
392
|
-
node.addEventListener('wheel', chartInstance.zoom._wheelHandler);
|
|
393
|
-
}
|
|
394
|
-
if (Hammer) {
|
|
395
|
-
const mc = new Hammer.Manager(node);
|
|
396
|
-
mc.add(new Hammer.Pinch());
|
|
397
|
-
mc.add(new Hammer.Pan({
|
|
398
|
-
threshold: panThreshold
|
|
399
|
-
}));
|
|
400
|
-
// Hammer reports the total scaling. We need the incremental amount
|
|
401
|
-
let currentPinchScaling;
|
|
402
|
-
const handlePinch = function (e) {
|
|
403
|
-
const diff = 1 / (currentPinchScaling) * e.scale;
|
|
404
|
-
const rect = e.target.getBoundingClientRect();
|
|
405
|
-
const offsetX = e.center.x - rect.left;
|
|
406
|
-
const offsetY = e.center.y - rect.top;
|
|
407
|
-
const center = {
|
|
408
|
-
x: offsetX,
|
|
409
|
-
y: offsetY
|
|
410
|
-
};
|
|
411
|
-
// fingers position difference
|
|
412
|
-
const x = Math.abs(e.pointers[0].clientX - e.pointers[1].clientX);
|
|
413
|
-
const y = Math.abs(e.pointers[0].clientY - e.pointers[1].clientY);
|
|
414
|
-
// diagonal fingers will change both (xy) axes
|
|
415
|
-
const p = x / y;
|
|
416
|
-
let xy;
|
|
417
|
-
if (p > 0.3 && p < 1.7) {
|
|
418
|
-
xy = 'xy';
|
|
419
|
-
}
|
|
420
|
-
else if (x > y) {
|
|
421
|
-
// x axis
|
|
422
|
-
xy = 'x';
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
// y axis
|
|
426
|
-
xy = 'y';
|
|
427
|
-
}
|
|
428
|
-
doZoom(chartInstance, diff, center, xy);
|
|
429
|
-
// Keep track of overall scale
|
|
430
|
-
currentPinchScaling = e.scale;
|
|
431
|
-
};
|
|
432
|
-
mc.on('pinchstart', function (e) {
|
|
433
|
-
currentPinchScaling = 1; // reset tracker
|
|
434
|
-
});
|
|
435
|
-
mc.on('pinch', handlePinch);
|
|
436
|
-
mc.on('pinchend', function (e) {
|
|
437
|
-
handlePinch(e);
|
|
438
|
-
currentPinchScaling = null; // reset
|
|
439
|
-
zoomNS.zoomCumulativeDelta = 0;
|
|
440
|
-
});
|
|
441
|
-
let currentDeltaX = null, currentDeltaY = null, panning = false;
|
|
442
|
-
const handlePan = function (e) {
|
|
443
|
-
if (currentDeltaX !== null && currentDeltaY !== null) {
|
|
444
|
-
panning = true;
|
|
445
|
-
const deltaX = e.deltaX - currentDeltaX;
|
|
446
|
-
const deltaY = e.deltaY - currentDeltaY;
|
|
447
|
-
currentDeltaX = e.deltaX;
|
|
448
|
-
currentDeltaY = e.deltaY;
|
|
449
|
-
doPan(chartInstance, deltaX, deltaY);
|
|
450
|
-
}
|
|
451
|
-
};
|
|
452
|
-
mc.on('panstart', function (e) {
|
|
453
|
-
currentDeltaX = 0;
|
|
454
|
-
currentDeltaY = 0;
|
|
455
|
-
handlePan(e);
|
|
456
|
-
});
|
|
457
|
-
mc.on('panmove', handlePan);
|
|
458
|
-
mc.on('panend', function (e) {
|
|
459
|
-
currentDeltaX = null;
|
|
460
|
-
currentDeltaY = null;
|
|
461
|
-
zoomNS.panCumulativeDelta = 0;
|
|
462
|
-
setTimeout(function () { panning = false; }, 500);
|
|
463
|
-
});
|
|
464
|
-
chartInstance.zoom._ghostClickHandler = function (e) {
|
|
465
|
-
if (panning) {
|
|
466
|
-
e.stopImmediatePropagation();
|
|
467
|
-
e.preventDefault();
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
node.addEventListener('click', chartInstance.zoom._ghostClickHandler);
|
|
471
|
-
chartInstance._mc = mc;
|
|
472
|
-
}
|
|
473
|
-
},
|
|
474
|
-
beforeDatasetsDraw: function (chartInstance) {
|
|
475
|
-
const ctx = chartInstance.chart.ctx;
|
|
476
|
-
const chartArea = chartInstance.chartArea;
|
|
477
|
-
ctx.save();
|
|
478
|
-
ctx.beginPath();
|
|
479
|
-
if (chartInstance.zoom._dragZoomEnd) {
|
|
480
|
-
const yAxis = getYAxis(chartInstance);
|
|
481
|
-
const beginPoint = chartInstance.zoom._dragZoomStart;
|
|
482
|
-
const endPoint = chartInstance.zoom._dragZoomEnd;
|
|
483
|
-
const offsetX = beginPoint.target.getBoundingClientRect().left;
|
|
484
|
-
const startX = Math.min(beginPoint.clientX, endPoint.clientX) - offsetX;
|
|
485
|
-
const endX = Math.max(beginPoint.clientX, endPoint.clientX) - offsetX;
|
|
486
|
-
const rectWidth = endX - startX;
|
|
487
|
-
ctx.fillStyle = 'rgba(225,225,225,0.5)';
|
|
488
|
-
ctx.lineWidth = 5;
|
|
489
|
-
ctx.fillRect(startX, yAxis.top, rectWidth, yAxis.bottom - yAxis.top);
|
|
490
|
-
}
|
|
491
|
-
ctx.rect(chartArea.left, chartArea.top, chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);
|
|
492
|
-
ctx.clip();
|
|
493
|
-
},
|
|
494
|
-
afterDatasetsDraw: function (chartInstance) {
|
|
495
|
-
chartInstance.chart.ctx.restore();
|
|
496
|
-
},
|
|
497
|
-
destroy: function (chartInstance) {
|
|
498
|
-
if (chartInstance.zoom) {
|
|
499
|
-
const options = chartInstance.options;
|
|
500
|
-
const node = chartInstance.zoom.node;
|
|
501
|
-
if (options.zoom && options.zoom.drag) {
|
|
502
|
-
node.removeEventListener('mousedown', chartInstance.zoom._mouseDownHandler);
|
|
503
|
-
node.removeEventListener('mousemove', chartInstance.zoom._mouseMoveHandler);
|
|
504
|
-
// node.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
505
|
-
node.ownerDocument.removeEventListener('mouseup', chartInstance.zoom._mouseUpHandler);
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
node.removeEventListener('wheel', chartInstance.zoom._wheelHandler);
|
|
509
|
-
}
|
|
510
|
-
if (Hammer) {
|
|
511
|
-
node.removeEventListener('click', chartInstance.zoom._ghostClickHandler);
|
|
512
|
-
}
|
|
513
|
-
delete chartInstance.zoom;
|
|
514
|
-
const mc = chartInstance._mc;
|
|
515
|
-
if (mc) {
|
|
516
|
-
mc.remove('pinchstart');
|
|
517
|
-
mc.remove('pinch');
|
|
518
|
-
mc.remove('pinchend');
|
|
519
|
-
mc.remove('panstart');
|
|
520
|
-
mc.remove('pan');
|
|
521
|
-
mc.remove('panend');
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
};
|
|
526
|
-
Chart.pluginService.register(zoomPlugin);
|
|
527
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuem9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3V0aWxzL2NoYXJ0anMtem9vbS9jaGFydC56b29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsMkRBQTJEO0FBQzNELGtCQUFrQjtBQUVsQiw4QkFBOEI7QUFDOUIsT0FBTyxLQUFLLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFLLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFFM0YseUJBQXlCO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBRXRGLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7QUFFOUIsbUNBQW1DO0FBQ25DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFFN0MsMkRBQTJEO0FBQzNELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7QUFDeEUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztBQUVyRSx1Q0FBdUM7QUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRztJQUN2QyxHQUFHLEVBQUU7UUFD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TTtnQkFDTCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMxRTtZQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQztZQUUxQixNQUFNLEVBQUUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDO1lBQzdCLElBQUksRUFBRSxFQUFFO2dCQUNOLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hCLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25CLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3RCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pCLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7Q0FDRixDQUFDO0FBRUYsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogdGhpcyBwbHVnaW4gaXMgYWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tXHJcbiAqIGZvciBmb2xsb3dpbmcgdHdvIG9wZW4gaXNzdWVzOlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9jaGFydGpzLXBsdWdpbi16b29tL3B1bGwvMTU1XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL2NoYXJ0anMtcGx1Z2luLXpvb20vcHVsbC8xNTBcclxuICpcclxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpIENvcHlyaWdodCAoYykgMjAxMy0yMDE2IE5pY2sgRG93bmllXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpc1xyXG4gKiBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmVcclxuICogd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcclxuICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zXHJcbiAqIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3JcclxuICogc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElOR1xyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxyXG4gKiBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxyXG4gKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcclxuICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXHJcbiAqIFRIRSBTT0ZUV0FSRS5cclxuICovXHJcblxyXG4vKmpzbGludCBicm93c2VyOnRydWUsIGRldmVsOnRydWUsIHdoaXRlOnRydWUsIHZhcnM6dHJ1ZSAqL1xyXG4vKmdsb2JhbCByZXF1aXJlKi9cclxuXHJcbi8vIGhhbW1lciBKUyBmb3IgdG91Y2ggc3VwcG9ydFxyXG5pbXBvcnQgKiBhcyBoYW1tZXJqcyBmcm9tICdoYW1tZXJqcyc7XHJcbmNvbnN0IEhhbW1lciA9IHdpbmRvdyAmJiAod2luZG93IGFzIGFueSkuSGFtbWVyID8gKHdpbmRvdyBhcyBhbnkpLkhhbW1lciA6IGhhbW1lcmpzLkhhbW1lcjtcclxuXHJcbi8vIEdldCB0aGUgY2hhcnQgdmFyaWFibGVcclxuaW1wb3J0ICogYXMgY2hhcnRqcyBmcm9tICdjaGFydC5qcyc7XHJcbmNvbnN0IENoYXJ0ID0gd2luZG93ICYmICh3aW5kb3cgYXMgYW55KS5DaGFydCA/ICh3aW5kb3cgYXMgYW55KS5DaGFydCA6IGNoYXJ0anMuQ2hhcnQ7XHJcblxyXG5jb25zdCBoZWxwZXJzID0gQ2hhcnQuaGVscGVycztcclxuXHJcbi8vIFRha2UgdGhlIHpvb20gbmFtZXNwYWNlIG9mIENoYXJ0XHJcbmNvbnN0IHpvb21OUyA9IENoYXJ0Llpvb20gPSBDaGFydC5ab29tIHx8IHt9O1xyXG5cclxuLy8gV2hlcmUgd2Ugc3RvcmUgZnVuY3Rpb25zIHRvIGhhbmRsZSBkaWZmZXJlbnQgc2NhbGUgdHlwZXNcclxuY29uc3Qgem9vbUZ1bmN0aW9ucyA9IHpvb21OUy56b29tRnVuY3Rpb25zID0gem9vbU5TLnpvb21GdW5jdGlvbnMgfHwge307XHJcbmNvbnN0IHBhbkZ1bmN0aW9ucyA9IHpvb21OUy5wYW5GdW5jdGlvbnMgPSB6b29tTlMucGFuRnVuY3Rpb25zIHx8IHt9O1xyXG5cclxuLy8gRGVmYXVsdCBvcHRpb25zIGlmIG5vbmUgYXJlIHByb3ZpZGVkXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0gem9vbU5TLmRlZmF1bHRzID0ge1xyXG4gIHBhbjoge1xyXG4gICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgIG1vZGU6ICd4eScsXHJcbiAgICBzcGVlZDogMjAsXHJcbiAgICB0aHJlc2hvbGQ6IDEwXHJcbiAgfSxcclxuICB6b29tOiB7XHJcbiAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgbW9kZTogJ3h5JyxcclxuICAgIHNlbnNpdGl2aXR5OiAzXHJcbiAgfVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZGlyZWN0aW9uRW5hYmxlZChtb2RlLCBkaXIpIHtcclxuICBpZiAobW9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2RlID09PSAnc3RyaW5nJykge1xyXG4gICAgcmV0dXJuIG1vZGUuaW5kZXhPZihkaXIpICE9PSAtMTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmFuZ2VNYXhMaW1pdGVyKHpvb21QYW5PcHRpb25zLCBuZXdNYXgpIHtcclxuICBpZiAoem9vbVBhbk9wdGlvbnMuc2NhbGVBeGVzICYmIHpvb21QYW5PcHRpb25zLnJhbmdlTWF4ICYmXHJcbiAgICAhaGVscGVycy5pc051bGxPclVuZGVmKHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc10pKSB7XHJcbiAgICBjb25zdCByYW5nZU1heCA9IHpvb21QYW5PcHRpb25zLnJhbmdlTWF4W3pvb21QYW5PcHRpb25zLnNjYWxlQXhlc107XHJcbiAgICBpZiAobmV3TWF4ID4gcmFuZ2VNYXgpIHtcclxuICAgICAgbmV3TWF4ID0gcmFuZ2VNYXg7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBuZXdNYXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJhbmdlTWluTGltaXRlcih6b29tUGFuT3B0aW9ucywgbmV3TWluKSB7XHJcbiAgaWYgKHpvb21QYW5PcHRpb25zLnNjYWxlQXhlcyAmJiB6b29tUGFuT3B0aW9ucy5yYW5nZU1pbiAmJlxyXG4gICAgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZih6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdKSkge1xyXG4gICAgY29uc3QgcmFuZ2VNaW4gPSB6b29tUGFuT3B0aW9ucy5yYW5nZU1pblt6b29tUGFuT3B0aW9ucy5zY2FsZUF4ZXNdO1xyXG4gICAgaWYgKG5ld01pbiA8IHJhbmdlTWluKSB7XHJcbiAgICAgIG5ld01pbiA9IHJhbmdlTWluO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gbmV3TWluO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6b29tSW5kZXhTY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGxhYmVscyA9IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IGxhc3RMYWJlbEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcbiAgbGV0IG1heEluZGV4ID0gc2NhbGUubWF4SW5kZXg7XHJcbiAgY29uc3Qgc2Vuc2l0aXZpdHkgPSB6b29tT3B0aW9ucy5zZW5zaXRpdml0eTtcclxuICBjb25zdCBjaGFydENlbnRlciA9ICBzY2FsZS5pc0hvcml6b250YWwoKSA/IHNjYWxlLmxlZnQgKyAoc2NhbGUud2lkdGggLyAyKSA6IHNjYWxlLnRvcCArIChzY2FsZS5oZWlnaHQgLyAyKTtcclxuICBjb25zdCBjZW50ZXJQb2ludGVyID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBjZW50ZXIueCA6IGNlbnRlci55O1xyXG5cclxuICB6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA9IHpvb20gPiAxID8gem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgKyAxIDogem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgLSAxO1xyXG5cclxuICBpZiAoTWF0aC5hYnMoem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEpID4gc2Vuc2l0aXZpdHkpIHtcclxuICAgIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA8IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWluSW5kZXggPD0gMCkge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWluSW5kZXggPSBNYXRoLm1heCgwLCBtaW5JbmRleCAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChjZW50ZXJQb2ludGVyIDwgY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBpZiAobWF4SW5kZXggPj0gbGFzdExhYmVsSW5kZXgpIHtcclxuICAgICAgICAgIG1pbkluZGV4ID0gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWF4SW5kZXggKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgfSBlbHNlIGlmICh6b29tTlMuem9vbUN1bXVsYXRpdmVEZWx0YSA+IDApIHtcclxuICAgICAgaWYgKGNlbnRlclBvaW50ZXIgPj0gY2hhcnRDZW50ZXIpIHtcclxuICAgICAgICBtaW5JbmRleCA9IG1pbkluZGV4IDwgbWF4SW5kZXggPyBtaW5JbmRleCA9IE1hdGgubWluKG1heEluZGV4LCBtaW5JbmRleCArIDEpIDogbWluSW5kZXg7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2VudGVyUG9pbnRlciA8IGNoYXJ0Q2VudGVyKSB7XHJcbiAgICAgICAgbWF4SW5kZXggPSBtYXhJbmRleCA+IG1pbkluZGV4ID8gbWF4SW5kZXggPSBNYXRoLm1heChtaW5JbmRleCwgbWF4SW5kZXggLSAxKSA6IG1heEluZGV4O1xyXG4gICAgICB9XHJcbiAgICAgIHpvb21OUy56b29tQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuICAgIH1cclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWluID0gcmFuZ2VNaW5MaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWluSW5kZXhdKTtcclxuICAgIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBsYWJlbHNbbWF4SW5kZXhdKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21UaW1lU2NhbGUoc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuXHJcbiAgLy8gdmFyIHJhbmdlO1xyXG4gIC8vIHZhciBtaW5fcGVyY2VudDtcclxuICAvLyBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkpIHtcclxuICAvLyAgIHJhbmdlID0gc2NhbGUucmlnaHQgLSBzY2FsZS5sZWZ0O1xyXG4gIC8vICAgbWluX3BlcmNlbnQgPSAoY2VudGVyLnggLSBzY2FsZS5sZWZ0KSAvIHJhbmdlO1xyXG4gIC8vIH0gZWxzZSB7XHJcbiAgLy8gICByYW5nZSA9IHNjYWxlLmJvdHRvbSAtIHNjYWxlLnRvcDtcclxuICAvLyAgIG1pbl9wZXJjZW50ID0gKGNlbnRlci55IC0gc2NhbGUudG9wKSAvIHJhbmdlO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHZhciBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuICBjb25zdCByYW5nZSA9IHNjYWxlLm1heCAtIHNjYWxlLm1pbjtcclxuICBjb25zdCBuZXdEaWZmID0gcmFuZ2UgKiAoem9vbSAtIDEpO1xyXG5cclxuICBjb25zdCBjdXJzb3JQaXhlbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gY2VudGVyLnggOiBjZW50ZXIueTtcclxuICBjb25zdCBtaW5fcGVyY2VudCA9IChzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKGN1cnNvclBpeGVsKSAtIHNjYWxlLm1pbikgLyByYW5nZTtcclxuICBjb25zdCBtYXhfcGVyY2VudCA9IDEgLSBtaW5fcGVyY2VudDtcclxuXHJcbiAgY29uc3QgbWluRGVsdGEgPSBuZXdEaWZmICogbWluX3BlcmNlbnQ7XHJcbiAgY29uc3QgbWF4RGVsdGEgPSBuZXdEaWZmICogbWF4X3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG5ld01pbiA9IHNjYWxlLm1pbiArIG1pbkRlbHRhO1xyXG4gIGNvbnN0IG5ld01heCA9IHNjYWxlLm1heCAtIG1heERlbHRhO1xyXG5cclxuICBjb25zdCBkaWZmTWluTWF4ID0gbmV3TWF4IC0gbmV3TWluO1xyXG4gIGNvbnN0IG1pbkxpbWl0RXhjZWVkZWQgPSByYW5nZU1pbkxpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG4gIGNvbnN0IG1heExpbWl0RXhjZWVkZWQgPSByYW5nZU1heExpbWl0ZXIoem9vbU9wdGlvbnMsIGRpZmZNaW5NYXgpICE9PSBkaWZmTWluTWF4O1xyXG5cclxuICBpZiAoIW1pbkxpbWl0RXhjZWVkZWQgJiYgIW1heExpbWl0RXhjZWVkZWQpIHtcclxuICAgIG9wdGlvbnMudGltZS5taW4gPSBuZXdNaW47XHJcbiAgICBvcHRpb25zLnRpbWUubWF4ID0gbmV3TWF4O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gem9vbU51bWVyaWNhbFNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKSB7XHJcbiAgY29uc3QgcmFuZ2UgPSBzY2FsZS5tYXggLSBzY2FsZS5taW47XHJcbiAgY29uc3QgbmV3RGlmZiA9IHJhbmdlICogKHpvb20gLSAxKTtcclxuXHJcbiAgY29uc3QgY3Vyc29yUGl4ZWwgPSBzY2FsZS5pc0hvcml6b250YWwoKSA/IGNlbnRlci54IDogY2VudGVyLnk7XHJcbiAgY29uc3QgbWluX3BlcmNlbnQgPSAoc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChjdXJzb3JQaXhlbCkgLSBzY2FsZS5taW4pIC8gcmFuZ2U7XHJcbiAgY29uc3QgbWF4X3BlcmNlbnQgPSAxIC0gbWluX3BlcmNlbnQ7XHJcblxyXG4gIGNvbnN0IG1pbkRlbHRhID0gbmV3RGlmZiAqIG1pbl9wZXJjZW50O1xyXG4gIGNvbnN0IG1heERlbHRhID0gbmV3RGlmZiAqIG1heF9wZXJjZW50O1xyXG5cclxuICBzY2FsZS5vcHRpb25zLnRpY2tzLm1pbiA9IHJhbmdlTWluTGltaXRlcih6b29tT3B0aW9ucywgc2NhbGUubWluICsgbWluRGVsdGEpO1xyXG4gIHNjYWxlLm9wdGlvbnMudGlja3MubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHpvb21PcHRpb25zLCBzY2FsZS5tYXggLSBtYXhEZWx0YSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHpvb21TY2FsZShzY2FsZSwgem9vbSwgY2VudGVyLCB6b29tT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gem9vbUZ1bmN0aW9uc1tzY2FsZS5vcHRpb25zLnR5cGVdO1xyXG4gIGlmIChmbikge1xyXG4gICAgZm4oc2NhbGUsIHpvb20sIGNlbnRlciwgem9vbU9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9ab29tKGNoYXJ0SW5zdGFuY2UsIHpvb20sIGNlbnRlciwgd2hpY2hBeGVzPykge1xyXG4gIGNvbnN0IGNhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgaWYgKCFjZW50ZXIpIHtcclxuICAgIGNlbnRlciA9IHtcclxuICAgICAgeDogKGNhLmxlZnQgKyBjYS5yaWdodCkgLyAyLFxyXG4gICAgICB5OiAoY2EudG9wICsgY2EuYm90dG9tKSAvIDIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgem9vbU9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnMuem9vbTtcclxuXHJcbiAgaWYgKHpvb21PcHRpb25zICYmIGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoem9vbU9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMuem9vbS5lbmFibGVkKSkge1xyXG4gICAgLy8gRG8gdGhlIHpvb20gaGVyZVxyXG4gICAgY29uc3Qgem9vbU1vZGUgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy56b29tLm1vZGUsIGRlZmF1bHRPcHRpb25zLnpvb20ubW9kZSk7XHJcbiAgICB6b29tT3B0aW9ucy5zZW5zaXRpdml0eSA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoY2hhcnRJbnN0YW5jZS5vcHRpb25zLnpvb20uc2Vuc2l0aXZpdHksIGRlZmF1bHRPcHRpb25zLnpvb20uc2Vuc2l0aXZpdHkpO1xyXG5cclxuICAgIC8vIFdoaWNoIGF4ZSBzaG91bGQgYmUgbW9kaWZpZWQgd2hlbiBmaWdlcnMgd2VyZSB1c2VkLlxyXG4gICAgbGV0IF93aGljaEF4ZXM7XHJcbiAgICBpZiAoem9vbU1vZGUgPT09ICd4eScgJiYgd2hpY2hBeGVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gYmFzZWQgb24gZmluZ2VycyBwb3NpdGlvbnNcclxuICAgICAgX3doaWNoQXhlcyA9IHdoaWNoQXhlcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIG5vIGVmZmVjdFxyXG4gICAgICBfd2hpY2hBeGVzID0gJ3h5JztcclxuICAgIH1cclxuXHJcbiAgICBoZWxwZXJzLmVhY2goY2hhcnRJbnN0YW5jZS5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlLCBpZCkge1xyXG4gICAgICBpZiAoc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3gnKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd4JykpIHtcclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneCc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZCh6b29tTW9kZSwgJ3knKSAmJiBkaXJlY3Rpb25FbmFibGVkKF93aGljaEF4ZXMsICd5JykpIHtcclxuICAgICAgICAvLyBEbyBZIHpvb21cclxuICAgICAgICB6b29tT3B0aW9ucy5zY2FsZUF4ZXMgPSAneSc7XHJcbiAgICAgICAgem9vbVNjYWxlKHNjYWxlLCB6b29tLCBjZW50ZXIsIHpvb21PcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICBpZiAodHlwZW9mIHpvb21PcHRpb25zLm9uWm9vbSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB6b29tT3B0aW9ucy5vblpvb20oKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhbkluZGV4U2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgbGFiZWxzID0gc2NhbGUuY2hhcnQuZGF0YS5sYWJlbHM7XHJcbiAgY29uc3QgbGFzdExhYmVsSW5kZXggPSBsYWJlbHMubGVuZ3RoIC0gMTtcclxuICBjb25zdCBvZmZzZXRBbXQgPSBNYXRoLm1heCgoc2NhbGUudGlja3MubGVuZ3RoIC0gKChzY2FsZS5vcHRpb25zLmdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMpID8gMCA6IDEpKSwgMSk7XHJcbiAgY29uc3QgcGFuU3BlZWQgPSBwYW5PcHRpb25zLnNwZWVkO1xyXG4gIGxldCBtaW5JbmRleCA9IHNjYWxlLm1pbkluZGV4O1xyXG4gIGNvbnN0IHN0ZXAgPSBNYXRoLnJvdW5kKHNjYWxlLndpZHRoIC8gKG9mZnNldEFtdCAqIHBhblNwZWVkKSk7XHJcbiAgbGV0IG1heEluZGV4O1xyXG5cclxuICB6b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhICs9IGRlbHRhO1xyXG5cclxuICBtaW5JbmRleCA9IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPiBzdGVwID8gTWF0aC5tYXgoMCwgbWluSW5kZXggLSAxKSA6IHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPCAtc3RlcCA/IE1hdGgubWluKGxhc3RMYWJlbEluZGV4IC0gb2Zmc2V0QW10ICsgMSwgbWluSW5kZXggKyAxKSA6IG1pbkluZGV4O1xyXG4gIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSBtaW5JbmRleCAhPT0gc2NhbGUubWluSW5kZXggPyAwIDogem9vbU5TLnBhbkN1bXVsYXRpdmVEZWx0YTtcclxuXHJcbiAgbWF4SW5kZXggPSBNYXRoLm1pbihsYXN0TGFiZWxJbmRleCwgbWluSW5kZXggKyBvZmZzZXRBbXQgLSAxKTtcclxuXHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5taW4gPSByYW5nZU1pbkxpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21pbkluZGV4XSk7XHJcbiAgc2NhbGUub3B0aW9ucy50aWNrcy5tYXggPSByYW5nZU1heExpbWl0ZXIocGFuT3B0aW9ucywgbGFiZWxzW21heEluZGV4XSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblRpbWVTY2FsZShzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpIHtcclxuICBjb25zdCBvcHRpb25zID0gc2NhbGUub3B0aW9ucztcclxuICBjb25zdCBsaW1pdGVkTWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5tYXgpIC0gZGVsdGEpKTtcclxuICBjb25zdCBsaW1pdGVkTWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzY2FsZS5taW4pIC0gZGVsdGEpKTtcclxuXHJcbiAgY29uc3QgbGltaXRlZFRpbWVEZWx0YSA9IGRlbHRhIDwgMCA/IGxpbWl0ZWRNYXggLSBzY2FsZS5tYXggOiBsaW1pdGVkTWluIC0gc2NhbGUubWluO1xyXG5cclxuICBvcHRpb25zLnRpbWUubWF4ID0gc2NhbGUubWF4ICsgbGltaXRlZFRpbWVEZWx0YTtcclxuICBvcHRpb25zLnRpbWUubWluID0gc2NhbGUubWluICsgbGltaXRlZFRpbWVEZWx0YTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFuTnVtZXJpY2FsU2NhbGUoc2NhbGUsIGRlbHRhLCBwYW5PcHRpb25zKSB7XHJcbiAgY29uc3QgdGlja09wdHMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG4gIGNvbnN0IHN0YXJ0ID0gc2NhbGUuc3RhcnQsXHJcbiAgICBlbmQgPSBzY2FsZS5lbmQ7XHJcblxyXG4gIGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpIC0gZGVsdGEpO1xyXG4gICAgdGlja09wdHMubWluID0gc2NhbGUuZ2V0VmFsdWVGb3JQaXhlbChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKGVuZCkgLSBkZWx0YSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHRpY2tPcHRzLm1pbiA9IHNjYWxlLmdldFZhbHVlRm9yUGl4ZWwoc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCkgLSBkZWx0YSk7XHJcbiAgICB0aWNrT3B0cy5tYXggPSBzY2FsZS5nZXRWYWx1ZUZvclBpeGVsKHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZW5kKSAtIGRlbHRhKTtcclxuICB9XHJcbiAgdGlja09wdHMubWluID0gcmFuZ2VNaW5MaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1pbik7XHJcbiAgdGlja09wdHMubWF4ID0gcmFuZ2VNYXhMaW1pdGVyKHBhbk9wdGlvbnMsIHRpY2tPcHRzLm1heCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhblNjYWxlKHNjYWxlLCBkZWx0YSwgcGFuT3B0aW9ucykge1xyXG4gIGNvbnN0IGZuID0gcGFuRnVuY3Rpb25zW3NjYWxlLm9wdGlvbnMudHlwZV07XHJcbiAgaWYgKGZuKSB7XHJcbiAgICBmbihzY2FsZSwgZGVsdGEsIHBhbk9wdGlvbnMpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZG9QYW4oY2hhcnRJbnN0YW5jZSwgZGVsdGFYLCBkZWx0YVkpIHtcclxuICBjb25zdCBwYW5PcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zLnBhbjtcclxuICBpZiAocGFuT3B0aW9ucyAmJiBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KHBhbk9wdGlvbnMuZW5hYmxlZCwgZGVmYXVsdE9wdGlvbnMucGFuLmVuYWJsZWQpKSB7XHJcbiAgICBjb25zdCBwYW5Nb2RlID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChjaGFydEluc3RhbmNlLm9wdGlvbnMucGFuLm1vZGUsIGRlZmF1bHRPcHRpb25zLnBhbi5tb2RlKTtcclxuICAgIHBhbk9wdGlvbnMuc3BlZWQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KGNoYXJ0SW5zdGFuY2Uub3B0aW9ucy5wYW4uc3BlZWQsIGRlZmF1bHRPcHRpb25zLnBhbi5zcGVlZCk7XHJcblxyXG4gICAgaGVscGVycy5lYWNoKGNoYXJ0SW5zdGFuY2Uuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSwgaWQpIHtcclxuICAgICAgaWYgKHNjYWxlLmlzSG9yaXpvbnRhbCgpICYmIGRpcmVjdGlvbkVuYWJsZWQocGFuTW9kZSwgJ3gnKSAmJiBkZWx0YVggIT09IDApIHtcclxuICAgICAgICBwYW5PcHRpb25zLnNjYWxlQXhlcyA9ICd4JztcclxuICAgICAgICBwYW5TY2FsZShzY2FsZSwgZGVsdGFYLCBwYW5PcHRpb25zKTtcclxuICAgICAgfSBlbHNlIGlmICghc2NhbGUuaXNIb3Jpem9udGFsKCkgJiYgZGlyZWN0aW9uRW5hYmxlZChwYW5Nb2RlLCAneScpICYmIGRlbHRhWSAhPT0gMCkge1xyXG4gICAgICAgIHBhbk9wdGlvbnMuc2NhbGVBeGVzID0gJ3knO1xyXG4gICAgICAgIHBhblNjYWxlKHNjYWxlLCBkZWx0YVksIHBhbk9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjaGFydEluc3RhbmNlLnVwZGF0ZSgwKTtcclxuICAgIGlmICh0eXBlb2YgcGFuT3B0aW9ucy5vblBhbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBwYW5PcHRpb25zLm9uUGFuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwb3NpdGlvbkluQ2hhcnRBcmVhKGNoYXJ0SW5zdGFuY2UsIHBvc2l0aW9uKSB7XHJcbiAgcmV0dXJuICAgKHBvc2l0aW9uLnggPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEubGVmdCAmJiBwb3NpdGlvbi54IDw9IGNoYXJ0SW5zdGFuY2UuY2hhcnRBcmVhLnJpZ2h0KSAmJlxyXG4gICAgKHBvc2l0aW9uLnkgPj0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEudG9wICYmIHBvc2l0aW9uLnkgPD0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWEuYm90dG9tKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSkge1xyXG4gIGNvbnN0IHNjYWxlcyA9IGNoYXJ0SW5zdGFuY2Uuc2NhbGVzO1xyXG5cclxuICBmb3IgKGNvbnN0IHNjYWxlSWQgaW4gc2NhbGVzKSB7XHJcbiAgICBpZiAoc2NhbGVzLmhhc093blByb3BlcnR5KHNjYWxlSWQpKSB7XHJcbiAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVzW3NjYWxlSWRdO1xyXG4gICAgICBpZiAoIXNjYWxlLmlzSG9yaXpvbnRhbCgpKSB7XHJcbiAgICAgICAgcmV0dXJuIHNjYWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBTdG9yZSB0aGVzZSBmb3IgbGF0ZXJcclxuem9vbU5TLnpvb21GdW5jdGlvbnMuY2F0ZWdvcnkgPSB6b29tSW5kZXhTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMudGltZSA9IHpvb21UaW1lU2NhbGU7XHJcbnpvb21OUy56b29tRnVuY3Rpb25zLmxpbmVhciA9IHpvb21OdW1lcmljYWxTY2FsZTtcclxuem9vbU5TLnpvb21GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSB6b29tTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMuY2F0ZWdvcnkgPSBwYW5JbmRleFNjYWxlO1xyXG56b29tTlMucGFuRnVuY3Rpb25zLnRpbWUgPSBwYW5UaW1lU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubGluZWFyID0gcGFuTnVtZXJpY2FsU2NhbGU7XHJcbnpvb21OUy5wYW5GdW5jdGlvbnMubG9nYXJpdGhtaWMgPSBwYW5OdW1lcmljYWxTY2FsZTtcclxuLy8gR2xvYmFscyBmb3IgY2F0ZXJnb3J5IHBhbiBhbmQgem9vbVxyXG56b29tTlMucGFuQ3VtdWxhdGl2ZURlbHRhID0gMDtcclxuem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG5cclxuLy8gQ2hhcnRqcyBab29tIFBsdWdpblxyXG5leHBvcnQgY29uc3Qgem9vbVBsdWdpbiA9IHtcclxuICBhZnRlckluaXQ6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUpIHtcclxuICAgICAgc2NhbGUub3JpZ2luYWxPcHRpb25zID0gaGVscGVycy5jbG9uZShzY2FsZS5vcHRpb25zKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNoYXJ0SW5zdGFuY2UucmVzZXRab29tID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLnNjYWxlcywgZnVuY3Rpb24oc2NhbGUsIGlkKSB7XHJcbiAgICAgICAgY29uc3QgdGltZU9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpbWU7XHJcbiAgICAgICAgY29uc3QgdGlja09wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpY2tzO1xyXG5cclxuICAgICAgICBpZiAodGltZU9wdGlvbnMpIHtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1pbiA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1pbjtcclxuICAgICAgICAgIHRpbWVPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aW1lLm1heDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aWNrT3B0aW9ucykge1xyXG4gICAgICAgICAgdGlja09wdGlvbnMubWluID0gc2NhbGUub3JpZ2luYWxPcHRpb25zLnRpY2tzLm1pbjtcclxuICAgICAgICAgIHRpY2tPcHRpb25zLm1heCA9IHNjYWxlLm9yaWdpbmFsT3B0aW9ucy50aWNrcy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGhlbHBlcnMuZWFjaChjaGFydEluc3RhbmNlLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGlkKSB7XHJcbiAgICAgICAgZGF0YXNldC5fbWV0YSA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoKTtcclxuICAgIH07XHJcblxyXG4gIH0sXHJcbiAgYmVmb3JlSW5pdDogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgY2hhcnRJbnN0YW5jZS56b29tID0ge307XHJcblxyXG4gICAgY29uc3Qgbm9kZSA9IGNoYXJ0SW5zdGFuY2Uuem9vbS5ub2RlID0gY2hhcnRJbnN0YW5jZS5jaGFydC5jdHguY2FudmFzO1xyXG5cclxuICAgIGNvbnN0IG9wdGlvbnMgPSBjaGFydEluc3RhbmNlLm9wdGlvbnM7XHJcbiAgICBjb25zdCBwYW5UaHJlc2hvbGQgPSBoZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0KG9wdGlvbnMucGFuID8gb3B0aW9ucy5wYW4udGhyZXNob2xkIDogdW5kZWZpbmVkLCB6b29tTlMuZGVmYXVsdHMucGFuLnRocmVzaG9sZCk7XHJcbiAgICBpZiAoIW9wdGlvbnMuem9vbSB8fCAhb3B0aW9ucy56b29tLmVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgIC8vIE9ubHkgd2FudCB0byB6b29tIGhvcml6b250YWwgYXhpc1xyXG4gICAgICBvcHRpb25zLnpvb20ubW9kZSA9ICd4JztcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VEb3duSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gZXZlbnQ7XHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZURvd25IYW5kbGVyKTtcclxuXHJcbiAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21TdGFydCkge1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZCA9IGV2ZW50O1xyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS51cGRhdGUoMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VNb3ZlSGFuZGxlcik7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICBpZiAoY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0KSB7XHJcbiAgICAgICAgICBjb25zdCBjaGFydEFyZWEgPSBjaGFydEluc3RhbmNlLmNoYXJ0QXJlYTtcclxuICAgICAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgICAgICBjb25zdCBiZWdpblBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0O1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgICAgICBjb25zdCBzdGFydFggPSBNYXRoLm1heChNYXRoLm1pbihiZWdpblBvaW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFgpIC0gb2Zmc2V0WCwgY2hhcnRBcmVhLmxlZnQpO1xyXG4gICAgICAgICAgY29uc3QgZW5kWCA9IE1hdGgubWluKE1hdGgubWF4KGJlZ2luUG9pbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WCkgLSBvZmZzZXRYLCBjaGFydEFyZWEucmlnaHQpO1xyXG4gICAgICAgICAgY29uc3QgZHJhZ0Rpc3RhbmNlID0gZW5kWCAtIHN0YXJ0WDtcclxuICAgICAgICAgIGNvbnN0IGNoYXJ0RGlzdGFuY2UgPSBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdDtcclxuICAgICAgICAgIGNvbnN0IHpvb20gPSAxICsgKGNoYXJ0RGlzdGFuY2UgLSBkcmFnRGlzdGFuY2UpIC8gY2hhcnREaXN0YW5jZTtcclxuICAgICAgICAgIGNvbnN0IGNlbnRlclggPSBjaGFydEFyZWEubGVmdCArIChzdGFydFggLSBjaGFydEFyZWEubGVmdCkgLyAoem9vbSAtIDEpO1xyXG5cclxuICAgICAgICAgIC8vIFJlbW92ZSBkcmFnIHN0YXJ0IGFuZCBlbmQgYmVmb3JlIGNoYXJ0IHVwZGF0ZSB0byBzdG9wIGRyYXdpbmcgc2VsZWN0ZWQgYXJlYVxyXG4gICAgICAgICAgY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICAgIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZHJhZ1pvb21FbmQgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPiAwKSB7XHJcbiAgICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCB6b29tLCB7XHJcbiAgICAgICAgICAgICAgeDogY2VudGVyWCxcclxuICAgICAgICAgICAgICB5OiAoeUF4aXMuYm90dG9tIC0geUF4aXMudG9wKSAvIDIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgLy8gbm9kZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZVVwSGFuZGxlcik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGV2ZW50LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xyXG5cclxuICAgICAgICBjb25zdCBjZW50ZXIgPSB7XHJcbiAgICAgICAgICB4IDogb2Zmc2V0WCxcclxuICAgICAgICAgIHkgOiBvZmZzZXRZXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA8IDApIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAxLjEsIGNlbnRlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCAwLjkwOSwgY2VudGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUHJldmVudCB0aGUgZXZlbnQgZnJvbSB0cmlnZ2VyaW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChlZy4gQ29udGVudCBzY3JvbGxpbmcpLlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgY2hhcnRJbnN0YW5jZS56b29tLl93aGVlbEhhbmRsZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgY29uc3QgbWMgPSBuZXcgSGFtbWVyLk1hbmFnZXIobm9kZSk7XHJcbiAgICAgIG1jLmFkZChuZXcgSGFtbWVyLlBpbmNoKCkpO1xyXG4gICAgICBtYy5hZGQobmV3IEhhbW1lci5QYW4oe1xyXG4gICAgICAgIHRocmVzaG9sZDogcGFuVGhyZXNob2xkXHJcbiAgICAgIH0pKTtcclxuXHJcbiAgICAgIC8vIEhhbW1lciByZXBvcnRzIHRoZSB0b3RhbCBzY2FsaW5nLiBXZSBuZWVkIHRoZSBpbmNyZW1lbnRhbCBhbW91bnRcclxuICAgICAgbGV0IGN1cnJlbnRQaW5jaFNjYWxpbmc7XHJcbiAgICAgIGNvbnN0IGhhbmRsZVBpbmNoID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBjb25zdCBkaWZmID0gMSAvIChjdXJyZW50UGluY2hTY2FsaW5nKSAqIGUuc2NhbGU7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBlLmNlbnRlci54IC0gcmVjdC5sZWZ0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBlLmNlbnRlci55IC0gcmVjdC50b3A7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0ge1xyXG4gICAgICAgICAgeCA6IG9mZnNldFgsXHJcbiAgICAgICAgICB5IDogb2Zmc2V0WVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIGZpbmdlcnMgcG9zaXRpb24gZGlmZmVyZW5jZVxyXG4gICAgICAgIGNvbnN0IHggPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFggLSBlLnBvaW50ZXJzWzFdLmNsaWVudFgpO1xyXG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmFicyhlLnBvaW50ZXJzWzBdLmNsaWVudFkgLSBlLnBvaW50ZXJzWzFdLmNsaWVudFkpO1xyXG5cclxuICAgICAgICAvLyBkaWFnb25hbCBmaW5nZXJzIHdpbGwgY2hhbmdlIGJvdGggKHh5KSBheGVzXHJcbiAgICAgICAgY29uc3QgcCA9IHggLyB5O1xyXG4gICAgICAgIGxldCB4eTtcclxuICAgICAgICBpZiAocCA+IDAuMyAmJiBwIDwgMS43KSB7XHJcbiAgICAgICAgICB4eSA9ICd4eSc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh4ID4geSkge1xyXG4gICAgICAgICAgLy8geCBheGlzXHJcbiAgICAgICAgICB4eSA9ICd4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8geSBheGlzXHJcbiAgICAgICAgICB4eSA9ICd5JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvWm9vbShjaGFydEluc3RhbmNlLCBkaWZmLCBjZW50ZXIsIHh5KTtcclxuXHJcbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdmVyYWxsIHNjYWxlXHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IGUuc2NhbGU7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGluY2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjdXJyZW50UGluY2hTY2FsaW5nID0gMTsgLy8gcmVzZXQgdHJhY2tlclxyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3BpbmNoJywgaGFuZGxlUGluY2gpO1xyXG4gICAgICBtYy5vbigncGluY2hlbmQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgaGFuZGxlUGluY2goZSk7XHJcbiAgICAgICAgY3VycmVudFBpbmNoU2NhbGluZyA9IG51bGw7IC8vIHJlc2V0XHJcbiAgICAgICAgem9vbU5TLnpvb21DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50RGVsdGFYID0gbnVsbCwgY3VycmVudERlbHRhWSA9IG51bGwsIHBhbm5pbmcgPSBmYWxzZTtcclxuICAgICAgY29uc3QgaGFuZGxlUGFuID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoY3VycmVudERlbHRhWCAhPT0gbnVsbCAmJiBjdXJyZW50RGVsdGFZICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBwYW5uaW5nID0gdHJ1ZTtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IGUuZGVsdGFYIC0gY3VycmVudERlbHRhWDtcclxuICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGUuZGVsdGFZIC0gY3VycmVudERlbHRhWTtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVggPSBlLmRlbHRhWDtcclxuICAgICAgICAgIGN1cnJlbnREZWx0YVkgPSBlLmRlbHRhWTtcclxuICAgICAgICAgIGRvUGFuKGNoYXJ0SW5zdGFuY2UsIGRlbHRhWCwgZGVsdGFZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtYy5vbigncGFuc3RhcnQnLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY3VycmVudERlbHRhWCA9IDA7XHJcbiAgICAgICAgY3VycmVudERlbHRhWSA9IDA7XHJcbiAgICAgICAgaGFuZGxlUGFuKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgbWMub24oJ3Bhbm1vdmUnLCBoYW5kbGVQYW4pO1xyXG4gICAgICBtYy5vbigncGFuZW5kJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVggPSBudWxsO1xyXG4gICAgICAgIGN1cnJlbnREZWx0YVkgPSBudWxsO1xyXG4gICAgICAgIHpvb21OUy5wYW5DdW11bGF0aXZlRGVsdGEgPSAwO1xyXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHBhbm5pbmcgPSBmYWxzZTsgfSwgNTAwKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBjaGFydEluc3RhbmNlLnpvb20uX2dob3N0Q2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmIChwYW5uaW5nKSB7XHJcbiAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fZ2hvc3RDbGlja0hhbmRsZXIpO1xyXG5cclxuICAgICAgY2hhcnRJbnN0YW5jZS5fbWMgPSBtYztcclxuICAgIH1cclxuICB9LFxyXG5cclxuICBiZWZvcmVEYXRhc2V0c0RyYXc6IGZ1bmN0aW9uKGNoYXJ0SW5zdGFuY2UpIHtcclxuICAgIGNvbnN0IGN0eCA9IGNoYXJ0SW5zdGFuY2UuY2hhcnQuY3R4O1xyXG4gICAgY29uc3QgY2hhcnRBcmVhID0gY2hhcnRJbnN0YW5jZS5jaGFydEFyZWE7XHJcbiAgICBjdHguc2F2ZSgpO1xyXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuICAgIGlmIChjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tRW5kKSB7XHJcbiAgICAgIGNvbnN0IHlBeGlzID0gZ2V0WUF4aXMoY2hhcnRJbnN0YW5jZSk7XHJcbiAgICAgIGNvbnN0IGJlZ2luUG9pbnQgPSBjaGFydEluc3RhbmNlLnpvb20uX2RyYWdab29tU3RhcnQ7XHJcbiAgICAgIGNvbnN0IGVuZFBvaW50ID0gY2hhcnRJbnN0YW5jZS56b29tLl9kcmFnWm9vbUVuZDtcclxuICAgICAgY29uc3Qgb2Zmc2V0WCA9IGJlZ2luUG9pbnQudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XHJcbiAgICAgIGNvbnN0IHN0YXJ0WCA9IE1hdGgubWluKGJlZ2luUG9pbnQuY2xpZW50WCwgZW5kUG9pbnQuY2xpZW50WCkgLSBvZmZzZXRYO1xyXG4gICAgICBjb25zdCBlbmRYID0gTWF0aC5tYXgoYmVnaW5Qb2ludC5jbGllbnRYLCBlbmRQb2ludC5jbGllbnRYKSAtIG9mZnNldFg7XHJcbiAgICAgIGNvbnN0IHJlY3RXaWR0aCA9IGVuZFggLSBzdGFydFg7XHJcblxyXG5cclxuICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2JhKDIyNSwyMjUsMjI1LDAuNSknO1xyXG4gICAgICBjdHgubGluZVdpZHRoID0gNTtcclxuICAgICAgY3R4LmZpbGxSZWN0KHN0YXJ0WCwgeUF4aXMudG9wLCByZWN0V2lkdGgsIHlBeGlzLmJvdHRvbSAtIHlBeGlzLnRvcCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3R4LnJlY3QoY2hhcnRBcmVhLmxlZnQsIGNoYXJ0QXJlYS50b3AsIGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XHJcbiAgICBjdHguY2xpcCgpO1xyXG4gIH0sXHJcblxyXG4gIGFmdGVyRGF0YXNldHNEcmF3OiBmdW5jdGlvbihjaGFydEluc3RhbmNlKSB7XHJcbiAgICBjaGFydEluc3RhbmNlLmNoYXJ0LmN0eC5yZXN0b3JlKCk7XHJcbiAgfSxcclxuXHJcbiAgZGVzdHJveTogZnVuY3Rpb24oY2hhcnRJbnN0YW5jZSkge1xyXG4gICAgaWYgKGNoYXJ0SW5zdGFuY2Uuem9vbSkge1xyXG4gICAgICBjb25zdCBvcHRpb25zID0gY2hhcnRJbnN0YW5jZS5vcHRpb25zO1xyXG4gICAgICBjb25zdCBub2RlID0gY2hhcnRJbnN0YW5jZS56b29tLm5vZGU7XHJcblxyXG4gICAgICBpZiAob3B0aW9ucy56b29tICYmIG9wdGlvbnMuem9vbS5kcmFnKSB7XHJcbiAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlRG93bkhhbmRsZXIpO1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgY2hhcnRJbnN0YW5jZS56b29tLl9tb3VzZU1vdmVIYW5kbGVyKTtcclxuICAgICAgICAvLyBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjaGFydEluc3RhbmNlLnpvb20uX21vdXNlVXBIYW5kbGVyKTtcclxuICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNoYXJ0SW5zdGFuY2Uuem9vbS5fbW91c2VVcEhhbmRsZXIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBjaGFydEluc3RhbmNlLnpvb20uX3doZWVsSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChIYW1tZXIpIHtcclxuICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2hhcnRJbnN0YW5jZS56b29tLl9naG9zdENsaWNrSGFuZGxlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlbGV0ZSBjaGFydEluc3RhbmNlLnpvb207XHJcblxyXG4gICAgICBjb25zdCBtYyA9IGNoYXJ0SW5zdGFuY2UuX21jO1xyXG4gICAgICBpZiAobWMpIHtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BpbmNoJyk7XHJcbiAgICAgICAgbWMucmVtb3ZlKCdwaW5jaGVuZCcpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuc3RhcnQnKTtcclxuICAgICAgICBtYy5yZW1vdmUoJ3BhbicpO1xyXG4gICAgICAgIG1jLnJlbW92ZSgncGFuZW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5DaGFydC5wbHVnaW5TZXJ2aWNlLnJlZ2lzdGVyKHpvb21QbHVnaW4pO1xyXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export * from './chart.zoom';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci91dGlscy9jaGFydGpzLXpvb20vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NoYXJ0Lnpvb20nO1xyXG4iXX0=
|