kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
233 lines (193 loc) • 20.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _window = require("global/window");
var _visStateSchema = _interopRequireDefault(require("./vis-state-schema"));
var _datasetSchema = _interopRequireDefault(require("./dataset-schema"));
var _mapStyleSchema = _interopRequireDefault(require("./map-style-schema"));
var _mapStateSchema = _interopRequireDefault(require("./map-state-schema"));
var _versions = require("./versions");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var REDUCER_SCHEMAS = {
visState: _visStateSchema["default"],
mapState: _mapStateSchema["default"],
mapStyle: _mapStyleSchema["default"]
};
var KeplerGLSchema = /*#__PURE__*/function () {
function KeplerGLSchema() {
(0, _classCallCheck2["default"])(this, KeplerGLSchema);
this._validVersions = _versions.VERSIONS;
this._version = _versions.CURRENT_VERSION;
this._reducerSchemas = REDUCER_SCHEMAS;
this._datasetSchema = _datasetSchema["default"];
this._datasetLastSaved = null;
this._savedDataset = null;
}
/**
* stateToSave = {
* datasets: [
* {
* version: 'v0',
* data: {id, label, color, allData, fields}
* },
* {
* version: 'v0',
* data: {id, label, color, allData, fields}
* }
* ],
* config: {
* version: 'v0',
* config: {}
* },
* info: {
* app: 'kepler.gl',
* create_at: 'Mon May 28 2018 21:04:46 GMT-0700 (PDT)'
* }
* }
*
* Get config and data of current map to saven
* @param {Object} state
* @returns {{datasets: Object[], config: Object, info: Object}} app state to save
*/
(0, _createClass2["default"])(KeplerGLSchema, [{
key: "save",
value: function save(state) {
return {
datasets: this.getDatasetToSave(state),
config: this.getConfigToSave(state),
info: {
app: "kepler.gl",
created_at: new Date().toString()
}
};
}
}, {
key: "load",
value: function load(savedDatasets, savedConfig) {
return {
datasets: this.parseSavedData(savedDatasets),
config: savedConfig ? this.parseSavedConfig(savedConfig) : undefined
};
}
/**
* Get data to save
* @param {Object} state - app state
* @returns {{version: String, data: Object}} - dataset to save
*/
}, {
key: "getDatasetToSave",
value: function getDatasetToSave(state) {
var _this = this;
var dataChangedSinceLastSave = this.hasDataChanged(state);
if (!dataChangedSinceLastSave) {
return this._savedDataset;
}
var visState = state.visState;
var datasets = Object.values(visState.datasets).map(function (ds) {
return {
version: _this._version,
data: _this._datasetSchema[_this._version].save(ds)
};
}); // keep a copy of formatted datasets to save
this._datasetLastSaved = visState.datasets;
this._savedDataset = datasets;
return datasets;
}
/**
* Get App config to save
* @param {Object} state - app state
* @returns {{version: String, config: Object}} - config to save
*/
}, {
key: "getConfigToSave",
value: function getConfigToSave(state) {
var _this2 = this;
var config = Object.keys(this._reducerSchemas).reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), _this2._reducerSchemas[key][_this2._version].save(state[key]));
}, {});
return {
version: this._version,
config: config
};
}
/**
* Parse saved data
* @param {Array} datasets
* @returns {Object | null} - data to save
*/
}, {
key: "parseSavedData",
value: function parseSavedData(datasets) {
var _this3 = this;
return datasets.reduce(function (accu, ds) {
var validVersion = _this3.validateVersion(ds.version);
if (!validVersion) {
return accu;
}
accu.push(_this3._datasetSchema[validVersion].load(ds.data));
return accu;
}, []);
}
/**
* Parse saved App config
* @param {String} opt.version - config version
* @param {Object} opt.config - saved config
* @param {Object} state - current App State
* @returns {Object | null} - parsed config
*/
}, {
key: "parseSavedConfig",
value: function parseSavedConfig(_ref) {
var _this4 = this;
var version = _ref.version,
config = _ref.config;
var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var validVersion = this.validateVersion(version);
if (!validVersion) {
return null;
}
return Object.keys(config).reduce(function (accu, key) {
return _objectSpread(_objectSpread({}, accu), key in _this4._reducerSchemas ? _this4._reducerSchemas[key][validVersion].load(config[key]) : {});
}, {});
}
/**
* Validate version
* @param {String} version
* @returns {String | null} validVersion
*/
}, {
key: "validateVersion",
value: function validateVersion(version) {
if (!version) {
_window.console.error("There is no version number associated with this saved map");
return null;
}
if (!this._validVersions[version]) {
_window.console.error("".concat(version, " is not a valid version"));
return null;
}
return version;
}
/**
* Check if data has changed since last save
* @param {Object} state
* @returns {boolean} - whether data has changed or not
*/
}, {
key: "hasDataChanged",
value: function hasDataChanged(state) {
return this._datasetLastSaved !== state.visState.datasets;
}
}]);
return KeplerGLSchema;
}();
var KeplerGLSchemaManager = new KeplerGLSchema();
var _default = exports["default"] = KeplerGLSchemaManager;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY2hlbWFzL3NjaGVtYS1tYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIlJFRFVDRVJfU0NIRU1BUyIsInZpc1N0YXRlIiwidmlzU3RhdGVTY2hlbWEiLCJtYXBTdGF0ZSIsIm1hcFN0YXRlU2NoZW1hIiwibWFwU3R5bGUiLCJtYXBTdHlsZVNjaGVtYSIsIktlcGxlckdMU2NoZW1hIiwiX3ZhbGlkVmVyc2lvbnMiLCJWRVJTSU9OUyIsIl92ZXJzaW9uIiwiQ1VSUkVOVF9WRVJTSU9OIiwiX3JlZHVjZXJTY2hlbWFzIiwiX2RhdGFzZXRTY2hlbWEiLCJkYXRhc2V0U2NoZW1hIiwiX2RhdGFzZXRMYXN0U2F2ZWQiLCJfc2F2ZWREYXRhc2V0Iiwic3RhdGUiLCJkYXRhc2V0cyIsImdldERhdGFzZXRUb1NhdmUiLCJjb25maWciLCJnZXRDb25maWdUb1NhdmUiLCJpbmZvIiwiYXBwIiwiY3JlYXRlZF9hdCIsIkRhdGUiLCJ0b1N0cmluZyIsInNhdmVkRGF0YXNldHMiLCJzYXZlZENvbmZpZyIsInBhcnNlU2F2ZWREYXRhIiwicGFyc2VTYXZlZENvbmZpZyIsInVuZGVmaW5lZCIsImRhdGFDaGFuZ2VkU2luY2VMYXN0U2F2ZSIsImhhc0RhdGFDaGFuZ2VkIiwiT2JqZWN0IiwidmFsdWVzIiwibWFwIiwiZHMiLCJ2ZXJzaW9uIiwiZGF0YSIsInNhdmUiLCJrZXlzIiwicmVkdWNlIiwiYWNjdSIsImtleSIsInZhbGlkVmVyc2lvbiIsInZhbGlkYXRlVmVyc2lvbiIsInB1c2giLCJsb2FkIiwiQ29uc29sZSIsImVycm9yIiwiS2VwbGVyR0xTY2hlbWFNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7Ozs7OztBQUVBLElBQU1BLGVBQWUsR0FBRztBQUN0QkMsRUFBQUEsUUFBUSxFQUFFQywwQkFEWTtBQUV0QkMsRUFBQUEsUUFBUSxFQUFFQywwQkFGWTtBQUd0QkMsRUFBQUEs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T0FBakI7O0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsYUFBT0EsT0FBUDtBQUNEO0FBRUQ7Ozs7Ozs7O1dBS0Esd0JBQWVyQixLQUFmLEVBQXNCO0FBQ3BCLGFBQU8sS0FBS0YsaUJBQUwsS0FBMkJFLEtBQUssQ0FBQ2hCLFFBQU4sQ0FBZWlCLFFBQWpEO0FBQ0Q7Ozs7O0FBR0gsSUFBTWlDLHFCQUFxQixHQUFHLElBQUk1QyxjQUFKLEVBQTlCOztvQ0FFZTRDLHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgY29uc29sZSBhcyBDb25zb2xlIH0gZnJvbSBcImdsb2JhbC93aW5kb3dcIjtcblxuaW1wb3J0IHZpc1N0YXRlU2NoZW1hIGZyb20gXCIuL3Zpcy1zdGF0ZS1zY2hlbWFcIjtcbmltcG9ydCBkYXRhc2V0U2NoZW1hIGZyb20gXCIuL2RhdGFzZXQtc2NoZW1hXCI7XG5pbXBvcnQgbWFwU3R5bGVTY2hlbWEgZnJvbSBcIi4vbWFwLXN0eWxlLXNjaGVtYVwiO1xuaW1wb3J0IG1hcFN0YXRlU2NoZW1hIGZyb20gXCIuL21hcC1zdGF0ZS1zY2hlbWFcIjtcblxuaW1wb3J0IHsgQ1VSUkVOVF9WRVJTSU9OLCBWRVJTSU9OUyB9IGZyb20gXCIuL3ZlcnNpb25zXCI7XG5cbmNvbnN0IFJFRFVDRVJfU0NIRU1BUyA9IHtcbiAgdmlzU3RhdGU6IHZpc1N0YXRlU2NoZW1hLFxuICBtYXBTdGF0ZTogbWFwU3RhdGVTY2hlbWEsXG4gIG1hcFN0eWxlOiBtYXBTdHlsZVNjaGVtYVxufTtcblxuY2xhc3MgS2VwbGVyR0xTY2hlbWEge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl92YWxpZFZlcnNpb25zID0gVkVSU0lPTlM7XG4gICAgdGhpcy5fdmVyc2lvbiA9IENVUlJFTlRfVkVSU0lPTjtcbiAgICB0aGlzLl9yZWR1Y2VyU2NoZW1hcyA9IFJFRFVDRVJfU0NIRU1BUztcbiAgICB0aGlzLl9kYXRhc2V0U2NoZW1hID0gZGF0YXNldFNjaGVtYTtcblxuICAgIHRoaXMuX2RhdGFzZXRMYXN0U2F2ZWQgPSBudWxsO1xuICAgIHRoaXMuX3NhdmVkRGF0YXNldCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogc3RhdGVUb1NhdmUgPSB7XG4gICAqICAgZGF0YXNldHM6IFtcbiAgICogICAgIHtcbiAgICogICAgICAgdmVyc2lvbjogJ3YwJyxcbiAgICogICAgICAgZGF0YToge2lkLCBsYWJlbCwgY29sb3IsIGFsbERhdGEsIGZpZWxkc31cbiAgICogICAgIH0sXG4gICAqICAgICB7XG4gICAqICAgICAgIHZlcnNpb246ICd2MCcsXG4gICAqICAgICAgIGRhdGE6IHtpZCwgbGFiZWwsIGNvbG9yLCBhbGxEYXRhLCBmaWVsZHN9XG4gICAqICAgICB9XG4gICAqICAgXSxcbiAgICogICBjb25maWc6IHtcbiAgICogICAgIHZlcnNpb246ICd2MCcsXG4gICAqICAgICBjb25maWc6IHt9XG4gICAqICAgfSxcbiAgICogICBpbmZvOiB7XG4gICAqICAgICBhcHA6ICdrZXBsZXIuZ2wnLFxuICAgKiAgICAgY3JlYXRlX2F0OiAnTW9uIE1heSAyOCAyMDE4IDIxOjA0OjQ2IEdNVC0wNzAwIChQRFQpJ1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBHZXQgY29uZmlnIGFuZCBkYXRhIG9mIGN1cnJlbnQgbWFwIHRvIHNhdmVuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICAgKiBAcmV0dXJucyB7e2RhdGFzZXRzOiBPYmplY3RbXSwgY29uZmlnOiBPYmplY3QsIGluZm86IE9iamVjdH19IGFwcCBzdGF0ZSB0byBzYXZlXG4gICAqL1xuICBzYXZlKHN0YXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGFzZXRzOiB0aGlzLmdldERhdGFzZXRUb1NhdmUoc3RhdGUpLFxuICAgICAgY29uZmlnOiB0aGlzLmdldENvbmZpZ1RvU2F2ZShzdGF0ZSksXG4gICAgICBpbmZvOiB7XG4gICAgICAgIGFwcDogXCJrZXBsZXIuZ2xcIixcbiAgICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoKS50b1N0cmluZygpXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGxvYWQoc2F2ZWREYXRhc2V0cywgc2F2ZWRDb25maWcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0YXNldHM6IHRoaXMucGFyc2VTYXZlZERhdGEoc2F2ZWREYXRhc2V0cyksXG4gICAgICBjb25maWc6IHNhdmVkQ29uZmlnID8gdGhpcy5wYXJzZVNhdmVkQ29uZmlnKHNhdmVkQ29uZmlnKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRhdGEgdG8gc2F2ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBhcHAgc3RhdGVcbiAgICogQHJldHVybnMge3t2ZXJzaW9uOiBTdHJpbmcsIGRhdGE6IE9iamVjdH19IC0gZGF0YXNldCB0byBzYXZlXG4gICAqL1xuICBnZXREYXRhc2V0VG9TYXZlKHN0YXRlKSB7XG4gICAgY29uc3QgZGF0YUNoYW5nZWRTaW5jZUxhc3RTYXZlID0gdGhpcy5oYXNEYXRhQ2hhbmdlZChzdGF0ZSk7XG4gICAgaWYgKCFkYXRhQ2hhbmdlZFNpbmNlTGFzdFNhdmUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zYXZlZERhdGFzZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyB2aXNTdGF0ZSB9ID0gc3RhdGU7XG5cbiAgICBjb25zdCBkYXRhc2V0cyA9IE9iamVjdC52YWx1ZXModmlzU3RhdGUuZGF0YXNldHMpLm1hcChkcyA9PiAoe1xuICAgICAgdmVyc2lvbjogdGhpcy5fdmVyc2lvbixcbiAgICAgIGRhdGE6IHRoaXMuX2RhdGFzZXRTY2hlbWFbdGhpcy5fdmVyc2lvbl0uc2F2ZShkcylcbiAgICB9KSk7XG5cbiAgICAvLyBrZWVwIGEgY29weSBvZiBmb3JtYXR0ZWQgZGF0YXNldHMgdG8gc2F2ZVxuICAgIHRoaXMuX2RhdGFzZXRMYXN0U2F2ZWQgPSB2aXNTdGF0ZS5kYXRhc2V0cztcbiAgICB0aGlzLl9zYXZlZERhdGFzZXQgPSBkYXRhc2V0cztcblxuICAgIHJldHVybiBkYXRhc2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgQXBwIGNvbmZpZyB0byBzYXZlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSAtIGFwcCBzdGF0ZVxuICAgKiBAcmV0dXJucyB7e3ZlcnNpb246IFN0cmluZywgY29uZmlnOiBPYmplY3R9fSAtIGNvbmZpZyB0byBzYXZlXG4gICAqL1xuICBnZXRDb25maWdUb1NhdmUoc3RhdGUpIHtcbiAgICBjb25zdCBjb25maWcgPSBPYmplY3Qua2V5cyh0aGlzLl9yZWR1Y2VyU2NoZW1hcykucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4udGhpcy5fcmVkdWNlclNjaGVtYXNba2V5XVt0aGlzLl92ZXJzaW9uXS5zYXZlKHN0YXRlW2tleV0pXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgY29uZmlnXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBzYXZlZCBkYXRhXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRhdGFzZXRzXG4gICAqIEByZXR1cm5zIHtPYmplY3QgfCBudWxsfSAtIGRhdGEgdG8gc2F2ZVxuICAgKi9cbiAgcGFyc2VTYXZlZERhdGEoZGF0YXNldHMpIHtcbiAgICByZXR1cm4gZGF0YXNldHMucmVkdWNlKChhY2N1LCBkcykgPT4ge1xuICAgICAgY29uc3QgdmFsaWRWZXJzaW9uID0gdGhpcy52YWxpZGF0ZVZlcnNpb24oZHMudmVyc2lvbik7XG4gICAgICBpZiAoIXZhbGlkVmVyc2lvbikge1xuICAgICAgICByZXR1cm4gYWNjdTtcbiAgICAgIH1cbiAgICAgIGFjY3UucHVzaCh0aGlzLl9kYXRhc2V0U2NoZW1hW3ZhbGlkVmVyc2lvbl0ubG9hZChkcy5kYXRhKSk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Ugc2F2ZWQgQXBwIGNvbmZpZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0LnZlcnNpb24gLSBjb25maWcgdmVyc2lvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0LmNvbmZpZyAtIHNhdmVkIGNvbmZpZ1xuICAgKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgLSBjdXJyZW50IEFwcCBTdGF0ZVxuICAgKiBAcmV0dXJucyB7T2JqZWN0IHwgbnVsbH0gLSBwYXJzZWQgY29uZmlnXG4gICAqL1xuICBwYXJzZVNhdmVkQ29uZmlnKHsgdmVyc2lvbiwgY29uZmlnIH0sIHN0YXRlID0ge30pIHtcbiAgICBjb25zdCB2YWxpZFZlcnNpb24gPSB0aGlzLnZhbGlkYXRlVmVyc2lvbih2ZXJzaW9uKTtcbiAgICBpZiAoIXZhbGlkVmVyc2lvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKGtleSBpbiB0aGlzLl9yZWR1Y2VyU2NoZW1hc1xuICAgICAgICAgID8gdGhpcy5fcmVkdWNlclNjaGVtYXNba2V5XVt2YWxpZFZlcnNpb25dLmxvYWQoY29uZmlnW2tleV0pXG4gICAgICAgICAgOiB7fSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHZlcnNpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHZlcnNpb25cbiAgICogQHJldHVybnMge1N0cmluZyB8IG51bGx9IHZhbGlkVmVyc2lvblxuICAgKi9cbiAgdmFsaWRhdGVWZXJzaW9uKHZlcnNpb24pIHtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiVGhlcmUgaXMgbm8gdmVyc2lvbiBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2F2ZWQgbWFwXCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3ZhbGlkVmVyc2lvbnNbdmVyc2lvbl0pIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoYCR7dmVyc2lvbn0gaXMgbm90IGEgdmFsaWQgdmVyc2lvbmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgZGF0YSBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IHNhdmVcbiAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIHdoZXRoZXIgZGF0YSBoYXMgY2hhbmdlZCBvciBub3RcbiAgICovXG4gIGhhc0RhdGFDaGFuZ2VkKHN0YXRlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFzZXRMYXN0U2F2ZWQgIT09IHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICB9XG59XG5cbmNvbnN0IEtlcGxlckdMU2NoZW1hTWFuYWdlciA9IG5ldyBLZXBsZXJHTFNjaGVtYSgpO1xuXG5leHBvcnQgZGVmYXVsdCBLZXBsZXJHTFNjaGVtYU1hbmFnZXI7XG4iXX0=