@kepler.gl/reducers 3.1.0-alpha.1 → 3.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/combined-updaters.d.ts +79 -0
- package/dist/combined-updaters.js +358 -0
- package/dist/composer-helpers.d.ts +24 -0
- package/dist/composer-helpers.js +101 -0
- package/dist/composers.d.ts +18 -0
- package/dist/composers.js +23 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +105 -0
- package/dist/data-utils.d.ts +12 -0
- package/dist/data-utils.js +57 -0
- package/dist/export-utils.d.ts +21 -0
- package/dist/export-utils.js +91 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +342 -0
- package/dist/interaction-utils.d.ts +29 -0
- package/dist/interaction-utils.js +105 -0
- package/dist/layer-utils.d.ts +96 -0
- package/dist/layer-utils.js +310 -0
- package/dist/map-state-updaters.d.ts +93 -0
- package/dist/map-state-updaters.js +432 -0
- package/dist/map-state.d.ts +75 -0
- package/dist/map-state.js +35 -0
- package/dist/map-style-updaters.d.ts +179 -0
- package/dist/map-style-updaters.js +656 -0
- package/dist/map-style.d.ts +4 -0
- package/dist/map-style.js +34 -0
- package/dist/merger-handler.d.ts +10 -0
- package/dist/merger-handler.js +105 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +27 -0
- package/dist/provider-state-updaters.d.ts +35 -0
- package/dist/provider-state-updaters.js +348 -0
- package/dist/provider-state.d.ts +4 -0
- package/dist/provider-state.js +35 -0
- package/dist/root.d.ts +24 -0
- package/dist/root.js +206 -0
- package/dist/ui-state-updaters.d.ts +362 -0
- package/dist/ui-state-updaters.js +762 -0
- package/dist/ui-state.d.ts +3 -0
- package/dist/ui-state.js +37 -0
- package/dist/vis-state-merger.d.ts +143 -0
- package/dist/vis-state-merger.js +812 -0
- package/dist/vis-state-selectors.d.ts +10 -0
- package/dist/vis-state-selectors.js +30 -0
- package/dist/vis-state-updaters.d.ts +546 -0
- package/dist/vis-state-updaters.js +3338 -0
- package/dist/vis-state.d.ts +155 -0
- package/dist/vis-state.js +36 -0
- package/package.json +23 -17
|
@@ -0,0 +1,812 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.VIS_STATE_MERGERS = void 0;
|
|
8
|
+
exports.createLayerFromConfig = createLayerFromConfig;
|
|
9
|
+
exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
|
|
10
|
+
exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
|
|
11
|
+
exports.mergeAnimationConfig = mergeAnimationConfig;
|
|
12
|
+
exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
|
|
13
|
+
exports.mergeEditor = mergeEditor;
|
|
14
|
+
exports.mergeEffects = mergeEffects;
|
|
15
|
+
exports.mergeFilters = mergeFilters;
|
|
16
|
+
exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
|
|
17
|
+
exports.mergeInteractions = mergeInteractions;
|
|
18
|
+
exports.mergeLayerBlending = mergeLayerBlending;
|
|
19
|
+
exports.mergeLayers = mergeLayers;
|
|
20
|
+
exports.mergeOverlayBlending = mergeOverlayBlending;
|
|
21
|
+
exports.mergeSplitMaps = mergeSplitMaps;
|
|
22
|
+
exports.parseLayerConfig = parseLayerConfig;
|
|
23
|
+
exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
|
|
24
|
+
exports.serializeEffect = serializeEffect;
|
|
25
|
+
exports.serializeLayer = serializeLayer;
|
|
26
|
+
exports.serializeVisState = serializeVisState;
|
|
27
|
+
exports.validateColumn = validateColumn;
|
|
28
|
+
exports.validateLayerWithData = validateLayerWithData;
|
|
29
|
+
exports.validateLayersByDatasets = validateLayersByDatasets;
|
|
30
|
+
exports.validateSavedLayerColumns = validateSavedLayerColumns;
|
|
31
|
+
exports.validateSavedTextLabel = validateSavedTextLabel;
|
|
32
|
+
exports.validateSavedVisualChannels = validateSavedVisualChannels;
|
|
33
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
34
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
35
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
36
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
37
|
+
var _lodash = _interopRequireDefault(require("lodash.uniq"));
|
|
38
|
+
var _lodash2 = _interopRequireDefault(require("lodash.pick"));
|
|
39
|
+
var _lodash3 = _interopRequireDefault(require("lodash.flattendeep"));
|
|
40
|
+
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
41
|
+
var _utils = require("@kepler.gl/utils");
|
|
42
|
+
var _effects = require("@kepler.gl/effects");
|
|
43
|
+
var _constants = require("@kepler.gl/constants");
|
|
44
|
+
var _schemas = require("@kepler.gl/schemas");
|
|
45
|
+
var _table = require("@kepler.gl/table");
|
|
46
|
+
var _layerUtils = require("./layer-utils");
|
|
47
|
+
var _excluded = ["enabled"];
|
|
48
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
49
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
50
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
51
|
+
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; }
|
|
52
|
+
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; } // SPDX-License-Identifier: MIT
|
|
53
|
+
// Copyright contributors to the kepler.gl project
|
|
54
|
+
/**
|
|
55
|
+
* Merge loaded filters with current state, if no fields or data are loaded
|
|
56
|
+
* save it for later
|
|
57
|
+
*
|
|
58
|
+
*/
|
|
59
|
+
function mergeFilters(state, filtersToMerge, fromConfig) {
|
|
60
|
+
var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
|
|
61
|
+
return l.id;
|
|
62
|
+
}) : state.preserveFilterOrder;
|
|
63
|
+
if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
|
|
64
|
+
return state;
|
|
65
|
+
}
|
|
66
|
+
var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
|
|
67
|
+
validated = _validateFiltersUpdat.validated,
|
|
68
|
+
failed = _validateFiltersUpdat.failed,
|
|
69
|
+
updatedDatasets = _validateFiltersUpdat.updatedDatasets;
|
|
70
|
+
var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder);
|
|
71
|
+
|
|
72
|
+
// merge filter with existing
|
|
73
|
+
updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
|
|
74
|
+
updatedFilters = (0, _table.assignGpuChannels)(updatedFilters);
|
|
75
|
+
// filter data
|
|
76
|
+
var datasetsToFilter = (0, _lodash["default"])((0, _lodash3["default"])(validated.map(function (f) {
|
|
77
|
+
return f.dataId;
|
|
78
|
+
})));
|
|
79
|
+
var filtered = (0, _utils.applyFiltersToDatasets)(datasetsToFilter, updatedDatasets, updatedFilters, state.layers);
|
|
80
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
81
|
+
filters: updatedFilters,
|
|
82
|
+
datasets: filtered,
|
|
83
|
+
preserveFilterOrder: preserveFilterOrder,
|
|
84
|
+
filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// replace dataId in saved Filter
|
|
89
|
+
function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
|
|
90
|
+
var replaced = [];
|
|
91
|
+
savedFilter.forEach(function (filter) {
|
|
92
|
+
if (filter.dataId.includes(dataId)) {
|
|
93
|
+
var newDataId = filter.dataId.map(function (d) {
|
|
94
|
+
return d === dataId ? dataIdToUse : d;
|
|
95
|
+
});
|
|
96
|
+
replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
|
|
97
|
+
dataId: newDataId
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return replaced.length ? replaced : null;
|
|
102
|
+
}
|
|
103
|
+
function isSavedLayerConfigV1(layerConfig) {
|
|
104
|
+
// exported layer configuration contains visualChannels property
|
|
105
|
+
return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
|
|
106
|
+
}
|
|
107
|
+
function parseLayerConfig(schema, layerConfig) {
|
|
108
|
+
var _schema$parseSavedCon;
|
|
109
|
+
// assume the layer config is current version
|
|
110
|
+
var savedConfig = {
|
|
111
|
+
version: _schemas.CURRENT_VERSION,
|
|
112
|
+
config: {
|
|
113
|
+
visState: {
|
|
114
|
+
layers: [layerConfig],
|
|
115
|
+
layerOrder: [layerConfig.id]
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
return (_schema$parseSavedCon = schema.parseSavedConfig(savedConfig)) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.visState) === null || _schema$parseSavedCon === void 0 || (_schema$parseSavedCon = _schema$parseSavedCon.layers) === null || _schema$parseSavedCon === void 0 ? void 0 : _schema$parseSavedCon[0];
|
|
120
|
+
}
|
|
121
|
+
function insertItemBasedOnPreservedOrder(currentItems, items) {
|
|
122
|
+
var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
123
|
+
var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
|
|
124
|
+
var newItems = (0, _toConsumableArray2["default"])(currentItems);
|
|
125
|
+
var _iterator = _createForOfIteratorHelper(items),
|
|
126
|
+
_step;
|
|
127
|
+
try {
|
|
128
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
129
|
+
var item = _step.value;
|
|
130
|
+
var expectedIdx = preservedOrder.indexOf(item.id);
|
|
131
|
+
// insertAt the end by default
|
|
132
|
+
var insertAt = defaultStart ? 0 : newItems.length;
|
|
133
|
+
if (expectedIdx > 0) {
|
|
134
|
+
// look for layer to insert after
|
|
135
|
+
var i = expectedIdx + 1;
|
|
136
|
+
var preceedIdx = -1;
|
|
137
|
+
var _loop = function _loop() {
|
|
138
|
+
// keep looking for preceed layer that is already loaded
|
|
139
|
+
var preceedItemId = preservedOrder[i - 1];
|
|
140
|
+
preceedIdx = newItems.findIndex(function (d) {
|
|
141
|
+
return d.id === preceedItemId;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
while (i-- > 0 && preceedIdx < 0) {
|
|
145
|
+
_loop();
|
|
146
|
+
}
|
|
147
|
+
if (preceedIdx > -1) {
|
|
148
|
+
// if found
|
|
149
|
+
insertAt = preceedIdx + 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
_iterator.e(err);
|
|
156
|
+
} finally {
|
|
157
|
+
_iterator.f();
|
|
158
|
+
}
|
|
159
|
+
return newItems;
|
|
160
|
+
}
|
|
161
|
+
function createLayerFromConfig(state, layerConfig) {
|
|
162
|
+
// check if the layer config is parsed
|
|
163
|
+
var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
|
|
164
|
+
if (!parsedLayerConfig) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// first validate config against dataset
|
|
168
|
+
var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
|
|
169
|
+
allowEmptyColumn: true
|
|
170
|
+
}),
|
|
171
|
+
validated = _validateLayersByData.validated,
|
|
172
|
+
failed = _validateLayersByData.failed;
|
|
173
|
+
if (failed !== null && failed !== void 0 && failed.length || !validated.length) {
|
|
174
|
+
// failed
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
var newLayer = validated[0];
|
|
178
|
+
newLayer.updateLayerDomain(state.datasets);
|
|
179
|
+
return newLayer;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Get loaded layer from state
|
|
184
|
+
*/
|
|
185
|
+
function serializeLayer(newLayer, schema) {
|
|
186
|
+
var _serializedVisState$l;
|
|
187
|
+
var serializedVisState = serializeVisState({
|
|
188
|
+
layers: [newLayer],
|
|
189
|
+
layerOrder: [newLayer.id]
|
|
190
|
+
}, schema);
|
|
191
|
+
return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Get loaded effect from state
|
|
196
|
+
*/
|
|
197
|
+
function serializeEffect(newEffect, schema) {
|
|
198
|
+
var _serializedVisState$e;
|
|
199
|
+
var serializedVisState = serializeVisState({
|
|
200
|
+
effects: [newEffect],
|
|
201
|
+
effectOrder: [newEffect.id]
|
|
202
|
+
}, schema);
|
|
203
|
+
return serializedVisState === null || serializedVisState === void 0 || (_serializedVisState$e = serializedVisState.effects) === null || _serializedVisState$e === void 0 ? void 0 : _serializedVisState$e[0];
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Get vis state config
|
|
208
|
+
*/
|
|
209
|
+
function serializeVisState(visState, schema) {
|
|
210
|
+
var _schema$parseSavedCon2;
|
|
211
|
+
var savedState = schema.getConfigToSave({
|
|
212
|
+
visState: visState
|
|
213
|
+
});
|
|
214
|
+
return savedState ? (_schema$parseSavedCon2 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon2 === void 0 ? void 0 : _schema$parseSavedCon2.visState : undefined;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Merge layers from de-serialized state, if no fields or data are loaded
|
|
218
|
+
* save it for later
|
|
219
|
+
*
|
|
220
|
+
*/
|
|
221
|
+
function mergeLayers(state) {
|
|
222
|
+
var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
223
|
+
var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
|
|
224
|
+
var preserveLayerOrder = fromConfig ? (0, _layerUtils.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
|
|
225
|
+
if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
|
|
226
|
+
return state;
|
|
227
|
+
}
|
|
228
|
+
// don't merge layer if dataset is being merged
|
|
229
|
+
var unmerged = [];
|
|
230
|
+
var toMerge = [];
|
|
231
|
+
layersToMerge.forEach(function (l) {
|
|
232
|
+
var _l$config;
|
|
233
|
+
if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
|
|
234
|
+
unmerged.push(l);
|
|
235
|
+
} else {
|
|
236
|
+
toMerge.push(l);
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
|
|
240
|
+
mergedLayer = _validateLayersByData2.validated,
|
|
241
|
+
failed = _validateLayersByData2.failed;
|
|
242
|
+
unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed));
|
|
243
|
+
// put new layers in front of current layers
|
|
244
|
+
var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
|
|
245
|
+
newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
|
|
246
|
+
newLayers = _insertLayerAtRightOr.newLayers;
|
|
247
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
248
|
+
layers: newLayers,
|
|
249
|
+
layerOrder: newLayerOrder,
|
|
250
|
+
preserveLayerOrder: preserveLayerOrder,
|
|
251
|
+
layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
|
|
255
|
+
var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
256
|
+
if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
|
|
257
|
+
return {
|
|
258
|
+
newLayers: currentLayers,
|
|
259
|
+
newLayerOrder: currentOrder
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// perservedOrder ['a', 'b', 'c'];
|
|
263
|
+
// layerOrder ['a', 'b', 'c']
|
|
264
|
+
var currentLayerQueue = currentOrder.map(function (id) {
|
|
265
|
+
return (0, _utils.findById)(id)(currentLayers);
|
|
266
|
+
}).filter(function (layer) {
|
|
267
|
+
return Boolean(layer);
|
|
268
|
+
});
|
|
269
|
+
var newLayers = currentLayers.concat(layersToInsert);
|
|
270
|
+
var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true);
|
|
271
|
+
|
|
272
|
+
// reconstruct layerOrder after insert
|
|
273
|
+
var newLayerOrder = (0, _layerUtils.getLayerOrderFromLayers)(newLayerOrderQueue);
|
|
274
|
+
return {
|
|
275
|
+
newLayerOrder: newLayerOrder,
|
|
276
|
+
newLayers: newLayers
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Merge interactions with saved config
|
|
282
|
+
*
|
|
283
|
+
*/
|
|
284
|
+
function mergeInteractions(state, interactionToBeMerged) {
|
|
285
|
+
var merged = {};
|
|
286
|
+
var unmerged = {};
|
|
287
|
+
if (interactionToBeMerged) {
|
|
288
|
+
Object.keys(interactionToBeMerged).forEach(function (key) {
|
|
289
|
+
if (!state.interactionConfig[key]) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
var currentConfig = key === 'tooltip' || key === 'brush' ? state.interactionConfig[key].config : null;
|
|
293
|
+
var _ref = interactionToBeMerged[key] || {},
|
|
294
|
+
enabled = _ref.enabled,
|
|
295
|
+
configSaved = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
296
|
+
var configToMerge = configSaved;
|
|
297
|
+
if (key === 'tooltip') {
|
|
298
|
+
var _mergeInteractionTool = mergeInteractionTooltipConfig(state, configSaved),
|
|
299
|
+
mergedTooltip = _mergeInteractionTool.mergedTooltip,
|
|
300
|
+
unmergedTooltip = _mergeInteractionTool.unmergedTooltip;
|
|
301
|
+
|
|
302
|
+
// merge new dataset tooltips with original dataset tooltips
|
|
303
|
+
configToMerge = {
|
|
304
|
+
fieldsToShow: _objectSpread(_objectSpread({}, currentConfig.fieldsToShow), mergedTooltip)
|
|
305
|
+
};
|
|
306
|
+
if (Object.keys(unmergedTooltip).length) {
|
|
307
|
+
// @ts-expect-error
|
|
308
|
+
unmerged.tooltip = {
|
|
309
|
+
fieldsToShow: unmergedTooltip,
|
|
310
|
+
enabled: Boolean(enabled)
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
merged[key] = _objectSpread(_objectSpread({}, state.interactionConfig[key]), {}, {
|
|
315
|
+
enabled: Boolean(enabled)
|
|
316
|
+
}, currentConfig ? {
|
|
317
|
+
config: (0, _lodash2["default"])(_objectSpread(_objectSpread({}, currentConfig), configToMerge), Object.keys(currentConfig))
|
|
318
|
+
} : {});
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
322
|
+
interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
|
|
323
|
+
interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
|
|
324
|
+
});
|
|
325
|
+
return nextState;
|
|
326
|
+
}
|
|
327
|
+
function savedUnmergedInteraction(state, unmerged) {
|
|
328
|
+
var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _unmerged$tooltip3;
|
|
329
|
+
if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
|
|
330
|
+
return state.interactionToBeMerged;
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
tooltip: _objectSpread(_objectSpread(_objectSpread({}, state.interactionToBeMerged.tooltip), typeof (unmerged === null || unmerged === void 0 || (_unmerged$tooltip2 = unmerged.tooltip) === null || _unmerged$tooltip2 === void 0 ? void 0 : _unmerged$tooltip2.enabled) === 'boolean' ? {
|
|
334
|
+
enabled: unmerged.tooltip.enabled
|
|
335
|
+
} : {}), {}, {
|
|
336
|
+
fieldsToShow: _objectSpread(_objectSpread({}, (_state$interactionToB = state.interactionToBeMerged) === null || _state$interactionToB === void 0 || (_state$interactionToB = _state$interactionToB.tooltip) === null || _state$interactionToB === void 0 ? void 0 : _state$interactionToB.fieldsToShow), unmerged === null || unmerged === void 0 || (_unmerged$tooltip3 = unmerged.tooltip) === null || _unmerged$tooltip3 === void 0 ? void 0 : _unmerged$tooltip3.fieldsToShow)
|
|
337
|
+
})
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
|
|
341
|
+
var _interactionConfig$to;
|
|
342
|
+
if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
|
|
343
|
+
var _interactionConfig$to2;
|
|
344
|
+
return _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
345
|
+
tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
|
|
346
|
+
fieldsToShow: (0, _defineProperty2["default"])({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 || (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
|
|
347
|
+
})
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Merge splitMaps config with current visStete.
|
|
354
|
+
* 1. if current map is split, but splitMap DOESNOT contain maps
|
|
355
|
+
* : don't merge anything
|
|
356
|
+
* 2. if current map is NOT split, but splitMaps contain maps
|
|
357
|
+
* : add to splitMaps, and add current layers to splitMaps
|
|
358
|
+
*/
|
|
359
|
+
function mergeSplitMaps(state) {
|
|
360
|
+
var splitMaps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
361
|
+
var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
|
|
362
|
+
var unmerged = [];
|
|
363
|
+
splitMaps.forEach(function (sm, i) {
|
|
364
|
+
var entries = Object.entries(sm.layers);
|
|
365
|
+
if (entries.length > 0) {
|
|
366
|
+
entries.forEach(function (_ref2) {
|
|
367
|
+
var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
|
|
368
|
+
id = _ref3[0],
|
|
369
|
+
value = _ref3[1];
|
|
370
|
+
// check if layer exists
|
|
371
|
+
var pushTo = state.layers.find(function (l) {
|
|
372
|
+
return l.id === id;
|
|
373
|
+
}) ? merged : unmerged;
|
|
374
|
+
|
|
375
|
+
// create map panel if current map is not split
|
|
376
|
+
pushTo[i] = pushTo[i] || _objectSpread(_objectSpread({}, sm), {}, {
|
|
377
|
+
layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
|
|
378
|
+
});
|
|
379
|
+
pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
|
|
380
|
+
});
|
|
381
|
+
} else {
|
|
382
|
+
// We are merging if there are no layers in both split map
|
|
383
|
+
merged.push(sm);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
387
|
+
splitMaps: merged,
|
|
388
|
+
splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Merge effects with saved config
|
|
394
|
+
*/
|
|
395
|
+
function mergeEffects(state, effects, fromConfig) {
|
|
396
|
+
var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
|
|
397
|
+
return fromConfig ? (0, _effects.createEffect)(_deepmerge["default"].all([effect, {
|
|
398
|
+
// collapse all panels when loading effects
|
|
399
|
+
isConfigActive: false
|
|
400
|
+
}])) : effect;
|
|
401
|
+
}).filter(function (effect) {
|
|
402
|
+
return Boolean(effect && effect.isValidToSave());
|
|
403
|
+
})));
|
|
404
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
405
|
+
effects: newEffects,
|
|
406
|
+
effectOrder: newEffects.map(function (effect) {
|
|
407
|
+
return effect.id;
|
|
408
|
+
})
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Merge interactionConfig.tooltip with saved config,
|
|
414
|
+
* validate fieldsToShow
|
|
415
|
+
*
|
|
416
|
+
* @param state
|
|
417
|
+
* @param tooltipConfig
|
|
418
|
+
* @return - {mergedTooltip: {}, unmergedTooltip: {}}
|
|
419
|
+
*/
|
|
420
|
+
function mergeInteractionTooltipConfig(state) {
|
|
421
|
+
var tooltipConfig = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
422
|
+
var unmergedTooltip = {};
|
|
423
|
+
var mergedTooltip = {};
|
|
424
|
+
if (!tooltipConfig || !tooltipConfig.fieldsToShow || !Object.keys(tooltipConfig.fieldsToShow).length) {
|
|
425
|
+
return {
|
|
426
|
+
mergedTooltip: mergedTooltip,
|
|
427
|
+
unmergedTooltip: unmergedTooltip
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
var _loop2 = function _loop2() {
|
|
431
|
+
if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
|
|
432
|
+
// is not yet loaded
|
|
433
|
+
unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
|
|
434
|
+
} else {
|
|
435
|
+
// if dataset is loaded
|
|
436
|
+
var allFields = state.datasets[dataId].fields.map(function (d) {
|
|
437
|
+
return d.name;
|
|
438
|
+
});
|
|
439
|
+
var foundFieldsToShow = tooltipConfig.fieldsToShow[dataId].filter(function (field) {
|
|
440
|
+
return allFields.includes(field.name);
|
|
441
|
+
});
|
|
442
|
+
mergedTooltip[dataId] = foundFieldsToShow;
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
for (var dataId in tooltipConfig.fieldsToShow) {
|
|
446
|
+
_loop2();
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
mergedTooltip: mergedTooltip,
|
|
450
|
+
unmergedTooltip: unmergedTooltip
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Merge layerBlending with saved
|
|
455
|
+
*
|
|
456
|
+
*/
|
|
457
|
+
function mergeLayerBlending(state, layerBlending) {
|
|
458
|
+
if (layerBlending && _constants.LAYER_BLENDINGS[layerBlending]) {
|
|
459
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
460
|
+
layerBlending: layerBlending
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
return state;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Merge overlayBlending with saved
|
|
468
|
+
*/
|
|
469
|
+
function mergeOverlayBlending(state, overlayBlending) {
|
|
470
|
+
if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
|
|
471
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
472
|
+
overlayBlending: overlayBlending
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
return state;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Merge animation config
|
|
480
|
+
*/
|
|
481
|
+
function mergeAnimationConfig(state, animation) {
|
|
482
|
+
if (animation && animation.currentTime) {
|
|
483
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
484
|
+
animationConfig: _objectSpread(_objectSpread(_objectSpread({}, state.animationConfig), animation), {}, {
|
|
485
|
+
domain: null
|
|
486
|
+
})
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
return state;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Validate saved layer columns with new data,
|
|
494
|
+
* update fieldIdx based on new fields
|
|
495
|
+
*
|
|
496
|
+
* @param fields
|
|
497
|
+
* @param savedCols
|
|
498
|
+
* @param emptyCols
|
|
499
|
+
* @param options
|
|
500
|
+
* @return - validated columns or null
|
|
501
|
+
*/
|
|
502
|
+
|
|
503
|
+
function validateSavedLayerColumns(fields) {
|
|
504
|
+
var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
505
|
+
var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
|
|
506
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
507
|
+
// Prepare columns for the validator
|
|
508
|
+
var columns = {};
|
|
509
|
+
var _loop3 = function _loop3() {
|
|
510
|
+
var key = _Object$keys[_i];
|
|
511
|
+
columns[key] = _objectSpread({}, emptyCols[key]);
|
|
512
|
+
var saved = savedCols[key];
|
|
513
|
+
if (saved) {
|
|
514
|
+
var fieldIdx = fields.findIndex(function (_ref4) {
|
|
515
|
+
var name = _ref4.name;
|
|
516
|
+
return name === saved;
|
|
517
|
+
});
|
|
518
|
+
if (fieldIdx > -1) {
|
|
519
|
+
// update found columns
|
|
520
|
+
columns[key].fieldIdx = fieldIdx;
|
|
521
|
+
columns[key].value = saved;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
|
|
526
|
+
_loop3();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
// find actual column fieldIdx, in case it has changed
|
|
530
|
+
var allColFound = Object.keys(columns).every(function (key) {
|
|
531
|
+
return validateColumn(columns[key], columns, fields);
|
|
532
|
+
});
|
|
533
|
+
var rv = allColFound ? columns : null;
|
|
534
|
+
if (options.throwOnError) {
|
|
535
|
+
var requiredColumns = Object.keys(emptyCols).filter(function (k) {
|
|
536
|
+
return !emptyCols[k].optional;
|
|
537
|
+
});
|
|
538
|
+
var missingColumns = requiredColumns.filter(function (k) {
|
|
539
|
+
return !(columns !== null && columns !== void 0 && columns[k].value);
|
|
540
|
+
});
|
|
541
|
+
if (missingColumns.length) {
|
|
542
|
+
throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
|
|
543
|
+
}
|
|
544
|
+
var configColumns = Object.keys(savedCols);
|
|
545
|
+
var invalidColumns = configColumns.filter(function (k) {
|
|
546
|
+
var _columns$k;
|
|
547
|
+
return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
|
|
548
|
+
});
|
|
549
|
+
if (invalidColumns.length) {
|
|
550
|
+
throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
return rv;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Validate layer column
|
|
558
|
+
*/
|
|
559
|
+
function validateColumn(column, columns, allFields) {
|
|
560
|
+
if (column.optional || column.value) {
|
|
561
|
+
return true;
|
|
562
|
+
}
|
|
563
|
+
if (column.validator) {
|
|
564
|
+
return column.validator(column, columns, allFields);
|
|
565
|
+
}
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* Validate saved text label config with new data
|
|
571
|
+
* refer to vis-state-schema.js TextLabelSchemaV1
|
|
572
|
+
*
|
|
573
|
+
* @param {Array<Object>} fields
|
|
574
|
+
* @param {Object} savedTextLabel
|
|
575
|
+
* @param {Object} options
|
|
576
|
+
* @return {Object} - validated textlabel
|
|
577
|
+
*/
|
|
578
|
+
function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
|
|
579
|
+
var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
|
|
580
|
+
layerTextLabel = _ref6[0];
|
|
581
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
582
|
+
var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel];
|
|
583
|
+
|
|
584
|
+
// validate field
|
|
585
|
+
return savedTextLabels.map(function (textLabel) {
|
|
586
|
+
var field = textLabel.field ? fields.find(function (fd) {
|
|
587
|
+
return Object.keys(textLabel.field).every(function (key) {
|
|
588
|
+
return textLabel.field[key] === fd[key];
|
|
589
|
+
});
|
|
590
|
+
}) : null;
|
|
591
|
+
if (field === undefined && options.throwOnError) {
|
|
592
|
+
throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
|
|
593
|
+
}
|
|
594
|
+
return Object.keys(layerTextLabel).reduce(function (accu, key) {
|
|
595
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
|
|
596
|
+
}, {});
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Validate saved visual channels config with new data,
|
|
602
|
+
* refer to vis-state-schema.js VisualChannelSchemaV1
|
|
603
|
+
*/
|
|
604
|
+
function validateSavedVisualChannels(fields, newLayer, savedLayer) {
|
|
605
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
606
|
+
Object.values(newLayer.visualChannels).forEach(function (_ref7) {
|
|
607
|
+
var field = _ref7.field,
|
|
608
|
+
scale = _ref7.scale,
|
|
609
|
+
key = _ref7.key;
|
|
610
|
+
var foundField;
|
|
611
|
+
if (savedLayer.config) {
|
|
612
|
+
if (savedLayer.config[field]) {
|
|
613
|
+
foundField = fields.find(function (fd) {
|
|
614
|
+
return savedLayer.config && fd.name === savedLayer.config[field].name;
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
var foundChannel = _objectSpread(_objectSpread({}, foundField ? (0, _defineProperty2["default"])({}, field, foundField) : {}), savedLayer.config[scale] ? (0, _defineProperty2["default"])({}, scale, savedLayer.config[scale]) : {});
|
|
618
|
+
if (Object.keys(foundChannel).length) {
|
|
619
|
+
newLayer.updateLayerConfig(foundChannel);
|
|
620
|
+
}
|
|
621
|
+
newLayer.validateVisualChannel(key);
|
|
622
|
+
if (options.throwOnError) {
|
|
623
|
+
var _savedLayer$config, _newLayer$config$fiel;
|
|
624
|
+
var fieldName = (_savedLayer$config = savedLayer.config) === null || _savedLayer$config === void 0 || (_savedLayer$config = _savedLayer$config[field]) === null || _savedLayer$config === void 0 ? void 0 : _savedLayer$config.name;
|
|
625
|
+
if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
|
|
626
|
+
throw new Error("Layer has invalid visual channel field: ".concat(field));
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
return newLayer;
|
|
632
|
+
}
|
|
633
|
+
function validateLayersByDatasets(datasets, layerClasses) {
|
|
634
|
+
var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
635
|
+
var options = arguments.length > 3 ? arguments[3] : undefined;
|
|
636
|
+
var validated = [];
|
|
637
|
+
var failed = [];
|
|
638
|
+
layers.forEach(function (layer) {
|
|
639
|
+
var _layer$config;
|
|
640
|
+
var validateLayer = null;
|
|
641
|
+
if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
|
|
642
|
+
if (datasets[layer.config.dataId]) {
|
|
643
|
+
// datasets are already loaded
|
|
644
|
+
validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (validateLayer) {
|
|
648
|
+
validated.push(validateLayer);
|
|
649
|
+
} else {
|
|
650
|
+
// datasets not yet loaded
|
|
651
|
+
failed.push(layer);
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
return {
|
|
655
|
+
validated: validated,
|
|
656
|
+
failed: failed
|
|
657
|
+
};
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Get required columns for validation based on column mode
|
|
662
|
+
*/
|
|
663
|
+
function _getColumnConfigForValidation(newLayer) {
|
|
664
|
+
// find column fieldIdx
|
|
665
|
+
var columnConfig = newLayer.getLayerColumns();
|
|
666
|
+
// if columnMode is defined, find column mode config
|
|
667
|
+
var colModeConfig = newLayer.config.columnMode ? (newLayer.supportedColumnModes || []).find(function (colMode) {
|
|
668
|
+
return colMode.key === newLayer.config.columnMode;
|
|
669
|
+
}) : null;
|
|
670
|
+
if (colModeConfig) {
|
|
671
|
+
// only validate columns in column mode
|
|
672
|
+
columnConfig = [].concat((0, _toConsumableArray2["default"])(colModeConfig.requiredColumns || []), (0, _toConsumableArray2["default"])(colModeConfig.optionalColumns || [])).reduce(function (accu, key) {
|
|
673
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, columnConfig[key]));
|
|
674
|
+
}, {});
|
|
675
|
+
}
|
|
676
|
+
return columnConfig;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/**
|
|
680
|
+
* Validate saved layer config with new data,
|
|
681
|
+
* update fieldIdx based on new fields
|
|
682
|
+
*/
|
|
683
|
+
// eslint-disable-next-line complexity
|
|
684
|
+
function validateLayerWithData(dataset, savedLayer, layerClasses) {
|
|
685
|
+
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
686
|
+
var fields = dataset.fields,
|
|
687
|
+
dataId = dataset.id;
|
|
688
|
+
var type = savedLayer.type;
|
|
689
|
+
var throwOnError = options.throwOnError;
|
|
690
|
+
// layer doesnt have a valid type
|
|
691
|
+
if (!type || !Object.prototype.hasOwnProperty.call(layerClasses, type) || !savedLayer.config) {
|
|
692
|
+
if (throwOnError) {
|
|
693
|
+
throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
|
|
694
|
+
}
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
var newLayer = new layerClasses[type]({
|
|
698
|
+
id: savedLayer.id,
|
|
699
|
+
dataId: dataId,
|
|
700
|
+
label: savedLayer.config.label,
|
|
701
|
+
color: savedLayer.config.color,
|
|
702
|
+
isVisible: savedLayer.config.isVisible,
|
|
703
|
+
hidden: savedLayer.config.hidden,
|
|
704
|
+
columnMode: savedLayer.config.columnMode,
|
|
705
|
+
highlightColor: savedLayer.config.highlightColor
|
|
706
|
+
});
|
|
707
|
+
var columnConfig = _getColumnConfigForValidation(newLayer);
|
|
708
|
+
if (Object.keys(columnConfig)) {
|
|
709
|
+
var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
|
|
710
|
+
if (columns) {
|
|
711
|
+
newLayer.updateLayerConfig({
|
|
712
|
+
columns: _objectSpread(_objectSpread({}, newLayer.config.columns), columns)
|
|
713
|
+
});
|
|
714
|
+
} else if (!options.allowEmptyColumn) {
|
|
715
|
+
return null;
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel;
|
|
719
|
+
|
|
720
|
+
// copy visConfig over to emptyLayer to make sure it has all the props
|
|
721
|
+
var copiedVisConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
|
|
722
|
+
shallowCopy: ['colorRange', 'strokeColorRange']
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
// call layer methods to validate visConfig when switching dataset
|
|
726
|
+
var visConfig = newLayer.validateVisConfig ? newLayer.validateVisConfig(dataset, copiedVisConfig) : copiedVisConfig;
|
|
727
|
+
newLayer.updateLayerConfig({
|
|
728
|
+
visConfig: visConfig,
|
|
729
|
+
textLabel: textLabel
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
// visual channel field is saved to be {name, type}
|
|
733
|
+
// find visual channel field by matching both name and type
|
|
734
|
+
// refer to vis-state-schema.js VisualChannelSchemaV1
|
|
735
|
+
newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
|
|
736
|
+
if (throwOnError) {
|
|
737
|
+
if (!newLayer.isValidToSave()) {
|
|
738
|
+
throw new Error("Layer is not valid to save: ".concat(newLayer.id));
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return newLayer;
|
|
742
|
+
}
|
|
743
|
+
function mergeEditor(state, savedEditor) {
|
|
744
|
+
var _savedEditor$visible;
|
|
745
|
+
if (!savedEditor) {
|
|
746
|
+
return state;
|
|
747
|
+
}
|
|
748
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
749
|
+
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
750
|
+
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
|
|
751
|
+
// if savedEditor.visible is undefined keep state.editor.visible
|
|
752
|
+
visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
|
|
753
|
+
})
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* Validate saved layer config with new data,
|
|
759
|
+
* update fieldIdx based on new fields
|
|
760
|
+
*/
|
|
761
|
+
function mergeDatasetsByOrder(state, newDataEntries) {
|
|
762
|
+
var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
|
|
763
|
+
if (Array.isArray(state.preserveDatasetOrder)) {
|
|
764
|
+
// preserveDatasetOrder might not include the new datasets
|
|
765
|
+
var newDatasetIds = Object.keys(merged).filter(function (id) {
|
|
766
|
+
var _state$preserveDatase;
|
|
767
|
+
return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
|
|
768
|
+
});
|
|
769
|
+
return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
|
|
770
|
+
return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
|
|
771
|
+
}, {});
|
|
772
|
+
}
|
|
773
|
+
return merged;
|
|
774
|
+
}
|
|
775
|
+
var VIS_STATE_MERGERS = exports.VIS_STATE_MERGERS = [{
|
|
776
|
+
merge: mergeLayers,
|
|
777
|
+
prop: 'layers',
|
|
778
|
+
toMergeProp: 'layerToBeMerged',
|
|
779
|
+
preserveOrder: 'preserveLayerOrder'
|
|
780
|
+
}, {
|
|
781
|
+
merge: mergeFilters,
|
|
782
|
+
prop: 'filters',
|
|
783
|
+
toMergeProp: 'filterToBeMerged',
|
|
784
|
+
preserveOrder: 'preserveFilterOrder',
|
|
785
|
+
replaceParentDatasetIds: replaceFilterDatasetIds
|
|
786
|
+
}, {
|
|
787
|
+
merge: mergeEffects,
|
|
788
|
+
prop: 'effects'
|
|
789
|
+
}, {
|
|
790
|
+
merge: mergeInteractions,
|
|
791
|
+
prop: 'interactionConfig',
|
|
792
|
+
toMergeProp: 'interactionToBeMerged',
|
|
793
|
+
replaceParentDatasetIds: replaceInteractionDatasetIds,
|
|
794
|
+
saveUnmerged: savedUnmergedInteraction
|
|
795
|
+
}, {
|
|
796
|
+
merge: mergeLayerBlending,
|
|
797
|
+
prop: 'layerBlending'
|
|
798
|
+
}, {
|
|
799
|
+
merge: mergeOverlayBlending,
|
|
800
|
+
prop: 'overlayBlending'
|
|
801
|
+
}, {
|
|
802
|
+
merge: mergeSplitMaps,
|
|
803
|
+
prop: 'splitMaps',
|
|
804
|
+
toMergeProp: 'splitMapsToBeMerged'
|
|
805
|
+
}, {
|
|
806
|
+
merge: mergeAnimationConfig,
|
|
807
|
+
prop: 'animationConfig'
|
|
808
|
+
}, {
|
|
809
|
+
merge: mergeEditor,
|
|
810
|
+
prop: 'editor'
|
|
811
|
+
}];
|
|
812
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoMiIsIl9sb2Rhc2gzIiwiX2RlZXBtZXJnZSIsIl91dGlscyIsIl9lZmZlY3RzIiwiX2NvbnN0YW50cyIsIl9zY2hlbWFzIiwiX3RhYmxlIiwiX2xheWVyVXRpbHMiLCJfZXhjbHVkZWQiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIm93bktleXMiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJtZXJnZUZpbHRlcnMiLCJzdGF0ZSIsImZpbHRlcnNUb01lcmdlIiwiZnJvbUNvbmZpZyIsInByZXNlcnZlRmlsdGVyT3JkZXIiLCJtYXAiLCJsIiwiaWQiLCJfdmFsaWRhdGVGaWx0ZXJzVXBkYXQiLCJ2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyIsInZhbGlkYXRlZCIsImZhaWxlZCIsInVwZGF0ZWREYXRhc2V0cyIsInVwZGF0ZWRGaWx0ZXJzIiwiaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlciIsImZpbHRlcnMiLCJyZXNldEZpbHRlckdwdU1vZGUiLCJhc3NpZ25HcHVDaGFubmVscyIsImRhdGFzZXRzVG9GaWx0ZXIiLCJ1bmlxIiwiZmxhdHRlbkRlZXAiLCJkYXRhSWQiLCJmaWx0ZXJlZCIsImFwcGx5RmlsdGVyc1RvRGF0YXNldHMiLCJsYXllcnMiLCJkYXRhc2V0cyIsImZpbHRlclRvQmVNZXJnZWQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwicmVwbGFjZUZpbHRlckRhdGFzZXRJZHMiLCJzYXZlZEZpbHRlciIsImRhdGFJZFRvVXNlIiwicmVwbGFjZWQiLCJpbmNsdWRlcyIsIm5ld0RhdGFJZCIsImQiLCJpc1NhdmVkTGF5ZXJDb25maWdWMSIsImxheWVyQ29uZmlnIiwidmlzdWFsQ2hhbm5lbHMiLCJwYXJzZUxheWVyQ29uZmlnIiwic2NoZW1hIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uIiwic2F2ZWRDb25maWciLCJ2ZXJzaW9uIiwiQ1VSUkVOVF9WRVJTSU9OIiwiY29uZmlnIiwidmlzU3RhdGUiLCJsYXllck9yZGVyIiwicGFyc2VTYXZlZENvbmZpZyIsImN1cnJlbnRJdGVtcyIsIml0ZW1zIiwicHJlc2VydmVkT3JkZXIiLCJ1bmRlZmluZWQiLCJkZWZhdWx0U3RhcnQiLCJuZXdJdGVtcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiaXRlbSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwiaSIsInByZWNlZWRJZHgiLCJfbG9vcCIsInByZWNlZWRJdGVtSWQiLCJmaW5kSW5kZXgiLCJhcnJheUluc2VydCIsImVyciIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsInBhcnNlZExheWVyQ29uZmlnIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhIiwidmFsaWRhdGVMYXllcnNCeURhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwiYWxsb3dFbXB0eUNvbHVtbiIsIm5ld0xheWVyIiwidXBkYXRlTGF5ZXJEb21haW4iLCJzZXJpYWxpemVMYXllciIsIl9zZXJpYWxpemVkVmlzU3RhdGUkbCIsInNlcmlhbGl6ZWRWaXNTdGF0ZSIsInNlcmlhbGl6ZVZpc1N0YXRlIiwic2VyaWFsaXplRWZmZWN0IiwibmV3RWZmZWN0IiwiX3NlcmlhbGl6ZWRWaXNTdGF0ZSRlIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiX3NjaGVtYSRwYXJzZVNhdmVkQ29uMiIsInNhdmVkU3RhdGUiLCJnZXRDb25maWdUb1NhdmUiLCJtZXJnZUxheWVycyIsImxheWVyc1RvTWVyZ2UiLCJwcmVzZXJ2ZUxheWVyT3JkZXIiLCJnZXRMYXllck9yZGVyRnJvbUxheWVycyIsInVubWVyZ2VkIiwidG9NZXJnZSIsIl9sJGNvbmZpZyIsImlzTWVyZ2luZ0RhdGFzZXRzIiwiX3ZhbGlkYXRlTGF5ZXJzQnlEYXRhMiIsIm1lcmdlZExheWVyIiwiX2luc2VydExheWVyQXRSaWdodE9yIiwiaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIiLCJuZXdMYXllck9yZGVyIiwibmV3TGF5ZXJzIiwibGF5ZXJUb0JlTWVyZ2VkIiwiY3VycmVudExheWVycyIsImxheWVyc1RvSW5zZXJ0IiwiY3VycmVudE9yZGVyIiwiY3VycmVudExheWVyUXVldWUiLCJmaW5kQnlJZCIsImxheWVyIiwiQm9vbGVhbiIsIm5ld0xheWVyT3JkZXJRdWV1ZSIsIm1lcmdlSW50ZXJhY3Rpb25zIiwiaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkIiwibWVyZ2VkIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiX3JlZiIsImVuYWJsZWQiLCJjb25maWdTYXZlZCIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJjb25maWdUb01lcmdlIiwiX21lcmdlSW50ZXJhY3Rpb25Ub29sIiwibWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWciLCJtZXJnZWRUb29sdGlwIiwidW5tZXJnZWRUb29sdGlwIiwiZmllbGRzVG9TaG93IiwidG9vbHRpcCIsInBpY2siLCJuZXh0U3RhdGUiLCJzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24iLCJfdW5tZXJnZWQkdG9vbHRpcCIsIl91bm1lcmdlZCR0b29sdGlwMiIsIl9zdGF0ZSRpbnRlcmFjdGlvblRvQiIsIl91bm1lcmdlZCR0b29sdGlwMyIsInJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMiLCJkYXRhSWRUb1JlcGxhY2UiLCJfaW50ZXJhY3Rpb25Db25maWckdG8iLCJfaW50ZXJhY3Rpb25Db25maWckdG8yIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJfcmVmMiIsIl9yZWYzIiwiX3NsaWNlZFRvQXJyYXkyIiwicHVzaFRvIiwiZmluZCIsImdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJtZXJnZUVmZmVjdHMiLCJuZXdFZmZlY3RzIiwiZWZmZWN0IiwiY3JlYXRlRWZmZWN0IiwiZGVlcG1lcmdlIiwiYWxsIiwiaXNDb25maWdBY3RpdmUiLCJpc1ZhbGlkVG9TYXZlIiwidG9vbHRpcENvbmZpZyIsIl9sb29wMiIsImFsbEZpZWxkcyIsImZpZWxkcyIsImZvdW5kRmllbGRzVG9TaG93IiwiZmllbGQiLCJtZXJnZUxheWVyQmxlbmRpbmciLCJsYXllckJsZW5kaW5nIiwiTEFZRVJfQkxFTkRJTkdTIiwibWVyZ2VPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJPVkVSTEFZX0JMRU5ESU5HUyIsIm1lcmdlQW5pbWF0aW9uQ29uZmlnIiwiYW5pbWF0aW9uIiwiY3VycmVudFRpbWUiLCJhbmltYXRpb25Db25maWciLCJkb21haW4iLCJ2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zIiwic2F2ZWRDb2xzIiwiZW1wdHlDb2xzIiwib3B0aW9ucyIsImNvbHVtbnMiLCJfbG9vcDMiLCJfT2JqZWN0JGtleXMiLCJfaSIsInNhdmVkIiwiZmllbGRJZHgiLCJfcmVmNCIsImFsbENvbEZvdW5kIiwiZXZlcnkiLCJ2YWxpZGF0ZUNvbHVtbiIsInJ2IiwidGhyb3dPbkVycm9yIiwicmVxdWlyZWRDb2x1bW5zIiwiayIsIm9wdGlvbmFsIiwibWlzc2luZ0NvbHVtbnMiLCJFcnJvciIsImpvaW4iLCJjb25maWdDb2x1bW5zIiwiaW52YWxpZENvbHVtbnMiLCJfY29sdW1ucyRrIiwiY29sdW1uIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsIl9yZWY1Iiwic2F2ZWRUZXh0TGFiZWwiLCJfcmVmNiIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVkdWNlIiwiYWNjdSIsInZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyIsInNhdmVkTGF5ZXIiLCJ2YWx1ZXMiLCJfcmVmNyIsInNjYWxlIiwiZm91bmRGaWVsZCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiX3NhdmVkTGF5ZXIkY29uZmlnIiwiX25ld0xheWVyJGNvbmZpZyRmaWVsIiwiZmllbGROYW1lIiwiX2xheWVyJGNvbmZpZyIsInZhbGlkYXRlTGF5ZXIiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbiIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsImNvbE1vZGVDb25maWciLCJjb2x1bW5Nb2RlIiwic3VwcG9ydGVkQ29sdW1uTW9kZXMiLCJjb2xNb2RlIiwib3B0aW9uYWxDb2x1bW5zIiwiZGF0YXNldCIsInR5cGUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImxhYmVsIiwiY29sb3IiLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvcGllZFZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInZpc0NvbmZpZyIsInNoYWxsb3dDb3B5IiwidmFsaWRhdGVWaXNDb25maWciLCJtZXJnZUVkaXRvciIsInNhdmVkRWRpdG9yIiwiX3NhdmVkRWRpdG9yJHZpc2libGUiLCJlZGl0b3IiLCJmZWF0dXJlcyIsInZpc2libGUiLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsIm5ld0RhdGFFbnRyaWVzIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJuZXdEYXRhc2V0SWRzIiwiX3N0YXRlJHByZXNlcnZlRGF0YXNlIiwiVklTX1NUQVRFX01FUkdFUlMiLCJleHBvcnRzIiwibWVyZ2UiLCJwcm9wIiwidG9NZXJnZVByb3AiLCJwcmVzZXJ2ZU9yZGVyIiwicmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJzYXZlVW5tZXJnZWQiXSwic291cmNlcyI6WyIuLi9zcmMvdmlzLXN0YXRlLW1lcmdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gucGljayc7XG5pbXBvcnQgZmxhdHRlbkRlZXAgZnJvbSAnbG9kYXNoLmZsYXR0ZW5kZWVwJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7XG4gIGFycmF5SW5zZXJ0LFxuICBnZXRJbml0aWFsTWFwTGF5ZXJzRm9yU3BsaXRNYXAsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIHZhbGlkYXRlRmlsdGVyc1VwZGF0ZURhdGFzZXRzLFxuICBmaW5kQnlJZFxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuaW1wb3J0IHtMYXllciwgVmlzdWFsQ2hhbm5lbH0gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HUywgT1ZFUkxBWV9CTEVORElOR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlLFxuICBQYXJzZWRFZmZlY3QsXG4gIExheWVyQ29sdW1ucyxcbiAgTGF5ZXJDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmltcG9ydCB7Z2V0TGF5ZXJPcmRlckZyb21MYXllcnN9IGZyb20gJy4vbGF5ZXItdXRpbHMnO1xuXG4vKipcbiAqIE1lcmdlIGxvYWRlZCBmaWx0ZXJzIHdpdGggY3VycmVudCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUZpbHRlcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVGaWx0ZXJPcmRlciA9IGZyb21Db25maWdcbiAgICA/IGZpbHRlcnNUb01lcmdlPy5tYXAobCA9PiBsLmlkKVxuICAgIDogc3RhdGUucHJlc2VydmVGaWx0ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuICBsZXQgdXBkYXRlZEZpbHRlcnMgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIHN0YXRlLmZpbHRlcnMsXG4gICAgdmFsaWRhdGVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXJcbiAgKTtcblxuICAvLyBtZXJnZSBmaWx0ZXIgd2l0aCBleGlzdGluZ1xuICB1cGRhdGVkRmlsdGVycyA9IHJlc2V0RmlsdGVyR3B1TW9kZSh1cGRhdGVkRmlsdGVycyk7XG4gIHVwZGF0ZWRGaWx0ZXJzID0gYXNzaWduR3B1Q2hhbm5lbHModXBkYXRlZEZpbHRlcnMpO1xuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBkYXRhc2V0c1RvRmlsdGVyID0gdW5pcShmbGF0dGVuRGVlcCh2YWxpZGF0ZWQubWFwKGYgPT4gZi5kYXRhSWQpKSk7XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKFxuICAgIGRhdGFzZXRzVG9GaWx0ZXIsXG4gICAgdXBkYXRlZERhdGFzZXRzLFxuICAgIHVwZGF0ZWRGaWx0ZXJzLFxuICAgIHN0YXRlLmxheWVyc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogdXBkYXRlZEZpbHRlcnMsXG4gICAgZGF0YXNldHM6IGZpbHRlcmVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXIsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuLy8gcmVwbGFjZSBkYXRhSWQgaW4gc2F2ZWQgRmlsdGVyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUZpbHRlckRhdGFzZXRJZHMoXG4gIHNhdmVkRmlsdGVyOiBGaWx0ZXJbXSxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbikge1xuICBjb25zdCByZXBsYWNlZDogRmlsdGVyW10gPSBbXTtcbiAgc2F2ZWRGaWx0ZXIuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgIGlmIChmaWx0ZXIuZGF0YUlkLmluY2x1ZGVzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGFJZCA9IGZpbHRlci5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZCkpO1xuICAgICAgcmVwbGFjZWQucHVzaCh7XG4gICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgZGF0YUlkOiBuZXdEYXRhSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXBsYWNlZC5sZW5ndGggPyByZXBsYWNlZCA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIC8vIGV4cG9ydGVkIGxheWVyIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgdmlzdWFsQ2hhbm5lbHMgcHJvcGVydHlcbiAgcmV0dXJuIGxheWVyQ29uZmlnPy52aXN1YWxDaGFubmVscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJDb25maWcoXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzcyxcbiAgbGF5ZXJDb25maWc6IGFueVxuKTogUGFyc2VkTGF5ZXIgfCB1bmRlZmluZWQge1xuICAvLyBhc3N1bWUgdGhlIGxheWVyIGNvbmZpZyBpcyBjdXJyZW50IHZlcnNpb25cbiAgY29uc3Qgc2F2ZWRDb25maWcgPSB7XG4gICAgdmVyc2lvbjogQ1VSUkVOVF9WRVJTSU9OLFxuICAgIGNvbmZpZzoge1xuICAgICAgdmlzU3RhdGU6IHtsYXllcnM6IFtsYXllckNvbmZpZ10sIGxheWVyT3JkZXI6IFtsYXllckNvbmZpZy5pZF19XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZENvbmZpZyk/LnZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgY3VycmVudEl0ZW1zOiBGaWx0ZXJbXSxcbiAgaXRlbXM6IEZpbHRlcltdLFxuICBwcmVzZXJ2ZWRPcmRlcjogYW55W10gPSBbXSxcbiAgZGVmYXVsdFN0YXJ0PzogYm9vbGVhblxuKSB7XG4gIGxldCBuZXdJdGVtcyA9IFsuLi5jdXJyZW50SXRlbXNdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAvLyBpbnNlcnRBdCB0aGUgZW5kIGJ5IGRlZmF1bHRcbiAgICBsZXQgaW5zZXJ0QXQgPSBkZWZhdWx0U3RhcnQgPyAwIDogbmV3SXRlbXMubGVuZ3RoO1xuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA8IDApIHtcbiAgICAgICAgLy8ga2VlcCBsb29raW5nIGZvciBwcmVjZWVkIGxheWVyIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgcHJlY2VlZEl0ZW1JZCA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IG5ld0l0ZW1zLmZpbmRJbmRleChkID0+IGQuaWQgPT09IHByZWNlZWRJdGVtSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZWRJZHggPiAtMSkge1xuICAgICAgICAvLyBpZiBmb3VuZFxuICAgICAgICBpbnNlcnRBdCA9IHByZWNlZWRJZHggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXdJdGVtcyA9IGFycmF5SW5zZXJ0KG5ld0l0ZW1zLCBpbnNlcnRBdCwgaXRlbSk7XG4gIH1cbiAgcmV0dXJuIG5ld0l0ZW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGNoZWNrIGlmIHRoZSBsYXllciBjb25maWcgaXMgcGFyc2VkXG4gIGNvbnN0IHBhcnNlZExheWVyQ29uZmlnID0gaXNTYXZlZExheWVyQ29uZmlnVjEobGF5ZXJDb25maWcpXG4gICAgPyBwYXJzZUxheWVyQ29uZmlnKHN0YXRlLnNjaGVtYSwgbGF5ZXJDb25maWcpXG4gICAgOiBsYXllckNvbmZpZztcblxuICBpZiAoIXBhcnNlZExheWVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZmlyc3QgdmFsaWRhdGUgY29uZmlnIGFnYWluc3QgZGF0YXNldFxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBbcGFyc2VkTGF5ZXJDb25maWddLFxuICAgIHthbGxvd0VtcHR5Q29sdW1uOiB0cnVlfVxuICApO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgbGF5ZXIgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIoXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtsYXllcnM6IFtuZXdMYXllcl0sIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZF19LFxuICAgIHNjaGVtYVxuICApO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgbG9hZGVkIGVmZmVjdCBmcm9tIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFZmZlY3QoXG4gIG5ld0VmZmVjdDogRWZmZWN0VHlwZSxcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRFZmZlY3QgfCB1bmRlZmluZWQge1xuICBjb25zdCBzZXJpYWxpemVkVmlzU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShcbiAgICB7ZWZmZWN0czogW25ld0VmZmVjdF0sIGVmZmVjdE9yZGVyOiBbbmV3RWZmZWN0LmlkXX0sXG4gICAgc2NoZW1hXG4gICk7XG4gIHJldHVybiBzZXJpYWxpemVkVmlzU3RhdGU/LmVmZmVjdHM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgdmlzIHN0YXRlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmlzU3RhdGUoXG4gIHZpc1N0YXRlOiBQYXJ0aWFsPFZpc1N0YXRlPixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRWaXNTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNhdmVkU3RhdGUgPSBzY2hlbWEuZ2V0Q29uZmlnVG9TYXZlKHtcbiAgICB2aXNTdGF0ZVxuICB9KTtcbiAgcmV0dXJuIHNhdmVkU3RhdGUgPyBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZFN0YXRlKT8udmlzU3RhdGUgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobGF5ZXJzVG9NZXJnZSlcbiAgICA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkb24ndCBtZXJnZSBsYXllciBpZiBkYXRhc2V0IGlzIGJlaW5nIG1lcmdlZFxuICBjb25zdCB1bm1lcmdlZDogUGFyc2VkTGF5ZXJbXSA9IFtdO1xuICBjb25zdCB0b01lcmdlOiBQYXJzZWRMYXllcltdID0gW107XG4gIGxheWVyc1RvTWVyZ2UuZm9yRWFjaCgobDogUGFyc2VkTGF5ZXIpID0+IHtcbiAgICBpZiAobD8uY29uZmlnPy5kYXRhSWQgJiYgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbbC5jb25maWcuZGF0YUlkXSkge1xuICAgICAgdW5tZXJnZWQucHVzaChsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9NZXJnZS5wdXNoKGwpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIHRvTWVyZ2VcbiAgKTtcbiAgdW5tZXJnZWQucHVzaCguLi5mYWlsZWQpO1xuICAvLyBwdXQgbmV3IGxheWVycyBpbiBmcm9udCBvZiBjdXJyZW50IGxheWVyc1xuICBjb25zdCB7bmV3TGF5ZXJPcmRlciwgbmV3TGF5ZXJzfSA9IGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICAgIHN0YXRlLmxheWVycyxcbiAgICBtZXJnZWRMYXllcixcbiAgICBzdGF0ZS5sYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIGlmICghbGF5ZXJzVG9JbnNlcnQ/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7bmV3TGF5ZXJzOiBjdXJyZW50TGF5ZXJzLCBuZXdMYXllck9yZGVyOiBjdXJyZW50T3JkZXJ9O1xuICB9XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbJ2EnLCAnYicsICdjJ11cbiAgY29uc3QgY3VycmVudExheWVyUXVldWUgPSBjdXJyZW50T3JkZXJcbiAgICAubWFwKGlkID0+IGZpbmRCeUlkKGlkKShjdXJyZW50TGF5ZXJzKSlcbiAgICAuZmlsdGVyKGxheWVyID0+IEJvb2xlYW4obGF5ZXIpKTtcbiAgY29uc3QgbmV3TGF5ZXJzID0gY3VycmVudExheWVycy5jb25jYXQobGF5ZXJzVG9JbnNlcnQpO1xuICBjb25zdCBuZXdMYXllck9yZGVyUXVldWUgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIGN1cnJlbnRMYXllclF1ZXVlLFxuICAgIGxheWVyc1RvSW5zZXJ0LFxuICAgIHByZXNlcnZlZE9yZGVyLFxuICAgIHRydWVcbiAgKTtcblxuICAvLyByZWNvbnN0cnVjdCBsYXllck9yZGVyIGFmdGVyIGluc2VydFxuICBjb25zdCBuZXdMYXllck9yZGVyID0gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobmV3TGF5ZXJPcmRlclF1ZXVlKTtcblxuICByZXR1cm4ge1xuICAgIG5ld0xheWVyT3JkZXIsXG4gICAgbmV3TGF5ZXJzXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25zIHdpdGggc2F2ZWQgY29uZmlnXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvbnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZFxuKTogUyB7XG4gIGNvbnN0IG1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiA9IHt9O1xuICBjb25zdCB1bm1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiA9IHt9O1xuXG4gIGlmIChpbnRlcmFjdGlvblRvQmVNZXJnZWQpIHtcbiAgICAoT2JqZWN0LmtleXMoaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkKSBhcyBBcnJheTxrZXlvZiBTYXZlZEludGVyYWN0aW9uQ29uZmlnPikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKCFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudENvbmZpZyA9XG4gICAgICAgIGtleSA9PT0gJ3Rvb2x0aXAnIHx8IGtleSA9PT0gJ2JydXNoJyA/IHN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0uY29uZmlnIDogbnVsbDtcblxuICAgICAgY29uc3Qge2VuYWJsZWQsIC4uLmNvbmZpZ1NhdmVkfSA9IGludGVyYWN0aW9uVG9CZU1lcmdlZFtrZXldIHx8IHt9O1xuXG4gICAgICBsZXQgY29uZmlnVG9NZXJnZSA9IGNvbmZpZ1NhdmVkO1xuXG4gICAgICBpZiAoa2V5ID09PSAndG9vbHRpcCcpIHtcbiAgICAgICAgY29uc3Qge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH0gPSBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb25maWdTYXZlZCBhcyBTYXZlZEludGVyYWN0aW9uQ29uZmlnWyd0b29sdGlwJ11cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBtZXJnZSBuZXcgZGF0YXNldCB0b29sdGlwcyB3aXRoIG9yaWdpbmFsIGRhdGFzZXQgdG9vbHRpcHNcbiAgICAgICAgY29uZmlnVG9NZXJnZSA9IHtcbiAgICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICAgIC4uLihjdXJyZW50Q29uZmlnIGFzIFRvb2x0aXBJbmZvWydjb25maWcnXSkuZmllbGRzVG9TaG93LFxuICAgICAgICAgICAgLi4ubWVyZ2VkVG9vbHRpcFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXModW5tZXJnZWRUb29sdGlwKS5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgdW5tZXJnZWQudG9vbHRpcCA9IHtmaWVsZHNUb1Nob3c6IHVubWVyZ2VkVG9vbHRpcCwgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKX07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVyZ2VkW2tleV0gPSB7XG4gICAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0sXG4gICAgICAgIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCksXG4gICAgICAgIC4uLihjdXJyZW50Q29uZmlnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmZpZzogcGljayhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5jdXJyZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgLi4uY29uZmlnVG9NZXJnZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY3VycmVudENvbmZpZylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIC4uLm1lcmdlZFxuICAgIH0sXG4gICAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24oc3RhdGUsIHVubWVyZ2VkKVxuICB9O1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5mdW5jdGlvbiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb248UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+XG4pIHtcbiAgaWYgKCF1bm1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93KSB7XG4gICAgcmV0dXJuIHN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2x0aXA6IHtcbiAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZC50b29sdGlwLFxuICAgICAgLi4uKHR5cGVvZiB1bm1lcmdlZD8udG9vbHRpcD8uZW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG4gICAgICAgID8ge2VuYWJsZWQ6IHVubWVyZ2VkLnRvb2x0aXAuZW5hYmxlZH1cbiAgICAgICAgOiB7fSksXG4gICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3csXG4gICAgICAgIC4uLnVubWVyZ2VkPy50b29sdGlwPy5maWVsZHNUb1Nob3dcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMoaW50ZXJhY3Rpb25Db25maWcsIGRhdGFJZDogc3RyaW5nLCBkYXRhSWRUb1JlcGxhY2U6IHN0cmluZykge1xuICBpZiAoaW50ZXJhY3Rpb25Db25maWc/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1tkYXRhSWRdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDoge1xuICAgICAgICAuLi5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLFxuICAgICAgICBmaWVsZHNUb1Nob3c6IHtcbiAgICAgICAgICBbZGF0YUlkVG9SZXBsYWNlXTogaW50ZXJhY3Rpb25Db25maWc/LnRvb2x0aXA/LmZpZWxkc1RvU2hvd1tkYXRhSWRdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBNZXJnZSBzcGxpdE1hcHMgY29uZmlnIHdpdGggY3VycmVudCB2aXNTdGV0ZS5cbiAqIDEuIGlmIGN1cnJlbnQgbWFwIGlzIHNwbGl0LCBidXQgc3BsaXRNYXAgRE9FU05PVCBjb250YWluIG1hcHNcbiAqICAgIDogZG9uJ3QgbWVyZ2UgYW55dGhpbmdcbiAqIDIuIGlmIGN1cnJlbnQgbWFwIGlzIE5PVCBzcGxpdCwgYnV0IHNwbGl0TWFwcyBjb250YWluIG1hcHNcbiAqICAgIDogYWRkIHRvIHNwbGl0TWFwcywgYW5kIGFkZCBjdXJyZW50IGxheWVycyB0byBzcGxpdE1hcHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlU3BsaXRNYXBzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBzcGxpdE1hcHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ3NwbGl0TWFwcyddID0gW11cbik6IFMge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uc3RhdGUuc3BsaXRNYXBzXTtcbiAgY29uc3QgdW5tZXJnZWQgPSBbXTtcbiAgc3BsaXRNYXBzLmZvckVhY2goKHNtLCBpKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNtLmxheWVycyk7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgZW50cmllcy5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgICAvLyBjaGVjayBpZiBsYXllciBleGlzdHNcbiAgICAgICAgY29uc3QgcHVzaFRvID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBpZCkgPyBtZXJnZWQgOiB1bm1lcmdlZDtcblxuICAgICAgICAvLyBjcmVhdGUgbWFwIHBhbmVsIGlmIGN1cnJlbnQgbWFwIGlzIG5vdCBzcGxpdFxuICAgICAgICBwdXNoVG9baV0gPSBwdXNoVG9baV0gfHwge1xuICAgICAgICAgIC8vIGtlZXAgaWRcbiAgICAgICAgICAuLi5zbSxcbiAgICAgICAgICBsYXllcnM6IHB1c2hUbyA9PT0gbWVyZ2VkID8gZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwKHN0YXRlLmxheWVycykgOiBbXVxuICAgICAgICB9O1xuICAgICAgICBwdXNoVG9baV0ubGF5ZXJzID0ge1xuICAgICAgICAgIC4uLnB1c2hUb1tpXS5sYXllcnMsXG4gICAgICAgICAgW2lkXTogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBhcmUgbWVyZ2luZyBpZiB0aGVyZSBhcmUgbm8gbGF5ZXJzIGluIGJvdGggc3BsaXQgbWFwXG4gICAgICBtZXJnZWQucHVzaChzbSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogbWVyZ2VkLFxuICAgIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFsuLi5zdGF0ZS5zcGxpdE1hcHNUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuLyoqXG4gKiBNZXJnZSBlZmZlY3RzIHdpdGggc2F2ZWQgY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVmZmVjdHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGVmZmVjdHM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2VmZmVjdHMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBuZXdFZmZlY3RzID0gW1xuICAgIC4uLnN0YXRlLmVmZmVjdHMsXG4gICAgLi4uKGVmZmVjdHMgfHwgW10pXG4gICAgICAubWFwKGVmZmVjdCA9PiB7XG4gICAgICAgIHJldHVybiBmcm9tQ29uZmlnXG4gICAgICAgICAgPyBjcmVhdGVFZmZlY3QoXG4gICAgICAgICAgICAgIGRlZXBtZXJnZS5hbGwoW1xuICAgICAgICAgICAgICAgIGVmZmVjdCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAvLyBjb2xsYXBzZSBhbGwgcGFuZWxzIHdoZW4gbG9hZGluZyBlZmZlY3RzXG4gICAgICAgICAgICAgICAgICBpc0NvbmZpZ0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiAoZWZmZWN0IGFzIEVmZmVjdFR5cGUpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoZWZmZWN0ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0ICYmIGVmZmVjdC5pc1ZhbGlkVG9TYXZlKCkpO1xuICAgICAgfSlcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzOiBuZXdFZmZlY3RzLFxuICAgIGVmZmVjdE9yZGVyOiBuZXdFZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmlkKVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSB8fCBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddXG4pOiBTIHtcbiAgaWYgKGxheWVyQmxlbmRpbmcgJiYgTEFZRVJfQkxFTkRJTkdTW2xheWVyQmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJCbGVuZGluZ1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogTWVyZ2Ugb3ZlcmxheUJsZW5kaW5nIHdpdGggc2F2ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlT3ZlcmxheUJsZW5kaW5nPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBvdmVybGF5QmxlbmRpbmc6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ292ZXJsYXlCbGVuZGluZyddXG4pOiBTIHtcbiAgaWYgKG92ZXJsYXlCbGVuZGluZyAmJiBPVkVSTEFZX0JMRU5ESU5HU1tvdmVybGF5QmxlbmRpbmddKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgb3ZlcmxheUJsZW5kaW5nXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBNZXJnZSBhbmltYXRpb24gY29uZmlnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUFuaW1hdGlvbkNvbmZpZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYW5pbWF0aW9uOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydhbmltYXRpb25Db25maWcnXVxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm4gLSB2YWxpZGF0ZWQgY29sdW1ucyBvciBudWxsXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBzYXZlZENvbHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0gPSB7fSxcbiAgZW1wdHlDb2xzOiBMYXllckNvbHVtbnMsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGNvbnN0IHJ2ID0gYWxsQ29sRm91bmQgPyBjb2x1bW5zIDogbnVsbDtcbiAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZW1wdHlDb2xzKS5maWx0ZXIoayA9PiAhZW1wdHlDb2xzW2tdLm9wdGlvbmFsKTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IHJlcXVpcmVkQ29sdW1ucy5maWx0ZXIoayA9PiAhY29sdW1ucz8uW2tdLnZhbHVlKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgY29sdW1uczogJHttaXNzaW5nQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdDb2x1bW5zID0gT2JqZWN0LmtleXMoc2F2ZWRDb2xzKTtcbiAgICBjb25zdCBpbnZhbGlkQ29sdW1ucyA9IGNvbmZpZ0NvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXT8udmFsdWUpO1xuICAgIGlmIChpbnZhbGlkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgY29sdW1uczogJHtpbnZhbGlkQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydjtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBsYXllciBjb2x1bW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sdW1uKFxuICBjb2x1bW46IExheWVyQ29sdW1uICYge3ZhbGlkYXRvcj86IHR5cGVvZiB2YWxpZGF0ZUNvbHVtbn0sXG4gIGNvbHVtbnM6IExheWVyQ29sdW1ucyxcbiAgYWxsRmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ11cbik6IGJvb2xlYW4ge1xuICBpZiAoY29sdW1uLm9wdGlvbmFsIHx8IGNvbHVtbi52YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChjb2x1bW4udmFsaWRhdG9yKSB7XG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0b3IoY29sdW1uLCBjb2x1bW5zLCBhbGxGaWVsZHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB0ZXh0IGxhYmVsIGNvbmZpZyB3aXRoIG5ldyBkYXRhXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFRleHRMYWJlbFNjaGVtYVYxXG4gKlxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmaWVsZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzYXZlZFRleHRMYWJlbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICBmaWVsZHMsXG4gIFtsYXllclRleHRMYWJlbF0sXG4gIHNhdmVkVGV4dExhYmVsLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdGV4dCBsYWJlbCBmaWVsZDogJHtKU09OLnN0cmluZ2lmeSh0ZXh0TGFiZWwuZmllbGQpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYXllclRleHRMYWJlbCkucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGtleSA9PT0gJ2ZpZWxkJyA/IGZpZWxkIDogdGV4dExhYmVsW2tleV0gfHwgbGF5ZXJUZXh0TGFiZWxba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHZpc3VhbCBjaGFubmVscyBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBuZXdMYXllcjogTGF5ZXIsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKTogbnVsbCB8IExheWVyIHtcbiAgKE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpIGFzIFZpc3VhbENoYW5uZWxbXSkuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiBmb3VuZEZpZWxkfSA6IHt9KSxcbiAgICAgICAgLi4uKHNhdmVkTGF5ZXIuY29uZmlnW3NjYWxlXSA/IHtbc2NhbGVdOiBzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV19IDoge30pXG4gICAgICB9O1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZvdW5kQ2hhbm5lbCkubGVuZ3RoKSB7XG4gICAgICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKGZvdW5kQ2hhbm5lbCk7XG4gICAgICB9XG5cbiAgICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgICAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNhdmVkTGF5ZXIuY29uZmlnPy5bZmllbGRdPy5uYW1lO1xuICAgICAgICBpZiAoZmllbGROYW1lICYmIGZpZWxkTmFtZSAhPT0gbmV3TGF5ZXIuY29uZmlnW2ZpZWxkXT8ubmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdmlzdWFsIGNoYW5uZWwgZmllbGQ6ICR7ZmllbGR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbnR5cGUgVmFsaWRhdGVMYXllck9wdGlvbiA9IHtcbiAgYWxsb3dFbXB0eUNvbHVtbj86IGJvb2xlYW47XG4gIHRocm93T25FcnJvcj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyQ2xhc3NlczogVmlzU3RhdGVbJ2xheWVyQ2xhc3NlcyddLFxuICBsYXllcnM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIG9wdGlvbnM/OiBWYWxpZGF0ZUxheWVyT3B0aW9uXG4pIHtcbiAgY29uc3QgdmFsaWRhdGVkOiBMYXllcltdID0gW107XG4gIGNvbnN0IGZhaWxlZDogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXTtcblxuICBsYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgbGV0IHZhbGlkYXRlTGF5ZXI6IExheWVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobGF5ZXI/LmNvbmZpZz8uZGF0YUlkKSB7XG4gICAgICBpZiAoZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0pIHtcbiAgICAgICAgLy8gZGF0YXNldHMgYXJlIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHZhbGlkYXRlTGF5ZXIgPSB2YWxpZGF0ZUxheWVyV2l0aERhdGEoXG4gICAgICAgICAgZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0sXG4gICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cblxuLyoqXG4gKiBHZXQgcmVxdWlyZWQgY29sdW1ucyBmb3IgdmFsaWRhdGlvbiBiYXNlZCBvbiBjb2x1bW4gbW9kZVxuICovXG5mdW5jdGlvbiBfZ2V0Q29sdW1uQ29uZmlnRm9yVmFsaWRhdGlvbihuZXdMYXllcikge1xuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBsZXQgY29sdW1uQ29uZmlnID0gbmV3TGF5ZXIuZ2V0TGF5ZXJDb2x1bW5zKCk7XG4gIC8vIGlmIGNvbHVtbk1vZGUgaXMgZGVmaW5lZCwgZmluZCBjb2x1bW4gbW9kZSBjb25maWdcbiAgY29uc3QgY29sTW9kZUNvbmZpZyA9IG5ld0xheWVyLmNvbmZpZy5jb2x1bW5Nb2RlXG4gICAgPyAobmV3TGF5ZXIuc3VwcG9ydGVkQ29sdW1uTW9kZXMgfHwgW10pLmZpbmQoXG4gICAgICAgIGNvbE1vZGUgPT4gY29sTW9kZS5rZXkgPT09IG5ld0xheWVyLmNvbmZpZy5jb2x1bW5Nb2RlXG4gICAgICApXG4gICAgOiBudWxsO1xuXG4gIGlmIChjb2xNb2RlQ29uZmlnKSB7XG4gICAgLy8gb25seSB2YWxpZGF0ZSBjb2x1bW5zIGluIGNvbHVtbiBtb2RlXG4gICAgY29sdW1uQ29uZmlnID0gW1xuICAgICAgLi4uKGNvbE1vZGVDb25maWcucmVxdWlyZWRDb2x1bW5zIHx8IFtdKSxcbiAgICAgIC4uLihjb2xNb2RlQ29uZmlnLm9wdGlvbmFsQ29sdW1ucyB8fCBbXSlcbiAgICBdLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiBjb2x1bW5Db25maWdba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29sdW1uQ29uZmlnO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyV2l0aERhdGEoXG4gIGRhdGFzZXQ6IEtlcGxlclRhYmxlLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllcixcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIG9wdGlvbnM6IFZhbGlkYXRlTGF5ZXJPcHRpb24gPSB7fVxuKTogTGF5ZXIgfCBudWxsIHtcbiAgY29uc3Qge2ZpZWxkcywgaWQ6IGRhdGFJZH0gPSBkYXRhc2V0O1xuICBjb25zdCB7dHlwZX0gPSBzYXZlZExheWVyO1xuICBjb25zdCB7dGhyb3dPbkVycm9yfSA9IG9wdGlvbnM7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllckNsYXNzZXMsIHR5cGUpIHx8ICFzYXZlZExheWVyLmNvbmZpZykge1xuICAgIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdHlwZSBcIiR7dHlwZX1cIiBvciBjb25maWcgaXMgbWlzc2luZ2ApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGNvbHVtbk1vZGU6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbHVtbk1vZGUsXG4gICAgaGlnaGxpZ2h0Q29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmhpZ2hsaWdodENvbG9yXG4gIH0pO1xuXG4gIGNvbnN0IGNvbHVtbkNvbmZpZyA9IF9nZXRDb2x1bW5Db25maWdGb3JWYWxpZGF0aW9uKG5ld0xheWVyKTtcblxuICBpZiAoT2JqZWN0LmtleXMoY29sdW1uQ29uZmlnKSkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICAgICAgZmllbGRzLFxuICAgICAgc2F2ZWRMYXllci5jb25maWcuY29sdW1ucyxcbiAgICAgIGNvbHVtbkNvbmZpZyxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgICAuLi5uZXdMYXllci5jb25maWcuY29sdW1ucyxcbiAgICAgICAgICAuLi5jb2x1bW5zXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGV4dExhYmVsID1cbiAgICBzYXZlZExheWVyLmNvbmZpZy50ZXh0TGFiZWwgJiYgbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbFxuICAgICAgPyB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICBuZXdMYXllci5jb25maWcudGV4dExhYmVsLFxuICAgICAgICAgIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbCxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IGNvcGllZFZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7XG4gICAgICBzaGFsbG93Q29weTogWydjb2xvclJhbmdlJywgJ3N0cm9rZUNvbG9yUmFuZ2UnXVxuICAgIH1cbiAgKTtcblxuICAvLyBjYWxsIGxheWVyIG1ldGhvZHMgdG8gdmFsaWRhdGUgdmlzQ29uZmlnIHdoZW4gc3dpdGNoaW5nIGRhdGFzZXRcbiAgY29uc3QgdmlzQ29uZmlnID0gbmV3TGF5ZXIudmFsaWRhdGVWaXNDb25maWdcbiAgICA/IG5ld0xheWVyLnZhbGlkYXRlVmlzQ29uZmlnKGRhdGFzZXQsIGNvcGllZFZpc0NvbmZpZylcbiAgICA6IGNvcGllZFZpc0NvbmZpZztcblxuICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgdmlzQ29uZmlnLFxuICAgIHRleHRMYWJlbFxuICB9KTtcblxuICAvLyB2aXN1YWwgY2hhbm5lbCBmaWVsZCBpcyBzYXZlZCB0byBiZSB7bmFtZSwgdHlwZX1cbiAgLy8gZmluZCB2aXN1YWwgY2hhbm5lbCBmaWVsZCBieSBtYXRjaGluZyBib3RoIG5hbWUgYW5kIHR5cGVcbiAgLy8gcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBWaXN1YWxDaGFubmVsU2NoZW1hVjFcbiAgbmV3TGF5ZXIgPSB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoZmllbGRzLCBuZXdMYXllciwgc2F2ZWRMYXllciwgb3B0aW9ucyk7XG5cbiAgaWYgKHRocm93T25FcnJvcikge1xuICAgIGlmICghbmV3TGF5ZXIuaXNWYWxpZFRvU2F2ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGlzIG5vdCB2YWxpZCB0byBzYXZlOiAke25ld0xheWVyLmlkfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdMYXllcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRWRpdG9yPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIHNhdmVkRWRpdG9yOiBTYXZlZEVkaXRvcikge1xuICBpZiAoIXNhdmVkRWRpdG9yKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBmZWF0dXJlczogWy4uLnN0YXRlLmVkaXRvci5mZWF0dXJlcywgLi4uKHNhdmVkRWRpdG9yLmZlYXR1cmVzIHx8IFtdKV0sXG4gICAgICAvLyBpZiBzYXZlZEVkaXRvci52aXNpYmxlIGlzIHVuZGVmaW5lZCBrZWVwIHN0YXRlLmVkaXRvci52aXNpYmxlXG4gICAgICB2aXNpYmxlOiBzYXZlZEVkaXRvci52aXNpYmxlID8/IHN0YXRlLmVkaXRvci52aXNpYmxlXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogdXBkYXRlIGZpZWxkSWR4IGJhc2VkIG9uIG5ldyBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRGF0YXNldHNCeU9yZGVyKHN0YXRlOiBWaXNTdGF0ZSwgbmV3RGF0YUVudHJpZXM6IERhdGFzZXRzKTogRGF0YXNldHMge1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuZGF0YXNldHMsXG4gICAgLi4ubmV3RGF0YUVudHJpZXNcbiAgfTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlcikpIHtcbiAgICAvLyBwcmVzZXJ2ZURhdGFzZXRPcmRlciAgbWlnaHQgbm90IGluY2x1ZGUgdGhlICBuZXcgZGF0YXNldHNcbiAgICBjb25zdCBuZXdEYXRhc2V0SWRzID0gT2JqZWN0LmtleXMobWVyZ2VkKS5maWx0ZXIoXG4gICAgICBpZCA9PiAhc3RhdGUucHJlc2VydmVEYXRhc2V0T3JkZXI/LmluY2x1ZGVzKGlkKVxuICAgICk7XG4gICAgcmV0dXJuIFsuLi5zdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlciwgLi4ubmV3RGF0YXNldElkc10ucmVkdWNlKFxuICAgICAgKGFjY3UsIGRhdGFJZCkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgLi4uKG1lcmdlZFtkYXRhSWRdID8ge1tkYXRhSWRdOiBtZXJnZWRbZGF0YUlkXX0gOiB7fSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZXhwb3J0IGNvbnN0IFZJU19TVEFURV9NRVJHRVJTOiBWaXNTdGF0ZU1lcmdlcnM8YW55PiA9IFtcbiAge1xuICAgIG1lcmdlOiBtZXJnZUxheWVycyxcbiAgICBwcm9wOiAnbGF5ZXJzJyxcbiAgICB0b01lcmdlUHJvcDogJ2xheWVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlTGF5ZXJPcmRlcidcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUZpbHRlcnMsXG4gICAgcHJvcDogJ2ZpbHRlcnMnLFxuICAgIHRvTWVyZ2VQcm9wOiAnZmlsdGVyVG9CZU1lcmdlZCcsXG4gICAgcHJlc2VydmVPcmRlcjogJ3ByZXNlcnZlRmlsdGVyT3JkZXInLFxuICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzOiByZXBsYWNlRmlsdGVyRGF0YXNldElkc1xuICB9LFxuICB7XG4gICAgbWVyZ2U6IG1lcmdlRWZmZWN0cyxcbiAgICBwcm9wOiAnZWZmZWN0cydcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUludGVyYWN0aW9ucyxcbiAgICBwcm9wOiAnaW50ZXJhY3Rpb25Db25maWcnLFxuICAgIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJyxcbiAgICByZXBsYWNlUGFyZW50RGF0YXNldElkczogcmVwbGFjZUludGVyYWN0aW9uRGF0YXNldElkcyxcbiAgICBzYXZlVW5tZXJnZWQ6IHNhdmVkVW5tZXJnZWRJbnRlcmFjdGlvblxuICB9LFxuICB7bWVyZ2U6IG1lcmdlTGF5ZXJCbGVuZGluZywgcHJvcDogJ2xheWVyQmxlbmRpbmcnfSxcbiAge21lcmdlOiBtZXJnZU92ZXJsYXlCbGVuZGluZywgcHJvcDogJ292ZXJsYXlCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfSxcbiAge21lcmdlOiBtZXJnZUVkaXRvciwgcHJvcDogJ2VkaXRvcid9XG5dO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxRQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFTQSxJQUFBSyxRQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFlQSxJQUFBUSxNQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxXQUFBLEdBQUFULE9BQUE7QUFBc0QsSUFBQVUsU0FBQTtBQUFBLFNBQUFDLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUss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
|