@kepler.gl/reducers 3.1.0-alpha.0 → 3.1.0-alpha.2

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 (49) hide show
  1. package/dist/combined-updaters.d.ts +79 -0
  2. package/dist/combined-updaters.js +358 -0
  3. package/dist/composer-helpers.d.ts +24 -0
  4. package/dist/composer-helpers.js +101 -0
  5. package/dist/composers.d.ts +18 -0
  6. package/dist/composers.js +23 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +105 -0
  9. package/dist/data-utils.d.ts +12 -0
  10. package/dist/data-utils.js +57 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +91 -0
  13. package/dist/index.d.ts +35 -0
  14. package/dist/index.js +342 -0
  15. package/dist/interaction-utils.d.ts +29 -0
  16. package/dist/interaction-utils.js +105 -0
  17. package/dist/layer-utils.d.ts +96 -0
  18. package/dist/layer-utils.js +310 -0
  19. package/dist/map-state-updaters.d.ts +93 -0
  20. package/dist/map-state-updaters.js +432 -0
  21. package/dist/map-state.d.ts +75 -0
  22. package/dist/map-state.js +35 -0
  23. package/dist/map-style-updaters.d.ts +179 -0
  24. package/dist/map-style-updaters.js +656 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +34 -0
  27. package/dist/merger-handler.d.ts +10 -0
  28. package/dist/merger-handler.js +105 -0
  29. package/dist/middleware.d.ts +8 -0
  30. package/dist/middleware.js +27 -0
  31. package/dist/provider-state-updaters.d.ts +35 -0
  32. package/dist/provider-state-updaters.js +348 -0
  33. package/dist/provider-state.d.ts +4 -0
  34. package/dist/provider-state.js +35 -0
  35. package/dist/root.d.ts +24 -0
  36. package/dist/root.js +206 -0
  37. package/dist/ui-state-updaters.d.ts +362 -0
  38. package/dist/ui-state-updaters.js +762 -0
  39. package/dist/ui-state.d.ts +3 -0
  40. package/dist/ui-state.js +37 -0
  41. package/dist/vis-state-merger.d.ts +143 -0
  42. package/dist/vis-state-merger.js +812 -0
  43. package/dist/vis-state-selectors.d.ts +10 -0
  44. package/dist/vis-state-selectors.js +30 -0
  45. package/dist/vis-state-updaters.d.ts +546 -0
  46. package/dist/vis-state-updaters.js +3338 -0
  47. package/dist/vis-state.d.ts +155 -0
  48. package/dist/vis-state.js +36 -0
  49. package/package.json +17 -17
