snapshots are now compressed to save disk space (1/2 the size) and browser memory (1/4 the size)
Costa Tsaousis (ktsaou) committed
Nov 14, 2017 at 21:44 UTC
95b6adb1b6f42c74be8e129235f2f611a6cc3c01
5 files changed
+257
-179
LICENSE-REDISTRIBUTED.md
+4
@@ -158,3 +158,7 @@ connectivity is not available.
158
Copyright 2008-2016 Andrey Petrov and [contributors](https://github.com/shazow/urllib3/blob/master/CONTRIBUTORS.txt)
159
[MIT License](https://github.com/shazow/urllib3/blob/master/LICENSE.txt)
160
161
+- [lz-string](http://pieroxy.net/blog/pages/lz-string/index.html)
162
+
163
+ Copyright 2013 Pieroxy
164
+ [WTFPL License](http://pieroxy.net/blog/pages/lz-string/index.html#inline_menu_10)
web/Makefile.am
+2
-1
@@ -50,10 +50,11 @@ dist_weblib_DATA = \
50
lib/gauge-1.3.2.min.js \
51
lib/jquery-2.2.4.min.js \
52
lib/jquery.easypiechart-97b5824.min.js \
53
- lib/perfect-scrollbar-0.6.15.min.js \
53
lib/jquery.peity-3.2.0.min.js \
54
lib/jquery.sparkline-2.1.2.min.js \
55
+ lib/lz-string-1.4.4.min.js \
56
lib/morris-0.5.1.min.js \
57
+ lib/perfect-scrollbar-0.6.15.min.js \
58
lib/raphael-2.2.4-min.js \
59
lib/tableExport-1.6.0.min.js \
60
$(NULL)
web/dashboard.js
+1
-1
@@ -4260,7 +4260,7 @@ var NETDATA = window.NETDATA || {};
4260
4261
if(typeof netdataSnapshotData.data[key] === 'string') {
4262
ok = true;
4263
- this.updateChartWithData(JSON.parse(netdataSnapshotData.data[key]));
4263
+ this.updateChartWithData(JSON.parse(netdataSnapshotData.uncompress(netdataSnapshotData.data[key])));
4264
}
4265
else {
4266
ok = false;
web/index.html
+249
-177
@@ -1894,6 +1894,17 @@
1894
else callback();
1895
}
1896
1897
+ var lzStringLoaded = false;
1898
+ function loadLzString(callback) {
1899
+ if(lzStringLoaded === false) {
1900
+ lzStringLoaded = true;
1901
+ loadJs('lib/lz-string-1.4.4.min.js', function() {
1902
+ callback();
1903
+ });
1904
+ }
1905
+ else callback();
1906
+ }
1907
+
1908
function alarmsUpdateModal() {
1909
var active = '<h3>Raised Alarms</h3><table class="table">';
1910
var all = '<h3>All Running Alarms</h3><div class="panel-group" id="alarms_all_accordion" role="tablist" aria-multiselectable="true">';
@@ -2862,38 +2873,66 @@
2873
loadSnapshotModalLog('danger', 'no data have been loaded');
2874
return;
2875
}
2865
- loadSnapshotModalLog('info', 'Please wait, activating snapshot...');
2876
2867
- netdataShowAlarms === false;
2868
- netdataRegistry = false;
2869
- netdataServer = tmpSnapshotData.server;
2870
- NETDATA.serverDefault = netdataServer;
2877
+ loadLzString(function() {
2878
+ loadSnapshotModalLog('info', 'Please wait, activating snapshot...');
2879
2872
- document.getElementById('charts_div').innerHTML = '';
2873
- document.getElementById('sidebar').innerHTML = '';
2874
- NETDATA.globalReset();
2880
+ netdataShowAlarms === false;
2881
+ netdataRegistry = false;
2882
+ netdataServer = tmpSnapshotData.server;
2883
+ NETDATA.serverDefault = netdataServer;
2884
2876
- if(typeof tmpSnapshotData.hash !== 'undefined')
2877
- urlOptions.hash = tmpSnapshotData.hash;
2878
- else
2879
- urlOptions.hash = '#';
2885
+ document.getElementById('charts_div').innerHTML = '';
2886
+ document.getElementById('sidebar').innerHTML = '';
2887
+ NETDATA.globalReset();
2888
2881
- if(typeof tmpSnapshotData.info !== 'undefined') {
2882
- var info = jsonParseFn(tmpSnapshotData.info);
2883
- if(typeof info.menu !== 'undefined')
2884
- netdataDashboard.menu = info.menu;
2889
+ if(typeof tmpSnapshotData.hash !== 'undefined')
2890
+ urlOptions.hash = tmpSnapshotData.hash;
2891
+ else
2892
+ urlOptions.hash = '#';
2893
2886
- if(typeof info.submenu !== 'undefined')
2887
- netdataDashboard.submenu = info.submenu;
2894
+ if(typeof tmpSnapshotData.info !== 'undefined') {
2895
+ var info = jsonParseFn(tmpSnapshotData.info);
2896
+ if(typeof info.menu !== 'undefined')
2897
+ netdataDashboard.menu = info.menu;
2898
2889
- if(typeof info.context !== 'undefined')
2890
- netdataDashboard.context = info.context;
2891
- }
2899
+ if(typeof info.submenu !== 'undefined')
2900
+ netdataDashboard.submenu = info.submenu;
2901
+
2902
+ if(typeof info.context !== 'undefined')
2903
+ netdataDashboard.context = info.context;
2904
+ }
2905
+
2906
+ if(typeof tmpSnapshotData.compression !== 'string')
2907
+ tmpSnapshotData.compression = 'none';
2908
2893
- netdataSnapshotData = tmpSnapshotData;
2894
- initializeDynamicDashboard(netdataSnapshotData.url);
2909
+ switch(tmpSnapshotData.compression) {
2910
+ case 'lzstring.utf16':
2911
+ tmpSnapshotData.uncompress = LZString.decompressFromUTF16;
2912
+ break;
2913
2896
- $('#loadSnapshotModal').modal('hide');
2914
+ case 'lzstring.base64':
2915
+ tmpSnapshotData.uncompress = LZString.decompressFromBase64;
2916
+ break;
2917
+
2918
+ case 'lzstring.uri':
2919
+ tmpSnapshotData.uncompress = LZString.decompressFromEncodedURIComponent;
2920
+ break;
2921
+
2922
+ case 'none':
2923
+ tmpSnapshotData.uncompress = function(data) { return data; };
2924
+ break;
2925
+
2926
+ default:
2927
+ alert('unknown compression method: ' + tmpSnapshotData.compression);
2928
+ break;
2929
+ }
2930
+
2931
+ netdataSnapshotData = tmpSnapshotData;
2932
+ initializeDynamicDashboard(netdataSnapshotData.url);
2933
+
2934
+ $('#loadSnapshotModal').modal('hide');
2935
+ });
2936
}
2937
2938
function loadSnapshotPreflight() {
@@ -2916,10 +2955,11 @@
2955
//console.log(result);
2956
var date_after = new Date(result.after_ms);
2957
var date_before = new Date(result.before_ms);
2919
- document.getElementById('loadSnapshotFilename').innerHTML = '<b>' + files.item(0).name + '</b>, snapshot version: <b>' + result.snapshot_version.toString() + '</b>';
2958
+ document.getElementById('loadSnapshotFilename').innerHTML = '<b>' + files.item(0).name + '</b>';
2959
document.getElementById('loadSnapshotHostname').innerHTML = '<b>' + result.hostname + '</b>, netdata version: <b>' + result.netdata_version.toString() + '</b>';
2960
document.getElementById('loadSnapshotURL').innerHTML = result.url;
2961
document.getElementById('loadSnapshotCharts').innerHTML = result.charts.charts_count.toString() + ' charts, ' + result.charts.dimensions_count.toString() + ' dimensions, ' + result.data_points.toString() + ' points per dimension, ' + Math.round(result.duration_ms / result.data_points).toString() + ' ms per point';
2962
+ document.getElementById('loadSnapshotInfo').innerHTML = 'version: <b>' + result.snapshot_version.toString() + '</b>, includes <b>' + result.charts_ok.toString() + '</b> unique chart data queries ' + ((result.charts_failed > 0)?('<b>' + result.charts_failed.toString() + '</b> failed'):'').toString() + ', compressed with <b>' + result.compression.toString() + '</b>';
2963
document.getElementById('loadSnapshotTimeRange').innerHTML = '<b>' + NETDATA.dateTime.localeDateString(date_after) + ' ' + NETDATA.dateTime.localeTimeString(date_after) + '</b> to <b>' + NETDATA.dateTime.localeDateString(date_before) + ' ' + NETDATA.dateTime.localeTimeString(date_before) + '</b>';
2964
document.getElementById('loadSnapshotComments').innerHTML = ((result.comments)?result.comments:'').toString();
2965
loadSnapshotModalLog('success', 'File loaded, click <b>Import</b> to render it!');
@@ -2964,7 +3004,7 @@
3004
var start_ms = Math.round(Date.now() - view_duration * 1000);
3005
3006
var bytes_per_chart = 2048;
2967
- var bytes_per_point_per_dimension = 5.3;
3007
+ var bytes_per_point_per_dimension = 2.2;
3008
3009
if(NETDATA.globalPanAndZoom.isActive() === true) {
3010
view_duration = Math.round((NETDATA.globalPanAndZoom.force_before_ms - NETDATA.globalPanAndZoom.force_after_ms) / 1000);
@@ -3031,181 +3071,212 @@
3071
}
3072
3073
function saveSnapshot() {
3034
- saveSnapshotStop = false;
3035
- $('#saveSnapshotModalProgressSection').show();
3036
- $('#saveSnapshotResolutionRadio').hide();
3037
- var filename = document.getElementById('saveSnapshotFilename').value;
3038
- // console.log(filename);
3039
- saveSnapshotModalLog('info', 'Generating snapshot as <code>' + filename.toString() + '</code>');
3040
-
3041
- var save_options = {
3042
- stop_updates_when_focus_is_lost: false,
3043
- update_only_visible: false,
3044
- sync_selection: false,
3045
- eliminate_zero_dimensions: true,
3046
- pan_and_zoom_data_padding: false,
3047
- show_help: false,
3048
- legend_toolbox: false,
3049
- resize_charts: false,
3050
- pixels_per_point: 1
3051
- };
3052
- var backedup_options = {};
3074
+ loadLzString(function() {
3075
+ saveSnapshotStop = false;
3076
+ $('#saveSnapshotModalProgressSection').show();
3077
+ $('#saveSnapshotResolutionRadio').hide();
3078
+ var filename = document.getElementById('saveSnapshotFilename').value;
3079
+ // console.log(filename);
3080
+ saveSnapshotModalLog('info', 'Generating snapshot as <code>' + filename.toString() + '</code>');
3081
+
3082
+ var save_options = {
3083
+ stop_updates_when_focus_is_lost: false,
3084
+ update_only_visible: false,
3085
+ sync_selection: false,
3086
+ eliminate_zero_dimensions: true,
3087
+ pan_and_zoom_data_padding: false,
3088
+ show_help: false,
3089
+ legend_toolbox: false,
3090
+ resize_charts: false,
3091
+ pixels_per_point: 1
3092
+ };
3093
+ var backedup_options = {};
3094
3054
- var x;
3055
- for(x in save_options) {
3056
- if (save_options.hasOwnProperty(x)) {
3057
- backedup_options[x] = NETDATA.options.current[x];
3058
- NETDATA.options.current[x] = save_options[x];
3095
+ var x;
3096
+ for (x in save_options) {
3097
+ if (save_options.hasOwnProperty(x)) {
3098
+ backedup_options[x] = NETDATA.options.current[x];
3099
+ NETDATA.options.current[x] = save_options[x];
3100
+ }
3101
}
3060
- }
3102
3062
- var el = document.getElementById('saveSnapshotModalProgressBar');
3063
- var eltxt = document.getElementById('saveSnapshotModalProgressBarText');
3064
-
3065
- options.data.charts_by_name = null;
3066
-
3067
- var saveData = {
3068
- hostname: options.hostname,
3069
- server: NETDATA.serverDefault,
3070
- netdata_version: options.data.version,
3071
- snapshot_version: 1,
3072
- after_ms: Date.now() - options.duration * 1000,
3073
- before_ms: Date.now(),
3074
- duration_ms: options.duration * 1000,
3075
- update_every_ms: options.update_every * 1000,
3076
- data_points: 0,
3077
- url: ((urlOptions.server !== null)?urlOptions.server:document.location.origin.toString() + document.location.search.toString()).toString(),
3078
- comments: document.getElementById('saveSnapshotComments').value.toString(),
3079
- hash: urlOptions.hash,
3080
- charts: options.data,
3081
- info: jsonStringifyFn({
3082
- menu: netdataDashboard.menu,
3083
- submenu: netdataDashboard.submenu,
3084
- context: netdataDashboard.context
3085
- }),
3086
- charts_ok: 0,
3087
- charts_failed: 0,
3088
- data: {}
3089
- };
3090
-
3091
- function pack_api1_v1_chart_data(state) {
3092
- if(state.library_name === null || state.data === null)
3093
- return;
3103
+ var el = document.getElementById('saveSnapshotModalProgressBar');
3104
+ var eltxt = document.getElementById('saveSnapshotModalProgressBarText');
3105
+
3106
+ options.data.charts_by_name = null;
3107
+
3108
+ var saveData = {
3109
+ hostname: options.hostname,
3110
+ server: NETDATA.serverDefault,
3111
+ netdata_version: options.data.version,
3112
+ snapshot_version: 1,
3113
+ after_ms: Date.now() - options.duration * 1000,
3114
+ before_ms: Date.now(),
3115
+ duration_ms: options.duration * 1000,
3116
+ update_every_ms: options.update_every * 1000,
3117
+ data_points: 0,
3118
+ url: ((urlOptions.server !== null) ? urlOptions.server : document.location.origin.toString() + document.location.search.toString()).toString(),
3119
+ comments: document.getElementById('saveSnapshotComments').value.toString(),
3120
+ hash: urlOptions.hash,
3121
+ charts: options.data,
3122
+ info: jsonStringifyFn({
3123
+ menu: netdataDashboard.menu,
3124
+ submenu: netdataDashboard.submenu,
3125
+ context: netdataDashboard.context
3126
+ }),
3127
+ charts_ok: 0,
3128
+ charts_failed: 0,
3129
+ compression: 'lzstring.utf16',
3130
+ data: {}
3131
+ };
3132
3095
- var data = state.data;
3096
- state.data = null;
3097
- data.state = null;
3098
- str = JSON.stringify(data);
3133
+ var compress = function (data) {
3134
+ return data;
3135
+ };
3136
+ switch (saveData.compression) {
3137
+ case 'lzstring.utf16':
3138
+ compress = LZString.compressToUTF16;
3139
+ break;
3140
3100
- if(typeof str === 'string') {
3101
- saveData.data[state.chartDataUniqueID()] = str;
3102
- return str.length;
3103
- }
3104
- else
3105
- return 0;
3106
- }
3141
+ case 'lzstring.base64':
3142
+ compress = LZString.compressToBase64;
3143
+ break;
3144
3108
- var clearPanAndZoom = false;
3109
- if(NETDATA.globalPanAndZoom.isActive() === false) {
3110
- NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], saveData.after_ms, saveData.before_ms);
3111
- clearPanAndZoom = true;
3112
- }
3145
+ case 'none':
3146
+ compress = function (data) {
3147
+ return data;
3148
+ };
3149
+ break;
3150
3114
- saveData.after_ms = NETDATA.globalPanAndZoom.force_after_ms;
3115
- saveData.before_ms = NETDATA.globalPanAndZoom.force_before_ms;
3116
- saveData.duration_ms = saveData.before_ms - saveData.after_ms;
3117
- saveData.data_points = Math.round((saveData.before_ms - saveData.after_ms) / (saveSnapshotSelectedSecondsPerPoint * 1000));
3118
- saveSnapshotModalLog('info', 'Generating snapshot with ' + saveData.data_points.toString() + ' data points per dimension...');
3151
+ default:
3152
+ alert('unknown compression method: ' + saveData.compression);
3153
+ saveData.compression = 'none';
3154
+ compress = function (data) {
3155
+ return data;
3156
+ };
3157
+ break;
3158
+ }
3159
3120
- var charts_count = 0;
3121
- var charts_ok = 0;
3122
- var charts_failed = 0;
3160
+ function pack_api1_v1_chart_data(state) {
3161
+ if (state.library_name === null || state.data === null)
3162
+ return;
3163
3124
- function saveSnapshotRestore() {
3125
- $('#saveSnapshotModal').modal('hide');
3164
+ var data = state.data;
3165
+ state.data = null;
3166
+ data.state = null;
3167
+ str = JSON.stringify(data);
3168
3127
- // restore the options
3128
- var x;
3129
- for(x in backedup_options) {
3130
- if (backedup_options.hasOwnProperty(x))
3131
- NETDATA.options.current[x] = backedup_options[x];
3169
+ if (typeof str === 'string') {
3170
+ var cstr = LZString.compressToUTF16(str);
3171
+ saveData.data[state.chartDataUniqueID()] = cstr;
3172
+ return cstr.length;
3173
+ }
3174
+ else
3175
+ return 0;
3176
}
3177
3134
- $(el).css('width', '0%').attr('aria-valuenow', 0);
3135
- eltxt.innerText = '0%';
3178
+ var clearPanAndZoom = false;
3179
+ if (NETDATA.globalPanAndZoom.isActive() === false) {
3180
+ NETDATA.globalPanAndZoom.setMaster(NETDATA.options.targets[0], saveData.after_ms, saveData.before_ms);
3181
+ clearPanAndZoom = true;
3182
+ }
3183
3137
- if(clearPanAndZoom)
3138
- NETDATA.globalPanAndZoom.clearMaster();
3184
+ saveData.after_ms = NETDATA.globalPanAndZoom.force_after_ms;
3185
+ saveData.before_ms = NETDATA.globalPanAndZoom.force_before_ms;
3186
+ saveData.duration_ms = saveData.before_ms - saveData.after_ms;
3187
+ saveData.data_points = Math.round((saveData.before_ms - saveData.after_ms) / (saveSnapshotSelectedSecondsPerPoint * 1000));
3188
+ saveSnapshotModalLog('info', 'Generating snapshot with ' + saveData.data_points.toString() + ' data points per dimension...');
3189
3140
- NETDATA.options.force_data_points = 0;
3141
- NETDATA.options.fake_chart_rendering = false;
3142
- NETDATA.onresize();
3143
- NETDATA.unpause();
3144
- }
3190
+ var charts_count = 0;
3191
+ var charts_ok = 0;
3192
+ var charts_failed = 0;
3193
3146
- NETDATA.pause(function() {
3147
- NETDATA.globalSelectionSync.stop();
3148
- NETDATA.options.force_data_points = saveData.data_points;
3149
- NETDATA.options.fake_chart_rendering = true;
3150
- var size = 0;
3194
+ function saveSnapshotRestore() {
3195
+ $('#saveSnapshotModal').modal('hide');
3196
3152
- function update_chart(idx) {
3153
- if(saveSnapshotStop === true) {
3154
- saveSnapshotModalLog('info', 'Cancelled!');
3155
- saveSnapshotRestore();
3156
- return;
3197
+ // restore the options
3198
+ var x;
3199
+ for (x in backedup_options) {
3200
+ if (backedup_options.hasOwnProperty(x))
3201
+ NETDATA.options.current[x] = backedup_options[x];
3202
}
3203
3159
- var state = NETDATA.options.targets[--idx];
3204
+ $(el).css('width', '0%').attr('aria-valuenow', 0);
3205
+ eltxt.innerText = '0%';
3206
3161
- var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length;
3162
- $(el).css('width', pcent+'%').attr('aria-valuenow', pcent);
3163
- eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id;
3207
+ if (clearPanAndZoom)
3208
+ NETDATA.globalPanAndZoom.clearMaster();
3209
3165
- setTimeout(function() {
3166
- charts_count++;
3167
- state.isVisible(true);
3168
- state.current.force_after_ms = saveData.after_ms;
3169
- state.current.force_before_ms = saveData.before_ms;
3170
-
3171
- state.updateChart(function(status, reason) {
3172
- state.current.force_after_ms = null;
3173
- state.current.force_before_ms = null;
3174
-
3175
- if(status === true) {
3176
- charts_ok++;
3177
- // state.log('ok');
3178
- size += pack_api1_v1_chart_data(state);
3179
- }
3180
- else {
3181
- charts_failed++;
3182
- state.log('failed to be updated: ' + reason);
3183
- }
3210
+ NETDATA.options.force_data_points = 0;
3211
+ NETDATA.options.fake_chart_rendering = false;
3212
+ NETDATA.onresize();
3213
+ NETDATA.unpause();
3214
+ }
3215
3185
- saveSnapshotModalLog((charts_failed)?'danger':'info', 'Generated size ' + (Math.round(size * 100 / 1024 / 1024) / 100).toString() + ' MB. ' + ((charts_failed)?(charts_failed.toString() + ' charts have failed to be downloaded'):'').toString());
3216
+ NETDATA.pause(function () {
3217
+ NETDATA.globalSelectionSync.stop();
3218
+ NETDATA.options.force_data_points = saveData.data_points;
3219
+ NETDATA.options.fake_chart_rendering = true;
3220
+ var size = 0;
3221
+
3222
+ function update_chart(idx) {
3223
+ if (saveSnapshotStop === true) {
3224
+ saveSnapshotModalLog('info', 'Cancelled!');
3225
+ saveSnapshotRestore();
3226
+ return;
3227
+ }
3228
3187
- if (idx > 0) {
3188
- update_chart(idx);
3189
- }
3190
- else {
3191
- saveData.charts_ok = charts_ok;
3192
- saveData.charts_failed = charts_failed;
3229
+ var state = NETDATA.options.targets[--idx];
3230
3194
- // save it
3195
- // console.log(saveData);
3196
- saveObjectToClient(saveData, filename);
3231
+ var pcent = (NETDATA.options.targets.length - idx) * 100 / NETDATA.options.targets.length;
3232
+ $(el).css('width', pcent + '%').attr('aria-valuenow', pcent);
3233
+ eltxt.innerText = Math.round(pcent).toString() + '%, ' + state.id;
3234
3198
- if(charts_failed > 0)
3199
- alert(charts_failed.toString() + ' failed to be downloaded');
3235
+ setTimeout(function () {
3236
+ charts_count++;
3237
+ state.isVisible(true);
3238
+ state.current.force_after_ms = saveData.after_ms;
3239
+ state.current.force_before_ms = saveData.before_ms;
3240
3201
- saveSnapshotRestore();
3202
- saveData = null;
3203
- }
3204
- })
3205
- }, 0);
3206
- }
3241
+ state.updateChart(function (status, reason) {
3242
+ state.current.force_after_ms = null;
3243
+ state.current.force_before_ms = null;
3244
3208
- update_chart(NETDATA.options.targets.length);
3245
+ if (status === true) {
3246
+ charts_ok++;
3247
+ // state.log('ok');
3248
+ size += pack_api1_v1_chart_data(state);
3249
+ }
3250
+ else {
3251
+ charts_failed++;
3252
+ state.log('failed to be updated: ' + reason);
3253
+ }
3254
+
3255
+ saveSnapshotModalLog((charts_failed) ? 'danger' : 'info', 'Generated size ' + (Math.round(size * 100 / 1024 / 1024) / 100).toString() + ' MB. ' + ((charts_failed) ? (charts_failed.toString() + ' charts have failed to be downloaded') : '').toString());
3256
+
3257
+ if (idx > 0) {
3258
+ update_chart(idx);
3259
+ }
3260
+ else {
3261
+ saveData.charts_ok = charts_ok;
3262
+ saveData.charts_failed = charts_failed;
3263
+
3264
+ // save it
3265
+ // console.log(saveData);
3266
+ saveObjectToClient(saveData, filename);
3267
+
3268
+ if (charts_failed > 0)
3269
+ alert(charts_failed.toString() + ' failed to be downloaded');
3270
+
3271
+ saveSnapshotRestore();
3272
+ saveData = null;
3273
+ }
3274
+ })
3275
+ }, 0);
3276
+ }
3277
+
3278
+ update_chart(NETDATA.options.targets.length);
3279
+ });
3280
});
3281
}
3282
@@ -3973,8 +4044,9 @@
4044
<tr><th>Filename</th><td id="loadSnapshotFilename"></td></tr>
4045
<tr><th>Hostname</th><td id="loadSnapshotHostname"></td></tr>
4046
<tr><th>Origin URL</th><td id="loadSnapshotURL"></td></tr>
4047
+ <tr><th>Charts Info</th><td id="loadSnapshotCharts"></td></tr>
4048
+ <tr><th>Snapshot Info</th><td id="loadSnapshotInfo"></td></tr>
4049
<tr><th>Time Range</th><td id="loadSnapshotTimeRange"></td></tr>
3977
- <tr><th>Chart Data</th><td id="loadSnapshotCharts"></td></tr>
4050
<tr><th>Comments</th><td id="loadSnapshotComments"></td></tr>
4051
</tbody>
4052
</table>
@@ -4914,6 +4986,6 @@
4986
</div>
4987
</div>
4988
<div id="hiddenDownloadLinks" style="display: none;" hidden></div>
4917
- <script type="text/javascript" src="dashboard.js?v20171112-21"></script>
4989
+ <script type="text/javascript" src="dashboard.js?v20171114-1"></script>
4990
</body>
4991
</html>
web/lib/lz-string-1.4.4.min.js
new
+1
@@ -0,0 +1 @@
1
+var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString);