@kepler.gl/reducers 3.3.0-alpha.5 → 3.3.0-alpha.6

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 (71) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +654 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +905 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +4114 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/{combined-updaters.js → esm/combined-updaters.js} +74 -81
  26. package/dist/esm/composer-helpers.js +85 -0
  27. package/dist/esm/composers.js +14 -0
  28. package/dist/esm/core.js +101 -0
  29. package/dist/esm/data-utils.js +47 -0
  30. package/dist/esm/export-utils.js +86 -0
  31. package/dist/esm/index.js +62 -0
  32. package/dist/esm/interaction-utils.js +96 -0
  33. package/dist/esm/layer-utils.js +602 -0
  34. package/dist/esm/map-state-updaters.js +646 -0
  35. package/dist/esm/map-state.js +29 -0
  36. package/dist/esm/map-style-updaters.js +652 -0
  37. package/dist/esm/map-style.js +27 -0
  38. package/dist/esm/merger-handler.js +96 -0
  39. package/dist/esm/middleware.js +19 -0
  40. package/dist/esm/provider-state-updaters.js +458 -0
  41. package/dist/esm/provider-state.js +28 -0
  42. package/dist/esm/root.js +201 -0
  43. package/dist/esm/ui-state-updaters.js +900 -0
  44. package/dist/esm/ui-state.js +30 -0
  45. package/dist/esm/vis-state-merger.js +1161 -0
  46. package/dist/esm/vis-state-selectors.js +24 -0
  47. package/dist/esm/vis-state-updaters.js +4035 -0
  48. package/dist/esm/vis-state.js +29 -0
  49. package/package.json +29 -20
  50. package/dist/composer-helpers.js +0 -101
  51. package/dist/composers.js +0 -22
  52. package/dist/core.js +0 -105
  53. package/dist/data-utils.js +0 -53
  54. package/dist/export-utils.js +0 -91
  55. package/dist/interaction-utils.js +0 -105
  56. package/dist/layer-utils.js +0 -635
  57. package/dist/map-state-updaters.js +0 -649
  58. package/dist/map-state.js +0 -35
  59. package/dist/map-style-updaters.js +0 -660
  60. package/dist/map-style.js +0 -33
  61. package/dist/merger-handler.js +0 -105
  62. package/dist/middleware.js +0 -27
  63. package/dist/provider-state-updaters.js +0 -465
  64. package/dist/provider-state.js +0 -34
  65. package/dist/root.js +0 -207
  66. package/dist/ui-state-updaters.js +0 -905
  67. package/dist/ui-state.js +0 -36
  68. package/dist/vis-state-merger.js +0 -1193
  69. package/dist/vis-state-selectors.js +0 -30
  70. package/dist/vis-state-updaters.js +0 -4114
  71. package/dist/vis-state.js +0 -35
@@ -0,0 +1,4035 @@
1
+ import _toArray from "@babel/runtime/helpers/esm/toArray";
2
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
4
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
5
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
6
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
7
+ var _excluded = ["dataId"],
8
+ _excluded2 = ["info"];
9
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
10
+ 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); }
11
+ 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; } } }; }
12
+ 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; } }
13
+ 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; }
14
+ 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; }
15
+ 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) { _defineProperty(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; }
16
+ // SPDX-License-Identifier: MIT
17
+ // Copyright contributors to the kepler.gl project
18
+
19
+ import { bbox } from '@turf/bbox';
20
+ import copy from 'copy-to-clipboard';
21
+ import deepmerge from 'deepmerge';
22
+ import { console as Console } from 'global/window';
23
+ import cloneDeep from 'lodash/cloneDeep';
24
+ import get from 'lodash/get';
25
+ import isEqual from 'lodash/isEqual';
26
+ import pick from 'lodash/pick';
27
+ import uniq from 'lodash/uniq';
28
+ import xor from 'lodash/xor';
29
+ import Task, { disableStackCapturing, withTask } from 'react-palm/tasks';
30
+ // Tasks
31
+ import { DELAY_TASK, ACTION_TASK, LOAD_FILE_TASK, PROCESS_FILE_DATA, UNWRAP_TASK } from '@kepler.gl/tasks';
32
+ // Actions
33
+ import { addNotification, applyLayerConfig, createNewDatasetSuccess, layerConfigChange, layerTypeChange, layerVisConfigChange, layerVisualChannelConfigChange, loadFileStepSuccess, loadFilesErr, loadFilesSuccess, loadNextFile, nextFileBatch, setFilter, processFileContent, fitBounds as fitMapBounds, toggleLayerForMap, applyFilterConfig } from '@kepler.gl/actions';
34
+
35
+ // Utils
36
+ import { FILTER_UPDATER_PROPS, addNewLayersToSplitMap, snapToMarks, applyFilterFieldName, applyFiltersToDatasets, arrayInsert, computeSplitMapLayers, adjustValueToFilterDomain, errorNotification, featureToFilterValue, filterDatasetCPU, generatePolygonFilter, getDefaultFilter, getFilterIdInFeature, getTimeWidgetTitleFormatter, isInRange, isObject, isPlainObject, isRgbColor, parseFieldValue, removeLayerFromSplitMaps, set, updateFilterPlot, removeFilterPlot, isLayerAnimatable, isSideFilter, getApplicationConfig } from '@kepler.gl/utils';
37
+ import { generateHashId, toArray, arrayMove } from '@kepler.gl/common-utils';
38
+ // Mergers
39
+ import { ANIMATION_WINDOW, BASE_SPEED, COMPARE_TYPES, DEFAULT_TEXT_LABEL, EDITOR_MODES, FILTER_TYPES, FILTER_VIEW_TYPES, FPS, LIGHT_AND_SHADOW_EFFECT, DISTANCE_FOG_TYPE, SURFACE_FOG_TYPE, MAX_DEFAULT_TOOLTIPS, PLOT_TYPES, SORT_ORDER, SYNC_TIMELINE_MODES, CHANNEL_SCALES, SCALE_TYPES, INITIAL_ANNOTATION_KIND, INITIAL_ANNOTATION_ANGLE, INITIAL_ANNOTATION_ARM_LENGTH, INITIAL_ANNOTATION_TEXT_WIDTH, INITIAL_ANNOTATION_TEXT_HEIGHT, INITIAL_ANNOTATION_LINE_WIDTH, INITIAL_ANNOTATION_LINE_COLOR, AnnotationKind } from '@kepler.gl/constants';
40
+ import { LAYER_ID_LENGTH, Layer, LayerClasses } from '@kepler.gl/layers';
41
+ import { apply_, compose_, filterOutById, merge_, payload_, pick_, removeElementAtIndex, swap_ } from './composer-helpers';
42
+ import { isValidMerger, mergeStateFromMergers } from './merger-handler';
43
+ import { VIS_STATE_MERGERS, createLayerFromConfig, parseLayerConfig, serializeFilter, serializeLayer, serializeVisState, validateLayerWithData } from './vis-state-merger';
44
+ import KeplerGLSchema from '@kepler.gl/schemas';
45
+ import { assignGpuChannel, copyTableAndUpdate, createNewDataEntry, pinTableColumns, setFilterGpuMode, sortDatasetByColumn } from '@kepler.gl/table';
46
+ import { findFieldsToShow } from './interaction-utils';
47
+ import { calculateLayerData, findDefaultLayer, getLayerOrderFromLayers, mergeLayerVisConfigForNewDatasets, getNewLayerGroup, addLayerOrGroupToLayerOrder, removeElementFromLayerOrder, getLayerGroupFromLayerOrder, findParentGroupForLayer, getIndexFromLayerEntryId, updateLayerGroupInLayerOrder, getFlatLayerOrder, replaceLayerEntryInLayerOrder } from './layer-utils';
48
+ import { getPropValueToMerger, hasPropsToMerge } from './merger-handler';
49
+ import { mergeDatasetsByOrder } from './vis-state-merger';
50
+ import { fixEffectOrder, getAnimatableVisibleLayers, getIntervalBasedAnimationLayers, mergeTimeDomains, adjustValueToAnimationWindow, updateTimeFilterPlotType, getDefaultTimeFormat, LayerToFilterTimeInterval, TIME_INTERVALS_ORDERED, mergeFilterDomain, initCustomPaletteByCustomScale } from '@kepler.gl/utils';
51
+ import { createEffect } from '@kepler.gl/effects';
52
+ import { findMapBounds } from './data-utils';
53
+
54
+ // react-palm
55
+ // disable capture exception for react-palm call to withTask
56
+ disableStackCapturing();
57
+
58
+ /**
59
+ * Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
60
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
61
+ *
62
+ * @public
63
+ * @example
64
+ *
65
+ * import keplerGlReducer, {visStateUpdaters} from '@kepler.gl/reducers';
66
+ * // Root Reducer
67
+ * const reducers = combineReducers({
68
+ * keplerGl: keplerGlReducer,
69
+ * app: appReducer
70
+ * });
71
+ *
72
+ * const composedReducer = (state, action) => {
73
+ * switch (action.type) {
74
+ * case 'CLICK_BUTTON':
75
+ * return {
76
+ * ...state,
77
+ * keplerGl: {
78
+ * ...state.keplerGl,
79
+ * foo: {
80
+ * ...state.keplerGl.foo,
81
+ * visState: visStateUpdaters.enlargeFilterUpdater(
82
+ * state.keplerGl.foo.visState,
83
+ * {idx: 0}
84
+ * )
85
+ * }
86
+ * }
87
+ * };
88
+ * }
89
+ * return reducers(state, action);
90
+ * };
91
+ *
92
+ * export default composedReducer;
93
+ */
94
+ /* eslint-disable @typescript-eslint/no-unused-vars */
95
+ // @ts-ignore
96
+ var visStateUpdaters = null;
97
+ /* eslint-enable @typescript-eslint/no-unused-vars */
98
+
99
+ export var defaultInteractionConfig = {
100
+ tooltip: {
101
+ id: 'tooltip',
102
+ label: 'interactions.tooltip',
103
+ enabled: true,
104
+ config: {
105
+ fieldsToShow: {},
106
+ compareMode: false,
107
+ compareType: COMPARE_TYPES.ABSOLUTE
108
+ }
109
+ },
110
+ geocoder: {
111
+ id: 'geocoder',
112
+ label: 'interactions.geocoder',
113
+ enabled: false,
114
+ position: null,
115
+ config: {
116
+ limitSearch: false
117
+ }
118
+ },
119
+ brush: {
120
+ id: 'brush',
121
+ label: 'interactions.brush',
122
+ enabled: false,
123
+ config: {
124
+ // size is in km
125
+ size: 0.5
126
+ }
127
+ },
128
+ coordinate: {
129
+ id: 'coordinate',
130
+ label: 'interactions.coordinate',
131
+ enabled: false,
132
+ position: null
133
+ }
134
+ };
135
+ export var DEFAULT_ANIMATION_CONFIG = {
136
+ domain: null,
137
+ currentTime: null,
138
+ speed: 1,
139
+ isAnimating: false,
140
+ timeSteps: null,
141
+ timeFormat: null,
142
+ timezone: null,
143
+ defaultTimeFormat: null,
144
+ hideControl: false,
145
+ duration: null
146
+ };
147
+ export var DEFAULT_EDITOR = {
148
+ mode: EDITOR_MODES.DRAW_POLYGON,
149
+ features: [],
150
+ selectedFeature: null,
151
+ visible: true
152
+ };
153
+
154
+ /**
155
+ * Default initial `visState`
156
+ * @memberof visStateUpdaters
157
+ * @constant
158
+ * @public
159
+ */
160
+ export var INITIAL_VIS_STATE = {
161
+ // map info
162
+ mapInfo: {
163
+ title: '',
164
+ description: ''
165
+ },
166
+ // layers
167
+ layers: [],
168
+ layerData: [],
169
+ layerToBeMerged: [],
170
+ layerOrder: [],
171
+ layerOrderToBeMerged: null,
172
+ // filters
173
+ filters: [],
174
+ filterToBeMerged: [],
175
+ // a collection of multiple dataset
176
+ datasets: {},
177
+ editingDataset: undefined,
178
+ // effects
179
+ effects: [],
180
+ effectOrder: [],
181
+ // annotations
182
+ annotations: [],
183
+ annotationsToBeMerged: [],
184
+ selectedAnnotationId: null,
185
+ isEditingAnnotationText: false,
186
+ interactionConfig: defaultInteractionConfig,
187
+ interactionToBeMerged: {},
188
+ layerBlending: 'normal',
189
+ overlayBlending: 'normal',
190
+ hoverInfo: undefined,
191
+ clicked: undefined,
192
+ mousePos: {},
193
+ maxDefaultTooltips: MAX_DEFAULT_TOOLTIPS,
194
+ // this is used when user split maps
195
+ splitMaps: [
196
+ // this will contain a list of objects to
197
+ // describe the state of layer availability and visibility for each map
198
+ // [
199
+ // {
200
+ // layers: {layer_id: true | false}
201
+ // }
202
+ // ]
203
+ ],
204
+ splitMapsToBeMerged: [],
205
+ isMergingDatasets: {},
206
+ // defaults layer classes
207
+ layerClasses: LayerClasses,
208
+ // default animation
209
+ // time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
210
+ animationConfig: DEFAULT_ANIMATION_CONFIG,
211
+ editor: DEFAULT_EDITOR,
212
+ fileLoading: false,
213
+ fileLoadingProgress: {},
214
+ // for loading datasets
215
+ loadingIndicatorValue: 0,
216
+ loaders: [],
217
+ loadOptions: {},
218
+ // visStateMergers
219
+ mergers: VIS_STATE_MERGERS,
220
+ // kepler schemas
221
+ schema: KeplerGLSchema
222
+ };
223
+ export var ACTION_TASK_FIT_BOUNDS = Task.fromCallback(function (_, cb) {
224
+ return cb();
225
+ }, 'ACTION_TASK_FIT_BOUNDS');
226
+ export var ACTION_TASK_ADD_NOTIFICATION = Task.fromCallback(function (_, cb) {
227
+ return cb();
228
+ }, 'ACTION_TASK_ADD_NOTIFICATION');
229
+ /**
230
+ * Update state with updated layer and layerData
231
+ *
232
+ */
233
+ export function updateStateWithLayerAndData(state, _ref) {
234
+ var layerData = _ref.layerData,
235
+ layer = _ref.layer,
236
+ idx = _ref.idx;
237
+ return _objectSpread(_objectSpread({}, state), {}, {
238
+ layers: state.layers.map(function (lyr, i) {
239
+ return i === idx ? layer : lyr;
240
+ }),
241
+ layerData: layerData ? state.layerData.map(function (d, i) {
242
+ return i === idx ? layerData : d;
243
+ }) : state.layerData
244
+ });
245
+ }
246
+ export function updateStateOnLayerVisibilityChange(state, layer) {
247
+ var newState = state;
248
+ if (state.splitMaps.length) {
249
+ newState = _objectSpread(_objectSpread({}, state), {}, {
250
+ splitMaps: layer.config.isVisible ? addNewLayersToSplitMap(state.splitMaps, layer) : removeLayerFromSplitMaps(state.splitMaps, layer)
251
+ });
252
+ }
253
+ if (layer.config.animation.enabled) {
254
+ newState = updateAnimationDomain(newState);
255
+ }
256
+ return newState;
257
+ }
258
+
259
+ /**
260
+ * Compares two objects (or arrays) and returns a new object with only the
261
+ * properties that have changed between the two objects.
262
+ */
263
+ function pickChangedProps(prev, next) {
264
+ var changedProps = {};
265
+ var pickPropsOf = function pickPropsOf(obj) {
266
+ Object.keys(obj).forEach(function (key) {
267
+ if (!Object.prototype.hasOwnProperty.call(changedProps, key) && !isEqual(prev[key], next[key])) {
268
+ changedProps[key] = next[key];
269
+ }
270
+ });
271
+ };
272
+ pickPropsOf(prev);
273
+ pickPropsOf(next);
274
+ return changedProps;
275
+ }
276
+ var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
277
+
278
+ /**
279
+ * Apply layer config
280
+ * @memberof visStateUpdaters
281
+ * @returns nextState
282
+ */
283
+ // eslint-disable-next-line complexity, max-statements
284
+ export function applyLayerConfigUpdater(state, action) {
285
+ var _serializeLayer;
286
+ var oldLayerId = action.oldLayerId,
287
+ newLayerConfig = action.newLayerConfig,
288
+ layerIndex = action.layerIndex;
289
+ var newParsedLayer =
290
+ // will move visualChannels to the config prop
291
+ parseLayerConfig(state.schema, newLayerConfig);
292
+ var oldLayer = state.layers.find(function (l) {
293
+ return l.id === oldLayerId;
294
+ });
295
+ if (!oldLayer || !newParsedLayer) {
296
+ return state;
297
+ }
298
+ if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
299
+ // layerIndex is provided, but it doesn't match the oldLayer
300
+ return state;
301
+ }
302
+ var dataset = state.datasets[newParsedLayer.config.dataId];
303
+ if (!dataset) {
304
+ return state;
305
+ }
306
+ // Make sure the layer is valid and convert it to Layer
307
+ var newLayer = validateLayerWithData(dataset, newParsedLayer, state.layerClasses);
308
+ if (!newLayer) {
309
+ return state;
310
+ }
311
+ var nextState = state;
312
+ if (newLayer.type && newLayer.type !== oldLayer.type) {
313
+ var oldLayerIndex = state.layers.findIndex(function (l) {
314
+ return l.id === oldLayerId;
315
+ });
316
+ if (oldLayerIndex >= 0) {
317
+ nextState = layerTypeChangeUpdater(nextState, layerTypeChange(oldLayer, newLayer.type));
318
+ // layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
319
+ // but first make sure that the layer was not removed
320
+ if (nextState.layers.length === state.layers.length) {
321
+ var newLayerId = nextState.layers[oldLayerIndex].id;
322
+ nextState = applyLayerConfigUpdater(nextState, applyLayerConfig(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
323
+ id: newLayerId
324
+ })));
325
+ }
326
+ }
327
+ return nextState;
328
+ }
329
+
330
+ // serializeLayer() might return null if the old layer is not valid,
331
+ // we should still apply the changes in that case
332
+ var serializedOldLayer = (_serializeLayer = serializeLayer(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
333
+ config: {}
334
+ };
335
+ var serializedNewLayer = serializeLayer(newLayer, state.schema);
336
+ if (!serializedNewLayer) {
337
+ return state;
338
+ }
339
+ if (!isEqual(serializedOldLayer, serializedNewLayer)) {
340
+ var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
341
+ if ('visConfig' in changed) {
342
+ if (changed.visConfig) {
343
+ nextState = layerVisConfigChangeUpdater(nextState, layerVisConfigChange(oldLayer, changed.visConfig));
344
+ }
345
+ delete changed.visConfig;
346
+ }
347
+ Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
348
+ var channel = oldLayer.visualChannels[channelName];
349
+ var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
350
+ return channel[prop];
351
+ });
352
+ if (channelPropNames.some(function (prop) {
353
+ return prop in changed;
354
+ })) {
355
+ nextState = layerVisualChannelChangeUpdater(nextState, layerVisualChannelConfigChange(oldLayer, pick(newLayer.config, channelPropNames), channelName));
356
+ var _iterator = _createForOfIteratorHelper(channelPropNames),
357
+ _step;
358
+ try {
359
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
360
+ var prop = _step.value;
361
+ delete changed[prop];
362
+ }
363
+ } catch (err) {
364
+ _iterator.e(err);
365
+ } finally {
366
+ _iterator.f();
367
+ }
368
+ }
369
+ });
370
+ if (Object.keys(changed).length > 0) {
371
+ nextState = layerConfigChangeUpdater(nextState, layerConfigChange(oldLayer, pick(newLayer.config, Object.keys(changed))));
372
+ }
373
+ }
374
+ return nextState;
375
+ }
376
+ function updatelayerVisibilty(state, newLayer, isVisible) {
377
+ var newState = updateStateOnLayerVisibilityChange(state, newLayer);
378
+ var filterIndex = filterSyncedWithTimeline(state);
379
+ if (isLayerAnimatable(newLayer) && filterIndex !== -1) {
380
+ // if layer is going to be visible we sync with filter otherwise we need to check whether other animatable layers exists and are visible
381
+ newState = syncTimeFilterWithLayerTimelineUpdater(newState, {
382
+ idx: filterIndex,
383
+ enable: isVisible ? isVisible : getAnimatableVisibleLayers(state.layers).length > 0
384
+ });
385
+ }
386
+ return newState;
387
+ }
388
+
389
+ /**
390
+ * Update layer base config: dataId, label, column, isVisible
391
+ * @memberof visStateUpdaters
392
+ * @returns nextState
393
+ */
394
+ // eslint-disable-next-line complexity
395
+ export function layerConfigChangeUpdater(state, action) {
396
+ var oldLayer = action.oldLayer;
397
+ var idx = state.layers.findIndex(function (l) {
398
+ return l.id === oldLayer.id;
399
+ });
400
+ var props = Object.keys(action.newConfig);
401
+ if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
402
+ var _action$newConfig = action.newConfig,
403
+ dataId = _action$newConfig.dataId,
404
+ restConfig = _objectWithoutProperties(_action$newConfig, _excluded);
405
+ var stateWithDataId = layerDataIdChangeUpdater(state, {
406
+ oldLayer: oldLayer,
407
+ newConfig: {
408
+ dataId: dataId
409
+ }
410
+ });
411
+ var nextLayer = stateWithDataId.layers.find(function (l) {
412
+ return l.id === oldLayer.id;
413
+ });
414
+ return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
415
+ oldLayer: nextLayer,
416
+ newConfig: restConfig
417
+ }) : stateWithDataId;
418
+ }
419
+ var newLayer = oldLayer.updateLayerConfig(action.newConfig);
420
+ var layerData;
421
+ if (newLayer.shouldCalculateLayerData(props)) {
422
+ var oldLayerData = state.layerData[idx];
423
+ var updateLayerDataResult = calculateLayerData(newLayer, state, oldLayerData);
424
+ newLayer = updateLayerDataResult.layer;
425
+ layerData = updateLayerDataResult.layerData;
426
+ }
427
+ var newState = state;
428
+ if ('isVisible' in action.newConfig) {
429
+ newState = updatelayerVisibilty(newState, newLayer, action.newConfig.isVisible);
430
+ }
431
+ if ('columns' in action.newConfig && newLayer.config.animation.enabled) {
432
+ // TODO: Shan, make the animation config function more robust
433
+ newState = updateAnimationDomain(newState);
434
+ }
435
+ return updateStateWithLayerAndData(newState, {
436
+ layer: newLayer,
437
+ layerData: layerData,
438
+ idx: idx
439
+ });
440
+ }
441
+ export function layerAnimationChangeUpdater(state, action) {
442
+ var oldLayer = action.oldLayer,
443
+ prop = action.prop,
444
+ value = action.value;
445
+ var idx = state.layers.findIndex(function (l) {
446
+ return l.id === oldLayer.id;
447
+ });
448
+ var newLayer = oldLayer.updateLayerConfig({
449
+ animation: _objectSpread(_objectSpread({}, oldLayer.config.animation), {}, _defineProperty({}, prop, value))
450
+ });
451
+ var _calculateLayerData = calculateLayerData(newLayer, state, state.layerData[idx]),
452
+ layerData = _calculateLayerData.layerData,
453
+ layer = _calculateLayerData.layer;
454
+ return updateStateWithLayerAndData(state, {
455
+ layerData: layerData,
456
+ layer: layer,
457
+ idx: idx
458
+ });
459
+ }
460
+
461
+ /**
462
+ * Update layerId, isVisible, splitMapId
463
+ * handles two cases:
464
+ * 1) toggle the visibility of local SplitMap layer (visState.splitMap.layers)
465
+ * 2) toggle the visibility of global layer (visState.layers)
466
+
467
+ * @memberof visStateUpdaters
468
+ * @returns nextState
469
+ */
470
+ export function layerToggleVisibilityUpdater(state, action) {
471
+ var layerId = action.layerId,
472
+ isVisible = action.isVisible,
473
+ splitMapId = action.splitMapId;
474
+ var layer = state.layers.find(function (d) {
475
+ return d.id === layerId;
476
+ });
477
+ if (!layer) {
478
+ return state;
479
+ }
480
+ var newState = state;
481
+ if (splitMapId) {
482
+ // [case 1]: toggle local layer visibility for each SplitMap
483
+ var mapIndex = newState.splitMaps.findIndex(function (sm) {
484
+ return sm.id === splitMapId;
485
+ });
486
+ if (isVisible) {
487
+ // 1) if the layer is invisible globally
488
+ // -> set global visibility to true
489
+ newState = layerConfigChangeUpdater(newState, layerConfigChange(layer, {
490
+ isVisible: true
491
+ }));
492
+
493
+ // -> set local visibility to true and the local visibilities of all other SplitMaps to false
494
+ return _objectSpread(_objectSpread({}, newState), {}, {
495
+ splitMaps: newState.splitMaps.map(function (sm) {
496
+ return sm.id !== splitMapId ? _objectSpread(_objectSpread({}, sm), {}, {
497
+ layers: _objectSpread(_objectSpread({}, sm.layers), {}, _defineProperty({}, layerId, false))
498
+ }) : _objectSpread(_objectSpread({}, sm), {}, {
499
+ layers: _objectSpread(_objectSpread({}, sm.layers), {}, _defineProperty({}, layerId, true))
500
+ });
501
+ })
502
+ });
503
+ }
504
+ // 2) else when the layer is visible globally
505
+ return toggleLayerForMapUpdater(newState, toggleLayerForMap(mapIndex, layerId));
506
+ } else {
507
+ // [case 2]: toggle global layer visibility
508
+ var newLayer = layer.updateLayerConfig({
509
+ isVisible: isVisible
510
+ });
511
+ var idx = newState.layers.findIndex(function (l) {
512
+ return l.id === layerId;
513
+ });
514
+ newState = updatelayerVisibilty(newState, newLayer, isVisible);
515
+ return updateStateWithLayerAndData(newState, {
516
+ layer: newLayer,
517
+ idx: idx
518
+ });
519
+ }
520
+ }
521
+
522
+ /**
523
+ *
524
+ * @param state
525
+ * @returns index of the filter synced to timeline or -1
526
+ */
527
+ function filterSyncedWithTimeline(state) {
528
+ return state.filters.findIndex(function (f) {
529
+ return f.syncedWithLayerTimeline;
530
+ });
531
+ }
532
+
533
+ /**
534
+ * Updates isValid flag of a layer.
535
+ * Updates isVisible based on the value of isValid.
536
+ * Triggers update of data for the layer in order to get errors again during next update iteration.
537
+ * @memberof visStateUpdaters
538
+ * @returns nextState
539
+ */
540
+ export function layerSetIsValidUpdater(state, action) {
541
+ var oldLayer = action.oldLayer,
542
+ isValid = action.isValid;
543
+ var idx = state.layers.findIndex(function (l) {
544
+ return l.id === oldLayer.id;
545
+ });
546
+ var layerToUpdate = state.layers[idx];
547
+ if (layerToUpdate) {
548
+ var newLayer;
549
+ var newData = null;
550
+ if (isValid) {
551
+ // Trigger data update in order to show errors again if present.
552
+ var _calculateLayerData2 = calculateLayerData(layerToUpdate, state, undefined),
553
+ layer = _calculateLayerData2.layer,
554
+ layerData = _calculateLayerData2.layerData;
555
+ newLayer = layer;
556
+ newData = layerData;
557
+ } else {
558
+ newLayer = layerToUpdate.updateLayerConfig({
559
+ isVisible: false
560
+ });
561
+ newLayer.isValid = false;
562
+ }
563
+ return updateStateWithLayerAndData(state, {
564
+ idx: idx,
565
+ layer: newLayer,
566
+ layerData: newData
567
+ });
568
+ }
569
+ return state;
570
+ }
571
+ function addOrRemoveTextLabels(newFields, textLabel) {
572
+ var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_TEXT_LABEL;
573
+ var newTextLabel = textLabel.slice();
574
+ var currentFields = textLabel.map(function (tl) {
575
+ return tl.field && tl.field.name;
576
+ }).filter(function (d) {
577
+ return d;
578
+ });
579
+ var addFields = newFields.filter(function (f) {
580
+ return !currentFields.includes(f.name);
581
+ });
582
+ var deleteFields = currentFields.filter(function (f) {
583
+ return !newFields.find(function (fd) {
584
+ return fd.name === f;
585
+ });
586
+ });
587
+
588
+ // delete
589
+ newTextLabel = newTextLabel.filter(function (tl) {
590
+ return tl.field && !deleteFields.includes(tl.field.name);
591
+ });
592
+ newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel;
593
+
594
+ // add
595
+ newTextLabel = [].concat(_toConsumableArray(newTextLabel.filter(function (tl) {
596
+ return tl.field;
597
+ })), _toConsumableArray(addFields.map(function (af) {
598
+ return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
599
+ field: af
600
+ });
601
+ })));
602
+ return newTextLabel;
603
+ }
604
+ function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
605
+ if (!Object.prototype.hasOwnProperty.call(textLabel[idx], prop)) {
606
+ return textLabel;
607
+ }
608
+ var newTextLabel = textLabel.slice();
609
+ if (prop === 'field' && value === null && textLabel.length > 1) {
610
+ // remove label when field value is set to null
611
+ newTextLabel.splice(idx, 1);
612
+ } else if (prop) {
613
+ newTextLabel = textLabel.map(function (tl, i) {
614
+ return i === idx ? _objectSpread(_objectSpread({}, tl), {}, _defineProperty({}, prop, value)) : tl;
615
+ });
616
+ }
617
+ return newTextLabel;
618
+ }
619
+
620
+ /**
621
+ * Update layer base config: dataId, label, column, isVisible
622
+ * @memberof visStateUpdaters
623
+ * @returns nextState
624
+ */
625
+ export function layerTextLabelChangeUpdater(state, action) {
626
+ var _oldLayer$getDefaultL, _oldLayer$getDefaultL2;
627
+ var oldLayer = action.oldLayer,
628
+ idx = action.idx,
629
+ prop = action.prop,
630
+ value = action.value;
631
+ var textLabel = oldLayer.config.textLabel;
632
+
633
+ // when adding a new empty text label,
634
+ // rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
635
+ var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
636
+ dataId: ''
637
+ })) === 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 : DEFAULT_TEXT_LABEL;
638
+ var newTextLabel = textLabel.slice();
639
+ if (!textLabel[idx] && idx === textLabel.length) {
640
+ // if idx is set to length, add empty text label
641
+ newTextLabel = [].concat(_toConsumableArray(textLabel), [defaultTextLabel]);
642
+ }
643
+ if (idx === 'all' && prop === 'fields') {
644
+ newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
645
+ } else {
646
+ newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
647
+ }
648
+ // update text label prop and value
649
+ return layerConfigChangeUpdater(state, {
650
+ oldLayer: oldLayer,
651
+ newConfig: {
652
+ textLabel: newTextLabel
653
+ }
654
+ });
655
+ }
656
+ function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
657
+ var loadedLayer = serializeLayer(layer, schema);
658
+ return loadedLayer ? validateLayerWithData(dataset, loadedLayer, layerClasses, {
659
+ allowEmptyColumn: true
660
+ }) : null;
661
+ }
662
+
663
+ /**
664
+ * Update layer config dataId
665
+ * @memberof visStateUpdaters
666
+ * @returns nextState
667
+ */
668
+ export function layerDataIdChangeUpdater(state, action) {
669
+ var oldLayer = action.oldLayer,
670
+ newConfig = action.newConfig;
671
+ var dataId = newConfig.dataId;
672
+ if (!oldLayer || !state.datasets[dataId]) {
673
+ return state;
674
+ }
675
+ var idx = state.layers.findIndex(function (l) {
676
+ return l.id === oldLayer.id;
677
+ });
678
+ var newLayer = oldLayer.updateLayerConfig({
679
+ dataId: dataId
680
+ });
681
+
682
+ // this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
683
+ if (newLayer.isValidToSave()) {
684
+ var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema);
685
+ // if cant validate it with data create a new one
686
+ if (!validated) {
687
+ var oldLayerType = oldLayer.type;
688
+ if (oldLayerType) {
689
+ newLayer = new state.layerClasses[oldLayerType]({
690
+ dataId: dataId,
691
+ id: oldLayer.id
692
+ });
693
+ }
694
+ } else {
695
+ newLayer = validated;
696
+ }
697
+ } else {
698
+ // Layer is not valid to save (e.g. missing columns), but we still need to
699
+ // remap visual channel fields to the new dataset to avoid stale field references
700
+ // that point to rows beyond the new dataset's length
701
+ var newDatasetFields = state.datasets[dataId].fields;
702
+ var remappedFields = {};
703
+ Object.values(newLayer.visualChannels).forEach(function (_ref2) {
704
+ var fieldKey = _ref2.field;
705
+ var currentField = newLayer.config[fieldKey];
706
+ if (currentField) {
707
+ var matched = newDatasetFields.find(function (f) {
708
+ return f.name === currentField.name;
709
+ });
710
+ remappedFields[fieldKey] = matched || null;
711
+ }
712
+ });
713
+ if (Object.keys(remappedFields).length) {
714
+ newLayer = newLayer.updateLayerConfig(remappedFields);
715
+ }
716
+ // Validate field type compatibility — clears fields whose type is incompatible
717
+ // with the channel's supported field types (e.g. string field for a numeric scale)
718
+ Object.values(newLayer.visualChannels).forEach(function (_ref3) {
719
+ var key = _ref3.key;
720
+ newLayer.validateVisualChannel(key);
721
+ });
722
+ }
723
+ newLayer = newLayer.updateLayerConfig({
724
+ isVisible: oldLayer.config.isVisible,
725
+ isConfigActive: true
726
+ });
727
+ newLayer.updateLayerDomain(state.datasets);
728
+ var _calculateLayerData3 = calculateLayerData(newLayer, state, undefined),
729
+ layerData = _calculateLayerData3.layerData,
730
+ layer = _calculateLayerData3.layer;
731
+ return updateStateWithLayerAndData(state, {
732
+ layerData: layerData,
733
+ layer: layer,
734
+ idx: idx
735
+ });
736
+ }
737
+ export function setInitialLayerConfig(layer, datasets, layerClasses) {
738
+ var newLayer = layer;
739
+ if (!Object.keys(datasets).length) {
740
+ // no data is loaded
741
+ return layer;
742
+ }
743
+ if (!layer.config.dataId) {
744
+ // set layer dataId
745
+ newLayer = layer.updateLayerConfig({
746
+ dataId: Object.keys(datasets)[0]
747
+ });
748
+ }
749
+ var dataset = datasets[newLayer.config.dataId];
750
+ if (!dataset) {
751
+ return layer;
752
+ }
753
+
754
+ // find defaut layer props
755
+ var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
756
+ props: []
757
+ };
758
+
759
+ // an array of possible props, use 1st one
760
+ var props = Array.isArray(result) ? result : result.props || [];
761
+ if (props.length) {
762
+ newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
763
+ label: newLayer.config.label,
764
+ dataId: newLayer.config.dataId,
765
+ isConfigActive: newLayer.config.isConfigActive,
766
+ isVisible: newLayer.config.isVisible
767
+ }));
768
+ }
769
+ return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
770
+ }
771
+ /**
772
+ * Update layer type. Previews layer config will be copied if applicable.
773
+ * @memberof visStateUpdaters
774
+ * @public
775
+ */
776
+ export function layerTypeChangeUpdater(state, action) {
777
+ var oldLayer = action.oldLayer,
778
+ newType = action.newType;
779
+ if (!oldLayer) {
780
+ return state;
781
+ }
782
+ var oldId = oldLayer.id;
783
+ var idx = state.layers.findIndex(function (l) {
784
+ return l.id === oldId;
785
+ });
786
+ if (!state.layerClasses[newType]) {
787
+ Console.error("".concat(newType, " is not a valid layer type"));
788
+ return state;
789
+ }
790
+ var newLayer = new state.layerClasses[newType]({
791
+ // keep old layer lable and isConfigActive
792
+ label: oldLayer.config.label,
793
+ isConfigActive: oldLayer.config.isConfigActive,
794
+ dataId: oldLayer.config.dataId
795
+ });
796
+ if (!oldLayer.type) {
797
+ // if setting layer type on an empty layer
798
+ newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
799
+ } else {
800
+ // get a mint layer, with new id and type
801
+ // because deck.gl uses id to match between new and old layer.
802
+ // If type has changed but id is the same, it will break
803
+
804
+ var defaultLayerProps = typeof state.layerClasses[newType].findDefaultLayerProps === 'function' ? state.layerClasses[newType].findDefaultLayerProps(state.datasets[newLayer.config.dataId]) : null;
805
+ newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings, state.datasets, defaultLayerProps);
806
+ newLayer.updateLayerDomain(state.datasets);
807
+ }
808
+ var clicked = state.clicked,
809
+ hoverInfo = state.hoverInfo;
810
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
811
+ clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
812
+ hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
813
+ });
814
+ var _calculateLayerData4 = calculateLayerData(newLayer, newState),
815
+ layerData = _calculateLayerData4.layerData,
816
+ layer = _calculateLayerData4.layer;
817
+ newState = updateStateWithLayerAndData(newState, {
818
+ layerData: layerData,
819
+ layer: layer,
820
+ idx: idx
821
+ });
822
+ if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
823
+ newState = updateAnimationDomain(newState);
824
+ }
825
+
826
+ // update splitMap layer id
827
+ if (state.splitMaps.length) {
828
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
829
+ splitMaps: newState.splitMaps.map(function (settings) {
830
+ var _settings$layers = settings.layers,
831
+ oldLayerMap = _settings$layers[oldId],
832
+ otherLayers = _objectWithoutProperties(_settings$layers, [oldId].map(_toPropertyKey));
833
+ return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
834
+ layers: _objectSpread(_objectSpread({}, otherLayers), {}, _defineProperty({}, layer.id, oldLayerMap))
835
+ }) : settings;
836
+ })
837
+ });
838
+ }
839
+
840
+ // update layerOrder with new id
841
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
842
+ layerOrder: replaceLayerEntryInLayerOrder(newState.layerOrder, oldLayer.id, newLayer.id)
843
+ });
844
+ return newState;
845
+ }
846
+
847
+ /**
848
+ * Update layer visual channel
849
+ * @memberof visStateUpdaters
850
+ * @returns {Object} nextState
851
+ * @public
852
+ */
853
+ export function layerVisualChannelChangeUpdater(state, action) {
854
+ var oldLayer = action.oldLayer,
855
+ newConfig = action.newConfig,
856
+ newVisConfig = action.newVisConfig,
857
+ channel = action.channel;
858
+ if (!oldLayer.config.dataId) {
859
+ return state;
860
+ }
861
+ var dataset = state.datasets[oldLayer.config.dataId];
862
+ var idx = state.layers.findIndex(function (l) {
863
+ return l.id === oldLayer.id;
864
+ });
865
+ var newLayer = oldLayer.updateLayerConfig(newConfig);
866
+ if (newVisConfig) newLayer = newLayer.updateLayerVisConfig(newVisConfig);
867
+ newLayer.updateLayerVisualChannel(dataset, channel);
868
+
869
+ // calling update animation domain first to merge all layer animation domain
870
+ var updatedState = updateAnimationDomain(state);
871
+ var visualChannel = oldLayer.visualChannels[channel];
872
+ if ((visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.channelScaleType) === CHANNEL_SCALES.color && newConfig[visualChannel.field]) {
873
+ // if color field changed, set customBreaks to false
874
+ newLayer.updateLayerColorUI(visualChannel.range, {
875
+ colorRangeConfig: _objectSpread(_objectSpread({}, newLayer.config.colorUI[visualChannel.range].colorRangeConfig), {}, {
876
+ customBreaks: false
877
+ })
878
+ });
879
+ updatedState = _objectSpread(_objectSpread({}, updatedState), {}, {
880
+ layers: updatedState.layers.map(function (l) {
881
+ return l.id === oldLayer.id ? newLayer : l;
882
+ })
883
+ });
884
+ }
885
+ var oldLayerData = updatedState.layerData[idx];
886
+ var _calculateLayerData5 = calculateLayerData(newLayer, updatedState, oldLayerData),
887
+ layerData = _calculateLayerData5.layerData,
888
+ layer = _calculateLayerData5.layer;
889
+ if ((visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.channelScaleType) === CHANNEL_SCALES.color && newConfig[visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.scale] === SCALE_TYPES.customOrdinal && !newVisConfig) {
890
+ // when switching to customOrdinal scale, create a customPalette in colorUI with updated colorDomain
891
+ var customPalette = initCustomPaletteByCustomScale({
892
+ scale: SCALE_TYPES.customOrdinal,
893
+ field: layer.config[visualChannel.field],
894
+ ordinalDomain: layer.config[layer.visualChannels[channel].domain],
895
+ range: layer.config.visConfig[visualChannel.range],
896
+ colorBreaks: null
897
+ });
898
+ // update colorRange with new customPalette
899
+ layer.updateLayerColorUI(visualChannel.range, {
900
+ showColorChart: true,
901
+ colorRangeConfig: _objectSpread(_objectSpread({}, layer.config.colorUI[visualChannel.range].colorRangeConfig), {}, {
902
+ customBreaks: true
903
+ }),
904
+ customPalette: customPalette
905
+ });
906
+ }
907
+ return updateStateWithLayerAndData(updatedState, {
908
+ layerData: layerData,
909
+ layer: layer,
910
+ idx: idx
911
+ });
912
+ }
913
+
914
+ /**
915
+ * Update layer `visConfig`
916
+ * @memberof visStateUpdaters
917
+ * @public
918
+ */
919
+ export function layerVisConfigChangeUpdater(state, action) {
920
+ var oldLayer = action.oldLayer;
921
+ var idx = state.layers.findIndex(function (l) {
922
+ return l.id === oldLayer.id;
923
+ });
924
+ var props = Object.keys(action.newVisConfig);
925
+ var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
926
+ var newLayer = oldLayer.updateLayerConfig({
927
+ visConfig: newVisConfig
928
+ });
929
+ var nextState = state;
930
+
931
+ // Exclusive bitmap editing: when editBounds is turned on for one bitmap layer,
932
+ // turn it off for all other bitmap layers
933
+ if (newLayer.type === 'bitmap' && action.newVisConfig.editBounds === true) {
934
+ nextState = _objectSpread(_objectSpread({}, nextState), {}, {
935
+ layers: nextState.layers.map(function (l, i) {
936
+ if (i !== idx && l.type === 'bitmap' && l.config.visConfig.editBounds) {
937
+ return l.updateLayerConfig({
938
+ visConfig: _objectSpread(_objectSpread({}, l.config.visConfig), {}, {
939
+ editBounds: false
940
+ })
941
+ });
942
+ }
943
+ return l;
944
+ })
945
+ });
946
+ }
947
+ if (newLayer.shouldCalculateLayerData(props)) {
948
+ var oldLayerData = nextState.layerData[idx];
949
+ var _calculateLayerData6 = calculateLayerData(newLayer, nextState, oldLayerData),
950
+ layerData = _calculateLayerData6.layerData,
951
+ layer = _calculateLayerData6.layer;
952
+ return updateStateWithLayerAndData(nextState, {
953
+ layerData: layerData,
954
+ layer: layer,
955
+ idx: idx
956
+ });
957
+ }
958
+ return updateStateWithLayerAndData(nextState, {
959
+ layer: newLayer,
960
+ idx: idx
961
+ });
962
+ }
963
+
964
+ /**
965
+ * Reset animation config current time to a specified value
966
+ * @memberof visStateUpdaters
967
+ * @public
968
+ *
969
+ */
970
+ export var setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref4) {
971
+ var value = _ref4.value;
972
+ var currentTime = Array.isArray(value) ? value[0] : value;
973
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
974
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
975
+ currentTime: currentTime
976
+ })
977
+ });
978
+ // update animation config for each layer
979
+ return state.layers.reduce(function (accu, l) {
980
+ if (l.config.animation.enabled && l.type !== 'trip') {
981
+ return layerAnimationChangeUpdater(accu, {
982
+ oldLayer: l,
983
+ prop: 'currentTime',
984
+ currentTime: currentTime
985
+ });
986
+ }
987
+ return accu;
988
+ }, nextState);
989
+ };
990
+
991
+ /**
992
+ * Update filter property
993
+ * @memberof visStateUpdaters
994
+ * @public
995
+ */
996
+ export function setFilterAnimationTimeUpdater(state, action) {
997
+ return setFilterUpdater(state, action);
998
+ }
999
+
1000
+ /**
1001
+ * Update filter animation window
1002
+ * @memberof visStateUpdaters
1003
+ * @public
1004
+ */
1005
+ export function setFilterAnimationWindowUpdater(state, _ref5) {
1006
+ var id = _ref5.id,
1007
+ animationWindow = _ref5.animationWindow;
1008
+ var filter = state.filters.find(function (f) {
1009
+ return f.id === id;
1010
+ });
1011
+ if (!filter) {
1012
+ return state;
1013
+ }
1014
+ var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
1015
+ animationWindow: animationWindow
1016
+ });
1017
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1018
+ filters: swap_(newFilter)(state.filters)
1019
+ });
1020
+ var newSyncTimelineMode = getSyncAnimationMode(newFilter);
1021
+ return setTimeFilterTimelineModeUpdater(newState, {
1022
+ id: id,
1023
+ mode: newSyncTimelineMode
1024
+ });
1025
+ }
1026
+ export function applyFilterConfigUpdater(state, action) {
1027
+ var _serializeFilter;
1028
+ var filterId = action.filterId,
1029
+ newFilter = action.newFilter;
1030
+ var oldFilter = state.filters.find(function (f) {
1031
+ return f.id === filterId;
1032
+ });
1033
+ if (!oldFilter) {
1034
+ return state;
1035
+ }
1036
+
1037
+ // Serialize the filters to only compare the saved properties
1038
+ var serializedOldFilter = (_serializeFilter = serializeFilter(oldFilter, state.schema)) !== null && _serializeFilter !== void 0 ? _serializeFilter : {
1039
+ config: {}
1040
+ };
1041
+ var serializedNewFilter = serializeFilter(newFilter, state.schema);
1042
+ if (!serializedNewFilter || isEqual(serializedOldFilter, serializedNewFilter)) {
1043
+ return state;
1044
+ }
1045
+
1046
+ // If there are any changes to the filter, apply them
1047
+ var changed = pickChangedProps(serializedOldFilter, serializedNewFilter);
1048
+ delete changed['id']; // id should not be changed
1049
+
1050
+ var filterIndex = state.filters.findIndex(function (f) {
1051
+ return f.id === filterId;
1052
+ });
1053
+ if (filterIndex < 0) {
1054
+ return state;
1055
+ }
1056
+ return setFilterUpdater(state, setFilter(filterIndex, Object.keys(changed), Object.values(changed)));
1057
+ }
1058
+
1059
+ /**
1060
+ * Update filter property
1061
+ * @memberof visStateUpdaters
1062
+ * @public
1063
+ */
1064
+ export function setFilterUpdater(state, action) {
1065
+ var idx = action.idx,
1066
+ _action$valueIndex = action.valueIndex,
1067
+ valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
1068
+ var oldFilter = state.filters[idx];
1069
+ if (!oldFilter) {
1070
+ Console.error("filters.".concat(idx, " is undefined"));
1071
+ return state;
1072
+ }
1073
+ if (Array.isArray(action.prop) && (!Array.isArray(action.value) || action.prop.length !== action.value.length)) {
1074
+ Console.error('Expecting value to be an array of the same length, since prop is an array');
1075
+ return state;
1076
+ }
1077
+ // convert prop and value to array
1078
+ var props = toArray(action.prop);
1079
+ var values = Array.isArray(action.prop) ? toArray(action.value) : [action.value];
1080
+ var newFilter = oldFilter;
1081
+ var newState = state;
1082
+ var datasetIdsToFilter = [];
1083
+ var _loop = function _loop() {
1084
+ var prop = props[i];
1085
+ var value = values[i];
1086
+ // We currently do not support passing in name as an array into _updateFilterProp, so we call it multiple times with each name
1087
+ // See the comment in there as to what should be addressed
1088
+ var res;
1089
+ if (prop === 'name' && Array.isArray(value)) {
1090
+ // eslint-disable-next-line no-loop-func
1091
+ res = value.reduce(function (accu, v) {
1092
+ return _updateFilterProp(accu, newFilter, prop, v, valueIndex);
1093
+ }, newState);
1094
+ } else {
1095
+ res = _updateFilterProp(newState, newFilter, prop, value, valueIndex);
1096
+ }
1097
+ newFilter = res.filter;
1098
+ newState = res.state;
1099
+ datasetIdsToFilter = datasetIdsToFilter.concat(res.datasetIdsToFilter);
1100
+ };
1101
+ for (var i = 0; i < props.length; i++) {
1102
+ _loop();
1103
+ }
1104
+ var enlargedFilter = state.filters.find(function (f) {
1105
+ return f.view === FILTER_VIEW_TYPES.enlarged;
1106
+ });
1107
+ if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
1108
+ // there should be only one enlarged filter
1109
+ newFilter.view = FILTER_VIEW_TYPES.side;
1110
+ }
1111
+
1112
+ // save new filters to newState
1113
+ newState = set(['filters', idx], newFilter, newState);
1114
+
1115
+ // filter data
1116
+ var filteredDatasets = applyFiltersToDatasets(uniq(datasetIdsToFilter), newState.datasets, newState.filters, newState.layers);
1117
+ newState = set(['datasets'], filteredDatasets, newState);
1118
+
1119
+ // need to update filterPlot after filter Dataset for plot to update on filtered result
1120
+ var filterWithPLot = updateFilterPlot(newState.datasets, newState.filters[idx]);
1121
+ newState = set(['filters', idx], filterWithPLot, newState);
1122
+
1123
+ // dataId is an array
1124
+ // pass only the dataset we need to update
1125
+ newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
1126
+
1127
+ // If time range filter value was updated, adjust animation config
1128
+ if (newFilter.type === FILTER_TYPES.timeRange && props.includes('value')) {
1129
+ newState = adjustAnimationConfigWithFilter(newState, action.idx);
1130
+ }
1131
+ return newState;
1132
+ }
1133
+ function _updateFilterDataIdAtValueIndex(filter, valueIndex, value, datasets) {
1134
+ var newFilter = filter;
1135
+ if (filter.dataId[valueIndex]) {
1136
+ // if dataId already exist
1137
+ newFilter = _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets);
1138
+ }
1139
+ if (value) {
1140
+ var nextValue = newFilter.dataId.slice();
1141
+ nextValue[valueIndex] = value;
1142
+ newFilter = set(['dataId'], nextValue, newFilter);
1143
+ }
1144
+ return newFilter;
1145
+ }
1146
+ function _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets) {
1147
+ var dataId = filter.dataId[valueIndex];
1148
+ if (filter.dataId.length === 1 && valueIndex === 0) {
1149
+ // if remove the only dataId, create an empty filter instead;
1150
+ return getDefaultFilter({
1151
+ id: filter.id
1152
+ });
1153
+ }
1154
+ if (dataId) {
1155
+ filter = removeFilterPlot(filter, dataId);
1156
+ }
1157
+ for (var _i = 0, _arr = ['dataId', 'name', 'fieldIdx', 'gpuChannel']; _i < _arr.length; _i++) {
1158
+ var prop = _arr[_i];
1159
+ if (Array.isArray(filter[prop])) {
1160
+ var nextVal = filter[prop].slice();
1161
+ nextVal.splice(valueIndex, 1);
1162
+ filter = set([prop], nextVal, filter);
1163
+ }
1164
+ }
1165
+
1166
+ // mergeFieldDomain for the remaining fields
1167
+ var domainSteps = mergeFilterDomain(filter, datasets);
1168
+ var nextFilter = _objectSpread(_objectSpread({}, filter), domainSteps ? {
1169
+ domain: domainSteps === null || domainSteps === void 0 ? void 0 : domainSteps.domain,
1170
+ step: domainSteps === null || domainSteps === void 0 ? void 0 : domainSteps.step
1171
+ } : {});
1172
+ var nextValue = adjustValueToFilterDomain(nextFilter.value, nextFilter);
1173
+ return _objectSpread(_objectSpread({}, nextFilter), {}, {
1174
+ value: nextValue
1175
+ });
1176
+ }
1177
+
1178
+ /** *
1179
+ * Updates a single property of a filter
1180
+ */
1181
+ function _updateFilterProp(state, filter, prop, value, valueIndex, datasetIds) {
1182
+ var datasetIdsToFilter = [];
1183
+ switch (prop) {
1184
+ // TODO: Next PR for UI if we update filterDataId, we need to consider two cases:
1185
+ // 1. dataId is empty: create a default filter
1186
+ // 2. Add a new dataset id
1187
+ case FILTER_UPDATER_PROPS.dataId:
1188
+ {
1189
+ var oldDataId = _toConsumableArray(filter.dataId);
1190
+ filter = _updateFilterDataIdAtValueIndex(filter, valueIndex, value, state.datasets);
1191
+ datasetIdsToFilter = uniq([].concat(_toConsumableArray(oldDataId), _toConsumableArray(filter.dataId)));
1192
+ break;
1193
+ }
1194
+ case FILTER_UPDATER_PROPS.name:
1195
+ {
1196
+ // we are supporting the current functionality
1197
+ // TODO: Next PR for UI filter name will only update filter name but it won't have side effects
1198
+ // we are gonna use pair of datasets and fieldIdx to update the filter
1199
+ var datasetId = filter.dataId[valueIndex];
1200
+ var _applyFilterFieldName = applyFilterFieldName(filter, state.datasets, datasetId, value, valueIndex, {
1201
+ mergeDomain: valueIndex > 0
1202
+ }),
1203
+ updatedFilter = _applyFilterFieldName.filter,
1204
+ newDataset = _applyFilterFieldName.dataset;
1205
+ if (updatedFilter) {
1206
+ filter = updatedFilter;
1207
+ if (filter.gpu) {
1208
+ filter = setFilterGpuMode(filter, state.filters);
1209
+ filter = assignGpuChannel(filter, state.filters);
1210
+ }
1211
+ state = set(['datasets', datasetId], newDataset, state);
1212
+ // remove filter Plot at datasetId, so it will be recalculated
1213
+ filter = removeFilterPlot(filter, datasetId);
1214
+ datasetIdsToFilter = updatedFilter.dataId;
1215
+ }
1216
+ // only filter the current dataset
1217
+ break;
1218
+ }
1219
+ case FILTER_UPDATER_PROPS.layerId:
1220
+ {
1221
+ // We need to update only datasetId/s if we have added/removed layers
1222
+ // - check for layerId changes (XOR works because of string values)
1223
+ // if no differences between layerIds, don't do any filtering
1224
+ // @ts-ignore
1225
+ var layerIdDifference = xor(value, filter.layerId);
1226
+ var layerDataIds = uniq(layerIdDifference.map(function (lid) {
1227
+ return get(state.layers.find(function (l) {
1228
+ return l.id === lid;
1229
+ }), ['config', 'dataId']);
1230
+ }).filter(function (d) {
1231
+ return d;
1232
+ }));
1233
+
1234
+ // only filter datasetsIds
1235
+ datasetIdsToFilter = layerDataIds;
1236
+
1237
+ // Update newFilter dataIds
1238
+ var newDataIds = uniq(value === null || value === void 0 ? void 0 : value.map(function (lid) {
1239
+ return get(state.layers.find(function (l) {
1240
+ return l.id === lid;
1241
+ }), ['config', 'dataId']);
1242
+ }).filter(function (d) {
1243
+ return d;
1244
+ }));
1245
+ filter = _objectSpread(_objectSpread({}, filter), {}, {
1246
+ layerId: value,
1247
+ dataId: newDataIds
1248
+ });
1249
+ break;
1250
+ }
1251
+ default:
1252
+ filter = set([prop], value, filter);
1253
+ datasetIdsToFilter = _toConsumableArray(filter.dataId);
1254
+ break;
1255
+ }
1256
+ return {
1257
+ filter: filter,
1258
+ datasetIds: datasetIds,
1259
+ datasetIdsToFilter: datasetIdsToFilter,
1260
+ state: state
1261
+ };
1262
+ }
1263
+ /* eslint-enable max-statements */
1264
+
1265
+ /**
1266
+ * Set the property of a filter plot
1267
+ * @memberof visStateUpdaters
1268
+ * @public
1269
+ */
1270
+ export var setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref6) {
1271
+ var idx = _ref6.idx,
1272
+ newProp = _ref6.newProp;
1273
+ if (!state.filters[idx]) {
1274
+ Console.error("filters[".concat(idx, "] is undefined"));
1275
+ return state;
1276
+ }
1277
+ var newFilter = state.filters[idx];
1278
+ for (var prop in newProp) {
1279
+ if (prop === 'plotType') {
1280
+ newFilter = pick_('plotType')(merge_(newProp.plotType))(newFilter);
1281
+ } else if (prop === 'yAxis') {
1282
+ var chartType = newProp.yAxis ? PLOT_TYPES.lineChart : PLOT_TYPES.histogram;
1283
+ newFilter = pick_('plotType')(merge_({
1284
+ type: chartType
1285
+ }))(merge_(newProp)(newFilter));
1286
+ }
1287
+ }
1288
+ newFilter = updateFilterPlot(state.datasets, newFilter);
1289
+ return _objectSpread(_objectSpread({}, state), {}, {
1290
+ filters: state.filters.map(function (f, i) {
1291
+ return i === idx ? newFilter : f;
1292
+ })
1293
+ });
1294
+ };
1295
+
1296
+ /**
1297
+ * Add a new filter
1298
+ * @memberof visStateUpdaters
1299
+ * @public
1300
+ */
1301
+ export var addFilterUpdater = function addFilterUpdater(state, action) {
1302
+ return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
1303
+ filters: [].concat(_toConsumableArray(state.filters), [getDefaultFilter({
1304
+ dataId: action.dataId,
1305
+ id: action.id
1306
+ })])
1307
+ });
1308
+ };
1309
+
1310
+ /**
1311
+ * Create or update a filter
1312
+ * @memberof visStateUpdaters
1313
+ * @public
1314
+ */
1315
+ export var createOrUpdateFilterUpdater = function createOrUpdateFilterUpdater(state, action) {
1316
+ var id = action.id,
1317
+ dataId = action.dataId,
1318
+ field = action.field,
1319
+ value = action.value;
1320
+ var newState = state;
1321
+ var originalIndex = newState.filters.findIndex(function (f) {
1322
+ return f.id === id;
1323
+ });
1324
+ var filterIndex = originalIndex;
1325
+ if (!id && !dataId) {
1326
+ return newState;
1327
+ }
1328
+ if (originalIndex < 0 && dataId) {
1329
+ newState = addFilterUpdater(newState, {
1330
+ dataId: dataId
1331
+ });
1332
+ if (newState.filters.length !== state.filters.length + 1) {
1333
+ // No new filter was added
1334
+ return state;
1335
+ }
1336
+ // Here we are assuming that the filter was added at the end
1337
+ filterIndex = newState.filters.length - 1;
1338
+ newState.filters[filterIndex] = _objectSpread(_objectSpread({}, newState.filters[filterIndex]), id ? {
1339
+ id: id
1340
+ } : null);
1341
+ }
1342
+
1343
+ // No need to update this if it's a newly created filter
1344
+ // First we make sure all the dataIds that fields refer to are updated
1345
+ if (originalIndex >= 0 && dataId) {
1346
+ // If the dataId is an array, we need to update each one individually as they need a correct valueIndex passed
1347
+ newState = (Array.isArray(dataId) ? dataId : [dataId]).reduce(function (accu, d, index) {
1348
+ return setFilterUpdater(accu, {
1349
+ idx: filterIndex,
1350
+ prop: 'dataId',
1351
+ value: d,
1352
+ valueIndex: index
1353
+ });
1354
+ }, newState);
1355
+ }
1356
+ // Then we update the fields
1357
+ if (field) {
1358
+ // If the field is an array, we need to update each field individually as they need a correct valueIndex passed
1359
+ newState = (Array.isArray(field) ? field : [field]).reduce(function (accu, f, index) {
1360
+ return setFilterUpdater(accu, {
1361
+ idx: filterIndex,
1362
+ prop: 'name',
1363
+ value: f,
1364
+ valueIndex: index
1365
+ });
1366
+ }, newState);
1367
+ }
1368
+ // Then we update the value separately
1369
+ if (value !== null && typeof value !== 'undefined') {
1370
+ newState = setFilterUpdater(newState, {
1371
+ idx: filterIndex,
1372
+ prop: 'value',
1373
+ value: value
1374
+ });
1375
+ }
1376
+ return newState;
1377
+ };
1378
+
1379
+ /**
1380
+ * Set layer color palette ui state
1381
+ * @memberof visStateUpdaters
1382
+ */
1383
+ export var layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref7) {
1384
+ var oldLayer = _ref7.oldLayer,
1385
+ prop = _ref7.prop,
1386
+ newConfig = _ref7.newConfig;
1387
+ var oldVixConfig = oldLayer.config.visConfig[prop];
1388
+ var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
1389
+ var newVisConfig = newLayer.config.visConfig[prop];
1390
+ if (oldVixConfig !== newVisConfig) {
1391
+ return layerVisConfigChangeUpdater(state, {
1392
+ oldLayer: oldLayer,
1393
+ newVisConfig: _defineProperty({}, prop, newVisConfig)
1394
+ });
1395
+ }
1396
+ return _objectSpread(_objectSpread({}, state), {}, {
1397
+ layers: state.layers.map(function (l) {
1398
+ return l.id === oldLayer.id ? newLayer : l;
1399
+ })
1400
+ });
1401
+ };
1402
+
1403
+ /**
1404
+ * Start and end filter animation
1405
+ * @memberof visStateUpdaters
1406
+ * @public
1407
+ */
1408
+ export var toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
1409
+ return _objectSpread(_objectSpread({}, state), {}, {
1410
+ filters: state.filters.map(function (f, i) {
1411
+ return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
1412
+ isAnimating: !f.isAnimating
1413
+ }) : f;
1414
+ })
1415
+ });
1416
+ };
1417
+ export function isFilterAnimationConfig(config) {
1418
+ return 'dataId' in config && 'animationWindow' in config;
1419
+ }
1420
+ export function setAnimationConfigUpdater(state, action) {
1421
+ var config = action.config;
1422
+ if (isFilterAnimationConfig(config)) {
1423
+ // Find filter used for animation
1424
+ // Assuming there's only one filter used for animation, see setFilterViewUpdater
1425
+ var filter = state.filters.find(function (f) {
1426
+ return !isSideFilter(f);
1427
+ });
1428
+ if (!filter) {
1429
+ return state;
1430
+ }
1431
+ var newFilter = _objectSpread(_objectSpread({}, filter), config);
1432
+ return applyFilterConfigUpdater(state, applyFilterConfig(filter.id, newFilter));
1433
+ } else {
1434
+ return _objectSpread(_objectSpread({}, state), {}, {
1435
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), config)
1436
+ });
1437
+ }
1438
+ }
1439
+
1440
+ /**
1441
+ * @memberof visStateUpdaters
1442
+ * @public
1443
+ */
1444
+ export var toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
1445
+ return _objectSpread(_objectSpread({}, state), {}, {
1446
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1447
+ isAnimating: !state.animationConfig.isAnimating
1448
+ })
1449
+ });
1450
+ };
1451
+
1452
+ /**
1453
+ * Hide and show layer animation control
1454
+ * @memberof visStateUpdaters
1455
+ * @public
1456
+ */
1457
+ export var toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state) {
1458
+ return _objectSpread(_objectSpread({}, state), {}, {
1459
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1460
+ hideControl: !state.animationConfig.hideControl
1461
+ })
1462
+ });
1463
+ };
1464
+
1465
+ /**
1466
+ * Change filter animation speed
1467
+ * @memberof visStateUpdaters
1468
+ * @public
1469
+ */
1470
+ export var updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
1471
+ return _objectSpread(_objectSpread({}, state), {}, {
1472
+ filters: state.filters.map(function (f, i) {
1473
+ return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
1474
+ speed: action.speed
1475
+ }) : f;
1476
+ })
1477
+ });
1478
+ };
1479
+
1480
+ /**
1481
+ * Update animation speed with the vertical speed slider
1482
+ * @memberof visStateUpdaters
1483
+ * @public
1484
+ *
1485
+ */
1486
+ export var updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref8) {
1487
+ var speed = _ref8.speed;
1488
+ return _objectSpread(_objectSpread({}, state), {}, {
1489
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
1490
+ speed: speed
1491
+ })
1492
+ });
1493
+ };
1494
+
1495
+ /**
1496
+ * Show larger time filter at bottom for time playback (apply to time filter only)
1497
+ * @memberof visStateUpdaters
1498
+ * @public
1499
+ */
1500
+ export var setFilterViewUpdater = function setFilterViewUpdater(state, action) {
1501
+ var view = action.view,
1502
+ idx = action.idx;
1503
+ var shouldResetOtherFiltersView = view === FILTER_VIEW_TYPES.enlarged;
1504
+ return _objectSpread(_objectSpread({}, state), {}, {
1505
+ filters: state.filters.map(function (f, i) {
1506
+ return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
1507
+ view: view
1508
+ }) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
1509
+ view: FILTER_VIEW_TYPES.side
1510
+ }) : f;
1511
+ })
1512
+ });
1513
+ };
1514
+
1515
+ /**
1516
+ * Toggles filter feature visibility
1517
+ * @memberof visStateUpdaters
1518
+ */
1519
+ export var toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
1520
+ var filter = state.filters[action.idx];
1521
+ var isVisible = get(filter, ['value', 'properties', 'isVisible']);
1522
+ var newState = setFilterUpdater(state, {
1523
+ idx: action.idx,
1524
+ prop: 'enabled',
1525
+ value: !isVisible
1526
+ });
1527
+ newState = setFilterUpdater(newState, {
1528
+ idx: action.idx,
1529
+ prop: 'value',
1530
+ value: featureToFilterValue(filter.value, filter.id, {
1531
+ isVisible: !isVisible
1532
+ })
1533
+ });
1534
+ return newState;
1535
+ };
1536
+
1537
+ /**
1538
+ * Remove a filter
1539
+ * @memberof visStateUpdaters
1540
+ * @public
1541
+ */
1542
+ export var removeFilterUpdater = function removeFilterUpdater(state, action) {
1543
+ var idx = action.idx;
1544
+ var _state$filters$idx = state.filters[idx],
1545
+ dataId = _state$filters$idx.dataId,
1546
+ id = _state$filters$idx.id;
1547
+ var newFilters = [].concat(_toConsumableArray(state.filters.slice(0, idx)), _toConsumableArray(state.filters.slice(idx + 1, state.filters.length)));
1548
+ var filteredDatasets = applyFiltersToDatasets(dataId, state.datasets, newFilters, state.layers);
1549
+ var newEditor = getFilterIdInFeature(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
1550
+ selectedFeature: null
1551
+ }) : state.editor;
1552
+ var newState = set(['filters'], newFilters, state);
1553
+ newState = set(['datasets'], filteredDatasets, newState);
1554
+ newState = set(['editor'], newEditor, newState);
1555
+ return updateAllLayerDomainData(newState, dataId, undefined);
1556
+ };
1557
+
1558
+ /**
1559
+ * Add a new layer
1560
+ * @memberof visStateUpdaters
1561
+ * @public
1562
+ */
1563
+ export var addLayerUpdater = function addLayerUpdater(state, action) {
1564
+ var newLayer;
1565
+ var newLayerData;
1566
+ if (action.config) {
1567
+ newLayer = createLayerFromConfig(state, action.config);
1568
+ if (!newLayer) {
1569
+ Console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
1570
+ return state;
1571
+ }
1572
+ var result = calculateLayerData(newLayer, state);
1573
+ newLayer = result.layer;
1574
+ newLayerData = result.layerData;
1575
+ } else {
1576
+ var _action$datasetId;
1577
+ // create an empty layer with a specific dataset or a default one
1578
+ var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
1579
+ newLayer = new Layer({
1580
+ isVisible: true,
1581
+ isConfigActive: true,
1582
+ dataId: defaultDataset
1583
+ });
1584
+ newLayerData = {};
1585
+ }
1586
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1587
+ layers: [].concat(_toConsumableArray(state.layers), [newLayer]),
1588
+ layerData: [].concat(_toConsumableArray(state.layerData), [newLayerData]),
1589
+ // add new layer at the top
1590
+ layerOrder: [newLayer.id].concat(_toConsumableArray(state.layerOrder)),
1591
+ splitMaps: addNewLayersToSplitMap(state.splitMaps, newLayer)
1592
+ });
1593
+ if (newLayer.config.animation.enabled) {
1594
+ newState = updateAnimationDomain(newState);
1595
+ }
1596
+ return newState;
1597
+ };
1598
+
1599
+ /**
1600
+ * remove layer
1601
+ * @memberof visStateUpdaters
1602
+ * @public
1603
+ */
1604
+ export function removeLayerUpdater(state, _ref9) {
1605
+ var id = _ref9.id;
1606
+ var idx = Number.isFinite(id) ?
1607
+ // support older API, remove layer by idx
1608
+ Number(id) : state.layers.findIndex(function (l) {
1609
+ return l.id === id;
1610
+ });
1611
+ if (idx < 0 || idx >= state.layers.length) {
1612
+ // invalid index
1613
+ Console.warn("can not remove layer with invalid id|idx ".concat(id));
1614
+ return state;
1615
+ }
1616
+ var layers = state.layers,
1617
+ layerData = state.layerData,
1618
+ layerOrder = state.layerOrder,
1619
+ clicked = state.clicked,
1620
+ hoverInfo = state.hoverInfo;
1621
+ var layerToRemove = layers[idx];
1622
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
1623
+ layers: filterOutById(layerToRemove.id)(layers),
1624
+ layerData: removeElementAtIndex(idx)(layerData),
1625
+ layerOrder: removeElementFromLayerOrder(layerOrder, layerToRemove.id),
1626
+ clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
1627
+ hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
1628
+ splitMaps: removeLayerFromSplitMaps(state.splitMaps, layerToRemove)
1629
+ // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
1630
+ });
1631
+ return updateAnimationDomain(newState);
1632
+ }
1633
+
1634
+ /**
1635
+ * Reorder layer
1636
+ * @memberof visStateUpdaters
1637
+ * @public
1638
+ */
1639
+ export var reorderLayerUpdater = function reorderLayerUpdater(state, _ref0) {
1640
+ var order = _ref0.order;
1641
+ return _objectSpread(_objectSpread({}, state), {}, {
1642
+ layerOrder: order
1643
+ });
1644
+ };
1645
+
1646
+ /**
1647
+ * Add a new layer group
1648
+ * @memberof visStateUpdaters
1649
+ * @public
1650
+ */
1651
+ export var addLayerGroupUpdater = function addLayerGroupUpdater(state, action) {
1652
+ var layerGroup = getNewLayerGroup(action);
1653
+ var newLayerOrder = _toConsumableArray(state.layerOrder);
1654
+ if (action.layerOrder) {
1655
+ action.layerOrder.forEach(function (layerId) {
1656
+ newLayerOrder = removeElementFromLayerOrder(newLayerOrder, layerId);
1657
+ });
1658
+ }
1659
+ return _objectSpread(_objectSpread({}, state), {}, {
1660
+ layerOrder: addLayerOrGroupToLayerOrder(newLayerOrder, layerGroup)
1661
+ });
1662
+ };
1663
+
1664
+ /**
1665
+ * Remove a layer group and all layers within it
1666
+ * @memberof visStateUpdaters
1667
+ * @public
1668
+ */
1669
+ export var removeLayerGroupUpdater = function removeLayerGroupUpdater(state, action) {
1670
+ var id = action.id;
1671
+ var layerGroupToRemove = getLayerGroupFromLayerOrder(state.layerOrder, id);
1672
+ if (!layerGroupToRemove) {
1673
+ return state;
1674
+ }
1675
+ var layerIdsToRemove = getFlatLayerOrder(layerGroupToRemove.layerOrder);
1676
+ var newState = _objectSpread({}, state);
1677
+ layerIdsToRemove.forEach(function (layerId) {
1678
+ var idx = newState.layers.findIndex(function (l) {
1679
+ return l.id === layerId;
1680
+ });
1681
+ if (idx >= 0) {
1682
+ newState = removeLayerUpdater(newState, {
1683
+ id: layerId
1684
+ });
1685
+ }
1686
+ });
1687
+ var newLayerOrder = removeElementFromLayerOrder(newState.layerOrder, layerGroupToRemove);
1688
+ return _objectSpread(_objectSpread({}, newState), {}, {
1689
+ layerOrder: newLayerOrder
1690
+ });
1691
+ };
1692
+
1693
+ /**
1694
+ * Update a layer group (label, visibility, layer membership)
1695
+ * @memberof visStateUpdaters
1696
+ * @public
1697
+ */
1698
+ export var updateLayerGroupUpdater = function updateLayerGroupUpdater(state, action) {
1699
+ var id = action.id,
1700
+ options = action.options;
1701
+ var layerGroup = getLayerGroupFromLayerOrder(state.layerOrder, id);
1702
+ if (!layerGroup) {
1703
+ return state;
1704
+ }
1705
+ var newState = _objectSpread({}, state);
1706
+ if (options.layerOrder) {
1707
+ newState.layerOrder = [].concat(_toConsumableArray(layerGroup.layerOrder), _toConsumableArray(newState.layerOrder));
1708
+ options.layerOrder.forEach(function (layerId) {
1709
+ newState.layerOrder = removeElementFromLayerOrder(newState.layerOrder, layerId);
1710
+ });
1711
+ }
1712
+ var newLayerGroup = _objectSpread(_objectSpread({}, layerGroup), options);
1713
+ if (newLayerGroup.isVisible !== layerGroup.isVisible) {
1714
+ var layerIds = getFlatLayerOrder(newLayerGroup.layerOrder);
1715
+ newState = newState.layers.reduce(function (acc, layer) {
1716
+ if (layerIds.includes(layer.id)) {
1717
+ return layerConfigChangeUpdater(acc, {
1718
+ oldLayer: layer,
1719
+ newConfig: {
1720
+ isVisible: newLayerGroup.isVisible
1721
+ }
1722
+ });
1723
+ }
1724
+ return acc;
1725
+ }, newState);
1726
+ }
1727
+ var newLayerOrder = updateLayerGroupInLayerOrder(newState.layerOrder, newLayerGroup);
1728
+ return _objectSpread(_objectSpread({}, newState), {}, {
1729
+ layerOrder: newLayerOrder
1730
+ });
1731
+ };
1732
+
1733
+ /**
1734
+ * Add a layer to a layer group
1735
+ * @memberof visStateUpdaters
1736
+ * @public
1737
+ */
1738
+ export var addLayerToLayerGroupUpdater = function addLayerToLayerGroupUpdater(state, action) {
1739
+ var layerGroupId = action.layerGroupId,
1740
+ layerId = action.layerId;
1741
+ var layerGroup = getLayerGroupFromLayerOrder(state.layerOrder, layerGroupId);
1742
+ var layer = state.layers.find(function (l) {
1743
+ return l.id === layerId;
1744
+ });
1745
+ if (!layerGroup || !layer) {
1746
+ return state;
1747
+ }
1748
+ if (layerGroup.layerOrder.find(function (entry) {
1749
+ return entry === layerId;
1750
+ })) {
1751
+ return state;
1752
+ }
1753
+ var newGroupLayerOrder = addLayerOrGroupToLayerOrder(layerGroup.layerOrder, layerId);
1754
+ return updateLayerGroupUpdater(state, {
1755
+ id: layerGroupId,
1756
+ options: {
1757
+ layerOrder: newGroupLayerOrder
1758
+ }
1759
+ });
1760
+ };
1761
+
1762
+ /**
1763
+ * Remove a layer from a layer group
1764
+ * @memberof visStateUpdaters
1765
+ * @public
1766
+ */
1767
+ export var removeLayerFromLayerGroupUpdater = function removeLayerFromLayerGroupUpdater(state, action) {
1768
+ var layerGroupId = action.layerGroupId,
1769
+ layerId = action.layerId;
1770
+ var layerGroup = getLayerGroupFromLayerOrder(state.layerOrder, layerGroupId);
1771
+ if (!layerGroup) {
1772
+ return state;
1773
+ }
1774
+ var newLayerGroupOrder = removeElementFromLayerOrder(layerGroup.layerOrder, layerId);
1775
+ return updateLayerGroupUpdater(state, {
1776
+ id: layerGroupId,
1777
+ options: {
1778
+ layerOrder: newLayerGroupOrder
1779
+ }
1780
+ });
1781
+ };
1782
+
1783
+ /**
1784
+ * Swap layer order entries between root and groups
1785
+ * @memberof visStateUpdaters
1786
+ * @public
1787
+ */
1788
+ // eslint-disable-next-line complexity
1789
+ export var swapLayerOrderEntriesUpdater = function swapLayerOrderEntriesUpdater(state, action) {
1790
+ var originLayerId = action.originLayerId,
1791
+ destinationLayerId = action.destinationLayerId,
1792
+ originLayerGroupId = action.originLayerGroupId,
1793
+ destinationLayerGroupId = action.destinationLayerGroupId;
1794
+ if (!originLayerGroupId && !destinationLayerGroupId) {
1795
+ var originIndex = state.layerOrder.findIndex(function (entry) {
1796
+ return typeof entry === 'string' ? entry === originLayerId : entry.id === originLayerId;
1797
+ });
1798
+ if (destinationLayerId && originIndex !== -1) {
1799
+ var destinationIndex = state.layerOrder.findIndex(function (entry) {
1800
+ return typeof entry === 'string' ? entry === destinationLayerId : entry.id === destinationLayerId;
1801
+ });
1802
+ if (destinationIndex !== -1) {
1803
+ var newLayerOrder = arrayMove(state.layerOrder, originIndex, destinationIndex);
1804
+ return _objectSpread(_objectSpread({}, state), {}, {
1805
+ layerOrder: newLayerOrder
1806
+ });
1807
+ }
1808
+ }
1809
+ }
1810
+ if (originLayerGroupId && !destinationLayerGroupId) {
1811
+ var _newLayerOrder = removeElementFromLayerOrder(state.layerOrder, originLayerId);
1812
+ if (destinationLayerId) {
1813
+ var _destinationIndex = _newLayerOrder.findIndex(function (entry) {
1814
+ return typeof entry === 'string' ? entry === destinationLayerId : false;
1815
+ });
1816
+ _newLayerOrder.splice(_destinationIndex === -1 ? 0 : _destinationIndex, 0, originLayerId);
1817
+ } else {
1818
+ _newLayerOrder = [].concat(_toConsumableArray(_newLayerOrder), [originLayerId]);
1819
+ }
1820
+ return _objectSpread(_objectSpread({}, state), {}, {
1821
+ layerOrder: _newLayerOrder
1822
+ });
1823
+ }
1824
+ if (originLayerGroupId && destinationLayerGroupId) {
1825
+ if (originLayerGroupId === destinationLayerGroupId) {
1826
+ var layerGroup = getLayerGroupFromLayerOrder(state.layerOrder, originLayerGroupId);
1827
+ if (!layerGroup) return state;
1828
+ var _originIndex = layerGroup.layerOrder.findIndex(function (entry) {
1829
+ return typeof entry === 'string' ? entry === originLayerId : entry.id === originLayerId;
1830
+ });
1831
+ if (_originIndex === -1) return state;
1832
+ if (destinationLayerId) {
1833
+ var destIndex = layerGroup.layerOrder.findIndex(function (entry) {
1834
+ return typeof entry === 'string' ? entry === destinationLayerId : entry.id === destinationLayerId;
1835
+ });
1836
+ if (destIndex === -1) return state;
1837
+ var newGroupLayerOrder = arrayMove(layerGroup.layerOrder, _originIndex, destIndex);
1838
+ var _newLayerOrder2 = updateLayerGroupInLayerOrder(state.layerOrder, _objectSpread(_objectSpread({}, layerGroup), {}, {
1839
+ layerOrder: newGroupLayerOrder
1840
+ }));
1841
+ return _objectSpread(_objectSpread({}, state), {}, {
1842
+ layerOrder: _newLayerOrder2
1843
+ });
1844
+ }
1845
+ return state;
1846
+ }
1847
+
1848
+ // Cross-group move: remove from origin, then add to destination
1849
+ var layerOrder = removeElementFromLayerOrder(state.layerOrder, originLayerId);
1850
+ var newState = addLayerToLayerGroupUpdater(_objectSpread(_objectSpread({}, state), {}, {
1851
+ layerOrder: layerOrder
1852
+ }), {
1853
+ layerId: originLayerId,
1854
+ layerGroupId: destinationLayerGroupId
1855
+ });
1856
+ if (destinationLayerId) {
1857
+ var _layerGroup = getLayerGroupFromLayerOrder(newState.layerOrder, destinationLayerGroupId);
1858
+ if (!_layerGroup) return state;
1859
+ var _originIndex2 = _layerGroup.layerOrder.findIndex(function (entry) {
1860
+ return entry === originLayerId;
1861
+ });
1862
+ var _destIndex = _layerGroup.layerOrder.findIndex(function (entry) {
1863
+ return entry === destinationLayerId;
1864
+ });
1865
+ if (_originIndex2 !== -1 && _destIndex !== -1) {
1866
+ var _newGroupLayerOrder = arrayMove(_layerGroup.layerOrder, _originIndex2, _destIndex);
1867
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
1868
+ layerOrder: updateLayerGroupInLayerOrder(newState.layerOrder, _objectSpread(_objectSpread({}, _layerGroup), {}, {
1869
+ layerOrder: _newGroupLayerOrder
1870
+ }))
1871
+ });
1872
+ }
1873
+ }
1874
+ return newState;
1875
+ }
1876
+ if (!originLayerGroupId && destinationLayerGroupId) {
1877
+ var _layerOrder = removeElementFromLayerOrder(state.layerOrder, originLayerId);
1878
+ return addLayerToLayerGroupUpdater(_objectSpread(_objectSpread({}, state), {}, {
1879
+ layerOrder: _layerOrder
1880
+ }), {
1881
+ layerId: originLayerId,
1882
+ layerGroupId: destinationLayerGroupId
1883
+ });
1884
+ }
1885
+ return state;
1886
+ };
1887
+
1888
+ /**
1889
+ * duplicate layer
1890
+ * @memberof visStateUpdaters
1891
+ * @public
1892
+ */
1893
+ export var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref1) {
1894
+ var id = _ref1.id;
1895
+ var idx = Number.isFinite(id) ?
1896
+ // support older API, remove layer by idx
1897
+ Number(id) : state.layers.findIndex(function (l) {
1898
+ return l.id === id;
1899
+ });
1900
+ if (idx < 0 || !state.layers[idx]) {
1901
+ Console.warn("layer ".concat(idx, " not found in layerOrder"));
1902
+ return state;
1903
+ }
1904
+ var layers = state.layers;
1905
+ var original = layers[idx];
1906
+ var originalLayerOrderIdx = getIndexFromLayerEntryId(state.layerOrder, original.id);
1907
+ var newLabel = "Copy of ".concat(original.config.label);
1908
+ var postfix = 0;
1909
+ // eslint-disable-next-line no-loop-func
1910
+ while (layers.find(function (l) {
1911
+ return l.config.label === newLabel;
1912
+ })) {
1913
+ newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
1914
+ }
1915
+
1916
+ // collect layer config from original
1917
+ var loadedLayer = serializeLayer(original, state.schema);
1918
+
1919
+ // assign new id and label to copied layer
1920
+ if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
1921
+ return state;
1922
+ }
1923
+ loadedLayer.config.label = newLabel;
1924
+ loadedLayer.id = generateHashId(LAYER_ID_LENGTH);
1925
+
1926
+ // add layer to state
1927
+ var nextState = addLayerUpdater(state, {
1928
+ config: loadedLayer
1929
+ });
1930
+ // retrieve newly created layer
1931
+ var newLayer = nextState.layers[nextState.layers.length - 1];
1932
+
1933
+ // Check if the original layer is inside a group
1934
+ var parentGroup = findParentGroupForLayer(state.layerOrder, original.id);
1935
+ if (parentGroup) {
1936
+ // Layer is inside a group - remove the prepended id from root and insert into the group
1937
+ var layerOrderWithoutPrepended = nextState.layerOrder.slice(1);
1938
+ var idxInGroup = parentGroup.layerOrder.findIndex(function (e) {
1939
+ return e === original.id;
1940
+ });
1941
+ var newGroupLayerOrder = arrayInsert(parentGroup.layerOrder, idxInGroup, newLayer.id);
1942
+ var updatedGroup = _objectSpread(_objectSpread({}, parentGroup), {}, {
1943
+ layerOrder: newGroupLayerOrder
1944
+ });
1945
+ var newLayerOrder = updateLayerGroupInLayerOrder(layerOrderWithoutPrepended, updatedGroup);
1946
+ nextState = reorderLayerUpdater(nextState, {
1947
+ order: newLayerOrder
1948
+ });
1949
+ } else {
1950
+ // Layer is at root level - use original index-based insertion
1951
+ var _newLayerOrder3 = arrayInsert(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
1952
+ nextState = reorderLayerUpdater(nextState, {
1953
+ order: _newLayerOrder3
1954
+ });
1955
+ }
1956
+ return updateAnimationDomain(nextState);
1957
+ };
1958
+
1959
+ /**
1960
+ * Add a new effect
1961
+ * @memberof visStateUpdaters
1962
+ * @public
1963
+ */
1964
+ export var addEffectUpdater = function addEffectUpdater(state, action) {
1965
+ var _action$config, _action$config2, _action$config3;
1966
+ if (((_action$config = action.config) === null || _action$config === void 0 ? void 0 : _action$config.type) === LIGHT_AND_SHADOW_EFFECT.type && state.effects.some(function (effect) {
1967
+ return effect.type === LIGHT_AND_SHADOW_EFFECT.type;
1968
+ })) {
1969
+ Console.warn("Can't add more than one ".concat(LIGHT_AND_SHADOW_EFFECT.name, " effect"));
1970
+ return state;
1971
+ }
1972
+ if (((_action$config2 = action.config) === null || _action$config2 === void 0 ? void 0 : _action$config2.type) === DISTANCE_FOG_TYPE && state.effects.some(function (effect) {
1973
+ return effect.type === DISTANCE_FOG_TYPE || effect.type === SURFACE_FOG_TYPE;
1974
+ })) {
1975
+ Console.warn("Can't add more than one fog effect");
1976
+ return state;
1977
+ }
1978
+ if (((_action$config3 = action.config) === null || _action$config3 === void 0 ? void 0 : _action$config3.type) === SURFACE_FOG_TYPE && state.effects.some(function (effect) {
1979
+ return effect.type === SURFACE_FOG_TYPE || effect.type === DISTANCE_FOG_TYPE;
1980
+ })) {
1981
+ Console.warn("Can't add more than one fog effect");
1982
+ return state;
1983
+ }
1984
+ var newEffect = createEffect(action.config);
1985
+
1986
+ // collapse configurators for other effects
1987
+ state.effects.forEach(function (effect) {
1988
+ return effect.setProps({
1989
+ isConfigActive: false
1990
+ });
1991
+ });
1992
+ var effects = [].concat(_toConsumableArray(state.effects), [newEffect]);
1993
+ var effectOrder = fixEffectOrder(effects, [newEffect.id].concat(_toConsumableArray(state.effectOrder)));
1994
+ return _objectSpread(_objectSpread({}, state), {}, {
1995
+ effects: effects,
1996
+ effectOrder: effectOrder
1997
+ });
1998
+ };
1999
+
2000
+ /**
2001
+ * remove effect
2002
+ * @memberof visStateUpdaters
2003
+ * @public
2004
+ */
2005
+ export var removeEffectUpdater = function removeEffectUpdater(state, _ref10) {
2006
+ var id = _ref10.id;
2007
+ var idx = state.effects.findIndex(function (l) {
2008
+ return l.id === id;
2009
+ });
2010
+ if (idx < 0 || idx >= state.effects.length) {
2011
+ Console.warn("can not remove effect with invalid id ".concat(id));
2012
+ return state;
2013
+ }
2014
+ var effects = state.effects,
2015
+ effectOrder = state.effectOrder;
2016
+ var effectToRemove = effects[idx];
2017
+ return _objectSpread(_objectSpread({}, state), {}, {
2018
+ // @ts-expect-error fixed in ts
2019
+ effects: filterOutById(effectToRemove.id)(effects),
2020
+ effectOrder: effectOrder.filter(function (effectId) {
2021
+ return effectId !== effectToRemove.id;
2022
+ })
2023
+ });
2024
+ };
2025
+
2026
+ /**
2027
+ * Reorder effect
2028
+ * @memberof visStateUpdaters
2029
+ * @public
2030
+ */
2031
+ export var reorderEffectUpdater = function reorderEffectUpdater(state, _ref11) {
2032
+ var order = _ref11.order;
2033
+ return _objectSpread(_objectSpread({}, state), {}, {
2034
+ effectOrder: fixEffectOrder(state.effects, _toConsumableArray(order))
2035
+ });
2036
+ };
2037
+
2038
+ /**
2039
+ * Update effect
2040
+ * @memberof visStateUpdaters
2041
+ * @public
2042
+ */
2043
+ export var updateEffectUpdater = function updateEffectUpdater(state, _ref12) {
2044
+ var id = _ref12.id,
2045
+ props = _ref12.props;
2046
+ var idx = state.effects.findIndex(function (l) {
2047
+ return l.id === id;
2048
+ });
2049
+ if (idx < 0 || idx >= state.effects.length) {
2050
+ Console.warn("can not update effect with invalid id ".concat(id));
2051
+ return state;
2052
+ }
2053
+ var effectOrder = state.effectOrder;
2054
+ if (props.id !== undefined && props.id !== id) {
2055
+ var idx2 = state.effects.findIndex(function (l) {
2056
+ return l.id === props.id;
2057
+ });
2058
+ if (idx2 >= 0) {
2059
+ Console.warn("can not update effect with existing effect id ".concat(id));
2060
+ return state;
2061
+ }
2062
+ effectOrder = effectOrder.map(function (effectOrderId) {
2063
+ return effectOrderId === id ? props.id : effectOrderId;
2064
+ });
2065
+ }
2066
+ var newEffects = _toConsumableArray(state.effects);
2067
+ newEffects[idx].setProps(props);
2068
+ return _objectSpread(_objectSpread({}, state), {}, {
2069
+ effects: newEffects,
2070
+ effectOrder: effectOrder
2071
+ });
2072
+ };
2073
+
2074
+ // ANNOTATION UPDATERS
2075
+
2076
+ function makeNewAnnotation(config) {
2077
+ var _config$kind, _config$id, _config$isVisible, _config$autoSize, _config$autoSizeY, _config$anchorPoint, _config$label, _config$lineColor, _config$lineWidth, _config$textWidth, _config$textHeight, _config$textVerticalA, _armLength, _angle, _armLength2, _angle2, _armLength3, _angle3, _radiusInMeters;
2078
+ var kind = (_config$kind = config === null || config === void 0 ? void 0 : config.kind) !== null && _config$kind !== void 0 ? _config$kind : INITIAL_ANNOTATION_KIND;
2079
+ var base = {
2080
+ id: (_config$id = config === null || config === void 0 ? void 0 : config.id) !== null && _config$id !== void 0 ? _config$id : generateHashId(6),
2081
+ kind: kind,
2082
+ isVisible: (_config$isVisible = config === null || config === void 0 ? void 0 : config.isVisible) !== null && _config$isVisible !== void 0 ? _config$isVisible : true,
2083
+ autoSize: (_config$autoSize = config === null || config === void 0 ? void 0 : config.autoSize) !== null && _config$autoSize !== void 0 ? _config$autoSize : true,
2084
+ autoSizeY: (_config$autoSizeY = config === null || config === void 0 ? void 0 : config.autoSizeY) !== null && _config$autoSizeY !== void 0 ? _config$autoSizeY : true,
2085
+ anchorPoint: (_config$anchorPoint = config === null || config === void 0 ? void 0 : config.anchorPoint) !== null && _config$anchorPoint !== void 0 ? _config$anchorPoint : [0, 0],
2086
+ label: (_config$label = config === null || config === void 0 ? void 0 : config.label) !== null && _config$label !== void 0 ? _config$label : 'New Annotation',
2087
+ lineColor: (_config$lineColor = config === null || config === void 0 ? void 0 : config.lineColor) !== null && _config$lineColor !== void 0 ? _config$lineColor : INITIAL_ANNOTATION_LINE_COLOR,
2088
+ lineWidth: (_config$lineWidth = config === null || config === void 0 ? void 0 : config.lineWidth) !== null && _config$lineWidth !== void 0 ? _config$lineWidth : INITIAL_ANNOTATION_LINE_WIDTH,
2089
+ textWidth: (_config$textWidth = config === null || config === void 0 ? void 0 : config.textWidth) !== null && _config$textWidth !== void 0 ? _config$textWidth : INITIAL_ANNOTATION_TEXT_WIDTH,
2090
+ textHeight: (_config$textHeight = config === null || config === void 0 ? void 0 : config.textHeight) !== null && _config$textHeight !== void 0 ? _config$textHeight : INITIAL_ANNOTATION_TEXT_HEIGHT,
2091
+ textVerticalAlign: (_config$textVerticalA = config === null || config === void 0 ? void 0 : config.textVerticalAlign) !== null && _config$textVerticalA !== void 0 ? _config$textVerticalA : 'bottom',
2092
+ mapIndex: config === null || config === void 0 ? void 0 : config.mapIndex
2093
+ };
2094
+ switch (kind) {
2095
+ case AnnotationKind.POINT:
2096
+ return _objectSpread(_objectSpread({}, base), {}, {
2097
+ kind: AnnotationKind.POINT,
2098
+ armLength: (_armLength = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength !== void 0 ? _armLength : INITIAL_ANNOTATION_ARM_LENGTH,
2099
+ angle: (_angle = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle !== void 0 ? _angle : INITIAL_ANNOTATION_ANGLE
2100
+ });
2101
+ case AnnotationKind.ARROW:
2102
+ return _objectSpread(_objectSpread({}, base), {}, {
2103
+ kind: AnnotationKind.ARROW,
2104
+ armLength: (_armLength2 = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength2 !== void 0 ? _armLength2 : INITIAL_ANNOTATION_ARM_LENGTH,
2105
+ angle: (_angle2 = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle2 !== void 0 ? _angle2 : INITIAL_ANNOTATION_ANGLE
2106
+ });
2107
+ case AnnotationKind.CIRCLE:
2108
+ return _objectSpread(_objectSpread({}, base), {}, {
2109
+ kind: AnnotationKind.CIRCLE,
2110
+ armLength: (_armLength3 = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength3 !== void 0 ? _armLength3 : INITIAL_ANNOTATION_ARM_LENGTH,
2111
+ angle: (_angle3 = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle3 !== void 0 ? _angle3 : INITIAL_ANNOTATION_ANGLE,
2112
+ radiusInMeters: (_radiusInMeters = config === null || config === void 0 ? void 0 : config.radiusInMeters) !== null && _radiusInMeters !== void 0 ? _radiusInMeters : 1000
2113
+ });
2114
+ case AnnotationKind.TEXT:
2115
+ default:
2116
+ return _objectSpread(_objectSpread({}, base), {}, {
2117
+ kind: AnnotationKind.TEXT
2118
+ });
2119
+ }
2120
+ }
2121
+
2122
+ /**
2123
+ * Add a new annotation
2124
+ * @memberof visStateUpdaters
2125
+ * @public
2126
+ */
2127
+ export var addAnnotationUpdater = function addAnnotationUpdater(state, action) {
2128
+ var newAnnotation = makeNewAnnotation(action.config);
2129
+ return _objectSpread(_objectSpread({}, state), {}, {
2130
+ annotations: [newAnnotation].concat(_toConsumableArray(state.annotations)),
2131
+ selectedAnnotationId: newAnnotation.id,
2132
+ isEditingAnnotationText: true
2133
+ });
2134
+ };
2135
+
2136
+ /**
2137
+ * Remove an annotation
2138
+ * @memberof visStateUpdaters
2139
+ * @public
2140
+ */
2141
+ export var removeAnnotationUpdater = function removeAnnotationUpdater(state, _ref13) {
2142
+ var id = _ref13.id;
2143
+ return _objectSpread(_objectSpread({}, state), {}, {
2144
+ annotations: state.annotations.filter(function (a) {
2145
+ return a.id !== id;
2146
+ }),
2147
+ selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId,
2148
+ isEditingAnnotationText: state.selectedAnnotationId === id ? false : state.isEditingAnnotationText
2149
+ });
2150
+ };
2151
+
2152
+ /**
2153
+ * Update an annotation
2154
+ * @memberof visStateUpdaters
2155
+ * @public
2156
+ */
2157
+ export var updateAnnotationUpdater = function updateAnnotationUpdater(state, _ref14) {
2158
+ var id = _ref14.id,
2159
+ config = _ref14.config;
2160
+ var idx = state.annotations.findIndex(function (a) {
2161
+ return a.id === id;
2162
+ });
2163
+ if (idx < 0) {
2164
+ Console.warn("can not update annotation with invalid id ".concat(id));
2165
+ return state;
2166
+ }
2167
+ var prev = state.annotations[idx];
2168
+ var nextAnnotation;
2169
+ if (config.kind && config.kind !== prev.kind) {
2170
+ nextAnnotation = makeNewAnnotation(_objectSpread(_objectSpread({}, prev), config));
2171
+ } else {
2172
+ nextAnnotation = _objectSpread(_objectSpread({}, prev), config);
2173
+ }
2174
+ var newAnnotations = _toConsumableArray(state.annotations);
2175
+ newAnnotations[idx] = nextAnnotation;
2176
+ return _objectSpread(_objectSpread({}, state), {}, {
2177
+ annotations: newAnnotations
2178
+ });
2179
+ };
2180
+
2181
+ /**
2182
+ * Duplicate an annotation
2183
+ * @memberof visStateUpdaters
2184
+ * @public
2185
+ */
2186
+ export var duplicateAnnotationUpdater = function duplicateAnnotationUpdater(state, _ref15) {
2187
+ var id = _ref15.id;
2188
+ var original = state.annotations.find(function (a) {
2189
+ return a.id === id;
2190
+ });
2191
+ if (!original) {
2192
+ Console.warn("can not duplicate annotation with invalid id ".concat(id));
2193
+ return state;
2194
+ }
2195
+ var newAnnotation = _objectSpread(_objectSpread({}, cloneDeep(original)), {}, {
2196
+ id: generateHashId(6),
2197
+ label: "Copy of ".concat(original.label)
2198
+ });
2199
+ return _objectSpread(_objectSpread({}, state), {}, {
2200
+ annotations: [newAnnotation].concat(_toConsumableArray(state.annotations)),
2201
+ selectedAnnotationId: newAnnotation.id,
2202
+ isEditingAnnotationText: false
2203
+ });
2204
+ };
2205
+
2206
+ /**
2207
+ * Set selected annotation
2208
+ * @memberof visStateUpdaters
2209
+ * @public
2210
+ */
2211
+ export var setSelectedAnnotationUpdater = function setSelectedAnnotationUpdater(state, _ref16) {
2212
+ var id = _ref16.id,
2213
+ isEditingText = _ref16.isEditingText;
2214
+ if (id === state.selectedAnnotationId && (isEditingText !== null && isEditingText !== void 0 ? isEditingText : false) === state.isEditingAnnotationText) {
2215
+ return state;
2216
+ }
2217
+ return _objectSpread(_objectSpread({}, state), {}, {
2218
+ selectedAnnotationId: id,
2219
+ isEditingAnnotationText: isEditingText !== null && isEditingText !== void 0 ? isEditingText : false
2220
+ });
2221
+ };
2222
+
2223
+ /**
2224
+ * Remove a dataset and all layers, filters, tooltip configs that based on it
2225
+ * @memberof visStateUpdaters
2226
+ * @public
2227
+ */
2228
+ export function removeDatasetUpdater(state, action) {
2229
+ // extract dataset key
2230
+ var datasetKey = action.dataId;
2231
+ var datasets = state.datasets;
2232
+
2233
+ // check if dataset is present
2234
+ if (!datasets[datasetKey]) {
2235
+ return state;
2236
+ }
2237
+ var layers = state.layers,
2238
+ _state$datasets = state.datasets,
2239
+ dataset = _state$datasets[datasetKey],
2240
+ newDatasets = _objectWithoutProperties(_state$datasets, [datasetKey].map(_toPropertyKey));
2241
+ var layersToRemove = layers.filter(function (l) {
2242
+ return l.config.dataId === datasetKey;
2243
+ }).map(function (l) {
2244
+ return l.id;
2245
+ });
2246
+
2247
+ // remove layers and datasets
2248
+ var newState = layersToRemove.reduce(function (accu, id) {
2249
+ return removeLayerUpdater(accu, {
2250
+ id: id
2251
+ });
2252
+ }, _objectSpread(_objectSpread({}, state), {}, {
2253
+ datasets: newDatasets
2254
+ }));
2255
+
2256
+ // update filters
2257
+ var filters = [];
2258
+ var _iterator2 = _createForOfIteratorHelper(newState.filters),
2259
+ _step2;
2260
+ try {
2261
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2262
+ var filter = _step2.value;
2263
+ var valueIndex = filter.dataId.indexOf(datasetKey);
2264
+ if (valueIndex >= 0 && filter.dataId.length > 1) {
2265
+ // only remove one synced dataset from the filter
2266
+ filters.push(_removeFilterDataIdAtValueIndex(filter, valueIndex, datasets));
2267
+ } else if (valueIndex < 0) {
2268
+ // leave the filter as is
2269
+ filters.push(filter);
2270
+ }
2271
+ }
2272
+ } catch (err) {
2273
+ _iterator2.e(err);
2274
+ } finally {
2275
+ _iterator2.f();
2276
+ }
2277
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
2278
+ filters: filters
2279
+ });
2280
+ return removeDatasetFromInteractionConfig(newState, {
2281
+ dataId: datasetKey
2282
+ });
2283
+ }
2284
+ function removeDatasetFromInteractionConfig(state, _ref17) {
2285
+ var dataId = _ref17.dataId;
2286
+ var interactionConfig = state.interactionConfig;
2287
+ var _interactionConfig = interactionConfig,
2288
+ tooltip = _interactionConfig.tooltip;
2289
+ if (tooltip) {
2290
+ var config = tooltip.config;
2291
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2292
+ var _config$fieldsToShow = config.fieldsToShow,
2293
+ fields = _config$fieldsToShow[dataId],
2294
+ fieldsToShow = _objectWithoutProperties(_config$fieldsToShow, [dataId].map(_toPropertyKey));
2295
+ interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
2296
+ tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
2297
+ config: _objectSpread(_objectSpread({}, config), {}, {
2298
+ fieldsToShow: fieldsToShow
2299
+ })
2300
+ })
2301
+ });
2302
+ }
2303
+ return _objectSpread(_objectSpread({}, state), {}, {
2304
+ interactionConfig: interactionConfig
2305
+ });
2306
+ }
2307
+ /**
2308
+ * update layer blending mode
2309
+ * @memberof visStateUpdaters
2310
+ * @public
2311
+ */
2312
+ export var updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
2313
+ return _objectSpread(_objectSpread({}, state), {}, {
2314
+ layerBlending: action.mode
2315
+ });
2316
+ };
2317
+
2318
+ /**
2319
+ * update overlay blending mode
2320
+ * @memberof visStateUpdaters
2321
+ * @public
2322
+ */
2323
+ export var updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
2324
+ return _objectSpread(_objectSpread({}, state), {}, {
2325
+ overlayBlending: action.mode
2326
+ });
2327
+ };
2328
+
2329
+ /**
2330
+ * Display dataset table in a modal
2331
+ * @memberof visStateUpdaters
2332
+ * @public
2333
+ */
2334
+ export var showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
2335
+ return _objectSpread(_objectSpread({}, state), {}, {
2336
+ editingDataset: action.dataId
2337
+ });
2338
+ };
2339
+
2340
+ /**
2341
+ * Add custom color for datasets and layers
2342
+ * @memberof visStateUpdaters
2343
+ * @public
2344
+ */
2345
+ export var updateTableColorUpdater = function updateTableColorUpdater(state, action) {
2346
+ return updateDatasetPropsUpdater(state, {
2347
+ dataId: action.dataId,
2348
+ props: {
2349
+ color: action.newColor
2350
+ }
2351
+ });
2352
+ };
2353
+
2354
+ /**
2355
+ * reset visState to initial State
2356
+ * @memberof visStateUpdaters
2357
+ * @public
2358
+ */
2359
+ export var resetMapConfigUpdater = function resetMapConfigUpdater(state) {
2360
+ return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
2361
+ initialState: state.initialState
2362
+ });
2363
+ };
2364
+
2365
+ /**
2366
+ * Propagate `visState` reducer with a new configuration. Current config will be override.
2367
+ * @memberof visStateUpdaters
2368
+ * @public
2369
+ */
2370
+ export var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref18) {
2371
+ var _ref18$payload = _ref18.payload,
2372
+ _ref18$payload$config = _ref18$payload.config,
2373
+ config = _ref18$payload$config === void 0 ? {} : _ref18$payload$config,
2374
+ _ref18$payload$option = _ref18$payload.options,
2375
+ options = _ref18$payload$option === void 0 ? {} : _ref18$payload$option;
2376
+ if (!config.visState) {
2377
+ return state;
2378
+ }
2379
+ var keepExistingConfig = options.keepExistingConfig;
2380
+
2381
+ // reset config if keepExistingConfig is falsy
2382
+ var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
2383
+ var _iterator3 = _createForOfIteratorHelper(state.mergers),
2384
+ _step3;
2385
+ try {
2386
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
2387
+ var merger = _step3.value;
2388
+ if (isValidMerger(merger) && hasPropsToMerge(config.visState, merger.prop)) {
2389
+ mergedState = merger.merge(mergedState, getPropValueToMerger(config.visState, merger.prop, merger.toMergeProp),
2390
+ // fromConfig
2391
+ true);
2392
+ }
2393
+ }
2394
+ } catch (err) {
2395
+ _iterator3.e(err);
2396
+ } finally {
2397
+ _iterator3.f();
2398
+ }
2399
+ return mergedState;
2400
+ };
2401
+
2402
+ /**
2403
+ * Trigger layer hover event with hovered object
2404
+ * @memberof visStateUpdaters
2405
+ * @public
2406
+ */
2407
+ export var layerHoverUpdater = function layerHoverUpdater(state, action) {
2408
+ return _objectSpread(_objectSpread({}, state), {}, {
2409
+ hoverInfo: _objectSpread(_objectSpread({}, action.info), Number.isFinite(action.mapIndex) ? {
2410
+ mapIndex: action.mapIndex
2411
+ } : {})
2412
+ });
2413
+ };
2414
+
2415
+ /* eslint-enable max-statements */
2416
+
2417
+ /**
2418
+ * Update `interactionConfig`
2419
+ * @memberof visStateUpdaters
2420
+ * @public
2421
+ */
2422
+ export function interactionConfigChangeUpdater(state, action) {
2423
+ var config = action.config;
2424
+ var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), _defineProperty({}, config.id, config));
2425
+
2426
+ // Don't enable tooltip and brush at the same time
2427
+ // but coordinates can be shown at all time
2428
+ var contradict = ['brush', 'tooltip'];
2429
+ if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
2430
+ // only enable one interaction at a time
2431
+ contradict.forEach(function (k) {
2432
+ if (k !== config.id) {
2433
+ interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
2434
+ enabled: false
2435
+ });
2436
+ }
2437
+ });
2438
+ }
2439
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
2440
+ interactionConfig: interactionConfig
2441
+ });
2442
+ if (config.id === 'geocoder' && !config.enabled) {
2443
+ return removeDatasetUpdater(newState, {
2444
+ dataId: 'geocoder_dataset'
2445
+ });
2446
+ }
2447
+ return newState;
2448
+ }
2449
+
2450
+ /**
2451
+ * Trigger layer click event with clicked object
2452
+ * @memberof visStateUpdaters
2453
+ * @public
2454
+ */
2455
+ export var layerClickUpdater = function layerClickUpdater(state, action) {
2456
+ return _objectSpread(_objectSpread({}, state), {}, {
2457
+ mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
2458
+ pinned: state.mousePos.pinned ? null : cloneDeep(state.mousePos)
2459
+ }) : state.mousePos,
2460
+ clicked: action.info && action.info.picked ? action.info : null
2461
+ });
2462
+ };
2463
+
2464
+ /**
2465
+ * Trigger map click event, unselect clicked object
2466
+ * @memberof visStateUpdaters
2467
+ * @public
2468
+ */
2469
+ export var mapClickUpdater = function mapClickUpdater(state, action) {
2470
+ return _objectSpread(_objectSpread({}, state), {}, {
2471
+ clicked: null
2472
+ });
2473
+ };
2474
+
2475
+ /**
2476
+ * Trigger map move event
2477
+ * @memberof visStateUpdaters
2478
+ * @public
2479
+ */
2480
+ export var mouseMoveUpdater = function mouseMoveUpdater(state, _ref19) {
2481
+ var evt = _ref19.evt;
2482
+ if (Object.values(state.interactionConfig).some(function (config) {
2483
+ return config.enabled;
2484
+ })) {
2485
+ return _objectSpread(_objectSpread({}, state), {}, {
2486
+ mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
2487
+ mousePosition: _toConsumableArray(evt.point)
2488
+ } : {}), Array.isArray(evt.lngLat) ? {
2489
+ coordinate: _toConsumableArray(evt.lngLat)
2490
+ } : {})
2491
+ });
2492
+ }
2493
+ return state;
2494
+ };
2495
+ /**
2496
+ * Toggle visibility of a layer for a split map
2497
+ * @memberof visStateUpdaters
2498
+ * @public
2499
+ */
2500
+ export var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
2501
+ return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
2502
+ // maybe we should use an array to store state for a single map as well
2503
+ // if current maps length is equal to 0 it means that we are about to split the view
2504
+ splitMaps: computeSplitMapLayers(state.layers, {
2505
+ duplicate: false
2506
+ })
2507
+ }) : closeSpecificMapAtIndex(state, action);
2508
+ };
2509
+
2510
+ /**
2511
+ * Toggle visibility of a layer in a split map
2512
+ * @memberof visStateUpdaters
2513
+ * @public
2514
+ */
2515
+ export var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref20) {
2516
+ var mapIndex = _ref20.mapIndex,
2517
+ layerId = _ref20.layerId;
2518
+ var splitMaps = state.splitMaps;
2519
+ return _objectSpread(_objectSpread({}, state), {}, {
2520
+ splitMaps: splitMaps.map(function (sm, i) {
2521
+ return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
2522
+ layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, _defineProperty({}, layerId, !splitMaps[i].layers[layerId]))
2523
+ }) : sm;
2524
+ })
2525
+ });
2526
+ };
2527
+
2528
+ /**
2529
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2530
+ * @memberof visStateUpdaters
2531
+ * @public
2532
+ */
2533
+ // eslint-disable-next-line complexity
2534
+ export var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
2535
+ // datasets can be a single data entries or an array of multiple data entries
2536
+ var config = action.config,
2537
+ options = action.options;
2538
+
2539
+ // apply config if passed from action
2540
+ // TODO: we don't handle async mergers here yet
2541
+ var updatedState = config ? receiveMapConfigUpdater(state, {
2542
+ payload: {
2543
+ config: config,
2544
+ options: options
2545
+ }
2546
+ }) : state;
2547
+ var datasets = toArray(action.datasets);
2548
+ if (!datasets.length) {
2549
+ return updatedState;
2550
+ }
2551
+ var createDatasetTasks = [];
2552
+ var notificationTasks = [];
2553
+ datasets.forEach(function (_ref21, datasetIndex) {
2554
+ var _ref21$info = _ref21.info,
2555
+ info = _ref21$info === void 0 ? {} : _ref21$info,
2556
+ rest = _objectWithoutProperties(_ref21, _excluded2);
2557
+ var task = createNewDataEntry(_objectSpread({
2558
+ info: info
2559
+ }, rest), state.datasets);
2560
+ if (task) {
2561
+ createDatasetTasks.push(task);
2562
+ } else {
2563
+ notificationTasks.push(ACTION_TASK_ADD_NOTIFICATION().map(function () {
2564
+ return addNotification(errorNotification({
2565
+ message: "Failed to create a new dataset due to data verification errors",
2566
+ id: "dataset-failed-".concat(datasetIndex)
2567
+ }));
2568
+ }));
2569
+ }
2570
+ });
2571
+ var datasetsAllSettledTask = createDatasetTasks.length ? Task.allSettled(createDatasetTasks).map(function (results) {
2572
+ return createNewDatasetSuccess({
2573
+ results: results,
2574
+ addToMapOptions: options
2575
+ });
2576
+ }) : null;
2577
+ if (datasetsAllSettledTask) {
2578
+ updatedState = setLoadingIndicatorUpdater(updatedState, payload_({
2579
+ change: 1,
2580
+ type: ''
2581
+ }));
2582
+ }
2583
+ return withTask(updatedState, [].concat(_toConsumableArray(datasetsAllSettledTask ? [datasetsAllSettledTask] : []), notificationTasks));
2584
+ };
2585
+ export var createNewDatasetSuccessUpdater = function createNewDatasetSuccessUpdater(state, action) {
2586
+ var _action$payload = action.payload,
2587
+ results = _action$payload.results,
2588
+ addToMapOptions = _action$payload.addToMapOptions;
2589
+ var notificationTasks = [];
2590
+ var newDataEntries = results.reduce(function (accu, result, idx) {
2591
+ if (result.status === 'fulfilled') {
2592
+ var dataset = result.value;
2593
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, dataset.id, dataset));
2594
+ } else {
2595
+ // show error notification on UI
2596
+ notificationTasks.push(ACTION_TASK().map(function () {
2597
+ return addNotification(errorNotification({
2598
+ message: "Dataset error: Failed to create a new dataset:\n ".concat(result.reason || result.value),
2599
+ id: "dataset-create-failed-".concat(idx)
2600
+ }));
2601
+ }));
2602
+ return accu;
2603
+ }
2604
+ }, {});
2605
+ // save new dataset entry to state
2606
+ var mergedState = _objectSpread(_objectSpread({}, state), {}, {
2607
+ datasets: mergeDatasetsByOrder(state, newDataEntries)
2608
+ });
2609
+
2610
+ // merge state with config to be merged
2611
+ var layerMergers = state.mergers.filter(function (m) {
2612
+ return m.waitForLayerData;
2613
+ });
2614
+ var datasetMergers = state.mergers.filter(function (m) {
2615
+ return !layerMergers.includes(m);
2616
+ });
2617
+ var newDataIds = Object.keys(newDataEntries);
2618
+ var postMergerPayload = {
2619
+ newDataIds: newDataIds,
2620
+ options: addToMapOptions,
2621
+ layerMergers: layerMergers
2622
+ };
2623
+ var updatedState = applyMergersUpdater(mergedState, {
2624
+ mergers: datasetMergers,
2625
+ postMergerPayload: postMergerPayload
2626
+ });
2627
+ return withTask(setLoadingIndicatorUpdater(updatedState, payload_({
2628
+ change: -1
2629
+ })), notificationTasks);
2630
+ };
2631
+
2632
+ /**
2633
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2634
+ */
2635
+ export function applyMergersUpdater(state, action) {
2636
+ var mergers = action.mergers,
2637
+ postMergerPayload = action.postMergerPayload;
2638
+
2639
+ // merge state with config to be merged
2640
+ var mergeStateResult = mergeStateFromMergers(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers,
2641
+ // newDataIds,
2642
+ postMergerPayload);
2643
+
2644
+ // if all merged, kickup post merge process
2645
+ // if not wait
2646
+ return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
2647
+ }
2648
+
2649
+ /** Reads `options.layerVisConfig` from add-data-to-map (see `AddDataToMapOptions`). */
2650
+ function layerVisConfigFromAddDataOptions(options) {
2651
+ if (!options || !('layerVisConfig' in options)) {
2652
+ return undefined;
2653
+ }
2654
+ var patch = options.layerVisConfig;
2655
+ if (patch == null || _typeof(patch) !== 'object' || Array.isArray(patch)) {
2656
+ return undefined;
2657
+ }
2658
+ return patch;
2659
+ }
2660
+
2661
+ /**
2662
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2663
+ */
2664
+ function postMergeUpdater(mergedState, postMergerPayload) {
2665
+ var newDataIds = postMergerPayload.newDataIds,
2666
+ options = postMergerPayload.options,
2667
+ layerMergers = postMergerPayload.layerMergers;
2668
+ var newFilters = mergedState.filters.filter(function (f) {
2669
+ return f.dataId.find(function (fDataId) {
2670
+ return newDataIds.includes(fDataId);
2671
+ });
2672
+ });
2673
+ var datasetFiltered = uniq(newFilters.reduce(function (accu, f) {
2674
+ return [].concat(_toConsumableArray(accu), _toConsumableArray(f.dataId));
2675
+ }, []));
2676
+ var dataEmpty = newDataIds.length < 1;
2677
+ var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
2678
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
2679
+ }) : [];
2680
+ var newDataEntries = newDataIds.reduce(function (accu, id) {
2681
+ return _objectSpread(_objectSpread({}, accu), {}, _defineProperty({}, id, mergedState.datasets[id]));
2682
+ }, {});
2683
+ if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
2684
+ // no layer merged, find defaults
2685
+ var result = addDefaultLayers(mergedState, newDataEntries);
2686
+ mergedState = result.state;
2687
+ newLayers = result.newLayers;
2688
+ }
2689
+ if (mergedState.splitMaps.length) {
2690
+ // if map is split, add new layers to splitMaps
2691
+ newLayers = mergedState.layers.filter(function (l) {
2692
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
2693
+ });
2694
+ mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
2695
+ splitMaps: addNewLayersToSplitMap(mergedState.splitMaps, newLayers)
2696
+ });
2697
+ }
2698
+ mergedState = mergeLayerVisConfigForNewDatasets(mergedState, layerVisConfigFromAddDataOptions(options), newDataIds);
2699
+
2700
+ // if no tooltips merged add default tooltips
2701
+ newDataIds.forEach(function (dataId) {
2702
+ var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
2703
+ // loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
2704
+ if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
2705
+ // adding dataset: autoCreateTooltips is true
2706
+ mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
2707
+ }
2708
+ });
2709
+ var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : uniq(Object.keys(newDataEntries).concat(datasetFiltered));
2710
+ var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined);
2711
+
2712
+ // register layer animation domain,
2713
+ // need to be called after layer data is calculated
2714
+ updatedState = updateAnimationDomain(updatedState);
2715
+
2716
+ // try to process layerMergers after dataset+datasetMergers
2717
+ updatedState = layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
2718
+ mergers: layerMergers,
2719
+ postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
2720
+ layerMergers: []
2721
+ })
2722
+ }) : updatedState;
2723
+
2724
+ // center the map once the dataset is created
2725
+ if (newLayers.length && (options || {}).centerMap) {
2726
+ var bounds = findMapBounds(newLayers);
2727
+ if (bounds) {
2728
+ var fitBoundsTask = ACTION_TASK_FIT_BOUNDS().map(function () {
2729
+ return fitMapBounds(bounds);
2730
+ });
2731
+ updatedState = withTask(updatedState, fitBoundsTask);
2732
+ }
2733
+ }
2734
+
2735
+ // need to center map here if we have new layers
2736
+ return updatedState;
2737
+ }
2738
+
2739
+ /**
2740
+ * Rename an existing dataset in `visState`
2741
+ * @memberof visStateUpdaters
2742
+ * @public
2743
+ */
2744
+ export function renameDatasetUpdater(state, action) {
2745
+ return updateDatasetPropsUpdater(state, {
2746
+ dataId: action.dataId,
2747
+ props: {
2748
+ label: action.label
2749
+ }
2750
+ });
2751
+ }
2752
+ var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
2753
+
2754
+ /**
2755
+ * Validates properties before updating the dataset.
2756
+ * Makes sure each property is in the allowed list
2757
+ * Makes sure color value is RGB
2758
+ * Performs deep merge when updating metadata
2759
+ */
2760
+ var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
2761
+ var validatedProps = Object.entries(props).reduce(function (acc, entry) {
2762
+ var _entry = _slicedToArray(entry, 2),
2763
+ key = _entry[0],
2764
+ value = _entry[1];
2765
+ // is it allowed ?
2766
+ if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
2767
+ return acc;
2768
+ }
2769
+
2770
+ // if we are adding a color but it is not RGB we don't accept the value
2771
+ // in the future as we add more props we should change this if into a switch
2772
+ if (key === 'color' && !isRgbColor(value)) {
2773
+ return acc;
2774
+ }
2775
+
2776
+ // do we need deep merge ?
2777
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, isPlainObject(value) ? deepmerge(dataset[key] || {}, value) : value));
2778
+ }, {});
2779
+ return validatedProps;
2780
+ };
2781
+
2782
+ /**
2783
+ * Update Dataset props (label, color, meta). Do not use to update data or any related properties
2784
+ * @memberof visStateUpdaters
2785
+ * @public
2786
+ */
2787
+ export function updateDatasetPropsUpdater(state, action) {
2788
+ var dataId = action.dataId,
2789
+ props = action.props;
2790
+ var datasets = state.datasets;
2791
+ var existing = datasets[dataId];
2792
+ if (existing) {
2793
+ var validatedProps = validateDatasetUpdateProps(props, existing);
2794
+ // validate props: just color for now
2795
+ // we only allow label, color and meta to be updated
2796
+ // const newTable = copyTableAndUpdate(existing, validatedProps);
2797
+ return _objectSpread(_objectSpread({}, state), {}, {
2798
+ datasets: _objectSpread(_objectSpread({}, datasets), {}, _defineProperty({}, dataId, copyTableAndUpdate(existing, validatedProps)))
2799
+ });
2800
+ }
2801
+ return state;
2802
+ }
2803
+
2804
+ /**
2805
+ * When a user clicks on the specific map closing icon
2806
+ * the application will close the selected map
2807
+ * and will merge the remaining one with the global state
2808
+ * TODO: i think in the future this action should be called merge map layers with global settings
2809
+ * @param {Object} state `visState`
2810
+ * @param {Object} action action
2811
+ * @returns {Object} nextState
2812
+ */
2813
+ export function closeSpecificMapAtIndex(state, action) {
2814
+ var _state$splitMaps$inde;
2815
+ // retrieve layers meta data from the remaining map that we need to keep
2816
+ var indexToRetrieve = 1 - action.payload;
2817
+ var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
2818
+ var layers = state.layers;
2819
+
2820
+ // update layer visibility
2821
+ var newLayers = layers.map(function (layer) {
2822
+ return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
2823
+ // if layer.id is not in mapLayers, it should be inVisible
2824
+ isVisible: false
2825
+ }) : layer;
2826
+ });
2827
+
2828
+ // delete map
2829
+ return _objectSpread(_objectSpread({}, state), {}, {
2830
+ layers: newLayers,
2831
+ splitMaps: []
2832
+ });
2833
+ }
2834
+
2835
+ /**
2836
+ * Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
2837
+ * @memberof visStateUpdaters
2838
+ * @public
2839
+ */
2840
+ export var loadFilesUpdater = function loadFilesUpdater(state, action) {
2841
+ var files = action.files,
2842
+ _action$onFinish = action.onFinish,
2843
+ onFinish = _action$onFinish === void 0 ? loadFilesSuccess : _action$onFinish;
2844
+ if (!files.length) {
2845
+ return state;
2846
+ }
2847
+ var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
2848
+ return merge_(initialFileLoadingProgress(f, i))(accu);
2849
+ }, {});
2850
+ var fileLoading = {
2851
+ fileCache: [],
2852
+ filesToLoad: files,
2853
+ onFinish: onFinish
2854
+ };
2855
+ var nextState = merge_({
2856
+ fileLoadingProgress: fileLoadingProgress,
2857
+ fileLoading: fileLoading
2858
+ })(state);
2859
+ return loadNextFileUpdater(nextState);
2860
+ };
2861
+
2862
+ /**
2863
+ * Sucessfully loaded one file, move on to the next one
2864
+ * @memberof visStateUpdaters
2865
+ * @public
2866
+ */
2867
+ export function loadFileStepSuccessUpdater(state, action) {
2868
+ if (!state.fileLoading) {
2869
+ return state;
2870
+ }
2871
+ var fileName = action.fileName,
2872
+ fileCache = action.fileCache;
2873
+ var _state$fileLoading = state.fileLoading,
2874
+ filesToLoad = _state$fileLoading.filesToLoad,
2875
+ onFinish = _state$fileLoading.onFinish;
2876
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
2877
+ fileName: fileName,
2878
+ progress: {
2879
+ percent: 1,
2880
+ message: 'Done'
2881
+ }
2882
+ });
2883
+
2884
+ // save processed file to fileCache
2885
+ var stateWithCache = pick_('fileLoading')(merge_({
2886
+ fileCache: fileCache
2887
+ }))(stateWithProgress);
2888
+ return withTask(stateWithCache, DELAY_TASK(200).map(filesToLoad.length ? loadNextFile : function () {
2889
+ return onFinish(fileCache);
2890
+ }));
2891
+ }
2892
+
2893
+ // withTask<T>(state: T, task: any): T
2894
+
2895
+ /**
2896
+ *
2897
+ * @memberof visStateUpdaters
2898
+ * @public
2899
+ */
2900
+ export function loadNextFileUpdater(state) {
2901
+ if (!state.fileLoading) {
2902
+ return state;
2903
+ }
2904
+ var filesToLoad = state.fileLoading.filesToLoad;
2905
+ var _filesToLoad = _toArray(filesToLoad),
2906
+ file = _filesToLoad[0],
2907
+ remainingFilesToLoad = _filesToLoad.slice(1);
2908
+
2909
+ // save filesToLoad to state
2910
+ var nextState = pick_('fileLoading')(merge_({
2911
+ filesToLoad: remainingFilesToLoad
2912
+ }))(state);
2913
+ var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
2914
+ fileName: file.name,
2915
+ progress: {
2916
+ percent: 0,
2917
+ message: 'loading...'
2918
+ }
2919
+ });
2920
+ var loaders = state.loaders,
2921
+ loadOptions = state.loadOptions;
2922
+ return withTask(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
2923
+ }
2924
+ export function makeLoadFileTask(file, fileCache) {
2925
+ var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
2926
+ var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
2927
+ return LOAD_FILE_TASK({
2928
+ file: file,
2929
+ fileCache: fileCache,
2930
+ loaders: loaders,
2931
+ loadOptions: loadOptions
2932
+ }).bimap(
2933
+ // prettier ignore
2934
+ // success
2935
+ function (gen) {
2936
+ return nextFileBatch({
2937
+ gen: gen,
2938
+ fileName: file.name,
2939
+ onFinish: function onFinish(result) {
2940
+ return processFileContent({
2941
+ content: result,
2942
+ fileCache: fileCache
2943
+ });
2944
+ }
2945
+ });
2946
+ },
2947
+ // error
2948
+ function (err) {
2949
+ return loadFilesErr(file.name, err);
2950
+ });
2951
+ }
2952
+
2953
+ /**
2954
+ *
2955
+ * @memberof visStateUpdaters
2956
+ * @public
2957
+ */
2958
+ export function processFileContentUpdater(state, action) {
2959
+ var _action$payload2 = action.payload,
2960
+ content = _action$payload2.content,
2961
+ fileCache = _action$payload2.fileCache;
2962
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
2963
+ fileName: content.fileName,
2964
+ progress: {
2965
+ percent: 1,
2966
+ message: 'processing...'
2967
+ }
2968
+ });
2969
+ return withTask(stateWithProgress, PROCESS_FILE_DATA({
2970
+ content: content,
2971
+ fileCache: fileCache
2972
+ }).bimap(function (result) {
2973
+ return loadFileStepSuccess({
2974
+ fileName: content.fileName,
2975
+ fileCache: result
2976
+ });
2977
+ }, function (err) {
2978
+ return loadFilesErr(content.fileName, err);
2979
+ }));
2980
+ }
2981
+
2982
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2983
+ export function parseProgress() {
2984
+ var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2985
+ var progress = arguments.length > 1 ? arguments[1] : undefined;
2986
+ // This happens when receiving query metadata or other cases we don't
2987
+ // have an update for the user.
2988
+ if (!progress || !progress.percent) {
2989
+ return {};
2990
+ }
2991
+ return {
2992
+ percent: progress.percent
2993
+ };
2994
+ }
2995
+
2996
+ /**
2997
+ * gets called with payload = AsyncGenerator<???>
2998
+ * @memberof visStateUpdaters
2999
+ * @public
3000
+ */
3001
+ export var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref22) {
3002
+ var _accumulated$data;
3003
+ var _ref22$payload = _ref22.payload,
3004
+ gen = _ref22$payload.gen,
3005
+ fileName = _ref22$payload.fileName,
3006
+ progress = _ref22$payload.progress,
3007
+ accumulated = _ref22$payload.accumulated,
3008
+ onFinish = _ref22$payload.onFinish;
3009
+ var stateWithProgress = updateFileLoadingProgressUpdater(state, {
3010
+ fileName: fileName,
3011
+ progress: parseProgress(state.fileLoadingProgress[fileName], progress)
3012
+ });
3013
+ return withTask(stateWithProgress, [].concat(_toConsumableArray(getApplicationConfig().useArrowProgressiveLoading && fileName.endsWith('arrow') && (accumulated === null || accumulated === void 0 || (_accumulated$data = accumulated.data) === null || _accumulated$data === void 0 ? void 0 : _accumulated$data.length) > 0 ? [PROCESS_FILE_DATA({
3014
+ content: accumulated,
3015
+ fileCache: []
3016
+ }).bimap(function (result) {
3017
+ return loadFilesSuccess(result);
3018
+ }, function (err) {
3019
+ return loadFilesErr(fileName, err);
3020
+ })] : []), [UNWRAP_TASK(gen.next()).bimap(function (_ref23) {
3021
+ var value = _ref23.value,
3022
+ done = _ref23.done;
3023
+ return done ? onFinish(accumulated) : nextFileBatch({
3024
+ gen: gen,
3025
+ fileName: fileName,
3026
+ progress: value.progress,
3027
+ accumulated: value,
3028
+ onFinish: onFinish
3029
+ });
3030
+ }, function (err) {
3031
+ return loadFilesErr(fileName, err);
3032
+ })]));
3033
+ };
3034
+
3035
+ /**
3036
+ * Trigger loading file error
3037
+ * @memberof visStateUpdaters
3038
+ * @public
3039
+ */
3040
+ export var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref24) {
3041
+ var error = _ref24.error,
3042
+ fileName = _ref24.fileName;
3043
+ // update ui with error message
3044
+ Console.warn(error);
3045
+ if (!state.fileLoading) {
3046
+ return state;
3047
+ }
3048
+ var _state$fileLoading2 = state.fileLoading,
3049
+ filesToLoad = _state$fileLoading2.filesToLoad,
3050
+ onFinish = _state$fileLoading2.onFinish,
3051
+ fileCache = _state$fileLoading2.fileCache;
3052
+ var nextState = updateFileLoadingProgressUpdater(state, {
3053
+ fileName: fileName,
3054
+ progress: {
3055
+ error: error
3056
+ }
3057
+ });
3058
+
3059
+ // kick off next file or finish
3060
+ return withTask(nextState, DELAY_TASK(200).map(filesToLoad.length ? loadNextFile : function () {
3061
+ return onFinish(fileCache);
3062
+ }));
3063
+ };
3064
+
3065
+ /**
3066
+ * When select dataset for export, apply cpu filter to selected dataset
3067
+ * @memberof visStateUpdaters
3068
+ * @public
3069
+ */
3070
+ export var applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref25) {
3071
+ var dataId = _ref25.dataId;
3072
+ // apply cpuFilter
3073
+ var dataIds = toArray(dataId);
3074
+ return dataIds.reduce(function (accu, id) {
3075
+ return filterDatasetCPU(accu, id);
3076
+ }, state);
3077
+ };
3078
+
3079
+ /**
3080
+ * User input to update the info of the map
3081
+ * @memberof visStateUpdaters
3082
+ * @public
3083
+ */
3084
+ export var setMapInfoUpdater = function setMapInfoUpdater(state, action) {
3085
+ return _objectSpread(_objectSpread({}, state), {}, {
3086
+ mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
3087
+ });
3088
+ };
3089
+ /**
3090
+ * Helper function to update All layer domain and layer data of state
3091
+ */
3092
+ export function addDefaultLayers(state, datasets) {
3093
+ var empty = [];
3094
+ var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
3095
+ var foundLayers = findDefaultLayer(dataset, state.layerClasses);
3096
+ return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
3097
+ }, empty);
3098
+ return {
3099
+ state: _objectSpread(_objectSpread({}, state), {}, {
3100
+ layers: [].concat(_toConsumableArray(state.layers), _toConsumableArray(defaultLayers)),
3101
+ layerOrder: [].concat(_toConsumableArray(getLayerOrderFromLayers(defaultLayers)), _toConsumableArray(state.layerOrder))
3102
+ }),
3103
+ newLayers: defaultLayers
3104
+ };
3105
+ }
3106
+
3107
+ /**
3108
+ * helper function to find default tooltips
3109
+ * @param {Object} state
3110
+ * @param {Object} dataset
3111
+ * @returns {Object} nextState
3112
+ */
3113
+ export function addDefaultTooltips(state, dataset) {
3114
+ var tooltipFields = findFieldsToShow(_objectSpread(_objectSpread({}, dataset), {}, {
3115
+ maxDefaultTooltips: state.maxDefaultTooltips
3116
+ }));
3117
+ var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
3118
+ return set(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
3119
+ }
3120
+ export function initialFileLoadingProgress(file, index) {
3121
+ var fileName = file.name || "Untitled File ".concat(index);
3122
+ return _defineProperty({}, fileName, {
3123
+ // percent of current file
3124
+ percent: 0,
3125
+ message: '',
3126
+ fileName: fileName,
3127
+ error: null
3128
+ });
3129
+ }
3130
+ export function updateFileLoadingProgressUpdater(state, _ref27) {
3131
+ var fileName = _ref27.fileName,
3132
+ progress = _ref27.progress;
3133
+ // @ts-expect-error
3134
+ return pick_('fileLoadingProgress')(pick_(fileName)(merge_(progress)))(state);
3135
+ }
3136
+ /**
3137
+ * Helper function to update layer domains for an array of datasets
3138
+ */
3139
+ export function updateAllLayerDomainData(state, dataId, updatedFilter) {
3140
+ var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
3141
+ var newLayers = [];
3142
+ var newLayerData = [];
3143
+ state.layers.forEach(function (oldLayer, i) {
3144
+ if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
3145
+ // No need to recalculate layer domain if filter has fixed domain
3146
+ var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
3147
+ var _calculateLayerData7 = calculateLayerData(newLayer, state, state.layerData[i]),
3148
+ layerData = _calculateLayerData7.layerData,
3149
+ layer = _calculateLayerData7.layer;
3150
+ newLayers.push(layer);
3151
+ newLayerData.push(layerData);
3152
+ } else {
3153
+ newLayers.push(oldLayer);
3154
+ newLayerData.push(state.layerData[i]);
3155
+ }
3156
+ });
3157
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3158
+ layers: newLayers,
3159
+ layerData: newLayerData
3160
+ });
3161
+ return newState;
3162
+ }
3163
+ export function updateAnimationDomain(state) {
3164
+ var _state$filters;
3165
+ // merge all animatable layer domain and update global config
3166
+ var animatableLayers = getAnimatableVisibleLayers(state.layers);
3167
+ if (!animatableLayers.length) {
3168
+ return _objectSpread(_objectSpread({}, state), {}, {
3169
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
3170
+ domain: null,
3171
+ isAnimating: false,
3172
+ timeSteps: null,
3173
+ defaultTimeFormat: null
3174
+ })
3175
+ });
3176
+ }
3177
+ var layerDomains = animatableLayers.map(function (l) {
3178
+ return l.config.animation.domain || [];
3179
+ });
3180
+ // @ts-ignore
3181
+ var mergedDomain = mergeTimeDomains(layerDomains);
3182
+ var defaultTimeFormat = getTimeWidgetTitleFormatter(mergedDomain);
3183
+
3184
+ // merge timeSteps
3185
+ var mergedTimeSteps = uniq(animatableLayers.reduce(function (accu, layer) {
3186
+ accu.push.apply(accu, _toConsumableArray(layer.config.animation.timeSteps || []));
3187
+ return accu;
3188
+ }, [])).sort();
3189
+ mergedTimeSteps = mergedTimeSteps.length ? mergedTimeSteps : null;
3190
+
3191
+ // TODO: better handling of duration calculation
3192
+ var duration = mergedTimeSteps ? BASE_SPEED * (1000 / FPS) / mergedTimeSteps.length / (state.animationConfig.speed || 1) : null;
3193
+ var nextState = _objectSpread(_objectSpread({}, state), {}, {
3194
+ animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
3195
+ domain: mergedDomain,
3196
+ defaultTimeFormat: defaultTimeFormat,
3197
+ duration: duration,
3198
+ timeSteps: mergedTimeSteps
3199
+ })
3200
+ });
3201
+
3202
+ // reset currentTime based on new domain
3203
+ var syncedFilter = (_state$filters = state.filters) === null || _state$filters === void 0 ? void 0 : _state$filters.find(function (f) {
3204
+ return f.syncedWithLayerTimeline;
3205
+ });
3206
+
3207
+ // if synced filter exist wee need to merge animationConfig and filter domains
3208
+ // and validate the current time against the new merged domain
3209
+ var newAnimationDomain = syncedFilter ? mergeTimeDomains([mergedDomain, syncedFilter.domain]) : mergedDomain;
3210
+ var currentTime = isInRange(state.animationConfig.currentTime, newAnimationDomain) ? state.animationConfig.currentTime : newAnimationDomain[0];
3211
+ if (currentTime !== state.animationConfig.currentTime) {
3212
+ // if currentTime changed, need to call animationTimeUpdater to re call formatLayerData
3213
+ return setLayerAnimationTimeUpdater(nextState, {
3214
+ value: currentTime
3215
+ });
3216
+ }
3217
+ return nextState;
3218
+ }
3219
+
3220
+ /**
3221
+ * Update the status of the editor
3222
+ * @memberof visStateUpdaters
3223
+ */
3224
+ export var setEditorModeUpdater = function setEditorModeUpdater(state, _ref28) {
3225
+ var mode = _ref28.mode;
3226
+ return _objectSpread(_objectSpread({}, state), {}, {
3227
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3228
+ mode: mode,
3229
+ selectedFeature: null
3230
+ })
3231
+ });
3232
+ };
3233
+
3234
+ // const featureToFilterValue = (feature) => ({...feature, id: feature.id});
3235
+ /**
3236
+ * Update editor features
3237
+ * @memberof visStateUpdaters
3238
+ */
3239
+ export function setFeaturesUpdater(state, _ref29) {
3240
+ var _lastFeature$properti, _lastFeature$properti2;
3241
+ var _ref29$features = _ref29.features,
3242
+ features = _ref29$features === void 0 ? [] : _ref29$features;
3243
+ var lastFeature = features.length && features[features.length - 1];
3244
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3245
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3246
+ // only save none filter features to editor
3247
+ features: features.filter(function (f) {
3248
+ return !getFilterIdInFeature(f);
3249
+ }),
3250
+ mode: lastFeature && (_lastFeature$properti = lastFeature.properties) !== null && _lastFeature$properti !== void 0 && _lastFeature$properti.isClosed ? ((_lastFeature$properti2 = lastFeature.properties) === null || _lastFeature$properti2 === void 0 ? void 0 : _lastFeature$properti2.shape) === 'Rectangle' ? state.editor.mode : EDITOR_MODES.EDIT : state.editor.mode
3251
+ })
3252
+ });
3253
+
3254
+ // Retrieve existing feature
3255
+ var selectedFeature = state.editor.selectedFeature;
3256
+
3257
+ // If no feature is selected we can simply return since no operations
3258
+ if (!selectedFeature) {
3259
+ return newState;
3260
+ }
3261
+
3262
+ // TODO: check if the feature has changed
3263
+ var feature = features.find(function (f) {
3264
+ return f.id === selectedFeature.id;
3265
+ });
3266
+
3267
+ // if feature is part of a filter
3268
+ var filterId = feature && getFilterIdInFeature(feature);
3269
+ if (filterId && feature) {
3270
+ // add bbox for polygon filter to speed up filtering
3271
+ if (feature.properties) feature.properties.bbox = bbox(feature);
3272
+ var featureValue = featureToFilterValue(feature, filterId);
3273
+ var filterIdx = state.filters.findIndex(function (fil) {
3274
+ return fil.id === filterId;
3275
+ });
3276
+ // @ts-ignore
3277
+ return setFilterUpdater(newState, {
3278
+ idx: filterIdx,
3279
+ prop: 'value',
3280
+ value: featureValue
3281
+ });
3282
+ }
3283
+ return newState;
3284
+ }
3285
+
3286
+ /**
3287
+ * Set the current selected feature
3288
+ * @memberof uiStateUpdaters
3289
+ */
3290
+ export var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref30) {
3291
+ var feature = _ref30.feature,
3292
+ selectionContext = _ref30.selectionContext;
3293
+ // add bbox for polygon filter to speed up filtering
3294
+ var selectedFeature = feature;
3295
+ if (feature !== null && feature !== void 0 && feature.properties) {
3296
+ selectedFeature = _objectSpread(_objectSpread({}, feature), {}, {
3297
+ properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
3298
+ bbox: bbox(feature)
3299
+ })
3300
+ });
3301
+ }
3302
+ return _objectSpread(_objectSpread({}, state), {}, {
3303
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3304
+ selectedFeature: selectedFeature,
3305
+ selectionContext: selectionContext
3306
+ })
3307
+ });
3308
+ };
3309
+
3310
+ /**
3311
+ * Delete existing feature from filters
3312
+ * @memberof visStateUpdaters
3313
+ */
3314
+ export function deleteFeatureUpdater(state, _ref31) {
3315
+ var feature = _ref31.feature;
3316
+ if (!feature) {
3317
+ return state;
3318
+ }
3319
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3320
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3321
+ selectedFeature: null
3322
+ })
3323
+ });
3324
+ if (getFilterIdInFeature(feature)) {
3325
+ var filterIdx = newState.filters.findIndex(function (f) {
3326
+ return f.id === getFilterIdInFeature(feature);
3327
+ });
3328
+ return filterIdx > -1 ? removeFilterUpdater(newState, {
3329
+ idx: filterIdx
3330
+ }) : newState;
3331
+ }
3332
+
3333
+ // modify editor object
3334
+ var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
3335
+ features: state.editor.features.filter(function (f) {
3336
+ return f.id !== feature.id;
3337
+ }),
3338
+ selectedFeature: null
3339
+ });
3340
+ return _objectSpread(_objectSpread({}, state), {}, {
3341
+ editor: newEditor
3342
+ });
3343
+ }
3344
+
3345
+ /**
3346
+ * Toggle feature as layer filter
3347
+ * @memberof visStateUpdaters
3348
+ */
3349
+ export function setPolygonFilterLayerUpdater(state, payload) {
3350
+ var layer = payload.layer,
3351
+ feature = payload.feature;
3352
+ var filterId = getFilterIdInFeature(feature);
3353
+
3354
+ // let newFilter = null;
3355
+ var filterIdx;
3356
+ var newLayerId = [layer.id];
3357
+ var newState = state;
3358
+ // If polygon filter already exists, we need to find out if the current layer is already included
3359
+ if (filterId) {
3360
+ filterIdx = state.filters.findIndex(function (f) {
3361
+ return f.id === filterId;
3362
+ });
3363
+ if (!state.filters[filterIdx]) {
3364
+ // what if filter doesn't exist?... not possible.
3365
+ // because features in the editor is passed in from filters and editors.
3366
+ // but we will move this feature back to editor just in case
3367
+ var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
3368
+ properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
3369
+ filterId: null
3370
+ })
3371
+ });
3372
+ return _objectSpread(_objectSpread({}, state), {}, {
3373
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3374
+ features: [].concat(_toConsumableArray(state.editor.features), [noneFilterFeature]),
3375
+ selectedFeature: noneFilterFeature
3376
+ })
3377
+ });
3378
+ }
3379
+ var filter = state.filters[filterIdx];
3380
+ var _filter$layerId = filter.layerId,
3381
+ layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
3382
+ var isLayerIncluded = layerId.includes(layer.id);
3383
+ newLayerId = isLayerIncluded ?
3384
+ // if layer is included, remove it
3385
+ layerId.filter(function (l) {
3386
+ return l !== layer.id;
3387
+ }) : [].concat(_toConsumableArray(layerId), [layer.id]);
3388
+ } else {
3389
+ // if we haven't create the polygon filter, create it
3390
+ var newFilter = generatePolygonFilter([], feature);
3391
+ filterIdx = state.filters.length;
3392
+
3393
+ // add feature, remove feature from eidtor
3394
+ newState = _objectSpread(_objectSpread({}, state), {}, {
3395
+ filters: [].concat(_toConsumableArray(state.filters), [newFilter]),
3396
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3397
+ features: state.editor.features.filter(function (f) {
3398
+ return f.id !== feature.id;
3399
+ }),
3400
+ selectedFeature: newFilter.value
3401
+ })
3402
+ });
3403
+ }
3404
+ return setFilterUpdater(newState, {
3405
+ idx: filterIdx,
3406
+ prop: 'layerId',
3407
+ value: newLayerId
3408
+ });
3409
+ }
3410
+
3411
+ /**
3412
+ * Apply polygon filter to all visible layers
3413
+ * @memberof visStateUpdaters
3414
+ */
3415
+ export function setPolygonFilterAllLayersUpdater(state, payload) {
3416
+ var feature = payload.feature;
3417
+ var newFilter = generatePolygonFilter([], feature);
3418
+ var filterIdx = state.filters.length;
3419
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3420
+ filters: [].concat(_toConsumableArray(state.filters), [newFilter]),
3421
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3422
+ features: state.editor.features.filter(function (f) {
3423
+ return f.id !== feature.id;
3424
+ }),
3425
+ selectedFeature: newFilter.value,
3426
+ mode: EDITOR_MODES.EDIT
3427
+ })
3428
+ });
3429
+ var visibleLayerIds = get(payload, 'visibleLayerIds');
3430
+ var allLayerIds = Array.isArray(visibleLayerIds) ? visibleLayerIds : state.layers.filter(function (l) {
3431
+ return l.config.isVisible;
3432
+ }).map(function (l) {
3433
+ return l.id;
3434
+ });
3435
+ return setFilterUpdater(newState, {
3436
+ idx: filterIdx,
3437
+ prop: 'layerId',
3438
+ value: allLayerIds
3439
+ });
3440
+ }
3441
+
3442
+ /**
3443
+ * @memberof visStateUpdaters
3444
+ * @public
3445
+ */
3446
+ export function sortTableColumnUpdater(state, _ref32) {
3447
+ var dataId = _ref32.dataId,
3448
+ column = _ref32.column,
3449
+ mode = _ref32.mode;
3450
+ var dataset = state.datasets[dataId];
3451
+ if (!dataset) {
3452
+ return state;
3453
+ }
3454
+ var sortMode = mode;
3455
+ if (!sortMode) {
3456
+ var currentMode = get(dataset, ['sortColumn', column]);
3457
+ // @ts-ignore - should be fixable in a TS file
3458
+ sortMode = currentMode ? Object.keys(SORT_ORDER).find(function (m) {
3459
+ return m !== currentMode;
3460
+ }) : SORT_ORDER.ASCENDING;
3461
+ }
3462
+ var sorted = sortDatasetByColumn(dataset, column, sortMode);
3463
+ return set(['datasets', dataId], sorted, state);
3464
+ }
3465
+
3466
+ /**
3467
+ * @memberof visStateUpdaters
3468
+ * @public
3469
+ */
3470
+ export function pinTableColumnUpdater(state, _ref33) {
3471
+ var dataId = _ref33.dataId,
3472
+ column = _ref33.column;
3473
+ var dataset = state.datasets[dataId];
3474
+ if (!dataset) {
3475
+ return state;
3476
+ }
3477
+ var newDataset = pinTableColumns(dataset, column);
3478
+ return set(['datasets', dataId], newDataset, state);
3479
+ }
3480
+
3481
+ /**
3482
+ * Copy column content as strings
3483
+ * @memberof visStateUpdaters
3484
+ * @public
3485
+ */
3486
+ export function copyTableColumnUpdater(state, _ref34) {
3487
+ var dataId = _ref34.dataId,
3488
+ column = _ref34.column;
3489
+ var dataset = state.datasets[dataId];
3490
+ if (!dataset) {
3491
+ return state;
3492
+ }
3493
+ var fieldIdx = dataset.fields.findIndex(function (f) {
3494
+ return f.name === column;
3495
+ });
3496
+ if (fieldIdx < 0) {
3497
+ return state;
3498
+ }
3499
+ var type = dataset.fields[fieldIdx].type;
3500
+ var text = dataset.dataContainer.map(function (row) {
3501
+ return parseFieldValue(row.valueAt(fieldIdx), type);
3502
+ }, true).join('\n');
3503
+ copy(text);
3504
+ return state;
3505
+ }
3506
+
3507
+ /**
3508
+ * Set display format from columns from user selection
3509
+ * @memberof visStateUpdaters
3510
+ * @public
3511
+ */
3512
+ export function setColumnDisplayFormatUpdater(state, _ref35) {
3513
+ var dataId = _ref35.dataId,
3514
+ formats = _ref35.formats;
3515
+ var dataset = state.datasets[dataId];
3516
+ if (!dataset) {
3517
+ return state;
3518
+ }
3519
+ var newFields = dataset.fields;
3520
+ Object.keys(formats).forEach(function (column) {
3521
+ var fieldIdx = dataset.fields.findIndex(function (f) {
3522
+ return f.name === column;
3523
+ });
3524
+ if (fieldIdx >= 0) {
3525
+ var displayFormat = formats[column];
3526
+ var field = newFields[fieldIdx];
3527
+ newFields = swap_(merge_({
3528
+ displayFormat: displayFormat
3529
+ })(field))(newFields);
3530
+ }
3531
+ });
3532
+ var newDataset = copyTableAndUpdate(dataset, {
3533
+ fields: newFields
3534
+ });
3535
+ var newState = pick_('datasets')(merge_(_defineProperty({}, dataId, newDataset)))(state);
3536
+
3537
+ // update colorField displayFormat
3538
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3539
+ layers: newState.layers.map(function (layer) {
3540
+ var _layer$config;
3541
+ return (_layer$config = layer.config) !== null && _layer$config !== void 0 && (_layer$config = _layer$config.colorField) !== null && _layer$config !== void 0 && _layer$config.name && layer.config.colorField.name in formats ? layer.updateLayerConfig({
3542
+ colorField: _objectSpread(_objectSpread({}, layer.config.colorField), {}, {
3543
+ displayFormat: formats[layer.config.colorField.name]
3544
+ })
3545
+ }) : layer;
3546
+ })
3547
+ });
3548
+ return newState;
3549
+ }
3550
+
3551
+ /**
3552
+ * Update editor
3553
+ */
3554
+ export function toggleEditorVisibilityUpdater(state,
3555
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3556
+ action) {
3557
+ return _objectSpread(_objectSpread({}, state), {}, {
3558
+ editor: _objectSpread(_objectSpread({}, state.editor), {}, {
3559
+ visible: !state.editor.visible
3560
+ })
3561
+ });
3562
+ }
3563
+ export function setFilterAnimationTimeConfigUpdater(state, _ref36) {
3564
+ var idx = _ref36.idx,
3565
+ config = _ref36.config;
3566
+ var oldFilter = state.filters[idx];
3567
+ if (!oldFilter) {
3568
+ Console.error("filters.".concat(idx, " is undefined"));
3569
+ return state;
3570
+ }
3571
+ if (oldFilter.type !== FILTER_TYPES.timeRange) {
3572
+ Console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
3573
+ return state;
3574
+ }
3575
+ var updates = checkTimeConfigArgs(config);
3576
+ return pick_('filters')(swap_(merge_(updates)(oldFilter)))(state);
3577
+ }
3578
+ function checkTimeConfigArgs(config) {
3579
+ var allowed = ['timeFormat', 'timezone'];
3580
+ return Object.keys(config).reduce(function (accu, prop) {
3581
+ if (!allowed.includes(prop)) {
3582
+ Console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
3583
+ return accu;
3584
+ }
3585
+
3586
+ // here we are NOT checking if timezone or timeFormat input is valid
3587
+ accu[prop] = config[prop];
3588
+ return accu;
3589
+ }, {});
3590
+ }
3591
+
3592
+ /**
3593
+ * Update editor
3594
+ */
3595
+ export function setLayerAnimationTimeConfigUpdater(state, _ref37) {
3596
+ var config = _ref37.config;
3597
+ if (!config) {
3598
+ return state;
3599
+ }
3600
+ var updates = checkTimeConfigArgs(config);
3601
+ return pick_('animationConfig')(merge_(updates))(state);
3602
+ }
3603
+
3604
+ /**
3605
+ * Update editor
3606
+ */
3607
+ export function layerFilteredItemsChangeUpdater(state, action) {
3608
+ var _layer$filteredItemCo;
3609
+ var event = action.event,
3610
+ layer = action.layer;
3611
+ var deckglLayerId = event.id,
3612
+ count = event.count;
3613
+ if (!layer) {
3614
+ Console.warn("layerFilteredItems layer doesnt exists");
3615
+ return state;
3616
+ }
3617
+ if (((_layer$filteredItemCo = layer.filteredItemCount) === null || _layer$filteredItemCo === void 0 ? void 0 : _layer$filteredItemCo[deckglLayerId]) === count) {
3618
+ return state;
3619
+ }
3620
+ layer.filteredItemCount = _objectSpread(_objectSpread({}, layer.filteredItemCount), {}, _defineProperty({}, deckglLayerId, count));
3621
+ return _objectSpread(_objectSpread({}, state), {}, {
3622
+ layers: swap_(layer)(state.layers)
3623
+ });
3624
+ }
3625
+
3626
+ /**
3627
+ * Update WMS feature info and pin tooltip
3628
+ */
3629
+ export function wmsFeatureInfoUpdater(state, action) {
3630
+ var layer = action.layer,
3631
+ featureInfo = action.featureInfo,
3632
+ coordinate = action.coordinate;
3633
+ if (!layer) {
3634
+ console.warn("WMS feature info layer doesn't exist");
3635
+ return state;
3636
+ }
3637
+
3638
+ // Create a clicked object similar to layerClickUpdater to pin the tooltip
3639
+ var clicked = featureInfo ? {
3640
+ picked: true,
3641
+ object: {
3642
+ wmsFeatureInfo: featureInfo
3643
+ },
3644
+ coordinate: coordinate || [0, 0],
3645
+ layer: {
3646
+ props: {
3647
+ idx: state.layers.findIndex(function (l) {
3648
+ return l.id === layer.id;
3649
+ }),
3650
+ id: layer.id
3651
+ }
3652
+ }
3653
+ } : null;
3654
+ return _objectSpread(_objectSpread({}, state), {}, {
3655
+ clicked: clicked
3656
+ });
3657
+ }
3658
+
3659
+ // eslint-disable-next-line max-statements
3660
+ export function syncTimeFilterWithLayerTimelineUpdater(state, action) {
3661
+ var _newState$animationCo, _newState$animationCo2;
3662
+ var filterIdx = action.idx,
3663
+ _action$enable = action.enable,
3664
+ enable = _action$enable === void 0 ? false : _action$enable;
3665
+ var filter = state.filters[filterIdx];
3666
+ var newState = state;
3667
+ var newFilter = filter;
3668
+
3669
+ // if we enable sync we are going to merge filter and animationConfig domains and store into filter.domain
3670
+ if (enable) {
3671
+ var animatableLayers = getAnimatableVisibleLayers(newState.layers);
3672
+ // if no animatableLayers are present we simply return
3673
+ if (!animatableLayers.length) {
3674
+ return newState;
3675
+ }
3676
+ var intervalBasedAnimationLayers = getIntervalBasedAnimationLayers(animatableLayers);
3677
+ var hasIntervalBasedAnimationLayer = Boolean(intervalBasedAnimationLayers.length);
3678
+ var newFilterDomain = mergeTimeDomains([filter.domain, newState.animationConfig.domain]);
3679
+
3680
+ // we only update animationWindow if we have interval based animation layers with defined intervals and the current filter animation window is not interval
3681
+ if (hasIntervalBasedAnimationLayer) {
3682
+ if (filter.animationWindow !== ANIMATION_WINDOW.interval) {
3683
+ newState = setFilterAnimationWindowUpdater(newState, {
3684
+ id: filter.id,
3685
+ animationWindow: ANIMATION_WINDOW.interval
3686
+ });
3687
+ }
3688
+ newFilter = newState.filters[filterIdx];
3689
+
3690
+ // adjust time filter interval
3691
+ newFilter = adjustTimeFilterInterval(newState, newFilter);
3692
+
3693
+ // replace filter in state with newFilter
3694
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3695
+ filters: swap_(newFilter)(newState.filters)
3696
+ });
3697
+ }
3698
+ newFilter = newState.filters[filterIdx];
3699
+
3700
+ // adjust value based on new domain
3701
+ var _newFilterValue = adjustValueToFilterDomain(newFilter.animationWindow === ANIMATION_WINDOW.interval ? [newFilterDomain[0], newFilterDomain[0]] : newFilterDomain, _objectSpread(_objectSpread({}, newFilter), {}, {
3702
+ domain: newFilterDomain
3703
+ }));
3704
+ newState = setFilterUpdater(newState, {
3705
+ idx: filterIdx,
3706
+ prop: 'value',
3707
+ value: _newFilterValue
3708
+ });
3709
+ newFilter = _objectSpread(_objectSpread({}, newState.filters[filterIdx]), {}, {
3710
+ syncedWithLayerTimeline: true
3711
+ });
3712
+
3713
+ // replace filter in state with newFilter
3714
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3715
+ filters: swap_(newFilter)(newState.filters)
3716
+ });
3717
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3718
+ id: newFilter.id,
3719
+ mode: getSyncAnimationMode(newFilter)
3720
+ });
3721
+ newFilter = newState.filters[filterIdx];
3722
+
3723
+ // set the animation config value to match filter value
3724
+ return setLayerAnimationTimeUpdater(newState, {
3725
+ value: newFilter.value[newFilter.syncTimelineMode]
3726
+ });
3727
+ }
3728
+
3729
+ // set domain and step
3730
+ newFilter = _objectSpread(_objectSpread({}, filter), {}, {
3731
+ syncedWithLayerTimeline: false
3732
+ });
3733
+
3734
+ // replace filter in state with newFilter
3735
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
3736
+ filters: swap_(newFilter)(newState.filters)
3737
+ });
3738
+
3739
+ // reset sync timeline mode
3740
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3741
+ id: newFilter.id,
3742
+ mode: SYNC_TIMELINE_MODES.end
3743
+ });
3744
+ newFilter = newState.filters[filterIdx];
3745
+
3746
+ // reset filter value
3747
+ var newFilterValue = adjustValueToFilterDomain(newFilter.domain, newFilter);
3748
+ newState = setFilterUpdater(newState, {
3749
+ idx: filterIdx,
3750
+ prop: 'value',
3751
+ value: newFilterValue
3752
+ });
3753
+ newState = setTimeFilterTimelineModeUpdater(newState, {
3754
+ id: newFilter.id,
3755
+ mode: getSyncAnimationMode(newFilter)
3756
+ });
3757
+
3758
+ // reset animation config current time to
3759
+ return setLayerAnimationTimeUpdater(newState, {
3760
+ 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
3761
+ });
3762
+ }
3763
+ export function setTimeFilterTimelineModeUpdater(state, action) {
3764
+ var filterId = action.id,
3765
+ syncTimelineMode = action.mode;
3766
+ var filterIdx = state.filters.findIndex(function (f) {
3767
+ return f.id === filterId;
3768
+ });
3769
+ if (filterIdx === -1) {
3770
+ return state;
3771
+ }
3772
+ var filter = state.filters[filterIdx];
3773
+ if (!validateSyncAnimationMode(filter, syncTimelineMode)) {
3774
+ return state;
3775
+ }
3776
+ var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
3777
+ syncTimelineMode: syncTimelineMode
3778
+ });
3779
+ var newState = _objectSpread(_objectSpread({}, state), {}, {
3780
+ filters: swap_(newFilter)(state.filters)
3781
+ });
3782
+ return adjustAnimationConfigWithFilter(newState, filterIdx);
3783
+ }
3784
+
3785
+ /**
3786
+ * Update state of the loading indicator.
3787
+ * @memberof visStateUpdaters
3788
+ * @param state visState
3789
+ * @param action
3790
+ * @param action.payload Payload with change of number of active loading actions.
3791
+ * @returns nextState
3792
+ * @public
3793
+ */
3794
+ export var setLoadingIndicatorUpdater = function setLoadingIndicatorUpdater(state, _ref38) {
3795
+ var change = _ref38.payload.change;
3796
+ var loadingIndicatorValue = state.loadingIndicatorValue;
3797
+ if (!loadingIndicatorValue) {
3798
+ loadingIndicatorValue = 0;
3799
+ }
3800
+ return _objectSpread(_objectSpread({}, state), {}, {
3801
+ loadingIndicatorValue: Math.max(loadingIndicatorValue + change, 0)
3802
+ });
3803
+ };
3804
+ function adjustAnimationConfigWithFilter(state, filterIdx) {
3805
+ var filter = state.filters[filterIdx];
3806
+ if (filter.syncedWithLayerTimeline) {
3807
+ var timelineValue = getTimelineValueFromFilter(filter);
3808
+ var value = state.animationConfig.timeSteps ? snapToMarks(timelineValue, state.animationConfig.timeSteps) : timelineValue;
3809
+ return setLayerAnimationTimeUpdater(state, {
3810
+ value: value
3811
+ });
3812
+ }
3813
+ return state;
3814
+ }
3815
+ function getTimelineValueFromFilter(filter) {
3816
+ return filter.value[filter.syncTimelineMode];
3817
+ }
3818
+ function getSyncAnimationMode(filter) {
3819
+ if (filter.animationWindow === ANIMATION_WINDOW.free) {
3820
+ var _filter$syncTimelineM;
3821
+ return (_filter$syncTimelineM = filter.syncTimelineMode) !== null && _filter$syncTimelineM !== void 0 ? _filter$syncTimelineM : SYNC_TIMELINE_MODES.end;
3822
+ }
3823
+ return SYNC_TIMELINE_MODES.end;
3824
+ }
3825
+ function validateSyncAnimationMode(filter, newMode) {
3826
+ return !(filter.animationWindow !== ANIMATION_WINDOW.free && newMode === SYNC_TIMELINE_MODES.start);
3827
+ }
3828
+ function adjustTimeFilterInterval(state, filter) {
3829
+ var intervalBasedAnimationLayers = getIntervalBasedAnimationLayers(state.layers);
3830
+ var interval = null;
3831
+ if (intervalBasedAnimationLayers.length > 0) {
3832
+ // @ts-ignore
3833
+ var intervalIndex = intervalBasedAnimationLayers.reduce(function (currentIndex, l) {
3834
+ if (l.meta.targetTimeInterval) {
3835
+ var newIndex = TIME_INTERVALS_ORDERED.findIndex(function (i) {
3836
+ return i === l.meta.targetTimeInterval;
3837
+ });
3838
+ return newIndex > -1 && newIndex < currentIndex ? newIndex : currentIndex;
3839
+ }
3840
+ }, TIME_INTERVALS_ORDERED.length - 1);
3841
+ // @ts-ignore
3842
+ var hexTileInterval = TIME_INTERVALS_ORDERED[intervalIndex];
3843
+ interval = LayerToFilterTimeInterval[hexTileInterval];
3844
+ }
3845
+ if (!interval) {
3846
+ return filter;
3847
+ }
3848
+
3849
+ // adjust filter
3850
+ var timeFormat = getDefaultTimeFormat(interval);
3851
+ var updatedPlotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
3852
+ interval: interval,
3853
+ timeFormat: timeFormat
3854
+ });
3855
+ var newFilter = updateTimeFilterPlotType(filter, updatedPlotType, state.datasets);
3856
+ return adjustValueToAnimationWindow(state, newFilter);
3857
+ }
3858
+
3859
+ // Find dataId from a saved visState property:
3860
+ // layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
3861
+ // replace it with another dataId
3862
+ function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
3863
+ var _value$config, _value$config2;
3864
+ if (Array.isArray(value)) {
3865
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
3866
+ var replaced = value.map(function (v) {
3867
+ return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
3868
+ }).filter(function (d) {
3869
+ return d;
3870
+ });
3871
+ return replaced.length ? replaced : null;
3872
+ }
3873
+ if (typeof value.dataId === 'string' && value.dataId === dataId) {
3874
+ // others
3875
+ return _objectSpread(_objectSpread({}, value), {}, {
3876
+ dataId: dataIdToReplace
3877
+ });
3878
+ } else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
3879
+ // filter
3880
+ return _objectSpread(_objectSpread({}, value), {}, {
3881
+ dataId: value.dataId.map(function (d) {
3882
+ return d === dataId ? dataIdToReplace : d;
3883
+ })
3884
+ });
3885
+ } 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) {
3886
+ // layer
3887
+ return _objectSpread(_objectSpread({}, value), {}, {
3888
+ config: _objectSpread(_objectSpread({}, value.config), {}, {
3889
+ dataId: dataIdToReplace
3890
+ })
3891
+ });
3892
+ } else if (isObject(value) && Object.prototype.hasOwnProperty.call(value, dataId)) {
3893
+ // for value saved as {[dataId]: {...}}
3894
+ return _defineProperty({}, dataIdToReplace, value[dataId]);
3895
+ }
3896
+ return null;
3897
+ }
3898
+
3899
+ // Find datasetIds derived a saved visState Property;
3900
+ function findChildDatasetIds(value) {
3901
+ var _value$newDataset;
3902
+ if (Array.isArray(value)) {
3903
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
3904
+ var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
3905
+ return d;
3906
+ });
3907
+ return childDataIds.length ? childDataIds : null;
3908
+ }
3909
+
3910
+ // child data id usually stores in the derived dataset info
3911
+ return (value === null || value === void 0 || (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
3912
+ }
3913
+
3914
+ // moved unmerged layers, filters, interactions
3915
+ function moveValueToBeMerged(state, propValues, _ref40) {
3916
+ var prop = _ref40.prop,
3917
+ toMergeProp = _ref40.toMergeProp,
3918
+ saveUnmerged = _ref40.saveUnmerged;
3919
+ // remove prop value from state
3920
+ // TODO: should we add remove updater to merger as well?
3921
+ if (!propValues) {
3922
+ return state;
3923
+ }
3924
+ var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
3925
+ return removeLayerUpdater(accu, {
3926
+ id: propValue.id
3927
+ });
3928
+ }, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, prop, state[prop].filter(function (p) {
3929
+ return !propValues.find(function (propValue) {
3930
+ return p.id === propValue.id;
3931
+ });
3932
+ }))) :
3933
+ // if not array, we won't remove it, remove dataset should handle it
3934
+ state;
3935
+
3936
+ // move to stateToBeMerged
3937
+ var toBeMerged = _defineProperty({}, toMergeProp, saveUnmerged ?
3938
+ // call merge saveUnmerged method
3939
+ saveUnmerged(stateRemoved, propValues) :
3940
+ // if toMergeProp is araay, append to it
3941
+ Array.isArray(stateRemoved[toMergeProp]) ? [].concat(_toConsumableArray(stateRemoved[toMergeProp]), _toConsumableArray(propValues)) :
3942
+ // save propValues to toMerge
3943
+ isObject(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
3944
+ return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
3945
+ }
3946
+ function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
3947
+ return compose_([apply_(replaceDatasetDepsInState, {
3948
+ dataId: dataId,
3949
+ dataIdToUse: dataIdToUse
3950
+ }), apply_(removeDatasetUpdater, {
3951
+ dataId: dataId
3952
+ })])(state);
3953
+ }
3954
+ export function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
3955
+ var _nextState$layerToBeM;
3956
+ var serializedState = serializeVisState(state, state.schema);
3957
+ var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse);
3958
+ // make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
3959
+ var preserveLayerOrder = _toConsumableArray(state.layerOrder);
3960
+
3961
+ // preserve dataset order
3962
+ nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
3963
+ return d === dataId ? dataIdToUse : d;
3964
+ });
3965
+
3966
+ // preserveLayerOrder
3967
+ if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
3968
+ var _serializedState$spli;
3969
+ // copy split maps to be merged, because it will be reset in remove layer
3970
+ nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
3971
+ nextState.layerOrder = _toConsumableArray(preserveLayerOrder);
3972
+ }
3973
+ return nextState;
3974
+ }
3975
+ export function replaceDatasetDepsInState(state, _ref41) {
3976
+ var dataId = _ref41.dataId,
3977
+ dataIdToUse = _ref41.dataIdToUse;
3978
+ var serializedState = serializeVisState(state, state.schema);
3979
+ var nextState = state.mergers.reduce(function (accuState, _ref42) {
3980
+ var prop = _ref42.prop,
3981
+ toMergeProp = _ref42.toMergeProp,
3982
+ replaceParentDatasetIds = _ref42.replaceParentDatasetIds,
3983
+ getChildDatasetIds = _ref42.getChildDatasetIds,
3984
+ saveUnmerged = _ref42.saveUnmerged,
3985
+ preserveOrder = _ref42.preserveOrder;
3986
+ // get dataset ids that are depends on this dataset
3987
+ var props = toArray(prop);
3988
+ var toMergeProps = toArray(toMergeProp);
3989
+ var savedProps = serializedState ? props.map(function (p) {
3990
+ return serializedState[p];
3991
+ }) : [];
3992
+ var replacedState = accuState;
3993
+ savedProps.forEach(function (propValue, i) {
3994
+ var _replacedState$merger;
3995
+ var mergerOptions = {
3996
+ prop: props[i],
3997
+ toMergeProp: toMergeProps[i],
3998
+ getChildDatasetIds: getChildDatasetIds,
3999
+ saveUnmerged: saveUnmerged
4000
+ };
4001
+ var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
4002
+ replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
4003
+ if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
4004
+ replacedState[preserveOrder] = propValue.map(function (item) {
4005
+ return item.id;
4006
+ });
4007
+ }
4008
+ });
4009
+ return replacedState;
4010
+ }, state);
4011
+ return nextState;
4012
+ }
4013
+ function replacePropValueInState(state, replacedItem, _ref43) {
4014
+ var prop = _ref43.prop,
4015
+ toMergeProp = _ref43.toMergeProp,
4016
+ getChildDatasetIds = _ref43.getChildDatasetIds,
4017
+ saveUnmerged = _ref43.saveUnmerged;
4018
+ // prop is depends on the dataset to be replaced
4019
+ // remove prop from state, and move it to toBeMerged
4020
+ var nextState = moveValueToBeMerged(state, replacedItem, {
4021
+ prop: prop,
4022
+ toMergeProp: toMergeProp,
4023
+ saveUnmerged: saveUnmerged
4024
+ });
4025
+ var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
4026
+ if (childDataIds) {
4027
+ nextState = toArray(childDataIds).reduce(function (accu, childDataId) {
4028
+ // shouldn't need to change child dataset id,
4029
+ // but still need to move out of state and merge back in
4030
+ return replaceDatasetAndDeps(accu, childDataId, childDataId);
4031
+ }, nextState);
4032
+ }
4033
+ return nextState;
4034
+ }
4035
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYm94IiwiY29weSIsImRlZXBtZXJnZSIsImNvbnNvbGUiLCJDb25zb2xlIiwiY2xvbmVEZWVwIiwiZ2V0IiwiaXNFcXVhbCIsInBpY2siLCJ1bmlxIiwieG9yIiwiVGFzayIsImRpc2FibGVTdGFja0NhcHR1cmluZyIsIndpdGhUYXNrIiwiREVMQVlfVEFTSyIsIkFDVElPTl9UQVNLIiwiTE9BRF9GSUxFX1RBU0siLCJQUk9DRVNTX0ZJTEVfREFUQSIsIlVOV1JBUF9UQVNLIiwiYWRkTm90aWZpY2F0aW9uIiwiYXBwbHlMYXllckNvbmZpZyIsImNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzIiwibGF5ZXJDb25maWdDaGFuZ2UiLCJsYXllclR5cGVDaGFuZ2UiLCJsYXllclZpc0NvbmZpZ0NoYW5nZSIsImxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSIsImxvYWRGaWxlU3RlcFN1Y2Nlc3MiLCJsb2FkRmlsZXNFcnIiLCJsb2FkRmlsZXNTdWNjZXNzIiwibG9hZE5leHRGaWxlIiwibmV4dEZpbGVCYXRjaCIsInNldEZpbHRlciIsInByb2Nlc3NGaWxlQ29udGVudCIsImZpdEJvdW5kcyIsImZpdE1hcEJvdW5kcyIsInRvZ2dsZUxheWVyRm9yTWFwIiwiYXBwbHlGaWx0ZXJDb25maWciLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImFkZE5ld0xheWVyc1RvU3BsaXRNYXAiLCJzbmFwVG9NYXJrcyIsImFwcGx5RmlsdGVyRmllbGROYW1lIiwiYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyIsImFycmF5SW5zZXJ0IiwiY29tcHV0ZVNwbGl0TWFwTGF5ZXJzIiwiYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbiIsImVycm9yTm90aWZpY2F0aW9uIiwiZmVhdHVyZVRvRmlsdGVyVmFsdWUiLCJmaWx0ZXJEYXRhc2V0Q1BVIiwiZ2VuZXJhdGVQb2x5Z29uRmlsdGVyIiwiZ2V0RGVmYXVsdEZpbHRlciIsImdldEZpbHRlcklkSW5GZWF0dXJlIiwiZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyIiwiaXNJblJhbmdlIiwiaXNPYmplY3QiLCJpc1BsYWluT2JqZWN0IiwiaXNSZ2JDb2xvciIsInBhcnNlRmllbGRWYWx1ZSIsInJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyIsInNldCIsInVwZGF0ZUZpbHRlclBsb3QiLCJyZW1vdmVGaWx0ZXJQbG90IiwiaXNMYXllckFuaW1hdGFibGUiLCJpc1NpZGVGaWx0ZXIiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsImdlbmVyYXRlSGFzaElkIiwidG9BcnJheSIsImFycmF5TW92ZSIsIkFOSU1BVElPTl9XSU5ET1ciLCJCQVNFX1NQRUVEIiwiQ09NUEFSRV9UWVBFUyIsIkRFRkFVTFRfVEVYVF9MQUJFTCIsIkVESVRPUl9NT0RFUyIsIkZJTFRFUl9UWVBFUyIsIkZJTFRFUl9WSUVXX1RZUEVTIiwiRlBTIiwiTElHSFRfQU5EX1NIQURPV19FRkZFQ1QiLCJESVNUQU5DRV9GT0dfVFlQRSIsIlNVUkZBQ0VfRk9HX1RZUEUiLCJNQVhfREVGQVVMVF9UT09MVElQUyIsIlBMT1RfVFlQRVMiLCJTT1JUX09SREVSIiwiU1lOQ19USU1FTElORV9NT0RFUyIsIkNIQU5ORUxfU0NBTEVTIiwiU0NBTEVfVFlQRVMiLCJJTklUSUFMX0FOTk9UQVRJT05fS0lORCIsIklOSVRJQUxfQU5OT1RBVElPTl9BTkdMRSIsIklOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RIIiwiSU5JVElBTF9BTk5PVEFUSU9OX1RFWFRfV0lEVEgiLCJJTklUSUFMX0FOTk9UQVRJT05fVEVYVF9IRUlHSFQiLCJJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCIsIklOSVRJQUxfQU5OT1RBVElPTl9MSU5FX0NPTE9SIiwiQW5ub3RhdGlvbktpbmQiLCJMQVlFUl9JRF9MRU5HVEgiLCJMYXllciIsIkxheWVyQ2xhc3NlcyIsImFwcGx5XyIsImNvbXBvc2VfIiwiZmlsdGVyT3V0QnlJZCIsIm1lcmdlXyIsInBheWxvYWRfIiwicGlja18iLCJyZW1vdmVFbGVtZW50QXRJbmRleCIsInN3YXBfIiwiaXNWYWxpZE1lcmdlciIsIm1lcmdlU3RhdGVGcm9tTWVyZ2VycyIsIlZJU19TVEFURV9NRVJHRVJTIiwiY3JlYXRlTGF5ZXJGcm9tQ29uZmlnIiwicGFyc2VMYXllckNvbmZpZyIsInNlcmlhbGl6ZUZpbHRlciIsInNlcmlhbGl6ZUxheWVyIiwic2VyaWFsaXplVmlzU3RhdGUiLCJ2YWxpZGF0ZUxheWVyV2l0aERhdGEiLCJLZXBsZXJHTFNjaGVtYSIsImFzc2lnbkdwdUNoYW5uZWwiLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJwaW5UYWJsZUNvbHVtbnMiLCJzZXRGaWx0ZXJHcHVNb2RlIiwic29ydERhdGFzZXRCeUNvbHVtbiIsImZpbmRGaWVsZHNUb1Nob3ciLCJjYWxjdWxhdGVMYXllckRhdGEiLCJmaW5kRGVmYXVsdExheWVyIiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJtZXJnZUxheWVyVmlzQ29uZmlnRm9yTmV3RGF0YXNldHMiLCJnZXROZXdMYXllckdyb3VwIiwiYWRkTGF5ZXJPckdyb3VwVG9MYXllck9yZGVyIiwicmVtb3ZlRWxlbWVudEZyb21MYXllck9yZGVyIiwiZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyIiwiZmluZFBhcmVudEdyb3VwRm9yTGF5ZXIiLCJnZXRJbmRleEZyb21MYXllckVudHJ5SWQiLCJ1cGRhdGVMYXllckdyb3VwSW5MYXllck9yZGVyIiwiZ2V0RmxhdExheWVyT3JkZXIiLCJyZXBsYWNlTGF5ZXJFbnRyeUluTGF5ZXJPcmRlciIsImdldFByb3BWYWx1ZVRvTWVyZ2VyIiwiaGFzUHJvcHNUb01lcmdlIiwibWVyZ2VEYXRhc2V0c0J5T3JkZXIiLCJmaXhFZmZlY3RPcmRlciIsImdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzIiwiZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyIsIm1lcmdlVGltZURvbWFpbnMiLCJhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93IiwidXBkYXRlVGltZUZpbHRlclBsb3RUeXBlIiwiZ2V0RGVmYXVsdFRpbWVGb3JtYXQiLCJMYXllclRvRmlsdGVyVGltZUludGVydmFsIiwiVElNRV9JTlRFUlZBTFNfT1JERVJFRCIsIm1lcmdlRmlsdGVyRG9tYWluIiwiaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlIiwiY3JlYXRlRWZmZWN0IiwiZmluZE1hcEJvdW5kcyIsInZpc1N0YXRlVXBkYXRlcnMiLCJkZWZhdWx0SW50ZXJhY3Rpb25Db25maWciLCJ0b29sdGlwIiwiaWQiLCJsYWJlbCIsImVuYWJsZWQiLCJjb25maWciLCJmaWVsZHNUb1Nob3ciLCJjb21wYXJlTW9kZSIsImNvbXBhcmVUeXBlIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwibGltaXRTZWFyY2giLCJicnVzaCIsInNpemUiLCJjb29yZGluYXRlIiwiREVGQVVMVF9BTklNQVRJT05fQ09ORklHIiwiZG9tYWluIiwiY3VycmVudFRpbWUiLCJzcGVlZCIsImlzQW5pbWF0aW5nIiwidGltZVN0ZXBzIiwidGltZUZvcm1hdCIsInRpbWV6b25lIiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJoaWRlQ29udHJvbCIsImR1cmF0aW9uIiwiREVGQVVMVF9FRElUT1IiLCJtb2RlIiwiRFJBV19QT0xZR09OIiwiZmVhdHVyZXMiLCJzZWxlY3RlZEZlYXR1cmUiLCJ2aXNpYmxlIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJtYXBJbmZvIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsImxheWVycyIsImxheWVyRGF0YSIsImxheWVyVG9CZU1lcmdlZCIsImxheWVyT3JkZXIiLCJsYXllck9yZGVyVG9CZU1lcmdlZCIsImZpbHRlcnMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiZGF0YXNldHMiLCJlZGl0aW5nRGF0YXNldCIsInVuZGVmaW5lZCIsImVmZmVjdHMiLCJlZmZlY3RPcmRlciIsImFubm90YXRpb25zIiwiYW5ub3RhdGlvbnNUb0JlTWVyZ2VkIiwic2VsZWN0ZWRBbm5vdGF0aW9uSWQiLCJpc0VkaXRpbmdBbm5vdGF0aW9uVGV4dCIsImludGVyYWN0aW9uQ29uZmlnIiwiaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkIiwibGF5ZXJCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsImhvdmVySW5mbyIsImNsaWNrZWQiLCJtb3VzZVBvcyIsIm1heERlZmF1bHRUb29sdGlwcyIsInNwbGl0TWFwcyIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJpc01lcmdpbmdEYXRhc2V0cyIsImxheWVyQ2xhc3NlcyIsImFuaW1hdGlvbkNvbmZpZyIsImVkaXRvciIsImZpbGVMb2FkaW5nIiwiZmlsZUxvYWRpbmdQcm9ncmVzcyIsImxvYWRpbmdJbmRpY2F0b3JWYWx1ZSIsImxvYWRlcnMiLCJsb2FkT3B0aW9ucyIsIm1lcmdlcnMiLCJzY2hlbWEiLCJBQ1RJT05fVEFTS19GSVRfQk9VTkRTIiwiZnJvbUNhbGxiYWNrIiwiXyIsImNiIiwiQUNUSU9OX1RBU0tfQUREX05PVElGSUNBVElPTiIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwiX3JlZiIsImxheWVyIiwiaWR4IiwiX29iamVjdFNwcmVhZCIsIm1hcCIsImx5ciIsImkiLCJkIiwidXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZSIsIm5ld1N0YXRlIiwibGVuZ3RoIiwiaXNWaXNpYmxlIiwiYW5pbWF0aW9uIiwidXBkYXRlQW5pbWF0aW9uRG9tYWluIiwicGlja0NoYW5nZWRQcm9wcyIsInByZXYiLCJuZXh0IiwiY2hhbmdlZFByb3BzIiwicGlja1Byb3BzT2YiLCJvYmoiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMiLCJhcHBseUxheWVyQ29uZmlnVXBkYXRlciIsImFjdGlvbiIsIl9zZXJpYWxpemVMYXllciIsIm9sZExheWVySWQiLCJuZXdMYXllckNvbmZpZyIsImxheWVySW5kZXgiLCJuZXdQYXJzZWRMYXllciIsIm9sZExheWVyIiwiZmluZCIsImwiLCJkYXRhc2V0IiwiZGF0YUlkIiwibmV3TGF5ZXIiLCJuZXh0U3RhdGUiLCJ0eXBlIiwib2xkTGF5ZXJJbmRleCIsImZpbmRJbmRleCIsImxheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJuZXdMYXllcklkIiwic2VyaWFsaXplZE9sZExheWVyIiwic2VyaWFsaXplZE5ld0xheWVyIiwiY2hhbmdlZCIsInZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlciIsInZpc3VhbENoYW5uZWxzIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsIiwiY2hhbm5lbFByb3BOYW1lcyIsInByb3AiLCJzb21lIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsIl9pdGVyYXRvciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiX3N0ZXAiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImVyciIsImUiLCJmIiwibGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyIiwidXBkYXRlbGF5ZXJWaXNpYmlsdHkiLCJmaWx0ZXJJbmRleCIsImZpbHRlclN5bmNlZFdpdGhUaW1lbGluZSIsInN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVVcGRhdGVyIiwiZW5hYmxlIiwicHJvcHMiLCJuZXdDb25maWciLCJfYWN0aW9uJG5ld0NvbmZpZyIsInJlc3RDb25maWciLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJzdGF0ZVdpdGhEYXRhSWQiLCJsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIiLCJuZXh0TGF5ZXIiLCJ1cGRhdGVMYXllckNvbmZpZyIsInNob3VsZENhbGN1bGF0ZUxheWVyRGF0YSIsIm9sZExheWVyRGF0YSIsInVwZGF0ZUxheWVyRGF0YVJlc3VsdCIsImxheWVyQW5pbWF0aW9uQ2hhbmdlVXBkYXRlciIsIl9kZWZpbmVQcm9wZXJ0eSIsIl9jYWxjdWxhdGVMYXllckRhdGEiLCJsYXllclRvZ2dsZVZpc2liaWxpdHlVcGRhdGVyIiwibGF5ZXJJZCIsInNwbGl0TWFwSWQiLCJtYXBJbmRleCIsInNtIiwidG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyIiwic3luY2VkV2l0aExheWVyVGltZWxpbmUiLCJsYXllclNldElzVmFsaWRVcGRhdGVyIiwiaXNWYWxpZCIsImxheWVyVG9VcGRhdGUiLCJuZXdEYXRhIiwiX2NhbGN1bGF0ZUxheWVyRGF0YTIiLCJhZGRPclJlbW92ZVRleHRMYWJlbHMiLCJuZXdGaWVsZHMiLCJ0ZXh0TGFiZWwiLCJkZWZhdWx0VGV4dExhYmVsIiwiYXJndW1lbnRzIiwibmV3VGV4dExhYmVsIiwic2xpY2UiLCJjdXJyZW50RmllbGRzIiwidGwiLCJmaWVsZCIsIm5hbWUiLCJmaWx0ZXIiLCJhZGRGaWVsZHMiLCJpbmNsdWRlcyIsImRlbGV0ZUZpZWxkcyIsImZkIiwiY29uY2F0IiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJzcGxpY2UiLCJsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwyIiwiZ2V0RGVmYXVsdExheWVyQ29uZmlnIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJsb2FkZWRMYXllciIsImFsbG93RW1wdHlDb2x1bW4iLCJpc1ZhbGlkVG9TYXZlIiwidmFsaWRhdGVkIiwib2xkTGF5ZXJUeXBlIiwibmV3RGF0YXNldEZpZWxkcyIsImZpZWxkcyIsInJlbWFwcGVkRmllbGRzIiwidmFsdWVzIiwiX3JlZjIiLCJmaWVsZEtleSIsImN1cnJlbnRGaWVsZCIsIm1hdGNoZWQiLCJfcmVmMyIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsImlzQ29uZmlnQWN0aXZlIiwidXBkYXRlTGF5ZXJEb21haW4iLCJfY2FsY3VsYXRlTGF5ZXJEYXRhMyIsInNldEluaXRpYWxMYXllckNvbmZpZyIsInJlc3VsdCIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsIkFycmF5IiwiaXNBcnJheSIsIm5ld1R5cGUiLCJvbGRJZCIsImVycm9yIiwiZGVmYXVsdExheWVyUHJvcHMiLCJhc3NpZ25Db25maWdUb0xheWVyIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJpc0xheWVySG92ZXJlZCIsIl9jYWxjdWxhdGVMYXllckRhdGE0Iiwic2V0dGluZ3MiLCJfc2V0dGluZ3MkbGF5ZXJzIiwib2xkTGF5ZXJNYXAiLCJvdGhlckxheWVycyIsIl90b1Byb3BlcnR5S2V5IiwibmV3VmlzQ29uZmlnIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJ1cGRhdGVkU3RhdGUiLCJ2aXN1YWxDaGFubmVsIiwiY2hhbm5lbFNjYWxlVHlwZSIsImNvbG9yIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwicmFuZ2UiLCJjb2xvclJhbmdlQ29uZmlnIiwiY29sb3JVSSIsImN1c3RvbUJyZWFrcyIsIl9jYWxjdWxhdGVMYXllckRhdGE1Iiwic2NhbGUiLCJjdXN0b21PcmRpbmFsIiwiY3VzdG9tUGFsZXR0ZSIsIm9yZGluYWxEb21haW4iLCJjb2xvckJyZWFrcyIsInNob3dDb2xvckNoYXJ0IiwiZWRpdEJvdW5kcyIsIl9jYWxjdWxhdGVMYXllckRhdGE2Iiwic2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsIl9yZWY0IiwicmVkdWNlIiwiYWNjdSIsInNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyIiwic2V0RmlsdGVyVXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIiLCJfcmVmNSIsImFuaW1hdGlvbldpbmRvdyIsIm5ld0ZpbHRlciIsIm5ld1N5bmNUaW1lbGluZU1vZGUiLCJnZXRTeW5jQW5pbWF0aW9uTW9kZSIsInNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyIiwiYXBwbHlGaWx0ZXJDb25maWdVcGRhdGVyIiwiX3NlcmlhbGl6ZUZpbHRlciIsImZpbHRlcklkIiwib2xkRmlsdGVyIiwic2VyaWFsaXplZE9sZEZpbHRlciIsInNlcmlhbGl6ZWROZXdGaWx0ZXIiLCJfYWN0aW9uJHZhbHVlSW5kZXgiLCJ2YWx1ZUluZGV4IiwiZGF0YXNldElkc1RvRmlsdGVyIiwiX2xvb3AiLCJyZXMiLCJ2IiwiX3VwZGF0ZUZpbHRlclByb3AiLCJlbmxhcmdlZEZpbHRlciIsInZpZXciLCJlbmxhcmdlZCIsInNpZGUiLCJmaWx0ZXJlZERhdGFzZXRzIiwiZmlsdGVyV2l0aFBMb3QiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJ0aW1lUmFuZ2UiLCJhZGp1c3RBbmltYXRpb25Db25maWdXaXRoRmlsdGVyIiwiX3VwZGF0ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleCIsIl9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgiLCJuZXh0VmFsdWUiLCJfaSIsIl9hcnIiLCJuZXh0VmFsIiwiZG9tYWluU3RlcHMiLCJuZXh0RmlsdGVyIiwic3RlcCIsImRhdGFzZXRJZHMiLCJvbGREYXRhSWQiLCJkYXRhc2V0SWQiLCJfYXBwbHlGaWx0ZXJGaWVsZE5hbWUiLCJtZXJnZURvbWFpbiIsInVwZGF0ZWRGaWx0ZXIiLCJuZXdEYXRhc2V0IiwiZ3B1IiwibGF5ZXJJZERpZmZlcmVuY2UiLCJsYXllckRhdGFJZHMiLCJsaWQiLCJuZXdEYXRhSWRzIiwic2V0RmlsdGVyUGxvdFVwZGF0ZXIiLCJfcmVmNiIsIm5ld1Byb3AiLCJwbG90VHlwZSIsImNoYXJ0VHlwZSIsInlBeGlzIiwibGluZUNoYXJ0IiwiaGlzdG9ncmFtIiwiYWRkRmlsdGVyVXBkYXRlciIsImNyZWF0ZU9yVXBkYXRlRmlsdGVyVXBkYXRlciIsIm9yaWdpbmFsSW5kZXgiLCJpbmRleCIsImxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXIiLCJfcmVmNyIsIm9sZFZpeENvbmZpZyIsInRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXIiLCJpc0ZpbHRlckFuaW1hdGlvbkNvbmZpZyIsInNldEFuaW1hdGlvbkNvbmZpZ1VwZGF0ZXIiLCJ0b2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXIiLCJ0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyIiwidXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJfcmVmOCIsInNldEZpbHRlclZpZXdVcGRhdGVyIiwic2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3IiwidG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXIiLCJyZW1vdmVGaWx0ZXJVcGRhdGVyIiwiX3N0YXRlJGZpbHRlcnMkaWR4IiwibmV3RmlsdGVycyIsIm5ld0VkaXRvciIsImFkZExheWVyVXBkYXRlciIsIm5ld0xheWVyRGF0YSIsIndhcm4iLCJfYWN0aW9uJGRhdGFzZXRJZCIsImRlZmF1bHREYXRhc2V0IiwicmVtb3ZlTGF5ZXJVcGRhdGVyIiwiX3JlZjkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImxheWVyVG9SZW1vdmUiLCJyZW9yZGVyTGF5ZXJVcGRhdGVyIiwiX3JlZjAiLCJvcmRlciIsImFkZExheWVyR3JvdXBVcGRhdGVyIiwibGF5ZXJHcm91cCIsIm5ld0xheWVyT3JkZXIiLCJyZW1vdmVMYXllckdyb3VwVXBkYXRlciIsImxheWVyR3JvdXBUb1JlbW92ZSIsImxheWVySWRzVG9SZW1vdmUiLCJ1cGRhdGVMYXllckdyb3VwVXBkYXRlciIsIm9wdGlvbnMiLCJuZXdMYXllckdyb3VwIiwibGF5ZXJJZHMiLCJhY2MiLCJhZGRMYXllclRvTGF5ZXJHcm91cFVwZGF0ZXIiLCJsYXllckdyb3VwSWQiLCJlbnRyeSIsIm5ld0dyb3VwTGF5ZXJPcmRlciIsInJlbW92ZUxheWVyRnJvbUxheWVyR3JvdXBVcGRhdGVyIiwibmV3TGF5ZXJHcm91cE9yZGVyIiwic3dhcExheWVyT3JkZXJFbnRyaWVzVXBkYXRlciIsIm9yaWdpbkxheWVySWQiLCJkZXN0aW5hdGlvbkxheWVySWQiLCJvcmlnaW5MYXllckdyb3VwSWQiLCJkZXN0aW5hdGlvbkxheWVyR3JvdXBJZCIsIm9yaWdpbkluZGV4IiwiZGVzdGluYXRpb25JbmRleCIsImRlc3RJbmRleCIsImR1cGxpY2F0ZUxheWVyVXBkYXRlciIsIl9yZWYxIiwib3JpZ2luYWwiLCJvcmlnaW5hbExheWVyT3JkZXJJZHgiLCJuZXdMYWJlbCIsInBvc3RmaXgiLCJwYXJlbnRHcm91cCIsImxheWVyT3JkZXJXaXRob3V0UHJlcGVuZGVkIiwiaWR4SW5Hcm91cCIsInVwZGF0ZWRHcm91cCIsImFkZEVmZmVjdFVwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyIsIl9hY3Rpb24kY29uZmlnMiIsIl9hY3Rpb24kY29uZmlnMyIsImVmZmVjdCIsIm5ld0VmZmVjdCIsInNldFByb3BzIiwicmVtb3ZlRWZmZWN0VXBkYXRlciIsIl9yZWYxMCIsImVmZmVjdFRvUmVtb3ZlIiwiZWZmZWN0SWQiLCJyZW9yZGVyRWZmZWN0VXBkYXRlciIsIl9yZWYxMSIsInVwZGF0ZUVmZmVjdFVwZGF0ZXIiLCJfcmVmMTIiLCJpZHgyIiwiZWZmZWN0T3JkZXJJZCIsIm5ld0VmZmVjdHMiLCJtYWtlTmV3QW5ub3RhdGlvbiIsIl9jb25maWcka2luZCIsIl9jb25maWckaWQiLCJfY29uZmlnJGlzVmlzaWJsZSIsIl9jb25maWckYXV0b1NpemUiLCJfY29uZmlnJGF1dG9TaXplWSIsIl9jb25maWckYW5jaG9yUG9pbnQiLCJfY29uZmlnJGxhYmVsIiwiX2NvbmZpZyRsaW5lQ29sb3IiLCJfY29uZmlnJGxpbmVXaWR0aCIsIl9jb25maWckdGV4dFdpZHRoIiwiX2NvbmZpZyR0ZXh0SGVpZ2h0IiwiX2NvbmZpZyR0ZXh0VmVydGljYWxBIiwiX2FybUxlbmd0aCIsIl9hbmdsZSIsIl9hcm1MZW5ndGgyIiwiX2FuZ2xlMiIsIl9hcm1MZW5ndGgzIiwiX2FuZ2xlMyIsIl9yYWRpdXNJbk1ldGVycyIsImtpbmQiLCJiYXNlIiwiYXV0b1NpemUiLCJhdXRvU2l6ZVkiLCJhbmNob3JQb2ludCIsImxpbmVDb2xvciIsImxpbmVXaWR0aCIsInRleHRXaWR0aCIsInRleHRIZWlnaHQiLCJ0ZXh0VmVydGljYWxBbGlnbiIsIlBPSU5UIiwiYXJtTGVuZ3RoIiwiYW5nbGUiLCJBUlJPVyIsIkNJUkNMRSIsInJhZGl1c0luTWV0ZXJzIiwiVEVYVCIsImFkZEFubm90YXRpb25VcGRhdGVyIiwibmV3QW5ub3RhdGlvbiIsInJlbW92ZUFubm90YXRpb25VcGRhdGVyIiwiX3JlZjEzIiwiYSIsInVwZGF0ZUFubm90YXRpb25VcGRhdGVyIiwiX3JlZjE0IiwibmV4dEFubm90YXRpb24iLCJuZXdBbm5vdGF0aW9ucyIsImR1cGxpY2F0ZUFubm90YXRpb25VcGRhdGVyIiwiX3JlZjE1Iiwic2V0U2VsZWN0ZWRBbm5vdGF0aW9uVXBkYXRlciIsIl9yZWYxNiIsImlzRWRpdGluZ1RleHQiLCJyZW1vdmVEYXRhc2V0VXBkYXRlciIsImRhdGFzZXRLZXkiLCJfc3RhdGUkZGF0YXNldHMiLCJuZXdEYXRhc2V0cyIsImxheWVyc1RvUmVtb3ZlIiwiX2l0ZXJhdG9yMiIsIl9zdGVwMiIsImluZGV4T2YiLCJwdXNoIiwicmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyIsIl9yZWYxNyIsIl9pbnRlcmFjdGlvbkNvbmZpZyIsIl9jb25maWckZmllbGRzVG9TaG93IiwidXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXIiLCJ1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyIiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJ1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciIsInVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIiLCJuZXdDb2xvciIsInJlc2V0TWFwQ29uZmlnVXBkYXRlciIsImluaXRpYWxTdGF0ZSIsInJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwiX3JlZjE4IiwiX3JlZjE4JHBheWxvYWQiLCJwYXlsb2FkIiwiX3JlZjE4JHBheWxvYWQkY29uZmlnIiwiX3JlZjE4JHBheWxvYWQkb3B0aW9uIiwidmlzU3RhdGUiLCJrZWVwRXhpc3RpbmdDb25maWciLCJtZXJnZWRTdGF0ZSIsIl9pdGVyYXRvcjMiLCJfc3RlcDMiLCJtZXJnZXIiLCJtZXJnZSIsInRvTWVyZ2VQcm9wIiwibGF5ZXJIb3ZlclVwZGF0ZXIiLCJpbmZvIiwiaW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyIiwiY29udHJhZGljdCIsImsiLCJsYXllckNsaWNrVXBkYXRlciIsInBpbm5lZCIsInBpY2tlZCIsIm1hcENsaWNrVXBkYXRlciIsIm1vdXNlTW92ZVVwZGF0ZXIiLCJfcmVmMTkiLCJldnQiLCJwb2ludCIsIm1vdXNlUG9zaXRpb24iLCJsbmdMYXQiLCJ0b2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJkdXBsaWNhdGUiLCJjbG9zZVNwZWNpZmljTWFwQXRJbmRleCIsIl9yZWYyMCIsInVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwiY3JlYXRlRGF0YXNldFRhc2tzIiwibm90aWZpY2F0aW9uVGFza3MiLCJfcmVmMjEiLCJkYXRhc2V0SW5kZXgiLCJfcmVmMjEkaW5mbyIsInJlc3QiLCJfZXhjbHVkZWQyIiwidGFzayIsIm1lc3NhZ2UiLCJkYXRhc2V0c0FsbFNldHRsZWRUYXNrIiwiYWxsU2V0dGxlZCIsInJlc3VsdHMiLCJhZGRUb01hcE9wdGlvbnMiLCJzZXRMb2FkaW5nSW5kaWNhdG9yVXBkYXRlciIsImNoYW5nZSIsImNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzVXBkYXRlciIsIl9hY3Rpb24kcGF5bG9hZCIsIm5ld0RhdGFFbnRyaWVzIiwic3RhdHVzIiwicmVhc29uIiwibGF5ZXJNZXJnZXJzIiwibSIsIndhaXRGb3JMYXllckRhdGEiLCJkYXRhc2V0TWVyZ2VycyIsInBvc3RNZXJnZXJQYXlsb2FkIiwiYXBwbHlNZXJnZXJzVXBkYXRlciIsIm1lcmdlU3RhdGVSZXN1bHQiLCJhbGxNZXJnZWQiLCJwb3N0TWVyZ2VVcGRhdGVyIiwibGF5ZXJWaXNDb25maWdGcm9tQWRkRGF0YU9wdGlvbnMiLCJwYXRjaCIsImxheWVyVmlzQ29uZmlnIiwiX3R5cGVvZiIsImZEYXRhSWQiLCJkYXRhc2V0RmlsdGVyZWQiLCJkYXRhRW1wdHkiLCJuZXdMYXllcnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYWRkRGVmYXVsdExheWVycyIsInRvb2x0aXBGaWVsZHMiLCJhdXRvQ3JlYXRlVG9vbHRpcHMiLCJhZGREZWZhdWx0VG9vbHRpcHMiLCJ1cGRhdGVkRGF0YXNldHMiLCJjZW50ZXJNYXAiLCJib3VuZHMiLCJmaXRCb3VuZHNUYXNrIiwicmVuYW1lRGF0YXNldFVwZGF0ZXIiLCJBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTIiwidmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMiLCJ2YWxpZGF0ZWRQcm9wcyIsImVudHJpZXMiLCJfZW50cnkiLCJfc2xpY2VkVG9BcnJheSIsImV4aXN0aW5nIiwiX3N0YXRlJHNwbGl0TWFwcyRpbmRlIiwiaW5kZXhUb1JldHJpZXZlIiwibWFwTGF5ZXJzIiwibG9hZEZpbGVzVXBkYXRlciIsImZpbGVzIiwiX2FjdGlvbiRvbkZpbmlzaCIsIm9uRmluaXNoIiwiZnJvbSIsImluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzIiwiZmlsZUNhY2hlIiwiZmlsZXNUb0xvYWQiLCJsb2FkTmV4dEZpbGVVcGRhdGVyIiwibG9hZEZpbGVTdGVwU3VjY2Vzc1VwZGF0ZXIiLCJmaWxlTmFtZSIsIl9zdGF0ZSRmaWxlTG9hZGluZyIsInN0YXRlV2l0aFByb2dyZXNzIiwidXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIiLCJwcm9ncmVzcyIsInBlcmNlbnQiLCJzdGF0ZVdpdGhDYWNoZSIsIl9maWxlc1RvTG9hZCIsIl90b0FycmF5IiwiZmlsZSIsInJlbWFpbmluZ0ZpbGVzVG9Mb2FkIiwibWFrZUxvYWRGaWxlVGFzayIsImJpbWFwIiwiZ2VuIiwiY29udGVudCIsInByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIiLCJfYWN0aW9uJHBheWxvYWQyIiwicGFyc2VQcm9ncmVzcyIsInByZXZQcm9ncmVzcyIsIm5leHRGaWxlQmF0Y2hVcGRhdGVyIiwiX3JlZjIyIiwiX2FjY3VtdWxhdGVkJGRhdGEiLCJfcmVmMjIkcGF5bG9hZCIsImFjY3VtdWxhdGVkIiwidXNlQXJyb3dQcm9ncmVzc2l2ZUxvYWRpbmciLCJlbmRzV2l0aCIsImRhdGEiLCJfcmVmMjMiLCJsb2FkRmlsZXNFcnJVcGRhdGVyIiwiX3JlZjI0IiwiX3N0YXRlJGZpbGVMb2FkaW5nMiIsImFwcGx5Q1BVRmlsdGVyVXBkYXRlciIsIl9yZWYyNSIsImRhdGFJZHMiLCJzZXRNYXBJbmZvVXBkYXRlciIsImVtcHR5IiwiZGVmYXVsdExheWVycyIsImZvdW5kTGF5ZXJzIiwibWVyZ2VkIiwiX3JlZjI3IiwiZml4ZWREb21haW4iLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNyIsIl9zdGF0ZSRmaWx0ZXJzIiwiYW5pbWF0YWJsZUxheWVycyIsImxheWVyRG9tYWlucyIsIm1lcmdlZERvbWFpbiIsIm1lcmdlZFRpbWVTdGVwcyIsImFwcGx5Iiwic29ydCIsInN5bmNlZEZpbHRlciIsIm5ld0FuaW1hdGlvbkRvbWFpbiIsInNldEVkaXRvck1vZGVVcGRhdGVyIiwiX3JlZjI4Iiwic2V0RmVhdHVyZXNVcGRhdGVyIiwiX3JlZjI5IiwiX2xhc3RGZWF0dXJlJHByb3BlcnRpIiwiX2xhc3RGZWF0dXJlJHByb3BlcnRpMiIsIl9yZWYyOSRmZWF0dXJlcyIsImxhc3RGZWF0dXJlIiwicHJvcGVydGllcyIsImlzQ2xvc2VkIiwic2hhcGUiLCJFRElUIiwiZmVhdHVyZSIsImZlYXR1cmVWYWx1ZSIsImZpbHRlcklkeCIsImZpbCIsInNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIiLCJfcmVmMzAiLCJzZWxlY3Rpb25Db250ZXh0IiwiZGVsZXRlRmVhdHVyZVVwZGF0ZXIiLCJfcmVmMzEiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyIiwibm9uZUZpbHRlckZlYXR1cmUiLCJfZmlsdGVyJGxheWVySWQiLCJpc0xheWVySW5jbHVkZWQiLCJzZXRQb2x5Z29uRmlsdGVyQWxsTGF5ZXJzVXBkYXRlciIsInZpc2libGVMYXllcklkcyIsImFsbExheWVySWRzIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYzMiIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJBU0NFTkRJTkciLCJzb3J0ZWQiLCJwaW5UYWJsZUNvbHVtblVwZGF0ZXIiLCJfcmVmMzMiLCJjb3B5VGFibGVDb2x1bW5VcGRhdGVyIiwiX3JlZjM0IiwiZmllbGRJZHgiLCJ0ZXh0IiwiZGF0YUNvbnRhaW5lciIsInJvdyIsInZhbHVlQXQiLCJqb2luIiwic2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIiLCJfcmVmMzUiLCJmb3JtYXRzIiwiZGlzcGxheUZvcm1hdCIsIl9sYXllciRjb25maWciLCJjb2xvckZpZWxkIiwidG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXIiLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlciIsIl9yZWYzNiIsInVwZGF0ZXMiLCJjaGVja1RpbWVDb25maWdBcmdzIiwiYWxsb3dlZCIsInNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ1VwZGF0ZXIiLCJfcmVmMzciLCJsYXllckZpbHRlcmVkSXRlbXNDaGFuZ2VVcGRhdGVyIiwiX2xheWVyJGZpbHRlcmVkSXRlbUNvIiwiZXZlbnQiLCJkZWNrZ2xMYXllcklkIiwiY291bnQiLCJmaWx0ZXJlZEl0ZW1Db3VudCIsIndtc0ZlYXR1cmVJbmZvVXBkYXRlciIsImZlYXR1cmVJbmZvIiwib2JqZWN0Iiwid21zRmVhdHVyZUluZm8iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28yIiwiX2FjdGlvbiRlbmFibGUiLCJpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzIiwiaGFzSW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVyIiwiQm9vbGVhbiIsIm5ld0ZpbHRlckRvbWFpbiIsImludGVydmFsIiwiYWRqdXN0VGltZUZpbHRlckludGVydmFsIiwibmV3RmlsdGVyVmFsdWUiLCJzeW5jVGltZWxpbmVNb2RlIiwiZW5kIiwidmFsaWRhdGVTeW5jQW5pbWF0aW9uTW9kZSIsIl9yZWYzOCIsIk1hdGgiLCJtYXgiLCJ0aW1lbGluZVZhbHVlIiwiZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIiLCJmcmVlIiwiX2ZpbHRlciRzeW5jVGltZWxpbmVNIiwibmV3TW9kZSIsInN0YXJ0IiwiaW50ZXJ2YWxJbmRleCIsImN1cnJlbnRJbmRleCIsIm1ldGEiLCJ0YXJnZXRUaW1lSW50ZXJ2YWwiLCJuZXdJbmRleCIsImhleFRpbGVJbnRlcnZhbCIsInVwZGF0ZWRQbG90VHlwZSIsImRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImRhdGFJZFRvUmVwbGFjZSIsIl92YWx1ZSRjb25maWciLCJfdmFsdWUkY29uZmlnMiIsInJlcGxhY2VkIiwiZmluZENoaWxkRGF0YXNldElkcyIsIl92YWx1ZSRuZXdEYXRhc2V0IiwiY2hpbGREYXRhSWRzIiwibW92ZVZhbHVlVG9CZU1lcmdlZCIsInByb3BWYWx1ZXMiLCJfcmVmNDAiLCJzYXZlVW5tZXJnZWQiLCJzdGF0ZVJlbW92ZWQiLCJwcm9wVmFsdWUiLCJwIiwidG9CZU1lcmdlZCIsInJlcGxhY2VEYXRhc2V0QW5kRGVwcyIsImRhdGFJZFRvVXNlIiwicmVwbGFjZURhdGFzZXREZXBzSW5TdGF0ZSIsInByZXBhcmVTdGF0ZUZvckRhdGFzZXRSZXBsYWNlIiwiX25leHRTdGF0ZSRsYXllclRvQmVNIiwic2VyaWFsaXplZFN0YXRlIiwicHJlc2VydmVMYXllck9yZGVyIiwicHJlc2VydmVEYXRhc2V0T3JkZXIiLCJfc2VyaWFsaXplZFN0YXRlJHNwbGkiLCJfcmVmNDEiLCJhY2N1U3RhdGUiLCJfcmVmNDIiLCJyZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImdldENoaWxkRGF0YXNldElkcyIsInByZXNlcnZlT3JkZXIiLCJ0b01lcmdlUHJvcHMiLCJzYXZlZFByb3BzIiwicmVwbGFjZWRTdGF0ZSIsIl9yZXBsYWNlZFN0YXRlJG1lcmdlciIsIm1lcmdlck9wdGlvbnMiLCJyZXBsYWNlZEl0ZW0iLCJyZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZSIsIml0ZW0iLCJfcmVmNDMiLCJjaGlsZERhdGFJZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtiYm94fSBmcm9tICdAdHVyZi9iYm94JztcbmltcG9ydCB0eXBlIHtBbGxHZW9KU09OfSBmcm9tICdAdHVyZi9oZWxwZXJzJztcbmltcG9ydCBjb3B5IGZyb20gJ2NvcHktdG8tY2xpcGJvYXJkJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC9nZXQnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoL3BpY2snO1xuaW1wb3J0IHVuaXEgZnJvbSAnbG9kYXNoL3VuaXEnO1xuaW1wb3J0IHhvciBmcm9tICdsb2Rhc2gveG9yJztcbmltcG9ydCBUYXNrLCB7ZGlzYWJsZVN0YWNrQ2FwdHVyaW5nLCB3aXRoVGFza30gZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG4vLyBUYXNrc1xuaW1wb3J0IHtcbiAgREVMQVlfVEFTSyxcbiAgQUNUSU9OX1RBU0ssXG4gIExPQURfRklMRV9UQVNLLFxuICBQUk9DRVNTX0ZJTEVfREFUQSxcbiAgVU5XUkFQX1RBU0tcbn0gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG4vLyBBY3Rpb25zXG5pbXBvcnQge1xuICBhZGROb3RpZmljYXRpb24sXG4gIEFjdGlvblR5cGVzLFxuICBDcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1BheWxvYWQsXG4gIE1hcFN0YXRlQWN0aW9ucyxcbiAgUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQsXG4gIFZpc1N0YXRlQWN0aW9ucyxcbiAgYXBwbHlMYXllckNvbmZpZyxcbiAgY3JlYXRlTmV3RGF0YXNldFN1Y2Nlc3MsXG4gIGxheWVyQ29uZmlnQ2hhbmdlLFxuICBsYXllclR5cGVDaGFuZ2UsXG4gIGxheWVyVmlzQ29uZmlnQ2hhbmdlLFxuICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UsXG4gIGxvYWRGaWxlU3RlcFN1Y2Nlc3MsXG4gIGxvYWRGaWxlc0VycixcbiAgbG9hZEZpbGVzU3VjY2VzcyxcbiAgbG9hZE5leHRGaWxlLFxuICBuZXh0RmlsZUJhdGNoLFxuICBzZXRGaWx0ZXIsXG4gIHByb2Nlc3NGaWxlQ29udGVudCxcbiAgZml0Qm91bmRzIGFzIGZpdE1hcEJvdW5kcyxcbiAgdG9nZ2xlTGF5ZXJGb3JNYXAsXG4gIGFwcGx5RmlsdGVyQ29uZmlnLFxuICBTZXRMb2FkaW5nSW5kaWNhdG9yUGF5bG9hZFxufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgRklMVEVSX1VQREFURVJfUFJPUFMsXG4gIGFkZE5ld0xheWVyc1RvU3BsaXRNYXAsXG4gIHNuYXBUb01hcmtzLFxuICBhcHBseUZpbHRlckZpZWxkTmFtZSxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgYXJyYXlJbnNlcnQsXG4gIGNvbXB1dGVTcGxpdE1hcExheWVycyxcbiAgYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbixcbiAgZXJyb3JOb3RpZmljYXRpb24sXG4gIGZlYXR1cmVUb0ZpbHRlclZhbHVlLFxuICBmaWx0ZXJEYXRhc2V0Q1BVLFxuICBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIsXG4gIGdldERlZmF1bHRGaWx0ZXIsXG4gIGdldEZpbHRlcklkSW5GZWF0dXJlLFxuICBnZXRUaW1lV2lkZ2V0VGl0bGVGb3JtYXR0ZXIsXG4gIGlzSW5SYW5nZSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmdiQ29sb3IsXG4gIHBhcnNlRmllbGRWYWx1ZSxcbiAgcmVtb3ZlTGF5ZXJGcm9tU3BsaXRNYXBzLFxuICBzZXQsXG4gIHVwZGF0ZUZpbHRlclBsb3QsXG4gIHJlbW92ZUZpbHRlclBsb3QsXG4gIGlzTGF5ZXJBbmltYXRhYmxlLFxuICBpc1NpZGVGaWx0ZXIsXG4gIGdldEFwcGxpY2F0aW9uQ29uZmlnXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZCwgdG9BcnJheSwgYXJyYXlNb3ZlfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG4vLyBNZXJnZXJzXG5pbXBvcnQge1xuICBBTklNQVRJT05fV0lORE9XLFxuICBCQVNFX1NQRUVELFxuICBDT01QQVJFX1RZUEVTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIEVESVRPUl9NT0RFUyxcbiAgRklMVEVSX1RZUEVTLFxuICBGSUxURVJfVklFV19UWVBFUyxcbiAgRlBTLFxuICBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCxcbiAgRElTVEFOQ0VfRk9HX1RZUEUsXG4gIFNVUkZBQ0VfRk9HX1RZUEUsXG4gIE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuICBQTE9UX1RZUEVTLFxuICBTT1JUX09SREVSLFxuICBTWU5DX1RJTUVMSU5FX01PREVTLFxuICBDSEFOTkVMX1NDQUxFUyxcbiAgU0NBTEVfVFlQRVMsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9LSU5ELFxuICBJTklUSUFMX0FOTk9UQVRJT05fQU5HTEUsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RILFxuICBJTklUSUFMX0FOTk9UQVRJT05fVEVYVF9XSURUSCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX1RFWFRfSEVJR0hULFxuICBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gIEFubm90YXRpb25LaW5kXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TEFZRVJfSURfTEVOR1RILCBMYXllciwgTGF5ZXJDbGFzc2VzfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBhcHBseV8sXG4gIGNvbXBvc2VfLFxuICBmaWx0ZXJPdXRCeUlkLFxuICBtZXJnZV8sXG4gIHBheWxvYWRfLFxuICBwaWNrXyxcbiAgcmVtb3ZlRWxlbWVudEF0SW5kZXgsXG4gIHN3YXBfXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge2lzVmFsaWRNZXJnZXIsIG1lcmdlU3RhdGVGcm9tTWVyZ2Vyc30gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge1xuICBWSVNfU1RBVEVfTUVSR0VSUyxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBwYXJzZUxheWVyQ29uZmlnLFxuICBzZXJpYWxpemVGaWx0ZXIsXG4gIHNlcmlhbGl6ZUxheWVyLFxuICBzZXJpYWxpemVWaXNTdGF0ZSxcbiAgdmFsaWRhdGVMYXllcldpdGhEYXRhXG59IGZyb20gJy4vdmlzLXN0YXRlLW1lcmdlcic7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge01lcmdlciwgUG9zdE1lcmdlclBheWxvYWQsIFZpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXIsXG4gIEludGVyYWN0aW9uQ29uZmlnLFxuICBBbmltYXRpb25Db25maWcsXG4gIEZpbHRlckFuaW1hdGlvbkNvbmZpZyxcbiAgRWRpdG9yLFxuICBGaWVsZCxcbiAgTGF5ZXJWaXNDb25maWcsXG4gIFRpbWVSYW5nZUZpbHRlcixcbiAgQW5ub3RhdGlvbixcbiAgQW5ub3RhdGlvblByb3BzUGFydGlhbFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7TG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuXG5pbXBvcnQge1xuICBEYXRhc2V0cyxcbiAgYXNzaWduR3B1Q2hhbm5lbCxcbiAgY29weVRhYmxlQW5kVXBkYXRlLFxuICBjcmVhdGVOZXdEYXRhRW50cnksXG4gIHBpblRhYmxlQ29sdW1ucyxcbiAgc2V0RmlsdGVyR3B1TW9kZSxcbiAgc29ydERhdGFzZXRCeUNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7ZmluZEZpZWxkc1RvU2hvd30gZnJvbSAnLi9pbnRlcmFjdGlvbi11dGlscyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVMYXllckRhdGEsXG4gIGZpbmREZWZhdWx0TGF5ZXIsXG4gIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzLFxuICBtZXJnZUxheWVyVmlzQ29uZmlnRm9yTmV3RGF0YXNldHMsXG4gIGdldE5ld0xheWVyR3JvdXAsXG4gIGFkZExheWVyT3JHcm91cFRvTGF5ZXJPcmRlcixcbiAgcmVtb3ZlRWxlbWVudEZyb21MYXllck9yZGVyLFxuICBnZXRMYXllckdyb3VwRnJvbUxheWVyT3JkZXIsXG4gIGZpbmRQYXJlbnRHcm91cEZvckxheWVyLFxuICBnZXRJbmRleEZyb21MYXllckVudHJ5SWQsXG4gIHVwZGF0ZUxheWVyR3JvdXBJbkxheWVyT3JkZXIsXG4gIGdldEZsYXRMYXllck9yZGVyLFxuICByZXBsYWNlTGF5ZXJFbnRyeUluTGF5ZXJPcmRlclxufSBmcm9tICcuL2xheWVyLXV0aWxzJztcbmltcG9ydCB7Z2V0UHJvcFZhbHVlVG9NZXJnZXIsIGhhc1Byb3BzVG9NZXJnZX0gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge21lcmdlRGF0YXNldHNCeU9yZGVyfSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuaW1wb3J0IHtcbiAgZml4RWZmZWN0T3JkZXIsXG4gIGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzLFxuICBnZXRJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLFxuICBtZXJnZVRpbWVEb21haW5zLFxuICBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93LFxuICB1cGRhdGVUaW1lRmlsdGVyUGxvdFR5cGUsXG4gIGdldERlZmF1bHRUaW1lRm9ybWF0LFxuICBMYXllclRvRmlsdGVyVGltZUludGVydmFsLFxuICBUSU1FX0lOVEVSVkFMU19PUkRFUkVELFxuICBtZXJnZUZpbHRlckRvbWFpbixcbiAgaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtjcmVhdGVFZmZlY3R9IGZyb20gJ0BrZXBsZXIuZ2wvZWZmZWN0cyc7XG5pbXBvcnQge1BheWxvYWRBY3Rpb259IGZyb20gJ0ByZWR1eGpzL3Rvb2xraXQnO1xuXG5pbXBvcnQge2ZpbmRNYXBCb3VuZHN9IGZyb20gJy4vZGF0YS11dGlscyc7XG5cbi8vIHJlYWN0LXBhbG1cbi8vIGRpc2FibGUgY2FwdHVyZSBleGNlcHRpb24gZm9yIHJlYWN0LXBhbG0gY2FsbCB0byB3aXRoVGFza1xuZGlzYWJsZVN0YWNrQ2FwdHVyaW5nKCk7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB2aXNTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dmlzU3RhdGVVcGRhdGVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgdmlzU3RhdGU6IHZpc1N0YXRlVXBkYXRlcnMuZW5sYXJnZUZpbHRlclVwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIHN0YXRlLmtlcGxlckdsLmZvby52aXNTdGF0ZSxcbiAqICAgICAgICAgICAgICAge2lkeDogMH1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHZpc1N0YXRlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZzogSW50ZXJhY3Rpb25Db25maWcgPSB7XG4gIHRvb2x0aXA6IHtcbiAgICBpZDogJ3Rvb2x0aXAnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLnRvb2x0aXAnLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICBmaWVsZHNUb1Nob3c6IHt9LFxuICAgICAgY29tcGFyZU1vZGU6IGZhbHNlLFxuICAgICAgY29tcGFyZVR5cGU6IENPTVBBUkVfVFlQRVMuQUJTT0xVVEVcbiAgICB9XG4gIH0sXG4gIGdlb2NvZGVyOiB7XG4gICAgaWQ6ICdnZW9jb2RlcicsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuZ2VvY29kZXInLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsLFxuICAgIGNvbmZpZzoge1xuICAgICAgbGltaXRTZWFyY2g6IGZhbHNlXG4gICAgfVxuICB9LFxuICBicnVzaDoge1xuICAgIGlkOiAnYnJ1c2gnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmJydXNoJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBjb25maWc6IHtcbiAgICAgIC8vIHNpemUgaXMgaW4ga21cbiAgICAgIHNpemU6IDAuNVxuICAgIH1cbiAgfSxcbiAgY29vcmRpbmF0ZToge1xuICAgIGlkOiAnY29vcmRpbmF0ZScsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuY29vcmRpbmF0ZScsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcG9zaXRpb246IG51bGxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRzogQW5pbWF0aW9uQ29uZmlnID0ge1xuICBkb21haW46IG51bGwsXG4gIGN1cnJlbnRUaW1lOiBudWxsLFxuICBzcGVlZDogMSxcbiAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICB0aW1lU3RlcHM6IG51bGwsXG4gIHRpbWVGb3JtYXQ6IG51bGwsXG4gIHRpbWV6b25lOiBudWxsLFxuICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbCxcbiAgaGlkZUNvbnRyb2w6IGZhbHNlLFxuICBkdXJhdGlvbjogbnVsbFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRURJVE9SOiBFZGl0b3IgPSB7XG4gIG1vZGU6IEVESVRPUl9NT0RFUy5EUkFXX1BPTFlHT04sXG4gIGZlYXR1cmVzOiBbXSxcbiAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsLFxuICB2aXNpYmxlOiB0cnVlXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUSUFMX1ZJU19TVEFURTogVmlzU3RhdGUgPSB7XG4gIC8vIG1hcCBpbmZvXG4gIG1hcEluZm86IHtcbiAgICB0aXRsZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnXG4gIH0sXG4gIC8vIGxheWVyc1xuICBsYXllcnM6IFtdLFxuICBsYXllckRhdGE6IFtdLFxuICBsYXllclRvQmVNZXJnZWQ6IFtdLFxuICBsYXllck9yZGVyOiBbXSxcbiAgbGF5ZXJPcmRlclRvQmVNZXJnZWQ6IG51bGwsXG5cbiAgLy8gZmlsdGVyc1xuICBmaWx0ZXJzOiBbXSxcbiAgZmlsdGVyVG9CZU1lcmdlZDogW10sXG5cbiAgLy8gYSBjb2xsZWN0aW9uIG9mIG11bHRpcGxlIGRhdGFzZXRcbiAgZGF0YXNldHM6IHt9LFxuICBlZGl0aW5nRGF0YXNldDogdW5kZWZpbmVkLFxuXG4gIC8vIGVmZmVjdHNcbiAgZWZmZWN0czogW10sXG4gIGVmZmVjdE9yZGVyOiBbXSxcblxuICAvLyBhbm5vdGF0aW9uc1xuICBhbm5vdGF0aW9uczogW10sXG4gIGFubm90YXRpb25zVG9CZU1lcmdlZDogW10sXG4gIHNlbGVjdGVkQW5ub3RhdGlvbklkOiBudWxsLFxuICBpc0VkaXRpbmdBbm5vdGF0aW9uVGV4dDogZmFsc2UsXG5cbiAgaW50ZXJhY3Rpb25Db25maWc6IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB7fSxcblxuICBsYXllckJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgb3ZlcmxheUJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgaG92ZXJJbmZvOiB1bmRlZmluZWQsXG4gIGNsaWNrZWQ6IHVuZGVmaW5lZCxcbiAgbW91c2VQb3M6IHt9LFxuICBtYXhEZWZhdWx0VG9vbHRpcHM6IE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuXG4gIC8vIHRoaXMgaXMgdXNlZCB3aGVuIHVzZXIgc3BsaXQgbWFwc1xuICBzcGxpdE1hcHM6IFtcbiAgICAvLyB0aGlzIHdpbGwgY29udGFpbiBhIGxpc3Qgb2Ygb2JqZWN0cyB0b1xuICAgIC8vIGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiBsYXllciBhdmFpbGFiaWxpdHkgYW5kIHZpc2liaWxpdHkgZm9yIGVhY2ggbWFwXG4gICAgLy8gW1xuICAgIC8vICAge1xuICAgIC8vICAgICAgbGF5ZXJzOiB7bGF5ZXJfaWQ6IHRydWUgfCBmYWxzZX1cbiAgICAvLyAgIH1cbiAgICAvLyBdXG4gIF0sXG4gIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFtdLFxuICBpc01lcmdpbmdEYXRhc2V0czoge30sXG4gIC8vIGRlZmF1bHRzIGxheWVyIGNsYXNzZXNcbiAgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXMsXG5cbiAgLy8gZGVmYXVsdCBhbmltYXRpb25cbiAgLy8gdGltZSBpbiB1bml4IHRpbWVzdGFtcCAobWlsbGlzZWNvbmRzKSAodGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IEVwb2NoKVxuICBhbmltYXRpb25Db25maWc6IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyxcblxuICBlZGl0b3I6IERFRkFVTFRfRURJVE9SLFxuXG4gIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgZmlsZUxvYWRpbmdQcm9ncmVzczoge30sXG4gIC8vIGZvciBsb2FkaW5nIGRhdGFzZXRzXG4gIGxvYWRpbmdJbmRpY2F0b3JWYWx1ZTogMCxcblxuICBsb2FkZXJzOiBbXSxcbiAgbG9hZE9wdGlvbnM6IHt9LFxuXG4gIC8vIHZpc1N0YXRlTWVyZ2Vyc1xuICBtZXJnZXJzOiBWSVNfU1RBVEVfTUVSR0VSUyxcblxuICAvLyBrZXBsZXIgc2NoZW1hc1xuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hXG59O1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1RBU0tfRklUX0JPVU5EUyA9IFRhc2suZnJvbUNhbGxiYWNrKFxuICAoXywgY2IpID0+IGNiKCksXG5cbiAgJ0FDVElPTl9UQVNLX0ZJVF9CT1VORFMnXG4pO1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1RBU0tfQUREX05PVElGSUNBVElPTiA9IFRhc2suZnJvbUNhbGxiYWNrKFxuICAoXywgY2IpID0+IGNiKCksXG5cbiAgJ0FDVElPTl9UQVNLX0FERF9OT1RJRklDQVRJT04nXG4pO1xuXG50eXBlIFVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YVR5cGUgPSB7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJEYXRhOiBhbnlbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhPFMgZXh0ZW5kcyBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlPihcbiAgc3RhdGU6IFMsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogUyB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKChseXIsIGkpID0+IChpID09PSBpZHggPyBsYXllciA6IGx5cikpLFxuICAgIGxheWVyRGF0YTogbGF5ZXJEYXRhXG4gICAgICA/IHN0YXRlLmxheWVyRGF0YS5tYXAoKGQsIGkpID0+IChpID09PSBpZHggPyBsYXllckRhdGEgOiBkKSlcbiAgICAgIDogc3RhdGUubGF5ZXJEYXRhXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGxheWVyOiBMYXllcik6IFMge1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICAgID8gYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgICAgICA6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgIH07XG4gIH1cblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIChvciBhcnJheXMpIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlXG4gKiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBwaWNrQ2hhbmdlZFByb3BzPFQ+KHByZXY6IFQsIG5leHQ6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlZFByb3BzOiBQYXJ0aWFsPFQ+ID0ge307XG4gIGNvbnN0IHBpY2tQcm9wc09mID0gb2JqID0+IHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjaGFuZ2VkUHJvcHMsIGtleSkgJiZcbiAgICAgICAgIWlzRXF1YWwocHJldltrZXldLCBuZXh0W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY2hhbmdlZFByb3BzW2tleV0gPSBuZXh0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHBpY2tQcm9wc09mKHByZXYpO1xuICBwaWNrUHJvcHNPZihuZXh0KTtcbiAgcmV0dXJuIGNoYW5nZWRQcm9wcztcbn1cblxuY29uc3QgVklTVUFMX0NIQU5ORUxfUFJPUF9UWVBFUyA9IFsnZmllbGQnLCAnc2NhbGUnLCAnZG9tYWluJywgJ2FnZ3JlZ2F0aW9uJ107XG5cbi8qKlxuICogQXBwbHkgbGF5ZXIgY29uZmlnXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGF5ZXJDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFwcGx5TGF5ZXJDb25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcklkLCBuZXdMYXllckNvbmZpZywgbGF5ZXJJbmRleH0gPSBhY3Rpb247XG4gIGNvbnN0IG5ld1BhcnNlZExheWVyID1cbiAgICAvLyB3aWxsIG1vdmUgdmlzdWFsQ2hhbm5lbHMgdG8gdGhlIGNvbmZpZyBwcm9wXG4gICAgcGFyc2VMYXllckNvbmZpZyhzdGF0ZS5zY2hlbWEsIG5ld0xheWVyQ29uZmlnKTtcbiAgY29uc3Qgb2xkTGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICBpZiAoIW9sZExheWVyIHx8ICFuZXdQYXJzZWRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAobGF5ZXJJbmRleCAhPT0gbnVsbCAmJiBsYXllckluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3RhdGUubGF5ZXJzW2xheWVySW5kZXhdICE9PSBvbGRMYXllcikge1xuICAgIC8vIGxheWVySW5kZXggaXMgcHJvdmlkZWQsIGJ1dCBpdCBkb2Vzbid0IG1hdGNoIHRoZSBvbGRMYXllclxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbbmV3UGFyc2VkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIGlzIHZhbGlkIGFuZCBjb252ZXJ0IGl0IHRvIExheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIG5ld1BhcnNlZExheWVyLCBzdGF0ZS5sYXllckNsYXNzZXMpO1xuICBpZiAoIW5ld0xheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuXG4gIGlmIChuZXdMYXllci50eXBlICYmIG5ld0xheWVyLnR5cGUgIT09IG9sZExheWVyLnR5cGUpIHtcbiAgICBjb25zdCBvbGRMYXllckluZGV4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICAgIGlmIChvbGRMYXllckluZGV4ID49IDApIHtcbiAgICAgIG5leHRTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIobmV4dFN0YXRlLCBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld0xheWVyLnR5cGUpKTtcbiAgICAgIC8vIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIGxheWVyLCBzbyB3ZSBuZWVkIHRvIG9idGFpbiB0aGUgbmV3IGlkXG4gICAgICAvLyBidXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGxheWVyIHdhcyBub3QgcmVtb3ZlZFxuICAgICAgaWYgKG5leHRTdGF0ZS5sYXllcnMubGVuZ3RoID09PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0xheWVySWQgPSBuZXh0U3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdLmlkO1xuICAgICAgICBuZXh0U3RhdGUgPSBhcHBseUxheWVyQ29uZmlnVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgYXBwbHlMYXllckNvbmZpZyhuZXdMYXllcklkLCB7Li4ubmV3TGF5ZXJDb25maWcsIGlkOiBuZXdMYXllcklkfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIC8vIHNlcmlhbGl6ZUxheWVyKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgdGhlIG9sZCBsYXllciBpcyBub3QgdmFsaWQsXG4gIC8vIHdlIHNob3VsZCBzdGlsbCBhcHBseSB0aGUgY2hhbmdlcyBpbiB0aGF0IGNhc2VcbiAgY29uc3Qgc2VyaWFsaXplZE9sZExheWVyID0gc2VyaWFsaXplTGF5ZXIob2xkTGF5ZXIsIHN0YXRlLnNjaGVtYSkgPz8ge2NvbmZpZzoge319O1xuICBjb25zdCBzZXJpYWxpemVkTmV3TGF5ZXIgPSBzZXJpYWxpemVMYXllcihuZXdMYXllciwgc3RhdGUuc2NoZW1hKTtcbiAgaWYgKCFzZXJpYWxpemVkTmV3TGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHNlcmlhbGl6ZWRPbGRMYXllciwgc2VyaWFsaXplZE5ld0xheWVyKSkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSBwaWNrQ2hhbmdlZFByb3BzKHNlcmlhbGl6ZWRPbGRMYXllci5jb25maWcsIHNlcmlhbGl6ZWROZXdMYXllci5jb25maWcpO1xuXG4gICAgaWYgKCd2aXNDb25maWcnIGluIGNoYW5nZWQpIHtcbiAgICAgIGlmIChjaGFuZ2VkLnZpc0NvbmZpZykge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBjaGFuZ2VkLnZpc0NvbmZpZylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjaGFuZ2VkLnZpc0NvbmZpZztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvbGRMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsTmFtZSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gb2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbE5hbWVdO1xuICAgICAgY29uc3QgY2hhbm5lbFByb3BOYW1lcyA9IFZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMubWFwKHByb3AgPT4gY2hhbm5lbFtwcm9wXSk7XG4gICAgICBpZiAoY2hhbm5lbFByb3BOYW1lcy5zb21lKHByb3AgPT4gcHJvcCBpbiBjaGFuZ2VkKSkge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UoXG4gICAgICAgICAgICBvbGRMYXllcixcbiAgICAgICAgICAgIHBpY2sobmV3TGF5ZXIuY29uZmlnLCBjaGFubmVsUHJvcE5hbWVzKSxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY2hhbm5lbFByb3BOYW1lcykge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZCkubGVuZ3RoID4gMCkge1xuICAgICAgbmV4dFN0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBwaWNrKG5ld0xheWVyLmNvbmZpZywgT2JqZWN0LmtleXMoY2hhbmdlZCkpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVsYXllclZpc2liaWx0eShzdGF0ZTogVmlzU3RhdGUsIG5ld0xheWVyOiBMYXllciwgaXNWaXNpYmxlPzogYm9vbGVhbik6IFZpc1N0YXRlIHtcbiAgbGV0IG5ld1N0YXRlID0gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZShzdGF0ZSwgbmV3TGF5ZXIpO1xuICBjb25zdCBmaWx0ZXJJbmRleCA9IGZpbHRlclN5bmNlZFdpdGhUaW1lbGluZShzdGF0ZSk7XG4gIGlmIChpc0xheWVyQW5pbWF0YWJsZShuZXdMYXllcikgJiYgZmlsdGVySW5kZXggIT09IC0xKSB7XG4gICAgLy8gaWYgbGF5ZXIgaXMgZ29pbmcgdG8gYmUgdmlzaWJsZSB3ZSBzeW5jIHdpdGggZmlsdGVyIG90aGVyd2lzZSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgb3RoZXIgYW5pbWF0YWJsZSBsYXllcnMgZXhpc3RzIGFuZCBhcmUgdmlzaWJsZVxuICAgIG5ld1N0YXRlID0gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySW5kZXgsXG4gICAgICBlbmFibGU6IGlzVmlzaWJsZSA/IGlzVmlzaWJsZSA6IGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzKHN0YXRlLmxheWVycykubGVuZ3RoID4gMFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGFjdGlvbi5uZXdDb25maWcpO1xuICBpZiAoXG4gICAgdHlwZW9mIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkID09PSAnc3RyaW5nJyAmJlxuICAgIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkICE9PSBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gICkge1xuICAgIGNvbnN0IHtkYXRhSWQsIC4uLnJlc3RDb25maWd9ID0gYWN0aW9uLm5ld0NvbmZpZztcbiAgICBjb25zdCBzdGF0ZVdpdGhEYXRhSWQgPSBsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICAgIG9sZExheWVyLFxuICAgICAgbmV3Q29uZmlnOiB7ZGF0YUlkfVxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRMYXllciA9IHN0YXRlV2l0aERhdGFJZC5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgICByZXR1cm4gbmV4dExheWVyICYmIE9iamVjdC5rZXlzKHJlc3RDb25maWcpLmxlbmd0aFxuICAgICAgPyBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGVXaXRoRGF0YUlkLCB7b2xkTGF5ZXI6IG5leHRMYXllciwgbmV3Q29uZmlnOiByZXN0Q29uZmlnfSlcbiAgICAgIDogc3RhdGVXaXRoRGF0YUlkO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoYWN0aW9uLm5ld0NvbmZpZyk7XG5cbiAgbGV0IGxheWVyRGF0YTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuXG4gICAgY29uc3QgdXBkYXRlTGF5ZXJEYXRhUmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICBuZXdMYXllciA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllcjtcbiAgICBsYXllckRhdGEgPSB1cGRhdGVMYXllckRhdGFSZXN1bHQubGF5ZXJEYXRhO1xuICB9XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmICgnaXNWaXNpYmxlJyBpbiBhY3Rpb24ubmV3Q29uZmlnKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVsYXllclZpc2liaWx0eShuZXdTdGF0ZSwgbmV3TGF5ZXIsIGFjdGlvbi5uZXdDb25maWcuaXNWaXNpYmxlKTtcbiAgfVxuXG4gIGlmICgnY29sdW1ucycgaW4gYWN0aW9uLm5ld0NvbmZpZyAmJiBuZXdMYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQpIHtcbiAgICAvLyBUT0RPOiBTaGFuLCBtYWtlIHRoZSBhbmltYXRpb24gY29uZmlnIGZ1bmN0aW9uIG1vcmUgcm9idXN0XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgIGxheWVyOiBuZXdMYXllcixcbiAgICBsYXllckRhdGEsXG4gICAgaWR4XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJBbmltYXRpb25DaGFuZ2VVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGFjdGlvbik6IFMge1xuICBjb25zdCB7b2xkTGF5ZXIsIHByb3AsIHZhbHVlfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICBhbmltYXRpb246IHtcbiAgICAgIC4uLm9sZExheWVyLmNvbmZpZy5hbmltYXRpb24sXG4gICAgICBbcHJvcF06IHZhbHVlXG4gICAgfVxuICB9KTtcblxuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBzdGF0ZS5sYXllckRhdGFbaWR4XSk7XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllcklkLCBpc1Zpc2libGUsIHNwbGl0TWFwSWRcbiAqIGhhbmRsZXMgdHdvIGNhc2VzOlxuICogMSkgdG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIGxvY2FsIFNwbGl0TWFwIGxheWVyICh2aXNTdGF0ZS5zcGxpdE1hcC5sYXllcnMpXG4gKiAyKSB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgZ2xvYmFsIGxheWVyICh2aXNTdGF0ZS5sYXllcnMpXG5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVG9nZ2xlVmlzaWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUb2dnbGVWaXNpYmlsaXR5VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7bGF5ZXJJZCwgaXNWaXNpYmxlLCBzcGxpdE1hcElkfSA9IGFjdGlvbjtcbiAgY29uc3QgbGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChkID0+IGQuaWQgPT09IGxheWVySWQpO1xuXG4gIGlmICghbGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcblxuICBpZiAoc3BsaXRNYXBJZCkge1xuICAgIC8vIFtjYXNlIDFdOiB0b2dnbGUgbG9jYWwgbGF5ZXIgdmlzaWJpbGl0eSBmb3IgZWFjaCBTcGxpdE1hcFxuICAgIGNvbnN0IG1hcEluZGV4ID0gbmV3U3RhdGUuc3BsaXRNYXBzLmZpbmRJbmRleChzbSA9PiBzbS5pZCA9PT0gc3BsaXRNYXBJZCk7XG4gICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgLy8gMSkgaWYgdGhlIGxheWVyIGlzIGludmlzaWJsZSBnbG9iYWxseVxuICAgICAgLy8gLT4gc2V0IGdsb2JhbCB2aXNpYmlsaXR5IHRvIHRydWVcbiAgICAgIG5ld1N0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKG5ld1N0YXRlLCBsYXllckNvbmZpZ0NoYW5nZShsYXllciwge2lzVmlzaWJsZTogdHJ1ZX0pKTtcblxuICAgICAgLy8gLT4gc2V0IGxvY2FsIHZpc2liaWxpdHkgdG8gdHJ1ZSBhbmQgdGhlIGxvY2FsIHZpc2liaWxpdGllcyBvZiBhbGwgb3RoZXIgU3BsaXRNYXBzIHRvIGZhbHNlXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgc3BsaXRNYXBzOiBuZXdTdGF0ZS5zcGxpdE1hcHMubWFwKHNtID0+XG4gICAgICAgICAgc20uaWQgIT09IHNwbGl0TWFwSWRcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLnNtLFxuICAgICAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAgICAgLi4uc20ubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgW2xheWVySWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgLi4uc20sXG4gICAgICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5zbS5sYXllcnMsXG4gICAgICAgICAgICAgICAgICBbbGF5ZXJJZF06IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gMikgZWxzZSB3aGVuIHRoZSBsYXllciBpcyB2aXNpYmxlIGdsb2JhbGx5XG4gICAgcmV0dXJuIHRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlcihuZXdTdGF0ZSwgdG9nZ2xlTGF5ZXJGb3JNYXAobWFwSW5kZXgsIGxheWVySWQpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBbY2FzZSAyXTogdG9nZ2xlIGdsb2JhbCBsYXllciB2aXNpYmlsaXR5XG4gICAgY29uc3QgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7aXNWaXNpYmxlfSk7XG4gICAgY29uc3QgaWR4ID0gbmV3U3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGxheWVySWQpO1xuXG4gICAgbmV3U3RhdGUgPSB1cGRhdGVsYXllclZpc2liaWx0eShuZXdTdGF0ZSwgbmV3TGF5ZXIsIGlzVmlzaWJsZSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgICAgbGF5ZXI6IG5ld0xheWVyLFxuICAgICAgaWR4XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBpbmRleCBvZiB0aGUgZmlsdGVyIHN5bmNlZCB0byB0aW1lbGluZSBvciAtMVxuICovXG5mdW5jdGlvbiBmaWx0ZXJTeW5jZWRXaXRoVGltZWxpbmUoc3RhdGU6IFZpc1N0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gKGYgYXMgVGltZVJhbmdlRmlsdGVyKS5zeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBpc1ZhbGlkIGZsYWcgb2YgYSBsYXllci5cbiAqIFVwZGF0ZXMgaXNWaXNpYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBpc1ZhbGlkLlxuICogVHJpZ2dlcnMgdXBkYXRlIG9mIGRhdGEgZm9yIHRoZSBsYXllciBpbiBvcmRlciB0byBnZXQgZXJyb3JzIGFnYWluIGR1cmluZyBuZXh0IHVwZGF0ZSBpdGVyYXRpb24uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclNldElzVmFsaWRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyU2V0SXNWYWxpZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBpc1ZhbGlkfSA9IGFjdGlvbjtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBsYXllclRvVXBkYXRlID0gc3RhdGUubGF5ZXJzW2lkeF07XG4gIGlmIChsYXllclRvVXBkYXRlKSB7XG4gICAgbGV0IG5ld0xheWVyO1xuICAgIGxldCBuZXdEYXRhID0gbnVsbDtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAvLyBUcmlnZ2VyIGRhdGEgdXBkYXRlIGluIG9yZGVyIHRvIHNob3cgZXJyb3JzIGFnYWluIGlmIHByZXNlbnQuXG4gICAgICBjb25zdCB7bGF5ZXIsIGxheWVyRGF0YX0gPSBjYWxjdWxhdGVMYXllckRhdGEobGF5ZXJUb1VwZGF0ZSwgc3RhdGUsIHVuZGVmaW5lZCk7XG4gICAgICBuZXdMYXllciA9IGxheWVyO1xuICAgICAgbmV3RGF0YSA9IGxheWVyRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXIgPSBsYXllclRvVXBkYXRlLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBuZXdMYXllci5pc1ZhbGlkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2lkeCwgbGF5ZXI6IG5ld0xheWVyLCBsYXllckRhdGE6IG5ld0RhdGF9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKG5ld0ZpZWxkcywgdGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsID0gREVGQVVMVF9URVhUX0xBQkVMKSB7XG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBjb25zdCBjdXJyZW50RmllbGRzID0gdGV4dExhYmVsLm1hcCh0bCA9PiB0bC5maWVsZCAmJiB0bC5maWVsZC5uYW1lKS5maWx0ZXIoZCA9PiBkKTtcblxuICBjb25zdCBhZGRGaWVsZHMgPSBuZXdGaWVsZHMuZmlsdGVyKGYgPT4gIWN1cnJlbnRGaWVsZHMuaW5jbHVkZXMoZi5uYW1lKSk7XG4gIGNvbnN0IGRlbGV0ZUZpZWxkcyA9IGN1cnJlbnRGaWVsZHMuZmlsdGVyKGYgPT4gIW5ld0ZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IGYpKTtcblxuICAvLyBkZWxldGVcbiAgbmV3VGV4dExhYmVsID0gbmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCAmJiAhZGVsZXRlRmllbGRzLmluY2x1ZGVzKHRsLmZpZWxkLm5hbWUpKTtcbiAgbmV3VGV4dExhYmVsID0gIW5ld1RleHRMYWJlbC5sZW5ndGggPyBbZGVmYXVsdFRleHRMYWJlbF0gOiBuZXdUZXh0TGFiZWw7XG5cbiAgLy8gYWRkXG4gIG5ld1RleHRMYWJlbCA9IFtcbiAgICAuLi5uZXdUZXh0TGFiZWwuZmlsdGVyKHRsID0+IHRsLmZpZWxkKSxcbiAgICAuLi5hZGRGaWVsZHMubWFwKGFmID0+ICh7XG4gICAgICAuLi5kZWZhdWx0VGV4dExhYmVsLFxuICAgICAgZmllbGQ6IGFmXG4gICAgfSkpXG4gIF07XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIHRleHRMYWJlbCkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0ZXh0TGFiZWxbaWR4XSwgcHJvcCkpIHtcbiAgICByZXR1cm4gdGV4dExhYmVsO1xuICB9XG5cbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuXG4gIGlmIChwcm9wID09PSAnZmllbGQnICYmIHZhbHVlID09PSBudWxsICYmIHRleHRMYWJlbC5sZW5ndGggPiAxKSB7XG4gICAgLy8gcmVtb3ZlIGxhYmVsIHdoZW4gZmllbGQgdmFsdWUgaXMgc2V0IHRvIG51bGxcbiAgICBuZXdUZXh0TGFiZWwuc3BsaWNlKGlkeCwgMSk7XG4gIH0gZWxzZSBpZiAocHJvcCkge1xuICAgIG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5tYXAoKHRsLCBpKSA9PiAoaSA9PT0gaWR4ID8gey4uLnRsLCBbcHJvcF06IHZhbHVlfSA6IHRsKSk7XG4gIH1cblxuICByZXR1cm4gbmV3VGV4dExhYmVsO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBiYXNlIGNvbmZpZzogZGF0YUlkLCBsYWJlbCwgY29sdW1uLCBpc1Zpc2libGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBpZHgsIHByb3AsIHZhbHVlfSA9IGFjdGlvbjtcbiAgY29uc3Qge3RleHRMYWJlbH0gPSBvbGRMYXllci5jb25maWc7XG5cbiAgLy8gd2hlbiBhZGRpbmcgYSBuZXcgZW1wdHkgdGV4dCBsYWJlbCxcbiAgLy8gcmVseSBvbiB0aGUgbGF5ZXIncyBkZWZhdWx0IGNvbmZpZywgb3IgdXNlIHRoZSBjb25zdGFudCBERUZBVUxUX1RFWFRfTEFCRUxcbiAgY29uc3QgZGVmYXVsdFRleHRMYWJlbCA9XG4gICAgb2xkTGF5ZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHtkYXRhSWQ6ICcnfSk/LnRleHRMYWJlbD8uWzBdID8/IERFRkFVTFRfVEVYVF9MQUJFTDtcblxuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG4gIGlmICghdGV4dExhYmVsW2lkeF0gJiYgaWR4ID09PSB0ZXh0TGFiZWwubGVuZ3RoKSB7XG4gICAgLy8gaWYgaWR4IGlzIHNldCB0byBsZW5ndGgsIGFkZCBlbXB0eSB0ZXh0IGxhYmVsXG4gICAgbmV3VGV4dExhYmVsID0gWy4uLnRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbF07XG4gIH1cblxuICBpZiAoaWR4ID09PSAnYWxsJyAmJiBwcm9wID09PSAnZmllbGRzJykge1xuICAgIG5ld1RleHRMYWJlbCA9IGFkZE9yUmVtb3ZlVGV4dExhYmVscyh2YWx1ZSwgdGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsKTtcbiAgfSBlbHNlIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUoaWR4LCBwcm9wLCB2YWx1ZSwgbmV3VGV4dExhYmVsKTtcbiAgfVxuICAvLyB1cGRhdGUgdGV4dCBsYWJlbCBwcm9wIGFuZCB2YWx1ZVxuICByZXR1cm4gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgb2xkTGF5ZXIsXG4gICAgbmV3Q29uZmlnOiB7dGV4dExhYmVsOiBuZXdUZXh0TGFiZWx9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4aXN0aW5nTGF5ZXJXaXRoRGF0YShkYXRhc2V0LCBsYXllckNsYXNzZXMsIGxheWVyLCBzY2hlbWEpIHtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihsYXllciwgc2NoZW1hKTtcbiAgcmV0dXJuIGxvYWRlZExheWVyXG4gICAgPyB2YWxpZGF0ZUxheWVyV2l0aERhdGEoZGF0YXNldCwgbG9hZGVkTGF5ZXIsIGxheWVyQ2xhc3Nlcywge1xuICAgICAgICBhbGxvd0VtcHR5Q29sdW1uOiB0cnVlXG4gICAgICB9KVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgY29uZmlnIGRhdGFJZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJEYXRhSWRDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG9sZExheWVyOiBMYXllcjtcbiAgICBuZXdDb25maWc6IHtcbiAgICAgIGRhdGFJZDogc3RyaW5nO1xuICAgIH07XG4gIH1cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdDb25maWd9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YUlkfSA9IG5ld0NvbmZpZztcblxuICBpZiAoIW9sZExheWVyIHx8ICFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG5cbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe2RhdGFJZH0pO1xuXG4gIC8vIHRoaXMgbWF5IGhhcHBlbiB3aGVuIGEgbGF5ZXIgaXMgbmV3ICh0eXBlOiBudWxsIGFuZCBubyBjb2x1bW5zKSBidXQgaXQncyBub3QgcmVhZHkgdG8gYmUgc2F2ZWRcbiAgaWYgKG5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKFxuICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YUlkXSxcbiAgICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICAgIG5ld0xheWVyLFxuICAgICAgc3RhdGUuc2NoZW1hXG4gICAgKTtcbiAgICAvLyBpZiBjYW50IHZhbGlkYXRlIGl0IHdpdGggZGF0YSBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKCF2YWxpZGF0ZWQpIHtcbiAgICAgIGNvbnN0IG9sZExheWVyVHlwZSA9IG9sZExheWVyLnR5cGU7XG4gICAgICBpZiAob2xkTGF5ZXJUeXBlKSB7XG4gICAgICAgIG5ld0xheWVyID0gbmV3IHN0YXRlLmxheWVyQ2xhc3Nlc1tvbGRMYXllclR5cGVdKHtkYXRhSWQsIGlkOiBvbGRMYXllci5pZH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdMYXllciA9IHZhbGlkYXRlZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTGF5ZXIgaXMgbm90IHZhbGlkIHRvIHNhdmUgKGUuZy4gbWlzc2luZyBjb2x1bW5zKSwgYnV0IHdlIHN0aWxsIG5lZWQgdG9cbiAgICAvLyByZW1hcCB2aXN1YWwgY2hhbm5lbCBmaWVsZHMgdG8gdGhlIG5ldyBkYXRhc2V0IHRvIGF2b2lkIHN0YWxlIGZpZWxkIHJlZmVyZW5jZXNcbiAgICAvLyB0aGF0IHBvaW50IHRvIHJvd3MgYmV5b25kIHRoZSBuZXcgZGF0YXNldCdzIGxlbmd0aFxuICAgIGNvbnN0IG5ld0RhdGFzZXRGaWVsZHMgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLmZpZWxkcztcbiAgICBjb25zdCByZW1hcHBlZEZpZWxkczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZDogZmllbGRLZXl9KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RmllbGQgPSBuZXdMYXllci5jb25maWdbZmllbGRLZXldO1xuICAgICAgaWYgKGN1cnJlbnRGaWVsZCkge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbmV3RGF0YXNldEZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBjdXJyZW50RmllbGQubmFtZSk7XG4gICAgICAgIHJlbWFwcGVkRmllbGRzW2ZpZWxkS2V5XSA9IG1hdGNoZWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoT2JqZWN0LmtleXMocmVtYXBwZWRGaWVsZHMpLmxlbmd0aCkge1xuICAgICAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhyZW1hcHBlZEZpZWxkcyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGZpZWxkIHR5cGUgY29tcGF0aWJpbGl0eSDigJQgY2xlYXJzIGZpZWxkcyB3aG9zZSB0eXBlIGlzIGluY29tcGF0aWJsZVxuICAgIC8vIHdpdGggdGhlIGNoYW5uZWwncyBzdXBwb3J0ZWQgZmllbGQgdHlwZXMgKGUuZy4gc3RyaW5nIGZpZWxkIGZvciBhIG51bWVyaWMgc2NhbGUpXG4gICAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2tleX0pID0+IHtcbiAgICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgaXNWaXNpYmxlOiBvbGRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGlzQ29uZmlnQWN0aXZlOiB0cnVlXG4gIH0pO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgdW5kZWZpbmVkKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpOiBMYXllciB7XG4gIGxldCBuZXdMYXllciA9IGxheWVyO1xuICBpZiAoIU9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGgpIHtcbiAgICAvLyBubyBkYXRhIGlzIGxvYWRlZFxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuICBpZiAoIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAvLyBzZXQgbGF5ZXIgZGF0YUlkXG4gICAgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7ZGF0YUlkOiBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF19KTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbbmV3TGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8vIGZpbmQgZGVmYXV0IGxheWVyIHByb3BzXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgdHlwZW9mIGxheWVyQ2xhc3Nlc1tuZXdMYXllci50eXBlXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBbXSlcbiAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgLy8gYW4gYXJyYXkgb2YgcG9zc2libGUgcHJvcHMsIHVzZSAxc3Qgb25lXG4gIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuXG4gIGlmIChwcm9wcy5sZW5ndGgpIHtcbiAgICBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbbGF5ZXIudHlwZV0oe1xuICAgICAgLi4ucHJvcHNbMF0sXG4gICAgICBsYWJlbDogbmV3TGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgICAgZGF0YUlkOiBuZXdMYXllci5jb25maWcuZGF0YUlkLFxuICAgICAgaXNDb25maWdBY3RpdmU6IG5ld0xheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIGlzVmlzaWJsZTogbmV3TGF5ZXIuY29uZmlnLmlzVmlzaWJsZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0eXBlb2YgbmV3TGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nXG4gICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICA6IG5ld0xheWVyO1xufVxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdHlwZS4gUHJldmlld3MgbGF5ZXIgY29uZmlnIHdpbGwgYmUgY29waWVkIGlmIGFwcGxpY2FibGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3VHlwZX0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgb2xkSWQgPSBvbGRMYXllci5pZDtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZElkKTtcblxuICBpZiAoIXN0YXRlLmxheWVyQ2xhc3Nlc1tuZXdUeXBlXSkge1xuICAgIENvbnNvbGUuZXJyb3IoYCR7bmV3VHlwZX0gaXMgbm90IGEgdmFsaWQgbGF5ZXIgdHlwZWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKHtcbiAgICAvLyBrZWVwIG9sZCBsYXllciBsYWJsZSBhbmQgaXNDb25maWdBY3RpdmVcbiAgICBsYWJlbDogb2xkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGlzQ29uZmlnQWN0aXZlOiBvbGRMYXllci5jb25maWcuaXNDb25maWdBY3RpdmUsXG4gICAgZGF0YUlkOiBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gIH0pO1xuXG4gIGlmICghb2xkTGF5ZXIudHlwZSkge1xuICAgIC8vIGlmIHNldHRpbmcgbGF5ZXIgdHlwZSBvbiBhbiBlbXB0eSBsYXllclxuICAgIG5ld0xheWVyID0gc2V0SW5pdGlhbExheWVyQ29uZmlnKG5ld0xheWVyLCBzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBnZXQgYSBtaW50IGxheWVyLCB3aXRoIG5ldyBpZCBhbmQgdHlwZVxuICAgIC8vIGJlY2F1c2UgZGVjay5nbCB1c2VzIGlkIHRvIG1hdGNoIGJldHdlZW4gbmV3IGFuZCBvbGQgbGF5ZXIuXG4gICAgLy8gSWYgdHlwZSBoYXMgY2hhbmdlZCBidXQgaWQgaXMgdGhlIHNhbWUsIGl0IHdpbGwgYnJlYWtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID1cbiAgICAgIHR5cGVvZiBzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhzdGF0ZS5kYXRhc2V0c1tuZXdMYXllci5jb25maWcuZGF0YUlkXSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgbmV3TGF5ZXIuYXNzaWduQ29uZmlnVG9MYXllcihcbiAgICAgIG9sZExheWVyLmNvbmZpZyxcbiAgICAgIG9sZExheWVyLnZpc0NvbmZpZ1NldHRpbmdzLFxuICAgICAgc3RhdGUuZGF0YXNldHMsXG4gICAgICBkZWZhdWx0TGF5ZXJQcm9wc1xuICAgICk7XG4gICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICB9XG5cbiAgY29uc3Qge2NsaWNrZWQsIGhvdmVySW5mb30gPSBzdGF0ZTtcblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgY2xpY2tlZDogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoY2xpY2tlZCkgPyB1bmRlZmluZWQgOiBjbGlja2VkLFxuICAgIGhvdmVySW5mbzogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mb1xuICB9O1xuXG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuXG4gIGlmIChsYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgfHwgb2xkTGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHNwbGl0TWFwIGxheWVyIGlkXG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbmV3U3RhdGUuc3BsaXRNYXBzLm1hcChzZXR0aW5ncyA9PiB7XG4gICAgICAgIGNvbnN0IHtbb2xkSWRdOiBvbGRMYXllck1hcCwgLi4ub3RoZXJMYXllcnN9ID0gc2V0dGluZ3MubGF5ZXJzO1xuICAgICAgICByZXR1cm4gb2xkSWQgaW4gc2V0dGluZ3MubGF5ZXJzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICBsYXllcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5vdGhlckxheWVycyxcbiAgICAgICAgICAgICAgICBbbGF5ZXIuaWRdOiBvbGRMYXllck1hcFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBzZXR0aW5ncztcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBsYXllck9yZGVyIHdpdGggbmV3IGlkXG4gIG5ld1N0YXRlID0ge1xuICAgIC4uLm5ld1N0YXRlLFxuICAgIGxheWVyT3JkZXI6IHJlcGxhY2VMYXllckVudHJ5SW5MYXllck9yZGVyKG5ld1N0YXRlLmxheWVyT3JkZXIsIG9sZExheWVyLmlkLCBuZXdMYXllci5pZClcbiAgfTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIHZpc3VhbCBjaGFubmVsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdDb25maWcsIG5ld1Zpc0NvbmZpZywgY2hhbm5lbH0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tvbGRMYXllci5jb25maWcuZGF0YUlkXTtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhuZXdDb25maWcpO1xuICBpZiAobmV3VmlzQ29uZmlnKSBuZXdMYXllciA9IG5ld0xheWVyLnVwZGF0ZUxheWVyVmlzQ29uZmlnKG5ld1Zpc0NvbmZpZyk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpO1xuXG4gIC8vIGNhbGxpbmcgdXBkYXRlIGFuaW1hdGlvbiBkb21haW4gZmlyc3QgdG8gbWVyZ2UgYWxsIGxheWVyIGFuaW1hdGlvbiBkb21haW5cbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihzdGF0ZSk7XG5cbiAgY29uc3QgdmlzdWFsQ2hhbm5lbCA9IG9sZExheWVyLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdO1xuICBpZiAodmlzdWFsQ2hhbm5lbD8uY2hhbm5lbFNjYWxlVHlwZSA9PT0gQ0hBTk5FTF9TQ0FMRVMuY29sb3IgJiYgbmV3Q29uZmlnW3Zpc3VhbENoYW5uZWwuZmllbGRdKSB7XG4gICAgLy8gaWYgY29sb3IgZmllbGQgY2hhbmdlZCwgc2V0IGN1c3RvbUJyZWFrcyB0byBmYWxzZVxuICAgIG5ld0xheWVyLnVwZGF0ZUxheWVyQ29sb3JVSSh2aXN1YWxDaGFubmVsLnJhbmdlLCB7XG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgIC4uLm5ld0xheWVyLmNvbmZpZy5jb2xvclVJW3Zpc3VhbENoYW5uZWwucmFuZ2VdLmNvbG9yUmFuZ2VDb25maWcsXG4gICAgICAgIGN1c3RvbUJyZWFrczogZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHVwZGF0ZWRTdGF0ZSA9IHtcbiAgICAgIC4uLnVwZGF0ZWRTdGF0ZSxcbiAgICAgIGxheWVyczogdXBkYXRlZFN0YXRlLmxheWVycy5tYXAobCA9PiAobC5pZCA9PT0gb2xkTGF5ZXIuaWQgPyBuZXdMYXllciA6IGwpKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBvbGRMYXllckRhdGEgPSB1cGRhdGVkU3RhdGUubGF5ZXJEYXRhW2lkeF07XG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgdXBkYXRlZFN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gIGlmIChcbiAgICB2aXN1YWxDaGFubmVsPy5jaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvciAmJlxuICAgIG5ld0NvbmZpZ1t2aXN1YWxDaGFubmVsPy5zY2FsZV0gPT09IFNDQUxFX1RZUEVTLmN1c3RvbU9yZGluYWwgJiZcbiAgICAhbmV3VmlzQ29uZmlnXG4gICkge1xuICAgIC8vIHdoZW4gc3dpdGNoaW5nIHRvIGN1c3RvbU9yZGluYWwgc2NhbGUsIGNyZWF0ZSBhIGN1c3RvbVBhbGV0dGUgaW4gY29sb3JVSSB3aXRoIHVwZGF0ZWQgY29sb3JEb21haW5cbiAgICBjb25zdCBjdXN0b21QYWxldHRlID0gaW5pdEN1c3RvbVBhbGV0dGVCeUN1c3RvbVNjYWxlKHtcbiAgICAgIHNjYWxlOiBTQ0FMRV9UWVBFUy5jdXN0b21PcmRpbmFsLFxuICAgICAgZmllbGQ6IGxheWVyLmNvbmZpZ1t2aXN1YWxDaGFubmVsLmZpZWxkXSxcbiAgICAgIG9yZGluYWxEb21haW46IGxheWVyLmNvbmZpZ1tsYXllci52aXN1YWxDaGFubmVsc1tjaGFubmVsXS5kb21haW5dLFxuICAgICAgcmFuZ2U6IGxheWVyLmNvbmZpZy52aXNDb25maWdbdmlzdWFsQ2hhbm5lbC5yYW5nZV0sXG4gICAgICBjb2xvckJyZWFrczogbnVsbFxuICAgIH0pO1xuICAgIC8vIHVwZGF0ZSBjb2xvclJhbmdlIHdpdGggbmV3IGN1c3RvbVBhbGV0dGVcbiAgICBsYXllci51cGRhdGVMYXllckNvbG9yVUkodmlzdWFsQ2hhbm5lbC5yYW5nZSwge1xuICAgICAgc2hvd0NvbG9yQ2hhcnQ6IHRydWUsXG4gICAgICBjb2xvclJhbmdlQ29uZmlnOiB7XG4gICAgICAgIC4uLmxheWVyLmNvbmZpZy5jb2xvclVJW3Zpc3VhbENoYW5uZWwucmFuZ2VdLmNvbG9yUmFuZ2VDb25maWcsXG4gICAgICAgIGN1c3RvbUJyZWFrczogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGN1c3RvbVBhbGV0dGVcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHVwZGF0ZWRTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBgdmlzQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhhY3Rpb24ubmV3VmlzQ29uZmlnKTtcblxuICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgLi4ub2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAuLi5hY3Rpb24ubmV3VmlzQ29uZmlnXG4gIH07XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyh7dmlzQ29uZmlnOiBuZXdWaXNDb25maWd9KTtcblxuICBsZXQgbmV4dFN0YXRlID0gc3RhdGU7XG5cbiAgLy8gRXhjbHVzaXZlIGJpdG1hcCBlZGl0aW5nOiB3aGVuIGVkaXRCb3VuZHMgaXMgdHVybmVkIG9uIGZvciBvbmUgYml0bWFwIGxheWVyLFxuICAvLyB0dXJuIGl0IG9mZiBmb3IgYWxsIG90aGVyIGJpdG1hcCBsYXllcnNcbiAgaWYgKFxuICAgIG5ld0xheWVyLnR5cGUgPT09ICdiaXRtYXAnICYmXG4gICAgYWN0aW9uLm5ld1Zpc0NvbmZpZy5lZGl0Qm91bmRzID09PSB0cnVlXG4gICkge1xuICAgIG5leHRTdGF0ZSA9IHtcbiAgICAgIC4uLm5leHRTdGF0ZSxcbiAgICAgIGxheWVyczogbmV4dFN0YXRlLmxheWVycy5tYXAoKGwsIGkpID0+IHtcbiAgICAgICAgaWYgKGkgIT09IGlkeCAmJiBsLnR5cGUgPT09ICdiaXRtYXAnICYmIGwuY29uZmlnLnZpc0NvbmZpZy5lZGl0Qm91bmRzKSB7XG4gICAgICAgICAgcmV0dXJuIGwudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICAgICAgdmlzQ29uZmlnOiB7Li4ubC5jb25maWcudmlzQ29uZmlnLCBlZGl0Qm91bmRzOiBmYWxzZX1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbDtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gbmV4dFN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgbmV4dFN0YXRlLCBvbGRMYXllckRhdGEpO1xuICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEobmV4dFN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5leHRTdGF0ZSwge2xheWVyOiBuZXdMYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogUmVzZXQgYW5pbWF0aW9uIGNvbmZpZyBjdXJyZW50IHRpbWUgdG8gYSBzcGVjaWZpZWQgdmFsdWVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciA9IDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAge3ZhbHVlfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFMgPT4ge1xuICBjb25zdCBjdXJyZW50VGltZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgY3VycmVudFRpbWVcbiAgICB9XG4gIH07XG4gIC8vIHVwZGF0ZSBhbmltYXRpb24gY29uZmlnIGZvciBlYWNoIGxheWVyXG4gIHJldHVybiBzdGF0ZS5sYXllcnMucmVkdWNlKChhY2N1LCBsKSA9PiB7XG4gICAgaWYgKGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmIGwudHlwZSAhPT0gJ3RyaXAnKSB7XG4gICAgICByZXR1cm4gbGF5ZXJBbmltYXRpb25DaGFuZ2VVcGRhdGVyKGFjY3UsIHtvbGRMYXllcjogbCwgcHJvcDogJ2N1cnJlbnRUaW1lJywgY3VycmVudFRpbWV9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIGFuaW1hdGlvbiB3aW5kb3dcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi5pZCA9PT0gaWQpO1xuXG4gIGlmICghZmlsdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBhbmltYXRpb25XaW5kb3dcbiAgfTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikoc3RhdGUuZmlsdGVycylcbiAgfTtcblxuICBjb25zdCBuZXdTeW5jVGltZWxpbmVNb2RlID0gZ2V0U3luY0FuaW1hdGlvbk1vZGUobmV3RmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcik7XG5cbiAgcmV0dXJuIHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7aWQsIG1vZGU6IG5ld1N5bmNUaW1lbGluZU1vZGV9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RmlsdGVyQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BcHBseUZpbHRlckNvbmZpZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2ZpbHRlcklkLCBuZXdGaWx0ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBvbGRGaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZiA9PiBmLmlkID09PSBmaWx0ZXJJZCk7XG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gU2VyaWFsaXplIHRoZSBmaWx0ZXJzIHRvIG9ubHkgY29tcGFyZSB0aGUgc2F2ZWQgcHJvcGVydGllc1xuICBjb25zdCBzZXJpYWxpemVkT2xkRmlsdGVyID0gc2VyaWFsaXplRmlsdGVyKG9sZEZpbHRlciwgc3RhdGUuc2NoZW1hKSA/PyB7Y29uZmlnOiB7fX07XG4gIGNvbnN0IHNlcmlhbGl6ZWROZXdGaWx0ZXIgPSBzZXJpYWxpemVGaWx0ZXIobmV3RmlsdGVyLCBzdGF0ZS5zY2hlbWEpO1xuICBpZiAoIXNlcmlhbGl6ZWROZXdGaWx0ZXIgfHwgaXNFcXVhbChzZXJpYWxpemVkT2xkRmlsdGVyLCBzZXJpYWxpemVkTmV3RmlsdGVyKSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgY2hhbmdlcyB0byB0aGUgZmlsdGVyLCBhcHBseSB0aGVtXG4gIGNvbnN0IGNoYW5nZWQgPSBwaWNrQ2hhbmdlZFByb3BzKHNlcmlhbGl6ZWRPbGRGaWx0ZXIsIHNlcmlhbGl6ZWROZXdGaWx0ZXIpO1xuICBkZWxldGUgY2hhbmdlZFsnaWQnXTsgLy8gaWQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkXG5cbiAgY29uc3QgZmlsdGVySW5kZXggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGZpbHRlcklkKTtcbiAgaWYgKGZpbHRlckluZGV4IDwgMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihcbiAgICBzdGF0ZSxcbiAgICBzZXRGaWx0ZXIoZmlsdGVySW5kZXgsIE9iamVjdC5rZXlzKGNoYW5nZWQpLCBPYmplY3QudmFsdWVzKGNoYW5nZWQpKVxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2lkeCwgdmFsdWVJbmRleCA9IDB9ID0gYWN0aW9uO1xuICBjb25zdCBvbGRGaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2lkeF07XG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVycy4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KGFjdGlvbi5wcm9wKSAmJlxuICAgICghQXJyYXkuaXNBcnJheShhY3Rpb24udmFsdWUpIHx8IGFjdGlvbi5wcm9wLmxlbmd0aCAhPT0gYWN0aW9uLnZhbHVlLmxlbmd0aClcbiAgKSB7XG4gICAgQ29uc29sZS5lcnJvcignRXhwZWN0aW5nIHZhbHVlIHRvIGJlIGFuIGFycmF5IG9mIHRoZSBzYW1lIGxlbmd0aCwgc2luY2UgcHJvcCBpcyBhbiBhcnJheScpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBjb252ZXJ0IHByb3AgYW5kIHZhbHVlIHRvIGFycmF5XG4gIGNvbnN0IHByb3BzID0gdG9BcnJheShhY3Rpb24ucHJvcCk7XG4gIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkoYWN0aW9uLnByb3ApID8gdG9BcnJheShhY3Rpb24udmFsdWUpIDogW2FjdGlvbi52YWx1ZV07XG5cbiAgbGV0IG5ld0ZpbHRlciA9IG9sZEZpbHRlcjtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG5cbiAgbGV0IGRhdGFzZXRJZHNUb0ZpbHRlcjogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpXTtcbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAvLyBXZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcGFzc2luZyBpbiBuYW1lIGFzIGFuIGFycmF5IGludG8gX3VwZGF0ZUZpbHRlclByb3AsIHNvIHdlIGNhbGwgaXQgbXVsdGlwbGUgdGltZXMgd2l0aCBlYWNoIG5hbWVcbiAgICAvLyBTZWUgdGhlIGNvbW1lbnQgaW4gdGhlcmUgYXMgdG8gd2hhdCBzaG91bGQgYmUgYWRkcmVzc2VkXG4gICAgbGV0IHJlcztcbiAgICBpZiAocHJvcCA9PT0gJ25hbWUnICYmIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICByZXMgPSB2YWx1ZS5yZWR1Y2UoKGFjY3UsIHYpID0+IHtcbiAgICAgICAgcmV0dXJuIF91cGRhdGVGaWx0ZXJQcm9wKGFjY3UsIG5ld0ZpbHRlciwgcHJvcCwgdiwgdmFsdWVJbmRleCk7XG4gICAgICB9LCBuZXdTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IF91cGRhdGVGaWx0ZXJQcm9wKG5ld1N0YXRlLCBuZXdGaWx0ZXIsIHByb3AsIHZhbHVlLCB2YWx1ZUluZGV4KTtcbiAgICB9XG4gICAgbmV3RmlsdGVyID0gcmVzLmZpbHRlcjtcbiAgICBuZXdTdGF0ZSA9IHJlcy5zdGF0ZTtcbiAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBkYXRhc2V0SWRzVG9GaWx0ZXIuY29uY2F0KHJlcy5kYXRhc2V0SWRzVG9GaWx0ZXIpO1xuICB9XG5cbiAgY29uc3QgZW5sYXJnZWRGaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZiA9PiBmLnZpZXcgPT09IEZJTFRFUl9WSUVXX1RZUEVTLmVubGFyZ2VkKTtcblxuICBpZiAoZW5sYXJnZWRGaWx0ZXIgJiYgZW5sYXJnZWRGaWx0ZXIuaWQgIT09IG5ld0ZpbHRlci5pZCkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBlbmxhcmdlZCBmaWx0ZXJcbiAgICBuZXdGaWx0ZXIudmlldyA9IEZJTFRFUl9WSUVXX1RZUEVTLnNpZGU7XG4gIH1cblxuICAvLyBzYXZlIG5ldyBmaWx0ZXJzIHRvIG5ld1N0YXRlXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIG5ld0ZpbHRlciwgbmV3U3RhdGUpO1xuXG4gIC8vIGZpbHRlciBkYXRhXG4gIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKFxuICAgIHVuaXEoZGF0YXNldElkc1RvRmlsdGVyKSxcbiAgICBuZXdTdGF0ZS5kYXRhc2V0cyxcbiAgICBuZXdTdGF0ZS5maWx0ZXJzLFxuICAgIG5ld1N0YXRlLmxheWVyc1xuICApO1xuXG4gIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnXSwgZmlsdGVyZWREYXRhc2V0cywgbmV3U3RhdGUpO1xuXG4gIC8vIG5lZWQgdG8gdXBkYXRlIGZpbHRlclBsb3QgYWZ0ZXIgZmlsdGVyIERhdGFzZXQgZm9yIHBsb3QgdG8gdXBkYXRlIG9uIGZpbHRlcmVkIHJlc3VsdFxuICBjb25zdCBmaWx0ZXJXaXRoUExvdCA9IHVwZGF0ZUZpbHRlclBsb3QobmV3U3RhdGUuZGF0YXNldHMsIG5ld1N0YXRlLmZpbHRlcnNbaWR4XSk7XG5cbiAgbmV3U3RhdGUgPSBzZXQoWydmaWx0ZXJzJywgaWR4XSwgZmlsdGVyV2l0aFBMb3QsIG5ld1N0YXRlKTtcblxuICAvLyBkYXRhSWQgaXMgYW4gYXJyYXlcbiAgLy8gcGFzcyBvbmx5IHRoZSBkYXRhc2V0IHdlIG5lZWQgdG8gdXBkYXRlXG4gIG5ld1N0YXRlID0gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG5ld1N0YXRlLCBkYXRhc2V0SWRzVG9GaWx0ZXIsIG5ld0ZpbHRlcik7XG5cbiAgLy8gSWYgdGltZSByYW5nZSBmaWx0ZXIgdmFsdWUgd2FzIHVwZGF0ZWQsIGFkanVzdCBhbmltYXRpb24gY29uZmlnXG4gIGlmIChuZXdGaWx0ZXIudHlwZSA9PT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSAmJiBwcm9wcy5pbmNsdWRlcygndmFsdWUnKSkge1xuICAgIG5ld1N0YXRlID0gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcihuZXdTdGF0ZSwgYWN0aW9uLmlkeCk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbmZ1bmN0aW9uIF91cGRhdGVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCB2YWx1ZSwgZGF0YXNldHMpIHtcbiAgbGV0IG5ld0ZpbHRlciA9IGZpbHRlcjtcbiAgaWYgKGZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF0pIHtcbiAgICAvLyBpZiBkYXRhSWQgYWxyZWFkeSBleGlzdFxuICAgIG5ld0ZpbHRlciA9IF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cyk7XG4gIH1cbiAgaWYgKHZhbHVlKSB7XG4gICAgY29uc3QgbmV4dFZhbHVlID0gbmV3RmlsdGVyLmRhdGFJZC5zbGljZSgpO1xuICAgIG5leHRWYWx1ZVt2YWx1ZUluZGV4XSA9IHZhbHVlO1xuICAgIG5ld0ZpbHRlciA9IHNldChbJ2RhdGFJZCddLCBuZXh0VmFsdWUsIG5ld0ZpbHRlcik7XG4gIH1cbiAgcmV0dXJuIG5ld0ZpbHRlcjtcbn1cblxuZnVuY3Rpb24gX3JlbW92ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleChmaWx0ZXIsIHZhbHVlSW5kZXgsIGRhdGFzZXRzKSB7XG4gIGNvbnN0IGRhdGFJZCA9IGZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF07XG5cbiAgaWYgKGZpbHRlci5kYXRhSWQubGVuZ3RoID09PSAxICYmIHZhbHVlSW5kZXggPT09IDApIHtcbiAgICAvLyBpZiByZW1vdmUgdGhlIG9ubHkgZGF0YUlkLCBjcmVhdGUgYW4gZW1wdHkgZmlsdGVyIGluc3RlYWQ7XG4gICAgcmV0dXJuIGdldERlZmF1bHRGaWx0ZXIoe2lkOiBmaWx0ZXIuaWR9KTtcbiAgfVxuXG4gIGlmIChkYXRhSWQpIHtcbiAgICBmaWx0ZXIgPSByZW1vdmVGaWx0ZXJQbG90KGZpbHRlciwgZGF0YUlkKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBbJ2RhdGFJZCcsICduYW1lJywgJ2ZpZWxkSWR4JywgJ2dwdUNoYW5uZWwnXSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcltwcm9wXSkpIHtcbiAgICAgIGNvbnN0IG5leHRWYWwgPSBmaWx0ZXJbcHJvcF0uc2xpY2UoKTtcbiAgICAgIG5leHRWYWwuc3BsaWNlKHZhbHVlSW5kZXgsIDEpO1xuICAgICAgZmlsdGVyID0gc2V0KFtwcm9wXSwgbmV4dFZhbCwgZmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICAvLyBtZXJnZUZpZWxkRG9tYWluIGZvciB0aGUgcmVtYWluaW5nIGZpZWxkc1xuICBjb25zdCBkb21haW5TdGVwcyA9IG1lcmdlRmlsdGVyRG9tYWluKGZpbHRlciwgZGF0YXNldHMpO1xuXG4gIGNvbnN0IG5leHRGaWx0ZXIgPSB7XG4gICAgLi4uZmlsdGVyLFxuICAgIC8vIHZhbHVlOiBuZXh0VmFsdWUsXG4gICAgLi4uKGRvbWFpblN0ZXBzID8ge2RvbWFpbjogZG9tYWluU3RlcHM/LmRvbWFpbiwgc3RlcDogZG9tYWluU3RlcHM/LnN0ZXB9IDoge30pXG4gIH07XG5cbiAgY29uc3QgbmV4dFZhbHVlID0gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbihuZXh0RmlsdGVyLnZhbHVlLCBuZXh0RmlsdGVyKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5uZXh0RmlsdGVyLFxuICAgIHZhbHVlOiBuZXh0VmFsdWVcbiAgfTtcbn1cblxuLyoqICpcbiAqIFVwZGF0ZXMgYSBzaW5nbGUgcHJvcGVydHkgb2YgYSBmaWx0ZXJcbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZUZpbHRlclByb3Aoc3RhdGUsIGZpbHRlciwgcHJvcCwgdmFsdWUsIHZhbHVlSW5kZXgsIGRhdGFzZXRJZHM/KSB7XG4gIGxldCBkYXRhc2V0SWRzVG9GaWx0ZXI6IHN0cmluZ1tdID0gW107XG4gIHN3aXRjaCAocHJvcCkge1xuICAgIC8vIFRPRE86IE5leHQgUFIgZm9yIFVJIGlmIHdlIHVwZGF0ZSBmaWx0ZXJEYXRhSWQsIHdlIG5lZWQgdG8gY29uc2lkZXIgdHdvIGNhc2VzOlxuICAgIC8vIDEuIGRhdGFJZCBpcyBlbXB0eTogY3JlYXRlIGEgZGVmYXVsdCBmaWx0ZXJcbiAgICAvLyAyLiBBZGQgYSBuZXcgZGF0YXNldCBpZFxuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMuZGF0YUlkOiB7XG4gICAgICBjb25zdCBvbGREYXRhSWQgPSBbLi4uZmlsdGVyLmRhdGFJZF07XG4gICAgICBmaWx0ZXIgPSBfdXBkYXRlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgdmFsdWUsIHN0YXRlLmRhdGFzZXRzKTtcbiAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IHVuaXEoWy4uLm9sZERhdGFJZCwgLi4uZmlsdGVyLmRhdGFJZF0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMubmFtZToge1xuICAgICAgLy8gd2UgYXJlIHN1cHBvcnRpbmcgdGhlIGN1cnJlbnQgZnVuY3Rpb25hbGl0eVxuICAgICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgZmlsdGVyIG5hbWUgd2lsbCBvbmx5IHVwZGF0ZSBmaWx0ZXIgbmFtZSBidXQgaXQgd29uJ3QgaGF2ZSBzaWRlIGVmZmVjdHNcbiAgICAgIC8vIHdlIGFyZSBnb25uYSB1c2UgcGFpciBvZiBkYXRhc2V0cyBhbmQgZmllbGRJZHggdG8gdXBkYXRlIHRoZSBmaWx0ZXJcbiAgICAgIGNvbnN0IGRhdGFzZXRJZCA9IGZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF07XG4gICAgICBjb25zdCB7ZmlsdGVyOiB1cGRhdGVkRmlsdGVyLCBkYXRhc2V0OiBuZXdEYXRhc2V0fSA9IGFwcGx5RmlsdGVyRmllbGROYW1lKFxuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIHN0YXRlLmRhdGFzZXRzLFxuICAgICAgICBkYXRhc2V0SWQsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZUluZGV4LFxuICAgICAgICB7bWVyZ2VEb21haW46IHZhbHVlSW5kZXggPiAwfVxuICAgICAgKTtcbiAgICAgIGlmICh1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgIGZpbHRlciA9IHVwZGF0ZWRGaWx0ZXI7XG4gICAgICAgIGlmIChmaWx0ZXIuZ3B1KSB7XG4gICAgICAgICAgZmlsdGVyID0gc2V0RmlsdGVyR3B1TW9kZShmaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICAgIGZpbHRlciA9IGFzc2lnbkdwdUNoYW5uZWwoZmlsdGVyLCBzdGF0ZS5maWx0ZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IHNldChbJ2RhdGFzZXRzJywgZGF0YXNldElkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xuICAgICAgICAvLyByZW1vdmUgZmlsdGVyIFBsb3QgYXQgZGF0YXNldElkLCBzbyBpdCB3aWxsIGJlIHJlY2FsY3VsYXRlZFxuICAgICAgICBmaWx0ZXIgPSByZW1vdmVGaWx0ZXJQbG90KGZpbHRlciwgZGF0YXNldElkKTtcblxuICAgICAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSB1cGRhdGVkRmlsdGVyLmRhdGFJZDtcbiAgICAgIH1cbiAgICAgIC8vIG9ubHkgZmlsdGVyIHRoZSBjdXJyZW50IGRhdGFzZXRcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMubGF5ZXJJZDoge1xuICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgb25seSBkYXRhc2V0SWQvcyBpZiB3ZSBoYXZlIGFkZGVkL3JlbW92ZWQgbGF5ZXJzXG4gICAgICAvLyAtIGNoZWNrIGZvciBsYXllcklkIGNoYW5nZXMgKFhPUiB3b3JrcyBiZWNhdXNlIG9mIHN0cmluZyB2YWx1ZXMpXG4gICAgICAvLyBpZiBubyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGxheWVySWRzLCBkb24ndCBkbyBhbnkgZmlsdGVyaW5nXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBjb25zdCBsYXllcklkRGlmZmVyZW5jZSA9IHhvcih2YWx1ZSwgZmlsdGVyLmxheWVySWQpO1xuXG4gICAgICBjb25zdCBsYXllckRhdGFJZHMgPSB1bmlxPHN0cmluZz4oXG4gICAgICAgIGxheWVySWREaWZmZXJlbmNlXG4gICAgICAgICAgLm1hcChsaWQgPT5cbiAgICAgICAgICAgIGdldChcbiAgICAgICAgICAgICAgc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsaWQpLFxuICAgICAgICAgICAgICBbJ2NvbmZpZycsICdkYXRhSWQnXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKGQgPT4gZCkgYXMgc3RyaW5nW11cbiAgICAgICk7XG5cbiAgICAgIC8vIG9ubHkgZmlsdGVyIGRhdGFzZXRzSWRzXG4gICAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBsYXllckRhdGFJZHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBuZXdGaWx0ZXIgZGF0YUlkc1xuICAgICAgY29uc3QgbmV3RGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgdmFsdWVcbiAgICAgICAgICA/Lm1hcChsaWQgPT5cbiAgICAgICAgICAgIGdldChcbiAgICAgICAgICAgICAgc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsaWQpLFxuICAgICAgICAgICAgICBbJ2NvbmZpZycsICdkYXRhSWQnXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKGQgPT4gZCkgYXMgc3RyaW5nW11cbiAgICAgICk7XG5cbiAgICAgIGZpbHRlciA9IHtcbiAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICBsYXllcklkOiB2YWx1ZSxcbiAgICAgICAgZGF0YUlkOiBuZXdEYXRhSWRzXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIGZpbHRlciA9IHNldChbcHJvcF0sIHZhbHVlLCBmaWx0ZXIpO1xuICAgICAgZGF0YXNldElkc1RvRmlsdGVyID0gWy4uLmZpbHRlci5kYXRhSWRdO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4ge2ZpbHRlciwgZGF0YXNldElkcywgZGF0YXNldElkc1RvRmlsdGVyLCBzdGF0ZX07XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogU2V0IHRoZSBwcm9wZXJ0eSBvZiBhIGZpbHRlciBwbG90XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RmlsdGVyUGxvdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkeCwgbmV3UHJvcH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIXN0YXRlLmZpbHRlcnNbaWR4XSkge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnNbJHtpZHh9XSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0ZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbmV3UHJvcCkge1xuICAgIGlmIChwcm9wID09PSAncGxvdFR5cGUnKSB7XG4gICAgICBuZXdGaWx0ZXIgPSBwaWNrXygncGxvdFR5cGUnKShtZXJnZV8obmV3UHJvcC5wbG90VHlwZSkpKG5ld0ZpbHRlcik7XG4gICAgfSBlbHNlIGlmIChwcm9wID09PSAneUF4aXMnKSB7XG4gICAgICBjb25zdCBjaGFydFR5cGUgPSBuZXdQcm9wLnlBeGlzID8gUExPVF9UWVBFUy5saW5lQ2hhcnQgOiBQTE9UX1RZUEVTLmhpc3RvZ3JhbTtcblxuICAgICAgbmV3RmlsdGVyID0gcGlja18oJ3Bsb3RUeXBlJykobWVyZ2VfKHt0eXBlOiBjaGFydFR5cGV9KSkobWVyZ2VfKG5ld1Byb3ApKG5ld0ZpbHRlcikpO1xuICAgIH1cbiAgfVxuXG4gIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlclBsb3Qoc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIGlkOiBhY3Rpb24uaWR9KV1cbiAgICAgIH07XG5cbi8qKlxuICogQ3JlYXRlIG9yIHVwZGF0ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZU9yVXBkYXRlRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5DcmVhdGVPclVwZGF0ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkLCBkYXRhSWQsIGZpZWxkLCB2YWx1ZX0gPSBhY3Rpb247XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsSW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGlkKTtcbiAgbGV0IGZpbHRlckluZGV4ID0gb3JpZ2luYWxJbmRleDtcbiAgaWYgKCFpZCAmJiAhZGF0YUlkKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG4gIGlmIChvcmlnaW5hbEluZGV4IDwgMCAmJiBkYXRhSWQpIHtcbiAgICBuZXdTdGF0ZSA9IGFkZEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWR9KTtcbiAgICBpZiAobmV3U3RhdGUuZmlsdGVycy5sZW5ndGggIT09IHN0YXRlLmZpbHRlcnMubGVuZ3RoICsgMSkge1xuICAgICAgLy8gTm8gbmV3IGZpbHRlciB3YXMgYWRkZWRcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgLy8gSGVyZSB3ZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgZmlsdGVyIHdhcyBhZGRlZCBhdCB0aGUgZW5kXG4gICAgZmlsdGVySW5kZXggPSBuZXdTdGF0ZS5maWx0ZXJzLmxlbmd0aCAtIDE7XG4gICAgbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJbmRleF0gPSB7XG4gICAgICAuLi5uZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlckluZGV4XSxcbiAgICAgIC4uLihpZCA/IHtpZH0gOiBudWxsKVxuICAgIH07XG4gIH1cblxuICAvLyBObyBuZWVkIHRvIHVwZGF0ZSB0aGlzIGlmIGl0J3MgYSBuZXdseSBjcmVhdGVkIGZpbHRlclxuICAvLyBGaXJzdCB3ZSBtYWtlIHN1cmUgYWxsIHRoZSBkYXRhSWRzIHRoYXQgZmllbGRzIHJlZmVyIHRvIGFyZSB1cGRhdGVkXG4gIGlmIChvcmlnaW5hbEluZGV4ID49IDAgJiYgZGF0YUlkKSB7XG4gICAgLy8gSWYgdGhlIGRhdGFJZCBpcyBhbiBhcnJheSwgd2UgbmVlZCB0byB1cGRhdGUgZWFjaCBvbmUgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGRhdGFJZCkgPyBkYXRhSWQgOiBbZGF0YUlkXSkucmVkdWNlKChhY2N1LCBkLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnZGF0YUlkJyxcbiAgICAgICAgdmFsdWU6IGQsXG4gICAgICAgIHZhbHVlSW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9LCBuZXdTdGF0ZSk7XG4gIH1cbiAgLy8gVGhlbiB3ZSB1cGRhdGUgdGhlIGZpZWxkc1xuICBpZiAoZmllbGQpIHtcbiAgICAvLyBJZiB0aGUgZmllbGQgaXMgYW4gYXJyYXksIHdlIG5lZWQgdG8gdXBkYXRlIGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IGFzIHRoZXkgbmVlZCBhIGNvcnJlY3QgdmFsdWVJbmRleCBwYXNzZWRcbiAgICBuZXdTdGF0ZSA9IChBcnJheS5pc0FycmF5KGZpZWxkKSA/IGZpZWxkIDogW2ZpZWxkXSkucmVkdWNlKChhY2N1LCBmLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoYWNjdSwge1xuICAgICAgICBpZHg6IGZpbHRlckluZGV4LFxuICAgICAgICBwcm9wOiAnbmFtZScsXG4gICAgICAgIHZhbHVlOiBmLFxuICAgICAgICB2YWx1ZUluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfSwgbmV3U3RhdGUpO1xuICB9XG4gIC8vIFRoZW4gd2UgdXBkYXRlIHRoZSB2YWx1ZSBzZXBhcmF0ZWx5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJbmRleCwgcHJvcDogJ3ZhbHVlJywgdmFsdWV9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogU2V0IGxheWVyIGNvbG9yIHBhbGV0dGUgdWkgc3RhdGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvbGRMYXllciwgcHJvcCwgbmV3Q29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgb2xkVml4Q29uZmlnID0gb2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbG9yVUkocHJvcCwgbmV3Q29uZmlnKTtcbiAgY29uc3QgbmV3VmlzQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgaWYgKG9sZFZpeENvbmZpZyAhPT0gbmV3VmlzQ29uZmlnKSB7XG4gICAgcmV0dXJuIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdWaXNDb25maWc6IHtcbiAgICAgICAgW3Byb3BdOiBuZXdWaXNDb25maWdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcChsID0+IChsLmlkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyIDogbCkpXG4gIH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IGFuZCBlbmQgZmlsdGVyIGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gYWN0aW9uLmlkeCA/IHsuLi5mLCBpc0FuaW1hdGluZzogIWYuaXNBbmltYXRpbmd9IDogZikpXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlsdGVyQW5pbWF0aW9uQ29uZmlnKGNvbmZpZzogQW5pbWF0aW9uQ29uZmlnIHwgRmlsdGVyQW5pbWF0aW9uQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiAnZGF0YUlkJyBpbiBjb25maWcgJiYgJ2FuaW1hdGlvbldpbmRvdycgaW4gY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QW5pbWF0aW9uQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRBbmltYXRpb25Db25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuICBpZiAoaXNGaWx0ZXJBbmltYXRpb25Db25maWcoY29uZmlnKSkge1xuICAgIC8vIEZpbmQgZmlsdGVyIHVzZWQgZm9yIGFuaW1hdGlvblxuICAgIC8vIEFzc3VtaW5nIHRoZXJlJ3Mgb25seSBvbmUgZmlsdGVyIHVzZWQgZm9yIGFuaW1hdGlvbiwgc2VlIHNldEZpbHRlclZpZXdVcGRhdGVyXG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gIWlzU2lkZUZpbHRlcihmKSk7XG4gICAgaWYgKCFmaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgbmV3RmlsdGVyID0gey4uLmZpbHRlciwgLi4uY29uZmlnfTtcbiAgICByZXR1cm4gYXBwbHlGaWx0ZXJDb25maWdVcGRhdGVyKHN0YXRlLCBhcHBseUZpbHRlckNvbmZpZyhmaWx0ZXIuaWQsIG5ld0ZpbHRlcikpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGlzQW5pbWF0aW5nOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmlzQW5pbWF0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyID0gKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaGlkZUNvbnRyb2w6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2xcbiAgfVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIGZpbHRlciBhbmltYXRpb24gc3BlZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIHNwZWVkOiBhY3Rpb24uc3BlZWR9IDogZikpXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgYW5pbWF0aW9uIHNwZWVkIHdpdGggdGhlIHZlcnRpY2FsIHNwZWVkIHNsaWRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7c3BlZWR9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHNwZWVkXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGxhcmdlciB0aW1lIGZpbHRlciBhdCBib3R0b20gZm9yIHRpbWUgcGxheWJhY2sgKGFwcGx5IHRvIHRpbWUgZmlsdGVyIG9ubHkpXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RmlsdGVyVmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyVmlld1VwZGF0ZXJBY3Rpb25cbikgPT4ge1xuICBjb25zdCB7dmlldywgaWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qgc2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3ID0gdmlldyA9PT0gRklMVEVSX1ZJRVdfVFlQRVMuZW5sYXJnZWQ7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+XG4gICAgICBpID09PSBpZHhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlld1xuICAgICAgICAgIH1cbiAgICAgICAgOiBzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgdmlldzogRklMVEVSX1ZJRVdfVFlQRVMuc2lkZVxuICAgICAgICAgIH1cbiAgICAgICAgOiBmXG4gICAgKVxuICB9O1xufTtcblxuLyoqXG4gKiBUb2dnbGVzIGZpbHRlciBmZWF0dXJlIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2FjdGlvbi5pZHhdO1xuICBjb25zdCBpc1Zpc2libGUgPSBnZXQoZmlsdGVyLCBbJ3ZhbHVlJywgJ3Byb3BlcnRpZXMnLCAnaXNWaXNpYmxlJ10pO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIHtcbiAgICBpZHg6IGFjdGlvbi5pZHgsXG4gICAgcHJvcDogJ2VuYWJsZWQnLFxuICAgIHZhbHVlOiAhaXNWaXNpYmxlXG4gIH0pO1xuXG4gIG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogYWN0aW9uLmlkeCxcbiAgICBwcm9wOiAndmFsdWUnLFxuICAgIHZhbHVlOiBmZWF0dXJlVG9GaWx0ZXJWYWx1ZShmaWx0ZXIudmFsdWUsIGZpbHRlci5pZCwge1xuICAgICAgaXNWaXNpYmxlOiAhaXNWaXNpYmxlXG4gICAgfSlcbiAgfSk7XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVGaWx0ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2lkeH0gPSBhY3Rpb247XG4gIGNvbnN0IHtkYXRhSWQsIGlkfSA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBjb25zdCBuZXdGaWx0ZXJzID0gW1xuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoMCwgaWR4KSxcbiAgICAuLi5zdGF0ZS5maWx0ZXJzLnNsaWNlKGlkeCArIDEsIHN0YXRlLmZpbHRlcnMubGVuZ3RoKVxuICBdO1xuXG4gIGNvbnN0IGZpbHRlcmVkRGF0YXNldHMgPSBhcHBseUZpbHRlcnNUb0RhdGFzZXRzKGRhdGFJZCwgc3RhdGUuZGF0YXNldHMsIG5ld0ZpbHRlcnMsIHN0YXRlLmxheWVycyk7XG4gIGNvbnN0IG5ld0VkaXRvciA9XG4gICAgZ2V0RmlsdGVySWRJbkZlYXR1cmUoc3RhdGUuZWRpdG9yLnNlbGVjdGVkRmVhdHVyZSkgPT09IGlkXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGUuZWRpdG9yO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnXSwgbmV3RmlsdGVycywgc3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgbmV3U3RhdGUgPSBzZXQoWydlZGl0b3InXSwgbmV3RWRpdG9yLCBuZXdTdGF0ZSk7XG5cbiAgcmV0dXJuIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YUlkLCB1bmRlZmluZWQpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGxldCBuZXdMYXllcjtcbiAgbGV0IG5ld0xheWVyRGF0YTtcbiAgaWYgKGFjdGlvbi5jb25maWcpIHtcbiAgICBuZXdMYXllciA9IGNyZWF0ZUxheWVyRnJvbUNvbmZpZyhzdGF0ZSwgYWN0aW9uLmNvbmZpZyk7XG4gICAgaWYgKCFuZXdMYXllcikge1xuICAgICAgQ29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBsYXllciBmcm9tIGNvbmZpZywgaXQgdXN1YWxseSBtZWFucyB0aGUgY29uZmlnIGlzIG5vdCBiZSBpbiBjb3JyZWN0IGZvcm1hdCcsXG4gICAgICAgIGFjdGlvbi5jb25maWdcbiAgICAgICk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSk7XG4gICAgbmV3TGF5ZXIgPSByZXN1bHQubGF5ZXI7XG4gICAgbmV3TGF5ZXJEYXRhID0gcmVzdWx0LmxheWVyRGF0YTtcbiAgfSBlbHNlIHtcbiAgICAvLyBjcmVhdGUgYW4gZW1wdHkgbGF5ZXIgd2l0aCBhIHNwZWNpZmljIGRhdGFzZXQgb3IgYSBkZWZhdWx0IG9uZVxuICAgIGNvbnN0IGRlZmF1bHREYXRhc2V0ID0gYWN0aW9uLmRhdGFzZXRJZCA/PyBPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cylbMF07XG4gICAgbmV3TGF5ZXIgPSBuZXcgTGF5ZXIoe1xuICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgICBkYXRhSWQ6IGRlZmF1bHREYXRhc2V0XG4gICAgfSk7XG4gICAgbmV3TGF5ZXJEYXRhID0ge307XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCBuZXdMYXllcl0sXG4gICAgbGF5ZXJEYXRhOiBbLi4uc3RhdGUubGF5ZXJEYXRhLCBuZXdMYXllckRhdGFdLFxuICAgIC8vIGFkZCBuZXcgbGF5ZXIgYXQgdGhlIHRvcFxuICAgIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZCwgLi4uc3RhdGUubGF5ZXJPcmRlcl0sXG4gICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKHN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXIpXG4gIH07XG5cbiAgaWYgKG5ld0xheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTGF5ZXJVcGRhdGVyPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBUIHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgLy8gaW52YWxpZCBpbmRleFxuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCByZW1vdmUgbGF5ZXIgd2l0aCBpbnZhbGlkIGlkfGlkeCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtsYXllcnMsIGxheWVyRGF0YSwgbGF5ZXJPcmRlciwgY2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuICBjb25zdCBsYXllclRvUmVtb3ZlID0gbGF5ZXJzW2lkeF07XG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogZmlsdGVyT3V0QnlJZChsYXllclRvUmVtb3ZlLmlkKShsYXllcnMpLFxuICAgIGxheWVyRGF0YTogcmVtb3ZlRWxlbWVudEF0SW5kZXgoaWR4KShsYXllckRhdGEpLFxuICAgIGxheWVyT3JkZXI6IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihsYXllck9yZGVyLCBsYXllclRvUmVtb3ZlLmlkKSxcbiAgICBjbGlja2VkOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGNsaWNrZWQpID8gdW5kZWZpbmVkIDogY2xpY2tlZCxcbiAgICBob3ZlckluZm86IGxheWVyVG9SZW1vdmUuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mbyxcbiAgICBzcGxpdE1hcHM6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyVG9SZW1vdmUpXG4gICAgLy8gVE9ETzogdXBkYXRlIGZpbHRlcnMsIGNyZWF0ZSBoZWxwZXIgdG8gcmVtb3ZlIGxheWVyIGZvcm0gZmlsdGVyIChyZW1vdmUgbGF5ZXJpZCBhbmQgZGF0YWlkKSBpZiBtYXBwZWRcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbn1cblxuLyoqXG4gKiBSZW9yZGVyIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckxheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7b3JkZXJ9OiBWaXNTdGF0ZUFjdGlvbnMuUmVvcmRlckxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxheWVyT3JkZXI6IG9yZGVyXG59KTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgbGF5ZXIgZ3JvdXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRMYXllckdyb3VwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRMYXllckdyb3VwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBsYXllckdyb3VwID0gZ2V0TmV3TGF5ZXJHcm91cChhY3Rpb24pO1xuICBsZXQgbmV3TGF5ZXJPcmRlciA9IFsuLi5zdGF0ZS5sYXllck9yZGVyXTtcblxuICBpZiAoYWN0aW9uLmxheWVyT3JkZXIpIHtcbiAgICBhY3Rpb24ubGF5ZXJPcmRlci5mb3JFYWNoKGxheWVySWQgPT4ge1xuICAgICAgbmV3TGF5ZXJPcmRlciA9IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihuZXdMYXllck9yZGVyLCBsYXllcklkIGFzIHN0cmluZyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyT3JkZXI6IGFkZExheWVyT3JHcm91cFRvTGF5ZXJPcmRlcihuZXdMYXllck9yZGVyLCBsYXllckdyb3VwKVxuICB9O1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBsYXllciBncm91cCBhbmQgYWxsIGxheWVycyB3aXRoaW4gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVMYXllckdyb3VwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVMYXllckdyb3VwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWR9ID0gYWN0aW9uO1xuICBjb25zdCBsYXllckdyb3VwVG9SZW1vdmUgPSBnZXRMYXllckdyb3VwRnJvbUxheWVyT3JkZXIoc3RhdGUubGF5ZXJPcmRlciwgaWQpO1xuICBpZiAoIWxheWVyR3JvdXBUb1JlbW92ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGxheWVySWRzVG9SZW1vdmUgPSBnZXRGbGF0TGF5ZXJPcmRlcihsYXllckdyb3VwVG9SZW1vdmUubGF5ZXJPcmRlcik7XG4gIGxldCBuZXdTdGF0ZSA9IHsuLi5zdGF0ZX07XG5cbiAgbGF5ZXJJZHNUb1JlbW92ZS5mb3JFYWNoKGxheWVySWQgPT4ge1xuICAgIGNvbnN0IGlkeCA9IG5ld1N0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBsYXllcklkKTtcbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgIG5ld1N0YXRlID0gcmVtb3ZlTGF5ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWQ6IGxheWVySWR9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSByZW1vdmVFbGVtZW50RnJvbUxheWVyT3JkZXIobmV3U3RhdGUubGF5ZXJPcmRlciwgbGF5ZXJHcm91cFRvUmVtb3ZlKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyXG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBhIGxheWVyIGdyb3VwIChsYWJlbCwgdmlzaWJpbGl0eSwgbGF5ZXIgbWVtYmVyc2hpcClcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckdyb3VwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVMYXllckdyb3VwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWQsIG9wdGlvbnN9ID0gYWN0aW9uO1xuICBjb25zdCBsYXllckdyb3VwID0gZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKHN0YXRlLmxheWVyT3JkZXIsIGlkKTtcbiAgaWYgKCFsYXllckdyb3VwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgbGV0IG5ld1N0YXRlID0gey4uLnN0YXRlfTtcblxuICBpZiAob3B0aW9ucy5sYXllck9yZGVyKSB7XG4gICAgbmV3U3RhdGUubGF5ZXJPcmRlciA9IFsuLi5sYXllckdyb3VwLmxheWVyT3JkZXIsIC4uLm5ld1N0YXRlLmxheWVyT3JkZXJdO1xuICAgIG9wdGlvbnMubGF5ZXJPcmRlci5mb3JFYWNoKGxheWVySWQgPT4ge1xuICAgICAgbmV3U3RhdGUubGF5ZXJPcmRlciA9IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihcbiAgICAgICAgbmV3U3RhdGUubGF5ZXJPcmRlcixcbiAgICAgICAgbGF5ZXJJZCBhcyBzdHJpbmdcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBuZXdMYXllckdyb3VwID0ge1xuICAgIC4uLmxheWVyR3JvdXAsXG4gICAgLi4ub3B0aW9uc1xuICB9O1xuXG4gIGlmIChuZXdMYXllckdyb3VwLmlzVmlzaWJsZSAhPT0gbGF5ZXJHcm91cC5pc1Zpc2libGUpIHtcbiAgICBjb25zdCBsYXllcklkcyA9IGdldEZsYXRMYXllck9yZGVyKG5ld0xheWVyR3JvdXAubGF5ZXJPcmRlcik7XG4gICAgbmV3U3RhdGUgPSBuZXdTdGF0ZS5sYXllcnMucmVkdWNlKChhY2MsIGxheWVyKSA9PiB7XG4gICAgICBpZiAobGF5ZXJJZHMuaW5jbHVkZXMobGF5ZXIuaWQpKSB7XG4gICAgICAgIHJldHVybiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoYWNjLCB7XG4gICAgICAgICAgb2xkTGF5ZXI6IGxheWVyLFxuICAgICAgICAgIG5ld0NvbmZpZzoge2lzVmlzaWJsZTogbmV3TGF5ZXJHcm91cC5pc1Zpc2libGV9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBuZXdTdGF0ZSk7XG4gIH1cblxuICBjb25zdCBuZXdMYXllck9yZGVyID0gdXBkYXRlTGF5ZXJHcm91cEluTGF5ZXJPcmRlcihuZXdTdGF0ZS5sYXllck9yZGVyLCBuZXdMYXllckdyb3VwKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5uZXdTdGF0ZSxcbiAgICBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBhIGxheWVyIHRvIGEgbGF5ZXIgZ3JvdXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRMYXllclRvTGF5ZXJHcm91cFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkTGF5ZXJUb0xheWVyR3JvdXBVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtsYXllckdyb3VwSWQsIGxheWVySWR9ID0gYWN0aW9uO1xuICBjb25zdCBsYXllckdyb3VwID0gZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKHN0YXRlLmxheWVyT3JkZXIsIGxheWVyR3JvdXBJZCk7XG4gIGNvbnN0IGxheWVyID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsYXllcklkKTtcbiAgaWYgKCFsYXllckdyb3VwIHx8ICFsYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmIChsYXllckdyb3VwLmxheWVyT3JkZXIuZmluZChlbnRyeSA9PiBlbnRyeSA9PT0gbGF5ZXJJZCkpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdHcm91cExheWVyT3JkZXIgPSBhZGRMYXllck9yR3JvdXBUb0xheWVyT3JkZXIobGF5ZXJHcm91cC5sYXllck9yZGVyLCBsYXllcklkKTtcbiAgcmV0dXJuIHVwZGF0ZUxheWVyR3JvdXBVcGRhdGVyKHN0YXRlLCB7XG4gICAgaWQ6IGxheWVyR3JvdXBJZCxcbiAgICBvcHRpb25zOiB7bGF5ZXJPcmRlcjogbmV3R3JvdXBMYXllck9yZGVyfVxuICB9KTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgbGF5ZXIgZnJvbSBhIGxheWVyIGdyb3VwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlTGF5ZXJGcm9tTGF5ZXJHcm91cFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlTGF5ZXJGcm9tTGF5ZXJHcm91cFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2xheWVyR3JvdXBJZCwgbGF5ZXJJZH0gPSBhY3Rpb247XG4gIGNvbnN0IGxheWVyR3JvdXAgPSBnZXRMYXllckdyb3VwRnJvbUxheWVyT3JkZXIoc3RhdGUubGF5ZXJPcmRlciwgbGF5ZXJHcm91cElkKTtcbiAgaWYgKCFsYXllckdyb3VwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3TGF5ZXJHcm91cE9yZGVyID0gcmVtb3ZlRWxlbWVudEZyb21MYXllck9yZGVyKGxheWVyR3JvdXAubGF5ZXJPcmRlciwgbGF5ZXJJZCk7XG4gIHJldHVybiB1cGRhdGVMYXllckdyb3VwVXBkYXRlcihzdGF0ZSwge1xuICAgIGlkOiBsYXllckdyb3VwSWQsXG4gICAgb3B0aW9uczoge2xheWVyT3JkZXI6IG5ld0xheWVyR3JvdXBPcmRlcn1cbiAgfSk7XG59O1xuXG4vKipcbiAqIFN3YXAgbGF5ZXIgb3JkZXIgZW50cmllcyBiZXR3ZWVuIHJvb3QgYW5kIGdyb3Vwc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCBzd2FwTGF5ZXJPcmRlckVudHJpZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlN3YXBMYXllck9yZGVyRW50cmllc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge29yaWdpbkxheWVySWQsIGRlc3RpbmF0aW9uTGF5ZXJJZCwgb3JpZ2luTGF5ZXJHcm91cElkLCBkZXN0aW5hdGlvbkxheWVyR3JvdXBJZH0gPSBhY3Rpb247XG5cbiAgaWYgKCFvcmlnaW5MYXllckdyb3VwSWQgJiYgIWRlc3RpbmF0aW9uTGF5ZXJHcm91cElkKSB7XG4gICAgY29uc3Qgb3JpZ2luSW5kZXggPSBzdGF0ZS5sYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgICAgdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGVudHJ5ID09PSBvcmlnaW5MYXllcklkIDogZW50cnkuaWQgPT09IG9yaWdpbkxheWVySWRcbiAgICApO1xuICAgIGlmIChkZXN0aW5hdGlvbkxheWVySWQgJiYgb3JpZ2luSW5kZXggIT09IC0xKSB7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbkluZGV4ID0gc3RhdGUubGF5ZXJPcmRlci5maW5kSW5kZXgoZW50cnkgPT5cbiAgICAgICAgdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyA/IGVudHJ5ID09PSBkZXN0aW5hdGlvbkxheWVySWQgOiBlbnRyeS5pZCA9PT0gZGVzdGluYXRpb25MYXllcklkXG4gICAgICApO1xuICAgICAgaWYgKGRlc3RpbmF0aW9uSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBhcnJheU1vdmUoc3RhdGUubGF5ZXJPcmRlciwgb3JpZ2luSW5kZXgsIGRlc3RpbmF0aW9uSW5kZXgpO1xuICAgICAgICByZXR1cm4gey4uLnN0YXRlLCBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAob3JpZ2luTGF5ZXJHcm91cElkICYmICFkZXN0aW5hdGlvbkxheWVyR3JvdXBJZCkge1xuICAgIGxldCBuZXdMYXllck9yZGVyID0gcmVtb3ZlRWxlbWVudEZyb21MYXllck9yZGVyKHN0YXRlLmxheWVyT3JkZXIsIG9yaWdpbkxheWVySWQpO1xuICAgIGlmIChkZXN0aW5hdGlvbkxheWVySWQpIHtcbiAgICAgIGNvbnN0IGRlc3RpbmF0aW9uSW5kZXggPSBuZXdMYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgICAgICB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZW50cnkgPT09IGRlc3RpbmF0aW9uTGF5ZXJJZCA6IGZhbHNlXG4gICAgICApO1xuICAgICAgbmV3TGF5ZXJPcmRlci5zcGxpY2UoZGVzdGluYXRpb25JbmRleCA9PT0gLTEgPyAwIDogZGVzdGluYXRpb25JbmRleCwgMCwgb3JpZ2luTGF5ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyT3JkZXIgPSBbLi4ubmV3TGF5ZXJPcmRlciwgb3JpZ2luTGF5ZXJJZF07XG4gICAgfVxuICAgIHJldHVybiB7Li4uc3RhdGUsIGxheWVyT3JkZXI6IG5ld0xheWVyT3JkZXJ9O1xuICB9XG5cbiAgaWYgKG9yaWdpbkxheWVyR3JvdXBJZCAmJiBkZXN0aW5hdGlvbkxheWVyR3JvdXBJZCkge1xuICAgIGlmIChvcmlnaW5MYXllckdyb3VwSWQgPT09IGRlc3RpbmF0aW9uTGF5ZXJHcm91cElkKSB7XG4gICAgICBjb25zdCBsYXllckdyb3VwID0gZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKHN0YXRlLmxheWVyT3JkZXIsIG9yaWdpbkxheWVyR3JvdXBJZCk7XG4gICAgICBpZiAoIWxheWVyR3JvdXApIHJldHVybiBzdGF0ZTtcbiAgICAgIGNvbnN0IG9yaWdpbkluZGV4ID0gbGF5ZXJHcm91cC5sYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgICAgICB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnID8gZW50cnkgPT09IG9yaWdpbkxheWVySWQgOiBlbnRyeS5pZCA9PT0gb3JpZ2luTGF5ZXJJZFxuICAgICAgKTtcbiAgICAgIGlmIChvcmlnaW5JbmRleCA9PT0gLTEpIHJldHVybiBzdGF0ZTtcbiAgICAgIGlmIChkZXN0aW5hdGlvbkxheWVySWQpIHtcbiAgICAgICAgY29uc3QgZGVzdEluZGV4ID0gbGF5ZXJHcm91cC5sYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgICAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycgPyBlbnRyeSA9PT0gZGVzdGluYXRpb25MYXllcklkIDogZW50cnkuaWQgPT09IGRlc3RpbmF0aW9uTGF5ZXJJZFxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVzdEluZGV4ID09PSAtMSkgcmV0dXJuIHN0YXRlO1xuICAgICAgICBjb25zdCBuZXdHcm91cExheWVyT3JkZXIgPSBhcnJheU1vdmUobGF5ZXJHcm91cC5sYXllck9yZGVyLCBvcmlnaW5JbmRleCwgZGVzdEluZGV4KTtcbiAgICAgICAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IHVwZGF0ZUxheWVyR3JvdXBJbkxheWVyT3JkZXIoc3RhdGUubGF5ZXJPcmRlciwge1xuICAgICAgICAgIC4uLmxheWVyR3JvdXAsXG4gICAgICAgICAgbGF5ZXJPcmRlcjogbmV3R3JvdXBMYXllck9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gey4uLnN0YXRlLCBsYXllck9yZGVyOiBuZXdMYXllck9yZGVyfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICAvLyBDcm9zcy1ncm91cCBtb3ZlOiByZW1vdmUgZnJvbSBvcmlnaW4sIHRoZW4gYWRkIHRvIGRlc3RpbmF0aW9uXG4gICAgY29uc3QgbGF5ZXJPcmRlciA9IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihzdGF0ZS5sYXllck9yZGVyLCBvcmlnaW5MYXllcklkKTtcbiAgICBsZXQgbmV3U3RhdGUgPSBhZGRMYXllclRvTGF5ZXJHcm91cFVwZGF0ZXIoXG4gICAgICB7Li4uc3RhdGUsIGxheWVyT3JkZXJ9LFxuICAgICAge2xheWVySWQ6IG9yaWdpbkxheWVySWQsIGxheWVyR3JvdXBJZDogZGVzdGluYXRpb25MYXllckdyb3VwSWR9XG4gICAgKTtcblxuICAgIGlmIChkZXN0aW5hdGlvbkxheWVySWQpIHtcbiAgICAgIGNvbnN0IGxheWVyR3JvdXAgPSBnZXRMYXllckdyb3VwRnJvbUxheWVyT3JkZXIobmV3U3RhdGUubGF5ZXJPcmRlciwgZGVzdGluYXRpb25MYXllckdyb3VwSWQpO1xuICAgICAgaWYgKCFsYXllckdyb3VwKSByZXR1cm4gc3RhdGU7XG4gICAgICBjb25zdCBvcmlnaW5JbmRleCA9IGxheWVyR3JvdXAubGF5ZXJPcmRlci5maW5kSW5kZXgoZW50cnkgPT4gZW50cnkgPT09IG9yaWdpbkxheWVySWQpO1xuICAgICAgY29uc3QgZGVzdEluZGV4ID0gbGF5ZXJHcm91cC5sYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PiBlbnRyeSA9PT0gZGVzdGluYXRpb25MYXllcklkKTtcbiAgICAgIGlmIChvcmlnaW5JbmRleCAhPT0gLTEgJiYgZGVzdEluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBuZXdHcm91cExheWVyT3JkZXIgPSBhcnJheU1vdmUobGF5ZXJHcm91cC5sYXllck9yZGVyLCBvcmlnaW5JbmRleCwgZGVzdEluZGV4KTtcbiAgICAgICAgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgICAgbGF5ZXJPcmRlcjogdXBkYXRlTGF5ZXJHcm91cEluTGF5ZXJPcmRlcihuZXdTdGF0ZS5sYXllck9yZGVyLCB7XG4gICAgICAgICAgICAuLi5sYXllckdyb3VwLFxuICAgICAgICAgICAgbGF5ZXJPcmRlcjogbmV3R3JvdXBMYXllck9yZGVyXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgaWYgKCFvcmlnaW5MYXllckdyb3VwSWQgJiYgZGVzdGluYXRpb25MYXllckdyb3VwSWQpIHtcbiAgICBjb25zdCBsYXllck9yZGVyID0gcmVtb3ZlRWxlbWVudEZyb21MYXllck9yZGVyKHN0YXRlLmxheWVyT3JkZXIsIG9yaWdpbkxheWVySWQpO1xuICAgIHJldHVybiBhZGRMYXllclRvTGF5ZXJHcm91cFVwZGF0ZXIoXG4gICAgICB7Li4uc3RhdGUsIGxheWVyT3JkZXJ9LFxuICAgICAge2xheWVySWQ6IG9yaWdpbkxheWVySWQsIGxheWVyR3JvdXBJZDogZGVzdGluYXRpb25MYXllckdyb3VwSWR9XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogZHVwbGljYXRlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5EdXBsaWNhdGVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gTnVtYmVyLmlzRmluaXRlKGlkKVxuICAgID8gLy8gc3VwcG9ydCBvbGRlciBBUEksIHJlbW92ZSBsYXllciBieSBpZHhcbiAgICAgIE51bWJlcihpZClcbiAgICA6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8ICFzdGF0ZS5sYXllcnNbaWR4XSkge1xuICAgIENvbnNvbGUud2FybihgbGF5ZXIgJHtpZHh9IG5vdCBmb3VuZCBpbiBsYXllck9yZGVyYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcbiAgY29uc3Qgb3JpZ2luYWwgPSBsYXllcnNbaWR4XTtcblxuICBjb25zdCBvcmlnaW5hbExheWVyT3JkZXJJZHggPSBnZXRJbmRleEZyb21MYXllckVudHJ5SWQoc3RhdGUubGF5ZXJPcmRlciwgb3JpZ2luYWwuaWQpO1xuICBsZXQgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH1gO1xuICBsZXQgcG9zdGZpeCA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgd2hpbGUgKGxheWVycy5maW5kKGwgPT4gbC5jb25maWcubGFiZWwgPT09IG5ld0xhYmVsKSkge1xuICAgIG5ld0xhYmVsID0gYENvcHkgb2YgJHtvcmlnaW5hbC5jb25maWcubGFiZWx9ICR7Kytwb3N0Zml4fWA7XG4gIH1cblxuICAvLyBjb2xsZWN0IGxheWVyIGNvbmZpZyBmcm9tIG9yaWdpbmFsXG4gIGNvbnN0IGxvYWRlZExheWVyID0gc2VyaWFsaXplTGF5ZXIob3JpZ2luYWwsIHN0YXRlLnNjaGVtYSk7XG5cbiAgLy8gYXNzaWduIG5ldyBpZCBhbmQgbGFiZWwgdG8gY29waWVkIGxheWVyXG4gIGlmICghbG9hZGVkTGF5ZXI/LmNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsb2FkZWRMYXllci5jb25maWcubGFiZWwgPSBuZXdMYWJlbDtcbiAgbG9hZGVkTGF5ZXIuaWQgPSBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuXG4gIC8vIGFkZCBsYXllciB0byBzdGF0ZVxuICBsZXQgbmV4dFN0YXRlID0gYWRkTGF5ZXJVcGRhdGVyKHN0YXRlLCB7Y29uZmlnOiBsb2FkZWRMYXllcn0pO1xuICAvLyByZXRyaWV2ZSBuZXdseSBjcmVhdGVkIGxheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gbmV4dFN0YXRlLmxheWVyc1tuZXh0U3RhdGUubGF5ZXJzLmxlbmd0aCAtIDFdO1xuXG4gIC8vIENoZWNrIGlmIHRoZSBvcmlnaW5hbCBsYXllciBpcyBpbnNpZGUgYSBncm91cFxuICBjb25zdCBwYXJlbnRHcm91cCA9IGZpbmRQYXJlbnRHcm91cEZvckxheWVyKHN0YXRlLmxheWVyT3JkZXIsIG9yaWdpbmFsLmlkKTtcblxuICBpZiAocGFyZW50R3JvdXApIHtcbiAgICAvLyBMYXllciBpcyBpbnNpZGUgYSBncm91cCAtIHJlbW92ZSB0aGUgcHJlcGVuZGVkIGlkIGZyb20gcm9vdCBhbmQgaW5zZXJ0IGludG8gdGhlIGdyb3VwXG4gICAgY29uc3QgbGF5ZXJPcmRlcldpdGhvdXRQcmVwZW5kZWQgPSBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgxKTtcbiAgICBjb25zdCBpZHhJbkdyb3VwID0gcGFyZW50R3JvdXAubGF5ZXJPcmRlci5maW5kSW5kZXgoZSA9PiBlID09PSBvcmlnaW5hbC5pZCk7XG4gICAgY29uc3QgbmV3R3JvdXBMYXllck9yZGVyID0gYXJyYXlJbnNlcnQocGFyZW50R3JvdXAubGF5ZXJPcmRlciwgaWR4SW5Hcm91cCwgbmV3TGF5ZXIuaWQpO1xuICAgIGNvbnN0IHVwZGF0ZWRHcm91cCA9IHsuLi5wYXJlbnRHcm91cCwgbGF5ZXJPcmRlcjogbmV3R3JvdXBMYXllck9yZGVyfTtcbiAgICBjb25zdCBuZXdMYXllck9yZGVyID0gdXBkYXRlTGF5ZXJHcm91cEluTGF5ZXJPcmRlcihcbiAgICAgIGxheWVyT3JkZXJXaXRob3V0UHJlcGVuZGVkLFxuICAgICAgdXBkYXRlZEdyb3VwXG4gICAgKTtcbiAgICBuZXh0U3RhdGUgPSByZW9yZGVyTGF5ZXJVcGRhdGVyKG5leHRTdGF0ZSwge29yZGVyOiBuZXdMYXllck9yZGVyfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGF5ZXIgaXMgYXQgcm9vdCBsZXZlbCAtIHVzZSBvcmlnaW5hbCBpbmRleC1iYXNlZCBpbnNlcnRpb25cbiAgICBjb25zdCBuZXdMYXllck9yZGVyID0gYXJyYXlJbnNlcnQoXG4gICAgICBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgxLCBuZXh0U3RhdGUubGF5ZXJPcmRlci5sZW5ndGgpLFxuICAgICAgb3JpZ2luYWxMYXllck9yZGVySWR4LFxuICAgICAgbmV3TGF5ZXIuaWRcbiAgICApO1xuICAgIG5leHRTdGF0ZSA9IHJlb3JkZXJMYXllclVwZGF0ZXIobmV4dFN0YXRlLCB7b3JkZXI6IG5ld0xheWVyT3JkZXJ9KTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoXG4gICAgYWN0aW9uLmNvbmZpZz8udHlwZSA9PT0gTElHSFRfQU5EX1NIQURPV19FRkZFQ1QudHlwZSAmJlxuICAgIHN0YXRlLmVmZmVjdHMuc29tZShlZmZlY3QgPT4gZWZmZWN0LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGUpXG4gICkge1xuICAgIENvbnNvbGUud2FybihgQ2FuJ3QgYWRkIG1vcmUgdGhhbiBvbmUgJHtMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC5uYW1lfSBlZmZlY3RgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBpZiAoXG4gICAgYWN0aW9uLmNvbmZpZz8udHlwZSA9PT0gRElTVEFOQ0VfRk9HX1RZUEUgJiZcbiAgICBzdGF0ZS5lZmZlY3RzLnNvbWUoXG4gICAgICBlZmZlY3QgPT4gZWZmZWN0LnR5cGUgPT09IERJU1RBTkNFX0ZPR19UWVBFIHx8IGVmZmVjdC50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFXG4gICAgKVxuICApIHtcbiAgICBDb25zb2xlLndhcm4oXCJDYW4ndCBhZGQgbW9yZSB0aGFuIG9uZSBmb2cgZWZmZWN0XCIpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmIChcbiAgICBhY3Rpb24uY29uZmlnPy50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFICYmXG4gICAgc3RhdGUuZWZmZWN0cy5zb21lKFxuICAgICAgZWZmZWN0ID0+IGVmZmVjdC50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFIHx8IGVmZmVjdC50eXBlID09PSBESVNUQU5DRV9GT0dfVFlQRVxuICAgIClcbiAgKSB7XG4gICAgQ29uc29sZS53YXJuKFwiQ2FuJ3QgYWRkIG1vcmUgdGhhbiBvbmUgZm9nIGVmZmVjdFwiKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdFZmZlY3QgPSBjcmVhdGVFZmZlY3QoYWN0aW9uLmNvbmZpZyk7XG5cbiAgLy8gY29sbGFwc2UgY29uZmlndXJhdG9ycyBmb3Igb3RoZXIgZWZmZWN0c1xuICBzdGF0ZS5lZmZlY3RzLmZvckVhY2goZWZmZWN0ID0+IGVmZmVjdC5zZXRQcm9wcyh7aXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xuXG4gIGNvbnN0IGVmZmVjdHMgPSBbLi4uc3RhdGUuZWZmZWN0cywgbmV3RWZmZWN0XTtcbiAgY29uc3QgZWZmZWN0T3JkZXIgPSBmaXhFZmZlY3RPcmRlcihlZmZlY3RzLCBbbmV3RWZmZWN0LmlkLCAuLi5zdGF0ZS5lZmZlY3RPcmRlcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBzdGF0ZS5lZmZlY3RzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmVmZmVjdHMubGVuZ3RoKSB7XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHJlbW92ZSBlZmZlY3Qgd2l0aCBpbnZhbGlkIGlkICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2VmZmVjdHMsIGVmZmVjdE9yZGVyfSA9IHN0YXRlO1xuICBjb25zdCBlZmZlY3RUb1JlbW92ZSA9IGVmZmVjdHNbaWR4XTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeGVkIGluIHRzXG4gICAgZWZmZWN0czogZmlsdGVyT3V0QnlJZChlZmZlY3RUb1JlbW92ZS5pZCkoZWZmZWN0cyksXG4gICAgZWZmZWN0T3JkZXI6IGVmZmVjdE9yZGVyLmZpbHRlcihlZmZlY3RJZCA9PiBlZmZlY3RJZCAhPT0gZWZmZWN0VG9SZW1vdmUuaWQpXG4gIH07XG59O1xuXG4vKipcbiAqIFJlb3JkZXIgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZWZmZWN0T3JkZXI6IGZpeEVmZmVjdE9yZGVyKHN0YXRlLmVmZmVjdHMsIFsuLi5vcmRlcl0pXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIHByb3BzfTogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5lZmZlY3RzLmxlbmd0aCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgZWZmZWN0IHdpdGggaW52YWxpZCBpZCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxldCBlZmZlY3RPcmRlciA9IHN0YXRlLmVmZmVjdE9yZGVyO1xuICBpZiAocHJvcHMuaWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5pZCAhPT0gaWQpIHtcbiAgICBjb25zdCBpZHgyID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBwcm9wcy5pZCk7XG4gICAgaWYgKGlkeDIgPj0gMCkge1xuICAgICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHVwZGF0ZSBlZmZlY3Qgd2l0aCBleGlzdGluZyBlZmZlY3QgaWQgJHtpZH1gKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBlZmZlY3RPcmRlciA9IGVmZmVjdE9yZGVyLm1hcChlZmZlY3RPcmRlcklkID0+XG4gICAgICBlZmZlY3RPcmRlcklkID09PSBpZCA/IChwcm9wcy5pZCBhcyBzdHJpbmcpIDogZWZmZWN0T3JkZXJJZFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXdFZmZlY3RzID0gWy4uLnN0YXRlLmVmZmVjdHNdO1xuICBuZXdFZmZlY3RzW2lkeF0uc2V0UHJvcHMocHJvcHMpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0czogbmV3RWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLy8gQU5OT1RBVElPTiBVUERBVEVSU1xuXG5mdW5jdGlvbiBtYWtlTmV3QW5ub3RhdGlvbihjb25maWc/OiBBbm5vdGF0aW9uUHJvcHNQYXJ0aWFsKTogQW5ub3RhdGlvbiB7XG4gIGNvbnN0IGtpbmQgPSBjb25maWc/LmtpbmQgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0tJTkQ7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgaWQ6IGNvbmZpZz8uaWQgPz8gZ2VuZXJhdGVIYXNoSWQoNiksXG4gICAga2luZCxcbiAgICBpc1Zpc2libGU6IGNvbmZpZz8uaXNWaXNpYmxlID8/IHRydWUsXG4gICAgYXV0b1NpemU6IGNvbmZpZz8uYXV0b1NpemUgPz8gdHJ1ZSxcbiAgICBhdXRvU2l6ZVk6IGNvbmZpZz8uYXV0b1NpemVZID8/IHRydWUsXG4gICAgYW5jaG9yUG9pbnQ6IGNvbmZpZz8uYW5jaG9yUG9pbnQgPz8gKFswLCAwXSBhcyBbbnVtYmVyLCBudW1iZXJdKSxcbiAgICBsYWJlbDogY29uZmlnPy5sYWJlbCA/PyAnTmV3IEFubm90YXRpb24nLFxuICAgIGxpbmVDb2xvcjogY29uZmlnPy5saW5lQ29sb3IgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gICAgbGluZVdpZHRoOiBjb25maWc/LmxpbmVXaWR0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgICB0ZXh0V2lkdGg6IGNvbmZpZz8udGV4dFdpZHRoID8/IElOSVRJQUxfQU5OT1RBVElPTl9URVhUX1dJRFRILFxuICAgIHRleHRIZWlnaHQ6IGNvbmZpZz8udGV4dEhlaWdodCA/PyBJTklUSUFMX0FOTk9UQVRJT05fVEVYVF9IRUlHSFQsXG4gICAgdGV4dFZlcnRpY2FsQWxpZ246IGNvbmZpZz8udGV4dFZlcnRpY2FsQWxpZ24gPz8gKCdib3R0b20nIGFzIGNvbnN0KSxcbiAgICBtYXBJbmRleDogY29uZmlnPy5tYXBJbmRleFxuICB9O1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuUE9JTlQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5QT0lOVCxcbiAgICAgICAgYXJtTGVuZ3RoOiAoY29uZmlnIGFzIGFueSk/LmFybUxlbmd0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fQVJNX0xFTkdUSCxcbiAgICAgICAgYW5nbGU6IChjb25maWcgYXMgYW55KT8uYW5nbGUgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0FOR0xFXG4gICAgICB9O1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuQVJST1c6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5BUlJPVyxcbiAgICAgICAgYXJtTGVuZ3RoOiAoY29uZmlnIGFzIGFueSk/LmFybUxlbmd0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fQVJNX0xFTkdUSCxcbiAgICAgICAgYW5nbGU6IChjb25maWcgYXMgYW55KT8uYW5nbGUgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0FOR0xFXG4gICAgICB9O1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuQ0lSQ0xFOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogQW5ub3RhdGlvbktpbmQuQ0lSQ0xFLFxuICAgICAgICBhcm1MZW5ndGg6IChjb25maWcgYXMgYW55KT8uYXJtTGVuZ3RoID8/IElOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RILFxuICAgICAgICBhbmdsZTogKGNvbmZpZyBhcyBhbnkpPy5hbmdsZSA/PyBJTklUSUFMX0FOTk9UQVRJT05fQU5HTEUsXG4gICAgICAgIHJhZGl1c0luTWV0ZXJzOiAoY29uZmlnIGFzIGFueSk/LnJhZGl1c0luTWV0ZXJzID8/IDEwMDBcbiAgICAgIH07XG4gICAgY2FzZSBBbm5vdGF0aW9uS2luZC5URVhUOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5URVhUXG4gICAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGFubm90YXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRBbm5vdGF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBuZXdBbm5vdGF0aW9uID0gbWFrZU5ld0Fubm90YXRpb24oYWN0aW9uLmNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFtuZXdBbm5vdGF0aW9uLCAuLi5zdGF0ZS5hbm5vdGF0aW9uc10sXG4gICAgc2VsZWN0ZWRBbm5vdGF0aW9uSWQ6IG5ld0Fubm90YXRpb24uaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IHRydWVcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGFubm90YXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlQW5ub3RhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbm5vdGF0aW9uczogc3RhdGUuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gYS5pZCAhPT0gaWQpLFxuICAgIHNlbGVjdGVkQW5ub3RhdGlvbklkOiBzdGF0ZS5zZWxlY3RlZEFubm90YXRpb25JZCA9PT0gaWQgPyBudWxsIDogc3RhdGUuc2VsZWN0ZWRBbm5vdGF0aW9uSWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6XG4gICAgICBzdGF0ZS5zZWxlY3RlZEFubm90YXRpb25JZCA9PT0gaWQgPyBmYWxzZSA6IHN0YXRlLmlzRWRpdGluZ0Fubm90YXRpb25UZXh0XG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBhbiBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlQW5ub3RhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkLCBjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlQW5ub3RhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuYW5ub3RhdGlvbnMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgYW5ub3RhdGlvbiB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgcHJldiA9IHN0YXRlLmFubm90YXRpb25zW2lkeF07XG4gIGxldCBuZXh0QW5ub3RhdGlvbjogQW5ub3RhdGlvbjtcblxuICBpZiAoY29uZmlnLmtpbmQgJiYgY29uZmlnLmtpbmQgIT09IHByZXYua2luZCkge1xuICAgIG5leHRBbm5vdGF0aW9uID0gbWFrZU5ld0Fubm90YXRpb24oey4uLnByZXYsIC4uLmNvbmZpZ30gYXMgQW5ub3RhdGlvblByb3BzUGFydGlhbCk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEFubm90YXRpb24gPSB7Li4ucHJldiwgLi4uY29uZmlnfSBhcyBBbm5vdGF0aW9uO1xuICB9XG5cbiAgY29uc3QgbmV3QW5ub3RhdGlvbnMgPSBbLi4uc3RhdGUuYW5ub3RhdGlvbnNdO1xuICBuZXdBbm5vdGF0aW9uc1tpZHhdID0gbmV4dEFubm90YXRpb247XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IG5ld0Fubm90YXRpb25zXG4gIH07XG59O1xuXG4vKipcbiAqIER1cGxpY2F0ZSBhbiBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlQW5ub3RhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLkR1cGxpY2F0ZUFubm90YXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsID0gc3RhdGUuYW5ub3RhdGlvbnMuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgaWYgKCFvcmlnaW5hbCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCBkdXBsaWNhdGUgYW5ub3RhdGlvbiB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IHtcbiAgICAuLi5jbG9uZURlZXAob3JpZ2luYWwpLFxuICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg2KSxcbiAgICBsYWJlbDogYENvcHkgb2YgJHtvcmlnaW5hbC5sYWJlbH1gXG4gIH07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFtuZXdBbm5vdGF0aW9uLCAuLi5zdGF0ZS5hbm5vdGF0aW9uc10sXG4gICAgc2VsZWN0ZWRBbm5vdGF0aW9uSWQ6IG5ld0Fubm90YXRpb24uaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IGZhbHNlXG4gIH07XG59O1xuXG4vKipcbiAqIFNldCBzZWxlY3RlZCBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0U2VsZWN0ZWRBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIGlzRWRpdGluZ1RleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRBbm5vdGF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoXG4gICAgaWQgPT09IHN0YXRlLnNlbGVjdGVkQW5ub3RhdGlvbklkICYmXG4gICAgKGlzRWRpdGluZ1RleHQgPz8gZmFsc2UpID09PSBzdGF0ZS5pc0VkaXRpbmdBbm5vdGF0aW9uVGV4dFxuICApIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzZWxlY3RlZEFubm90YXRpb25JZDogaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IGlzRWRpdGluZ1RleHQgPz8gZmFsc2VcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0VXBkYXRlcjxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkYXRhc2V0czoge1tkYXRhc2V0S2V5XTogZGF0YXNldCwgLi4ubmV3RGF0YXNldHN9XG4gIH0gPSBzdGF0ZTtcblxuICBjb25zdCBsYXllcnNUb1JlbW92ZSA9IGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXRLZXkpLm1hcChsID0+IGwuaWQpO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGxldCBuZXdTdGF0ZSA9IGxheWVyc1RvUmVtb3ZlLnJlZHVjZSgoYWNjdSwgaWQpID0+IHJlbW92ZUxheWVyVXBkYXRlcihhY2N1LCB7aWR9KSwge1xuICAgIC4uLnN0YXRlLFxuICAgIGRhdGFzZXRzOiBuZXdEYXRhc2V0c1xuICB9KTtcblxuICAvLyB1cGRhdGUgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBuZXdTdGF0ZS5maWx0ZXJzKSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGZpbHRlci5kYXRhSWQuaW5kZXhPZihkYXRhc2V0S2V5KTtcbiAgICBpZiAodmFsdWVJbmRleCA+PSAwICYmIGZpbHRlci5kYXRhSWQubGVuZ3RoID4gMSkge1xuICAgICAgLy8gb25seSByZW1vdmUgb25lIHN5bmNlZCBkYXRhc2V0IGZyb20gdGhlIGZpbHRlclxuICAgICAgZmlsdGVycy5wdXNoKF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVJbmRleCA8IDApIHtcbiAgICAgIC8vIGxlYXZlIHRoZSBmaWx0ZXIgYXMgaXNcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1N0YXRlID0gey4uLm5ld1N0YXRlLCBmaWx0ZXJzfTtcblxuICByZXR1cm4gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhuZXdTdGF0ZSwge2RhdGFJZDogZGF0YXNldEtleX0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnKHN0YXRlLCB7ZGF0YUlkfSkge1xuICBsZXQge2ludGVyYWN0aW9uQ29uZmlnfSA9IHN0YXRlO1xuICBjb25zdCB7dG9vbHRpcH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcbiAgaWYgKHRvb2x0aXApIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRvb2x0aXA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHtbZGF0YUlkXTogZmllbGRzLCAuLi5maWVsZHNUb1Nob3d9ID0gY29uZmlnLmZpZWxkc1RvU2hvdztcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDogey4uLnRvb2x0aXAsIGNvbmZpZzogey4uLmNvbmZpZywgZmllbGRzVG9TaG93fX1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9O1xufVxuLyoqXG4gKiB1cGRhdGUgbGF5ZXIgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIHVwZGF0ZSBvdmVybGF5IGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBvdmVybGF5QmxlbmRpbmc6IGFjdGlvbi5tb2RlXG59KTtcblxuLyoqXG4gKiBEaXNwbGF5IGRhdGFzZXQgdGFibGUgaW4gYSBtb2RhbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNob3dEYXRhc2V0VGFibGVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdGluZ0RhdGFzZXQ6IGFjdGlvbi5kYXRhSWRcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGN1c3RvbSBjb2xvciBmb3IgZGF0YXNldHMgYW5kIGxheWVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRDb2xvclVwZGF0ZXJcbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7Y29sb3I6IGFjdGlvbi5uZXdDb2xvcn19KTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7fSwgb3B0aW9ucyA9IHt9fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKCFjb25maWcudmlzU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7a2VlcEV4aXN0aW5nQ29uZmlnfSA9IG9wdGlvbnM7XG5cbiAgLy8gcmVzZXQgY29uZmlnIGlmIGtlZXBFeGlzdGluZ0NvbmZpZyBpcyBmYWxzeVxuICBsZXQgbWVyZ2VkU3RhdGUgPSAha2VlcEV4aXN0aW5nQ29uZmlnID8gcmVzZXRNYXBDb25maWdVcGRhdGVyKHN0YXRlKSA6IHN0YXRlO1xuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBzdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBoYXNQcm9wc1RvTWVyZ2UoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCkpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKFxuICAgICAgICBtZXJnZWRTdGF0ZSxcbiAgICAgICAgZ2V0UHJvcFZhbHVlVG9NZXJnZXIoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKSxcbiAgICAgICAgLy8gZnJvbUNvbmZpZ1xuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBob3ZlciBldmVudCB3aXRoIGhvdmVyZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJIb3ZlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckhvdmVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGhvdmVySW5mbzoge1xuICAgIC8vIGRlY2suZ2wgaW5mbyBpcyBtdXRhYmxlXG4gICAgLi4uYWN0aW9uLmluZm8sXG4gICAgLi4uKE51bWJlci5pc0Zpbml0ZShhY3Rpb24ubWFwSW5kZXgpID8ge21hcEluZGV4OiBhY3Rpb24ubWFwSW5kZXh9IDoge30pXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Pbk1hcENsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG51bGxcbiAgfTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgbW92ZSBldmVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1vdXNlTW92ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2V2dH06IFZpc1N0YXRlQWN0aW9ucy5Pbk1vdXNlTW92ZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUuaW50ZXJhY3Rpb25Db25maWcpLnNvbWUoY29uZmlnID0+IGNvbmZpZy5lbmFibGVkKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1vdXNlUG9zOiB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQucG9pbnQpID8ge21vdXNlUG9zaXRpb246IFsuLi5ldnQucG9pbnRdfSA6IHt9KSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LmxuZ0xhdCkgPyB7Y29vcmRpbmF0ZTogWy4uLmV2dC5sbmdMYXRdfSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGZvciBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gIHN0YXRlLnNwbGl0TWFwcyAmJiBzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID09PSAwXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGFuIGFycmF5IHRvIHN0b3JlIHN0YXRlIGZvciBhIHNpbmdsZSBtYXAgYXMgd2VsbFxuICAgICAgICAvLyBpZiBjdXJyZW50IG1hcHMgbGVuZ3RoIGlzIGVxdWFsIHRvIDAgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3BsaXQgdGhlIHZpZXdcbiAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMoc3RhdGUubGF5ZXJzLCB7ZHVwbGljYXRlOiBmYWxzZX0pXG4gICAgICB9XG4gICAgOiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleChzdGF0ZSwgYWN0aW9uKTtcblxuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGluIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHttYXBJbmRleCwgbGF5ZXJJZH06IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckZvck1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3NwbGl0TWFwc30gPSBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogc3BsaXRNYXBzLm1hcCgoc20sIGkpID0+XG4gICAgICBpID09PSBtYXBJbmRleFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXSxcbiAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAuLi5zcGxpdE1hcHNbaV0ubGF5ZXJzLFxuICAgICAgICAgICAgICAvLyBpZiBsYXllcklkIG5vdCBpbiBsYXllcnMsIHNldCBpdCB0byB2aXNpYmxlXG4gICAgICAgICAgICAgIFtsYXllcklkXTogIXNwbGl0TWFwc1tpXS5sYXllcnNbbGF5ZXJJZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc21cbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcblxuICAvLyBhcHBseSBjb25maWcgaWYgcGFzc2VkIGZyb20gYWN0aW9uXG4gIC8vIFRPRE86IHdlIGRvbid0IGhhbmRsZSBhc3luYyBtZXJnZXJzIGhlcmUgeWV0XG4gIGxldCB1cGRhdGVkU3RhdGUgPSBjb25maWdcbiAgICA/IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIHBheWxvYWQ6IHtjb25maWcsIG9wdGlvbnN9XG4gICAgICB9KVxuICAgIDogc3RhdGU7XG5cbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG4gIGlmICghZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVwZGF0ZWRTdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZURhdGFzZXRUYXNrczogVGFza1tdID0gW107XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRhc2tzOiBUYXNrW10gPSBbXTtcblxuICBkYXRhc2V0cy5mb3JFYWNoKCh7aW5mbyA9IHt9LCAuLi5yZXN0fSwgZGF0YXNldEluZGV4KSA9PiB7XG4gICAgY29uc3QgdGFzayA9IGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKTtcbiAgICBpZiAodGFzaykge1xuICAgICAgY3JlYXRlRGF0YXNldFRhc2tzLnB1c2godGFzayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vdGlmaWNhdGlvblRhc2tzLnB1c2goXG4gICAgICAgIEFDVElPTl9UQVNLX0FERF9OT1RJRklDQVRJT04oKS5tYXAoKCkgPT5cbiAgICAgICAgICBhZGROb3RpZmljYXRpb24oXG4gICAgICAgICAgICBlcnJvck5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGRhdGFzZXQgZHVlIHRvIGRhdGEgdmVyaWZpY2F0aW9uIGVycm9yc2AsXG4gICAgICAgICAgICAgIGlkOiBgZGF0YXNldC1mYWlsZWQtJHtkYXRhc2V0SW5kZXh9YFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBkYXRhc2V0c0FsbFNldHRsZWRUYXNrID0gY3JlYXRlRGF0YXNldFRhc2tzLmxlbmd0aFxuICAgID8gVGFzay5hbGxTZXR0bGVkKGNyZWF0ZURhdGFzZXRUYXNrcykubWFwKHJlc3VsdHMgPT5cbiAgICAgICAgY3JlYXRlTmV3RGF0YXNldFN1Y2Nlc3Moe3Jlc3VsdHMsIGFkZFRvTWFwT3B0aW9uczogb3B0aW9uc30pXG4gICAgICApXG4gICAgOiBudWxsO1xuXG4gIGlmIChkYXRhc2V0c0FsbFNldHRsZWRUYXNrKSB7XG4gICAgdXBkYXRlZFN0YXRlID0gc2V0TG9hZGluZ0luZGljYXRvclVwZGF0ZXIodXBkYXRlZFN0YXRlLCBwYXlsb2FkXyh7Y2hhbmdlOiAxLCB0eXBlOiAnJ30pKTtcbiAgfVxuXG4gIHJldHVybiB3aXRoVGFzayh1cGRhdGVkU3RhdGUsIFtcbiAgICAuLi4oZGF0YXNldHNBbGxTZXR0bGVkVGFzayA/IFtkYXRhc2V0c0FsbFNldHRsZWRUYXNrXSA6IFtdKSxcbiAgICAuLi5ub3RpZmljYXRpb25UYXNrc1xuICBdKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPENyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzUGF5bG9hZD5cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3Jlc3VsdHMsIGFkZFRvTWFwT3B0aW9uc30gPSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3Qgbm90aWZpY2F0aW9uVGFza3M6IFRhc2tbXSA9IFtdO1xuXG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gcmVzdWx0cy5yZWR1Y2UoKGFjY3UsIHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICBjb25zdCBkYXRhc2V0ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgcmV0dXJuIHsuLi5hY2N1LCBbZGF0YXNldC5pZF06IGRhdGFzZXR9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaG93IGVycm9yIG5vdGlmaWNhdGlvbiBvbiBVSVxuICAgICAgbm90aWZpY2F0aW9uVGFza3MucHVzaChcbiAgICAgICAgQUNUSU9OX1RBU0soKS5tYXAoKCkgPT5cbiAgICAgICAgICBhZGROb3RpZmljYXRpb24oXG4gICAgICAgICAgICBlcnJvck5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBEYXRhc2V0IGVycm9yOiBGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGRhdGFzZXQ6XG4gICAgICAgICAgICAgICR7cmVzdWx0LnJlYXNvbiB8fCAocmVzdWx0IGFzIGFueSkudmFsdWV9YCxcbiAgICAgICAgICAgICAgaWQ6IGBkYXRhc2V0LWNyZWF0ZS1mYWlsZWQtJHtpZHh9YFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG4gIH0sIHt9IGFzIERhdGFzZXRzKTtcbiAgLy8gc2F2ZSBuZXcgZGF0YXNldCBlbnRyeSB0byBzdGF0ZVxuICBjb25zdCBtZXJnZWRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBkYXRhc2V0czogbWVyZ2VEYXRhc2V0c0J5T3JkZXIoc3RhdGUsIG5ld0RhdGFFbnRyaWVzKVxuICB9O1xuXG4gIC8vIG1lcmdlIHN0YXRlIHdpdGggY29uZmlnIHRvIGJlIG1lcmdlZFxuICBjb25zdCBsYXllck1lcmdlcnMgPSBzdGF0ZS5tZXJnZXJzLmZpbHRlcihtID0+IG0ud2FpdEZvckxheWVyRGF0YSk7XG4gIGNvbnN0IGRhdGFzZXRNZXJnZXJzID0gc3RhdGUubWVyZ2Vycy5maWx0ZXIobSA9PiAhbGF5ZXJNZXJnZXJzLmluY2x1ZGVzKG0pKTtcblxuICBjb25zdCBuZXdEYXRhSWRzID0gT2JqZWN0LmtleXMobmV3RGF0YUVudHJpZXMpO1xuICBjb25zdCBwb3N0TWVyZ2VyUGF5bG9hZCA9IHtcbiAgICBuZXdEYXRhSWRzLFxuICAgIG9wdGlvbnM6IGFkZFRvTWFwT3B0aW9ucyxcbiAgICBsYXllck1lcmdlcnNcbiAgfTtcblxuICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhcHBseU1lcmdlcnNVcGRhdGVyKG1lcmdlZFN0YXRlLCB7XG4gICAgbWVyZ2VyczogZGF0YXNldE1lcmdlcnMsXG4gICAgcG9zdE1lcmdlclBheWxvYWRcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHNldExvYWRpbmdJbmRpY2F0b3JVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwgcGF5bG9hZF8oe2NoYW5nZTogLTF9KSksXG4gICAgbm90aWZpY2F0aW9uVGFza3NcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1lcmdlcnNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG1lcmdlcnM6IE1lcmdlcjxhbnk+W107XG4gICAgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkO1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHttZXJnZXJzLCBwb3N0TWVyZ2VyUGF5bG9hZH0gPSBhY3Rpb247XG5cbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IG1lcmdlU3RhdGVSZXN1bHQgPSBtZXJnZVN0YXRlRnJvbU1lcmdlcnMoXG4gICAgc3RhdGUsXG4gICAge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICAuLi5zdGF0ZS5pbml0aWFsU3RhdGVcbiAgICB9LFxuICAgIG1lcmdlcnMsXG4gICAgLy8gbmV3RGF0YUlkcyxcbiAgICBwb3N0TWVyZ2VyUGF5bG9hZFxuICApO1xuXG4gIC8vIGlmIGFsbCBtZXJnZWQsIGtpY2t1cCBwb3N0IG1lcmdlIHByb2Nlc3NcbiAgLy8gaWYgbm90IHdhaXRcbiAgcmV0dXJuIG1lcmdlU3RhdGVSZXN1bHQuYWxsTWVyZ2VkXG4gICAgPyBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlU3RhdGVSZXN1bHQubWVyZ2VkU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkKVxuICAgIDogbWVyZ2VTdGF0ZVJlc3VsdC5tZXJnZWRTdGF0ZTtcbn1cblxuLyoqIFJlYWRzIGBvcHRpb25zLmxheWVyVmlzQ29uZmlnYCBmcm9tIGFkZC1kYXRhLXRvLW1hcCAoc2VlIGBBZGREYXRhVG9NYXBPcHRpb25zYCkuICovXG5mdW5jdGlvbiBsYXllclZpc0NvbmZpZ0Zyb21BZGREYXRhT3B0aW9ucyhcbiAgb3B0aW9uczogUG9zdE1lcmdlclBheWxvYWRbJ29wdGlvbnMnXSB8IHVuZGVmaW5lZFxuKTogUGFydGlhbDxMYXllclZpc0NvbmZpZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIW9wdGlvbnMgfHwgISgnbGF5ZXJWaXNDb25maWcnIGluIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBwYXRjaCA9IChvcHRpb25zIGFzIHtsYXllclZpc0NvbmZpZz86IHVua25vd259KS5sYXllclZpc0NvbmZpZztcbiAgaWYgKHBhdGNoID09IG51bGwgfHwgdHlwZW9mIHBhdGNoICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhdGNoIGFzIFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+O1xufVxuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICovXG5mdW5jdGlvbiBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlZFN0YXRlOiBWaXNTdGF0ZSwgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkKTogVmlzU3RhdGUge1xuICBjb25zdCB7bmV3RGF0YUlkcywgb3B0aW9ucywgbGF5ZXJNZXJnZXJzfSA9IHBvc3RNZXJnZXJQYXlsb2FkO1xuICBjb25zdCBuZXdGaWx0ZXJzID0gbWVyZ2VkU3RhdGUuZmlsdGVycy5maWx0ZXIoZiA9PlxuICAgIGYuZGF0YUlkLmZpbmQoZkRhdGFJZCA9PiBuZXdEYXRhSWRzLmluY2x1ZGVzKGZEYXRhSWQpKVxuICApO1xuICBjb25zdCBkYXRhc2V0RmlsdGVyZWQ6IHN0cmluZ1tdID0gdW5pcShcbiAgICBuZXdGaWx0ZXJzLnJlZHVjZSgoYWNjdSwgZikgPT4gWy4uLmFjY3UsIC4uLmYuZGF0YUlkXSwgW10gYXMgc3RyaW5nW10pXG4gICk7XG4gIGNvbnN0IGRhdGFFbXB0eSA9IG5ld0RhdGFJZHMubGVuZ3RoIDwgMTtcblxuICBsZXQgbmV3TGF5ZXJzID0gIWRhdGFFbXB0eVxuICAgID8gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBuZXdEYXRhSWRzLmluY2x1ZGVzKGwuY29uZmlnLmRhdGFJZCkpXG4gICAgOiBbXTtcblxuICBjb25zdCBuZXdEYXRhRW50cmllcyA9IG5ld0RhdGFJZHMucmVkdWNlKFxuICAgIChhY2N1LCBpZCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbaWRdOiBtZXJnZWRTdGF0ZS5kYXRhc2V0c1tpZF1cbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIGlmICghbmV3TGF5ZXJzLmxlbmd0aCAmJiAob3B0aW9ucyB8fCB7fSkuYXV0b0NyZWF0ZUxheWVycyAhPT0gZmFsc2UpIHtcbiAgICAvLyBubyBsYXllciBtZXJnZWQsIGZpbmQgZGVmYXVsdHNcbiAgICBjb25zdCByZXN1bHQgPSBhZGREZWZhdWx0TGF5ZXJzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllcyk7XG4gICAgbWVyZ2VkU3RhdGUgPSByZXN1bHQuc3RhdGU7XG4gICAgbmV3TGF5ZXJzID0gcmVzdWx0Lm5ld0xheWVycztcbiAgfVxuXG4gIGlmIChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgLy8gaWYgbWFwIGlzIHNwbGl0LCBhZGQgbmV3IGxheWVycyB0byBzcGxpdE1hcHNcbiAgICBuZXdMYXllcnMgPSBtZXJnZWRTdGF0ZS5sYXllcnMuZmlsdGVyKFxuICAgICAgbCA9PiBsLmNvbmZpZy5kYXRhSWQgJiYgbmV3RGF0YUlkcy5pbmNsdWRlcyhsLmNvbmZpZy5kYXRhSWQpXG4gICAgKTtcbiAgICBtZXJnZWRTdGF0ZSA9IHtcbiAgICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKG1lcmdlZFN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXJzKVxuICAgIH07XG4gIH1cblxuICBtZXJnZWRTdGF0ZSA9IG1lcmdlTGF5ZXJWaXNDb25maWdGb3JOZXdEYXRhc2V0cyhcbiAgICBtZXJnZWRTdGF0ZSxcbiAgICBsYXllclZpc0NvbmZpZ0Zyb21BZGREYXRhT3B0aW9ucyhvcHRpb25zKSxcbiAgICBuZXdEYXRhSWRzXG4gICk7XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIG5ld0RhdGFJZHMuZm9yRWFjaChkYXRhSWQgPT4ge1xuICAgIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBtZXJnZWRTdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICAvLyBsb2FkaW5nIGRhdGFzZXQ6IGF1dG9DcmVhdGVUb29sdGlwcyBpcyBmYWxzZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBydW4gYWRkRGVmYXVsdFRvb2x0aXBzIHdoZW4gdG9vbHRpcEZpZWxkcyBpcyBlbXB0eVxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmF1dG9DcmVhdGVUb29sdGlwcyAhPT0gZmFsc2UgJiZcbiAgICAgICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICAvLyBhZGRpbmcgZGF0YXNldDogYXV0b0NyZWF0ZVRvb2x0aXBzIGlzIHRydWVcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZWREYXRhc2V0cyA9IGRhdGFFbXB0eVxuICAgID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpXG4gICAgOiB1bmlxKE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5jb25jYXQoZGF0YXNldEZpbHRlcmVkKSk7XG5cbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShtZXJnZWRTdGF0ZSwgdXBkYXRlZERhdGFzZXRzLCB1bmRlZmluZWQpO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICAvLyB0cnkgdG8gcHJvY2VzcyBsYXllck1lcmdlcnMgYWZ0ZXIgZGF0YXNldCtkYXRhc2V0TWVyZ2Vyc1xuICB1cGRhdGVkU3RhdGUgPVxuICAgIGxheWVyTWVyZ2VycyAmJiBsYXllck1lcmdlcnMubGVuZ3RoID4gMFxuICAgICAgPyBhcHBseU1lcmdlcnNVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwge1xuICAgICAgICAgIG1lcmdlcnM6IGxheWVyTWVyZ2VycyxcbiAgICAgICAgICBwb3N0TWVyZ2VyUGF5bG9hZDogey4uLnBvc3RNZXJnZXJQYXlsb2FkLCBsYXllck1lcmdlcnM6IFtdfVxuICAgICAgICB9KVxuICAgICAgOiB1cGRhdGVkU3RhdGU7XG5cbiAgLy8gY2VudGVyIHRoZSBtYXAgb25jZSB0aGUgZGF0YXNldCBpcyBjcmVhdGVkXG4gIGlmIChuZXdMYXllcnMubGVuZ3RoICYmIChvcHRpb25zIHx8IHt9KS5jZW50ZXJNYXApIHtcbiAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKG5ld0xheWVycyk7XG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgY29uc3QgZml0Qm91bmRzVGFzayA9IEFDVElPTl9UQVNLX0ZJVF9CT1VORFMoKS5tYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gZml0TWFwQm91bmRzKGJvdW5kcyk7XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZWRTdGF0ZSA9IHdpdGhUYXNrKHVwZGF0ZWRTdGF0ZSwgZml0Qm91bmRzVGFzayk7XG4gICAgfVxuICB9XG5cbiAgLy8gbmVlZCB0byBjZW50ZXIgbWFwIGhlcmUgaWYgd2UgaGF2ZSBuZXcgbGF5ZXJzXG4gIHJldHVybiB1cGRhdGVkU3RhdGU7XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZURhdGFzZXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbmFtZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBwcm9wczoge2xhYmVsOiBhY3Rpb24ubGFiZWx9fSk7XG59XG5cbmNvbnN0IEFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMgPSBbJ2xhYmVsJywgJ2NvbG9yJywgJ21ldGFkYXRhJ107XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBkYXRhc2V0LlxuICogTWFrZXMgc3VyZSBlYWNoIHByb3BlcnR5IGlzIGluIHRoZSBhbGxvd2VkIGxpc3RcbiAqIE1ha2VzIHN1cmUgY29sb3IgdmFsdWUgaXMgUkdCXG4gKiBQZXJmb3JtcyBkZWVwIG1lcmdlIHdoZW4gdXBkYXRpbmcgbWV0YWRhdGFcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMgPSAocHJvcHMsIGRhdGFzZXQpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgLy8gaXMgaXQgYWxsb3dlZCA/XG4gICAgaWYgKCFBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGFkZGluZyBhIGNvbG9yIGJ1dCBpdCBpcyBub3QgUkdCIHdlIGRvbid0IGFjY2VwdCB0aGUgdmFsdWVcbiAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIHdlIGFkZCBtb3JlIHByb3BzIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyBpZiBpbnRvIGEgc3dpdGNoXG4gICAgaWYgKGtleSA9PT0gJ2NvbG9yJyAmJiAhaXNSZ2JDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gZG8gd2UgbmVlZCBkZWVwIG1lcmdlID9cbiAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGlzUGxhaW5PYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGRhdGFzZXRba2V5XSB8fCB7fSwgdmFsdWUpIDogdmFsdWV9O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlZFByb3BzO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgRGF0YXNldCBwcm9wcyAobGFiZWwsIGNvbG9yLCBtZXRhKS4gRG8gbm90IHVzZSB0byB1cGRhdGUgZGF0YSBvciBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtkYXRhSWQsIHByb3BzfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuICBjb25zdCBleGlzdGluZyA9IGRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyhwcm9wcywgZXhpc3RpbmcpO1xuICAgIC8vICB2YWxpZGF0ZSBwcm9wczoganVzdCBjb2xvciBmb3Igbm93XG4gICAgLy8gIHdlIG9ubHkgYWxsb3cgbGFiZWwsIGNvbG9yIGFuZCBtZXRhIHRvIGJlIHVwZGF0ZWRcbiAgICAvLyBjb25zdCBuZXdUYWJsZSA9IGNvcHlUYWJsZUFuZFVwZGF0ZShleGlzdGluZywgdmFsaWRhdGVkUHJvcHMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcylcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFdoZW4gYSB1c2VyIGNsaWNrcyBvbiB0aGUgc3BlY2lmaWMgbWFwIGNsb3NpbmcgaWNvblxuICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2xvc2UgdGhlIHNlbGVjdGVkIG1hcFxuICogYW5kIHdpbGwgbWVyZ2UgdGhlIHJlbWFpbmluZyBvbmUgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlXG4gKiBUT0RPOiBpIHRoaW5rIGluIHRoZSBmdXR1cmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBtZXJnZSBtYXAgbGF5ZXJzIHdpdGggZ2xvYmFsIHNldHRpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgYHZpc1N0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBhY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VTcGVjaWZpY01hcEF0SW5kZXg8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIC8vIHJldHJpZXZlIGxheWVycyBtZXRhIGRhdGEgZnJvbSB0aGUgcmVtYWluaW5nIG1hcCB0aGF0IHdlIG5lZWQgdG8ga2VlcFxuICBjb25zdCBpbmRleFRvUmV0cmlldmUgPSAxIC0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG1hcExheWVycyA9IHN0YXRlLnNwbGl0TWFwc1tpbmRleFRvUmV0cmlldmVdPy5sYXllcnM7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG5cbiAgLy8gdXBkYXRlIGxheWVyIHZpc2liaWxpdHlcbiAgY29uc3QgbmV3TGF5ZXJzID0gbGF5ZXJzLm1hcChsYXllciA9PlxuICAgIG1hcExheWVycyAmJiAhbWFwTGF5ZXJzW2xheWVyLmlkXSAmJiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBpdCBzaG91bGQgYmUgaW5WaXNpYmxlXG4gICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgOiBsYXllclxuICApO1xuXG4gIC8vIGRlbGV0ZSBtYXBcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBzcGxpdE1hcHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtmaWxlcywgb25GaW5pc2ggPSBsb2FkRmlsZXNTdWNjZXNzfSA9IGFjdGlvbjtcbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWxlTG9hZGluZ1Byb2dyZXNzID0gQXJyYXkuZnJvbShmaWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBmLCBpKSA9PiBtZXJnZV8oaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZiwgaSkpKGFjY3UpLFxuICAgIHt9XG4gICk7XG5cbiAgY29uc3QgZmlsZUxvYWRpbmcgPSB7XG4gICAgZmlsZUNhY2hlOiBbXSxcbiAgICBmaWxlc1RvTG9hZDogZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBtZXJnZV8oe2ZpbGVMb2FkaW5nUHJvZ3Jlc3MsIGZpbGVMb2FkaW5nfSkoc3RhdGUpO1xuXG4gIHJldHVybiBsb2FkTmV4dEZpbGVVcGRhdGVyKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFN1Y2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZVN0ZXBTdWNjZXNzQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVOYW1lLCBmaWxlQ2FjaGV9ID0gYWN0aW9uO1xuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNofSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAxLCBtZXNzYWdlOiAnRG9uZSd9XG4gIH0pO1xuXG4gIC8vIHNhdmUgcHJvY2Vzc2VkIGZpbGUgdG8gZmlsZUNhY2hlXG4gIGNvbnN0IHN0YXRlV2l0aENhY2hlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlQ2FjaGV9KSkoc3RhdGVXaXRoUHJvZ3Jlc3MpO1xuXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBzdGF0ZVdpdGhDYWNoZSxcbiAgICBERUxBWV9UQVNLKDIwMCkubWFwKGZpbGVzVG9Mb2FkLmxlbmd0aCA/IGxvYWROZXh0RmlsZSA6ICgpID0+IG9uRmluaXNoKGZpbGVDYWNoZSkpXG4gICk7XG59XG5cbi8vIHdpdGhUYXNrPFQ+KHN0YXRlOiBULCB0YXNrOiBhbnkpOiBUXG5cbi8qKlxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTmV4dEZpbGVVcGRhdGVyKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWR9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IFtmaWxlLCAuLi5yZW1haW5pbmdGaWxlc1RvTG9hZF0gPSBmaWxlc1RvTG9hZDtcblxuICAvLyBzYXZlIGZpbGVzVG9Mb2FkIHRvIHN0YXRlXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHBpY2tfKCdmaWxlTG9hZGluZycpKG1lcmdlXyh7ZmlsZXNUb0xvYWQ6IHJlbWFpbmluZ0ZpbGVzVG9Mb2FkfSkpKHN0YXRlKTtcblxuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKG5leHRTdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAwLCBtZXNzYWdlOiAnbG9hZGluZy4uLid9XG4gIH0pO1xuXG4gIGNvbnN0IHtsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBzdGF0ZTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIG1ha2VMb2FkRmlsZVRhc2soXG4gICAgICBmaWxlLFxuICAgICAgbmV4dFN0YXRlLmZpbGVMb2FkaW5nICYmIG5leHRTdGF0ZS5maWxlTG9hZGluZy5maWxlQ2FjaGUsXG4gICAgICBsb2FkZXJzLFxuICAgICAgbG9hZE9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9hZEZpbGVUYXNrKGZpbGUsIGZpbGVDYWNoZSwgbG9hZGVyczogTG9hZGVyW10gPSBbXSwgbG9hZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gTE9BRF9GSUxFX1RBU0soe2ZpbGUsIGZpbGVDYWNoZSwgbG9hZGVycywgbG9hZE9wdGlvbnN9KS5iaW1hcChcbiAgICAvLyBwcmV0dGllciBpZ25vcmVcbiAgICAvLyBzdWNjZXNzXG4gICAgZ2VuID0+XG4gICAgICBuZXh0RmlsZUJhdGNoKHtcbiAgICAgICAgZ2VuLFxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBvbkZpbmlzaDogcmVzdWx0ID0+XG4gICAgICAgICAgcHJvY2Vzc0ZpbGVDb250ZW50KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGZpbGVDYWNoZVxuICAgICAgICAgIH0pXG4gICAgICB9KSxcblxuICAgIC8vIGVycm9yXG4gICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlLm5hbWUsIGVycilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29udGVudCwgZmlsZUNhY2hlfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdwcm9jZXNzaW5nLi4uJ31cbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFBST0NFU1NfRklMRV9EQVRBKHtjb250ZW50LCBmaWxlQ2FjaGV9KS5iaW1hcChcbiAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSwgZmlsZUNhY2hlOiByZXN1bHR9KSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoY29udGVudC5maWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvZ3Jlc3MocHJldlByb2dyZXNzID0ge30sIHByb2dyZXNzKSB7XG4gIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlY2VpdmluZyBxdWVyeSBtZXRhZGF0YSBvciBvdGhlciBjYXNlcyB3ZSBkb24ndFxuICAvLyBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhlIHVzZXIuXG4gIGlmICghcHJvZ3Jlc3MgfHwgIXByb2dyZXNzLnBlcmNlbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmNlbnQ6IHByb2dyZXNzLnBlcmNlbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBnZXRzIGNhbGxlZCB3aXRoIHBheWxvYWQgPSBBc3luY0dlbmVyYXRvcjw/Pz8+XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbmV4dEZpbGVCYXRjaFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtnZW4sIGZpbGVOYW1lLCBwcm9ncmVzcywgYWNjdW11bGF0ZWQsIG9uRmluaXNofVxuICB9OiBWaXNTdGF0ZUFjdGlvbnMuTmV4dEZpbGVCYXRjaFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiBwYXJzZVByb2dyZXNzKHN0YXRlLmZpbGVMb2FkaW5nUHJvZ3Jlc3NbZmlsZU5hbWVdLCBwcm9ncmVzcylcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKHN0YXRlV2l0aFByb2dyZXNzLCBbXG4gICAgLi4uKGdldEFwcGxpY2F0aW9uQ29uZmlnKCkudXNlQXJyb3dQcm9ncmVzc2l2ZUxvYWRpbmcgJiZcbiAgICBmaWxlTmFtZS5lbmRzV2l0aCgnYXJyb3cnKSAmJlxuICAgIGFjY3VtdWxhdGVkPy5kYXRhPy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICBQUk9DRVNTX0ZJTEVfREFUQSh7Y29udGVudDogYWNjdW11bGF0ZWQsIGZpbGVDYWNoZTogW119KS5iaW1hcChcbiAgICAgICAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCksXG4gICAgICAgICAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnIpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICBVTldSQVBfVEFTSyhnZW4ubmV4dCgpKS5iaW1hcChcbiAgICAgICh7dmFsdWUsIGRvbmV9KSA9PiB7XG4gICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgPyBvbkZpbmlzaChhY2N1bXVsYXRlZClcbiAgICAgICAgICA6IG5leHRGaWxlQmF0Y2goe1xuICAgICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICBwcm9ncmVzczogdmFsdWUucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgb25GaW5pc2hcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycilcbiAgICApXG4gIF0pO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxvYWRpbmcgZmlsZSBlcnJvclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2Vycm9yLCBmaWxlTmFtZX06IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIHVwZGF0ZSB1aSB3aXRoIGVycm9yIG1lc3NhZ2VcbiAgQ29uc29sZS53YXJuKGVycm9yKTtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNoLCBmaWxlQ2FjaGV9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge2Vycm9yfVxuICB9KTtcblxuICAvLyBraWNrIG9mZiBuZXh0IGZpbGUgb3IgZmluaXNoXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBuZXh0U3RhdGUsXG4gICAgREVMQVlfVEFTSygyMDApLm1hcChmaWxlc1RvTG9hZC5sZW5ndGggPyBsb2FkTmV4dEZpbGUgOiAoKSA9PiBvbkZpbmlzaChmaWxlQ2FjaGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBXaGVuIHNlbGVjdCBkYXRhc2V0IGZvciBleHBvcnQsIGFwcGx5IGNwdSBmaWx0ZXIgdG8gc2VsZWN0ZWQgZGF0YXNldFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q1BVRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkfTogVmlzU3RhdGVBY3Rpb25zLkFwcGx5Q1BVRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhcHBseSBjcHVGaWx0ZXJcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICByZXR1cm4gZGF0YUlkcy5yZWR1Y2UoKGFjY3UsIGlkKSA9PiBmaWx0ZXJEYXRhc2V0Q1BVKGFjY3UsIGlkKSwgc3RhdGUpO1xufTtcblxuLyoqXG4gKiBVc2VyIGlucHV0IHRvIHVwZGF0ZSB0aGUgaW5mbyBvZiB0aGUgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwSW5mb1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0TWFwSW5mb1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBJbmZvOiB7XG4gICAgLi4uc3RhdGUubWFwSW5mbyxcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbGwgbGF5ZXIgZG9tYWluIGFuZCBsYXllciBkYXRhIG9mIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0TGF5ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0c1xuKToge3N0YXRlOiBWaXNTdGF0ZTsgbmV3TGF5ZXJzOiBMYXllcltdfSB7XG4gIGNvbnN0IGVtcHR5OiBMYXllcltdID0gW107XG4gIGNvbnN0IGRlZmF1bHRMYXllcnMgPSBPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5yZWR1Y2UoKGFjY3U6IExheWVyW10sIGRhdGFzZXQpID0+IHtcbiAgICBjb25zdCBmb3VuZExheWVycyA9IGZpbmREZWZhdWx0TGF5ZXIoZGF0YXNldCwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgICByZXR1cm4gZm91bmRMYXllcnMgJiYgZm91bmRMYXllcnMubGVuZ3RoID8gYWNjdS5jb25jYXQoZm91bmRMYXllcnMpIDogYWNjdTtcbiAgfSwgZW1wdHkpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCAuLi5kZWZhdWx0TGF5ZXJzXSxcbiAgICAgIGxheWVyT3JkZXI6IFtcbiAgICAgICAgLy8gcHV0IG5ldyBsYXllcnMgb24gdG9wIG9mIG9sZCBvbmVzIGluIHJldmVyc2VcbiAgICAgICAgLi4uZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMoZGVmYXVsdExheWVycyksXG4gICAgICAgIC4uLnN0YXRlLmxheWVyT3JkZXJcbiAgICAgIF1cbiAgICB9LFxuICAgIG5ld0xheWVyczogZGVmYXVsdExheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRlZmF1bHQgdG9vbHRpcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFRvb2x0aXBzKHN0YXRlLCBkYXRhc2V0KSB7XG4gIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBmaW5kRmllbGRzVG9TaG93KHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIG1heERlZmF1bHRUb29sdGlwczogc3RhdGUubWF4RGVmYXVsdFRvb2x0aXBzXG4gIH0pO1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93LFxuICAgIC4uLnRvb2x0aXBGaWVsZHNcbiAgfTtcblxuICByZXR1cm4gc2V0KFsnaW50ZXJhY3Rpb25Db25maWcnLCAndG9vbHRpcCcsICdjb25maWcnLCAnZmllbGRzVG9TaG93J10sIG1lcmdlZCwgc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZmlsZSwgaW5kZXgpIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgYFVudGl0bGVkIEZpbGUgJHtpbmRleH1gO1xuICByZXR1cm4ge1xuICAgIFtmaWxlTmFtZV06IHtcbiAgICAgIC8vIHBlcmNlbnQgb2YgY3VycmVudCBmaWxlXG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtmaWxlTmFtZSwgcHJvZ3Jlc3N9KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIHBpY2tfKCdmaWxlTG9hZGluZ1Byb2dyZXNzJykocGlja18oZmlsZU5hbWUpKG1lcmdlXyhwcm9ncmVzcykpKShzdGF0ZSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgbGF5ZXIgZG9tYWlucyBmb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YTxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogUyB7XG4gIGNvbnN0IGRhdGFJZHMgPSB0eXBlb2YgZGF0YUlkID09PSAnc3RyaW5nJyA/IFtkYXRhSWRdIDogZGF0YUlkO1xuICBjb25zdCBuZXdMYXllcnM6IExheWVyW10gPSBbXTtcbiAgY29uc3QgbmV3TGF5ZXJEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHN0YXRlLmxheWVycy5mb3JFYWNoKChvbGRMYXllciwgaSkgPT4ge1xuICAgIGlmIChvbGRMYXllci5jb25maWcuZGF0YUlkICYmIGRhdGFJZHMuaW5jbHVkZXMob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGF5ZXIgZG9tYWluIGlmIGZpbHRlciBoYXMgZml4ZWQgZG9tYWluXG4gICAgICBjb25zdCBuZXdMYXllciA9XG4gICAgICAgIHVwZGF0ZWRGaWx0ZXIgJiYgdXBkYXRlZEZpbHRlci5maXhlZERvbWFpblxuICAgICAgICAgID8gb2xkTGF5ZXJcbiAgICAgICAgICA6IG9sZExheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzLCB1cGRhdGVkRmlsdGVyKTtcblxuICAgICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgc3RhdGUubGF5ZXJEYXRhW2ldKTtcblxuICAgICAgbmV3TGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2gobGF5ZXJEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXJzLnB1c2gob2xkTGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2goc3RhdGUubGF5ZXJEYXRhW2ldKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIGxheWVyRGF0YTogbmV3TGF5ZXJEYXRhXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uRG9tYWluPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcbiAgLy8gbWVyZ2UgYWxsIGFuaW1hdGFibGUgbGF5ZXIgZG9tYWluIGFuZCB1cGRhdGUgZ2xvYmFsIGNvbmZpZ1xuICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMoc3RhdGUubGF5ZXJzKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBpc0FuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHRpbWVTdGVwczogbnVsbCxcbiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF5ZXJEb21haW5zID0gYW5pbWF0YWJsZUxheWVycy5tYXAobCA9PiBsLmNvbmZpZy5hbmltYXRpb24uZG9tYWluIHx8IFtdKTtcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBtZXJnZWREb21haW4gPSBtZXJnZVRpbWVEb21haW5zKGxheWVyRG9tYWlucyk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgLy8gbWVyZ2UgdGltZVN0ZXBzXG4gIGxldCBtZXJnZWRUaW1lU3RlcHM6IG51bWJlcltdIHwgbnVsbCA9IHVuaXE8bnVtYmVyPihcbiAgICBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZSgoYWNjdSwgbGF5ZXIpID0+IHtcbiAgICAgIGFjY3UucHVzaCguLi4obGF5ZXIuY29uZmlnLmFuaW1hdGlvbi50aW1lU3RlcHMgfHwgW10pKTtcbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH0sIFtdKVxuICApLnNvcnQoKTtcblxuICBtZXJnZWRUaW1lU3RlcHMgPSBtZXJnZWRUaW1lU3RlcHMubGVuZ3RoID8gbWVyZ2VkVGltZVN0ZXBzIDogbnVsbDtcblxuICAvLyBUT0RPOiBiZXR0ZXIgaGFuZGxpbmcgb2YgZHVyYXRpb24gY2FsY3VsYXRpb25cbiAgY29uc3QgZHVyYXRpb24gPSBtZXJnZWRUaW1lU3RlcHNcbiAgICA/IChCQVNFX1NQRUVEICogKDEwMDAgLyBGUFMpKSAvIG1lcmdlZFRpbWVTdGVwcy5sZW5ndGggLyAoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnNwZWVkIHx8IDEpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGRvbWFpbjogbWVyZ2VkRG9tYWluLFxuICAgICAgZGVmYXVsdFRpbWVGb3JtYXQsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIHRpbWVTdGVwczogbWVyZ2VkVGltZVN0ZXBzXG4gICAgfVxuICB9O1xuXG4gIC8vIHJlc2V0IGN1cnJlbnRUaW1lIGJhc2VkIG9uIG5ldyBkb21haW5cbiAgY29uc3Qgc3luY2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycz8uZmluZChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIGFzXG4gICAgfCBUaW1lUmFuZ2VGaWx0ZXJcbiAgICB8IHVuZGVmaW5lZDtcblxuICAvLyBpZiBzeW5jZWQgZmlsdGVyIGV4aXN0IHdlZSBuZWVkIHRvIG1lcmdlIGFuaW1hdGlvbkNvbmZpZyBhbmQgZmlsdGVyIGRvbWFpbnNcbiAgLy8gYW5kIHZhbGlkYXRlIHRoZSBjdXJyZW50IHRpbWUgYWdhaW5zdCB0aGUgbmV3IG1lcmdlZCBkb21haW5cbiAgY29uc3QgbmV3QW5pbWF0aW9uRG9tYWluID0gc3luY2VkRmlsdGVyXG4gICAgPyBtZXJnZVRpbWVEb21haW5zKFttZXJnZWREb21haW4sIHN5bmNlZEZpbHRlci5kb21haW5dKVxuICAgIDogbWVyZ2VkRG9tYWluO1xuICBjb25zdCBjdXJyZW50VGltZSA9IGlzSW5SYW5nZShzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWUsIG5ld0FuaW1hdGlvbkRvbWFpbilcbiAgICA/IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgIDogbmV3QW5pbWF0aW9uRG9tYWluWzBdO1xuXG4gIGlmIChjdXJyZW50VGltZSAhPT0gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKSB7XG4gICAgLy8gaWYgY3VycmVudFRpbWUgY2hhbmdlZCwgbmVlZCB0byBjYWxsIGFuaW1hdGlvblRpbWVVcGRhdGVyIHRvIHJlIGNhbGwgZm9ybWF0TGF5ZXJEYXRhXG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV4dFN0YXRlLCB7dmFsdWU6IGN1cnJlbnRUaW1lfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0b3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFZGl0b3JNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7bW9kZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRFZGl0b3JNb2RlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVkaXRvcjoge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBtb2RlLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9XG59KTtcblxuLy8gY29uc3QgZmVhdHVyZVRvRmlsdGVyVmFsdWUgPSAoZmVhdHVyZSkgPT4gKHsuLi5mZWF0dXJlLCBpZDogZmVhdHVyZS5pZH0pO1xuLyoqXG4gKiBVcGRhdGUgZWRpdG9yIGZlYXR1cmVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlcyA9IFtdfTogVmlzU3RhdGVBY3Rpb25zLlNldEZlYXR1cmVzVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBsYXN0RmVhdHVyZSA9IGZlYXR1cmVzLmxlbmd0aCAmJiBmZWF0dXJlc1tmZWF0dXJlcy5sZW5ndGggLSAxXTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIC8vIG9ubHkgc2F2ZSBub25lIGZpbHRlciBmZWF0dXJlcyB0byBlZGl0b3JcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5maWx0ZXIoZiA9PiAhZ2V0RmlsdGVySWRJbkZlYXR1cmUoZikpLFxuICAgICAgbW9kZTpcbiAgICAgICAgbGFzdEZlYXR1cmUgJiYgbGFzdEZlYXR1cmUucHJvcGVydGllcz8uaXNDbG9zZWRcbiAgICAgICAgICA/IGxhc3RGZWF0dXJlLnByb3BlcnRpZXM/LnNoYXBlID09PSAnUmVjdGFuZ2xlJ1xuICAgICAgICAgICAgPyBzdGF0ZS5lZGl0b3IubW9kZVxuICAgICAgICAgICAgOiBFRElUT1JfTU9ERVMuRURJVFxuICAgICAgICAgIDogc3RhdGUuZWRpdG9yLm1vZGVcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgZXhpc3RpbmcgZmVhdHVyZVxuICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHN0YXRlLmVkaXRvcjtcblxuICAvLyBJZiBubyBmZWF0dXJlIGlzIHNlbGVjdGVkIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHNpbmNlIG5vIG9wZXJhdGlvbnNcbiAgaWYgKCFzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZmVhdHVyZSBoYXMgY2hhbmdlZFxuICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZS5pZCk7XG5cbiAgLy8gaWYgZmVhdHVyZSBpcyBwYXJ0IG9mIGEgZmlsdGVyXG4gIGNvbnN0IGZpbHRlcklkID0gZmVhdHVyZSAmJiBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcbiAgaWYgKGZpbHRlcklkICYmIGZlYXR1cmUpIHtcbiAgICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUgYXMgdW5rbm93biBhcyBBbGxHZW9KU09OKTtcbiAgICBjb25zdCBmZWF0dXJlVmFsdWUgPSBmZWF0dXJlVG9GaWx0ZXJWYWx1ZShmZWF0dXJlLCBmaWx0ZXJJZCk7XG4gICAgY29uc3QgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZmlsID0+IGZpbC5pZCA9PT0gZmlsdGVySWQpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgICBwcm9wOiAndmFsdWUnLFxuICAgICAgdmFsdWU6IGZlYXR1cmVWYWx1ZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFNldCB0aGUgY3VycmVudCBzZWxlY3RlZCBmZWF0dXJlXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlLCBzZWxlY3Rpb25Db250ZXh0fTogVmlzU3RhdGVBY3Rpb25zLlNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgLy8gYWRkIGJib3ggZm9yIHBvbHlnb24gZmlsdGVyIHRvIHNwZWVkIHVwIGZpbHRlcmluZ1xuICBsZXQgc2VsZWN0ZWRGZWF0dXJlID0gZmVhdHVyZTtcbiAgaWYgKGZlYXR1cmU/LnByb3BlcnRpZXMpIHtcbiAgICBzZWxlY3RlZEZlYXR1cmUgPSB7XG4gICAgICAuLi5mZWF0dXJlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAuLi5mZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGJib3g6IGJib3goZmVhdHVyZSBhcyB1bmtub3duIGFzIEFsbEdlb0pTT04pXG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dFxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogRGVsZXRlIGV4aXN0aW5nIGZlYXR1cmUgZnJvbSBmaWx0ZXJzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlRmVhdHVyZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmV9OiBWaXNTdGF0ZUFjdGlvbnMuRGVsZXRlRmVhdHVyZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFmZWF0dXJlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICB9XG4gIH07XG5cbiAgaWYgKGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKSB7XG4gICAgY29uc3QgZmlsdGVySWR4ID0gbmV3U3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKSk7XG5cbiAgICByZXR1cm4gZmlsdGVySWR4ID4gLTEgPyByZW1vdmVGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7aWR4OiBmaWx0ZXJJZHh9KSA6IG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gbW9kaWZ5IGVkaXRvciBvYmplY3RcbiAgY29uc3QgbmV3RWRpdG9yID0ge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiBuZXdFZGl0b3JcbiAgfTtcbn1cblxuLyoqXG4gKiBUb2dnbGUgZmVhdHVyZSBhcyBsYXllciBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHBheWxvYWQ6IFZpc1N0YXRlQWN0aW9ucy5TZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtsYXllciwgZmVhdHVyZX0gPSBwYXlsb2FkO1xuICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpO1xuXG4gIC8vIGxldCBuZXdGaWx0ZXIgPSBudWxsO1xuICBsZXQgZmlsdGVySWR4O1xuICBsZXQgbmV3TGF5ZXJJZCA9IFtsYXllci5pZF07XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICAvLyBJZiBwb2x5Z29uIGZpbHRlciBhbHJlYWR5IGV4aXN0cywgd2UgbmVlZCB0byBmaW5kIG91dCBpZiB0aGUgY3VycmVudCBsYXllciBpcyBhbHJlYWR5IGluY2x1ZGVkXG4gIGlmIChmaWx0ZXJJZCkge1xuICAgIGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuXG4gICAgaWYgKCFzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0pIHtcbiAgICAgIC8vIHdoYXQgaWYgZmlsdGVyIGRvZXNuJ3QgZXhpc3Q/Li4uIG5vdCBwb3NzaWJsZS5cbiAgICAgIC8vIGJlY2F1c2UgZmVhdHVyZXMgaW4gdGhlIGVkaXRvciBpcyBwYXNzZWQgaW4gZnJvbSBmaWx0ZXJzIGFuZCBlZGl0b3JzLlxuICAgICAgLy8gYnV0IHdlIHdpbGwgbW92ZSB0aGlzIGZlYXR1cmUgYmFjayB0byBlZGl0b3IganVzdCBpbiBjYXNlXG4gICAgICBjb25zdCBub25lRmlsdGVyRmVhdHVyZSA9IHtcbiAgICAgICAgLi4uZmVhdHVyZSxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIC4uLmZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgICBmaWx0ZXJJZDogbnVsbFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZWRpdG9yOiB7XG4gICAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICAgIGZlYXR1cmVzOiBbLi4uc3RhdGUuZWRpdG9yLmZlYXR1cmVzLCBub25lRmlsdGVyRmVhdHVyZV0sXG4gICAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBub25lRmlsdGVyRmVhdHVyZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gICAgY29uc3Qge2xheWVySWQgPSBbXX0gPSBmaWx0ZXI7XG4gICAgY29uc3QgaXNMYXllckluY2x1ZGVkID0gbGF5ZXJJZC5pbmNsdWRlcyhsYXllci5pZCk7XG5cbiAgICBuZXdMYXllcklkID0gaXNMYXllckluY2x1ZGVkXG4gICAgICA/IC8vIGlmIGxheWVyIGlzIGluY2x1ZGVkLCByZW1vdmUgaXRcbiAgICAgICAgbGF5ZXJJZC5maWx0ZXIobCA9PiBsICE9PSBsYXllci5pZClcbiAgICAgIDogWy4uLmxheWVySWQsIGxheWVyLmlkXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGNyZWF0ZSB0aGUgcG9seWdvbiBmaWx0ZXIsIGNyZWF0ZSBpdFxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IGdlbmVyYXRlUG9seWdvbkZpbHRlcihbXSwgZmVhdHVyZSk7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5sZW5ndGg7XG5cbiAgICAvLyBhZGQgZmVhdHVyZSwgcmVtb3ZlIGZlYXR1cmUgZnJvbSBlaWR0b3JcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIG5ld0ZpbHRlcl0sXG4gICAgICBlZGl0b3I6IHtcbiAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5ld0ZpbHRlci52YWx1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogZmlsdGVySWR4LFxuICAgIHByb3A6ICdsYXllcklkJyxcbiAgICB2YWx1ZTogbmV3TGF5ZXJJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBBcHBseSBwb2x5Z29uIGZpbHRlciB0byBhbGwgdmlzaWJsZSBsYXllcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQb2x5Z29uRmlsdGVyQWxsTGF5ZXJzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBwYXlsb2FkOiBWaXNTdGF0ZUFjdGlvbnMuU2V0UG9seWdvbkZpbHRlckFsbExheWVyc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2ZlYXR1cmV9ID0gcGF5bG9hZDtcblxuICBjb25zdCBuZXdGaWx0ZXIgPSBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIoW10sIGZlYXR1cmUpO1xuICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmxlbmd0aDtcblxuICBjb25zdCBuZXdTdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIG5ld0ZpbHRlcl0sXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBmZWF0dXJlczogc3RhdGUuZWRpdG9yLmZlYXR1cmVzLmZpbHRlcihmID0+IGYuaWQgIT09IGZlYXR1cmUuaWQpLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBuZXdGaWx0ZXIudmFsdWUsXG4gICAgICBtb2RlOiBFRElUT1JfTU9ERVMuRURJVFxuICAgIH1cbiAgfTtcblxuICBjb25zdCB2aXNpYmxlTGF5ZXJJZHMgPSBnZXQocGF5bG9hZCwgJ3Zpc2libGVMYXllcklkcycpO1xuICBjb25zdCBhbGxMYXllcklkcyA9IEFycmF5LmlzQXJyYXkodmlzaWJsZUxheWVySWRzKVxuICAgID8gdmlzaWJsZUxheWVySWRzXG4gICAgOiBzdGF0ZS5sYXllcnMuZmlsdGVyKGwgPT4gbC5jb25maWcuaXNWaXNpYmxlKS5tYXAobCA9PiBsLmlkKTtcblxuICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogZmlsdGVySWR4LFxuICAgIHByb3A6ICdsYXllcklkJyxcbiAgICB2YWx1ZTogYWxsTGF5ZXJJZHNcbiAgfSk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1uLCBtb2RlfTogVmlzU3RhdGVBY3Rpb25zLlNvcnRUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgc29ydE1vZGUgPSBtb2RlO1xuICBpZiAoIXNvcnRNb2RlKSB7XG4gICAgY29uc3QgY3VycmVudE1vZGUgPSBnZXQoZGF0YXNldCwgWydzb3J0Q29sdW1uJywgY29sdW1uXSk7XG4gICAgLy8gQHRzLWlnbm9yZSAtIHNob3VsZCBiZSBmaXhhYmxlIGluIGEgVFMgZmlsZVxuICAgIHNvcnRNb2RlID0gY3VycmVudE1vZGVcbiAgICAgID8gT2JqZWN0LmtleXMoU09SVF9PUkRFUikuZmluZChtID0+IG0gIT09IGN1cnJlbnRNb2RlKVxuICAgICAgOiBTT1JUX09SREVSLkFTQ0VORElORztcbiAgfVxuXG4gIGNvbnN0IHNvcnRlZCA9IHNvcnREYXRhc2V0QnlDb2x1bW4oZGF0YXNldCwgY29sdW1uLCBzb3J0TW9kZSk7XG4gIHJldHVybiBzZXQoWydkYXRhc2V0cycsIGRhdGFJZF0sIHNvcnRlZCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaW5UYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLlBpblRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IG5ld0RhdGFzZXQgPSBwaW5UYWJsZUNvbHVtbnMoZGF0YXNldCwgY29sdW1uKTtcblxuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG59XG5cbi8qKlxuICogQ29weSBjb2x1bW4gY29udGVudCBhcyBzdHJpbmdzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW59OiBWaXNTdGF0ZUFjdGlvbnMuQ29weVRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGZpZWxkSWR4ID0gZGF0YXNldC5maWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICBpZiAoZmllbGRJZHggPCAwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHt0eXBlfSA9IGRhdGFzZXQuZmllbGRzW2ZpZWxkSWR4XTtcbiAgY29uc3QgdGV4dCA9IGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgIC5tYXAocm93ID0+IHBhcnNlRmllbGRWYWx1ZShyb3cudmFsdWVBdChmaWVsZElkeCksIHR5cGUpLCB0cnVlKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICBjb3B5KHRleHQpO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgZGlzcGxheSBmb3JtYXQgZnJvbSBjb2x1bW5zIGZyb20gdXNlciBzZWxlY3Rpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb2x1bW5EaXNwbGF5Rm9ybWF0VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBmb3JtYXRzfTogVmlzU3RhdGVBY3Rpb25zLlNldENvbHVtbkRpc3BsYXlGb3JtYXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0ZpZWxkcyA9IGRhdGFzZXQuZmllbGRzO1xuICBPYmplY3Qua2V5cyhmb3JtYXRzKS5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgY29uc3QgZmllbGRJZHggPSBkYXRhc2V0LmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGNvbHVtbik7XG4gICAgaWYgKGZpZWxkSWR4ID49IDApIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlGb3JtYXQgPSBmb3JtYXRzW2NvbHVtbl07XG4gICAgICBjb25zdCBmaWVsZCA9IG5ld0ZpZWxkc1tmaWVsZElkeF07XG4gICAgICBuZXdGaWVsZHMgPSBzd2FwXyhtZXJnZV8oe2Rpc3BsYXlGb3JtYXR9KShmaWVsZCkgYXMge2lkOiBzdHJpbmd9KShcbiAgICAgICAgbmV3RmllbGRzIGFzIHtpZDogc3RyaW5nfVtdXG4gICAgICApIGFzIEZpZWxkW107XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuZXdEYXRhc2V0ID0gY29weVRhYmxlQW5kVXBkYXRlKGRhdGFzZXQsIHtmaWVsZHM6IG5ld0ZpZWxkcyBhcyBGaWVsZFtdfSk7XG4gIGxldCBuZXdTdGF0ZSA9IHBpY2tfKCdkYXRhc2V0cycpKG1lcmdlXyh7W2RhdGFJZF06IG5ld0RhdGFzZXR9KSkoc3RhdGUpO1xuXG4gIC8vIHVwZGF0ZSBjb2xvckZpZWxkIGRpc3BsYXlGb3JtYXRcbiAgbmV3U3RhdGUgPSB7XG4gICAgLi4ubmV3U3RhdGUsXG4gICAgbGF5ZXJzOiBuZXdTdGF0ZS5sYXllcnMubWFwKGxheWVyID0+XG4gICAgICBsYXllci5jb25maWc/LmNvbG9yRmllbGQ/Lm5hbWUgJiYgbGF5ZXIuY29uZmlnLmNvbG9yRmllbGQubmFtZSBpbiBmb3JtYXRzXG4gICAgICAgID8gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICAgICAgY29sb3JGaWVsZDoge1xuICAgICAgICAgICAgICAuLi5sYXllci5jb25maWcuY29sb3JGaWVsZCxcbiAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdDogZm9ybWF0c1tsYXllci5jb25maWcuY29sb3JGaWVsZC5uYW1lXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIDogbGF5ZXJcbiAgICApXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBlZGl0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHVwZGF0ZXMgPSBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZyk7XG4gIHJldHVybiBwaWNrXygnYW5pbWF0aW9uQ29uZmlnJykobWVyZ2VfKHVwZGF0ZXMpKShzdGF0ZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJGaWx0ZXJlZEl0ZW1zQ2hhbmdlQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2V2ZW50LCBsYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IHtpZDogZGVja2dsTGF5ZXJJZCwgY291bnR9ID0gZXZlbnQ7XG4gIGlmICghbGF5ZXIpIHtcbiAgICBDb25zb2xlLndhcm4oYGxheWVyRmlsdGVyZWRJdGVtcyBsYXllciBkb2VzbnQgZXhpc3RzYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChsYXllci5maWx0ZXJlZEl0ZW1Db3VudD8uW2RlY2tnbExheWVySWRdID09PSBjb3VudCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxheWVyLmZpbHRlcmVkSXRlbUNvdW50ID0ge1xuICAgIC4uLmxheWVyLmZpbHRlcmVkSXRlbUNvdW50LFxuICAgIFtkZWNrZ2xMYXllcklkXTogY291bnRcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3dhcF8obGF5ZXIpKHN0YXRlLmxheWVycylcbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgV01TIGZlYXR1cmUgaW5mbyBhbmQgcGluIHRvb2x0aXBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdtc0ZlYXR1cmVJbmZvVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuV01TRmVhdHVyZUluZm9BY3Rpb25cbik6IFMge1xuICBjb25zdCB7bGF5ZXIsIGZlYXR1cmVJbmZvLCBjb29yZGluYXRlfSA9IGFjdGlvbjtcbiAgaWYgKCFsYXllcikge1xuICAgIGNvbnNvbGUud2FybihgV01TIGZlYXR1cmUgaW5mbyBsYXllciBkb2Vzbid0IGV4aXN0YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgY2xpY2tlZCBvYmplY3Qgc2ltaWxhciB0byBsYXllckNsaWNrVXBkYXRlciB0byBwaW4gdGhlIHRvb2x0aXBcbiAgY29uc3QgY2xpY2tlZCA9IGZlYXR1cmVJbmZvXG4gICAgPyB7XG4gICAgICAgIHBpY2tlZDogdHJ1ZSxcbiAgICAgICAgb2JqZWN0OiB7XG4gICAgICAgICAgd21zRmVhdHVyZUluZm86IGZlYXR1cmVJbmZvXG4gICAgICAgIH0sXG4gICAgICAgIGNvb3JkaW5hdGU6IGNvb3JkaW5hdGUgfHwgWzAsIDBdLFxuICAgICAgICBsYXllcjoge1xuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBpZHg6IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBsYXllci5pZCksXG4gICAgICAgICAgICBpZDogbGF5ZXIuaWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkXG4gIH07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtc3RhdGVtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TeW5jVGltZUZpbHRlcldpdGhMYXllclRpbWVsaW5lQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2lkeDogZmlsdGVySWR4LCBlbmFibGUgPSBmYWxzZX0gPSBhY3Rpb247XG5cbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgbGV0IG5ld0ZpbHRlciA9IGZpbHRlcjtcblxuICAvLyBpZiB3ZSBlbmFibGUgc3luYyB3ZSBhcmUgZ29pbmcgdG8gbWVyZ2UgZmlsdGVyIGFuZCBhbmltYXRpb25Db25maWcgZG9tYWlucyBhbmQgc3RvcmUgaW50byBmaWx0ZXIuZG9tYWluXG4gIGlmIChlbmFibGUpIHtcbiAgICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMobmV3U3RhdGUubGF5ZXJzKTtcbiAgICAvLyBpZiBubyBhbmltYXRhYmxlTGF5ZXJzIGFyZSBwcmVzZW50IHdlIHNpbXBseSByZXR1cm5cbiAgICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbmV3U3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgaW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyA9IGdldEludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMoYW5pbWF0YWJsZUxheWVycyk7XG4gICAgY29uc3QgaGFzSW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVyID0gQm9vbGVhbihpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLmxlbmd0aCk7XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJEb21haW4gPSBtZXJnZVRpbWVEb21haW5zKFtmaWx0ZXIuZG9tYWluLCBuZXdTdGF0ZS5hbmltYXRpb25Db25maWcuZG9tYWluXSk7XG5cbiAgICAvLyB3ZSBvbmx5IHVwZGF0ZSBhbmltYXRpb25XaW5kb3cgaWYgd2UgaGF2ZSBpbnRlcnZhbCBiYXNlZCBhbmltYXRpb24gbGF5ZXJzIHdpdGggZGVmaW5lZCBpbnRlcnZhbHMgYW5kIHRoZSBjdXJyZW50IGZpbHRlciBhbmltYXRpb24gd2luZG93IGlzIG5vdCBpbnRlcnZhbFxuICAgIGlmIChoYXNJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXIpIHtcbiAgICAgIGlmIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93ICE9PSBBTklNQVRJT05fV0lORE9XLmludGVydmFsKSB7XG4gICAgICAgIG5ld1N0YXRlID0gc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93VXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgICAgIGlkOiBmaWx0ZXIuaWQsXG4gICAgICAgICAgYW5pbWF0aW9uV2luZG93OiBBTklNQVRJT05fV0lORE9XLmludGVydmFsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBuZXdGaWx0ZXIgPSBuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gICAgICAvLyBhZGp1c3QgdGltZSBmaWx0ZXIgaW50ZXJ2YWxcbiAgICAgIG5ld0ZpbHRlciA9IGFkanVzdFRpbWVGaWx0ZXJJbnRlcnZhbChuZXdTdGF0ZSwgbmV3RmlsdGVyKTtcblxuICAgICAgLy8gcmVwbGFjZSBmaWx0ZXIgaW4gc3RhdGUgd2l0aCBuZXdGaWx0ZXJcbiAgICAgIG5ld1N0YXRlID0ge1xuICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgZmlsdGVyczogc3dhcF88RmlsdGVyPihuZXdGaWx0ZXIpKG5ld1N0YXRlLmZpbHRlcnMpXG4gICAgICB9O1xuICAgIH1cblxuICAgIG5ld0ZpbHRlciA9IG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgICAvLyBhZGp1c3QgdmFsdWUgYmFzZWQgb24gbmV3IGRvbWFpblxuICAgIGNvbnN0IG5ld0ZpbHRlclZhbHVlID0gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbihcbiAgICAgIG5ld0ZpbHRlci5hbmltYXRpb25XaW5kb3cgPT09IEFOSU1BVElPTl9XSU5ET1cuaW50ZXJ2YWxcbiAgICAgICAgPyBbbmV3RmlsdGVyRG9tYWluWzBdLCBuZXdGaWx0ZXJEb21haW5bMF1dXG4gICAgICAgIDogbmV3RmlsdGVyRG9tYWluLFxuICAgICAgey4uLm5ld0ZpbHRlciwgZG9tYWluOiBuZXdGaWx0ZXJEb21haW59XG4gICAgKTtcblxuICAgIG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgICBwcm9wOiAndmFsdWUnLFxuICAgICAgdmFsdWU6IG5ld0ZpbHRlclZhbHVlXG4gICAgfSk7XG5cbiAgICBuZXdGaWx0ZXIgPSB7XG4gICAgICAuLi4obmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlciksXG4gICAgICBzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZTogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyByZXBsYWNlIGZpbHRlciBpbiBzdGF0ZSB3aXRoIG5ld0ZpbHRlclxuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICBmaWx0ZXJzOiBzd2FwXzxGaWx0ZXI+KG5ld0ZpbHRlcikobmV3U3RhdGUuZmlsdGVycylcbiAgICB9O1xuXG4gICAgbmV3U3RhdGUgPSBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgICAgaWQ6IG5ld0ZpbHRlci5pZCxcbiAgICAgIG1vZGU6IGdldFN5bmNBbmltYXRpb25Nb2RlKG5ld0ZpbHRlcilcbiAgICB9KTtcblxuICAgIG5ld0ZpbHRlciA9IG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgICAvLyBzZXQgdGhlIGFuaW1hdGlvbiBjb25maWcgdmFsdWUgdG8gbWF0Y2ggZmlsdGVyIHZhbHVlXG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIHZhbHVlOiBuZXdGaWx0ZXIudmFsdWVbbmV3RmlsdGVyLnN5bmNUaW1lbGluZU1vZGVdXG4gICAgfSk7XG4gIH1cblxuICAvLyBzZXQgZG9tYWluIGFuZCBzdGVwXG4gIG5ld0ZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgc3luY2VkV2l0aExheWVyVGltZWxpbmU6IGZhbHNlXG4gIH07XG5cbiAgLy8gcmVwbGFjZSBmaWx0ZXIgaW4gc3RhdGUgd2l0aCBuZXdGaWx0ZXJcbiAgbmV3U3RhdGUgPSB7XG4gICAgLi4ubmV3U3RhdGUsXG4gICAgZmlsdGVyczogc3dhcF88RmlsdGVyPihuZXdGaWx0ZXIpKG5ld1N0YXRlLmZpbHRlcnMpXG4gIH07XG5cbiAgLy8gcmVzZXQgc3luYyB0aW1lbGluZSBtb2RlXG4gIG5ld1N0YXRlID0gc2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZDogbmV3RmlsdGVyLmlkLFxuICAgIG1vZGU6IFNZTkNfVElNRUxJTkVfTU9ERVMuZW5kXG4gIH0pO1xuXG4gIG5ld0ZpbHRlciA9IG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgLy8gcmVzZXQgZmlsdGVyIHZhbHVlXG4gIGNvbnN0IG5ld0ZpbHRlclZhbHVlID0gYWRqdXN0VmFsdWVUb0ZpbHRlckRvbWFpbihuZXdGaWx0ZXIuZG9tYWluLCBuZXdGaWx0ZXIpO1xuXG4gIG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge1xuICAgIGlkeDogZmlsdGVySWR4LFxuICAgIHByb3A6ICd2YWx1ZScsXG4gICAgdmFsdWU6IG5ld0ZpbHRlclZhbHVlXG4gIH0pO1xuXG4gIG5ld1N0YXRlID0gc2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZDogbmV3RmlsdGVyLmlkLFxuICAgIG1vZGU6IGdldFN5bmNBbmltYXRpb25Nb2RlKG5ld0ZpbHRlcilcbiAgfSk7XG5cbiAgLy8gcmVzZXQgYW5pbWF0aW9uIGNvbmZpZyBjdXJyZW50IHRpbWUgdG9cbiAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICB2YWx1ZTogbmV3U3RhdGUuYW5pbWF0aW9uQ29uZmlnLmRvbWFpbj8uWzBdID8/IG51bGxcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUaW1lRmlsdGVyVGltZWxpbmVNb2RlVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuc2V0VGltZUZpbHRlclN5bmNUaW1lbGluZU1vZGVBY3Rpb25cbikge1xuICBjb25zdCB7aWQ6IGZpbHRlcklkLCBtb2RlOiBzeW5jVGltZWxpbmVNb2RlfSA9IGFjdGlvbjtcblxuICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGZpbHRlcklkKTtcbiAgaWYgKGZpbHRlcklkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gIGlmICghdmFsaWRhdGVTeW5jQW5pbWF0aW9uTW9kZShmaWx0ZXIsIHN5bmNUaW1lbGluZU1vZGUpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RmlsdGVyID0ge1xuICAgIC4uLmZpbHRlcixcbiAgICBzeW5jVGltZWxpbmVNb2RlXG4gIH07XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3dhcF88RmlsdGVyPihuZXdGaWx0ZXIpKHN0YXRlLmZpbHRlcnMpXG4gIH07XG5cbiAgcmV0dXJuIGFkanVzdEFuaW1hdGlvbkNvbmZpZ1dpdGhGaWx0ZXIobmV3U3RhdGUsIGZpbHRlcklkeCk7XG59XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIG9mIHRoZSBsb2FkaW5nIGluZGljYXRvci5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgdmlzU3RhdGVcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBQYXlsb2FkIHdpdGggY2hhbmdlIG9mIG51bWJlciBvZiBhY3RpdmUgbG9hZGluZyBhY3Rpb25zLlxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMb2FkaW5nSW5kaWNhdG9yVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7cGF5bG9hZDoge2NoYW5nZX19OiB7cGF5bG9hZDogU2V0TG9hZGluZ0luZGljYXRvclBheWxvYWR9XG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGxldCB7bG9hZGluZ0luZGljYXRvclZhbHVlfSA9IHN0YXRlO1xuICBpZiAoIWxvYWRpbmdJbmRpY2F0b3JWYWx1ZSkge1xuICAgIGxvYWRpbmdJbmRpY2F0b3JWYWx1ZSA9IDA7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxvYWRpbmdJbmRpY2F0b3JWYWx1ZTogTWF0aC5tYXgobG9hZGluZ0luZGljYXRvclZhbHVlICsgY2hhbmdlLCAwKVxuICB9O1xufTtcblxuZnVuY3Rpb24gYWRqdXN0QW5pbWF0aW9uQ29uZmlnV2l0aEZpbHRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBmaWx0ZXJJZHg6IG51bWJlcik6IFMge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF07XG4gIGlmICgoZmlsdGVyIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIHtcbiAgICBjb25zdCB0aW1lbGluZVZhbHVlID0gZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIoZmlsdGVyKTtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy50aW1lU3RlcHNcbiAgICAgID8gc25hcFRvTWFya3ModGltZWxpbmVWYWx1ZSwgc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnRpbWVTdGVwcylcbiAgICAgIDogdGltZWxpbmVWYWx1ZTtcbiAgICByZXR1cm4gc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlcihzdGF0ZSwge3ZhbHVlfSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5mdW5jdGlvbiBnZXRUaW1lbGluZVZhbHVlRnJvbUZpbHRlcihmaWx0ZXIpIHtcbiAgcmV0dXJuIGZpbHRlci52YWx1ZVtmaWx0ZXIuc3luY1RpbWVsaW5lTW9kZV07XG59XG5cbmZ1bmN0aW9uIGdldFN5bmNBbmltYXRpb25Nb2RlKGZpbHRlcjogVGltZVJhbmdlRmlsdGVyKSB7XG4gIGlmIChmaWx0ZXIuYW5pbWF0aW9uV2luZG93ID09PSBBTklNQVRJT05fV0lORE9XLmZyZWUpIHtcbiAgICByZXR1cm4gZmlsdGVyLnN5bmNUaW1lbGluZU1vZGUgPz8gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG4gIH1cblxuICByZXR1cm4gU1lOQ19USU1FTElORV9NT0RFUy5lbmQ7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlU3luY0FuaW1hdGlvbk1vZGUoZmlsdGVyOiBUaW1lUmFuZ2VGaWx0ZXIsIG5ld01vZGU6IG51bWJlcikge1xuICByZXR1cm4gIShcbiAgICBmaWx0ZXIuYW5pbWF0aW9uV2luZG93ICE9PSBBTklNQVRJT05fV0lORE9XLmZyZWUgJiYgbmV3TW9kZSA9PT0gU1lOQ19USU1FTElORV9NT0RFUy5zdGFydFxuICApO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwoc3RhdGUsIGZpbHRlcikge1xuICBjb25zdCBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzID0gZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyhzdGF0ZS5sYXllcnMpO1xuXG4gIGxldCBpbnRlcnZhbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlmIChpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaW50ZXJ2YWxJbmRleCA9IGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMucmVkdWNlKChjdXJyZW50SW5kZXgsIGwpID0+IHtcbiAgICAgIGlmIChsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKSB7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gVElNRV9JTlRFUlZBTFNfT1JERVJFRC5maW5kSW5kZXgoaSA9PiBpID09PSBsLm1ldGEudGFyZ2V0VGltZUludGVydmFsKTtcbiAgICAgICAgcmV0dXJuIG5ld0luZGV4ID4gLTEgJiYgbmV3SW5kZXggPCBjdXJyZW50SW5kZXggPyBuZXdJbmRleCA6IGN1cnJlbnRJbmRleDtcbiAgICAgIH1cbiAgICB9LCBUSU1FX0lOVEVSVkFMU19PUkRFUkVELmxlbmd0aCAtIDEpO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBoZXhUaWxlSW50ZXJ2YWwgPSBUSU1FX0lOVEVSVkFMU19PUkRFUkVEW2ludGVydmFsSW5kZXhdO1xuICAgIGludGVydmFsID0gTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbFtoZXhUaWxlSW50ZXJ2YWxdO1xuICB9XG5cbiAgaWYgKCFpbnRlcnZhbCkge1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICAvLyBhZGp1c3QgZmlsdGVyXG4gIGNvbnN0IHRpbWVGb3JtYXQgPSBnZXREZWZhdWx0VGltZUZvcm1hdChpbnRlcnZhbCk7XG4gIGNvbnN0IHVwZGF0ZWRQbG90VHlwZSA9IHsuLi5maWx0ZXIucGxvdFR5cGUsIGludGVydmFsLCB0aW1lRm9ybWF0fTtcbiAgY29uc3QgbmV3RmlsdGVyID0gdXBkYXRlVGltZUZpbHRlclBsb3RUeXBlKGZpbHRlciwgdXBkYXRlZFBsb3RUeXBlLCBzdGF0ZS5kYXRhc2V0cyk7XG4gIHJldHVybiBhZGp1c3RWYWx1ZVRvQW5pbWF0aW9uV2luZG93KHN0YXRlLCBuZXdGaWx0ZXIpO1xufVxuXG4vLyBGaW5kIGRhdGFJZCBmcm9tIGEgc2F2ZWQgdmlzU3RhdGUgcHJvcGVydHk6XG4vLyBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9ucywgbGF5ZXJCbGVuZGluZywgb3ZlcmxheUJsZW5kaW5nLCBzcGxpdE1hcHMsIGFuaW1hdGlvbkNvbmZpZywgZWRpdG9yXG4vLyByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBkYXRhSWRcbmZ1bmN0aW9uIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2YWx1ZTogYW55LCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgcmVwbGFjZWQgPSB2YWx1ZVxuICAgICAgLm1hcCh2ID0+IGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2LCBkYXRhSWQsIGRhdGFJZFRvUmVwbGFjZSkpXG4gICAgICAuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLmRhdGFJZCA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZGF0YUlkID09PSBkYXRhSWQpIHtcbiAgICAvLyBvdGhlcnNcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBkYXRhSWQ6IGRhdGFJZFRvUmVwbGFjZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhSWQpICYmIHZhbHVlLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKSB7XG4gICAgLy8gZmlsdGVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZGF0YUlkOiB2YWx1ZS5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvUmVwbGFjZSA6IGQpKVxuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUuY29uZmlnPy5kYXRhSWQgJiYgdmFsdWUuY29uZmlnPy5kYXRhSWQgPT09IGRhdGFJZCkge1xuICAgIC8vIGxheWVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLnZhbHVlLmNvbmZpZyxcbiAgICAgICAgZGF0YUlkOiBkYXRhSWRUb1JlcGxhY2VcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGRhdGFJZCkpIHtcbiAgICAvLyBmb3IgdmFsdWUgc2F2ZWQgYXMge1tkYXRhSWRdOiB7Li4ufX1cbiAgICByZXR1cm4ge1tkYXRhSWRUb1JlcGxhY2VdOiB2YWx1ZVtkYXRhSWRdfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBGaW5kIGRhdGFzZXRJZHMgZGVyaXZlZCBhIHNhdmVkIHZpc1N0YXRlIFByb3BlcnR5O1xuZnVuY3Rpb24gZmluZENoaWxkRGF0YXNldElkcyh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBmb3IgbGF5ZXJzLCBmaWx0ZXJzLCBjYWxsIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyBvbiBlYWNoIGl0ZW0gaW4gYXJyYXlcbiAgICBjb25zdCBjaGlsZERhdGFJZHMgPSB2YWx1ZS5tYXAoZmluZENoaWxkRGF0YXNldElkcykuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIGNoaWxkRGF0YUlkcy5sZW5ndGggPyBjaGlsZERhdGFJZHMgOiBudWxsO1xuICB9XG5cbiAgLy8gY2hpbGQgZGF0YSBpZCB1c3VhbGx5IHN0b3JlcyBpbiB0aGUgZGVyaXZlZCBkYXRhc2V0IGluZm9cbiAgcmV0dXJuIHZhbHVlPy5uZXdEYXRhc2V0Py5pbmZvLmlkIHx8IG51bGw7XG59XG5cbi8vIG1vdmVkIHVubWVyZ2VkIGxheWVycywgZmlsdGVycywgaW50ZXJhY3Rpb25zXG5mdW5jdGlvbiBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCBwcm9wVmFsdWVzLCB7cHJvcCwgdG9NZXJnZVByb3AsIHNhdmVVbm1lcmdlZH0pIHtcbiAgLy8gcmVtb3ZlIHByb3AgdmFsdWUgZnJvbSBzdGF0ZVxuICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHJlbW92ZSB1cGRhdGVyIHRvIG1lcmdlciBhcyB3ZWxsP1xuICBpZiAoIXByb3BWYWx1ZXMpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgc3RhdGVSZW1vdmVkID1cbiAgICBwcm9wID09PSAnbGF5ZXJzJ1xuICAgICAgPyBwcm9wVmFsdWVzLnJlZHVjZSgoYWNjdSwgcHJvcFZhbHVlKSA9PiByZW1vdmVMYXllclVwZGF0ZXIoYWNjdSwge2lkOiBwcm9wVmFsdWUuaWR9KSwgc3RhdGUpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoc3RhdGVbcHJvcF0pXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBbcHJvcF06IHN0YXRlW3Byb3BdLmZpbHRlcihwID0+ICFwcm9wVmFsdWVzLmZpbmQocHJvcFZhbHVlID0+IHAuaWQgPT09IHByb3BWYWx1ZS5pZCkpXG4gICAgICAgIH1cbiAgICAgIDogLy8gaWYgbm90IGFycmF5LCB3ZSB3b24ndCByZW1vdmUgaXQsIHJlbW92ZSBkYXRhc2V0IHNob3VsZCBoYW5kbGUgaXRcbiAgICAgICAgc3RhdGU7XG5cbiAgLy8gbW92ZSB0byBzdGF0ZVRvQmVNZXJnZWRcbiAgY29uc3QgdG9CZU1lcmdlZCA9IHtcbiAgICBbdG9NZXJnZVByb3BdOiBzYXZlVW5tZXJnZWRcbiAgICAgID8gLy8gY2FsbCBtZXJnZSBzYXZlVW5tZXJnZWQgbWV0aG9kXG4gICAgICAgIHNhdmVVbm1lcmdlZChzdGF0ZVJlbW92ZWQsIHByb3BWYWx1ZXMpXG4gICAgICA6IC8vIGlmIHRvTWVyZ2VQcm9wIGlzIGFyYWF5LCBhcHBlbmQgdG8gaXRcbiAgICAgIEFycmF5LmlzQXJyYXkoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8gWy4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sIC4uLnByb3BWYWx1ZXNdXG4gICAgICA6IC8vIHNhdmUgcHJvcFZhbHVlcyB0byB0b01lcmdlXG4gICAgICBpc09iamVjdChzdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSxcbiAgICAgICAgICAuLi5wcm9wVmFsdWVzXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGVSZW1vdmVkLFxuICAgIC4uLnRvQmVNZXJnZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZURhdGFzZXRBbmREZXBzPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIHJldHVybiBjb21wb3NlXzxUPihbXG4gICAgYXBwbHlfKHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUsIHtkYXRhSWQsIGRhdGFJZFRvVXNlfSksXG4gICAgYXBwbHlfKHJlbW92ZURhdGFzZXRVcGRhdGVyLCB7ZGF0YUlkfSlcbiAgXSkoc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2U8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIGRhdGFJZDogc3RyaW5nLFxuICBkYXRhSWRUb1VzZTogc3RyaW5nXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoc3RhdGUsIHN0YXRlLnNjaGVtYSk7XG4gIGNvbnN0IG5leHRTdGF0ZSA9IHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhzdGF0ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSk7XG4gIC8vIG1ha2UgYSBjb3B5IG9mIGxheWVyT3JkZXIsIGJlY2F1c2UgbGF5ZXIgaWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgYnkgY2FsbGluZyByZW1vdmVMYXllclVwZGF0ZXJcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gWy4uLnN0YXRlLmxheWVyT3JkZXJdO1xuXG4gIC8vIHByZXNlcnZlIGRhdGFzZXQgb3JkZXJcbiAgbmV4dFN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyID0gT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpLm1hcChkID0+XG4gICAgZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkXG4gICk7XG5cbiAgLy8gcHJlc2VydmVMYXllck9yZGVyXG4gIGlmIChuZXh0U3RhdGUubGF5ZXJUb0JlTWVyZ2VkPy5sZW5ndGgpIHtcbiAgICAvLyBjb3B5IHNwbGl0IG1hcHMgdG8gYmUgbWVyZ2VkLCBiZWNhdXNlIGl0IHdpbGwgYmUgcmVzZXQgaW4gcmVtb3ZlIGxheWVyXG4gICAgbmV4dFN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQgPSBzZXJpYWxpemVkU3RhdGU/LnNwbGl0TWFwcyA/PyBbXTtcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlciA9IFsuLi5wcmVzZXJ2ZUxheWVyT3JkZXJdO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGU8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtkYXRhSWQsIGRhdGFJZFRvVXNlfToge2RhdGFJZDogc3RyaW5nOyBkYXRhSWRUb1VzZTogc3RyaW5nfVxuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHN0YXRlLm1lcmdlcnMucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VTdGF0ZSxcbiAgICAgIHtwcm9wLCB0b01lcmdlUHJvcCwgcmVwbGFjZVBhcmVudERhdGFzZXRJZHMsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkLCBwcmVzZXJ2ZU9yZGVyfVxuICAgICkgPT4ge1xuICAgICAgLy8gZ2V0IGRhdGFzZXQgaWRzIHRoYXQgYXJlIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICBjb25zdCBwcm9wcyA9IHRvQXJyYXkocHJvcCk7XG4gICAgICBjb25zdCB0b01lcmdlUHJvcHMgPSB0b0FycmF5KHRvTWVyZ2VQcm9wKTtcbiAgICAgIGNvbnN0IHNhdmVkUHJvcHMgPSBzZXJpYWxpemVkU3RhdGUgPyBwcm9wcy5tYXAocCA9PiBzZXJpYWxpemVkU3RhdGVbcF0pIDogW107XG5cbiAgICAgIGxldCByZXBsYWNlZFN0YXRlID0gYWNjdVN0YXRlO1xuICAgICAgc2F2ZWRQcm9wcy5mb3JFYWNoKChwcm9wVmFsdWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbWVyZ2VyT3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wc1tpXSxcbiAgICAgICAgICB0b01lcmdlUHJvcDogdG9NZXJnZVByb3BzW2ldLFxuICAgICAgICAgIGdldENoaWxkRGF0YXNldElkcyxcbiAgICAgICAgICBzYXZlVW5tZXJnZWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXBsYWNlZEl0ZW0gPVxuICAgICAgICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzPy4ocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKSB8fFxuICAgICAgICAgIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyhwcm9wVmFsdWUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAgICAgICByZXBsYWNlZFN0YXRlID0gcmVwbGFjZWRJdGVtXG4gICAgICAgICAgPyByZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZShyZXBsYWNlZFN0YXRlLCByZXBsYWNlZEl0ZW0sIG1lcmdlck9wdGlvbnMpXG4gICAgICAgICAgOiByZXBsYWNlZFN0YXRlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW21lcmdlck9wdGlvbnMudG9NZXJnZVByb3BdPy5sZW5ndGggJiZcbiAgICAgICAgICBwcmVzZXJ2ZU9yZGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcGxhY2VkU3RhdGVbcHJlc2VydmVPcmRlcl0gPSBwcm9wVmFsdWUubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVwbGFjZWRTdGF0ZTtcbiAgICB9LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUoXG4gIHN0YXRlLFxuICByZXBsYWNlZEl0ZW0sXG4gIHtwcm9wLCB0b01lcmdlUHJvcCwgZ2V0Q2hpbGREYXRhc2V0SWRzLCBzYXZlVW5tZXJnZWR9XG4pIHtcbiAgLy8gcHJvcCBpcyBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0IHRvIGJlIHJlcGxhY2VkXG4gIC8vIHJlbW92ZSBwcm9wIGZyb20gc3RhdGUsIGFuZCBtb3ZlIGl0IHRvIHRvQmVNZXJnZWRcbiAgbGV0IG5leHRTdGF0ZSA9IG1vdmVWYWx1ZVRvQmVNZXJnZWQoc3RhdGUsIHJlcGxhY2VkSXRlbSwge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KTtcbiAgY29uc3QgY2hpbGREYXRhSWRzID0gZ2V0Q2hpbGREYXRhc2V0SWRzPy4ocmVwbGFjZWRJdGVtKSB8fCBmaW5kQ2hpbGREYXRhc2V0SWRzKHJlcGxhY2VkSXRlbSk7XG5cbiAgaWYgKGNoaWxkRGF0YUlkcykge1xuICAgIG5leHRTdGF0ZSA9IHRvQXJyYXkoY2hpbGREYXRhSWRzKS5yZWR1Y2UoKGFjY3UsIGNoaWxkRGF0YUlkKSA9PiB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgY2hpbGQgZGF0YXNldCBpZCxcbiAgICAgIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIG1vdmUgb3V0IG9mIHN0YXRlIGFuZCBtZXJnZSBiYWNrIGluXG4gICAgICByZXR1cm4gcmVwbGFjZURhdGFzZXRBbmREZXBzKGFjY3UsIGNoaWxkRGF0YUlkLCBjaGlsZERhdGFJZCk7XG4gICAgfSwgbmV4dFN0YXRlKTtcbiAgfVxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLElBQUksUUFBTyxZQUFZO0FBRS9CLE9BQU9DLElBQUksTUFBTSxtQkFBbUI7QUFDcEMsT0FBT0MsU0FBUyxNQUFNLFdBQVc7QUFDakMsU0FBUUMsT0FBTyxJQUFJQyxPQUFPLFFBQU8sZUFBZTtBQUNoRCxPQUFPQyxTQUFTLE1BQU0sa0JBQWtCO0FBQ3hDLE9BQU9DLEdBQUcsTUFBTSxZQUFZO0FBQzVCLE9BQU9DLE9BQU8sTUFBTSxnQkFBZ0I7QUFDcEMsT0FBT0MsSUFBSSxNQUFNLGFBQWE7QUFDOUIsT0FBT0MsSUFBSSxNQUFNLGFBQWE7QUFDOUIsT0FBT0MsR0FBRyxNQUFNLFlBQVk7QUFDNUIsT0FBT0MsSUFBSSxJQUFHQyxxQkFBcUIsRUFBRUMsUUFBUSxRQUFPLGtCQUFrQjtBQUN0RTtBQUNBLFNBQ0VDLFVBQVUsRUFDVkMsV0FBVyxFQUNYQyxjQUFjLEVBQ2RDLGlCQUFpQixFQUNqQkMsV0FBVyxRQUNOLGtCQUFrQjtBQUN6QjtBQUNBLFNBQ0VDLGVBQWUsRUFNZkMsZ0JBQWdCLEVBQ2hCQyx1QkFBdUIsRUFDdkJDLGlCQUFpQixFQUNqQkMsZUFBZSxFQUNmQyxvQkFBb0IsRUFDcEJDLDhCQUE4QixFQUM5QkMsbUJBQW1CLEVBQ25CQyxZQUFZLEVBQ1pDLGdCQUFnQixFQUNoQkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JDLFNBQVMsRUFDVEMsa0JBQWtCLEVBQ2xCQyxT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