kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
436 lines (432 loc) • 49.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createNewDataEntry = createNewDataEntry;
exports.getNewDatasetColor = getNewDatasetColor;
exports.getWMSCapabilities = getWMSCapabilities;
exports.wmsCapabilitiesToDatasetMetadata = wmsCapabilitiesToDatasetMetadata;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _uniq = _interopRequireDefault(require("lodash/uniq"));
var _keplerTable = _interopRequireDefault(require("./kepler-table"));
var _tasks = _interopRequireDefault(require("react-palm/tasks"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _core = require("@loaders.gl/core");
var _pmtiles = require("@loaders.gl/pmtiles");
var _wms = require("@loaders.gl/wms");
var _tilesetUtils = require("./tileset/tileset-utils");
var _rasterTileUtils = require("./tileset/raster-tile-utils");
var _vectorTileUtils = require("./tileset/vector-tile-utils");
var _excluded = ["info", "data"]; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
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; }
// apply a color for each dataset
// to use as label colors
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_utils.hexToRgb);
function getNewDatasetColor(datasets) {
var presetColors = datasetColors.map(String);
var usedColors = (0, _uniq["default"])(Object.values(datasets).map(function (d) {
return String(d.color);
})).filter(function (c) {
return presetColors.includes(c);
});
if (usedColors.length === presetColors.length) {
// if we already depleted the pool of color
return _utils.datasetColorMaker.next().value;
}
var color = _utils.datasetColorMaker.next().value;
while (usedColors.includes(String(color))) {
color = _utils.datasetColorMaker.next().value;
}
return color;
}
/**
* Take datasets payload from addDataToMap, create datasets entry save to visState
*/
function createNewDataEntry(_ref) {
var _getApplicationConfig;
var info = _ref.info,
data = _ref.data,
opts = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var TableClass = (_getApplicationConfig = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig !== void 0 ? _getApplicationConfig : _keplerTable["default"];
var dataValidator = _utils.validateInputData;
if (typeof TableClass.getInputDataValidator === 'function') {
dataValidator = TableClass.getInputDataValidator();
}
var validatedData = dataValidator(data);
if (!validatedData) {
return null;
}
// check if dataset already exists, and update it when loading data by batches incrementally
if (info && info.id && datasets[info.id]) {
// get keplerTable from datasets
var keplerTable = datasets[info.id];
// update the data in keplerTable
return UPDATE_TABLE_TASK({
table: keplerTable,
data: validatedData
});
}
info = info || {};
var color = info.color || getNewDatasetColor(datasets);
return CREATE_TABLE_TASK({
info: info,
color: color,
opts: opts,
data: data.arrowTable ? _objectSpread(_objectSpread({}, validatedData), {}, {
arrowTable: data.arrowTable
}) : validatedData
});
}
function updateTable(_x) {
return _updateTable.apply(this, arguments);
}
function _updateTable() {
_updateTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) {
var table, data, updated;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
table = _ref2.table, data = _ref2.data;
_context.next = 3;
return table.update(data);
case 3:
updated = _context.sent;
return _context.abrupt("return", updated);
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
return _updateTable.apply(this, arguments);
}
function createTable(_x2) {
return _createTable.apply(this, arguments);
}
function _createTable() {
_createTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetInfo) {
var _getApplicationConfig2;
var info, color, opts, data, refreshedMetadata, metadata, TableClass, table;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
info = datasetInfo.info, color = datasetInfo.color, opts = datasetInfo.opts, data = datasetInfo.data; // update metadata for remote tiled datasets
_context2.next = 3;
return refreshRemoteData(datasetInfo);
case 3:
refreshedMetadata = _context2.sent;
metadata = opts.metadata;
if (refreshedMetadata) {
metadata = _objectSpread(_objectSpread({}, opts.metadata), refreshedMetadata);
if (metadata.fields) {
data.fields = metadata.fields;
}
}
TableClass = (_getApplicationConfig2 = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig2 !== void 0 ? _getApplicationConfig2 : _keplerTable["default"];
table = new TableClass(_objectSpread(_objectSpread({
info: info,
color: color
}, opts), {}, {
metadata: metadata
}));
_context2.prev = 8;
_context2.next = 11;
return table.importData({
data: data
});
case 11:
_context2.next = 17;
break;
case 13:
_context2.prev = 13;
_context2.t0 = _context2["catch"](8);
console.error('Failed to create table', _context2.t0);
throw _context2.t0;
case 17:
return _context2.abrupt("return", table);
case 18:
case "end":
return _context2.stop();
}
}, _callee2, null, [[8, 13]]);
}));
return _createTable.apply(this, arguments);
}
var UPDATE_TABLE_TASK = _tasks["default"].fromPromise(updateTable, 'UPDATE_TABLE_TASK');
var CREATE_TABLE_TASK = _tasks["default"].fromPromise(createTable, 'CREATE_TABLE_TASK');
/**
* Fetch metadata for vector tile layers using tilesetMetadataUrl from metadata
* @param datasetInfo
* @returns
*/
function refreshRemoteData(_x3) {
return _refreshRemoteData.apply(this, arguments);
}
function _refreshRemoteData() {
_refreshRemoteData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(datasetInfo) {
var type;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
type = datasetInfo.info.type;
_context3.t0 = type;
_context3.next = _context3.t0 === _constants.DatasetType.VECTOR_TILE ? 4 : _context3.t0 === _constants.DatasetType.RASTER_TILE ? 7 : _context3.t0 === _constants.DatasetType.WMS_TILE ? 10 : 13;
break;
case 4:
_context3.next = 6;
return refreshVectorTileMetadata(datasetInfo);
case 6:
return _context3.abrupt("return", _context3.sent);
case 7:
_context3.next = 9;
return refreshRasterTileMetadata(datasetInfo);
case 9:
return _context3.abrupt("return", _context3.sent);
case 10:
_context3.next = 12;
return refreshWMSMetadata(datasetInfo);
case 12:
return _context3.abrupt("return", _context3.sent);
case 13:
return _context3.abrupt("return", null);
case 14:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _refreshRemoteData.apply(this, arguments);
}
function refreshVectorTileMetadata(_x4) {
return _refreshVectorTileMetadata.apply(this, arguments);
}
function _refreshVectorTileMetadata() {
_refreshVectorTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(datasetInfo) {
var _ref3, remoteTileFormat, tilesetMetadataUrl, tilesetDataUrl, rawMetadata, tileSource, metadata;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_ref3 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref3.remoteTileFormat, tilesetMetadataUrl = _ref3.tilesetMetadataUrl, tilesetDataUrl = _ref3.tilesetDataUrl;
if (!(!(remoteTileFormat === _constants.RemoteTileFormat.PMTILES || remoteTileFormat === _constants.RemoteTileFormat.MVT) || typeof tilesetMetadataUrl !== 'string' || typeof tilesetDataUrl !== 'string')) {
_context4.next = 3;
break;
}
return _context4.abrupt("return", null);
case 3:
_context4.prev = 3;
rawMetadata = null;
if (!(remoteTileFormat === _constants.RemoteTileFormat.MVT)) {
_context4.next = 11;
break;
}
_context4.next = 8;
return (0, _tilesetUtils.getMVTMetadata)(tilesetMetadataUrl);
case 8:
rawMetadata = _context4.sent;
_context4.next = 15;
break;
case 11:
tileSource = _pmtiles.PMTilesSource.createDataSource(tilesetMetadataUrl, {});
_context4.next = 14;
return tileSource.metadata;
case 14:
rawMetadata = _context4.sent;
case 15:
if (!rawMetadata) {
_context4.next = 20;
break;
}
metadata = (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata);
_context4.next = 19;
return (0, _vectorTileUtils.getFieldsFromTile)({
remoteTileFormat: remoteTileFormat,
tilesetUrl: tilesetDataUrl,
metadataUrl: tilesetMetadataUrl,
metadata: metadata
});
case 19:
return _context4.abrupt("return", metadata);
case 20:
_context4.next = 24;
break;
case 22:
_context4.prev = 22;
_context4.t0 = _context4["catch"](3);
case 24:
return _context4.abrupt("return", null);
case 25:
case "end":
return _context4.stop();
}
}, _callee4, null, [[3, 22]]);
}));
return _refreshVectorTileMetadata.apply(this, arguments);
}
function refreshRasterTileMetadata(_x5) {
return _refreshRasterTileMetadata.apply(this, arguments);
}
function _refreshRasterTileMetadata() {
_refreshRasterTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(datasetInfo) {
var _ref4, metadataUrl, pmtilesType, tileSource, rawMetadata, response, _rawMetadata, metadata;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
_ref4 = datasetInfo.opts.metadata || {}, metadataUrl = _ref4.metadataUrl, pmtilesType = _ref4.pmtilesType;
if (!(typeof metadataUrl !== 'string')) {
_context5.next = 3;
break;
}
return _context5.abrupt("return", null);
case 3:
_context5.prev = 3;
if (!(pmtilesType === _constants.PMTilesType.RASTER)) {
_context5.next = 13;
break;
}
tileSource = _pmtiles.PMTilesSource.createDataSource(metadataUrl, {});
_context5.next = 8;
return tileSource.metadata;
case 8:
rawMetadata = _context5.sent;
if (!rawMetadata) {
_context5.next = 11;
break;
}
return _context5.abrupt("return", (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata));
case 11:
_context5.next = 25;
break;
case 13:
_context5.next = 15;
return fetch(metadataUrl);
case 15:
response = _context5.sent;
if (response.ok) {
_context5.next = 18;
break;
}
throw new Error("Failed Fetch ".concat(metadataUrl));
case 18:
_context5.next = 20;
return response.json();
case 20:
_rawMetadata = _context5.sent;
metadata = (0, _rasterTileUtils.parseRasterMetadata)(_rawMetadata, {
allowCollections: true
});
if (!(metadata instanceof Error)) {
_context5.next = 24;
break;
}
throw new Error("Failed to parse metadata ".concat(metadata.message));
case 24:
return _context5.abrupt("return", metadata);
case 25:
_context5.next = 29;
break;
case 27:
_context5.prev = 27;
_context5.t0 = _context5["catch"](3);
case 29:
return _context5.abrupt("return", null);
case 30:
case "end":
return _context5.stop();
}
}, _callee5, null, [[3, 27]]);
}));
return _refreshRasterTileMetadata.apply(this, arguments);
}
function refreshWMSMetadata(_x6) {
return _refreshWMSMetadata.apply(this, arguments);
}
function _refreshWMSMetadata() {
_refreshWMSMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(datasetInfo) {
var _ref5, remoteTileFormat, tilesetDataUrl, data;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
_ref5 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref5.remoteTileFormat, tilesetDataUrl = _ref5.tilesetDataUrl;
if (!(remoteTileFormat !== _constants.RemoteTileFormat.WMS || typeof tilesetDataUrl !== 'string')) {
_context6.next = 3;
break;
}
return _context6.abrupt("return", null);
case 3:
_context6.prev = 3;
_context6.next = 6;
return getWMSCapabilities(tilesetDataUrl);
case 6:
data = _context6.sent;
return _context6.abrupt("return", wmsCapabilitiesToDatasetMetadata(data));
case 10:
_context6.prev = 10;
_context6.t0 = _context6["catch"](3);
case 12:
return _context6.abrupt("return", null);
case 13:
case "end":
return _context6.stop();
}
}, _callee6, null, [[3, 10]]);
}));
return _refreshWMSMetadata.apply(this, arguments);
}
function getWMSCapabilities(_x7) {
return _getWMSCapabilities.apply(this, arguments);
}
function _getWMSCapabilities() {
_getWMSCapabilities = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(wsmUrl) {
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return (0, _core.load)("".concat(wsmUrl, "?service=WMS&request=GetCapabilities"), _wms.WMSCapabilitiesLoader);
case 2:
return _context7.abrupt("return", _context7.sent);
case 3:
case "end":
return _context7.stop();
}
}, _callee7);
}));
return _getWMSCapabilities.apply(this, arguments);
}
function wmsCapabilitiesToDatasetMetadata(capabilities) {
// Flatten layers if they are nested
var layers = capabilities.layers.flatMap(function (layer) {
if (layer.layers && layer.layers.length > 0) {
return layer.layers;
}
return layer;
});
var availableLayers = [];
if (Array.isArray(layers)) {
availableLayers = layers.map(function (layer) {
var bb = layer.geographicBoundingBox;
var boundingBox = null;
if (Array.isArray(bb) && Array.isArray(bb[0]) && Array.isArray(bb[1])) {
boundingBox = [bb[0][0], bb[0][1], bb[1][0], bb[1][1]];
}
return {
name: layer.name,
title: layer.title || layer.name,
boundingBox: boundingBox,
queryable: layer.queryable
};
});
}
return {
layers: availableLayers,
version: capabilities.version || '1.3.0'
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2tlcGxlclRhYmxlIiwiX3Rhc2tzIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9jb3JlIiwiX3BtdGlsZXMiLCJfd21zIiwiX3RpbGVzZXRVdGlscyIsIl9yYXN0ZXJUaWxlVXRpbHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX2V4Y2x1ZGVkIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJnZXROZXdEYXRhc2V0Q29sb3IiLCJkYXRhc2V0cyIsInByZXNldENvbG9ycyIsIlN0cmluZyIsInVzZWRDb2xvcnMiLCJ1bmlxIiwidmFsdWVzIiwiZCIsImNvbG9yIiwiYyIsImluY2x1ZGVzIiwiZGF0YXNldENvbG9yTWFrZXIiLCJuZXh0IiwidmFsdWUiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJfcmVmIiwiX2dldEFwcGxpY2F0aW9uQ29uZmlnIiwiaW5mbyIsImRhdGEiLCJvcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsInVuZGVmaW5lZCIsIlRhYmxlQ2xhc3MiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInRhYmxlIiwiS2VwbGVyVGFibGUiLCJkYXRhVmFsaWRhdG9yIiwidmFsaWRhdGVJbnB1dERhdGEiLCJnZXRJbnB1dERhdGFWYWxpZGF0b3IiLCJ2YWxpZGF0ZWREYXRhIiwiaWQiLCJrZXBsZXJUYWJsZSIsIlVQREFURV9UQUJMRV9UQVNLIiwiQ1JFQVRFX1RBQkxFX1RBU0siLCJhcnJvd1RhYmxlIiwidXBkYXRlVGFibGUiLCJfeCIsIl91cGRhdGVUYWJsZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJ1cGRhdGVkIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwidXBkYXRlIiwic2VudCIsImFicnVwdCIsInN0b3AiLCJjcmVhdGVUYWJsZSIsIl94MiIsIl9jcmVhdGVUYWJsZSIsIl9jYWxsZWUyIiwiZGF0YXNldEluZm8iLCJfZ2V0QXBwbGljYXRpb25Db25maWcyIiwicmVmcmVzaGVkTWV0YWRhdGEiLCJtZXRhZGF0YSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInJlZnJlc2hSZW1vdGVEYXRhIiwiZmllbGRzIiwiaW1wb3J0RGF0YSIsInQwIiwiY29uc29sZSIsImVycm9yIiwiVGFzayIsImZyb21Qcm9taXNlIiwiX3gzIiwiX3JlZnJlc2hSZW1vdGVEYXRhIiwiX2NhbGxlZTMiLCJ0eXBlIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiRGF0YXNldFR5cGUiLCJWRUNUT1JfVElMRSIsIlJBU1RFUl9USUxFIiwiV01TX1RJTEUiLCJyZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhIiwicmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YSIsInJlZnJlc2hXTVNNZXRhZGF0YSIsIl94NCIsIl9yZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhIiwiX2NhbGxlZTQiLCJfcmVmMyIsInJlbW90ZVRpbGVGb3JtYXQiLCJ0aWxlc2V0TWV0YWRhdGFVcmwiLCJ0aWxlc2V0RGF0YVVybCIsInJhd01ldGFkYXRhIiwidGlsZVNvdXJjZSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIlJlbW90ZVRpbGVGb3JtYXQiLCJQTVRJTEVTIiwiTVZUIiwiZ2V0TVZUTWV0YWRhdGEiLCJQTVRpbGVzU291cmNlIiwiY3JlYXRlRGF0YVNvdXJjZSIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJnZXRGaWVsZHNGcm9tVGlsZSIsInRpbGVzZXRVcmwiLCJtZXRhZGF0YVVybCIsIl94NSIsIl9yZWZyZXNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NhbGxlZTUiLCJfcmVmNCIsInBtdGlsZXNUeXBlIiwicmVzcG9uc2UiLCJfcmF3TWV0YWRhdGEiLCJfY2FsbGVlNSQiLCJfY29udGV4dDUiLCJQTVRpbGVzVHlwZSIsIlJBU1RFUiIsImZldGNoIiwib2siLCJFcnJvciIsImNvbmNhdCIsImpzb24iLCJwYXJzZVJhc3Rlck1ldGFkYXRhIiwiYWxsb3dDb2xsZWN0aW9ucyIsIm1lc3NhZ2UiLCJfeDYiLCJfcmVmcmVzaFdNU01ldGFkYXRhIiwiX2NhbGxlZTYiLCJfcmVmNSIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsIldNUyIsImdldFdNU0NhcGFiaWxpdGllcyIsIndtc0NhcGFiaWxpdGllc1RvRGF0YXNldE1ldGFkYXRhIiwiX3g3IiwiX2dldFdNU0NhcGFiaWxpdGllcyIsIl9jYWxsZWU3Iiwid3NtVXJsIiwiX2NhbGxlZTckIiwiX2NvbnRleHQ3IiwibG9hZCIsIldNU0NhcGFiaWxpdGllc0xvYWRlciIsImNhcGFiaWxpdGllcyIsImxheWVycyIsImZsYXRNYXAiLCJsYXllciIsImF2YWlsYWJsZUxheWVycyIsIkFycmF5IiwiaXNBcnJheSIsImJiIiwiZ2VvZ3JhcGhpY0JvdW5kaW5nQm94IiwiYm91bmRpbmdCb3giLCJuYW1lIiwidGl0bGUiLCJxdWVyeWFibGUiLCJ2ZXJzaW9uIl0sInNvdXJjZXMiOlsiLi4vc3JjL2RhdGFzZXQtdXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoL3VuaXEnO1xuaW1wb3J0IEtlcGxlclRhYmxlLCB7RGF0YXNldHN9IGZyb20gJy4va2VwbGVyLXRhYmxlJztcbmltcG9ydCB7UHJvdG9EYXRhc2V0LCBSR0JDb2xvcn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQgVGFzayBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcblxuaW1wb3J0IHtcbiAgRGF0YXNldFR5cGUsXG4gIFJhc3RlclRpbGVEYXRhc2V0TWV0YWRhdGEsXG4gIFBNVGlsZXNUeXBlLFxuICBSZW1vdGVUaWxlRm9ybWF0LFxuICBWZWN0b3JUaWxlRGF0YXNldE1ldGFkYXRhLFxuICBXTVNEYXRhc2V0TWV0YWRhdGFcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgaGV4VG9SZ2IsXG4gIHZhbGlkYXRlSW5wdXREYXRhLFxuICBkYXRhc2V0Q29sb3JNYWtlcixcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7bG9hZH0gZnJvbSAnQGxvYWRlcnMuZ2wvY29yZSc7XG5pbXBvcnQgey8qIE1WVFNvdXJjZSwqLyBUaWxlSlNPTn0gZnJvbSAnQGxvYWRlcnMuZ2wvbXZ0JztcbmltcG9ydCB7UE1UaWxlc1NvdXJjZSwgUE1UaWxlc01ldGFkYXRhfSBmcm9tICdAbG9hZGVycy5nbC9wbXRpbGVzJztcbmltcG9ydCB7V01TQ2FwYWJpbGl0aWVzLCBXTVNDYXBhYmlsaXRpZXNMb2FkZXJ9IGZyb20gJ0Bsb2FkZXJzLmdsL3dtcyc7XG5cbmltcG9ydCB7Z2V0TVZUTWV0YWRhdGF9IGZyb20gJy4vdGlsZXNldC90aWxlc2V0LXV0aWxzJztcbmltcG9ydCB7cGFyc2VSYXN0ZXJNZXRhZGF0YX0gZnJvbSAnLi90aWxlc2V0L3Jhc3Rlci10aWxlLXV0aWxzJztcbmltcG9ydCB7XG4gIHBhcnNlVmVjdG9yTWV0YWRhdGEsXG4gIGdldEZpZWxkc0Zyb21UaWxlLFxuICBWZWN0b3JUaWxlTWV0YWRhdGFcbn0gZnJvbSAnLi90aWxlc2V0L3ZlY3Rvci10aWxlLXV0aWxzJztcblxuLy8gYXBwbHkgYSBjb2xvciBmb3IgZWFjaCBkYXRhc2V0XG4vLyB0byB1c2UgYXMgbGFiZWwgY29sb3JzXG5jb25zdCBkYXRhc2V0Q29sb3JzID0gW1xuICAnIzhGMkZCRicsXG4gICcjMDA1Q0ZGJyxcbiAgJyNDMDZDODQnLFxuICAnI0Y4QjE5NScsXG4gICcjNTQ3QTgyJyxcbiAgJyMzRUFDQTgnLFxuICAnI0EyRDRBQidcbl0ubWFwKGhleFRvUmdiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0RhdGFzZXRDb2xvcihkYXRhc2V0czogRGF0YXNldHMpOiBSR0JDb2xvciB7XG4gIGNvbnN0IHByZXNldENvbG9ycyA9IGRhdGFzZXRDb2xvcnMubWFwKFN0cmluZyk7XG4gIGNvbnN0IHVzZWRDb2xvcnMgPSB1bmlxKE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkID0+IFN0cmluZyhkLmNvbG9yKSkpLmZpbHRlcihjID0+XG4gICAgcHJlc2V0Q29sb3JzLmluY2x1ZGVzKGMpXG4gICk7XG5cbiAgaWYgKHVzZWRDb2xvcnMubGVuZ3RoID09PSBwcmVzZXRDb2xvcnMubGVuZ3RoKSB7XG4gICAgLy8gaWYgd2UgYWxyZWFkeSBkZXBsZXRlZCB0aGUgcG9vbCBvZiBjb2xvclxuICAgIHJldHVybiBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIH1cblxuICBsZXQgY29sb3IgPSBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIHdoaWxlICh1c2VkQ29sb3JzLmluY2x1ZGVzKFN0cmluZyhjb2xvcikpKSB7XG4gICAgY29sb3IgPSBkYXRhc2V0Q29sb3JNYWtlci5uZXh0KCkudmFsdWU7XG4gIH1cblxuICByZXR1cm4gY29sb3I7XG59XG5cbi8qKlxuICogVGFrZSBkYXRhc2V0cyBwYXlsb2FkIGZyb20gYWRkRGF0YVRvTWFwLCBjcmVhdGUgZGF0YXNldHMgZW50cnkgc2F2ZSB0byB2aXNTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV3RGF0YUVudHJ5KFxuICB7aW5mbywgZGF0YSwgLi4ub3B0c306IFByb3RvRGF0YXNldCxcbiAgZGF0YXNldHM6IERhdGFzZXRzID0ge31cbik6IERhdGFzZXRzIHwgbnVsbCB7XG4gIGNvbnN0IFRhYmxlQ2xhc3MgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnRhYmxlID8/IEtlcGxlclRhYmxlO1xuICBsZXQgZGF0YVZhbGlkYXRvciA9IHZhbGlkYXRlSW5wdXREYXRhO1xuICBpZiAodHlwZW9mIFRhYmxlQ2xhc3MuZ2V0SW5wdXREYXRhVmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZGF0YVZhbGlkYXRvciA9IFRhYmxlQ2xhc3MuZ2V0SW5wdXREYXRhVmFsaWRhdG9yKCk7XG4gIH1cblxuICBjb25zdCB2YWxpZGF0ZWREYXRhID0gZGF0YVZhbGlkYXRvcihkYXRhKTtcbiAgaWYgKCF2YWxpZGF0ZWREYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGFscmVhZHkgZXhpc3RzLCBhbmQgdXBkYXRlIGl0IHdoZW4gbG9hZGluZyBkYXRhIGJ5IGJhdGNoZXMgaW5jcmVtZW50YWxseVxuICBpZiAoaW5mbyAmJiBpbmZvLmlkICYmIGRhdGFzZXRzW2luZm8uaWRdKSB7XG4gICAgLy8gZ2V0IGtlcGxlclRhYmxlIGZyb20gZGF0YXNldHNcbiAgICBjb25zdCBrZXBsZXJUYWJsZSA9IGRhdGFzZXRzW2luZm8uaWRdO1xuICAgIC8vIHVwZGF0ZSB0aGUgZGF0YSBpbiBrZXBsZXJUYWJsZVxuICAgIHJldHVybiBVUERBVEVfVEFCTEVfVEFTSyh7dGFibGU6IGtlcGxlclRhYmxlLCBkYXRhOiB2YWxpZGF0ZWREYXRhfSk7XG4gIH1cblxuICBpbmZvID0gaW5mbyB8fCB7fTtcbiAgY29uc3QgY29sb3IgPSBpbmZvLmNvbG9yIHx8IGdldE5ld0RhdGFzZXRDb2xvcihkYXRhc2V0cyk7XG5cbiAgcmV0dXJuIENSRUFURV9UQUJMRV9UQVNLKHtcbiAgICBpbmZvLFxuICAgIGNvbG9yLFxuICAgIG9wdHMsXG4gICAgZGF0YTogZGF0YS5hcnJvd1RhYmxlID8gey4uLnZhbGlkYXRlZERhdGEsIGFycm93VGFibGU6IGRhdGEuYXJyb3dUYWJsZX0gOiB2YWxpZGF0ZWREYXRhXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVUYWJsZSh7dGFibGUsIGRhdGF9KSB7XG4gIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0YWJsZS51cGRhdGUoZGF0YSk7IC8vIEFzc3VtaW5nIGB0YWJsZWAgaGFzIGFuIGB1cGRhdGVgIG1ldGhvZFxuICByZXR1cm4gdXBkYXRlZDtcbn1cblxudHlwZSBDcmVhdGVUYWJsZVByb3BzID0ge1xuICBpbmZvOiBhbnk7XG4gIGNvbG9yOiBSR0JDb2xvcjtcbiAgb3B0czoge1xuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH07XG4gIGRhdGE6IGFueTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKSB7XG4gIGNvbnN0IHtpbmZvLCBjb2xvciwgb3B0cywgZGF0YX0gPSBkYXRhc2V0SW5mbztcblxuICAvLyB1cGRhdGUgbWV0YWRhdGEgZm9yIHJlbW90ZSB0aWxlZCBkYXRhc2V0c1xuICBjb25zdCByZWZyZXNoZWRNZXRhZGF0YSA9IGF3YWl0IHJlZnJlc2hSZW1vdGVEYXRhKGRhdGFzZXRJbmZvKTtcbiAgbGV0IG1ldGFkYXRhID0gb3B0cy5tZXRhZGF0YTtcbiAgaWYgKHJlZnJlc2hlZE1ldGFkYXRhKSB7XG4gICAgbWV0YWRhdGEgPSB7Li4ub3B0cy5tZXRhZGF0YSwgLi4ucmVmcmVzaGVkTWV0YWRhdGF9O1xuICAgIGlmIChtZXRhZGF0YS5maWVsZHMpIHtcbiAgICAgIGRhdGEuZmllbGRzID0gbWV0YWRhdGEuZmllbGRzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFRhYmxlQ2xhc3MgPSBnZXRBcHBsaWNhdGlvbkNvbmZpZygpLnRhYmxlID8/IEtlcGxlclRhYmxlO1xuICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZUNsYXNzKHtcbiAgICBpbmZvLFxuICAgIGNvbG9yLFxuICAgIC4uLm9wdHMsXG4gICAgbWV0YWRhdGFcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGFibGUuaW1wb3J0RGF0YSh7ZGF0YX0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgdGFibGUnLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5jb25zdCBVUERBVEVfVEFCTEVfVEFTSyA9IFRhc2suZnJvbVByb21pc2UodXBkYXRlVGFibGUsICdVUERBVEVfVEFCTEVfVEFTSycpO1xuY29uc3QgQ1JFQVRFX1RBQkxFX1RBU0sgPSBUYXNrLmZyb21Qcm9taXNlKGNyZWF0ZVRhYmxlLCAnQ1JFQVRFX1RBQkxFX1RBU0snKTtcblxuLyoqXG4gKiBGZXRjaCBtZXRhZGF0YSBmb3IgdmVjdG9yIHRpbGUgbGF5ZXJzIHVzaW5nIHRpbGVzZXRNZXRhZGF0YVVybCBmcm9tIG1ldGFkYXRhXG4gKiBAcGFyYW0gZGF0YXNldEluZm9cbiAqIEByZXR1cm5zXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hSZW1vdGVEYXRhKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKTogUHJvbWlzZTxvYmplY3QgfCBudWxsPiB7XG4gIGNvbnN0IHt0eXBlfSA9IGRhdGFzZXRJbmZvLmluZm87XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRGF0YXNldFR5cGUuVkVDVE9SX1RJTEU6XG4gICAgICByZXR1cm4gYXdhaXQgcmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbyk7XG4gICAgY2FzZSBEYXRhc2V0VHlwZS5SQVNURVJfVElMRTpcbiAgICAgIHJldHVybiBhd2FpdCByZWZyZXNoUmFzdGVyVGlsZU1ldGFkYXRhKGRhdGFzZXRJbmZvKTtcbiAgICBjYXNlIERhdGFzZXRUeXBlLldNU19USUxFOlxuICAgICAgcmV0dXJuIGF3YWl0IHJlZnJlc2hXTVNNZXRhZGF0YShkYXRhc2V0SW5mbyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hWZWN0b3JUaWxlTWV0YWRhdGEoXG4gIGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzXG4pOiBQcm9taXNlPFZlY3RvclRpbGVNZXRhZGF0YSB8IG51bGw+IHtcbiAgY29uc3Qge3JlbW90ZVRpbGVGb3JtYXQsIHRpbGVzZXRNZXRhZGF0YVVybCwgdGlsZXNldERhdGFVcmx9ID1cbiAgICAoZGF0YXNldEluZm8ub3B0cy5tZXRhZGF0YSBhcyBWZWN0b3JUaWxlRGF0YXNldE1ldGFkYXRhKSB8fCB7fTtcblxuICBpZiAoXG4gICAgIShyZW1vdGVUaWxlRm9ybWF0ID09PSBSZW1vdGVUaWxlRm9ybWF0LlBNVElMRVMgfHwgcmVtb3RlVGlsZUZvcm1hdCA9PT0gUmVtb3RlVGlsZUZvcm1hdC5NVlQpIHx8XG4gICAgdHlwZW9mIHRpbGVzZXRNZXRhZGF0YVVybCAhPT0gJ3N0cmluZycgfHxcbiAgICB0eXBlb2YgdGlsZXNldERhdGFVcmwgIT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBsZXQgcmF3TWV0YWRhdGE6IFBNVGlsZXNNZXRhZGF0YSB8IFRpbGVKU09OIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKHJlbW90ZVRpbGVGb3JtYXQgPT09IFJlbW90ZVRpbGVGb3JtYXQuTVZUKSB7XG4gICAgICByYXdNZXRhZGF0YSA9IGF3YWl0IGdldE1WVE1ldGFkYXRhKHRpbGVzZXRNZXRhZGF0YVVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBQTVRpbGVzU291cmNlLmNyZWF0ZURhdGFTb3VyY2UodGlsZXNldE1ldGFkYXRhVXJsLCB7fSk7XG4gICAgICByYXdNZXRhZGF0YSA9IGF3YWl0IHRpbGVTb3VyY2UubWV0YWRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHJhd01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlVmVjdG9yTWV0YWRhdGEocmF3TWV0YWRhdGEpO1xuXG4gICAgICBhd2FpdCBnZXRGaWVsZHNGcm9tVGlsZSh7XG4gICAgICAgIHJlbW90ZVRpbGVGb3JtYXQsXG4gICAgICAgIHRpbGVzZXRVcmw6IHRpbGVzZXREYXRhVXJsLFxuICAgICAgICBtZXRhZGF0YVVybDogdGlsZXNldE1ldGFkYXRhVXJsLFxuICAgICAgICBtZXRhZGF0YVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGlnbm9yZSBmb3Igbm93LCBhbmQgdXNlIG9sZCBtZXRhZGF0YVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoUmFzdGVyVGlsZU1ldGFkYXRhKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gIGNvbnN0IHttZXRhZGF0YVVybCwgcG10aWxlc1R5cGV9ID0gKGRhdGFzZXRJbmZvLm9wdHMubWV0YWRhdGEgYXMgUmFzdGVyVGlsZURhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKHR5cGVvZiBtZXRhZGF0YVVybCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHBtdGlsZXNUeXBlID09PSBQTVRpbGVzVHlwZS5SQVNURVIpIHtcbiAgICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBQTVRpbGVzU291cmNlLmNyZWF0ZURhdGFTb3VyY2UobWV0YWRhdGFVcmwsIHt9KTtcbiAgICAgIGNvbnN0IHJhd01ldGFkYXRhOiBQTVRpbGVzTWV0YWRhdGEgPSBhd2FpdCB0aWxlU291cmNlLm1ldGFkYXRhO1xuXG4gICAgICBpZiAocmF3TWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVmVjdG9yTWV0YWRhdGEocmF3TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpdCdzIHN0YWMgcmFzdGVyIHRpbGVzXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKG1ldGFkYXRhVXJsKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgRmV0Y2ggJHttZXRhZGF0YVVybH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd01ldGFkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlUmFzdGVyTWV0YWRhdGEocmF3TWV0YWRhdGEsIHthbGxvd0NvbGxlY3Rpb25zOiB0cnVlfSk7XG4gICAgICBpZiAobWV0YWRhdGEgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBtZXRhZGF0YSAke21ldGFkYXRhLm1lc3NhZ2V9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGlnbm9yZSBmb3Igbm93LCBhbmQgdXNlIG9sZCBtZXRhZGF0YVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoV01TTWV0YWRhdGEoZGF0YXNldEluZm86IENyZWF0ZVRhYmxlUHJvcHMpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgY29uc3Qge3JlbW90ZVRpbGVGb3JtYXQsIHRpbGVzZXREYXRhVXJsfSA9XG4gICAgKGRhdGFzZXRJbmZvLm9wdHMubWV0YWRhdGEgYXMgV01TRGF0YXNldE1ldGFkYXRhKSB8fCB7fTtcblxuICBpZiAocmVtb3RlVGlsZUZvcm1hdCAhPT0gUmVtb3RlVGlsZUZvcm1hdC5XTVMgfHwgdHlwZW9mIHRpbGVzZXREYXRhVXJsICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0V01TQ2FwYWJpbGl0aWVzKHRpbGVzZXREYXRhVXJsKTtcbiAgICByZXR1cm4gd21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGEoZGF0YSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGlnbm9yZSBmb3Igbm93LCBhbmQgdXNlIG9sZCBtZXRhZGF0YVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V01TQ2FwYWJpbGl0aWVzKHdzbVVybDogc3RyaW5nKTogUHJvbWlzZTxXTVNDYXBhYmlsaXRpZXM+IHtcbiAgcmV0dXJuIChhd2FpdCBsb2FkKFxuICAgIGAke3dzbVVybH0/c2VydmljZT1XTVMmcmVxdWVzdD1HZXRDYXBhYmlsaXRpZXNgLFxuICAgIFdNU0NhcGFiaWxpdGllc0xvYWRlclxuICApKSBhcyBXTVNDYXBhYmlsaXRpZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3bXNDYXBhYmlsaXRpZXNUb0RhdGFzZXRNZXRhZGF0YShjYXBhYmlsaXRpZXM6IFdNU0NhcGFiaWxpdGllcyk6IGFueSB8IG51bGwge1xuICAvLyBGbGF0dGVuIGxheWVycyBpZiB0aGV5IGFyZSBuZXN0ZWRcbiAgY29uc3QgbGF5ZXJzID0gY2FwYWJpbGl0aWVzLmxheWVycy5mbGF0TWFwKGxheWVyID0+IHtcbiAgICBpZiAobGF5ZXIubGF5ZXJzICYmIGxheWVyLmxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbGF5ZXIubGF5ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gbGF5ZXI7XG4gIH0pO1xuXG4gIGxldCBhdmFpbGFibGVMYXllcnM6IFdNU0RhdGFzZXRNZXRhZGF0YVsnbGF5ZXJzJ10gPSBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobGF5ZXJzKSkge1xuICAgIGF2YWlsYWJsZUxheWVycyA9IGxheWVycy5tYXAoKGxheWVyOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGJiID0gbGF5ZXIuZ2VvZ3JhcGhpY0JvdW5kaW5nQm94O1xuXG4gICAgICBsZXQgYm91bmRpbmdCb3g6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShiYikgJiYgQXJyYXkuaXNBcnJheShiYlswXSkgJiYgQXJyYXkuaXNBcnJheShiYlsxXSkpIHtcbiAgICAgICAgYm91bmRpbmdCb3ggPSBbYmJbMF1bMF0sIGJiWzBdWzFdLCBiYlsxXVswXSwgYmJbMV1bMV1dO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBsYXllci5uYW1lLFxuICAgICAgICB0aXRsZTogbGF5ZXIudGl0bGUgfHwgbGF5ZXIubmFtZSxcbiAgICAgICAgYm91bmRpbmdCb3gsXG4gICAgICAgIHF1ZXJ5YWJsZTogbGF5ZXIucXVlcnlhYmxlXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsYXllcnM6IGF2YWlsYWJsZUxheWVycyxcbiAgICB2ZXJzaW9uOiBjYXBhYmlsaXRpZXMudmVyc2lvbiB8fCAnMS4zLjAnXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUUsTUFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUcsVUFBQSxHQUFBSCxPQUFBO0FBUUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBT0EsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBRUEsSUFBQU0sUUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sSUFBQSxHQUFBUCxPQUFBO0FBRUEsSUFBQVEsYUFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsZ0JBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGdCQUFBLEdBQUFWLE9BQUE7QUFJcUMsSUFBQVcsU0FBQSxxQkFsQ3JDO0FBQ0E7QUFBQSxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsR0FBQWEsT0FBQSxXQUFBZCxDQUFBLElBQUFFLE1BQUEsQ0FBQWdCLGNBQUEsQ0FBQW5CLENBQUEsRUFBQUMsQ0FBQSxFQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFOLENBQUEsRUFBQUQsQ0FBQSxpQkFBQUQsQ0FBQTtBQW1DQTtBQUNBO0FBQ0EsSUFBTW9CLGFBQWEsR0FBRyxDQUNwQixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLENBQ1YsQ0FBQ0MsR0FBRyxDQUFDQyxlQUFRLENBQUM7QUFFUixTQUFTQyxrQkFBa0JBLENBQUNDLFFBQWtCLEVBQVk7RUFDL0QsSUFBTUMsWUFBWSxHQUFHTCxhQUFhLENBQUNDLEdBQUcsQ0FBQ0ssTUFBTSxDQUFDO0VBQzlDLElBQU1DLFVBQVUsR0FBRyxJQUFBQyxnQkFBSSxFQUFDekIsTUFBTSxDQUFDMEIsTUFBTSxDQUFDTCxRQUFRLENBQUMsQ0FBQ0gsR0FBRyxDQUFDLFVBQUFTLENBQUM7SUFBQSxPQUFJSixNQUFNLENBQUNJLENBQUMsQ0FBQ0MsS0FBSyxDQUFDO0VBQUEsRUFBQyxDQUFDLENBQUN4QixNQUFNLENBQUMsVUFBQXlCLENBQUM7SUFBQSxPQUNqRlAsWUFBWSxDQUFDUSxRQUFRLENBQUNELENBQUMsQ0FBQztFQUFBLENBQzFCLENBQUM7RUFFRCxJQUFJTCxVQUFVLENBQUNiLE1BQU0sS0FBS1csWUFBWSxDQUFDWCxNQUFNLEVBQUU7SUFDN0M7SUFDQSxPQUFPb0Isd0JBQWlCLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUNDLEtBQUs7RUFDdkM7RUFFQSxJQUFJTCxLQUFLLEdBQUdHLHdCQUFpQixDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDQyxLQUFLO0VBQzFDLE9BQU9ULFVBQVUsQ0FBQ00sUUFBUSxDQUFDUCxNQUFNLENBQUNLLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFDekNBLEtBQUssR0FBR0csd0JBQWlCLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUNDLEtBQUs7RUFDeEM7RUFFQSxPQUFPTCxLQUFLO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ08sU0FBU00sa0JBQWtCQSxDQUFBQyxJQUFBLEVBR2Y7RUFBQSxJQUFBQyxxQkFBQTtFQUFBLElBRmhCQyxJQUFJLEdBQUFGLElBQUEsQ0FBSkUsSUFBSTtJQUFFQyxJQUFJLEdBQUFILElBQUEsQ0FBSkcsSUFBSTtJQUFLQyxJQUFJLE9BQUFDLHlCQUFBLGFBQUFMLElBQUEsRUFBQXhDLFNBQUE7RUFBQSxJQUNwQjBCLFFBQWtCLEdBQUFYLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUErQixTQUFBLEdBQUEvQixTQUFBLE1BQUcsQ0FBQyxDQUFDO0VBRXZCLElBQU1nQyxVQUFVLElBQUFOLHFCQUFBLEdBQUcsSUFBQU8sMkJBQW9CLEVBQUMsQ0FBQyxDQUFDQyxLQUFLLGNBQUFSLHFCQUFBLGNBQUFBLHFCQUFBLEdBQUlTLHVCQUFXO0VBQzlELElBQUlDLGFBQWEsR0FBR0Msd0JBQWlCO0VBQ3JDLElBQUksT0FBT0wsVUFBVSxDQUFDTSxxQkFBcUIsS0FBSyxVQUFVLEVBQUU7SUFDMURGLGFBQWEsR0FBR0osVUFBVSxDQUFDTSxxQkFBcUIsQ0FBQyxDQUFDO0VBQ3BEO0VBRUEsSUFBTUMsYUFBYSxHQUFHSCxhQUFhLENBQUNSLElBQUksQ0FBQztFQUN6QyxJQUFJLENBQUNXLGFBQWEsRUFBRTtJQUNsQixPQUFPLElBQUk7RUFDYjs7RUFFQTtFQUNBLElBQUlaLElBQUksSUFBSUEsSUFBSSxDQUFDYSxFQUFFLElBQUk3QixRQUFRLENBQUNnQixJQUFJLENBQUNhLEVBQUUsQ0FBQyxFQUFFO0lBQ3hDO0lBQ0EsSUFBTUMsV0FBVyxHQUFHOUIsUUFBUSxDQUFDZ0IsSUFBSSxDQUFDYSxFQUFFLENBQUM7SUFDckM7SUFDQSxPQUFPRSxpQkFBaUIsQ0FBQztNQUFDUixLQUFLLEVBQUVPLFdBQVc7TUFBRWIsSUFBSSxFQUFFVztJQUFhLENBQUMsQ0FBQztFQUNyRTtFQUVBWixJQUFJLEdBQUdBLElBQUksSUFBSSxDQUFDLENBQUM7RUFDakIsSUFBTVQsS0FBSyxHQUFHUyxJQUFJLENBQUNULEtBQUssSUFBSVIsa0JBQWtCLENBQUNDLFFBQVEsQ0FBQztFQUV4RCxPQUFPZ0MsaUJBQWlCLENBQUM7SUFDdkJoQixJQUFJLEVBQUpBLElBQUk7SUFDSlQsS0FBSyxFQUFMQSxLQUFLO0lBQ0xXLElBQUksRUFBSkEsSUFBSTtJQUNKRCxJQUFJLEVBQUVBLElBQUksQ0FBQ2dCLFVBQVUsR0FBQTdDLGFBQUEsQ0FBQUEsYUFBQSxLQUFPd0MsYUFBYTtNQUFFSyxVQUFVLEVBQUVoQixJQUFJLENBQUNnQjtJQUFVLEtBQUlMO0VBQzVFLENBQUMsQ0FBQztBQUNKO0FBQUMsU0FFY00sV0FBV0EsQ0FBQUMsRUFBQTtFQUFBLE9BQUFDLFlBQUEsQ0FBQWpELEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FBQStDLGFBQUE7RUFBQUEsWUFBQSxPQUFBQyxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQTFCLFNBQUFDLFFBQUFDLEtBQUE7SUFBQSxJQUFBbEIsS0FBQSxFQUFBTixJQUFBLEVBQUF5QixPQUFBO0lBQUEsT0FBQUosWUFBQSxZQUFBSyxJQUFBLFVBQUFDLFNBQUFDLFFBQUE7TUFBQSxrQkFBQUEsUUFBQSxDQUFBQyxJQUFBLEdBQUFELFFBQUEsQ0FBQWxDLElBQUE7UUFBQTtVQUE0QlksS0FBSyxHQUFBa0IsS0FBQSxDQUFMbEIsS0FBSyxFQUFFTixJQUFJLEdBQUF3QixLQUFBLENBQUp4QixJQUFJO1VBQUE0QixRQUFBLENBQUFsQyxJQUFBO1VBQUEsT0FDZlksS0FBSyxDQUFDd0IsTUFBTSxDQUFDOUIsSUFBSSxDQUFDO1FBQUE7VUFBbEN5QixPQUFPLEdBQUFHLFFBQUEsQ0FBQUcsSUFBQTtVQUFBLE9BQUFILFFBQUEsQ0FBQUksTUFBQSxXQUNOUCxPQUFPO1FBQUE7UUFBQTtVQUFBLE9BQUFHLFFBQUEsQ0FBQUssSUFBQTtNQUFBO0lBQUEsR0FBQVYsT0FBQTtFQUFBLENBQ2Y7RUFBQSxPQUFBSixZQUFBLENBQUFqRCxLQUFBLE9BQUFFLFNBQUE7QUFBQTtBQUFBLFNBV2M4RCxXQUFXQSxDQUFBQyxHQUFBO0VBQUEsT0FBQUMsWUFBQSxDQUFBbEUsS0FBQSxPQUFBRSxTQUFBO0FBQUE7QUFBQSxTQUFBZ0UsYUFBQTtFQUFBQSxZQUFBLE9BQUFoQixrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQTFCLFNBQUFlLFNBQTJCQyxXQUE2QjtJQUFBLElBQUFDLHNCQUFBO0lBQUEsSUFBQXhDLElBQUEsRUFBQVQsS0FBQSxFQUFBVyxJQUFBLEVBQUFELElBQUEsRUFBQXdDLGlCQUFBLEVBQUFDLFFBQUEsRUFBQXJDLFVBQUEsRUFBQUUsS0FBQTtJQUFBLE9BQUFlLFlBQUEsWUFBQUssSUFBQSxVQUFBZ0IsVUFBQUMsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUFkLElBQUEsR0FBQWMsU0FBQSxDQUFBakQsSUFBQTtRQUFBO1VBQy9DSyxJQUFJLEdBQXVCdUMsV0FBVyxDQUF0Q3ZDLElBQUksRUFBRVQsS0FBSyxHQUFnQmdELFdBQVcsQ0FBaENoRCxLQUFLLEVBQUVXLElBQUksR0FBVXFDLFdBQVcsQ0FBekJyQyxJQUFJLEVBQUVELElBQUksR0FBSXNDLFdBQVcsQ0FBbkJ0QyxJQUFJLEVBRTlCO1VBQUEyQyxTQUFBLENBQUFqRCxJQUFBO1VBQUEsT0FDZ0NrRCxpQkFBaUIsQ0FBQ04sV0FBVyxDQUFDO1FBQUE7VUFBeERFLGlCQUFpQixHQUFBRyxTQUFBLENBQUFaLElBQUE7VUFDbkJVLFFBQVEsR0FBR3hDLElBQUksQ0FBQ3dDLFFBQVE7VUFDNUIsSUFBSUQsaUJBQWlCLEVBQUU7WUFDckJDLFFBQVEsR0FBQXRFLGFBQUEsQ0FBQUEsYUFBQSxLQUFPOEIsSUFBSSxDQUFDd0MsUUFBUSxHQUFLRCxpQkFBaUIsQ0FBQztZQUNuRCxJQUFJQyxRQUFRLENBQUNJLE1BQU0sRUFBRTtjQUNuQjdDLElBQUksQ0FBQzZDLE1BQU0sR0FBR0osUUFBUSxDQUFDSSxNQUFNO1lBQy9CO1VBQ0Y7VUFFTXpDLFVBQVUsSUFBQW1DLHNCQUFBLEdBQUcsSUFBQWxDLDJCQUFvQixFQUFDLENBQUMsQ0FBQ0MsS0FBSyxjQUFBaUMsc0JBQUEsY0FBQUEsc0JBQUEsR0FBSWhDLHVCQUFXO1VBQ3hERCxLQUFLLEdBQUcsSUFBSUYsVUFBVSxDQUFBakMsYUFBQSxDQUFBQSxhQUFBO1lBQzFCNEIsSUFBSSxFQUFKQSxJQUFJO1lBQ0pULEtBQUssRUFBTEE7VUFBSyxHQUNGVyxJQUFJO1lBQ1B3QyxRQUFRLEVBQVJBO1VBQVEsRUFDVCxDQUFDO1VBQUFFLFNBQUEsQ0FBQWQsSUFBQTtVQUFBYyxTQUFBLENBQUFqRCxJQUFBO1VBQUEsT0FFTVksS0FBSyxDQUFDd0MsVUFBVSxDQUFDO1lBQUM5QyxJQUFJLEVBQUpBO1VBQUksQ0FBQyxDQUFDO1FBQUE7VUFBQTJDLFNBQUEsQ0FBQWpELElBQUE7VUFBQTtRQUFBO1VBQUFpRCxTQUFBLENBQUFkLElBQUE7VUFBQWMsU0FBQSxDQUFBSSxFQUFBLEdBQUFKLFNBQUE7VUFFOUJLLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLHdCQUF3QixFQUFBTixTQUFBLENBQUFJLEVBQU8sQ0FBQztVQUFDLE1BQUFKLFNBQUEsQ0FBQUksRUFBQTtRQUFBO1VBQUEsT0FBQUosU0FBQSxDQUFBWCxNQUFBLFdBSTFDMUIsS0FBSztRQUFBO1FBQUE7VUFBQSxPQUFBcUMsU0FBQSxDQUFBVixJQUFBO01BQUE7SUFBQSxHQUFBSSxRQUFBO0VBQUEsQ0FDYjtFQUFBLE9BQUFELFlBQUEsQ0FBQWxFLEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQ0QsSUFBTTBDLGlCQUFpQixHQUFHb0MsaUJBQUksQ0FBQ0MsV0FBVyxDQUFDbEMsV0FBVyxFQUFFLG1CQUFtQixDQUFDO0FBQzVFLElBQU1GLGlCQUFpQixHQUFHbUMsaUJBQUksQ0FBQ0MsV0FBVyxDQUFDakIsV0FBVyxFQUFFLG1CQUFtQixDQUFDOztBQUU1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkEsU0FLZVUsaUJBQWlCQSxDQUFBUSxHQUFBO0VBQUEsT0FBQUMsa0JBQUEsQ0FBQW5GLEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FBQWlGLG1CQUFBO0VBQUFBLGtCQUFBLE9BQUFqQyxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQWhDLFNBQUFnQyxTQUFpQ2hCLFdBQTZCO0lBQUEsSUFBQWlCLElBQUE7SUFBQSxPQUFBbEMsWUFBQSxZQUFBSyxJQUFBLFVBQUE4QixVQUFBQyxTQUFBO01BQUEsa0JBQUFBLFNBQUEsQ0FBQTVCLElBQUEsR0FBQTRCLFNBQUEsQ0FBQS9ELElBQUE7UUFBQTtVQUNyRDZELElBQUksR0FBSWpCLFdBQVcsQ0FBQ3ZDLElBQUksQ0FBeEJ3RCxJQUFJO1VBQUFFLFNBQUEsQ0FBQVYsRUFBQSxHQUNIUSxJQUFJO1VBQUFFLFNBQUEsQ0FBQS9ELElBQUEsR0FBQStELFNBQUEsQ0FBQVYsRUFBQSxLQUNMVyxzQkFBVyxDQUFDQyxXQUFXLE9BQUFGLFNBQUEsQ0FBQVYsRUFBQSxLQUV2Qlcsc0JBQVcsQ0FBQ0UsV0FBVyxPQUFBSCxTQUFBLENBQUFWLEVBQUEsS0FFdkJXLHNCQUFXLENBQUNHLFFBQVE7VUFBQTtRQUFBO1VBQUFKLFNBQUEsQ0FBQS9ELElBQUE7VUFBQSxPQUhWb0UseUJBQXlCLENBQUN4QixXQUFXLENBQUM7UUFBQTtVQUFBLE9BQUFtQixTQUFBLENBQUF6QixNQUFBLFdBQUF5QixTQUFBLENBQUExQixJQUFBO1FBQUE7VUFBQTBCLFNBQUEsQ0FBQS9ELElBQUE7VUFBQSxPQUV0Q3FFLHlCQUF5QixDQUFDekIsV0FBVyxDQUFDO1FBQUE7VUFBQSxPQUFBbUIsU0FBQSxDQUFBekIsTUFBQSxXQUFBeUIsU0FBQSxDQUFBMUIsSUFBQTtRQUFBO1VBQUEwQixTQUFBLENBQUEvRCxJQUFBO1VBQUEsT0FFdENzRSxrQkFBa0IsQ0FBQzFCLFdBQVcsQ0FBQztRQUFBO1VBQUEsT0FBQW1CLFNBQUEsQ0FBQXpCLE1BQUEsV0FBQXlCLFNBQUEsQ0FBQTFCLElBQUE7UUFBQTtVQUFBLE9BQUEwQixTQUFBLENBQUF6QixNQUFBLFdBRXJDLElBQUk7UUFBQTtRQUFBO1VBQUEsT0FBQXlCLFNBQUEsQ0FBQXhCLElBQUE7TUFBQTtJQUFBLEdBQUFxQixRQUFBO0VBQUEsQ0FFaEI7RUFBQSxPQUFBRCxrQkFBQSxDQUFBbkYsS0FBQSxPQUFBRSxTQUFBO0FBQUE7QUFBQSxTQUVjMEYseUJBQXlCQSxDQUFBRyxHQUFBO0VBQUEsT0FBQUMsMEJBQUEsQ0FBQWhHLEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FBQThGLDJCQUFBO0VBQUFBLDBCQUFBLE9BQUE5QyxrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQXhDLFNBQUE2QyxTQUNFN0IsV0FBNkI7SUFBQSxJQUFBOEIsS0FBQSxFQUFBQyxnQkFBQSxFQUFBQyxrQkFBQSxFQUFBQyxjQUFBLEVBQUFDLFdBQUEsRUFBQUMsVUFBQSxFQUFBaEMsUUFBQTtJQUFBLE9BQUFwQixZQUFBLFlBQUFLLElBQUEsVUFBQWdELFVBQUFDLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBOUMsSUFBQSxHQUFBOEMsU0FBQSxDQUFBakYsSUFBQTtRQUFBO1VBQUEwRSxLQUFBLEdBRzFCOUIsV0FBVyxDQUFDckMsSUFBSSxDQUFDd0MsUUFBUSxJQUFrQyxDQUFDLENBQUMsRUFEekQ0QixnQkFBZ0IsR0FBQUQsS0FBQSxDQUFoQkMsZ0JBQWdCLEVBQUVDLGtCQUFrQixHQUFBRixLQUFBLENBQWxCRSxrQkFBa0IsRUFBRUMsY0FBYyxHQUFBSCxLQUFBLENBQWRHLGNBQWM7VUFBQSxNQUl6RCxFQUFFRixnQkFBZ0IsS0FBS08sMkJBQWdCLENBQUNDLE9BQU8sSUFBSVIsZ0JBQWdCLEtBQUtPLDJCQUFnQixDQUFDRSxHQUFHLENBQUMsSUFDN0YsT0FBT1Isa0JBQWtCLEtBQUssUUFBUSxJQUN0QyxPQUFPQyxjQUFjLEtBQUssUUFBUTtZQUFBSSxTQUFBLENBQUFqRixJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFpRixTQUFBLENBQUEzQyxNQUFBLFdBRTNCLElBQUk7UUFBQTtVQUFBMkMsU0FBQSxDQUFBOUMsSUFBQTtVQUlQMkMsV0FBOEMsR0FBRyxJQUFJO1VBQUEsTUFDckRILGdCQUFnQixLQUFLTywyQkFBZ0IsQ0FBQ0UsR0FBRztZQUFBSCxTQUFBLENBQUFqRixJQUFBO1lBQUE7VUFBQTtVQUFBaUYsU0FBQSxDQUFBakYsSUFBQTtVQUFBLE9BQ3ZCLElBQUFxRiw0QkFBYyxFQUFDVCxrQkFBa0IsQ0FBQztRQUFBO1VBQXRERSxXQUFXLEdBQUFHLFNBQUEsQ0FBQTVDLElBQUE7VUFBQTRDLFNBQUEsQ0FBQWpGLElBQUE7VUFBQTtRQUFBO1VBRUwrRSxVQUFVLEdBQUdPLHNCQUFhLENBQUNDLGdCQUFnQixDQUFDWCxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztVQUFBSyxTQUFBLENBQUFqRixJQUFBO1VBQUEsT0FDckQrRSxVQUFVLENBQUNoQyxRQUFRO1FBQUE7VUFBdkMrQixXQUFXLEdBQUFHLFNBQUEsQ0FBQTVDLElBQUE7UUFBQTtVQUFBLEtBR1R5QyxXQUFXO1lBQUFHLFNBQUEsQ0FBQWpGLElBQUE7WUFBQTtVQUFBO1VBQ1ArQyxRQUFRLEdBQUcsSUFBQXlDLG9DQUFtQixFQUFDVixXQUFXLENBQUM7VUFBQUcsU0FBQSxDQUFBakYsSUFBQTtVQUFBLE9BRTNDLElBQUF5RixrQ0FBaUIsRUFBQztZQUN0QmQsZ0JBQWdCLEVBQWhCQSxnQkFBZ0I7WUFDaEJlLFVBQVUsRUFBRWIsY0FBYztZQUMxQmMsV0FBVyxFQUFFZixrQkFBa0I7WUFDL0I3QixRQUFRLEVBQVJBO1VBQ0YsQ0FBQyxDQUFDO1FBQUE7VUFBQSxPQUFBa0MsU0FBQSxDQUFBM0MsTUFBQSxXQUVLUyxRQUFRO1FBQUE7VUFBQWtDLFNBQUEsQ0FBQWpGLElBQUE7VUFBQTtRQUFBO1VBQUFpRixTQUFBLENBQUE5QyxJQUFBO1VBQUE4QyxTQUFBLENBQUE1QixFQUFBLEdBQUE0QixTQUFBO1FBQUE7VUFBQSxPQUFBQSxTQUFBLENBQUEzQyxNQUFBLFdBS1osSUFBSTtRQUFBO1FBQUE7VUFBQSxPQUFBMkMsU0FBQSxDQUFBMUMsSUFBQTtNQUFBO0lBQUEsR0FBQWtDLFFBQUE7RUFBQSxDQUNaO0VBQUEsT0FBQUQsMEJBQUEsQ0FBQWhHLEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FFYzJGLHlCQUF5QkEsQ0FBQXVCLEdBQUE7RUFBQSxPQUFBQywwQkFBQSxDQUFBckgsS0FBQSxPQUFBRSxTQUFBO0FBQUE7QUFBQSxTQUFBbUgsMkJBQUE7RUFBQUEsMEJBQUEsT0FBQW5FLGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBeEMsU0FBQWtFLFNBQXlDbEQsV0FBNkI7SUFBQSxJQUFBbUQsS0FBQSxFQUFBSixXQUFBLEVBQUFLLFdBQUEsRUFBQWpCLFVBQUEsRUFBQUQsV0FBQSxFQUFBbUIsUUFBQSxFQUFBQyxZQUFBLEVBQUFuRCxRQUFBO0lBQUEsT0FBQXBCLFlBQUEsWUFBQUssSUFBQSxVQUFBbUUsVUFBQUMsU0FBQTtNQUFBLGtCQUFBQSxTQUFBLENBQUFqRSxJQUFBLEdBQUFpRSxTQUFBLENBQUFwRyxJQUFBO1FBQUE7VUFBQStGLEtBQUEsR0FDaENuRCxXQUFXLENBQUNyQyxJQUFJLENBQUN3QyxRQUFRLElBQWtDLENBQUMsQ0FBQyxFQUExRjRDLFdBQVcsR0FBQUksS0FBQSxDQUFYSixXQUFXLEVBQUVLLFdBQVcsR0FBQUQsS0FBQSxDQUFYQyxXQUFXO1VBQUEsTUFFM0IsT0FBT0wsV0FBVyxLQUFLLFFBQVE7WUFBQVMsU0FBQSxDQUFBcEcsSUFBQTtZQUFBO1VBQUE7VUFBQSxPQUFBb0csU0FBQSxDQUFBOUQsTUFBQSxXQUMxQixJQUFJO1FBQUE7VUFBQThELFNBQUEsQ0FBQWpFLElBQUE7VUFBQSxNQUlQNkQsV0FBVyxLQUFLSyxzQkFBVyxDQUFDQyxNQUFNO1lBQUFGLFNBQUEsQ0FBQXBHLElBQUE7WUFBQTtVQUFBO1VBQzlCK0UsVUFBVSxHQUFHTyxzQkFBYSxDQUFDQyxnQkFBZ0IsQ0FBQ0ksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO1VBQUFTLFNBQUEsQ0FBQXBHLElBQUE7VUFBQSxPQUN2QitFLFVBQVUsQ0FBQ2hDLFFBQVE7UUFBQTtVQUF4RCtCLFdBQTRCLEdBQUFzQixTQUFBLENBQUEvRCxJQUFBO1VBQUEsS0FFOUJ5QyxXQUFXO1lBQUFzQixTQUFBLENBQUFwRyxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFvRyxTQUFBLENBQUE5RCxNQUFBLFdBQ04sSUFBQWtELG9DQUFtQixFQUFDVixXQUFXLENBQUM7UUFBQTtVQUFBc0IsU0FBQSxDQUFBcEcsSUFBQTtVQUFBO1FBQUE7VUFBQW9HLFNBQUEsQ0FBQXBHLElBQUE7VUFBQSxPQUlsQnVHLEtBQUssQ0FBQ1osV0FBVyxDQUFDO1FBQUE7VUFBbkNNLFFBQVEsR0FBQUcsU0FBQSxDQUFBL0QsSUFBQTtVQUFBLElBQ1Q0RCxRQUFRLENBQUNPLEVBQUU7WUFBQUosU0FBQSxDQUFBcEcsSUFBQTtZQUFBO1VBQUE7VUFBQSxNQUNSLElBQUl5RyxLQUFLLGlCQUFBQyxNQUFBLENBQWlCZixXQUFXLENBQUUsQ0FBQztRQUFBO1VBQUFTLFNBQUEsQ0FBQXBHLElBQUE7VUFBQSxPQUV0QmlHLFFBQVEsQ0FBQ1UsSUFBSSxDQUFDLENBQUM7UUFBQTtVQUFuQzdCLFlBQVcsR0FBQXNCLFNBQUEsQ0FBQS9ELElBQUE7VUFFWFUsUUFBUSxHQUFHLElBQUE2RCxvQ0FBbUIsRUFBQzlCLFlBQVcsRUFBRTtZQUFDK0IsZ0JBQWdCLEVBQUU7VUFBSSxDQUFDLENBQUM7VUFBQSxNQUN2RTlELFFBQVEsWUFBWTBELEtBQUs7WUFBQUwsU0FBQSxDQUFBcEcsSUFBQTtZQUFBO1VBQUE7VUFBQSxNQUNyQixJQUFJeUcsS0FBSyw2QkFBQUMsTUFBQSxDQUE2QjNELFFBQVEsQ0FBQytELE9BQU8sQ0FBRSxDQUFDO1FBQUE7VUFBQSxPQUFBVixTQUFBLENBQUE5RCxNQUFBLFdBRzFEUyxRQUFRO1FBQUE7VUFBQXFELFNBQUEsQ0FBQXBHLElBQUE7VUFBQTtRQUFBO1VBQUFvRyxTQUFBLENBQUFqRSxJQUFBO1VBQUFpRSxTQUFBLENBQUEvQyxFQUFBLEdBQUErQyxTQUFBO1FBQUE7VUFBQSxPQUFBQSxTQUFBLENBQUE5RCxNQUFBLFdBS1osSUFBSTtRQUFBO1FBQUE7VUFBQSxPQUFBOEQsU0FBQSxDQUFBN0QsSUFBQTtNQUFBO0lBQUEsR0FBQXVELFFBQUE7RUFBQSxDQUNaO0VBQUEsT0FBQUQsMEJBQUEsQ0FBQXJILEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FFYzRGLGtCQUFrQkEsQ0FBQXlDLEdBQUE7RUFBQSxPQUFBQyxtQkFBQSxDQUFBeEksS0FBQSxPQUFBRSxTQUFBO0FBQUE7QUFBQSxTQUFBc0ksb0JBQUE7RUFBQUEsbUJBQUEsT0FBQXRGLGtCQUFBLDJCQUFBQyxZQUFBLFlBQUFDLElBQUEsQ0FBakMsU0FBQXFGLFNBQWtDckUsV0FBNkI7SUFBQSxJQUFBc0UsS0FBQSxFQUFBdkMsZ0JBQUEsRUFBQUUsY0FBQSxFQUFBdkUsSUFBQTtJQUFBLE9BQUFxQixZQUFBLFlBQUFLLElBQUEsVUFBQW1GLFVBQUFDLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBakYsSUFBQSxHQUFBaUYsU0FBQSxDQUFBcEgsSUFBQTtRQUFBO1VBQUFrSCxLQUFBLEdBRTFEdEUsV0FBVyxDQUFDckMsSUFBSSxDQUFDd0MsUUFBUSxJQUEyQixDQUFDLENBQUMsRUFEbEQ0QixnQkFBZ0IsR0FBQXVDLEtBQUEsQ0FBaEJ2QyxnQkFBZ0IsRUFBRUUsY0FBYyxHQUFBcUMsS0FBQSxDQUFkckMsY0FBYztVQUFBLE1BR25DRixnQkFBZ0IsS0FBS08sMkJBQWdCLENBQUNtQyxHQUFHLElBQUksT0FBT3hDLGNBQWMsS0FBSyxRQUFRO1lBQUF1QyxTQUFBLENBQUFwSCxJQUFBO1lBQUE7VUFBQTtVQUFBLE9BQUFvSCxTQUFBLENBQUE5RSxNQUFBLFdBQzFFLElBQUk7UUFBQTtVQUFBOEUsU0FBQSxDQUFBakYsSUFBQTtVQUFBaUYsU0FBQSxDQUFBcEgsSUFBQTtVQUFBLE9BSVFzSCxrQkFBa0IsQ0FBQ3pDLGNBQWMsQ0FBQztRQUFBO1VBQS9DdkUsSUFBSSxHQUFBOEcsU0FBQSxDQUFBL0UsSUFBQTtVQUFBLE9BQUErRSxTQUFBLENBQUE5RSxNQUFBLFdBQ0hpRixnQ0FBZ0MsQ0FBQ2pILElBQUksQ0FBQztRQUFBO1VBQUE4RyxTQUFBLENBQUFqRixJQUFBO1VBQUFpRixTQUFBLENBQUEvRCxFQUFBLEdBQUErRCxTQUFBO1FBQUE7VUFBQSxPQUFBQSxTQUFBLENBQUE5RSxNQUFBLFdBSXhDLElBQUk7UUFBQTtRQUFBO1VBQUEsT0FBQThFLFNBQUEsQ0FBQTdFLElBQUE7TUFBQTtJQUFBLEdBQUEwRSxRQUFBO0VBQUEsQ0FDWjtFQUFBLE9BQUFELG1CQUFBLENBQUF4SSxLQUFBLE9BQUFFLFNBQUE7QUFBQTtBQUFBLFNBRXFCNEksa0JBQWtCQSxDQUFBRSxHQUFBO0VBQUEsT0FBQUMsbUJBQUEsQ0FBQWpKLEtBQUEsT0FBQUUsU0FBQTtBQUFBO0FBQUEsU0FBQStJLG9CQUFBO0VBQUFBLG1CQUFBLE9BQUEvRixrQkFBQSwyQkFBQUMsWUFBQSxZQUFBQyxJQUFBLENBQWpDLFNBQUE4RixTQUFrQ0MsTUFBYztJQUFBLE9BQUFoRyxZQUFBLFlBQUFLLElBQUEsVUFBQTRGLFVBQUFDLFNBQUE7TUFBQSxrQkFBQUEsU0FBQSxDQUFBMUYsSUFBQSxHQUFBMEYsU0FBQSxDQUFBN0gsSUFBQTtRQUFBO1VBQUE2SCxTQUFBLENBQUE3SCxJQUFBO1VBQUEsT0FDdkMsSUFBQThILFVBQUksS0FBQXBCLE1BQUEsQ0FDYmlCLE1BQU0sMkNBQ1RJLDBCQUNGLENBQUM7UUFBQTtVQUFBLE9BQUFGLFNBQUEsQ0FBQXZGLE1BQUEsV0FBQXVGLFNBQUEsQ0FBQXhGLElBQUE7UUFBQTtRQUFBO1VBQUEsT0FBQXdGLFNBQUEsQ0FBQXRGLElBQUE7TUFBQTtJQUFBLEdBQUFtRixRQUFBO0VBQUEsQ0FDRjtFQUFBLE9BQUFELG1CQUFBLENBQUFqSixLQUFBLE9BQUFFLFNBQUE7QUFBQTtBQUVNLFNBQVM2SSxnQ0FBZ0NBLENBQUNTLFlBQTZCLEVBQWM7RUFDMUY7RUFDQSxJQUFNQyxNQUFNLEdBQUdELFlBQVksQ0FBQ0MsTUFBTSxDQUFDQyxPQUFPLENBQUMsVUFBQUMsS0FBSyxFQUFJO0lBQ2xELElBQUlBLEtBQUssQ0FBQ0YsTUFBTSxJQUFJRSxLQUFLLENBQUNGLE1BQU0sQ0FBQ3RKLE1BQU0sR0FBRyxDQUFDLEVBQUU7TUFDM0MsT0FBT3dKLEtBQUssQ0FBQ0YsTUFBTTtJQUNyQjtJQUNBLE9BQU9FLEtBQUs7RUFDZCxDQUFDLENBQUM7RUFFRixJQUFJQyxlQUE2QyxHQUFHLEVBQUU7RUFDdEQsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNMLE1BQU0sQ0FBQyxFQUFFO0lBQ3pCRyxlQUFlLEdBQUdILE1BQU0sQ0FBQy9JLEdBQUcsQ0FBQyxVQUFDaUosS0FBVSxFQUFLO01BQzNDLElBQU1JLEVBQUUsR0FBR0osS0FBSyxDQUFDSyxxQkFBcUI7TUFFdEMsSUFBSUMsV0FBNEIsR0FBRyxJQUFJO01BQ3ZDLElBQUlKLEtBQUssQ0FBQ0MsT0FBTyxDQUFDQyxFQUFFLENBQUMsSUFBSUYsS0FBSyxDQUFDQyxPQUFPLENBQUNDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJRixLQUFLLENBQUNDLE9BQU8sQ0FBQ0MsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckVFLFdBQVcsR0FBRyxDQUFDRixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUVBLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFQSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDeEQ7TUFFQSxPQUFPO1FBQ0xHLElBQUksRUFBRVAsS0FBSyxDQUFDTyxJQUFJO1FBQ2hCQyxLQUFLLEVBQUVSLEtBQUssQ0FBQ1EsS0FBSyxJQUFJUixLQUFLLENBQUNPLElBQUk7UUFDaENELFdBQVcsRUFBWEEsV0FBVztRQUNYRyxTQUFTLEVBQUVULEtBQUssQ0FBQ1M7TUFDbkIsQ0FBQztJQUNILENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBTztJQUNMWCxNQUFNLEVBQUVHLGVBQWU7SUFDdkJTLE9BQU8sRUFBRWIsWUFBWSxDQUFDYSxPQUFPLElBQUk7RUFDbkMsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119