dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
109 lines (100 loc) • 13.2 kB
JavaScript
;
/**
* @license
* Copyright 2013 David Eberlein (david.eberlein@ch.sauter-bc.com)
* MIT-licenced: https://opensource.org/license/MIT
*/
/**
* @fileoverview DataHandler base implementation for the "bar"
* data formats. This implementation must be extended and the
* extractSeries and rollingAverage must be implemented.
* @author David Eberlein (david.eberlein@ch.sauter-bc.com)
*/
/*global Dygraph:false */
/*global DygraphLayout:false */
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _datahandler = _interopRequireDefault(require("./datahandler"));
var _dygraphLayout = _interopRequireDefault(require("../dygraph-layout"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
/**
* @constructor
* @extends {Dygraph.DataHandler}
*/
var BarsHandler = function BarsHandler() {
_datahandler["default"].call(this);
};
BarsHandler.prototype = new _datahandler["default"]();
// TODO(danvk): figure out why the jsdoc has to be copy/pasted from superclass.
// (I get closure compiler errors if this isn't here.)
/**
* @override
* @param {!Array.<Array>} rawData The raw data passed into dygraphs where
* rawData[i] = [x,ySeries1,...,ySeriesN].
* @param {!number} seriesIndex Index of the series to extract. All other
* series should be ignored.
* @param {!DygraphOptions} options Dygraph options.
* @return {Array.<[!number,?number,?]>} The series in the unified data format
* where series[i] = [x,y,{extras}].
*/
BarsHandler.prototype.extractSeries = function (rawData, seriesIndex, options) {
// Not implemented here must be extended
};
/**
* @override
* @param {!Array.<[!number,?number,?]>} series The series in the unified
* data format where series[i] = [x,y,{extras}].
* @param {!number} rollPeriod The number of points over which to average the data
* @param {!DygraphOptions} options The dygraph options.
* @param {!number} seriesIndex Index of the series this was extracted from.
* TODO(danvk): be more specific than "Array" here.
* @return {!Array.<[!number,?number,?]>} the rolled series.
*/
BarsHandler.prototype.rollingAverage = function (series, rollPeriod, options, seriesIndex) {
// Not implemented here, must be extended.
};
/** @inheritDoc */
BarsHandler.prototype.onPointsCreated_ = function (series, points) {
for (var i = 0; i < series.length; ++i) {
var item = series[i];
var point = points[i];
point.y_top = NaN;
point.y_bottom = NaN;
point.yval_minus = _datahandler["default"].parseFloat(item[2][0]);
point.yval_plus = _datahandler["default"].parseFloat(item[2][1]);
}
};
/** @inheritDoc */
BarsHandler.prototype.getExtremeYValues = function (series, dateWindow, stepPlot) {
var minY = null,
maxY = null,
y;
var firstIdx = 0;
var lastIdx = series.length - 1;
for (var j = firstIdx; j <= lastIdx; j++) {
y = series[j][1];
if (y === null || isNaN(y)) continue;
var low = series[j][2][0];
var high = series[j][2][1];
if (low > y) low = y; // this can happen with custom bars,
if (high < y) high = y; // e.g. in tests/custom-bars.html
if (maxY === null || high > maxY) maxY = high;
if (minY === null || low < minY) minY = low;
}
return [minY, maxY];
};
/** @inheritDoc */
BarsHandler.prototype.onLineEvaluated = function (points, axis, logscale) {
var point;
for (var j = 0; j < points.length; j++) {
// Copy over the error terms
point = points[j];
point.y_top = _dygraphLayout["default"].calcYNormal_(axis, point.yval_minus, logscale);
point.y_bottom = _dygraphLayout["default"].calcYNormal_(axis, point.yval_plus, logscale);
}
};
var _default = exports["default"] = BarsHandler;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsIl9kYXRhaGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2R5Z3JhcGhMYXlvdXQiLCJlIiwiX19lc01vZHVsZSIsIkJhcnNIYW5kbGVyIiwiRHlncmFwaERhdGFIYW5kbGVyIiwiY2FsbCIsInByb3RvdHlwZSIsImV4dHJhY3RTZXJpZXMiLCJyYXdEYXRhIiwic2VyaWVzSW5kZXgiLCJvcHRpb25zIiwicm9sbGluZ0F2ZXJhZ2UiLCJzZXJpZXMiLCJyb2xsUGVyaW9kIiwib25Qb2ludHNDcmVhdGVkXyIsInBvaW50cyIsImkiLCJsZW5ndGgiLCJpdGVtIiwicG9pbnQiLCJ5X3RvcCIsIk5hTiIsInlfYm90dG9tIiwieXZhbF9taW51cyIsInBhcnNlRmxvYXQiLCJ5dmFsX3BsdXMiLCJnZXRFeHRyZW1lWVZhbHVlcyIsImRhdGVXaW5kb3ciLCJzdGVwUGxvdCIsIm1pblkiLCJtYXhZIiwieSIsImZpcnN0SWR4IiwibGFzdElkeCIsImoiLCJpc05hTiIsImxvdyIsImhpZ2giLCJvbkxpbmVFdmFsdWF0ZWQiLCJheGlzIiwibG9nc2NhbGUiLCJEeWdyYXBoTGF5b3V0IiwiY2FsY1lOb3JtYWxfIiwiX2RlZmF1bHQiLCJtb2R1bGUiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFoYW5kbGVyL2JhcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMyBEYXZpZCBFYmVybGVpbiAoZGF2aWQuZWJlcmxlaW5AY2guc2F1dGVyLWJjLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlL01JVFxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBEYXRhSGFuZGxlciBiYXNlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgXCJiYXJcIlxuICogZGF0YSBmb3JtYXRzLiBUaGlzIGltcGxlbWVudGF0aW9uIG11c3QgYmUgZXh0ZW5kZWQgYW5kIHRoZVxuICogZXh0cmFjdFNlcmllcyBhbmQgcm9sbGluZ0F2ZXJhZ2UgbXVzdCBiZSBpbXBsZW1lbnRlZC5cbiAqIEBhdXRob3IgRGF2aWQgRWJlcmxlaW4gKGRhdmlkLmViZXJsZWluQGNoLnNhdXRlci1iYy5jb20pXG4gKi9cblxuLypnbG9iYWwgRHlncmFwaDpmYWxzZSAqL1xuLypnbG9iYWwgRHlncmFwaExheW91dDpmYWxzZSAqL1xuXG5pbXBvcnQgRHlncmFwaERhdGFIYW5kbGVyIGZyb20gJy4vZGF0YWhhbmRsZXInO1xuaW1wb3J0IER5Z3JhcGhMYXlvdXQgZnJvbSAnLi4vZHlncmFwaC1sYXlvdXQnO1xuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMge0R5Z3JhcGguRGF0YUhhbmRsZXJ9XG4gKi9cbnZhciBCYXJzSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICBEeWdyYXBoRGF0YUhhbmRsZXIuY2FsbCh0aGlzKTtcbn07XG5CYXJzSGFuZGxlci5wcm90b3R5cGUgPSBuZXcgRHlncmFwaERhdGFIYW5kbGVyKCk7XG5cbi8vIFRPRE8oZGFudmspOiBmaWd1cmUgb3V0IHdoeSB0aGUganNkb2MgaGFzIHRvIGJlIGNvcHkvcGFzdGVkIGZyb20gc3VwZXJjbGFzcy5cbi8vICAgKEkgZ2V0IGNsb3N1cmUgY29tcGlsZXIgZXJyb3JzIGlmIHRoaXMgaXNuJ3QgaGVyZS4pXG4vKipcbiAqIEBvdmVycmlkZVxuICogQHBhcmFtIHshQXJyYXkuPEFycmF5Pn0gcmF3RGF0YSBUaGUgcmF3IGRhdGEgcGFzc2VkIGludG8gZHlncmFwaHMgd2hlcmVcbiAqICAgICByYXdEYXRhW2ldID0gW3gseVNlcmllczEsLi4uLHlTZXJpZXNOXS5cbiAqIEBwYXJhbSB7IW51bWJlcn0gc2VyaWVzSW5kZXggSW5kZXggb2YgdGhlIHNlcmllcyB0byBleHRyYWN0LiBBbGwgb3RoZXJcbiAqICAgICBzZXJpZXMgc2hvdWxkIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0geyFEeWdyYXBoT3B0aW9uc30gb3B0aW9ucyBEeWdyYXBoIG9wdGlvbnMuXG4gKiBAcmV0dXJuIHtBcnJheS48WyFudW1iZXIsP251bWJlciw/XT59IFRoZSBzZXJpZXMgaW4gdGhlIHVuaWZpZWQgZGF0YSBmb3JtYXRcbiAqICAgICB3aGVyZSBzZXJpZXNbaV0gPSBbeCx5LHtleHRyYXN9XS5cbiAqL1xuQmFyc0hhbmRsZXIucHJvdG90eXBlLmV4dHJhY3RTZXJpZXMgPSBmdW5jdGlvbihyYXdEYXRhLCBzZXJpZXNJbmRleCwgb3B0aW9ucykge1xuICAvLyBOb3QgaW1wbGVtZW50ZWQgaGVyZSBtdXN0IGJlIGV4dGVuZGVkXG59O1xuXG4vKipcbiAqIEBvdmVycmlkZVxuICogQHBhcmFtIHshQXJyYXkuPFshbnVtYmVyLD9udW1iZXIsP10+fSBzZXJpZXMgVGhlIHNlcmllcyBpbiB0aGUgdW5pZmllZFxuICogICAgICAgICAgZGF0YSBmb3JtYXQgd2hlcmUgc2VyaWVzW2ldID0gW3gseSx7ZXh0cmFzfV0uXG4gKiBAcGFyYW0geyFudW1iZXJ9IHJvbGxQZXJpb2QgVGhlIG51bWJlciBvZiBwb2ludHMgb3ZlciB3aGljaCB0byBhdmVyYWdlIHRoZSBkYXRhXG4gKiBAcGFyYW0geyFEeWdyYXBoT3B0aW9uc30gb3B0aW9ucyBUaGUgZHlncmFwaCBvcHRpb25zLlxuICogQHBhcmFtIHshbnVtYmVyfSBzZXJpZXNJbmRleCBJbmRleCBvZiB0aGUgc2VyaWVzIHRoaXMgd2FzIGV4dHJhY3RlZCBmcm9tLlxuICogVE9ETyhkYW52ayk6IGJlIG1vcmUgc3BlY2lmaWMgdGhhbiBcIkFycmF5XCIgaGVyZS5cbiAqIEByZXR1cm4geyFBcnJheS48WyFudW1iZXIsP251bWJlciw/XT59IHRoZSByb2xsZWQgc2VyaWVzLlxuICovXG5CYXJzSGFuZGxlci5wcm90b3R5cGUucm9sbGluZ0F2ZXJhZ2UgPVxuICAgIGZ1bmN0aW9uKHNlcmllcywgcm9sbFBlcmlvZCwgb3B0aW9ucywgc2VyaWVzSW5kZXgpIHtcbiAgLy8gTm90IGltcGxlbWVudGVkIGhlcmUsIG11c3QgYmUgZXh0ZW5kZWQuXG59O1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkJhcnNIYW5kbGVyLnByb3RvdHlwZS5vblBvaW50c0NyZWF0ZWRfID0gZnVuY3Rpb24oc2VyaWVzLCBwb2ludHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgaXRlbSA9IHNlcmllc1tpXTtcbiAgICB2YXIgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgcG9pbnQueV90b3AgPSBOYU47XG4gICAgcG9pbnQueV9ib3R0b20gPSBOYU47XG4gICAgcG9pbnQueXZhbF9taW51cyA9IER5Z3JhcGhEYXRhSGFuZGxlci5wYXJzZUZsb2F0KGl0ZW1bMl1bMF0pO1xuICAgIHBvaW50Lnl2YWxfcGx1cyA9IER5Z3JhcGhEYXRhSGFuZGxlci5wYXJzZUZsb2F0KGl0ZW1bMl1bMV0pO1xuICB9XG59O1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkJhcnNIYW5kbGVyLnByb3RvdHlwZS5nZXRFeHRyZW1lWVZhbHVlcyA9IGZ1bmN0aW9uKHNlcmllcywgZGF0ZVdpbmRvdywgc3RlcFBsb3QpIHtcbiAgdmFyIG1pblkgPSBudWxsLCBtYXhZID0gbnVsbCwgeTtcblxuICB2YXIgZmlyc3RJZHggPSAwO1xuICB2YXIgbGFzdElkeCA9IHNlcmllcy5sZW5ndGggLSAxO1xuXG4gIGZvciAoIHZhciBqID0gZmlyc3RJZHg7IGogPD0gbGFzdElkeDsgaisrKSB7XG4gICAgeSA9IHNlcmllc1tqXVsxXTtcbiAgICBpZiAoeSA9PT0gbnVsbCB8fCBpc05hTih5KSkgY29udGludWU7XG5cbiAgICB2YXIgbG93ID0gc2VyaWVzW2pdWzJdWzBdO1xuICAgIHZhciBoaWdoID0gc2VyaWVzW2pdWzJdWzFdO1xuXG4gICAgaWYgKGxvdyA+IHkpIGxvdyA9IHk7IC8vIHRoaXMgY2FuIGhhcHBlbiB3aXRoIGN1c3RvbSBiYXJzLFxuICAgIGlmIChoaWdoIDwgeSkgaGlnaCA9IHk7IC8vIGUuZy4gaW4gdGVzdHMvY3VzdG9tLWJhcnMuaHRtbFxuXG4gICAgaWYgKG1heFkgPT09IG51bGwgfHwgaGlnaCA+IG1heFkpIG1heFkgPSBoaWdoO1xuICAgIGlmIChtaW5ZID09PSBudWxsIHx8IGxvdyA8IG1pblkpIG1pblkgPSBsb3c7XG4gIH1cblxuICByZXR1cm4gWyBtaW5ZLCBtYXhZIF07XG59O1xuXG4vKiogQGluaGVyaXREb2MgKi9cbkJhcnNIYW5kbGVyLnByb3RvdHlwZS5vbkxpbmVFdmFsdWF0ZWQgPSBmdW5jdGlvbihwb2ludHMsIGF4aXMsIGxvZ3NjYWxlKSB7XG4gIHZhciBwb2ludDtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBwb2ludHMubGVuZ3RoOyBqKyspIHtcbiAgICAvLyBDb3B5IG92ZXIgdGhlIGVycm9yIHRlcm1zXG4gICAgcG9pbnQgPSBwb2ludHNbal07XG4gICAgcG9pbnQueV90b3AgPSBEeWdyYXBoTGF5b3V0LmNhbGNZTm9ybWFsXyhheGlzLCBwb2ludC55dmFsX21pbnVzLCBsb2dzY2FsZSk7XG4gICAgcG9pbnQueV9ib3R0b20gPSBEeWdyYXBoTGF5b3V0LmNhbGNZTm9ybWFsXyhheGlzLCBwb2ludC55dmFsX3BsdXMsIGxvZ3NjYWxlKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQmFyc0hhbmRsZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7O0FBRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBQSxNQUFBLENBQUFDLGNBQUEsQ0FBQUMsT0FBQTtFQUFBQyxLQUFBO0FBQUE7QUFBQUQsT0FBQTtBQUVBLElBQUFFLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUE4QyxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLGdCQUFBQSxDQUFBO0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUUsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUEsRUFBYztFQUMzQkMsdUJBQWtCLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDL0IsQ0FBQztBQUNERixXQUFXLENBQUNHLFNBQVMsR0FBRyxJQUFJRix1QkFBa0IsQ0FBQyxDQUFDOztBQUVoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQUQsV0FBVyxDQUFDRyxTQUFTLENBQUNDLGFBQWEsR0FBRyxVQUFTQyxPQUFPLEVBQUVDLFdBQVcsRUFBRUMsT0FBTyxFQUFFO0VBQzVFO0FBQUEsQ0FDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBUCxXQUFXLENBQUNHLFNBQVMsQ0FBQ0ssY0FBYyxHQUNoQyxVQUFTQyxNQUFNLEVBQUVDLFVBQVUsRUFBRUgsT0FBTyxFQUFFRCxXQUFXLEVBQUU7RUFDckQ7QUFBQSxDQUNEOztBQUVEO0FBQ0FOLFdBQVcsQ0FBQ0csU0FBUyxDQUFDUSxnQkFBZ0IsR0FBRyxVQUFTRixNQUFNLEVBQUVHLE1BQU0sRUFBRTtFQUNoRSxLQUFLLElBQUlDLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0osTUFBTSxDQUFDSyxNQUFNLEVBQUUsRUFBRUQsQ0FBQyxFQUFFO0lBQ3RDLElBQUlFLElBQUksR0FBR04sTUFBTSxDQUFDSSxDQUFDLENBQUM7SUFDcEIsSUFBSUcsS0FBSyxHQUFHSixNQUFNLENBQUNDLENBQUMsQ0FBQztJQUNyQkcsS0FBSyxDQUFDQyxLQUFLLEdBQUdDLEdBQUc7SUFDakJGLEtBQUssQ0FBQ0csUUFBUSxHQUFHRCxHQUFHO0lBQ3BCRixLQUFLLENBQUNJLFVBQVUsR0FBR25CLHVCQUFrQixDQUFDb0IsVUFBVSxDQUFDTixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNURDLEtBQUssQ0FBQ00sU0FBUyxHQUFHckIsdUJBQWtCLENBQUNvQixVQUFVLENBQUNOLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM3RDtBQUNGLENBQUM7O0FBRUQ7QUFDQWYsV0FBVyxDQUFDRyxTQUFTLENBQUNvQixpQkFBaUIsR0FBRyxVQUFTZCxNQUFNLEVBQUVlLFVBQVUsRUFBRUMsUUFBUSxFQUFFO0VBQy9FLElBQUlDLElBQUksR0FBRyxJQUFJO0lBQUVDLElBQUksR0FBRyxJQUFJO0lBQUVDLENBQUM7RUFFL0IsSUFBSUMsUUFBUSxHQUFHLENBQUM7RUFDaEIsSUFBSUMsT0FBTyxHQUFHckIsTUFBTSxDQUFDSyxNQUFNLEdBQUcsQ0FBQztFQUUvQixLQUFNLElBQUlpQixDQUFDLEdBQUdGLFFBQVEsRUFBRUUsQ0FBQyxJQUFJRCxPQUFPLEVBQUVDLENBQUMsRUFBRSxFQUFFO0lBQ3pDSCxDQUFDLEdBQUduQixNQUFNLENBQUNzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsSUFBSUgsQ0FBQyxLQUFLLElBQUksSUFBSUksS0FBSyxDQUFDSixDQUFDLENBQUMsRUFBRTtJQUU1QixJQUFJSyxHQUFHLEdBQUd4QixNQUFNLENBQUNzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsSUFBSUcsSUFBSSxHQUFHekIsTUFBTSxDQUFDc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTFCLElBQUlFLEdBQUcsR0FBR0wsQ0FBQyxFQUFFSyxHQUFHLEdBQUdMLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLElBQUlNLElBQUksR0FBR04sQ0FBQyxFQUFFTSxJQUFJLEdBQUdOLENBQUMsQ0FBQyxDQUFDOztJQUV4QixJQUFJRCxJQUFJLEtBQUssSUFBSSxJQUFJTyxJQUFJLEdBQUdQLElBQUksRUFBRUEsSUFBSSxHQUFHTyxJQUFJO0lBQzdDLElBQUlSLElBQUksS0FBSyxJQUFJLElBQUlPLEdBQUcsR0FBR1AsSUFBSSxFQUFFQSxJQUFJLEdBQUdPLEdBQUc7RUFDN0M7RUFFQSxPQUFPLENBQUVQLElBQUksRUFBRUMsSUFBSSxDQUFFO0FBQ3ZCLENBQUM7O0FBRUQ7QUFDQTNCLFdBQVcsQ0FBQ0csU0FBUyxDQUFDZ0MsZUFBZSxHQUFHLFVBQVN2QixNQUFNLEVBQUV3QixJQUFJLEVBQUVDLFFBQVEsRUFBRTtFQUN2RSxJQUFJckIsS0FBSztFQUNULEtBQUssSUFBSWUsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHbkIsTUFBTSxDQUFDRSxNQUFNLEVBQUVpQixDQUFDLEVBQUUsRUFBRTtJQUN0QztJQUNBZixLQUFLLEdBQUdKLE1BQU0sQ0FBQ21CLENBQUMsQ0FBQztJQUNqQmYsS0FBSyxDQUFDQyxLQUFLLEdBQUdxQix5QkFBYSxDQUFDQyxZQUFZLENBQUNILElBQUksRUFBRXBCLEtBQUssQ0FBQ0ksVUFBVSxFQUFFaUIsUUFBUSxDQUFDO0lBQzFFckIsS0FBSyxDQUFDRyxRQUFRLEdBQUdtQix5QkFBYSxDQUFDQyxZQUFZLENBQUNILElBQUksRUFBRXBCLEtBQUssQ0FBQ00sU0FBUyxFQUFFZSxRQUFRLENBQUM7RUFDOUU7QUFDRixDQUFDO0FBQUMsSUFBQUcsUUFBQSxHQUFBaEQsT0FBQSxjQUVhUSxXQUFXO0FBQUF5QyxNQUFBLENBQUFqRCxPQUFBLEdBQUFBLE9BQUEsQ0FBQWtELE9BQUEiLCJpZ25vcmVMaXN0IjpbXX0=