@kepler.gl/reducers 3.0.0-alpha.0 → 3.0.0-alpha.1

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.
Files changed (41) hide show
  1. package/dist/combined-updaters.d.ts +30 -1
  2. package/dist/combined-updaters.js +222 -4
  3. package/dist/composer-helpers.d.ts +7 -4
  4. package/dist/composer-helpers.js +18 -9
  5. package/dist/composers.d.ts +6 -0
  6. package/dist/composers.js +3 -3
  7. package/dist/core.d.ts +1 -1
  8. package/dist/core.js +16 -6
  9. package/dist/data-utils.js +2 -3
  10. package/dist/export-utils.js +2 -2
  11. package/dist/index.d.ts +2 -3
  12. package/dist/index.js +37 -16
  13. package/dist/interaction-utils.d.ts +1 -5
  14. package/dist/interaction-utils.js +5 -10
  15. package/dist/layer-utils.d.ts +39 -10
  16. package/dist/layer-utils.js +110 -35
  17. package/dist/map-state-updaters.d.ts +33 -2
  18. package/dist/map-state-updaters.js +278 -19
  19. package/dist/map-state.d.ts +74 -2
  20. package/dist/map-state.js +3 -3
  21. package/dist/map-style-updaters.d.ts +30 -17
  22. package/dist/map-style-updaters.js +303 -84
  23. package/dist/map-style.js +3 -3
  24. package/dist/merger-handler.d.ts +10 -0
  25. package/dist/merger-handler.js +143 -0
  26. package/dist/middleware.js +2 -2
  27. package/dist/provider-state-updaters.js +2 -2
  28. package/dist/provider-state.js +2 -2
  29. package/dist/root.d.ts +1 -8
  30. package/dist/root.js +25 -11
  31. package/dist/ui-state-updaters.d.ts +9 -2
  32. package/dist/ui-state-updaters.js +88 -63
  33. package/dist/ui-state.js +3 -3
  34. package/dist/vis-state-merger.d.ts +47 -13
  35. package/dist/vis-state-merger.js +393 -107
  36. package/dist/vis-state-selectors.js +2 -2
  37. package/dist/vis-state-updaters.d.ts +136 -10
  38. package/dist/vis-state-updaters.js +924 -262
  39. package/dist/vis-state.d.ts +210 -2
  40. package/dist/vis-state.js +3 -3
  41. package/package.json +20 -18
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
1
+ // Copyright (c) 2023 Uber Technologies, Inc.
2
2
  //
3
3
  // Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  // of this software and associated documentation files (the "Software"), to deal
@@ -26,14 +26,20 @@ Object.defineProperty(exports, "__esModule", {
26
26
  value: true
27
27
  });
28
28
  exports.mergeFilters = mergeFilters;
29
+ exports.replaceFilterDatasetIds = replaceFilterDatasetIds;
30
+ exports.isSavedLayerConfigV1 = isSavedLayerConfigV1;
31
+ exports.parseLayerConfig = parseLayerConfig;
29
32
  exports.createLayerFromConfig = createLayerFromConfig;
30
33
  exports.serializeLayer = serializeLayer;
34
+ exports.serializeVisState = serializeVisState;
31
35
  exports.mergeLayers = mergeLayers;
32
36
  exports.insertLayerAtRightOrder = insertLayerAtRightOrder;
33
37
  exports.mergeInteractions = mergeInteractions;
34
38
  exports.mergeSplitMaps = mergeSplitMaps;
39
+ exports.mergeEffects = mergeEffects;
35
40
  exports.mergeInteractionTooltipConfig = mergeInteractionTooltipConfig;
36
41
  exports.mergeLayerBlending = mergeLayerBlending;
42
+ exports.mergeOverlayBlending = mergeOverlayBlending;
37
43
  exports.mergeAnimationConfig = mergeAnimationConfig;
38
44
  exports.validateSavedLayerColumns = validateSavedLayerColumns;
39
45
  exports.validateColumn = validateColumn;
@@ -41,17 +47,18 @@ exports.validateSavedTextLabel = validateSavedTextLabel;
41
47
  exports.validateSavedVisualChannels = validateSavedVisualChannels;
42
48
  exports.validateLayersByDatasets = validateLayersByDatasets;
43
49
  exports.validateLayerWithData = validateLayerWithData;
44
- exports.isValidMerger = isValidMerger;
50
+ exports.mergeEditor = mergeEditor;
51
+ exports.mergeDatasetsByOrder = mergeDatasetsByOrder;
45
52
  exports.VIS_STATE_MERGERS = void 0;
46
53
 
47
54
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
48
55
 
49
56
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
50
57
 
51
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
52
-
53
58
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
54
59
 
60
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
61
+
55
62
  var _lodash = _interopRequireDefault(require("lodash.uniq"));
56
63
 
57
64
  var _lodash2 = _interopRequireDefault(require("lodash.pick"));
@@ -60,6 +67,10 @@ var _lodash3 = _interopRequireDefault(require("lodash.flattendeep"));
60
67
 
61
68
  var _utils = require("@kepler.gl/utils");
62
69
 
70
+ var _reducers = require("@kepler.gl/reducers");
71
+
72
+ var _effects = require("@kepler.gl/effects");
73
+
63
74
  var _constants = require("@kepler.gl/constants");
64
75
 
65
76
  var _schemas = require("@kepler.gl/schemas");
@@ -82,6 +93,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
82
93
  *
83
94
  */
84
95
  function mergeFilters(state, filtersToMerge, fromConfig) {
96
+ var preserveFilterOrder = fromConfig ? filtersToMerge === null || filtersToMerge === void 0 ? void 0 : filtersToMerge.map(function (l) {
97
+ return l.id;
98
+ }) : state.preserveFilterOrder;
99
+
85
100
  if (!Array.isArray(filtersToMerge) || !filtersToMerge.length) {
86
101
  return state;
87
102
  }
@@ -89,10 +104,10 @@ function mergeFilters(state, filtersToMerge, fromConfig) {
89
104
  var _validateFiltersUpdat = (0, _utils.validateFiltersUpdateDatasets)(state, filtersToMerge),
90
105
  validated = _validateFiltersUpdat.validated,
91
106
  failed = _validateFiltersUpdat.failed,
92
- updatedDatasets = _validateFiltersUpdat.updatedDatasets; // merge filter with existing
107
+ updatedDatasets = _validateFiltersUpdat.updatedDatasets;
93
108
 
109
+ var updatedFilters = insertItemBasedOnPreservedOrder(state.filters, validated, preserveFilterOrder); // merge filter with existing
94
110
 
95
- var updatedFilters = [].concat((0, _toConsumableArray2["default"])(state.filters || []), (0, _toConsumableArray2["default"])(validated));
96
111
  updatedFilters = (0, _table.resetFilterGpuMode)(updatedFilters);
97
112
  updatedFilters = (0, _table.assignGpuChannels)(updatedFilters); // filter data
98
113
 
@@ -103,13 +118,109 @@ function mergeFilters(state, filtersToMerge, fromConfig) {
103
118
  return _objectSpread(_objectSpread({}, state), {}, {
104
119
  filters: updatedFilters,
105
120
  datasets: filtered,
121
+ preserveFilterOrder: preserveFilterOrder,
106
122
  filterToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.filterToBeMerged), (0, _toConsumableArray2["default"])(failed))
107
123
  });
124
+ } // replace dataId in saved Filter
125
+
126
+
127
+ function replaceFilterDatasetIds(savedFilter, dataId, dataIdToUse) {
128
+ var replaced = [];
129
+ savedFilter.forEach(function (filter) {
130
+ if (filter.dataId.includes(dataId)) {
131
+ var newDataId = filter.dataId.map(function (d) {
132
+ return d === dataId ? dataIdToUse : d;
133
+ });
134
+ replaced.push(_objectSpread(_objectSpread({}, filter), {}, {
135
+ dataId: newDataId
136
+ }));
137
+ }
138
+ });
139
+ return replaced.length ? replaced : null;
140
+ }
141
+
142
+ function isSavedLayerConfigV1(layerConfig) {
143
+ // exported layer configuration contains visualChannels property
144
+ return layerConfig === null || layerConfig === void 0 ? void 0 : layerConfig.visualChannels;
145
+ }
146
+
147
+ function parseLayerConfig(schema, layerConfig) {
148
+ var _schema$parseSavedCon, _schema$parseSavedCon2, _schema$parseSavedCon3;
149
+
150
+ // assume the layer config is current version
151
+ var savedConfig = {
152
+ version: _schemas.CURRENT_VERSION,
153
+ config: {
154
+ visState: {
155
+ layers: [layerConfig],
156
+ layerOrder: [layerConfig.id]
157
+ }
158
+ }
159
+ };
160
+ return (_schema$parseSavedCon = schema.parseSavedConfig(savedConfig)) === null || _schema$parseSavedCon === void 0 ? void 0 : (_schema$parseSavedCon2 = _schema$parseSavedCon.visState) === null || _schema$parseSavedCon2 === void 0 ? void 0 : (_schema$parseSavedCon3 = _schema$parseSavedCon2.layers) === null || _schema$parseSavedCon3 === void 0 ? void 0 : _schema$parseSavedCon3[0];
161
+ }
162
+
163
+ function insertItemBasedOnPreservedOrder(currentItems, items) {
164
+ var preservedOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
165
+ var defaultStart = arguments.length > 3 ? arguments[3] : undefined;
166
+ var newItems = (0, _toConsumableArray2["default"])(currentItems);
167
+
168
+ var _iterator = _createForOfIteratorHelper(items),
169
+ _step;
170
+
171
+ try {
172
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
173
+ var item = _step.value;
174
+ var expectedIdx = preservedOrder.indexOf(item.id); // insertAt the end by default
175
+
176
+ var insertAt = defaultStart ? 0 : newItems.length;
177
+
178
+ if (expectedIdx > 0) {
179
+ // look for layer to insert after
180
+ var i = expectedIdx + 1;
181
+ var preceedIdx = -1;
182
+
183
+ var _loop = function _loop() {
184
+ // keep looking for preceed layer that is already loaded
185
+ var preceedItemId = preservedOrder[i - 1];
186
+ preceedIdx = newItems.findIndex(function (d) {
187
+ return d.id === preceedItemId;
188
+ });
189
+ };
190
+
191
+ while (i-- > 0 && preceedIdx < 0) {
192
+ _loop();
193
+ }
194
+
195
+ if (preceedIdx > -1) {
196
+ // if found
197
+ insertAt = preceedIdx + 1;
198
+ }
199
+ }
200
+
201
+ newItems = (0, _utils.arrayInsert)(newItems, insertAt, item);
202
+ }
203
+ } catch (err) {
204
+ _iterator.e(err);
205
+ } finally {
206
+ _iterator.f();
207
+ }
208
+
209
+ return newItems;
108
210
  }
109
211
 
110
212
  function createLayerFromConfig(state, layerConfig) {
111
- // first validate config against dataset
112
- var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [layerConfig]),
213
+ // check if the layer config is parsed
214
+ var parsedLayerConfig = isSavedLayerConfigV1(layerConfig) ? parseLayerConfig(state.schema, layerConfig) : layerConfig;
215
+
216
+ if (!parsedLayerConfig) {
217
+ return null;
218
+ } // first validate config against dataset
219
+
220
+
221
+ var _validateLayersByData = validateLayersByDatasets(state.datasets, state.layerClasses, [parsedLayerConfig], {
222
+ allowEmptyColumn: true
223
+ }),
113
224
  validated = _validateLayersByData.validated,
114
225
  failed = _validateLayersByData.failed;
115
226
 
@@ -122,19 +233,32 @@ function createLayerFromConfig(state, layerConfig) {
122
233
  newLayer.updateLayerDomain(state.datasets);
123
234
  return newLayer;
124
235
  }
236
+ /**
237
+ * Get loaded layer from state
238
+ */
125
239
 
