@cryptotaxi247 / netdata-1 / commits / 95b6adb1b

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);