@@ -0,0 +1,3338 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = void 0;
9
+ exports.addDefaultLayers = addDefaultLayers;
10
+ exports.addDefaultTooltips = addDefaultTooltips;
11
+ exports.applyCPUFilterUpdater = exports.addLayerUpdater = exports.addFilterUpdater = exports.addEffectUpdater = void 0;
12
+ exports.applyLayerConfigUpdater = applyLayerConfigUpdater;
13
+ exports.applyMergersUpdater = applyMergersUpdater;
14
+ exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
15
+ exports.copyTableColumnUpdater = copyTableColumnUpdater;
16
+ exports.defaultInteractionConfig = exports.createOrUpdateFilterUpdater = exports.createNewDatasetSuccessUpdater = void 0;
17
+ exports.deleteFeatureUpdater = deleteFeatureUpdater;
18
+ exports.duplicateLayerUpdater = void 0;
19
+ exports.initialFileLoadingProgress = initialFileLoadingProgress;
20
+ exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
21
+ exports.layerAnimationChangeUpdater = layerAnimationChangeUpdater;
22
+ exports.layerColorUIChangeUpdater = exports.layerClickUpdater = void 0;
23
+ exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
24
+ exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
25
+ exports.layerFilteredItemsChangeUpdater = layerFilteredItemsChangeUpdater;
26
+ exports.layerHoverUpdater = void 0;
27
+ exports.layerSetIsValidUpdater = layerSetIsValidUpdater;
28
+ exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
29
+ exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
30
+ exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
31
+ exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
32
+ exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
33
+ exports.loadFilesUpdater = exports.loadFilesErrUpdater = void 0;
34
+ exports.loadNextFileUpdater = loadNextFileUpdater;
35
+ exports.makeLoadFileTask = makeLoadFileTask;
36
+ exports.nextFileBatchUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = void 0;
37
+ exports.parseProgress = parseProgress;
38
+ exports.pinTableColumnUpdater = pinTableColumnUpdater;
39
+ exports.prepareStateForDatasetReplace = prepareStateForDatasetReplace;
40
+ exports.processFileContentUpdater = processFileContentUpdater;
41
+ exports.receiveMapConfigUpdater = void 0;
42
+ exports.removeDatasetUpdater = removeDatasetUpdater;
43
+ exports.removeFilterUpdater = exports.removeEffectUpdater = void 0;
44
+ exports.removeLayerUpdater = removeLayerUpdater;
45
+ exports.renameDatasetUpdater = renameDatasetUpdater;
46
+ exports.reorderLayerUpdater = exports.reorderEffectUpdater = void 0;
47
+ exports.replaceDatasetDepsInState = replaceDatasetDepsInState;
48
+ exports.resetMapConfigUpdater = void 0;
49
+ exports.setColumnDisplayFormatUpdater = setColumnDisplayFormatUpdater;
50
+ exports.setEditorModeUpdater = void 0;
51
+ exports.setFeaturesUpdater = setFeaturesUpdater;
52
+ exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
53
+ exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
54
+ exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
55
+ exports.setFilterPlotUpdater = void 0;
56
+ exports.setFilterUpdater = setFilterUpdater;
57
+ exports.setFilterViewUpdater = void 0;
58
+ exports.setInitialLayerConfig = setInitialLayerConfig;
59
+ exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
60
+ exports.setMapInfoUpdater = exports.setLayerAnimationTimeUpdater = void 0;
61
+ exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
62
+ exports.setSelectedFeatureUpdater = void 0;
63
+ exports.setTimeFilterTimelineModeUpdater = setTimeFilterTimelineModeUpdater;
64
+ exports.showDatasetTableUpdater = void 0;
65
+ exports.sortTableColumnUpdater = sortTableColumnUpdater;
66
+ exports.syncTimeFilterWithLayerTimelineUpdater = syncTimeFilterWithLayerTimelineUpdater;
67
+ exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
68
+ exports.toggleSplitMapUpdater = exports.toggleLayerForMapUpdater = exports.toggleLayerAnimationUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleFilterFeatureUpdater = exports.toggleFilterAnimationUpdater = void 0;
69
+ exports.updateAllLayerDomainData = updateAllLayerDomainData;
70
+ exports.updateAnimationDomain = updateAnimationDomain;
71
+ exports.updateDatasetPropsUpdater = updateDatasetPropsUpdater;
72
+ exports.updateEffectUpdater = void 0;
73
+ exports.updateFileLoadingProgressUpdater = updateFileLoadingProgressUpdater;
74
+ exports.updateOverlayBlendingUpdater = exports.updateLayerBlendingUpdater = exports.updateLayerAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = void 0;
75
+ exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
76
+ exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
77
+ exports.updateVisDataUpdater = exports.updateTableColorUpdater = void 0;
78
+ var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
79
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
80
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
81
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
82
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
83
+ var _bbox = _interopRequireDefault(require("@turf/bbox"));
84
+ var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
85
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
86
+ var _window = require("global/window");
87
+ var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
88
+ var _lodash2 = _interopRequireDefault(require("lodash.get"));
89
+ var _lodash3 = _interopRequireDefault(require("lodash.isequal"));
90
+ var _lodash4 = _interopRequireDefault(require("lodash.pick"));
91
+ var _lodash5 = _interopRequireDefault(require("lodash.uniq"));
92
+ var _lodash6 = _interopRequireDefault(require("lodash.xor"));
93
+ var _tasks = _interopRequireWildcard(require("react-palm/tasks"));
94
+ var _tasks2 = require("@kepler.gl/tasks");
95
+ var _actions = require("@kepler.gl/actions");
96
+ var _utils = require("@kepler.gl/utils");
97
+ var _commonUtils = require("@kepler.gl/common-utils");
98
+ var _constants = require("@kepler.gl/constants");
99
+ var _layers = require("@kepler.gl/layers");
100
+ var _composerHelpers = require("./composer-helpers");
101
+ var _mergerHandler = require("./merger-handler");
102
+ var _visStateMerger = require("./vis-state-merger");
103
+ var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
104
+ var _table = require("@kepler.gl/table");
105
+ var _interactionUtils = require("./interaction-utils");
106
+ var _layerUtils = require("./layer-utils");
107
+ var _effects = require("@kepler.gl/effects");
108
+ var _dataUtils = require("./data-utils");
109
+ var _excluded = ["dataId"],
110
+ _excluded2 = ["info"];
111
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
112
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
113
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
114
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
115
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
116
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
117
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
118
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
119
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
120
+ // Copyright contributors to the kepler.gl project
121
+ // Tasks
122
+ // Actions
123
+ // Utils
124
+ // Mergers
125
+ // react-palm
126
+ // disable capture exception for react-palm call to withTask
127
+ (0, _tasks.disableStackCapturing)();
128
+
129
+ /**
130
+ * Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
131
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
132
+ *
133
+ * @public
134
+ * @example
135
+ *
136
+ * import keplerGlReducer, {visStateUpdaters} from 'kepler.gl/reducers';
137
+ * // Root Reducer
138
+ * const reducers = combineReducers({
139
+ * keplerGl: keplerGlReducer,
140
+ * app: appReducer
141
+ * });
142
+ *
143
+ * const composedReducer = (state, action) => {
144
+ * switch (action.type) {
145
+ * case 'CLICK_BUTTON':
146
+ * return {
147
+ * ...state,
148
+ * keplerGl: {
149
+ * ...state.keplerGl,
150
+ * foo: {
151
+ * ...state.keplerGl.foo,
152
+ * visState: visStateUpdaters.enlargeFilterUpdater(
153
+ * state.keplerGl.foo.visState,
154
+ * {idx: 0}
155
+ * )
156
+ * }
157
+ * }
158
+ * };
159
+ * }
160
+ * return reducers(state, action);
161
+ * };
162
+ *
163
+ * export default composedReducer;
164
+ */
165
+ /* eslint-disable @typescript-eslint/no-unused-vars */
166
+ // @ts-ignore
167
+ var visStateUpdaters = null;
168
+ /* eslint-enable @typescript-eslint/no-unused-vars */
169
+
170
+ var defaultInteractionConfig = exports.defaultInteractionConfig = {
171
+ tooltip: {
172
+ id: 'tooltip',
173
+ label: 'interactions.tooltip',
174
+ enabled: true,
175
+ config: {
176
+ fieldsToShow: {},
177
+ compareMode: false,
178
+ compareType: _constants.COMPARE_TYPES.ABSOLUTE
179
+ }
180
+ },
181
+ geocoder: {
182
+ id: 'geocoder',
183
+ label: 'interactions.geocoder',
184
+ enabled: false,
185
+ position: null
186
+ },
187
+ brush: {
188
+ id: 'brush',
189
+ label: 'interactions.brush',
190
+ enabled: false,
191
+ config: {
192
+ // size is in km
193
+ size: 0.5
194
+ }
195
+ },
196
+ coordinate: {
197
+ id: 'coordinate',
198
+ label: 'interactions.coordinate',
199
+ enabled: false,
200
+ position: null
201
+ }
202
+ };
203
+ var DEFAULT_ANIMATION_CONFIG = exports.DEFAULT_ANIMATION_CONFIG = {
204
+ domain: null,
205
+ currentTime: null,
206
+ speed: 1,
207
+ isAnimating: false,
208
+ timeSteps: null,
209
+ timeFormat: null,
210
+ timezone: null,
211
+ defaultTimeFormat: null,
212
+ hideControl: false,
213
+ duration: null
214
+ };
215
+ var DEFAULT_EDITOR = exports.DEFAULT_EDITOR = {
216
+ mode: _constants.EDITOR_MODES.DRAW_POLYGON,
217
+ features: [],
218
+ selectedFeature: null,
219
+ visible: true
220
+ };
221
+
222
+ /**
223
+ * Default initial `visState`
224
+ * @memberof visStateUpdaters
225
+ * @constant
226
+ * @public
227
+ */
228
+ var INITIAL_VIS_STATE = exports.INITIAL_VIS_STATE = {
229
+ // map info
230
+ mapInfo: {
231
+ title: '',
232
+ description: ''
233
+ },
234
+ // layers
235
+ layers: [],
236
+ layerData: [],
237
+ layerToBeMerged: [],
238
+ layerOrder: [],
239
+ // filters
240
+ filters: [],
241
+ filterToBeMerged: [],
242
+ // a collection of multiple dataset
243
+ datasets: {},
244
+ editingDataset: undefined,
245
+ // effects
246
+ effects: [],
247
+ effectOrder: [],
248
+ interactionConfig: defaultInteractionConfig,
249
+ interactionToBeMerged: {},
250
+ layerBlending: 'normal',
251
+ overlayBlending: 'normal',
252
+ hoverInfo: undefined,
253
+ clicked: undefined,
254
+ mousePos: {},
255
+ maxDefaultTooltips: _constants.MAX_DEFAULT_TOOLTIPS,
256
+ // this is used when user split maps
257
+ splitMaps: [
258
+ // this will contain a list of objects to
259
+ // describe the state of layer availability and visibility for each map
260
+ // [
261
+ // {
262
+ // layers: {layer_id: true | false}
263
+ // }
264
+ // ]
265
+ ],
266
+ splitMapsToBeMerged: [],
267
+ isMergingDatasets: {},
268
+ // defaults layer classes
269
+ layerClasses: _layers.LayerClasses,
270
+ // default animation
271
+ // time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
272
+ animationConfig: DEFAULT_ANIMATION_CONFIG,
273
+ editor: DEFAULT_EDITOR,
274
+ fileLoading: false,
275
+ fileLoadingProgress: {},
276
+ loaders: [],
277
+ loadOptions: {},
278
+ // visStateMergers
279
+ mergers: _visStateMerger.VIS_STATE_MERGERS,
280
+ // kepler schemas
281
+ schema: _schemas["default"]
282
+ };
283
+ /**
284
+ * Update state with updated layer and layerData
285
+ *
286
+ */
287
+ function updateStateWithLayerAndData(state, _ref) {
288
+ var layerData = _ref.layerData,
289
+ layer = _ref.layer,
290
+ idx = _ref.idx;
291
+ return _objectSpread(_objectSpread({}, state), {}, {
292
+ layers: state.layers.map(function (lyr, i) {
293
+ return i === idx ? layer : lyr;
294
+ }),
295
+ layerData: layerData ? state.layerData.map(function (d, i) {
296
+ return i === idx ? layerData : d;
297
+ }) : state.layerData
298
+ });
299
+ }
300
+ function updateStateOnLayerVisibilityChange(state, layer) {
301
+ var newState = state;
302
+ if (state.splitMaps.length) {
303
+ newState = _objectSpread(_objectSpread({}, state), {}, {
304
+ splitMaps: layer.config.isVisible ? (0, _utils.addNewLayersToSplitMap)(state.splitMaps, layer) : (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layer)
305
+ });
306
+ }
307
+ if (layer.config.animation.enabled) {
308
+ newState = updateAnimationDomain(newState);
309
+ }
310
+ return newState;
311
+ }
312
+
313
+ /**
314
+ * Compares two objects (or arrays) and returns a new object with only the
315
+ * properties that have changed between the two objects.
316
+ */
317
+ function pickChangedProps(prev, next) {
318
+ var changedProps = {};
319
+ var pickPropsOf = function pickPropsOf(obj) {
320
+ Object.keys(obj).forEach(function (key) {
321
+ if (!Object.prototype.hasOwnProperty.call(changedProps, key) && !(0, _lodash3["default"])(prev[key], next[key])) {
322
+ changedProps[key] = next[key];
323
+ }
324
+ });
325
+ };
326
+ pickPropsOf(prev);
327
+ pickPropsOf(next);
328
+ return changedProps;
329
+ }
330
+ var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
331
+
332
+ /**
333
+ * Apply layer config
334
+ * @memberof visStateUpdaters
335
+ * @returns nextState
336
+ */
337
+ // eslint-disable-next-line complexity, max-statements
338
+ function applyLayerConfigUpdater(state, action) {
339
+ var _serializeLayer;
340
+ var oldLayerId = action.oldLayerId,
341
+ newLayerConfig = action.newLayerConfig,
342
+ layerIndex = action.layerIndex;
343
+ var newParsedLayer =
344
+ // will move visualChannels to the config prop
345
+ (0, _visStateMerger.parseLayerConfig)(state.schema, newLayerConfig);
346
+ var oldLayer = state.layers.find(function (l) {
347
+ return l.id === oldLayerId;
348
+ });
349
+ if (!oldLayer || !newParsedLayer) {
350
+ return state;
351
+ }
352
+ if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
353
+ // layerIndex is provided, but it doesn't match the oldLayer
354
+ return state;
355
+ }
356
+ var dataset = state.datasets[newParsedLayer.config.dataId];
357
+ if (!dataset) {
358
+ return state;
359
+ }
360
+ // Make sure the layer is valid and convert it to Layer
361
+ var newLayer = (0, _visStateMerger.validateLayerWithData)(dataset, newParsedLayer, state.layerClasses);
362
+ if (!newLayer) {
363
+ return state;
364
+ }
365
+ var nextState = state;
366
+ if (newLayer.type && newLayer.type !== oldLayer.type) {
367
+ var oldLayerIndex = state.layers.findIndex(function (l) {
368
+ return l.id === oldLayerId;
369
+ });
370
+ if (oldLayerIndex >= 0) {
371
+ nextState = layerTypeChangeUpdater(nextState, (0, _actions.layerTypeChange)(oldLayer, newLayer.type));
372
+ // layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
373
+ // but first make sure that the layer was not removed
374
+ if (nextState.layers.length === state.layers.length) {
375
+ var newLayerId = nextState.layers[oldLayerIndex].id;
376
+ nextState = applyLayerConfigUpdater(nextState, (0, _actions.applyLayerConfig)(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
377
+ id: newLayerId
378
+ })));
379
+ }
380
+ }
381
+ return nextState;
382
+ }
383
+
384
+ // serializeLayer() might return null if the old layer is not valid,
385
+ // we should still apply the changes in that case
386
+ var serializedOldLayer = (_serializeLayer = (0, _visStateMerger.serializeLayer)(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
387
+ config: {}
388
+ };
389
+ var serializedNewLayer = (0, _visStateMerger.serializeLayer)(newLayer, state.schema);
390
+ if (!serializedNewLayer) {
391
+ return state;
392
+ }
393
+ if (!(0, _lodash3["default"])(serializedOldLayer, serializedNewLayer)) {
394
+ var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
395
+ if ('visConfig' in changed) {
396
+ if (changed.visConfig) {
397
+ nextState = layerVisConfigChangeUpdater(nextState, (0, _actions.layerVisConfigChange)(oldLayer, changed.visConfig));
398
+ }
399
+ delete changed.visConfig;
400
+ }
401
+ Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
402
+ var channel = oldLayer.visualChannels[channelName];
403
+ var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
404
+ return channel[prop];
405
+ });
406
+ if (channelPropNames.some(function (prop) {
407
+ return prop in changed;
408
+ })) {
409
+ nextState = layerVisualChannelChangeUpdater(nextState, (0, _actions.layerVisualChannelConfigChange)(oldLayer, (0, _lodash4["default"])(newLayer.config, channelPropNames), channelName));
410
+ var _iterator = _createForOfIteratorHelper(channelPropNames),
411
+ _step;
412
+ try {
413
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
414
+ var prop = _step.value;
415
+ delete changed[prop];
416
+ }
417
+ } catch (err) {
418
+ _iterator.e(err);
419
+ } finally {
420
+ _iterator.f();
421
+ }
422
+ }
423
+ });
424
+ if (Object.keys(changed).length > 0) {
425
+ nextState = layerConfigChangeUpdater(nextState, (0, _actions.layerConfigChange)(oldLayer, (0, _lodash4["default"])(newLayer.config, Object.keys(changed))));
426
+ }
427
+ }
428
+ return nextState;
429
+ }
430
+
431
+ /**
432
+ * Update layer base config: dataId, label, column, isVisible
433
+ * @memberof visStateUpdaters
434
+ * @returns nextState
435
+ */
436
+ // eslint-disable-next-line complexity
437
+ function layerConfigChangeUpdater(state, action) {
438
+ var oldLayer = action.oldLayer;
439
+ var idx = state.layers.findIndex(function (l) {
440
+ return l.id === oldLayer.id;
441
+ });
442
+ var props = Object.keys(action.newConfig);
443
+ if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
444
+ var _action$newConfig = action.newConfig,
445
+ dataId = _action$newConfig.dataId,
446
+ restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, _excluded);
447
+ var stateWithDataId = layerDataIdChangeUpdater(state, {
448
+ oldLayer: oldLayer,
449
+ newConfig: {
450
+ dataId: dataId
451
+ }
452
+ });
453
+ var nextLayer = stateWithDataId.layers.find(function (l) {
454
+ return l.id === oldLayer.id;
455
+ });
456
+ return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
457
+ oldLayer: nextLayer,
458
+ newConfig: restConfig
459
+ }) : stateWithDataId;
460
+ }
461
+ var newLayer = oldLayer.updateLayerConfig(action.newConfig);
462
+ var layerData;
463
+ if (newLayer.shouldCalculateLayerData(props)) {
464
+ var oldLayerData = state.layerData[idx];
465
+ var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
466
+ newLayer = updateLayerDataResult.layer;
467
+ layerData = updateLayerDataResult.layerData;
468
+ }
469
+ var newState = state;
470
+ if ('isVisible' in action.newConfig) {
471
+ newState = updateStateOnLayerVisibilityChange(state, newLayer);
472
+ var filterIndex = filterSyncedWithTimeline(state);
473
+ if ((0, _utils.isLayerAnimatable)(newLayer) && filterIndex !== -1) {
474
+ // if layer is going to be visible we sync with filter otherwise we need to check whether other animatable layers exists and are visible
475
+ newState = syncTimeFilterWithLayerTimelineUpdater(newState, {
476
+ idx: filterIndex,
477
+ enable: action.newConfig.isVisible ? action.newConfig.isVisible : (0, _utils.getAnimatableVisibleLayers)(state.layers).length > 0
478
+ });
479
+ }
480
+ }
481
+ if ('columns' in action.newConfig && newLayer.config.animation.enabled) {
482
+ // TODO: Shan, make the animation config function more robust
483
+ newState = updateAnimationDomain(newState);
484
+ }
485
+ return updateStateWithLayerAndData(newState, {
486
+ layer: newLayer,
487
+ layerData: layerData,
488
+ idx: idx
489
+ });
490
+ }
491
+ function layerAnimationChangeUpdater(state, action) {
492
+ var oldLayer = action.oldLayer,
493
+ prop = action.prop,
494
+ value = action.value;
495
+ var idx = state.layers.findIndex(function (l) {
496
+ return l.id === oldLayer.id;
497
+ });
498
+ var newLayer = oldLayer.updateLayerConfig({
499
+ animation: _objectSpread(_objectSpread({}, oldLayer.config.animation), {}, (0, _defineProperty2["default"])({}, prop, value))
500
+ });
501
+ var _calculateLayerData = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[idx]),
502
+ layerData = _calculateLayerData.layerData,
503
+ layer = _calculateLayerData.layer;
504
+ return updateStateWithLayerAndData(state, {
505
+ layerData: layerData,
506
+ layer: layer,
507
+ idx: idx
508
+ });
509
+ }
510
+
511
+ /**
512
+ *
513
+ * @param state
514
+ * @returns index of the filter synced to timeline or -1
515
+ */
516
+ function filterSyncedWithTimeline(state) {
517
+ return state.filters.findIndex(function (f) {
518
+ return f.syncedWithLayerTimeline;
519
+ });
520
+ }
521
+
522
+ /**
523
+ * Updates isValid flag of a layer.
524
+ * Updates isVisible based on the value of isValid.
525
+ * Triggers update of data for the layer in order to get errors again during next update iteration.
526
+ * @memberof visStateUpdaters
527
+ * @returns nextState
528
+ */
529
+ function layerSetIsValidUpdater(state, action) {
530
+ var oldLayer = action.oldLayer,
531
+ isValid = action.isValid;
532
+ var idx = state.layers.findIndex(function (l) {
533
+ return l.id === oldLayer.id;
534
+ });
535
+ var layerToUpdate = state.layers[idx];
536
+ if (layerToUpdate) {
537
+ var newLayer;
538
+ var newData = null;
539
+ if (isValid) {
540
+ // Trigger data update in order to show errors again if present.
541
+ var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(layerToUpdate, state, undefined),
542
+ layer = _calculateLayerData2.layer,
543
+ layerData = _calculateLayerData2.layerData;
544
+ newLayer = layer;
545
+ newData = layerData;
546
+ } else {
547
+ newLayer = layerToUpdate.updateLayerConfig({
548
+ isVisible: false
549
+ });
550
+ newLayer.isValid = false;
551
+ }
552
+ return updateStateWithLayerAndData(state, {
553
+ idx: idx,
554
+ layer: newLayer,
555
+ layerData: newData
556
+ });
557
+ }
558
+ return state;
559
+ }
560
+ function addOrRemoveTextLabels(newFields, textLabel) {
561
+ var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.DEFAULT_TEXT_LABEL;
562
+ var newTextLabel = textLabel.slice();
563
+ var currentFields = textLabel.map(function (tl) {
564
+ return tl.field && tl.field.name;
565
+ }).filter(function (d) {
566
+ return d;
567
+ });
568
+ var addFields = newFields.filter(function (f) {
569
+ return !currentFields.includes(f.name);
570
+ });
571
+ var deleteFields = currentFields.filter(function (f) {
572
+ return !newFields.find(function (fd) {
573
+ return fd.name === f;
574
+ });
575
+ });
576
+
577
+ // delete
578
+ newTextLabel = newTextLabel.filter(function (tl) {
579
+ return tl.field && !deleteFields.includes(tl.field.name);
580
+ });
581
+ newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel;
582
+
583
+ // add
584
+ newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
585
+ return tl.field;
586
+ })), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
587
+ return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
588
+ field: af
589
+ });
590
+ })));
591
+ return newTextLabel;
592
+ }
593
+ function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
594
+ if (!Object.prototype.hasOwnProperty.call(textLabel[idx], prop)) {
595
+ return textLabel;
596
+ }
597
+ var newTextLabel = textLabel.slice();
598
+ if (prop === 'field' && value === null && textLabel.length > 1) {
599
+ // remove label when field value is set to null
600
+ newTextLabel.splice(idx, 1);
601
+ } else if (prop) {
602
+ newTextLabel = textLabel.map(function (tl, i) {
603
+ return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
604
+ });
605
+ }
606
+ return newTextLabel;
607
+ }
608
+
609
+ /**
610
+ * Update layer base config: dataId, label, column, isVisible
611
+ * @memberof visStateUpdaters
612
+ * @returns nextState
613
+ */
614
+ function layerTextLabelChangeUpdater(state, action) {
615
+ var _oldLayer$getDefaultL, _oldLayer$getDefaultL2;
616
+ var oldLayer = action.oldLayer,
617
+ idx = action.idx,
618
+ prop = action.prop,
619
+ value = action.value;
620
+ var textLabel = oldLayer.config.textLabel;
621
+
622
+ // when adding a new empty text label,
623
+ // rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
624
+ var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
625
+ dataId: ''
626
+ })) === null || _oldLayer$getDefaultL2 === void 0 || (_oldLayer$getDefaultL2 = _oldLayer$getDefaultL2.textLabel) === null || _oldLayer$getDefaultL2 === void 0 ? void 0 : _oldLayer$getDefaultL2[0]) !== null && _oldLayer$getDefaultL !== void 0 ? _oldLayer$getDefaultL : _constants.DEFAULT_TEXT_LABEL;
627
+ var newTextLabel = textLabel.slice();
628
+ if (!textLabel[idx] && idx === textLabel.length) {
629
+ // if idx is set to length, add empty text label
630
+ newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [defaultTextLabel]);
631
+ }
632
+ if (idx === 'all' && prop === 'fields') {
633
+ newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
634
+ } else {
635
+ newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
636
+ }
637
+ // update text label prop and value
638
+ return layerConfigChangeUpdater(state, {
639
+ oldLayer: oldLayer,
640
+ newConfig: {
641
+ textLabel: newTextLabel
642
+ }
643
+ });
644
+ }
645
+ function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
646
+ var loadedLayer = (0, _visStateMerger.serializeLayer)(layer, schema);
647
+ return loadedLayer ? (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
648
+ allowEmptyColumn: true
649
+ }) : null;
650
+ }
651
+
652
+ /**
653
+ * Update layer config dataId
654
+ * @memberof visStateUpdaters
655
+ * @returns nextState
656
+ */
657
+ function layerDataIdChangeUpdater(state, action) {
658
+ var oldLayer = action.oldLayer,
659
+ newConfig = action.newConfig;
660
+ var dataId = newConfig.dataId;
661
+ if (!oldLayer || !state.datasets[dataId]) {
662
+ return state;
663
+ }
664
+ var idx = state.layers.findIndex(function (l) {
665
+ return l.id === oldLayer.id;
666
+ });
667
+ var newLayer = oldLayer.updateLayerConfig({
668
+ dataId: dataId
669
+ });
670
+
671
+ // this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
672
+ if (newLayer.isValidToSave()) {
673
+ var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema);
674
+ // if cant validate it with data create a new one
675
+ if (!validated) {
676
+ var oldLayerType = oldLayer.type;
677
+ if (oldLayerType) {
678
+ newLayer = new state.layerClasses[oldLayerType]({
679
+ dataId: dataId,
680
+ id: oldLayer.id
681
+ });
682
+ }
683
+ } else {
684
+ newLayer = validated;
685
+ }
686
+ }
687
+ newLayer = newLayer.updateLayerConfig({
688
+ isVisible: oldLayer.config.isVisible,
689
+ isConfigActive: true
690
+ });
691
+ newLayer.updateLayerDomain(state.datasets);
692
+ var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
693
+ layerData = _calculateLayerData3.layerData,
694
+ layer = _calculateLayerData3.layer;
695
+ return updateStateWithLayerAndData(state, {
696
+ layerData: layerData,
697
+ layer: layer,
698
+ idx: idx
699
+ });
700
+ }
701
+ function setInitialLayerConfig(layer, datasets, layerClasses) {
702
+ var newLayer = layer;
703
+ if (!Object.keys(datasets).length) {
704
+ // no data is loaded
705
+ return layer;
706
+ }
707
+ if (!layer.config.dataId) {
708
+ // set layer dataId
709
+ newLayer = layer.updateLayerConfig({
710
+ dataId: Object.keys(datasets)[0]
711
+ });
712
+ }
713
+ var dataset = datasets[newLayer.config.dataId];
714
+ if (!dataset) {
715
+ return layer;
716
+ }
717
+
718
+ // find defaut layer props
719
+ var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
720
+ props: []
721
+ };
722
+
723
+ // an array of possible props, use 1st one
724
+ var props = Array.isArray(result) ? result : result.props || [];
725
+ if (props.length) {
726
+ newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
727
+ label: newLayer.config.label,
728
+ dataId: newLayer.config.dataId,
729
+ isConfigActive: newLayer.config.isConfigActive
730
+ }));
731
+ }
732
+ return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
733
+ }
734
+ /**
735
+ * Update layer type. Previews layer config will be copied if applicable.
736
+ * @memberof visStateUpdaters
737
+ * @public
738
+ */
739
+ function layerTypeChangeUpdater(state, action) {
740
+ var oldLayer = action.oldLayer,
741
+ newType = action.newType;
742
+ if (!oldLayer) {
743
+ return state;
744
+ }
745
+ var oldId = oldLayer.id;
746
+ var idx = state.layers.findIndex(function (l) {
747
+ return l.id === oldId;
748
+ });
749
+ if (!state.layerClasses[newType]) {
750
+ _window.console.error("".concat(newType, " is not a valid layer type"));
751
+ return state;
752
+ }
753
+ var newLayer = new state.layerClasses[newType]({
754
+ // keep old layer lable and isConfigActive
755
+ label: oldLayer.config.label,
756
+ isConfigActive: oldLayer.config.isConfigActive,
757
+ dataId: oldLayer.config.dataId
758
+ });
759
+ if (!oldLayer.type) {
760
+ // if setting layer type on an empty layer
761
+ newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
762
+ } else {
763
+ // get a mint layer, with new id and type
764
+ // because deck.gl uses id to match between new and old layer.
765
+ // If type has changed but id is the same, it will break
766
+ newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
767
+ newLayer.updateLayerDomain(state.datasets);
768
+ }
769
+ var clicked = state.clicked,
770
+ hoverInfo = state.hoverInfo;
771
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
772
+ clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
773
+ hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
774
+ });
775
+ var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
776
+ layerData = _calculateLayerData4.layerData,
777
+ layer = _calculateLayerData4.layer;
778
+ newState = updateStateWithLayerAndData(newState, {
779
+ layerData: layerData,
780
+ layer: layer,
781
+ idx: idx
782
+ });
783
+ if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
784
+ newState = updateAnimationDomain(newState);
785
+ }
786
+
787
+ // update splitMap layer id
788
+ if (state.splitMaps.length) {
789
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
790
+ splitMaps: newState.splitMaps.map(function (settings) {
791
+ var _settings$layers = settings.layers,
792
+ oldLayerMap = _settings$layers[oldId],
793
+ otherLayers = (0, _objectWithoutProperties2["default"])(_settings$layers, [oldId].map(_toPropertyKey));
794
+ return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
795
+ layers: _objectSpread(_objectSpread({}, otherLayers), {}, (0, _defineProperty2["default"])({}, layer.id, oldLayerMap))
796
+ }) : settings;
797
+ })
798
+ });
799
+ }
800
+
801
+ // update layerOrder with new id
802
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
803
+ layerOrder: newState.layerOrder.map(function (layerId) {
804
+ return layerId === oldLayer.id ? newLayer.id : layerId;
805
+ })
806
+ });
807
+ return newState;
808
+ }
809
+
810
+ /**
811
+ * Update layer visual channel
812
+ * @memberof visStateUpdaters
813
+ * @returns {Object} nextState
814
+ * @public
815
+ */
816
+ function layerVisualChannelChangeUpdater(state, action) {
817
+ var oldLayer = action.oldLayer,
818
+ newConfig = action.newConfig,
819
+ newVisConfig = action.newVisConfig,
820
+ channel = action.channel;
821
+ if (!oldLayer.config.dataId) {
822
+ return state;
823
+ }
824
+ var dataset = state.datasets[oldLayer.config.dataId];
825
+ var idx = state.layers.findIndex(function (l) {
826
+ return l.id === oldLayer.id;
827
+ });
828
+ var newLayer = oldLayer.updateLayerConfig(newConfig);
829
+ if (newVisConfig) newLayer = newLayer.updateLayerVisConfig(newVisConfig);
830
+ newLayer.updateLayerVisualChannel(dataset, channel);
831
+
832
+ // calling update animation domain first to merge all layer animation domain
833
+ var updatedState = updateAnimationDomain(state);
834
+ var oldLayerData = updatedState.layerData[idx];
835
+ var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, updatedState, oldLayerData),
836
+ layerData = _calculateLayerData5.layerData,
837
+ layer = _calculateLayerData5.layer;
838
+ return updateStateWithLayerAndData(updatedState, {
839
+ layerData: layerData,
840
+ layer: layer,
841
+ idx: idx
842
+ });
843
+ }
844
+
845
+ /**
846
+ * Update layer `visConfig`
847
+ * @memberof visStateUpdaters
848
+ * @public
849
+ */
850
+ function layerVisConfigChangeUpdater(state, action) {
851
+ var oldLayer = action.oldLayer;
852
+ var idx = state.layers.findIndex(function (l) {
853
+ return l.id === oldLayer.id;
854
+ });
855
+ var props = Object.keys(action.newVisConfig);
856
+ var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
857
+ var newLayer = oldLayer.updateLayerConfig({
858
+ visConfig: newVisConfig
859
+ });
860
+ if (newLayer.shouldCalculateLayerData(props)) {
861
+ var oldLayerData = state.layerData[idx];
862
+ var _calculateLayerData6 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
863
+ layerData = _calculateLayerData6.layerData,
864
+ layer = _calculateLayerData6.layer;
865
+ return updateStateWithLayerAndData(state, {
866
+ layerData: layerData,
867
+ layer: layer,
868
+ idx: idx
869
+ });
870
+ }
871
+ return updateStateWithLayerAndData(state, {
872
+ layer: newLayer,
873
+ idx: idx
874
+ });
875
+ }
876
+
877
+ /**
878
+ * Reset animation config current time to a specified value
879
+ * @memberof visStateUpdaters
880
+ * @public
881
+ *
882
+ */
883
+ var setLayerAnimationTimeUpdater = exports.setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref2) {
884
+ var value = _ref2.value;
885
+ var currentTime = Array.isArray(value) ? value[0] : value;
886
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
887
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
888
+ currentTime: currentTime
889
+ })
890
+ });
891
+ // update animation config for each layer
892
+ return state.layers.reduce(function (accu, l) {
893
+ if (l.config.animation.enabled && l.type !== 'trip') {
894
+ return layerAnimationChangeUpdater(accu, {
895
+ oldLayer: l,
896
+ prop: 'currentTime',
897
+ currentTime: currentTime
898
+ });
899
+ }
900
+ return accu;
901
+ }, nextState);
902
+ };
903
+
904
+ /**
905
+ * Update filter property
906
+ * @memberof visStateUpdaters
907
+ * @public
908
+ */
909
+ function setFilterAnimationTimeUpdater(state, action) {
910
+ return setFilterUpdater(state, action);
911
+ }
912
+
913
+ /**
914
+ * Update filter animation window
915
+ * @memberof visStateUpdaters
916
+ * @public
917
+ */
918
+ function setFilterAnimationWindowUpdater(state, _ref3) {
919
+ var id = _ref3.id,
920
+ animationWindow = _ref3.animationWindow;
921
+ var filter = state.filters.find(function (f) {
922
+ return f.id === id;
923
+ });
924
+ if (!filter) {
925
+ return state;
926
+ }
927
+ var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
928
+ animationWindow: animationWindow
929
+ });
930
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
931
+ filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
932
+ });
933
+ var newSyncTimelineMode = getSyncAnimationMode(newFilter);
934
+ return setTimeFilterTimelineModeUpdater(newState, {
935
+ id: id,
936
+ mode: newSyncTimelineMode
937
+ });
938
+ }
939
+
940
+ /**
941
+ * Update filter property
942
+ * @memberof visStateUpdaters
943
+ * @public
944
+ */
945
+ function setFilterUpdater(state, action) {
946
+ var idx = action.idx,
947
+ _action$valueIndex = action.valueIndex,
948
+ valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
949
+ var oldFilter = state.filters[idx];
950
+ if (!oldFilter) {
951
+ _window.console.error("filters.".concat(idx, " is undefined"));
952
+ return state;
953
+ }
954
+ if (Array.isArray(action.prop) && (!Array.isArray(action.value) || action.prop.length !== action.value.length)) {
955
+ _window.console.error('Expecting value to be an array of the same length, since prop is an array');
956
+ return state;
957
+ }
958
+ // convert prop and value to array
959
+ var props = (0, _commonUtils.toArray)(action.prop);
960
+ var values = Array.isArray(action.prop) ? (0, _commonUtils.toArray)(action.value) : [action.value];
961
+ var newFilter = oldFilter;
962
+ var newState = state;
963
+ var datasetIdsToFilter = [];
964
+ var _loop = function _loop() {
965
+ var prop = props[i];
966
+ var value = values[i];
967
+ // We currently do not support passing in name as an array into _updateFilterProp, so we call it multiple times with each name
968
+ // See the comment in there as to what should be addressed
969
+ var res;
970
+ if (prop === 'name' && Array.isArray(value)) {
971
+ // eslint-disable-next-line no-loop-func
972
+ res = value.reduce(function (accu, v) {
973
+ return _updateFilterProp(accu, newFilter, prop, v, valueIndex);
974
+ }, newState);
975
+ } else {
976
+ res = _updateFilterProp(newState, newFilter, prop, value, valueIndex);
977
+ }
978
+ newFilter = res.filter;
979
+ newState = res.state;
980
+ datasetIdsToFilter = datasetIdsToFilter.concat(res.datasetIdsToFilter);
981
+ };
982
+ for (var i = 0; i < props.length; i++) {
983
+ _loop();
984
+ }
985
+ var enlargedFilter = state.filters.find(function (f) {
986
+ return f.view === _constants.FILTER_VIEW_TYPES.enlarged;
987
+ });
988
+ if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
989
+ // there should be only one enlarged filter
990
+ newFilter.view = _constants.FILTER_VIEW_TYPES.side;
991
+ }
992
+
993
+ // save new filters to newState
994
+ newState = (0, _utils.set)(['filters', idx], newFilter, newState);
995
+
996
+ // filter data
997
+ var filteredDatasets = (0, _utils.applyFiltersToDatasets)((0, _lodash5["default"])(datasetIdsToFilter), newState.datasets, newState.filters, newState.layers);
998
+ newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
999
+
1000
+ // need to update filterPlot after filter Dataset for plot to update on filtered result
1001
+ var filterWithPLot = (0, _utils.updateFilterPlot)(newState.datasets, newState.filters[idx]);
1002
+ newState = (0, _utils.set)(['filters', idx], filterWithPLot, newState);
1003
+
1004
+ // dataId is an array
1005
+ // pass only the dataset we need to update
1006
+ newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
1007
+
1008
+ // If time range filter value was updated, adjust animation config
1009
+ if (newFilter.type === _constants.FILTER_TYPES.timeRange && props.includes('value')) {
1010
+ newState = adjustAnimationConfigWithFilter(newState, action.idx);
1011
+ }
1012
+ return newState;
1013
+ }
1014
+ function _updateFilterDataIdAtValueIndex(filter, valueIndex, value, datasets) {
1015
+ var newFilter = filter;
1016
+ if (filter.dataId[valueIndex]) {
1017
+ // if dataId already exist
1018
+ newFilter = _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets);
1019
+ }
1020
+ if (value) {
1021
+ var nextValue = newFilter.dataId.slice();
1022
+ nextValue[valueIndex] = value;
1023
+ newFilter = (0, _utils.set)(['dataId'], nextValue, newFilter);
1024
+ }
1025
+ return newFilter;
1026
+ }
1027
+ function _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets) {
1028
+ var dataId = filter.dataId[valueIndex];
1029
+ if (filter.dataId.length === 1 && valueIndex === 0) {
1030
+ // if remove the only dataId, create an empty filter instead;
1031
+ return (0, _utils.getDefaultFilter)({
1032
+ id: filter.id
1033
+ });
1034
+ }
1035
+ if (dataId) {
1036
+ filter = (0, _utils.removeFilterPlot)(filter, dataId);
1037
+ }
1038
+ for (var _i = 0, _arr = ['dataId', 'name', 'fieldIdx', 'gpuChannel']; _i < _arr.length; _i++) {
1039
+ var prop = _arr[_i];
1040
+ if (Array.isArray(filter[prop])) {
1041
+ var nextVal = filter[prop].slice();
1042
+ nextVal.splice(valueIndex, 1);
1043
+ filter = (0, _utils.set)([prop], nextVal, filter);
1044
+ }
1045
+ }
1046
+
1047
+ // mergeFieldDomain for the remaining fields
1048
+ // @ts-expect-error figure out correct types to use with mergeFilterDomainStep
1049
+ var domainSteps = {};
1050
+ filter.dataId.forEach(function (filterDataId, idx) {
1051
+ var dataset = datasets[filterDataId];
1052
+ var filterProps = dataset.getColumnFilterProps(filter.name[idx]);
1053
+ // @ts-expect-error figure out correct types to use with mergeFilterDomainStep
1054
+ domainSteps = (0, _utils.mergeFilterDomainStep)(domainSteps, filterProps);
1055
+ });
1056
+ var nextFilter = _objectSpread(_objectSpread({}, filter), {}, {
1057
+ // value: nextValue,
1058
+ domain: domainSteps.domain,
1059
+ step: domainSteps.step
1060
+ });
1061
+ var nextValue = (0, _utils.adjustValueToFilterDomain)(nextFilter.value, nextFilter);
1062
+ return _objectSpread(_objectSpread({}, nextFilter), {}, {
1063
+ value: nextValue
1064
+ });
1065
+ }
1066
+
1067
+ /***
1068
+ * Updates a single property of a filter
1069
+ */
1070
+ function _updateFilterProp(state, filter, prop, value, valueIndex, datasetIds) {
1071
+ var datasetIdsToFilter = [];
1072
+ switch (prop) {
1073
+ // TODO: Next PR for UI if we update filterDataId, we need to consider two cases:
1074
+ // 1. dataId is empty: create a default filter
1075
+ // 2. Add a new dataset id
1076
+ case _utils.FILTER_UPDATER_PROPS.dataId:
1077
+ {
1078
+ var oldDataId = (0, _toConsumableArray2["default"])(filter.dataId);
1079
+ filter = _updateFilterDataIdAtValueIndex(filter, valueIndex, value, state.datasets);
1080
+ datasetIdsToFilter = (0, _lodash5["default"])([].concat((0, _toConsumableArray2["default"])(oldDataId), (0, _toConsumableArray2["default"])(filter.dataId)));
1081
+ break;
1082
+ }
1083
+ case _utils.FILTER_UPDATER_PROPS.name:
1084
+ {
1085
+ // we are supporting the current functionality
1086
+ // TODO: Next PR for UI filter name will only update filter name but it won't have side effects
1087
+ // we are gonna use pair of datasets and fieldIdx to update the filter
1088
+ var datasetId = filter.dataId[valueIndex];
1089
+ var _applyFilterFieldName = (0, _utils.applyFilterFieldName)(filter, state.datasets[datasetId], value, valueIndex, {
1090
+ mergeDomain: valueIndex > 0
1091
+ }),
1092
+ updatedFilter = _applyFilterFieldName.filter,
1093
+ newDataset = _applyFilterFieldName.dataset;
1094
+ if (updatedFilter) {
1095
+ filter = updatedFilter;
1096
+ if (filter.gpu) {
1097
+ filter = (0, _table.setFilterGpuMode)(filter, state.filters);
1098
+ filter = (0, _table.assignGpuChannel)(filter, state.filters);
1099
+ }
1100
+ state = (0, _utils.set)(['datasets', datasetId], newDataset, state);
1101
+ // remove filter Plot at datasetId, so it will be recalculated
1102
+ filter = (0, _utils.removeFilterPlot)(filter, datasetId);
1103
+ datasetIdsToFilter = updatedFilter.dataId;
1104
+ }
1105
+ // only filter the current dataset
1106
+ break;
1107
+ }
1108
+ case _utils.FILTER_UPDATER_PROPS.layerId:
1109
+ {
1110
+ // We need to update only datasetId/s if we have added/removed layers
1111
+ // - check for layerId changes (XOR works because of string values)
1112
+ // if no differences between layerIds, don't do any filtering
1113
+ // @ts-ignore
1114
+ var layerIdDifference = (0, _lodash6["default"])(value, filter.layerId);
1115
+ var layerDataIds = (0, _lodash5["default"])(layerIdDifference.map(function (lid) {
1116
+ return (0, _lodash2["default"])(state.layers.find(function (l) {
1117
+ return l.id === lid;
1118
+ }), ['config', 'dataId']);
1119
+ }).filter(function (d) {
1120
+ return d;
1121
+ }));
1122
+
1123
+ // only filter datasetsIds
1124
+ datasetIdsToFilter = layerDataIds;
1125
+
1126
+ // Update newFilter dataIds
1127
+ var newDataIds = (0, _lodash5["default"])(value === null || value === void 0 ? void 0 : value.map(function (lid) {
1128
+ return (0, _lodash2["default"])(state.layers.find(function (l) {
1129
+ return l.id === lid;
1130
+ }), ['config', 'dataId']);
1131
+ }).filter(function (d) {
1132
+ return d;
1133
+ }));
1134
+ filter = _objectSpread(_objectSpread({}, filter), {}, {
1135
+ layerId: value,
1136
+ dataId: newDataIds
1137
+ });
1138
+ break;
1139
+ }
1140
+ default:
1141
+ filter = (0, _utils.set)([prop], value, filter);
1142
+ datasetIdsToFilter = (0, _toConsumableArray2["default"])(filter.dataId);
1143
+ break;
1144
+ }
1145
+ return {
1146
+ filter: filter,
1147
+ datasetIds: datasetIds,
1148
+ datasetIdsToFilter: datasetIdsToFilter,
1149
+ state: state
1150
+ };
1151
+ }
1152
+ /* eslint-enable max-statements */
1153
+
1154
+ /**
1155
+ * Set the property of a filter plot
1156
+ * @memberof visStateUpdaters
1157
+ * @public
1158
+ */
1159
+ var setFilterPlotUpdater = exports.setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref4) {
1160
+ var idx = _ref4.idx,
1161
+ newProp = _ref4.newProp,
1162
+ _ref4$valueIndex = _ref4.valueIndex,
1163
+ valueIndex = _ref4$valueIndex === void 0 ? 0 : _ref4$valueIndex;
1164
+ if (!state.filters[idx]) {
1165
+ _window.console.error("filters[".concat(idx, "] is undefined"));
1166
+ return state;
1167
+ }
1168
+ var newFilter = state.filters[idx];
1169
+ for (var prop in newProp) {
1170
+ if (prop === 'plotType') {
1171
+ newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)(newProp.plotType))(newFilter);
1172
+ } else if (prop === 'yAxis') {
1173
+ var chartType = newProp.yAxis ? _constants.PLOT_TYPES.lineChart : _constants.PLOT_TYPES.histogram;
1174
+ newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)({
1175
+ type: chartType
1176
+ }))((0, _composerHelpers.merge_)(newProp)(newFilter));
1177
+ }
1178
+ }
1179
+ newFilter = (0, _utils.updateFilterPlot)(state.datasets, newFilter);
1180
+ return _objectSpread(_objectSpread({}, state), {}, {
1181
+ filters: state.filters.map(function (f, i) {
1182
+ return i === idx ? newFilter : f;
1183
+ })
1184
+ });
1185
+ };
1186
+
1187
+ /**
1188
+ * Add a new filter
1189
+ * @memberof visStateUpdaters
1190
+ * @public
1191
+ */
1192
+ var addFilterUpdater = exports.addFilterUpdater = function addFilterUpdater(state, action) {
1193
+ return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
1194
+ filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)({
1195
+ dataId: action.dataId,
1196
+ id: action.id
1197
+ })])
1198
+ });
1199
+ };
1200
+
1201
+ /**
1202
+ * Create or update a filter
1203
+ * @memberof visStateUpdaters
1204
+ * @public
1205
+ */
1206
+ var createOrUpdateFilterUpdater = exports.createOrUpdateFilterUpdater = function createOrUpdateFilterUpdater(state, action) {
1207
+ var id = action.id,
1208
+ dataId = action.dataId,
1209
+ field = action.field,
1210
+ value = action.value;
1211
+ var newState = state;
1212
+ var originalIndex = newState.filters.findIndex(function (f) {
1213
+ return f.id === id;
1214
+ });
1215
+ var filterIndex = originalIndex;
1216
+ if (!id && !dataId) {
1217
+ return newState;
1218
+ }
1219
+ if (originalIndex < 0 && dataId) {
1220
+ newState = addFilterUpdater(newState, {
1221
+ dataId: dataId
1222
+ });
1223
+ if (newState.filters.length !== state.filters.length + 1) {
1224
+ // No new filter was added
1225
+ return state;
1226
+ }
1227
+ // Here we are assuming that the filter was added at the end
1228
+ filterIndex = newState.filters.length - 1;
1229
+ newState.filters[filterIndex] = _objectSpread(_objectSpread({}, newState.filters[filterIndex]), id ? {
1230
+ id: id
1231
+ } : null);
1232
+ }
1233
+
1234
+ // No need to update this if it's a newly created filter
1235
+ // First we make sure all the dataIds that fields refer to are updated
1236
+ if (originalIndex >= 0 && dataId) {
1237
+ // If the dataId is an array, we need to update each one individually as they need a correct valueIndex passed
1238
+ newState = (Array.isArray(dataId) ? dataId : [dataId]).reduce(function (accu, d, index) {
1239
+ return setFilterUpdater(accu, {
1240
+ idx: filterIndex,
1241
+ prop: 'dataId',
1242
+ value: d,
1243
+ valueIndex: index
1244
+ });
1245
+ }, newState);
1246
+ }
1247
+ // Then we update the fields
1248
+ if (field) {
1249
+ // If the field is an array, we need to update each field individually as they need a correct valueIndex passed
1250
+ newState = (Array.isArray(field) ? field : [field]).reduce(function (accu, f, index) {
1251
+ return setFilterUpdater(accu, {
1252
+ idx: filterIndex,
1253
+ prop: 'name',
1254
+ value: f,
1255
+ valueIndex: index
1256
+ });
1257
+ }, newState);
1258
+ }
1259
+ // Then we update the value separately
1260
+ if (value !== null && typeof value !== 'undefined') {
1261
+ newState = setFilterUpdater(newState, {
1262
+ idx: filterIndex,
1263
+ prop: 'value',
1264
+ value: value
1265
+ });
1266
+ }
1267
+ return newState;
1268
+ };
1269
+
1270
+ /**
1271
+ * Set layer color palette ui state
1272
+ * @memberof visStateUpdaters
1273
+ */
1274
+ var layerColorUIChangeUpdater = exports.layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref5) {
1275
+ var oldLayer = _ref5.oldLayer,
1276
+ prop = _ref5.prop,
1277
+ newConfig = _ref5.newConfig;
1278
+ var oldVixConfig = oldLayer.config.visConfig[prop];
1279
+ var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
1280
+ var newVisConfig = newLayer.config.visConfig[prop];
1281
+ if (oldVixConfig !== newVisConfig) {
1282
+ return layerVisConfigChangeUpdater(state, {
1283
+ oldLayer: oldLayer,
1284
+ newVisConfig: (0, _defineProperty2["default"])({}, prop, newVisConfig)
1285
+ });
1286
+ }
1287
+ return _objectSpread(_objectSpread({}, state), {}, {
1288
+ layers: state.layers.map(function (l) {
1289
+ return l.id === oldLayer.id ? newLayer : l;
1290
+ })
1291
+ });
1292
+ };
1293
+
1294
+ /**
1295
+ * Start and end filter animation
1296
+ * @memberof visStateUpdaters
1297
+ * @public
1298
+ */
1299
+ var toggleFilterAnimationUpdater = exports.toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
1300
+ return _objectSpread(_objectSpread({}, state), {}, {
1301
+ filters: state.filters.map(function (f, i) {
1302
+ return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
1303
+ isAnimating: !f.isAnimating
1304
+ }) : f;
1305
+ })
1306
+ });
1307
+ };
1308
+
1309
+ /**
1310
+ * @memberof visStateUpdaters
1311
+ * @public
1312
+ */
1313
+ var toggleLayerAnimationUpdater = exports.toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
1314
+ return _objectSpread(_objectSpread({}, state), {}, {
1315
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1316
+ isAnimating: !state.animationConfig.isAnimating
1317
+ })
1318
+ });
1319
+ };
1320
+
1321
+ /**
1322
+ * Hide and show layer animation control
1323
+ * @memberof visStateUpdaters
1324
+ * @public
1325
+ */
1326
+ var toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state) {
1327
+ return _objectSpread(_objectSpread({}, state), {}, {
1328
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1329
+ hideControl: !state.animationConfig.hideControl
1330
+ })
1331
+ });
1332
+ };
1333
+
1334
+ /**
1335
+ * Change filter animation speed
1336
+ * @memberof visStateUpdaters
1337
+ * @public
1338
+ */
1339
+ var updateFilterAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
1340
+ return _objectSpread(_objectSpread({}, state), {}, {
1341
+ filters: state.filters.map(function (f, i) {
1342
+ return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
1343
+ speed: action.speed
1344
+ }) : f;
1345
+ })
1346
+ });
1347
+ };
1348
+
1349
+ /**
1350
+ * Update animation speed with the vertical speed slider
1351
+ * @memberof visStateUpdaters
1352
+ * @public
1353
+ *
1354
+ */
1355
+ var updateLayerAnimationSpeedUpdater = exports.updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref6) {
1356
+ var speed = _ref6.speed;
1357
+ return _objectSpread(_objectSpread({}, state), {}, {
1358
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1359
+ speed: speed
1360
+ })
1361
+ });
1362
+ };
1363
+
1364
+ /**
1365
+ * Show larger time filter at bottom for time playback (apply to time filter only)
1366
+ * @memberof visStateUpdaters
1367
+ * @public
1368
+ */
1369
+ var setFilterViewUpdater = exports.setFilterViewUpdater = function setFilterViewUpdater(state, action) {
1370
+ var view = action.view,
1371
+ idx = action.idx;
1372
+ var shouldResetOtherFiltersView = view === _constants.FILTER_VIEW_TYPES.enlarged;
1373
+ return _objectSpread(_objectSpread({}, state), {}, {
1374
+ filters: state.filters.map(function (f, i) {
1375
+ return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
1376
+ view: view
1377
+ }) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
1378
+ view: _constants.FILTER_VIEW_TYPES.side
1379
+ }) : f;
1380
+ })
1381
+ });
1382
+ };
1383
+
1384
+ /**
1385
+ * Toggles filter feature visibility
1386
+ * @memberof visStateUpdaters
1387
+ */
1388
+ var toggleFilterFeatureUpdater = exports.toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
1389
+ var filter = state.filters[action.idx];
1390
+ var isVisible = (0, _lodash2["default"])(filter, ['value', 'properties', 'isVisible']);
1391
+ var newState = setFilterUpdater(state, {
1392
+ idx: action.idx,
1393
+ prop: 'enabled',
1394
+ value: !isVisible
1395
+ });
1396
+ newState = setFilterUpdater(newState, {
1397
+ idx: action.idx,
1398
+ prop: 'value',
1399
+ value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
1400
+ isVisible: !isVisible
1401
+ })
1402
+ });
1403
+ return newState;
1404
+ };
1405
+
1406
+ /**
1407
+ * Remove a filter
1408
+ * @memberof visStateUpdaters
1409
+ * @public
1410
+ */
1411
+ var removeFilterUpdater = exports.removeFilterUpdater = function removeFilterUpdater(state, action) {
1412
+ var idx = action.idx;
1413
+ var _state$filters$idx = state.filters[idx],
1414
+ dataId = _state$filters$idx.dataId,
1415
+ id = _state$filters$idx.id;
1416
+ var newFilters = [].concat((0, _toConsumableArray2["default"])(state.filters.slice(0, idx)), (0, _toConsumableArray2["default"])(state.filters.slice(idx + 1, state.filters.length)));
1417
+ var filteredDatasets = (0, _utils.applyFiltersToDatasets)(dataId, state.datasets, newFilters, state.layers);
1418
+ var newEditor = (0, _utils.getFilterIdInFeature)(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
1419
+ selectedFeature: null
1420
+ }) : state.editor;
1421
+ var newState = (0, _utils.set)(['filters'], newFilters, state);
1422
+ newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
1423
+ newState = (0, _utils.set)(['editor'], newEditor, newState);
1424
+ return updateAllLayerDomainData(newState, dataId, undefined);
1425
+ };
1426
+
1427
+ /**
1428
+ * Add a new layer
1429
+ * @memberof visStateUpdaters
1430
+ * @public
1431
+ */
1432
+ var addLayerUpdater = exports.addLayerUpdater = function addLayerUpdater(state, action) {
1433
+ var newLayer;
1434
+ var newLayerData;
1435
+ if (action.config) {
1436
+ newLayer = (0, _visStateMerger.createLayerFromConfig)(state, action.config);
1437
+ if (!newLayer) {
1438
+ _window.console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
1439
+ return state;
1440
+ }
1441
+ var result = (0, _layerUtils.calculateLayerData)(newLayer, state);
1442
+ newLayer = result.layer;
1443
+ newLayerData = result.layerData;
1444
+ } else {
1445
+ var _action$datasetId;
1446
+ // create an empty layer with a specific dataset or a default one
1447
+ var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
1448
+ newLayer = new _layers.Layer({
1449
+ isVisible: true,
1450
+ isConfigActive: true,
1451
+ dataId: defaultDataset
1452
+ });
1453
+ newLayerData = {};
1454
+ }
1455
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1456
+ layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
1457
+ layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
1458
+ // add new layer at the top
1459
+ layerOrder: [newLayer.id].concat((0, _toConsumableArray2["default"])(state.layerOrder)),
1460
+ splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
1461
+ });
1462
+ if (newLayer.config.animation.enabled) {
1463
+ newState = updateAnimationDomain(newState);
1464
+ }
1465
+ return newState;
1466
+ };
1467
+
1468
+ /**
1469
+ * remove layer
1470
+ * @memberof visStateUpdaters
1471
+ * @public
1472
+ */
1473
+ function removeLayerUpdater(state, _ref7) {
1474
+ var id = _ref7.id;
1475
+ var idx = Number.isFinite(id) ?
1476
+ // support older API, remove layer by idx
1477
+ Number(id) : state.layers.findIndex(function (l) {
1478
+ return l.id === id;
1479
+ });
1480
+ if (idx < 0 || idx >= state.layers.length) {
1481
+ // invalid index
1482
+ _window.console.warn("can not remove layer with invalid id|idx ".concat(id));
1483
+ return state;
1484
+ }
1485
+ var layers = state.layers,
1486
+ layerData = state.layerData,
1487
+ layerOrder = state.layerOrder,
1488
+ clicked = state.clicked,
1489
+ hoverInfo = state.hoverInfo;
1490
+ var layerToRemove = layers[idx];
1491
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1492
+ layers: (0, _composerHelpers.filterOutById)(layerToRemove.id)(layers),
1493
+ layerData: (0, _composerHelpers.removeElementAtIndex)(idx)(layerData),
1494
+ layerOrder: layerOrder.filter(function (layerId) {
1495
+ return layerId !== layerToRemove.id;
1496
+ }),
1497
+ clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
1498
+ hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
1499
+ splitMaps: (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove)
1500
+ // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
1501
+ });
1502
+ return updateAnimationDomain(newState);
1503
+ }
1504
+
1505
+ /**
1506
+ * Reorder layer
1507
+ * @memberof visStateUpdaters
1508
+ * @public
1509
+ */
1510
+ var reorderLayerUpdater = exports.reorderLayerUpdater = function reorderLayerUpdater(state, _ref8) {
1511
+ var order = _ref8.order;
1512
+ return _objectSpread(_objectSpread({}, state), {}, {
1513
+ layerOrder: order
1514
+ });
1515
+ };
1516
+
1517
+ /**
1518
+ * duplicate layer
1519
+ * @memberof visStateUpdaters
1520
+ * @public
1521
+ */
1522
+ var duplicateLayerUpdater = exports.duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref9) {
1523
+ var id = _ref9.id;
1524
+ var idx = Number.isFinite(id) ?
1525
+ // support older API, remove layer by idx
1526
+ Number(id) : state.layers.findIndex(function (l) {
1527
+ return l.id === id;
1528
+ });
1529
+ if (idx < 0 || !state.layers[idx]) {
1530
+ _window.console.warn("layer ".concat(idx, " not found in layerOrder"));
1531
+ return state;
1532
+ }
1533
+ var layers = state.layers;
1534
+ var original = layers[idx];
1535
+ var originalLayerOrderIdx = state.layerOrder.findIndex(function (lid) {
1536
+ return lid === original.id;
1537
+ });
1538
+ var newLabel = "Copy of ".concat(original.config.label);
1539
+ var postfix = 0;
1540
+ // eslint-disable-next-line no-loop-func
1541
+ while (layers.find(function (l) {
1542
+ return l.config.label === newLabel;
1543
+ })) {
1544
+ newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
1545
+ }
1546
+
1547
+ // collect layer config from original
1548
+ var loadedLayer = (0, _visStateMerger.serializeLayer)(original, state.schema);
1549
+
1550
+ // assign new id and label to copied layer
1551
+ if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
1552
+ return state;
1553
+ }
1554
+ loadedLayer.config.label = newLabel;
1555
+ loadedLayer.id = (0, _commonUtils.generateHashId)(_layers.LAYER_ID_LENGTH);
1556
+
1557
+ // add layer to state
1558
+ var nextState = addLayerUpdater(state, {
1559
+ config: loadedLayer
1560
+ });
1561
+ // retrieve newly created layer
1562
+ var newLayer = nextState.layers[nextState.layers.length - 1];
1563
+ // update layer order with newLyaer.id
1564
+ var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
1565
+ nextState = reorderLayerUpdater(nextState, {
1566
+ order: newLayerOrder
1567
+ });
1568
+ return updateAnimationDomain(nextState);
1569
+ };
1570
+
1571
+ /**
1572
+ * Add a new effect
1573
+ * @memberof visStateUpdaters
1574
+ * @public
1575
+ */
1576
+ var addEffectUpdater = exports.addEffectUpdater = function addEffectUpdater(state, action) {
1577
+ var _action$config;
1578
+ if (((_action$config = action.config) === null || _action$config === void 0 ? void 0 : _action$config.type) === _constants.LIGHT_AND_SHADOW_EFFECT.type && state.effects.some(function (effect) {
1579
+ return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type;
1580
+ })) {
1581
+ _window.console.warn("Can't add more than one ".concat(_constants.LIGHT_AND_SHADOW_EFFECT.name, " effect"));
1582
+ return state;
1583
+ }
1584
+ var newEffect = (0, _effects.createEffect)(action.config);
1585
+
1586
+ // collapse configurators for other effects
1587
+ state.effects.forEach(function (effect) {
1588
+ return effect.setProps({
1589
+ isConfigActive: false
1590
+ });
1591
+ });
1592
+ var effects = [].concat((0, _toConsumableArray2["default"])(state.effects), [newEffect]);
1593
+ var effectOrder = (0, _utils.fixEffectOrder)(effects, [newEffect.id].concat((0, _toConsumableArray2["default"])(state.effectOrder)));
1594
+ return _objectSpread(_objectSpread({}, state), {}, {
1595
+ effects: effects,
1596
+ effectOrder: effectOrder
1597
+ });
1598
+ };
1599
+
1600
+ /**
1601
+ * remove effect
1602
+ * @memberof visStateUpdaters
1603
+ * @public
1604
+ */
1605
+ var removeEffectUpdater = exports.removeEffectUpdater = function removeEffectUpdater(state, _ref10) {
1606
+ var id = _ref10.id;
1607
+ var idx = state.effects.findIndex(function (l) {
1608
+ return l.id === id;
1609
+ });
1610
+ if (idx < 0 || idx >= state.effects.length) {
1611
+ _window.console.warn("can not remove effect with invalid id ".concat(id));
1612
+ return state;
1613
+ }
1614
+ var effects = state.effects,
1615
+ effectOrder = state.effectOrder;
1616
+ var effectToRemove = effects[idx];
1617
+ return _objectSpread(_objectSpread({}, state), {}, {
1618
+ // @ts-expect-error fixed in ts
1619
+ effects: (0, _composerHelpers.filterOutById)(effectToRemove.id)(effects),
1620
+ effectOrder: effectOrder.filter(function (effectId) {
1621
+ return effectId !== effectToRemove.id;
1622
+ })
1623
+ });
1624
+ };
1625
+
1626
+ /**
1627
+ * Reorder effect
1628
+ * @memberof visStateUpdaters
1629
+ * @public
1630
+ */
1631
+ var reorderEffectUpdater = exports.reorderEffectUpdater = function reorderEffectUpdater(state, _ref11) {
1632
+ var order = _ref11.order;
1633
+ return _objectSpread(_objectSpread({}, state), {}, {
1634
+ effectOrder: (0, _utils.fixEffectOrder)(state.effects, (0, _toConsumableArray2["default"])(order))
1635
+ });
1636
+ };
1637
+
1638
+ /**
1639
+ * Update effect
1640
+ * @memberof visStateUpdaters
1641
+ * @public
1642
+ */
1643
+ var updateEffectUpdater = exports.updateEffectUpdater = function updateEffectUpdater(state, _ref12) {
1644
+ var id = _ref12.id,
1645
+ props = _ref12.props;
1646
+ var idx = state.effects.findIndex(function (l) {
1647
+ return l.id === id;
1648
+ });
1649
+ if (idx < 0 || idx >= state.effects.length) {
1650
+ _window.console.warn("can not update effect with invalid id ".concat(id));
1651
+ return state;
1652
+ }
1653
+ var effectOrder = state.effectOrder;
1654
+ if (props.id !== undefined && props.id !== id) {
1655
+ var idx2 = state.effects.findIndex(function (l) {
1656
+ return l.id === props.id;
1657
+ });
1658
+ if (idx2 >= 0) {
1659
+ _window.console.warn("can not update effect with existing effect id ".concat(id));
1660
+ return state;
1661
+ }
1662
+ effectOrder = effectOrder.map(function (effectOrderId) {
1663
+ return effectOrderId === id ? props.id : effectOrderId;
1664
+ });
1665
+ }
1666
+ var newEffects = (0, _toConsumableArray2["default"])(state.effects);
1667
+ newEffects[idx].setProps(props);
1668
+ return _objectSpread(_objectSpread({}, state), {}, {
1669
+ effects: newEffects,
1670
+ effectOrder: effectOrder
1671
+ });
1672
+ };
1673
+
1674
+ /**
1675
+ * Remove a dataset and all layers, filters, tooltip configs that based on it
1676
+ * @memberof visStateUpdaters
1677
+ * @public
1678
+ */
1679
+ function removeDatasetUpdater(state, action) {
1680
+ // extract dataset key
1681
+ var datasetKey = action.dataId;
1682
+ var datasets = state.datasets;
1683
+
1684
+ // check if dataset is present
1685
+ if (!datasets[datasetKey]) {
1686
+ return state;
1687
+ }
1688
+ var layers = state.layers,
1689
+ _state$datasets = state.datasets,
1690
+ dataset = _state$datasets[datasetKey],
1691
+ newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
1692
+ var layersToRemove = layers.filter(function (l) {
1693
+ return l.config.dataId === datasetKey;
1694
+ }).map(function (l) {
1695
+ return l.id;
1696
+ });
1697
+
1698
+ // remove layers and datasets
1699
+ var newState = layersToRemove.reduce(function (accu, id) {
1700
+ return removeLayerUpdater(accu, {
1701
+ id: id
1702
+ });
1703
+ }, _objectSpread(_objectSpread({}, state), {}, {
1704
+ datasets: newDatasets
1705
+ }));
1706
+
1707
+ // update filters
1708
+ var filters = [];
1709
+ var _iterator2 = _createForOfIteratorHelper(newState.filters),
1710
+ _step2;
1711
+ try {
1712
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1713
+ var filter = _step2.value;
1714
+ var valueIndex = filter.dataId.indexOf(datasetKey);
1715
+ if (valueIndex >= 0 && filter.dataId.length > 1) {
1716
+ // only remove one synced dataset from the filter
1717
+ filters.push(_removeFilterDataIdAtValueIndex(filter, valueIndex, datasets));
1718
+ } else if (valueIndex < 0) {
1719
+ // leave the filter as is
1720
+ filters.push(filter);
1721
+ }
1722
+ }
1723
+ } catch (err) {
1724
+ _iterator2.e(err);
1725
+ } finally {
1726
+ _iterator2.f();
1727
+ }
1728
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
1729
+ filters: filters
1730
+ });
1731
+ return removeDatasetFromInteractionConfig(newState, {
1732
+ dataId: datasetKey
1733
+ });
1734
+ }
1735
+ function removeDatasetFromInteractionConfig(state, _ref13) {
1736
+ var dataId = _ref13.dataId;
1737
+ var interactionConfig = state.interactionConfig;
1738
+ var _interactionConfig = interactionConfig,
1739
+ tooltip = _interactionConfig.tooltip;
1740
+ if (tooltip) {
1741
+ var config = tooltip.config;
1742
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1743
+ var _config$fieldsToShow = config.fieldsToShow,
1744
+ fields = _config$fieldsToShow[dataId],
1745
+ fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [dataId].map(_toPropertyKey));
1746
+ interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
1747
+ tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
1748
+ config: _objectSpread(_objectSpread({}, config), {}, {
1749
+ fieldsToShow: fieldsToShow
1750
+ })
1751
+ })
1752
+ });
1753
+ }
1754
+ return _objectSpread(_objectSpread({}, state), {}, {
1755
+ interactionConfig: interactionConfig
1756
+ });
1757
+ }
1758
+ /**
1759
+ * update layer blending mode
1760
+ * @memberof visStateUpdaters
1761
+ * @public
1762
+ */
1763
+ var updateLayerBlendingUpdater = exports.updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
1764
+ return _objectSpread(_objectSpread({}, state), {}, {
1765
+ layerBlending: action.mode
1766
+ });
1767
+ };
1768
+
1769
+ /**
1770
+ * update overlay blending mode
1771
+ * @memberof visStateUpdaters
1772
+ * @public
1773
+ */
1774
+ var updateOverlayBlendingUpdater = exports.updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
1775
+ return _objectSpread(_objectSpread({}, state), {}, {
1776
+ overlayBlending: action.mode
1777
+ });
1778
+ };
1779
+
1780
+ /**
1781
+ * Display dataset table in a modal
1782
+ * @memberof visStateUpdaters
1783
+ * @public
1784
+ */
1785
+ var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
1786
+ return _objectSpread(_objectSpread({}, state), {}, {
1787
+ editingDataset: action.dataId
1788
+ });
1789
+ };
1790
+
1791
+ /**
1792
+ * Add custom color for datasets and layers
1793
+ * @memberof visStateUpdaters
1794
+ * @public
1795
+ */
1796
+ var updateTableColorUpdater = exports.updateTableColorUpdater = function updateTableColorUpdater(state, action) {
1797
+ return updateDatasetPropsUpdater(state, {
1798
+ dataId: action.dataId,
1799
+ props: {
1800
+ color: action.newColor
1801
+ }
1802
+ });
1803
+ };
1804
+
1805
+ /**
1806
+ * reset visState to initial State
1807
+ * @memberof visStateUpdaters
1808
+ * @public
1809
+ */
1810
+ var resetMapConfigUpdater = exports.resetMapConfigUpdater = function resetMapConfigUpdater(state) {
1811
+ return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
1812
+ initialState: state.initialState
1813
+ });
1814
+ };
1815
+
1816
+ /**
1817
+ * Propagate `visState` reducer with a new configuration. Current config will be override.
1818
+ * @memberof visStateUpdaters
1819
+ * @public
1820
+ */
1821
+ var receiveMapConfigUpdater = exports.receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref14) {
1822
+ var _ref14$payload = _ref14.payload,
1823
+ _ref14$payload$config = _ref14$payload.config,
1824
+ config = _ref14$payload$config === void 0 ? {} : _ref14$payload$config,
1825
+ _ref14$payload$option = _ref14$payload.options,
1826
+ options = _ref14$payload$option === void 0 ? {} : _ref14$payload$option;
1827
+ if (!config.visState) {
1828
+ return state;
1829
+ }
1830
+ var keepExistingConfig = options.keepExistingConfig;
1831
+
1832
+ // reset config if keepExistingConfig is falsy
1833
+ var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
1834
+ var _iterator3 = _createForOfIteratorHelper(state.mergers),
1835
+ _step3;
1836
+ try {
1837
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1838
+ var merger = _step3.value;
1839
+ if ((0, _mergerHandler.isValidMerger)(merger) && (0, _mergerHandler.hasPropsToMerge)(config.visState, merger.prop)) {
1840
+ mergedState = merger.merge(mergedState, (0, _mergerHandler.getPropValueToMerger)(config.visState, merger.prop, merger.toMergeProp),
1841
+ // fromConfig
1842
+ true);
1843
+ }
1844
+ }
1845
+ } catch (err) {
1846
+ _iterator3.e(err);
1847
+ } finally {
1848
+ _iterator3.f();
1849
+ }
1850
+ return mergedState;
1851
+ };
1852
+
1853
+ /**
1854
+ * Trigger layer hover event with hovered object
1855
+ * @memberof visStateUpdaters
1856
+ * @public
1857
+ */
1858
+ var layerHoverUpdater = exports.layerHoverUpdater = function layerHoverUpdater(state, action) {
1859
+ return _objectSpread(_objectSpread({}, state), {}, {
1860
+ hoverInfo: _objectSpread(_objectSpread({}, action.info), Number.isFinite(action.mapIndex) ? {
1861
+ mapIndex: action.mapIndex
1862
+ } : {})
1863
+ });
1864
+ };
1865
+
1866
+ /* eslint-enable max-statements */
1867
+
1868
+ /**
1869
+ * Update `interactionConfig`
1870
+ * @memberof visStateUpdaters
1871
+ * @public
1872
+ */
1873
+ function interactionConfigChangeUpdater(state, action) {
1874
+ var config = action.config;
1875
+ var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), (0, _defineProperty2["default"])({}, config.id, config));
1876
+
1877
+ // Don't enable tooltip and brush at the same time
1878
+ // but coordinates can be shown at all time
1879
+ var contradict = ['brush', 'tooltip'];
1880
+ if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
1881
+ // only enable one interaction at a time
1882
+ contradict.forEach(function (k) {
1883
+ if (k !== config.id) {
1884
+ interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
1885
+ enabled: false
1886
+ });
1887
+ }
1888
+ });
1889
+ }
1890
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1891
+ interactionConfig: interactionConfig
1892
+ });
1893
+ if (config.id === 'geocoder' && !config.enabled) {
1894
+ return removeDatasetUpdater(newState, {
1895
+ dataId: 'geocoder_dataset'
1896
+ });
1897
+ }
1898
+ return newState;
1899
+ }
1900
+
1901
+ /**
1902
+ * Trigger layer click event with clicked object
1903
+ * @memberof visStateUpdaters
1904
+ * @public
1905
+ */
1906
+ var layerClickUpdater = exports.layerClickUpdater = function layerClickUpdater(state, action) {
1907
+ return _objectSpread(_objectSpread({}, state), {}, {
1908
+ mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
1909
+ pinned: state.mousePos.pinned ? null : (0, _lodash["default"])(state.mousePos)
1910
+ }) : state.mousePos,
1911
+ clicked: action.info && action.info.picked ? action.info : null
1912
+ });
1913
+ };
1914
+
1915
+ /**
1916
+ * Trigger map click event, unselect clicked object
1917
+ * @memberof visStateUpdaters
1918
+ * @public
1919
+ */
1920
+ var mapClickUpdater = exports.mapClickUpdater = function mapClickUpdater(state, action) {
1921
+ return _objectSpread(_objectSpread({}, state), {}, {
1922
+ clicked: null
1923
+ });
1924
+ };
1925
+
1926
+ /**
1927
+ * Trigger map move event
1928
+ * @memberof visStateUpdaters
1929
+ * @public
1930
+ */
1931
+ var mouseMoveUpdater = exports.mouseMoveUpdater = function mouseMoveUpdater(state, _ref15) {
1932
+ var evt = _ref15.evt;
1933
+ if (Object.values(state.interactionConfig).some(function (config) {
1934
+ return config.enabled;
1935
+ })) {
1936
+ return _objectSpread(_objectSpread({}, state), {}, {
1937
+ mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
1938
+ mousePosition: (0, _toConsumableArray2["default"])(evt.point)
1939
+ } : {}), Array.isArray(evt.lngLat) ? {
1940
+ coordinate: (0, _toConsumableArray2["default"])(evt.lngLat)
1941
+ } : {})
1942
+ });
1943
+ }
1944
+ return state;
1945
+ };
1946
+ /**
1947
+ * Toggle visibility of a layer for a split map
1948
+ * @memberof visStateUpdaters
1949
+ * @public
1950
+ */
1951
+ var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
1952
+ return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
1953
+ // maybe we should use an array to store state for a single map as well
1954
+ // if current maps length is equal to 0 it means that we are about to split the view
1955
+ splitMaps: (0, _utils.computeSplitMapLayers)(state.layers, {
1956
+ duplicate: false
1957
+ })
1958
+ }) : closeSpecificMapAtIndex(state, action);
1959
+ };
1960
+
1961
+ /**
1962
+ * Toggle visibility of a layer in a split map
1963
+ * @memberof visStateUpdaters
1964
+ * @public
1965
+ */
1966
+ var toggleLayerForMapUpdater = exports.toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref16) {
1967
+ var mapIndex = _ref16.mapIndex,
1968
+ layerId = _ref16.layerId;
1969
+ var splitMaps = state.splitMaps;
1970
+ return _objectSpread(_objectSpread({}, state), {}, {
1971
+ splitMaps: splitMaps.map(function (sm, i) {
1972
+ return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
1973
+ layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, (0, _defineProperty2["default"])({}, layerId, !splitMaps[i].layers[layerId]))
1974
+ }) : sm;
1975
+ })
1976
+ });
1977
+ };
1978
+
1979
+ /**
1980
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
1981
+ * @memberof visStateUpdaters
1982
+ * @public
1983
+ */
1984
+ // eslint-disable-next-line complexity
1985
+ var updateVisDataUpdater = exports.updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1986
+ // datasets can be a single data entries or an array of multiple data entries
1987
+ var config = action.config,
1988
+ options = action.options;
1989
+
1990
+ // apply config if passed from action
1991
+ // TODO: we don't handle async mergers here yet
1992
+ var previousState = config ? receiveMapConfigUpdater(state, {
1993
+ payload: {
1994
+ config: config,
1995
+ options: options
1996
+ }
1997
+ }) : state;
1998
+ var datasets = (0, _commonUtils.toArray)(action.datasets);
1999
+ var allCreateDatasetsTasks = datasets.map(function (_ref17) {
2000
+ var _ref17$info = _ref17.info,
2001
+ info = _ref17$info === void 0 ? {} : _ref17$info,
2002
+ rest = (0, _objectWithoutProperties2["default"])(_ref17, _excluded2);
2003
+ return (0, _table.createNewDataEntry)(_objectSpread({
2004
+ info: info
2005
+ }, rest), state.datasets) || {};
2006
+ });
2007
+ // call all Tasks
2008
+ var tasks = _tasks["default"].allSettled(allCreateDatasetsTasks).map(function (results) {
2009
+ return (0, _actions.createNewDatasetSuccess)({
2010
+ results: results,
2011
+ addToMapOptions: options
2012
+ });
2013
+ });
2014
+ return (0, _tasks.withTask)(previousState, tasks);
2015
+ };
2016
+ var createNewDatasetSuccessUpdater = exports.createNewDatasetSuccessUpdater = function createNewDatasetSuccessUpdater(state, action) {
2017
+ // console.log('createNewDatasetSuccessUpdater', action.payload);
2018
+ var _action$payload = action.payload,
2019
+ results = _action$payload.results,
2020
+ addToMapOptions = _action$payload.addToMapOptions;
2021
+ var newDataEntries = results.reduce(function (accu, result) {
2022
+ if (result.status === 'fulfilled') {
2023
+ var dataset = result.value;
2024
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, dataset.id, dataset));
2025
+ } else {
2026
+ // handle create dataset error
2027
+ console.error(result.reason);
2028
+ return accu;
2029
+ }
2030
+ }, {});
2031
+ // save new dataset entry to state
2032
+ var mergedState = _objectSpread(_objectSpread({}, state), {}, {
2033
+ datasets: (0, _visStateMerger.mergeDatasetsByOrder)(state, newDataEntries)
2034
+ });
2035
+
2036
+ // merge state with config to be merged
2037
+ var layerMergers = state.mergers.filter(function (m) {
2038
+ return m.waitForLayerData;
2039
+ });
2040
+ var datasetMergers = state.mergers.filter(function (m) {
2041
+ return !layerMergers.includes(m);
2042
+ });
2043
+ var newDataIds = Object.keys(newDataEntries);
2044
+ var postMergerPayload = {
2045
+ newDataIds: newDataIds,
2046
+ options: addToMapOptions,
2047
+ layerMergers: layerMergers
2048
+ };
2049
+ return applyMergersUpdater(mergedState, {
2050
+ mergers: datasetMergers,
2051
+ postMergerPayload: postMergerPayload
2052
+ });
2053
+ };
2054
+
2055
+ /**
2056
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2057
+ */
2058
+ function applyMergersUpdater(state, action) {
2059
+ var mergers = action.mergers,
2060
+ postMergerPayload = action.postMergerPayload;
2061
+
2062
+ // merge state with config to be merged
2063
+ var mergeStateResult = (0, _mergerHandler.mergeStateFromMergers)(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers,
2064
+ // newDataIds,
2065
+ postMergerPayload);
2066
+
2067
+ // if all merged, kickup post merge process
2068
+ // if not wait
2069
+ return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
2070
+ }
2071
+
2072
+ /**
2073
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2074
+ */
2075
+ function postMergeUpdater(mergedState, postMergerPayload) {
2076
+ var newDataIds = postMergerPayload.newDataIds,
2077
+ options = postMergerPayload.options,
2078
+ layerMergers = postMergerPayload.layerMergers;
2079
+ var newFilters = mergedState.filters.filter(function (f) {
2080
+ return f.dataId.find(function (fDataId) {
2081
+ return newDataIds.includes(fDataId);
2082
+ });
2083
+ });
2084
+ var datasetFiltered = (0, _lodash5["default"])(newFilters.reduce(function (accu, f) {
2085
+ return [].concat((0, _toConsumableArray2["default"])(accu), (0, _toConsumableArray2["default"])(f.dataId));
2086
+ }, []));
2087
+ var dataEmpty = newDataIds.length < 1;
2088
+ var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
2089
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
2090
+ }) : [];
2091
+ var newDataEntries = newDataIds.reduce(function (accu, id) {
2092
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, mergedState.datasets[id]));
2093
+ }, {});
2094
+ if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
2095
+ // no layer merged, find defaults
2096
+ var result = addDefaultLayers(mergedState, newDataEntries);
2097
+ mergedState = result.state;
2098
+ newLayers = result.newLayers;
2099
+ }
2100
+ if (mergedState.splitMaps.length) {
2101
+ // if map is split, add new layers to splitMaps
2102
+ newLayers = mergedState.layers.filter(function (l) {
2103
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
2104
+ });
2105
+ mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
2106
+ splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
2107
+ });
2108
+ }
2109
+
2110
+ // if no tooltips merged add default tooltips
2111
+ newDataIds.forEach(function (dataId) {
2112
+ var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
2113
+ // loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
2114
+ if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
2115
+ // adding dataset: autoCreateTooltips is true
2116
+ mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
2117
+ }
2118
+ });
2119
+ var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : (0, _lodash5["default"])(Object.keys(newDataEntries).concat(datasetFiltered));
2120
+ var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined);
2121
+
2122
+ // register layer animation domain,
2123
+ // need to be called after layer data is calculated
2124
+ updatedState = updateAnimationDomain(updatedState);
2125
+
2126
+ // try to process layerMergers after dataset+datasetMergers
2127
+ updatedState = layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
2128
+ mergers: layerMergers,
2129
+ postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
2130
+ layerMergers: []
2131
+ })
2132
+ }) : updatedState;
2133
+
2134
+ // center the map once the dataset is created
2135
+ if (newLayers.length && (options || {}).centerMap) {
2136
+ var bounds = (0, _dataUtils.findMapBounds)(newLayers);
2137
+ if (bounds) {
2138
+ var fitBoundsTask = (0, _tasks2.ACTION_TASK)().map(function () {
2139
+ return (0, _actions.fitBounds)(bounds);
2140
+ });
2141
+ updatedState = (0, _tasks.withTask)(updatedState, fitBoundsTask);
2142
+ }
2143
+ }
2144
+ return updatedState;
2145
+ }
2146
+
2147
+ /**
2148
+ * Rename an existing dataset in `visState`
2149
+ * @memberof visStateUpdaters
2150
+ * @public
2151
+ */
2152
+ function renameDatasetUpdater(state, action) {
2153
+ return updateDatasetPropsUpdater(state, {
2154
+ dataId: action.dataId,
2155
+ props: {
2156
+ label: action.label
2157
+ }
2158
+ });
2159
+ }
2160
+ var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
2161
+
2162
+ /**
2163
+ * Validates properties before updating the dataset.
2164
+ * Makes sure each property is in the allowed list
2165
+ * Makes sure color value is RGB
2166
+ * Performs deep merge when updating metadata
2167
+ */
2168
+ var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
2169
+ var validatedProps = Object.entries(props).reduce(function (acc, entry) {
2170
+ var _entry = (0, _slicedToArray2["default"])(entry, 2),
2171
+ key = _entry[0],
2172
+ value = _entry[1];
2173
+ // is it allowed ?
2174
+ if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
2175
+ return acc;
2176
+ }
2177
+
2178
+ // if we are adding a color but it is not RGB we don't accept the value
2179
+ // in the future as we add more props we should change this if into a switch
2180
+ if (key === 'color' && !(0, _utils.isRgbColor)(value)) {
2181
+ return acc;
2182
+ }
2183
+
2184
+ // do we need deep merge ?
2185
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(value) ? (0, _deepmerge["default"])(dataset[key] || {}, value) : value));
2186
+ }, {});
2187
+ return validatedProps;
2188
+ };
2189
+
2190
+ /**
2191
+ * Update Dataset props (label, color, meta). Do not use to update data or any related properties
2192
+ * @memberof visStateUpdaters
2193
+ * @public
2194
+ */
2195
+ function updateDatasetPropsUpdater(state, action) {
2196
+ var dataId = action.dataId,
2197
+ props = action.props;
2198
+ var datasets = state.datasets;
2199
+ var existing = datasets[dataId];
2200
+ if (existing) {
2201
+ var validatedProps = validateDatasetUpdateProps(props, existing);
2202
+ // validate props: just color for now
2203
+ // we only allow label, color and meta to be updated
2204
+ // const newTable = copyTableAndUpdate(existing, validatedProps);
2205
+ return _objectSpread(_objectSpread({}, state), {}, {
2206
+ datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, validatedProps)))
2207
+ });
2208
+ }
2209
+ return state;
2210
+ }
2211
+
2212
+ /**
2213
+ * When a user clicks on the specific map closing icon
2214
+ * the application will close the selected map
2215
+ * and will merge the remaining one with the global state
2216
+ * TODO: i think in the future this action should be called merge map layers with global settings
2217
+ * @param {Object} state `visState`
2218
+ * @param {Object} action action
2219
+ * @returns {Object} nextState
2220
+ */
2221
+ function closeSpecificMapAtIndex(state, action) {
2222
+ var _state$splitMaps$inde;
2223
+ // retrieve layers meta data from the remaining map that we need to keep
2224
+ var indexToRetrieve = 1 - action.payload;
2225
+ var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
2226
+ var layers = state.layers;
2227
+
2228
+ // update layer visibility
2229
+ var newLayers = layers.map(function (layer) {
2230
+ return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
2231
+ // if layer.id is not in mapLayers, it should be inVisible
2232
+ isVisible: false
2233
+ }) : layer;
2234
+ });
2235
+
2236
+ // delete map
2237
+ return _objectSpread(_objectSpread({}, state), {}, {
2238
+ layers: newLayers,
2239
+ splitMaps: []
2240
+ });
2241
+ }
2242
+
2243
+ /**
2244
+ * Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
2245
+ * @memberof visStateUpdaters
2246
+ * @public
2247
+ */
2248
+ var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state, action) {
2249
+ var files = action.files,
2250
+ _action$onFinish = action.onFinish,
2251
+ onFinish = _action$onFinish === void 0 ? _actions.loadFilesSuccess : _action$onFinish;
2252
+ if (!files.length) {
2253
+ return state;
2254
+ }
2255
+ var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
2256
+ return (0, _composerHelpers.merge_)(initialFileLoadingProgress(f, i))(accu);
2257
+ }, {});
2258
+ var fileLoading = {
2259
+ fileCache: [],
2260
+ filesToLoad: files,
2261
+ onFinish: onFinish
2262
+ };
2263
+ var nextState = (0, _composerHelpers.merge_)({
2264
+ fileLoadingProgress: fileLoadingProgress,
2265
+ fileLoading: fileLoading
2266
+ })(state);
2267
+ return loadNextFileUpdater(nextState);
2268
+ };
2269
+
2270
+ /**
2271
+ * Sucessfully loaded one file, move on to the next one
2272
+ * @memberof visStateUpdaters
2273
+ * @public
2274
+ */
2275
+ function loadFileStepSuccessUpdater(state, action) {
2276
+ if (!state.fileLoading) {
2277
+ return state;
2278
+ }
2279
+ var fileName = action.fileName,
2280
+ fileCache = action.fileCache;
2281
+ var _state$fileLoading = state.fileLoading,
2282
+ filesToLoad = _state$fileLoading.filesToLoad,
2283
+ onFinish = _state$fileLoading.onFinish;
2284
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
2285
+ fileName: fileName,
2286
+ progress: {
2287
+ percent: 1,
2288
+ message: 'Done'
2289
+ }
2290
+ });
2291
+
2292
+ // save processed file to fileCache
2293
+ var stateWithCache = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
2294
+ fileCache: fileCache
2295
+ }))(stateWithProgress);
2296
+ return (0, _tasks.withTask)(stateWithCache, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
2297
+ return onFinish(fileCache);
2298
+ }));
2299
+ }
2300
+
2301
+ // withTask<T>(state: T, task: any): T
2302
+
2303
+ /**
2304
+ *
2305
+ * @memberof visStateUpdaters
2306
+ * @public
2307
+ */
2308
+ function loadNextFileUpdater(state) {
2309
+ if (!state.fileLoading) {
2310
+ return state;
2311
+ }
2312
+ var filesToLoad = state.fileLoading.filesToLoad;
2313
+ var _filesToLoad = (0, _toArray2["default"])(filesToLoad),
2314
+ file = _filesToLoad[0],
2315
+ remainingFilesToLoad = _filesToLoad.slice(1);
2316
+
2317
+ // save filesToLoad to state
2318
+ var nextState = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
2319
+ filesToLoad: remainingFilesToLoad
2320
+ }))(state);
2321
+ var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
2322
+ fileName: file.name,
2323
+ progress: {
2324
+ percent: 0,
2325
+ message: 'loading...'
2326
+ }
2327
+ });
2328
+ var loaders = state.loaders,
2329
+ loadOptions = state.loadOptions;
2330
+ return (0, _tasks.withTask)(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
2331
+ }
2332
+ function makeLoadFileTask(file, fileCache) {
2333
+ var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
2334
+ var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
2335
+ return (0, _tasks2.LOAD_FILE_TASK)({
2336
+ file: file,
2337
+ fileCache: fileCache,
2338
+ loaders: loaders,
2339
+ loadOptions: loadOptions
2340
+ }).bimap(
2341
+ // prettier ignore
2342
+ // success
2343
+ function (gen) {
2344
+ return (0, _actions.nextFileBatch)({
2345
+ gen: gen,
2346
+ fileName: file.name,
2347
+ onFinish: function onFinish(result) {
2348
+ return (0, _actions.processFileContent)({
2349
+ content: result,
2350
+ fileCache: fileCache
2351
+ });
2352
+ }
2353
+ });
2354
+ },
2355
+ // error
2356
+ function (err) {
2357
+ return (0, _actions.loadFilesErr)(file.name, err);
2358
+ });
2359
+ }
2360
+
2361
+ /**
2362
+ *
2363
+ * @memberof visStateUpdaters
2364
+ * @public
2365
+ */
2366
+ function processFileContentUpdater(state, action) {
2367
+ var _action$payload2 = action.payload,
2368
+ content = _action$payload2.content,
2369
+ fileCache = _action$payload2.fileCache;
2370
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
2371
+ fileName: content.fileName,
2372
+ progress: {
2373
+ percent: 1,
2374
+ message: 'processing...'
2375
+ }
2376
+ });
2377
+ return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.PROCESS_FILE_DATA)({
2378
+ content: content,
2379
+ fileCache: fileCache
2380
+ }).bimap(function (result) {
2381
+ return (0, _actions.loadFileStepSuccess)({
2382
+ fileName: content.fileName,
2383
+ fileCache: result
2384
+ });
2385
+ }, function (err) {
2386
+ return (0, _actions.loadFilesErr)(content.fileName, err);
2387
+ }));
2388
+ }
2389
+
2390
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2391
+ function parseProgress() {
2392
+ var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2393
+ var progress = arguments.length > 1 ? arguments[1] : undefined;
2394
+ // This happens when receiving query metadata or other cases we don't
2395
+ // have an update for the user.
2396
+ if (!progress || !progress.percent) {
2397
+ return {};
2398
+ }
2399
+ return {
2400
+ percent: progress.percent
2401
+ };
2402
+ }
2403
+
2404
+ /**
2405
+ * gets called with payload = AsyncGenerator<???>
2406
+ * @memberof visStateUpdaters
2407
+ * @public
2408
+ */
2409
+ var nextFileBatchUpdater = exports.nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref18) {
2410
+ var _accumulated$data;
2411
+ var _ref18$payload = _ref18.payload,
2412
+ gen = _ref18$payload.gen,
2413
+ fileName = _ref18$payload.fileName,
2414
+ progress = _ref18$payload.progress,
2415
+ accumulated = _ref18$payload.accumulated,
2416
+ onFinish = _ref18$payload.onFinish;
2417
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
2418
+ fileName: fileName,
2419
+ progress: parseProgress(state.fileLoadingProgress[fileName], progress)
2420
+ });
2421
+ return (0, _tasks.withTask)(stateWithProgress, [].concat((0, _toConsumableArray2["default"])(fileName.endsWith('arrow') && (accumulated === null || accumulated === void 0 || (_accumulated$data = accumulated.data) === null || _accumulated$data === void 0 ? void 0 : _accumulated$data.length) > 0 ? [(0, _tasks2.PROCESS_FILE_DATA)({
2422
+ content: accumulated,
2423
+ fileCache: []
2424
+ }).bimap(function (result) {
2425
+ return (0, _actions.loadFilesSuccess)(result);
2426
+ }, function (err) {
2427
+ return (0, _actions.loadFilesErr)(fileName, err);
2428
+ })] : []), [(0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref19) {
2429
+ var value = _ref19.value,
2430
+ done = _ref19.done;
2431
+ return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
2432
+ gen: gen,
2433
+ fileName: fileName,
2434
+ progress: value.progress,
2435
+ accumulated: value,
2436
+ onFinish: onFinish
2437
+ });
2438
+ }, function (err) {
2439
+ return (0, _actions.loadFilesErr)(fileName, err);
2440
+ })]));
2441
+ };
2442
+
2443
+ /**
2444
+ * Trigger loading file error
2445
+ * @memberof visStateUpdaters
2446
+ * @public
2447
+ */
2448
+ var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
2449
+ var error = _ref20.error,
2450
+ fileName = _ref20.fileName;
2451
+ // update ui with error message
2452
+ _window.console.warn(error);
2453
+ if (!state.fileLoading) {
2454
+ return state;
2455
+ }
2456
+ var _state$fileLoading2 = state.fileLoading,
2457
+ filesToLoad = _state$fileLoading2.filesToLoad,
2458
+ onFinish = _state$fileLoading2.onFinish,
2459
+ fileCache = _state$fileLoading2.fileCache;
2460
+ var nextState = updateFileLoadingProgressUpdater(state, {
2461
+ fileName: fileName,
2462
+ progress: {
2463
+ error: error
2464
+ }
2465
+ });
2466
+
2467
+ // kick off next file or finish
2468
+ return (0, _tasks.withTask)(nextState, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
2469
+ return onFinish(fileCache);
2470
+ }));
2471
+ };
2472
+
2473
+ /**
2474
+ * When select dataset for export, apply cpu filter to selected dataset
2475
+ * @memberof visStateUpdaters
2476
+ * @public
2477
+ */
2478
+ var applyCPUFilterUpdater = exports.applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref21) {
2479
+ var dataId = _ref21.dataId;
2480
+ // apply cpuFilter
2481
+ var dataIds = (0, _commonUtils.toArray)(dataId);
2482
+ return dataIds.reduce(function (accu, id) {
2483
+ return (0, _utils.filterDatasetCPU)(accu, id);
2484
+ }, state);
2485
+ };
2486
+
2487
+ /**
2488
+ * User input to update the info of the map
2489
+ * @memberof visStateUpdaters
2490
+ * @public
2491
+ */
2492
+ var setMapInfoUpdater = exports.setMapInfoUpdater = function setMapInfoUpdater(state, action) {
2493
+ return _objectSpread(_objectSpread({}, state), {}, {
2494
+ mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
2495
+ });
2496
+ };
2497
+ /**
2498
+ * Helper function to update All layer domain and layer data of state
2499
+ */
2500
+ function addDefaultLayers(state, datasets) {
2501
+ var empty = [];
2502
+ var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
2503
+ var foundLayers = (0, _layerUtils.findDefaultLayer)(dataset, state.layerClasses);
2504
+ return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
2505
+ }, empty);
2506
+ return {
2507
+ state: _objectSpread(_objectSpread({}, state), {}, {
2508
+ layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
2509
+ layerOrder: [].concat((0, _toConsumableArray2["default"])((0, _layerUtils.getLayerOrderFromLayers)(defaultLayers)), (0, _toConsumableArray2["default"])(state.layerOrder))
2510
+ }),
2511
+ newLayers: defaultLayers
2512
+ };
2513
+ }
2514
+
2515
+ /**
2516
+ * helper function to find default tooltips
2517
+ * @param {Object} state
2518
+ * @param {Object} dataset
2519
+ * @returns {Object} nextState
2520
+ */
2521
+ function addDefaultTooltips(state, dataset) {
2522
+ var tooltipFields = (0, _interactionUtils.findFieldsToShow)(_objectSpread(_objectSpread({}, dataset), {}, {
2523
+ maxDefaultTooltips: state.maxDefaultTooltips
2524
+ }));
2525
+ var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
2526
+ return (0, _utils.set)(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
2527
+ }
2528
+ function initialFileLoadingProgress(file, index) {
2529
+ var fileName = file.name || "Untitled File ".concat(index);
2530
+ return (0, _defineProperty2["default"])({}, fileName, {
2531
+ // percent of current file
2532
+ percent: 0,
2533
+ message: '',
2534
+ fileName: fileName,
2535
+ error: null
2536
+ });
2537
+ }
2538
+ function updateFileLoadingProgressUpdater(state, _ref23) {
2539
+ var fileName = _ref23.fileName,
2540
+ progress = _ref23.progress;
2541
+ // @ts-expect-error
2542
+ return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
2543
+ }
2544
+ /**
2545
+ * Helper function to update layer domains for an array of datasets
2546
+ */
2547
+ function updateAllLayerDomainData(state, dataId, updatedFilter) {
2548
+ var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
2549
+ var newLayers = [];
2550
+ var newLayerData = [];
2551
+ state.layers.forEach(function (oldLayer, i) {
2552
+ if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
2553
+ // No need to recalculate layer domain if filter has fixed domain
2554
+ var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
2555
+ var _calculateLayerData7 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
2556
+ layerData = _calculateLayerData7.layerData,
2557
+ layer = _calculateLayerData7.layer;
2558
+ newLayers.push(layer);
2559
+ newLayerData.push(layerData);
2560
+ } else {
2561
+ newLayers.push(oldLayer);
2562
+ newLayerData.push(state.layerData[i]);
2563
+ }
2564
+ });
2565
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
2566
+ layers: newLayers,
2567
+ layerData: newLayerData
2568
+ });
2569
+ return newState;
2570
+ }
2571
+ function updateAnimationDomain(state) {
2572
+ var _state$filters;
2573
+ // merge all animatable layer domain and update global config
2574
+ var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(state.layers);
2575
+ if (!animatableLayers.length) {
2576
+ return _objectSpread(_objectSpread({}, state), {}, {
2577
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
2578
+ domain: null,
2579
+ isAnimating: false,
2580
+ timeSteps: null,
2581
+ defaultTimeFormat: null
2582
+ })
2583
+ });
2584
+ }
2585
+ var layerDomains = animatableLayers.map(function (l) {
2586
+ return l.config.animation.domain || [];
2587
+ });
2588
+ // @ts-ignore
2589
+ var mergedDomain = (0, _utils.mergeTimeDomains)(layerDomains);
2590
+ var defaultTimeFormat = (0, _utils.getTimeWidgetTitleFormatter)(mergedDomain);
2591
+
2592
+ // merge timeSteps
2593
+ var mergedTimeSteps = (0, _lodash5["default"])(animatableLayers.reduce(function (accu, layer) {
2594
+ accu.push.apply(accu, (0, _toConsumableArray2["default"])(layer.config.animation.timeSteps || []));
2595
+ return accu;
2596
+ }, [])).sort();
2597
+ mergedTimeSteps = mergedTimeSteps.length ? mergedTimeSteps : null;
2598
+
2599
+ // TODO: better handling of duration calculation
2600
+ var duration = mergedTimeSteps ? _constants.BASE_SPEED * (1000 / _constants.FPS) / mergedTimeSteps.length / (state.animationConfig.speed || 1) : null;
2601
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
2602
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
2603
+ domain: mergedDomain,
2604
+ defaultTimeFormat: defaultTimeFormat,
2605
+ duration: duration,
2606
+ timeSteps: mergedTimeSteps
2607
+ })
2608
+ });
2609
+
2610
+ // reset currentTime based on new domain
2611
+ var syncedFilter = (_state$filters = state.filters) === null || _state$filters === void 0 ? void 0 : _state$filters.find(function (f) {
2612
+ return f.syncedWithLayerTimeline;
2613
+ });
2614
+
2615
+ // if synced filter exist wee need to merge animationConfig and filter domains
2616
+ // and validate the current time against the new merged domain
2617
+ var newAnimationDomain = syncedFilter ? (0, _utils.mergeTimeDomains)([mergedDomain, syncedFilter.domain]) : mergedDomain;
2618
+ var currentTime = (0, _utils.isInRange)(state.animationConfig.currentTime, newAnimationDomain) ? state.animationConfig.currentTime : newAnimationDomain[0];
2619
+ if (currentTime !== state.animationConfig.currentTime) {
2620
+ // if currentTime changed, need to call animationTimeUpdater to re call formatLayerData
2621
+ return setLayerAnimationTimeUpdater(nextState, {
2622
+ value: currentTime
2623
+ });
2624
+ }
2625
+ return nextState;
2626
+ }
2627
+
2628
+ /**
2629
+ * Update the status of the editor
2630
+ * @memberof visStateUpdaters
2631
+ */
2632
+ var setEditorModeUpdater = exports.setEditorModeUpdater = function setEditorModeUpdater(state, _ref24) {
2633
+ var mode = _ref24.mode;
2634
+ return _objectSpread(_objectSpread({}, state), {}, {
2635
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2636
+ mode: mode,
2637
+ selectedFeature: null
2638
+ })
2639
+ });
2640
+ };
2641
+
2642
+ // const featureToFilterValue = (feature) => ({...feature, id: feature.id});
2643
+ /**
2644
+ * Update editor features
2645
+ * @memberof visStateUpdaters
2646
+ */
2647
+ function setFeaturesUpdater(state, _ref25) {
2648
+ var _ref25$features = _ref25.features,
2649
+ features = _ref25$features === void 0 ? [] : _ref25$features;
2650
+ var lastFeature = features.length && features[features.length - 1];
2651
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
2652
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2653
+ // only save none filter features to editor
2654
+ features: features.filter(function (f) {
2655
+ return !(0, _utils.getFilterIdInFeature)(f);
2656
+ }),
2657
+ mode: lastFeature && lastFeature.properties.isClosed ? _constants.EDITOR_MODES.EDIT : state.editor.mode
2658
+ })
2659
+ });
2660
+
2661
+ // Retrieve existing feature
2662
+ var selectedFeature = state.editor.selectedFeature;
2663
+
2664
+ // If no feature is selected we can simply return since no operations
2665
+ if (!selectedFeature) {
2666
+ return newState;
2667
+ }
2668
+
2669
+ // TODO: check if the feature has changed
2670
+ var feature = features.find(function (f) {
2671
+ return f.id === selectedFeature.id;
2672
+ });
2673
+
2674
+ // if feature is part of a filter
2675
+ var filterId = feature && (0, _utils.getFilterIdInFeature)(feature);
2676
+ if (filterId && feature) {
2677
+ // add bbox for polygon filter to speed up filtering
2678
+ if (feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
2679
+ var featureValue = (0, _utils.featureToFilterValue)(feature, filterId);
2680
+ var filterIdx = state.filters.findIndex(function (fil) {
2681
+ return fil.id === filterId;
2682
+ });
2683
+ // @ts-ignore
2684
+ return setFilterUpdater(newState, {
2685
+ idx: filterIdx,
2686
+ prop: 'value',
2687
+ value: featureValue
2688
+ });
2689
+ }
2690
+ return newState;
2691
+ }
2692
+
2693
+ /**
2694
+ * Set the current selected feature
2695
+ * @memberof uiStateUpdaters
2696
+ */
2697
+ var setSelectedFeatureUpdater = exports.setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref26) {
2698
+ var feature = _ref26.feature,
2699
+ selectionContext = _ref26.selectionContext;
2700
+ // add bbox for polygon filter to speed up filtering
2701
+ if (feature && feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
2702
+ return _objectSpread(_objectSpread({}, state), {}, {
2703
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2704
+ selectedFeature: feature,
2705
+ selectionContext: selectionContext
2706
+ })
2707
+ });
2708
+ };
2709
+
2710
+ /**
2711
+ * Delete existing feature from filters
2712
+ * @memberof visStateUpdaters
2713
+ */
2714
+ function deleteFeatureUpdater(state, _ref27) {
2715
+ var feature = _ref27.feature;
2716
+ if (!feature) {
2717
+ return state;
2718
+ }
2719
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
2720
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2721
+ selectedFeature: null
2722
+ })
2723
+ });
2724
+ if ((0, _utils.getFilterIdInFeature)(feature)) {
2725
+ var filterIdx = newState.filters.findIndex(function (f) {
2726
+ return f.id === (0, _utils.getFilterIdInFeature)(feature);
2727
+ });
2728
+ return filterIdx > -1 ? removeFilterUpdater(newState, {
2729
+ idx: filterIdx
2730
+ }) : newState;
2731
+ }
2732
+
2733
+ // modify editor object
2734
+ var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
2735
+ features: state.editor.features.filter(function (f) {
2736
+ return f.id !== feature.id;
2737
+ }),
2738
+ selectedFeature: null
2739
+ });
2740
+ return _objectSpread(_objectSpread({}, state), {}, {
2741
+ editor: newEditor
2742
+ });
2743
+ }
2744
+
2745
+ /**
2746
+ * Toggle feature as layer filter
2747
+ * @memberof visStateUpdaters
2748
+ */
2749
+ function setPolygonFilterLayerUpdater(state, payload) {
2750
+ var layer = payload.layer,
2751
+ feature = payload.feature;
2752
+ var filterId = (0, _utils.getFilterIdInFeature)(feature);
2753
+
2754
+ // let newFilter = null;
2755
+ var filterIdx;
2756
+ var newLayerId = [layer.id];
2757
+ var newState = state;
2758
+ // If polygon filter already exists, we need to find out if the current layer is already included
2759
+ if (filterId) {
2760
+ filterIdx = state.filters.findIndex(function (f) {
2761
+ return f.id === filterId;
2762
+ });
2763
+ if (!state.filters[filterIdx]) {
2764
+ // what if filter doesn't exist?... not possible.
2765
+ // because features in the editor is passed in from filters and editors.
2766
+ // but we will move this feature back to editor just in case
2767
+ var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
2768
+ properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
2769
+ filterId: null
2770
+ })
2771
+ });
2772
+ return _objectSpread(_objectSpread({}, state), {}, {
2773
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2774
+ features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), [noneFilterFeature]),
2775
+ selectedFeature: noneFilterFeature
2776
+ })
2777
+ });
2778
+ }
2779
+ var filter = state.filters[filterIdx];
2780
+ var _filter$layerId = filter.layerId,
2781
+ layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
2782
+ var isLayerIncluded = layerId.includes(layer.id);
2783
+ newLayerId = isLayerIncluded ?
2784
+ // if layer is included, remove it
2785
+ layerId.filter(function (l) {
2786
+ return l !== layer.id;
2787
+ }) : [].concat((0, _toConsumableArray2["default"])(layerId), [layer.id]);
2788
+ } else {
2789
+ // if we haven't create the polygon filter, create it
2790
+ var newFilter = (0, _utils.generatePolygonFilter)([], feature);
2791
+ filterIdx = state.filters.length;
2792
+
2793
+ // add feature, remove feature from eidtor
2794
+ newState = _objectSpread(_objectSpread({}, state), {}, {
2795
+ filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
2796
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2797
+ features: state.editor.features.filter(function (f) {
2798
+ return f.id !== feature.id;
2799
+ }),
2800
+ selectedFeature: newFilter.value
2801
+ })
2802
+ });
2803
+ }
2804
+ return setFilterUpdater(newState, {
2805
+ idx: filterIdx,
2806
+ prop: 'layerId',
2807
+ value: newLayerId
2808
+ });
2809
+ }
2810
+
2811
+ /**
2812
+ * @memberof visStateUpdaters
2813
+ * @public
2814
+ */
2815
+ function sortTableColumnUpdater(state, _ref28) {
2816
+ var dataId = _ref28.dataId,
2817
+ column = _ref28.column,
2818
+ mode = _ref28.mode;
2819
+ var dataset = state.datasets[dataId];
2820
+ if (!dataset) {
2821
+ return state;
2822
+ }
2823
+ var sortMode = mode;
2824
+ if (!sortMode) {
2825
+ var currentMode = (0, _lodash2["default"])(dataset, ['sortColumn', column]);
2826
+ // @ts-ignore - should be fixable in a TS file
2827
+ sortMode = currentMode ? Object.keys(_constants.SORT_ORDER).find(function (m) {
2828
+ return m !== currentMode;
2829
+ }) : _constants.SORT_ORDER.ASCENDING;
2830
+ }
2831
+ var sorted = (0, _table.sortDatasetByColumn)(dataset, column, sortMode);
2832
+ return (0, _utils.set)(['datasets', dataId], sorted, state);
2833
+ }
2834
+
2835
+ /**
2836
+ * @memberof visStateUpdaters
2837
+ * @public
2838
+ */
2839
+ function pinTableColumnUpdater(state, _ref29) {
2840
+ var dataId = _ref29.dataId,
2841
+ column = _ref29.column;
2842
+ var dataset = state.datasets[dataId];
2843
+ if (!dataset) {
2844
+ return state;
2845
+ }
2846
+ var newDataset = (0, _table.pinTableColumns)(dataset, column);
2847
+ return (0, _utils.set)(['datasets', dataId], newDataset, state);
2848
+ }
2849
+
2850
+ /**
2851
+ * Copy column content as strings
2852
+ * @memberof visStateUpdaters
2853
+ * @public
2854
+ */
2855
+ function copyTableColumnUpdater(state, _ref30) {
2856
+ var dataId = _ref30.dataId,
2857
+ column = _ref30.column;
2858
+ var dataset = state.datasets[dataId];
2859
+ if (!dataset) {
2860
+ return state;
2861
+ }
2862
+ var fieldIdx = dataset.fields.findIndex(function (f) {
2863
+ return f.name === column;
2864
+ });
2865
+ if (fieldIdx < 0) {
2866
+ return state;
2867
+ }
2868
+ var type = dataset.fields[fieldIdx].type;
2869
+ var text = dataset.dataContainer.map(function (row) {
2870
+ return (0, _utils.parseFieldValue)(row.valueAt(fieldIdx), type);
2871
+ }, true).join('\n');
2872
+ (0, _copyToClipboard["default"])(text);
2873
+ return state;
2874
+ }
2875
+
2876
+ /**
2877
+ * Set display format from columns from user selection
2878
+ * @memberof visStateUpdaters
2879
+ * @public
2880
+ */
2881
+ function setColumnDisplayFormatUpdater(state, _ref31) {
2882
+ var dataId = _ref31.dataId,
2883
+ formats = _ref31.formats;
2884
+ var dataset = state.datasets[dataId];
2885
+ if (!dataset) {
2886
+ return state;
2887
+ }
2888
+ var newFields = dataset.fields;
2889
+ Object.keys(formats).forEach(function (column) {
2890
+ var fieldIdx = dataset.fields.findIndex(function (f) {
2891
+ return f.name === column;
2892
+ });
2893
+ if (fieldIdx >= 0) {
2894
+ var displayFormat = formats[column];
2895
+ var field = newFields[fieldIdx];
2896
+ newFields = (0, _composerHelpers.swap_)((0, _composerHelpers.merge_)({
2897
+ displayFormat: displayFormat
2898
+ })(field))(newFields);
2899
+ }
2900
+ });
2901
+ var newDataset = (0, _table.copyTableAndUpdate)(dataset, {
2902
+ fields: newFields
2903
+ });
2904
+ return (0, _composerHelpers.pick_)('datasets')((0, _composerHelpers.merge_)((0, _defineProperty2["default"])({}, dataId, newDataset)))(state);
2905
+ }
2906
+
2907
+ /**
2908
+ * Update editor
2909
+ */
2910
+ function toggleEditorVisibilityUpdater(state,
2911
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2912
+ action) {
2913
+ return _objectSpread(_objectSpread({}, state), {}, {
2914
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2915
+ visible: !state.editor.visible
2916
+ })
2917
+ });
2918
+ }
2919
+ function setFilterAnimationTimeConfigUpdater(state, _ref32) {
2920
+ var idx = _ref32.idx,
2921
+ config = _ref32.config;
2922
+ var oldFilter = state.filters[idx];
2923
+ if (!oldFilter) {
2924
+ _window.console.error("filters.".concat(idx, " is undefined"));
2925
+ return state;
2926
+ }
2927
+ if (oldFilter.type !== _constants.FILTER_TYPES.timeRange) {
2928
+ _window.console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
2929
+ return state;
2930
+ }
2931
+ var updates = checkTimeConfigArgs(config);
2932
+ return (0, _composerHelpers.pick_)('filters')((0, _composerHelpers.swap_)((0, _composerHelpers.merge_)(updates)(oldFilter)))(state);
2933
+ }
2934
+ function checkTimeConfigArgs(config) {
2935
+ var allowed = ['timeFormat', 'timezone'];
2936
+ return Object.keys(config).reduce(function (accu, prop) {
2937
+ if (!allowed.includes(prop)) {
2938
+ _window.console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
2939
+ return accu;
2940
+ }
2941
+
2942
+ // here we are NOT checking if timezone or timeFormat input is valid
2943
+ accu[prop] = config[prop];
2944
+ return accu;
2945
+ }, {});
2946
+ }
2947
+
2948
+ /**
2949
+ * Update editor
2950
+ */
2951
+ function setLayerAnimationTimeConfigUpdater(state, _ref33) {
2952
+ var config = _ref33.config;
2953
+ if (!config) {
2954
+ return state;
2955
+ }
2956
+ var updates = checkTimeConfigArgs(config);
2957
+ return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
2958
+ }
2959
+
2960
+ /**
2961
+ * Update editor
2962
+ */
2963
+ function layerFilteredItemsChangeUpdater(state, action) {
2964
+ var _layer$filteredItemCo;
2965
+ var event = action.event,
2966
+ layer = action.layer;
2967
+ var deckglLayerId = event.id,
2968
+ count = event.count;
2969
+ if (!layer) {
2970
+ _window.console.warn("layerFilteredItems layer doesnt exists");
2971
+ return state;
2972
+ }
2973
+ if (((_layer$filteredItemCo = layer.filteredItemCount) === null || _layer$filteredItemCo === void 0 ? void 0 : _layer$filteredItemCo[deckglLayerId]) === count) {
2974
+ return state;
2975
+ }
2976
+ layer.filteredItemCount = _objectSpread(_objectSpread({}, layer.filteredItemCount), {}, (0, _defineProperty2["default"])({}, deckglLayerId, count));
2977
+ return _objectSpread(_objectSpread({}, state), {}, {
2978
+ layers: (0, _composerHelpers.swap_)(layer)(state.layers)
2979
+ });
2980
+ }
2981
+
2982
+ // eslint-disable-next-line max-statements
2983
+ function syncTimeFilterWithLayerTimelineUpdater(state, action) {
2984
+ var _newState$animationCo, _newState$animationCo2;
2985
+ var filterIdx = action.idx,
2986
+ _action$enable = action.enable,
2987
+ enable = _action$enable === void 0 ? false : _action$enable;
2988
+ var filter = state.filters[filterIdx];
2989
+ var newState = state;
2990
+ var newFilter = filter;
2991
+
2992
+ // if we enable sync we are going to merge filter and animationConfig domains and store into filter.domain
2993
+ if (enable) {
2994
+ var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(newState.layers);
2995
+ // if no animatableLayers are present we simply return
2996
+ if (!animatableLayers.length) {
2997
+ return newState;
2998
+ }
2999
+ var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(animatableLayers);
3000
+ var hasIntervalBasedAnimationLayer = Boolean(intervalBasedAnimationLayers.length);
3001
+ var newFilterDomain = (0, _utils.mergeTimeDomains)([filter.domain, newState.animationConfig.domain]);
3002
+
3003
+ // we only update animationWindow if we have interval based animation layers with defined intervals and the current filter animation window is not interval
3004
+ if (hasIntervalBasedAnimationLayer) {
3005
+ if (filter.animationWindow !== _constants.ANIMATION_WINDOW.interval) {
3006
+ newState = setFilterAnimationWindowUpdater(newState, {
3007
+ id: filter.id,
3008
+ animationWindow: _constants.ANIMATION_WINDOW.interval
3009
+ });
3010
+ }
3011
+ newFilter = newState.filters[filterIdx];
3012
+
3013
+ // adjust time filter interval
3014
+ newFilter = adjustTimeFilterInterval(newState, newFilter);
3015
+
3016
+ // replace filter in state with newFilter
3017
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3018
+ filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
3019
+ });
3020
+ }
3021
+ newFilter = newState.filters[filterIdx];
3022
+
3023
+ // adjust value based on new domain
3024
+ var _newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.animationWindow === _constants.ANIMATION_WINDOW.interval ? [newFilterDomain[0], newFilterDomain[0]] : newFilterDomain, _objectSpread(_objectSpread({}, newFilter), {}, {
3025
+ domain: newFilterDomain
3026
+ }));
3027
+ newState = setFilterUpdater(newState, {
3028
+ idx: filterIdx,
3029
+ prop: 'value',
3030
+ value: _newFilterValue
3031
+ });
3032
+ newFilter = _objectSpread(_objectSpread({}, newState.filters[filterIdx]), {}, {
3033
+ syncedWithLayerTimeline: true
3034
+ });
3035
+
3036
+ // replace filter in state with newFilter
3037
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3038
+ filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
3039
+ });
3040
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3041
+ id: newFilter.id,
3042
+ mode: getSyncAnimationMode(newFilter)
3043
+ });
3044
+ newFilter = newState.filters[filterIdx];
3045
+
3046
+ // set the animation config value to match filter value
3047
+ return setLayerAnimationTimeUpdater(newState, {
3048
+ value: newFilter.value[newFilter.syncTimelineMode]
3049
+ });
3050
+ }
3051
+
3052
+ // set domain and step
3053
+ newFilter = _objectSpread(_objectSpread({}, filter), {}, {
3054
+ syncedWithLayerTimeline: false
3055
+ });
3056
+
3057
+ // replace filter in state with newFilter
3058
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3059
+ filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
3060
+ });
3061
+
3062
+ // reset sync timeline mode
3063
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3064
+ id: newFilter.id,
3065
+ mode: _constants.SYNC_TIMELINE_MODES.end
3066
+ });
3067
+ newFilter = newState.filters[filterIdx];
3068
+
3069
+ // reset filter value
3070
+ var newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.domain, newFilter);
3071
+ newState = setFilterUpdater(newState, {
3072
+ idx: filterIdx,
3073
+ prop: 'value',
3074
+ value: newFilterValue
3075
+ });
3076
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3077
+ id: newFilter.id,
3078
+ mode: getSyncAnimationMode(newFilter)
3079
+ });
3080
+
3081
+ // reset animation config current time to
3082
+ return setLayerAnimationTimeUpdater(newState, {
3083
+ value: (_newState$animationCo = (_newState$animationCo2 = newState.animationConfig.domain) === null || _newState$animationCo2 === void 0 ? void 0 : _newState$animationCo2[0]) !== null && _newState$animationCo !== void 0 ? _newState$animationCo : null
3084
+ });
3085
+ }
3086
+ function setTimeFilterTimelineModeUpdater(state, action) {
3087
+ var filterId = action.id,
3088
+ syncTimelineMode = action.mode;
3089
+ var filterIdx = state.filters.findIndex(function (f) {
3090
+ return f.id === filterId;
3091
+ });
3092
+ if (filterIdx === -1) {
3093
+ return state;
3094
+ }
3095
+ var filter = state.filters[filterIdx];
3096
+ if (!validateSyncAnimationMode(filter, syncTimelineMode)) {
3097
+ return state;
3098
+ }
3099
+ var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
3100
+ syncTimelineMode: syncTimelineMode
3101
+ });
3102
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3103
+ filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
3104
+ });
3105
+ return adjustAnimationConfigWithFilter(newState, filterIdx);
3106
+ }
3107
+ function adjustAnimationConfigWithFilter(state, filterIdx) {
3108
+ var filter = state.filters[filterIdx];
3109
+ if (filter.syncedWithLayerTimeline) {
3110
+ var timelineValue = getTimelineValueFromFilter(filter);
3111
+ var value = state.animationConfig.timeSteps ? (0, _utils.snapToMarks)(timelineValue, state.animationConfig.timeSteps) : timelineValue;
3112
+ return setLayerAnimationTimeUpdater(state, {
3113
+ value: value
3114
+ });
3115
+ }
3116
+ return state;
3117
+ }
3118
+ function getTimelineValueFromFilter(filter) {
3119
+ return filter.value[filter.syncTimelineMode];
3120
+ }
3121
+ function getSyncAnimationMode(filter) {
3122
+ if (filter.animationWindow === _constants.ANIMATION_WINDOW.free) {
3123
+ var _filter$syncTimelineM;
3124
+ return (_filter$syncTimelineM = filter.syncTimelineMode) !== null && _filter$syncTimelineM !== void 0 ? _filter$syncTimelineM : _constants.SYNC_TIMELINE_MODES.end;
3125
+ }
3126
+ return _constants.SYNC_TIMELINE_MODES.end;
3127
+ }
3128
+ function validateSyncAnimationMode(filter, newMode) {
3129
+ return !(filter.animationWindow !== _constants.ANIMATION_WINDOW.free && newMode === _constants.SYNC_TIMELINE_MODES.start);
3130
+ }
3131
+ function adjustTimeFilterInterval(state, filter) {
3132
+ var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(state.layers);
3133
+ var interval = null;
3134
+ if (intervalBasedAnimationLayers.length > 0) {
3135
+ // @ts-ignore
3136
+ var intervalIndex = intervalBasedAnimationLayers.reduce(function (currentIndex, l) {
3137
+ if (l.meta.targetTimeInterval) {
3138
+ var newIndex = _utils.TIME_INTERVALS_ORDERED.findIndex(function (i) {
3139
+ return i === l.meta.targetTimeInterval;
3140
+ });
3141
+ return newIndex > -1 && newIndex < currentIndex ? newIndex : currentIndex;
3142
+ }
3143
+ }, _utils.TIME_INTERVALS_ORDERED.length - 1);
3144
+ // @ts-ignore
3145
+ var hexTileInterval = _utils.TIME_INTERVALS_ORDERED[intervalIndex];
3146
+ interval = _utils.LayerToFilterTimeInterval[hexTileInterval];
3147
+ }
3148
+ if (!interval) {
3149
+ return filter;
3150
+ }
3151
+
3152
+ // adjust filter
3153
+ var timeFormat = (0, _utils.getDefaultTimeFormat)(interval);
3154
+ var updatedPlotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
3155
+ interval: interval,
3156
+ timeFormat: timeFormat
3157
+ });
3158
+ var newFilter = (0, _utils.updateTimeFilterPlotType)(filter, updatedPlotType, state.datasets);
3159
+ return (0, _utils.adjustValueToAnimationWindow)(state, newFilter);
3160
+ }
3161
+
3162
+ // Find dataId from a saved visState property:
3163
+ // layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
3164
+ // replace it with another dataId
3165
+ function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
3166
+ var _value$config, _value$config2;
3167
+ if (Array.isArray(value)) {
3168
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
3169
+ var replaced = value.map(function (v) {
3170
+ return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
3171
+ }).filter(function (d) {
3172
+ return d;
3173
+ });
3174
+ return replaced.length ? replaced : null;
3175
+ }
3176
+ if (typeof value.dataId === 'string' && value.dataId === dataId) {
3177
+ // others
3178
+ return _objectSpread(_objectSpread({}, value), {}, {
3179
+ dataId: dataIdToReplace
3180
+ });
3181
+ } else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
3182
+ // filter
3183
+ return _objectSpread(_objectSpread({}, value), {}, {
3184
+ dataId: value.dataId.map(function (d) {
3185
+ return d === dataId ? dataIdToReplace : d;
3186
+ })
3187
+ });
3188
+ } else if ((_value$config = value.config) !== null && _value$config !== void 0 && _value$config.dataId && ((_value$config2 = value.config) === null || _value$config2 === void 0 ? void 0 : _value$config2.dataId) === dataId) {
3189
+ // layer
3190
+ return _objectSpread(_objectSpread({}, value), {}, {
3191
+ config: _objectSpread(_objectSpread({}, value.config), {}, {
3192
+ dataId: dataIdToReplace
3193
+ })
3194
+ });
3195
+ } else if ((0, _utils.isObject)(value) && Object.prototype.hasOwnProperty.call(value, dataId)) {
3196
+ // for value saved as {[dataId]: {...}}
3197
+ return (0, _defineProperty2["default"])({}, dataIdToReplace, value[dataId]);
3198
+ }
3199
+ return null;
3200
+ }
3201
+
3202
+ // Find datasetIds derived a saved visState Property;
3203
+ function findChildDatasetIds(value) {
3204
+ var _value$newDataset;
3205
+ if (Array.isArray(value)) {
3206
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
3207
+ var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
3208
+ return d;
3209
+ });
3210
+ return childDataIds.length ? childDataIds : null;
3211
+ }
3212
+
3213
+ // child data id usually stores in the derived dataset info
3214
+ return (value === null || value === void 0 || (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
3215
+ }
3216
+
3217
+ // moved unmerged layers, filters, interactions
3218
+ function moveValueToBeMerged(state, propValues, _ref35) {
3219
+ var prop = _ref35.prop,
3220
+ toMergeProp = _ref35.toMergeProp,
3221
+ saveUnmerged = _ref35.saveUnmerged;
3222
+ // remove prop value from state
3223
+ // TODO: should we add remove updater to merger as well?
3224
+ if (!propValues) {
3225
+ return state;
3226
+ }
3227
+ var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
3228
+ return removeLayerUpdater(accu, {
3229
+ id: propValue.id
3230
+ });
3231
+ }, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, state[prop].filter(function (p) {
3232
+ return !propValues.find(function (propValue) {
3233
+ return p.id === propValue.id;
3234
+ });
3235
+ }))) :
3236
+ // if not array, we won't remove it, remove dataset should handle it
3237
+ state;
3238
+
3239
+ // move to stateToBeMerged
3240
+ var toBeMerged = (0, _defineProperty2["default"])({}, toMergeProp, saveUnmerged ?
3241
+ // call merge saveUnmerged method
3242
+ saveUnmerged(stateRemoved, propValues) :
3243
+ // if toMergeProp is araay, append to it
3244
+ Array.isArray(stateRemoved[toMergeProp]) ? [].concat((0, _toConsumableArray2["default"])(stateRemoved[toMergeProp]), (0, _toConsumableArray2["default"])(propValues)) :
3245
+ // save propValues to toMerge
3246
+ (0, _utils.isObject)(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
3247
+ return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
3248
+ }
3249
+ function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
3250
+ return (0, _composerHelpers.compose_)([(0, _composerHelpers.apply_)(replaceDatasetDepsInState, {
3251
+ dataId: dataId,
3252
+ dataIdToUse: dataIdToUse
3253
+ }), (0, _composerHelpers.apply_)(removeDatasetUpdater, {
3254
+ dataId: dataId
3255
+ })])(state);
3256
+ }
3257
+ function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
3258
+ var _nextState$layerToBeM;
3259
+ var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
3260
+ var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse);
3261
+ // make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
3262
+ var preserveLayerOrder = (0, _toConsumableArray2["default"])(state.layerOrder);
3263
+
3264
+ // preserve dataset order
3265
+ nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
3266
+ return d === dataId ? dataIdToUse : d;
3267
+ });
3268
+
3269
+ // preserveLayerOrder
3270
+ if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
3271
+ var _serializedState$spli;
3272
+ // copy split maps to be merged, because it will be reset in remove layer
3273
+ nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
3274
+ nextState.layerOrder = (0, _toConsumableArray2["default"])(preserveLayerOrder);
3275
+ }
3276
+ return nextState;
3277
+ }
3278
+ function replaceDatasetDepsInState(state, _ref36) {
3279
+ var dataId = _ref36.dataId,
3280
+ dataIdToUse = _ref36.dataIdToUse;
3281
+ var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
3282
+ var nextState = state.mergers.reduce(function (accuState, _ref37) {
3283
+ var prop = _ref37.prop,
3284
+ toMergeProp = _ref37.toMergeProp,
3285
+ replaceParentDatasetIds = _ref37.replaceParentDatasetIds,
3286
+ getChildDatasetIds = _ref37.getChildDatasetIds,
3287
+ saveUnmerged = _ref37.saveUnmerged,
3288
+ preserveOrder = _ref37.preserveOrder;
3289
+ // get dataset ids that are depends on this dataset
3290
+ var props = (0, _commonUtils.toArray)(prop);
3291
+ var toMergeProps = (0, _commonUtils.toArray)(toMergeProp);
3292
+ var savedProps = serializedState ? props.map(function (p) {
3293
+ return serializedState[p];
3294
+ }) : [];
3295
+ var replacedState = accuState;
3296
+ savedProps.forEach(function (propValue, i) {
3297
+ var _replacedState$merger;
3298
+ var mergerOptions = {
3299
+ prop: props[i],
3300
+ toMergeProp: toMergeProps[i],
3301
+ getChildDatasetIds: getChildDatasetIds,
3302
+ saveUnmerged: saveUnmerged
3303
+ };
3304
+ var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
3305
+ replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
3306
+ if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
3307
+ replacedState[preserveOrder] = propValue.map(function (item) {
3308
+ return item.id;
3309
+ });
3310
+ }
3311
+ });
3312
+ return replacedState;
3313
+ }, state);
3314
+ return nextState;
3315
+ }
3316
+ function replacePropValueInState(state, replacedItem, _ref38) {
3317
+ var prop = _ref38.prop,
3318
+ toMergeProp = _ref38.toMergeProp,
3319
+ getChildDatasetIds = _ref38.getChildDatasetIds,
3320
+ saveUnmerged = _ref38.saveUnmerged;
3321
+ // prop is depends on the dataset to be replaced
3322
+ // remove prop from state, and move it to toBeMerged
3323
+ var nextState = moveValueToBeMerged(state, replacedItem, {
3324
+ prop: prop,
3325
+ toMergeProp: toMergeProp,
3326
+ saveUnmerged: saveUnmerged
3327
+ });
3328
+ var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
3329
+ if (childDataIds) {
3330
+ nextState = (0, _commonUtils.toArray)(childDataIds).reduce(function (accu, childDataId) {
3331
+ // shouldn't need to change child dataset id,
3332
+ // but still need to move out of state and merge back in
3333
+ return replaceDatasetAndDeps(accu, childDataId, childDataId);
3334
+ }, nextState);
3335
+ }
3336
+ return nextState;
3337
+ }
3338
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmJveCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvcHlUb0NsaXBib2FyZCIsIl9kZWVwbWVyZ2UiLCJfd2luZG93IiwiX2xvZGFzaCIsIl9sb2Rhc2gyIiwiX2xvZGFzaDMiLCJfbG9kYXNoNCIsIl9sb2Rhc2g1IiwiX2xvZGFzaDYiLCJfdGFza3MiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl90YXNrczIiLCJfYWN0aW9ucyIsIl91dGlscyIsIl9jb21tb25VdGlscyIsIl9jb25zdGFudHMiLCJfbGF5ZXJzIiwiX2NvbXBvc2VySGVscGVycyIsIl9tZXJnZXJIYW5kbGVyIiwiX3Zpc1N0YXRlTWVyZ2VyIiwiX3NjaGVtYXMiLCJfdGFibGUiLCJfaW50ZXJhY3Rpb25VdGlscyIsIl9sYXllclV0aWxzIiwiX2VmZmVjdHMiLCJfZGF0YVV0aWxzIiwiX2V4Y2x1ZGVkIiwiX2V4Y2x1ZGVkMiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsImRvbmUiLCJ2YWx1ZSIsImYiLCJvIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkaXNhYmxlU3RhY2tDYXB0dXJpbmciLCJ2aXNTdGF0ZVVwZGF0ZXJzIiwiZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnIiwiZXhwb3J0cyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVTdGVwcyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiaGlkZUNvbnRyb2wiLCJkdXJhdGlvbiIsIkRFRkFVTFRfRURJVE9SIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkRSQVdfUE9MWUdPTiIsImZlYXR1cmVzIiwic2VsZWN0ZWRGZWF0dXJlIiwidmlzaWJsZSIsIklOSVRJQUxfVklTX1NUQVRFIiwibWFwSW5mbyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJsYXllcnMiLCJsYXllckRhdGEiLCJsYXllclRvQmVNZXJnZWQiLCJsYXllck9yZGVyIiwiZmlsdGVycyIsImZpbHRlclRvQmVNZXJnZWQiLCJkYXRhc2V0cyIsImVkaXRpbmdEYXRhc2V0IiwidW5kZWZpbmVkIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiaW50ZXJhY3Rpb25Db25maWciLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJsYXllckJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiaG92ZXJJbmZvIiwiY2xpY2tlZCIsIm1vdXNlUG9zIiwibWF4RGVmYXVsdFRvb2x0aXBzIiwiTUFYX0RFRkFVTFRfVE9PTFRJUFMiLCJzcGxpdE1hcHMiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwiX3JlZiIsImxheWVyIiwiaWR4IiwibWFwIiwibHlyIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImlzVmlzaWJsZSIsImFkZE5ld0xheWVyc1RvU3BsaXRNYXAiLCJyZW1vdmVMYXllckZyb21TcGxpdE1hcHMiLCJhbmltYXRpb24iLCJ1cGRhdGVBbmltYXRpb25Eb21haW4iLCJwaWNrQ2hhbmdlZFByb3BzIiwicHJldiIsImNoYW5nZWRQcm9wcyIsInBpY2tQcm9wc09mIiwib2JqIiwia2V5IiwicHJvdG90eXBlIiwiaXNFcXVhbCIsIlZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMiLCJhcHBseUxheWVyQ29uZmlnVXBkYXRlciIsImFjdGlvbiIsIl9zZXJpYWxpemVMYXllciIsIm9sZExheWVySWQiLCJuZXdMYXllckNvbmZpZyIsImxheWVySW5kZXgiLCJuZXdQYXJzZWRMYXllciIsInBhcnNlTGF5ZXJDb25maWciLCJvbGRMYXllciIsImZpbmQiLCJsIiwiZGF0YXNldCIsImRhdGFJZCIsIm5ld0xheWVyIiwidmFsaWRhdGVMYXllcldpdGhEYXRhIiwibmV4dFN0YXRlIiwidHlwZSIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJsYXllclR5cGVDaGFuZ2VVcGRhdGVyIiwibGF5ZXJUeXBlQ2hhbmdlIiwibmV3TGF5ZXJJZCIsImFwcGx5TGF5ZXJDb25maWciLCJzZXJpYWxpemVkT2xkTGF5ZXIiLCJzZXJpYWxpemVMYXllciIsInNlcmlhbGl6ZWROZXdMYXllciIsImNoYW5nZWQiLCJ2aXNDb25maWciLCJsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsInZpc3VhbENoYW5uZWxzIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsIiwiY2hhbm5lbFByb3BOYW1lcyIsInByb3AiLCJzb21lIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsInBpY2siLCJfaXRlcmF0b3IiLCJfc3RlcCIsImVyciIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsImxheWVyQ29uZmlnQ2hhbmdlIiwicHJvcHMiLCJuZXdDb25maWciLCJfYWN0aW9uJG5ld0NvbmZpZyIsInJlc3RDb25maWciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwic3RhdGVXaXRoRGF0YUlkIiwibGF5ZXJEYXRhSWRDaGFuZ2VVcGRhdGVyIiwibmV4dExheWVyIiwidXBkYXRlTGF5ZXJDb25maWciLCJzaG91bGRDYWxjdWxhdGVMYXllckRhdGEiLCJvbGRMYXllckRhdGEiLCJ1cGRhdGVMYXllckRhdGFSZXN1bHQiLCJjYWxjdWxhdGVMYXllckRhdGEiLCJmaWx0ZXJJbmRleCIsImZpbHRlclN5bmNlZFdpdGhUaW1lbGluZSIsImlzTGF5ZXJBbmltYXRhYmxlIiwic3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIiLCJlbmFibGUiLCJnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyIsImxheWVyQW5pbWF0aW9uQ2hhbmdlVXBkYXRlciIsIl9jYWxjdWxhdGVMYXllckRhdGEiLCJzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSIsImxheWVyU2V0SXNWYWxpZFVwZGF0ZXIiLCJpc1ZhbGlkIiwibGF5ZXJUb1VwZGF0ZSIsIm5ld0RhdGEiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhMiIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsImRlZmF1bHRUZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJuZXdUZXh0TGFiZWwiLCJjdXJyZW50RmllbGRzIiwidGwiLCJmaWVsZCIsImFkZEZpZWxkcyIsImluY2x1ZGVzIiwiZGVsZXRlRmllbGRzIiwiZmQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJzcGxpY2UiLCJsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwyIiwiZ2V0RGVmYXVsdExheWVyQ29uZmlnIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJsb2FkZWRMYXllciIsImFsbG93RW1wdHlDb2x1bW4iLCJpc1ZhbGlkVG9TYXZlIiwidmFsaWRhdGVkIiwib2xkTGF5ZXJUeXBlIiwiaXNDb25maWdBY3RpdmUiLCJ1cGRhdGVMYXllckRvbWFpbiIsIl9jYWxjdWxhdGVMYXllckRhdGEzIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwibmV3VHlwZSIsIm9sZElkIiwiQ29uc29sZSIsImVycm9yIiwiYXNzaWduQ29uZmlnVG9MYXllciIsInZpc0NvbmZpZ1NldHRpbmdzIiwiaXNMYXllckhvdmVyZWQiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNCIsInNldHRpbmdzIiwiX3NldHRpbmdzJGxheWVycyIsIm9sZExheWVyTWFwIiwib3RoZXJMYXllcnMiLCJsYXllcklkIiwibmV3VmlzQ29uZmlnIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJ1cGRhdGVkU3RhdGUiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNSIsIl9jYWxjdWxhdGVMYXllckRhdGE2Iiwic2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsIl9yZWYyIiwicmVkdWNlIiwiYWNjdSIsInNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyIiwic2V0RmlsdGVyVXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIiLCJfcmVmMyIsImFuaW1hdGlvbldpbmRvdyIsIm5ld0ZpbHRlciIsInN3YXBfIiwibmV3U3luY1RpbWVsaW5lTW9kZSIsImdldFN5bmNBbmltYXRpb25Nb2RlIiwic2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIiLCJfYWN0aW9uJHZhbHVlSW5kZXgiLCJ2YWx1ZUluZGV4Iiwib2xkRmlsdGVyIiwidG9BcnJheSIsInZhbHVlcyIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIl9sb29wIiwicmVzIiwidiIsIl91cGRhdGVGaWx0ZXJQcm9wIiwiZW5sYXJnZWRGaWx0ZXIiLCJ2aWV3IiwiRklMVEVSX1ZJRVdfVFlQRVMiLCJlbmxhcmdlZCIsInNpZGUiLCJmaWx0ZXJlZERhdGFzZXRzIiwiYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyIsInVuaXEiLCJmaWx0ZXJXaXRoUExvdCIsInVwZGF0ZUZpbHRlclBsb3QiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJhZGp1c3RBbmltYXRpb25Db25maWdXaXRoRmlsdGVyIiwiX3VwZGF0ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleCIsIl9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgiLCJuZXh0VmFsdWUiLCJnZXREZWZhdWx0RmlsdGVyIiwicmVtb3ZlRmlsdGVyUGxvdCIsIl9pIiwiX2FyciIsIm5leHRWYWwiLCJkb21haW5TdGVwcyIsImZpbHRlckRhdGFJZCIsImZpbHRlclByb3BzIiwiZ2V0Q29sdW1uRmlsdGVyUHJvcHMiLCJtZXJnZUZpbHRlckRvbWFpblN0ZXAiLCJuZXh0RmlsdGVyIiwic3RlcCIsImFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4iLCJkYXRhc2V0SWRzIiwiRklMVEVSX1VQREFURVJfUFJPUFMiLCJvbGREYXRhSWQiLCJkYXRhc2V0SWQiLCJfYXBwbHlGaWx0ZXJGaWVsZE5hbWUiLCJhcHBseUZpbHRlckZpZWxkTmFtZSIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbCIsImxheWVySWREaWZmZXJlbmNlIiwieG9yIiwibGF5ZXJEYXRhSWRzIiwibGlkIiwibmV3RGF0YUlkcyIsInNldEZpbHRlclBsb3RVcGRhdGVyIiwiX3JlZjQiLCJuZXdQcm9wIiwiX3JlZjQkdmFsdWVJbmRleCIsInBpY2tfIiwibWVyZ2VfIiwicGxvdFR5cGUiLCJjaGFydFR5cGUiLCJ5QXhpcyIsIlBMT1RfVFlQRVMiLCJsaW5lQ2hhcnQiLCJoaXN0b2dyYW0iLCJhZGRGaWx0ZXJVcGRhdGVyIiwiY3JlYXRlT3JVcGRhdGVGaWx0ZXJVcGRhdGVyIiwib3JpZ2luYWxJbmRleCIsImluZGV4IiwibGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlciIsIl9yZWY1Iiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJ1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJ1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciIsIl9yZWY2Iiwic2V0RmlsdGVyVmlld1VwZGF0ZXIiLCJzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXciLCJ0b2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlciIsImZlYXR1cmVUb0ZpbHRlclZhbHVlIiwicmVtb3ZlRmlsdGVyVXBkYXRlciIsIl9zdGF0ZSRmaWx0ZXJzJGlkeCIsIm5ld0ZpbHRlcnMiLCJuZXdFZGl0b3IiLCJnZXRGaWx0ZXJJZEluRmVhdHVyZSIsImFkZExheWVyVXBkYXRlciIsIm5ld0xheWVyRGF0YSIsImNyZWF0ZUxheWVyRnJvbUNvbmZpZyIsIndhcm4iLCJfYWN0aW9uJGRhdGFzZXRJZCIsImRlZmF1bHREYXRhc2V0IiwiTGF5ZXIiLCJyZW1vdmVMYXllclVwZGF0ZXIiLCJfcmVmNyIsImlzRmluaXRlIiwibGF5ZXJUb1JlbW92ZSIsImZpbHRlck91dEJ5SWQiLCJyZW1vdmVFbGVtZW50QXRJbmRleCIsInJlb3JkZXJMYXllclVwZGF0ZXIiLCJfcmVmOCIsIm9yZGVyIiwiZHVwbGljYXRlTGF5ZXJVcGRhdGVyIiwiX3JlZjkiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTGF5ZXJPcmRlcklkeCIsIm5ld0xhYmVsIiwicG9zdGZpeCIsImdlbmVyYXRlSGFzaElkIiwiTEFZRVJfSURfTEVOR1RIIiwibmV3TGF5ZXJPcmRlciIsImFycmF5SW5zZXJ0IiwiYWRkRWZmZWN0VXBkYXRlciIsIl9hY3Rpb24kY29uZmlnIiwiTElHSFRfQU5EX1NIQURPV19FRkZFQ1QiLCJlZmZlY3QiLCJuZXdFZmZlY3QiLCJjcmVhdGVFZmZlY3QiLCJzZXRQcm9wcyIsImZpeEVmZmVjdE9yZGVyIiwicmVtb3ZlRWZmZWN0VXBkYXRlciIsIl9yZWYxMCIsImVmZmVjdFRvUmVtb3ZlIiwiZWZmZWN0SWQiLCJyZW9yZGVyRWZmZWN0VXBkYXRlciIsIl9yZWYxMSIsInVwZGF0ZUVmZmVjdFVwZGF0ZXIiLCJfcmVmMTIiLCJpZHgyIiwiZWZmZWN0T3JkZXJJZCIsIm5ld0VmZmVjdHMiLCJyZW1vdmVEYXRhc2V0VXBkYXRlciIsImRhdGFzZXRLZXkiLCJfc3RhdGUkZGF0YXNldHMiLCJuZXdEYXRhc2V0cyIsImxheWVyc1RvUmVtb3ZlIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImluZGV4T2YiLCJyZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnIiwiX3JlZjEzIiwiX2ludGVyYWN0aW9uQ29uZmlnIiwiX2NvbmZpZyRmaWVsZHNUb1Nob3ciLCJmaWVsZHMiLCJ1cGRhdGVMYXllckJsZW5kaW5nVXBkYXRlciIsInVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXIiLCJzaG93RGF0YXNldFRhYmxlVXBkYXRlciIsInVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyIiwidXBkYXRlRGF0YXNldFByb3BzVXBkYXRlciIsImNvbG9yIiwibmV3Q29sb3IiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIl9yZWYxNCIsIl9yZWYxNCRwYXlsb2FkIiwicGF5bG9hZCIsIl9yZWYxNCRwYXlsb2FkJGNvbmZpZyIsIl9yZWYxNCRwYXlsb2FkJG9wdGlvbiIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImtlZXBFeGlzdGluZ0NvbmZpZyIsIm1lcmdlZFN0YXRlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIm1lcmdlciIsImlzVmFsaWRNZXJnZXIiLCJoYXNQcm9wc1RvTWVyZ2UiLCJtZXJnZSIsImdldFByb3BWYWx1ZVRvTWVyZ2VyIiwidG9NZXJnZVByb3AiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJtYXBJbmRleCIsImludGVyYWN0aW9uQ29uZmlnQ2hhbmdlVXBkYXRlciIsImNvbnRyYWRpY3QiLCJrIiwibGF5ZXJDbGlja1VwZGF0ZXIiLCJwaW5uZWQiLCJjbG9uZURlZXAiLCJwaWNrZWQiLCJtYXBDbGlja1VwZGF0ZXIiLCJtb3VzZU1vdmVVcGRhdGVyIiwiX3JlZjE1IiwiZXZ0IiwicG9pbnQiLCJtb3VzZVBvc2l0aW9uIiwibG5nTGF0IiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiY29tcHV0ZVNwbGl0TWFwTGF5ZXJzIiwiZHVwbGljYXRlIiwiY2xvc2VTcGVjaWZpY01hcEF0SW5kZXgiLCJ0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIiLCJfcmVmMTYiLCJzbSIsInVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwicHJldmlvdXNTdGF0ZSIsImFsbENyZWF0ZURhdGFzZXRzVGFza3MiLCJfcmVmMTciLCJfcmVmMTckaW5mbyIsInJlc3QiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJ0YXNrcyIsIlRhc2siLCJhbGxTZXR0bGVkIiwicmVzdWx0cyIsImNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzIiwiYWRkVG9NYXBPcHRpb25zIiwid2l0aFRhc2siLCJjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXIiLCJfYWN0aW9uJHBheWxvYWQiLCJuZXdEYXRhRW50cmllcyIsInN0YXR1cyIsImNvbnNvbGUiLCJyZWFzb24iLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsImxheWVyTWVyZ2VycyIsIm0iLCJ3YWl0Rm9yTGF5ZXJEYXRhIiwiZGF0YXNldE1lcmdlcnMiLCJwb3N0TWVyZ2VyUGF5bG9hZCIsImFwcGx5TWVyZ2Vyc1VwZGF0ZXIiLCJtZXJnZVN0YXRlUmVzdWx0IiwibWVyZ2VTdGF0ZUZyb21NZXJnZXJzIiwiYWxsTWVyZ2VkIiwicG9zdE1lcmdlVXBkYXRlciIsImZEYXRhSWQiLCJkYXRhc2V0RmlsdGVyZWQiLCJkYXRhRW1wdHkiLCJuZXdMYXllcnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYWRkRGVmYXVsdExheWVycyIsInRvb2x0aXBGaWVsZHMiLCJhdXRvQ3JlYXRlVG9vbHRpcHMiLCJhZGREZWZhdWx0VG9vbHRpcHMiLCJ1cGRhdGVkRGF0YXNldHMiLCJjZW50ZXJNYXAiLCJib3VuZHMiLCJmaW5kTWFwQm91bmRzIiwiZml0Qm91bmRzVGFzayIsIkFDVElPTl9UQVNLIiwiZml0TWFwQm91bmRzIiwicmVuYW1lRGF0YXNldFVwZGF0ZXIiLCJBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTIiwidmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMiLCJ2YWxpZGF0ZWRQcm9wcyIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsIl9lbnRyeSIsIl9zbGljZWRUb0FycmF5MiIsImlzUmdiQ29sb3IiLCJpc1BsYWluT2JqZWN0IiwiZGVlcG1lcmdlIiwiZXhpc3RpbmciLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJfc3RhdGUkc3BsaXRNYXBzJGluZGUiLCJpbmRleFRvUmV0cmlldmUiLCJtYXBMYXllcnMiLCJsb2FkRmlsZXNVcGRhdGVyIiwiZmlsZXMiLCJfYWN0aW9uJG9uRmluaXNoIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJmaWxlQ2FjaGUiLCJmaWxlc1RvTG9hZCIsImxvYWROZXh0RmlsZVVwZGF0ZXIiLCJsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlciIsImZpbGVOYW1lIiwiX3N0YXRlJGZpbGVMb2FkaW5nIiwic3RhdGVXaXRoUHJvZ3Jlc3MiLCJ1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlciIsInByb2dyZXNzIiwicGVyY2VudCIsIm1lc3NhZ2UiLCJzdGF0ZVdpdGhDYWNoZSIsIkRFTEFZX1RBU0siLCJsb2FkTmV4dEZpbGUiLCJfZmlsZXNUb0xvYWQiLCJfdG9BcnJheTIiLCJmaWxlIiwicmVtYWluaW5nRmlsZXNUb0xvYWQiLCJtYWtlTG9hZEZpbGVUYXNrIiwiTE9BRF9GSUxFX1RBU0siLCJiaW1hcCIsImdlbiIsIm5leHRGaWxlQmF0Y2giLCJwcm9jZXNzRmlsZUNvbnRlbnQiLCJjb250ZW50IiwibG9hZEZpbGVzRXJyIiwicHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlciIsIl9hY3Rpb24kcGF5bG9hZDIiLCJQUk9DRVNTX0ZJTEVfREFUQSIsImxvYWRGaWxlU3RlcFN1Y2Nlc3MiLCJwYXJzZVByb2dyZXNzIiwicHJldlByb2dyZXNzIiwibmV4dEZpbGVCYXRjaFVwZGF0ZXIiLCJfcmVmMTgiLCJfYWNjdW11bGF0ZWQkZGF0YSIsIl9yZWYxOCRwYXlsb2FkIiwiYWNjdW11bGF0ZWQiLCJlbmRzV2l0aCIsImRhdGEiLCJVTldSQVBfVEFTSyIsIl9yZWYxOSIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjAiLCJfc3RhdGUkZmlsZUxvYWRpbmcyIiwiYXBwbHlDUFVGaWx0ZXJVcGRhdGVyIiwiX3JlZjIxIiwiZGF0YUlkcyIsImZpbHRlckRhdGFzZXRDUFUiLCJzZXRNYXBJbmZvVXBkYXRlciIsImVtcHR5IiwiZGVmYXVsdExheWVycyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRMYXllciIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwiZmluZEZpZWxkc1RvU2hvdyIsIm1lcmdlZCIsIl9yZWYyMyIsImZpeGVkRG9tYWluIiwiX2NhbGN1bGF0ZUxheWVyRGF0YTciLCJfc3RhdGUkZmlsdGVycyIsImFuaW1hdGFibGVMYXllcnMiLCJsYXllckRvbWFpbnMiLCJtZXJnZWREb21haW4iLCJtZXJnZVRpbWVEb21haW5zIiwiZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyIiwibWVyZ2VkVGltZVN0ZXBzIiwic29ydCIsIkJBU0VfU1BFRUQiLCJGUFMiLCJzeW5jZWRGaWx0ZXIiLCJuZXdBbmltYXRpb25Eb21haW4iLCJpc0luUmFuZ2UiLCJzZXRFZGl0b3JNb2RlVXBkYXRlciIsIl9yZWYyNCIsInNldEZlYXR1cmVzVXBkYXRlciIsIl9yZWYyNSIsIl9yZWYyNSRmZWF0dXJlcyIsImxhc3RGZWF0dXJlIiwicHJvcGVydGllcyIsImlzQ2xvc2VkIiwiRURJVCIsImZlYXR1cmUiLCJmaWx0ZXJJZCIsImJib3giLCJmZWF0dXJlVmFsdWUiLCJmaWx0ZXJJZHgiLCJmaWwiLCJzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyIiwiX3JlZjI2Iiwic2VsZWN0aW9uQ29udGV4dCIsImRlbGV0ZUZlYXR1cmVVcGRhdGVyIiwiX3JlZjI3Iiwic2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlciIsIm5vbmVGaWx0ZXJGZWF0dXJlIiwiX2ZpbHRlciRsYXllcklkIiwiaXNMYXllckluY2x1ZGVkIiwiZ2VuZXJhdGVQb2x5Z29uRmlsdGVyIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYyOCIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwic29ydGVkIiwic29ydERhdGFzZXRCeUNvbHVtbiIsInBpblRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYyOSIsInBpblRhYmxlQ29sdW1ucyIsImNvcHlUYWJsZUNvbHVtblVwZGF0ZXIiLCJfcmVmMzAiLCJmaWVsZElkeCIsInRleHQiLCJkYXRhQ29udGFpbmVyIiwicm93IiwicGFyc2VGaWVsZFZhbHVlIiwidmFsdWVBdCIsImpvaW4iLCJjb3B5Iiwic2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIiLCJfcmVmMzEiLCJmb3JtYXRzIiwiZGlzcGxheUZvcm1hdCIsInRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyIiwic2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ1VwZGF0ZXIiLCJfcmVmMzIiLCJ1cGRhdGVzIiwiY2hlY2tUaW1lQ29uZmlnQXJncyIsImFsbG93ZWQiLCJzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiX3JlZjMzIiwibGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlVXBkYXRlciIsIl9sYXllciRmaWx0ZXJlZEl0ZW1DbyIsImV2ZW50IiwiZGVja2dsTGF5ZXJJZCIsImNvdW50IiwiZmlsdGVyZWRJdGVtQ291bnQiLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28yIiwiX2FjdGlvbiRlbmFibGUiLCJpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzIiwiZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyIsImhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllciIsIkJvb2xlYW4iLCJuZXdGaWx0ZXJEb21haW4iLCJBTklNQVRJT05fV0lORE9XIiwiaW50ZXJ2YWwiLCJhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwiLCJuZXdGaWx0ZXJWYWx1ZSIsInN5bmNUaW1lbGluZU1vZGUiLCJTWU5DX1RJTUVMSU5FX01PREVTIiwiZW5kIiwidmFsaWRhdGVTeW5jQW5pbWF0aW9uTW9kZSIsInRpbWVsaW5lVmFsdWUiLCJnZXRUaW1lbGluZVZhbHVlRnJvbUZpbHRlciIsInNuYXBUb01hcmtzIiwiZnJlZSIsIl9maWx0ZXIkc3luY1RpbWVsaW5lTSIsIm5ld01vZGUiLCJzdGFydCIsImludGVydmFsSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJtZXRhIiwidGFyZ2V0VGltZUludGVydmFsIiwibmV3SW5kZXgiLCJUSU1FX0lOVEVSVkFMU19PUkRFUkVEIiwiaGV4VGlsZUludGVydmFsIiwiTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbCIsImdldERlZmF1bHRUaW1lRm9ybWF0IiwidXBkYXRlZFBsb3RUeXBlIiwidXBkYXRlVGltZUZpbHRlclBsb3RUeXBlIiwiYWRqdXN0VmFsdWVUb0FuaW1hdGlvbldpbmRvdyIsImRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImRhdGFJZFRvUmVwbGFjZSIsIl92YWx1ZSRjb25maWciLCJfdmFsdWUkY29uZmlnMiIsInJlcGxhY2VkIiwiaXNPYmplY3QiLCJmaW5kQ2hpbGREYXRhc2V0SWRzIiwiX3ZhbHVlJG5ld0RhdGFzZXQiLCJjaGlsZERhdGFJZHMiLCJtb3ZlVmFsdWVUb0JlTWVyZ2VkIiwicHJvcFZhbHVlcyIsIl9yZWYzNSIsInNhdmVVbm1lcmdlZCIsInN0YXRlUmVtb3ZlZCIsInByb3BWYWx1ZSIsInAiLCJ0b0JlTWVyZ2VkIiwicmVwbGFjZURhdGFzZXRBbmREZXBzIiwiZGF0YUlkVG9Vc2UiLCJjb21wb3NlXyIsImFwcGx5XyIsInJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSIsIl9uZXh0U3RhdGUkbGF5ZXJUb0JlTSIsInNlcmlhbGl6ZWRTdGF0ZSIsInNlcmlhbGl6ZVZpc1N0YXRlIiwicHJlc2VydmVMYXllck9yZGVyIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJfc2VyaWFsaXplZFN0YXRlJHNwbGkiLCJfcmVmMzYiLCJhY2N1U3RhdGUiLCJfcmVmMzciLCJyZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImdldENoaWxkRGF0YXNldElkcyIsInByZXNlcnZlT3JkZXIiLCJ0b01lcmdlUHJvcHMiLCJzYXZlZFByb3BzIiwicmVwbGFjZWRTdGF0ZSIsIl9yZXBsYWNlZFN0YXRlJG1lcmdlciIsIm1lcmdlck9wdGlvbnMiLCJyZXBsYWNlZEl0ZW0iLCJyZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZSIsIml0ZW0iLCJfcmVmMzgiLCJjaGlsZERhdGFJZCJdLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IGJib3ggZnJvbSAnQHR1cmYvYmJveCc7XG5pbXBvcnQgY29weSBmcm9tICdjb3B5LXRvLWNsaXBib2FyZCc7XG5pbXBvcnQgZGVlcG1lcmdlIGZyb20gJ2RlZXBtZXJnZSc7XG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCB4b3IgZnJvbSAnbG9kYXNoLnhvcic7XG5pbXBvcnQgVGFzaywge2Rpc2FibGVTdGFja0NhcHR1cmluZywgd2l0aFRhc2t9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuLy8gVGFza3NcbmltcG9ydCB7XG4gIERFTEFZX1RBU0ssXG4gIEFDVElPTl9UQVNLLFxuICBMT0FEX0ZJTEVfVEFTSyxcbiAgUFJPQ0VTU19GSUxFX0RBVEEsXG4gIFVOV1JBUF9UQVNLXG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuLy8gQWN0aW9uc1xuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIENyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzUGF5bG9hZCxcbiAgTWFwU3RhdGVBY3Rpb25zLFxuICBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCxcbiAgVmlzU3RhdGVBY3Rpb25zLFxuICBhcHBseUxheWVyQ29uZmlnLFxuICBjcmVhdGVOZXdEYXRhc2V0U3VjY2VzcyxcbiAgbGF5ZXJDb25maWdDaGFuZ2UsXG4gIGxheWVyVHlwZUNoYW5nZSxcbiAgbGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgbG9hZEZpbGVTdGVwU3VjY2VzcyxcbiAgbG9hZEZpbGVzRXJyLFxuICBsb2FkRmlsZXNTdWNjZXNzLFxuICBsb2FkTmV4dEZpbGUsXG4gIG5leHRGaWxlQmF0Y2gsXG4gIHByb2Nlc3NGaWxlQ29udGVudCxcbiAgZml0Qm91bmRzIGFzIGZpdE1hcEJvdW5kc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgRklMVEVSX1VQREFURVJfUFJPUFMsXG4gIGFkZE5ld0xheWVyc1RvU3BsaXRNYXAsXG4gIHNuYXBUb01hcmtzLFxuICBhcHBseUZpbHRlckZpZWxkTmFtZSxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgYXJyYXlJbnNlcnQsXG4gIGNvbXB1dGVTcGxpdE1hcExheWVycyxcbiAgYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbixcbiAgZmVhdHVyZVRvRmlsdGVyVmFsdWUsXG4gIGZpbHRlckRhdGFzZXRDUFUsXG4gIGdlbmVyYXRlUG9seWdvbkZpbHRlcixcbiAgZ2V0RGVmYXVsdEZpbHRlcixcbiAgZ2V0RmlsdGVySWRJbkZlYXR1cmUsXG4gIGdldFRpbWVXaWRnZXRUaXRsZUZvcm1hdHRlcixcbiAgaXNJblJhbmdlLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZ2JDb2xvcixcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICByZW1vdmVMYXllckZyb21TcGxpdE1hcHMsXG4gIHNldCxcbiAgbWVyZ2VGaWx0ZXJEb21haW5TdGVwLFxuICB1cGRhdGVGaWx0ZXJQbG90LFxuICByZW1vdmVGaWx0ZXJQbG90LFxuICBpc0xheWVyQW5pbWF0YWJsZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Z2VuZXJhdGVIYXNoSWQsIHRvQXJyYXl9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbi8vIE1lcmdlcnNcbmltcG9ydCB7XG4gIEFOSU1BVElPTl9XSU5ET1csXG4gIEJBU0VfU1BFRUQsXG4gIENPTVBBUkVfVFlQRVMsXG4gIERFRkFVTFRfVEVYVF9MQUJFTCxcbiAgRURJVE9SX01PREVTLFxuICBGSUxURVJfVFlQRVMsXG4gIEZJTFRFUl9WSUVXX1RZUEVTLFxuICBGUFMsXG4gIExJR0hUX0FORF9TSEFET1dfRUZGRUNULFxuICBNQVhfREVGQVVMVF9UT09MVElQUyxcbiAgUExPVF9UWVBFUyxcbiAgU09SVF9PUkRFUixcbiAgU1lOQ19USU1FTElORV9NT0RFU1xufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0xBWUVSX0lEX0xFTkdUSCwgTGF5ZXIsIExheWVyQ2xhc3Nlc30gZnJvbSAnQGtlcGxlci5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgYXBwbHlfLFxuICBjb21wb3NlXyxcbiAgZmlsdGVyT3V0QnlJZCxcbiAgbWVyZ2VfLFxuICBwaWNrXyxcbiAgcmVtb3ZlRWxlbWVudEF0SW5kZXgsXG4gIHN3YXBfXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge2lzVmFsaWRNZXJnZXIsIG1lcmdlU3RhdGVGcm9tTWVyZ2Vyc30gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge1xuICBWSVNfU1RBVEVfTUVSR0VSUyxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBwYXJzZUxheWVyQ29uZmlnLFxuICBzZXJpYWxpemVMYXllcixcbiAgc2VyaWFsaXplVmlzU3RhdGUsXG4gIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YVxufSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuXG5pbXBvcnQgS2VwbGVyR0xTY2hlbWEsIHtNZXJnZXIsIFBvc3RNZXJnZXJQYXlsb2FkLCBWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcblxuaW1wb3J0IHtcbiAgRmlsdGVyLFxuICBJbnRlcmFjdGlvbkNvbmZpZyxcbiAgQW5pbWF0aW9uQ29uZmlnLFxuICBFZGl0b3IsXG4gIEZpZWxkLFxuICBUaW1lUmFuZ2VGaWx0ZXJcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0xvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcblxuaW1wb3J0IHtcbiAgRGF0YXNldHMsXG4gIGFzc2lnbkdwdUNoYW5uZWwsXG4gIGNvcHlUYWJsZUFuZFVwZGF0ZSxcbiAgY3JlYXRlTmV3RGF0YUVudHJ5LFxuICBwaW5UYWJsZUNvbHVtbnMsXG4gIHNldEZpbHRlckdwdU1vZGUsXG4gIHNvcnREYXRhc2V0QnlDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQge2ZpbmRGaWVsZHNUb1Nob3d9IGZyb20gJy4vaW50ZXJhY3Rpb24tdXRpbHMnO1xuaW1wb3J0IHtjYWxjdWxhdGVMYXllckRhdGEsIGZpbmREZWZhdWx0TGF5ZXIsIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICcuL2xheWVyLXV0aWxzJztcbmltcG9ydCB7Z2V0UHJvcFZhbHVlVG9NZXJnZXIsIGhhc1Byb3BzVG9NZXJnZX0gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge21lcmdlRGF0YXNldHNCeU9yZGVyfSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuaW1wb3J0IHtcbiAgZml4RWZmZWN0T3JkZXIsXG4gIGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzLFxuICBnZXRJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLFxuICBtZXJnZVRpbWVEb21haW5zLFxuICBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93LFxuICB1cGRhdGVUaW1lRmlsdGVyUGxvdFR5cGUsXG4gIGdldERlZmF1bHRUaW1lRm9ybWF0LFxuICBMYXllclRvRmlsdGVyVGltZUludGVydmFsLFxuICBUSU1FX0lOVEVSVkFMU19PUkRFUkVEXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge1BheWxvYWRBY3Rpb259IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuXG5pbXBvcnQge2ZpbmRNYXBCb3VuZHN9IGZyb20gJy4vZGF0YS11dGlscyc7XG5cbi8vIHJlYWN0LXBhbG1cbi8vIGRpc2FibGUgY2FwdHVyZSBleGNlcHRpb24gZm9yIHJlYWN0LXBhbG0gY2FsbCB0byB3aXRoVGFza1xuZGlzYWJsZVN0YWNrQ2FwdHVyaW5nKCk7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB2aXNTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dmlzU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB2aXNTdGF0ZTogdmlzU3RhdGVVcGRhdGVycy5lbmxhcmdlRmlsdGVyVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgc3RhdGUua2VwbGVyR2wuZm9vLnZpc1N0YXRlLFxuICogICAgICAgICAgICAgICB7aWR4OiAwfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdmlzU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnOiBJbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgdG9vbHRpcDoge1xuICAgIGlkOiAndG9vbHRpcCcsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMudG9vbHRpcCcsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBjb25maWc6IHtcbiAgICAgIGZpZWxkc1RvU2hvdzoge30sXG4gICAgICBjb21wYXJlTW9kZTogZmFsc2UsXG4gICAgICBjb21wYXJlVHlwZTogQ09NUEFSRV9UWVBFUy5BQlNPTFVURVxuICAgIH1cbiAgfSxcbiAgZ2VvY29kZXI6IHtcbiAgICBpZDogJ2dlb2NvZGVyJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5nZW9jb2RlcicsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcG9zaXRpb246IG51bGxcbiAgfSxcbiAgYnJ1c2g6IHtcbiAgICBpZDogJ2JydXNoJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5icnVzaCcsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgY29uZmlnOiB7XG4gICAgICAvLyBzaXplIGlzIGluIGttXG4gICAgICBzaXplOiAwLjVcbiAgICB9XG4gIH0sXG4gIGNvb3JkaW5hdGU6IHtcbiAgICBpZDogJ2Nvb3JkaW5hdGUnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmNvb3JkaW5hdGUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOSU1BVElPTl9DT05GSUc6IEFuaW1hdGlvbkNvbmZpZyA9IHtcbiAgZG9tYWluOiBudWxsLFxuICBjdXJyZW50VGltZTogbnVsbCxcbiAgc3BlZWQ6IDEsXG4gIGlzQW5pbWF0aW5nOiBmYWxzZSxcbiAgdGltZVN0ZXBzOiBudWxsLFxuICB0aW1lRm9ybWF0OiBudWxsLFxuICB0aW1lem9uZTogbnVsbCxcbiAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGwsXG4gIGhpZGVDb250cm9sOiBmYWxzZSxcbiAgZHVyYXRpb246IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VESVRPUjogRWRpdG9yID0ge1xuICBtb2RlOiBFRElUT1JfTU9ERVMuRFJBV19QT0xZR09OLFxuICBmZWF0dXJlczogW10sXG4gIHNlbGVjdGVkRmVhdHVyZTogbnVsbCxcbiAgdmlzaWJsZTogdHJ1ZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9WSVNfU1RBVEU6IFZpc1N0YXRlID0ge1xuICAvLyBtYXAgaW5mb1xuICBtYXBJbmZvOiB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJ1xuICB9LFxuICAvLyBsYXllcnNcbiAgbGF5ZXJzOiBbXSxcbiAgbGF5ZXJEYXRhOiBbXSxcbiAgbGF5ZXJUb0JlTWVyZ2VkOiBbXSxcbiAgbGF5ZXJPcmRlcjogW10sXG5cbiAgLy8gZmlsdGVyc1xuICBmaWx0ZXJzOiBbXSxcbiAgZmlsdGVyVG9CZU1lcmdlZDogW10sXG5cbiAgLy8gYSBjb2xsZWN0aW9uIG9mIG11bHRpcGxlIGRhdGFzZXRcbiAgZGF0YXNldHM6IHt9LFxuICBlZGl0aW5nRGF0YXNldDogdW5kZWZpbmVkLFxuXG4gIC8vIGVmZmVjdHNcbiAgZWZmZWN0czogW10sXG4gIGVmZmVjdE9yZGVyOiBbXSxcblxuICBpbnRlcmFjdGlvbkNvbmZpZzogZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IHt9LFxuXG4gIGxheWVyQmxlbmRpbmc6ICdub3JtYWwnLFxuICBvdmVybGF5QmxlbmRpbmc6ICdub3JtYWwnLFxuICBob3ZlckluZm86IHVuZGVmaW5lZCxcbiAgY2xpY2tlZDogdW5kZWZpbmVkLFxuICBtb3VzZVBvczoge30sXG4gIG1heERlZmF1bHRUb29sdGlwczogTUFYX0RFRkFVTFRfVE9PTFRJUFMsXG5cbiAgLy8gdGhpcyBpcyB1c2VkIHdoZW4gdXNlciBzcGxpdCBtYXBzXG4gIHNwbGl0TWFwczogW1xuICAgIC8vIHRoaXMgd2lsbCBjb250YWluIGEgbGlzdCBvZiBvYmplY3RzIHRvXG4gICAgLy8gZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGxheWVyIGF2YWlsYWJpbGl0eSBhbmQgdmlzaWJpbGl0eSBmb3IgZWFjaCBtYXBcbiAgICAvLyBbXG4gICAgLy8gICB7XG4gICAgLy8gICAgICBsYXllcnM6IHtsYXllcl9pZDogdHJ1ZSB8IGZhbHNlfVxuICAgIC8vICAgfVxuICAgIC8vIF1cbiAgXSxcbiAgc3BsaXRNYXBzVG9CZU1lcmdlZDogW10sXG4gIGlzTWVyZ2luZ0RhdGFzZXRzOiB7fSxcbiAgLy8gZGVmYXVsdHMgbGF5ZXIgY2xhc3Nlc1xuICBsYXllckNsYXNzZXM6IExheWVyQ2xhc3NlcyxcblxuICAvLyBkZWZhdWx0IGFuaW1hdGlvblxuICAvLyB0aW1lIGluIHVuaXggdGltZXN0YW1wIChtaWxsaXNlY29uZHMpICh0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggRXBvY2gpXG4gIGFuaW1hdGlvbkNvbmZpZzogREVGQVVMVF9BTklNQVRJT05fQ09ORklHLFxuXG4gIGVkaXRvcjogREVGQVVMVF9FRElUT1IsXG5cbiAgZmlsZUxvYWRpbmc6IGZhbHNlLFxuICBmaWxlTG9hZGluZ1Byb2dyZXNzOiB7fSxcblxuICBsb2FkZXJzOiBbXSxcbiAgbG9hZE9wdGlvbnM6IHt9LFxuXG4gIC8vIHZpc1N0YXRlTWVyZ2Vyc1xuICBtZXJnZXJzOiBWSVNfU1RBVEVfTUVSR0VSUyxcblxuICAvLyBrZXBsZXIgc2NoZW1hc1xuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hXG59O1xuXG50eXBlIFVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YVR5cGUgPSB7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJEYXRhOiBhbnlbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhPFMgZXh0ZW5kcyBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlPihcbiAgc3RhdGU6IFMsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogUyB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKChseXIsIGkpID0+IChpID09PSBpZHggPyBsYXllciA6IGx5cikpLFxuICAgIGxheWVyRGF0YTogbGF5ZXJEYXRhXG4gICAgICA/IHN0YXRlLmxheWVyRGF0YS5tYXAoKGQsIGkpID0+IChpID09PSBpZHggPyBsYXllckRhdGEgOiBkKSlcbiAgICAgIDogc3RhdGUubGF5ZXJEYXRhXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGxheWVyOiBMYXllcik6IFMge1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICAgID8gYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgICAgICA6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgIH07XG4gIH1cblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIChvciBhcnJheXMpIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlXG4gKiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBwaWNrQ2hhbmdlZFByb3BzPFQ+KHByZXY6IFQsIG5leHQ6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlZFByb3BzOiBQYXJ0aWFsPFQ+ID0ge307XG4gIGNvbnN0IHBpY2tQcm9wc09mID0gb2JqID0+IHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjaGFuZ2VkUHJvcHMsIGtleSkgJiZcbiAgICAgICAgIWlzRXF1YWwocHJldltrZXldLCBuZXh0W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY2hhbmdlZFByb3BzW2tleV0gPSBuZXh0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHBpY2tQcm9wc09mKHByZXYpO1xuICBwaWNrUHJvcHNPZihuZXh0KTtcbiAgcmV0dXJuIGNoYW5nZWRQcm9wcztcbn1cblxuY29uc3QgVklTVUFMX0NIQU5ORUxfUFJPUF9UWVBFUyA9IFsnZmllbGQnLCAnc2NhbGUnLCAnZG9tYWluJywgJ2FnZ3JlZ2F0aW9uJ107XG5cbi8qKlxuICogQXBwbHkgbGF5ZXIgY29uZmlnXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGF5ZXJDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFwcGx5TGF5ZXJDb25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcklkLCBuZXdMYXllckNvbmZpZywgbGF5ZXJJbmRleH0gPSBhY3Rpb247XG4gIGNvbnN0IG5ld1BhcnNlZExheWVyID1cbiAgICAvLyB3aWxsIG1vdmUgdmlzdWFsQ2hhbm5lbHMgdG8gdGhlIGNvbmZpZyBwcm9wXG4gICAgcGFyc2VMYXllckNvbmZpZyhzdGF0ZS5zY2hlbWEsIG5ld0xheWVyQ29uZmlnKTtcbiAgY29uc3Qgb2xkTGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICBpZiAoIW9sZExheWVyIHx8ICFuZXdQYXJzZWRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAobGF5ZXJJbmRleCAhPT0gbnVsbCAmJiBsYXllckluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3RhdGUubGF5ZXJzW2xheWVySW5kZXhdICE9PSBvbGRMYXllcikge1xuICAgIC8vIGxheWVySW5kZXggaXMgcHJvdmlkZWQsIGJ1dCBpdCBkb2Vzbid0IG1hdGNoIHRoZSBvbGRMYXllclxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbbmV3UGFyc2VkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIGlzIHZhbGlkIGFuZCBjb252ZXJ0IGl0IHRvIExheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIG5ld1BhcnNlZExheWVyLCBzdGF0ZS5sYXllckNsYXNzZXMpO1xuICBpZiAoIW5ld0xheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuXG4gIGlmIChuZXdMYXllci50eXBlICYmIG5ld0xheWVyLnR5cGUgIT09IG9sZExheWVyLnR5cGUpIHtcbiAgICBjb25zdCBvbGRMYXllckluZGV4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICAgIGlmIChvbGRMYXllckluZGV4ID49IDApIHtcbiAgICAgIG5leHRTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIobmV4dFN0YXRlLCBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld0xheWVyLnR5cGUpKTtcbiAgICAgIC8vIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIGxheWVyLCBzbyB3ZSBuZWVkIHRvIG9idGFpbiB0aGUgbmV3IGlkXG4gICAgICAvLyBidXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGxheWVyIHdhcyBub3QgcmVtb3ZlZFxuICAgICAgaWYgKG5leHRTdGF0ZS5sYXllcnMubGVuZ3RoID09PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0xheWVySWQgPSBuZXh0U3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdLmlkO1xuICAgICAgICBuZXh0U3RhdGUgPSBhcHBseUxheWVyQ29uZmlnVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgYXBwbHlMYXllckNvbmZpZyhuZXdMYXllcklkLCB7Li4ubmV3TGF5ZXJDb25maWcsIGlkOiBuZXdMYXllcklkfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIC8vIHNlcmlhbGl6ZUxheWVyKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgdGhlIG9sZCBsYXllciBpcyBub3QgdmFsaWQsXG4gIC8vIHdlIHNob3VsZCBzdGlsbCBhcHBseSB0aGUgY2hhbmdlcyBpbiB0aGF0IGNhc2VcbiAgY29uc3Qgc2VyaWFsaXplZE9sZExheWVyID0gc2VyaWFsaXplTGF5ZXIob2xkTGF5ZXIsIHN0YXRlLnNjaGVtYSkgPz8ge2NvbmZpZzoge319O1xuICBjb25zdCBzZXJpYWxpemVkTmV3TGF5ZXIgPSBzZXJpYWxpemVMYXllcihuZXdMYXllciwgc3RhdGUuc2NoZW1hKTtcbiAgaWYgKCFzZXJpYWxpemVkTmV3TGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHNlcmlhbGl6ZWRPbGRMYXllciwgc2VyaWFsaXplZE5ld0xheWVyKSkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSBwaWNrQ2hhbmdlZFByb3BzKHNlcmlhbGl6ZWRPbGRMYXllci5jb25maWcsIHNlcmlhbGl6ZWROZXdMYXllci5jb25maWcpO1xuXG4gICAgaWYgKCd2aXNDb25maWcnIGluIGNoYW5nZWQpIHtcbiAgICAgIGlmIChjaGFuZ2VkLnZpc0NvbmZpZykge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBjaGFuZ2VkLnZpc0NvbmZpZylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjaGFuZ2VkLnZpc0NvbmZpZztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvbGRMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsTmFtZSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gb2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbE5hbWVdO1xuICAgICAgY29uc3QgY2hhbm5lbFByb3BOYW1lcyA9IFZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMubWFwKHByb3AgPT4gY2hhbm5lbFtwcm9wXSk7XG4gICAgICBpZiAoY2hhbm5lbFByb3BOYW1lcy5zb21lKHByb3AgPT4gcHJvcCBpbiBjaGFuZ2VkKSkge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UoXG4gICAgICAgICAgICBvbGRMYXllcixcbiAgICAgICAgICAgIHBpY2sobmV3TGF5ZXIuY29uZmlnLCBjaGFubmVsUHJvcE5hbWVzKSxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY2hhbm5lbFByb3BOYW1lcykge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZCkubGVuZ3RoID4gMCkge1xuICAgICAgbmV4dFN0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBwaWNrKG5ld0xheWVyLmNvbmZpZywgT2JqZWN0LmtleXMoY2hhbmdlZCkpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBiYXNlIGNvbmZpZzogZGF0YUlkLCBsYWJlbCwgY29sdW1uLCBpc1Zpc2libGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld0NvbmZpZyk7XG4gIGlmIChcbiAgICB0eXBlb2YgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgPT09ICdzdHJpbmcnICYmXG4gICAgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgIT09IG9sZExheWVyLmNvbmZpZy5kYXRhSWRcbiAgKSB7XG4gICAgY29uc3Qge2RhdGFJZCwgLi4ucmVzdENvbmZpZ30gPSBhY3Rpb24ubmV3Q29uZmlnO1xuICAgIGNvbnN0IHN0YXRlV2l0aERhdGFJZCA9IGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdDb25maWc6IHtkYXRhSWR9XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dExheWVyID0gc3RhdGVXaXRoRGF0YUlkLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICAgIHJldHVybiBuZXh0TGF5ZXIgJiYgT2JqZWN0LmtleXMocmVzdENvbmZpZykubGVuZ3RoXG4gICAgICA/IGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZVdpdGhEYXRhSWQsIHtvbGRMYXllcjogbmV4dExheWVyLCBuZXdDb25maWc6IHJlc3RDb25maWd9KVxuICAgICAgOiBzdGF0ZVdpdGhEYXRhSWQ7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhhY3Rpb24ubmV3Q29uZmlnKTtcblxuICBsZXQgbGF5ZXJEYXRhO1xuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gc3RhdGUubGF5ZXJEYXRhW2lkeF07XG5cbiAgICBjb25zdCB1cGRhdGVMYXllckRhdGFSZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuICAgIG5ld0xheWVyID0gdXBkYXRlTGF5ZXJEYXRhUmVzdWx0LmxheWVyO1xuICAgIGxheWVyRGF0YSA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllckRhdGE7XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKCdpc1Zpc2libGUnIGluIGFjdGlvbi5uZXdDb25maWcpIHtcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2Uoc3RhdGUsIG5ld0xheWVyKTtcbiAgICBjb25zdCBmaWx0ZXJJbmRleCA9IGZpbHRlclN5bmNlZFdpdGhUaW1lbGluZShzdGF0ZSk7XG4gICAgaWYgKGlzTGF5ZXJBbmltYXRhYmxlKG5ld0xheWVyKSAmJiBmaWx0ZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIGlmIGxheWVyIGlzIGdvaW5nIHRvIGJlIHZpc2libGUgd2Ugc3luYyB3aXRoIGZpbHRlciBvdGhlcndpc2Ugd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIG90aGVyIGFuaW1hdGFibGUgbGF5ZXJzIGV4aXN0cyBhbmQgYXJlIHZpc2libGVcbiAgICAgIG5ld1N0YXRlID0gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgICAgaWR4OiBmaWx0ZXJJbmRleCxcbiAgICAgICAgZW5hYmxlOiBhY3Rpb24ubmV3Q29uZmlnLmlzVmlzaWJsZVxuICAgICAgICAgID8gYWN0aW9uLm5ld0NvbmZpZy5pc1Zpc2libGVcbiAgICAgICAgICA6IGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzKHN0YXRlLmxheWVycykubGVuZ3RoID4gMFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCdjb2x1bW5zJyBpbiBhY3Rpb24ubmV3Q29uZmlnICYmIG5ld0xheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIC8vIFRPRE86IFNoYW4sIG1ha2UgdGhlIGFuaW1hdGlvbiBjb25maWcgZnVuY3Rpb24gbW9yZSByb2J1c3RcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7XG4gICAgbGF5ZXI6IG5ld0xheWVyLFxuICAgIGxheWVyRGF0YSxcbiAgICBpZHhcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXllckFuaW1hdGlvbkNoYW5nZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihzdGF0ZTogUywgYWN0aW9uKTogUyB7XG4gIGNvbnN0IHtvbGRMYXllciwgcHJvcCwgdmFsdWV9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGNvbnN0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIGFuaW1hdGlvbjoge1xuICAgICAgLi4ub2xkTGF5ZXIuY29uZmlnLmFuaW1hdGlvbixcbiAgICAgIFtwcm9wXTogdmFsdWVcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHN0YXRlLmxheWVyRGF0YVtpZHhdKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgaW5kZXggb2YgdGhlIGZpbHRlciBzeW5jZWQgdG8gdGltZWxpbmUgb3IgLTFcbiAqL1xuZnVuY3Rpb24gZmlsdGVyU3luY2VkV2l0aFRpbWVsaW5lKHN0YXRlOiBWaXNTdGF0ZSk6IG51bWJlciB7XG4gIHJldHVybiBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgaXNWYWxpZCBmbGFnIG9mIGEgbGF5ZXIuXG4gKiBVcGRhdGVzIGlzVmlzaWJsZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgaXNWYWxpZC5cbiAqIFRyaWdnZXJzIHVwZGF0ZSBvZiBkYXRhIGZvciB0aGUgbGF5ZXIgaW4gb3JkZXIgdG8gZ2V0IGVycm9ycyBhZ2FpbiBkdXJpbmcgbmV4dCB1cGRhdGUgaXRlcmF0aW9uLlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJTZXRJc1ZhbGlkVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclNldElzVmFsaWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaXNWYWxpZH0gPSBhY3Rpb247XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgbGF5ZXJUb1VwZGF0ZSA9IHN0YXRlLmxheWVyc1tpZHhdO1xuICBpZiAobGF5ZXJUb1VwZGF0ZSkge1xuICAgIGxldCBuZXdMYXllcjtcbiAgICBsZXQgbmV3RGF0YSA9IG51bGw7XG5cbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gVHJpZ2dlciBkYXRhIHVwZGF0ZSBpbiBvcmRlciB0byBzaG93IGVycm9ycyBhZ2FpbiBpZiBwcmVzZW50LlxuICAgICAgY29uc3Qge2xheWVyLCBsYXllckRhdGF9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKGxheWVyVG9VcGRhdGUsIHN0YXRlLCB1bmRlZmluZWQpO1xuICAgICAgbmV3TGF5ZXIgPSBsYXllcjtcbiAgICAgIG5ld0RhdGEgPSBsYXllckRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gbGF5ZXJUb1VwZGF0ZS51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgbmV3TGF5ZXIuaXNWYWxpZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtpZHgsIGxheWVyOiBuZXdMYXllciwgbGF5ZXJEYXRhOiBuZXdEYXRhfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIGFkZE9yUmVtb3ZlVGV4dExhYmVscyhuZXdGaWVsZHMsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCA9IERFRkFVTFRfVEVYVF9MQUJFTCkge1xuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG5cbiAgY29uc3QgY3VycmVudEZpZWxkcyA9IHRleHRMYWJlbC5tYXAodGwgPT4gdGwuZmllbGQgJiYgdGwuZmllbGQubmFtZSkuZmlsdGVyKGQgPT4gZCk7XG5cbiAgY29uc3QgYWRkRmllbGRzID0gbmV3RmllbGRzLmZpbHRlcihmID0+ICFjdXJyZW50RmllbGRzLmluY2x1ZGVzKGYubmFtZSkpO1xuICBjb25zdCBkZWxldGVGaWVsZHMgPSBjdXJyZW50RmllbGRzLmZpbHRlcihmID0+ICFuZXdGaWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBmKSk7XG5cbiAgLy8gZGVsZXRlXG4gIG5ld1RleHRMYWJlbCA9IG5ld1RleHRMYWJlbC5maWx0ZXIodGwgPT4gdGwuZmllbGQgJiYgIWRlbGV0ZUZpZWxkcy5pbmNsdWRlcyh0bC5maWVsZC5uYW1lKSk7XG4gIG5ld1RleHRMYWJlbCA9ICFuZXdUZXh0TGFiZWwubGVuZ3RoID8gW2RlZmF1bHRUZXh0TGFiZWxdIDogbmV3VGV4dExhYmVsO1xuXG4gIC8vIGFkZFxuICBuZXdUZXh0TGFiZWwgPSBbXG4gICAgLi4ubmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCksXG4gICAgLi4uYWRkRmllbGRzLm1hcChhZiA9PiAoe1xuICAgICAgLi4uZGVmYXVsdFRleHRMYWJlbCxcbiAgICAgIGZpZWxkOiBhZlxuICAgIH0pKVxuICBdO1xuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCB0ZXh0TGFiZWwpIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGV4dExhYmVsW2lkeF0sIHByb3ApKSB7XG4gICAgcmV0dXJuIHRleHRMYWJlbDtcbiAgfVxuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBpZiAocHJvcCA9PT0gJ2ZpZWxkJyAmJiB2YWx1ZSA9PT0gbnVsbCAmJiB0ZXh0TGFiZWwubGVuZ3RoID4gMSkge1xuICAgIC8vIHJlbW92ZSBsYWJlbCB3aGVuIGZpZWxkIHZhbHVlIGlzIHNldCB0byBudWxsXG4gICAgbmV3VGV4dExhYmVsLnNwbGljZShpZHgsIDEpO1xuICB9IGVsc2UgaWYgKHByb3ApIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwubWFwKCh0bCwgaSkgPT4gKGkgPT09IGlkeCA/IHsuLi50bCwgW3Byb3BdOiB2YWx1ZX0gOiB0bCkpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaWR4LCBwcm9wLCB2YWx1ZX0gPSBhY3Rpb247XG4gIGNvbnN0IHt0ZXh0TGFiZWx9ID0gb2xkTGF5ZXIuY29uZmlnO1xuXG4gIC8vIHdoZW4gYWRkaW5nIGEgbmV3IGVtcHR5IHRleHQgbGFiZWwsXG4gIC8vIHJlbHkgb24gdGhlIGxheWVyJ3MgZGVmYXVsdCBjb25maWcsIG9yIHVzZSB0aGUgY29uc3RhbnQgREVGQVVMVF9URVhUX0xBQkVMXG4gIGNvbnN0IGRlZmF1bHRUZXh0TGFiZWwgPVxuICAgIG9sZExheWVyLmdldERlZmF1bHRMYXllckNvbmZpZyh7ZGF0YUlkOiAnJ30pPy50ZXh0TGFiZWw/LlswXSA/PyBERUZBVUxUX1RFWFRfTEFCRUw7XG5cbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuICBpZiAoIXRleHRMYWJlbFtpZHhdICYmIGlkeCA9PT0gdGV4dExhYmVsLmxlbmd0aCkge1xuICAgIC8vIGlmIGlkeCBpcyBzZXQgdG8gbGVuZ3RoLCBhZGQgZW1wdHkgdGV4dCBsYWJlbFxuICAgIG5ld1RleHRMYWJlbCA9IFsuLi50ZXh0TGFiZWwsIGRlZmF1bHRUZXh0TGFiZWxdO1xuICB9XG5cbiAgaWYgKGlkeCA9PT0gJ2FsbCcgJiYgcHJvcCA9PT0gJ2ZpZWxkcycpIHtcbiAgICBuZXdUZXh0TGFiZWwgPSBhZGRPclJlbW92ZVRleHRMYWJlbHModmFsdWUsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3VGV4dExhYmVsID0gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIG5ld1RleHRMYWJlbCk7XG4gIH1cbiAgLy8gdXBkYXRlIHRleHQgbGFiZWwgcHJvcCBhbmQgdmFsdWVcbiAgcmV0dXJuIGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZzoge3RleHRMYWJlbDogbmV3VGV4dExhYmVsfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoZGF0YXNldCwgbGF5ZXJDbGFzc2VzLCBsYXllciwgc2NoZW1hKSB7XG4gIGNvbnN0IGxvYWRlZExheWVyID0gc2VyaWFsaXplTGF5ZXIobGF5ZXIsIHNjaGVtYSk7XG4gIHJldHVybiBsb2FkZWRMYXllclxuICAgID8gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxvYWRlZExheWVyLCBsYXllckNsYXNzZXMsIHtcbiAgICAgICAgYWxsb3dFbXB0eUNvbHVtbjogdHJ1ZVxuICAgICAgfSlcbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGNvbmZpZyBkYXRhSWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBvbGRMYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiB7XG4gICAgICBkYXRhSWQ6IHN0cmluZztcbiAgICB9O1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdDb25maWc7XG5cbiAgaWYgKCFvbGRMYXllciB8fCAhc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWR9KTtcblxuICAvLyB0aGlzIG1heSBoYXBwZW4gd2hlbiBhIGxheWVyIGlzIG5ldyAodHlwZTogbnVsbCBhbmQgbm8gY29sdW1ucykgYnV0IGl0J3Mgbm90IHJlYWR5IHRvIGJlIHNhdmVkXG4gIGlmIChuZXdMYXllci5pc1ZhbGlkVG9TYXZlKCkpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZUV4aXN0aW5nTGF5ZXJXaXRoRGF0YShcbiAgICAgIHN0YXRlLmRhdGFzZXRzW2RhdGFJZF0sXG4gICAgICBzdGF0ZS5sYXllckNsYXNzZXMsXG4gICAgICBuZXdMYXllcixcbiAgICAgIHN0YXRlLnNjaGVtYVxuICAgICk7XG4gICAgLy8gaWYgY2FudCB2YWxpZGF0ZSBpdCB3aXRoIGRhdGEgY3JlYXRlIGEgbmV3IG9uZVxuICAgIGlmICghdmFsaWRhdGVkKSB7XG4gICAgICBjb25zdCBvbGRMYXllclR5cGUgPSBvbGRMYXllci50eXBlO1xuICAgICAgaWYgKG9sZExheWVyVHlwZSkge1xuICAgICAgICBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbb2xkTGF5ZXJUeXBlXSh7ZGF0YUlkLCBpZDogb2xkTGF5ZXIuaWR9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXIgPSB2YWxpZGF0ZWQ7XG4gICAgfVxuICB9XG5cbiAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgaXNWaXNpYmxlOiBvbGRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGlzQ29uZmlnQWN0aXZlOiB0cnVlXG4gIH0pO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgdW5kZWZpbmVkKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpOiBMYXllciB7XG4gIGxldCBuZXdMYXllciA9IGxheWVyO1xuICBpZiAoIU9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGgpIHtcbiAgICAvLyBubyBkYXRhIGlzIGxvYWRlZFxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuICBpZiAoIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAvLyBzZXQgbGF5ZXIgZGF0YUlkXG4gICAgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7ZGF0YUlkOiBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF19KTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbbmV3TGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8vIGZpbmQgZGVmYXV0IGxheWVyIHByb3BzXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgdHlwZW9mIGxheWVyQ2xhc3Nlc1tuZXdMYXllci50eXBlXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBbXSlcbiAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgLy8gYW4gYXJyYXkgb2YgcG9zc2libGUgcHJvcHMsIHVzZSAxc3Qgb25lXG4gIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuXG4gIGlmIChwcm9wcy5sZW5ndGgpIHtcbiAgICBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbbGF5ZXIudHlwZV0oe1xuICAgICAgLi4ucHJvcHNbMF0sXG4gICAgICBsYWJlbDogbmV3TGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgICAgZGF0YUlkOiBuZXdMYXllci5jb25maWcuZGF0YUlkLFxuICAgICAgaXNDb25maWdBY3RpdmU6IG5ld0xheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0eXBlb2YgbmV3TGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nXG4gICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICA6IG5ld0xheWVyO1xufVxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdHlwZS4gUHJldmlld3MgbGF5ZXIgY29uZmlnIHdpbGwgYmUgY29waWVkIGlmIGFwcGxpY2FibGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3VHlwZX0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgb2xkSWQgPSBvbGRMYXllci5pZDtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZElkKTtcblxuICBpZiAoIXN0YXRlLmxheWVyQ2xhc3Nlc1tuZXdUeXBlXSkge1xuICAgIENvbnNvbGUuZXJyb3IoYCR7bmV3VHlwZX0gaXMgbm90IGEgdmFsaWQgbGF5ZXIgdHlwZWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKHtcbiAgICAvLyBrZWVwIG9sZCBsYXllciBsYWJsZSBhbmQgaXNDb25maWdBY3RpdmVcbiAgICBsYWJlbDogb2xkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGlzQ29uZmlnQWN0aXZlOiBvbGRMYXllci5jb25maWcuaXNDb25maWdBY3RpdmUsXG4gICAgZGF0YUlkOiBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gIH0pO1xuXG4gIGlmICghb2xkTGF5ZXIudHlwZSkge1xuICAgIC8vIGlmIHNldHRpbmcgbGF5ZXIgdHlwZSBvbiBhbiBlbXB0eSBsYXllclxuICAgIG5ld0xheWVyID0gc2V0SW5pdGlhbExheWVyQ29uZmlnKG5ld0xheWVyLCBzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBnZXQgYSBtaW50IGxheWVyLCB3aXRoIG5ldyBpZCBhbmQgdHlwZVxuICAgIC8vIGJlY2F1c2UgZGVjay5nbCB1c2VzIGlkIHRvIG1hdGNoIGJldHdlZW4gbmV3IGFuZCBvbGQgbGF5ZXIuXG4gICAgLy8gSWYgdHlwZSBoYXMgY2hhbmdlZCBidXQgaWQgaXMgdGhlIHNhbWUsIGl0IHdpbGwgYnJlYWtcbiAgICBuZXdMYXllci5hc3NpZ25Db25maWdUb0xheWVyKG9sZExheWVyLmNvbmZpZywgb2xkTGF5ZXIudmlzQ29uZmlnU2V0dGluZ3MpO1xuICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgfVxuXG4gIGNvbnN0IHtjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG5cbiAgbGV0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG9sZExheWVyLmlzTGF5ZXJIb3ZlcmVkKGNsaWNrZWQpID8gdW5kZWZpbmVkIDogY2xpY2tlZCxcbiAgICBob3ZlckluZm86IG9sZExheWVyLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm9cbiAgfTtcblxuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIG5ld1N0YXRlKTtcbiAgbmV3U3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEobmV3U3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkIHx8IG9sZExheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBzcGxpdE1hcCBsYXllciBpZFxuICBpZiAoc3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICBzcGxpdE1hcHM6IG5ld1N0YXRlLnNwbGl0TWFwcy5tYXAoc2V0dGluZ3MgPT4ge1xuICAgICAgICBjb25zdCB7W29sZElkXTogb2xkTGF5ZXJNYXAsIC4uLm90aGVyTGF5ZXJzfSA9IHNldHRpbmdzLmxheWVycztcbiAgICAgICAgcmV0dXJuIG9sZElkIGluIHNldHRpbmdzLmxheWVyc1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5zZXR0aW5ncyxcbiAgICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgICAgLi4ub3RoZXJMYXllcnMsXG4gICAgICAgICAgICAgICAgW2xheWVyLmlkXTogb2xkTGF5ZXJNYXBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogc2V0dGluZ3M7XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICAvLyB1cGRhdGUgbGF5ZXJPcmRlciB3aXRoIG5ldyBpZFxuICBuZXdTdGF0ZSA9IHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBsYXllck9yZGVyOiBuZXdTdGF0ZS5sYXllck9yZGVyLm1hcChsYXllcklkID0+XG4gICAgICBsYXllcklkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyLmlkIDogbGF5ZXJJZFxuICAgIClcbiAgfTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHZpc3VhbCBjaGFubmVsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdDb25maWcsIG5ld1Zpc0NvbmZpZywgY2hhbm5lbH0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbb2xkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcobmV3Q29uZmlnKTtcbiAgaWYgKG5ld1Zpc0NvbmZpZykgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllclZpc0NvbmZpZyhuZXdWaXNDb25maWcpO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKTtcblxuICAvLyBjYWxsaW5nIHVwZGF0ZSBhbmltYXRpb24gZG9tYWluIGZpcnN0IHRvIG1lcmdlIGFsbCBsYXllciBhbmltYXRpb24gZG9tYWluXG4gIGNvbnN0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihzdGF0ZSk7XG5cbiAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gdXBkYXRlZFN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHVwZGF0ZWRTdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHVwZGF0ZWRTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBgdmlzQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhhY3Rpb24ubmV3VmlzQ29uZmlnKTtcblxuICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgLi4ub2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAuLi5hY3Rpb24ubmV3VmlzQ29uZmlnXG4gIH07XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyh7dmlzQ29uZmlnOiBuZXdWaXNDb25maWd9KTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIG9sZExheWVyRGF0YSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyOiBuZXdMYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogUmVzZXQgYW5pbWF0aW9uIGNvbmZpZyBjdXJyZW50IHRpbWUgdG8gYSBzcGVjaWZpZWQgdmFsdWVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciA9IDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAge3ZhbHVlfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFMgPT4ge1xuICBjb25zdCBjdXJyZW50VGltZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgY3VycmVudFRpbWVcbiAgICB9XG4gIH07XG4gIC8vIHVwZGF0ZSBhbmltYXRpb24gY29uZmlnIGZvciBlYWNoIGxheWVyXG4gIHJldHVybiBzdGF0ZS5sYXllcnMucmVkdWNlKChhY2N1LCBsKSA9PiB7XG4gICAgaWYgKGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmIGwudHlwZSAhPT0gJ3RyaXAnKSB7XG4gICAgICByZXR1cm4gbGF5ZXJBbmltYXRpb25DaGFuZ2VVcGRhdGVyKGFjY3UsIHtvbGRMYXllcjogbCwgcHJvcDogJ2N1cnJlbnRUaW1lJywgY3VycmVudFRpbWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIGFuaW1hdGlvbiB3aW5kb3dcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi5pZCA9PT0gaWQpO1xuXG4gIGlmICghZmlsdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBhbmltYXRpb25XaW5kb3dcbiAgfTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikoc3RhdGUuZmlsdGVycylcbiAgfTtcblxuICBjb25zdCBuZXdTeW5jVGltZWxpbmVNb2RlID0gZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcik7XG5cbiAgcmV0dXJuIHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7aWQsIG1vZGU6IG5ld1N5bmNUaW1lbGluZU1vZGV9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIGNvbnN0IHtpZHgsIHZhbHVlSW5kZXggPSAwfSA9IGFjdGlvbjtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuICBpZiAoIW9sZEZpbHRlcikge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnMuJHtpZHh9IGlzIHVuZGVmaW5lZGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShhY3Rpb24ucHJvcCkgJiZcbiAgICAoIUFycmF5LmlzQXJyYXkoYWN0aW9uLnZhbHVlKSB8fCBhY3Rpb24ucHJvcC5sZW5ndGggIT09IGFjdGlvbi52YWx1ZS5sZW5ndGgpXG4gICkge1xuICAgIENvbnNvbGUuZXJyb3IoJ0V4cGVjdGluZyB2YWx1ZSB0byBiZSBhbiBhcnJheSBvZiB0aGUgc2FtZSBsZW5ndGgsIHNpbmNlIHByb3AgaXMgYW4gYXJyYXknKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gY29udmVydCBwcm9wIGFuZCB2YWx1ZSB0byBhcnJheVxuICBjb25zdCBwcm9wcyA9IHRvQXJyYXkoYWN0aW9uLnByb3ApO1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wcm9wKSA/IHRvQXJyYXkoYWN0aW9uLnZhbHVlKSA6IFthY3Rpb24udmFsdWVdO1xuXG4gIGxldCBuZXdGaWx0ZXIgPSBvbGRGaWx0ZXI7XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuXG4gIGxldCBkYXRhc2V0SWRzVG9GaWx0ZXI6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwcm9wID0gcHJvcHNbaV07XG4gICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgLy8gV2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHBhc3NpbmcgaW4gbmFtZSBhcyBhbiBhcnJheSBpbnRvIF91cGRhdGVGaWx0ZXJQcm9wLCBzbyB3ZSBjYWxsIGl0IG11bHRpcGxlIHRpbWVzIHdpdGggZWFjaCBuYW1lXG4gICAgLy8gU2VlIHRoZSBjb21tZW50IGluIHRoZXJlIGFzIHRvIHdoYXQgc2hvdWxkIGJlIGFkZHJlc3NlZFxuICAgIGxldCByZXM7XG4gICAgaWYgKHByb3AgPT09ICduYW1lJyAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgcmVzID0gdmFsdWUucmVkdWNlKChhY2N1LCB2KSA9PiB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlRmlsdGVyUHJvcChhY2N1LCBuZXdGaWx0ZXIsIHByb3AsIHYsIHZhbHVlSW5kZXgpO1xuICAgICAgfSwgbmV3U3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBfdXBkYXRlRmlsdGVyUHJvcChuZXdTdGF0ZSwgbmV3RmlsdGVyLCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCk7XG4gICAgfVxuICAgIG5ld0ZpbHRlciA9IHJlcy5maWx0ZXI7XG4gICAgbmV3U3RhdGUgPSByZXMuc3RhdGU7XG4gICAgZGF0YXNldElkc1RvRmlsdGVyID0gZGF0YXNldElkc1RvRmlsdGVyLmNvbmNhdChyZXMuZGF0YXNldElkc1RvRmlsdGVyKTtcbiAgfVxuXG4gIGNvbnN0IGVubGFyZ2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi52aWV3ID09PSBGSUxURVJfVklFV19UWVBFUy5lbmxhcmdlZCk7XG5cbiAgaWYgKGVubGFyZ2VkRmlsdGVyICYmIGVubGFyZ2VkRmlsdGVyLmlkICE9PSBuZXdGaWx0ZXIuaWQpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZW5sYXJnZWQgZmlsdGVyXG4gICAgbmV3RmlsdGVyLnZpZXcgPSBGSUxURVJfVklFV19UWVBFUy5zaWRlO1xuICB9XG5cbiAgLy8gc2F2ZSBuZXcgZmlsdGVycyB0byBuZXdTdGF0ZVxuICBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnLCBpZHhdLCBuZXdGaWx0ZXIsIG5ld1N0YXRlKTtcblxuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICB1bmlxKGRhdGFzZXRJZHNUb0ZpbHRlciksXG4gICAgbmV3U3RhdGUuZGF0YXNldHMsXG4gICAgbmV3U3RhdGUuZmlsdGVycyxcbiAgICBuZXdTdGF0ZS5sYXllcnNcbiAgKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcblxuICAvLyBuZWVkIHRvIHVwZGF0ZSBmaWx0ZXJQbG90IGFmdGVyIGZpbHRlciBEYXRhc2V0IGZvciBwbG90IHRvIHVwZGF0ZSBvbiBmaWx0ZXJlZCByZXN1bHRcbiAgY29uc3QgZmlsdGVyV2l0aFBMb3QgPSB1cGRhdGVGaWx0ZXJQbG90KG5ld1N0YXRlLmRhdGFzZXRzLCBuZXdTdGF0ZS5maWx0ZXJzW2lkeF0pO1xuXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIGZpbHRlcldpdGhQTG90LCBuZXdTdGF0ZSk7XG5cbiAgLy8gZGF0YUlkIGlzIGFuIGFycmF5XG4gIC8vIHBhc3Mgb25seSB0aGUgZGF0YXNldCB3ZSBuZWVkIHRvIHVwZGF0ZVxuICBuZXdTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YXNldElkc1RvRmlsdGVyLCBuZXdGaWx0ZXIpO1xuXG4gIC8vIElmIHRpbWUgcmFuZ2UgZmlsdGVyIHZhbHVlIHdhcyB1cGRhdGVkLCBhZGp1c3QgYW5pbWF0aW9uIGNvbmZpZ1xuICBpZiAobmV3RmlsdGVyLnR5cGUgPT09IEZJTFRFUl9UWVBFUy50aW1lUmFuZ2UgJiYgcHJvcHMuaW5jbHVkZXMoJ3ZhbHVlJykpIHtcbiAgICBuZXdTdGF0ZSA9IGFkanVzdEFuaW1hdGlvbkNvbmZpZ1dpdGhGaWx0ZXIobmV3U3RhdGUsIGFjdGlvbi5pZHgpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5mdW5jdGlvbiBfdXBkYXRlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgdmFsdWUsIGRhdGFzZXRzKSB7XG4gIGxldCBuZXdGaWx0ZXIgPSBmaWx0ZXI7XG4gIGlmIChmaWx0ZXIuZGF0YUlkW3ZhbHVlSW5kZXhdKSB7XG4gICAgLy8gaWYgZGF0YUlkIGFscmVhZHkgZXhpc3RcbiAgICBuZXdGaWx0ZXIgPSBfcmVtb3ZlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgZGF0YXNldHMpO1xuICB9XG4gIGlmICh2YWx1ZSkge1xuICAgIGNvbnN0IG5leHRWYWx1ZSA9IG5ld0ZpbHRlci5kYXRhSWQuc2xpY2UoKTtcbiAgICBuZXh0VmFsdWVbdmFsdWVJbmRleF0gPSB2YWx1ZTtcbiAgICBuZXdGaWx0ZXIgPSBzZXQoWydkYXRhSWQnXSwgbmV4dFZhbHVlLCBuZXdGaWx0ZXIpO1xuICB9XG4gIHJldHVybiBuZXdGaWx0ZXI7XG59XG5cbmZ1bmN0aW9uIF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykge1xuICBjb25zdCBkYXRhSWQgPSBmaWx0ZXIuZGF0YUlkW3ZhbHVlSW5kZXhdO1xuXG4gIGlmIChmaWx0ZXIuZGF0YUlkLmxlbmd0aCA9PT0gMSAmJiB2YWx1ZUluZGV4ID09PSAwKSB7XG4gICAgLy8gaWYgcmVtb3ZlIHRoZSBvbmx5IGRhdGFJZCwgY3JlYXRlIGFuIGVtcHR5IGZpbHRlciBpbnN0ZWFkO1xuICAgIHJldHVybiBnZXREZWZhdWx0RmlsdGVyKHtpZDogZmlsdGVyLmlkfSk7XG4gIH1cblxuICBpZiAoZGF0YUlkKSB7XG4gICAgZmlsdGVyID0gcmVtb3ZlRmlsdGVyUGxvdChmaWx0ZXIsIGRhdGFJZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2YgWydkYXRhSWQnLCAnbmFtZScsICdmaWVsZElkeCcsICdncHVDaGFubmVsJ10pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXJbcHJvcF0pKSB7XG4gICAgICBjb25zdCBuZXh0VmFsID0gZmlsdGVyW3Byb3BdLnNsaWNlKCk7XG4gICAgICBuZXh0VmFsLnNwbGljZSh2YWx1ZUluZGV4LCAxKTtcbiAgICAgIGZpbHRlciA9IHNldChbcHJvcF0sIG5leHRWYWwsIGZpbHRlcik7XG4gICAgfVxuICB9XG5cbiAgLy8gbWVyZ2VGaWVsZERvbWFpbiBmb3IgdGhlIHJlbWFpbmluZyBmaWVsZHNcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMgdG8gdXNlIHdpdGggbWVyZ2VGaWx0ZXJEb21haW5TdGVwXG4gIGxldCBkb21haW5TdGVwczogRmlsdGVyICYge3N0ZXA/OiBudW1iZXIgfCB1bmRlZmluZWR9ID0ge307XG4gIGZpbHRlci5kYXRhSWQuZm9yRWFjaCgoZmlsdGVyRGF0YUlkLCBpZHgpID0+IHtcbiAgICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbZmlsdGVyRGF0YUlkXTtcbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGRhdGFzZXQuZ2V0Q29sdW1uRmlsdGVyUHJvcHMoZmlsdGVyLm5hbWVbaWR4XSk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMgdG8gdXNlIHdpdGggbWVyZ2VGaWx0ZXJEb21haW5TdGVwXG4gICAgZG9tYWluU3RlcHMgPSBtZXJnZUZpbHRlckRvbWFpblN0ZXAoZG9tYWluU3RlcHMsIGZpbHRlclByb3BzKTtcbiAgfSk7XG5cbiAgY29uc3QgbmV4dEZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgLy8gdmFsdWU6IG5leHRWYWx1ZSxcbiAgICBkb21haW46IGRvbWFpblN0ZXBzLmRvbWFpbixcbiAgICBzdGVwOiBkb21haW5TdGVwcy5zdGVwXG4gIH07XG5cbiAgY29uc3QgbmV4dFZhbHVlID0gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbihuZXh0RmlsdGVyLnZhbHVlLCBuZXh0RmlsdGVyKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5uZXh0RmlsdGVyLFxuICAgIHZhbHVlOiBuZXh0VmFsdWVcbiAgfTtcbn1cblxuLyoqKlxuICogVXBkYXRlcyBhIHNpbmdsZSBwcm9wZXJ0eSBvZiBhIGZpbHRlclxuICovXG5mdW5jdGlvbiBfdXBkYXRlRmlsdGVyUHJvcChzdGF0ZSwgZmlsdGVyLCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCwgZGF0YXNldElkcz8pIHtcbiAgbGV0IGRhdGFzZXRJZHNUb0ZpbHRlcjogc3RyaW5nW10gPSBbXTtcbiAgc3dpdGNoIChwcm9wKSB7XG4gICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgaWYgd2UgdXBkYXRlIGZpbHRlckRhdGFJZCwgd2UgbmVlZCB0byBjb25zaWRlciB0d28gY2FzZXM6XG4gICAgLy8gMS4gZGF0YUlkIGlzIGVtcHR5OiBjcmVhdGUgYSBkZWZhdWx0IGZpbHRlclxuICAgIC8vIDIuIEFkZCBhIG5ldyBkYXRhc2V0IGlkXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5kYXRhSWQ6IHtcbiAgICAgIGNvbnN0IG9sZERhdGFJZCA9IFsuLi5maWx0ZXIuZGF0YUlkXTtcbiAgICAgIGZpbHRlciA9IF91cGRhdGVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCB2YWx1ZSwgc3RhdGUuZGF0YXNldHMpO1xuICAgICAgZGF0YXNldElkc1RvRmlsdGVyID0gdW5pcShbLi4ub2xkRGF0YUlkLCAuLi5maWx0ZXIuZGF0YUlkXSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5uYW1lOiB7XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gZmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YXNldElkXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogdmFsdWVJbmRleCA+IDB9XG4gICAgICApO1xuICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcbiAgICAgICAgaWYgKGZpbHRlci5ncHUpIHtcbiAgICAgICAgICBmaWx0ZXIgPSBzZXRGaWx0ZXJHcHVNb2RlKGZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICAgICAgZmlsdGVyID0gYXNzaWduR3B1Q2hhbm5lbChmaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG4gICAgICAgIC8vIHJlbW92ZSBmaWx0ZXIgUGxvdCBhdCBkYXRhc2V0SWQsIHNvIGl0IHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgIGZpbHRlciA9IHJlbW92ZUZpbHRlclBsb3QoZmlsdGVyLCBkYXRhc2V0SWQpO1xuXG4gICAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IHVwZGF0ZWRGaWx0ZXIuZGF0YUlkO1xuICAgICAgfVxuICAgICAgLy8gb25seSBmaWx0ZXIgdGhlIGN1cnJlbnQgZGF0YXNldFxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5sYXllcklkOiB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IGRhdGFzZXRJZC9zIGlmIHdlIGhhdmUgYWRkZWQvcmVtb3ZlZCBsYXllcnNcbiAgICAgIC8vIC0gY2hlY2sgZm9yIGxheWVySWQgY2hhbmdlcyAoWE9SIHdvcmtzIGJlY2F1c2Ugb2Ygc3RyaW5nIHZhbHVlcylcbiAgICAgIC8vIGlmIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4gbGF5ZXJJZHMsIGRvbid0IGRvIGFueSBmaWx0ZXJpbmdcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGxheWVySWREaWZmZXJlbmNlID0geG9yKHZhbHVlLCBmaWx0ZXIubGF5ZXJJZCk7XG5cbiAgICAgIGNvbnN0IGxheWVyRGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IGxheWVyRGF0YUlkcztcblxuICAgICAgLy8gVXBkYXRlIG5ld0ZpbHRlciBkYXRhSWRzXG4gICAgICBjb25zdCBuZXdEYXRhSWRzID0gdW5pcTxzdHJpbmc+KFxuICAgICAgICB2YWx1ZVxuICAgICAgICAgID8ubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgZmlsdGVyID0ge1xuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIGxheWVySWQ6IHZhbHVlLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgZmlsdGVyID0gc2V0KFtwcm9wXSwgdmFsdWUsIGZpbHRlcik7XG4gICAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBbLi4uZmlsdGVyLmRhdGFJZF07XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB7ZmlsdGVyLCBkYXRhc2V0SWRzLCBkYXRhc2V0SWRzVG9GaWx0ZXIsIHN0YXRlfTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4ID0gMH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIXN0YXRlLmZpbHRlcnNbaWR4XSkge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnNbJHtpZHh9XSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0ZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbmV3UHJvcCkge1xuICAgIGlmIChwcm9wID09PSAncGxvdFR5cGUnKSB7XG4gICAgICBuZXdGaWx0ZXIgPSBwaWNrXygncGxvdFR5cGUnKShtZXJnZV8obmV3UHJvcC5wbG90VHlwZSkpKG5ld0ZpbHRlcik7XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSAneUF4aXMnKSB7XG4gICAgICBjb25zdCBjaGFydFR5cGUgPSBuZXdQcm9wLnlBeGlzID8gUExPVF9UWVBFUy5saW5lQ2hhcnQgOiBQTE9UX1RZUEVTLmhpc3RvZ3JhbTtcblxuICAgICAgbmV3RmlsdGVyID0gcGlja18oJ3Bsb3RUeXBlJykobWVyZ2VfKHt0eXBlOiBjaGFydFR5cGV9KSkobWVyZ2VfKG5ld1Byb3ApKG5ld0ZpbHRlcikpO1xuICAgIH1cbiAgfVxuXG4gIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlclBsb3Qoc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIGlkOiBhY3Rpb24uaWR9KV1cbiAgICAgIH07XG5cbi8qKlxuICogQ3JlYXRlIG9yIHVwZGF0ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZU9yVXBkYXRlRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5DcmVhdGVPclVwZGF0ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkLCBkYXRhSWQsIGZpZWxkLCB2YWx1ZX0gPSBhY3Rpb247XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGlkKTtcbiAgbGV0IGZpbHRlckluZGV4ID0gb3JpZ2luYWxJbmRleDtcbiAgaWYgKCFpZCAmJiAhZGF0YUlkKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG4gIGlmIChvcmlnaW5hbEluZGV4IDwgMCAmJiBkYXRhSWQpIHtcbiAgICBuZXdTdGF0ZSA9IGFkZEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWR9KTtcbiAgICBpZiAobmV3U3RhdGUuZmlsdGVycy5sZW5ndGggIT09IHN0YXRlLmZpbHRlcnMubGVuZ3RoICsgMSkge1xuICAgICAgLy8gTm8gbmV3IGZpbHRlciB3YXMgYWRkZWRcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgLy8gSGVyZSB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgZmlsdGVyIHdhcyBhZGRlZCBhdCB0aGUgZW5kXG4gICAgZmlsdGVySW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmxlbmd0aCAtIDE7XG4gICAgbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJbmRleF0gPSB7XG4gICAgICAuLi5uZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlckluZGV4XSxcbiAgICAgIC4uLihpZCA/IHtpZH0gOiBudWxsKVxuICAgIH07XG4gIH1cblxuICAvLyBObyBuZWVkIHRvIHVwZGF0ZSB0aGlzIGlmIGl0J3MgYSBuZXdseSBjcmVhdGVkIGZpbHRlclxuICAvLyBGaXJzdCB3ZSBtYWtlIHN1cmUgYWxsIHRoZSBkYXRhSWRzIHRoYXQgZmllbGRzIHJlZmVyIHRvIGFyZSB1cGRhdGVkXG4gIGlmIChvcmlnaW5hbEluZGV4ID49IDAgJiYgZGF0YUlkKSB7XG4gICAgLy8gSWYgdGhlIGRhdGFJZCBpcyBhbiBhcnJheSwgd2UgbmVlZCB0byB1cGRhdGUgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGRhdGFJZCkgPyBkYXRhSWQgOiBbZGF0YUlkXSkucmVkdWNlKChhY2N1LCBkLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnZGF0YUlkJyxcbiAgICAgICAgdmFsdWU6IGQsXG4gICAgICAgIHZhbHVlSW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9LCBuZXdTdGF0ZSk7XG4gIH1cbiAgLy8gVGhlbiB3ZSB1cGRhdGUgdGhlIGZpZWxkc1xuICBpZiAoZmllbGQpIHtcbiAgICAvLyBJZiB0aGUgZmllbGQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gdXBkYXRlIGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkIDogW2ZpZWxkXSkucmVkdWNlKChhY2N1LCBmLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnbmFtZScsXG4gICAgICAgIHZhbHVlOiBmLFxuICAgICAgICB2YWx1ZUluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfSwgbmV3U3RhdGUpO1xuICB9XG4gIC8vIFRoZW4gd2UgdXBkYXRlIHRoZSB2YWx1ZSBzZXBhcmF0ZWx5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJbmRleCwgcHJvcDogJ3ZhbHVlJywgdmFsdWV9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogU2V0IGxheWVyIGNvbG9yIHBhbGV0dGUgdWkgc3RhdGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvbGRMYXllciwgcHJvcCwgbmV3Q29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgb2xkVml4Q29uZmlnID0gb2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbG9yVUkocHJvcCwgbmV3Q29uZmlnKTtcbiAgY29uc3QgbmV3VmlzQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgaWYgKG9sZFZpeENvbmZpZyAhPT0gbmV3VmlzQ29uZmlnKSB7XG4gICAgcmV0dXJuIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdWaXNDb25maWc6IHtcbiAgICAgICAgW3Byb3BdOiBuZXdWaXNDb25maWdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcChsID0+IChsLmlkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyIDogbCkpXG4gIH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IGFuZCBlbmQgZmlsdGVyIGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gYWN0aW9uLmlkeCA/IHsuLi5mLCBpc0FuaW1hdGluZzogIWYuaXNBbmltYXRpbmd9IDogZikpXG59KTtcblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGlzQW5pbWF0aW5nOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmlzQW5pbWF0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyID0gKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaGlkZUNvbnRyb2w6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2xcbiAgfVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIGZpbHRlciBhbmltYXRpb24gc3BlZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIHNwZWVkOiBhY3Rpb24uc3BlZWR9IDogZikpXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgYW5pbWF0aW9uIHNwZWVkIHdpdGggdGhlIHZlcnRpY2FsIHNwZWVkIHNsaWRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7c3BlZWR9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHNwZWVkXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGxhcmdlciB0aW1lIGZpbHRlciBhdCBib3R0b20gZm9yIHRpbWUgcGxheWJhY2sgKGFwcGx5IHRvIHRpbWUgZmlsdGVyIG9ubHkpXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RmlsdGVyVmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyVmlld1VwZGF0ZXJBY3Rpb25cbikgPT4ge1xuICBjb25zdCB7dmlldywgaWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qgc2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3ID0gdmlldyA9PT0gRklMVEVSX1ZJRVdfVFlQRVMuZW5sYXJnZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+XG4gICAgICBpID09PSBpZHhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlld1xuICAgICAgICAgIH1cbiAgICAgICAgOiBzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlldzogRklMVEVSX1ZJRVdfVFlQRVMuc2lkZVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmXG4gICAgKVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIGZpbHRlciBmZWF0dXJlIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2FjdGlvbi5pZHhdO1xuICBjb25zdCBpc1Zpc2libGUgPSBnZXQoZmlsdGVyLCBbJ3ZhbHVlJywgJ3Byb3BlcnRpZXMnLCAnaXNWaXNpYmxlJ10pO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIHtcbiAgICBpZHg6IGFjdGlvbi5pZHgsXG4gICAgcHJvcDogJ2VuYWJsZWQnLFxuICAgIHZhbHVlOiAhaXNWaXNpYmxlXG4gIH0pO1xuXG4gIG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogYWN0aW9uLmlkeCxcbiAgICBwcm9wOiAndmFsdWUnLFxuICAgIHZhbHVlOiBmZWF0dXJlVG9GaWx0ZXJWYWx1ZShmaWx0ZXIudmFsdWUsIGZpbHRlci5pZCwge1xuICAgICAgaXNWaXNpYmxlOiAhaXNWaXNpYmxlXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVGaWx0ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkeH0gPSBhY3Rpb247XG4gIGNvbnN0IHtkYXRhSWQsIGlkfSA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBjb25zdCBuZXdGaWx0ZXJzID0gW1xuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoMCwgaWR4KSxcbiAgICAuLi5zdGF0ZS5maWx0ZXJzLnNsaWNlKGlkeCArIDEsIHN0YXRlLmZpbHRlcnMubGVuZ3RoKVxuICBdO1xuXG4gIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKGRhdGFJZCwgc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcnMsIHN0YXRlLmxheWVycyk7XG4gIGNvbnN0IG5ld0VkaXRvciA9XG4gICAgZ2V0RmlsdGVySWRJbkZlYXR1cmUoc3RhdGUuZWRpdG9yLnNlbGVjdGVkRmVhdHVyZSkgPT09IGlkXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGUuZWRpdG9yO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnXSwgbmV3RmlsdGVycywgc3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgbmV3U3RhdGUgPSBzZXQoWydlZGl0b3InXSwgbmV3RWRpdG9yLCBuZXdTdGF0ZSk7XG5cbiAgcmV0dXJuIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YUlkLCB1bmRlZmluZWQpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGxldCBuZXdMYXllcjtcbiAgbGV0IG5ld0xheWVyRGF0YTtcbiAgaWYgKGFjdGlvbi5jb25maWcpIHtcbiAgICBuZXdMYXllciA9IGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZSwgYWN0aW9uLmNvbmZpZyk7XG4gICAgaWYgKCFuZXdMYXllcikge1xuICAgICAgQ29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBsYXllciBmcm9tIGNvbmZpZywgaXQgdXN1YWxseSBtZWFucyB0aGUgY29uZmlnIGlzIG5vdCBiZSBpbiBjb3JyZWN0IGZvcm1hdCcsXG4gICAgICAgIGFjdGlvbi5jb25maWdcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSk7XG4gICAgbmV3TGF5ZXIgPSByZXN1bHQubGF5ZXI7XG4gICAgbmV3TGF5ZXJEYXRhID0gcmVzdWx0LmxheWVyRGF0YTtcbiAgfSBlbHNlIHtcbiAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbGF5ZXIgd2l0aCBhIHNwZWNpZmljIGRhdGFzZXQgb3IgYSBkZWZhdWx0IG9uZVxuICAgIGNvbnN0IGRlZmF1bHREYXRhc2V0ID0gYWN0aW9uLmRhdGFzZXRJZCA/PyBPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cylbMF07XG4gICAgbmV3TGF5ZXIgPSBuZXcgTGF5ZXIoe1xuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgICBkYXRhSWQ6IGRlZmF1bHREYXRhc2V0XG4gICAgfSk7XG4gICAgbmV3TGF5ZXJEYXRhID0ge307XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCBuZXdMYXllcl0sXG4gICAgbGF5ZXJEYXRhOiBbLi4uc3RhdGUubGF5ZXJEYXRhLCBuZXdMYXllckRhdGFdLFxuICAgIC8vIGFkZCBuZXcgbGF5ZXIgYXQgdGhlIHRvcFxuICAgIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZCwgLi4uc3RhdGUubGF5ZXJPcmRlcl0sXG4gICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKHN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXIpXG4gIH07XG5cbiAgaWYgKG5ld0xheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGF5ZXJVcGRhdGVyPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBUIHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgLy8gaW52YWxpZCBpbmRleFxuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCByZW1vdmUgbGF5ZXIgd2l0aCBpbnZhbGlkIGlkfGlkeCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtsYXllcnMsIGxheWVyRGF0YSwgbGF5ZXJPcmRlciwgY2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuICBjb25zdCBsYXllclRvUmVtb3ZlID0gbGF5ZXJzW2lkeF07XG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogZmlsdGVyT3V0QnlJZChsYXllclRvUmVtb3ZlLmlkKShsYXllcnMpLFxuICAgIGxheWVyRGF0YTogcmVtb3ZlRWxlbWVudEF0SW5kZXgoaWR4KShsYXllckRhdGEpLFxuICAgIGxheWVyT3JkZXI6IGxheWVyT3JkZXIuZmlsdGVyKGxheWVySWQgPT4gbGF5ZXJJZCAhPT0gbGF5ZXJUb1JlbW92ZS5pZCksXG4gICAgY2xpY2tlZDogbGF5ZXJUb1JlbW92ZS5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm8sXG4gICAgc3BsaXRNYXBzOiByZW1vdmVMYXllckZyb21TcGxpdE1hcHMoc3RhdGUuc3BsaXRNYXBzLCBsYXllclRvUmVtb3ZlKVxuICAgIC8vIFRPRE86IHVwZGF0ZSBmaWx0ZXJzLCBjcmVhdGUgaGVscGVyIHRvIHJlbW92ZSBsYXllciBmb3JtIGZpbHRlciAocmVtb3ZlIGxheWVyaWQgYW5kIGRhdGFpZCkgaWYgbWFwcGVkXG4gIH07XG5cbiAgcmV0dXJuIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG59XG5cbi8qKlxuICogUmVvcmRlciBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllck9yZGVyOiBvcmRlclxufSk7XG5cbi8qKlxuICogZHVwbGljYXRlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5EdXBsaWNhdGVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8ICFzdGF0ZS5sYXllcnNbaWR4XSkge1xuICAgIENvbnNvbGUud2FybihgbGF5ZXIgJHtpZHh9IG5vdCBmb3VuZCBpbiBsYXllck9yZGVyYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcbiAgY29uc3Qgb3JpZ2luYWwgPSBsYXllcnNbaWR4XTtcblxuICBjb25zdCBvcmlnaW5hbExheWVyT3JkZXJJZHggPSBzdGF0ZS5sYXllck9yZGVyLmZpbmRJbmRleChsaWQgPT4gbGlkID09PSBvcmlnaW5hbC5pZCk7XG4gIGxldCBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfWA7XG4gIGxldCBwb3N0Zml4ID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICB3aGlsZSAobGF5ZXJzLmZpbmQobCA9PiBsLmNvbmZpZy5sYWJlbCA9PT0gbmV3TGFiZWwpKSB7XG4gICAgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH0gJHsrK3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8vIGNvbGxlY3QgbGF5ZXIgY29uZmlnIGZyb20gb3JpZ2luYWxcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihvcmlnaW5hbCwgc3RhdGUuc2NoZW1hKTtcblxuICAvLyBhc3NpZ24gbmV3IGlkIGFuZCBsYWJlbCB0byBjb3BpZWQgbGF5ZXJcbiAgaWYgKCFsb2FkZWRMYXllcj8uY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxvYWRlZExheWVyLmNvbmZpZy5sYWJlbCA9IG5ld0xhYmVsO1xuICBsb2FkZWRMYXllci5pZCA9IGdlbmVyYXRlSGFzaElkKExBWUVSX0lEX0xFTkdUSCk7XG5cbiAgLy8gYWRkIGxheWVyIHRvIHN0YXRlXG4gIGxldCBuZXh0U3RhdGUgPSBhZGRMYXllclVwZGF0ZXIoc3RhdGUsIHtjb25maWc6IGxvYWRlZExheWVyfSk7XG4gIC8vIHJldHJpZXZlIG5ld2x5IGNyZWF0ZWQgbGF5ZXJcbiAgY29uc3QgbmV3TGF5ZXIgPSBuZXh0U3RhdGUubGF5ZXJzW25leHRTdGF0ZS5sYXllcnMubGVuZ3RoIC0gMV07XG4gIC8vIHVwZGF0ZSBsYXllciBvcmRlciB3aXRoIG5ld0x5YWVyLmlkXG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBhcnJheUluc2VydChcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgxLCBuZXh0U3RhdGUubGF5ZXJPcmRlci5sZW5ndGgpLFxuICAgIG9yaWdpbmFsTGF5ZXJPcmRlcklkeCxcbiAgICBuZXdMYXllci5pZFxuICApO1xuXG4gIG5leHRTdGF0ZSA9IHJlb3JkZXJMYXllclVwZGF0ZXIobmV4dFN0YXRlLCB7b3JkZXI6IG5ld0xheWVyT3JkZXJ9KTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBlZmZlY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKFxuICAgIGFjdGlvbi5jb25maWc/LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGUgJiZcbiAgICBzdGF0ZS5lZmZlY3RzLnNvbWUoZWZmZWN0ID0+IGVmZmVjdC50eXBlID09PSBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlKVxuICApIHtcbiAgICBDb25zb2xlLndhcm4oYENhbid0IGFkZCBtb3JlIHRoYW4gb25lICR7TElHSFRfQU5EX1NIQURPV19FRkZFQ1QubmFtZX0gZWZmZWN0YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RWZmZWN0ID0gY3JlYXRlRWZmZWN0KGFjdGlvbi5jb25maWcpO1xuXG4gIC8vIGNvbGxhcHNlIGNvbmZpZ3VyYXRvcnMgZm9yIG90aGVyIGVmZmVjdHNcbiAgc3RhdGUuZWZmZWN0cy5mb3JFYWNoKGVmZmVjdCA9PiBlZmZlY3Quc2V0UHJvcHMoe2lzQ29uZmlnQWN0aXZlOiBmYWxzZX0pKTtcblxuICBjb25zdCBlZmZlY3RzID0gWy4uLnN0YXRlLmVmZmVjdHMsIG5ld0VmZmVjdF07XG4gIGNvbnN0IGVmZmVjdE9yZGVyID0gZml4RWZmZWN0T3JkZXIoZWZmZWN0cywgW25ld0VmZmVjdC5pZCwgLi4uc3RhdGUuZWZmZWN0T3JkZXJdKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVmZmVjdHMsXG4gICAgZWZmZWN0T3JkZXJcbiAgfTtcbn07XG5cbi8qKlxuICogcmVtb3ZlIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5lZmZlY3RzLmxlbmd0aCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCByZW1vdmUgZWZmZWN0IHdpdGggaW52YWxpZCBpZCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtlZmZlY3RzLCBlZmZlY3RPcmRlcn0gPSBzdGF0ZTtcbiAgY29uc3QgZWZmZWN0VG9SZW1vdmUgPSBlZmZlY3RzW2lkeF07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmaXhlZCBpbiB0c1xuICAgIGVmZmVjdHM6IGZpbHRlck91dEJ5SWQoZWZmZWN0VG9SZW1vdmUuaWQpKGVmZmVjdHMpLFxuICAgIGVmZmVjdE9yZGVyOiBlZmZlY3RPcmRlci5maWx0ZXIoZWZmZWN0SWQgPT4gZWZmZWN0SWQgIT09IGVmZmVjdFRvUmVtb3ZlLmlkKVxuICB9O1xufTtcblxuLyoqXG4gKiBSZW9yZGVyIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvcmRlcn06IFZpc1N0YXRlQWN0aW9ucy5SZW9yZGVyRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVmZmVjdE9yZGVyOiBmaXhFZmZlY3RPcmRlcihzdGF0ZS5lZmZlY3RzLCBbLi4ub3JkZXJdKVxufSk7XG5cbi8qKlxuICogVXBkYXRlIGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkLCBwcm9wc306IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmVmZmVjdHMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc3RhdGUuZWZmZWN0cy5sZW5ndGgpIHtcbiAgICBDb25zb2xlLndhcm4oYGNhbiBub3QgdXBkYXRlIGVmZmVjdCB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgZWZmZWN0T3JkZXIgPSBzdGF0ZS5lZmZlY3RPcmRlcjtcbiAgaWYgKHByb3BzLmlkICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuaWQgIT09IGlkKSB7XG4gICAgY29uc3QgaWR4MiA9IHN0YXRlLmVmZmVjdHMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gcHJvcHMuaWQpO1xuICAgIGlmIChpZHgyID49IDApIHtcbiAgICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgZWZmZWN0IHdpdGggZXhpc3RpbmcgZWZmZWN0IGlkICR7aWR9YCk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgZWZmZWN0T3JkZXIgPSBlZmZlY3RPcmRlci5tYXAoZWZmZWN0T3JkZXJJZCA9PlxuICAgICAgZWZmZWN0T3JkZXJJZCA9PT0gaWQgPyAocHJvcHMuaWQgYXMgc3RyaW5nKSA6IGVmZmVjdE9yZGVySWRcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbmV3RWZmZWN0cyA9IFsuLi5zdGF0ZS5lZmZlY3RzXTtcbiAgbmV3RWZmZWN0c1tpZHhdLnNldFByb3BzKHByb3BzKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVmZmVjdHM6IG5ld0VmZmVjdHMsXG4gICAgZWZmZWN0T3JkZXJcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0VXBkYXRlcjxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkYXRhc2V0czoge1tkYXRhc2V0S2V5XTogZGF0YXNldCwgLi4ubmV3RGF0YXNldHN9XG4gIH0gPSBzdGF0ZTtcblxuICBjb25zdCBsYXllcnNUb1JlbW92ZSA9IGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXRLZXkpLm1hcChsID0+IGwuaWQpO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGxldCBuZXdTdGF0ZSA9IGxheWVyc1RvUmVtb3ZlLnJlZHVjZSgoYWNjdSwgaWQpID0+IHJlbW92ZUxheWVyVXBkYXRlcihhY2N1LCB7aWR9KSwge1xuICAgIC4uLnN0YXRlLFxuICAgIGRhdGFzZXRzOiBuZXdEYXRhc2V0c1xuICB9KTtcblxuICAvLyB1cGRhdGUgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBuZXdTdGF0ZS5maWx0ZXJzKSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGZpbHRlci5kYXRhSWQuaW5kZXhPZihkYXRhc2V0S2V5KTtcbiAgICBpZiAodmFsdWVJbmRleCA+PSAwICYmIGZpbHRlci5kYXRhSWQubGVuZ3RoID4gMSkge1xuICAgICAgLy8gb25seSByZW1vdmUgb25lIHN5bmNlZCBkYXRhc2V0IGZyb20gdGhlIGZpbHRlclxuICAgICAgZmlsdGVycy5wdXNoKF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVJbmRleCA8IDApIHtcbiAgICAgIC8vIGxlYXZlIHRoZSBmaWx0ZXIgYXMgaXNcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1N0YXRlID0gey4uLm5ld1N0YXRlLCBmaWx0ZXJzfTtcblxuICByZXR1cm4gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhuZXdTdGF0ZSwge2RhdGFJZDogZGF0YXNldEtleX0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnKHN0YXRlLCB7ZGF0YUlkfSkge1xuICBsZXQge2ludGVyYWN0aW9uQ29uZmlnfSA9IHN0YXRlO1xuICBjb25zdCB7dG9vbHRpcH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcbiAgaWYgKHRvb2x0aXApIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRvb2x0aXA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHtbZGF0YUlkXTogZmllbGRzLCAuLi5maWVsZHNUb1Nob3d9ID0gY29uZmlnLmZpZWxkc1RvU2hvdztcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDogey4uLnRvb2x0aXAsIGNvbmZpZzogey4uLmNvbmZpZywgZmllbGRzVG9TaG93fX1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9O1xufVxuLyoqXG4gKiB1cGRhdGUgbGF5ZXIgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIHVwZGF0ZSBvdmVybGF5IGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBvdmVybGF5QmxlbmRpbmc6IGFjdGlvbi5tb2RlXG59KTtcblxuLyoqXG4gKiBEaXNwbGF5IGRhdGFzZXQgdGFibGUgaW4gYSBtb2RhbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNob3dEYXRhc2V0VGFibGVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdGluZ0RhdGFzZXQ6IGFjdGlvbi5kYXRhSWRcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGN1c3RvbSBjb2xvciBmb3IgZGF0YXNldHMgYW5kIGxheWVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRDb2xvclVwZGF0ZXJcbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7Y29sb3I6IGFjdGlvbi5uZXdDb2xvcn19KTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7fSwgb3B0aW9ucyA9IHt9fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKCFjb25maWcudmlzU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7a2VlcEV4aXN0aW5nQ29uZmlnfSA9IG9wdGlvbnM7XG5cbiAgLy8gcmVzZXQgY29uZmlnIGlmIGtlZXBFeGlzdGluZ0NvbmZpZyBpcyBmYWxzeVxuICBsZXQgbWVyZ2VkU3RhdGUgPSAha2VlcEV4aXN0aW5nQ29uZmlnID8gcmVzZXRNYXBDb25maWdVcGRhdGVyKHN0YXRlKSA6IHN0YXRlO1xuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBzdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBoYXNQcm9wc1RvTWVyZ2UoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCkpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKFxuICAgICAgICBtZXJnZWRTdGF0ZSxcbiAgICAgICAgZ2V0UHJvcFZhbHVlVG9NZXJnZXIoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKSxcbiAgICAgICAgLy8gZnJvbUNvbmZpZ1xuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBob3ZlciBldmVudCB3aXRoIGhvdmVyZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJIb3ZlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckhvdmVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGhvdmVySW5mbzoge1xuICAgIC8vIGRlY2suZ2wgaW5mbyBpcyBtdXRhYmxlXG4gICAgLi4uYWN0aW9uLmluZm8sXG4gICAgLi4uKE51bWJlci5pc0Zpbml0ZShhY3Rpb24ubWFwSW5kZXgpID8ge21hcEluZGV4OiBhY3Rpb24ubWFwSW5kZXh9IDoge30pXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Pbk1hcENsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG51bGxcbiAgfTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgbW92ZSBldmVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1vdXNlTW92ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2V2dH06IFZpc1N0YXRlQWN0aW9ucy5Pbk1vdXNlTW92ZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUuaW50ZXJhY3Rpb25Db25maWcpLnNvbWUoY29uZmlnID0+IGNvbmZpZy5lbmFibGVkKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1vdXNlUG9zOiB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQucG9pbnQpID8ge21vdXNlUG9zaXRpb246IFsuLi5ldnQucG9pbnRdfSA6IHt9KSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LmxuZ0xhdCkgPyB7Y29vcmRpbmF0ZTogWy4uLmV2dC5sbmdMYXRdfSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGZvciBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gIHN0YXRlLnNwbGl0TWFwcyAmJiBzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID09PSAwXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGFuIGFycmF5IHRvIHN0b3JlIHN0YXRlIGZvciBhIHNpbmdsZSBtYXAgYXMgd2VsbFxuICAgICAgICAvLyBpZiBjdXJyZW50IG1hcHMgbGVuZ3RoIGlzIGVxdWFsIHRvIDAgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3BsaXQgdGhlIHZpZXdcbiAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMoc3RhdGUubGF5ZXJzLCB7ZHVwbGljYXRlOiBmYWxzZX0pXG4gICAgICB9XG4gICAgOiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleChzdGF0ZSwgYWN0aW9uKTtcblxuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGluIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHttYXBJbmRleCwgbGF5ZXJJZH06IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckZvck1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3NwbGl0TWFwc30gPSBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogc3BsaXRNYXBzLm1hcCgoc20sIGkpID0+XG4gICAgICBpID09PSBtYXBJbmRleFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXSxcbiAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAuLi5zcGxpdE1hcHNbaV0ubGF5ZXJzLFxuICAgICAgICAgICAgICAvLyBpZiBsYXllcklkIG5vdCBpbiBsYXllcnMsIHNldCBpdCB0byB2aXNpYmxlXG4gICAgICAgICAgICAgIFtsYXllcklkXTogIXNwbGl0TWFwc1tpXS5sYXllcnNbbGF5ZXJJZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc21cbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcblxuICAvLyBhcHBseSBjb25maWcgaWYgcGFzc2VkIGZyb20gYWN0aW9uXG4gIC8vIFRPRE86IHdlIGRvbid0IGhhbmRsZSBhc3luYyBtZXJnZXJzIGhlcmUgeWV0XG4gIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBjb25maWdcbiAgICA/IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIHBheWxvYWQ6IHtjb25maWcsIG9wdGlvbnN9XG4gICAgICB9KVxuICAgIDogc3RhdGU7XG5cbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG5cbiAgY29uc3QgYWxsQ3JlYXRlRGF0YXNldHNUYXNrcyA9IGRhdGFzZXRzLm1hcChcbiAgICAoe2luZm8gPSB7fSwgLi4ucmVzdH0pID0+IGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKSB8fCB7fVxuICApO1xuICAvLyBjYWxsIGFsbCBUYXNrc1xuICBjb25zdCB0YXNrcyA9IFRhc2suYWxsU2V0dGxlZChhbGxDcmVhdGVEYXRhc2V0c1Rhc2tzKS5tYXAocmVzdWx0cyA9PlxuICAgIGNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzKHtyZXN1bHRzLCBhZGRUb01hcE9wdGlvbnM6IG9wdGlvbnN9KVxuICApO1xuXG4gIHJldHVybiB3aXRoVGFzayhwcmV2aW91c1N0YXRlLCB0YXNrcyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTmV3RGF0YXNldFN1Y2Nlc3NVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogUGF5bG9hZEFjdGlvbjxDcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1BheWxvYWQ+XG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIGNvbnNvbGUubG9nKCdjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXInLCBhY3Rpb24ucGF5bG9hZCk7XG4gIGNvbnN0IHtyZXN1bHRzLCBhZGRUb01hcE9wdGlvbnN9ID0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gcmVzdWx0cy5yZWR1Y2UoKGFjY3UsIHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJykge1xuICAgICAgY29uc3QgZGF0YXNldCA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIHJldHVybiB7Li4uYWNjdSwgW2RhdGFzZXQuaWRdOiBkYXRhc2V0fTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFuZGxlIGNyZWF0ZSBkYXRhc2V0IGVycm9yXG4gICAgICBjb25zb2xlLmVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgICAgcmV0dXJuIGFjY3U7XG4gICAgfVxuICB9LCB7fSBhcyBEYXRhc2V0cyk7XG4gIC8vIHNhdmUgbmV3IGRhdGFzZXQgZW50cnkgdG8gc3RhdGVcbiAgY29uc3QgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZGF0YXNldHM6IG1lcmdlRGF0YXNldHNCeU9yZGVyKHN0YXRlLCBuZXdEYXRhRW50cmllcylcbiAgfTtcblxuICAvLyBtZXJnZSBzdGF0ZSB3aXRoIGNvbmZpZyB0byBiZSBtZXJnZWRcbiAgY29uc3QgbGF5ZXJNZXJnZXJzID0gc3RhdGUubWVyZ2Vycy5maWx0ZXIobSA9PiBtLndhaXRGb3JMYXllckRhdGEpO1xuICBjb25zdCBkYXRhc2V0TWVyZ2VycyA9IHN0YXRlLm1lcmdlcnMuZmlsdGVyKG0gPT4gIWxheWVyTWVyZ2Vycy5pbmNsdWRlcyhtKSk7XG5cbiAgY29uc3QgbmV3RGF0YUlkcyA9IE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKTtcbiAgY29uc3QgcG9zdE1lcmdlclBheWxvYWQgPSB7XG4gICAgbmV3RGF0YUlkcyxcbiAgICBvcHRpb25zOiBhZGRUb01hcE9wdGlvbnMsXG4gICAgbGF5ZXJNZXJnZXJzXG4gIH07XG5cbiAgcmV0dXJuIGFwcGx5TWVyZ2Vyc1VwZGF0ZXIobWVyZ2VkU3RhdGUsIHttZXJnZXJzOiBkYXRhc2V0TWVyZ2VycywgcG9zdE1lcmdlclBheWxvYWR9KTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1lcmdlcnNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG1lcmdlcnM6IE1lcmdlcjxhbnk+W107XG4gICAgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkO1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHttZXJnZXJzLCBwb3N0TWVyZ2VyUGF5bG9hZH0gPSBhY3Rpb247XG5cbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IG1lcmdlU3RhdGVSZXN1bHQgPSBtZXJnZVN0YXRlRnJvbU1lcmdlcnMoXG4gICAgc3RhdGUsXG4gICAge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICAuLi5zdGF0ZS5pbml0aWFsU3RhdGVcbiAgICB9LFxuICAgIG1lcmdlcnMsXG4gICAgLy8gbmV3RGF0YUlkcyxcbiAgICBwb3N0TWVyZ2VyUGF5bG9hZFxuICApO1xuXG4gIC8vIGlmIGFsbCBtZXJnZWQsIGtpY2t1cCBwb3N0IG1lcmdlIHByb2Nlc3NcbiAgLy8gaWYgbm90IHdhaXRcbiAgcmV0dXJuIG1lcmdlU3RhdGVSZXN1bHQuYWxsTWVyZ2VkXG4gICAgPyBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlU3RhdGVSZXN1bHQubWVyZ2VkU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkKVxuICAgIDogbWVyZ2VTdGF0ZVJlc3VsdC5tZXJnZWRTdGF0ZTtcbn1cblxuLyoqXG4gKiBBZGQgbmV3IGRhdGFzZXQgdG8gYHZpc1N0YXRlYCwgd2l0aCBvcHRpb24gdG8gbG9hZCBhIG1hcCBjb25maWcgYWxvbmcgd2l0aCB0aGUgZGF0YXNldHNcbiAqL1xuZnVuY3Rpb24gcG9zdE1lcmdlVXBkYXRlcihtZXJnZWRTdGF0ZTogVmlzU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkOiBQb3N0TWVyZ2VyUGF5bG9hZCk6IFZpc1N0YXRlIHtcbiAgY29uc3Qge25ld0RhdGFJZHMsIG9wdGlvbnMsIGxheWVyTWVyZ2Vyc30gPSBwb3N0TWVyZ2VyUGF5bG9hZDtcbiAgY29uc3QgbmV3RmlsdGVycyA9IG1lcmdlZFN0YXRlLmZpbHRlcnMuZmlsdGVyKGYgPT5cbiAgICBmLmRhdGFJZC5maW5kKGZEYXRhSWQgPT4gbmV3RGF0YUlkcy5pbmNsdWRlcyhmRGF0YUlkKSlcbiAgKTtcbiAgY29uc3QgZGF0YXNldEZpbHRlcmVkOiBzdHJpbmdbXSA9IHVuaXEoXG4gICAgbmV3RmlsdGVycy5yZWR1Y2UoKGFjY3UsIGYpID0+IFsuLi5hY2N1LCAuLi5mLmRhdGFJZF0sIFtdIGFzIHN0cmluZ1tdKVxuICApO1xuICBjb25zdCBkYXRhRW1wdHkgPSBuZXdEYXRhSWRzLmxlbmd0aCA8IDE7XG5cbiAgbGV0IG5ld0xheWVycyA9ICFkYXRhRW1wdHlcbiAgICA/IG1lcmdlZFN0YXRlLmxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgJiYgbmV3RGF0YUlkcy5pbmNsdWRlcyhsLmNvbmZpZy5kYXRhSWQpKVxuICAgIDogW107XG5cbiAgY29uc3QgbmV3RGF0YUVudHJpZXMgPSBuZXdEYXRhSWRzLnJlZHVjZShcbiAgICAoYWNjdSwgaWQpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2lkXTogbWVyZ2VkU3RhdGUuZGF0YXNldHNbaWRdXG4gICAgfSksXG4gICAge31cbiAgKTtcblxuICBpZiAoIW5ld0xheWVycy5sZW5ndGggJiYgKG9wdGlvbnMgfHwge30pLmF1dG9DcmVhdGVMYXllcnMgIT09IGZhbHNlKSB7XG4gICAgLy8gbm8gbGF5ZXIgbWVyZ2VkLCBmaW5kIGRlZmF1bHRzXG4gICAgY29uc3QgcmVzdWx0ID0gYWRkRGVmYXVsdExheWVycyhtZXJnZWRTdGF0ZSwgbmV3RGF0YUVudHJpZXMpO1xuICAgIG1lcmdlZFN0YXRlID0gcmVzdWx0LnN0YXRlO1xuICAgIG5ld0xheWVycyA9IHJlc3VsdC5uZXdMYXllcnM7XG4gIH1cblxuICBpZiAobWVyZ2VkU3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIC8vIGlmIG1hcCBpcyBzcGxpdCwgYWRkIG5ldyBsYXllcnMgdG8gc3BsaXRNYXBzXG4gICAgbmV3TGF5ZXJzID0gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihcbiAgICAgIGwgPT4gbC5jb25maWcuZGF0YUlkICYmIG5ld0RhdGFJZHMuaW5jbHVkZXMobC5jb25maWcuZGF0YUlkKVxuICAgICk7XG4gICAgbWVyZ2VkU3RhdGUgPSB7XG4gICAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVycylcbiAgICB9O1xuICB9XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIG5ld0RhdGFJZHMuZm9yRWFjaChkYXRhSWQgPT4ge1xuICAgIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBtZXJnZWRTdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICAvLyBsb2FkaW5nIGRhdGFzZXQ6IGF1dG9DcmVhdGVUb29sdGlwcyBpcyBmYWxzZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBydW4gYWRkRGVmYXVsdFRvb2x0aXBzIHdoZW4gdG9vbHRpcEZpZWxkcyBpcyBlbXB0eVxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmF1dG9DcmVhdGVUb29sdGlwcyAhPT0gZmFsc2UgJiZcbiAgICAgICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICAvLyBhZGRpbmcgZGF0YXNldDogYXV0b0NyZWF0ZVRvb2x0aXBzIGlzIHRydWVcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZWREYXRhc2V0cyA9IGRhdGFFbXB0eVxuICAgID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpXG4gICAgOiB1bmlxKE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5jb25jYXQoZGF0YXNldEZpbHRlcmVkKSk7XG5cbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShtZXJnZWRTdGF0ZSwgdXBkYXRlZERhdGFzZXRzLCB1bmRlZmluZWQpO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICAvLyB0cnkgdG8gcHJvY2VzcyBsYXllck1lcmdlcnMgYWZ0ZXIgZGF0YXNldCtkYXRhc2V0TWVyZ2Vyc1xuICB1cGRhdGVkU3RhdGUgPVxuICAgIGxheWVyTWVyZ2VycyAmJiBsYXllck1lcmdlcnMubGVuZ3RoID4gMFxuICAgICAgPyBhcHBseU1lcmdlcnNVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwge1xuICAgICAgICAgIG1lcmdlcnM6IGxheWVyTWVyZ2VycyxcbiAgICAgICAgICBwb3N0TWVyZ2VyUGF5bG9hZDogey4uLnBvc3RNZXJnZXJQYXlsb2FkLCBsYXllck1lcmdlcnM6IFtdfVxuICAgICAgICB9KVxuICAgICAgOiB1cGRhdGVkU3RhdGU7XG5cbiAgLy8gY2VudGVyIHRoZSBtYXAgb25jZSB0aGUgZGF0YXNldCBpcyBjcmVhdGVkXG4gIGlmIChuZXdMYXllcnMubGVuZ3RoICYmIChvcHRpb25zIHx8IHt9KS5jZW50ZXJNYXApIHtcbiAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKG5ld0xheWVycyk7XG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgY29uc3QgZml0Qm91bmRzVGFzayA9IEFDVElPTl9UQVNLKCkubWFwKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpdE1hcEJvdW5kcyhib3VuZHMpO1xuICAgICAgfSk7XG4gICAgICB1cGRhdGVkU3RhdGUgPSB3aXRoVGFzayh1cGRhdGVkU3RhdGUsIGZpdEJvdW5kc1Rhc2spO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVkU3RhdGU7XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZURhdGFzZXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbmFtZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBwcm9wczoge2xhYmVsOiBhY3Rpb24ubGFiZWx9fSk7XG59XG5cbmNvbnN0IEFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMgPSBbJ2xhYmVsJywgJ2NvbG9yJywgJ21ldGFkYXRhJ107XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBkYXRhc2V0LlxuICogTWFrZXMgc3VyZSBlYWNoIHByb3BlcnR5IGlzIGluIHRoZSBhbGxvd2VkIGxpc3RcbiAqIE1ha2VzIHN1cmUgY29sb3IgdmFsdWUgaXMgUkdCXG4gKiBQZXJmb3JtcyBkZWVwIG1lcmdlIHdoZW4gdXBkYXRpbmcgbWV0YWRhdGFcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMgPSAocHJvcHMsIGRhdGFzZXQpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgLy8gaXMgaXQgYWxsb3dlZCA/XG4gICAgaWYgKCFBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGFkZGluZyBhIGNvbG9yIGJ1dCBpdCBpcyBub3QgUkdCIHdlIGRvbid0IGFjY2VwdCB0aGUgdmFsdWVcbiAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIHdlIGFkZCBtb3JlIHByb3BzIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyBpZiBpbnRvIGEgc3dpdGNoXG4gICAgaWYgKGtleSA9PT0gJ2NvbG9yJyAmJiAhaXNSZ2JDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gZG8gd2UgbmVlZCBkZWVwIG1lcmdlID9cbiAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGlzUGxhaW5PYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGRhdGFzZXRba2V5XSB8fCB7fSwgdmFsdWUpIDogdmFsdWV9O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlZFByb3BzO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgRGF0YXNldCBwcm9wcyAobGFiZWwsIGNvbG9yLCBtZXRhKS4gRG8gbm90IHVzZSB0byB1cGRhdGUgZGF0YSBvciBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtkYXRhSWQsIHByb3BzfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuICBjb25zdCBleGlzdGluZyA9IGRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyhwcm9wcywgZXhpc3RpbmcpO1xuICAgIC8vICB2YWxpZGF0ZSBwcm9wczoganVzdCBjb2xvciBmb3Igbm93XG4gICAgLy8gIHdlIG9ubHkgYWxsb3cgbGFiZWwsIGNvbG9yIGFuZCBtZXRhIHRvIGJlIHVwZGF0ZWRcbiAgICAvLyBjb25zdCBuZXdUYWJsZSA9IGNvcHlUYWJsZUFuZFVwZGF0ZShleGlzdGluZywgdmFsaWRhdGVkUHJvcHMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcylcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFdoZW4gYSB1c2VyIGNsaWNrcyBvbiB0aGUgc3BlY2lmaWMgbWFwIGNsb3NpbmcgaWNvblxuICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2xvc2UgdGhlIHNlbGVjdGVkIG1hcFxuICogYW5kIHdpbGwgbWVyZ2UgdGhlIHJlbWFpbmluZyBvbmUgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlXG4gKiBUT0RPOiBpIHRoaW5rIGluIHRoZSBmdXR1cmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBtZXJnZSBtYXAgbGF5ZXJzIHdpdGggZ2xvYmFsIHNldHRpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgYHZpc1N0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBhY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VTcGVjaWZpY01hcEF0SW5kZXg8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIC8vIHJldHJpZXZlIGxheWVycyBtZXRhIGRhdGEgZnJvbSB0aGUgcmVtYWluaW5nIG1hcCB0aGF0IHdlIG5lZWQgdG8ga2VlcFxuICBjb25zdCBpbmRleFRvUmV0cmlldmUgPSAxIC0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG1hcExheWVycyA9IHN0YXRlLnNwbGl0TWFwc1tpbmRleFRvUmV0cmlldmVdPy5sYXllcnM7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG5cbiAgLy8gdXBkYXRlIGxheWVyIHZpc2liaWxpdHlcbiAgY29uc3QgbmV3TGF5ZXJzID0gbGF5ZXJzLm1hcChsYXllciA9PlxuICAgIG1hcExheWVycyAmJiAhbWFwTGF5ZXJzW2xheWVyLmlkXSAmJiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBpdCBzaG91bGQgYmUgaW5WaXNpYmxlXG4gICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgOiBsYXllclxuICApO1xuXG4gIC8vIGRlbGV0ZSBtYXBcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBzcGxpdE1hcHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtmaWxlcywgb25GaW5pc2ggPSBsb2FkRmlsZXNTdWNjZXNzfSA9IGFjdGlvbjtcbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWxlTG9hZGluZ1Byb2dyZXNzID0gQXJyYXkuZnJvbShmaWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBmLCBpKSA9PiBtZXJnZV8oaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZiwgaSkpKGFjY3UpLFxuICAgIHt9XG4gICk7XG5cbiAgY29uc3QgZmlsZUxvYWRpbmcgPSB7XG4gICAgZmlsZUNhY2hlOiBbXSxcbiAgICBmaWxlc1RvTG9hZDogZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBtZXJnZV8oe2ZpbGVMb2FkaW5nUHJvZ3Jlc3MsIGZpbGVMb2FkaW5nfSkoc3RhdGUpO1xuXG4gIHJldHVybiBsb2FkTmV4dEZpbGVVcGRhdGVyKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFN1Y2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZVN0ZXBTdWNjZXNzQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVOYW1lLCBmaWxlQ2FjaGV9ID0gYWN0aW9uO1xuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNofSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAxLCBtZXNzYWdlOiAnRG9uZSd9XG4gIH0pO1xuXG4gIC8vIHNhdmUgcHJvY2Vzc2VkIGZpbGUgdG8gZmlsZUNhY2hlXG4gIGNvbnN0IHN0YXRlV2l0aENhY2hlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlQ2FjaGV9KSkoc3RhdGVXaXRoUHJvZ3Jlc3MpO1xuXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBzdGF0ZVdpdGhDYWNoZSxcbiAgICBERUxBWV9UQVNLKDIwMCkubWFwKGZpbGVzVG9Mb2FkLmxlbmd0aCA/IGxvYWROZXh0RmlsZSA6ICgpID0+IG9uRmluaXNoKGZpbGVDYWNoZSkpXG4gICk7XG59XG5cbi8vIHdpdGhUYXNrPFQ+KHN0YXRlOiBULCB0YXNrOiBhbnkpOiBUXG5cbi8qKlxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTmV4dEZpbGVVcGRhdGVyKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWR9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IFtmaWxlLCAuLi5yZW1haW5pbmdGaWxlc1RvTG9hZF0gPSBmaWxlc1RvTG9hZDtcblxuICAvLyBzYXZlIGZpbGVzVG9Mb2FkIHRvIHN0YXRlXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHBpY2tfKCdmaWxlTG9hZGluZycpKG1lcmdlXyh7ZmlsZXNUb0xvYWQ6IHJlbWFpbmluZ0ZpbGVzVG9Mb2FkfSkpKHN0YXRlKTtcblxuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKG5leHRTdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAwLCBtZXNzYWdlOiAnbG9hZGluZy4uLid9XG4gIH0pO1xuXG4gIGNvbnN0IHtsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBzdGF0ZTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIG1ha2VMb2FkRmlsZVRhc2soXG4gICAgICBmaWxlLFxuICAgICAgbmV4dFN0YXRlLmZpbGVMb2FkaW5nICYmIG5leHRTdGF0ZS5maWxlTG9hZGluZy5maWxlQ2FjaGUsXG4gICAgICBsb2FkZXJzLFxuICAgICAgbG9hZE9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9hZEZpbGVUYXNrKGZpbGUsIGZpbGVDYWNoZSwgbG9hZGVyczogTG9hZGVyW10gPSBbXSwgbG9hZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gTE9BRF9GSUxFX1RBU0soe2ZpbGUsIGZpbGVDYWNoZSwgbG9hZGVycywgbG9hZE9wdGlvbnN9KS5iaW1hcChcbiAgICAvLyBwcmV0dGllciBpZ25vcmVcbiAgICAvLyBzdWNjZXNzXG4gICAgZ2VuID0+XG4gICAgICBuZXh0RmlsZUJhdGNoKHtcbiAgICAgICAgZ2VuLFxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBvbkZpbmlzaDogcmVzdWx0ID0+XG4gICAgICAgICAgcHJvY2Vzc0ZpbGVDb250ZW50KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGZpbGVDYWNoZVxuICAgICAgICAgIH0pXG4gICAgICB9KSxcblxuICAgIC8vIGVycm9yXG4gICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlLm5hbWUsIGVycilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29udGVudCwgZmlsZUNhY2hlfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdwcm9jZXNzaW5nLi4uJ31cbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFBST0NFU1NfRklMRV9EQVRBKHtjb250ZW50LCBmaWxlQ2FjaGV9KS5iaW1hcChcbiAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSwgZmlsZUNhY2hlOiByZXN1bHR9KSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoY29udGVudC5maWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvZ3Jlc3MocHJldlByb2dyZXNzID0ge30sIHByb2dyZXNzKSB7XG4gIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlY2VpdmluZyBxdWVyeSBtZXRhZGF0YSBvciBvdGhlciBjYXNlcyB3ZSBkb24ndFxuICAvLyBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhlIHVzZXIuXG4gIGlmICghcHJvZ3Jlc3MgfHwgIXByb2dyZXNzLnBlcmNlbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmNlbnQ6IHByb2dyZXNzLnBlcmNlbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBnZXRzIGNhbGxlZCB3aXRoIHBheWxvYWQgPSBBc3luY0dlbmVyYXRvcjw/Pz8+XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbmV4dEZpbGVCYXRjaFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtnZW4sIGZpbGVOYW1lLCBwcm9ncmVzcywgYWNjdW11bGF0ZWQsIG9uRmluaXNofVxuICB9OiBWaXNTdGF0ZUFjdGlvbnMuTmV4dEZpbGVCYXRjaFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiBwYXJzZVByb2dyZXNzKHN0YXRlLmZpbGVMb2FkaW5nUHJvZ3Jlc3NbZmlsZU5hbWVdLCBwcm9ncmVzcylcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKHN0YXRlV2l0aFByb2dyZXNzLCBbXG4gICAgLi4uKGZpbGVOYW1lLmVuZHNXaXRoKCdhcnJvdycpICYmIGFjY3VtdWxhdGVkPy5kYXRhPy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICBQUk9DRVNTX0ZJTEVfREFUQSh7Y29udGVudDogYWNjdW11bGF0ZWQsIGZpbGVDYWNoZTogW119KS5iaW1hcChcbiAgICAgICAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCksXG4gICAgICAgICAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnIpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICBVTldSQVBfVEFTSyhnZW4ubmV4dCgpKS5iaW1hcChcbiAgICAgICh7dmFsdWUsIGRvbmV9KSA9PiB7XG4gICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgPyBvbkZpbmlzaChhY2N1bXVsYXRlZClcbiAgICAgICAgICA6IG5leHRGaWxlQmF0Y2goe1xuICAgICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICBwcm9ncmVzczogdmFsdWUucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgb25GaW5pc2hcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycilcbiAgICApXG4gIF0pO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxvYWRpbmcgZmlsZSBlcnJvclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2Vycm9yLCBmaWxlTmFtZX06IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIHVwZGF0ZSB1aSB3aXRoIGVycm9yIG1lc3NhZ2VcbiAgQ29uc29sZS53YXJuKGVycm9yKTtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNoLCBmaWxlQ2FjaGV9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge2Vycm9yfVxuICB9KTtcblxuICAvLyBraWNrIG9mZiBuZXh0IGZpbGUgb3IgZmluaXNoXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBuZXh0U3RhdGUsXG4gICAgREVMQVlfVEFTSygyMDApLm1hcChmaWxlc1RvTG9hZC5sZW5ndGggPyBsb2FkTmV4dEZpbGUgOiAoKSA9PiBvbkZpbmlzaChmaWxlQ2FjaGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBXaGVuIHNlbGVjdCBkYXRhc2V0IGZvciBleHBvcnQsIGFwcGx5IGNwdSBmaWx0ZXIgdG8gc2VsZWN0ZWQgZGF0YXNldFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q1BVRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkfTogVmlzU3RhdGVBY3Rpb25zLkFwcGx5Q1BVRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhcHBseSBjcHVGaWx0ZXJcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICByZXR1cm4gZGF0YUlkcy5yZWR1Y2UoKGFjY3UsIGlkKSA9PiBmaWx0ZXJEYXRhc2V0Q1BVKGFjY3UsIGlkKSwgc3RhdGUpO1xufTtcblxuLyoqXG4gKiBVc2VyIGlucHV0IHRvIHVwZGF0ZSB0aGUgaW5mbyBvZiB0aGUgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwSW5mb1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0TWFwSW5mb1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBJbmZvOiB7XG4gICAgLi4uc3RhdGUubWFwSW5mbyxcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbGwgbGF5ZXIgZG9tYWluIGFuZCBsYXllciBkYXRhIG9mIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0TGF5ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0c1xuKToge3N0YXRlOiBWaXNTdGF0ZTsgbmV3TGF5ZXJzOiBMYXllcltdfSB7XG4gIGNvbnN0IGVtcHR5OiBMYXllcltdID0gW107XG4gIGNvbnN0IGRlZmF1bHRMYXllcnMgPSBPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5yZWR1Y2UoKGFjY3U6IExheWVyW10sIGRhdGFzZXQpID0+IHtcbiAgICBjb25zdCBmb3VuZExheWVycyA9IGZpbmREZWZhdWx0TGF5ZXIoZGF0YXNldCwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgICByZXR1cm4gZm91bmRMYXllcnMgJiYgZm91bmRMYXllcnMubGVuZ3RoID8gYWNjdS5jb25jYXQoZm91bmRMYXllcnMpIDogYWNjdTtcbiAgfSwgZW1wdHkpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCAuLi5kZWZhdWx0TGF5ZXJzXSxcbiAgICAgIGxheWVyT3JkZXI6IFtcbiAgICAgICAgLy8gcHV0IG5ldyBsYXllcnMgb24gdG9wIG9mIG9sZCBvbmVzIGluIHJldmVyc2VcbiAgICAgICAgLi4uZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMoZGVmYXVsdExheWVycyksXG4gICAgICAgIC4uLnN0YXRlLmxheWVyT3JkZXJcbiAgICAgIF1cbiAgICB9LFxuICAgIG5ld0xheWVyczogZGVmYXVsdExheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRlZmF1bHQgdG9vbHRpcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFRvb2x0aXBzKHN0YXRlLCBkYXRhc2V0KSB7XG4gIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBmaW5kRmllbGRzVG9TaG93KHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIG1heERlZmF1bHRUb29sdGlwczogc3RhdGUubWF4RGVmYXVsdFRvb2x0aXBzXG4gIH0pO1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93LFxuICAgIC4uLnRvb2x0aXBGaWVsZHNcbiAgfTtcblxuICByZXR1cm4gc2V0KFsnaW50ZXJhY3Rpb25Db25maWcnLCAndG9vbHRpcCcsICdjb25maWcnLCAnZmllbGRzVG9TaG93J10sIG1lcmdlZCwgc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZmlsZSwgaW5kZXgpIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgYFVudGl0bGVkIEZpbGUgJHtpbmRleH1gO1xuICByZXR1cm4ge1xuICAgIFtmaWxlTmFtZV06IHtcbiAgICAgIC8vIHBlcmNlbnQgb2YgY3VycmVudCBmaWxlXG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtmaWxlTmFtZSwgcHJvZ3Jlc3N9KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIHBpY2tfKCdmaWxlTG9hZGluZ1Byb2dyZXNzJykocGlja18oZmlsZU5hbWUpKG1lcmdlXyhwcm9ncmVzcykpKShzdGF0ZSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgbGF5ZXIgZG9tYWlucyBmb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YTxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogUyB7XG4gIGNvbnN0IGRhdGFJZHMgPSB0eXBlb2YgZGF0YUlkID09PSAnc3RyaW5nJyA/IFtkYXRhSWRdIDogZGF0YUlkO1xuICBjb25zdCBuZXdMYXllcnM6IExheWVyW10gPSBbXTtcbiAgY29uc3QgbmV3TGF5ZXJEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHN0YXRlLmxheWVycy5mb3JFYWNoKChvbGRMYXllciwgaSkgPT4ge1xuICAgIGlmIChvbGRMYXllci5jb25maWcuZGF0YUlkICYmIGRhdGFJZHMuaW5jbHVkZXMob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGF5ZXIgZG9tYWluIGlmIGZpbHRlciBoYXMgZml4ZWQgZG9tYWluXG4gICAgICBjb25zdCBuZXdMYXllciA9XG4gICAgICAgIHVwZGF0ZWRGaWx0ZXIgJiYgdXBkYXRlZEZpbHRlci5maXhlZERvbWFpblxuICAgICAgICAgID8gb2xkTGF5ZXJcbiAgICAgICAgICA6IG9sZExheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzLCB1cGRhdGVkRmlsdGVyKTtcblxuICAgICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgc3RhdGUubGF5ZXJEYXRhW2ldKTtcblxuICAgICAgbmV3TGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2gobGF5ZXJEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXJzLnB1c2gob2xkTGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2goc3RhdGUubGF5ZXJEYXRhW2ldKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIGxheWVyRGF0YTogbmV3TGF5ZXJEYXRhXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uRG9tYWluPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcbiAgLy8gbWVyZ2UgYWxsIGFuaW1hdGFibGUgbGF5ZXIgZG9tYWluIGFuZCB1cGRhdGUgZ2xvYmFsIGNvbmZpZ1xuICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMoc3RhdGUubGF5ZXJzKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBpc0FuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHRpbWVTdGVwczogbnVsbCxcbiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF5ZXJEb21haW5zID0gYW5pbWF0YWJsZUxheWVycy5tYXAobCA9PiBsLmNvbmZpZy5hbmltYXRpb24uZG9tYWluIHx8IFtdKTtcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBtZXJnZWREb21haW4gPSBtZXJnZVRpbWVEb21haW5zKGxheWVyRG9tYWlucyk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgLy8gbWVyZ2UgdGltZVN0ZXBzXG4gIGxldCBtZXJnZWRUaW1lU3RlcHM6IG51bWJlcltdIHwgbnVsbCA9IHVuaXE8bnVtYmVyPihcbiAgICBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZSgoYWNjdSwgbGF5ZXIpID0+IHtcbiAgICAgIGFjY3UucHVzaCguLi4obGF5ZXIuY29uZmlnLmFuaW1hdGlvbi50aW1lU3RlcHMgfHwgW10pKTtcbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH0sIFtdKVxuICApLnNvcnQoKTtcblxuICBtZXJnZWRUaW1lU3RlcHMgPSBtZXJnZWRUaW1lU3RlcHMubGVuZ3RoID8gbWVyZ2VkVGltZVN0ZXBzIDogbnVsbDtcblxuICAvLyBUT0RPOiBiZXR0ZXIgaGFuZGxpbmcgb2YgZHVyYXRpb24gY2FsY3VsYXRpb25cbiAgY29uc3QgZHVyYXRpb24gPSBtZXJnZWRUaW1lU3RlcHNcbiAgICA/IChCQVNFX1NQRUVEICogKDEwMDAgLyBGUFMpKSAvIG1lcmdlZFRpbWVTdGVwcy5sZW5ndGggLyAoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnNwZWVkIHx8IDEpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGRvbWFpbjogbWVyZ2VkRG9tYWluLFxuICAgICAgZGVmYXVsdFRpbWVGb3JtYXQsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIHRpbWVTdGVwczogbWVyZ2VkVGltZVN0ZXBzXG4gICAgfVxuICB9O1xuXG4gIC8vIHJlc2V0IGN1cnJlbnRUaW1lIGJhc2VkIG9uIG5ldyBkb21haW5cbiAgY29uc3Qgc3luY2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycz8uZmluZChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIGFzXG4gICAgfCBUaW1lUmFuZ2VGaWx0ZXJcbiAgICB8IHVuZGVmaW5lZDtcblxuICAvLyBpZiBzeW5jZWQgZmlsdGVyIGV4aXN0IHdlZSBuZWVkIHRvIG1lcmdlIGFuaW1hdGlvbkNvbmZpZyBhbmQgZmlsdGVyIGRvbWFpbnNcbiAgLy8gYW5kIHZhbGlkYXRlIHRoZSBjdXJyZW50IHRpbWUgYWdhaW5zdCB0aGUgbmV3IG1lcmdlZCBkb21haW5cbiAgY29uc3QgbmV3QW5pbWF0aW9uRG9tYWluID0gc3luY2VkRmlsdGVyXG4gICAgPyBtZXJnZVRpbWVEb21haW5zKFttZXJnZWREb21haW4sIHN5bmNlZEZpbHRlci5kb21haW5dKVxuICAgIDogbWVyZ2VkRG9tYWluO1xuICBjb25zdCBjdXJyZW50VGltZSA9IGlzSW5SYW5nZShzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWUsIG5ld0FuaW1hdGlvbkRvbWFpbilcbiAgICA/IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgIDogbmV3QW5pbWF0aW9uRG9tYWluWzBdO1xuXG4gIGlmIChjdXJyZW50VGltZSAhPT0gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKSB7XG4gICAgLy8gaWYgY3VycmVudFRpbWUgY2hhbmdlZCwgbmVlZCB0byBjYWxsIGFuaW1hdGlvblRpbWVVcGRhdGVyIHRvIHJlIGNhbGwgZm9ybWF0TGF5ZXJEYXRhXG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV4dFN0YXRlLCB7dmFsdWU6IGN1cnJlbnRUaW1lfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0b3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFZGl0b3JNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7bW9kZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRFZGl0b3JNb2RlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVkaXRvcjoge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBtb2RlLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9XG59KTtcblxuLy8gY29uc3QgZmVhdHVyZVRvRmlsdGVyVmFsdWUgPSAoZmVhdHVyZSkgPT4gKHsuLi5mZWF0dXJlLCBpZDogZmVhdHVyZS5pZH0pO1xuLyoqXG4gKiBVcGRhdGUgZWRpdG9yIGZlYXR1cmVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlcyA9IFtdfTogVmlzU3RhdGVBY3Rpb25zLlNldEZlYXR1cmVzVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBsYXN0RmVhdHVyZSA9IGZlYXR1cmVzLmxlbmd0aCAmJiBmZWF0dXJlc1tmZWF0dXJlcy5sZW5ndGggLSAxXTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIC8vIG9ubHkgc2F2ZSBub25lIGZpbHRlciBmZWF0dXJlcyB0byBlZGl0b3JcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5maWx0ZXIoZiA9PiAhZ2V0RmlsdGVySWRJbkZlYXR1cmUoZikpLFxuICAgICAgbW9kZTogbGFzdEZlYXR1cmUgJiYgbGFzdEZlYXR1cmUucHJvcGVydGllcy5pc0Nsb3NlZCA/IEVESVRPUl9NT0RFUy5FRElUIDogc3RhdGUuZWRpdG9yLm1vZGVcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgZXhpc3RpbmcgZmVhdHVyZVxuICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHN0YXRlLmVkaXRvcjtcblxuICAvLyBJZiBubyBmZWF0dXJlIGlzIHNlbGVjdGVkIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHNpbmNlIG5vIG9wZXJhdGlvbnNcbiAgaWYgKCFzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZmVhdHVyZSBoYXMgY2hhbmdlZFxuICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZS5pZCk7XG5cbiAgLy8gaWYgZmVhdHVyZSBpcyBwYXJ0IG9mIGEgZmlsdGVyXG4gIGNvbnN0IGZpbHRlcklkID0gZmVhdHVyZSAmJiBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcbiAgaWYgKGZpbHRlcklkICYmIGZlYXR1cmUpIHtcbiAgICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICAgIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZlYXR1cmUsIGZpbHRlcklkKTtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmaWwgPT4gZmlsLmlkID09PSBmaWx0ZXJJZCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogZmVhdHVyZVZhbHVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGZlYXR1cmVcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmUsIHNlbGVjdGlvbkNvbnRleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gIGlmIChmZWF0dXJlICYmIGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBmZWF0dXJlLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dFxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogRGVsZXRlIGV4aXN0aW5nIGZlYXR1cmUgZnJvbSBmaWx0ZXJzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmVhdHVyZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmV9OiBWaXNTdGF0ZUFjdGlvbnMuRGVsZXRlRmVhdHVyZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFmZWF0dXJlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICB9XG4gIH07XG5cbiAgaWYgKGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKSB7XG4gICAgY29uc3QgZmlsdGVySWR4ID0gbmV3U3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKSk7XG5cbiAgICByZXR1cm4gZmlsdGVySWR4ID4gLTEgPyByZW1vdmVGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJZHh9KSA6IG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gbW9kaWZ5IGVkaXRvciBvYmplY3RcbiAgY29uc3QgbmV3RWRpdG9yID0ge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiBuZXdFZGl0b3JcbiAgfTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgZmVhdHVyZSBhcyBsYXllciBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHBheWxvYWQ6IFZpc1N0YXRlQWN0aW9ucy5TZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtsYXllciwgZmVhdHVyZX0gPSBwYXlsb2FkO1xuICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpO1xuXG4gIC8vIGxldCBuZXdGaWx0ZXIgPSBudWxsO1xuICBsZXQgZmlsdGVySWR4O1xuICBsZXQgbmV3TGF5ZXJJZCA9IFtsYXllci5pZF07XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAvLyBJZiBwb2x5Z29uIGZpbHRlciBhbHJlYWR5IGV4aXN0cywgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGUgY3VycmVudCBsYXllciBpcyBhbHJlYWR5IGluY2x1ZGVkXG4gIGlmIChmaWx0ZXJJZCkge1xuICAgIGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuXG4gICAgaWYgKCFzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0pIHtcbiAgICAgIC8vIHdoYXQgaWYgZmlsdGVyIGRvZXNuJ3QgZXhpc3Q/Li4uIG5vdCBwb3NzaWJsZS5cbiAgICAgIC8vIGJlY2F1c2UgZmVhdHVyZXMgaW4gdGhlIGVkaXRvciBpcyBwYXNzZWQgaW4gZnJvbSBmaWx0ZXJzIGFuZCBlZGl0b3JzLlxuICAgICAgLy8gYnV0IHdlIHdpbGwgbW92ZSB0aGlzIGZlYXR1cmUgYmFjayB0byBlZGl0b3IganVzdCBpbiBjYXNlXG4gICAgICBjb25zdCBub25lRmlsdGVyRmVhdHVyZSA9IHtcbiAgICAgICAgLi4uZmVhdHVyZSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLmZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICBmaWx0ZXJJZDogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZWRpdG9yOiB7XG4gICAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICAgIGZlYXR1cmVzOiBbLi4uc3RhdGUuZWRpdG9yLmZlYXR1cmVzLCBub25lRmlsdGVyRmVhdHVyZV0sXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBub25lRmlsdGVyRmVhdHVyZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gICAgY29uc3Qge2xheWVySWQgPSBbXX0gPSBmaWx0ZXI7XG4gICAgY29uc3QgaXNMYXllckluY2x1ZGVkID0gbGF5ZXJJZC5pbmNsdWRlcyhsYXllci5pZCk7XG5cbiAgICBuZXdMYXllcklkID0gaXNMYXllckluY2x1ZGVkXG4gICAgICA/IC8vIGlmIGxheWVyIGlzIGluY2x1ZGVkLCByZW1vdmUgaXRcbiAgICAgICAgbGF5ZXJJZC5maWx0ZXIobCA9PiBsICE9PSBsYXllci5pZClcbiAgICAgIDogWy4uLmxheWVySWQsIGxheWVyLmlkXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGNyZWF0ZSB0aGUgcG9seWdvbiBmaWx0ZXIsIGNyZWF0ZSBpdFxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IGdlbmVyYXRlUG9seWdvbkZpbHRlcihbXSwgZmVhdHVyZSk7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5sZW5ndGg7XG5cbiAgICAvLyBhZGQgZmVhdHVyZSwgcmVtb3ZlIGZlYXR1cmUgZnJvbSBlaWR0b3JcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIG5ld0ZpbHRlcl0sXG4gICAgICBlZGl0b3I6IHtcbiAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5ld0ZpbHRlci52YWx1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogZmlsdGVySWR4LFxuICAgIHByb3A6ICdsYXllcklkJyxcbiAgICB2YWx1ZTogbmV3TGF5ZXJJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydFRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW4sIG1vZGV9OiBWaXNTdGF0ZUFjdGlvbnMuU29ydFRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBzb3J0TW9kZSA9IG1vZGU7XG4gIGlmICghc29ydE1vZGUpIHtcbiAgICBjb25zdCBjdXJyZW50TW9kZSA9IGdldChkYXRhc2V0LCBbJ3NvcnRDb2x1bW4nLCBjb2x1bW5dKTtcbiAgICAvLyBAdHMtaWdub3JlIC0gc2hvdWxkIGJlIGZpeGFibGUgaW4gYSBUUyBmaWxlXG4gICAgc29ydE1vZGUgPSBjdXJyZW50TW9kZVxuICAgICAgPyBPYmplY3Qua2V5cyhTT1JUX09SREVSKS5maW5kKG0gPT4gbSAhPT0gY3VycmVudE1vZGUpXG4gICAgICA6IFNPUlRfT1JERVIuQVNDRU5ESU5HO1xuICB9XG5cbiAgY29uc3Qgc29ydGVkID0gc29ydERhdGFzZXRCeUNvbHVtbihkYXRhc2V0LCBjb2x1bW4sIHNvcnRNb2RlKTtcbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgc29ydGVkLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpblRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW59OiBWaXNTdGF0ZUFjdGlvbnMuUGluVGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgbmV3RGF0YXNldCA9IHBpblRhYmxlQ29sdW1ucyhkYXRhc2V0LCBjb2x1bW4pO1xuXG4gIHJldHVybiBzZXQoWydkYXRhc2V0cycsIGRhdGFJZF0sIG5ld0RhdGFzZXQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBDb3B5IGNvbHVtbiBjb250ZW50IGFzIHN0cmluZ3NcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5Db3B5VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgZmllbGRJZHggPSBkYXRhc2V0LmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGNvbHVtbik7XG4gIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge3R5cGV9ID0gZGF0YXNldC5maWVsZHNbZmllbGRJZHhdO1xuICBjb25zdCB0ZXh0ID0gZGF0YXNldC5kYXRhQ29udGFpbmVyXG4gICAgLm1hcChyb3cgPT4gcGFyc2VGaWVsZFZhbHVlKHJvdy52YWx1ZUF0KGZpZWxkSWR4KSwgdHlwZSksIHRydWUpXG4gICAgLmpvaW4oJ1xcbicpO1xuXG4gIGNvcHkodGV4dCk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFNldCBkaXNwbGF5IGZvcm1hdCBmcm9tIGNvbHVtbnMgZnJvbSB1c2VyIHNlbGVjdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbHVtbkRpc3BsYXlGb3JtYXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGZvcm1hdHN9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3RmllbGRzID0gZGF0YXNldC5maWVsZHM7XG4gIE9iamVjdC5rZXlzKGZvcm1hdHMpLmZvckVhY2goY29sdW1uID0+IHtcbiAgICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgICBpZiAoZmllbGRJZHggPj0gMCkge1xuICAgICAgY29uc3QgZGlzcGxheUZvcm1hdCA9IGZvcm1hdHNbY29sdW1uXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gbmV3RmllbGRzW2ZpZWxkSWR4XTtcbiAgICAgIG5ld0ZpZWxkcyA9IHN3YXBfKG1lcmdlXyh7ZGlzcGxheUZvcm1hdH0pKGZpZWxkKSBhcyB7aWQ6IHN0cmluZ30pKFxuICAgICAgICBuZXdGaWVsZHMgYXMge2lkOiBzdHJpbmd9W11cbiAgICAgICkgYXMgRmllbGRbXTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld0RhdGFzZXQgPSBjb3B5VGFibGVBbmRVcGRhdGUoZGF0YXNldCwge2ZpZWxkczogbmV3RmllbGRzIGFzIEZpZWxkW119KTtcbiAgcmV0dXJuIHBpY2tfKCdkYXRhc2V0cycpKG1lcmdlXyh7W2RhdGFJZF06IG5ld0RhdGFzZXR9KSkoc3RhdGUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBlZGl0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHVwZGF0ZXMgPSBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZyk7XG4gIHJldHVybiBwaWNrXygnYW5pbWF0aW9uQ29uZmlnJykobWVyZ2VfKHVwZGF0ZXMpKShzdGF0ZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2V2ZW50LCBsYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IHtpZDogZGVja2dsTGF5ZXJJZCwgY291bnR9ID0gZXZlbnQ7XG4gIGlmICghbGF5ZXIpIHtcbiAgICBDb25zb2xlLndhcm4oYGxheWVyRmlsdGVyZWRJdGVtcyBsYXllciBkb2VzbnQgZXhpc3RzYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChsYXllci5maWx0ZXJlZEl0ZW1Db3VudD8uW2RlY2tnbExheWVySWRdID09PSBjb3VudCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxheWVyLmZpbHRlcmVkSXRlbUNvdW50ID0ge1xuICAgIC4uLmxheWVyLmZpbHRlcmVkSXRlbUNvdW50LFxuICAgIFtkZWNrZ2xMYXllcklkXTogY291bnRcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3dhcF8obGF5ZXIpKHN0YXRlLmxheWVycylcbiAgfTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVBY3Rpb25cbik6IFMge1xuICBjb25zdCB7aWR4OiBmaWx0ZXJJZHgsIGVuYWJsZSA9IGZhbHNlfSA9IGFjdGlvbjtcblxuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICBsZXQgbmV3RmlsdGVyID0gZmlsdGVyO1xuXG4gIC8vIGlmIHdlIGVuYWJsZSBzeW5jIHdlIGFyZSBnb2luZyB0byBtZXJnZSBmaWx0ZXIgYW5kIGFuaW1hdGlvbkNvbmZpZyBkb21haW5zIGFuZCBzdG9yZSBpbnRvIGZpbHRlci5kb21haW5cbiAgaWYgKGVuYWJsZSkge1xuICAgIGNvbnN0IGFuaW1hdGFibGVMYXllcnMgPSBnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyhuZXdTdGF0ZS5sYXllcnMpO1xuICAgIC8vIGlmIG5vIGFuaW1hdGFibGVMYXllcnMgYXJlIHByZXNlbnQgd2Ugc2ltcGx5IHJldHVyblxuICAgIGlmICghYW5pbWF0YWJsZUxheWVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuZXdTdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzID0gZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyhhbmltYXRhYmxlTGF5ZXJzKTtcbiAgICBjb25zdCBoYXNJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXIgPSBCb29sZWFuKGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMubGVuZ3RoKTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlckRvbWFpbiA9IG1lcmdlVGltZURvbWFpbnMoW2ZpbHRlci5kb21haW4sIG5ld1N0YXRlLmFuaW1hdGlvbkNvbmZpZy5kb21haW5dKTtcblxuICAgIC8vIHdlIG9ubHkgdXBkYXRlIGFuaW1hdGlvbldpbmRvdyBpZiB3ZSBoYXZlIGludGVydmFsIGJhc2VkIGFuaW1hdGlvbiBsYXllcnMgd2l0aCBkZWZpbmVkIGludGVydmFscyBhbmQgdGhlIGN1cnJlbnQgZmlsdGVyIGFuaW1hdGlvbiB3aW5kb3cgaXMgbm90IGludGVydmFsXG4gICAgaWYgKGhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllcikge1xuICAgICAgaWYgKGZpbHRlci5hbmltYXRpb25XaW5kb3cgIT09IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWwpIHtcbiAgICAgICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICAgICAgaWQ6IGZpbHRlci5pZCxcbiAgICAgICAgICBhbmltYXRpb25XaW5kb3c6IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5ld0ZpbHRlciA9IG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgICAgIC8vIGFkanVzdCB0aW1lIGZpbHRlciBpbnRlcnZhbFxuICAgICAgbmV3RmlsdGVyID0gYWRqdXN0VGltZUZpbHRlckludGVydmFsKG5ld1N0YXRlLCBuZXdGaWx0ZXIpO1xuXG4gICAgICAvLyByZXBsYWNlIGZpbHRlciBpbiBzdGF0ZSB3aXRoIG5ld0ZpbHRlclxuICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikobmV3U3RhdGUuZmlsdGVycylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAgIC8vIGFkanVzdCB2YWx1ZSBiYXNlZCBvbiBuZXcgZG9tYWluXG4gICAgY29uc3QgbmV3RmlsdGVyVmFsdWUgPSBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluKFxuICAgICAgbmV3RmlsdGVyLmFuaW1hdGlvbldpbmRvdyA9PT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbFxuICAgICAgICA/IFtuZXdGaWx0ZXJEb21haW5bMF0sIG5ld0ZpbHRlckRvbWFpblswXV1cbiAgICAgICAgOiBuZXdGaWx0ZXJEb21haW4sXG4gICAgICB7Li4ubmV3RmlsdGVyLCBkb21haW46IG5ld0ZpbHRlckRvbWFpbn1cbiAgICApO1xuXG4gICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogbmV3RmlsdGVyVmFsdWVcbiAgICB9KTtcblxuICAgIG5ld0ZpbHRlciA9IHtcbiAgICAgIC4uLihuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyKSxcbiAgICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiB0cnVlXG4gICAgfTtcblxuICAgIC8vIHJlcGxhY2UgZmlsdGVyIGluIHN0YXRlIHdpdGggbmV3RmlsdGVyXG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShuZXdTdGF0ZS5maWx0ZXJzKVxuICAgIH07XG5cbiAgICBuZXdTdGF0ZSA9IHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZDogbmV3RmlsdGVyLmlkLFxuICAgICAgbW9kZTogZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyKVxuICAgIH0pO1xuXG4gICAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAgIC8vIHNldCB0aGUgYW5pbWF0aW9uIGNvbmZpZyB2YWx1ZSB0byBtYXRjaCBmaWx0ZXIgdmFsdWVcbiAgICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgdmFsdWU6IG5ld0ZpbHRlci52YWx1ZVtuZXdGaWx0ZXIuc3luY1RpbWVsaW5lTW9kZV1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNldCBkb21haW4gYW5kIHN0ZXBcbiAgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZTogZmFsc2VcbiAgfTtcblxuICAvLyByZXBsYWNlIGZpbHRlciBpbiBzdGF0ZSB3aXRoIG5ld0ZpbHRlclxuICBuZXdTdGF0ZSA9IHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikobmV3U3RhdGUuZmlsdGVycylcbiAgfTtcblxuICAvLyByZXNldCBzeW5jIHRpbWVsaW5lIG1vZGVcbiAgbmV3U3RhdGUgPSBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkOiBuZXdGaWx0ZXIuaWQsXG4gICAgbW9kZTogU1lOQ19USU1FTElORV9NT0RFUy5lbmRcbiAgfSk7XG5cbiAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAvLyByZXNldCBmaWx0ZXIgdmFsdWVcbiAgY29uc3QgbmV3RmlsdGVyVmFsdWUgPSBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluKG5ld0ZpbHRlci5kb21haW4sIG5ld0ZpbHRlcik7XG5cbiAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgcHJvcDogJ3ZhbHVlJyxcbiAgICB2YWx1ZTogbmV3RmlsdGVyVmFsdWVcbiAgfSk7XG5cbiAgbmV3U3RhdGUgPSBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkOiBuZXdGaWx0ZXIuaWQsXG4gICAgbW9kZTogZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyKVxuICB9KTtcblxuICAvLyByZXNldCBhbmltYXRpb24gY29uZmlnIGN1cnJlbnQgdGltZSB0b1xuICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIHZhbHVlOiBuZXdTdGF0ZS5hbmltYXRpb25Db25maWcuZG9tYWluPy5bMF0gPz8gbnVsbFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5zZXRUaW1lRmlsdGVyU3luY1RpbWVsaW5lTW9kZUFjdGlvblxuKSB7XG4gIGNvbnN0IHtpZDogZmlsdGVySWQsIG1vZGU6IHN5bmNUaW1lbGluZU1vZGV9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuICBpZiAoZmlsdGVySWR4ID09PSAtMSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgaWYgKCF2YWxpZGF0ZVN5bmNBbmltYXRpb25Nb2RlKGZpbHRlciwgc3luY1RpbWVsaW5lTW9kZSkpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgLi4uZmlsdGVyLFxuICAgIHN5bmNUaW1lbGluZU1vZGVcbiAgfTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikoc3RhdGUuZmlsdGVycylcbiAgfTtcblxuICByZXR1cm4gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcihuZXdTdGF0ZSwgZmlsdGVySWR4KTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBmaWx0ZXJJZHg6IG51bWJlcik6IFMge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gIGlmICgoZmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIHtcbiAgICBjb25zdCB0aW1lbGluZVZhbHVlID0gZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIoZmlsdGVyKTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy50aW1lU3RlcHNcbiAgICAgID8gc25hcFRvTWFya3ModGltZWxpbmVWYWx1ZSwgc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnRpbWVTdGVwcylcbiAgICAgIDogdGltZWxpbmVWYWx1ZTtcbiAgICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihzdGF0ZSwge3ZhbHVlfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBnZXRUaW1lbGluZVZhbHVlRnJvbUZpbHRlcihmaWx0ZXIpIHtcbiAgcmV0dXJuIGZpbHRlci52YWx1ZVtmaWx0ZXIuc3luY1RpbWVsaW5lTW9kZV07XG59XG5cbmZ1bmN0aW9uIGdldFN5bmNBbmltYXRpb25Nb2RlKGZpbHRlcjogVGltZVJhbmdlRmlsdGVyKSB7XG4gIGlmIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93ID09PSBBTklNQVRJT05fV0lORE9XLmZyZWUpIHtcbiAgICByZXR1cm4gZmlsdGVyLnN5bmNUaW1lbGluZU1vZGUgPz8gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG4gIH1cblxuICByZXR1cm4gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3luY0FuaW1hdGlvbk1vZGUoZmlsdGVyOiBUaW1lUmFuZ2VGaWx0ZXIsIG5ld01vZGU6IG51bWJlcikge1xuICByZXR1cm4gIShcbiAgICBmaWx0ZXIuYW5pbWF0aW9uV2luZG93ICE9PSBBTklNQVRJT05fV0lORE9XLmZyZWUgJiYgbmV3TW9kZSA9PT0gU1lOQ19USU1FTElORV9NT0RFUy5zdGFydFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwoc3RhdGUsIGZpbHRlcikge1xuICBjb25zdCBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzID0gZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyhzdGF0ZS5sYXllcnMpO1xuXG4gIGxldCBpbnRlcnZhbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlmIChpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJbmRleCA9IGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMucmVkdWNlKChjdXJyZW50SW5kZXgsIGwpID0+IHtcbiAgICAgIGlmIChsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKSB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gVElNRV9JTlRFUlZBTFNfT1JERVJFRC5maW5kSW5kZXgoaSA9PiBpID09PSBsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKTtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4ID4gLTEgJiYgbmV3SW5kZXggPCBjdXJyZW50SW5kZXggPyBuZXdJbmRleCA6IGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICB9LCBUSU1FX0lOVEVSVkFMU19PUkRFUkVELmxlbmd0aCAtIDEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBoZXhUaWxlSW50ZXJ2YWwgPSBUSU1FX0lOVEVSVkFMU19PUkRFUkVEW2ludGVydmFsSW5kZXhdO1xuICAgIGludGVydmFsID0gTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbFtoZXhUaWxlSW50ZXJ2YWxdO1xuICB9XG5cbiAgaWYgKCFpbnRlcnZhbCkge1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICAvLyBhZGp1c3QgZmlsdGVyXG4gIGNvbnN0IHRpbWVGb3JtYXQgPSBnZXREZWZhdWx0VGltZUZvcm1hdChpbnRlcnZhbCk7XG4gIGNvbnN0IHVwZGF0ZWRQbG90VHlwZSA9IHsuLi5maWx0ZXIucGxvdFR5cGUsIGludGVydmFsLCB0aW1lRm9ybWF0fTtcbiAgY29uc3QgbmV3RmlsdGVyID0gdXBkYXRlVGltZUZpbHRlclBsb3RUeXBlKGZpbHRlciwgdXBkYXRlZFBsb3RUeXBlLCBzdGF0ZS5kYXRhc2V0cyk7XG4gIHJldHVybiBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93KHN0YXRlLCBuZXdGaWx0ZXIpO1xufVxuXG4vLyBGaW5kIGRhdGFJZCBmcm9tIGEgc2F2ZWQgdmlzU3RhdGUgcHJvcGVydHk6XG4vLyBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9ucywgbGF5ZXJCbGVuZGluZywgb3ZlcmxheUJsZW5kaW5nLCBzcGxpdE1hcHMsIGFuaW1hdGlvbkNvbmZpZywgZWRpdG9yXG4vLyByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBkYXRhSWRcbmZ1bmN0aW9uIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2YWx1ZTogYW55LCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgcmVwbGFjZWQgPSB2YWx1ZVxuICAgICAgLm1hcCh2ID0+IGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2LCBkYXRhSWQsIGRhdGFJZFRvUmVwbGFjZSkpXG4gICAgICAuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLmRhdGFJZCA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZGF0YUlkID09PSBkYXRhSWQpIHtcbiAgICAvLyBvdGhlcnNcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBkYXRhSWQ6IGRhdGFJZFRvUmVwbGFjZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhSWQpICYmIHZhbHVlLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKSB7XG4gICAgLy8gZmlsdGVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZGF0YUlkOiB2YWx1ZS5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvUmVwbGFjZSA6IGQpKVxuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUuY29uZmlnPy5kYXRhSWQgJiYgdmFsdWUuY29uZmlnPy5kYXRhSWQgPT09IGRhdGFJZCkge1xuICAgIC8vIGxheWVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLnZhbHVlLmNvbmZpZyxcbiAgICAgICAgZGF0YUlkOiBkYXRhSWRUb1JlcGxhY2VcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGRhdGFJZCkpIHtcbiAgICAvLyBmb3IgdmFsdWUgc2F2ZWQgYXMge1tkYXRhSWRdOiB7Li4ufX1cbiAgICByZXR1cm4ge1tkYXRhSWRUb1JlcGxhY2VdOiB2YWx1ZVtkYXRhSWRdfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBGaW5kIGRhdGFzZXRJZHMgZGVyaXZlZCBhIHNhdmVkIHZpc1N0YXRlIFByb3BlcnR5O1xuZnVuY3Rpb24gZmluZENoaWxkRGF0YXNldElkcyh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBmb3IgbGF5ZXJzLCBmaWx0ZXJzLCBjYWxsIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyBvbiBlYWNoIGl0ZW0gaW4gYXJyYXlcbiAgICBjb25zdCBjaGlsZERhdGFJZHMgPSB2YWx1ZS5tYXAoZmluZENoaWxkRGF0YXNldElkcykuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIGNoaWxkRGF0YUlkcy5sZW5ndGggPyBjaGlsZERhdGFJZHMgOiBudWxsO1xuICB9XG5cbiAgLy8gY2hpbGQgZGF0YSBpZCB1c3VhbGx5IHN0b3JlcyBpbiB0aGUgZGVyaXZlZCBkYXRhc2V0IGluZm9cbiAgcmV0dXJuIHZhbHVlPy5uZXdEYXRhc2V0Py5pbmZvLmlkIHx8IG51bGw7XG59XG5cbi8vIG1vdmVkIHVubWVyZ2VkIGxheWVycywgZmlsdGVycywgaW50ZXJhY3Rpb25zXG5mdW5jdGlvbiBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCBwcm9wVmFsdWVzLCB7cHJvcCwgdG9NZXJnZVByb3AsIHNhdmVVbm1lcmdlZH0pIHtcbiAgLy8gcmVtb3ZlIHByb3AgdmFsdWUgZnJvbSBzdGF0ZVxuICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHJlbW92ZSB1cGRhdGVyIHRvIG1lcmdlciBhcyB3ZWxsP1xuICBpZiAoIXByb3BWYWx1ZXMpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgc3RhdGVSZW1vdmVkID1cbiAgICBwcm9wID09PSAnbGF5ZXJzJ1xuICAgICAgPyBwcm9wVmFsdWVzLnJlZHVjZSgoYWNjdSwgcHJvcFZhbHVlKSA9PiByZW1vdmVMYXllclVwZGF0ZXIoYWNjdSwge2lkOiBwcm9wVmFsdWUuaWR9KSwgc3RhdGUpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoc3RhdGVbcHJvcF0pXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBbcHJvcF06IHN0YXRlW3Byb3BdLmZpbHRlcihwID0+ICFwcm9wVmFsdWVzLmZpbmQocHJvcFZhbHVlID0+IHAuaWQgPT09IHByb3BWYWx1ZS5pZCkpXG4gICAgICAgIH1cbiAgICAgIDogLy8gaWYgbm90IGFycmF5LCB3ZSB3b24ndCByZW1vdmUgaXQsIHJlbW92ZSBkYXRhc2V0IHNob3VsZCBoYW5kbGUgaXRcbiAgICAgICAgc3RhdGU7XG5cbiAgLy8gbW92ZSB0byBzdGF0ZVRvQmVNZXJnZWRcbiAgY29uc3QgdG9CZU1lcmdlZCA9IHtcbiAgICBbdG9NZXJnZVByb3BdOiBzYXZlVW5tZXJnZWRcbiAgICAgID8gLy8gY2FsbCBtZXJnZSBzYXZlVW5tZXJnZWQgbWV0aG9kXG4gICAgICAgIHNhdmVVbm1lcmdlZChzdGF0ZVJlbW92ZWQsIHByb3BWYWx1ZXMpXG4gICAgICA6IC8vIGlmIHRvTWVyZ2VQcm9wIGlzIGFyYWF5LCBhcHBlbmQgdG8gaXRcbiAgICAgIEFycmF5LmlzQXJyYXkoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8gWy4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sIC4uLnByb3BWYWx1ZXNdXG4gICAgICA6IC8vIHNhdmUgcHJvcFZhbHVlcyB0byB0b01lcmdlXG4gICAgICBpc09iamVjdChzdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSxcbiAgICAgICAgICAuLi5wcm9wVmFsdWVzXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGVSZW1vdmVkLFxuICAgIC4uLnRvQmVNZXJnZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZURhdGFzZXRBbmREZXBzPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIHJldHVybiBjb21wb3NlXzxUPihbXG4gICAgYXBwbHlfKHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUsIHtkYXRhSWQsIGRhdGFJZFRvVXNlfSksXG4gICAgYXBwbHlfKHJlbW92ZURhdGFzZXRVcGRhdGVyLCB7ZGF0YUlkfSlcbiAgXSkoc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2U8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIGRhdGFJZDogc3RyaW5nLFxuICBkYXRhSWRUb1VzZTogc3RyaW5nXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoc3RhdGUsIHN0YXRlLnNjaGVtYSk7XG4gIGNvbnN0IG5leHRTdGF0ZSA9IHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhzdGF0ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSk7XG4gIC8vIG1ha2UgYSBjb3B5IG9mIGxheWVyT3JkZXIsIGJlY2F1c2UgbGF5ZXIgaWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgYnkgY2FsbGluZyByZW1vdmVMYXllclVwZGF0ZXJcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gWy4uLnN0YXRlLmxheWVyT3JkZXJdO1xuXG4gIC8vIHByZXNlcnZlIGRhdGFzZXQgb3JkZXJcbiAgbmV4dFN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyID0gT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpLm1hcChkID0+XG4gICAgZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkXG4gICk7XG5cbiAgLy8gcHJlc2VydmVMYXllck9yZGVyXG4gIGlmIChuZXh0U3RhdGUubGF5ZXJUb0JlTWVyZ2VkPy5sZW5ndGgpIHtcbiAgICAvLyBjb3B5IHNwbGl0IG1hcHMgdG8gYmUgbWVyZ2VkLCBiZWNhdXNlIGl0IHdpbGwgYmUgcmVzZXQgaW4gcmVtb3ZlIGxheWVyXG4gICAgbmV4dFN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQgPSBzZXJpYWxpemVkU3RhdGU/LnNwbGl0TWFwcyA/PyBbXTtcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlciA9IFsuLi5wcmVzZXJ2ZUxheWVyT3JkZXJdO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGU8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtkYXRhSWQsIGRhdGFJZFRvVXNlfToge2RhdGFJZDogc3RyaW5nOyBkYXRhSWRUb1VzZTogc3RyaW5nfVxuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHN0YXRlLm1lcmdlcnMucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VTdGF0ZSxcbiAgICAgIHtwcm9wLCB0b01lcmdlUHJvcCwgcmVwbGFjZVBhcmVudERhdGFzZXRJZHMsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkLCBwcmVzZXJ2ZU9yZGVyfVxuICAgICkgPT4ge1xuICAgICAgLy8gZ2V0IGRhdGFzZXQgaWRzIHRoYXQgYXJlIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICBjb25zdCBwcm9wcyA9IHRvQXJyYXkocHJvcCk7XG4gICAgICBjb25zdCB0b01lcmdlUHJvcHMgPSB0b0FycmF5KHRvTWVyZ2VQcm9wKTtcbiAgICAgIGNvbnN0IHNhdmVkUHJvcHMgPSBzZXJpYWxpemVkU3RhdGUgPyBwcm9wcy5tYXAocCA9PiBzZXJpYWxpemVkU3RhdGVbcF0pIDogW107XG5cbiAgICAgIGxldCByZXBsYWNlZFN0YXRlID0gYWNjdVN0YXRlO1xuICAgICAgc2F2ZWRQcm9wcy5mb3JFYWNoKChwcm9wVmFsdWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbWVyZ2VyT3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wc1tpXSxcbiAgICAgICAgICB0b01lcmdlUHJvcDogdG9NZXJnZVByb3BzW2ldLFxuICAgICAgICAgIGdldENoaWxkRGF0YXNldElkcyxcbiAgICAgICAgICBzYXZlVW5tZXJnZWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXBsYWNlZEl0ZW0gPVxuICAgICAgICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzPy4ocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKSB8fFxuICAgICAgICAgIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyhwcm9wVmFsdWUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAgICAgICByZXBsYWNlZFN0YXRlID0gcmVwbGFjZWRJdGVtXG4gICAgICAgICAgPyByZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZShyZXBsYWNlZFN0YXRlLCByZXBsYWNlZEl0ZW0sIG1lcmdlck9wdGlvbnMpXG4gICAgICAgICAgOiByZXBsYWNlZFN0YXRlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW21lcmdlck9wdGlvbnMudG9NZXJnZVByb3BdPy5sZW5ndGggJiZcbiAgICAgICAgICBwcmVzZXJ2ZU9yZGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcGxhY2VkU3RhdGVbcHJlc2VydmVPcmRlcl0gPSBwcm9wVmFsdWUubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVwbGFjZWRTdGF0ZTtcbiAgICB9LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUoXG4gIHN0YXRlLFxuICByZXBsYWNlZEl0ZW0sXG4gIHtwcm9wLCB0b01lcmdlUHJvcCwgZ2V0Q2hpbGREYXRhc2V0SWRzLCBzYXZlVW5tZXJnZWR9XG4pIHtcbiAgLy8gcHJvcCBpcyBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0IHRvIGJlIHJlcGxhY2VkXG4gIC8vIHJlbW92ZSBwcm9wIGZyb20gc3RhdGUsIGFuZCBtb3ZlIGl0IHRvIHRvQmVNZXJnZWRcbiAgbGV0IG5leHRTdGF0ZSA9IG1vdmVWYWx1ZVRvQmVNZXJnZWQoc3RhdGUsIHJlcGxhY2VkSXRlbSwge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KTtcbiAgY29uc3QgY2hpbGREYXRhSWRzID0gZ2V0Q2hpbGREYXRhc2V0SWRzPy4ocmVwbGFjZWRJdGVtKSB8fCBmaW5kQ2hpbGREYXRhc2V0SWRzKHJlcGxhY2VkSXRlbSk7XG5cbiAgaWYgKGNoaWxkRGF0YUlkcykge1xuICAgIG5leHRTdGF0ZSA9IHRvQXJyYXkoY2hpbGREYXRhSWRzKS5yZWR1Y2UoKGFjY3UsIGNoaWxkRGF0YUlkKSA9PiB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgY2hpbGQgZGF0YXNldCBpZCxcbiAgICAgIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIG1vdmUgb3V0IG9mIHN0YXRlIGFuZCBtZXJnZSBiYWNrIGluXG4gICAgICByZXR1cm4gcmVwbGFjZURhdGFzZXRBbmREZXBzKGFjY3UsIGNoaWxkRGF0YUlkLCBjaGlsZERhdGFJZCk7XG4gICAgfSwgbmV4dFN0YXRlKTtcbiAgfVxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUws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