126
- function serializeLayer(newLayer) {
127
- var _visStateSchema$CURRE, _visStateSchema$CURRE2;
128
240
 
129
- var savedVisState = _schemas.visStateSchema[_schemas.CURRENT_VERSION].save( // @ts-expect-error not all expected properties are provided
130
- {
241
+ function serializeLayer(newLayer, schema) {
242
+ var _serializedVisState$l;
243
+
244
+ var serializedVisState = serializeVisState({
131
245
  layers: [newLayer],
132
- layerOrder: [0]
133
- }).visState;
246
+ layerOrder: [newLayer.id]
247
+ }, schema);
248
+ return serializedVisState === null || serializedVisState === void 0 ? void 0 : (_serializedVisState$l = serializedVisState.layers) === null || _serializedVisState$l === void 0 ? void 0 : _serializedVisState$l[0];
249
+ }
250
+ /**
251
+ * Get vis state config
252
+ */
253
+
134
254
 
135
- var loadedLayer = (_visStateSchema$CURRE = _schemas.visStateSchema[_schemas.CURRENT_VERSION].load(savedVisState).visState) === null || _visStateSchema$CURRE === void 0 ? void 0 : (_visStateSchema$CURRE2 = _visStateSchema$CURRE.layers) === null || _visStateSchema$CURRE2 === void 0 ? void 0 : _visStateSchema$CURRE2[0]; // @ts-expect-error
255
+ function serializeVisState(visState, schema) {
256
+ var _schema$parseSavedCon4;
136
257
 
137
- return loadedLayer;
258
+ var savedState = schema.getConfigToSave({
259
+ visState: visState
260
+ });
261
+ return savedState ? (_schema$parseSavedCon4 = schema.parseSavedConfig(savedState)) === null || _schema$parseSavedCon4 === void 0 ? void 0 : _schema$parseSavedCon4.visState : undefined;
138
262
  }
139
263
  /**
140
264
  * Merge layers from de-serialized state, if no fields or data are loaded
@@ -146,21 +270,32 @@ function serializeLayer(newLayer) {
146
270
  function mergeLayers(state) {
147
271
  var layersToMerge = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
148
272
  var fromConfig = arguments.length > 2 ? arguments[2] : undefined;
149
- var preserveLayerOrder = fromConfig ? layersToMerge.map(function (l) {
150
- return l.id;
151
- }) : state.preserveLayerOrder;
273
+ var preserveLayerOrder = fromConfig ? (0, _reducers.getLayerOrderFromLayers)(layersToMerge) : state.preserveLayerOrder;
152
274
 
153
275
  if (!Array.isArray(layersToMerge) || !layersToMerge.length) {
154
276
  return state;
155
- }
277
+ } // don't merge layer if dataset is being merged
278
+
279
+
280
+ var unmerged = [];
281
+ var toMerge = [];
282
+ layersToMerge.forEach(function (l) {
283
+ var _l$config;
284
+
285
+ if (l !== null && l !== void 0 && (_l$config = l.config) !== null && _l$config !== void 0 && _l$config.dataId && state.isMergingDatasets[l.config.dataId]) {
286
+ unmerged.push(l);
287
+ } else {
288
+ toMerge.push(l);
289
+ }
290
+ });
156
291
 
157
- var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, layersToMerge),
292
+ var _validateLayersByData2 = validateLayersByDatasets(state.datasets, state.layerClasses, toMerge),
158
293
  mergedLayer = _validateLayersByData2.validated,
159
- unmerged = _validateLayersByData2.failed; // put new layers in front of current layers
294
+ failed = _validateLayersByData2.failed;
160
295
 
296
+ unmerged.push.apply(unmerged, (0, _toConsumableArray2["default"])(failed)); // put new layers in front of current layers
161
297
 
162
- var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, // @ts-expect-error
163
- preserveLayerOrder),
298
+ var _insertLayerAtRightOr = insertLayerAtRightOrder(state.layers, mergedLayer, state.layerOrder, preserveLayerOrder),
164
299
  newLayerOrder = _insertLayerAtRightOr.newLayerOrder,
165
300
  newLayers = _insertLayerAtRightOr.newLayers;
166
301
 
@@ -168,63 +303,31 @@ function mergeLayers(state) {
168
303
  layers: newLayers,
169
304
  layerOrder: newLayerOrder,
170
305
  preserveLayerOrder: preserveLayerOrder,
171
- layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), (0, _toConsumableArray2["default"])(unmerged))
306
+ layerToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.layerToBeMerged), unmerged)
172
307
  });
173
308
  }
174
309
 
175
310
  function insertLayerAtRightOrder(currentLayers, layersToInsert, currentOrder) {
176
311
  var preservedOrder = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
177
- // perservedOrder ['a', 'b', 'c'];
178
- // layerOrder [1, 0, 3]
179
- // layerOrderMap ['a', 'c']
180
- var layerOrderQueue = currentOrder.map(function (i) {
181
- return currentLayers[i].id;
182
- });
183
- var newLayers = currentLayers;
184
-
185
- var _iterator = _createForOfIteratorHelper(layersToInsert),
186
- _step;
187
-
188
- try {
189
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
190
- var newLayer = _step.value;
191
- // find where to insert it
192
- var expectedIdx = preservedOrder.indexOf(newLayer.id); // if cant find place to insert, insert at the front
193
-
194
- var insertAt = 0;
195
312
 
196
- if (expectedIdx > 0) {
197
- // look for layer to insert after
198
- var i = expectedIdx + 1;
199
- var preceedIdx = -1;
200
-
201
- while (i-- > 0 && preceedIdx < 0) {
202
- // keep looking for preceed layer that is already loaded
203
- var preceedLayer = preservedOrder[i - 1];
204
- preceedIdx = layerOrderQueue.indexOf(preceedLayer);
205
- }
206
-
207
- if (preceedIdx > -1) {
208
- // if found
209
- insertAt = preceedIdx + 1;
210
- }
211
- }
212
-
213
- layerOrderQueue = (0, _utils.arrayInsert)(layerOrderQueue, insertAt, newLayer.id);
214
- newLayers = newLayers.concat(newLayer);
215
- } // reconstruct layerOrder after insert
313
+ if (!(layersToInsert !== null && layersToInsert !== void 0 && layersToInsert.length)) {
314
+ return {
315
+ newLayers: currentLayers,
316
+ newLayerOrder: currentOrder
317
+ };
318
+ } // perservedOrder ['a', 'b', 'c'];
319
+ // layerOrder ['a', 'b', 'c']
216
320
 
217
- } catch (err) {
218
- _iterator.e(err);
219
- } finally {
220
- _iterator.f();
221
- }
222
321
 
223
- var newLayerOrder = layerOrderQueue.map(function (id) {
224
- return newLayers.findIndex(function (l) {
225
- return l.id === id;
226
- });
322
+ var currentLayerQueue = currentOrder.map(function (id) {
323
+ return (0, _utils.findById)(id)(currentLayers);
324
+ }).filter(function (layer) {
325
+ return Boolean(layer);
227
326
  });
327
+ var newLayers = currentLayers.concat(layersToInsert);
328
+ var newLayerOrderQueue = insertItemBasedOnPreservedOrder(currentLayerQueue, layersToInsert, preservedOrder, true); // reconstruct layerOrder after insert
329
+
330
+ var newLayerOrder = (0, _reducers.getLayerOrderFromLayers)(newLayerOrderQueue);
228
331
  return {
229
332
  newLayerOrder: newLayerOrder,
230
333
  newLayers: newLayers
@@ -281,10 +384,44 @@ function mergeInteractions(state, interactionToBeMerged, fromConfig) {
281
384
  });
282
385
  }
283
386
 
284
- return _objectSpread(_objectSpread({}, state), {}, {
387
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
285
388
  interactionConfig: _objectSpread(_objectSpread({}, state.interactionConfig), merged),
286
- interactionToBeMerged: unmerged
389
+ interactionToBeMerged: savedUnmergedInteraction(state, unmerged)
287
390
  });
391
+
392
+ return nextState;
393
+ }
394
+
395
+ function savedUnmergedInteraction(state, unmerged) {
396
+ var _unmerged$tooltip, _unmerged$tooltip2, _state$interactionToB, _state$interactionToB2, _unmerged$tooltip3;
397
+
398
+ if (!(unmerged !== null && unmerged !== void 0 && (_unmerged$tooltip = unmerged.tooltip) !== null && _unmerged$tooltip !== void 0 && _unmerged$tooltip.fieldsToShow)) {
399
+ return state.interactionToBeMerged;
400
+ }
401
+
402
+ return {
403
+ tooltip: _objectSpread(_objectSpread(_objectSpread({}, state.interactionToBeMerged.tooltip), typeof (unmerged === null || unmerged === void 0 ? void 0 : (_unmerged$tooltip2 = unmerged.tooltip) === null || _unmerged$tooltip2 === void 0 ? void 0 : _unmerged$tooltip2.enabled) === 'boolean' ? {
404
+ enabled: unmerged.tooltip.enabled
405
+ } : {}), {}, {
406
+ fieldsToShow: _objectSpread(_objectSpread({}, (_state$interactionToB = state.interactionToBeMerged) === null || _state$interactionToB === void 0 ? void 0 : (_state$interactionToB2 = _state$interactionToB.tooltip) === null || _state$interactionToB2 === void 0 ? void 0 : _state$interactionToB2.fieldsToShow), unmerged === null || unmerged === void 0 ? void 0 : (_unmerged$tooltip3 = unmerged.tooltip) === null || _unmerged$tooltip3 === void 0 ? void 0 : _unmerged$tooltip3.fieldsToShow)
407
+ })
408
+ };
409
+ }
410
+
411
+ function replaceInteractionDatasetIds(interactionConfig, dataId, dataIdToReplace) {
412
+ var _interactionConfig$to;
413
+
414
+ if (interactionConfig !== null && interactionConfig !== void 0 && (_interactionConfig$to = interactionConfig.tooltip) !== null && _interactionConfig$to !== void 0 && _interactionConfig$to.fieldsToShow[dataId]) {
415
+ var _interactionConfig$to2;
416
+
417
+ return _objectSpread(_objectSpread({}, interactionConfig), {}, {
418
+ tooltip: _objectSpread(_objectSpread({}, interactionConfig.tooltip), {}, {
419
+ fieldsToShow: (0, _defineProperty2["default"])({}, dataIdToReplace, interactionConfig === null || interactionConfig === void 0 ? void 0 : (_interactionConfig$to2 = interactionConfig.tooltip) === null || _interactionConfig$to2 === void 0 ? void 0 : _interactionConfig$to2.fieldsToShow[dataId])
420
+ })
421
+ });
422
+ }
423
+
424
+ return null;
288
425
  }
289
426
  /**
290
427
  * Merge splitMaps config with current visStete.
@@ -301,27 +438,58 @@ function mergeSplitMaps(state) {
301
438
  var merged = (0, _toConsumableArray2["default"])(state.splitMaps);
302
439
  var unmerged = [];
303
440
  splitMaps.forEach(function (sm, i) {
304
- Object.entries(sm.layers).forEach(function (_ref2) {
305
- var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
306
- id = _ref3[0],
307
- value = _ref3[1];
308
-
309
- // check if layer exists
310
- var pushTo = state.layers.find(function (l) {
311
- return l.id === id;
312
- }) ? merged : unmerged; // create map panel if current map is not split
313
-
314
- pushTo[i] = pushTo[i] || {
315
- layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
316
- };
317
- pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
318
- });
441
+ var entries = Object.entries(sm.layers);
442
+
443
+ if (entries.length > 0) {
444
+ entries.forEach(function (_ref2) {
445
+ var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
446
+ id = _ref3[0],
447
+ value = _ref3[1];
448
+
449
+ // check if layer exists
450
+ var pushTo = state.layers.find(function (l) {
451
+ return l.id === id;
452
+ }) ? merged : unmerged; // create map panel if current map is not split
453
+
454
+ pushTo[i] = pushTo[i] || {
455
+ layers: pushTo === merged ? (0, _utils.getInitialMapLayersForSplitMap)(state.layers) : []
456
+ };
457
+ pushTo[i].layers = _objectSpread(_objectSpread({}, pushTo[i].layers), {}, (0, _defineProperty2["default"])({}, id, value));
458
+ });
459
+ } else {
460
+ // We are merging if there are no layers in both split map
461
+ merged.push(sm);
462
+ }
319
463
  });
320
464
  return _objectSpread(_objectSpread({}, state), {}, {
321
465
  splitMaps: merged,
322
466
  splitMapsToBeMerged: [].concat((0, _toConsumableArray2["default"])(state.splitMapsToBeMerged), unmerged)
323
467
  });
324
468
  }
469
+ /**
470
+ * Merge effects with saved config
471
+ */
472
+
473
+
474
+ function mergeEffects(state, effects, fromConfig) {
475
+ var newEffects = [].concat((0, _toConsumableArray2["default"])(state.effects), (0, _toConsumableArray2["default"])((effects || []).map(function (effect) {
476
+ return fromConfig ? // collapse all panels when loading effects
477
+ (0, _effects.createDeckEffectFromConfig)( // @ts-expect-error
478
+ (0, _utils.mergeEffectParams)(effect, {
479
+ config: {
480
+ isConfigActive: false
481
+ }
482
+ })) : effect;
483
+ }).filter(function (effect) {
484
+ return Boolean(effect && effect.isValidToSave());
485
+ })));
486
+ return _objectSpread(_objectSpread({}, state), {}, {
487
+ effects: newEffects,
488
+ effectOrder: newEffects.map(function (effect) {
489
+ return effect.id;
490
+ })
491
+ });
492
+ }
325
493
  /**
326
494
  * Merge interactionConfig.tooltip with saved config,
327
495
  * validate fieldsToShow
@@ -345,7 +513,7 @@ function mergeInteractionTooltipConfig(state) {
345
513
  }
346
514
 
347
515
  for (var dataId in tooltipConfig.fieldsToShow) {
348
- if (!state.datasets[dataId]) {
516
+ if (!state.datasets[dataId] || state.isMergingDatasets[dataId]) {
349
517
  // is not yet loaded
350
518
  unmergedTooltip[dataId] = tooltipConfig.fieldsToShow[dataId];
351
519
  } else {
@@ -382,6 +550,20 @@ function mergeLayerBlending(state, layerBlending, fromConfig) {
382
550
 
383
551
  return state;
384
552
  }
553
+ /**
554
+ * Merge overlayBlending with saved
555
+ */
556
+
557
+
558
+ function mergeOverlayBlending(state, overlayBlending, fromConfig) {
559
+ if (overlayBlending && _constants.OVERLAY_BLENDINGS[overlayBlending]) {
560
+ return _objectSpread(_objectSpread({}, state), {}, {
561
+ overlayBlending: overlayBlending
562
+ });
563
+ }
564
+
565
+ return state;
566
+ }
385
567
  /**
386
568
  * Merge animation config
387
569
  */
@@ -405,6 +587,7 @@ function mergeAnimationConfig(state, animation, fromConfig) {
405
587
  * @param fields
406
588
  * @param savedCols
407
589
  * @param emptyCols
590
+ * @param options
408
591
  * @return - validated columns or null
409
592
  */
410
593
 
@@ -412,10 +595,11 @@ function mergeAnimationConfig(state, animation, fromConfig) {
412
595
  function validateSavedLayerColumns(fields) {
413
596
  var savedCols = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
414
597
  var emptyCols = arguments.length > 2 ? arguments[2] : undefined;
598
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
415
599
  // Prepare columns for the validator
416
600
  var columns = {};
417
601
 
418
- var _loop = function _loop() {
602
+ var _loop2 = function _loop2() {
419
603
  var key = _Object$keys[_i];
420
604
  columns[key] = _objectSpread({}, emptyCols[key]);
421
605
  var saved = savedCols[key];
@@ -435,19 +619,40 @@ function validateSavedLayerColumns(fields) {
435
619
  };
436
620
 
437
621
  for (var _i = 0, _Object$keys = Object.keys(emptyCols); _i < _Object$keys.length; _i++) {
438
- _loop();
622
+ _loop2();
439
623
  } // find actual column fieldIdx, in case it has changed
440
624
 
441
625
 
442
626
  var allColFound = Object.keys(columns).every(function (key) {
443
627
  return validateColumn(columns[key], columns, fields);
444
628
  });
629
+ var rv = allColFound ? columns : null;
630
+
631
+ if (options.throwOnError) {
632
+ var requiredColumns = Object.keys(emptyCols).filter(function (k) {
633
+ return !emptyCols[k].optional;
634
+ });
635
+ var missingColumns = requiredColumns.filter(function (k) {
636
+ return !(columns !== null && columns !== void 0 && columns[k].value);
637
+ });
638
+
639
+ if (missingColumns.length) {
640
+ throw new Error("Layer has missing or invalid columns: ".concat(missingColumns.join(', ')));
641
+ }
445
642
 
446
- if (allColFound) {
447
- return columns;
643
+ var configColumns = Object.keys(savedCols);
644
+ var invalidColumns = configColumns.filter(function (k) {
645
+ var _columns$k;
646
+
647
+ return !(columns !== null && columns !== void 0 && (_columns$k = columns[k]) !== null && _columns$k !== void 0 && _columns$k.value);
648
+ });
649
+
650
+ if (invalidColumns.length) {
651
+ throw new Error("Layer has invalid columns: ".concat(invalidColumns.join(', ')));
652
+ }
448
653
  }
449
654
 
450
- return null;
655
+ return rv;
451
656
  }
452
657
 
453
658
  function validateColumn(column, columns, allFields) {
@@ -467,6 +672,7 @@ function validateColumn(column, columns, allFields) {
467
672
  *
468
673
  * @param {Array<Object>} fields
469
674
  * @param {Object} savedTextLabel
675
+ * @param {Object} options
470
676
  * @return {Object} - validated textlabel
471
677
  */
472
678
 
@@ -475,6 +681,7 @@ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
475
681
  var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
476
682
  layerTextLabel = _ref6[0];
477
683
 
684
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
478
685
  var savedTextLabels = Array.isArray(savedTextLabel) ? savedTextLabel : [savedTextLabel]; // validate field
479
686
 
480
687
  return savedTextLabels.map(function (textLabel) {
@@ -483,6 +690,11 @@ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
483
690
  return textLabel.field[key] === fd[key];
484
691
  });
485
692
  }) : null;
693
+
694
+ if (field === undefined && options.throwOnError) {
695
+ throw new Error("Layer has invalid text label field: ".concat(JSON.stringify(textLabel.field)));
696
+ }
697
+
486
698
  return Object.keys(layerTextLabel).reduce(function (accu, key) {
487
699
  return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, key === 'field' ? field : textLabel[key] || layerTextLabel[key]));
488
700
  }, {});
@@ -495,6 +707,7 @@ function validateSavedTextLabel(fields, _ref5, savedTextLabel) {
495
707
 
496
708
 
497
709
  function validateSavedVisualChannels(fields, newLayer, savedLayer) {
710
+ var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
498
711
  Object.values(newLayer.visualChannels).forEach(function (_ref7) {
499
712
  var field = _ref7.field,
500
713
  scale = _ref7.scale,
@@ -515,6 +728,16 @@ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
515
728
  }
516
729
 
517
730
  newLayer.validateVisualChannel(key);
731
+
732
+ if (options.throwOnError) {
733
+ var _savedLayer$config, _savedLayer$config$fi, _newLayer$config$fiel;
734
+
735
+ var fieldName = (_savedLayer$config = savedLayer.config) === null || _savedLayer$config === void 0 ? void 0 : (_savedLayer$config$fi = _savedLayer$config[field]) === null || _savedLayer$config$fi === void 0 ? void 0 : _savedLayer$config$fi.name;
736
+
737
+ if (fieldName && fieldName !== ((_newLayer$config$fiel = newLayer.config[field]) === null || _newLayer$config$fiel === void 0 ? void 0 : _newLayer$config$fiel.name)) {
738
+ throw new Error("Layer has invalid visual channel field: ".concat(field));
739
+ }
740
+ }
518
741
  }
519
742
  });
520
743
  return newLayer;
@@ -522,6 +745,7 @@ function validateSavedVisualChannels(fields, newLayer, savedLayer) {
522
745
 
523
746
  function validateLayersByDatasets(datasets, layerClasses) {
524
747
  var layers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
748
+ var options = arguments.length > 3 ? arguments[3] : undefined;
525
749
  var validated = [];
526
750
  var failed = [];
527
751
  layers.forEach(function (layer) {
@@ -532,7 +756,7 @@ function validateLayersByDatasets(datasets, layerClasses) {
532
756
  if (layer !== null && layer !== void 0 && (_layer$config = layer.config) !== null && _layer$config !== void 0 && _layer$config.dataId) {
533
757
  if (datasets[layer.config.dataId]) {
534
758
  // datasets are already loaded
535
- validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses);
759
+ validateLayer = validateLayerWithData(datasets[layer.config.dataId], layer, layerClasses, options);
536
760
  }
537
761
  }
538
762
 
@@ -552,15 +776,21 @@ function validateLayersByDatasets(datasets, layerClasses) {
552
776
  * Validate saved layer config with new data,
553
777
  * update fieldIdx based on new fields
554
778
  */
779
+ // eslint-disable-next-line complexity
555
780
 
556
781
 
557
782
  function validateLayerWithData(_ref10, savedLayer, layerClasses) {
558
783
  var fields = _ref10.fields,
559
784
  dataId = _ref10.id;
560
785
  var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
561
- var type = savedLayer.type; // layer doesnt have a valid type
786
+ var type = savedLayer.type;
787
+ var throwOnError = options.throwOnError; // layer doesnt have a valid type
562
788
 
563
789
  if (!type || !layerClasses.hasOwnProperty(type) || !savedLayer.config) {
790
+ if (throwOnError) {
791
+ throw new Error("Layer has invalid type \"".concat(type, "\" or config is missing"));
792
+ }
793
+
564
794
  return null;
565
795
  }
566
796
 
@@ -576,8 +806,8 @@ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
576
806
 
577
807
  var columnConfig = newLayer.getLayerColumns();
578
808
 
579
- if (Object.keys(columnConfig).length) {
580
- var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig);
809
+ if (Object.keys(columnConfig)) {
810
+ var columns = validateSavedLayerColumns(fields, savedLayer.config.columns, columnConfig, options);
581
811
 
582
812
  if (columns) {
583
813
  newLayer.updateLayerConfig({
@@ -591,8 +821,8 @@ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
591
821
  // refer to vis-state-schema.js VisualChannelSchemaV1
592
822
 
593
823
 
594
- newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer);
595
- var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel) : newLayer.config.textLabel; // copy visConfig over to emptyLayer to make sure it has all the props
824
+ newLayer = validateSavedVisualChannels(fields, newLayer, savedLayer, options);
825
+ var textLabel = savedLayer.config.textLabel && newLayer.config.textLabel ? validateSavedTextLabel(fields, newLayer.config.textLabel, savedLayer.config.textLabel, options) : newLayer.config.textLabel; // copy visConfig over to emptyLayer to make sure it has all the props
596
826
 
597
827
  var visConfig = newLayer.copyLayerConfig(newLayer.config.visConfig, savedLayer.config.visConfig || {}, {
598
828
  shallowCopy: ['colorRange', 'strokeColorRange']
@@ -601,28 +831,81 @@ function validateLayerWithData(_ref10, savedLayer, layerClasses) {
601
831
  visConfig: visConfig,
602
832
  textLabel: textLabel
603
833
  });
834
+
835
+ if (throwOnError) {
836
+ if (!newLayer.isValidToSave()) {
837
+ throw new Error("Layer is not valid to save: ".concat(newLayer.id));
838
+ }
839
+ }
840
+
604
841
  return newLayer;
605
842
  }
606
843
 
607
- function isValidMerger(merger) {
608
- return (0, _utils.isObject)(merger) && typeof merger.merge === 'function' && typeof merger.prop === 'string';
844
+ function mergeEditor(state, savedEditor) {
845
+ var _savedEditor$visible;
846
+
847
+ if (!savedEditor) {
848
+ return state;
849
+ }
850
+
851
+ return _objectSpread(_objectSpread({}, state), {}, {
852
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
853
+ features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), (0, _toConsumableArray2["default"])(savedEditor.features || [])),
854
+ // if savedEditor.visible is undefined keep state.editor.visible
855
+ visible: (_savedEditor$visible = savedEditor.visible) !== null && _savedEditor$visible !== void 0 ? _savedEditor$visible : state.editor.visible
856
+ })
857
+ });
858
+ }
859
+ /**
860
+ * Validate saved layer config with new data,
861
+ * update fieldIdx based on new fields
862
+ */
863
+
864
+
865
+ function mergeDatasetsByOrder(state, newDataEntries) {
866
+ var merged = _objectSpread(_objectSpread({}, state.datasets), newDataEntries);
867
+
868
+ if (Array.isArray(state.preserveDatasetOrder)) {
869
+ // preserveDatasetOrder might not include the new datasets
870
+ var newDatasetIds = Object.keys(merged).filter(function (id) {
871
+ var _state$preserveDatase;
872
+
873
+ return !((_state$preserveDatase = state.preserveDatasetOrder) !== null && _state$preserveDatase !== void 0 && _state$preserveDatase.includes(id));
874
+ });
875
+ return [].concat((0, _toConsumableArray2["default"])(state.preserveDatasetOrder), (0, _toConsumableArray2["default"])(newDatasetIds)).reduce(function (accu, dataId) {
876
+ return _objectSpread(_objectSpread({}, accu), merged[dataId] ? (0, _defineProperty2["default"])({}, dataId, merged[dataId]) : {});
877
+ }, {});
878
+ }
879
+
880
+ return merged;
609
881
  }
610
882
 
611
883
  var VIS_STATE_MERGERS = [{
612
884
  merge: mergeLayers,
613
885
  prop: 'layers',
614
- toMergeProp: 'layerToBeMerged'
886
+ toMergeProp: 'layerToBeMerged',
887
+ preserveOrder: 'preserveLayerOrder'
615
888
  }, {
616
889
  merge: mergeFilters,
617
890
  prop: 'filters',
618
- toMergeProp: 'filterToBeMerged'
891
+ toMergeProp: 'filterToBeMerged',
892
+ preserveOrder: 'preserveFilterOrder',
893
+ replaceParentDatasetIds: replaceFilterDatasetIds
894
+ }, {
895
+ merge: mergeEffects,
896
+ prop: 'effects'
619
897
  }, {
620
898
  merge: mergeInteractions,
621
899
  prop: 'interactionConfig',
622
- toMergeProp: 'interactionToBeMerged'
900
+ toMergeProp: 'interactionToBeMerged',
901
+ replaceParentDatasetIds: replaceInteractionDatasetIds,
902
+ saveUnmerged: savedUnmergedInteraction
623
903
  }, {
624
904
  merge: mergeLayerBlending,
625
905
  prop: 'layerBlending'
906
+ }, {
907
+ merge: mergeOverlayBlending,
908
+ prop: 'overlayBlending'
626
909
  }, {
627
910
  merge: mergeSplitMaps,
628
911
  prop: 'splitMaps',
@@ -630,6 +913,9 @@ var VIS_STATE_MERGERS = [{
630
913
  }, {
631
914
  merge: mergeAnimationConfig,
632
915
  prop: 'animationConfig'
916
+ }, {
917
+ merge: mergeEditor,
918
+ prop: 'editor'
633
919
  }];
634
920
  exports.VIS_STATE_MERGERS = VIS_STATE_MERGERS;
635
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtbWVyZ2VyLnRzIl0sIm5hbWVzIjpbIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwidmFsaWRhdGVkIiwiZmFpbGVkIiwidXBkYXRlZERhdGFzZXRzIiwidXBkYXRlZEZpbHRlcnMiLCJmaWx0ZXJzIiwiZGF0YXNldHNUb0ZpbHRlciIsIm1hcCIsImYiLCJkYXRhSWQiLCJmaWx0ZXJlZCIsImxheWVycyIsImRhdGFzZXRzIiwiZmlsdGVyVG9CZU1lcmdlZCIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsImxheWVyQ29uZmlnIiwidmFsaWRhdGVMYXllcnNCeURhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckRvbWFpbiIsInNlcmlhbGl6ZUxheWVyIiwic2F2ZWRWaXNTdGF0ZSIsInZpc1N0YXRlU2NoZW1hIiwiQ1VSUkVOVF9WRVJTSU9OIiwic2F2ZSIsImxheWVyT3JkZXIiLCJ2aXNTdGF0ZSIsImxvYWRlZExheWVyIiwibG9hZCIsIm1lcmdlTGF5ZXJzIiwibGF5ZXJzVG9NZXJnZSIsInByZXNlcnZlTGF5ZXJPcmRlciIsImwiLCJpZCIsIm1lcmdlZExheWVyIiwidW5tZXJnZWQiLCJpbnNlcnRMYXllckF0UmlnaHRPcmRlciIsIm5ld0xheWVyT3JkZXIiLCJuZXdMYXllcnMiLCJsYXllclRvQmVNZXJnZWQiLCJjdXJyZW50TGF5ZXJzIiwibGF5ZXJzVG9JbnNlcnQiLCJjdXJyZW50T3JkZXIiLCJwcmVzZXJ2ZWRPcmRlciIsImxheWVyT3JkZXJRdWV1ZSIsImkiLCJleHBlY3RlZElkeCIsImluZGV4T2YiLCJpbnNlcnRBdCIsInByZWNlZWRJZHgiLCJwcmVjZWVkTGF5ZXIiLCJjb25jYXQiLCJmaW5kSW5kZXgiLCJtZXJnZUludGVyYWN0aW9ucyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsIm1lcmdlZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiY29uZmlnIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiY29uZmlnVG9NZXJnZSIsIm1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnIiwibWVyZ2VkVG9vbHRpcCIsInVubWVyZ2VkVG9vbHRpcCIsImZpZWxkc1RvU2hvdyIsInRvb2x0aXAiLCJCb29sZWFuIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJ2YWx1ZSIsInB1c2hUbyIsImZpbmQiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwidG9vbHRpcENvbmZpZyIsImFsbEZpZWxkcyIsImZpZWxkcyIsImQiLCJuYW1lIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJmaWx0ZXIiLCJmaWVsZCIsImluY2x1ZGVzIiwibWVyZ2VMYXllckJsZW5kaW5nIiwibGF5ZXJCbGVuZGluZyIsIkxBWUVSX0JMRU5ESU5HUyIsIm1lcmdlQW5pbWF0aW9uQ29uZmlnIiwiYW5pbWF0aW9uIiwiY3VycmVudFRpbWUiLCJhbmltYXRpb25Db25maWciLCJkb21haW4iLCJ2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zIiwic2F2ZWRDb2xzIiwiZW1wdHlDb2xzIiwiY29sdW1ucyIsInNhdmVkIiwiZmllbGRJZHgiLCJhbGxDb2xGb3VuZCIsImV2ZXJ5IiwidmFsaWRhdGVDb2x1bW4iLCJjb2x1bW4iLCJvcHRpb25hbCIsInZhbGlkYXRvciIsInZhbGlkYXRlU2F2ZWRUZXh0TGFiZWwiLCJzYXZlZFRleHRMYWJlbCIsImxheWVyVGV4dExhYmVsIiwic2F2ZWRUZXh0TGFiZWxzIiwidGV4dExhYmVsIiwiZmQiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInZpc3VhbENoYW5uZWxzIiwic2NhbGUiLCJmb3VuZEZpZWxkIiwiZm91bmRDaGFubmVsIiwidXBkYXRlTGF5ZXJDb25maWciLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJsYXllciIsInZhbGlkYXRlTGF5ZXIiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJwdXNoIiwib3B0aW9ucyIsInR5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImxhYmVsIiwiY29sb3IiLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsImFsbG93RW1wdHlDb2x1bW4iLCJ2aXNDb25maWciLCJjb3B5TGF5ZXJDb25maWciLCJzaGFsbG93Q29weSIsImlzVmFsaWRNZXJnZXIiLCJtZXJnZXIiLCJtZXJnZSIsInByb3AiLCJWSVNfU1RBVEVfTUVSR0VSUyIsInRvTWVyZ2VQcm9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUNBOztBQVNBOztBQUNBOztBQVVBOzs7Ozs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsWUFBVCxDQUNMQyxLQURLLEVBRUxDLGNBRkssRUFHTEMsVUFISyxFQUlGO0FBQ0gsTUFBSSxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0gsY0FBZCxDQUFELElBQWtDLENBQUNBLGNBQWMsQ0FBQ0ksTUFBdEQsRUFBOEQ7QUFDNUQsV0FBT0wsS0FBUDtBQUNEOztBQUhFLDhCQUswQywwQ0FBOEJBLEtBQTlCLEVBQXFDQyxjQUFyQyxDQUwxQztBQUFBLE1BS0lLLFNBTEoseUJBS0lBLFNBTEo7QUFBQSxNQUtlQyxNQUxmLHlCQUtlQSxNQUxmO0FBQUEsTUFLdUJDLGVBTHZCLHlCQUt1QkEsZUFMdkIsRUFPSDs7O0FBQ0EsTUFBSUMsY0FBYyxpREFBUVQsS0FBSyxDQUFDVSxPQUFOLElBQWlCLEVBQXpCLHVDQUFpQ0osU0FBakMsRUFBbEI7QUFDQUcsRUFBQUEsY0FBYyxHQUFHLCtCQUFtQkEsY0FBbkIs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UyxFQUFUQTtBQUZ5QixHQUEzQjtBQUtBLFNBQU8vRixRQUFQO0FBQ0Q7O0FBRU0sU0FBUzhILGFBQVQsQ0FBdUJDLE1BQXZCLEVBQWdEO0FBQ3JELFNBQU8scUJBQVNBLE1BQVQsS0FBb0IsT0FBT0EsTUFBTSxDQUFDQyxLQUFkLEtBQXdCLFVBQTVDLElBQTBELE9BQU9ELE1BQU0sQ0FBQ0UsSUFBZCxLQUF1QixRQUF4RjtBQUNEOztBQUVNLElBQU1DLGlCQUFrQyxHQUFHLENBQ2hEO0FBQUNGLEVBQUFBLEtBQUssRUFBRXJILFdBQVI7QUFBcUJzSCxFQUFBQSxJQUFJLEVBQUUsUUFBM0I7QUFBcUNFLEVBQUFBLFdBQVcsRUFBRTtBQUFsRCxDQURnRCxFQUVoRDtBQUFDSCxFQUFBQSxLQUFLLEVBQUV4SixZQUFSO0FBQXNCeUosRUFBQUEsSUFBSSxFQUFFLFNBQTVCO0FBQXVDRSxFQUFBQSxXQUFXLEVBQUU7QUFBcEQsQ0FGZ0QsRUFHaEQ7QUFBQ0gsRUFBQUEsS0FBSyxFQUFFN0YsaUJBQVI7QUFBMkI4RixFQUFBQSxJQUFJLEVBQUUsbUJBQWpDO0FBQXNERSxFQUFBQSxXQUFXLEVBQUU7QUFBbkUsQ0FIZ0QsRUFJaEQ7QUFBQ0gsRUFBQUEsS0FBSyxFQUFFekQsa0JBQVI7QUFBNEIwRCxFQUFBQSxJQUFJLEVBQUU7QUFBbEMsQ0FKZ0QsRUFLaEQ7QUFBQ0QsRUFBQUEsS0FBSyxFQUFFMUUsY0FBUjtBQUF3QjJFLEVBQUFBLElBQUksRUFBRSxXQUE5QjtBQUEyQ0UsRUFBQUEsV0FBVyxFQUFFO0FBQXhELENBTGdELEVBTWhEO0FBQUNILEVBQUFBLEtBQUssRUFBRXRELG9CQUFSO0FBQThCdUQsRUFBQUEsSUFBSSxFQUFFO0FBQXBDLENBTmdELENBQTNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoLnBpY2snO1xuaW1wb3J0IGZsYXR0ZW5EZWVwIGZyb20gJ2xvZGFzaC5mbGF0dGVuZGVlcCc7XG5pbXBvcnQge1xuICBpc09iamVjdCxcbiAgYXJyYXlJbnNlcnQsXG4gIGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcCxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgdmFsaWRhdGVGaWx0ZXJzVXBkYXRlRGF0YXNldHNcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7TGF5ZXJDb2x1bW5zLCBMYXllckNvbHVtbiwgTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7TEFZRVJfQkxFTkRJTkdTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDVVJSRU5UX1ZFUlNJT04sXG4gIE1lcmdlcixcbiAgVmlzU3RhdGUsXG4gIFZpc1N0YXRlTWVyZ2VycyxcbiAgdmlzU3RhdGVTY2hlbWEsXG4gIFBhcnNlZENvbmZpZ1xufSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1BhcnNlZExheWVyLCBTYXZlZEludGVyYWN0aW9uQ29uZmlnLCBUb29sdGlwSW5mb30gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlLCBEYXRhc2V0cywgYXNzaWduR3B1Q2hhbm5lbHMsIHJlc2V0RmlsdGVyR3B1TW9kZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbi8qKlxuICogTWVyZ2UgbG9hZGVkIGZpbHRlcnMgd2l0aCBjdXJyZW50IHN0YXRlLCBpZiBubyBmaWVsZHMgb3IgZGF0YSBhcmUgbG9hZGVkXG4gKiBzYXZlIGl0IGZvciBsYXRlclxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRmlsdGVyczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZmlsdGVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2ZpbHRlcnMnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuXG4gIC8vIG1lcmdlIGZpbHRlciB3aXRoIGV4aXN0aW5nXG4gIGxldCB1cGRhdGVkRmlsdGVycyA9IFsuLi4oc3RhdGUuZmlsdGVycyB8fCBbXSksIC4uLnZhbGlkYXRlZF07XG4gIHVwZGF0ZWRGaWx0ZXJzID0gcmVzZXRGaWx0ZXJHcHVNb2RlKHVwZGF0ZWRGaWx0ZXJzKTtcbiAgdXBkYXRlZEZpbHRlcnMgPSBhc3NpZ25HcHVDaGFubmVscyh1cGRhdGVkRmlsdGVycyk7XG4gIC8vIGZpbHRlciBkYXRhXG4gIGNvbnN0IGRhdGFzZXRzVG9GaWx0ZXIgPSB1bmlxKGZsYXR0ZW5EZWVwKHZhbGlkYXRlZC5tYXAoZiA9PiBmLmRhdGFJZCkpKTtcblxuICBjb25zdCBmaWx0ZXJlZCA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgZGF0YXNldHNUb0ZpbHRlcixcbiAgICB1cGRhdGVkRGF0YXNldHMsXG4gICAgdXBkYXRlZEZpbHRlcnMsXG4gICAgc3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiB1cGRhdGVkRmlsdGVycyxcbiAgICBkYXRhc2V0czogZmlsdGVyZWQsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZTogVmlzU3RhdGUsIGxheWVyQ29uZmlnOiBhbnkpOiBMYXllciB8IG51bGwge1xuICAvLyBmaXJzdCB2YWxpZGF0ZSBjb25maWcgYWdhaW5zdCBkYXRhc2V0XG4gIGNvbnN0IHt2YWxpZGF0ZWQsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoc3RhdGUuZGF0YXNldHMsIHN0YXRlLmxheWVyQ2xhc3NlcywgW1xuICAgIGxheWVyQ29uZmlnXG4gIF0pO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIobmV3TGF5ZXIpOiBQYXJzZWRMYXllciB7XG4gIGNvbnN0IHNhdmVkVmlzU3RhdGUgPSB2aXNTdGF0ZVNjaGVtYVtDVVJSRU5UX1ZFUlNJT05dLnNhdmUoXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBub3QgYWxsIGV4cGVjdGVkIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkXG4gICAge1xuICAgICAgbGF5ZXJzOiBbbmV3TGF5ZXJdLFxuICAgICAgbGF5ZXJPcmRlcjogWzBdXG4gICAgfVxuICApLnZpc1N0YXRlO1xuICBjb25zdCBsb2FkZWRMYXllciA9IHZpc1N0YXRlU2NoZW1hW0NVUlJFTlRfVkVSU0lPTl0ubG9hZChzYXZlZFZpc1N0YXRlKS52aXNTdGF0ZT8ubGF5ZXJzPy5bMF07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIGxvYWRlZExheWVyO1xufVxuXG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZyA/IGxheWVyc1RvTWVyZ2UubWFwKGwgPT4gbC5pZCkgOiBzdGF0ZS5wcmVzZXJ2ZUxheWVyT3JkZXI7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHt2YWxpZGF0ZWQ6IG1lcmdlZExheWVyLCBmYWlsZWQ6IHVubWVyZ2VkfSA9IHZhbGlkYXRlTGF5ZXJzQnlEYXRhc2V0cyhcbiAgICBzdGF0ZS5kYXRhc2V0cyxcbiAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgbGF5ZXJzVG9NZXJnZVxuICApO1xuXG4gIC8vIHB1dCBuZXcgbGF5ZXJzIGluIGZyb250IG9mIGN1cnJlbnQgbGF5ZXJzXG4gIGNvbnN0IHtuZXdMYXllck9yZGVyLCBuZXdMYXllcnN9ID0gaW5zZXJ0TGF5ZXJBdFJpZ2h0T3JkZXIoXG4gICAgc3RhdGUubGF5ZXJzLFxuICAgIG1lcmdlZExheWVyLFxuICAgIHN0YXRlLmxheWVyT3JkZXIsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbMSwgMCwgM11cbiAgLy8gbGF5ZXJPcmRlck1hcCBbJ2EnLCAnYyddXG4gIGxldCBsYXllck9yZGVyUXVldWUgPSBjdXJyZW50T3JkZXIubWFwKGkgPT4gY3VycmVudExheWVyc1tpXS5pZCk7XG4gIGxldCBuZXdMYXllcnMgPSBjdXJyZW50TGF5ZXJzO1xuXG4gIGZvciAoY29uc3QgbmV3TGF5ZXIgb2YgbGF5ZXJzVG9JbnNlcnQpIHtcbiAgICAvLyBmaW5kIHdoZXJlIHRvIGluc2VydCBpdFxuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihuZXdMYXllci5pZCk7XG4gICAgLy8gaWYgY2FudCBmaW5kIHBsYWNlIHRvIGluc2VydCwgaW5zZXJ0IGF0IHRoZSBmcm9udFxuICAgIGxldCBpbnNlcnRBdCA9IDA7XG5cbiAgICBpZiAoZXhwZWN0ZWRJZHggPiAwKSB7XG4gICAgICAvLyBsb29rIGZvciBsYXllciB0byBpbnNlcnQgYWZ0ZXJcbiAgICAgIGxldCBpID0gZXhwZWN0ZWRJZHggKyAxO1xuICAgICAgbGV0IHByZWNlZWRJZHggPSAtMTtcbiAgICAgIHdoaWxlIChpLS0gPiAwICYmIHByZWNlZWRJZHggPCAwKSB7XG4gICAgICAgIC8vIGtlZXAgbG9va2luZyBmb3IgcHJlY2VlZCBsYXllciB0aGF0IGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIGNvbnN0IHByZWNlZWRMYXllciA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IGxheWVyT3JkZXJRdWV1ZS5pbmRleE9mKHByZWNlZWRMYXllcik7XG4gICAgICB9XG4gICAgICBpZiAocHJlY2VlZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIGlmIGZvdW5kXG4gICAgICAgIGluc2VydEF0ID0gcHJlY2VlZElkeCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGF5ZXJPcmRlclF1ZXVlID0gYXJyYXlJbnNlcnQobGF5ZXJPcmRlclF1ZXVlLCBpbnNlcnRBdCwgbmV3TGF5ZXIuaWQpO1xuICAgIG5ld0xheWVycyA9IG5ld0xheWVycy5jb25jYXQobmV3TGF5ZXIpO1xuICB9XG5cbiAgLy8gcmVjb25zdHJ1Y3QgbGF5ZXJPcmRlciBhZnRlciBpbnNlcnRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXJRdWV1ZS5tYXAoaWQgPT4gbmV3TGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBuZXdMYXllck9yZGVyLFxuICAgIG5ld0xheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9ucyB3aXRoIHNhdmVkIGNvbmZpZ1xuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW50ZXJhY3Rpb25zPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gfCB1bmRlZmluZWQsXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgbWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG4gIGNvbnN0IHVubWVyZ2VkOiBQYXJ0aWFsPFNhdmVkSW50ZXJhY3Rpb25Db25maWc+ID0ge307XG5cbiAgaWYgKGludGVyYWN0aW9uVG9CZU1lcmdlZCkge1xuICAgIChPYmplY3Qua2V5cyhpbnRlcmFjdGlvblRvQmVNZXJnZWQpIGFzIEFycmF5PGtleW9mIFNhdmVkSW50ZXJhY3Rpb25Db25maWc+KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2tleV0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50Q29uZmlnID1cbiAgICAgICAga2V5ID09PSAndG9vbHRpcCcgfHwga2V5ID09PSAnYnJ1c2gnID8gc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XS5jb25maWcgOiBudWxsO1xuXG4gICAgICBjb25zdCB7ZW5hYmxlZCwgLi4uY29uZmlnU2F2ZWR9ID0gaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkW2tleV0gfHwge307XG5cbiAgICAgIGxldCBjb25maWdUb01lcmdlID0gY29uZmlnU2F2ZWQ7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0b29sdGlwJykge1xuICAgICAgICBjb25zdCB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfSA9IG1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbmZpZ1NhdmVkIGFzIFNhdmVkSW50ZXJhY3Rpb25Db25maWdbJ3Rvb2x0aXAnXVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIG1lcmdlIG5ldyBkYXRhc2V0IHRvb2x0aXBzIHdpdGggb3JpZ2luYWwgZGF0YXNldCB0b29sdGlwc1xuICAgICAgICBjb25maWdUb01lcmdlID0ge1xuICAgICAgICAgIGZpZWxkc1RvU2hvdzoge1xuICAgICAgICAgICAgLi4uKGN1cnJlbnRDb25maWcgYXMgVG9vbHRpcEluZm9bJ2NvbmZpZyddKS5maWVsZHNUb1Nob3csXG4gICAgICAgICAgICAuLi5tZXJnZWRUb29sdGlwXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh1bm1lcmdlZFRvb2x0aXApLmxlbmd0aCkge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICB1bm1lcmdlZC50b29sdGlwID0ge2ZpZWxkc1RvU2hvdzogdW5tZXJnZWRUb29sdGlwLCBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZXJnZWRba2V5XSA9IHtcbiAgICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSxcbiAgICAgICAgZW5hYmxlZDogQm9vbGVhbihlbmFibGVkKSxcbiAgICAgICAgLi4uKGN1cnJlbnRDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBwaWNrKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLmN1cnJlbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAuLi5jb25maWdUb01lcmdlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhjdXJyZW50Q29uZmlnKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSlcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIC4uLm1lcmdlZFxuICAgIH0sXG4gICAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB1bm1lcmdlZFxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIHNwbGl0TWFwcyBjb25maWcgd2l0aCBjdXJyZW50IHZpc1N0ZXRlLlxuICogMS4gaWYgY3VycmVudCBtYXAgaXMgc3BsaXQsIGJ1dCBzcGxpdE1hcCBET0VTTk9UIGNvbnRhaW4gbWFwc1xuICogICAgOiBkb24ndCBtZXJnZSBhbnl0aGluZ1xuICogMi4gaWYgY3VycmVudCBtYXAgaXMgTk9UIHNwbGl0LCBidXQgc3BsaXRNYXBzIGNvbnRhaW4gbWFwc1xuICogICAgOiBhZGQgdG8gc3BsaXRNYXBzLCBhbmQgYWRkIGN1cnJlbnQgbGF5ZXJzIHRvIHNwbGl0TWFwc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VTcGxpdE1hcHM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHNwbGl0TWFwczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnc3BsaXRNYXBzJ10gPSBbXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uc3RhdGUuc3BsaXRNYXBzXTtcbiAgY29uc3QgdW5tZXJnZWQgPSBbXTtcbiAgc3BsaXRNYXBzLmZvckVhY2goKHNtLCBpKSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXMoc20ubGF5ZXJzKS5mb3JFYWNoKChbaWQsIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgbGF5ZXIgZXhpc3RzXG4gICAgICBjb25zdCBwdXNoVG8gPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGlkKSA/IG1lcmdlZCA6IHVubWVyZ2VkO1xuXG4gICAgICAvLyBjcmVhdGUgbWFwIHBhbmVsIGlmIGN1cnJlbnQgbWFwIGlzIG5vdCBzcGxpdFxuICAgICAgcHVzaFRvW2ldID0gcHVzaFRvW2ldIHx8IHtcbiAgICAgICAgbGF5ZXJzOiBwdXNoVG8gPT09IG1lcmdlZCA/IGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcChzdGF0ZS5sYXllcnMpIDogW11cbiAgICAgIH07XG4gICAgICBwdXNoVG9baV0ubGF5ZXJzID0ge1xuICAgICAgICAuLi5wdXNoVG9baV0ubGF5ZXJzLFxuICAgICAgICBbaWRdOiB2YWx1ZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzcGxpdE1hcHM6IG1lcmdlZCxcbiAgICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuc3BsaXRNYXBzVG9CZU1lcmdlZCwgLi4udW5tZXJnZWRdXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcCB3aXRoIHNhdmVkIGNvbmZpZyxcbiAqIHZhbGlkYXRlIGZpZWxkc1RvU2hvd1xuICpcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHBhcmFtIHRvb2x0aXBDb25maWdcbiAqIEByZXR1cm4gLSB7bWVyZ2VkVG9vbHRpcDoge30sIHVubWVyZ2VkVG9vbHRpcDoge319XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUludGVyYWN0aW9uVG9vbHRpcENvbmZpZyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB0b29sdGlwQ29uZmlnOiBQaWNrPFRvb2x0aXBJbmZvWydjb25maWcnXSwgJ2ZpZWxkc1RvU2hvdyc+IHwgbnVsbCA9IG51bGxcbikge1xuICBjb25zdCB1bm1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcbiAgY29uc3QgbWVyZ2VkVG9vbHRpcDogVG9vbHRpcEluZm9bJ2NvbmZpZyddWydmaWVsZHNUb1Nob3cnXSA9IHt9O1xuXG4gIGlmIChcbiAgICAhdG9vbHRpcENvbmZpZyB8fFxuICAgICF0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdyB8fFxuICAgICFPYmplY3Qua2V5cyh0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykubGVuZ3RoXG4gICkge1xuICAgIHJldHVybiB7bWVyZ2VkVG9vbHRpcCwgdW5tZXJnZWRUb29sdGlwfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZGF0YUlkIGluIHRvb2x0aXBDb25maWcuZmllbGRzVG9TaG93KSB7XG4gICAgaWYgKCFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChsYXllckJsZW5kaW5nICYmIExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyQmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIE1lcmdlIGFuaW1hdGlvbiBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQW5pbWF0aW9uQ29uZmlnPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhbmltYXRpb246IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2FuaW1hdGlvbkNvbmZpZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHJldHVybiAtIHZhbGlkYXRlZCBjb2x1bW5zIG9yIG51bGxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZExheWVyQ29sdW1ucyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIHNhdmVkQ29sczoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfSA9IHt9LFxuICBlbXB0eUNvbHM6IExheWVyQ29sdW1uc1xuKSB7XG4gIC8vIFByZXBhcmUgY29sdW1ucyBmb3IgdGhlIHZhbGlkYXRvclxuICBjb25zdCBjb2x1bW5zOiB0eXBlb2YgZW1wdHlDb2xzID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGVtcHR5Q29scykpIHtcbiAgICBjb2x1bW5zW2tleV0gPSB7Li4uZW1wdHlDb2xzW2tleV19O1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBzYXZlZENvbHNba2V5XTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIGNvbnN0IGZpZWxkSWR4ID0gZmllbGRzLmZpbmRJbmRleCgoe25hbWV9KSA9PiBuYW1lID09PSBzYXZlZCk7XG5cbiAgICAgIGlmIChmaWVsZElkeCA+IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBmb3VuZCBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnNba2V5XS5maWVsZElkeCA9IGZpZWxkSWR4O1xuICAgICAgICBjb2x1bW5zW2tleV0udmFsdWUgPSBzYXZlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBmaW5kIGFjdHVhbCBjb2x1bW4gZmllbGRJZHgsIGluIGNhc2UgaXQgaGFzIGNoYW5nZWRcbiAgY29uc3QgYWxsQ29sRm91bmQgPSBPYmplY3Qua2V5cyhjb2x1bW5zKS5ldmVyeShrZXkgPT5cbiAgICB2YWxpZGF0ZUNvbHVtbihjb2x1bW5zW2tleV0sIGNvbHVtbnMsIGZpZWxkcylcbiAgKTtcblxuICBpZiAoYWxsQ29sRm91bmQpIHtcbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDb2x1bW4oXG4gIGNvbHVtbjogTGF5ZXJDb2x1bW4gJiB7dmFsaWRhdG9yPzogdHlwZW9mIHZhbGlkYXRlQ29sdW1ufSxcbiAgY29sdW1uczogTGF5ZXJDb2x1bW5zLFxuICBhbGxGaWVsZHM6IEtlcGxlclRhYmxlWydmaWVsZHMnXVxuKTogYm9vbGVhbiB7XG4gIGlmIChjb2x1bW4ub3B0aW9uYWwgfHwgY29sdW1uLnZhbHVlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGNvbHVtbi52YWxpZGF0b3IpIHtcbiAgICByZXR1cm4gY29sdW1uLnZhbGlkYXRvcihjb2x1bW4sIGNvbHVtbnMsIGFsbEZpZWxkcyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHRleHQgbGFiZWwgY29uZmlnIHdpdGggbmV3IGRhdGFcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVGV4dExhYmVsU2NoZW1hVjFcbiAqXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGZpZWxkc1xuICogQHBhcmFtIHtPYmplY3R9IHNhdmVkVGV4dExhYmVsXG4gKiBAcmV0dXJuIHtPYmplY3R9IC0gdmFsaWRhdGVkIHRleHRsYWJlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIFtsYXllclRleHRMYWJlbF0sIHNhdmVkVGV4dExhYmVsKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxheWVyVGV4dExhYmVsKS5yZWR1Y2UoXG4gICAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBba2V5XToga2V5ID09PSAnZmllbGQnID8gZmllbGQgOiB0ZXh0TGFiZWxba2V5XSB8fCBsYXllclRleHRMYWJlbFtrZXldXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgdmlzdWFsIGNoYW5uZWxzIGNvbmZpZyB3aXRoIG5ldyBkYXRhLFxuICogcmVmZXIgdG8gdmlzLXN0YXRlLXNjaGVtYS5qcyBWaXN1YWxDaGFubmVsU2NoZW1hVjFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRWaXN1YWxDaGFubmVscyhcbiAgZmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ10sXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2F2ZWRMYXllcjogUGFyc2VkTGF5ZXJcbik6IG51bGwgfCBMYXllciB7XG4gIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZCwgc2NhbGUsIGtleX0pID0+IHtcbiAgICBsZXQgZm91bmRGaWVsZDtcbiAgICBpZiAoc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICAgIGlmIChzYXZlZExheWVyLmNvbmZpZ1tmaWVsZF0pIHtcbiAgICAgICAgZm91bmRGaWVsZCA9IGZpZWxkcy5maW5kKFxuICAgICAgICAgIGZkID0+IHNhdmVkTGF5ZXIuY29uZmlnICYmIGZkLm5hbWUgPT09IHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXS5uYW1lXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvdW5kQ2hhbm5lbCA9IHtcbiAgICAgICAgLi4uKGZvdW5kRmllbGQgPyB7W2ZpZWxkXTogZm91bmRGaWVsZH0gOiB7fSksXG4gICAgICAgIC4uLihzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV0gPyB7W3NjYWxlXTogc2F2ZWRMYXllci5jb25maWdbc2NhbGVdfSA6IHt9KVxuICAgICAgfTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmb3VuZENoYW5uZWwpLmxlbmd0aCkge1xuICAgICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhmb3VuZENoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICBuZXdMYXllci52YWxpZGF0ZVZpc3VhbENoYW5uZWwoa2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyxcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIGxheWVyczogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXVxuKSB7XG4gIGNvbnN0IHZhbGlkYXRlZDogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBmYWlsZWQ6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW107XG5cbiAgbGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4ge1xuICAgIGxldCB2YWxpZGF0ZUxheWVyOiBMYXllciB8IG51bGwgPSBudWxsO1xuXG4gICAgaWYgKGxheWVyPy5jb25maWc/LmRhdGFJZCkge1xuICAgICAgaWYgKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdKSB7XG4gICAgICAgIC8vIGRhdGFzZXRzIGFyZSBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB2YWxpZGF0ZUxheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXRzW2xheWVyLmNvbmZpZy5kYXRhSWRdLCBsYXllciwgbGF5ZXJDbGFzc2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcldpdGhEYXRhKFxuICB7ZmllbGRzLCBpZDogZGF0YUlkfTogS2VwbGVyVGFibGUsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBsYXllckNsYXNzZXM6IFZpc1N0YXRlWydsYXllckNsYXNzZXMnXSxcbiAgb3B0aW9uczoge1xuICAgIGFsbG93RW1wdHlDb2x1bW4/OiBib29sZWFuO1xuICB9ID0ge31cbik6IExheWVyIHwgbnVsbCB7XG4gIGNvbnN0IHt0eXBlfSA9IHNhdmVkTGF5ZXI7XG4gIC8vIGxheWVyIGRvZXNudCBoYXZlIGEgdmFsaWQgdHlwZVxuICBpZiAoIXR5cGUgfHwgIWxheWVyQ2xhc3Nlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSB8fCAhc2F2ZWRMYXllci5jb25maWcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbdHlwZV0oe1xuICAgIGlkOiBzYXZlZExheWVyLmlkLFxuICAgIGRhdGFJZCxcbiAgICBsYWJlbDogc2F2ZWRMYXllci5jb25maWcubGFiZWwsXG4gICAgY29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmNvbG9yLFxuICAgIGlzVmlzaWJsZTogc2F2ZWRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGhpZGRlbjogc2F2ZWRMYXllci5jb25maWcuaGlkZGVuLFxuICAgIGhpZ2hsaWdodENvbG9yOiBzYXZlZExheWVyLmNvbmZpZy5oaWdobGlnaHRDb2xvclxuICB9KTtcblxuICAvLyBmaW5kIGNvbHVtbiBmaWVsZElkeFxuICBjb25zdCBjb2x1bW5Db25maWcgPSBuZXdMYXllci5nZXRMYXllckNvbHVtbnMoKTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbHVtbkNvbmZpZykubGVuZ3RoKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoZmllbGRzLCBzYXZlZExheWVyLmNvbmZpZy5jb2x1bW5zLCBjb2x1bW5Db25maWcpO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChmaWVsZHMsIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWwsIHNhdmVkTGF5ZXIuY29uZmlnLnRleHRMYWJlbClcbiAgICAgIDogbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbDtcblxuICAvLyBjb3B5IHZpc0NvbmZpZyBvdmVyIHRvIGVtcHR5TGF5ZXIgdG8gbWFrZSBzdXJlIGl0IGhhcyBhbGwgdGhlIHByb3BzXG4gIGNvbnN0IHZpc0NvbmZpZyA9IG5ld0xheWVyLmNvcHlMYXllckNvbmZpZyhcbiAgICBuZXdMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIHNhdmVkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyB8fCB7fSxcbiAgICB7c2hhbGxvd0NvcHk6IFsnY29sb3JSYW5nZScsICdzdHJva2VDb2xvclJhbmdlJ119XG4gICk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIHZpc0NvbmZpZyxcbiAgICB0ZXh0TGFiZWxcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1lcmdlcihtZXJnZXI6IE1lcmdlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNPYmplY3QobWVyZ2VyKSAmJiB0eXBlb2YgbWVyZ2VyLm1lcmdlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtZXJnZXIucHJvcCA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzID0gW1xuICB7bWVyZ2U6IG1lcmdlTGF5ZXJzLCBwcm9wOiAnbGF5ZXJzJywgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnfSxcbiAge21lcmdlOiBtZXJnZUZpbHRlcnMsIHByb3A6ICdmaWx0ZXJzJywgdG9NZXJnZVByb3A6ICdmaWx0ZXJUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsIHByb3A6ICdpbnRlcmFjdGlvbkNvbmZpZycsIHRvTWVyZ2VQcm9wOiAnaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VMYXllckJsZW5kaW5nLCBwcm9wOiAnbGF5ZXJCbGVuZGluZyd9LFxuICB7bWVyZ2U6IG1lcmdlU3BsaXRNYXBzLCBwcm9wOiAnc3BsaXRNYXBzJywgdG9NZXJnZVByb3A6ICdzcGxpdE1hcHNUb0JlTWVyZ2VkJ30sXG4gIHttZXJnZTogbWVyZ2VBbmltYXRpb25Db25maWcsIHByb3A6ICdhbmltYXRpb25Db25maWcnfVxuXTtcbiJdfQ==
921
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtbWVyZ2VyLnRzIl0sIm5hbWVzIjpbIm1lcmdlRmlsdGVycyIsInN0YXRlIiwiZmlsdGVyc1RvTWVyZ2UiLCJmcm9tQ29uZmlnIiwicHJlc2VydmVGaWx0ZXJPcmRlciIsIm1hcCIsImwiLCJpZCIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInZhbGlkYXRlZCIsImZhaWxlZCIsInVwZGF0ZWREYXRhc2V0cyIsInVwZGF0ZWRGaWx0ZXJzIiwiaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlciIsImZpbHRlcnMiLCJkYXRhc2V0c1RvRmlsdGVyIiwiZiIsImRhdGFJZCIsImZpbHRlcmVkIiwibGF5ZXJzIiwiZGF0YXNldHMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwicmVwbGFjZUZpbHRlckRhdGFzZXRJZHMiLCJzYXZlZEZpbHRlciIsImRhdGFJZFRvVXNlIiwicmVwbGFjZWQiLCJmb3JFYWNoIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJuZXdEYXRhSWQiLCJkIiwicHVzaCIsImlzU2F2ZWRMYXllckNvbmZpZ1YxIiwibGF5ZXJDb25maWciLCJ2aXN1YWxDaGFubmVscyIsInBhcnNlTGF5ZXJDb25maWciLCJzY2hlbWEiLCJzYXZlZENvbmZpZyIsInZlcnNpb24iLCJDVVJSRU5UX1ZFUlNJT04iLCJjb25maWciLCJ2aXNTdGF0ZSIsImxheWVyT3JkZXIiLCJwYXJzZVNhdmVkQ29uZmlnIiwiY3VycmVudEl0ZW1zIiwiaXRlbXMiLCJwcmVzZXJ2ZWRPcmRlciIsImRlZmF1bHRTdGFydCIsIm5ld0l0ZW1zIiwiaXRlbSIsImV4cGVjdGVkSWR4IiwiaW5kZXhPZiIsImluc2VydEF0IiwiaSIsInByZWNlZWRJZHgiLCJwcmVjZWVkSXRlbUlkIiwiZmluZEluZGV4IiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwicGFyc2VkTGF5ZXJDb25maWciLCJ2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJhbGxvd0VtcHR5Q29sdW1uIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckRvbWFpbiIsInNlcmlhbGl6ZUxheWVyIiwic2VyaWFsaXplZFZpc1N0YXRlIiwic2VyaWFsaXplVmlzU3RhdGUiLCJzYXZlZFN0YXRlIiwiZ2V0Q29uZmlnVG9TYXZlIiwidW5kZWZpbmVkIiwibWVyZ2VMYXllcnMiLCJsYXllcnNUb01lcmdlIiwicHJlc2VydmVMYXllck9yZGVyIiwidW5tZXJnZWQiLCJ0b01lcmdlIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJtZXJnZWRMYXllciIsImluc2VydExheWVyQXRSaWdodE9yZGVyIiwibmV3TGF5ZXJPcmRlciIsIm5ld0xheWVycyIsImxheWVyVG9CZU1lcmdlZCIsImN1cnJlbnRMYXllcnMiLCJsYXllcnNUb0luc2VydCIsImN1cnJlbnRPcmRlciIsImN1cnJlbnRMYXllclF1ZXVlIiwibGF5ZXIiLCJCb29sZWFuIiwiY29uY2F0IiwibmV3TGF5ZXJPcmRlclF1ZXVlIiwibWVyZ2VJbnRlcmFjdGlvbnMiLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJtZXJnZWQiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiaW50ZXJhY3Rpb25Db25maWciLCJjdXJyZW50Q29uZmlnIiwiZW5hYmxlZCIsImNvbmZpZ1NhdmVkIiwiY29uZmlnVG9NZXJnZSIsIm1lcmdlSW50ZXJhY3Rpb25Ub29sdGlwQ29uZmlnIiwibWVyZ2VkVG9vbHRpcCIsInVubWVyZ2VkVG9vbHRpcCIsImZpZWxkc1RvU2hvdyIsInRvb2x0aXAiLCJuZXh0U3RhdGUiLCJzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb24iLCJyZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzIiwiZGF0YUlkVG9SZXBsYWNlIiwibWVyZ2VTcGxpdE1hcHMiLCJzcGxpdE1hcHMiLCJzbSIsImVudHJpZXMiLCJ2YWx1ZSIsInB1c2hUbyIsImZpbmQiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwibWVyZ2VFZmZlY3RzIiwiZWZmZWN0cyIsIm5ld0VmZmVjdHMiLCJlZmZlY3QiLCJpc0NvbmZpZ0FjdGl2ZSIsImlzVmFsaWRUb1NhdmUiLCJlZmZlY3RPcmRlciIsInRvb2x0aXBDb25maWciLCJhbGxGaWVsZHMiLCJmaWVsZHMiLCJuYW1lIiwiZm91bmRGaWVsZHNUb1Nob3ciLCJmaWVsZCIsIm1lcmdlTGF5ZXJCbGVuZGluZyIsImxheWVyQmxlbmRpbmciLCJMQVlFUl9CTEVORElOR1MiLCJtZXJnZU92ZXJsYXlCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwibWVyZ2VBbmltYXRpb25Db25maWciLCJhbmltYXRpb24iLCJjdXJyZW50VGltZSIsImFuaW1hdGlvbkNvbmZpZyIsImRvbWFpbiIsInZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMiLCJzYXZlZENvbHMiLCJlbXB0eUNvbHMiLCJvcHRpb25zIiwiY29sdW1ucyIsInNhdmVkIiwiZmllbGRJZHgiLCJhbGxDb2xGb3VuZCIsImV2ZXJ5IiwidmFsaWRhdGVDb2x1bW4iLCJydiIsInRocm93T25FcnJvciIsInJlcXVpcmVkQ29sdW1ucyIsImsiLCJvcHRpb25hbCIsIm1pc3NpbmdDb2x1bW5zIiwiRXJyb3IiLCJqb2luIiwiY29uZmlnQ29sdW1ucyIsImludmFsaWRDb2x1bW5zIiwiY29sdW1uIiwidmFsaWRhdG9yIiwidmFsaWRhdGVTYXZlZFRleHRMYWJlbCIsInNhdmVkVGV4dExhYmVsIiwibGF5ZXJUZXh0TGFiZWwiLCJzYXZlZFRleHRMYWJlbHMiLCJ0ZXh0TGFiZWwiLCJmZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWR1Y2UiLCJhY2N1IiwidmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzIiwic2F2ZWRMYXllciIsInZhbHVlcyIsInNjYWxlIiwiZm91bmRGaWVsZCIsImZvdW5kQ2hhbm5lbCIsInVwZGF0ZUxheWVyQ29uZmlnIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwiZmllbGROYW1lIiwidmFsaWRhdGVMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsInR5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImxhYmVsIiwiY29sb3IiLCJpc1Zpc2libGUiLCJoaWRkZW4iLCJoaWdobGlnaHRDb2xvciIsImNvbHVtbkNvbmZpZyIsImdldExheWVyQ29sdW1ucyIsInZpc0NvbmZpZyIsImNvcHlMYXllckNvbmZpZyIsInNoYWxsb3dDb3B5IiwibWVyZ2VFZGl0b3IiLCJzYXZlZEVkaXRvciIsImVkaXRvciIsImZlYXR1cmVzIiwidmlzaWJsZSIsIm1lcmdlRGF0YXNldHNCeU9yZGVyIiwibmV3RGF0YUVudHJpZXMiLCJwcmVzZXJ2ZURhdGFzZXRPcmRlciIsIm5ld0RhdGFzZXRJZHMiLCJWSVNfU1RBVEVfTUVSR0VSUyIsIm1lcmdlIiwicHJvcCIsInRvTWVyZ2VQcm9wIiwicHJlc2VydmVPcmRlciIsInJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwic2F2ZVVubWVyZ2VkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFRQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFZQTs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNBLFlBQVQsQ0FDTEMsS0FESyxFQUVMQyxjQUZLLEVBR0xDLFVBSEssRUFJRjtBQUNILE1BQU1DLG1CQUFtQixHQUFHRCxVQUFVLEdBQ2xDRCxjQURrQyxhQUNsQ0EsY0FEa0MsdUJBQ2xDQSxjQUFjLENBQUVHLEdBQWhCLENBQW9CLFVBQUFDLENBQUM7QUFBQSxXQUFJQSxDQUFDLENBQUNDLEVBQU47QUFBQSxHQUFyQixDQURrQyxHQUVsQ04sS0FBSyxDQUFDRyxtQkFGVjs7QUFJQSxNQUFJLENBQUNJLEtBQUssQ0FBQ0MsT0FBTixDQUFjUCxjQUFkLENBQUQsSUFBa0MsQ0FBQ0EsY0FBYyxDQUFDUSxNQUF0RCxFQUE4RDtBQUM1RCxXQUFPVCxLQUFQO0FBQ0Q7O0FBUEUsOEJBUzBDLDBDQUE4QkEsS0FBOUIsRUFBcUND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S0FBSyxFQUFFVixXQUFSO0FBQXFCVyxFQUFBQSxJQUFJLEVBQUU7QUFBM0IsQ0E3QnFELENBQWhEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoLnVuaXEnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoLnBpY2snO1xuaW1wb3J0IGZsYXR0ZW5EZWVwIGZyb20gJ2xvZGFzaC5mbGF0dGVuZGVlcCc7XG5pbXBvcnQge1xuICBhcnJheUluc2VydCxcbiAgZ2V0SW5pdGlhbE1hcExheWVyc0ZvclNwbGl0TWFwLFxuICBhcHBseUZpbHRlcnNUb0RhdGFzZXRzLFxuICB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyxcbiAgZmluZEJ5SWQsXG4gIG1lcmdlRWZmZWN0UGFyYW1zXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtnZXRMYXllck9yZGVyRnJvbUxheWVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG5cbmltcG9ydCB7TGF5ZXJDb2x1bW5zLCBMYXllckNvbHVtbiwgTGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7Y3JlYXRlRGVja0VmZmVjdEZyb21Db25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge0xBWUVSX0JMRU5ESU5HUywgT1ZFUkxBWV9CTEVORElOR1N9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7Q1VSUkVOVF9WRVJTSU9OLCBWaXNTdGF0ZSwgVmlzU3RhdGVNZXJnZXJzLCBLZXBsZXJHTFNjaGVtYUNsYXNzfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBQYXJzZWRMYXllcixcbiAgUGFyc2VkVmlzU3RhdGUsXG4gIFNhdmVkSW50ZXJhY3Rpb25Db25maWcsXG4gIFRvb2x0aXBJbmZvLFxuICBTYXZlZEVkaXRvcixcbiAgUGFyc2VkQ29uZmlnLFxuICBGaWx0ZXIsXG4gIEVmZmVjdCBhcyBFZmZlY3RUeXBlXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZSwgRGF0YXNldHMsIGFzc2lnbkdwdUNoYW5uZWxzLCByZXNldEZpbHRlckdwdU1vZGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuXG4vKipcbiAqIE1lcmdlIGxvYWRlZCBmaWx0ZXJzIHdpdGggY3VycmVudCBzdGF0ZSwgaWYgbm8gZmllbGRzIG9yIGRhdGEgYXJlIGxvYWRlZFxuICogc2F2ZSBpdCBmb3IgbGF0ZXJcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUZpbHRlcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGZpbHRlcnNUb01lcmdlOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydmaWx0ZXJzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVGaWx0ZXJPcmRlciA9IGZyb21Db25maWdcbiAgICA/IGZpbHRlcnNUb01lcmdlPy5tYXAobCA9PiBsLmlkKVxuICAgIDogc3RhdGUucHJlc2VydmVGaWx0ZXJPcmRlcjtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlsdGVyc1RvTWVyZ2UpIHx8ICFmaWx0ZXJzVG9NZXJnZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWQsIHVwZGF0ZWREYXRhc2V0c30gPSB2YWxpZGF0ZUZpbHRlcnNVcGRhdGVEYXRhc2V0cyhzdGF0ZSwgZmlsdGVyc1RvTWVyZ2UpO1xuICBsZXQgdXBkYXRlZEZpbHRlcnMgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIHN0YXRlLmZpbHRlcnMsXG4gICAgdmFsaWRhdGVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXJcbiAgKTtcblxuICAvLyBtZXJnZSBmaWx0ZXIgd2l0aCBleGlzdGluZ1xuICB1cGRhdGVkRmlsdGVycyA9IHJlc2V0RmlsdGVyR3B1TW9kZSh1cGRhdGVkRmlsdGVycyk7XG4gIHVwZGF0ZWRGaWx0ZXJzID0gYXNzaWduR3B1Q2hhbm5lbHModXBkYXRlZEZpbHRlcnMpO1xuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBkYXRhc2V0c1RvRmlsdGVyID0gdW5pcShmbGF0dGVuRGVlcCh2YWxpZGF0ZWQubWFwKGYgPT4gZi5kYXRhSWQpKSk7XG5cbiAgY29uc3QgZmlsdGVyZWQgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKFxuICAgIGRhdGFzZXRzVG9GaWx0ZXIsXG4gICAgdXBkYXRlZERhdGFzZXRzLFxuICAgIHVwZGF0ZWRGaWx0ZXJzLFxuICAgIHN0YXRlLmxheWVyc1xuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogdXBkYXRlZEZpbHRlcnMsXG4gICAgZGF0YXNldHM6IGZpbHRlcmVkLFxuICAgIHByZXNlcnZlRmlsdGVyT3JkZXIsXG4gICAgZmlsdGVyVG9CZU1lcmdlZDogWy4uLnN0YXRlLmZpbHRlclRvQmVNZXJnZWQsIC4uLmZhaWxlZF1cbiAgfTtcbn1cblxuLy8gcmVwbGFjZSBkYXRhSWQgaW4gc2F2ZWQgRmlsdGVyXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUZpbHRlckRhdGFzZXRJZHMoXG4gIHNhdmVkRmlsdGVyOiBGaWx0ZXJbXSxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbikge1xuICBjb25zdCByZXBsYWNlZDogRmlsdGVyW10gPSBbXTtcbiAgc2F2ZWRGaWx0ZXIuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgIGlmIChmaWx0ZXIuZGF0YUlkLmluY2x1ZGVzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IG5ld0RhdGFJZCA9IGZpbHRlci5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZCkpO1xuICAgICAgcmVwbGFjZWQucHVzaCh7XG4gICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgZGF0YUlkOiBuZXdEYXRhSWRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXBsYWNlZC5sZW5ndGggPyByZXBsYWNlZCA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NhdmVkTGF5ZXJDb25maWdWMShsYXllckNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIC8vIGV4cG9ydGVkIGxheWVyIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgdmlzdWFsQ2hhbm5lbHMgcHJvcGVydHlcbiAgcmV0dXJuIGxheWVyQ29uZmlnPy52aXN1YWxDaGFubmVscztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGF5ZXJDb25maWcoXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFDbGFzcyxcbiAgbGF5ZXJDb25maWc6IGFueVxuKTogUGFyc2VkTGF5ZXIgfCB1bmRlZmluZWQge1xuICAvLyBhc3N1bWUgdGhlIGxheWVyIGNvbmZpZyBpcyBjdXJyZW50IHZlcnNpb25cbiAgY29uc3Qgc2F2ZWRDb25maWcgPSB7XG4gICAgdmVyc2lvbjogQ1VSUkVOVF9WRVJTSU9OLFxuICAgIGNvbmZpZzoge1xuICAgICAgdmlzU3RhdGU6IHtsYXllcnM6IFtsYXllckNvbmZpZ10sIGxheWVyT3JkZXI6IFtsYXllckNvbmZpZy5pZF19XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZENvbmZpZyk/LnZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuZnVuY3Rpb24gaW5zZXJ0SXRlbUJhc2VkT25QcmVzZXJ2ZWRPcmRlcihcbiAgY3VycmVudEl0ZW1zOiBGaWx0ZXJbXSxcbiAgaXRlbXM6IEZpbHRlcltdLFxuICBwcmVzZXJ2ZWRPcmRlcjogYW55W10gPSBbXSxcbiAgZGVmYXVsdFN0YXJ0PzogYm9vbGVhblxuKSB7XG4gIGxldCBuZXdJdGVtcyA9IFsuLi5jdXJyZW50SXRlbXNdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGV4cGVjdGVkSWR4ID0gcHJlc2VydmVkT3JkZXIuaW5kZXhPZihpdGVtLmlkKTtcbiAgICAvLyBpbnNlcnRBdCB0aGUgZW5kIGJ5IGRlZmF1bHRcbiAgICBsZXQgaW5zZXJ0QXQgPSBkZWZhdWx0U3RhcnQgPyAwIDogbmV3SXRlbXMubGVuZ3RoO1xuICAgIGlmIChleHBlY3RlZElkeCA+IDApIHtcbiAgICAgIC8vIGxvb2sgZm9yIGxheWVyIHRvIGluc2VydCBhZnRlclxuICAgICAgbGV0IGkgPSBleHBlY3RlZElkeCArIDE7XG4gICAgICBsZXQgcHJlY2VlZElkeCA9IC0xO1xuICAgICAgd2hpbGUgKGktLSA+IDAgJiYgcHJlY2VlZElkeCA8IDApIHtcbiAgICAgICAgLy8ga2VlcCBsb29raW5nIGZvciBwcmVjZWVkIGxheWVyIHRoYXQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgICAgY29uc3QgcHJlY2VlZEl0ZW1JZCA9IHByZXNlcnZlZE9yZGVyW2kgLSAxXTtcbiAgICAgICAgcHJlY2VlZElkeCA9IG5ld0l0ZW1zLmZpbmRJbmRleChkID0+IGQuaWQgPT09IHByZWNlZWRJdGVtSWQpO1xuICAgICAgfVxuICAgICAgaWYgKHByZWNlZWRJZHggPiAtMSkge1xuICAgICAgICAvLyBpZiBmb3VuZFxuICAgICAgICBpbnNlcnRBdCA9IHByZWNlZWRJZHggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICBuZXdJdGVtcyA9IGFycmF5SW5zZXJ0KG5ld0l0ZW1zLCBpbnNlcnRBdCwgaXRlbSk7XG4gIH1cbiAgcmV0dXJuIG5ld0l0ZW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlOiBWaXNTdGF0ZSwgbGF5ZXJDb25maWc6IGFueSk6IExheWVyIHwgbnVsbCB7XG4gIC8vIGNoZWNrIGlmIHRoZSBsYXllciBjb25maWcgaXMgcGFyc2VkXG4gIGNvbnN0IHBhcnNlZExheWVyQ29uZmlnID0gaXNTYXZlZExheWVyQ29uZmlnVjEobGF5ZXJDb25maWcpXG4gICAgPyBwYXJzZUxheWVyQ29uZmlnKHN0YXRlLnNjaGVtYSwgbGF5ZXJDb25maWcpXG4gICAgOiBsYXllckNvbmZpZztcblxuICBpZiAoIXBhcnNlZExheWVyQ29uZmlnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLy8gZmlyc3QgdmFsaWRhdGUgY29uZmlnIGFnYWluc3QgZGF0YXNldFxuICBjb25zdCB7dmFsaWRhdGVkLCBmYWlsZWR9ID0gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICBbcGFyc2VkTGF5ZXJDb25maWddLFxuICAgIHthbGxvd0VtcHR5Q29sdW1uOiB0cnVlfVxuICApO1xuXG4gIGlmIChmYWlsZWQ/Lmxlbmd0aCB8fCAhdmFsaWRhdGVkLmxlbmd0aCkge1xuICAgIC8vIGZhaWxlZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZWRbMF07XG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgcmV0dXJuIG5ld0xheWVyO1xufVxuXG4vKipcbiAqIEdldCBsb2FkZWQgbGF5ZXIgZnJvbSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTGF5ZXIoXG4gIG5ld0xheWVyOiBMYXllcixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRMYXllciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRWaXNTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKFxuICAgIHtsYXllcnM6IFtuZXdMYXllcl0sIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZF19LFxuICAgIHNjaGVtYVxuICApO1xuICByZXR1cm4gc2VyaWFsaXplZFZpc1N0YXRlPy5sYXllcnM/LlswXTtcbn1cblxuLyoqXG4gKiBHZXQgdmlzIHN0YXRlIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmlzU3RhdGUoXG4gIHZpc1N0YXRlOiBQYXJ0aWFsPFZpc1N0YXRlPixcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYUNsYXNzXG4pOiBQYXJzZWRWaXNTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNhdmVkU3RhdGUgPSBzY2hlbWEuZ2V0Q29uZmlnVG9TYXZlKHtcbiAgICB2aXNTdGF0ZVxuICB9KTtcbiAgcmV0dXJuIHNhdmVkU3RhdGUgPyBzY2hlbWEucGFyc2VTYXZlZENvbmZpZyhzYXZlZFN0YXRlKT8udmlzU3RhdGUgOiB1bmRlZmluZWQ7XG59XG4vKipcbiAqIE1lcmdlIGxheWVycyBmcm9tIGRlLXNlcmlhbGl6ZWQgc3RhdGUsIGlmIG5vIGZpZWxkcyBvciBkYXRhIGFyZSBsb2FkZWRcbiAqIHNhdmUgaXQgZm9yIGxhdGVyXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VMYXllcnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGxheWVyc1RvTWVyZ2U6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gZnJvbUNvbmZpZ1xuICAgID8gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobGF5ZXJzVG9NZXJnZSlcbiAgICA6IHN0YXRlLnByZXNlcnZlTGF5ZXJPcmRlcjtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxheWVyc1RvTWVyZ2UpIHx8ICFsYXllcnNUb01lcmdlLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkb24ndCBtZXJnZSBsYXllciBpZiBkYXRhc2V0IGlzIGJlaW5nIG1lcmdlZFxuICBjb25zdCB1bm1lcmdlZDogUGFyc2VkTGF5ZXJbXSA9IFtdO1xuICBjb25zdCB0b01lcmdlOiBQYXJzZWRMYXllcltdID0gW107XG4gIGxheWVyc1RvTWVyZ2UuZm9yRWFjaCgobDogUGFyc2VkTGF5ZXIpID0+IHtcbiAgICBpZiAobD8uY29uZmlnPy5kYXRhSWQgJiYgc3RhdGUuaXNNZXJnaW5nRGF0YXNldHNbbC5jb25maWcuZGF0YUlkXSkge1xuICAgICAgdW5tZXJnZWQucHVzaChsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9NZXJnZS5wdXNoKGwpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3Qge3ZhbGlkYXRlZDogbWVyZ2VkTGF5ZXIsIGZhaWxlZH0gPSB2YWxpZGF0ZUxheWVyc0J5RGF0YXNldHMoXG4gICAgc3RhdGUuZGF0YXNldHMsXG4gICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgIHRvTWVyZ2VcbiAgKTtcbiAgdW5tZXJnZWQucHVzaCguLi5mYWlsZWQpO1xuICAvLyBwdXQgbmV3IGxheWVycyBpbiBmcm9udCBvZiBjdXJyZW50IGxheWVyc1xuICBjb25zdCB7bmV3TGF5ZXJPcmRlciwgbmV3TGF5ZXJzfSA9IGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICAgIHN0YXRlLmxheWVycyxcbiAgICBtZXJnZWRMYXllcixcbiAgICBzdGF0ZS5sYXllck9yZGVyLFxuICAgIHByZXNlcnZlTGF5ZXJPcmRlclxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdMYXllcnMsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlcixcbiAgICBwcmVzZXJ2ZUxheWVyT3JkZXIsXG4gICAgbGF5ZXJUb0JlTWVyZ2VkOiBbLi4uc3RhdGUubGF5ZXJUb0JlTWVyZ2VkLCAuLi51bm1lcmdlZF1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExheWVyQXRSaWdodE9yZGVyKFxuICBjdXJyZW50TGF5ZXJzLFxuICBsYXllcnNUb0luc2VydCxcbiAgY3VycmVudE9yZGVyLFxuICBwcmVzZXJ2ZWRPcmRlcjogc3RyaW5nW10gPSBbXVxuKSB7XG4gIGlmICghbGF5ZXJzVG9JbnNlcnQ/Lmxlbmd0aCkge1xuICAgIHJldHVybiB7bmV3TGF5ZXJzOiBjdXJyZW50TGF5ZXJzLCBuZXdMYXllck9yZGVyOiBjdXJyZW50T3JkZXJ9O1xuICB9XG4gIC8vIHBlcnNlcnZlZE9yZGVyIFsnYScsICdiJywgJ2MnXTtcbiAgLy8gbGF5ZXJPcmRlciBbJ2EnLCAnYicsICdjJ11cbiAgY29uc3QgY3VycmVudExheWVyUXVldWUgPSBjdXJyZW50T3JkZXJcbiAgICAubWFwKGlkID0+IGZpbmRCeUlkKGlkKShjdXJyZW50TGF5ZXJzKSlcbiAgICAuZmlsdGVyKGxheWVyID0+IEJvb2xlYW4obGF5ZXIpKTtcbiAgY29uc3QgbmV3TGF5ZXJzID0gY3VycmVudExheWVycy5jb25jYXQobGF5ZXJzVG9JbnNlcnQpO1xuICBjb25zdCBuZXdMYXllck9yZGVyUXVldWUgPSBpbnNlcnRJdGVtQmFzZWRPblByZXNlcnZlZE9yZGVyKFxuICAgIGN1cnJlbnRMYXllclF1ZXVlLFxuICAgIGxheWVyc1RvSW5zZXJ0LFxuICAgIHByZXNlcnZlZE9yZGVyLFxuICAgIHRydWVcbiAgKTtcblxuICAvLyByZWNvbnN0cnVjdCBsYXllck9yZGVyIGFmdGVyIGluc2VydFxuICBjb25zdCBuZXdMYXllck9yZGVyID0gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMobmV3TGF5ZXJPcmRlclF1ZXVlKTtcblxuICByZXR1cm4ge1xuICAgIG5ld0xheWVyT3JkZXIsXG4gICAgbmV3TGF5ZXJzXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgaW50ZXJhY3Rpb25zIHdpdGggc2F2ZWQgY29uZmlnXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvbnM8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGludGVyYWN0aW9uVG9CZU1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPiB8IHVuZGVmaW5lZCxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBjb25zdCBtZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gPSB7fTtcbiAgY29uc3QgdW5tZXJnZWQ6IFBhcnRpYWw8U2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4gPSB7fTtcblxuICBpZiAoaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkKSB7XG4gICAgKE9iamVjdC5rZXlzKGludGVyYWN0aW9uVG9CZU1lcmdlZCkgYXMgQXJyYXk8a2V5b2YgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZz4pLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghc3RhdGUuaW50ZXJhY3Rpb25Db25maWdba2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPVxuICAgICAgICBrZXkgPT09ICd0b29sdGlwJyB8fCBrZXkgPT09ICdicnVzaCcgPyBzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldLmNvbmZpZyA6IG51bGw7XG5cbiAgICAgIGNvbnN0IHtlbmFibGVkLCAuLi5jb25maWdTYXZlZH0gPSBpbnRlcmFjdGlvblRvQmVNZXJnZWRba2V5XSB8fCB7fTtcblxuICAgICAgbGV0IGNvbmZpZ1RvTWVyZ2UgPSBjb25maWdTYXZlZDtcblxuICAgICAgaWYgKGtleSA9PT0gJ3Rvb2x0aXAnKSB7XG4gICAgICAgIGNvbnN0IHttZXJnZWRUb29sdGlwLCB1bm1lcmdlZFRvb2x0aXB9ID0gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29uZmlnU2F2ZWQgYXMgU2F2ZWRJbnRlcmFjdGlvbkNvbmZpZ1sndG9vbHRpcCddXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gbWVyZ2UgbmV3IGRhdGFzZXQgdG9vbHRpcHMgd2l0aCBvcmlnaW5hbCBkYXRhc2V0IHRvb2x0aXBzXG4gICAgICAgIGNvbmZpZ1RvTWVyZ2UgPSB7XG4gICAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgICAuLi4oY3VycmVudENvbmZpZyBhcyBUb29sdGlwSW5mb1snY29uZmlnJ10pLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIC4uLm1lcmdlZFRvb2x0aXBcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHVubWVyZ2VkVG9vbHRpcCkubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIHVubWVyZ2VkLnRvb2x0aXAgPSB7ZmllbGRzVG9TaG93OiB1bm1lcmdlZFRvb2x0aXAsIGVuYWJsZWQ6IEJvb2xlYW4oZW5hYmxlZCl9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lcmdlZFtrZXldID0ge1xuICAgICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1trZXldLFxuICAgICAgICBlbmFibGVkOiBCb29sZWFuKGVuYWJsZWQpLFxuICAgICAgICAuLi4oY3VycmVudENvbmZpZ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25maWc6IHBpY2soXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLi4uY3VycmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgIC4uLmNvbmZpZ1RvTWVyZ2VcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAuLi5tZXJnZWRcbiAgICB9LFxuICAgIGludGVyYWN0aW9uVG9CZU1lcmdlZDogc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uKHN0YXRlLCB1bm1lcmdlZClcbiAgfTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gc2F2ZWRVbm1lcmdlZEludGVyYWN0aW9uPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB1bm1lcmdlZDogUGFydGlhbDxTYXZlZEludGVyYWN0aW9uQ29uZmlnPlxuKSB7XG4gIGlmICghdW5tZXJnZWQ/LnRvb2x0aXA/LmZpZWxkc1RvU2hvdykge1xuICAgIHJldHVybiBzdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sdGlwOiB7XG4gICAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvblRvQmVNZXJnZWQudG9vbHRpcCxcbiAgICAgIC4uLih0eXBlb2YgdW5tZXJnZWQ/LnRvb2x0aXA/LmVuYWJsZWQgPT09ICdib29sZWFuJ1xuICAgICAgICA/IHtlbmFibGVkOiB1bm1lcmdlZC50b29sdGlwLmVuYWJsZWR9XG4gICAgICAgIDoge30pLFxuICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgIC4uLnN0YXRlLmludGVyYWN0aW9uVG9CZU1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93LFxuICAgICAgICAuLi51bm1lcmdlZD8udG9vbHRpcD8uZmllbGRzVG9TaG93XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlSW50ZXJhY3Rpb25EYXRhc2V0SWRzKGludGVyYWN0aW9uQ29uZmlnLCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKGludGVyYWN0aW9uQ29uZmlnPy50b29sdGlwPy5maWVsZHNUb1Nob3dbZGF0YUlkXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcCxcbiAgICAgICAgZmllbGRzVG9TaG93OiB7XG4gICAgICAgICAgW2RhdGFJZFRvUmVwbGFjZV06IGludGVyYWN0aW9uQ29uZmlnPy50b29sdGlwPy5maWVsZHNUb1Nob3dbZGF0YUlkXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogTWVyZ2Ugc3BsaXRNYXBzIGNvbmZpZyB3aXRoIGN1cnJlbnQgdmlzU3RldGUuXG4gKiAxLiBpZiBjdXJyZW50IG1hcCBpcyBzcGxpdCwgYnV0IHNwbGl0TWFwIERPRVNOT1QgY29udGFpbiBtYXBzXG4gKiAgICA6IGRvbid0IG1lcmdlIGFueXRoaW5nXG4gKiAyLiBpZiBjdXJyZW50IG1hcCBpcyBOT1Qgc3BsaXQsIGJ1dCBzcGxpdE1hcHMgY29udGFpbiBtYXBzXG4gKiAgICA6IGFkZCB0byBzcGxpdE1hcHMsIGFuZCBhZGQgY3VycmVudCBsYXllcnMgdG8gc3BsaXRNYXBzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVNwbGl0TWFwczxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgc3BsaXRNYXBzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydzcGxpdE1hcHMnXSA9IFtdLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGNvbnN0IG1lcmdlZCA9IFsuLi5zdGF0ZS5zcGxpdE1hcHNdO1xuICBjb25zdCB1bm1lcmdlZCA9IFtdO1xuICBzcGxpdE1hcHMuZm9yRWFjaCgoc20sIGkpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoc20ubGF5ZXJzKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBlbnRyaWVzLmZvckVhY2goKFtpZCwgdmFsdWVdKSA9PiB7XG4gICAgICAgIC8vIGNoZWNrIGlmIGxheWVyIGV4aXN0c1xuICAgICAgICBjb25zdCBwdXNoVG8gPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGlkKSA/IG1lcmdlZCA6IHVubWVyZ2VkO1xuXG4gICAgICAgIC8vIGNyZWF0ZSBtYXAgcGFuZWwgaWYgY3VycmVudCBtYXAgaXMgbm90IHNwbGl0XG4gICAgICAgIHB1c2hUb1tpXSA9IHB1c2hUb1tpXSB8fCB7XG4gICAgICAgICAgbGF5ZXJzOiBwdXNoVG8gPT09IG1lcmdlZCA/IGdldEluaXRpYWxNYXBMYXllcnNGb3JTcGxpdE1hcChzdGF0ZS5sYXllcnMpIDogW11cbiAgICAgICAgfTtcbiAgICAgICAgcHVzaFRvW2ldLmxheWVycyA9IHtcbiAgICAgICAgICAuLi5wdXNoVG9baV0ubGF5ZXJzLFxuICAgICAgICAgIFtpZF06IHZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2UgYXJlIG1lcmdpbmcgaWYgdGhlcmUgYXJlIG5vIGxheWVycyBpbiBib3RoIHNwbGl0IG1hcFxuICAgICAgbWVyZ2VkLnB1c2goc20pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzcGxpdE1hcHM6IG1lcmdlZCxcbiAgICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbLi4uc3RhdGUuc3BsaXRNYXBzVG9CZU1lcmdlZCwgLi4udW5tZXJnZWRdXG4gIH07XG59XG5cbi8qKlxuICogTWVyZ2UgZWZmZWN0cyB3aXRoIHNhdmVkIGNvbmZpZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VFZmZlY3RzPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBlZmZlY3RzOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydlZmZlY3RzJ10sXG4gIGZyb21Db25maWc/OiBib29sZWFuXG4pOiBTIHtcbiAgY29uc3QgbmV3RWZmZWN0cyA9IFtcbiAgICAuLi5zdGF0ZS5lZmZlY3RzLFxuICAgIC4uLihlZmZlY3RzIHx8IFtdKVxuICAgICAgLm1hcChlZmZlY3QgPT5cbiAgICAgICAgZnJvbUNvbmZpZ1xuICAgICAgICAgID8gLy8gY29sbGFwc2UgYWxsIHBhbmVscyB3aGVuIGxvYWRpbmcgZWZmZWN0c1xuXG4gICAgICAgICAgICBjcmVhdGVEZWNrRWZmZWN0RnJvbUNvbmZpZyhcbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICBtZXJnZUVmZmVjdFBhcmFtcyhlZmZlY3QsIHtjb25maWc6IHtpc0NvbmZpZ0FjdGl2ZTogZmFsc2V9fSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IChlZmZlY3QgYXMgRWZmZWN0VHlwZSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoZWZmZWN0ID0+IHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZWZmZWN0ICYmIGVmZmVjdC5pc1ZhbGlkVG9TYXZlKCkpO1xuICAgICAgfSlcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzOiBuZXdFZmZlY3RzLFxuICAgIGVmZmVjdE9yZGVyOiBuZXdFZmZlY3RzLm1hcChlZmZlY3QgPT4gZWZmZWN0LmlkKVxuICB9O1xufVxuXG4vKipcbiAqIE1lcmdlIGludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAgd2l0aCBzYXZlZCBjb25maWcsXG4gKiB2YWxpZGF0ZSBmaWVsZHNUb1Nob3dcbiAqXG4gKiBAcGFyYW0gc3RhdGVcbiAqIEBwYXJhbSB0b29sdGlwQ29uZmlnXG4gKiBAcmV0dXJuIC0ge21lcmdlZFRvb2x0aXA6IHt9LCB1bm1lcmdlZFRvb2x0aXA6IHt9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJbnRlcmFjdGlvblRvb2x0aXBDb25maWcoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgdG9vbHRpcENvbmZpZzogUGljazxUb29sdGlwSW5mb1snY29uZmlnJ10sICdmaWVsZHNUb1Nob3cnPiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgdW5tZXJnZWRUb29sdGlwOiBUb29sdGlwSW5mb1snY29uZmlnJ11bJ2ZpZWxkc1RvU2hvdyddID0ge307XG4gIGNvbnN0IG1lcmdlZFRvb2x0aXA6IFRvb2x0aXBJbmZvWydjb25maWcnXVsnZmllbGRzVG9TaG93J10gPSB7fTtcblxuICBpZiAoXG4gICAgIXRvb2x0aXBDb25maWcgfHxcbiAgICAhdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cgfHxcbiAgICAhT2JqZWN0LmtleXModG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3cpLmxlbmd0aFxuICApIHtcbiAgICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGRhdGFJZCBpbiB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvdykge1xuICAgIGlmICghc3RhdGUuZGF0YXNldHNbZGF0YUlkXSB8fCBzdGF0ZS5pc01lcmdpbmdEYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgICAvLyBpcyBub3QgeWV0IGxvYWRlZFxuICAgICAgdW5tZXJnZWRUb29sdGlwW2RhdGFJZF0gPSB0b29sdGlwQ29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBkYXRhc2V0IGlzIGxvYWRlZFxuICAgICAgY29uc3QgYWxsRmllbGRzID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXS5maWVsZHMubWFwKGQgPT4gZC5uYW1lKTtcbiAgICAgIGNvbnN0IGZvdW5kRmllbGRzVG9TaG93ID0gdG9vbHRpcENvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXS5maWx0ZXIoZmllbGQgPT5cbiAgICAgICAgYWxsRmllbGRzLmluY2x1ZGVzKGZpZWxkLm5hbWUpXG4gICAgICApO1xuXG4gICAgICBtZXJnZWRUb29sdGlwW2RhdGFJZF0gPSBmb3VuZEZpZWxkc1RvU2hvdztcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge21lcmdlZFRvb2x0aXAsIHVubWVyZ2VkVG9vbHRpcH07XG59XG4vKipcbiAqIE1lcmdlIGxheWVyQmxlbmRpbmcgd2l0aCBzYXZlZFxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTGF5ZXJCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgbGF5ZXJCbGVuZGluZzogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJCbGVuZGluZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChsYXllckJsZW5kaW5nICYmIExBWUVSX0JMRU5ESU5HU1tsYXllckJsZW5kaW5nXSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyQmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIE1lcmdlIG92ZXJsYXlCbGVuZGluZyB3aXRoIHNhdmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZU92ZXJsYXlCbGVuZGluZzxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgb3ZlcmxheUJsZW5kaW5nOiBOb25OdWxsYWJsZTxQYXJzZWRDb25maWdbJ3Zpc1N0YXRlJ10+WydvdmVybGF5QmxlbmRpbmcnXSxcbiAgZnJvbUNvbmZpZz86IGJvb2xlYW5cbik6IFMge1xuICBpZiAob3ZlcmxheUJsZW5kaW5nICYmIE9WRVJMQVlfQkxFTkRJTkdTW292ZXJsYXlCbGVuZGluZ10pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIE1lcmdlIGFuaW1hdGlvbiBjb25maWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQW5pbWF0aW9uQ29uZmlnPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhbmltYXRpb246IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2FuaW1hdGlvbkNvbmZpZyddLFxuICBmcm9tQ29uZmlnPzogYm9vbGVhblxuKTogUyB7XG4gIGlmIChhbmltYXRpb24gJiYgYW5pbWF0aW9uLmN1cnJlbnRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uYW5pbWF0aW9uLFxuICAgICAgICBkb21haW46IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIGxheWVyIGNvbHVtbnMgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICogQHBhcmFtIHNhdmVkQ29sc1xuICogQHBhcmFtIGVtcHR5Q29sc1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm4gLSB2YWxpZGF0ZWQgY29sdW1ucyBvciBudWxsXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2F2ZWRMYXllckNvbHVtbnMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBzYXZlZENvbHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH0gPSB7fSxcbiAgZW1wdHlDb2xzOiBMYXllckNvbHVtbnMsXG4gIG9wdGlvbnM6IHt0aHJvd09uRXJyb3I/OiBib29sZWFufSA9IHt9XG4pIHtcbiAgLy8gUHJlcGFyZSBjb2x1bW5zIGZvciB0aGUgdmFsaWRhdG9yXG4gIGNvbnN0IGNvbHVtbnM6IHR5cGVvZiBlbXB0eUNvbHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZW1wdHlDb2xzKSkge1xuICAgIGNvbHVtbnNba2V5XSA9IHsuLi5lbXB0eUNvbHNba2V5XX07XG5cbiAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29sc1trZXldO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KCh7bmFtZX0pID0+IG5hbWUgPT09IHNhdmVkKTtcblxuICAgICAgaWYgKGZpZWxkSWR4ID4gLTEpIHtcbiAgICAgICAgLy8gdXBkYXRlIGZvdW5kIGNvbHVtbnNcbiAgICAgICAgY29sdW1uc1trZXldLmZpZWxkSWR4ID0gZmllbGRJZHg7XG4gICAgICAgIGNvbHVtbnNba2V5XS52YWx1ZSA9IHNhdmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGZpbmQgYWN0dWFsIGNvbHVtbiBmaWVsZElkeCwgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZFxuICBjb25zdCBhbGxDb2xGb3VuZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmV2ZXJ5KGtleSA9PlxuICAgIHZhbGlkYXRlQ29sdW1uKGNvbHVtbnNba2V5XSwgY29sdW1ucywgZmllbGRzKVxuICApO1xuXG4gIGNvbnN0IHJ2ID0gYWxsQ29sRm91bmQgPyBjb2x1bW5zIDogbnVsbDtcbiAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgY29uc3QgcmVxdWlyZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoZW1wdHlDb2xzKS5maWx0ZXIoayA9PiAhZW1wdHlDb2xzW2tdLm9wdGlvbmFsKTtcbiAgICBjb25zdCBtaXNzaW5nQ29sdW1ucyA9IHJlcXVpcmVkQ29sdW1ucy5maWx0ZXIoayA9PiAhY29sdW1ucz8uW2tdLnZhbHVlKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgY29sdW1uczogJHttaXNzaW5nQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWdDb2x1bW5zID0gT2JqZWN0LmtleXMoc2F2ZWRDb2xzKTtcbiAgICBjb25zdCBpbnZhbGlkQ29sdW1ucyA9IGNvbmZpZ0NvbHVtbnMuZmlsdGVyKGsgPT4gIWNvbHVtbnM/LltrXT8udmFsdWUpO1xuICAgIGlmIChpbnZhbGlkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgY29sdW1uczogJHtpbnZhbGlkQ29sdW1ucy5qb2luKCcsICcpfWApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29sdW1uKFxuICBjb2x1bW46IExheWVyQ29sdW1uICYge3ZhbGlkYXRvcj86IHR5cGVvZiB2YWxpZGF0ZUNvbHVtbn0sXG4gIGNvbHVtbnM6IExheWVyQ29sdW1ucyxcbiAgYWxsRmllbGRzOiBLZXBsZXJUYWJsZVsnZmllbGRzJ11cbik6IGJvb2xlYW4ge1xuICBpZiAoY29sdW1uLm9wdGlvbmFsIHx8IGNvbHVtbi52YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChjb2x1bW4udmFsaWRhdG9yKSB7XG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0b3IoY29sdW1uLCBjb2x1bW5zLCBhbGxGaWVsZHMpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCB0ZXh0IGxhYmVsIGNvbmZpZyB3aXRoIG5ldyBkYXRhXG4gKiByZWZlciB0byB2aXMtc3RhdGUtc2NoZW1hLmpzIFRleHRMYWJlbFNjaGVtYVYxXG4gKlxuICogQHBhcmFtIHtBcnJheTxPYmplY3Q+fSBmaWVsZHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzYXZlZFRleHRMYWJlbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge09iamVjdH0gLSB2YWxpZGF0ZWQgdGV4dGxhYmVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVGV4dExhYmVsKFxuICBmaWVsZHMsXG4gIFtsYXllclRleHRMYWJlbF0sXG4gIHNhdmVkVGV4dExhYmVsLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKSB7XG4gIGNvbnN0IHNhdmVkVGV4dExhYmVscyA9IEFycmF5LmlzQXJyYXkoc2F2ZWRUZXh0TGFiZWwpID8gc2F2ZWRUZXh0TGFiZWwgOiBbc2F2ZWRUZXh0TGFiZWxdO1xuXG4gIC8vIHZhbGlkYXRlIGZpZWxkXG4gIHJldHVybiBzYXZlZFRleHRMYWJlbHMubWFwKHRleHRMYWJlbCA9PiB7XG4gICAgY29uc3QgZmllbGQgPSB0ZXh0TGFiZWwuZmllbGRcbiAgICAgID8gZmllbGRzLmZpbmQoZmQgPT5cbiAgICAgICAgICBPYmplY3Qua2V5cyh0ZXh0TGFiZWwuZmllbGQpLmV2ZXJ5KGtleSA9PiB0ZXh0TGFiZWwuZmllbGRba2V5XSA9PT0gZmRba2V5XSlcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50aHJvd09uRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdGV4dCBsYWJlbCBmaWVsZDogJHtKU09OLnN0cmluZ2lmeSh0ZXh0TGFiZWwuZmllbGQpfWApO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhsYXllclRleHRMYWJlbCkucmVkdWNlKFxuICAgICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2tleV06IGtleSA9PT0gJ2ZpZWxkJyA/IGZpZWxkIDogdGV4dExhYmVsW2tleV0gfHwgbGF5ZXJUZXh0TGFiZWxba2V5XVxuICAgICAgfSksXG4gICAgICB7fVxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHNhdmVkIHZpc3VhbCBjaGFubmVscyBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVNhdmVkVmlzdWFsQ2hhbm5lbHMoXG4gIGZpZWxkczogS2VwbGVyVGFibGVbJ2ZpZWxkcyddLFxuICBuZXdMYXllcjogTGF5ZXIsXG4gIHNhdmVkTGF5ZXI6IFBhcnNlZExheWVyLFxuICBvcHRpb25zOiB7dGhyb3dPbkVycm9yPzogYm9vbGVhbn0gPSB7fVxuKTogbnVsbCB8IExheWVyIHtcbiAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2ZpZWxkLCBzY2FsZSwga2V5fSkgPT4ge1xuICAgIGxldCBmb3VuZEZpZWxkO1xuICAgIGlmIChzYXZlZExheWVyLmNvbmZpZykge1xuICAgICAgaWYgKHNhdmVkTGF5ZXIuY29uZmlnW2ZpZWxkXSkge1xuICAgICAgICBmb3VuZEZpZWxkID0gZmllbGRzLmZpbmQoXG4gICAgICAgICAgZmQgPT4gc2F2ZWRMYXllci5jb25maWcgJiYgZmQubmFtZSA9PT0gc2F2ZWRMYXllci5jb25maWdbZmllbGRdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm91bmRDaGFubmVsID0ge1xuICAgICAgICAuLi4oZm91bmRGaWVsZCA/IHtbZmllbGRdOiBmb3VuZEZpZWxkfSA6IHt9KSxcbiAgICAgICAgLi4uKHNhdmVkTGF5ZXIuY29uZmlnW3NjYWxlXSA/IHtbc2NhbGVdOiBzYXZlZExheWVyLmNvbmZpZ1tzY2FsZV19IDoge30pXG4gICAgICB9O1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGZvdW5kQ2hhbm5lbCkubGVuZ3RoKSB7XG4gICAgICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKGZvdW5kQ2hhbm5lbCk7XG4gICAgICB9XG5cbiAgICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgICAgaWYgKG9wdGlvbnMudGhyb3dPbkVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IHNhdmVkTGF5ZXIuY29uZmlnPy5bZmllbGRdPy5uYW1lO1xuICAgICAgICBpZiAoZmllbGROYW1lICYmIGZpZWxkTmFtZSAhPT0gbmV3TGF5ZXIuY29uZmlnW2ZpZWxkXT8ubmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgaGFzIGludmFsaWQgdmlzdWFsIGNoYW5uZWwgZmllbGQ6ICR7ZmllbGR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbnR5cGUgVmFsaWRhdGVMYXllck9wdGlvbiA9IHtcbiAgYWxsb3dFbXB0eUNvbHVtbj86IGJvb2xlYW47XG4gIHRocm93T25FcnJvcj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVMYXllcnNCeURhdGFzZXRzKFxuICBkYXRhc2V0czogRGF0YXNldHMsXG4gIGxheWVyQ2xhc3NlczogVmlzU3RhdGVbJ2xheWVyQ2xhc3NlcyddLFxuICBsYXllcnM6IE5vbk51bGxhYmxlPFBhcnNlZENvbmZpZ1sndmlzU3RhdGUnXT5bJ2xheWVycyddID0gW10sXG4gIG9wdGlvbnM/OiBWYWxpZGF0ZUxheWVyT3B0aW9uXG4pIHtcbiAgY29uc3QgdmFsaWRhdGVkOiBMYXllcltdID0gW107XG4gIGNvbnN0IGZhaWxlZDogTm9uTnVsbGFibGU8UGFyc2VkQ29uZmlnWyd2aXNTdGF0ZSddPlsnbGF5ZXJzJ10gPSBbXTtcblxuICBsYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgbGV0IHZhbGlkYXRlTGF5ZXI6IExheWVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAobGF5ZXI/LmNvbmZpZz8uZGF0YUlkKSB7XG4gICAgICBpZiAoZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0pIHtcbiAgICAgICAgLy8gZGF0YXNldHMgYXJlIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHZhbGlkYXRlTGF5ZXIgPSB2YWxpZGF0ZUxheWVyV2l0aERhdGEoXG4gICAgICAgICAgZGF0YXNldHNbbGF5ZXIuY29uZmlnLmRhdGFJZF0sXG4gICAgICAgICAgbGF5ZXIsXG4gICAgICAgICAgbGF5ZXJDbGFzc2VzLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGVMYXllcikge1xuICAgICAgdmFsaWRhdGVkLnB1c2godmFsaWRhdGVMYXllcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRhdGFzZXRzIG5vdCB5ZXQgbG9hZGVkXG4gICAgICBmYWlsZWQucHVzaChsYXllcik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge3ZhbGlkYXRlZCwgZmFpbGVkfTtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2F2ZWQgbGF5ZXIgY29uZmlnIHdpdGggbmV3IGRhdGEsXG4gKiB1cGRhdGUgZmllbGRJZHggYmFzZWQgb24gbmV3IGZpZWxkc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShcbiAge2ZpZWxkcywgaWQ6IGRhdGFJZH06IEtlcGxlclRhYmxlLFxuICBzYXZlZExheWVyOiBQYXJzZWRMYXllcixcbiAgbGF5ZXJDbGFzc2VzOiBWaXNTdGF0ZVsnbGF5ZXJDbGFzc2VzJ10sXG4gIG9wdGlvbnM6IFZhbGlkYXRlTGF5ZXJPcHRpb24gPSB7fVxuKTogTGF5ZXIgfCBudWxsIHtcbiAgY29uc3Qge3R5cGV9ID0gc2F2ZWRMYXllcjtcbiAgY29uc3Qge3Rocm93T25FcnJvcn0gPSBvcHRpb25zO1xuICAvLyBsYXllciBkb2VzbnQgaGF2ZSBhIHZhbGlkIHR5cGVcbiAgaWYgKCF0eXBlIHx8ICFsYXllckNsYXNzZXMuaGFzT3duUHJvcGVydHkodHlwZSkgfHwgIXNhdmVkTGF5ZXIuY29uZmlnKSB7XG4gICAgaWYgKHRocm93T25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBoYXMgaW52YWxpZCB0eXBlIFwiJHt0eXBlfVwiIG9yIGNvbmZpZyBpcyBtaXNzaW5nYCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1t0eXBlXSh7XG4gICAgaWQ6IHNhdmVkTGF5ZXIuaWQsXG4gICAgZGF0YUlkLFxuICAgIGxhYmVsOiBzYXZlZExheWVyLmNvbmZpZy5sYWJlbCxcbiAgICBjb2xvcjogc2F2ZWRMYXllci5jb25maWcuY29sb3IsXG4gICAgaXNWaXNpYmxlOiBzYXZlZExheWVyLmNvbmZpZy5pc1Zpc2libGUsXG4gICAgaGlkZGVuOiBzYXZlZExheWVyLmNvbmZpZy5oaWRkZW4sXG4gICAgaGlnaGxpZ2h0Q29sb3I6IHNhdmVkTGF5ZXIuY29uZmlnLmhpZ2hsaWdodENvbG9yXG4gIH0pO1xuXG4gIC8vIGZpbmQgY29sdW1uIGZpZWxkSWR4XG4gIGNvbnN0IGNvbHVtbkNvbmZpZyA9IG5ld0xheWVyLmdldExheWVyQ29sdW1ucygpO1xuICBpZiAoT2JqZWN0LmtleXMoY29sdW1uQ29uZmlnKSkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB2YWxpZGF0ZVNhdmVkTGF5ZXJDb2x1bW5zKFxuICAgICAgZmllbGRzLFxuICAgICAgc2F2ZWRMYXllci5jb25maWcuY29sdW1ucyxcbiAgICAgIGNvbHVtbkNvbmZpZyxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIGlmIChjb2x1bW5zKSB7XG4gICAgICBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7Y29sdW1uc30pO1xuICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuYWxsb3dFbXB0eUNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gdmlzdWFsIGNoYW5uZWwgZmllbGQgaXMgc2F2ZWQgdG8gYmUge25hbWUsIHR5cGV9XG4gIC8vIGZpbmQgdmlzdWFsIGNoYW5uZWwgZmllbGQgYnkgbWF0Y2hpbmcgYm90aCBuYW1lIGFuZCB0eXBlXG4gIC8vIHJlZmVyIHRvIHZpcy1zdGF0ZS1zY2hlbWEuanMgVmlzdWFsQ2hhbm5lbFNjaGVtYVYxXG4gIG5ld0xheWVyID0gdmFsaWRhdGVTYXZlZFZpc3VhbENoYW5uZWxzKGZpZWxkcywgbmV3TGF5ZXIsIHNhdmVkTGF5ZXIsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IHRleHRMYWJlbCA9XG4gICAgc2F2ZWRMYXllci5jb25maWcudGV4dExhYmVsICYmIG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWxcbiAgICAgID8gdmFsaWRhdGVTYXZlZFRleHRMYWJlbChcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgbmV3TGF5ZXIuY29uZmlnLnRleHRMYWJlbCxcbiAgICAgICAgICBzYXZlZExheWVyLmNvbmZpZy50ZXh0TGFiZWwsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICA6IG5ld0xheWVyLmNvbmZpZy50ZXh0TGFiZWw7XG5cbiAgLy8gY29weSB2aXNDb25maWcgb3ZlciB0byBlbXB0eUxheWVyIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYWxsIHRoZSBwcm9wc1xuICBjb25zdCB2aXNDb25maWcgPSBuZXdMYXllci5jb3B5TGF5ZXJDb25maWcoXG4gICAgbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICBzYXZlZExheWVyLmNvbmZpZy52aXNDb25maWcgfHwge30sXG4gICAge3NoYWxsb3dDb3B5OiBbJ2NvbG9yUmFuZ2UnLCAnc3Ryb2tlQ29sb3JSYW5nZSddfVxuICApO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICB2aXNDb25maWcsXG4gICAgdGV4dExhYmVsXG4gIH0pO1xuXG4gIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICBpZiAoIW5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXllciBpcyBub3QgdmFsaWQgdG8gc2F2ZTogJHtuZXdMYXllci5pZH1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUVkaXRvcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBzYXZlZEVkaXRvcjogU2F2ZWRFZGl0b3IpIHtcbiAgaWYgKCFzYXZlZEVkaXRvcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIC4uLihzYXZlZEVkaXRvci5mZWF0dXJlcyB8fCBbXSldLFxuICAgICAgLy8gaWYgc2F2ZWRFZGl0b3IudmlzaWJsZSBpcyB1bmRlZmluZWQga2VlcCBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgICAgdmlzaWJsZTogc2F2ZWRFZGl0b3IudmlzaWJsZSA/PyBzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBzYXZlZCBsYXllciBjb25maWcgd2l0aCBuZXcgZGF0YSxcbiAqIHVwZGF0ZSBmaWVsZElkeCBiYXNlZCBvbiBuZXcgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURhdGFzZXRzQnlPcmRlcihzdGF0ZTogVmlzU3RhdGUsIG5ld0RhdGFFbnRyaWVzOiBEYXRhc2V0cyk6IERhdGFzZXRzIHtcbiAgY29uc3QgbWVyZ2VkID0ge1xuICAgIC4uLnN0YXRlLmRhdGFzZXRzLFxuICAgIC4uLm5ld0RhdGFFbnRyaWVzXG4gIH07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGUucHJlc2VydmVEYXRhc2V0T3JkZXIpKSB7XG4gICAgLy8gcHJlc2VydmVEYXRhc2V0T3JkZXIgIG1pZ2h0IG5vdCBpbmNsdWRlIHRoZSAgbmV3IGRhdGFzZXRzXG4gICAgY29uc3QgbmV3RGF0YXNldElkcyA9IE9iamVjdC5rZXlzKG1lcmdlZCkuZmlsdGVyKFxuICAgICAgaWQgPT4gIXN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyPy5pbmNsdWRlcyhpZClcbiAgICApO1xuICAgIHJldHVybiBbLi4uc3RhdGUucHJlc2VydmVEYXRhc2V0T3JkZXIsIC4uLm5ld0RhdGFzZXRJZHNdLnJlZHVjZShcbiAgICAgIChhY2N1LCBkYXRhSWQpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIC4uLihtZXJnZWRbZGF0YUlkXSA/IHtbZGF0YUlkXTogbWVyZ2VkW2RhdGFJZF19IDoge30pXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBWSVNfU1RBVEVfTUVSR0VSUzogVmlzU3RhdGVNZXJnZXJzPGFueT4gPSBbXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VMYXllcnMsXG4gICAgcHJvcDogJ2xheWVycycsXG4gICAgdG9NZXJnZVByb3A6ICdsYXllclRvQmVNZXJnZWQnLFxuICAgIHByZXNlcnZlT3JkZXI6ICdwcmVzZXJ2ZUxheWVyT3JkZXInXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VGaWx0ZXJzLFxuICAgIHByb3A6ICdmaWx0ZXJzJyxcbiAgICB0b01lcmdlUHJvcDogJ2ZpbHRlclRvQmVNZXJnZWQnLFxuICAgIHByZXNlcnZlT3JkZXI6ICdwcmVzZXJ2ZUZpbHRlck9yZGVyJyxcbiAgICByZXBsYWNlUGFyZW50RGF0YXNldElkczogcmVwbGFjZUZpbHRlckRhdGFzZXRJZHNcbiAgfSxcbiAge1xuICAgIG1lcmdlOiBtZXJnZUVmZmVjdHMsXG4gICAgcHJvcDogJ2VmZmVjdHMnXG4gIH0sXG4gIHtcbiAgICBtZXJnZTogbWVyZ2VJbnRlcmFjdGlvbnMsXG4gICAgcHJvcDogJ2ludGVyYWN0aW9uQ29uZmlnJyxcbiAgICB0b01lcmdlUHJvcDogJ2ludGVyYWN0aW9uVG9CZU1lcmdlZCcsXG4gICAgcmVwbGFjZVBhcmVudERhdGFzZXRJZHM6IHJlcGxhY2VJbnRlcmFjdGlvbkRhdGFzZXRJZHMsXG4gICAgc2F2ZVVubWVyZ2VkOiBzYXZlZFVubWVyZ2VkSW50ZXJhY3Rpb25cbiAgfSxcbiAge21lcmdlOiBtZXJnZUxheWVyQmxlbmRpbmcsIHByb3A6ICdsYXllckJsZW5kaW5nJ30sXG4gIHttZXJnZTogbWVyZ2VPdmVybGF5QmxlbmRpbmcsIHByb3A6ICdvdmVybGF5QmxlbmRpbmcnfSxcbiAge21lcmdlOiBtZXJnZVNwbGl0TWFwcywgcHJvcDogJ3NwbGl0TWFwcycsIHRvTWVyZ2VQcm9wOiAnc3BsaXRNYXBzVG9CZU1lcmdlZCd9LFxuICB7bWVyZ2U6IG1lcmdlQW5pbWF0aW9uQ29uZmlnLCBwcm9wOiAnYW5pbWF0aW9uQ29uZmlnJ30sXG4gIHttZXJnZTogbWVyZ2VFZGl0b3IsIHByb3A6ICdlZGl0b3InfVxuXTtcbiJdfQ==