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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/combined-updaters.d.ts +30 -1
  2. package/dist/combined-updaters.js +222 -4
  3. package/dist/composer-helpers.d.ts +7 -4
  4. package/dist/composer-helpers.js +18 -9
  5. package/dist/composers.d.ts +6 -0
  6. package/dist/composers.js +3 -3
  7. package/dist/core.d.ts +1 -1
  8. package/dist/core.js +16 -6
  9. package/dist/data-utils.js +2 -3
  10. package/dist/export-utils.js +2 -2
  11. package/dist/index.d.ts +2 -3
  12. package/dist/index.js +37 -16
  13. package/dist/interaction-utils.d.ts +1 -5
  14. package/dist/interaction-utils.js +5 -10
  15. package/dist/layer-utils.d.ts +39 -10
  16. package/dist/layer-utils.js +110 -35
  17. package/dist/map-state-updaters.d.ts +33 -2
  18. package/dist/map-state-updaters.js +278 -19
  19. package/dist/map-state.d.ts +74 -2
  20. package/dist/map-state.js +3 -3
  21. package/dist/map-style-updaters.d.ts +30 -17
  22. package/dist/map-style-updaters.js +303 -84
  23. package/dist/map-style.js +3 -3
  24. package/dist/merger-handler.d.ts +10 -0
  25. package/dist/merger-handler.js +143 -0
  26. package/dist/middleware.js +2 -2
  27. package/dist/provider-state-updaters.js +2 -2
  28. package/dist/provider-state.js +2 -2
  29. package/dist/root.d.ts +1 -8
  30. package/dist/root.js +25 -11
  31. package/dist/ui-state-updaters.d.ts +9 -2
  32. package/dist/ui-state-updaters.js +88 -63
  33. package/dist/ui-state.js +3 -3
  34. package/dist/vis-state-merger.d.ts +47 -13
  35. package/dist/vis-state-merger.js +393 -107
  36. package/dist/vis-state-selectors.js +2 -2
  37. package/dist/vis-state-updaters.d.ts +136 -10
  38. package/dist/vis-state-updaters.js +924 -262
  39. package/dist/vis-state.d.ts +210 -2
  40. package/dist/vis-state.js +3 -3
  41. package/package.json +20 -18
@@ -1,4 +1,4 @@
1
- // Copyright (c) 2022 Uber Technologies, Inc.
1
+ // Copyright (c) 2023 Uber Technologies, Inc.
2
2
  //
3
3
  // Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  // of this software and associated documentation files (the "Software"), to deal
@@ -29,17 +29,24 @@ Object.defineProperty(exports, "__esModule", {
29
29
  });
30
30
  exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
31
31
  exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
32
+ exports.applyLayerConfigUpdater = applyLayerConfigUpdater;
32
33
  exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
34
+ exports.layerSetIsValidUpdater = layerSetIsValidUpdater;
33
35
  exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
34
36
  exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
37
+ exports.setInitialLayerConfig = setInitialLayerConfig;
35
38
  exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
36
39
  exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
37
40
  exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
38
41
  exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
39
42
  exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
40
43
  exports.setFilterUpdater = setFilterUpdater;
44
+ exports.removeLayerUpdater = removeLayerUpdater;
45
+ exports.removeDatasetUpdater = removeDatasetUpdater;
41
46
  exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
47
+ exports.applyMergersUpdater = applyMergersUpdater;
42
48
  exports.renameDatasetUpdater = renameDatasetUpdater;
49
+ exports.updateDatasetPropsUpdater = updateDatasetPropsUpdater;
43
50
  exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
44
51
  exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
45
52
  exports.loadNextFileUpdater = loadNextFileUpdater;
@@ -58,13 +65,18 @@ exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
58
65
  exports.sortTableColumnUpdater = sortTableColumnUpdater;
59
66
  exports.pinTableColumnUpdater = pinTableColumnUpdater;
60
67
  exports.copyTableColumnUpdater = copyTableColumnUpdater;
68
+ exports.setColumnDisplayFormatUpdater = setColumnDisplayFormatUpdater;
61
69
  exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
62
70
  exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
63
71
  exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
64
- exports.setSelectedFeatureUpdater = exports.setEditorModeUpdater = exports.setMapInfoUpdater = exports.applyCPUFilterUpdater = exports.loadFilesErrUpdater = exports.nextFileBatchUpdater = exports.loadFilesUpdater = exports.updateVisDataUpdater = exports.toggleLayerForMapUpdater = exports.toggleSplitMapUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = exports.layerClickUpdater = exports.layerHoverUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.updateTableColorUpdater = exports.showDatasetTableUpdater = exports.updateLayerBlendingUpdater = exports.removeDatasetUpdater = exports.reorderLayerUpdater = exports.duplicateLayerUpdater = exports.removeLayerUpdater = exports.addLayerUpdater = exports.removeFilterUpdater = exports.toggleFilterFeatureUpdater = exports.enlargeFilterUpdater = exports.updateLayerAnimationSpeedUpdater = exports.setLayerAnimationTimeUpdater = exports.updateFilterAnimationSpeedUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationUpdater = exports.toggleFilterAnimationUpdater = exports.layerColorUIChangeUpdater = exports.addFilterUpdater = exports.setFilterPlotUpdater = exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = exports.defaultInteractionConfig = void 0;
72
+ exports.prepareStateForDatasetReplace = prepareStateForDatasetReplace;
73
+ exports.replaceDatasetDepsInState = replaceDatasetDepsInState;
74
+ exports.setSelectedFeatureUpdater = exports.setEditorModeUpdater = exports.setMapInfoUpdater = exports.applyCPUFilterUpdater = exports.loadFilesErrUpdater = exports.nextFileBatchUpdater = exports.loadFilesUpdater = exports.updateVisDataUpdater = exports.toggleLayerForMapUpdater = exports.toggleSplitMapUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = exports.layerClickUpdater = exports.layerHoverUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.updateTableColorUpdater = exports.showDatasetTableUpdater = exports.updateOverlayBlendingUpdater = exports.updateLayerBlendingUpdater = exports.updateEffectUpdater = exports.reorderEffectUpdater = exports.removeEffectUpdater = exports.addEffectUpdater = exports.duplicateLayerUpdater = exports.reorderLayerUpdater = exports.addLayerUpdater = exports.removeFilterUpdater = exports.toggleFilterFeatureUpdater = exports.setFilterViewUpdater = exports.updateLayerAnimationSpeedUpdater = exports.setLayerAnimationTimeUpdater = exports.updateFilterAnimationSpeedUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationUpdater = exports.toggleFilterAnimationUpdater = exports.layerColorUIChangeUpdater = exports.addFilterUpdater = exports.setFilterPlotUpdater = exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = exports.defaultInteractionConfig = void 0;
65
75
 
66
76
  var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
67
77
 
78
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
79
+
68
80
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
69
81
 
70
82
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
@@ -83,8 +95,14 @@ var _lodash3 = _interopRequireDefault(require("lodash.get"));
83
95
 
84
96
  var _lodash4 = _interopRequireDefault(require("lodash.xor"));
85
97
 
98
+ var _lodash5 = _interopRequireDefault(require("lodash.pick"));
99
+
100
+ var _lodash6 = _interopRequireDefault(require("lodash.isequal"));
101
+
86
102
  var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
87
103
 
104
+ var _deepmerge = _interopRequireDefault(require("deepmerge"));
105
+
88
106
  var _tasks2 = require("@kepler.gl/tasks");
89
107
 
90
108
  var _actions = require("@kepler.gl/actions");
@@ -93,6 +111,8 @@ var _utils = require("@kepler.gl/utils");
93
111
 
94
112
  var _visStateMerger = require("./vis-state-merger");
95
113
 
114
+ var _mergerHandler = require("./merger-handler");
115
+
96
116
  var _layers = require("@kepler.gl/layers");
97
117
 
98
118
  var _constants = require("@kepler.gl/constants");
@@ -107,16 +127,18 @@ var _table = require("@kepler.gl/table");
107
127
 
108
128
  var _interactionUtils = require("./interaction-utils");
109
129
 
130
+ var _effects = require("@kepler.gl/effects");
131
+
132
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
133
+
134
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
135
+
110
136
  function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
111
137
 
112
138
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
113
139
 
114
140
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
115
141
 
116
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
117
-
118
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
119
-
120
142
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
121
143
 
122
144
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -208,7 +230,9 @@ var DEFAULT_ANIMATION_CONFIG = {
208
230
  isAnimating: false,
209
231
  timeFormat: null,
210
232
  timezone: null,
211
- defaultTimeFormat: null
233
+ defaultTimeFormat: null,
234
+ hideControl: false,
235
+ duration: null
212
236
  };
213
237
  exports.DEFAULT_ANIMATION_CONFIG = DEFAULT_ANIMATION_CONFIG;
214
238
  var DEFAULT_EDITOR = {
@@ -242,9 +266,13 @@ var INITIAL_VIS_STATE = {
242
266
  // a collection of multiple dataset
243
267
  datasets: {},
244
268
  editingDataset: undefined,
269
+ // effects
270
+ effects: [],
271
+ effectOrder: [],
245
272
  interactionConfig: defaultInteractionConfig,
246
- interactionToBeMerged: undefined,
273
+ interactionToBeMerged: {},
247
274
  layerBlending: 'normal',
275
+ overlayBlending: 'normal',
248
276
  hoverInfo: undefined,
249
277
  clicked: undefined,
250
278
  mousePos: {},
@@ -259,6 +287,7 @@ var INITIAL_VIS_STATE = {
259
287
  // ]
260
288
  ],
261
289
  splitMapsToBeMerged: [],
290
+ isMergingDatasets: {},
262
291
  // defaults layer classes
263
292
  layerClasses: _layers.LayerClasses,
264
293
  // default animation
@@ -274,13 +303,12 @@ var INITIAL_VIS_STATE = {
274
303
  // kepler schemas
275
304
  schema: _schemas["default"]
276
305
  };
306
+ exports.INITIAL_VIS_STATE = INITIAL_VIS_STATE;
307
+
277
308
  /**
278
309
  * Update state with updated layer and layerData
279
310
  *
280
311
  */
281
-
282
- exports.INITIAL_VIS_STATE = INITIAL_VIS_STATE;
283
-
284
312
  function updateStateWithLayerAndData(state, _ref) {
285
313
  var layerData = _ref.layerData,
286
314
  layer = _ref.layer,
@@ -310,11 +338,154 @@ function updateStateOnLayerVisibilityChange(state, layer) {
310
338
 
311
339
  return newState;
312
340
  }
341
+ /**
342
+ * Compares two objects (or arrays) and returns a new object with only the
343
+ * properties that have changed between the two objects.
344
+ */
345
+
346
+
347
+ function pickChangedProps(prev, next) {
348
+ var changedProps = {};
349
+
350
+ var pickPropsOf = function pickPropsOf(obj) {
351
+ Object.keys(obj).forEach(function (key) {
352
+ if (!changedProps.hasOwnProperty(key) && !(0, _lodash6["default"])(prev[key], next[key])) {
353
+ changedProps[key] = next[key];
354
+ }
355
+ });
356
+ };
357
+
358
+ pickPropsOf(prev);
359
+ pickPropsOf(next);
360
+ return changedProps;
361
+ }
362
+
363
+ var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
364
+ /**
365
+ * Apply layer config
366
+ * @memberof visStateUpdaters
367
+ * @returns nextState
368
+ */
369
+ // eslint-disable-next-line complexity, max-statements
370
+
371
+ function applyLayerConfigUpdater(state, action) {
372
+ var _serializeLayer;
373
+
374
+ var oldLayerId = action.oldLayerId,
375
+ newLayerConfig = action.newLayerConfig,
376
+ layerIndex = action.layerIndex;
377
+ var newParsedLayer = // will move visualChannels to the config prop
378
+ (0, _visStateMerger.parseLayerConfig)(state.schema, newLayerConfig);
379
+ var oldLayer = state.layers.find(function (l) {
380
+ return l.id === oldLayerId;
381
+ });
382
+
383
+ if (!oldLayer || !newParsedLayer) {
384
+ return state;
385
+ }
386
+
387
+ if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
388
+ // layerIndex is provided, but it doesn't match the oldLayer
389
+ return state;
390
+ }
391
+
392
+ var dataset = state.datasets[newParsedLayer.config.dataId];
393
+
394
+ if (!dataset) {
395
+ return state;
396
+ } // Make sure the layer is valid and convert it to Layer
397
+
398
+
399
+ var newLayer = (0, _visStateMerger.validateLayerWithData)(dataset, newParsedLayer, state.layerClasses);
400
+
401
+ if (!newLayer) {
402
+ return state;
403
+ }
404
+
405
+ var nextState = state;
406
+
407
+ if (newLayer.type && newLayer.type !== oldLayer.type) {
408
+ var oldLayerIndex = state.layers.findIndex(function (l) {
409
+ return l.id === oldLayerId;
410
+ });
411
+
412
+ if (oldLayerIndex >= 0) {
413
+ nextState = layerTypeChangeUpdater(nextState, (0, _actions.layerTypeChange)(oldLayer, newLayer.type)); // layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
414
+ // but first make sure that the layer was not removed
415
+
416
+ if (nextState.layers.length === state.layers.length) {
417
+ var newLayerId = nextState.layers[oldLayerIndex].id;
418
+ nextState = applyLayerConfigUpdater(nextState, (0, _actions.applyLayerConfig)(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
419
+ id: newLayerId
420
+ })));
421
+ }
422
+ }
423
+
424
+ return nextState;
425
+ } // serializeLayer() might return null if the old layer is not valid,
426
+ // we should still apply the changes in that case
427
+
428
+
429
+ var serializedOldLayer = (_serializeLayer = (0, _visStateMerger.serializeLayer)(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
430
+ config: {}
431
+ };
432
+ var serializedNewLayer = (0, _visStateMerger.serializeLayer)(newLayer, state.schema);
433
+
434
+ if (!serializedNewLayer) {
435
+ return state;
436
+ }
437
+
438
+ if (!(0, _lodash6["default"])(serializedOldLayer, serializedNewLayer)) {
439
+ var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
440
+
441
+ if ('visConfig' in changed) {
442
+ if (changed.visConfig) {
443
+ nextState = layerVisConfigChangeUpdater(nextState, (0, _actions.layerVisConfigChange)(oldLayer, changed.visConfig));
444
+ }
445
+
446
+ delete changed.visConfig;
447
+ }
448
+
449
+ Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
450
+ var channel = oldLayer.visualChannels[channelName];
451
+ var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
452
+ return channel[prop];
453
+ });
454
+
455
+ if (channelPropNames.some(function (prop) {
456
+ return prop in changed;
457
+ })) {
458
+ nextState = layerVisualChannelChangeUpdater(nextState, (0, _actions.layerVisualChannelConfigChange)(oldLayer, (0, _lodash5["default"])(newLayer.config, channelPropNames), channelName));
459
+
460
+ var _iterator = _createForOfIteratorHelper(channelPropNames),
461
+ _step;
462
+
463
+ try {
464
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
465
+ var prop = _step.value;
466
+ delete changed[prop];
467
+ }
468
+ } catch (err) {
469
+ _iterator.e(err);
470
+ } finally {
471
+ _iterator.f();
472
+ }
473
+ }
474
+ });
475
+
476
+ if (Object.keys(changed).length > 0) {
477
+ nextState = layerConfigChangeUpdater(nextState, (0, _actions.layerConfigChange)(oldLayer, (0, _lodash5["default"])(newLayer.config, Object.keys(changed))));
478
+ }
479
+ }
480
+
481
+ return nextState;
482
+ }
313
483
  /**
314
484
  * Update layer base config: dataId, label, column, isVisible
315
485
  * @memberof visStateUpdaters
316
486
  * @returns nextState
317
487
  */
488
+ // eslint-disable-next-line complexity
318
489
 
319
490
 
320
491
  function layerConfigChangeUpdater(state, action) {
@@ -324,7 +495,7 @@ function layerConfigChangeUpdater(state, action) {
324
495
  });
325
496
  var props = Object.keys(action.newConfig);
326
497
 
327
- if (typeof action.newConfig.dataId === 'string') {
498
+ if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
328
499
  var _action$newConfig = action.newConfig,
329
500
  dataId = _action$newConfig.dataId,
330
501
  restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, ["dataId"]);
@@ -344,13 +515,13 @@ function layerConfigChangeUpdater(state, action) {
344
515
  }
345
516
 
346
517
  var newLayer = oldLayer.updateLayerConfig(action.newConfig);
347
- var layerData; // let newLayer;
518
+ var layerData;
348
519
 
349
520
  if (newLayer.shouldCalculateLayerData(props)) {
350
521
  var oldLayerData = state.layerData[idx];
351
522
  var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
352
- layerData = updateLayerDataResult.layerData;
353
523
  newLayer = updateLayerDataResult.layer;
524
+ layerData = updateLayerDataResult.layerData;
354
525
  }
355
526
 
356
527
  var newState = state;
@@ -365,8 +536,54 @@ function layerConfigChangeUpdater(state, action) {
365
536
  idx: idx
366
537
  });
367
538
  }
539
+ /**
540
+ * Updates isValid flag of a layer.
541
+ * Updates isVisible based on the value of isValid.
542
+ * Triggers update of data for the layer in order to get errors again during next update iteration.
543
+ * @memberof visStateUpdaters
544
+ * @returns nextState
545
+ */
546
+
547
+
548
+ function layerSetIsValidUpdater(state, action) {
549
+ var oldLayer = action.oldLayer,
550
+ isValid = action.isValid;
551
+ var idx = state.layers.findIndex(function (l) {
552
+ return l.id === oldLayer.id;
553
+ });
554
+ var layerToUpdate = state.layers[idx];
555
+
556
+ if (layerToUpdate) {
557
+ var newLayer;
558
+ var newData = null;
559
+
560
+ if (isValid) {
561
+ // Trigger data update in order to show errors again if present.
562
+ var _calculateLayerData = (0, _layerUtils.calculateLayerData)(layerToUpdate, state, undefined),
563
+ layer = _calculateLayerData.layer,
564
+ layerData = _calculateLayerData.layerData;
565
+
566
+ newLayer = layer;
567
+ newData = layerData;
568
+ } else {
569
+ newLayer = layerToUpdate.updateLayerConfig({
570
+ isVisible: false
571
+ });
572
+ newLayer.isValid = false;
573
+ }
574
+
575
+ return updateStateWithLayerAndData(state, {
576
+ idx: idx,
577
+ layer: newLayer,
578
+ layerData: newData
579
+ });
580
+ }
581
+
582
+ return state;
583
+ }
368
584
 
369
585
  function addOrRemoveTextLabels(newFields, textLabel) {
586
+ var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.DEFAULT_TEXT_LABEL;
370
587
  var newTextLabel = textLabel.slice();
371
588
  var currentFields = textLabel.map(function (tl) {
372
589
  return tl.field && tl.field.name;
@@ -385,12 +602,12 @@ function addOrRemoveTextLabels(newFields, textLabel) {
385
602
  newTextLabel = newTextLabel.filter(function (tl) {
386
603
  return tl.field && !deleteFields.includes(tl.field.name);
387
604
  });
388
- newTextLabel = !newTextLabel.length ? [_constants.DEFAULT_TEXT_LABEL] : newTextLabel; // add
605
+ newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel; // add
389
606
 
390
607
  newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
391
608
  return tl.field;
392
609
  })), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
393
- return _objectSpread(_objectSpread({}, _constants.DEFAULT_TEXT_LABEL), {}, {
610
+ return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
394
611
  field: af
395
612
  });
396
613
  })));
@@ -404,13 +621,13 @@ function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
404
621
 
405
622
  var newTextLabel = textLabel.slice();
406
623
 
407
- if (prop && (value || textLabel.length === 1)) {
624
+ if (prop === 'field' && value === null && textLabel.length > 1) {
625
+ // remove label when field value is set to null
626
+ newTextLabel.splice(idx, 1);
627
+ } else if (prop) {
408
628
  newTextLabel = textLabel.map(function (tl, i) {
409
629
  return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
410
630
  });
411
- } else if (prop === 'field' && value === null && textLabel.length > 1) {
412
- // remove label when field value is set to null
413
- newTextLabel.splice(idx, 1);
414
631
  }
415
632
 
416
633
  return newTextLabel;
@@ -423,20 +640,27 @@ function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
423
640
 
424
641
 
425
642
  function layerTextLabelChangeUpdater(state, action) {
643
+ var _oldLayer$getDefaultL, _oldLayer$getDefaultL2, _oldLayer$getDefaultL3;
644
+
426
645
  var oldLayer = action.oldLayer,
427
646
  idx = action.idx,
428
647
  prop = action.prop,
429
648
  value = action.value;
430
- var textLabel = oldLayer.config.textLabel;
649
+ var textLabel = oldLayer.config.textLabel; // when adding a new empty text label,
650
+ // rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
651
+
652
+ var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
653
+ dataId: ''
654
+ })) === null || _oldLayer$getDefaultL2 === void 0 ? void 0 : (_oldLayer$getDefaultL3 = _oldLayer$getDefaultL2.textLabel) === null || _oldLayer$getDefaultL3 === void 0 ? void 0 : _oldLayer$getDefaultL3[0]) !== null && _oldLayer$getDefaultL !== void 0 ? _oldLayer$getDefaultL : _constants.DEFAULT_TEXT_LABEL;
431
655
  var newTextLabel = textLabel.slice();
432
656
 
433
657
  if (!textLabel[idx] && idx === textLabel.length) {
434
658
  // if idx is set to length, add empty text label
435
- newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [_constants.DEFAULT_TEXT_LABEL]);
659
+ newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [defaultTextLabel]);
436
660
  }
437
661
 
438
662
  if (idx === 'all' && prop === 'fields') {
439
- newTextLabel = addOrRemoveTextLabels(value, textLabel);
663
+ newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
440
664
  } else {
441
665
  newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
442
666
  } // update text label prop and value
@@ -450,11 +674,11 @@ function layerTextLabelChangeUpdater(state, action) {
450
674
  });
451
675
  }
452
676
 
453
- function validateExistingLayerWithData(dataset, layerClasses, layer) {
454
- var loadedLayer = (0, _visStateMerger.serializeLayer)(layer);
455
- return (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
677
+ function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
678
+ var loadedLayer = (0, _visStateMerger.serializeLayer)(layer, schema);
679
+ return loadedLayer ? (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
456
680
  allowEmptyColumn: true
457
- });
681
+ }) : null;
458
682
  }
459
683
  /**
460
684
  * Update layer config dataId
@@ -480,7 +704,7 @@ function layerDataIdChangeUpdater(state, action) {
480
704
  }); // this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
481
705
 
482
706
  if (newLayer.isValidToSave()) {
483
- var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer); // if cant validate it with data create a new one
707
+ var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema); // if cant validate it with data create a new one
484
708
 
485
709
  if (!validated) {
486
710
  // @ts-expect-error TODO: checking oldLayer.type !== null
@@ -499,9 +723,9 @@ function layerDataIdChangeUpdater(state, action) {
499
723
  });
500
724
  newLayer.updateLayerDomain(state.datasets);
501
725
 
502
- var _calculateLayerData = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
503
- layerData = _calculateLayerData.layerData,
504
- layer = _calculateLayerData.layer;
726
+ var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
727
+ layerData = _calculateLayerData2.layerData,
728
+ layer = _calculateLayerData2.layer;
505
729
 
506
730
  return updateStateWithLayerAndData(state, {
507
731
  layerData: layerData,
@@ -579,7 +803,8 @@ function layerTypeChangeUpdater(state, action) {
579
803
  var newLayer = new state.layerClasses[newType]({
580
804
  // keep old layer lable and isConfigActive
581
805
  label: oldLayer.config.label,
582
- isConfigActive: oldLayer.config.isConfigActive
806
+ isConfigActive: oldLayer.config.isConfigActive,
807
+ dataId: oldLayer.config.dataId
583
808
  });
584
809
 
585
810
  if (!oldLayer.type) {
@@ -601,9 +826,9 @@ function layerTypeChangeUpdater(state, action) {
601
826
  hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
602
827
  });
603
828
 
604
- var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
605
- layerData = _calculateLayerData2.layerData,
606
- layer = _calculateLayerData2.layer;
829
+ var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
830
+ layerData = _calculateLayerData3.layerData,
831
+ layer = _calculateLayerData3.layer;
607
832
 
608
833
  newState = updateStateWithLayerAndData(newState, {
609
834
  layerData: layerData,
@@ -627,8 +852,14 @@ function layerTypeChangeUpdater(state, action) {
627
852
  }) : settings;
628
853
  })
629
854
  });
630
- }
855
+ } // update layerOrder with new id
631
856
 
857
+
858
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
859
+ layerOrder: newState.layerOrder.map(function (layerId) {
860
+ return layerId === oldLayer.id ? newLayer.id : layerId;
861
+ })
862
+ });
632
863
  return newState;
633
864
  }
634
865
  /**
@@ -656,9 +887,9 @@ function layerVisualChannelChangeUpdater(state, action) {
656
887
  newLayer.updateLayerVisualChannel(dataset, channel);
657
888
  var oldLayerData = state.layerData[idx];
658
889
 
659
- var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
660
- layerData = _calculateLayerData3.layerData,
661
- layer = _calculateLayerData3.layer;
890
+ var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
891
+ layerData = _calculateLayerData4.layerData,
892
+ layer = _calculateLayerData4.layer;
662
893
 
663
894
  return updateStateWithLayerAndData(state, {
664
895
  layerData: layerData,
@@ -689,9 +920,9 @@ function layerVisConfigChangeUpdater(state, action) {
689
920
  if (newLayer.shouldCalculateLayerData(props)) {
690
921
  var oldLayerData = state.layerData[idx];
691
922
 
692
- var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
693
- layerData = _calculateLayerData4.layerData,
694
- layer = _calculateLayerData4.layer;
923
+ var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
924
+ layerData = _calculateLayerData5.layerData,
925
+ layer = _calculateLayerData5.layer;
695
926
 
696
927
  return updateStateWithLayerAndData(state, {
697
928
  layerData: layerData,
@@ -741,6 +972,8 @@ function setFilterAnimationWindowUpdater(state, _ref2) {
741
972
 
742
973
 
743
974
  function setFilterUpdater(state, action) {
975
+ var _newFilter$layerId;
976
+
744
977
  var idx = action.idx,
745
978
  prop = action.prop,
746
979
  value = action.value,
@@ -813,7 +1046,7 @@ function setFilterUpdater(state, action) {
813
1046
 
814
1047
  datasetIds = layerDataIds; // Update newFilter dataIds
815
1048
 
816
- var newDataIds = (0, _lodash2["default"])(newFilter.layerId.map(function (lid) {
1049
+ var newDataIds = (0, _lodash2["default"])((_newFilter$layerId = newFilter.layerId) === null || _newFilter$layerId === void 0 ? void 0 : _newFilter$layerId.map(function (lid) {
817
1050
  return (0, _lodash3["default"])(state.layers.find(function (l) {
818
1051
  return l.id === lid;
819
1052
  }), ['config', 'dataId']);
@@ -830,12 +1063,12 @@ function setFilterUpdater(state, action) {
830
1063
  }
831
1064
 
832
1065
  var enlargedFilter = state.filters.find(function (f) {
833
- return f.enlarged;
1066
+ return f.view === _constants.FILTER_VIEW_TYPES.enlarged;
834
1067
  });
835
1068
 
836
1069
  if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
837
1070
  // there should be only one enlarged filter
838
- newFilter.enlarged = false;
1071
+ newFilter.view = _constants.FILTER_VIEW_TYPES.side;
839
1072
  } // save new filters to newState
840
1073
 
841
1074
 
@@ -898,7 +1131,10 @@ exports.setFilterPlotUpdater = setFilterPlotUpdater;
898
1131
 
899
1132
  var addFilterUpdater = function addFilterUpdater(state, action) {
900
1133
  return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
901
- filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)(action.dataId)])
1134
+ filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)({
1135
+ dataId: action.dataId,
1136
+ id: action.id
1137
+ })])
902
1138
  });
903
1139
  };
904
1140
  /**
@@ -1042,11 +1278,16 @@ var updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater
1042
1278
 
1043
1279
  exports.updateLayerAnimationSpeedUpdater = updateLayerAnimationSpeedUpdater;
1044
1280
 
1045
- var enlargeFilterUpdater = function enlargeFilterUpdater(state, action) {
1281
+ var setFilterViewUpdater = function setFilterViewUpdater(state, action) {
1282
+ var view = action.view,
1283
+ idx = action.idx;
1284
+ var shouldResetOtherFiltersView = view === _constants.FILTER_VIEW_TYPES.enlarged;
1046
1285
  return _objectSpread(_objectSpread({}, state), {}, {
1047
1286
  filters: state.filters.map(function (f, i) {
1048
- return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
1049
- enlarged: !f.enlarged
1287
+ return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
1288
+ view: view
1289
+ }) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
1290
+ view: _constants.FILTER_VIEW_TYPES.side
1050
1291
  }) : f;
1051
1292
  })
1052
1293
  });
@@ -1057,21 +1298,24 @@ var enlargeFilterUpdater = function enlargeFilterUpdater(state, action) {
1057
1298
  */
1058
1299
 
1059
1300
 
1060
- exports.enlargeFilterUpdater = enlargeFilterUpdater;
1301
+ exports.setFilterViewUpdater = setFilterViewUpdater;
1061
1302
 
1062
1303
  var toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
1063
1304
  var filter = state.filters[action.idx];
1064
1305
  var isVisible = (0, _lodash3["default"])(filter, ['value', 'properties', 'isVisible']);
1065
-
1066
- var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
1306
+ var newState = setFilterUpdater(state, {
1307
+ idx: action.idx,
1308
+ prop: 'enabled',
1309
+ value: !isVisible
1310
+ });
1311
+ newState = setFilterUpdater(newState, {
1312
+ idx: action.idx,
1313
+ prop: 'value',
1067
1314
  value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
1068
1315
  isVisible: !isVisible
1069
1316
  })
1070
1317
  });
1071
-
1072
- return _objectSpread(_objectSpread({}, state), {}, {
1073
- filters: Object.assign((0, _toConsumableArray2["default"])(state.filters), (0, _defineProperty2["default"])({}, action.idx, newFilter))
1074
- });
1318
+ return newState;
1075
1319
  };
1076
1320
  /**
1077
1321
  * Remove a filter
@@ -1138,7 +1382,8 @@ var addLayerUpdater = function addLayerUpdater(state, action) {
1138
1382
  return _objectSpread(_objectSpread({}, state), {}, {
1139
1383
  layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
1140
1384
  layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
1141
- layerOrder: [].concat((0, _toConsumableArray2["default"])(state.layerOrder), [state.layerOrder.length]),
1385
+ // add new layer at the top
1386
+ layerOrder: [newLayer.id].concat((0, _toConsumableArray2["default"])(state.layerOrder)),
1142
1387
  splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
1143
1388
  });
1144
1389
  };
@@ -1151,30 +1396,53 @@ var addLayerUpdater = function addLayerUpdater(state, action) {
1151
1396
 
1152
1397
  exports.addLayerUpdater = addLayerUpdater;
1153
1398
 
1154
- var removeLayerUpdater = function removeLayerUpdater(state, _ref7) {
1155
- var idx = _ref7.idx;
1399
+ function removeLayerUpdater(state, _ref7) {
1400
+ var id = _ref7.id;
1401
+ var idx = Number.isFinite(id) ? // support older API, remove layer by idx
1402
+ Number(id) : state.layers.findIndex(function (l) {
1403
+ return l.id === id;
1404
+ });
1405
+
1406
+ if (idx < 0 || idx >= state.layers.length) {
1407
+ // invalid index
1408
+ _window.console.warn("can not remove layer with invalid id|idx ".concat(id));
1409
+
1410
+ return state;
1411
+ }
1412
+
1156
1413
  var layers = state.layers,
1157
1414
  layerData = state.layerData,
1415
+ layerOrder = state.layerOrder,
1158
1416
  clicked = state.clicked,
1159
1417
  hoverInfo = state.hoverInfo;
1160
- var layerToRemove = state.layers[idx];
1161
- var newMaps = (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove);
1418
+ var layerToRemove = layers[idx];
1162
1419
 
1163
1420
  var newState = _objectSpread(_objectSpread({}, state), {}, {
1164
- layers: [].concat((0, _toConsumableArray2["default"])(layers.slice(0, idx)), (0, _toConsumableArray2["default"])(layers.slice(idx + 1, layers.length))),
1165
- layerData: [].concat((0, _toConsumableArray2["default"])(layerData.slice(0, idx)), (0, _toConsumableArray2["default"])(layerData.slice(idx + 1, layerData.length))),
1166
- layerOrder: state.layerOrder.filter(function (i) {
1167
- return i !== idx;
1168
- }).map(function (pid) {
1169
- return pid > idx ? pid - 1 : pid;
1421
+ layers: (0, _composerHelpers.filterOutById)(layerToRemove.id)(layers),
1422
+ layerData: (0, _composerHelpers.removeElementAtIndex)(idx)(layerData),
1423
+ layerOrder: layerOrder.filter(function (layerId) {
1424
+ return layerId !== layerToRemove.id;
1170
1425
  }),
1171
1426
  clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
1172
1427
  hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
1173
- splitMaps: newMaps // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
1428
+ splitMaps: (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove) // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
1174
1429
 
1175
1430
  });
1176
1431
 
1177
1432
  return updateAnimationDomain(newState);
1433
+ }
1434
+ /**
1435
+ * Reorder layer
1436
+ * @memberof visStateUpdaters
1437
+ * @public
1438
+ */
1439
+
1440
+
1441
+ var reorderLayerUpdater = function reorderLayerUpdater(state, _ref8) {
1442
+ var order = _ref8.order;
1443
+ return _objectSpread(_objectSpread({}, state), {}, {
1444
+ layerOrder: order
1445
+ });
1178
1446
  };
1179
1447
  /**
1180
1448
  * duplicate layer
@@ -1183,22 +1451,26 @@ var removeLayerUpdater = function removeLayerUpdater(state, _ref7) {
1183
1451
  */
1184
1452
 
1185
1453
 
1186
- exports.removeLayerUpdater = removeLayerUpdater;
1454
+ exports.reorderLayerUpdater = reorderLayerUpdater;
1187
1455
 
1188
- var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref8) {
1189
- var idx = _ref8.idx;
1190
- var layers = state.layers;
1191
- var original = state.layers[idx];
1192
- var originalLayerOrderIdx = state.layerOrder.findIndex(function (i) {
1193
- return i === idx;
1456
+ var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref9) {
1457
+ var id = _ref9.id;
1458
+ var idx = Number.isFinite(id) ? // support older API, remove layer by idx
1459
+ Number(id) : state.layers.findIndex(function (l) {
1460
+ return l.id === id;
1194
1461
  });
1195
1462
 
1196
- if (!original) {
1197
- _window.console.warn("layer.".concat(idx, " is undefined"));
1463
+ if (idx < 0 || !state.layers[idx]) {
1464
+ _window.console.warn("layer ".concat(idx, " not found in layerOrder"));
1198
1465
 
1199
1466
  return state;
1200
1467
  }
1201
1468
 
1469
+ var layers = state.layers;
1470
+ var original = layers[idx];
1471
+ var originalLayerOrderIdx = state.layerOrder.findIndex(function (lid) {
1472
+ return lid === original.id;
1473
+ });
1202
1474
  var newLabel = "Copy of ".concat(original.config.label);
1203
1475
  var postfix = 0; // eslint-disable-next-line no-loop-func
1204
1476
 
@@ -1209,7 +1481,7 @@ var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref8) {
1209
1481
  } // collect layer config from original
1210
1482
 
1211
1483
 
1212
- var loadedLayer = (0, _visStateMerger.serializeLayer)(original); // assign new id and label to copied layer
1484
+ var loadedLayer = (0, _visStateMerger.serializeLayer)(original, state.schema); // assign new id and label to copied layer
1213
1485
 
1214
1486
  if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
1215
1487
  return state;
@@ -1220,17 +1492,18 @@ var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref8) {
1220
1492
 
1221
1493
  var nextState = addLayerUpdater(state, {
1222
1494
  config: loadedLayer
1223
- }); // new added layer are at the end, move it to be on top of original layer
1495
+ }); // retrieve newly created layer
1496
+
1497
+ var newLayer = nextState.layers[nextState.layers.length - 1]; // update layer order with newLyaer.id
1224
1498
 
1225
- var newLayerOrderIdx = nextState.layerOrder.length - 1;
1226
- var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(0, newLayerOrderIdx), originalLayerOrderIdx, newLayerOrderIdx);
1227
- nextState = _objectSpread(_objectSpread({}, nextState), {}, {
1228
- layerOrder: newLayerOrder
1499
+ var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
1500
+ nextState = reorderLayerUpdater(nextState, {
1501
+ order: newLayerOrder
1229
1502
  });
1230
1503
  return updateAnimationDomain(nextState);
1231
1504
  };
1232
1505
  /**
1233
- * Reorder layer
1506
+ * Add a new effect
1234
1507
  * @memberof visStateUpdaters
1235
1508
  * @public
1236
1509
  */
@@ -1238,10 +1511,94 @@ var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref8) {
1238
1511
 
1239
1512
  exports.duplicateLayerUpdater = duplicateLayerUpdater;
1240
1513
 
1241
- var reorderLayerUpdater = function reorderLayerUpdater(state, _ref9) {
1242
- var order = _ref9.order;
1514
+ var addEffectUpdater = function addEffectUpdater(state, action) {
1515
+ var newEffect = (0, _effects.createDeckEffectFromConfig)(action.config); // collapse configurators for other effects
1516
+
1517
+ state.effects.forEach(function (effect) {
1518
+ return effect.updateConfig({
1519
+ isConfigActive: false
1520
+ });
1521
+ });
1522
+ var effects = [].concat((0, _toConsumableArray2["default"])(state.effects), [newEffect]);
1523
+ var effectOrder = (0, _utils.fixEffectOrder)(effects, [newEffect.id].concat((0, _toConsumableArray2["default"])(state.effectOrder)));
1243
1524
  return _objectSpread(_objectSpread({}, state), {}, {
1244
- layerOrder: order
1525
+ effects: effects,
1526
+ effectOrder: effectOrder
1527
+ });
1528
+ };
1529
+ /**
1530
+ * remove effect
1531
+ * @memberof visStateUpdaters
1532
+ * @public
1533
+ */
1534
+
1535
+
1536
+ exports.addEffectUpdater = addEffectUpdater;
1537
+
1538
+ var removeEffectUpdater = function removeEffectUpdater(state, _ref10) {
1539
+ var id = _ref10.id;
1540
+ var idx = state.effects.findIndex(function (l) {
1541
+ return l.id === id;
1542
+ });
1543
+
1544
+ if (idx < 0 || idx >= state.effects.length) {
1545
+ _window.console.warn("can not remove effect with invalid id ".concat(id));
1546
+
1547
+ return state;
1548
+ }
1549
+
1550
+ var effects = state.effects,
1551
+ effectOrder = state.effectOrder;
1552
+ var effectToRemove = effects[idx];
1553
+ return _objectSpread(_objectSpread({}, state), {}, {
1554
+ // @ts-expect-error fixed in ts
1555
+ effects: (0, _composerHelpers.filterOutById)(effectToRemove.id)(effects),
1556
+ effectOrder: effectOrder.filter(function (effectId) {
1557
+ return effectId !== effectToRemove.id;
1558
+ })
1559
+ });
1560
+ };
1561
+ /**
1562
+ * Reorder effect
1563
+ * @memberof visStateUpdaters
1564
+ * @public
1565
+ */
1566
+
1567
+
1568
+ exports.removeEffectUpdater = removeEffectUpdater;
1569
+
1570
+ var reorderEffectUpdater = function reorderEffectUpdater(state, _ref11) {
1571
+ var order = _ref11.order;
1572
+ return _objectSpread(_objectSpread({}, state), {}, {
1573
+ effectOrder: (0, _utils.fixEffectOrder)(state.effects, (0, _toConsumableArray2["default"])(order))
1574
+ });
1575
+ };
1576
+ /**
1577
+ * Update effect
1578
+ * @memberof visStateUpdaters
1579
+ * @public
1580
+ */
1581
+
1582
+
1583
+ exports.reorderEffectUpdater = reorderEffectUpdater;
1584
+
1585
+ var updateEffectUpdater = function updateEffectUpdater(state, _ref12) {
1586
+ var id = _ref12.id,
1587
+ props = _ref12.props;
1588
+ var idx = state.effects.findIndex(function (l) {
1589
+ return l.id === id;
1590
+ });
1591
+
1592
+ if (idx < 0 || idx >= state.effects.length) {
1593
+ _window.console.warn("can not update effect with invalid id ".concat(id));
1594
+
1595
+ return state;
1596
+ }
1597
+
1598
+ var newEffects = (0, _toConsumableArray2["default"])(state.effects);
1599
+ newEffects[idx].updateConfig(props);
1600
+ return _objectSpread(_objectSpread({}, state), {}, {
1601
+ effects: newEffects
1245
1602
  });
1246
1603
  };
1247
1604
  /**
@@ -1251,9 +1608,9 @@ var reorderLayerUpdater = function reorderLayerUpdater(state, _ref9) {
1251
1608
  */
1252
1609
 
1253
1610
 
1254
- exports.reorderLayerUpdater = reorderLayerUpdater;
1611
+ exports.updateEffectUpdater = updateEffectUpdater;
1255
1612
 
1256
- var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
1613
+ function removeDatasetUpdater(state, action) {
1257
1614
  // extract dataset key
1258
1615
  var datasetKey = action.dataId;
1259
1616
  var datasets = state.datasets; // check if dataset is present
@@ -1270,40 +1627,33 @@ var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
1270
1627
  newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
1271
1628
  /* eslint-enable no-unused-vars */
1272
1629
 
1273
- var indexes = layers.reduce(function (listOfIndexes, layer, index) {
1274
- if (layer.config.dataId === datasetKey) {
1275
- // @ts-ignore
1276
- listOfIndexes.push(index);
1277
- }
1278
-
1279
- return listOfIndexes;
1280
- }, []); // remove layers and datasets
1630
+ var layersToRemove = layers.filter(function (l) {
1631
+ return l.config.dataId === datasetKey;
1632
+ }).map(function (l) {
1633
+ return l.id;
1634
+ }); // remove layers and datasets
1281
1635
 
1282
- var _indexes$reduce = indexes.reduce(function (_ref10, idx) {
1283
- var currentState = _ref10.newState,
1284
- indexCounter = _ref10.indexCounter;
1285
- var currentIndex = idx - indexCounter;
1286
- currentState = removeLayerUpdater(currentState, {
1287
- idx: currentIndex
1636
+ var newState = layersToRemove.reduce(function (accu, id) {
1637
+ return removeLayerUpdater(accu, {
1638
+ id: id
1288
1639
  });
1289
- indexCounter++;
1290
- return {
1291
- newState: currentState,
1292
- indexCounter: indexCounter
1293
- };
1294
- }, {
1295
- newState: _objectSpread(_objectSpread({}, state), {}, {
1296
- datasets: newDatasets
1297
- }),
1298
- indexCounter: 0
1299
- }),
1300
- newState = _indexes$reduce.newState; // remove filters
1640
+ }, _objectSpread(_objectSpread({}, state), {}, {
1641
+ datasets: newDatasets
1642
+ })); // remove filters
1301
1643
 
1302
-
1303
- var filters = state.filters.filter(function (filter) {
1644
+ var filters = newState.filters.filter(function (filter) {
1304
1645
  return !filter.dataId.includes(datasetKey);
1305
- }); // update interactionConfig
1646
+ });
1647
+ newState = _objectSpread(_objectSpread({}, newState), {}, {
1648
+ filters: filters
1649
+ });
1650
+ return removeDatasetFromInteractionConfig(newState, {
1651
+ dataId: datasetKey
1652
+ });
1653
+ }
1306
1654
 
1655
+ function removeDatasetFromInteractionConfig(state, _ref13) {
1656
+ var dataId = _ref13.dataId;
1307
1657
  var interactionConfig = state.interactionConfig;
1308
1658
  var _interactionConfig = interactionConfig,
1309
1659
  tooltip = _interactionConfig.tooltip;
@@ -1313,8 +1663,8 @@ var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
1313
1663
  /* eslint-disable no-unused-vars */
1314
1664
 
1315
1665
  var _config$fieldsToShow = config.fieldsToShow,
1316
- fields = _config$fieldsToShow[datasetKey],
1317
- fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [datasetKey].map(_toPropertyKey));
1666
+ fields = _config$fieldsToShow[dataId],
1667
+ fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [dataId].map(_toPropertyKey));
1318
1668
  /* eslint-enable no-unused-vars */
1319
1669
 
1320
1670
  interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
@@ -1326,11 +1676,10 @@ var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
1326
1676
  });
1327
1677
  }
1328
1678
 
1329
- return _objectSpread(_objectSpread({}, newState), {}, {
1330
- filters: filters,
1679
+ return _objectSpread(_objectSpread({}, state), {}, {
1331
1680
  interactionConfig: interactionConfig
1332
1681
  });
1333
- };
1682
+ }
1334
1683
  /**
1335
1684
  * update layer blending mode
1336
1685
  * @memberof visStateUpdaters
@@ -1338,15 +1687,13 @@ var removeDatasetUpdater = function removeDatasetUpdater(state, action) {
1338
1687
  */
1339
1688
 
1340
1689
 
1341
- exports.removeDatasetUpdater = removeDatasetUpdater;
1342
-
1343
1690
  var updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
1344
1691
  return _objectSpread(_objectSpread({}, state), {}, {
1345
1692
  layerBlending: action.mode
1346
1693
  });
1347
1694
  };
1348
1695
  /**
1349
- * Display dataset table in a modal
1696
+ * update overlay blending mode
1350
1697
  * @memberof visStateUpdaters
1351
1698
  * @public
1352
1699
  */
@@ -1354,6 +1701,20 @@ var updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, acti
1354
1701
 
1355
1702
  exports.updateLayerBlendingUpdater = updateLayerBlendingUpdater;
1356
1703
 
1704
+ var updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
1705
+ return _objectSpread(_objectSpread({}, state), {}, {
1706
+ overlayBlending: action.mode
1707
+ });
1708
+ };
1709
+ /**
1710
+ * Display dataset table in a modal
1711
+ * @memberof visStateUpdaters
1712
+ * @public
1713
+ */
1714
+
1715
+
1716
+ exports.updateOverlayBlendingUpdater = updateOverlayBlendingUpdater;
1717
+
1357
1718
  var showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
1358
1719
  return _objectSpread(_objectSpread({}, state), {}, {
1359
1720
  editingDataset: action.dataId
@@ -1369,19 +1730,12 @@ var showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
1369
1730
  exports.showDatasetTableUpdater = showDatasetTableUpdater;
1370
1731
 
1371
1732
  var updateTableColorUpdater = function updateTableColorUpdater(state, action) {
1372
- var dataId = action.dataId,
1373
- newColor = action.newColor;
1374
- var datasets = state.datasets;
1375
-
1376
- if ((0, _utils.isRgbColor)(newColor)) {
1377
- var existing = datasets[dataId];
1378
- existing.updateTableColor(newColor);
1379
- return _objectSpread(_objectSpread({}, state), {}, {
1380
- datasets: _objectSpread(_objectSpread({}, state.datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, {})))
1381
- });
1382
- }
1383
-
1384
- return state;
1733
+ return updateDatasetPropsUpdater(state, {
1734
+ dataId: action.dataId,
1735
+ props: {
1736
+ color: action.newColor
1737
+ }
1738
+ });
1385
1739
  };
1386
1740
  /**
1387
1741
  * reset visState to initial State
@@ -1406,14 +1760,12 @@ var resetMapConfigUpdater = function resetMapConfigUpdater(state) {
1406
1760
 
1407
1761
  exports.resetMapConfigUpdater = resetMapConfigUpdater;
1408
1762
 
1409
- var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref11) {
1410
- var _ref11$payload = _ref11.payload,
1411
- _ref11$payload$config = _ref11$payload.config,
1412
- config = _ref11$payload$config === void 0 ? {
1413
- version: ''
1414
- } : _ref11$payload$config,
1415
- _ref11$payload$option = _ref11$payload.options,
1416
- options = _ref11$payload$option === void 0 ? {} : _ref11$payload$option;
1763
+ var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref14) {
1764
+ var _ref14$payload = _ref14.payload,
1765
+ _ref14$payload$config = _ref14$payload.config,
1766
+ config = _ref14$payload$config === void 0 ? {} : _ref14$payload$config,
1767
+ _ref14$payload$option = _ref14$payload.options,
1768
+ options = _ref14$payload$option === void 0 ? {} : _ref14$payload$option;
1417
1769
 
1418
1770
  if (!config.visState) {
1419
1771
  return state;
@@ -1423,21 +1775,22 @@ var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref11) {
1423
1775
 
1424
1776
  var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
1425
1777
 
1426
- var _iterator = _createForOfIteratorHelper(state.mergers),
1427
- _step;
1778
+ var _iterator2 = _createForOfIteratorHelper(state.mergers),
1779
+ _step2;
1428
1780
 
1429
1781
  try {
1430
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
1431
- var merger = _step.value;
1782
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1783
+ var merger = _step2.value;
1432
1784
 
1433
- if ((0, _visStateMerger.isValidMerger)(merger) && config.visState[merger.prop]) {
1434
- mergedState = merger.merge(mergedState, config.visState[merger.prop], true);
1785
+ if ((0, _mergerHandler.isValidMerger)(merger) && (0, _mergerHandler.hasPropsToMerge)(config.visState, merger.prop)) {
1786
+ mergedState = merger.merge(mergedState, (0, _mergerHandler.getPropValueToMerger)(config.visState, merger.prop, merger.toMergeProp), // fromConfig
1787
+ true);
1435
1788
  }
1436
1789
  }
1437
1790
  } catch (err) {
1438
- _iterator.e(err);
1791
+ _iterator2.e(err);
1439
1792
  } finally {
1440
- _iterator.f();
1793
+ _iterator2.f();
1441
1794
  }
1442
1795
 
1443
1796
  return mergedState;
@@ -1537,8 +1890,8 @@ var mapClickUpdater = function mapClickUpdater(state, action) {
1537
1890
 
1538
1891
  exports.mapClickUpdater = mapClickUpdater;
1539
1892
 
1540
- var mouseMoveUpdater = function mouseMoveUpdater(state, _ref12) {
1541
- var evt = _ref12.evt;
1893
+ var mouseMoveUpdater = function mouseMoveUpdater(state, _ref15) {
1894
+ var evt = _ref15.evt;
1542
1895
 
1543
1896
  if (Object.values(state.interactionConfig).some(function (config) {
1544
1897
  return config.enabled;
@@ -1567,7 +1920,9 @@ var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
1567
1920
  return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
1568
1921
  // maybe we should use an array to store state for a single map as well
1569
1922
  // if current maps length is equal to 0 it means that we are about to split the view
1570
- splitMaps: (0, _utils.computeSplitMapLayers)(state.layers)
1923
+ splitMaps: (0, _utils.computeSplitMapLayers)(state.layers, {
1924
+ duplicate: false
1925
+ })
1571
1926
  }) : closeSpecificMapAtIndex(state, action);
1572
1927
  };
1573
1928
  /**
@@ -1579,9 +1934,9 @@ var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
1579
1934
 
1580
1935
  exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
1581
1936
 
1582
- var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref13) {
1583
- var mapIndex = _ref13.mapIndex,
1584
- layerId = _ref13.layerId;
1937
+ var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref16) {
1938
+ var mapIndex = _ref16.mapIndex,
1939
+ layerId = _ref16.layerId;
1585
1940
  var splitMaps = state.splitMaps;
1586
1941
  return _objectSpread(_objectSpread({}, state), {}, {
1587
1942
  splitMaps: splitMaps.map(function (sm, i) {
@@ -1596,8 +1951,6 @@ var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref13)
1596
1951
  * @memberof visStateUpdaters
1597
1952
  * @public
1598
1953
  */
1599
-
1600
- /* eslint-disable max-statements */
1601
1954
  // eslint-disable-next-line complexity
1602
1955
 
1603
1956
 
@@ -1606,19 +1959,8 @@ exports.toggleLayerForMapUpdater = toggleLayerForMapUpdater;
1606
1959
  var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1607
1960
  // datasets can be a single data entries or an array of multiple data entries
1608
1961
  var config = action.config,
1609
- options = action.options;
1610
- var datasets = (0, _utils.toArray)(action.datasets);
1611
- var newDataEntries = datasets.reduce(function (accu) {
1612
- var _ref14 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1613
- _ref14$info = _ref14.info,
1614
- info = _ref14$info === void 0 ? {} : _ref14$info,
1615
- rest = (0, _objectWithoutProperties2["default"])(_ref14, ["info"]);
1616
-
1617
- return _objectSpread(_objectSpread({}, accu), (0, _table.createNewDataEntry)(_objectSpread({
1618
- info: info
1619
- }, rest), state.datasets) || {});
1620
- }, {});
1621
- var dataEmpty = Object.keys(newDataEntries).length < 1; // apply config if passed from action
1962
+ options = action.options; // apply config if passed from action
1963
+ // TODO: we don't handle asyn mergers here yet
1622
1964
 
1623
1965
  var previousState = config ? receiveMapConfigUpdater(state, {
1624
1966
  payload: {
@@ -1626,34 +1968,82 @@ var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1626
1968
  options: options
1627
1969
  }
1628
1970
  }) : state;
1971
+ var datasets = (0, _utils.toArray)(action.datasets);
1972
+ var newDataEntries = datasets.reduce( // @ts-expect-error Type '{}' is missing the following properties from type 'ProtoDataset': data, info
1973
+ function (accu) {
1974
+ var _ref17 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
1975
+ _ref17$info = _ref17.info,
1976
+ info = _ref17$info === void 0 ? {} : _ref17$info,
1977
+ rest = (0, _objectWithoutProperties2["default"])(_ref17, ["info"]);
1978
+
1979
+ return _objectSpread(_objectSpread({}, accu), (0, _table.createNewDataEntry)(_objectSpread({
1980
+ info: info
1981
+ }, rest), state.datasets) || {});
1982
+ }, {}); // save new dataset entry to state
1629
1983
 
1630
1984
  var mergedState = _objectSpread(_objectSpread({}, previousState), {}, {
1631
- datasets: _objectSpread(_objectSpread({}, previousState.datasets), newDataEntries)
1985
+ datasets: (0, _visStateMerger.mergeDatasetsByOrder)(previousState, newDataEntries)
1632
1986
  }); // merge state with config to be merged
1633
1987
 
1634
1988
 
1635
- var _iterator2 = _createForOfIteratorHelper(mergedState.mergers),
1636
- _step2;
1989
+ var layerMergers = state.mergers.filter(function (m) {
1990
+ return m.waitForLayerData;
1991
+ });
1992
+ var datasetMergers = state.mergers.filter(function (m) {
1993
+ return !layerMergers.includes(m);
1994
+ });
1995
+ var newDataIds = Object.keys(newDataEntries);
1996
+ var postMergerPayload = {
1997
+ newDataIds: newDataIds,
1998
+ options: options,
1999
+ layerMergers: layerMergers
2000
+ };
2001
+ return applyMergersUpdater(mergedState, {
2002
+ mergers: datasetMergers,
2003
+ postMergerPayload: postMergerPayload
2004
+ });
2005
+ };
2006
+ /**
2007
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2008
+ */
1637
2009
 
1638
- try {
1639
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1640
- var merger = _step2.value;
1641
2010
 
1642
- if ((0, _visStateMerger.isValidMerger)(merger) && merger.toMergeProp && mergedState[merger.toMergeProp]) {
1643
- var toMerge = mergedState[merger.toMergeProp];
1644
- mergedState[merger.toMergeProp] = INITIAL_VIS_STATE[merger.toMergeProp];
1645
- mergedState = merger.merge(mergedState, toMerge);
1646
- }
1647
- }
1648
- } catch (err) {
1649
- _iterator2.e(err);
1650
- } finally {
1651
- _iterator2.f();
1652
- }
2011
+ exports.updateVisDataUpdater = updateVisDataUpdater;
1653
2012
 
2013
+ function applyMergersUpdater(state, action) {
2014
+ var mergers = action.mergers,
2015
+ postMergerPayload = action.postMergerPayload; // merge state with config to be merged
2016
+
2017
+ var mergeStateResult = (0, _mergerHandler.mergeStateFromMergers)(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers, // newDataIds,
2018
+ postMergerPayload); // if all merged, kickup post merge process
2019
+ // if not wait
2020
+
2021
+ return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
2022
+ }
2023
+ /**
2024
+ * Add new dataset to `visState`, with option to load a map config along with the datasets
2025
+ */
2026
+
2027
+
2028
+ function postMergeUpdater(mergedState, postMergerPayload) {
2029
+ var newDataIds = postMergerPayload.newDataIds,
2030
+ options = postMergerPayload.options,
2031
+ layerMergers = postMergerPayload.layerMergers;
2032
+ var newFilters = mergedState.filters.filter(function (f) {
2033
+ return f.dataId.find(function (fDataId) {
2034
+ return newDataIds.includes(fDataId);
2035
+ });
2036
+ });
2037
+ var datasetFiltered = (0, _lodash2["default"])(newFilters.reduce(function (accu, f) {
2038
+ return [].concat((0, _toConsumableArray2["default"])(accu), (0, _toConsumableArray2["default"])(f.dataId));
2039
+ }, []));
2040
+ var dataEmpty = newDataIds.length < 1;
1654
2041
  var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
1655
- return l.config.dataId && l.config.dataId in newDataEntries;
2042
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
1656
2043
  }) : [];
2044
+ var newDataEntries = newDataIds.reduce(function (accu, id) {
2045
+ return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, mergedState.datasets[id]));
2046
+ }, {});
1657
2047
 
1658
2048
  if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
1659
2049
  // no layer merged, find defaults
@@ -1665,7 +2055,7 @@ var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1665
2055
  if (mergedState.splitMaps.length) {
1666
2056
  // if map is split, add new layers to splitMaps
1667
2057
  newLayers = mergedState.layers.filter(function (l) {
1668
- return l.config.dataId && l.config.dataId in newDataEntries;
2058
+ return l.config.dataId && newDataIds.includes(l.config.dataId);
1669
2059
  });
1670
2060
  mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
1671
2061
  splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
@@ -1673,21 +2063,27 @@ var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1673
2063
  } // if no tooltips merged add default tooltips
1674
2064
 
1675
2065
 
1676
- Object.keys(newDataEntries).forEach(function (dataId) {
1677
- var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
2066
+ newDataIds.forEach(function (dataId) {
2067
+ var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId]; // loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
1678
2068
 
1679
- if (!Array.isArray(tooltipFields) || !tooltipFields.length) {
2069
+ if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
2070
+ // adding dataset: autoCreateTooltips is true
1680
2071
  mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
1681
2072
  }
1682
2073
  });
1683
- var updatedState = updateAllLayerDomainData(mergedState, dataEmpty ? Object.keys(mergedState.datasets) : Object.keys(newDataEntries), undefined); // register layer animation domain,
2074
+ var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : (0, _lodash2["default"])(Object.keys(newDataEntries).concat(datasetFiltered));
2075
+ var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined); // register layer animation domain,
1684
2076
  // need to be called after layer data is calculated
1685
2077
 
1686
- updatedState = updateAnimationDomain(updatedState);
1687
- return updatedState;
1688
- };
1689
- /* eslint-enable max-statements */
2078
+ updatedState = updateAnimationDomain(updatedState); // try to process layerMergers after dataset+datasetMergers
1690
2079
 
2080
+ return layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
2081
+ mergers: layerMergers,
2082
+ postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
2083
+ layerMergers: []
2084
+ })
2085
+ }) : updatedState;
2086
+ }
1691
2087
  /**
1692
2088
  * Rename an existing dataset in `visState`
1693
2089
  * @memberof visStateUpdaters
@@ -1695,23 +2091,67 @@ var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
1695
2091
  */
1696
2092
 
1697
2093
 
1698
- exports.updateVisDataUpdater = updateVisDataUpdater;
1699
-
1700
2094
  function renameDatasetUpdater(state, action) {
2095
+ return updateDatasetPropsUpdater(state, {
2096
+ dataId: action.dataId,
2097
+ props: {
2098
+ label: action.label
2099
+ }
2100
+ });
2101
+ }
2102
+
2103
+ var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
2104
+ /**
2105
+ * Validates properties before updating the dataset.
2106
+ * Makes sure each property is in the allowed list
2107
+ * Makes sure color value is RGB
2108
+ * Performs deep merge when updating metadata
2109
+ */
2110
+
2111
+ var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
2112
+ var validatedProps = Object.entries(props).reduce(function (acc, entry) {
2113
+ var _entry = (0, _slicedToArray2["default"])(entry, 2),
2114
+ key = _entry[0],
2115
+ value = _entry[1]; // is it allowed ?
2116
+
2117
+
2118
+ if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
2119
+ return acc;
2120
+ } // if we are adding a color but it is not RGB we don't accept the value
2121
+ // in the future as we add more props we should change this if into a switch
2122
+
2123
+
2124
+ if (key === 'color' && !(0, _utils.isRgbColor)(value)) {
2125
+ return acc;
2126
+ } // do we need deep merge ?
2127
+
2128
+
2129
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(value) ? (0, _deepmerge["default"])(dataset[key] || {}, value) : value));
2130
+ }, {});
2131
+ return validatedProps;
2132
+ };
2133
+ /**
2134
+ * Update Dataset props (label, color, meta). Do not use to update data or any related properties
2135
+ * @memberof visStateUpdaters
2136
+ * @public
2137
+ */
2138
+
2139
+
2140
+ function updateDatasetPropsUpdater(state, action) {
1701
2141
  var dataId = action.dataId,
1702
- label = action.label;
2142
+ props = action.props;
1703
2143
  var datasets = state.datasets;
1704
2144
  var existing = datasets[dataId];
1705
2145
 
1706
2146
  if (existing) {
1707
- var newDataset = (0, _table.copyTableAndUpdate)(existing, {
1708
- label: label
1709
- });
2147
+ var validatedProps = validateDatasetUpdateProps(props, existing); // validate props: just color for now
2148
+ // we only allow label, color and meta to be updated
2149
+ // const newTable = copyTableAndUpdate(existing, validatedProps);
2150
+
1710
2151
  return _objectSpread(_objectSpread({}, state), {}, {
1711
- datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, newDataset))
2152
+ datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, validatedProps)))
1712
2153
  });
1713
- } // No-op if the dataset doesn't exist
1714
-
2154
+ }
1715
2155
 
1716
2156
  return state;
1717
2157
  }
@@ -1923,20 +2363,20 @@ function parseProgress() {
1923
2363
  */
1924
2364
 
1925
2365
 
1926
- var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref15) {
1927
- var _ref15$payload = _ref15.payload,
1928
- gen = _ref15$payload.gen,
1929
- fileName = _ref15$payload.fileName,
1930
- progress = _ref15$payload.progress,
1931
- accumulated = _ref15$payload.accumulated,
1932
- onFinish = _ref15$payload.onFinish;
2366
+ var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref18) {
2367
+ var _ref18$payload = _ref18.payload,
2368
+ gen = _ref18$payload.gen,
2369
+ fileName = _ref18$payload.fileName,
2370
+ progress = _ref18$payload.progress,
2371
+ accumulated = _ref18$payload.accumulated,
2372
+ onFinish = _ref18$payload.onFinish;
1933
2373
  var stateWithProgress = updateFileLoadingProgressUpdater(state, {
1934
2374
  fileName: fileName,
1935
2375
  progress: parseProgress(state.fileLoadingProgress[fileName], progress)
1936
2376
  });
1937
- return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref16) {
1938
- var value = _ref16.value,
1939
- done = _ref16.done;
2377
+ return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref19) {
2378
+ var value = _ref19.value,
2379
+ done = _ref19.done;
1940
2380
  return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
1941
2381
  gen: gen,
1942
2382
  fileName: fileName,
@@ -1957,9 +2397,9 @@ var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref15) {
1957
2397
 
1958
2398
  exports.nextFileBatchUpdater = nextFileBatchUpdater;
1959
2399
 
1960
- var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref17) {
1961
- var error = _ref17.error,
1962
- fileName = _ref17.fileName;
2400
+ var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
2401
+ var error = _ref20.error,
2402
+ fileName = _ref20.fileName;
1963
2403
 
1964
2404
  // update ui with error message
1965
2405
  _window.console.warn(error);
@@ -1992,8 +2432,8 @@ var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref17) {
1992
2432
 
1993
2433
  exports.loadFilesErrUpdater = loadFilesErrUpdater;
1994
2434
 
1995
- var applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref18) {
1996
- var dataId = _ref18.dataId;
2435
+ var applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref21) {
2436
+ var dataId = _ref21.dataId;
1997
2437
  // apply cpuFilter
1998
2438
  var dataIds = (0, _utils.toArray)(dataId);
1999
2439
  return dataIds.reduce(function (accu, id) {
@@ -2030,9 +2470,7 @@ function addDefaultLayers(state, datasets) {
2030
2470
  return {
2031
2471
  state: _objectSpread(_objectSpread({}, state), {}, {
2032
2472
  layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
2033
- layerOrder: [].concat((0, _toConsumableArray2["default"])(defaultLayers.map(function (_, i) {
2034
- return state.layers.length + i;
2035
- })), (0, _toConsumableArray2["default"])(state.layerOrder))
2473
+ layerOrder: [].concat((0, _toConsumableArray2["default"])((0, _layerUtils.getLayerOrderFromLayers)(defaultLayers)), (0, _toConsumableArray2["default"])(state.layerOrder))
2036
2474
  }),
2037
2475
  newLayers: defaultLayers
2038
2476
  };
@@ -2066,9 +2504,9 @@ function initialFileLoadingProgress(file, index) {
2066
2504
  });
2067
2505
  }
2068
2506
 
2069
- function updateFileLoadingProgressUpdater(state, _ref20) {
2070
- var fileName = _ref20.fileName,
2071
- progress = _ref20.progress;
2507
+ function updateFileLoadingProgressUpdater(state, _ref23) {
2508
+ var fileName = _ref23.fileName,
2509
+ progress = _ref23.progress;
2072
2510
  // @ts-expect-error
2073
2511
  return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
2074
2512
  }
@@ -2086,9 +2524,9 @@ function updateAllLayerDomainData(state, dataId, updatedFilter) {
2086
2524
  // No need to recalculate layer domain if filter has fixed domain
2087
2525
  var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
2088
2526
 
2089
- var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
2090
- layerData = _calculateLayerData5.layerData,
2091
- layer = _calculateLayerData5.layer;
2527
+ var _calculateLayerData6 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
2528
+ layerData = _calculateLayerData6.layerData,
2529
+ layer = _calculateLayerData6.layer;
2092
2530
 
2093
2531
  newLayers.push(layer);
2094
2532
  newLayerData.push(layerData);
@@ -2142,8 +2580,8 @@ function updateAnimationDomain(state) {
2142
2580
  */
2143
2581
 
2144
2582
 
2145
- var setEditorModeUpdater = function setEditorModeUpdater(state, _ref21) {
2146
- var mode = _ref21.mode;
2583
+ var setEditorModeUpdater = function setEditorModeUpdater(state, _ref24) {
2584
+ var mode = _ref24.mode;
2147
2585
  return _objectSpread(_objectSpread({}, state), {}, {
2148
2586
  editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2149
2587
  mode: mode,
@@ -2160,9 +2598,9 @@ var setEditorModeUpdater = function setEditorModeUpdater(state, _ref21) {
2160
2598
 
2161
2599
  exports.setEditorModeUpdater = setEditorModeUpdater;
2162
2600
 
2163
- function setFeaturesUpdater(state, _ref22) {
2164
- var _ref22$features = _ref22.features,
2165
- features = _ref22$features === void 0 ? [] : _ref22$features;
2601
+ function setFeaturesUpdater(state, _ref25) {
2602
+ var _ref25$features = _ref25.features,
2603
+ features = _ref25$features === void 0 ? [] : _ref25$features;
2166
2604
  var lastFeature = features.length && features[features.length - 1];
2167
2605
 
2168
2606
  var newState = _objectSpread(_objectSpread({}, state), {}, {
@@ -2210,11 +2648,13 @@ function setFeaturesUpdater(state, _ref22) {
2210
2648
  */
2211
2649
 
2212
2650
 
2213
- var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref23) {
2214
- var feature = _ref23.feature;
2651
+ var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref26) {
2652
+ var feature = _ref26.feature,
2653
+ selectionContext = _ref26.selectionContext;
2215
2654
  return _objectSpread(_objectSpread({}, state), {}, {
2216
2655
  editor: _objectSpread(_objectSpread({}, state.editor), {}, {
2217
- selectedFeature: feature
2656
+ selectedFeature: feature,
2657
+ selectionContext: selectionContext
2218
2658
  })
2219
2659
  });
2220
2660
  };
@@ -2226,8 +2666,8 @@ var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref23
2226
2666
 
2227
2667
  exports.setSelectedFeatureUpdater = setSelectedFeatureUpdater;
2228
2668
 
2229
- function deleteFeatureUpdater(state, _ref24) {
2230
- var feature = _ref24.feature;
2669
+ function deleteFeatureUpdater(state, _ref27) {
2670
+ var feature = _ref27.feature;
2231
2671
 
2232
2672
  if (!feature) {
2233
2673
  return state;
@@ -2334,10 +2774,10 @@ function setPolygonFilterLayerUpdater(state, payload) {
2334
2774
  */
2335
2775
 
2336
2776
 
2337
- function sortTableColumnUpdater(state, _ref25) {
2338
- var dataId = _ref25.dataId,
2339
- column = _ref25.column,
2340
- mode = _ref25.mode;
2777
+ function sortTableColumnUpdater(state, _ref28) {
2778
+ var dataId = _ref28.dataId,
2779
+ column = _ref28.column,
2780
+ mode = _ref28.mode;
2341
2781
  var dataset = state.datasets[dataId];
2342
2782
 
2343
2783
  if (!dataset) {
@@ -2363,9 +2803,9 @@ function sortTableColumnUpdater(state, _ref25) {
2363
2803
  */
2364
2804
 
2365
2805
 
2366
- function pinTableColumnUpdater(state, _ref26) {
2367
- var dataId = _ref26.dataId,
2368
- column = _ref26.column;
2806
+ function pinTableColumnUpdater(state, _ref29) {
2807
+ var dataId = _ref29.dataId,
2808
+ column = _ref29.column;
2369
2809
  var dataset = state.datasets[dataId];
2370
2810
 
2371
2811
  if (!dataset) {
@@ -2382,9 +2822,9 @@ function pinTableColumnUpdater(state, _ref26) {
2382
2822
  */
2383
2823
 
2384
2824
 
2385
- function copyTableColumnUpdater(state, _ref27) {
2386
- var dataId = _ref27.dataId,
2387
- column = _ref27.column;
2825
+ function copyTableColumnUpdater(state, _ref30) {
2826
+ var dataId = _ref30.dataId,
2827
+ column = _ref30.column;
2388
2828
  var dataset = state.datasets[dataId];
2389
2829
 
2390
2830
  if (!dataset) {
@@ -2406,6 +2846,41 @@ function copyTableColumnUpdater(state, _ref27) {
2406
2846
  (0, _copyToClipboard["default"])(text);
2407
2847
  return state;
2408
2848
  }
2849
+ /**
2850
+ * Set display format from columns from user selection
2851
+ * @memberof visStateUpdaters
2852
+ * @public
2853
+ */
2854
+
2855
+
2856
+ function setColumnDisplayFormatUpdater(state, _ref31) {
2857
+ var dataId = _ref31.dataId,
2858
+ formats = _ref31.formats;
2859
+ var dataset = state.datasets[dataId];
2860
+
2861
+ if (!dataset) {
2862
+ return state;
2863
+ }
2864
+
2865
+ var newFields = dataset.fields;
2866
+ Object.keys(formats).forEach(function (column) {
2867
+ var fieldIdx = dataset.fields.findIndex(function (f) {
2868
+ return f.name === column;
2869
+ });
2870
+
2871
+ if (fieldIdx >= 0) {
2872
+ var displayFormat = formats[column];
2873
+ var field = newFields[fieldIdx];
2874
+ newFields = (0, _composerHelpers.swap_)((0, _composerHelpers.merge_)({
2875
+ displayFormat: displayFormat
2876
+ })(field))(newFields);
2877
+ }
2878
+ });
2879
+ var newDataset = (0, _table.copyTableAndUpdate)(dataset, {
2880
+ fields: newFields
2881
+ });
2882
+ return (0, _composerHelpers.pick_)('datasets')((0, _composerHelpers.merge_)((0, _defineProperty2["default"])({}, dataId, newDataset)))(state);
2883
+ }
2409
2884
  /**
2410
2885
  * Update editor
2411
2886
  */
@@ -2419,9 +2894,9 @@ function toggleEditorVisibilityUpdater(state, action) {
2419
2894
  });
2420
2895
  }
2421
2896
 
2422
- function setFilterAnimationTimeConfigUpdater(state, _ref28) {
2423
- var idx = _ref28.idx,
2424
- config = _ref28.config;
2897
+ function setFilterAnimationTimeConfigUpdater(state, _ref32) {
2898
+ var idx = _ref32.idx,
2899
+ config = _ref32.config;
2425
2900
  var oldFilter = state.filters[idx];
2426
2901
 
2427
2902
  if (!oldFilter) {
@@ -2459,8 +2934,8 @@ function checkTimeConfigArgs(config) {
2459
2934
  */
2460
2935
 
2461
2936
 
2462
- function setLayerAnimationTimeConfigUpdater(state, _ref29) {
2463
- var config = _ref29.config;
2937
+ function setLayerAnimationTimeConfigUpdater(state, _ref33) {
2938
+ var config = _ref33.config;
2464
2939
 
2465
2940
  if (!config) {
2466
2941
  return state;
@@ -2468,5 +2943,192 @@ function setLayerAnimationTimeConfigUpdater(state, _ref29) {
2468
2943
 
2469
2944
  var updates = checkTimeConfigArgs(config);
2470
2945
  return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
2946
+ } // Find dataId from a saved visState property:
2947
+ // layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
2948
+ // replace it with another dataId
2949
+
2950
+
2951
+ function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
2952
+ var _value$config, _value$config2;
2953
+
2954
+ if (Array.isArray(value)) {
2955
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
2956
+ var replaced = value.map(function (v) {
2957
+ return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
2958
+ }).filter(function (d) {
2959
+ return d;
2960
+ });
2961
+ return replaced.length ? replaced : null;
2962
+ }
2963
+
2964
+ if (typeof value.dataId === 'string' && value.dataId === dataId) {
2965
+ // others
2966
+ return _objectSpread(_objectSpread({}, value), {}, {
2967
+ dataId: dataIdToReplace
2968
+ });
2969
+ } else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
2970
+ // filter
2971
+ return _objectSpread(_objectSpread({}, value), {}, {
2972
+ dataId: value.dataId.map(function (d) {
2973
+ return d === dataId ? dataIdToReplace : d;
2974
+ })
2975
+ });
2976
+ } 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) {
2977
+ // layer
2978
+ return _objectSpread(_objectSpread({}, value), {}, {
2979
+ config: _objectSpread(_objectSpread({}, value.config), {}, {
2980
+ dataId: dataIdToReplace
2981
+ })
2982
+ });
2983
+ } else if ((0, _utils.isObject)(value) && value.hasOwnProperty(dataId)) {
2984
+ // for value saved as {[dataId]: {...}}
2985
+ return (0, _defineProperty2["default"])({}, dataIdToReplace, value[dataId]);
2986
+ }
2987
+
2988
+ return null;
2989
+ } // Find datasetIds derived a saved visState Property;
2990
+
2991
+
2992
+ function findChildDatasetIds(value) {
2993
+ var _value$newDataset;
2994
+
2995
+ if (Array.isArray(value)) {
2996
+ // for layers, filters, call defaultReplaceParentDatasetIds on each item in array
2997
+ var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
2998
+ return d;
2999
+ });
3000
+ return childDataIds.length ? childDataIds : null;
3001
+ } // child data id usually stores in the derived dataset info
3002
+
3003
+
3004
+ return (value === null || value === void 0 ? void 0 : (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
3005
+ } // moved unmerged layers, filters, interactions
3006
+
3007
+
3008
+ function moveValueToBeMerged(state, propValues, _ref35) {
3009
+ var prop = _ref35.prop,
3010
+ toMergeProp = _ref35.toMergeProp,
3011
+ saveUnmerged = _ref35.saveUnmerged;
3012
+
3013
+ // remove prop value from state
3014
+ // TODO: should we add remove updater to merger as well?
3015
+ if (!propValues) {
3016
+ return state;
3017
+ }
3018
+
3019
+ var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
3020
+ return removeLayerUpdater(accu, {
3021
+ id: propValue.id
3022
+ });
3023
+ }, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, state[prop].filter(function (p) {
3024
+ return !propValues.find(function (propValue) {
3025
+ return p.id === propValue.id;
3026
+ });
3027
+ }))) : // if not array, we won't remove it, remove dataset should handle it
3028
+ state; // move to stateToBeMerged
3029
+
3030
+ var toBeMerged = (0, _defineProperty2["default"])({}, toMergeProp, saveUnmerged ? // call merge saveUnmerged method
3031
+ saveUnmerged(stateRemoved, propValues) : // if toMergeProp is araay, append to it
3032
+ Array.isArray(stateRemoved[toMergeProp]) ? [].concat((0, _toConsumableArray2["default"])(stateRemoved[toMergeProp]), (0, _toConsumableArray2["default"])(propValues)) : // save propValues to toMerge
3033
+ (0, _utils.isObject)(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
3034
+ return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
3035
+ }
3036
+
3037
+ function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
3038
+ return (0, _composerHelpers.compose_)([(0, _composerHelpers.apply_)(replaceDatasetDepsInState, {
3039
+ dataId: dataId,
3040
+ dataIdToUse: dataIdToUse
3041
+ }), (0, _composerHelpers.apply_)(removeDatasetUpdater, {
3042
+ dataId: dataId
3043
+ })])(state);
3044
+ }
3045
+
3046
+ function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
3047
+ var _nextState$layerToBeM;
3048
+
3049
+ var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
3050
+ var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse); // make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
3051
+
3052
+ var preserveLayerOrder = (0, _toConsumableArray2["default"])(state.layerOrder); // preserve dataset order
3053
+
3054
+ nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
3055
+ return d === dataId ? dataIdToUse : d;
3056
+ }); // preserveLayerOrder
3057
+
3058
+ if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
3059
+ var _serializedState$spli;
3060
+
3061
+ // copy split maps to be merged, because it will be reset in remove layer
3062
+ nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
3063
+ nextState.layerOrder = (0, _toConsumableArray2["default"])(preserveLayerOrder);
3064
+ }
3065
+
3066
+ return nextState;
3067
+ }
3068
+
3069
+ function replaceDatasetDepsInState(state, _ref36) {
3070
+ var dataId = _ref36.dataId,
3071
+ dataIdToUse = _ref36.dataIdToUse;
3072
+ var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
3073
+ var nextState = state.mergers.reduce(function (accuState, _ref37) {
3074
+ var prop = _ref37.prop,
3075
+ toMergeProp = _ref37.toMergeProp,
3076
+ replaceParentDatasetIds = _ref37.replaceParentDatasetIds,
3077
+ getChildDatasetIds = _ref37.getChildDatasetIds,
3078
+ saveUnmerged = _ref37.saveUnmerged,
3079
+ preserveOrder = _ref37.preserveOrder;
3080
+ // get dataset ids that are depends on this dataset
3081
+ var props = (0, _utils.toArray)(prop);
3082
+ var toMergeProps = (0, _utils.toArray)(toMergeProp);
3083
+ var savedProps = serializedState ? props.map(function (p) {
3084
+ return serializedState[p];
3085
+ }) : [];
3086
+ var replacedState = accuState;
3087
+ savedProps.forEach(function (propValue, i) {
3088
+ var _replacedState$merger;
3089
+
3090
+ var mergerOptions = {
3091
+ prop: props[i],
3092
+ toMergeProp: toMergeProps[i],
3093
+ getChildDatasetIds: getChildDatasetIds,
3094
+ saveUnmerged: saveUnmerged
3095
+ };
3096
+ var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
3097
+ replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
3098
+
3099
+ if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
3100
+ replacedState[preserveOrder] = propValue.map(function (item) {
3101
+ return item.id;
3102
+ });
3103
+ }
3104
+ });
3105
+ return replacedState;
3106
+ }, state);
3107
+ return nextState;
3108
+ }
3109
+
3110
+ function replacePropValueInState(state, replacedItem, _ref38) {
3111
+ var prop = _ref38.prop,
3112
+ toMergeProp = _ref38.toMergeProp,
3113
+ getChildDatasetIds = _ref38.getChildDatasetIds,
3114
+ saveUnmerged = _ref38.saveUnmerged;
3115
+ // prop is depends on the dataset to be replaced
3116
+ // remove prop from state, and move it to toBeMerged
3117
+ var nextState = moveValueToBeMerged(state, replacedItem, {
3118
+ prop: prop,
3119
+ toMergeProp: toMergeProp,
3120
+ saveUnmerged: saveUnmerged
3121
+ });
3122
+ var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
3123
+
3124
+ if (childDataIds) {
3125
+ nextState = (0, _utils.toArray)(childDataIds).reduce(function (accu, childDataId) {
3126
+ // shouldn't need to change child dataset id,
3127
+ // but still need to move out of state and merge back in
3128
+ return replaceDatasetAndDeps(accu, childDataId, childDataId);
3129
+ }, nextState);
3130
+ }
3131
+
3132
+ return nextState;
2471
3133
  }
2472
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsidmlzU3RhdGVVcGRhdGVycyIsImRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiREVGQVVMVF9FRElUT1IiLCJtb2RlIiwiRURJVE9SX01PREVTIiwiRFJBV19QT0xZR09OIiwiZmVhdHVyZXMiLCJzZWxlY3RlZEZlYXR1cmUiLCJ2aXNpYmxlIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJtYXBJbmZvIiwidGl0bGUiLCJkZXNjcmlwdGlvbiIsImxheWVycyIsImxheWVyRGF0YSIsImxheWVyVG9CZU1lcmdlZCIsImxheWVyT3JkZXIiLCJmaWx0ZXJzIiwiZmlsdGVyVG9CZU1lcmdlZCIsImRhdGFzZXRzIiwiZWRpdGluZ0RhdGFzZXQiLCJ1bmRlZmluZWQiLCJpbnRlcmFjdGlvbkNvbmZpZyIsImludGVyYWN0aW9uVG9CZU1lcmdlZCIsImxheWVyQmxlbmRpbmciLCJob3ZlckluZm8iLCJjbGlja2VkIiwibW91c2VQb3MiLCJtYXhEZWZhdWx0VG9vbHRpcHMiLCJNQVhfREVGQVVMVF9UT09MVElQUyIsInNwbGl0TWFwcyIsInNwbGl0TWFwc1RvQmVNZXJnZWQiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwibGF5ZXIiLCJpZHgiLCJtYXAiLCJseXIiLCJpIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImxlbmd0aCIsImlzVmlzaWJsZSIsImFuaW1hdGlvbiIsInVwZGF0ZUFuaW1hdGlvbkRvbWFpbiIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsImFjdGlvbiIsIm9sZExheWVyIiwiZmluZEluZGV4IiwibCIsInByb3BzIiwiT2JqZWN0Iiwia2V5cyIsIm5ld0NvbmZpZyIsImRhdGFJZCIsInJlc3RDb25maWciLCJzdGF0ZVdpdGhEYXRhSWQiLCJsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIiLCJuZXh0TGF5ZXIiLCJmaW5kIiwibmV3TGF5ZXIiLCJ1cGRhdGVMYXllckNvbmZpZyIsInNob3VsZENhbGN1bGF0ZUxheWVyRGF0YSIsIm9sZExheWVyRGF0YSIsInVwZGF0ZUxheWVyRGF0YVJlc3VsdCIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsIm5ld1RleHRMYWJlbCIsInNsaWNlIiwiY3VycmVudEZpZWxkcyIsInRsIiwiZmllbGQiLCJuYW1lIiwiZmlsdGVyIiwiYWRkRmllbGRzIiwiZiIsImluY2x1ZGVzIiwiZGVsZXRlRmllbGRzIiwiZmQiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJhZiIsInVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZSIsInByb3AiLCJ2YWx1ZSIsImhhc093blByb3BlcnR5Iiwic3BsaWNlIiwibGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJkYXRhc2V0IiwibG9hZGVkTGF5ZXIiLCJhbGxvd0VtcHR5Q29sdW1uIiwiaXNWYWxpZFRvU2F2ZSIsInZhbGlkYXRlZCIsInR5cGUiLCJpc0NvbmZpZ0FjdGl2ZSIsInVwZGF0ZUxheWVyRG9tYWluIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwicmVzdWx0IiwiZmluZERlZmF1bHRMYXllclByb3BzIiwiQXJyYXkiLCJpc0FycmF5IiwibGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm5ld1R5cGUiLCJvbGRJZCIsIkNvbnNvbGUiLCJlcnJvciIsImFzc2lnbkNvbmZpZ1RvTGF5ZXIiLCJ2aXNDb25maWdTZXR0aW5ncyIsImlzTGF5ZXJIb3ZlcmVkIiwic2V0dGluZ3MiLCJvbGRMYXllck1hcCIsIm90aGVyTGF5ZXJzIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImNoYW5uZWwiLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJuZXdWaXNDb25maWciLCJ2aXNDb25maWciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsInNldEZpbHRlclVwZGF0ZXIiLCJzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyIiwiYW5pbWF0aW9uV2luZG93IiwidmFsdWVJbmRleCIsIm9sZEZpbHRlciIsIm5ld0ZpbHRlciIsImRhdGFzZXRJZHMiLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImRhdGFzZXRJZCIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJsYXllcklkIiwibGF5ZXJJZERpZmZlcmVuY2UiLCJsYXllckRhdGFJZHMiLCJsaWQiLCJuZXdEYXRhSWRzIiwiZW5sYXJnZWRGaWx0ZXIiLCJlbmxhcmdlZCIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIkxJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyIsImZpbHRlcmVkRGF0YXNldHMiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJzZXRGaWx0ZXJQbG90VXBkYXRlciIsIm5ld1Byb3AiLCJwbG90VHlwZSIsImFkZEZpbHRlclVwZGF0ZXIiLCJsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyIiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJoaWRlQ29udHJvbCIsInVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkVXBkYXRlciIsInNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIiLCJ1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciIsImVubGFyZ2VGaWx0ZXJVcGRhdGVyIiwidG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXIiLCJhc3NpZ24iLCJyZW1vdmVGaWx0ZXJVcGRhdGVyIiwibmV3RmlsdGVycyIsIm5ld0VkaXRvciIsImFkZExheWVyVXBkYXRlciIsIm5ld0xheWVyRGF0YSIsIndhcm4iLCJkZWZhdWx0RGF0YXNldCIsIkxheWVyIiwicmVtb3ZlTGF5ZXJVcGRhdGVyIiwibGF5ZXJUb1JlbW92ZSIsIm5ld01hcHMiLCJwaWQiLCJkdXBsaWNhdGVMYXllclVwZGF0ZXIiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTGF5ZXJPcmRlcklkeCIsIm5ld0xhYmVsIiwicG9zdGZpeCIsIkxBWUVSX0lEX0xFTkdUSCIsIm5leHRTdGF0ZSIsIm5ld0xheWVyT3JkZXJJZHgiLCJuZXdMYXllck9yZGVyIiwicmVvcmRlckxheWVyVXBkYXRlciIsIm9yZGVyIiwicmVtb3ZlRGF0YXNldFVwZGF0ZXIiLCJkYXRhc2V0S2V5IiwibmV3RGF0YXNldHMiLCJpbmRleGVzIiwicmVkdWNlIiwibGlzdE9mSW5kZXhlcyIsImluZGV4IiwicHVzaCIsImN1cnJlbnRTdGF0ZSIsImluZGV4Q291bnRlciIsImN1cnJlbnRJbmRleCIsImZpZWxkcyIsInVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyIiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJ1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciIsIm5ld0NvbG9yIiwiZXhpc3RpbmciLCJ1cGRhdGVUYWJsZUNvbG9yIiwicmVzZXRNYXBDb25maWdVcGRhdGVyIiwiaW5pdGlhbFN0YXRlIiwicmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIiLCJwYXlsb2FkIiwidmVyc2lvbiIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImtlZXBFeGlzdGluZ0NvbmZpZyIsIm1lcmdlZFN0YXRlIiwibWVyZ2VyIiwibWVyZ2UiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJjb250cmFkaWN0IiwiZm9yRWFjaCIsImsiLCJsYXllckNsaWNrVXBkYXRlciIsInBpbm5lZCIsInBpY2tlZCIsIm1hcENsaWNrVXBkYXRlciIsIm1vdXNlTW92ZVVwZGF0ZXIiLCJldnQiLCJ2YWx1ZXMiLCJzb21lIiwicG9pbnQiLCJtb3VzZVBvc2l0aW9uIiwibG5nTGF0IiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiY2xvc2VTcGVjaWZpY01hcEF0SW5kZXgiLCJ0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIiLCJtYXBJbmRleCIsInNtIiwidXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJuZXdEYXRhRW50cmllcyIsImFjY3UiLCJyZXN0IiwiZGF0YUVtcHR5IiwicHJldmlvdXNTdGF0ZSIsInRvTWVyZ2VQcm9wIiwidG9NZXJnZSIsIm5ld0xheWVycyIsImF1dG9DcmVhdGVMYXllcnMiLCJhZGREZWZhdWx0TGF5ZXJzIiwidG9vbHRpcEZpZWxkcyIsImFkZERlZmF1bHRUb29sdGlwcyIsInVwZGF0ZWRTdGF0ZSIsInJlbmFtZURhdGFzZXRVcGRhdGVyIiwiaW5kZXhUb1JldHJpZXZlIiwibWFwTGF5ZXJzIiwibG9hZEZpbGVzVXBkYXRlciIsImZpbGVzIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiZnJvbSIsImluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzIiwiZmlsZUNhY2hlIiwiZmlsZXNUb0xvYWQiLCJsb2FkTmV4dEZpbGVVcGRhdGVyIiwibG9hZEZpbGVTdGVwU3VjY2Vzc1VwZGF0ZXIiLCJmaWxlTmFtZSIsInN0YXRlV2l0aFByb2dyZXNzIiwidXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIiLCJwcm9ncmVzcyIsInBlcmNlbnQiLCJtZXNzYWdlIiwic3RhdGVXaXRoQ2FjaGUiLCJsb2FkTmV4dEZpbGUiLCJmaWxlIiwicmVtYWluaW5nRmlsZXNUb0xvYWQiLCJtYWtlTG9hZEZpbGVUYXNrIiwiYmltYXAiLCJnZW4iLCJjb250ZW50IiwiZXJyIiwicHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlciIsInBhcnNlUHJvZ3Jlc3MiLCJwcmV2UHJvZ3Jlc3MiLCJuZXh0RmlsZUJhdGNoVXBkYXRlciIsImFjY3VtdWxhdGVkIiwibmV4dCIsImRvbmUiLCJsb2FkRmlsZXNFcnJVcGRhdGVyIiwiYXBwbHlDUFVGaWx0ZXJVcGRhdGVyIiwiZGF0YUlkcyIsInNldE1hcEluZm9VcGRhdGVyIiwiZW1wdHkiLCJkZWZhdWx0TGF5ZXJzIiwiZm91bmRMYXllcnMiLCJjb25jYXQiLCJfIiwibWVyZ2VkIiwiZml4ZWREb21haW4iLCJhbmltYXRhYmxlTGF5ZXJzIiwiYW5pbWF0aW9uRG9tYWluIiwibWVyZ2VkRG9tYWluIiwiTWF0aCIsIm1pbiIsIm1heCIsIk51bWJlciIsIkluZmluaXR5Iiwic2V0RWRpdG9yTW9kZVVwZGF0ZXIiLCJzZXRGZWF0dXJlc1VwZGF0ZXIiLCJsYXN0RmVhdHVyZSIsInByb3BlcnRpZXMiLCJpc0Nsb3NlZCIsIkVESVQiLCJmZWF0dXJlIiwiZmlsdGVySWQiLCJmZWF0dXJlVmFsdWUiLCJmaWx0ZXJJZHgiLCJmaWwiLCJzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyIiwiZGVsZXRlRmVhdHVyZVVwZGF0ZXIiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyIiwibmV3TGF5ZXJJZCIsIm5vbmVGaWx0ZXJGZWF0dXJlIiwiaXNMYXllckluY2x1ZGVkIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJTT1JUX09SREVSIiwibSIsIkFTQ0VORElORyIsInNvcnRlZCIsInBpblRhYmxlQ29sdW1uVXBkYXRlciIsImNvcHlUYWJsZUNvbHVtblVwZGF0ZXIiLCJmaWVsZElkeCIsInRleHQiLCJkYXRhQ29udGFpbmVyIiwicm93IiwidmFsdWVBdCIsImpvaW4iLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiRklMVEVSX1RZUEVTIiwidGltZVJhbmdlIiwidXBkYXRlcyIsImNoZWNrVGltZUNvbmZpZ0FyZ3MiLCJhbGxvd2VkIiwic2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBY0E7O0FBMEJBOztBQVFBOztBQUNBOztBQVFBOztBQUVBOztBQUtBOztBQUNBOztBQVNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsSUFBekI7QUFDQTs7QUFFTyxJQUFNQyx3QkFBMkMsR0FBRztBQUN6REMsRUFBQUEsT0FBTyxFQUFFO0FBQ1BDLElBQUFBLEVBQUUsRUFBRSxTQURHO0FBRVBDLElBQUFBLEtBQUssRUFBRSxzQkFGQTtBQUdQQyxJQUFBQSxPQUFPLEVBQUUsSUFIRjtBQUlQQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkMsTUFBQUEsWUFBWSxFQUFFLEVBRFI7QUFFTkMsTUFBQUEsV0FBVyxFQUFFLEtBRlA7QUFHTkMsTUFBQUEsV0FBVyxFQUFFQyx5QkFBY0M7QUFIckI7QUFKRCxHQURnRDtBQVd6REMsRUFBQUEsUUFBUSxFQUFFO0FBQ1JULElBQUFBLEVBQUUsRUFBRSxVQURJO0FBRVJDLElBQUFBLEtBQUssRUFBRSx1QkFGQztBQUdSQyxJQUFBQSxPQUFPLEVBQUUsS0FIRDtBQUlSUSxJQUFBQSxRQUFRLEVBQUU7QUFKRixHQVgrQztBQWlCekRDLEVBQUFBLEtBQUssRUFBRTtBQUNMWCxJQUFBQSxFQUFFLEVBQUUsT0FEQztBQUVMQyxJQUFBQSxLQUFLLEVBQUUsb0JBRkY7QUFHTEMsSUFBQUEsT0FBTyxFQUFFLEtBSEo7QUFJTEMsSUFBQUEsTUFBTSxFQUFFO0FBQ047QUFDQVMsTUFBQUEsSUFBSSxFQUFFO0FBRkE7QUFKSCxHQWpCa0Q7QUEwQnpEQyxFQUFBQSxVQUFVLEVBQUU7QUFDVmIsSUFBQUEsRUFBRSxFQUFFLFlBRE07QUFFVkMsSUFBQUEsS0FBSyxFQUFFLHlCQUZHO0FBR1ZDLElBQUFBLE9BQU8sRUFBRSxLQUhDO0FBSVZRLElBQUFBLFFBQVEsRUFBRTtBQUpBO0FBMUI2QyxDQUFwRDs7QUFrQ0EsSUFBTUksd0JBQXlDLEdBQUc7QUFDdkRDLEVBQUFBLE1BQU0sRUFBRSxJQUQrQztBQUV2REMsRUFBQUEsV0FBVyxFQUFFLElBRjBDO0FBR3ZEQyxFQUFBQSxLQUFLLEVBQUUsQ0FIZ0Q7QUFJdkRDLEVBQUFBLFdBQVcsRUFBRSxLQUowQztBQUt2REMsRUFBQUEsVUFBVSxFQUFFLElBTDJDO0FBTXZEQyxFQUFBQSxRQUFRLEVBQUUsSUFONkM7QUFPdkRDLEVBQUFBLGlCQUFpQixFQUFFO0FBUG9DLENBQWxEOztBQVVBLElBQU1DLGNBQXNCLEdBQUc7QUFDcENDLEVBQUFBLElBQUksRUFBRUMsd0JBQWFDLFlBRGlCO0FBRXBDQyxFQUFBQSxRQUFRLEVBQUUsRUFGMEI7QUFHcENDLEVBQUFBLGVBQWUsRUFBRSxJQUhtQjtBQUlwQ0MsRUFBQUEsT0FBTyxFQUFFO0FBSjJCLENBQS9CO0FBT1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxJQUFNQyxpQkFBMkIsR0FBRztBQUN6QztBQUNBQyxFQUFBQSxPQUFPLEVBQUU7QUFDUEMsSUFBQUEsS0FBSyxFQUFFLEVBREE7QUFFUEMsSUFBQUEsV0FBVyxFQUFFO0FBRk4sR0FGZ0M7QUFNekM7QUFDQUMsRUFBQUEsTUFBTSxFQUFFLEVBUGlDO0FBUXpDQyxFQUFBQSxTQUFTLEVBQUUsRUFSOEI7QUFTekNDLEVBQUFBLGVBQWUsRUFBRSxFQVR3QjtBQVV6Q0MsRUFBQUEsVUFBVSxFQUFFLEVBVjZCO0FBWXpDO0FBQ0FDLEVBQUFBLE9BQU8sRUFBRSxFQWJnQztBQWN6Q0MsRUFBQUEsZ0JBQWdCLEVBQUUsRUFkdUI7QUFnQnpDO0FBQ0FDLEVBQUFBLFFBQVEsRUFBRSxFQWpCK0I7QUFrQnpDQyxFQUFBQSxjQUFjLEVBQUVDLFNBbEJ5QjtBQW9CekNDLEVBQUFBLGlCQUFpQixFQUFFNUMsd0JBcEJzQjtBQXFCekM2QyxFQUFBQSxxQkFBcUIsRUFBRUYsU0FyQmtCO0FBdUJ6Q0csRUFBQUEsYUFBYSxFQUFFLFFBdkIwQjtBQXdCekNDLEVBQUFBLFNBQVMsRUFBRUosU0F4QjhCO0FBeUJ6Q0ssRUFBQUEsT0FBTyxFQUFFTCxTQXpCZ0M7QUEwQnpDTSxFQUFBQSxRQUFRLEVBQUUsRUExQitCO0FBMkJ6Q0MsRUFBQUEsa0JBQWtCLEVBQUVDLCtCQTNCcUI7QUE2QnpDO0FBQ0FDLEVBQUFBLFNBQVMsRUFBRSxDQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUFMsR0E5QjhCO0FBdUN6Q0MsRUFBQUEsbUJBQW1CLEVBQUUsRUF2Q29CO0FBeUN6QztBQUNBQyxFQUFBQSxZQUFZLEVBQUVDLG9CQTFDMkI7QUE0Q3pDO0FBQ0E7QUFDQUMsRUFBQUEsZUFBZSxFQUFFeEMsd0JBOUN3QjtBQWdEekN5QyxFQUFBQSxNQUFNLEVBQUVqQyxjQWhEaUM7QUFrRHpDa0MsRUFBQUEsV0FBVyxFQUFFLEtBbEQ0QjtBQW1EekNDLEVBQUFBLG1CQUFtQixFQUFFLEVBbkRvQjtBQXFEekNDLEVBQUFBLE9BQU8sRUFBRSxFQXJEZ0M7QUFzRHpDQyxFQUFBQSxXQUFXLEVBQUUsRUF0RDRCO0FBd0R6QztBQUNBQyxFQUFBQSxPQUFPLEVBQUVDLGlDQXpEZ0M7QUEyRHpDO0FBQ0FDLEVBQUFBLE1BQU0sRUFBRUM7QUE1RGlDLENBQXBDO0FBK0RQO0FBQ0E7QUFDQTtBQUNBOzs7O0FBQ08sU0FBU0MsMkJBQVQsQ0FDTEMsS0FESyxRQUdLO0FBQUEsTUFEVC9CLFNBQ1MsUUFEVEEsU0FDUztBQUFBLE1BREVnQyxLQUNGLFFBREVBLEtBQ0Y7QUFBQSxNQURTQyxHQUNULFFBRFNBLEdBQ1Q7QUFDVix5Q0FDS0YsS0FETDtBQUVFaEMsSUFBQUEsTUFBTSxFQUFFZ0MsS0FBSyxDQUFDaEMsTUFBTixDQUFhbUMsR0FBYixDQUFpQixVQUFDQyxHQUFELEVBQU1DLENBQU47QUFBQSxhQUFhQSxDQUFDLEtBQUtILEdBQU4sR0FBWUQsS0FBWixHQUFvQkcsR0FBakM7QUFBQSxLQUFqQixDQUZWO0FBR0VuQyxJQUFBQSxTQUFTLEVBQUVBLFNBQVMsR0FDaEIrQixLQUFLLENBQUMvQixTQUFOLENBQWdCa0MsR0FBaEIsQ0FBb0IsVUFBQ0csQ0FBRCxFQUFJRCxDQUFKO0FBQUEsYUFBV0EsQ0FBQyxLQUFLSCxHQUFOLEdBQVlqQyxTQUFaLEdBQXdCcUMsQ0FBbkM7QUFBQSxLQUFwQixDQURnQixHQUVoQk4sS0FBSyxDQUFDL0I7QUFMWjtBQU9EOztBQUVNLFNBQVNzQyxrQ0FBVCxDQUFnRVAsS0FBaEUsRUFBMEVDLEtBQTFFLEVBQTJGO0FBQ2hHLE1BQUlPLFFBQVEsR0FBR1IsS0FBZjs7QUFDQSxNQUFJQSxLQUFLLENBQUNmLFNBQU4sQ0FBZ0J3QixNQUFwQixFQUE0QjtBQUMxQkQsSUFBQUEsUUFBUSxtQ0FDSFIsS0FERztBQUVOZixNQUFBQSxTQUFTLEVBQUVnQixLQUFLLENBQUMvRCxNQUFOLENBQWF3RSxTQUFiLEdBQ1AsbUNBQXVCVixLQUFLLENBQUNmLFNBQTdCLEVBQXdDZ0IsS0FBeEMsQ0FETyxHQUVQLHFDQUF5QkQsS0FBSyxDQUFDZixTQUEvQixFQUEwQ2dCLEtBQTFDO0FBSkUsTUFBUjtBQU1EOztBQUVELE1BQUlBLEtBQUssQ0FBQy9ELE1BQU4sQ0FBYXlFLFNBQWIsQ0FBdUIxRSxPQUEzQixFQUFvQztBQUNsQ3VFLElBQUFBLFFBQVEsR0FBR0kscUJBQXFCLENBQUNaLEtBQUQsQ0FBaEM7QUFDRDs7QUFFRCxTQUFPUSxRQUFQO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTSyx3QkFBVCxDQUNMYixLQURLLEVBRUxjLE1BRkssRUFHSztBQUFBLE1BQ0hDLFFBREcsR0FDU0QsTUFEVCxDQUNIQyxRQURHO0FBRVYsTUFBTWIsR0FBRyxHQUFHRixLQUFLLENBQUNoQyxNQUFOLENBQWFnRCxTQUFiLENBQXVCLFVBQUFDLENBQUM7QUFBQSxXQUFJQSxDQUFDLENBQUNsRixFQUFGLEtBQVNnRixRQUFRLENBQUNoRixFQUF0QjtBQUFBLEdBQXhCLENBQVo7QUFDQSxNQUFNbUYsS0FBSyxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWU4sTUFBTSxDQUFDTyxTQUFuQixDQUFkOztBQUNBLE1BQUksT0FBT1AsTUFBTSxDQUFDTyxTQUFQLENBQWlCQyxNQUF4QixLQUFtQyxRQUF2QyxFQUFpRDtBQUFBLDRCQUNmUixNQUFNLENBQUNPLFNBRFE7QUFBQSxRQUN4Q0MsTUFEd0MscUJBQ3hDQSxNQUR3QztBQUFBLFFBQzdCQyxVQUQ2QjtBQUUvQyxRQUFNQyxlQUFlLEdBQUdDLHdCQUF3QixDQUFDekIsS0FBRCxFQUFRO0FBQ3REZSxNQUFBQSxRQUFRLEVBQVJBLFFBRHNEO0FBRXRETSxNQUFBQSxTQUFTLEVBQUU7QUFBQ0MsUUFBQUEsTUFBTSxFQUFOQTtBQUFEO0FBRjJDLEtBQVIsQ0FBaEQ7QUFJQSxRQUFNSSxTQUFTLEdBQUdGLGVBQWUsQ0FBQ3hELE1BQWhCLENBQXVCMkQsSUFBdkIsQ0FBNEIsVUFBQVYsQ0FBQztBQUFBLGFBQUlBLENBQUMsQ0FBQ2xGLEVBQUYsS0FBU2dGLFFBQVEsQ0FBQ2hGLEVBQXRCO0FBQUEsS0FBN0IsQ0FBbEI7QUFDQSxXQUFPMkYsU0FBUyxJQUFJUCxNQUFNLENBQUNDLElBQVAsQ0FBWUcsVUFBWixFQUF3QmQsTUFBckMsR0FDSEksd0JBQXdCLENBQUNXLGVBQUQsRUFBa0I7QUFBQ1QsTUFBQUEsUUFBUSxFQUFFVyxTQUFYO0FBQXNCTCxNQUFBQSxTQUFTLEVBQUVFO0FBQWpDLEtBQWxCLENBRHJCLEdBRUhDLGVBRko7QUFHRDs7QUFFRCxNQUFJSSxRQUFRLEdBQUdiLFFBQVEsQ0FBQ2MsaUJBQVQsQ0FBMkJmLE1BQU0sQ0FBQ08sU0FBbEMsQ0FBZjtBQUVBLE1BQUlwRCxTQUFKLENBbEJVLENBb0JWOztBQUNBLE1BQUkyRCxRQUFRLENBQUNFLHdCQUFULENBQWtDWixLQUFsQyxDQUFKLEVBQThDO0FBQzVDLFFBQU1hLFlBQVksR0FBRy9CLEtBQUssQ0FBQy9CLFNBQU4sQ0FBZ0JpQyxHQUFoQixDQUFyQjtBQUNBLFFBQU04QixxQkFBcUIsR0FBRyxvQ0FBbUJKLFFBQW5CLEVBQTZCNUIsS0FBN0IsRUFBb0MrQixZQUFwQyxDQUE5QjtBQUVBOUQsSUFBQUEsU0FBUyxHQUFHK0QscUJBQXFCLENBQUMvRCxTQUFsQztBQUNBMkQsSUFBQUEsUUFBUSxHQUFHSSxxQkFBcUIsQ0FBQy9CLEtBQWpDO0FBQ0Q7O0FBRUQsTUFBSU8sUUFBUSxHQUFHUixLQUFmOztBQUNBLE1BQUksZUFBZWMsTUFBTSxDQUFDTyxTQUExQixFQUFxQztBQUNuQ2IsSUFBQUEsUUFBUSxHQUFHRCxrQ0FBa0MsQ0FBQ1AsS0FBRCxFQUFRNEIsUUFBUixDQUE3QztBQUNEOztBQUVELFNBQU83QiwyQkFBMkIsQ0FBQ1MsUUFBRCxFQUFXO0FBQzNDUCxJQUFBQSxLQUFLLEVBQUUyQixRQURvQztBQUUzQzNELElBQUFBLFNBQVMsRUFBVEEsU0FGMkM7QUFHM0NpQyxJQUFBQSxHQUFHLEVBQUhBO0FBSDJDLEdBQVgsQ0FBbEM7QUFLRDs7QUFFRCxTQUFTK0IscUJBQVQsQ0FBK0JDLFNBQS9CLEVBQTBDQyxTQUExQyxFQUFxRDtBQUNuRCxNQUFJQyxZQUFZLEdBQUdELFNBQVMsQ0FBQ0UsS0FBVixFQUFuQjtBQUVBLE1BQU1DLGFBQWEsR0FBR0gsU0FBUyxDQUFDaEMsR0FBVixDQUFjLFVBQUFvQyxFQUFFO0FBQUEsV0FBSUEsRUFBRSxDQUFDQyxLQUFILElBQVlELEVBQUUsQ0FBQ0MsS0FBSCxDQUFTQyxJQUF6QjtBQUFBLEdBQWhCLEVBQStDQyxNQUEvQyxDQUFzRCxVQUFBcEMsQ0FBQztBQUFBLFdBQUlBLENBQUo7QUFBQSxHQUF2RCxDQUF0QjtBQUVBLE1BQU1xQyxTQUFTLEdBQUdULFNBQVMsQ0FBQ1EsTUFBVixDQUFpQixVQUFBRSxDQUFDO0FBQUEsV0FBSSxDQUFDTixhQUFhLENBQUNPLFFBQWQsQ0FBdUJELENBQUMsQ0FBQ0gsSUFBekIsQ0FBTDtBQUFBLEdBQWxCLENBQWxCO0FBQ0EsTUFBTUssWUFBWSxHQUFHUixhQUFhLENBQUNJLE1BQWQsQ0FBcUIsVUFBQUUsQ0FBQztBQUFBLFdBQUksQ0FBQ1YsU0FBUyxDQUFDUCxJQUFWLENBQWUsVUFBQW9CLEVBQUU7QUFBQSxhQUFJQSxFQUFFLENBQUNOLElBQUgsS0FBWUcsQ0FBaEI7QUFBQSxLQUFqQixDQUFMO0FBQUEsR0FBdEIsQ0FBckIsQ0FObUQsQ0FRbkQ7O0FBQ0FSLEVBQUFBLFlBQVksR0FBR0EsWUFBWSxDQUFDTSxNQUFiLENBQW9CLFVBQUFILEVBQUU7QUFBQSxXQUFJQSxFQUFFLENBQUNDLEtBQUgsSUFBWSxDQUFDTSxZQUFZLENBQUNELFFBQWIsQ0FBc0JOLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTQyxJQUEvQixDQUFqQjtBQUFBLEdBQXRCLENBQWY7QUFDQUwsRUFBQUEsWUFBWSxHQUFHLENBQUNBLFlBQVksQ0FBQzNCLE1BQWQsR0FBdUIsQ0FBQ3VDLDZCQUFELENBQXZCLEdBQThDWixZQUE3RCxDQVZtRCxDQVluRDs7QUFDQUEsRUFBQUEsWUFBWSxpREFDUEEsWUFBWSxDQUFDTSxNQUFiLENBQW9CLFVBQUFILEVBQUU7QUFBQSxXQUFJQSxFQUFFLENBQUNDLEtBQVA7QUFBQSxHQUF0QixDQURPLHVDQUVQRyxTQUFTLENBQUN4QyxHQUFWLENBQWMsVUFBQThDLEVBQUU7QUFBQSwyQ0FDZEQsNkJBRGM7QUFFakJSLE1BQUFBLEtBQUssRUFBRVM7QUFGVTtBQUFBLEdBQWhCLENBRk8sRUFBWjtBQVFBLFNBQU9iLFlBQVA7QUFDRDs7QUFFRCxTQUFTYywyQkFBVCxDQUFxQ2hELEdBQXJDLEVBQTBDaUQsSUFBMUMsRUFBZ0RDLEtBQWhELEVBQXVEakIsU0FBdkQsRUFBa0U7QUFDaEUsTUFBSSxDQUFDQSxTQUFTLENBQUNqQyxHQUFELENBQVQsQ0FBZW1ELGNBQWYsQ0FBOEJGLElBQTlCLENBQUwsRUFBMEM7QUFDeEMsV0FBT2hCLFNBQVA7QUFDRDs7QUFFRCxNQUFJQyxZQUFZLEdBQUdELFNBQVMsQ0FBQ0UsS0FBVixFQUFuQjs7QUFFQSxNQUFJYyxJQUFJLEtBQUtDLEtBQUssSUFBSWpCLFNBQVMsQ0FBQzFCLE1BQVYsS0FBcUIsQ0FBbkMsQ0FBUixFQUErQztBQUM3QzJCLElBQUFBLFlBQVksR0FBR0QsU0FBUyxDQUFDaEMsR0FBVixDQUFjLFVBQUNvQyxFQUFELEVBQUtsQyxDQUFMO0FBQUEsYUFBWUEsQ0FBQyxLQUFLSCxHQUFOLG1DQUFnQnFDLEVBQWhCLDRDQUFxQlksSUFBckIsRUFBNEJDLEtBQTVCLEtBQXFDYixFQUFqRDtBQUFBLEtBQWQsQ0FBZjtBQUNELEdBRkQsTUFFTyxJQUFJWSxJQUFJLEtBQUssT0FBVCxJQUFvQkMsS0FBSyxLQUFLLElBQTlCLElBQXNDakIsU0FBUyxDQUFDMUIsTUFBVixHQUFtQixDQUE3RCxFQUFnRTtBQUNyRTtBQUNBMkIsSUFBQUEsWUFBWSxDQUFDa0IsTUFBYixDQUFvQnBELEdBQXBCLEVBQXlCLENBQXpCO0FBQ0Q7O0FBRUQsU0FBT2tDLFlBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVNtQiwyQkFBVCxDQUNMdkQsS0FESyxFQUVMYyxNQUZLLEVBR0s7QUFBQSxNQUNIQyxRQURHLEdBQzJCRCxNQUQzQixDQUNIQyxRQURHO0FBQUEsTUFDT2IsR0FEUCxHQUMyQlksTUFEM0IsQ0FDT1osR0FEUDtBQUFBLE1BQ1lpRCxJQURaLEdBQzJCckMsTUFEM0IsQ0FDWXFDLElBRFo7QUFBQSxNQUNrQkMsS0FEbEIsR0FDMkJ0QyxNQUQzQixDQUNrQnNDLEtBRGxCO0FBQUEsTUFFSGpCLFNBRkcsR0FFVXBCLFFBQVEsQ0FBQzdFLE1BRm5CLENBRUhpRyxTQUZHO0FBSVYsTUFBSUMsWUFBWSxHQUFHRCxTQUFTLENBQUNFLEtBQVYsRUFBbkI7O0FBQ0EsTUFBSSxDQUFDRixTQUFTLENBQUNqQyxHQUFELENBQVYsSUFBbUJBLEdBQUcsS0FBS2lDLFNBQVMsQ0FBQzFCLE1BQXpDLEVBQWlEO0FBQy9DO0FBQ0EyQixJQUFBQSxZQUFZLGlEQUFPRCxTQUFQLElBQWtCYSw2QkFBbEIsRUFBWjtBQUNEOztBQUVELE1BQUk5QyxHQUFHLEtBQUssS0FBUixJQUFpQmlELElBQUksS0FBSyxRQUE5QixFQUF3QztBQUN0Q2YsSUFBQUEsWUFBWSxHQUFHSCxxQkFBcUIsQ0FBQ21CLEtBQUQsRUFBUWpCLFNBQVIsQ0FBcEM7QUFDRCxHQUZELE1BRU87QUFDTEMsSUFBQUEsWUFBWSxHQUFHYywyQkFBMkIsQ0FBQ2hELEdBQUQsRUFBTWlELElBQU4sRUFBWUMsS0FBWixFQUFtQmhCLFlBQW5CLENBQTFDO0FBQ0QsR0FkUyxDQWVWOzs7QUFDQSxTQUFPdkIsd0JBQXdCLENBQUNiLEtBQUQsRUFBUTtBQUNyQ2UsSUFBQUEsUUFBUSxFQUFSQSxRQURxQztBQUVyQ00sSUFBQUEsU0FBUyxFQUFFO0FBQUNjLE1BQUFBLFNBQVMsRUFBRUM7QUFBWjtBQUYwQixHQUFSLENBQS9CO0FBSUQ7O0FBRUQsU0FBU29CLDZCQUFULENBQXVDQyxPQUF2QyxFQUFnRHRFLFlBQWhELEVBQThEYyxLQUE5RCxFQUFxRTtBQUNuRSxNQUFNeUQsV0FBVyxHQUFHLG9DQUFlekQsS0FBZixDQUFwQjtBQUNBLFNBQU8sMkNBQXNCd0QsT0FBdEIsRUFBK0JDLFdBQS9CLEVBQTRDdkUsWUFBNUMsRUFBMEQ7QUFDL0R3RSxJQUFBQSxnQkFBZ0IsRUFBRTtBQUQ2QyxHQUExRCxDQUFQO0FBR0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTbEMsd0JBQVQsQ0FDTHpCLEtBREssRUFFTGMsTUFGSyxFQVFLO0FBQUEsTUFDSEMsUUFERyxHQUNvQkQsTUFEcEIsQ0FDSEMsUUFERztBQUFBLE1BQ09NLFNBRFAsR0FDb0JQLE1BRHBCLENBQ09PLFNBRFA7QUFBQSxNQUVIQyxNQUZHLEdBRU9ELFNBRlAsQ0FFSEMsTUFGRzs7QUFJVixNQUFJLENBQUNQLFFBQUQsSUFBYSxDQUFDZixLQUFLLENBQUMxQixRQUFOLENBQWVnRCxNQUFmLENBQWxCLEVBQTBDO0FBQ3hDLFdBQU90QixLQUFQO0FBQ0Q7O0FBQ0QsTUFBTUUsR0FBRyxHQUFHRixLQUFLLENBQUNoQyxNQUFOLENBQWFnRCxTQUFiLENBQXVCLFVBQUFDLENBQUM7QUFBQSxXQUFJQSxDQUFDLENBQUNsRixFQUFGLEtBQVNnRixRQUFRLENBQUNoRixFQUF0QjtBQUFBLEdBQXhCLENBQVo7QUFFQSxNQUFJNkYsUUFBUSxHQUFHYixRQUFRLENBQUNjLGlCQUFULENBQTJCO0FBQUNQLElBQUFBLE1BQU0sRUFBTkE7QUFBRCxHQUEzQixDQUFmLENBVFUsQ0FVVjs7QUFDQSxNQUFJTSxRQUFRLENBQUNnQyxhQUFULEVBQUosRUFBOEI7QUFDNUIsUUFBTUMsU0FBUyxHQUFHTCw2QkFBNkIsQ0FDN0N4RCxLQUFLLENBQUMxQixRQUFOLENBQWVnRCxNQUFmLENBRDZDLEVBRTdDdEIsS0FBSyxDQUFDYixZQUZ1QyxFQUc3Q3lDLFFBSDZDLENBQS9DLENBRDRCLENBTTVCOztBQUNBLFFBQUksQ0FBQ2lDLFNBQUwsRUFBZ0I7QUFDZDtBQUNBakMsTUFBQUEsUUFBUSxHQUFHLElBQUk1QixLQUFLLENBQUNiLFlBQU4sQ0FBbUI0QixRQUFRLENBQUMrQyxJQUE1QixDQUFKLENBQXNDO0FBQUN4QyxRQUFBQSxNQUFNLEVBQU5BLE1BQUQ7QUFBU3ZGLFFBQUFBLEVBQUUsRUFBRWdGLFFBQVEsQ0FBQ2hGO0FBQXRCLE9BQXRDLENBQVg7QUFDRCxLQUhELE1BR087QUFDTDZGLE1BQUFBLFFBQVEsR0FBR2lDLFNBQVg7QUFDRDtBQUNGOztBQUVEakMsRUFBQUEsUUFBUSxHQUFHQSxRQUFRLENBQUNDLGlCQUFULENBQTJCO0FBQ3BDbkIsSUFBQUEsU0FBUyxFQUFFSyxRQUFRLENBQUM3RSxNQUFULENBQWdCd0UsU0FEUztBQUVwQ3FELElBQUFBLGNBQWMsRUFBRTtBQUZvQixHQUEzQixDQUFYO0FBS0FuQyxFQUFBQSxRQUFRLENBQUNvQyxpQkFBVCxDQUEyQmhFLEtBQUssQ0FBQzFCLFFBQWpDOztBQS9CVSw0QkFnQ2lCLG9DQUFtQnNELFFBQW5CLEVBQTZCNUIsS0FBN0IsRUFBb0N4QixTQUFwQyxDQWhDakI7QUFBQSxNQWdDSFAsU0FoQ0csdUJBZ0NIQSxTQWhDRztBQUFBLE1BZ0NRZ0MsS0FoQ1IsdUJBZ0NRQSxLQWhDUjs7QUFrQ1YsU0FBT0YsMkJBQTJCLENBQUNDLEtBQUQsRUFBUTtBQUFDL0IsSUFBQUEsU0FBUyxFQUFUQSxTQUFEO0FBQVlnQyxJQUFBQSxLQUFLLEVBQUxBLEtBQVo7QUFBbUJDLElBQUFBLEdBQUcsRUFBSEE7QUFBbkIsR0FBUixDQUFsQztBQUNEOztBQUVELFNBQVMrRCxxQkFBVCxDQUErQmhFLEtBQS9CLEVBQXNDM0IsUUFBdEMsRUFBZ0RhLFlBQWhELEVBQThEO0FBQzVELE1BQUl5QyxRQUFRLEdBQUczQixLQUFmOztBQUNBLE1BQUksQ0FBQ2tCLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZOUMsUUFBWixFQUFzQm1DLE1BQTNCLEVBQW1DO0FBQ2pDO0FBQ0EsV0FBT1IsS0FBUDtBQUNEOztBQUNELE1BQUksQ0FBQ0EsS0FBSyxDQUFDL0QsTUFBTixDQUFhb0YsTUFBbEIsRUFBMEI7QUFDeEI7QUFDQU0sSUFBQUEsUUFBUSxHQUFHM0IsS0FBSyxDQUFDNEIsaUJBQU4sQ0FBd0I7QUFBQ1AsTUFBQUEsTUFBTSxFQUFFSCxNQUFNLENBQUNDLElBQVAsQ0FBWTlDLFFBQVosRUFBc0IsQ0FBdEI7QUFBVCxLQUF4QixDQUFYO0FBQ0Q7O0FBQ0QsTUFBTW1GLE9BQU8sR0FBR25GLFFBQVEsQ0FBQ3NELFFBQVEsQ0FBQzFGLE1BQVQsQ0FBZ0JvRixNQUFqQixDQUF4Qjs7QUFDQSxNQUFJLENBQUNtQyxPQUFMLEVBQWM7QUFDWixXQUFPeEQsS0FBUDtBQUNELEdBYjJELENBZTVEOzs7QUFDQSxNQUFNaUUsTUFBTSxHQUNWLE9BQU8vRSxZQUFZLENBQUN5QyxRQUFRLENBQUNrQyxJQUFWLENBQVosQ0FBNEJLLHFCQUFuQyxLQUE2RCxVQUE3RCxHQUNJaEYsWUFBWSxDQUFDeUMsUUFBUSxDQUFDa0MsSUFBVixDQUFaLENBQTRCSyxxQkFBNUIsQ0FBa0RWLE9BQWxELEVBQTJELEVBQTNELENBREosR0FFSTtBQUFDdkMsSUFBQUEsS0FBSyxFQUFFO0FBQVIsR0FITixDQWhCNEQsQ0FxQjVEOztBQUNBLE1BQU1BLEtBQUssR0FBR2tELEtBQUssQ0FBQ0MsT0FBTixDQUFjSCxNQUFkLElBQXdCQSxNQUF4QixHQUFpQ0EsTUFBTSxDQUFDaEQsS0FBUCxJQUFnQixFQUEvRDs7QUFFQSxNQUFJQSxLQUFLLENBQUNULE1BQVYsRUFBa0I7QUFDaEJtQixJQUFBQSxRQUFRLEdBQUcsSUFBSXpDLFlBQVksQ0FBQ2MsS0FBSyxDQUFDNkQsSUFBUCxDQUFoQixpQ0FDTjVDLEtBQUssQ0FBQyxDQUFELENBREM7QUFFVGxGLE1BQUFBLEtBQUssRUFBRTRGLFFBQVEsQ0FBQzFGLE1BQVQsQ0FBZ0JGLEtBRmQ7QUFHVHNGLE1BQUFBLE1BQU0sRUFBRU0sUUFBUSxDQUFDMUYsTUFBVCxDQUFnQm9GLE1BSGY7QUFJVFosTUFBQUEsU0FBUyxFQUFFLElBSkY7QUFLVHFELE1BQUFBLGNBQWMsRUFBRW5DLFFBQVEsQ0FBQzFGLE1BQVQsQ0FBZ0I2SDtBQUx2QixPQUFYO0FBUUEsV0FBTyxPQUFPbkMsUUFBUSxDQUFDcUMscUJBQWhCLEtBQTBDLFVBQTFDLEdBQ0hyQyxRQUFRLENBQUNxQyxxQkFBVCxDQUErQlIsT0FBL0IsQ0FERyxHQUVIN0IsUUFGSjtBQUdEOztBQUVELFNBQU9BLFFBQVA7QUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLFNBQVMwQyxzQkFBVCxDQUNMdEUsS0FESyxFQUVMYyxNQUZLLEVBR0s7QUFBQSxNQUNIQyxRQURHLEdBQ2tCRCxNQURsQixDQUNIQyxRQURHO0FBQUEsTUFDT3dELE9BRFAsR0FDa0J6RCxNQURsQixDQUNPeUQsT0FEUDs7QUFFVixNQUFJLENBQUN4RCxRQUFMLEVBQWU7QUFDYixXQUFPZixLQUFQO0FBQ0Q7O0FBQ0QsTUFBTXdFLEtBQUssR0FBR3pELFFBQVEsQ0FBQ2hGLEVBQXZCO0FBQ0EsTUFBTW1FLEdBQUcsR0FBR0YsS0FBSyxDQUFDaEMsTUFBTixDQUFhZ0QsU0FBYixDQUF1QixVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDbEYsRUFBRixLQUFTeUksS0FBYjtBQUFBLEdBQXhCLENBQVo7O0FBRUEsTUFBSSxDQUFDeEUsS0FBSyxDQUFDYixZQUFOLENBQW1Cb0YsT0FBbkIsQ0FBTCxFQUFrQztBQUNoQ0Usb0JBQVFDLEtBQVIsV0FBaUJILE9BQWpCOztBQUNBLFdBQU92RSxLQUFQO0FBQ0Q7O0FBQ0QsTUFBSTRCLFFBQVEsR0FBRyxJQUFJNUIsS0FBSyxDQUFDYixZQUFOLENBQW1Cb0YsT0FBbkIsQ0FBSixDQUFnQztBQUM3QztBQUNBdkksSUFBQUEsS0FBSyxFQUFFK0UsUUFBUSxDQUFDN0UsTUFBVCxDQUFnQkYsS0FGc0I7QUFHN0MrSCxJQUFBQSxjQUFjLEVBQUVoRCxRQUFRLENBQUM3RSxNQUFULENBQWdCNkg7QUFIYSxHQUFoQyxDQUFmOztBQU1BLE1BQUksQ0FBQ2hELFFBQVEsQ0FBQytDLElBQWQsRUFBb0I7QUFDbEI7QUFDQWxDLElBQUFBLFFBQVEsR0FBR3FDLHFCQUFxQixDQUFDckMsUUFBRCxFQUFXNUIsS0FBSyxDQUFDMUIsUUFBakIsRUFBMkIwQixLQUFLLENBQUNiLFlBQWpDLENBQWhDO0FBQ0QsR0FIRCxNQUdPO0FBQ0w7QUFDQTtBQUNBO0FBQ0F5QyxJQUFBQSxRQUFRLENBQUMrQyxtQkFBVCxDQUE2QjVELFFBQVEsQ0FBQzdFLE1BQXRDLEVBQThDNkUsUUFBUSxDQUFDNkQsaUJBQXZEO0FBQ0FoRCxJQUFBQSxRQUFRLENBQUNvQyxpQkFBVCxDQUEyQmhFLEtBQUssQ0FBQzFCLFFBQWpDO0FBQ0Q7O0FBM0JTLE1BNkJITyxPQTdCRyxHQTZCbUJtQixLQTdCbkIsQ0E2QkhuQixPQTdCRztBQUFBLE1BNkJNRCxTQTdCTixHQTZCbUJvQixLQTdCbkIsQ0E2Qk1wQixTQTdCTjs7QUErQlYsTUFBSTRCLFFBQVEsbUNBQ1BSLEtBRE87QUFFVm5CLElBQUFBLE9BQU8sRUFBRWtDLFFBQVEsQ0FBQzhELGNBQVQsQ0FBd0JoRyxPQUF4QixJQUFtQ0wsU0FBbkMsR0FBK0NLLE9BRjlDO0FBR1ZELElBQUFBLFNBQVMsRUFBRW1DLFFBQVEsQ0FBQzhELGNBQVQsQ0FBd0JqRyxTQUF4QixJQUFxQ0osU0FBckMsR0FBaURJO0FBSGxELElBQVo7O0FBL0JVLDZCQXFDaUIsb0NBQW1CZ0QsUUFBbkIsRUFBNkJwQixRQUE3QixDQXJDakI7QUFBQSxNQXFDSHZDLFNBckNHLHdCQXFDSEEsU0FyQ0c7QUFBQSxNQXFDUWdDLEtBckNSLHdCQXFDUUEsS0FyQ1I7O0FBc0NWTyxFQUFBQSxRQUFRLEdBQUdULDJCQUEyQixDQUFDUyxRQUFELEVBQVc7QUFBQ3ZDLElBQUFBLFNBQVMsRUFBVEEsU0FBRDtBQUFZZ0MsSUFBQUEsS0FBSyxFQUFMQSxLQUFaO0FBQW1CQyxJQUFBQSxHQUFHLEVBQUhBO0FBQW5CLEdBQVgsQ0FBdEM7O0FBRUEsTUFBSUQsS0FBSyxDQUFDL0QsTUFBTixDQUFheUUsU0FBYixDQUF1QjFFLE9BQXZCLElBQWtDOEUsUUFBUSxDQUFDN0UsTUFBVCxDQUFnQnlFLFNBQWhCLENBQTBCMUUsT0FBaEUsRUFBeUU7QUFDdkV1RSxJQUFBQSxRQUFRLEdBQUdJLHFCQUFxQixDQUFDSixRQUFELENBQWhDO0FBQ0QsR0ExQ1MsQ0E0Q1Y7OztBQUNBLE1BQUlSLEtBQUssQ0FBQ2YsU0FBTixDQUFnQndCLE1BQXBCLEVBQTRCO0FBQzFCRCxJQUFBQSxRQUFRLG1DQUNIQSxRQURHO0FBRU52QixNQUFBQSxTQUFTLEVBQUV1QixRQUFRLENBQUN2QixTQUFULENBQW1Ca0IsR0FBbkIsQ0FBdUIsVUFBQTJFLFFBQVEsRUFBSTtBQUFBLCtCQUNHQSxRQUFRLENBQUM5RyxNQURaO0FBQUEsWUFDNUIrRyxXQUQ0QixvQkFDcENQLEtBRG9DO0FBQUEsWUFDWlEsV0FEWSxnRUFDcENSLEtBRG9DO0FBRTVDLGVBQU9BLEtBQUssSUFBSU0sUUFBUSxDQUFDOUcsTUFBbEIsbUNBRUU4RyxRQUZGO0FBR0Q5RyxVQUFBQSxNQUFNLGtDQUNEZ0gsV0FEQyw0Q0FFSC9FLEtBQUssQ0FBQ2xFLEVBRkgsRUFFUWdKLFdBRlI7QUFITCxhQVFIRCxRQVJKO0FBU0QsT0FYVTtBQUZMLE1BQVI7QUFlRDs7QUFFRCxTQUFPdEUsUUFBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTeUUsK0JBQVQsQ0FDTGpGLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQUEsTUFDSEMsUUFERyxHQUM2QkQsTUFEN0IsQ0FDSEMsUUFERztBQUFBLE1BQ09NLFNBRFAsR0FDNkJQLE1BRDdCLENBQ09PLFNBRFA7QUFBQSxNQUNrQjZELE9BRGxCLEdBQzZCcEUsTUFEN0IsQ0FDa0JvRSxPQURsQjs7QUFFVixNQUFJLENBQUNuRSxRQUFRLENBQUM3RSxNQUFULENBQWdCb0YsTUFBckIsRUFBNkI7QUFDM0IsV0FBT3RCLEtBQVA7QUFDRDs7QUFDRCxNQUFNeUQsT0FBTyxHQUFHekQsS0FBSyxDQUFDMUIsUUFBTixDQUFleUMsUUFBUSxDQUFDN0UsTUFBVCxDQUFnQm9GLE1BQS9CLENBQWhCO0FBRUEsTUFBTXBCLEdBQUcsR0FBR0YsS0FBSyxDQUFDaEMsTUFBTixDQUFhZ0QsU0FBYixDQUF1QixVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDbEYsRUFBRixLQUFTZ0YsUUFBUSxDQUFDaEYsRUFBdEI7QUFBQSxHQUF4QixDQUFaO0FBQ0EsTUFBTTZGLFFBQVEsR0FBR2IsUUFBUSxDQUFDYyxpQkFBVCxDQUEyQlIsU0FBM0IsQ0FBakI7QUFFQU8sRUFBQUEsUUFBUSxDQUFDdUQsd0JBQVQsQ0FBa0MxQixPQUFsQyxFQUEyQ3lCLE9BQTNDO0FBRUEsTUFBTW5ELFlBQVksR0FBRy9CLEtBQUssQ0FBQy9CLFNBQU4sQ0FBZ0JpQyxHQUFoQixDQUFyQjs7QUFaVSw2QkFhaUIsb0NBQW1CMEIsUUFBbkIsRUFBNkI1QixLQUE3QixFQUFvQytCLFlBQXBDLENBYmpCO0FBQUEsTUFhSDlELFNBYkcsd0JBYUhBLFNBYkc7QUFBQSxNQWFRZ0MsS0FiUix3QkFhUUEsS0FiUjs7QUFlVixTQUFPRiwyQkFBMkIsQ0FBQ0MsS0FBRCxFQUFRO0FBQUMvQixJQUFBQSxTQUFTLEVBQVRBLFNBQUQ7QUFBWWdDLElBQUFBLEtBQUssRUFBTEEsS0FBWjtBQUFtQkMsSUFBQUEsR0FBRyxFQUFIQTtBQUFuQixHQUFSLENBQWxDO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTa0YsMkJBQVQsQ0FDTHBGLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQUEsTUFDSEMsUUFERyxHQUNTRCxNQURULENBQ0hDLFFBREc7QUFFVixNQUFNYixHQUFHLEdBQUdGLEtBQUssQ0FBQ2hDLE1BQU4sQ0FBYWdELFNBQWIsQ0FBdUIsVUFBQUMsQ0FBQztBQUFBLFdBQUlBLENBQUMsQ0FBQ2xGLEVBQUYsS0FBU2dGLFFBQVEsQ0FBQ2hGLEVBQXRCO0FBQUEsR0FBeEIsQ0FBWjtBQUNBLE1BQU1tRixLQUFLLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixNQUFNLENBQUN1RSxZQUFuQixDQUFkOztBQUNBLE1BQU1BLFlBQVksbUNBQ2J0RSxRQUFRLENBQUM3RSxNQUFULENBQWdCb0osU0FESCxHQUVieEUsTUFBTSxDQUFDdUUsWUFGTSxDQUFsQjs7QUFLQSxNQUFNekQsUUFBUSxHQUFHYixRQUFRLENBQUNjLGlCQUFULENBQTJCO0FBQUN5RCxJQUFBQSxTQUFTLEVBQUVEO0FBQVosR0FBM0IsQ0FBakI7O0FBRUEsTUFBSXpELFFBQVEsQ0FBQ0Usd0JBQVQsQ0FBa0NaLEtBQWxDLENBQUosRUFBOEM7QUFDNUMsUUFBTWEsWUFBWSxHQUFHL0IsS0FBSyxDQUFDL0IsU0FBTixDQUFnQmlDLEdBQWhCLENBQXJCOztBQUQ0QywrQkFFakIsb0NBQW1CMEIsUUFBbkIsRUFBNkI1QixLQUE3QixFQUFvQytCLFlBQXBDLENBRmlCO0FBQUEsUUFFckM5RCxTQUZxQyx3QkFFckNBLFNBRnFDO0FBQUEsUUFFMUJnQyxLQUYwQix3QkFFMUJBLEtBRjBCOztBQUc1QyxXQUFPRiwyQkFBMkIsQ0FBQ0MsS0FBRCxFQUFRO0FBQUMvQixNQUFBQSxTQUFTLEVBQVRBLFNBQUQ7QUFBWWdDLE1BQUFBLEtBQUssRUFBTEEsS0FBWjtBQUFtQkMsTUFBQUEsR0FBRyxFQUFIQTtBQUFuQixLQUFSLENBQWxDO0FBQ0Q7O0FBRUQsU0FBT0gsMkJBQTJCLENBQUNDLEtBQUQsRUFBUTtBQUFDQyxJQUFBQSxLQUFLLEVBQUUyQixRQUFSO0FBQWtCMUIsSUFBQUEsR0FBRyxFQUFIQTtBQUFsQixHQUFSLENBQWxDO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTcUYsNkJBQVQsQ0FDTHZGLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQ1YsU0FBTzBFLGdCQUFnQixDQUFDeEYsS0FBRCxFQUFRYyxNQUFSLENBQXZCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTMkUsK0JBQVQsQ0FDTHpGLEtBREssU0FHSztBQUFBLE1BRFRqRSxFQUNTLFNBRFRBLEVBQ1M7QUFBQSxNQURMMkosZUFDSyxTQURMQSxlQUNLO0FBQ1YseUNBQ0sxRixLQURMO0FBRUU1QixJQUFBQSxPQUFPLEVBQUU0QixLQUFLLENBQUM1QixPQUFOLENBQWMrQixHQUFkLENBQWtCLFVBQUF5QyxDQUFDO0FBQUEsYUFDMUJBLENBQUMsQ0FBQzdHLEVBQUYsS0FBU0EsRUFBVCxtQ0FFUzZHLENBRlQ7QUFHTThDLFFBQUFBLGVBQWUsRUFBZkE7QUFITixXQUtJOUMsQ0FOc0I7QUFBQSxLQUFuQjtBQUZYO0FBV0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTNEMsZ0JBQVQsQ0FDTHhGLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQUEsTUFDSFosR0FERyxHQUNpQ1ksTUFEakMsQ0FDSFosR0FERztBQUFBLE1BQ0VpRCxJQURGLEdBQ2lDckMsTUFEakMsQ0FDRXFDLElBREY7QUFBQSxNQUNRQyxLQURSLEdBQ2lDdEMsTUFEakMsQ0FDUXNDLEtBRFI7QUFBQSwyQkFDaUN0QyxNQURqQyxDQUNlNkUsVUFEZjtBQUFBLE1BQ2VBLFVBRGYsbUNBQzRCLENBRDVCO0FBRVYsTUFBTUMsU0FBUyxHQUFHNUYsS0FBSyxDQUFDNUIsT0FBTixDQUFjOEIsR0FBZCxDQUFsQjs7QUFFQSxNQUFJLENBQUMwRixTQUFMLEVBQWdCO0FBQ2RuQixvQkFBUUMsS0FBUixtQkFBeUJ4RSxHQUF6Qjs7QUFDQSxXQUFPRixLQUFQO0FBQ0Q7O0FBQ0QsTUFBSTZGLFNBQVMsR0FBRyxnQkFBSSxDQUFDMUMsSUFBRCxDQUFKLEVBQVlDLEtBQVosRUFBbUJ3QyxTQUFuQixDQUFoQjtBQUNBLE1BQUlwRixRQUFRLEdBQUdSLEtBQWY7QUFUVSxtQkFXTzZGLFNBWFA7QUFBQSxNQVdIdkUsTUFYRyxjQVdIQSxNQVhHLEVBYVY7O0FBQ0EsTUFBSXdFLFVBQVUsR0FBRyxvQkFBUXhFLE1BQVIsQ0FBakI7O0FBRUEsVUFBUTZCLElBQVI7QUFDRTtBQUNBO0FBQ0E7QUFDQSxTQUFLNEMsNEJBQXFCekUsTUFBMUI7QUFDRTtBQUNBdUUsTUFBQUEsU0FBUyxHQUFHLCtCQUFtQnZFLE1BQW5CLENBQVo7QUFDQTs7QUFFRixTQUFLeUUsNEJBQXFCdEQsSUFBMUI7QUFDRTtBQUNBO0FBQ0E7QUFDQSxVQUFNdUQsU0FBUyxHQUFHSCxTQUFTLENBQUN2RSxNQUFWLENBQWlCcUUsVUFBakIsQ0FBbEI7O0FBSkYsa0NBS3VELGlDQUNuREUsU0FEbUQsRUFFbkQ3RixLQUFLLENBQUMxQixRQUFOLENBQWUwSCxTQUFmLENBRm1ELEVBR25ENUMsS0FIbUQsRUFJbkR1QyxVQUptRCxFQUtuRDtBQUFDTSxRQUFBQSxXQUFXLEVBQUU7QUFBZCxPQUxtRCxDQUx2RDtBQUFBLFVBS2lCQyxhQUxqQix5QkFLU3hELE1BTFQ7QUFBQSxVQUt5Q3lELFVBTHpDLHlCQUtnQzFDLE9BTGhDOztBQVlFLFVBQUksQ0FBQ3lDLGFBQUwsRUFBb0I7QUFDbEIsZUFBT2xHLEtBQVA7QUFDRDs7QUFFRDZGLE1BQUFBLFNBQVMsR0FBR0ssYUFBWjs7QUFFQSxVQUFJTCxTQUFTLENBQUNPLEdBQWQsRUFBbUI7QUFDakJQLFFBQUFBLFNBQVMsR0FBRyw2QkFBaUJBLFNBQWpCLEVBQTRCN0YsS0FBSyxDQUFDNUIsT0FBbEMsQ0FBWjtBQUNBeUgsUUFBQUEsU0FBUyxHQUFHLDZCQUFpQkEsU0FBakIsRUFBNEI3RixLQUFLLENBQUM1QixPQUFsQyxDQUFaO0FBQ0Q7O0FBRURvQyxNQUFBQSxRQUFRLEdBQUcsZ0JBQUksQ0FBQyxVQUFELEVBQWF3RixTQUFiLENBQUosRUFBNkJHLFVBQTdCLEVBQXlDbkcsS0FBekMsQ0FBWCxDQXZCRixDQXlCRTs7QUFDQTs7QUFDRixTQUFLK0YsNEJBQXFCTSxPQUExQjtBQUNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBTUMsaUJBQWlCLEdBQUcseUJBQUlULFNBQVMsQ0FBQ1EsT0FBZCxFQUF1QlQsU0FBUyxDQUFDUyxPQUFqQyxDQUExQjtBQUVBLFVBQU1FLFlBQVksR0FBRyx5QkFDbkJELGlCQUFpQixDQUNkbkcsR0FESCxDQUNPLFVBQUFxRyxHQUFHO0FBQUEsZUFDTix5QkFDRXhHLEtBQUssQ0FBQ2hDLE1BQU4sQ0FBYTJELElBQWIsQ0FBa0IsVUFBQVYsQ0FBQztBQUFBLGlCQUFJQSxDQUFDLENBQUNsRixFQUFGLEtBQVN5SyxHQUFiO0FBQUEsU0FBbkIsQ0FERixFQUVFLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FGRixDQURNO0FBQUEsT0FEVixFQU9HOUQsTUFQSCxDQU9VLFVBQUFwQyxDQUFDO0FBQUEsZUFBSUEsQ0FBSjtBQUFBLE9BUFgsQ0FEbUIsQ0FBckIsQ0FQRixDQWtCRTs7QUFDQXdGLE1BQUFBLFVBQVUsR0FBR1MsWUFBYixDQW5CRixDQXFCRTs7QUFDQSxVQUFNRSxVQUFVLEdBQUcseUJBQ2pCWixTQUFTLENBQUNRLE9BQVYsQ0FDR2xHLEdBREgsQ0FDTyxVQUFBcUcsR0FBRztBQUFBLGVBQ04seUJBQ0V4RyxLQUFLLENBQUNoQyxNQUFOLENBQWEyRCxJQUFiLENBQWtCLFVBQUFWLENBQUM7QUFBQSxpQkFBSUEsQ0FBQyxDQUFDbEYsRUFBRixLQUFTeUssR0FBYjtBQUFBLFNBQW5CLENBREYsRUFFRSxDQUFDLFFBQUQsRUFBVyxRQUFYLENBRkYsQ0FETTtBQUFBLE9BRFYsRUFPRzlELE1BUEgsQ0FPVSxVQUFBcEMsQ0FBQztBQUFBLGVBQUlBLENBQUo7QUFBQSxPQVBYLENBRGlCLENBQW5CO0FBV0F1RixNQUFBQSxTQUFTLG1DQUNKQSxTQURJO0FBRVB2RSxRQUFBQSxNQUFNLEVBQUVtRjtBQUZELFFBQVQ7QUFLQTs7QUFDRjtBQUNFO0FBNUVKOztBQStFQSxNQUFNQyxjQUFjLEdBQUcxRyxLQUFLLENBQUM1QixPQUFOLENBQWN1RCxJQUFkLENBQW1CLFVBQUFpQixDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDK0QsUUFBTjtBQUFBLEdBQXBCLENBQXZCOztBQUVBLE1BQUlELGNBQWMsSUFBSUEsY0FBYyxDQUFDM0ssRUFBZixLQUFzQjhKLFNBQVMsQ0FBQzlKLEVBQXRELEVBQTBEO0FBQ3hEO0FBQ0E4SixJQUFBQSxTQUFTLENBQUNjLFFBQVYsR0FBcUIsS0FBckI7QUFDRCxHQXBHUyxDQXNHVjs7O0FBQ0FuRyxFQUFBQSxRQUFRLEdBQUcsZ0JBQUksQ0FBQyxTQUFELEVBQVlOLEdBQVosQ0FBSixFQUFzQjJGLFNBQXRCLEVBQWlDckYsUUFBakMsQ0FBWCxDQXZHVSxDQXlHVjtBQUNBO0FBQ0E7O0FBQ0EsTUFBTW9HLGtCQUFrQixHQUFHQyxtQ0FBNEIxRCxJQUE1QixJQUN2QixDQUFDMkMsVUFBVSxDQUFDSCxVQUFELENBQVgsQ0FEdUIsR0FFdkJHLFVBRkosQ0E1R1UsQ0FnSFY7O0FBQ0EsTUFBTWdCLGdCQUFnQixHQUFHLG1DQUN2QkYsa0JBRHVCLEVBRXZCcEcsUUFBUSxDQUFDbEMsUUFGYyxFQUd2QmtDLFFBQVEsQ0FBQ3BDLE9BSGMsRUFJdkJvQyxRQUFRLENBQUN4QyxNQUpjLENBQXpCO0FBT0F3QyxFQUFBQSxRQUFRLEdBQUcsZ0JBQUksQ0FBQyxVQUFELENBQUosRUFBa0JzRyxnQkFBbEIsRUFBb0N0RyxRQUFwQyxDQUFYLENBeEhVLENBeUhWO0FBQ0E7O0FBQ0FBLEVBQUFBLFFBQVEsR0FBR3VHLHdCQUF3QixDQUFDdkcsUUFBRCxFQUFXb0csa0JBQVgsRUFBK0JmLFNBQS9CLENBQW5DO0FBRUEsU0FBT3JGLFFBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU13RyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQ2xDaEgsS0FEa0MsU0FHckI7QUFBQSxNQURaRSxHQUNZLFNBRFpBLEdBQ1k7QUFBQSxNQURQK0csT0FDTyxTQURQQSxPQUNPO0FBQUEsK0JBREV0QixVQUNGO0FBQUEsTUFERUEsVUFDRixpQ0FEZSxDQUNmOztBQUNiLE1BQUlFLFNBQVMsbUNBQU83RixLQUFLLENBQUM1QixPQUFOLENBQWM4QixHQUFkLENBQVAsR0FBOEIrRyxPQUE5QixDQUFiOztBQUNBLE1BQU05RCxJQUFJLEdBQUdoQyxNQUFNLENBQUNDLElBQVAsQ0FBWTZGLE9BQVosRUFBcUIsQ0FBckIsQ0FBYjs7QUFDQSxNQUFJOUQsSUFBSSxLQUFLLE9BQWIsRUFBc0I7QUFDcEIsUUFBTStELFFBQVEsR0FBRyxxQ0FBeUJyQixTQUF6QixDQUFqQixDQURvQixDQUVwQjs7QUFDQSxRQUFJcUIsUUFBSixFQUFjO0FBQ1pyQixNQUFBQSxTQUFTLGlEQUNKQSxTQURJLEdBRUosMERBQWtCQSxTQUFsQjtBQUE2QnFCLFFBQUFBLFFBQVEsRUFBUkE7QUFBN0IsVUFBd0NsSCxLQUFLLENBQUMxQixRQUFOLENBQWV1SCxTQUFTLENBQUN2RSxNQUFWLENBQWlCcUUsVUFBakIsQ0FBZixDQUF4QyxDQUZJO0FBR1B1QixRQUFBQSxRQUFRLEVBQVJBO0FBSE8sUUFBVDtBQUtEO0FBQ0Y7O0FBRUQseUNBQ0tsSCxLQURMO0FBRUU1QixJQUFBQSxPQUFPLEVBQUU0QixLQUFLLENBQUM1QixPQUFOLENBQWMrQixHQUFkLENBQWtCLFVBQUN5QyxDQUFELEVBQUl2QyxDQUFKO0FBQUEsYUFBV0EsQ0FBQyxLQUFLSCxHQUFOLEdBQVkyRixTQUFaLEdBQXdCakQsQ0FBbkM7QUFBQSxLQUFsQjtBQUZYO0FBSUQsQ0F0Qk07QUF3QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNdUUsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUM5Qm5ILEtBRDhCLEVBRTlCYyxNQUY4QjtBQUFBLFNBSTlCLENBQUNBLE1BQU0sQ0FBQ1EsTUFBUixHQUNJdEIsS0FESixtQ0FHU0EsS0FIVDtBQUlNNUIsSUFBQUEsT0FBTyxnREFBTTRCLEtBQUssQ0FBQzVCLE9BQVosSUFBcUIsNkJBQWlCMEMsTUFBTSxDQUFDUSxNQUF4QixDQUFyQjtBQUpiLElBSjhCO0FBQUEsQ0FBekI7QUFXUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNOEYseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUE0QixDQUN2Q3BILEtBRHVDLFNBRzFCO0FBQUEsTUFEWmUsUUFDWSxTQURaQSxRQUNZO0FBQUEsTUFERm9DLElBQ0UsU0FERkEsSUFDRTtBQUFBLE1BREk5QixTQUNKLFNBRElBLFNBQ0o7QUFDYixNQUFNZ0csWUFBWSxHQUFHdEcsUUFBUSxDQUFDN0UsTUFBVCxDQUFnQm9KLFNBQWhCLENBQTBCbkMsSUFBMUIsQ0FBckI7QUFDQSxNQUFNdkIsUUFBUSxHQUFHYixRQUFRLENBQUN1RyxrQkFBVCxDQUE0Qm5FLElBQTVCLEVBQWtDOUIsU0FBbEMsQ0FBakI7QUFDQSxNQUFNZ0UsWUFBWSxHQUFHekQsUUFBUSxDQUFDMUYsTUFBVCxDQUFnQm9KLFNBQWhCLENBQTBCbkMsSUFBMUIsQ0FBckI7O0FBQ0EsTUFBSWtFLFlBQVksS0FBS2hDLFlBQXJCLEVBQW1DO0FBQ2pDLFdBQU9ELDJCQUEyQixDQUFDcEYsS0FBRCxFQUFRO0FBQ3hDZSxNQUFBQSxRQUFRLEVBQVJBLFFBRHdDO0FBRXhDc0UsTUFBQUEsWUFBWSx1Q0FDVGxDLElBRFMsRUFDRmtDLFlBREU7QUFGNEIsS0FBUixDQUFsQztBQU1EOztBQUNELHlDQUNLckYsS0FETDtBQUVFaEMsSUFBQUEsTUFBTSxFQUFFZ0MsS0FBSyxDQUFDaEMsTUFBTixDQUFhbUMsR0FBYixDQUFpQixVQUFBYyxDQUFDO0FBQUEsYUFBS0EsQ0FBQyxDQUFDbEYsRUFBRixLQUFTZ0YsUUFBUSxDQUFDaEYsRUFBbEIsR0FBdUI2RixRQUF2QixHQUFrQ1gsQ0FBdkM7QUFBQSxLQUFsQjtBQUZWO0FBSUQsQ0FuQk07QUFxQlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNc0csNEJBQTRCLEdBQUcsU0FBL0JBLDRCQUErQixDQUMxQ3ZILEtBRDBDLEVBRTFDYyxNQUYwQztBQUFBLHlDQUl2Q2QsS0FKdUM7QUFLMUM1QixJQUFBQSxPQUFPLEVBQUU0QixLQUFLLENBQUM1QixPQUFOLENBQWMrQixHQUFkLENBQWtCLFVBQUN5QyxDQUFELEVBQUl2QyxDQUFKO0FBQUEsYUFBV0EsQ0FBQyxLQUFLUyxNQUFNLENBQUNaLEdBQWIsbUNBQXVCMEMsQ0FBdkI7QUFBMEIzRixRQUFBQSxXQUFXLEVBQUUsQ0FBQzJGLENBQUMsQ0FBQzNGO0FBQTFDLFdBQXlEMkYsQ0FBcEU7QUFBQSxLQUFsQjtBQUxpQztBQUFBLENBQXJDO0FBUVA7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTTRFLDJCQUEyQixHQUFHLFNBQTlCQSwyQkFBOEIsQ0FDekN4SCxLQUR5QyxFQUV6Q2MsTUFGeUM7QUFBQSx5Q0FJdENkLEtBSnNDO0FBS3pDWCxJQUFBQSxlQUFlLGtDQUNWVyxLQUFLLENBQUNYLGVBREk7QUFFYnBDLE1BQUFBLFdBQVcsRUFBRSxDQUFDK0MsS0FBSyxDQUFDWCxlQUFOLENBQXNCcEM7QUFGdkI7QUFMMEI7QUFBQSxDQUFwQztBQVdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTXdLLGtDQUFrQyxHQUFHLFNBQXJDQSxrQ0FBcUMsQ0FDaER6SCxLQURnRCxFQUVoRGMsTUFGZ0Q7QUFBQSx5Q0FJN0NkLEtBSjZDO0FBS2hEWCxJQUFBQSxlQUFlLGtDQUNWVyxLQUFLLENBQUNYLGVBREk7QUFFYnFJLE1BQUFBLFdBQVcsRUFBRSxDQUFDMUgsS0FBSyxDQUFDWCxlQUFOLENBQXNCcUk7QUFGdkI7QUFMaUM7QUFBQSxDQUEzQztBQVdQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTUMsaUNBQWlDLEdBQUcsU0FBcENBLGlDQUFvQyxDQUMvQzNILEtBRCtDLEVBRS9DYyxNQUYrQztBQUFBLHlDQUk1Q2QsS0FKNEM7QUFLL0M1QixJQUFBQSxPQUFPLEVBQUU0QixLQUFLLENBQUM1QixPQUFOLENBQWMrQixHQUFkLENBQWtCLFVBQUN5QyxDQUFELEVBQUl2QyxDQUFKO0FBQUEsYUFBV0EsQ0FBQyxLQUFLUyxNQUFNLENBQUNaLEdBQWIsbUNBQXVCMEMsQ0FBdkI7QUFBMEI1RixRQUFBQSxLQUFLLEVBQUU4RCxNQUFNLENBQUM5RDtBQUF4QyxXQUFpRDRGLENBQTVEO0FBQUEsS0FBbEI7QUFMc0M7QUFBQSxDQUExQztBQVFQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNZ0YsNEJBQTRCLEdBQUcsU0FBL0JBLDRCQUErQixDQUMxQzVILEtBRDBDO0FBQUEsTUFFekNvRCxLQUZ5QyxTQUV6Q0EsS0FGeUM7QUFBQSx5Q0FJdkNwRCxLQUp1QztBQUsxQ1gsSUFBQUEsZUFBZSxrQ0FDVlcsS0FBSyxDQUFDWCxlQURJO0FBRWJ0QyxNQUFBQSxXQUFXLEVBQUVxRztBQUZBO0FBTDJCO0FBQUEsQ0FBckM7QUFXUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTXlFLGdDQUFnQyxHQUFHLFNBQW5DQSxnQ0FBbUMsQ0FDOUM3SCxLQUQ4QyxTQUdqQztBQUFBLE1BRFpoRCxLQUNZLFNBRFpBLEtBQ1k7QUFDYix5Q0FDS2dELEtBREw7QUFFRVgsSUFBQUEsZUFBZSxrQ0FDVlcsS0FBSyxDQUFDWCxlQURJO0FBRWJyQyxNQUFBQSxLQUFLLEVBQUxBO0FBRmE7QUFGakI7QUFPRCxDQVhNO0FBYVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNOEssb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUF1QixDQUNsQzlILEtBRGtDLEVBRWxDYyxNQUZrQyxFQUdyQjtBQUNiLHlDQUNLZCxLQURMO0FBRUU1QixJQUFBQSxPQUFPLEVBQUU0QixLQUFLLENBQUM1QixPQUFOLENBQWMrQixHQUFkLENBQWtCLFVBQUN5QyxDQUFELEVBQUl2QyxDQUFKO0FBQUEsYUFDekJBLENBQUMsS0FBS1MsTUFBTSxDQUFDWixHQUFiLG1DQUVTMEMsQ0FGVDtBQUdNK0QsUUFBQUEsUUFBUSxFQUFFLENBQUMvRCxDQUFDLENBQUMrRDtBQUhuQixXQUtJL0QsQ0FOcUI7QUFBQSxLQUFsQjtBQUZYO0FBV0QsQ0FmTTtBQWlCUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNbUYsMEJBQTBCLEdBQUcsU0FBN0JBLDBCQUE2QixDQUN4Qy9ILEtBRHdDLEVBRXhDYyxNQUZ3QyxFQUczQjtBQUNiLE1BQU00QixNQUFNLEdBQUcxQyxLQUFLLENBQUM1QixPQUFOLENBQWMwQyxNQUFNLENBQUNaLEdBQXJCLENBQWY7QUFDQSxNQUFNUSxTQUFTLEdBQUcseUJBQUlnQyxNQUFKLEVBQVksQ0FBQyxPQUFELEVBQVUsWUFBVixFQUF3QixXQUF4QixDQUFaLENBQWxCOztBQUNBLE1BQU1tRCxTQUFTLG1DQUNWbkQsTUFEVTtBQUViVSxJQUFBQSxLQUFLLEVBQUUsaUNBQXFCVixNQUFNLENBQUNVLEtBQTVCLEVBQW1DVixNQUFNLENBQUMzRyxFQUExQyxFQUE4QztBQUNuRDJFLE1BQUFBLFNBQVMsRUFBRSxDQUFDQTtBQUR1QyxLQUE5QztBQUZNLElBQWY7O0FBT0EseUNBQ0tWLEtBREw7QUFFRTVCLElBQUFBLE9BQU8sRUFBRStDLE1BQU0sQ0FBQzZHLE1BQVAscUNBQWtCaEksS0FBSyxDQUFDNUIsT0FBeEIsd0NBQW9DMEMsTUFBTSxDQUFDWixHQUEzQyxFQUFpRDJGLFNBQWpEO0FBRlg7QUFJRCxDQWpCTTtBQW1CUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1vQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQXNCLENBQ2pDakksS0FEaUMsRUFFakNjLE1BRmlDLEVBR3BCO0FBQUEsTUFDTlosR0FETSxHQUNDWSxNQURELENBQ05aLEdBRE07QUFBQSwyQkFFUUYsS0FBSyxDQUFDNUIsT0FBTixDQUFjOEIsR0FBZCxDQUZSO0FBQUEsTUFFTm9CLE1BRk0sc0JBRU5BLE1BRk07QUFBQSxNQUVFdkYsRUFGRixzQkFFRUEsRUFGRjtBQUliLE1BQU1tTSxVQUFVLGlEQUNYbEksS0FBSyxDQUFDNUIsT0FBTixDQUFjaUUsS0FBZCxDQUFvQixDQUFwQixFQUF1Qm5DLEdBQXZCLENBRFcsdUNBRVhGLEtBQUssQ0FBQzVCLE9BQU4sQ0FBY2lFLEtBQWQsQ0FBb0JuQyxHQUFHLEdBQUcsQ0FBMUIsRUFBNkJGLEtBQUssQ0FBQzVCLE9BQU4sQ0FBY3FDLE1BQTNDLENBRlcsRUFBaEI7QUFLQSxNQUFNcUcsZ0JBQWdCLEdBQUcsbUNBQXVCeEYsTUFBdkIsRUFBK0J0QixLQUFLLENBQUMxQixRQUFyQyxFQUErQzRKLFVBQS9DLEVBQTJEbEksS0FBSyxDQUFDaEMsTUFBakUsQ0FBekI7QUFDQSxNQUFNbUssU0FBUyxHQUNiLGlDQUFxQm5JLEtBQUssQ0FBQ1YsTUFBTixDQUFhNUIsZUFBbEMsTUFBdUQzQixFQUF2RCxtQ0FFU2lFLEtBQUssQ0FBQ1YsTUFGZjtBQUdNNUIsSUFBQUEsZUFBZSxFQUFFO0FBSHZCLE9BS0lzQyxLQUFLLENBQUNWLE1BTlo7QUFRQSxNQUFJa0IsUUFBUSxHQUFHLGdCQUFJLENBQUMsU0FBRCxDQUFKLEVBQWlCMEgsVUFBakIsRUFBNkJsSSxLQUE3QixDQUFmO0FBQ0FRLEVBQUFBLFFBQVEsR0FBRyxnQkFBSSxDQUFDLFVBQUQsQ0FBSixFQUFrQnNHLGdCQUFsQixFQUFvQ3RHLFFBQXBDLENBQVg7QUFDQUEsRUFBQUEsUUFBUSxHQUFHLGdCQUFJLENBQUMsUUFBRCxDQUFKLEVBQWdCMkgsU0FBaEIsRUFBMkIzSCxRQUEzQixDQUFYO0FBRUEsU0FBT3VHLHdCQUF3QixDQUFDdkcsUUFBRCxFQUFXYyxNQUFYLEVBQW1COUMsU0FBbkIsQ0FBL0I7QUFDRCxDQTFCTTtBQTRCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU00SixlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQzdCcEksS0FENkIsRUFFN0JjLE1BRjZCLEVBR2hCO0FBQ2IsTUFBSWMsUUFBSjtBQUNBLE1BQUl5RyxZQUFKOztBQUNBLE1BQUl2SCxNQUFNLENBQUM1RSxNQUFYLEVBQW1CO0FBQ2pCMEYsSUFBQUEsUUFBUSxHQUFHLDJDQUFzQjVCLEtBQXRCLEVBQTZCYyxNQUFNLENBQUM1RSxNQUFwQyxDQUFYOztBQUNBLFFBQUksQ0FBQzBGLFFBQUwsRUFBZTtBQUNiNkMsc0JBQVE2RCxJQUFSLENBQ0UsNkZBREYsRUFFRXhILE1BQU0sQ0FBQzVFLE1BRlQ7O0FBSUEsYUFBTzhELEtBQVA7QUFDRDs7QUFFRCxRQUFNa0UsTUFBTSxHQUFHLG9DQUFtQnRDLFFBQW5CLEVBQTZCNUIsS0FBN0IsQ0FBZjtBQUNBNEIsSUFBQUEsUUFBUSxHQUFHc0MsTUFBTSxDQUFDakUsS0FBbEI7QUFDQW9JLElBQUFBLFlBQVksR0FBR25FLE1BQU0sQ0FBQ2pHLFNBQXRCO0FBQ0QsR0FiRCxNQWFPO0FBQUE7O0FBQ0w7QUFDQSxRQUFNc0ssY0FBYyx3QkFBR3pILE1BQU0sQ0FBQ2tGLFNBQVYsaUVBQXVCN0UsTUFBTSxDQUFDQyxJQUFQLENBQVlwQixLQUFLLENBQUMxQixRQUFsQixFQUE0QixDQUE1QixDQUEzQztBQUNBc0QsSUFBQUEsUUFBUSxHQUFHLElBQUk0RyxhQUFKLENBQVU7QUFDbkI5SCxNQUFBQSxTQUFTLEVBQUUsSUFEUTtBQUVuQnFELE1BQUFBLGNBQWMsRUFBRSxJQUZHO0FBR25CekMsTUFBQUEsTUFBTSxFQUFFaUg7QUFIVyxLQUFWLENBQVg7QUFLQUYsSUFBQUEsWUFBWSxHQUFHLEVBQWY7QUFDRDs7QUFDRCx5Q0FDS3JJLEtBREw7QUFFRWhDLElBQUFBLE1BQU0sZ0RBQU1nQyxLQUFLLENBQUNoQyxNQUFaLElBQW9CNEQsUUFBcEIsRUFGUjtBQUdFM0QsSUFBQUEsU0FBUyxnREFBTStCLEtBQUssQ0FBQy9CLFNBQVosSUFBdUJvSyxZQUF2QixFQUhYO0FBSUVsSyxJQUFBQSxVQUFVLGdEQUFNNkIsS0FBSyxDQUFDN0IsVUFBWixJQUF3QjZCLEtBQUssQ0FBQzdCLFVBQU4sQ0FBaUJzQyxNQUF6QyxFQUpaO0FBS0V4QixJQUFBQSxTQUFTLEVBQUUsbUNBQXVCZSxLQUFLLENBQUNmLFNBQTdCLEVBQXdDMkMsUUFBeEM7QUFMYjtBQU9ELENBcENNO0FBc0NQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTTZHLGtCQUFrQixHQUFHLFNBQXJCQSxrQkFBcUIsQ0FDaEN6SSxLQURnQyxTQUduQjtBQUFBLE1BRFpFLEdBQ1ksU0FEWkEsR0FDWTtBQUFBLE1BQ05sQyxNQURNLEdBQ21DZ0MsS0FEbkMsQ0FDTmhDLE1BRE07QUFBQSxNQUNFQyxTQURGLEdBQ21DK0IsS0FEbkMsQ0FDRS9CLFNBREY7QUFBQSxNQUNhWSxPQURiLEdBQ21DbUIsS0FEbkMsQ0FDYW5CLE9BRGI7QUFBQSxNQUNzQkQsU0FEdEIsR0FDbUNvQixLQURuQyxDQUNzQnBCLFNBRHRCO0FBRWIsTUFBTThKLGFBQWEsR0FBRzFJLEtBQUssQ0FBQ2hDLE1BQU4sQ0FBYWtDLEdBQWIsQ0FBdEI7QUFDQSxNQUFNeUksT0FBTyxHQUFHLHFDQUF5QjNJLEtBQUssQ0FBQ2YsU0FBL0IsRUFBMEN5SixhQUExQyxDQUFoQjs7QUFFQSxNQUFNbEksUUFBUSxtQ0FDVFIsS0FEUztBQUVaaEMsSUFBQUEsTUFBTSxnREFBTUEsTUFBTSxDQUFDcUUsS0FBUCxDQUFhLENBQWIsRUFBZ0JuQyxHQUFoQixDQUFOLHVDQUErQmxDLE1BQU0sQ0FBQ3FFLEtBQVAsQ0FBYW5DLEdBQUcsR0FBRyxDQUFuQixFQUFzQmxDLE1BQU0sQ0FBQ3lDLE1BQTdCLENBQS9CLEVBRk07QUFHWnhDLElBQUFBLFNBQVMsZ0RBQU1BLFNBQVMsQ0FBQ29FLEtBQVYsQ0FBZ0IsQ0FBaEIsRUFBbUJuQyxHQUFuQixDQUFOLHVDQUFrQ2pDLFNBQVMsQ0FBQ29FLEtBQVYsQ0FBZ0JuQyxHQUFHLEdBQUcsQ0FBdEIsRUFBeUJqQyxTQUFTLENBQUN3QyxNQUFuQyxDQUFsQyxFQUhHO0FBSVp0QyxJQUFBQSxVQUFVLEVBQUU2QixLQUFLLENBQUM3QixVQUFOLENBQWlCdUUsTUFBakIsQ0FBd0IsVUFBQXJDLENBQUM7QUFBQSxhQUFJQSxDQUFDLEtBQUtILEdBQVY7QUFBQSxLQUF6QixFQUF3Q0MsR0FBeEMsQ0FBNEMsVUFBQXlJLEdBQUc7QUFBQSxhQUFLQSxHQUFHLEdBQUcxSSxHQUFOLEdBQVkwSSxHQUFHLEdBQUcsQ0FBbEIsR0FBc0JBLEdBQTNCO0FBQUEsS0FBL0MsQ0FKQTtBQUtaL0osSUFBQUEsT0FBTyxFQUFFNkosYUFBYSxDQUFDN0QsY0FBZCxDQUE2QmhHLE9BQTdCLElBQXdDTCxTQUF4QyxHQUFvREssT0FMakQ7QUFNWkQsSUFBQUEsU0FBUyxFQUFFOEosYUFBYSxDQUFDN0QsY0FBZCxDQUE2QmpHLFNBQTdCLElBQTBDSixTQUExQyxHQUFzREksU0FOckQ7QUFPWkssSUFBQUEsU0FBUyxFQUFFMEosT0FQQyxDQVFaOztBQVJZLElBQWQ7O0FBV0EsU0FBTy9ILHFCQUFxQixDQUFDSixRQUFELENBQTVCO0FBQ0QsQ0FwQk07QUFzQlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNcUkscUJBQXFCLEdBQUcsU0FBeEJBLHFCQUF3QixDQUNuQzdJLEtBRG1DLFNBR3RCO0FBQUEsTUFEWkUsR0FDWSxTQURaQSxHQUNZO0FBQUEsTUFDTmxDLE1BRE0sR0FDSWdDLEtBREosQ0FDTmhDLE1BRE07QUFFYixNQUFNOEssUUFBUSxHQUFHOUksS0FBSyxDQUFDaEMsTUFBTixDQUFha0MsR0FBYixDQUFqQjtBQUNBLE1BQU02SSxxQkFBcUIsR0FBRy9JLEtBQUssQ0FBQzdCLFVBQU4sQ0FBaUI2QyxTQUFqQixDQUEyQixVQUFBWCxDQUFDO0FBQUEsV0FBSUEsQ0FBQyxLQUFLSCxHQUFWO0FBQUEsR0FBNUIsQ0FBOUI7O0FBRUEsTUFBSSxDQUFDNEksUUFBTCxFQUFlO0FBQ2JyRSxvQkFBUTZELElBQVIsaUJBQXNCcEksR0FBdEI7O0FBQ0EsV0FBT0YsS0FBUDtBQUNEOztBQUNELE1BQUlnSixRQUFRLHFCQUFjRixRQUFRLENBQUM1TSxNQUFULENBQWdCRixLQUE5QixDQUFaO0FBQ0EsTUFBSWlOLE9BQU8sR0FBRyxDQUFkLENBVmEsQ0FXYjs7QUFDQSxTQUFPakwsTUFBTSxDQUFDMkQsSUFBUCxDQUFZLFVBQUFWLENBQUM7QUFBQSxXQUFJQSxDQUFDLENBQUMvRSxNQUFGLENBQVNGLEtBQVQsS0FBbUJnTixRQUF2QjtBQUFBLEdBQWIsQ0FBUCxFQUFzRDtBQUNwREEsSUFBQUEsUUFBUSxxQkFBY0YsUUFBUSxDQUFDNU0sTUFBVCxDQUFnQkYsS0FBOUIsY0FBdUMsRUFBRWlOLE9BQXpDLENBQVI7QUFDRCxHQWRZLENBZ0JiOzs7QUFDQSxNQUFNdkYsV0FBVyxHQUFHLG9DQUFlb0YsUUFBZixDQUFwQixDQWpCYSxDQW1CYjs7QUFDQSxNQUFJLEVBQUNwRixXQUFELGFBQUNBLFdBQUQsZUFBQ0EsV0FBVyxDQUFFeEgsTUFBZCxDQUFKLEVBQTBCO0FBQ3hCLFdBQU84RCxLQUFQO0FBQ0Q7O0FBQ0QwRCxFQUFBQSxXQUFXLENBQUN4SCxNQUFaLENBQW1CRixLQUFuQixHQUEyQmdOLFFBQTNCO0FBQ0F0RixFQUFBQSxXQUFXLENBQUMzSCxFQUFaLEdBQWlCLDJCQUFlbU4sdUJBQWYsQ0FBakIsQ0F4QmEsQ0EwQmI7O0FBQ0EsTUFBSUMsU0FBUyxHQUFHZixlQUFlLENBQUNwSSxLQUFELEVBQVE7QUFBQzlELElBQUFBLE1BQU0sRUFBRXdIO0FBQVQsR0FBUixDQUEvQixDQTNCYSxDQTZCYjs7QUFDQSxNQUFNMEYsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ2hMLFVBQVYsQ0FBcUJzQyxNQUFyQixHQUE4QixDQUF2RDtBQUNBLE1BQU00SSxhQUFhLEdBQUcsd0JBQ3BCRixTQUFTLENBQUNoTCxVQUFWLENBQXFCa0UsS0FBckIsQ0FBMkIsQ0FBM0IsRUFBOEIrRyxnQkFBOUIsQ0FEb0IsRUFFcEJMLHFCQUZvQixFQUdwQkssZ0JBSG9CLENBQXRCO0FBTUFELEVBQUFBLFNBQVMsbUNBQ0pBLFNBREk7QUFFUGhMLElBQUFBLFVBQVUsRUFBRWtMO0FBRkwsSUFBVDtBQUtBLFNBQU96SSxxQkFBcUIsQ0FBQ3VJLFNBQUQsQ0FBNUI7QUFDRCxDQTlDTTtBQWdEUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1HLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsQ0FDakN0SixLQURpQztBQUFBLE1BRWhDdUosS0FGZ0MsU0FFaENBLEtBRmdDO0FBQUEseUNBSTlCdkosS0FKOEI7QUFLakM3QixJQUFBQSxVQUFVLEVBQUVvTDtBQUxxQjtBQUFBLENBQTVCO0FBUVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQ2xDeEosS0FEa0MsRUFFbENjLE1BRmtDLEVBR3JCO0FBQ2I7QUFEYSxNQUVFMkksVUFGRixHQUVnQjNJLE1BRmhCLENBRU5RLE1BRk07QUFBQSxNQUdOaEQsUUFITSxHQUdNMEIsS0FITixDQUdOMUIsUUFITSxFQUtiOztBQUNBLE1BQUksQ0FBQ0EsUUFBUSxDQUFDbUwsVUFBRCxDQUFiLEVBQTJCO0FBQ3pCLFdBQU96SixLQUFQO0FBQ0Q7QUFFRDs7O0FBVmEsTUFZWGhDLE1BWlcsR0FjVGdDLEtBZFMsQ0FZWGhDLE1BWlc7QUFBQSx3QkFjVGdDLEtBZFMsQ0FhWDFCLFFBYlc7QUFBQSxNQWFjbUYsT0FiZCxtQkFhQ2dHLFVBYkQ7QUFBQSxNQWEwQkMsV0FiMUIsK0RBYUNELFVBYkQ7QUFlYjs7QUFFQSxNQUFNRSxPQUFPLEdBQUczTCxNQUFNLENBQUM0TCxNQUFQLENBQWMsVUFBQ0MsYUFBRCxFQUFnQjVKLEtBQWhCLEVBQXVCNkosS0FBdkIsRUFBaUM7QUFDN0QsUUFBSTdKLEtBQUssQ0FBQy9ELE1BQU4sQ0FBYW9GLE1BQWIsS0FBd0JtSSxVQUE1QixFQUF3QztBQUN0QztBQUNBSSxNQUFBQSxhQUFhLENBQUNFLElBQWQsQ0FBbUJELEtBQW5CO0FBQ0Q7O0FBQ0QsV0FBT0QsYUFBUDtBQUNELEdBTmUsRUFNYixFQU5hLENBQWhCLENBakJhLENBeUJiOztBQXpCYSx3QkEwQk1GLE9BQU8sQ0FBQ0MsTUFBUixDQUNqQixrQkFBeUMxSixHQUF6QyxFQUFpRDtBQUFBLFFBQXJDOEosWUFBcUMsVUFBL0N4SixRQUErQztBQUFBLFFBQXZCeUosWUFBdUIsVUFBdkJBLFlBQXVCO0FBQy9DLFFBQU1DLFlBQVksR0FBR2hLLEdBQUcsR0FBRytKLFlBQTNCO0FBQ0FELElBQUFBLFlBQVksR0FBR3ZCLGtCQUFrQixDQUFDdUIsWUFBRCxFQUFlO0FBQUM5SixNQUFBQSxHQUFHLEVBQUVnSztBQUFOLEtBQWYsQ0FBakM7QUFDQUQsSUFBQUEsWUFBWTtBQUNaLFdBQU87QUFBQ3pKLE1BQUFBLFFBQVEsRUFBRXdKLFlBQVg7QUFBeUJDLE1BQUFBLFlBQVksRUFBWkE7QUFBekIsS0FBUDtBQUNELEdBTmdCLEVBT2pCO0FBQUN6SixJQUFBQSxRQUFRLGtDQUFNUixLQUFOO0FBQWExQixNQUFBQSxRQUFRLEVBQUVvTDtBQUF2QixNQUFUO0FBQThDTyxJQUFBQSxZQUFZLEVBQUU7QUFBNUQsR0FQaUIsQ0ExQk47QUFBQSxNQTBCTnpKLFFBMUJNLG1CQTBCTkEsUUExQk0sRUFvQ2I7OztBQUNBLE1BQU1wQyxPQUFPLEdBQUc0QixLQUFLLENBQUM1QixPQUFOLENBQWNzRSxNQUFkLENBQXFCLFVBQUFBLE1BQU07QUFBQSxXQUFJLENBQUNBLE1BQU0sQ0FBQ3BCLE1BQVAsQ0FBY3VCLFFBQWQsQ0FBdUI0RyxVQUF2QixDQUFMO0FBQUEsR0FBM0IsQ0FBaEIsQ0FyQ2EsQ0F1Q2I7O0FBdkNhLE1Bd0NSaEwsaUJBeENRLEdBd0NhdUIsS0F4Q2IsQ0F3Q1J2QixpQkF4Q1E7QUFBQSwyQkF5Q0tBLGlCQXpDTDtBQUFBLE1BeUNOM0MsT0F6Q00sc0JBeUNOQSxPQXpDTTs7QUEwQ2IsTUFBSUEsT0FBSixFQUFhO0FBQUEsUUFDSkksTUFESSxHQUNNSixPQUROLENBQ0pJLE1BREk7QUFFWDs7QUFGVywrQkFHcUNBLE1BQU0sQ0FBQ0MsWUFINUM7QUFBQSxRQUdVZ08sTUFIVix3QkFHSFYsVUFIRztBQUFBLFFBR3FCdE4sWUFIckIsb0VBR0hzTixVQUhHO0FBSVg7O0FBQ0FoTCxJQUFBQSxpQkFBaUIsbUNBQ1pBLGlCQURZO0FBRWYzQyxNQUFBQSxPQUFPLGtDQUFNQSxPQUFOO0FBQWVJLFFBQUFBLE1BQU0sa0NBQU1BLE1BQU47QUFBY0MsVUFBQUEsWUFBWSxFQUFaQTtBQUFkO0FBQXJCO0FBRlEsTUFBakI7QUFJRDs7QUFFRCx5Q0FBV3FFLFFBQVg7QUFBcUJwQyxJQUFBQSxPQUFPLEVBQVBBLE9BQXJCO0FBQThCSyxJQUFBQSxpQkFBaUIsRUFBakJBO0FBQTlCO0FBQ0QsQ0F6RE07QUEyRFA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNMkwsMEJBQTBCLEdBQUcsU0FBN0JBLDBCQUE2QixDQUN4Q3BLLEtBRHdDLEVBRXhDYyxNQUZ3QztBQUFBLHlDQUlyQ2QsS0FKcUM7QUFLeENyQixJQUFBQSxhQUFhLEVBQUVtQyxNQUFNLENBQUN4RDtBQUxrQjtBQUFBLENBQW5DO0FBUVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNK00sdUJBQXVCLEdBQUcsU0FBMUJBLHVCQUEwQixDQUNyQ3JLLEtBRHFDLEVBRXJDYyxNQUZxQyxFQUd4QjtBQUNiLHlDQUNLZCxLQURMO0FBRUV6QixJQUFBQSxjQUFjLEVBQUV1QyxNQUFNLENBQUNRO0FBRnpCO0FBSUQsQ0FSTTtBQVVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTWdKLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBMEIsQ0FDckN0SyxLQURxQyxFQUVyQ2MsTUFGcUMsRUFHeEI7QUFBQSxNQUNOUSxNQURNLEdBQ2NSLE1BRGQsQ0FDTlEsTUFETTtBQUFBLE1BQ0VpSixRQURGLEdBQ2N6SixNQURkLENBQ0V5SixRQURGO0FBQUEsTUFFTmpNLFFBRk0sR0FFTTBCLEtBRk4sQ0FFTjFCLFFBRk07O0FBSWIsTUFBSSx1QkFBV2lNLFFBQVgsQ0FBSixFQUEwQjtBQUN4QixRQUFNQyxRQUFRLEdBQUdsTSxRQUFRLENBQUNnRCxNQUFELENBQXpCO0FBQ0FrSixJQUFBQSxRQUFRLENBQUNDLGdCQUFULENBQTBCRixRQUExQjtBQUVBLDJDQUNLdkssS0FETDtBQUVFMUIsTUFBQUEsUUFBUSxrQ0FDSDBCLEtBQUssQ0FBQzFCLFFBREgsNENBRUxnRCxNQUZLLEVBRUksK0JBQW1Ca0osUUFBbkIsRUFBNkIsRUFBN0IsQ0FGSjtBQUZWO0FBT0Q7O0FBQ0QsU0FBT3hLLEtBQVA7QUFDRCxDQXBCTTtBQXNCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU0wSyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQUMxSyxLQUFEO0FBQUEsdURBQ2hDcEMsaUJBRGdDLEdBRWhDb0MsS0FBSyxDQUFDMkssWUFGMEI7QUFHbkNBLElBQUFBLFlBQVksRUFBRTNLLEtBQUssQ0FBQzJLO0FBSGU7QUFBQSxDQUE5QjtBQU1QO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTUMsdUJBQXVCLEdBQUcsU0FBMUJBLHVCQUEwQixDQUNyQzVLLEtBRHFDLFVBUXhCO0FBQUEsOEJBTFg2SyxPQUtXO0FBQUEsNkNBTEQzTyxNQUtDO0FBQUEsTUFMREEsTUFLQyxzQ0FMUTtBQUFDNE8sSUFBQUEsT0FBTyxFQUFFO0FBQVYsR0FLUjtBQUFBLDZDQUx1QkMsT0FLdkI7QUFBQSxNQUx1QkEsT0FLdkIsc0NBTGlDLEVBS2pDOztBQUNiLE1BQUksQ0FBQzdPLE1BQU0sQ0FBQzhPLFFBQVosRUFBc0I7QUFDcEIsV0FBT2hMLEtBQVA7QUFDRDs7QUFIWSxNQUtOaUwsa0JBTE0sR0FLZ0JGLE9BTGhCLENBS05FLGtCQUxNLEVBT2I7O0FBQ0EsTUFBSUMsV0FBVyxHQUFHLENBQUNELGtCQUFELEdBQXNCUCxxQkFBcUIsQ0FBQzFLLEtBQUQsQ0FBM0MsR0FBcURBLEtBQXZFOztBQVJhLDZDQVNRQSxLQUFLLENBQUNMLE9BVGQ7QUFBQTs7QUFBQTtBQVNiLHdEQUFvQztBQUFBLFVBQXpCd0wsTUFBeUI7O0FBQ2xDLFVBQUksbUNBQWNBLE1BQWQsS0FBeUJqUCxNQUFNLENBQUM4TyxRQUFQLENBQWdCRyxNQUFNLENBQUNoSSxJQUF2QixDQUE3QixFQUEyRDtBQUN6RCtILFFBQUFBLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxLQUFQLENBQWFGLFdBQWIsRUFBMEJoUCxNQUFNLENBQUM4TyxRQUFQLENBQWdCRyxNQUFNLENBQUNoSSxJQUF2QixDQUExQixFQUF3RCxJQUF4RCxDQUFkO0FBQ0Q7QUFDRjtBQWJZO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBZWIsU0FBTytILFdBQVA7QUFDRCxDQXhCTTtBQTBCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1HLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FDL0JyTCxLQUQrQixFQUUvQmMsTUFGK0I7QUFBQSx5Q0FJNUJkLEtBSjRCO0FBSy9CcEIsSUFBQUEsU0FBUyxvQkFFSmtDLE1BQU0sQ0FBQ3dLLElBRkg7QUFMc0I7QUFBQSxDQUExQjtBQVdQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sU0FBU0MsOEJBQVQsQ0FDTHZMLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQUEsTUFDSDVFLE1BREcsR0FDTzRFLE1BRFAsQ0FDSDVFLE1BREc7O0FBR1YsTUFBTXVDLGlCQUFpQixtQ0FDbEJ1QixLQUFLLENBQUN2QixpQkFEWSx3Q0FFaEJ2QyxNQUFNLENBQUNILEVBRlMsRUFFSkcsTUFGSSxFQUF2QixDQUhVLENBUVY7QUFDQTs7O0FBQ0EsTUFBTXNQLFVBQVUsR0FBRyxDQUFDLE9BQUQsRUFBVSxTQUFWLENBQW5COztBQUVBLE1BQ0VBLFVBQVUsQ0FBQzNJLFFBQVgsQ0FBb0IzRyxNQUFNLENBQUNILEVBQTNCLEtBQ0FHLE1BQU0sQ0FBQ0QsT0FEUCxJQUVBLENBQUMrRCxLQUFLLENBQUN2QixpQkFBTixDQUF3QnZDLE1BQU0sQ0FBQ0gsRUFBL0IsRUFBbUNFLE9BSHRDLEVBSUU7QUFDQTtBQUNBdVAsSUFBQUEsVUFBVSxDQUFDQyxPQUFYLENBQW1CLFVBQUFDLENBQUMsRUFBSTtBQUN0QixVQUFJQSxDQUFDLEtBQUt4UCxNQUFNLENBQUNILEVBQWpCLEVBQXFCO0FBQ25CMEMsUUFBQUEsaUJBQWlCLENBQUNpTixDQUFELENBQWpCLG1DQUEyQmpOLGlCQUFpQixDQUFDaU4sQ0FBRCxDQUE1QztBQUFpRHpQLFVBQUFBLE9BQU8sRUFBRTtBQUExRDtBQUNEO0FBQ0YsS0FKRDtBQUtEOztBQUVELE1BQU11RSxRQUFRLG1DQUNUUixLQURTO0FBRVp2QixJQUFBQSxpQkFBaUIsRUFBakJBO0FBRlksSUFBZDs7QUFLQSxNQUFJdkMsTUFBTSxDQUFDSCxFQUFQLEtBQWMsVUFBZCxJQUE0QixDQUFDRyxNQUFNLENBQUNELE9BQXhDLEVBQWlEO0FBQy9DLFdBQU91TixvQkFBb0IsQ0FBQ2hKLFFBQUQsRUFBVztBQUFDYyxNQUFBQSxNQUFNLEVBQUU7QUFBVCxLQUFYLENBQTNCO0FBQ0Q7O0FBRUQsU0FBT2QsUUFBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTW1MLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FDL0IzTCxLQUQrQixFQUUvQmMsTUFGK0I7QUFBQSx5Q0FJNUJkLEtBSjRCO0FBSy9CbEIsSUFBQUEsUUFBUSxFQUFFa0IsS0FBSyxDQUFDdkIsaUJBQU4sQ0FBd0I3QixVQUF4QixDQUFtQ1gsT0FBbkMsbUNBRUQrRCxLQUFLLENBQUNsQixRQUZMO0FBR0o4TSxNQUFBQSxNQUFNLEVBQUU1TCxLQUFLLENBQUNsQixRQUFOLENBQWU4TSxNQUFmLEdBQXdCLElBQXhCLEdBQStCLHdCQUFVNUwsS0FBSyxDQUFDbEIsUUFBaEI7QUFIbkMsU0FLTmtCLEtBQUssQ0FBQ2xCLFFBVnFCO0FBVy9CRCxJQUFBQSxPQUFPLEVBQUVpQyxNQUFNLENBQUN3SyxJQUFQLElBQWV4SyxNQUFNLENBQUN3SyxJQUFQLENBQVlPLE1BQTNCLEdBQW9DL0ssTUFBTSxDQUFDd0ssSUFBM0MsR0FBa0Q7QUFYNUI7QUFBQSxDQUExQjtBQWNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTVEsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUM3QjlMLEtBRDZCLEVBRTdCYyxNQUY2QixFQUdoQjtBQUNiLHlDQUNLZCxLQURMO0FBRUVuQixJQUFBQSxPQUFPLEVBQUU7QUFGWDtBQUlELENBUk07QUFVUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1rTixnQkFBZ0IsR0FBRyxTQUFuQkEsZ0JBQW1CLENBQzlCL0wsS0FEOEIsVUFHakI7QUFBQSxNQURaZ00sR0FDWSxVQURaQSxHQUNZOztBQUNiLE1BQUk3SyxNQUFNLENBQUM4SyxNQUFQLENBQWNqTSxLQUFLLENBQUN2QixpQkFBcEIsRUFBdUN5TixJQUF2QyxDQUE0QyxVQUFBaFEsTUFBTTtBQUFBLFdBQUlBLE1BQU0sQ0FBQ0QsT0FBWDtBQUFBLEdBQWxELENBQUosRUFBMkU7QUFDekUsMkNBQ0srRCxLQURMO0FBRUVsQixNQUFBQSxRQUFRLGdEQUNIa0IsS0FBSyxDQUFDbEIsUUFESCxHQUVGc0YsS0FBSyxDQUFDQyxPQUFOLENBQWMySCxHQUFHLENBQUNHLEtBQWxCLElBQTJCO0FBQUNDLFFBQUFBLGFBQWEsc0NBQU1KLEdBQUcsQ0FBQ0csS0FBVjtBQUFkLE9BQTNCLEdBQTZELEVBRjNELEdBR0YvSCxLQUFLLENBQUNDLE9BQU4sQ0FBYzJILEdBQUcsQ0FBQ0ssTUFBbEIsSUFBNEI7QUFBQ3pQLFFBQUFBLFVBQVUsc0NBQU1vUCxHQUFHLENBQUNLLE1BQVY7QUFBWCxPQUE1QixHQUE0RCxFQUgxRDtBQUZWO0FBUUQ7O0FBRUQsU0FBT3JNLEtBQVA7QUFDRCxDQWhCTTtBQWlCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1zTSxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQ25DdE0sS0FEbUMsRUFFbkNjLE1BRm1DO0FBQUEsU0FJbkNkLEtBQUssQ0FBQ2YsU0FBTixJQUFtQmUsS0FBSyxDQUFDZixTQUFOLENBQWdCd0IsTUFBaEIsS0FBMkIsQ0FBOUMsbUNBRVNULEtBRlQ7QUFHTTtBQUNBO0FBQ0FmLElBQUFBLFNBQVMsRUFBRSxrQ0FBc0JlLEtBQUssQ0FBQ2hDLE1BQTVCO0FBTGpCLE9BT0l1Tyx1QkFBdUIsQ0FBQ3ZNLEtBQUQsRUFBUWMsTUFBUixDQVhRO0FBQUEsQ0FBOUI7QUFhUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU0wTCx3QkFBd0IsR0FBRyxTQUEzQkEsd0JBQTJCLENBQ3RDeE0sS0FEc0MsVUFHekI7QUFBQSxNQURaeU0sUUFDWSxVQURaQSxRQUNZO0FBQUEsTUFERnBHLE9BQ0UsVUFERkEsT0FDRTtBQUFBLE1BQ05wSCxTQURNLEdBQ09lLEtBRFAsQ0FDTmYsU0FETTtBQUdiLHlDQUNLZSxLQURMO0FBRUVmLElBQUFBLFNBQVMsRUFBRUEsU0FBUyxDQUFDa0IsR0FBVixDQUFjLFVBQUN1TSxFQUFELEVBQUtyTSxDQUFMO0FBQUEsYUFDdkJBLENBQUMsS0FBS29NLFFBQU4sbUNBRVN4TixTQUFTLENBQUNvQixDQUFELENBRmxCO0FBR01yQyxRQUFBQSxNQUFNLGtDQUNEaUIsU0FBUyxDQUFDb0IsQ0FBRCxDQUFULENBQWFyQyxNQURaLDRDQUdIcUksT0FIRyxFQUdPLENBQUNwSCxTQUFTLENBQUNvQixDQUFELENBQVQsQ0FBYXJDLE1BQWIsQ0FBb0JxSSxPQUFwQixDQUhSO0FBSFosV0FTSXFHLEVBVm1CO0FBQUEsS0FBZDtBQUZiO0FBZUQsQ0FyQk07QUF1QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1DLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBdUIsQ0FDbEMzTSxLQURrQyxFQUVsQ2MsTUFGa0MsRUFHckI7QUFDYjtBQURhLE1BRU41RSxNQUZNLEdBRWE0RSxNQUZiLENBRU41RSxNQUZNO0FBQUEsTUFFRTZPLE9BRkYsR0FFYWpLLE1BRmIsQ0FFRWlLLE9BRkY7QUFHYixNQUFNek0sUUFBUSxHQUFHLG9CQUFRd0MsTUFBTSxDQUFDeEMsUUFBZixDQUFqQjtBQUVBLE1BQU1zTyxjQUFjLEdBQUd0TyxRQUFRLENBQUNzTCxNQUFULENBQ3JCLFVBQUNpRCxJQUFEO0FBQUEscUZBQThCLEVBQTlCO0FBQUEsNkJBQVF2QixJQUFSO0FBQUEsUUFBUUEsSUFBUiw0QkFBZSxFQUFmO0FBQUEsUUFBc0J3QixJQUF0Qjs7QUFBQSwyQ0FDS0QsSUFETCxHQUVNO0FBQW9CdkIsTUFBQUEsSUFBSSxFQUFKQTtBQUFwQixPQUE2QndCLElBQTdCLEdBQW9DOU0sS0FBSyxDQUFDMUIsUUFBMUMsS0FBdUQsRUFGN0Q7QUFBQSxHQURxQixFQUtyQixFQUxxQixDQUF2QjtBQVFBLE1BQU15TyxTQUFTLEdBQUc1TCxNQUFNLENBQUNDLElBQVAsQ0FBWXdMLGNBQVosRUFBNEJuTSxNQUE1QixHQUFxQyxDQUF2RCxDQWJhLENBZWI7O0FBQ0EsTUFBTXVNLGFBQWEsR0FBRzlRLE1BQU0sR0FDeEIwTyx1QkFBdUIsQ0FBQzVLLEtBQUQsRUFBUTtBQUM3QjZLLElBQUFBLE9BQU8sRUFBRTtBQUFDM08sTUFBQUEsTUFBTSxFQUFOQSxNQUFEO0FBQVM2TyxNQUFBQSxPQUFPLEVBQVBBO0FBQVQ7QUFEb0IsR0FBUixDQURDLEdBSXhCL0ssS0FKSjs7QUFNQSxNQUFJa0wsV0FBVyxtQ0FDVjhCLGFBRFU7QUFFYjFPLElBQUFBLFFBQVEsa0NBQ0gwTyxhQUFhLENBQUMxTyxRQURYLEdBRUhzTyxjQUZHO0FBRkssSUFBZixDQXRCYSxDQThCYjs7O0FBOUJhLDhDQStCUTFCLFdBQVcsQ0FBQ3ZMLE9BL0JwQjtBQUFBOztBQUFBO0FBK0JiLDJEQUEwQztBQUFBLFVBQS9Cd0wsTUFBK0I7O0FBQ3hDLFVBQUksbUNBQWNBLE1BQWQsS0FBeUJBLE1BQU0sQ0FBQzhCLFdBQWhDLElBQStDL0IsV0FBVyxDQUFDQyxNQUFNLENBQUM4QixXQUFSLENBQTlELEVBQW9GO0FBQ2xGLFlBQU1DLE9BQU8sR0FBR2hDLFdBQVcsQ0FBQ0MsTUFBTSxDQUFDOEIsV0FBUixDQUEzQjtBQUNBL0IsUUFBQUEsV0FBVyxDQUFDQyxNQUFNLENBQUM4QixXQUFSLENBQVgsR0FBa0NyUCxpQkFBaUIsQ0FBQ3VOLE1BQU0sQ0FBQzhCLFdBQVIsQ0FBbkQ7QUFDQS9CLFFBQUFBLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxLQUFQLENBQWFGLFdBQWIsRUFBMEJnQyxPQUExQixDQUFkO0FBQ0Q7QUFDRjtBQXJDWTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQXVDYixNQUFJQyxTQUFTLEdBQUcsQ0FBQ0osU0FBRCxHQUNaN0IsV0FBVyxDQUFDbE4sTUFBWixDQUFtQjBFLE1BQW5CLENBQTBCLFVBQUF6QixDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDL0UsTUFBRixDQUFTb0YsTUFBVCxJQUFtQkwsQ0FBQyxDQUFDL0UsTUFBRixDQUFTb0YsTUFBVCxJQUFtQnNMLGNBQTFDO0FBQUEsR0FBM0IsQ0FEWSxHQUVaLEVBRko7O0FBSUEsTUFBSSxDQUFDTyxTQUFTLENBQUMxTSxNQUFYLElBQXFCLENBQUNzSyxPQUFPLElBQUksRUFBWixFQUFnQnFDLGdCQUFoQixLQUFxQyxLQUE5RCxFQUFxRTtBQUNuRTtBQUNBLFFBQU1sSixNQUFNLEdBQUdtSixnQkFBZ0IsQ0FBQ25DLFdBQUQsRUFBYzBCLGNBQWQsQ0FBL0I7QUFDQTFCLElBQUFBLFdBQVcsR0FBR2hILE1BQU0sQ0FBQ2xFLEtBQXJCO0FBQ0FtTixJQUFBQSxTQUFTLEdBQUdqSixNQUFNLENBQUNpSixTQUFuQjtBQUNEOztBQUVELE1BQUlqQyxXQUFXLENBQUNqTSxTQUFaLENBQXNCd0IsTUFBMUIsRUFBa0M7QUFDaEM7QUFDQTBNLElBQUFBLFNBQVMsR0FBR2pDLFdBQVcsQ0FBQ2xOLE1BQVosQ0FBbUIwRSxNQUFuQixDQUNWLFVBQUF6QixDQUFDO0FBQUEsYUFBSUEsQ0FBQyxDQUFDL0UsTUFBRixDQUFTb0YsTUFBVCxJQUFtQkwsQ0FBQyxDQUFDL0UsTUFBRixDQUFTb0YsTUFBVCxJQUFtQnNMLGNBQTFDO0FBQUEsS0FEUyxDQUFaO0FBR0ExQixJQUFBQSxXQUFXLG1DQUNOQSxXQURNO0FBRVRqTSxNQUFBQSxTQUFTLEVBQUUsbUNBQXVCaU0sV0FBVyxDQUFDak0sU0FBbkMsRUFBOENrTyxTQUE5QztBQUZGLE1BQVg7QUFJRCxHQTNEWSxDQTZEYjs7O0FBQ0FoTSxFQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWXdMLGNBQVosRUFBNEJuQixPQUE1QixDQUFvQyxVQUFBbkssTUFBTSxFQUFJO0FBQzVDLFFBQU1nTSxhQUFhLEdBQUdwQyxXQUFXLENBQUN6TSxpQkFBWixDQUE4QjNDLE9BQTlCLENBQXNDSSxNQUF0QyxDQUE2Q0MsWUFBN0MsQ0FBMERtRixNQUExRCxDQUF0Qjs7QUFDQSxRQUFJLENBQUM4QyxLQUFLLENBQUNDLE9BQU4sQ0FBY2lKLGFBQWQsQ0FBRCxJQUFpQyxDQUFDQSxhQUFhLENBQUM3TSxNQUFwRCxFQUE0RDtBQUMxRHlLLE1BQUFBLFdBQVcsR0FBR3FDLGtCQUFrQixDQUFDckMsV0FBRCxFQUFjMEIsY0FBYyxDQUFDdEwsTUFBRCxDQUE1QixDQUFoQztBQUNEO0FBQ0YsR0FMRDtBQU9BLE1BQUlrTSxZQUFZLEdBQUd6Ryx3QkFBd0IsQ0FDekNtRSxXQUR5QyxFQUV6QzZCLFNBQVMsR0FBRzVMLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZOEosV0FBVyxDQUFDNU0sUUFBeEIsQ0FBSCxHQUF1QzZDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZd0wsY0FBWixDQUZQLEVBR3pDcE8sU0FIeUMsQ0FBM0MsQ0FyRWEsQ0EyRWI7QUFDQTs7QUFDQWdQLEVBQUFBLFlBQVksR0FBRzVNLHFCQUFxQixDQUFDNE0sWUFBRCxDQUFwQztBQUVBLFNBQU9BLFlBQVA7QUFDRCxDQW5GTTtBQW9GUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLFNBQVNDLG9CQUFULENBQ0x6TixLQURLLEVBRUxjLE1BRkssRUFHSztBQUFBLE1BQ0hRLE1BREcsR0FDY1IsTUFEZCxDQUNIUSxNQURHO0FBQUEsTUFDS3RGLEtBREwsR0FDYzhFLE1BRGQsQ0FDSzlFLEtBREw7QUFBQSxNQUVIc0MsUUFGRyxHQUVTMEIsS0FGVCxDQUVIMUIsUUFGRztBQUdWLE1BQU1rTSxRQUFRLEdBQUdsTSxRQUFRLENBQUNnRCxNQUFELENBQXpCOztBQUVBLE1BQUlrSixRQUFKLEVBQWM7QUFDWixRQUFNckUsVUFBVSxHQUFHLCtCQUFtQnFFLFFBQW5CLEVBQTZCO0FBQUN4TyxNQUFBQSxLQUFLLEVBQUxBO0FBQUQsS0FBN0IsQ0FBbkI7QUFDQSwyQ0FDS2dFLEtBREw7QUFFRTFCLE1BQUFBLFFBQVEsa0NBQ0hBLFFBREcsNENBRUxnRCxNQUZLLEVBRUk2RSxVQUZKO0FBRlY7QUFPRCxHQWRTLENBZ0JWOzs7QUFDQSxTQUFPbkcsS0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTdU0sdUJBQVQsQ0FDTHZNLEtBREssRUFFTGMsTUFGSyxFQUdGO0FBQUE7O0FBQ0g7QUFDQSxNQUFNNE0sZUFBZSxHQUFHLElBQUk1TSxNQUFNLENBQUMrSixPQUFuQztBQUNBLE1BQU04QyxTQUFTLDRCQUFHM04sS0FBSyxDQUFDZixTQUFOLENBQWdCeU8sZUFBaEIsQ0FBSCwwREFBRyxzQkFBa0MxUCxNQUFwRDtBQUhHLE1BSUlBLE1BSkosR0FJY2dDLEtBSmQsQ0FJSWhDLE1BSkosRUFNSDs7QUFDQSxNQUFNbVAsU0FBUyxHQUFHblAsTUFBTSxDQUFDbUMsR0FBUCxDQUFXLFVBQUFGLEtBQUs7QUFBQSxXQUNoQzBOLFNBQVMsSUFBSSxDQUFDQSxTQUFTLENBQUMxTixLQUFLLENBQUNsRSxFQUFQLENBQXZCLElBQXFDa0UsS0FBSyxDQUFDL0QsTUFBTixDQUFhd0UsU0FBbEQsR0FDSVQsS0FBSyxDQUFDNEIsaUJBQU4sQ0FBd0I7QUFDdEI7QUFDQW5CLE1BQUFBLFNBQVMsRUFBRTtBQUZXLEtBQXhCLENBREosR0FLSVQsS0FONEI7QUFBQSxHQUFoQixDQUFsQixDQVBHLENBZ0JIOztBQUNBLHlDQUNLRCxLQURMO0FBRUVoQyxJQUFBQSxNQUFNLEVBQUVtUCxTQUZWO0FBR0VsTyxJQUFBQSxTQUFTLEVBQUU7QUFIYjtBQUtEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTTJPLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsQ0FDOUI1TixLQUQ4QixFQUU5QmMsTUFGOEIsRUFHakI7QUFBQSxNQUNOK00sS0FETSxHQUNnQy9NLE1BRGhDLENBQ04rTSxLQURNO0FBQUEseUJBQ2dDL00sTUFEaEMsQ0FDQ2dOLFFBREQ7QUFBQSxNQUNDQSxRQURELGlDQUNZQyx5QkFEWjs7QUFFYixNQUFJLENBQUNGLEtBQUssQ0FBQ3BOLE1BQVgsRUFBbUI7QUFDakIsV0FBT1QsS0FBUDtBQUNEOztBQUVELE1BQU1SLG1CQUFtQixHQUFHNEUsS0FBSyxDQUFDNEosSUFBTixDQUFXSCxLQUFYLEVBQWtCakUsTUFBbEIsQ0FDMUIsVUFBQ2lELElBQUQsRUFBT2pLLENBQVAsRUFBVXZDLENBQVY7QUFBQSxXQUFnQiw2QkFBTzROLDBCQUEwQixDQUFDckwsQ0FBRCxFQUFJdkMsQ0FBSixDQUFqQyxFQUF5Q3dNLElBQXpDLENBQWhCO0FBQUEsR0FEMEIsRUFFMUIsRUFGMEIsQ0FBNUI7QUFLQSxNQUFNdE4sV0FBVyxHQUFHO0FBQ2xCMk8sSUFBQUEsU0FBUyxFQUFFLEVBRE87QUFFbEJDLElBQUFBLFdBQVcsRUFBRU4sS0FGSztBQUdsQkMsSUFBQUEsUUFBUSxFQUFSQTtBQUhrQixHQUFwQjtBQU1BLE1BQU0zRSxTQUFTLEdBQUcsNkJBQU87QUFBQzNKLElBQUFBLG1CQUFtQixFQUFuQkEsbUJBQUQ7QUFBc0JELElBQUFBLFdBQVcsRUFBWEE7QUFBdEIsR0FBUCxFQUEyQ1MsS0FBM0MsQ0FBbEI7QUFFQSxTQUFPb08sbUJBQW1CLENBQUNqRixTQUFELENBQTFCO0FBQ0QsQ0F2Qk07QUF5QlA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxTQUFTa0YsMEJBQVQsQ0FDTHJPLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQ1YsTUFBSSxDQUFDZCxLQUFLLENBQUNULFdBQVgsRUFBd0I7QUFDdEIsV0FBT1MsS0FBUDtBQUNEOztBQUhTLE1BSUhzTyxRQUpHLEdBSW9CeE4sTUFKcEIsQ0FJSHdOLFFBSkc7QUFBQSxNQUlPSixTQUpQLEdBSW9CcE4sTUFKcEIsQ0FJT29OLFNBSlA7QUFBQSwyQkFLc0JsTyxLQUFLLENBQUNULFdBTDVCO0FBQUEsTUFLSDRPLFdBTEcsc0JBS0hBLFdBTEc7QUFBQSxNQUtVTCxRQUxWLHNCQUtVQSxRQUxWO0FBTVYsTUFBTVMsaUJBQWlCLEdBQUdDLGdDQUFnQyxDQUFDeE8sS0FBRCxFQUFRO0FBQ2hFc08sSUFBQUEsUUFBUSxFQUFSQSxRQURnRTtBQUVoRUcsSUFBQUEsUUFBUSxFQUFFO0FBQUNDLE1BQUFBLE9BQU8sRUFBRSxDQUFWO0FBQWFDLE1BQUFBLE9BQU8sRUFBRTtBQUF0QjtBQUZzRCxHQUFSLENBQTFELENBTlUsQ0FXVjs7QUFDQSxNQUFNQyxjQUFjLEdBQUcsNEJBQU0sYUFBTixFQUFxQiw2QkFBTztBQUFDVixJQUFBQSxTQUFTLEVBQVRBO0FBQUQsR0FBUCxDQUFyQixFQUEwQ0ssaUJBQTFDLENBQXZCO0FBRUEsU0FBTyxxQkFDTEssY0FESyxFQUVMLHdCQUFXLEdBQVgsRUFBZ0J6TyxHQUFoQixDQUFvQmdPLFdBQVcsQ0FBQzFOLE1BQVosR0FBcUJvTyxxQkFBckIsR0FBb0M7QUFBQSxXQUFNZixRQUFRLENBQUNJLFNBQUQsQ0FBZDtBQUFBLEdBQXhELENBRkssQ0FBUDtBQUlELEMsQ0FFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRSxtQkFBVCxDQUE2QnBPLEtBQTdCLEVBQXdEO0FBQzdELE1BQUksQ0FBQ0EsS0FBSyxDQUFDVCxXQUFYLEVBQXdCO0FBQ3RCLFdBQU9TLEtBQVA7QUFDRDs7QUFINEQsTUFJdERtTyxXQUpzRCxHQUl2Q25PLEtBQUssQ0FBQ1QsV0FKaUMsQ0FJdEQ0TyxXQUpzRDs7QUFBQSwrQ0FLckJBLFdBTHFCO0FBQUEsTUFLdERXLElBTHNEO0FBQUEsTUFLN0NDLG9CQUw2QywwQkFPN0Q7OztBQUNBLE1BQU01RixTQUFTLEdBQUcsNEJBQU0sYUFBTixFQUFxQiw2QkFBTztBQUFDZ0YsSUFBQUEsV0FBVyxFQUFFWTtBQUFkLEdBQVAsQ0FBckIsRUFBa0UvTyxLQUFsRSxDQUFsQjtBQUVBLE1BQU11TyxpQkFBaUIsR0FBR0MsZ0NBQWdDLENBQUNyRixTQUFELEVBQVk7QUFDcEVtRixJQUFBQSxRQUFRLEVBQUVRLElBQUksQ0FBQ3JNLElBRHFEO0FBRXBFZ00sSUFBQUEsUUFBUSxFQUFFO0FBQUNDLE1BQUFBLE9BQU8sRUFBRSxDQUFWO0FBQWFDLE1BQUFBLE9BQU8sRUFBRTtBQUF0QjtBQUYwRCxHQUFaLENBQTFEO0FBVjZELE1BZXREbFAsT0Fmc0QsR0FlOUJPLEtBZjhCLENBZXREUCxPQWZzRDtBQUFBLE1BZTdDQyxXQWY2QyxHQWU5Qk0sS0FmOEIsQ0FlN0NOLFdBZjZDO0FBZ0I3RCxTQUFPLHFCQUNMNk8saUJBREssRUFFTFMsZ0JBQWdCLENBQ2RGLElBRGMsRUFFZDNGLFNBQVMsQ0FBQzVKLFdBQVYsSUFBeUI0SixTQUFTLENBQUM1SixXQUFWLENBQXNCMk8sU0FGakMsRUFHZHpPLE9BSGMsRUFJZEMsV0FKYyxDQUZYLENBQVA7QUFTRDs7QUFFTSxTQUFTc1AsZ0JBQVQsQ0FBMEJGLElBQTFCLEVBQWdDWixTQUFoQyxFQUFxRjtBQUFBLE1BQTFDek8sT0FBMEMsdUVBQXRCLEVBQXNCO0FBQUEsTUFBbEJDLFdBQWtCLHVFQUFKLEVBQUk7QUFDMUYsU0FBTyw0QkFBZTtBQUFDb1AsSUFBQUEsSUFBSSxFQUFKQSxJQUFEO0FBQU9aLElBQUFBLFNBQVMsRUFBVEEsU0FBUDtBQUFrQnpPLElBQUFBLE9BQU8sRUFBUEEsT0FBbEI7QUFBMkJDLElBQUFBLFdBQVcsRUFBWEE7QUFBM0IsR0FBZixFQUF3RHVQLEtBQXhELEVBQ0w7QUFDQTtBQUNBLFlBQUFDLEdBQUc7QUFBQSxXQUNELDRCQUFjO0FBQ1pBLE1BQUFBLEdBQUcsRUFBSEEsR0FEWTtBQUVaWixNQUFBQSxRQUFRLEVBQUVRLElBQUksQ0FBQ3JNLElBRkg7QUFHWnFMLE1BQUFBLFFBQVEsRUFBRSxrQkFBQTVKLE1BQU07QUFBQSxlQUNkLGlDQUFtQjtBQUNqQmlMLFVBQUFBLE9BQU8sRUFBRWpMLE1BRFE7QUFFakJnSyxVQUFBQSxTQUFTLEVBQVRBO0FBRmlCLFNBQW5CLENBRGM7QUFBQTtBQUhKLEtBQWQsQ0FEQztBQUFBLEdBSEUsRUFjTDtBQUNBLFlBQUFrQixHQUFHO0FBQUEsV0FBSSwyQkFBYU4sSUFBSSxDQUFDck0sSUFBbEIsRUFBd0IyTSxHQUF4QixDQUFKO0FBQUEsR0FmRSxDQUFQO0FBaUJEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU0MseUJBQVQsQ0FDTHJQLEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQUEsd0JBQ21CQSxNQUFNLENBQUMrSixPQUQxQjtBQUFBLE1BQ0hzRSxPQURHLG1CQUNIQSxPQURHO0FBQUEsTUFDTWpCLFNBRE4sbUJBQ01BLFNBRE47QUFHVixNQUFNSyxpQkFBaUIsR0FBR0MsZ0NBQWdDLENBQUN4TyxLQUFELEVBQVE7QUFDaEVzTyxJQUFBQSxRQUFRLEVBQUVhLE9BQU8sQ0FBQ2IsUUFEOEM7QUFFaEVHLElBQUFBLFFBQVEsRUFBRTtBQUFDQyxNQUFBQSxPQUFPLEVBQUUsQ0FBVjtBQUFhQyxNQUFBQSxPQUFPLEVBQUU7QUFBdEI7QUFGc0QsR0FBUixDQUExRDtBQUtBLFNBQU8scUJBQ0xKLGlCQURLLEVBRUwsK0JBQWtCO0FBQUNZLElBQUFBLE9BQU8sRUFBUEEsT0FBRDtBQUFVakIsSUFBQUEsU0FBUyxFQUFUQTtBQUFWLEdBQWxCLEVBQXdDZSxLQUF4QyxDQUNFLFVBQUEvSyxNQUFNO0FBQUEsV0FBSSxrQ0FBb0I7QUFBQ29LLE1BQUFBLFFBQVEsRUFBRWEsT0FBTyxDQUFDYixRQUFuQjtBQUE2QkosTUFBQUEsU0FBUyxFQUFFaEs7QUFBeEMsS0FBcEIsQ0FBSjtBQUFBLEdBRFIsRUFFRSxVQUFBa0wsR0FBRztBQUFBLFdBQUksMkJBQWFELE9BQU8sQ0FBQ2IsUUFBckIsRUFBK0JjLEdBQS9CLENBQUo7QUFBQSxHQUZMLENBRkssQ0FBUDtBQU9EOztBQUVNLFNBQVNFLGFBQVQsR0FBb0Q7QUFBQSxNQUE3QkMsWUFBNkIsdUVBQWQsRUFBYztBQUFBLE1BQVZkLFFBQVU7O0FBQ3pEO0FBQ0E7QUFDQSxNQUFJLENBQUNBLFFBQUQsSUFBYSxDQUFDQSxRQUFRLENBQUNDLE9BQTNCLEVBQW9DO0FBQ2xDLFdBQU8sRUFBUDtBQUNEOztBQUVELFNBQU87QUFDTEEsSUFBQUEsT0FBTyxFQUFFRCxRQUFRLENBQUNDO0FBRGIsR0FBUDtBQUdEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTWMsb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUF1QixDQUNsQ3hQLEtBRGtDLFVBS3JCO0FBQUEsOEJBRlg2SyxPQUVXO0FBQUEsTUFGRHFFLEdBRUMsa0JBRkRBLEdBRUM7QUFBQSxNQUZJWixRQUVKLGtCQUZJQSxRQUVKO0FBQUEsTUFGY0csUUFFZCxrQkFGY0EsUUFFZDtBQUFBLE1BRndCZ0IsV0FFeEIsa0JBRndCQSxXQUV4QjtBQUFBLE1BRnFDM0IsUUFFckMsa0JBRnFDQSxRQUVyQztBQUNiLE1BQU1TLGlCQUFpQixHQUFHQyxnQ0FBZ0MsQ0FBQ3hPLEtBQUQsRUFBUTtBQUNoRXNPLElBQUFBLFFBQVEsRUFBUkEsUUFEZ0U7QUFFaEVHLElBQUFBLFFBQVEsRUFBRWEsYUFBYSxDQUFDdFAsS0FBSyxDQUFDUixtQkFBTixDQUEwQjhPLFFBQTFCLENBQUQsRUFBc0NHLFFBQXRDO0FBRnlDLEdBQVIsQ0FBMUQ7QUFJQSxTQUFPLHFCQUNMRixpQkFESyxFQUVMLHlCQUFZVyxHQUFHLENBQUNRLElBQUosRUFBWixFQUF3QlQsS0FBeEIsQ0FDRSxrQkFBbUI7QUFBQSxRQUFqQjdMLEtBQWlCLFVBQWpCQSxLQUFpQjtBQUFBLFFBQVZ1TSxJQUFVLFVBQVZBLElBQVU7QUFDakIsV0FBT0EsSUFBSSxHQUNQN0IsUUFBUSxDQUFDMkIsV0FBRCxDQURELEdBRVAsNEJBQWM7QUFDWlAsTUFBQUEsR0FBRyxFQUFIQSxHQURZO0FBRVpaLE1BQUFBLFFBQVEsRUFBUkEsUUFGWTtBQUdaRyxNQUFBQSxRQUFRLEVBQUVyTCxLQUFLLENBQUNxTCxRQUhKO0FBSVpnQixNQUFBQSxXQUFXLEVBQUVyTSxLQUpEO0FBS1owSyxNQUFBQSxRQUFRLEVBQVJBO0FBTFksS0FBZCxDQUZKO0FBU0QsR0FYSCxFQVlFLFVBQUFzQixHQUFHO0FBQUEsV0FBSSwyQkFBYWQsUUFBYixFQUF1QmMsR0FBdkIsQ0FBSjtBQUFBLEdBWkwsQ0FGSyxDQUFQO0FBaUJELENBM0JNO0FBNkJQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTVEsbUJBQW1CLEdBQUcsU0FBdEJBLG1CQUFzQixDQUNqQzVQLEtBRGlDLFVBR3BCO0FBQUEsTUFEWjBFLEtBQ1ksVUFEWkEsS0FDWTtBQUFBLE1BREw0SixRQUNLLFVBRExBLFFBQ0s7O0FBQ2I7QUFDQTdKLGtCQUFRNkQsSUFBUixDQUFhNUQsS0FBYjs7QUFDQSxNQUFJLENBQUMxRSxLQUFLLENBQUNULFdBQVgsRUFBd0I7QUFDdEIsV0FBT1MsS0FBUDtBQUNEOztBQUxZLDRCQU04QkEsS0FBSyxDQUFDVCxXQU5wQztBQUFBLE1BTU40TyxXQU5NLHVCQU1OQSxXQU5NO0FBQUEsTUFNT0wsUUFOUCx1QkFNT0EsUUFOUDtBQUFBLE1BTWlCSSxTQU5qQix1QkFNaUJBLFNBTmpCO0FBUWIsTUFBTS9FLFNBQVMsR0FBR3FGLGdDQUFnQyxDQUFDeE8sS0FBRCxFQUFRO0FBQ3hEc08sSUFBQUEsUUFBUSxFQUFSQSxRQUR3RDtBQUV4REcsSUFBQUEsUUFBUSxFQUFFO0FBQUMvSixNQUFBQSxLQUFLLEVBQUxBO0FBQUQ7QUFGOEMsR0FBUixDQUFsRCxDQVJhLENBYWI7O0FBQ0EsU0FBTyxxQkFDTHlFLFNBREssRUFFTCx3QkFBVyxHQUFYLEVBQWdCaEosR0FBaEIsQ0FBb0JnTyxXQUFXLENBQUMxTixNQUFaLEdBQXFCb08scUJBQXJCLEdBQW9DO0FBQUEsV0FBTWYsUUFBUSxDQUFDSSxTQUFELENBQWQ7QUFBQSxHQUF4RCxDQUZLLENBQVA7QUFJRCxDQXJCTTtBQXVCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU0yQixxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQ25DN1AsS0FEbUMsVUFHdEI7QUFBQSxNQURac0IsTUFDWSxVQURaQSxNQUNZO0FBQ2I7QUFDQSxNQUFNd08sT0FBTyxHQUFHLG9CQUFReE8sTUFBUixDQUFoQjtBQUVBLFNBQU93TyxPQUFPLENBQUNsRyxNQUFSLENBQWUsVUFBQ2lELElBQUQsRUFBTzlRLEVBQVA7QUFBQSxXQUFjLDZCQUFpQjhRLElBQWpCLEVBQXVCOVEsRUFBdkIsQ0FBZDtBQUFBLEdBQWYsRUFBeURpRSxLQUF6RCxDQUFQO0FBQ0QsQ0FSTTtBQVVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTStQLGlCQUFpQixHQUFHLFNBQXBCQSxpQkFBb0IsQ0FDL0IvUCxLQUQrQixFQUUvQmMsTUFGK0I7QUFBQSx5Q0FJNUJkLEtBSjRCO0FBSy9CbkMsSUFBQUEsT0FBTyxrQ0FDRm1DLEtBQUssQ0FBQ25DLE9BREosR0FFRmlELE1BQU0sQ0FBQ3dLLElBRkw7QUFMd0I7QUFBQSxDQUExQjtBQVVQO0FBQ0E7QUFDQTs7Ozs7QUFDTyxTQUFTK0IsZ0JBQVQsQ0FDTHJOLEtBREssRUFFTDFCLFFBRkssRUFHa0M7QUFDdkMsTUFBTTBSLEtBQWMsR0FBRyxFQUF2QjtBQUNBLE1BQU1DLGFBQWEsR0FBRzlPLE1BQU0sQ0FBQzhLLE1BQVAsQ0FBYzNOLFFBQWQsRUFBd0JzTCxNQUF4QixDQUErQixVQUFDaUQsSUFBRCxFQUFnQnBKLE9BQWhCLEVBQTRCO0FBQy9FLFFBQU15TSxXQUFXLEdBQUcsa0NBQWlCek0sT0FBakIsRUFBMEJ6RCxLQUFLLENBQUNiLFlBQWhDLENBQXBCO0FBQ0EsV0FBTytRLFdBQVcsSUFBSUEsV0FBVyxDQUFDelAsTUFBM0IsR0FBb0NvTSxJQUFJLENBQUNzRCxNQUFMLENBQVlELFdBQVosQ0FBcEMsR0FBK0RyRCxJQUF0RTtBQUNELEdBSHFCLEVBR25CbUQsS0FIbUIsQ0FBdEI7QUFLQSxTQUFPO0FBQ0xoUSxJQUFBQSxLQUFLLGtDQUNBQSxLQURBO0FBRUhoQyxNQUFBQSxNQUFNLGdEQUFNZ0MsS0FBSyxDQUFDaEMsTUFBWix1Q0FBdUJpUyxhQUF2QixFQUZIO0FBR0g5UixNQUFBQSxVQUFVLGdEQUVMOFIsYUFBYSxDQUFDOVAsR0FBZCxDQUFrQixVQUFDaVEsQ0FBRCxFQUFJL1AsQ0FBSjtBQUFBLGVBQVVMLEtBQUssQ0FBQ2hDLE1BQU4sQ0FBYXlDLE1BQWIsR0FBc0JKLENBQWhDO0FBQUEsT0FBbEIsQ0FGSyx1Q0FHTEwsS0FBSyxDQUFDN0IsVUFIRDtBQUhQLE1BREE7QUFVTGdQLElBQUFBLFNBQVMsRUFBRThDO0FBVk4sR0FBUDtBQVlEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTMUMsa0JBQVQsQ0FBNEJ2TixLQUE1QixFQUFtQ3lELE9BQW5DLEVBQTRDO0FBQ2pELE1BQU02SixhQUFhLEdBQUcsd0VBQ2pCN0osT0FEaUI7QUFFcEIxRSxJQUFBQSxrQkFBa0IsRUFBRWlCLEtBQUssQ0FBQ2pCO0FBRk4sS0FBdEI7O0FBSUEsTUFBTXNSLE1BQU0sbUNBQ1ByUSxLQUFLLENBQUN2QixpQkFBTixDQUF3QjNDLE9BQXhCLENBQWdDSSxNQUFoQyxDQUF1Q0MsWUFEaEMsR0FFUG1SLGFBRk8sQ0FBWjs7QUFLQSxTQUFPLGdCQUFJLENBQUMsbUJBQUQsRUFBc0IsU0FBdEIsRUFBaUMsUUFBakMsRUFBMkMsY0FBM0MsQ0FBSixFQUFnRStDLE1BQWhFLEVBQXdFclEsS0FBeEUsQ0FBUDtBQUNEOztBQUVNLFNBQVNpTywwQkFBVCxDQUFvQ2EsSUFBcEMsRUFBMENoRixLQUExQyxFQUFpRDtBQUN0RCxNQUFNd0UsUUFBUSxHQUFHUSxJQUFJLENBQUNyTSxJQUFMLDRCQUE4QnFILEtBQTlCLENBQWpCO0FBQ0EsOENBQ0d3RSxRQURILEVBQ2M7QUFDVjtBQUNBSSxJQUFBQSxPQUFPLEVBQUUsQ0FGQztBQUdWQyxJQUFBQSxPQUFPLEVBQUUsRUFIQztBQUlWTCxJQUFBQSxRQUFRLEVBQVJBLFFBSlU7QUFLVjVKLElBQUFBLEtBQUssRUFBRTtBQUxHLEdBRGQ7QUFTRDs7QUFFTSxTQUFTOEosZ0NBQVQsQ0FBMEN4TyxLQUExQyxVQUF1RTtBQUFBLE1BQXJCc08sUUFBcUIsVUFBckJBLFFBQXFCO0FBQUEsTUFBWEcsUUFBVyxVQUFYQSxRQUFXO0FBQzVFO0FBQ0EsU0FBTyw0QkFBTSxxQkFBTixFQUE2Qiw0QkFBTUgsUUFBTixFQUFnQiw2QkFBT0csUUFBUCxDQUFoQixDQUE3QixFQUFnRXpPLEtBQWhFLENBQVA7QUFDRDtBQUNEO0FBQ0E7QUFDQTs7O0FBQ08sU0FBUytHLHdCQUFULENBQ0wvRyxLQURLLEVBRUxzQixNQUZLLEVBR0w0RSxhQUhLLEVBSUs7QUFDVixNQUFNNEosT0FBTyxHQUFHLE9BQU94TyxNQUFQLEtBQWtCLFFBQWxCLEdBQTZCLENBQUNBLE1BQUQsQ0FBN0IsR0FBd0NBLE1BQXhEO0FBQ0EsTUFBTTZMLFNBQWtCLEdBQUcsRUFBM0I7QUFDQSxNQUFNOUUsWUFBbUIsR0FBRyxFQUE1QjtBQUVBckksRUFBQUEsS0FBSyxDQUFDaEMsTUFBTixDQUFheU4sT0FBYixDQUFxQixVQUFDMUssUUFBRCxFQUFXVixDQUFYLEVBQWlCO0FBQ3BDLFFBQUlVLFFBQVEsQ0FBQzdFLE1BQVQsQ0FBZ0JvRixNQUFoQixJQUEwQndPLE9BQU8sQ0FBQ2pOLFFBQVIsQ0FBaUI5QixRQUFRLENBQUM3RSxNQUFULENBQWdCb0YsTUFBakMsQ0FBOUIsRUFBd0U7QUFDdEU7QUFDQSxVQUFNTSxRQUFRLEdBQ1pzRSxhQUFhLElBQUlBLGFBQWEsQ0FBQ29LLFdBQS9CLEdBQ0l2UCxRQURKLEdBRUlBLFFBQVEsQ0FBQ2lELGlCQUFULENBQTJCaEUsS0FBSyxDQUFDMUIsUUFBakMsRUFBMkM0SCxhQUEzQyxDQUhOOztBQUZzRSxpQ0FPM0Msb0NBQW1CdEUsUUFBbkIsRUFBNkI1QixLQUE3QixFQUFvQ0EsS0FBSyxDQUFDL0IsU0FBTixDQUFnQm9DLENBQWhCLENBQXBDLENBUDJDO0FBQUEsVUFPL0RwQyxTQVArRCx3QkFPL0RBLFNBUCtEO0FBQUEsVUFPcERnQyxLQVBvRCx3QkFPcERBLEtBUG9EOztBQVN0RWtOLE1BQUFBLFNBQVMsQ0FBQ3BELElBQVYsQ0FBZTlKLEtBQWY7QUFDQW9JLE1BQUFBLFlBQVksQ0FBQzBCLElBQWIsQ0FBa0I5TCxTQUFsQjtBQUNELEtBWEQsTUFXTztBQUNMa1AsTUFBQUEsU0FBUyxDQUFDcEQsSUFBVixDQUFlaEosUUFBZjtBQUNBc0gsTUFBQUEsWUFBWSxDQUFDMEIsSUFBYixDQUFrQi9KLEtBQUssQ0FBQy9CLFNBQU4sQ0FBZ0JvQyxDQUFoQixDQUFsQjtBQUNEO0FBQ0YsR0FoQkQ7O0FBa0JBLE1BQU1HLFFBQVEsbUNBQ1RSLEtBRFM7QUFFWmhDLElBQUFBLE1BQU0sRUFBRW1QLFNBRkk7QUFHWmxQLElBQUFBLFNBQVMsRUFBRW9LO0FBSEMsSUFBZDs7QUFNQSxTQUFPN0gsUUFBUDtBQUNEOztBQUVNLFNBQVNJLHFCQUFULENBQW1EWixLQUFuRCxFQUFnRTtBQUNyRTtBQUNBLE1BQU11USxnQkFBZ0IsR0FBR3ZRLEtBQUssQ0FBQ2hDLE1BQU4sQ0FBYTBFLE1BQWIsQ0FDdkIsVUFBQXpCLENBQUM7QUFBQSxXQUNDQSxDQUFDLENBQUMvRSxNQUFGLENBQVN3RSxTQUFULElBQ0FPLENBQUMsQ0FBQy9FLE1BQUYsQ0FBU3lFLFNBRFQsSUFFQU0sQ0FBQyxDQUFDL0UsTUFBRixDQUFTeUUsU0FBVCxDQUFtQjFFLE9BRm5CLElBR0E7QUFDQW1JLElBQUFBLEtBQUssQ0FBQ0MsT0FBTixDQUFjcEQsQ0FBQyxDQUFDdVAsZUFBaEIsQ0FMRDtBQUFBLEdBRHNCLENBQXpCOztBQVNBLE1BQUksQ0FBQ0QsZ0JBQWdCLENBQUM5UCxNQUF0QixFQUE4QjtBQUM1QiwyQ0FDS1QsS0FETDtBQUVFWCxNQUFBQSxlQUFlLGtDQUNWVyxLQUFLLENBQUNYLGVBREk7QUFFYnZDLFFBQUFBLE1BQU0sRUFBRSxJQUZLO0FBR2JNLFFBQUFBLGlCQUFpQixFQUFFO0FBSE47QUFGakI7QUFRRDs7QUFFRCxNQUFNcVQsWUFBOEIsR0FBR0YsZ0JBQWdCLENBQUMzRyxNQUFqQixDQUNyQyxVQUFDaUQsSUFBRCxFQUFPNU0sS0FBUDtBQUFBLFdBQWlCLENBQ2Y7QUFDQXlRLElBQUFBLElBQUksQ0FBQ0MsR0FBTCxDQUFTOUQsSUFBSSxDQUFDLENBQUQsQ0FBYixFQUFrQjVNLEtBQUssQ0FBQ3VRLGVBQU4sQ0FBc0IsQ0FBdEIsQ0FBbEIsQ0FGZSxFQUdmO0FBQ0FFLElBQUFBLElBQUksQ0FBQ0UsR0FBTCxDQUFTL0QsSUFBSSxDQUFDLENBQUQsQ0FBYixFQUFrQjVNLEtBQUssQ0FBQ3VRLGVBQU4sQ0FBc0IsQ0FBdEIsQ0FBbEIsQ0FKZSxDQUFqQjtBQUFBLEdBRHFDLEVBT3JDLENBQUNLLE1BQU0sQ0FBQ0MsUUFBRCxDQUFQLEVBQW1CLENBQUNBLFFBQXBCLENBUHFDLENBQXZDO0FBU0EsTUFBTTFULGlCQUFpQixHQUFHLHdDQUE0QnFULFlBQTVCLENBQTFCO0FBRUEseUNBQ0t6USxLQURMO0FBRUVYLElBQUFBLGVBQWUsa0NBQ1ZXLEtBQUssQ0FBQ1gsZUFESTtBQUVidEMsTUFBQUEsV0FBVyxFQUFFLHNCQUFVaUQsS0FBSyxDQUFDWCxlQUFOLENBQXNCdEMsV0FBaEMsRUFBNkMwVCxZQUE3QyxJQUNUelEsS0FBSyxDQUFDWCxlQUFOLENBQXNCdEMsV0FEYixHQUVUMFQsWUFBWSxDQUFDLENBQUQsQ0FKSDtBQUtiM1QsTUFBQUEsTUFBTSxFQUFFMlQsWUFMSztBQU1iclQsTUFBQUEsaUJBQWlCLEVBQWpCQTtBQU5hO0FBRmpCO0FBV0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTTJULG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBdUIsQ0FDbEMvUSxLQURrQztBQUFBLE1BRWpDMUMsSUFGaUMsVUFFakNBLElBRmlDO0FBQUEseUNBSS9CMEMsS0FKK0I7QUFLbENWLElBQUFBLE1BQU0sa0NBQ0RVLEtBQUssQ0FBQ1YsTUFETDtBQUVKaEMsTUFBQUEsSUFBSSxFQUFKQSxJQUZJO0FBR0pJLE1BQUFBLGVBQWUsRUFBRTtBQUhiO0FBTDRCO0FBQUEsQ0FBN0IsQyxDQVlQOztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLFNBQVNzVCxrQkFBVCxDQUNMaFIsS0FESyxVQUdLO0FBQUEsK0JBRFR2QyxRQUNTO0FBQUEsTUFEVEEsUUFDUyxnQ0FERSxFQUNGO0FBQ1YsTUFBTXdULFdBQVcsR0FBR3hULFFBQVEsQ0FBQ2dELE1BQVQsSUFBbUJoRCxRQUFRLENBQUNBLFFBQVEsQ0FBQ2dELE1BQVQsR0FBa0IsQ0FBbkIsQ0FBL0M7O0FBRUEsTUFBTUQsUUFBUSxtQ0FDVFIsS0FEUztBQUVaVixJQUFBQSxNQUFNLGtDQUNEVSxLQUFLLENBQUNWLE1BREw7QUFFSjtBQUNBN0IsTUFBQUEsUUFBUSxFQUFFQSxRQUFRLENBQUNpRixNQUFULENBQWdCLFVBQUFFLENBQUM7QUFBQSxlQUFJLENBQUMsaUNBQXFCQSxDQUFyQixDQUFMO0FBQUEsT0FBakIsQ0FITjtBQUlKdEYsTUFBQUEsSUFBSSxFQUFFMlQsV0FBVyxJQUFJQSxXQUFXLENBQUNDLFVBQVosQ0FBdUJDLFFBQXRDLEdBQWlENVQsd0JBQWE2VCxJQUE5RCxHQUFxRXBSLEtBQUssQ0FBQ1YsTUFBTixDQUFhaEM7QUFKcEY7QUFGTSxJQUFkLENBSFUsQ0FhVjs7O0FBYlUsTUFjSEksZUFkRyxHQWNnQnNDLEtBQUssQ0FBQ1YsTUFkdEIsQ0FjSDVCLGVBZEcsRUFnQlY7O0FBQ0EsTUFBSSxDQUFDQSxlQUFMLEVBQXNCO0FBQ3BCLFdBQU84QyxRQUFQO0FBQ0QsR0FuQlMsQ0FxQlY7OztBQUNBLE1BQU02USxPQUFPLEdBQUc1VCxRQUFRLENBQUNrRSxJQUFULENBQWMsVUFBQWlCLENBQUM7QUFBQSxXQUFJQSxDQUFDLENBQUM3RyxFQUFGLEtBQVMyQixlQUFlLENBQUMzQixFQUE3QjtBQUFBLEdBQWYsQ0FBaEIsQ0F0QlUsQ0F3QlY7O0FBQ0EsTUFBTXVWLFFBQVEsR0FBR0QsT0FBTyxJQUFJLGlDQUFxQkEsT0FBckIsQ0FBNUI7O0FBQ0EsTUFBSUMsUUFBUSxJQUFJRCxPQUFoQixFQUF5QjtBQUN2QixRQUFNRSxZQUFZLEdBQUcsaUNBQXFCRixPQUFyQixFQUE4QkMsUUFBOUIsQ0FBckI7QUFDQSxRQUFNRSxTQUFTLEdBQUd4UixLQUFLLENBQUM1QixPQUFOLENBQWM0QyxTQUFkLENBQXdCLFVBQUF5USxHQUFHO0FBQUEsYUFBSUEsR0FBRyxDQUFDMVYsRUFBSixLQUFXdVYsUUFBZjtBQUFBLEtBQTNCLENBQWxCLENBRnVCLENBR3ZCOztBQUNBLFdBQU85TCxnQkFBZ0IsQ0FBQ2hGLFFBQUQsRUFBVztBQUNoQ04sTUFBQUEsR0FBRyxFQUFFc1IsU0FEMkI7QUFFaENyTyxNQUFBQSxJQUFJLEVBQUUsT0FGMEI7QUFHaENDLE1BQUFBLEtBQUssRUFBRW1PO0FBSHlCLEtBQVgsQ0FBdkI7QUFLRDs7QUFFRCxTQUFPL1EsUUFBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU1rUix5QkFBeUIsR0FBRyxTQUE1QkEseUJBQTRCLENBQ3ZDMVIsS0FEdUM7QUFBQSxNQUV0Q3FSLE9BRnNDLFVBRXRDQSxPQUZzQztBQUFBLHlDQUlwQ3JSLEtBSm9DO0FBS3ZDVixJQUFBQSxNQUFNLGtDQUNEVSxLQUFLLENBQUNWLE1BREw7QUFFSjVCLE1BQUFBLGVBQWUsRUFBRTJUO0FBRmI7QUFMaUM7QUFBQSxDQUFsQztBQVdQO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLFNBQVNNLG9CQUFULENBQ0wzUixLQURLLFVBR0s7QUFBQSxNQURUcVIsT0FDUyxVQURUQSxPQUNTOztBQUNWLE1BQUksQ0FBQ0EsT0FBTCxFQUFjO0FBQ1osV0FBT3JSLEtBQVA7QUFDRDs7QUFFRCxNQUFNUSxRQUFRLG1DQUNUUixLQURTO0FBRVpWLElBQUFBLE1BQU0sa0NBQ0RVLEtBQUssQ0FBQ1YsTUFETDtBQUVKNUIsTUFBQUEsZUFBZSxFQUFFO0FBRmI7QUFGTSxJQUFkOztBQVFBLE1BQUksaUNBQXFCMlQsT0FBckIsQ0FBSixFQUFtQztBQUNqQyxRQUFNRyxTQUFTLEdBQUdoUixRQUFRLENBQUNwQyxPQUFULENBQWlCNEMsU0FBakIsQ0FBMkIsVUFBQTRCLENBQUM7QUFBQSxhQUFJQSxDQUFDLENBQUM3RyxFQUFGLEtBQVMsaUNBQXFCc1YsT0FBckIsQ0FBYjtBQUFBLEtBQTVCLENBQWxCO0FBRUEsV0FBT0csU0FBUyxHQUFHLENBQUMsQ0FBYixHQUFpQnZKLG1CQUFtQixDQUFDekgsUUFBRCxFQUFXO0FBQUNOLE1BQUFBLEdBQUcsRUFBRXNSO0FBQU4sS0FBWCxDQUFwQyxHQUFtRWhSLFFBQTFFO0FBQ0QsR0FqQlMsQ0FtQlY7OztBQUNBLE1BQU0ySCxTQUFTLG1DQUNWbkksS0FBSyxDQUFDVixNQURJO0FBRWI3QixJQUFBQSxRQUFRLEVBQUV1QyxLQUFLLENBQUNWLE1BQU4sQ0FBYTdCLFFBQWIsQ0FBc0JpRixNQUF0QixDQUE2QixVQUFBRSxDQUFDO0FBQUEsYUFBSUEsQ0FBQyxDQUFDN0csRUFBRixLQUFTc1YsT0FBTyxDQUFDdFYsRUFBckI7QUFBQSxLQUE5QixDQUZHO0FBR2IyQixJQUFBQSxlQUFlLEVBQUU7QUFISixJQUFmOztBQU1BLHlDQUNLc0MsS0FETDtBQUVFVixJQUFBQSxNQUFNLEVBQUU2STtBQUZWO0FBSUQ7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBU3lKLDRCQUFULENBQ0w1UixLQURLLEVBRUw2SyxPQUZLLEVBR0s7QUFBQSxNQUNINUssS0FERyxHQUNlNEssT0FEZixDQUNINUssS0FERztBQUFBLE1BQ0lvUixPQURKLEdBQ2V4RyxPQURmLENBQ0l3RyxPQURKO0FBRVYsTUFBTUMsUUFBUSxHQUFHLGlDQUFxQkQsT0FBckIsQ0FBakIsQ0FGVSxDQUlWOztBQUNBLE1BQUlHLFNBQUo7QUFDQSxNQUFJSyxVQUFVLEdBQUcsQ0FBQzVSLEtBQUssQ0FBQ2xFLEVBQVAsQ0FBakI7QUFDQSxNQUFJeUUsUUFBUSxHQUFHUixLQUFmLENBUFUsQ0FRVjs7QUFDQSxNQUFJc1IsUUFBSixFQUFjO0FBQ1pFLElBQUFBLFNBQVMsR0FBR3hSLEtBQUssQ0FBQzVCLE9BQU4sQ0FBYzRDLFNBQWQsQ0FBd0IsVUFBQTRCLENBQUM7QUFBQSxhQUFJQSxDQUFDLENBQUM3RyxFQUFGLEtBQVN1VixRQUFiO0FBQUEsS0FBekIsQ0FBWjs7QUFFQSxRQUFJLENBQUN0UixLQUFLLENBQUM1QixPQUFOLENBQWNvVCxTQUFkLENBQUwsRUFBK0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsVUFBTU0saUJBQWlCLG1DQUNsQlQsT0FEa0I7QUFFckJILFFBQUFBLFVBQVUsa0NBQ0xHLE9BQU8sQ0FBQ0gsVUFESDtBQUVSSSxVQUFBQSxRQUFRLEVBQUU7QUFGRjtBQUZXLFFBQXZCOztBQVFBLDZDQUNLdFIsS0FETDtBQUVFVixRQUFBQSxNQUFNLGtDQUNEVSxLQUFLLENBQUNWLE1BREw7QUFFSjdCLFVBQUFBLFFBQVEsZ0RBQU11QyxLQUFLLENBQUNWLE1BQU4sQ0FBYTdCLFFBQW5CLElBQTZCcVUsaUJBQTdCLEVBRko7QUFHSnBVLFVBQUFBLGVBQWUsRUFBRW9VO0FBSGI7QUFGUjtBQVFEOztBQUNELFFBQU1wUCxNQUFNLEdBQUcxQyxLQUFLLENBQUM1QixPQUFOLENBQWNvVCxTQUFkLENBQWY7QUF4QlksMEJBeUJXOU8sTUF6QlgsQ0F5QkwyRCxPQXpCSztBQUFBLFFBeUJMQSxPQXpCSyxnQ0F5QkssRUF6Qkw7QUEwQlosUUFBTTBMLGVBQWUsR0FBRzFMLE9BQU8sQ0FBQ3hELFFBQVIsQ0FBaUI1QyxLQUFLLENBQUNsRSxFQUF2QixDQUF4QjtBQUVBOFYsSUFBQUEsVUFBVSxHQUFHRSxlQUFlLEdBQ3hCO0FBQ0ExTCxJQUFBQSxPQUFPLENBQUMzRCxNQUFSLENBQWUsVUFBQXpCLENBQUM7QUFBQSxhQUFJQSxDQUFDLEtBQUtoQixLQUFLLENBQUNsRSxFQUFoQjtBQUFBLEtBQWhCLENBRndCLGlEQUdwQnNLLE9BSG9CLElBR1hwRyxLQUFLLENBQUNsRSxFQUhLLEVBQTVCO0FBSUQsR0FoQ0QsTUFnQ087QUFDTDtBQUNBLFFBQU04SixTQUFTLEdBQUcsa0NBQXNCLEVBQXRCLEVBQTBCd0wsT0FBMUIsQ0FBbEI7QUFDQUcsSUFBQUEsU0FBUyxHQUFHeFIsS0FBSyxDQUFDNUIsT0FBTixDQUFjcUMsTUFBMUIsQ0FISyxDQUtMOztBQUNBRCxJQUFBQSxRQUFRLG1DQUNIUixLQURHO0FBRU41QixNQUFBQSxPQUFPLGdEQUFNNEIsS0FBSyxDQUFDNUIsT0FBWixJQUFxQnlILFNBQXJCLEVBRkQ7QUFHTnZHLE1BQUFBLE1BQU0sa0NBQ0RVLEtBQUssQ0FBQ1YsTUFETDtBQUVKN0IsUUFBQUEsUUFBUSxFQUFFdUMsS0FBSyxDQUFDVixNQUFOLENBQWE3QixRQUFiLENBQXNCaUYsTUFBdEIsQ0FBNkIsVUFBQUUsQ0FBQztBQUFBLGlCQUFJQSxDQUFDLENBQUM3RyxFQUFGLEtBQVNzVixPQUFPLENBQUN0VixFQUFyQjtBQUFBLFNBQTlCLENBRk47QUFHSjJCLFFBQUFBLGVBQWUsRUFBRW1JLFNBQVMsQ0FBQ3pDO0FBSHZCO0FBSEEsTUFBUjtBQVNEOztBQUVELFNBQU9vQyxnQkFBZ0IsQ0FBQ2hGLFFBQUQsRUFBVztBQUNoQ04sSUFBQUEsR0FBRyxFQUFFc1IsU0FEMkI7QUFFaENyTyxJQUFBQSxJQUFJLEVBQUUsU0FGMEI7QUFHaENDLElBQUFBLEtBQUssRUFBRXlPO0FBSHlCLEdBQVgsQ0FBdkI7QUFLRDtBQUVEO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTRyxzQkFBVCxDQUNMaFMsS0FESyxVQUdLO0FBQUEsTUFEVHNCLE1BQ1MsVUFEVEEsTUFDUztBQUFBLE1BREQyUSxNQUNDLFVBRERBLE1BQ0M7QUFBQSxNQURPM1UsSUFDUCxVQURPQSxJQUNQO0FBQ1YsTUFBTW1HLE9BQU8sR0FBR3pELEtBQUssQ0FBQzFCLFFBQU4sQ0FBZWdELE1BQWYsQ0FBaEI7O0FBQ0EsTUFBSSxDQUFDbUMsT0FBTCxFQUFjO0FBQ1osV0FBT3pELEtBQVA7QUFDRDs7QUFDRCxNQUFJa1MsUUFBUSxHQUFHNVUsSUFBZjs7QUFDQSxNQUFJLENBQUM0VSxRQUFMLEVBQWU7QUFDYixRQUFNQyxXQUFXLEdBQUcseUJBQUkxTyxPQUFKLEVBQWEsQ0FBQyxZQUFELEVBQWV3TyxNQUFmLENBQWIsQ0FBcEIsQ0FEYSxDQUViOztBQUNBQyxJQUFBQSxRQUFRLEdBQUdDLFdBQVcsR0FDbEJoUixNQUFNLENBQUNDLElBQVAsQ0FBWWdSLHFCQUFaLEVBQXdCelEsSUFBeEIsQ0FBNkIsVUFBQTBRLENBQUM7QUFBQSxhQUFJQSxDQUFDLEtBQUtGLFdBQVY7QUFBQSxLQUE5QixDQURrQixHQUVsQkMsc0JBQVdFLFNBRmY7QUFHRDs7QUFFRCxNQUFNQyxNQUFNLEdBQUcsZ0NBQW9COU8sT0FBcEIsRUFBNkJ3TyxNQUE3QixFQUFxQ0MsUUFBckMsQ0FBZjtBQUNBLFNBQU8sZ0JBQUksQ0FBQyxVQUFELEVBQWE1USxNQUFiLENBQUosRUFBMEJpUixNQUExQixFQUFrQ3ZTLEtBQWxDLENBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTd1MscUJBQVQsQ0FDTHhTLEtBREssVUFHSztBQUFBLE1BRFRzQixNQUNTLFVBRFRBLE1BQ1M7QUFBQSxNQUREMlEsTUFDQyxVQUREQSxNQUNDO0FBQ1YsTUFBTXhPLE9BQU8sR0FBR3pELEtBQUssQ0FBQzFCLFFBQU4sQ0FBZWdELE1BQWYsQ0FBaEI7O0FBQ0EsTUFBSSxDQUFDbUMsT0FBTCxFQUFjO0FBQ1osV0FBT3pELEtBQVA7QUFDRDs7QUFDRCxNQUFNbUcsVUFBVSxHQUFHLDRCQUFnQjFDLE9BQWhCLEVBQXlCd08sTUFBekIsQ0FBbkI7QUFFQSxTQUFPLGdCQUFJLENBQUMsVUFBRCxFQUFhM1EsTUFBYixDQUFKLEVBQTBCNkUsVUFBMUIsRUFBc0NuRyxLQUF0QyxDQUFQO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTeVMsc0JBQVQsQ0FDTHpTLEtBREssVUFHSztBQUFBLE1BRFRzQixNQUNTLFVBRFRBLE1BQ1M7QUFBQSxNQUREMlEsTUFDQyxVQUREQSxNQUNDO0FBQ1YsTUFBTXhPLE9BQU8sR0FBR3pELEtBQUssQ0FBQzFCLFFBQU4sQ0FBZWdELE1BQWYsQ0FBaEI7O0FBQ0EsTUFBSSxDQUFDbUMsT0FBTCxFQUFjO0FBQ1osV0FBT3pELEtBQVA7QUFDRDs7QUFDRCxNQUFNMFMsUUFBUSxHQUFHalAsT0FBTyxDQUFDMEcsTUFBUixDQUFlbkosU0FBZixDQUF5QixVQUFBNEIsQ0FBQztBQUFBLFdBQUlBLENBQUMsQ0FBQ0gsSUFBRixLQUFXd1AsTUFBZjtBQUFBLEdBQTFCLENBQWpCOztBQUNBLE1BQUlTLFFBQVEsR0FBRyxDQUFmLEVBQWtCO0FBQ2hCLFdBQU8xUyxLQUFQO0FBQ0Q7O0FBUlMsTUFTSDhELElBVEcsR0FTS0wsT0FBTyxDQUFDMEcsTUFBUixDQUFldUksUUFBZixDQVRMLENBU0g1TyxJQVRHO0FBVVYsTUFBTTZPLElBQUksR0FBR2xQLE9BQU8sQ0FBQ21QLGFBQVIsQ0FDVnpTLEdBRFUsQ0FDTixVQUFBMFMsR0FBRztBQUFBLFdBQUksNEJBQWdCQSxHQUFHLENBQUNDLE9BQUosQ0FBWUosUUFBWixDQUFoQixFQUF1QzVPLElBQXZDLENBQUo7QUFBQSxHQURHLEVBQytDLElBRC9DLEVBRVZpUCxJQUZVLENBRUwsSUFGSyxDQUFiO0FBSUEsbUNBQUtKLElBQUw7QUFFQSxTQUFPM1MsS0FBUDtBQUNEO0FBRUQ7QUFDQTtBQUNBOzs7QUFDTyxTQUFTZ1QsNkJBQVQsQ0FDTGhULEtBREssRUFFTGMsTUFGSyxFQUdLO0FBQ1YseUNBQ0tkLEtBREw7QUFFRVYsSUFBQUEsTUFBTSxrQ0FDRFUsS0FBSyxDQUFDVixNQURMO0FBRUozQixNQUFBQSxPQUFPLEVBQUUsQ0FBQ3FDLEtBQUssQ0FBQ1YsTUFBTixDQUFhM0I7QUFGbkI7QUFGUjtBQU9EOztBQUVNLFNBQVNzVixtQ0FBVCxDQUNMalQsS0FESyxVQUdLO0FBQUEsTUFEVEUsR0FDUyxVQURUQSxHQUNTO0FBQUEsTUFESmhFLE1BQ0ksVUFESkEsTUFDSTtBQUNWLE1BQU0wSixTQUFTLEdBQUc1RixLQUFLLENBQUM1QixPQUFOLENBQWM4QixHQUFkLENBQWxCOztBQUNBLE1BQUksQ0FBQzBGLFNBQUwsRUFBZ0I7QUFDZG5CLG9CQUFRQyxLQUFSLG1CQUF5QnhFLEdBQXpCOztBQUNBLFdBQU9GLEtBQVA7QUFDRDs7QUFDRCxNQUFJNEYsU0FBUyxDQUFDOUIsSUFBVixLQUFtQm9QLHdCQUFhQyxTQUFwQyxFQUErQztBQUM3QzFPLG9CQUFRQyxLQUFSOztBQUdBLFdBQU8xRSxLQUFQO0FBQ0Q7O0FBRUQsTUFBTW9ULE9BQU8sR0FBR0MsbUJBQW1CLENBQUNuWCxNQUFELENBQW5DO0FBRUEsU0FBTyw0QkFBTSxTQUFOLEVBQWlCLDRCQUFNLDZCQUFPa1gsT0FBUCxFQUFnQnhOLFNBQWhCLENBQU4sQ0FBakIsRUFBb0Q1RixLQUFwRCxDQUFQO0FBQ0Q7O0FBRUQsU0FBU3FULG1CQUFULENBQTZCblgsTUFBN0IsRUFBcUM7QUFDbkMsTUFBTW9YLE9BQU8sR0FBRyxDQUFDLFlBQUQsRUFBZSxVQUFmLENBQWhCO0FBQ0EsU0FBT25TLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZbEYsTUFBWixFQUFvQjBOLE1BQXBCLENBQTJCLFVBQUNpRCxJQUFELEVBQU8xSixJQUFQLEVBQWdCO0FBQ2hELFFBQUksQ0FBQ21RLE9BQU8sQ0FBQ3pRLFFBQVIsQ0FBaUJNLElBQWpCLENBQUwsRUFBNkI7QUFDM0JzQixzQkFBUUMsS0FBUiwwRkFDb0Z2QixJQURwRjs7QUFHQSxhQUFPMEosSUFBUDtBQUNELEtBTitDLENBUWhEOzs7QUFDQUEsSUFBQUEsSUFBSSxDQUFDMUosSUFBRCxDQUFKLEdBQWFqSCxNQUFNLENBQUNpSCxJQUFELENBQW5CO0FBQ0EsV0FBTzBKLElBQVA7QUFDRCxHQVhNLEVBV0osRUFYSSxDQUFQO0FBWUQ7QUFDRDtBQUNBO0FBQ0E7OztBQUNPLFNBQVMwRyxrQ0FBVCxDQUNMdlQsS0FESyxVQUdLO0FBQUEsTUFEVDlELE1BQ1MsVUFEVEEsTUFDUzs7QUFDVixNQUFJLENBQUNBLE1BQUwsRUFBYTtBQUNYLFdBQU84RCxLQUFQO0FBQ0Q7O0FBQ0QsTUFBTW9ULE9BQU8sR0FBR0MsbUJBQW1CLENBQUNuWCxNQUFELENBQW5DO0FBQ0EsU0FBTyw0QkFBTSxpQkFBTixFQUF5Qiw2QkFBT2tYLE9BQVAsQ0FBekIsRUFBMENwVCxLQUExQyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge2Rpc2FibGVTdGFja0NhcHR1cmluZywgd2l0aFRhc2t9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC51bmlxJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLmdldCc7XG5pbXBvcnQgeG9yIGZyb20gJ2xvZGFzaC54b3InO1xuaW1wb3J0IGNvcHkgZnJvbSAnY29weS10by1jbGlwYm9hcmQnO1xuLy8gVGFza3NcbmltcG9ydCB7TE9BRF9GSUxFX1RBU0ssIFVOV1JBUF9UQVNLLCBQUk9DRVNTX0ZJTEVfREFUQSwgREVMQVlfVEFTS30gZnJvbSAnQGtlcGxlci5nbC90YXNrcyc7XG4vLyBBY3Rpb25zXG5pbXBvcnQge1xuICBsb2FkRmlsZXNFcnIsXG4gIGxvYWRGaWxlc1N1Y2Nlc3MsXG4gIGxvYWRGaWxlU3RlcFN1Y2Nlc3MsXG4gIGxvYWROZXh0RmlsZSxcbiAgbmV4dEZpbGVCYXRjaCxcbiAgUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQsXG4gIFZpc1N0YXRlQWN0aW9ucyxcbiAgTWFwU3RhdGVBY3Rpb25zLFxuICBwcm9jZXNzRmlsZUNvbnRlbnQsXG4gIEFjdGlvblR5cGVzXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbi8vIFV0aWxzXG5pbXBvcnQge1xuICBzZXQsXG4gIHRvQXJyYXksXG4gIGFycmF5SW5zZXJ0LFxuICBnZW5lcmF0ZUhhc2hJZCxcbiAgYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcCxcbiAgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzLFxuICByZW1vdmVMYXllckZyb21TcGxpdE1hcHMsXG4gIGlzUmdiQ29sb3IsXG4gIHBhcnNlRmllbGRWYWx1ZSxcbiAgYXBwbHlGaWx0ZXJGaWVsZE5hbWUsXG4gIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMsXG4gIGZlYXR1cmVUb0ZpbHRlclZhbHVlLFxuICBmaWx0ZXJEYXRhc2V0Q1BVLFxuICBGSUxURVJfVVBEQVRFUl9QUk9QUyxcbiAgZ2VuZXJhdGVQb2x5Z29uRmlsdGVyLFxuICBnZXREZWZhdWx0RmlsdGVyLFxuICBnZXRGaWx0ZXJJZEluRmVhdHVyZSxcbiAgZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyLFxuICBpc0luUmFuZ2UsXG4gIExJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyxcbiAgdXBkYXRlRmlsdGVyRGF0YUlkLFxuICBnZXRGaWx0ZXJQbG90LFxuICBnZXREZWZhdWx0RmlsdGVyUGxvdFR5cGVcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7XG4gIGlzVmFsaWRNZXJnZXIsXG4gIFZJU19TVEFURV9NRVJHRVJTLFxuICB2YWxpZGF0ZUxheWVyV2l0aERhdGEsXG4gIGNyZWF0ZUxheWVyRnJvbUNvbmZpZyxcbiAgc2VyaWFsaXplTGF5ZXJcbn0gZnJvbSAnLi92aXMtc3RhdGUtbWVyZ2VyJztcblxuaW1wb3J0IHtMYXllciwgTGF5ZXJDbGFzc2VzLCBMQVlFUl9JRF9MRU5HVEh9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7XG4gIEVESVRPUl9NT0RFUyxcbiAgU09SVF9PUkRFUixcbiAgRklMVEVSX1RZUEVTLFxuICBNQVhfREVGQVVMVF9UT09MVElQUyxcbiAgREVGQVVMVF9URVhUX0xBQkVMLFxuICBDT01QQVJFX1RZUEVTXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7cGlja18sIG1lcmdlXywgc3dhcF99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge0ZpbHRlciwgSW50ZXJhY3Rpb25Db25maWcsIEFuaW1hdGlvbkNvbmZpZywgRWRpdG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7TG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuXG5pbXBvcnQge2NhbGN1bGF0ZUxheWVyRGF0YSwgZmluZERlZmF1bHRMYXllcn0gZnJvbSAnLi9sYXllci11dGlscyc7XG5pbXBvcnQge1xuICBjb3B5VGFibGVBbmRVcGRhdGUsXG4gIERhdGFzZXRzLFxuICBwaW5UYWJsZUNvbHVtbnMsXG4gIHNvcnREYXRhc2V0QnlDb2x1bW4sXG4gIGFzc2lnbkdwdUNoYW5uZWwsXG4gIHNldEZpbHRlckdwdU1vZGUsXG4gIGNyZWF0ZU5ld0RhdGFFbnRyeVxufSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7ZmluZEZpZWxkc1RvU2hvd30gZnJvbSAnLi9pbnRlcmFjdGlvbi11dGlscyc7XG5cbi8vIHJlYWN0LXBhbG1cbi8vIGRpc2FibGUgY2FwdHVyZSBleGNlcHRpb24gZm9yIHJlYWN0LXBhbG0gY2FsbCB0byB3aXRoVGFza1xuZGlzYWJsZVN0YWNrQ2FwdHVyaW5nKCk7XG5cbi8qKlxuICogVXBkYXRlcnMgZm9yIGB2aXNTdGF0ZWAgcmVkdWNlci4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKlxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7dmlzU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIGNhc2UgJ0NMSUNLX0JVVFRPTic6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgZm9vOiB7XG4gKiAgICAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbC5mb28sXG4gKiAgICAgICAgICAgICB2aXNTdGF0ZTogdmlzU3RhdGVVcGRhdGVycy5lbmxhcmdlRmlsdGVyVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgc3RhdGUua2VwbGVyR2wuZm9vLnZpc1N0YXRlLFxuICogICAgICAgICAgICAgICB7aWR4OiAwfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB2aXNTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZzogSW50ZXJhY3Rpb25Db25maWcgPSB7XG4gIHRvb2x0aXA6IHtcbiAgICBpZDogJ3Rvb2x0aXAnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLnRvb2x0aXAnLFxuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgY29uZmlnOiB7XG4gICAgICBmaWVsZHNUb1Nob3c6IHt9LFxuICAgICAgY29tcGFyZU1vZGU6IGZhbHNlLFxuICAgICAgY29tcGFyZVR5cGU6IENPTVBBUkVfVFlQRVMuQUJTT0xVVEVcbiAgICB9XG4gIH0sXG4gIGdlb2NvZGVyOiB7XG4gICAgaWQ6ICdnZW9jb2RlcicsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuZ2VvY29kZXInLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH0sXG4gIGJydXNoOiB7XG4gICAgaWQ6ICdicnVzaCcsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuYnJ1c2gnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGNvbmZpZzoge1xuICAgICAgLy8gc2l6ZSBpcyBpbiBrbVxuICAgICAgc2l6ZTogMC41XG4gICAgfVxuICB9LFxuICBjb29yZGluYXRlOiB7XG4gICAgaWQ6ICdjb29yZGluYXRlJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5jb29yZGluYXRlJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogbnVsbFxuICB9XG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTklNQVRJT05fQ09ORklHOiBBbmltYXRpb25Db25maWcgPSB7XG4gIGRvbWFpbjogbnVsbCxcbiAgY3VycmVudFRpbWU6IG51bGwsXG4gIHNwZWVkOiAxLFxuICBpc0FuaW1hdGluZzogZmFsc2UsXG4gIHRpbWVGb3JtYXQ6IG51bGwsXG4gIHRpbWV6b25lOiBudWxsLFxuICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbFxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRURJVE9SOiBFZGl0b3IgPSB7XG4gIG1vZGU6IEVESVRPUl9NT0RFUy5EUkFXX1BPTFlHT04sXG4gIGZlYXR1cmVzOiBbXSxcbiAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsLFxuICB2aXNpYmxlOiB0cnVlXG59O1xuXG4vKipcbiAqIERlZmF1bHQgaW5pdGlhbCBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUSUFMX1ZJU19TVEFURTogVmlzU3RhdGUgPSB7XG4gIC8vIG1hcCBpbmZvXG4gIG1hcEluZm86IHtcbiAgICB0aXRsZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnXG4gIH0sXG4gIC8vIGxheWVyc1xuICBsYXllcnM6IFtdLFxuICBsYXllckRhdGE6IFtdLFxuICBsYXllclRvQmVNZXJnZWQ6IFtdLFxuICBsYXllck9yZGVyOiBbXSxcblxuICAvLyBmaWx0ZXJzXG4gIGZpbHRlcnM6IFtdLFxuICBmaWx0ZXJUb0JlTWVyZ2VkOiBbXSxcblxuICAvLyBhIGNvbGxlY3Rpb24gb2YgbXVsdGlwbGUgZGF0YXNldFxuICBkYXRhc2V0czoge30sXG4gIGVkaXRpbmdEYXRhc2V0OiB1bmRlZmluZWQsXG5cbiAgaW50ZXJhY3Rpb25Db25maWc6IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB1bmRlZmluZWQsXG5cbiAgbGF5ZXJCbGVuZGluZzogJ25vcm1hbCcsXG4gIGhvdmVySW5mbzogdW5kZWZpbmVkLFxuICBjbGlja2VkOiB1bmRlZmluZWQsXG4gIG1vdXNlUG9zOiB7fSxcbiAgbWF4RGVmYXVsdFRvb2x0aXBzOiBNQVhfREVGQVVMVF9UT09MVElQUyxcblxuICAvLyB0aGlzIGlzIHVzZWQgd2hlbiB1c2VyIHNwbGl0IG1hcHNcbiAgc3BsaXRNYXBzOiBbXG4gICAgLy8gdGhpcyB3aWxsIGNvbnRhaW4gYSBsaXN0IG9mIG9iamVjdHMgdG9cbiAgICAvLyBkZXNjcmliZSB0aGUgc3RhdGUgb2YgbGF5ZXIgYXZhaWxhYmlsaXR5IGFuZCB2aXNpYmlsaXR5IGZvciBlYWNoIG1hcFxuICAgIC8vIFtcbiAgICAvLyAgIHtcbiAgICAvLyAgICAgIGxheWVyczoge2xheWVyX2lkOiB0cnVlIHwgZmFsc2V9XG4gICAgLy8gICB9XG4gICAgLy8gXVxuICBdLFxuICBzcGxpdE1hcHNUb0JlTWVyZ2VkOiBbXSxcblxuICAvLyBkZWZhdWx0cyBsYXllciBjbGFzc2VzXG4gIGxheWVyQ2xhc3NlczogTGF5ZXJDbGFzc2VzLFxuXG4gIC8vIGRlZmF1bHQgYW5pbWF0aW9uXG4gIC8vIHRpbWUgaW4gdW5peCB0aW1lc3RhbXAgKG1pbGxpc2Vjb25kcykgKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBFcG9jaClcbiAgYW5pbWF0aW9uQ29uZmlnOiBERUZBVUxUX0FOSU1BVElPTl9DT05GSUcsXG5cbiAgZWRpdG9yOiBERUZBVUxUX0VESVRPUixcblxuICBmaWxlTG9hZGluZzogZmFsc2UsXG4gIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9LFxuXG4gIGxvYWRlcnM6IFtdLFxuICBsb2FkT3B0aW9uczoge30sXG5cbiAgLy8gdmlzU3RhdGVNZXJnZXJzXG4gIG1lcmdlcnM6IFZJU19TVEFURV9NRVJHRVJTLFxuXG4gIC8vIGtlcGxlciBzY2hlbWFzXG4gIHNjaGVtYTogS2VwbGVyR0xTY2hlbWFcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcCgobHlyLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXIgOiBseXIpKSxcbiAgICBsYXllckRhdGE6IGxheWVyRGF0YVxuICAgICAgPyBzdGF0ZS5sYXllckRhdGEubWFwKChkLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXJEYXRhIDogZCkpXG4gICAgICA6IHN0YXRlLmxheWVyRGF0YVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZTxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBsYXllcjogTGF5ZXIpOiBTIHtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbGF5ZXIuY29uZmlnLmlzVmlzaWJsZVxuICAgICAgICA/IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICAgICAgOiByZW1vdmVMYXllckZyb21TcGxpdE1hcHMoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld0NvbmZpZyk7XG4gIGlmICh0eXBlb2YgYWN0aW9uLm5ld0NvbmZpZy5kYXRhSWQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qge2RhdGFJZCwgLi4ucmVzdENvbmZpZ30gPSBhY3Rpb24ubmV3Q29uZmlnO1xuICAgIGNvbnN0IHN0YXRlV2l0aERhdGFJZCA9IGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdDb25maWc6IHtkYXRhSWR9XG4gICAgfSk7XG4gICAgY29uc3QgbmV4dExheWVyID0gc3RhdGVXaXRoRGF0YUlkLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICAgIHJldHVybiBuZXh0TGF5ZXIgJiYgT2JqZWN0LmtleXMocmVzdENvbmZpZykubGVuZ3RoXG4gICAgICA/IGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZVdpdGhEYXRhSWQsIHtvbGRMYXllcjogbmV4dExheWVyLCBuZXdDb25maWc6IHJlc3RDb25maWd9KVxuICAgICAgOiBzdGF0ZVdpdGhEYXRhSWQ7XG4gIH1cblxuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhhY3Rpb24ubmV3Q29uZmlnKTtcblxuICBsZXQgbGF5ZXJEYXRhO1xuXG4gIC8vIGxldCBuZXdMYXllcjtcbiAgaWYgKG5ld0xheWVyLnNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykpIHtcbiAgICBjb25zdCBvbGRMYXllckRhdGEgPSBzdGF0ZS5sYXllckRhdGFbaWR4XTtcbiAgICBjb25zdCB1cGRhdGVMYXllckRhdGFSZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gICAgbGF5ZXJEYXRhID0gdXBkYXRlTGF5ZXJEYXRhUmVzdWx0LmxheWVyRGF0YTtcbiAgICBuZXdMYXllciA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllcjtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICBpZiAoJ2lzVmlzaWJsZScgaW4gYWN0aW9uLm5ld0NvbmZpZykge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZShzdGF0ZSwgbmV3TGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgIGxheWVyOiBuZXdMYXllcixcbiAgICBsYXllckRhdGEsXG4gICAgaWR4XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRPclJlbW92ZVRleHRMYWJlbHMobmV3RmllbGRzLCB0ZXh0TGFiZWwpIHtcbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRGaWVsZHMgPSB0ZXh0TGFiZWwubWFwKHRsID0+IHRsLmZpZWxkICYmIHRsLmZpZWxkLm5hbWUpLmZpbHRlcihkID0+IGQpO1xuXG4gIGNvbnN0IGFkZEZpZWxkcyA9IG5ld0ZpZWxkcy5maWx0ZXIoZiA9PiAhY3VycmVudEZpZWxkcy5pbmNsdWRlcyhmLm5hbWUpKTtcbiAgY29uc3QgZGVsZXRlRmllbGRzID0gY3VycmVudEZpZWxkcy5maWx0ZXIoZiA9PiAhbmV3RmllbGRzLmZpbmQoZmQgPT4gZmQubmFtZSA9PT0gZikpO1xuXG4gIC8vIGRlbGV0ZVxuICBuZXdUZXh0TGFiZWwgPSBuZXdUZXh0TGFiZWwuZmlsdGVyKHRsID0+IHRsLmZpZWxkICYmICFkZWxldGVGaWVsZHMuaW5jbHVkZXModGwuZmllbGQubmFtZSkpO1xuICBuZXdUZXh0TGFiZWwgPSAhbmV3VGV4dExhYmVsLmxlbmd0aCA/IFtERUZBVUxUX1RFWFRfTEFCRUxdIDogbmV3VGV4dExhYmVsO1xuXG4gIC8vIGFkZFxuICBuZXdUZXh0TGFiZWwgPSBbXG4gICAgLi4ubmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCksXG4gICAgLi4uYWRkRmllbGRzLm1hcChhZiA9PiAoe1xuICAgICAgLi4uREVGQVVMVF9URVhUX0xBQkVMLFxuICAgICAgZmllbGQ6IGFmXG4gICAgfSkpXG4gIF07XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIHRleHRMYWJlbCkge1xuICBpZiAoIXRleHRMYWJlbFtpZHhdLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgcmV0dXJuIHRleHRMYWJlbDtcbiAgfVxuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBpZiAocHJvcCAmJiAodmFsdWUgfHwgdGV4dExhYmVsLmxlbmd0aCA9PT0gMSkpIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwubWFwKCh0bCwgaSkgPT4gKGkgPT09IGlkeCA/IHsuLi50bCwgW3Byb3BdOiB2YWx1ZX0gOiB0bCkpO1xuICB9IGVsc2UgaWYgKHByb3AgPT09ICdmaWVsZCcgJiYgdmFsdWUgPT09IG51bGwgJiYgdGV4dExhYmVsLmxlbmd0aCA+IDEpIHtcbiAgICAvLyByZW1vdmUgbGFiZWwgd2hlbiBmaWVsZCB2YWx1ZSBpcyBzZXQgdG8gbnVsbFxuICAgIG5ld1RleHRMYWJlbC5zcGxpY2UoaWR4LCAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJhc2UgY29uZmlnOiBkYXRhSWQsIGxhYmVsLCBjb2x1bW4sIGlzVmlzaWJsZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIGlkeCwgcHJvcCwgdmFsdWV9ID0gYWN0aW9uO1xuICBjb25zdCB7dGV4dExhYmVsfSA9IG9sZExheWVyLmNvbmZpZztcblxuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG4gIGlmICghdGV4dExhYmVsW2lkeF0gJiYgaWR4ID09PSB0ZXh0TGFiZWwubGVuZ3RoKSB7XG4gICAgLy8gaWYgaWR4IGlzIHNldCB0byBsZW5ndGgsIGFkZCBlbXB0eSB0ZXh0IGxhYmVsXG4gICAgbmV3VGV4dExhYmVsID0gWy4uLnRleHRMYWJlbCwgREVGQVVMVF9URVhUX0xBQkVMXTtcbiAgfVxuXG4gIGlmIChpZHggPT09ICdhbGwnICYmIHByb3AgPT09ICdmaWVsZHMnKSB7XG4gICAgbmV3VGV4dExhYmVsID0gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKHZhbHVlLCB0ZXh0TGFiZWwpO1xuICB9IGVsc2Uge1xuICAgIG5ld1RleHRMYWJlbCA9IHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCBuZXdUZXh0TGFiZWwpO1xuICB9XG4gIC8vIHVwZGF0ZSB0ZXh0IGxhYmVsIHByb3AgYW5kIHZhbHVlXG4gIHJldHVybiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICBvbGRMYXllcixcbiAgICBuZXdDb25maWc6IHt0ZXh0TGFiZWw6IG5ld1RleHRMYWJlbH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxheWVyQ2xhc3NlcywgbGF5ZXIpIHtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihsYXllcik7XG4gIHJldHVybiB2YWxpZGF0ZUxheWVyV2l0aERhdGEoZGF0YXNldCwgbG9hZGVkTGF5ZXIsIGxheWVyQ2xhc3Nlcywge1xuICAgIGFsbG93RW1wdHlDb2x1bW46IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGNvbmZpZyBkYXRhSWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBvbGRMYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiB7XG4gICAgICBkYXRhSWQ6IHN0cmluZztcbiAgICB9O1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdDb25maWc7XG5cbiAgaWYgKCFvbGRMYXllciB8fCAhc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWR9KTtcbiAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBsYXllciBpcyBuZXcgKHR5cGU6IG51bGwgYW5kIG5vIGNvbHVtbnMpIGJ1dCBpdCdzIG5vdCByZWFkeSB0byBiZSBzYXZlZFxuICBpZiAobmV3TGF5ZXIuaXNWYWxpZFRvU2F2ZSgpKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoXG4gICAgICBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgICAgbmV3TGF5ZXJcbiAgICApO1xuICAgIC8vIGlmIGNhbnQgdmFsaWRhdGUgaXQgd2l0aCBkYXRhIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBjaGVja2luZyBvbGRMYXllci50eXBlICE9PSBudWxsXG4gICAgICBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbb2xkTGF5ZXIudHlwZV0oe2RhdGFJZCwgaWQ6IG9sZExheWVyLmlkfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gdmFsaWRhdGVkO1xuICAgIH1cbiAgfVxuXG4gIG5ld0xheWVyID0gbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIGlzVmlzaWJsZTogb2xkTGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZVxuICB9KTtcblxuICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG5mdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpIHtcbiAgbGV0IG5ld0xheWVyID0gbGF5ZXI7XG4gIGlmICghT2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCkge1xuICAgIC8vIG5vIGRhdGEgaXMgbG9hZGVkXG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG4gIGlmICghbGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIC8vIHNldCBsYXllciBkYXRhSWRcbiAgICBuZXdMYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWQ6IE9iamVjdC5rZXlzKGRhdGFzZXRzKVswXX0pO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tuZXdMYXllci5jb25maWcuZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLy8gZmluZCBkZWZhdXQgbGF5ZXIgcHJvcHNcbiAgY29uc3QgcmVzdWx0ID1cbiAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBsYXllckNsYXNzZXNbbmV3TGF5ZXIudHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIFtdKVxuICAgICAgOiB7cHJvcHM6IFtdfTtcblxuICAvLyBhbiBhcnJheSBvZiBwb3NzaWJsZSBwcm9wcywgdXNlIDFzdCBvbmVcbiAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG5cbiAgaWYgKHByb3BzLmxlbmd0aCkge1xuICAgIG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1tsYXllci50eXBlXSh7XG4gICAgICAuLi5wcm9wc1swXSxcbiAgICAgIGxhYmVsOiBuZXdMYXllci5jb25maWcubGFiZWwsXG4gICAgICBkYXRhSWQ6IG5ld0xheWVyLmNvbmZpZy5kYXRhSWQsXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogbmV3TGF5ZXIuY29uZmlnLmlzQ29uZmlnQWN0aXZlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHlwZW9mIG5ld0xheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbmV3TGF5ZXI7XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG4vKipcbiAqIFVwZGF0ZSBsYXllciB0eXBlLiBQcmV2aWV3cyBsYXllciBjb25maWcgd2lsbCBiZSBjb3BpZWQgaWYgYXBwbGljYWJsZS5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdUeXBlfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBvbGRJZCA9IG9sZExheWVyLmlkO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkSWQpO1xuXG4gIGlmICghc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKSB7XG4gICAgQ29uc29sZS5lcnJvcihgJHtuZXdUeXBlfSBpcyBub3QgYSB2YWxpZCBsYXllciB0eXBlYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0oe1xuICAgIC8vIGtlZXAgb2xkIGxheWVyIGxhYmxlIGFuZCBpc0NvbmZpZ0FjdGl2ZVxuICAgIGxhYmVsOiBvbGRMYXllci5jb25maWcubGFiZWwsXG4gICAgaXNDb25maWdBY3RpdmU6IG9sZExheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZVxuICB9KTtcblxuICBpZiAoIW9sZExheWVyLnR5cGUpIHtcbiAgICAvLyBpZiBzZXR0aW5nIGxheWVyIHR5cGUgb24gYW4gZW1wdHkgbGF5ZXJcbiAgICBuZXdMYXllciA9IHNldEluaXRpYWxMYXllckNvbmZpZyhuZXdMYXllciwgc3RhdGUuZGF0YXNldHMsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZ2V0IGEgbWludCBsYXllciwgd2l0aCBuZXcgaWQgYW5kIHR5cGVcbiAgICAvLyBiZWNhdXNlIGRlY2suZ2wgdXNlcyBpZCB0byBtYXRjaCBiZXR3ZWVuIG5ldyBhbmQgb2xkIGxheWVyLlxuICAgIC8vIElmIHR5cGUgaGFzIGNoYW5nZWQgYnV0IGlkIGlzIHRoZSBzYW1lLCBpdCB3aWxsIGJyZWFrXG4gICAgbmV3TGF5ZXIuYXNzaWduQ29uZmlnVG9MYXllcihvbGRMYXllci5jb25maWcsIG9sZExheWVyLnZpc0NvbmZpZ1NldHRpbmdzKTtcbiAgICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIH1cblxuICBjb25zdCB7Y2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChob3ZlckluZm8pID8gdW5kZWZpbmVkIDogaG92ZXJJbmZvXG4gIH07XG5cbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBuZXdTdGF0ZSk7XG4gIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCB8fCBvbGRMYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQpIHtcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyB1cGRhdGUgc3BsaXRNYXAgbGF5ZXIgaWRcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBuZXdTdGF0ZS5zcGxpdE1hcHMubWFwKHNldHRpbmdzID0+IHtcbiAgICAgICAgY29uc3Qge1tvbGRJZF06IG9sZExheWVyTWFwLCAuLi5vdGhlckxheWVyc30gPSBzZXR0aW5ncy5sYXllcnM7XG4gICAgICAgIHJldHVybiBvbGRJZCBpbiBzZXR0aW5ncy5sYXllcnNcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAgIC4uLm90aGVyTGF5ZXJzLFxuICAgICAgICAgICAgICAgIFtsYXllci5pZF06IG9sZExheWVyTWFwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHNldHRpbmdzO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciB2aXN1YWwgY2hhbm5lbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tvbGRMYXllci5jb25maWcuZGF0YUlkXTtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZyk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpO1xuXG4gIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYHZpc0NvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld1Zpc0NvbmZpZyk7XG4gIGNvbnN0IG5ld1Zpc0NvbmZpZyA9IHtcbiAgICAuLi5vbGRMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIC4uLmFjdGlvbi5uZXdWaXNDb25maWdcbiAgfTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHt2aXNDb25maWc6IG5ld1Zpc0NvbmZpZ30pO1xuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gc3RhdGUubGF5ZXJEYXRhW2lkeF07XG4gICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXI6IG5ld0xheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIGFjdGlvbik7XG59XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBhbmltYXRpb24gd2luZG93XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoZiA9PlxuICAgICAgZi5pZCA9PT0gaWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgYW5pbWF0aW9uV2luZG93XG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59XG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2lkeCwgcHJvcCwgdmFsdWUsIHZhbHVlSW5kZXggPSAwfSA9IGFjdGlvbjtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVycy4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdGaWx0ZXIgPSBzZXQoW3Byb3BdLCB2YWx1ZSwgb2xkRmlsdGVyKTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG5cbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdGaWx0ZXI7XG5cbiAgLy8gRW5zdXJpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBsZXQgZGF0YXNldElkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICBzd2l0Y2ggKHByb3ApIHtcbiAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBpZiB3ZSB1cGRhdGUgZGF0YUlkLCB3ZSBuZWVkIHRvIGNvbnNpZGVyIHR3byBjYXNlczpcbiAgICAvLyAxLiBkYXRhSWQgaXMgZW1wdHk6IGNyZWF0ZSBhIGRlZmF1bHQgZmlsdGVyXG4gICAgLy8gMi4gQWRkIGEgbmV3IGRhdGFzZXQgaWRcbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLmRhdGFJZDpcbiAgICAgIC8vIGlmIHRyeWluZyB0byB1cGRhdGUgZmlsdGVyIGRhdGFJZC4gY3JlYXRlIGFuIGVtcHR5IG5ldyBmaWx0ZXJcbiAgICAgIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlckRhdGFJZChkYXRhSWQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLm5hbWU6XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gbmV3RmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIG5ld0ZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YXNldElkXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogZmFsc2V9XG4gICAgICApO1xuICAgICAgaWYgKCF1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgbmV3RmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcblxuICAgICAgaWYgKG5ld0ZpbHRlci5ncHUpIHtcbiAgICAgICAgbmV3RmlsdGVyID0gc2V0RmlsdGVyR3B1TW9kZShuZXdGaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICBuZXdGaWx0ZXIgPSBhc3NpZ25HcHVDaGFubmVsKG5ld0ZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG5cbiAgICAgIC8vIG9ubHkgZmlsdGVyIHRoZSBjdXJyZW50IGRhdGFzZXRcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMubGF5ZXJJZDpcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIG9ubHkgZGF0YXNldElkL3MgaWYgd2UgaGF2ZSBhZGRlZC9yZW1vdmVkIGxheWVyc1xuICAgICAgLy8gLSBjaGVjayBmb3IgbGF5ZXJJZCBjaGFuZ2VzIChYT1Igd29ya3MgYmVjYXVzZSBvZiBzdHJpbmcgdmFsdWVzKVxuICAgICAgLy8gaWYgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBsYXllcklkcywgZG9uJ3QgZG8gYW55IGZpbHRlcmluZ1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbGF5ZXJJZERpZmZlcmVuY2UgPSB4b3IobmV3RmlsdGVyLmxheWVySWQsIG9sZEZpbHRlci5sYXllcklkKTtcblxuICAgICAgY29uc3QgbGF5ZXJEYXRhSWRzID0gdW5pcShcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHMgPSBsYXllckRhdGFJZHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBuZXdGaWx0ZXIgZGF0YUlkc1xuICAgICAgY29uc3QgbmV3RGF0YUlkcyA9IHVuaXEoXG4gICAgICAgIG5ld0ZpbHRlci5sYXllcklkXG4gICAgICAgICAgLm1hcChsaWQgPT5cbiAgICAgICAgICAgIGdldChcbiAgICAgICAgICAgICAgc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsaWQpLFxuICAgICAgICAgICAgICBbJ2NvbmZpZycsICdkYXRhSWQnXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKGQgPT4gZClcbiAgICAgICk7XG5cbiAgICAgIG5ld0ZpbHRlciA9IHtcbiAgICAgICAgLi4ubmV3RmlsdGVyLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG5cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IGVubGFyZ2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi5lbmxhcmdlZCk7XG5cbiAgaWYgKGVubGFyZ2VkRmlsdGVyICYmIGVubGFyZ2VkRmlsdGVyLmlkICE9PSBuZXdGaWx0ZXIuaWQpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZW5sYXJnZWQgZmlsdGVyXG4gICAgbmV3RmlsdGVyLmVubGFyZ2VkID0gZmFsc2U7XG4gIH1cblxuICAvLyBzYXZlIG5ldyBmaWx0ZXJzIHRvIG5ld1N0YXRlXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIG5ld0ZpbHRlciwgbmV3U3RhdGUpO1xuXG4gIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgc2V0dGluZyBhIHByb3AgdGhhdCBvbmx5IHJlcXVpcmVzIHRvIGZpbHRlciB0aGUgY3VycmVudFxuICAvLyBkYXRhc2V0IHdlIHdpbGwgcGFzcyBvbmx5IHRoZSBjdXJyZW50IGRhdGFzZXQgdG8gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyBhbmRcbiAgLy8gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhIG90aGVyd2lzZSB3ZSBwYXNzIHRoZSBhbGwgbGlzdCBvZiBkYXRhc2V0cyBhcyBkZWZpbmVkIGluIGRhdGFJZFxuICBjb25zdCBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBMSU1JVEVEX0ZJTFRFUl9FRkZFQ1RfUFJPUFNbcHJvcF1cbiAgICA/IFtkYXRhc2V0SWRzW3ZhbHVlSW5kZXhdXVxuICAgIDogZGF0YXNldElkcztcblxuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0SWRzVG9GaWx0ZXIsXG4gICAgbmV3U3RhdGUuZGF0YXNldHMsXG4gICAgbmV3U3RhdGUuZmlsdGVycyxcbiAgICBuZXdTdGF0ZS5sYXllcnNcbiAgKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgLy8gZGF0YUlkIGlzIGFuIGFycmF5XG4gIC8vIHBhc3Mgb25seSB0aGUgZGF0YXNldCB3ZSBuZWVkIHRvIHVwZGF0ZVxuICBuZXdTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YXNldElkc1RvRmlsdGVyLCBuZXdGaWx0ZXIpO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4ID0gMH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBsZXQgbmV3RmlsdGVyID0gey4uLnN0YXRlLmZpbHRlcnNbaWR4XSwgLi4ubmV3UHJvcH07XG4gIGNvbnN0IHByb3AgPSBPYmplY3Qua2V5cyhuZXdQcm9wKVswXTtcbiAgaWYgKHByb3AgPT09ICd5QXhpcycpIHtcbiAgICBjb25zdCBwbG90VHlwZSA9IGdldERlZmF1bHRGaWx0ZXJQbG90VHlwZShuZXdGaWx0ZXIpO1xuICAgIC8vIFRPRE86IHBsb3QgaXMgbm90IHN1cHBvcnRlZCBpbiBtdWx0aSBkYXRhc2V0IGZpbHRlciBmb3Igbm93XG4gICAgaWYgKHBsb3RUeXBlKSB7XG4gICAgICBuZXdGaWx0ZXIgPSB7XG4gICAgICAgIC4uLm5ld0ZpbHRlcixcbiAgICAgICAgLi4uZ2V0RmlsdGVyUGxvdCh7Li4ubmV3RmlsdGVyLCBwbG90VHlwZX0sIHN0YXRlLmRhdGFzZXRzW25ld0ZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF1dKSxcbiAgICAgICAgcGxvdFR5cGVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKGFjdGlvbi5kYXRhSWQpXVxuICAgICAgfTtcblxuLyoqXG4gKiBTZXQgbGF5ZXIgY29sb3IgcGFsZXR0ZSB1aSBzdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29sZExheWVyLCBwcm9wLCBuZXdDb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBvbGRWaXhDb25maWcgPSBvbGRMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpO1xuICBjb25zdCBuZXdWaXNDb25maWcgPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBpZiAob2xkVml4Q29uZmlnICE9PSBuZXdWaXNDb25maWcpIHtcbiAgICByZXR1cm4gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgICBvbGRMYXllcixcbiAgICAgIG5ld1Zpc0NvbmZpZzoge1xuICAgICAgICBbcHJvcF06IG5ld1Zpc0NvbmZpZ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKGwgPT4gKGwuaWQgPT09IG9sZExheWVyLmlkID8gbmV3TGF5ZXIgOiBsKSlcbiAgfTtcbn07XG5cbi8qKlxuICogU3RhcnQgYW5kIGVuZCBmaWx0ZXIgYW5pbWF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIGlzQW5pbWF0aW5nOiAhZi5pc0FuaW1hdGluZ30gOiBmKSlcbn0pO1xuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGlzQW5pbWF0aW5nOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmlzQW5pbWF0aW5nXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhpZGUgYW5kIHNob3cgbGF5ZXIgYW5pbWF0aW9uIGNvbnRyb2xcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaGlkZUNvbnRyb2w6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaGlkZUNvbnRyb2xcbiAgfVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIGZpbHRlciBhbmltYXRpb24gc3BlZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIHNwZWVkOiBhY3Rpb24uc3BlZWR9IDogZikpXG59KTtcblxuLyoqXG4gKiBSZXNldCBhbmltYXRpb24gY29uZmlnIGN1cnJlbnQgdGltZSB0byBhIHNwZWNpZmllZCB2YWx1ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHt2YWx1ZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGN1cnJlbnRUaW1lOiB2YWx1ZVxuICB9XG59KTtcblxuLyoqXG4gKiBVcGRhdGUgYW5pbWF0aW9uIHNwZWVkIHdpdGggdGhlIHZlcnRpY2FsIHNwZWVkIHNsaWRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7c3BlZWR9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHNwZWVkXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTaG93IGxhcmdlciB0aW1lIGZpbHRlciBhdCBib3R0b20gZm9yIHRpbWUgcGxheWJhY2sgKGFwcGx5IHRvIHRpbWUgZmlsdGVyIG9ubHkpXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZW5sYXJnZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuRW5sYXJnZUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT5cbiAgICAgIGkgPT09IGFjdGlvbi5pZHhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgZW5sYXJnZWQ6ICFmLmVubGFyZ2VkXG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgZmlsdGVyIGZlYXR1cmUgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbYWN0aW9uLmlkeF07XG4gIGNvbnN0IGlzVmlzaWJsZSA9IGdldChmaWx0ZXIsIFsndmFsdWUnLCAncHJvcGVydGllcycsICdpc1Zpc2libGUnXSk7XG4gIGNvbnN0IG5ld0ZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgdmFsdWU6IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZpbHRlci52YWx1ZSwgZmlsdGVyLmlkLCB7XG4gICAgICBpc1Zpc2libGU6ICFpc1Zpc2libGVcbiAgICB9KVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogT2JqZWN0LmFzc2lnbihbLi4uc3RhdGUuZmlsdGVyc10sIHtbYWN0aW9uLmlkeF06IG5ld0ZpbHRlcn0pXG4gIH07XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZCwgaWR9ID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGNvbnN0IG5ld0ZpbHRlcnMgPSBbXG4gICAgLi4uc3RhdGUuZmlsdGVycy5zbGljZSgwLCBpZHgpLFxuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoaWR4ICsgMSwgc3RhdGUuZmlsdGVycy5sZW5ndGgpXG4gIF07XG5cbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoZGF0YUlkLCBzdGF0ZS5kYXRhc2V0cywgbmV3RmlsdGVycywgc3RhdGUubGF5ZXJzKTtcbiAgY29uc3QgbmV3RWRpdG9yID1cbiAgICBnZXRGaWx0ZXJJZEluRmVhdHVyZShzdGF0ZS5lZGl0b3Iuc2VsZWN0ZWRGZWF0dXJlKSA9PT0gaWRcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICAgICAgfVxuICAgICAgOiBzdGF0ZS5lZGl0b3I7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycyddLCBuZXdGaWx0ZXJzLCBzdGF0ZSk7XG4gIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnXSwgZmlsdGVyZWREYXRhc2V0cywgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2VkaXRvciddLCBuZXdFZGl0b3IsIG5ld1N0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG5ld1N0YXRlLCBkYXRhSWQsIHVuZGVmaW5lZCk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZExheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgbGV0IG5ld0xheWVyO1xuICBsZXQgbmV3TGF5ZXJEYXRhO1xuICBpZiAoYWN0aW9uLmNvbmZpZykge1xuICAgIG5ld0xheWVyID0gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlLCBhY3Rpb24uY29uZmlnKTtcbiAgICBpZiAoIW5ld0xheWVyKSB7XG4gICAgICBDb25zb2xlLndhcm4oXG4gICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIGxheWVyIGZyb20gY29uZmlnLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBjb25maWcgaXMgbm90IGJlIGluIGNvcnJlY3QgZm9ybWF0JyxcbiAgICAgICAgYWN0aW9uLmNvbmZpZ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlKTtcbiAgICBuZXdMYXllciA9IHJlc3VsdC5sYXllcjtcbiAgICBuZXdMYXllckRhdGEgPSByZXN1bHQubGF5ZXJEYXRhO1xuICB9IGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBsYXllciB3aXRoIGEgc3BlY2lmaWMgZGF0YXNldCBvciBhIGRlZmF1bHQgb25lXG4gICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBhY3Rpb24uZGF0YXNldElkID8/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKVswXTtcbiAgICBuZXdMYXllciA9IG5ldyBMYXllcih7XG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGRhdGFJZDogZGVmYXVsdERhdGFzZXRcbiAgICB9KTtcbiAgICBuZXdMYXllckRhdGEgPSB7fTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogWy4uLnN0YXRlLmxheWVycywgbmV3TGF5ZXJdLFxuICAgIGxheWVyRGF0YTogWy4uLnN0YXRlLmxheWVyRGF0YSwgbmV3TGF5ZXJEYXRhXSxcbiAgICBsYXllck9yZGVyOiBbLi4uc3RhdGUubGF5ZXJPcmRlciwgc3RhdGUubGF5ZXJPcmRlci5sZW5ndGhdLFxuICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVyKVxuICB9O1xufTtcblxuLyoqXG4gKiByZW1vdmUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkeH06IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhLCBjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG4gIGNvbnN0IGxheWVyVG9SZW1vdmUgPSBzdGF0ZS5sYXllcnNbaWR4XTtcbiAgY29uc3QgbmV3TWFwcyA9IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyVG9SZW1vdmUpO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogWy4uLmxheWVycy5zbGljZSgwLCBpZHgpLCAuLi5sYXllcnMuc2xpY2UoaWR4ICsgMSwgbGF5ZXJzLmxlbmd0aCldLFxuICAgIGxheWVyRGF0YTogWy4uLmxheWVyRGF0YS5zbGljZSgwLCBpZHgpLCAuLi5sYXllckRhdGEuc2xpY2UoaWR4ICsgMSwgbGF5ZXJEYXRhLmxlbmd0aCldLFxuICAgIGxheWVyT3JkZXI6IHN0YXRlLmxheWVyT3JkZXIuZmlsdGVyKGkgPT4gaSAhPT0gaWR4KS5tYXAocGlkID0+IChwaWQgPiBpZHggPyBwaWQgLSAxIDogcGlkKSksXG4gICAgY2xpY2tlZDogbGF5ZXJUb1JlbW92ZS5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGhvdmVySW5mbykgPyB1bmRlZmluZWQgOiBob3ZlckluZm8sXG4gICAgc3BsaXRNYXBzOiBuZXdNYXBzXG4gICAgLy8gVE9ETzogdXBkYXRlIGZpbHRlcnMsIGNyZWF0ZSBoZWxwZXIgdG8gcmVtb3ZlIGxheWVyIGZvcm0gZmlsdGVyIChyZW1vdmUgbGF5ZXJpZCBhbmQgZGF0YWlkKSBpZiBtYXBwZWRcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbn07XG5cbi8qKlxuICogZHVwbGljYXRlIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHh9OiBWaXNTdGF0ZUFjdGlvbnMuRHVwbGljYXRlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsID0gc3RhdGUubGF5ZXJzW2lkeF07XG4gIGNvbnN0IG9yaWdpbmFsTGF5ZXJPcmRlcklkeCA9IHN0YXRlLmxheWVyT3JkZXIuZmluZEluZGV4KGkgPT4gaSA9PT0gaWR4KTtcblxuICBpZiAoIW9yaWdpbmFsKSB7XG4gICAgQ29uc29sZS53YXJuKGBsYXllci4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfWA7XG4gIGxldCBwb3N0Zml4ID0gMDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICB3aGlsZSAobGF5ZXJzLmZpbmQobCA9PiBsLmNvbmZpZy5sYWJlbCA9PT0gbmV3TGFiZWwpKSB7XG4gICAgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH0gJHsrK3Bvc3RmaXh9YDtcbiAgfVxuXG4gIC8vIGNvbGxlY3QgbGF5ZXIgY29uZmlnIGZyb20gb3JpZ2luYWxcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihvcmlnaW5hbCk7XG5cbiAgLy8gYXNzaWduIG5ldyBpZCBhbmQgbGFiZWwgdG8gY29waWVkIGxheWVyXG4gIGlmICghbG9hZGVkTGF5ZXI/LmNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsb2FkZWRMYXllci5jb25maWcubGFiZWwgPSBuZXdMYWJlbDtcbiAgbG9hZGVkTGF5ZXIuaWQgPSBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuXG4gIC8vIGFkZCBsYXllciB0byBzdGF0ZVxuICBsZXQgbmV4dFN0YXRlID0gYWRkTGF5ZXJVcGRhdGVyKHN0YXRlLCB7Y29uZmlnOiBsb2FkZWRMYXllcn0pO1xuXG4gIC8vIG5ldyBhZGRlZCBsYXllciBhcmUgYXQgdGhlIGVuZCwgbW92ZSBpdCB0byBiZSBvbiB0b3Agb2Ygb3JpZ2luYWwgbGF5ZXJcbiAgY29uc3QgbmV3TGF5ZXJPcmRlcklkeCA9IG5leHRTdGF0ZS5sYXllck9yZGVyLmxlbmd0aCAtIDE7XG4gIGNvbnN0IG5ld0xheWVyT3JkZXIgPSBhcnJheUluc2VydChcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlci5zbGljZSgwLCBuZXdMYXllck9yZGVySWR4KSxcbiAgICBvcmlnaW5hbExheWVyT3JkZXJJZHgsXG4gICAgbmV3TGF5ZXJPcmRlcklkeFxuICApO1xuXG4gIG5leHRTdGF0ZSA9IHtcbiAgICAuLi5uZXh0U3RhdGUsXG4gICAgbGF5ZXJPcmRlcjogbmV3TGF5ZXJPcmRlclxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogUmVvcmRlciBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlb3JkZXJMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllck9yZGVyOiBvcmRlclxufSk7XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVEYXRhc2V0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVEYXRhc2V0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIGRhdGFzZXRzOiB7W2RhdGFzZXRLZXldOiBkYXRhc2V0LCAuLi5uZXdEYXRhc2V0c31cbiAgfSA9IHN0YXRlO1xuICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbiAgY29uc3QgaW5kZXhlcyA9IGxheWVycy5yZWR1Y2UoKGxpc3RPZkluZGV4ZXMsIGxheWVyLCBpbmRleCkgPT4ge1xuICAgIGlmIChsYXllci5jb25maWcuZGF0YUlkID09PSBkYXRhc2V0S2V5KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBsaXN0T2ZJbmRleGVzLnB1c2goaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdE9mSW5kZXhlcztcbiAgfSwgW10pO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGNvbnN0IHtuZXdTdGF0ZX0gPSBpbmRleGVzLnJlZHVjZShcbiAgICAoe25ld1N0YXRlOiBjdXJyZW50U3RhdGUsIGluZGV4Q291bnRlcn0sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gaWR4IC0gaW5kZXhDb3VudGVyO1xuICAgICAgY3VycmVudFN0YXRlID0gcmVtb3ZlTGF5ZXJVcGRhdGVyKGN1cnJlbnRTdGF0ZSwge2lkeDogY3VycmVudEluZGV4fSk7XG4gICAgICBpbmRleENvdW50ZXIrKztcbiAgICAgIHJldHVybiB7bmV3U3RhdGU6IGN1cnJlbnRTdGF0ZSwgaW5kZXhDb3VudGVyfTtcbiAgICB9LFxuICAgIHtuZXdTdGF0ZTogey4uLnN0YXRlLCBkYXRhc2V0czogbmV3RGF0YXNldHN9LCBpbmRleENvdW50ZXI6IDB9XG4gICk7XG5cbiAgLy8gcmVtb3ZlIGZpbHRlcnNcbiAgY29uc3QgZmlsdGVycyA9IHN0YXRlLmZpbHRlcnMuZmlsdGVyKGZpbHRlciA9PiAhZmlsdGVyLmRhdGFJZC5pbmNsdWRlcyhkYXRhc2V0S2V5KSk7XG5cbiAgLy8gdXBkYXRlIGludGVyYWN0aW9uQ29uZmlnXG4gIGxldCB7aW50ZXJhY3Rpb25Db25maWd9ID0gc3RhdGU7XG4gIGNvbnN0IHt0b29sdGlwfSA9IGludGVyYWN0aW9uQ29uZmlnO1xuICBpZiAodG9vbHRpcCkge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdG9vbHRpcDtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIGNvbnN0IHtbZGF0YXNldEtleV06IGZpZWxkcywgLi4uZmllbGRzVG9TaG93fSA9IGNvbmZpZy5maWVsZHNUb1Nob3c7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7Li4udG9vbHRpcCwgY29uZmlnOiB7Li4uY29uZmlnLCBmaWVsZHNUb1Nob3d9fVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gey4uLm5ld1N0YXRlLCBmaWx0ZXJzLCBpbnRlcmFjdGlvbkNvbmZpZ307XG59O1xuXG4vKipcbiAqIHVwZGF0ZSBsYXllciBibGVuZGluZyBtb2RlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllckJsZW5kaW5nOiBhY3Rpb24ubW9kZVxufSk7XG5cbi8qKlxuICogRGlzcGxheSBkYXRhc2V0IHRhYmxlIGluIGEgbW9kYWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RGF0YXNldFRhYmxlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TaG93RGF0YXNldFRhYmxlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRpbmdEYXRhc2V0OiBhY3Rpb24uZGF0YUlkXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBjdXN0b20gY29sb3IgZm9yIGRhdGFzZXRzIGFuZCBsYXllcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0Q29sb3JVcGRhdGVyXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhSWQsIG5ld0NvbG9yfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuXG4gIGlmIChpc1JnYkNvbG9yKG5ld0NvbG9yKSkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICBleGlzdGluZy51cGRhdGVUYWJsZUNvbG9yKG5ld0NvbG9yKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLnN0YXRlLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB7fSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7dmVyc2lvbjogJyd9LCBvcHRpb25zID0ge319XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIWNvbmZpZy52aXNTdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtrZWVwRXhpc3RpbmdDb25maWd9ID0gb3B0aW9ucztcblxuICAvLyByZXNldCBjb25maWcgaWYga2VlcEV4aXN0aW5nQ29uZmlnIGlzIGZhbHN5XG4gIGxldCBtZXJnZWRTdGF0ZSA9ICFrZWVwRXhpc3RpbmdDb25maWcgPyByZXNldE1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUpIDogc3RhdGU7XG4gIGZvciAoY29uc3QgbWVyZ2VyIG9mIHN0YXRlLm1lcmdlcnMpIHtcbiAgICBpZiAoaXNWYWxpZE1lcmdlcihtZXJnZXIpICYmIGNvbmZpZy52aXNTdGF0ZVttZXJnZXIucHJvcF0pIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKG1lcmdlZFN0YXRlLCBjb25maWcudmlzU3RhdGVbbWVyZ2VyLnByb3BdLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkU3RhdGU7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgaG92ZXIgZXZlbnQgd2l0aCBob3ZlcmVkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVySG92ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJIb3ZlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBob3ZlckluZm86IHtcbiAgICAvLyBkZWNrLmdsIGluZm8gaXMgbXV0YWJsZVxuICAgIC4uLmFjdGlvbi5pbmZvXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25NYXBDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkOiBudWxsXG4gIH07XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgbWFwIG1vdmUgZXZlbnRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtb3VzZU1vdmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtldnR9OiBWaXNTdGF0ZUFjdGlvbnMuT25Nb3VzZU1vdmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGlmIChPYmplY3QudmFsdWVzKHN0YXRlLmludGVyYWN0aW9uQ29uZmlnKS5zb21lKGNvbmZpZyA9PiBjb25maWcuZW5hYmxlZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBtb3VzZVBvczoge1xuICAgICAgICAuLi5zdGF0ZS5tb3VzZVBvcyxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LnBvaW50KSA/IHttb3VzZVBvc2l0aW9uOiBbLi4uZXZ0LnBvaW50XX0gOiB7fSksXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2dC5sbmdMYXQpID8ge2Nvb3JkaW5hdGU6IFsuLi5ldnQubG5nTGF0XX0gOiB7fSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufTtcbi8qKlxuICogVG9nZ2xlIHZpc2liaWxpdHkgb2YgYSBsYXllciBmb3IgYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICBzdGF0ZS5zcGxpdE1hcHMgJiYgc3RhdGUuc3BsaXRNYXBzLmxlbmd0aCA9PT0gMFxuICAgID8ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgLy8gbWF5YmUgd2Ugc2hvdWxkIHVzZSBhbiBhcnJheSB0byBzdG9yZSBzdGF0ZSBmb3IgYSBzaW5nbGUgbWFwIGFzIHdlbGxcbiAgICAgICAgLy8gaWYgY3VycmVudCBtYXBzIGxlbmd0aCBpcyBlcXVhbCB0byAwIGl0IG1lYW5zIHRoYXQgd2UgYXJlIGFib3V0IHRvIHNwbGl0IHRoZSB2aWV3XG4gICAgICAgIHNwbGl0TWFwczogY29tcHV0ZVNwbGl0TWFwTGF5ZXJzKHN0YXRlLmxheWVycylcbiAgICAgIH1cbiAgICA6IGNsb3NlU3BlY2lmaWNNYXBBdEluZGV4KHN0YXRlLCBhY3Rpb24pO1xuXG4vKipcbiAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGEgbGF5ZXIgaW4gYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21hcEluZGV4LCBsYXllcklkfTogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7c3BsaXRNYXBzfSA9IHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBzcGxpdE1hcHMubWFwKChzbSwgaSkgPT5cbiAgICAgIGkgPT09IG1hcEluZGV4XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BsaXRNYXBzW2ldLFxuICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXS5sYXllcnMsXG4gICAgICAgICAgICAgIC8vIGlmIGxheWVySWQgbm90IGluIGxheWVycywgc2V0IGl0IHRvIHZpc2libGVcbiAgICAgICAgICAgICAgW2xheWVySWRdOiAhc3BsaXRNYXBzW2ldLmxheWVyc1tsYXllcklkXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiBzbVxuICAgIClcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cyAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG5cbiAgY29uc3QgbmV3RGF0YUVudHJpZXMgPSBkYXRhc2V0cy5yZWR1Y2UoXG4gICAgKGFjY3UsIHtpbmZvID0ge30sIC4uLnJlc3R9ID0ge30pID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKSB8fCB7fSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIGNvbnN0IGRhdGFFbXB0eSA9IE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5sZW5ndGggPCAxO1xuXG4gIC8vIGFwcGx5IGNvbmZpZyBpZiBwYXNzZWQgZnJvbSBhY3Rpb25cbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IGNvbmZpZ1xuICAgID8gcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgcGF5bG9hZDoge2NvbmZpZywgb3B0aW9uc31cbiAgICAgIH0pXG4gICAgOiBzdGF0ZTtcblxuICBsZXQgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4ucHJldmlvdXNTdGF0ZSxcbiAgICBkYXRhc2V0czoge1xuICAgICAgLi4ucHJldmlvdXNTdGF0ZS5kYXRhc2V0cyxcbiAgICAgIC4uLm5ld0RhdGFFbnRyaWVzXG4gICAgfVxuICB9O1xuXG4gIC8vIG1lcmdlIHN0YXRlIHdpdGggY29uZmlnIHRvIGJlIG1lcmdlZFxuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBtZXJnZWRTdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBtZXJnZXIudG9NZXJnZVByb3AgJiYgbWVyZ2VkU3RhdGVbbWVyZ2VyLnRvTWVyZ2VQcm9wXSkge1xuICAgICAgY29uc3QgdG9NZXJnZSA9IG1lcmdlZFN0YXRlW21lcmdlci50b01lcmdlUHJvcF07XG4gICAgICBtZXJnZWRTdGF0ZVttZXJnZXIudG9NZXJnZVByb3BdID0gSU5JVElBTF9WSVNfU1RBVEVbbWVyZ2VyLnRvTWVyZ2VQcm9wXTtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKG1lcmdlZFN0YXRlLCB0b01lcmdlKTtcbiAgICB9XG4gIH1cblxuICBsZXQgbmV3TGF5ZXJzID0gIWRhdGFFbXB0eVxuICAgID8gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBsLmNvbmZpZy5kYXRhSWQgaW4gbmV3RGF0YUVudHJpZXMpXG4gICAgOiBbXTtcblxuICBpZiAoIW5ld0xheWVycy5sZW5ndGggJiYgKG9wdGlvbnMgfHwge30pLmF1dG9DcmVhdGVMYXllcnMgIT09IGZhbHNlKSB7XG4gICAgLy8gbm8gbGF5ZXIgbWVyZ2VkLCBmaW5kIGRlZmF1bHRzXG4gICAgY29uc3QgcmVzdWx0ID0gYWRkRGVmYXVsdExheWVycyhtZXJnZWRTdGF0ZSwgbmV3RGF0YUVudHJpZXMpO1xuICAgIG1lcmdlZFN0YXRlID0gcmVzdWx0LnN0YXRlO1xuICAgIG5ld0xheWVycyA9IHJlc3VsdC5uZXdMYXllcnM7XG4gIH1cblxuICBpZiAobWVyZ2VkU3RhdGUuc3BsaXRNYXBzLmxlbmd0aCkge1xuICAgIC8vIGlmIG1hcCBpcyBzcGxpdCwgYWRkIG5ldyBsYXllcnMgdG8gc3BsaXRNYXBzXG4gICAgbmV3TGF5ZXJzID0gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihcbiAgICAgIGwgPT4gbC5jb25maWcuZGF0YUlkICYmIGwuY29uZmlnLmRhdGFJZCBpbiBuZXdEYXRhRW50cmllc1xuICAgICk7XG4gICAgbWVyZ2VkU3RhdGUgPSB7XG4gICAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMsIG5ld0xheWVycylcbiAgICB9O1xuICB9XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5mb3JFYWNoKGRhdGFJZCA9PiB7XG4gICAgY29uc3QgdG9vbHRpcEZpZWxkcyA9IG1lcmdlZFN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEoXG4gICAgbWVyZ2VkU3RhdGUsXG4gICAgZGF0YUVtcHR5ID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpIDogT2JqZWN0LmtleXMobmV3RGF0YUVudHJpZXMpLFxuICAgIHVuZGVmaW5lZFxuICApO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlZFN0YXRlO1xufTtcbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBSZW5hbWUgYW4gZXhpc3RpbmcgZGF0YXNldCBpbiBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRGF0YXNldFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVuYW1lRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2RhdGFJZCwgbGFiZWx9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG4gIGNvbnN0IGV4aXN0aW5nID0gZGF0YXNldHNbZGF0YUlkXTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBjb25zdCBuZXdEYXRhc2V0ID0gY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB7bGFiZWx9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBkYXRhc2V0czoge1xuICAgICAgICAuLi5kYXRhc2V0cyxcbiAgICAgICAgW2RhdGFJZF06IG5ld0RhdGFzZXRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gTm8tb3AgaWYgdGhlIGRhdGFzZXQgZG9lc24ndCBleGlzdFxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogV2hlbiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzcGVjaWZpYyBtYXAgY2xvc2luZyBpY29uXG4gKiB0aGUgYXBwbGljYXRpb24gd2lsbCBjbG9zZSB0aGUgc2VsZWN0ZWQgbWFwXG4gKiBhbmQgd2lsbCBtZXJnZSB0aGUgcmVtYWluaW5nIG9uZSB3aXRoIHRoZSBnbG9iYWwgc3RhdGVcbiAqIFRPRE86IGkgdGhpbmsgaW4gdGhlIGZ1dHVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgY2FsbGVkIG1lcmdlIG1hcCBsYXllcnMgd2l0aCBnbG9iYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBgdmlzU3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIGFjdGlvblxuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgLy8gcmV0cmlldmUgbGF5ZXJzIG1ldGEgZGF0YSBmcm9tIHRoZSByZW1haW5pbmcgbWFwIHRoYXQgd2UgbmVlZCB0byBrZWVwXG4gIGNvbnN0IGluZGV4VG9SZXRyaWV2ZSA9IDEgLSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3QgbWFwTGF5ZXJzID0gc3RhdGUuc3BsaXRNYXBzW2luZGV4VG9SZXRyaWV2ZV0/LmxheWVycztcbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcblxuICAvLyB1cGRhdGUgbGF5ZXIgdmlzaWJpbGl0eVxuICBjb25zdCBuZXdMYXllcnMgPSBsYXllcnMubWFwKGxheWVyID0+XG4gICAgbWFwTGF5ZXJzICYmICFtYXBMYXllcnNbbGF5ZXIuaWRdICYmIGxheWVyLmNvbmZpZy5pc1Zpc2libGVcbiAgICAgID8gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICAgIC8vIGlmIGxheWVyLmlkIGlzIG5vdCBpbiBtYXBMYXllcnMsIGl0IHNob3VsZCBiZSBpblZpc2libGVcbiAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICA6IGxheWVyXG4gICk7XG5cbiAgLy8gZGVsZXRlIG1hcFxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIHNwbGl0TWFwczogW11cbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGZpbGUgbG9hZGluZyBkaXNwYXRjaCBgYWRkRGF0YVRvTWFwYCBpZiBzdWNjZWVkLCBvciBgbG9hZEZpbGVzRXJyYCBpZiBmYWlsZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2ZpbGVzLCBvbkZpbmlzaCA9IGxvYWRGaWxlc1N1Y2Nlc3N9ID0gYWN0aW9uO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVMb2FkaW5nUHJvZ3Jlc3MgPSBBcnJheS5mcm9tKGZpbGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGYsIGkpID0+IG1lcmdlXyhpbml0aWFsRmlsZUxvYWRpbmdQcm9ncmVzcyhmLCBpKSkoYWNjdSksXG4gICAge31cbiAgKTtcblxuICBjb25zdCBmaWxlTG9hZGluZyA9IHtcbiAgICBmaWxlQ2FjaGU6IFtdLFxuICAgIGZpbGVzVG9Mb2FkOiBmaWxlcyxcbiAgICBvbkZpbmlzaFxuICB9O1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IG1lcmdlXyh7ZmlsZUxvYWRpbmdQcm9ncmVzcywgZmlsZUxvYWRpbmd9KShzdGF0ZSk7XG5cbiAgcmV0dXJuIGxvYWROZXh0RmlsZVVwZGF0ZXIobmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogU3VjZXNzZnVsbHkgbG9hZGVkIG9uZSBmaWxlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlU3RlcFN1Y2Nlc3NVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlU3RlcFN1Y2Nlc3NBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZU5hbWUsIGZpbGVDYWNoZX0gPSBhY3Rpb247XG4gIGNvbnN0IHtmaWxlc1RvTG9hZCwgb25GaW5pc2h9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdEb25lJ31cbiAgfSk7XG5cbiAgLy8gc2F2ZSBwcm9jZXNzZWQgZmlsZSB0byBmaWxlQ2FjaGVcbiAgY29uc3Qgc3RhdGVXaXRoQ2FjaGUgPSBwaWNrXygnZmlsZUxvYWRpbmcnKShtZXJnZV8oe2ZpbGVDYWNoZX0pKShzdGF0ZVdpdGhQcm9ncmVzcyk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aENhY2hlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn1cblxuLy8gd2l0aFRhc2s8VD4oc3RhdGU6IFQsIHRhc2s6IGFueSk6IFRcblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWROZXh0RmlsZVVwZGF0ZXIoc3RhdGU6IFZpc1N0YXRlKTogVmlzU3RhdGUge1xuICBpZiAoIXN0YXRlLmZpbGVMb2FkaW5nKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHtmaWxlc1RvTG9hZH0gPSBzdGF0ZS5maWxlTG9hZGluZztcbiAgY29uc3QgW2ZpbGUsIC4uLnJlbWFpbmluZ0ZpbGVzVG9Mb2FkXSA9IGZpbGVzVG9Mb2FkO1xuXG4gIC8vIHNhdmUgZmlsZXNUb0xvYWQgdG8gc3RhdGVcbiAgY29uc3QgbmV4dFN0YXRlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlc1RvTG9hZDogcmVtYWluaW5nRmlsZXNUb0xvYWR9KSkoc3RhdGUpO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIobmV4dFN0YXRlLCB7XG4gICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDAsIG1lc3NhZ2U6ICdsb2FkaW5nLi4uJ31cbiAgfSk7XG5cbiAgY29uc3Qge2xvYWRlcnMsIGxvYWRPcHRpb25zfSA9IHN0YXRlO1xuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgbWFrZUxvYWRGaWxlVGFzayhcbiAgICAgIGZpbGUsXG4gICAgICBuZXh0U3RhdGUuZmlsZUxvYWRpbmcgJiYgbmV4dFN0YXRlLmZpbGVMb2FkaW5nLmZpbGVDYWNoZSxcbiAgICAgIGxvYWRlcnMsXG4gICAgICBsb2FkT3B0aW9uc1xuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMb2FkRmlsZVRhc2soZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzOiBMb2FkZXJbXSA9IFtdLCBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBMT0FEX0ZJTEVfVEFTSyh7ZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzLCBsb2FkT3B0aW9uc30pLmJpbWFwKFxuICAgIC8vIHByZXR0aWVyIGlnbm9yZVxuICAgIC8vIHN1Y2Nlc3NcbiAgICBnZW4gPT5cbiAgICAgIG5leHRGaWxlQmF0Y2goe1xuICAgICAgICBnZW4sXG4gICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIG9uRmluaXNoOiByZXN1bHQgPT5cbiAgICAgICAgICBwcm9jZXNzRmlsZUNvbnRlbnQoe1xuICAgICAgICAgICAgY29udGVudDogcmVzdWx0LFxuICAgICAgICAgICAgZmlsZUNhY2hlXG4gICAgICAgICAgfSlcbiAgICAgIH0pLFxuXG4gICAgLy8gZXJyb3JcbiAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGUubmFtZSwgZXJyKVxuICApO1xufVxuXG4vKipcbiAqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Qcm9jZXNzRmlsZUNvbnRlbnRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb250ZW50LCBmaWxlQ2FjaGV9ID0gYWN0aW9uLnBheWxvYWQ7XG5cbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiB7cGVyY2VudDogMSwgbWVzc2FnZTogJ3Byb2Nlc3NpbmcuLi4nfVxuICB9KTtcblxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgUFJPQ0VTU19GSUxFX0RBVEEoe2NvbnRlbnQsIGZpbGVDYWNoZX0pLmJpbWFwKFxuICAgICAgcmVzdWx0ID0+IGxvYWRGaWxlU3RlcFN1Y2Nlc3Moe2ZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLCBmaWxlQ2FjaGU6IHJlc3VsdH0pLFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0Vycihjb250ZW50LmZpbGVOYW1lLCBlcnIpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQcm9ncmVzcyhwcmV2UHJvZ3Jlc3MgPSB7fSwgcHJvZ3Jlc3MpIHtcbiAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVjZWl2aW5nIHF1ZXJ5IG1ldGFkYXRhIG9yIG90aGVyIGNhc2VzIHdlIGRvbid0XG4gIC8vIGhhdmUgYW4gdXBkYXRlIGZvciB0aGUgdXNlci5cbiAgaWYgKCFwcm9ncmVzcyB8fCAhcHJvZ3Jlc3MucGVyY2VudCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyY2VudDogcHJvZ3Jlc3MucGVyY2VudFxuICB9O1xufVxuXG4vKipcbiAqIGdldHMgY2FsbGVkIHdpdGggcGF5bG9hZCA9IEFzeW5jR2VuZXJhdG9yPD8/Pz5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBuZXh0RmlsZUJhdGNoVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7XG4gICAgcGF5bG9hZDoge2dlbiwgZmlsZU5hbWUsIHByb2dyZXNzLCBhY2N1bXVsYXRlZCwgb25GaW5pc2h9XG4gIH06IFZpc1N0YXRlQWN0aW9ucy5OZXh0RmlsZUJhdGNoVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHBhcnNlUHJvZ3Jlc3Moc3RhdGUuZmlsZUxvYWRpbmdQcm9ncmVzc1tmaWxlTmFtZV0sIHByb2dyZXNzKVxuICB9KTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFVOV1JBUF9UQVNLKGdlbi5uZXh0KCkpLmJpbWFwKFxuICAgICAgKHt2YWx1ZSwgZG9uZX0pID0+IHtcbiAgICAgICAgcmV0dXJuIGRvbmVcbiAgICAgICAgICA/IG9uRmluaXNoKGFjY3VtdWxhdGVkKVxuICAgICAgICAgIDogbmV4dEZpbGVCYXRjaCh7XG4gICAgICAgICAgICAgIGdlbixcbiAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiB2YWx1ZS5wcm9ncmVzcyxcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZWQ6IHZhbHVlLFxuICAgICAgICAgICAgICBvbkZpbmlzaFxuICAgICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsb2FkaW5nIGZpbGUgZXJyb3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNFcnJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtlcnJvciwgZmlsZU5hbWV9OiBWaXNTdGF0ZUFjdGlvbnMuTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyB1cGRhdGUgdWkgd2l0aCBlcnJvciBtZXNzYWdlXG4gIENvbnNvbGUud2FybihlcnJvcik7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVzVG9Mb2FkLCBvbkZpbmlzaCwgZmlsZUNhY2hlfSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtlcnJvcn1cbiAgfSk7XG5cbiAgLy8ga2ljayBvZmYgbmV4dCBmaWxlIG9yIGZpbmlzaFxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgbmV4dFN0YXRlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogV2hlbiBzZWxlY3QgZGF0YXNldCBmb3IgZXhwb3J0LCBhcHBseSBjcHUgZmlsdGVyIHRvIHNlbGVjdGVkIGRhdGFzZXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUNQVUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZH06IFZpc1N0YXRlQWN0aW9ucy5BcHBseUNQVUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgLy8gYXBwbHkgY3B1RmlsdGVyXG4gIGNvbnN0IGRhdGFJZHMgPSB0b0FycmF5KGRhdGFJZCk7XG5cbiAgcmV0dXJuIGRhdGFJZHMucmVkdWNlKChhY2N1LCBpZCkgPT4gZmlsdGVyRGF0YXNldENQVShhY2N1LCBpZCksIHN0YXRlKTtcbn07XG5cbi8qKlxuICogVXNlciBpbnB1dCB0byB1cGRhdGUgdGhlIGluZm8gb2YgdGhlIG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hcEluZm9VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldE1hcEluZm9VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbWFwSW5mbzoge1xuICAgIC4uLnN0YXRlLm1hcEluZm8sXG4gICAgLi4uYWN0aW9uLmluZm9cbiAgfVxufSk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgQWxsIGxheWVyIGRvbWFpbiBhbmQgbGF5ZXIgZGF0YSBvZiBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdExheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBkYXRhc2V0czogRGF0YXNldHNcbik6IHtzdGF0ZTogVmlzU3RhdGU7IG5ld0xheWVyczogTGF5ZXJbXX0ge1xuICBjb25zdCBlbXB0eTogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBkZWZhdWx0TGF5ZXJzID0gT2JqZWN0LnZhbHVlcyhkYXRhc2V0cykucmVkdWNlKChhY2N1OiBMYXllcltdLCBkYXRhc2V0KSA9PiB7XG4gICAgY29uc3QgZm91bmRMYXllcnMgPSBmaW5kRGVmYXVsdExheWVyKGRhdGFzZXQsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gICAgcmV0dXJuIGZvdW5kTGF5ZXJzICYmIGZvdW5kTGF5ZXJzLmxlbmd0aCA/IGFjY3UuY29uY2F0KGZvdW5kTGF5ZXJzKSA6IGFjY3U7XG4gIH0sIGVtcHR5KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyczogWy4uLnN0YXRlLmxheWVycywgLi4uZGVmYXVsdExheWVyc10sXG4gICAgICBsYXllck9yZGVyOiBbXG4gICAgICAgIC8vIHB1dCBuZXcgbGF5ZXJzIG9uIHRvcCBvZiBvbGQgb25lc1xuICAgICAgICAuLi5kZWZhdWx0TGF5ZXJzLm1hcCgoXywgaSkgPT4gc3RhdGUubGF5ZXJzLmxlbmd0aCArIGkpLFxuICAgICAgICAuLi5zdGF0ZS5sYXllck9yZGVyXG4gICAgICBdXG4gICAgfSxcbiAgICBuZXdMYXllcnM6IGRlZmF1bHRMYXllcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBoZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBkZWZhdWx0IHRvb2x0aXBzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERlZmF1bHRUb29sdGlwcyhzdGF0ZSwgZGF0YXNldCkge1xuICBjb25zdCB0b29sdGlwRmllbGRzID0gZmluZEZpZWxkc1RvU2hvdyh7XG4gICAgLi4uZGF0YXNldCxcbiAgICBtYXhEZWZhdWx0VG9vbHRpcHM6IHN0YXRlLm1heERlZmF1bHRUb29sdGlwc1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAuLi50b29sdGlwRmllbGRzXG4gIH07XG5cbiAgcmV0dXJuIHNldChbJ2ludGVyYWN0aW9uQ29uZmlnJywgJ3Rvb2x0aXAnLCAnY29uZmlnJywgJ2ZpZWxkc1RvU2hvdyddLCBtZXJnZWQsIHN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzKGZpbGUsIGluZGV4KSB7XG4gIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8IGBVbnRpdGxlZCBGaWxlICR7aW5kZXh9YDtcbiAgcmV0dXJuIHtcbiAgICBbZmlsZU5hbWVdOiB7XG4gICAgICAvLyBwZXJjZW50IG9mIGN1cnJlbnQgZmlsZVxuICAgICAgcGVyY2VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgZmlsZU5hbWUsXG4gICAgICBlcnJvcjogbnVsbFxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7ZmlsZU5hbWUsIHByb2dyZXNzfSkge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBwaWNrXygnZmlsZUxvYWRpbmdQcm9ncmVzcycpKHBpY2tfKGZpbGVOYW1lKShtZXJnZV8ocHJvZ3Jlc3MpKSkoc3RhdGUpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIGxheWVyIGRvbWFpbnMgZm9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhSWRzID0gdHlwZW9mIGRhdGFJZCA9PT0gJ3N0cmluZycgPyBbZGF0YUlkXSA6IGRhdGFJZDtcbiAgY29uc3QgbmV3TGF5ZXJzOiBMYXllcltdID0gW107XG4gIGNvbnN0IG5ld0xheWVyRGF0YTogYW55W10gPSBbXTtcblxuICBzdGF0ZS5sYXllcnMuZm9yRWFjaCgob2xkTGF5ZXIsIGkpID0+IHtcbiAgICBpZiAob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCAmJiBkYXRhSWRzLmluY2x1ZGVzKG9sZExheWVyLmNvbmZpZy5kYXRhSWQpKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHJlY2FsY3VsYXRlIGxheWVyIGRvbWFpbiBpZiBmaWx0ZXIgaGFzIGZpeGVkIGRvbWFpblxuICAgICAgY29uc3QgbmV3TGF5ZXIgPVxuICAgICAgICB1cGRhdGVkRmlsdGVyICYmIHVwZGF0ZWRGaWx0ZXIuZml4ZWREb21haW5cbiAgICAgICAgICA/IG9sZExheWVyXG4gICAgICAgICAgOiBvbGRMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cywgdXBkYXRlZEZpbHRlcik7XG5cbiAgICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHN0YXRlLmxheWVyRGF0YVtpXSk7XG5cbiAgICAgIG5ld0xheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKGxheWVyRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVycy5wdXNoKG9sZExheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKHN0YXRlLmxheWVyRGF0YVtpXSk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllckRhdGE6IG5ld0xheWVyRGF0YVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTKTogUyB7XG4gIC8vIG1lcmdlIGFsbCBhbmltYXRhYmxlIGxheWVyIGRvbWFpbiBhbmQgdXBkYXRlIGdsb2JhbCBjb25maWdcbiAgY29uc3QgYW5pbWF0YWJsZUxheWVycyA9IHN0YXRlLmxheWVycy5maWx0ZXIoXG4gICAgbCA9PlxuICAgICAgbC5jb25maWcuaXNWaXNpYmxlICYmXG4gICAgICBsLmNvbmZpZy5hbmltYXRpb24gJiZcbiAgICAgIGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRyaXAtbGF5ZXItb25seVxuICAgICAgQXJyYXkuaXNBcnJheShsLmFuaW1hdGlvbkRvbWFpbilcbiAgKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb25zdCBtZXJnZWREb21haW46IFtudW1iZXIsIG51bWJlcl0gPSBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIpID0+IFtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHJpcC1sYXllci1vbmx5XG4gICAgICBNYXRoLm1pbihhY2N1WzBdLCBsYXllci5hbmltYXRpb25Eb21haW5bMF0pLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cmlwLWxheWVyLW9ubHlcbiAgICAgIE1hdGgubWF4KGFjY3VbMV0sIGxheWVyLmFuaW1hdGlvbkRvbWFpblsxXSlcbiAgICBdLFxuICAgIFtOdW1iZXIoSW5maW5pdHkpLCAtSW5maW5pdHldXG4gICk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGN1cnJlbnRUaW1lOiBpc0luUmFuZ2Uoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lLCBtZXJnZWREb21haW4pXG4gICAgICAgID8gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lXG4gICAgICAgIDogbWVyZ2VkRG9tYWluWzBdLFxuICAgICAgZG9tYWluOiBtZXJnZWREb21haW4sXG4gICAgICBkZWZhdWx0VGltZUZvcm1hdFxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZWRpdG9yXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0RWRpdG9yTW9kZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21vZGV9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RWRpdG9yTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBlZGl0b3I6IHtcbiAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgbW9kZSxcbiAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgfVxufSk7XG5cbi8vIGNvbnN0IGZlYXR1cmVUb0ZpbHRlclZhbHVlID0gKGZlYXR1cmUpID0+ICh7Li4uZmVhdHVyZSwgaWQ6IGZlYXR1cmUuaWR9KTtcbi8qKlxuICogVXBkYXRlIGVkaXRvciBmZWF0dXJlc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZlYXR1cmVzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZXMgPSBbXX06IFZpc1N0YXRlQWN0aW9ucy5TZXRGZWF0dXJlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbGFzdEZlYXR1cmUgPSBmZWF0dXJlcy5sZW5ndGggJiYgZmVhdHVyZXNbZmVhdHVyZXMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAvLyBvbmx5IHNhdmUgbm9uZSBmaWx0ZXIgZmVhdHVyZXMgdG8gZWRpdG9yXG4gICAgICBmZWF0dXJlczogZmVhdHVyZXMuZmlsdGVyKGYgPT4gIWdldEZpbHRlcklkSW5GZWF0dXJlKGYpKSxcbiAgICAgIG1vZGU6IGxhc3RGZWF0dXJlICYmIGxhc3RGZWF0dXJlLnByb3BlcnRpZXMuaXNDbG9zZWQgPyBFRElUT1JfTU9ERVMuRURJVCA6IHN0YXRlLmVkaXRvci5tb2RlXG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIGV4aXN0aW5nIGZlYXR1cmVcbiAgY29uc3Qge3NlbGVjdGVkRmVhdHVyZX0gPSBzdGF0ZS5lZGl0b3I7XG5cbiAgLy8gSWYgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZCB3ZSBjYW4gc2ltcGx5IHJldHVybiBzaW5jZSBubyBvcGVyYXRpb25zXG4gIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gVE9ETzogY2hlY2sgaWYgdGhlIGZlYXR1cmUgaGFzIGNoYW5nZWRcbiAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzLmZpbmQoZiA9PiBmLmlkID09PSBzZWxlY3RlZEZlYXR1cmUuaWQpO1xuXG4gIC8vIGlmIGZlYXR1cmUgaXMgcGFydCBvZiBhIGZpbHRlclxuICBjb25zdCBmaWx0ZXJJZCA9IGZlYXR1cmUgJiYgZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG4gIGlmIChmaWx0ZXJJZCAmJiBmZWF0dXJlKSB7XG4gICAgY29uc3QgZmVhdHVyZVZhbHVlID0gZmVhdHVyZVRvRmlsdGVyVmFsdWUoZmVhdHVyZSwgZmlsdGVySWQpO1xuICAgIGNvbnN0IGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGZpbCA9PiBmaWwuaWQgPT09IGZpbHRlcklkKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySWR4LFxuICAgICAgcHJvcDogJ3ZhbHVlJyxcbiAgICAgIHZhbHVlOiBmZWF0dXJlVmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZmVhdHVyZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZWRpdG9yOiB7XG4gICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogZmVhdHVyZVxuICB9XG59KTtcblxuLyoqXG4gKiBEZWxldGUgZXhpc3RpbmcgZmVhdHVyZSBmcm9tIGZpbHRlcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGZWF0dXJlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZX06IFZpc1N0YXRlQWN0aW9ucy5EZWxldGVGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWZlYXR1cmUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICAgIH1cbiAgfTtcblxuICBpZiAoZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSkpIHtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKTtcblxuICAgIHJldHVybiBmaWx0ZXJJZHggPiAtMSA/IHJlbW92ZUZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtpZHg6IGZpbHRlcklkeH0pIDogbmV3U3RhdGU7XG4gIH1cblxuICAvLyBtb2RpZnkgZWRpdG9yIG9iamVjdFxuICBjb25zdCBuZXdFZGl0b3IgPSB7XG4gICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IG5ld0VkaXRvclxuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBmZWF0dXJlIGFzIGxheWVyIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF5bG9hZDogVmlzU3RhdGVBY3Rpb25zLlNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2xheWVyLCBmZWF0dXJlfSA9IHBheWxvYWQ7XG4gIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG5cbiAgLy8gbGV0IG5ld0ZpbHRlciA9IG51bGw7XG4gIGxldCBmaWx0ZXJJZHg7XG4gIGxldCBuZXdMYXllcklkID0gW2xheWVyLmlkXTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIC8vIElmIHBvbHlnb24gZmlsdGVyIGFscmVhZHkgZXhpc3RzLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmIHRoZSBjdXJyZW50IGxheWVyIGlzIGFscmVhZHkgaW5jbHVkZWRcbiAgaWYgKGZpbHRlcklkKSB7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmaWx0ZXJJZCk7XG5cbiAgICBpZiAoIXN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSkge1xuICAgICAgLy8gd2hhdCBpZiBmaWx0ZXIgZG9lc24ndCBleGlzdD8uLi4gbm90IHBvc3NpYmxlLlxuICAgICAgLy8gYmVjYXVzZSBmZWF0dXJlcyBpbiB0aGUgZWRpdG9yIGlzIHBhc3NlZCBpbiBmcm9tIGZpbHRlcnMgYW5kIGVkaXRvcnMuXG4gICAgICAvLyBidXQgd2Ugd2lsbCBtb3ZlIHRoaXMgZmVhdHVyZSBiYWNrIHRvIGVkaXRvciBqdXN0IGluIGNhc2VcbiAgICAgIGNvbnN0IG5vbmVGaWx0ZXJGZWF0dXJlID0ge1xuICAgICAgICAuLi5mZWF0dXJlLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4uZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGZpbHRlcklkOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlZGl0b3I6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIG5vbmVGaWx0ZXJGZWF0dXJlXSxcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5vbmVGaWx0ZXJGZWF0dXJlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XTtcbiAgICBjb25zdCB7bGF5ZXJJZCA9IFtdfSA9IGZpbHRlcjtcbiAgICBjb25zdCBpc0xheWVySW5jbHVkZWQgPSBsYXllcklkLmluY2x1ZGVzKGxheWVyLmlkKTtcblxuICAgIG5ld0xheWVySWQgPSBpc0xheWVySW5jbHVkZWRcbiAgICAgID8gLy8gaWYgbGF5ZXIgaXMgaW5jbHVkZWQsIHJlbW92ZSBpdFxuICAgICAgICBsYXllcklkLmZpbHRlcihsID0+IGwgIT09IGxheWVyLmlkKVxuICAgICAgOiBbLi4ubGF5ZXJJZCwgbGF5ZXIuaWRdO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgY3JlYXRlIHRoZSBwb2x5Z29uIGZpbHRlciwgY3JlYXRlIGl0XG4gICAgY29uc3QgbmV3RmlsdGVyID0gZ2VuZXJhdGVQb2x5Z29uRmlsdGVyKFtdLCBmZWF0dXJlKTtcbiAgICBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmxlbmd0aDtcblxuICAgIC8vIGFkZCBmZWF0dXJlLCByZW1vdmUgZmVhdHVyZSBmcm9tIGVpZHRvclxuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbLi4uc3RhdGUuZmlsdGVycywgbmV3RmlsdGVyXSxcbiAgICAgIGVkaXRvcjoge1xuICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbmV3RmlsdGVyLnZhbHVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgcHJvcDogJ2xheWVySWQnLFxuICAgIHZhbHVlOiBuZXdMYXllcklkXG4gIH0pO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbiwgbW9kZX06IFZpc1N0YXRlQWN0aW9ucy5Tb3J0VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IHNvcnRNb2RlID0gbW9kZTtcbiAgaWYgKCFzb3J0TW9kZSkge1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gZ2V0KGRhdGFzZXQsIFsnc29ydENvbHVtbicsIGNvbHVtbl0pO1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzaG91bGQgYmUgZml4YWJsZSBpbiBhIFRTIGZpbGVcbiAgICBzb3J0TW9kZSA9IGN1cnJlbnRNb2RlXG4gICAgICA/IE9iamVjdC5rZXlzKFNPUlRfT1JERVIpLmZpbmQobSA9PiBtICE9PSBjdXJyZW50TW9kZSlcbiAgICAgIDogU09SVF9PUkRFUi5BU0NFTkRJTkc7XG4gIH1cblxuICBjb25zdCBzb3J0ZWQgPSBzb3J0RGF0YXNldEJ5Q29sdW1uKGRhdGFzZXQsIGNvbHVtbiwgc29ydE1vZGUpO1xuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBzb3J0ZWQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5QaW5UYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBuZXdEYXRhc2V0ID0gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQsIGNvbHVtbik7XG5cbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIENvcHkgY29sdW1uIGNvbnRlbnQgYXMgc3RyaW5nc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLkNvcHlUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0LmZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IHRleHQgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAubWFwKHJvdyA9PiBwYXJzZUZpZWxkVmFsdWUocm93LnZhbHVlQXQoZmllbGRJZHgpLCB0eXBlKSwgdHJ1ZSlcbiAgICAuam9pbignXFxuJyk7XG5cbiAgY29weSh0ZXh0KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7Y29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ0FjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB1cGRhdGVzID0gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpO1xuICByZXR1cm4gcGlja18oJ2FuaW1hdGlvbkNvbmZpZycpKG1lcmdlXyh1cGRhdGVzKSkoc3RhdGUpO1xufVxuIl19
3134
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsidmlzU3RhdGVVcGRhdGVycyIsImRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiaGlkZUNvbnRyb2wiLCJkdXJhdGlvbiIsIkRFRkFVTFRfRURJVE9SIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkRSQVdfUE9MWUdPTiIsImZlYXR1cmVzIiwic2VsZWN0ZWRGZWF0dXJlIiwidmlzaWJsZSIsIklOSVRJQUxfVklTX1NUQVRFIiwibWFwSW5mbyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJsYXllcnMiLCJsYXllckRhdGEiLCJsYXllclRvQmVNZXJnZWQiLCJsYXllck9yZGVyIiwiZmlsdGVycyIsImZpbHRlclRvQmVNZXJnZWQiLCJkYXRhc2V0cyIsImVkaXRpbmdEYXRhc2V0IiwidW5kZWZpbmVkIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiaW50ZXJhY3Rpb25Db25maWciLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJsYXllckJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiaG92ZXJJbmZvIiwiY2xpY2tlZCIsIm1vdXNlUG9zIiwibWF4RGVmYXVsdFRvb2x0aXBzIiwiTUFYX0RFRkFVTFRfVE9PTFRJUFMiLCJzcGxpdE1hcHMiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwibGF5ZXIiLCJpZHgiLCJtYXAiLCJseXIiLCJpIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImxlbmd0aCIsImlzVmlzaWJsZSIsImFuaW1hdGlvbiIsInVwZGF0ZUFuaW1hdGlvbkRvbWFpbiIsInBpY2tDaGFuZ2VkUHJvcHMiLCJwcmV2IiwibmV4dCIsImNoYW5nZWRQcm9wcyIsInBpY2tQcm9wc09mIiwib2JqIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsIlZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMiLCJhcHBseUxheWVyQ29uZmlnVXBkYXRlciIsImFjdGlvbiIsIm9sZExheWVySWQiLCJuZXdMYXllckNvbmZpZyIsImxheWVySW5kZXgiLCJuZXdQYXJzZWRMYXllciIsIm9sZExheWVyIiwiZmluZCIsImwiLCJkYXRhc2V0IiwiZGF0YUlkIiwibmV3TGF5ZXIiLCJuZXh0U3RhdGUiLCJ0eXBlIiwib2xkTGF5ZXJJbmRleCIsImZpbmRJbmRleCIsImxheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJuZXdMYXllcklkIiwic2VyaWFsaXplZE9sZExheWVyIiwic2VyaWFsaXplZE5ld0xheWVyIiwiY2hhbmdlZCIsInZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlciIsInZpc3VhbENoYW5uZWxzIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsIiwiY2hhbm5lbFByb3BOYW1lcyIsInByb3AiLCJzb21lIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsInByb3BzIiwibmV3Q29uZmlnIiwicmVzdENvbmZpZyIsInN0YXRlV2l0aERhdGFJZCIsImxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlciIsIm5leHRMYXllciIsInVwZGF0ZUxheWVyQ29uZmlnIiwic2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhIiwib2xkTGF5ZXJEYXRhIiwidXBkYXRlTGF5ZXJEYXRhUmVzdWx0IiwibGF5ZXJTZXRJc1ZhbGlkVXBkYXRlciIsImlzVmFsaWQiLCJsYXllclRvVXBkYXRlIiwibmV3RGF0YSIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsImRlZmF1bHRUZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJuZXdUZXh0TGFiZWwiLCJzbGljZSIsImN1cnJlbnRGaWVsZHMiLCJ0bCIsImZpZWxkIiwibmFtZSIsImZpbHRlciIsImFkZEZpZWxkcyIsImYiLCJpbmNsdWRlcyIsImRlbGV0ZUZpZWxkcyIsImZkIiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJ2YWx1ZSIsInNwbGljZSIsImxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlciIsImdldERlZmF1bHRMYXllckNvbmZpZyIsInZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhIiwibG9hZGVkTGF5ZXIiLCJhbGxvd0VtcHR5Q29sdW1uIiwiaXNWYWxpZFRvU2F2ZSIsInZhbGlkYXRlZCIsImlzQ29uZmlnQWN0aXZlIiwidXBkYXRlTGF5ZXJEb21haW4iLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJyZXN1bHQiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJuZXdUeXBlIiwib2xkSWQiLCJDb25zb2xlIiwiZXJyb3IiLCJhc3NpZ25Db25maWdUb0xheWVyIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJpc0xheWVySG92ZXJlZCIsInNldHRpbmdzIiwib2xkTGF5ZXJNYXAiLCJvdGhlckxheWVycyIsImxheWVySWQiLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJuZXdWaXNDb25maWciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsInNldEZpbHRlclVwZGF0ZXIiLCJzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyIiwiYW5pbWF0aW9uV2luZG93IiwidmFsdWVJbmRleCIsIm9sZEZpbHRlciIsIm5ld0ZpbHRlciIsImRhdGFzZXRJZHMiLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImRhdGFzZXRJZCIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJsYXllcklkRGlmZmVyZW5jZSIsImxheWVyRGF0YUlkcyIsImxpZCIsIm5ld0RhdGFJZHMiLCJlbmxhcmdlZEZpbHRlciIsInZpZXciLCJGSUxURVJfVklFV19UWVBFUyIsImVubGFyZ2VkIiwic2lkZSIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIkxJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyIsImZpbHRlcmVkRGF0YXNldHMiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJzZXRGaWx0ZXJQbG90VXBkYXRlciIsIm5ld1Byb3AiLCJwbG90VHlwZSIsImFkZEZpbHRlclVwZGF0ZXIiLCJsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyIiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJ1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJzZXRGaWx0ZXJWaWV3VXBkYXRlciIsInNob3VsZFJlc2V0T3RoZXJGaWx0ZXJzVmlldyIsInRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyIiwicmVtb3ZlRmlsdGVyVXBkYXRlciIsIm5ld0ZpbHRlcnMiLCJuZXdFZGl0b3IiLCJhZGRMYXllclVwZGF0ZXIiLCJuZXdMYXllckRhdGEiLCJ3YXJuIiwiZGVmYXVsdERhdGFzZXQiLCJMYXllciIsInJlbW92ZUxheWVyVXBkYXRlciIsIk51bWJlciIsImlzRmluaXRlIiwibGF5ZXJUb1JlbW92ZSIsInJlb3JkZXJMYXllclVwZGF0ZXIiLCJvcmRlciIsImR1cGxpY2F0ZUxheWVyVXBkYXRlciIsIm9yaWdpbmFsIiwib3JpZ2luYWxMYXllck9yZGVySWR4IiwibmV3TGFiZWwiLCJwb3N0Zml4IiwiTEFZRVJfSURfTEVOR1RIIiwibmV3TGF5ZXJPcmRlciIsImFkZEVmZmVjdFVwZGF0ZXIiLCJuZXdFZmZlY3QiLCJlZmZlY3QiLCJ1cGRhdGVDb25maWciLCJyZW1vdmVFZmZlY3RVcGRhdGVyIiwiZWZmZWN0VG9SZW1vdmUiLCJlZmZlY3RJZCIsInJlb3JkZXJFZmZlY3RVcGRhdGVyIiwidXBkYXRlRWZmZWN0VXBkYXRlciIsIm5ld0VmZmVjdHMiLCJyZW1vdmVEYXRhc2V0VXBkYXRlciIsImRhdGFzZXRLZXkiLCJuZXdEYXRhc2V0cyIsImxheWVyc1RvUmVtb3ZlIiwicmVkdWNlIiwiYWNjdSIsInJlbW92ZURhdGFzZXRGcm9tSW50ZXJhY3Rpb25Db25maWciLCJmaWVsZHMiLCJ1cGRhdGVMYXllckJsZW5kaW5nVXBkYXRlciIsInVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXIiLCJzaG93RGF0YXNldFRhYmxlVXBkYXRlciIsInVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyIiwidXBkYXRlRGF0YXNldFByb3BzVXBkYXRlciIsImNvbG9yIiwibmV3Q29sb3IiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsInBheWxvYWQiLCJvcHRpb25zIiwidmlzU3RhdGUiLCJrZWVwRXhpc3RpbmdDb25maWciLCJtZXJnZWRTdGF0ZSIsIm1lcmdlciIsIm1lcmdlIiwidG9NZXJnZVByb3AiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJjb250cmFkaWN0IiwiayIsImxheWVyQ2xpY2tVcGRhdGVyIiwicGlubmVkIiwicGlja2VkIiwibWFwQ2xpY2tVcGRhdGVyIiwibW91c2VNb3ZlVXBkYXRlciIsImV2dCIsInZhbHVlcyIsInBvaW50IiwibW91c2VQb3NpdGlvbiIsImxuZ0xhdCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImR1cGxpY2F0ZSIsImNsb3NlU3BlY2lmaWNNYXBBdEluZGV4IiwidG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyIiwibWFwSW5kZXgiLCJzbSIsInVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwicHJldmlvdXNTdGF0ZSIsIm5ld0RhdGFFbnRyaWVzIiwicmVzdCIsImxheWVyTWVyZ2VycyIsIm0iLCJ3YWl0Rm9yTGF5ZXJEYXRhIiwiZGF0YXNldE1lcmdlcnMiLCJwb3N0TWVyZ2VyUGF5bG9hZCIsImFwcGx5TWVyZ2Vyc1VwZGF0ZXIiLCJtZXJnZVN0YXRlUmVzdWx0IiwiYWxsTWVyZ2VkIiwicG9zdE1lcmdlVXBkYXRlciIsImZEYXRhSWQiLCJkYXRhc2V0RmlsdGVyZWQiLCJkYXRhRW1wdHkiLCJuZXdMYXllcnMiLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYWRkRGVmYXVsdExheWVycyIsInRvb2x0aXBGaWVsZHMiLCJhdXRvQ3JlYXRlVG9vbHRpcHMiLCJhZGREZWZhdWx0VG9vbHRpcHMiLCJ1cGRhdGVkRGF0YXNldHMiLCJjb25jYXQiLCJ1cGRhdGVkU3RhdGUiLCJyZW5hbWVEYXRhc2V0VXBkYXRlciIsIkFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMiLCJ2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyIsInZhbGlkYXRlZFByb3BzIiwiZW50cmllcyIsImFjYyIsImVudHJ5IiwiZXhpc3RpbmciLCJpbmRleFRvUmV0cmlldmUiLCJtYXBMYXllcnMiLCJsb2FkRmlsZXNVcGRhdGVyIiwiZmlsZXMiLCJvbkZpbmlzaCIsImxvYWRGaWxlc1N1Y2Nlc3MiLCJmcm9tIiwiaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJmaWxlQ2FjaGUiLCJmaWxlc1RvTG9hZCIsImxvYWROZXh0RmlsZVVwZGF0ZXIiLCJsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlciIsImZpbGVOYW1lIiwic3RhdGVXaXRoUHJvZ3Jlc3MiLCJ1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlciIsInByb2dyZXNzIiwicGVyY2VudCIsIm1lc3NhZ2UiLCJzdGF0ZVdpdGhDYWNoZSIsImxvYWROZXh0RmlsZSIsImZpbGUiLCJyZW1haW5pbmdGaWxlc1RvTG9hZCIsIm1ha2VMb2FkRmlsZVRhc2siLCJiaW1hcCIsImdlbiIsImNvbnRlbnQiLCJlcnIiLCJwcm9jZXNzRmlsZUNvbnRlbnRVcGRhdGVyIiwicGFyc2VQcm9ncmVzcyIsInByZXZQcm9ncmVzcyIsIm5leHRGaWxlQmF0Y2hVcGRhdGVyIiwiYWNjdW11bGF0ZWQiLCJkb25lIiwibG9hZEZpbGVzRXJyVXBkYXRlciIsImFwcGx5Q1BVRmlsdGVyVXBkYXRlciIsImRhdGFJZHMiLCJzZXRNYXBJbmZvVXBkYXRlciIsImVtcHR5IiwiZGVmYXVsdExheWVycyIsImZvdW5kTGF5ZXJzIiwibWVyZ2VkIiwiaW5kZXgiLCJmaXhlZERvbWFpbiIsInB1c2giLCJhbmltYXRhYmxlTGF5ZXJzIiwiYW5pbWF0aW9uRG9tYWluIiwibWVyZ2VkRG9tYWluIiwiTWF0aCIsIm1pbiIsIm1heCIsIkluZmluaXR5Iiwic2V0RWRpdG9yTW9kZVVwZGF0ZXIiLCJzZXRGZWF0dXJlc1VwZGF0ZXIiLCJsYXN0RmVhdHVyZSIsInByb3BlcnRpZXMiLCJpc0Nsb3NlZCIsIkVESVQiLCJmZWF0dXJlIiwiZmlsdGVySWQiLCJmZWF0dXJlVmFsdWUiLCJmaWx0ZXJJZHgiLCJmaWwiLCJzZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyIiwic2VsZWN0aW9uQ29udGV4dCIsImRlbGV0ZUZlYXR1cmVVcGRhdGVyIiwic2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlciIsIm5vbmVGaWx0ZXJGZWF0dXJlIiwiaXNMYXllckluY2x1ZGVkIiwic29ydFRhYmxlQ29sdW1uVXBkYXRlciIsImNvbHVtbiIsInNvcnRNb2RlIiwiY3VycmVudE1vZGUiLCJTT1JUX09SREVSIiwiQVNDRU5ESU5HIiwic29ydGVkIiwicGluVGFibGVDb2x1bW5VcGRhdGVyIiwiY29weVRhYmxlQ29sdW1uVXBkYXRlciIsImZpZWxkSWR4IiwidGV4dCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJ2YWx1ZUF0Iiwiam9pbiIsInNldENvbHVtbkRpc3BsYXlGb3JtYXRVcGRhdGVyIiwiZm9ybWF0cyIsImRpc3BsYXlGb3JtYXQiLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiRklMVEVSX1RZUEVTIiwidGltZVJhbmdlIiwidXBkYXRlcyIsImNoZWNrVGltZUNvbmZpZ0FyZ3MiLCJhbGxvd2VkIiwic2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlciIsImRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyIsImRhdGFJZFRvUmVwbGFjZSIsInJlcGxhY2VkIiwidiIsImZpbmRDaGlsZERhdGFzZXRJZHMiLCJjaGlsZERhdGFJZHMiLCJtb3ZlVmFsdWVUb0JlTWVyZ2VkIiwicHJvcFZhbHVlcyIsInNhdmVVbm1lcmdlZCIsInN0YXRlUmVtb3ZlZCIsInByb3BWYWx1ZSIsInAiLCJ0b0JlTWVyZ2VkIiwicmVwbGFjZURhdGFzZXRBbmREZXBzIiwiZGF0YUlkVG9Vc2UiLCJyZXBsYWNlRGF0YXNldERlcHNJblN0YXRlIiwicHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2UiLCJzZXJpYWxpemVkU3RhdGUiLCJwcmVzZXJ2ZUxheWVyT3JkZXIiLCJwcmVzZXJ2ZURhdGFzZXRPcmRlciIsImFjY3VTdGF0ZSIsInJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwiZ2V0Q2hpbGREYXRhc2V0SWRzIiwicHJlc2VydmVPcmRlciIsInRvTWVyZ2VQcm9wcyIsInNhdmVkUHJvcHMiLCJyZXBsYWNlZFN0YXRlIiwibWVyZ2VyT3B0aW9ucyIsInJlcGxhY2VkSXRlbSIsInJlcGxhY2VQcm9wVmFsdWVJblN0YXRlIiwiaXRlbSIsImNoaWxkRGF0YUlkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFtQkE7O0FBNkJBOztBQVFBOztBQUNBOztBQUNBOztBQVNBOztBQVVBOztBQUtBOztBQUNBOztBQVNBOztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsSUFBekI7QUFDQTs7QUFFTyxJQUFNQyx3QkFBMkMsR0FBRztBQUN6REMsRUFBQUEsT0FBTyxFQUFFO0FBQ1BDLElBQUFBLEVBQUUsRUFBRSxTQURHO0FBRVBDLElBQUFBLEtBQUssRUFBRSxzQkFGQTtBQUdQQyxJQUFBQSxPQUFPLEVBQUUsSUFIRjtBQUlQQyxJQUFBQSxNQUFNLEVBQUU7QUFDTkMsTUFBQUEsWUFBWSxFQUFFLEVBRFI7QUFF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QXBCLEdBQXRCLENBQW5DO0FBQ0EsTUFBTUgsWUFBWSxHQUFHLENBQUFpQixrQkFBa0IsU0FBbEIsSUFBQUEsa0JBQWtCLFdBQWxCLFlBQUFBLGtCQUFrQixDQUFHTSxZQUFILENBQWxCLEtBQXNDeEIsbUJBQW1CLENBQUN3QixZQUFELENBQTlFOztBQUVBLE1BQUl2QixZQUFKLEVBQWtCO0FBQ2hCOVUsSUFBQUEsU0FBUyxHQUFHLG9CQUFROFUsWUFBUixFQUFzQi9LLE1BQXRCLENBQTZCLFVBQUNDLElBQUQsRUFBT3dNLFdBQVAsRUFBdUI7QUFDOUQ7QUFDQTtBQUNBLGFBQU9sQixxQkFBcUIsQ0FBQ3RMLElBQUQsRUFBT3dNLFdBQVAsRUFBb0JBLFdBQXBCLENBQTVCO0FBQ0QsS0FKVyxFQUlUeFcsU0FKUyxDQUFaO0FBS0Q7O0FBQ0QsU0FBT0EsU0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtkaXNhYmxlU3RhY2tDYXB0dXJpbmcsIHdpdGhUYXNrfSBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IHhvciBmcm9tICdsb2Rhc2gueG9yJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcbmltcG9ydCBjb3B5IGZyb20gJ2NvcHktdG8tY2xpcGJvYXJkJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbi8vIFRhc2tzXG5pbXBvcnQge0xPQURfRklMRV9UQVNLLCBVTldSQVBfVEFTSywgUFJPQ0VTU19GSUxFX0RBVEEsIERFTEFZX1RBU0t9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuLy8gQWN0aW9uc1xuaW1wb3J0IHtcbiAgYXBwbHlMYXllckNvbmZpZyxcbiAgbGF5ZXJDb25maWdDaGFuZ2UsXG4gIGxheWVyVHlwZUNoYW5nZSxcbiAgbGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgbG9hZEZpbGVzRXJyLFxuICBsb2FkRmlsZXNTdWNjZXNzLFxuICBsb2FkRmlsZVN0ZXBTdWNjZXNzLFxuICBsb2FkTmV4dEZpbGUsXG4gIG5leHRGaWxlQmF0Y2gsXG4gIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLFxuICBWaXNTdGF0ZUFjdGlvbnMsXG4gIE1hcFN0YXRlQWN0aW9ucyxcbiAgcHJvY2Vzc0ZpbGVDb250ZW50LFxuICBBY3Rpb25UeXBlc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgc2V0LFxuICB0b0FycmF5LFxuICBhcnJheUluc2VydCxcbiAgZ2VuZXJhdGVIYXNoSWQsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzT2JqZWN0LFxuICBhZGROZXdMYXllcnNUb1NwbGl0TWFwLFxuICBjb21wdXRlU3BsaXRNYXBMYXllcnMsXG4gIHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyxcbiAgaXNSZ2JDb2xvcixcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICBhcHBseUZpbHRlckZpZWxkTmFtZSxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgZmVhdHVyZVRvRmlsdGVyVmFsdWUsXG4gIGZpbHRlckRhdGFzZXRDUFUsXG4gIEZJTFRFUl9VUERBVEVSX1BST1BTLFxuICBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIsXG4gIGdldERlZmF1bHRGaWx0ZXIsXG4gIGdldEZpbHRlcklkSW5GZWF0dXJlLFxuICBnZXRUaW1lV2lkZ2V0VGl0bGVGb3JtYXR0ZXIsXG4gIGlzSW5SYW5nZSxcbiAgTElNSVRFRF9GSUxURVJfRUZGRUNUX1BST1BTLFxuICB1cGRhdGVGaWx0ZXJEYXRhSWQsXG4gIGdldEZpbHRlclBsb3QsXG4gIGdldERlZmF1bHRGaWx0ZXJQbG90VHlwZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuLy8gTWVyZ2Vyc1xuaW1wb3J0IHtcbiAgVklTX1NUQVRFX01FUkdFUlMsXG4gIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YSxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBzZXJpYWxpemVMYXllcixcbiAgc2VyaWFsaXplVmlzU3RhdGUsXG4gIHBhcnNlTGF5ZXJDb25maWdcbn0gZnJvbSAnLi92aXMtc3RhdGUtbWVyZ2VyJztcbmltcG9ydCB7bWVyZ2VTdGF0ZUZyb21NZXJnZXJzLCBpc1ZhbGlkTWVyZ2VyfSBmcm9tICcuL21lcmdlci1oYW5kbGVyJztcbmltcG9ydCB7TGF5ZXIsIExheWVyQ2xhc3NlcywgTEFZRVJfSURfTEVOR1RIfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBFRElUT1JfTU9ERVMsXG4gIFNPUlRfT1JERVIsXG4gIEZJTFRFUl9UWVBFUyxcbiAgRklMVEVSX1ZJRVdfVFlQRVMsXG4gIE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIENPTVBBUkVfVFlQRVNcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgcGlja18sXG4gIG1lcmdlXyxcbiAgc3dhcF8sXG4gIGFwcGx5XyxcbiAgY29tcG9zZV8sXG4gIHJlbW92ZUVsZW1lbnRBdEluZGV4LFxuICBmaWx0ZXJPdXRCeUlkXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge1Zpc1N0YXRlLCBNZXJnZXIsIFBvc3RNZXJnZXJQYXlsb2FkfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge0ZpbHRlciwgSW50ZXJhY3Rpb25Db25maWcsIEFuaW1hdGlvbkNvbmZpZywgRWRpdG9yLCBGaWVsZH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0xvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVMYXllckRhdGEsIGZpbmREZWZhdWx0TGF5ZXIsIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICcuL2xheWVyLXV0aWxzJztcbmltcG9ydCB7XG4gIGNvcHlUYWJsZUFuZFVwZGF0ZSxcbiAgRGF0YXNldHMsXG4gIHBpblRhYmxlQ29sdW1ucyxcbiAgc29ydERhdGFzZXRCeUNvbHVtbixcbiAgYXNzaWduR3B1Q2hhbm5lbCxcbiAgc2V0RmlsdGVyR3B1TW9kZSxcbiAgY3JlYXRlTmV3RGF0YUVudHJ5XG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtmaW5kRmllbGRzVG9TaG93fSBmcm9tICcuL2ludGVyYWN0aW9uLXV0aWxzJztcbmltcG9ydCB7aGFzUHJvcHNUb01lcmdlLCBnZXRQcm9wVmFsdWVUb01lcmdlcn0gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge21lcmdlRGF0YXNldHNCeU9yZGVyfSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuaW1wb3J0IHtmaXhFZmZlY3RPcmRlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2NyZWF0ZURlY2tFZmZlY3RGcm9tQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL2VmZmVjdHMnO1xuXG4vLyByZWFjdC1wYWxtXG4vLyBkaXNhYmxlIGNhcHR1cmUgZXhjZXB0aW9uIGZvciByZWFjdC1wYWxtIGNhbGwgdG8gd2l0aFRhc2tcbmRpc2FibGVTdGFja0NhcHR1cmluZygpO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgdmlzU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICpcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge3Zpc1N0YXRlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgdmlzU3RhdGU6IHZpc1N0YXRlVXBkYXRlcnMuZW5sYXJnZUZpbHRlclVwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIHN0YXRlLmtlcGxlckdsLmZvby52aXNTdGF0ZSxcbiAqICAgICAgICAgICAgICAge2lkeDogMH1cbiAqICAgICAgICAgICAgIClcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9XG4gKiAgICAgIH07XG4gKiAgfVxuICogIHJldHVybiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKTtcbiAqIH07XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29tcG9zZWRSZWR1Y2VyO1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgdmlzU3RhdGVVcGRhdGVycyA9IG51bGw7XG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SW50ZXJhY3Rpb25Db25maWc6IEludGVyYWN0aW9uQ29uZmlnID0ge1xuICB0b29sdGlwOiB7XG4gICAgaWQ6ICd0b29sdGlwJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy50b29sdGlwJyxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGNvbmZpZzoge1xuICAgICAgZmllbGRzVG9TaG93OiB7fSxcbiAgICAgIGNvbXBhcmVNb2RlOiBmYWxzZSxcbiAgICAgIGNvbXBhcmVUeXBlOiBDT01QQVJFX1RZUEVTLkFCU09MVVRFXG4gICAgfVxuICB9LFxuICBnZW9jb2Rlcjoge1xuICAgIGlkOiAnZ2VvY29kZXInLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmdlb2NvZGVyJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogbnVsbFxuICB9LFxuICBicnVzaDoge1xuICAgIGlkOiAnYnJ1c2gnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmJydXNoJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBjb25maWc6IHtcbiAgICAgIC8vIHNpemUgaXMgaW4ga21cbiAgICAgIHNpemU6IDAuNVxuICAgIH1cbiAgfSxcbiAgY29vcmRpbmF0ZToge1xuICAgIGlkOiAnY29vcmRpbmF0ZScsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMuY29vcmRpbmF0ZScsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcG9zaXRpb246IG51bGxcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRzogQW5pbWF0aW9uQ29uZmlnID0ge1xuICBkb21haW46IG51bGwsXG4gIGN1cnJlbnRUaW1lOiBudWxsLFxuICBzcGVlZDogMSxcbiAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICB0aW1lRm9ybWF0OiBudWxsLFxuICB0aW1lem9uZTogbnVsbCxcbiAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGwsXG4gIGhpZGVDb250cm9sOiBmYWxzZSxcbiAgZHVyYXRpb246IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VESVRPUjogRWRpdG9yID0ge1xuICBtb2RlOiBFRElUT1JfTU9ERVMuRFJBV19QT0xZR09OLFxuICBmZWF0dXJlczogW10sXG4gIHNlbGVjdGVkRmVhdHVyZTogbnVsbCxcbiAgdmlzaWJsZTogdHJ1ZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9WSVNfU1RBVEU6IFZpc1N0YXRlID0ge1xuICAvLyBtYXAgaW5mb1xuICBtYXBJbmZvOiB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJ1xuICB9LFxuICAvLyBsYXllcnNcbiAgbGF5ZXJzOiBbXSxcbiAgbGF5ZXJEYXRhOiBbXSxcbiAgbGF5ZXJUb0JlTWVyZ2VkOiBbXSxcbiAgbGF5ZXJPcmRlcjogW10sXG5cbiAgLy8gZmlsdGVyc1xuICBmaWx0ZXJzOiBbXSxcbiAgZmlsdGVyVG9CZU1lcmdlZDogW10sXG5cbiAgLy8gYSBjb2xsZWN0aW9uIG9mIG11bHRpcGxlIGRhdGFzZXRcbiAgZGF0YXNldHM6IHt9LFxuICBlZGl0aW5nRGF0YXNldDogdW5kZWZpbmVkLFxuXG4gIC8vIGVmZmVjdHNcbiAgZWZmZWN0czogW10sXG4gIGVmZmVjdE9yZGVyOiBbXSxcblxuICBpbnRlcmFjdGlvbkNvbmZpZzogZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnLFxuICBpbnRlcmFjdGlvblRvQmVNZXJnZWQ6IHt9LFxuXG4gIGxheWVyQmxlbmRpbmc6ICdub3JtYWwnLFxuICBvdmVybGF5QmxlbmRpbmc6ICdub3JtYWwnLFxuICBob3ZlckluZm86IHVuZGVmaW5lZCxcbiAgY2xpY2tlZDogdW5kZWZpbmVkLFxuICBtb3VzZVBvczoge30sXG4gIG1heERlZmF1bHRUb29sdGlwczogTUFYX0RFRkFVTFRfVE9PTFRJUFMsXG5cbiAgLy8gdGhpcyBpcyB1c2VkIHdoZW4gdXNlciBzcGxpdCBtYXBzXG4gIHNwbGl0TWFwczogW1xuICAgIC8vIHRoaXMgd2lsbCBjb250YWluIGEgbGlzdCBvZiBvYmplY3RzIHRvXG4gICAgLy8gZGVzY3JpYmUgdGhlIHN0YXRlIG9mIGxheWVyIGF2YWlsYWJpbGl0eSBhbmQgdmlzaWJpbGl0eSBmb3IgZWFjaCBtYXBcbiAgICAvLyBbXG4gICAgLy8gICB7XG4gICAgLy8gICAgICBsYXllcnM6IHtsYXllcl9pZDogdHJ1ZSB8IGZhbHNlfVxuICAgIC8vICAgfVxuICAgIC8vIF1cbiAgXSxcbiAgc3BsaXRNYXBzVG9CZU1lcmdlZDogW10sXG4gIGlzTWVyZ2luZ0RhdGFzZXRzOiB7fSxcbiAgLy8gZGVmYXVsdHMgbGF5ZXIgY2xhc3Nlc1xuICBsYXllckNsYXNzZXM6IExheWVyQ2xhc3NlcyxcblxuICAvLyBkZWZhdWx0IGFuaW1hdGlvblxuICAvLyB0aW1lIGluIHVuaXggdGltZXN0YW1wIChtaWxsaXNlY29uZHMpICh0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIFVuaXggRXBvY2gpXG4gIGFuaW1hdGlvbkNvbmZpZzogREVGQVVMVF9BTklNQVRJT05fQ09ORklHLFxuXG4gIGVkaXRvcjogREVGQVVMVF9FRElUT1IsXG5cbiAgZmlsZUxvYWRpbmc6IGZhbHNlLFxuICBmaWxlTG9hZGluZ1Byb2dyZXNzOiB7fSxcblxuICBsb2FkZXJzOiBbXSxcbiAgbG9hZE9wdGlvbnM6IHt9LFxuXG4gIC8vIHZpc1N0YXRlTWVyZ2Vyc1xuICBtZXJnZXJzOiBWSVNfU1RBVEVfTUVSR0VSUyxcblxuICAvLyBrZXBsZXIgc2NoZW1hc1xuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hXG59O1xuXG50eXBlIFVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YVR5cGUgPSB7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJEYXRhOiBhbnlbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhPFMgZXh0ZW5kcyBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlPihcbiAgc3RhdGU6IFMsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogUyB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKChseXIsIGkpID0+IChpID09PSBpZHggPyBsYXllciA6IGx5cikpLFxuICAgIGxheWVyRGF0YTogbGF5ZXJEYXRhXG4gICAgICA/IHN0YXRlLmxheWVyRGF0YS5tYXAoKGQsIGkpID0+IChpID09PSBpZHggPyBsYXllckRhdGEgOiBkKSlcbiAgICAgIDogc3RhdGUubGF5ZXJEYXRhXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGxheWVyOiBMYXllcik6IFMge1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICAgID8gYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgICAgICA6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgIH07XG4gIH1cblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4oc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIChvciBhcnJheXMpIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlXG4gKiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBwaWNrQ2hhbmdlZFByb3BzPFQ+KHByZXY6IFQsIG5leHQ6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlZFByb3BzOiBQYXJ0aWFsPFQ+ID0ge307XG4gIGNvbnN0IHBpY2tQcm9wc09mID0gb2JqID0+IHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmICghY2hhbmdlZFByb3BzLmhhc093blByb3BlcnR5KGtleSkgJiYgIWlzRXF1YWwocHJldltrZXldLCBuZXh0W2tleV0pKSB7XG4gICAgICAgIGNoYW5nZWRQcm9wc1trZXldID0gbmV4dFtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBwaWNrUHJvcHNPZihwcmV2KTtcbiAgcGlja1Byb3BzT2YobmV4dCk7XG4gIHJldHVybiBjaGFuZ2VkUHJvcHM7XG59XG5cbmNvbnN0IFZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMgPSBbJ2ZpZWxkJywgJ3NjYWxlJywgJ2RvbWFpbicsICdhZ2dyZWdhdGlvbiddO1xuXG4vKipcbiAqIEFwcGx5IGxheWVyIGNvbmZpZ1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eSwgbWF4LXN0YXRlbWVudHNcbmV4cG9ydCBmdW5jdGlvbiBhcHBseUxheWVyQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BcHBseUxheWVyQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJJZCwgbmV3TGF5ZXJDb25maWcsIGxheWVySW5kZXh9ID0gYWN0aW9uO1xuICBjb25zdCBuZXdQYXJzZWRMYXllciA9XG4gICAgLy8gd2lsbCBtb3ZlIHZpc3VhbENoYW5uZWxzIHRvIHRoZSBjb25maWcgcHJvcFxuICAgIHBhcnNlTGF5ZXJDb25maWcoc3RhdGUuc2NoZW1hLCBuZXdMYXllckNvbmZpZyk7XG4gIGNvbnN0IG9sZExheWVyID0gc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBvbGRMYXllcklkKTtcbiAgaWYgKCFvbGRMYXllciB8fCAhbmV3UGFyc2VkTGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKGxheWVySW5kZXggIT09IG51bGwgJiYgbGF5ZXJJbmRleCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLmxheWVyc1tsYXllckluZGV4XSAhPT0gb2xkTGF5ZXIpIHtcbiAgICAvLyBsYXllckluZGV4IGlzIHByb3ZpZGVkLCBidXQgaXQgZG9lc24ndCBtYXRjaCB0aGUgb2xkTGF5ZXJcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW25ld1BhcnNlZExheWVyLmNvbmZpZy5kYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gTWFrZSBzdXJlIHRoZSBsYXllciBpcyB2YWxpZCBhbmQgY29udmVydCBpdCB0byBMYXllclxuICBjb25zdCBuZXdMYXllciA9IHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShkYXRhc2V0LCBuZXdQYXJzZWRMYXllciwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgaWYgKCFuZXdMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxldCBuZXh0U3RhdGUgPSBzdGF0ZTtcblxuICBpZiAobmV3TGF5ZXIudHlwZSAmJiBuZXdMYXllci50eXBlICE9PSBvbGRMYXllci50eXBlKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJJbmRleCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllcklkKTtcbiAgICBpZiAob2xkTGF5ZXJJbmRleCA+PSAwKSB7XG4gICAgICBuZXh0U3RhdGUgPSBsYXllclR5cGVDaGFuZ2VVcGRhdGVyKG5leHRTdGF0ZSwgbGF5ZXJUeXBlQ2hhbmdlKG9sZExheWVyLCBuZXdMYXllci50eXBlKSk7XG4gICAgICAvLyBsYXllclR5cGVDaGFuZ2VVcGRhdGVyIGNoYW5nZXMgdGhlIGlkIG9mIHRoZSBsYXllciwgc28gd2UgbmVlZCB0byBvYnRhaW4gdGhlIG5ldyBpZFxuICAgICAgLy8gYnV0IGZpcnN0IG1ha2Ugc3VyZSB0aGF0IHRoZSBsYXllciB3YXMgbm90IHJlbW92ZWRcbiAgICAgIGlmIChuZXh0U3RhdGUubGF5ZXJzLmxlbmd0aCA9PT0gc3RhdGUubGF5ZXJzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBuZXdMYXllcklkID0gbmV4dFN0YXRlLmxheWVyc1tvbGRMYXllckluZGV4XS5pZDtcbiAgICAgICAgbmV4dFN0YXRlID0gYXBwbHlMYXllckNvbmZpZ1VwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGFwcGx5TGF5ZXJDb25maWcobmV3TGF5ZXJJZCwgey4uLm5ld0xheWVyQ29uZmlnLCBpZDogbmV3TGF5ZXJJZH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH1cblxuICAvLyBzZXJpYWxpemVMYXllcigpIG1pZ2h0IHJldHVybiBudWxsIGlmIHRoZSBvbGQgbGF5ZXIgaXMgbm90IHZhbGlkLFxuICAvLyB3ZSBzaG91bGQgc3RpbGwgYXBwbHkgdGhlIGNoYW5nZXMgaW4gdGhhdCBjYXNlXG4gIGNvbnN0IHNlcmlhbGl6ZWRPbGRMYXllciA9IHNlcmlhbGl6ZUxheWVyKG9sZExheWVyLCBzdGF0ZS5zY2hlbWEpID8/IHtjb25maWc6IHt9fTtcbiAgY29uc3Qgc2VyaWFsaXplZE5ld0xheWVyID0gc2VyaWFsaXplTGF5ZXIobmV3TGF5ZXIsIHN0YXRlLnNjaGVtYSk7XG4gIGlmICghc2VyaWFsaXplZE5ld0xheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmICghaXNFcXVhbChzZXJpYWxpemVkT2xkTGF5ZXIsIHNlcmlhbGl6ZWROZXdMYXllcikpIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gcGlja0NoYW5nZWRQcm9wcyhzZXJpYWxpemVkT2xkTGF5ZXIuY29uZmlnLCBzZXJpYWxpemVkTmV3TGF5ZXIuY29uZmlnKTtcblxuICAgIGlmICgndmlzQ29uZmlnJyBpbiBjaGFuZ2VkKSB7XG4gICAgICBpZiAoY2hhbmdlZC52aXNDb25maWcpIHtcbiAgICAgICAgbmV4dFN0YXRlID0gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBsYXllclZpc0NvbmZpZ0NoYW5nZShvbGRMYXllciwgY2hhbmdlZC52aXNDb25maWcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkZWxldGUgY2hhbmdlZC52aXNDb25maWc7XG4gICAgfVxuXG4gICAgT2JqZWN0LmtleXMob2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goY2hhbm5lbE5hbWUgPT4ge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IG9sZExheWVyLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxOYW1lXTtcbiAgICAgIGNvbnN0IGNoYW5uZWxQcm9wTmFtZXMgPSBWSVNVQUxfQ0hBTk5FTF9QUk9QX1RZUEVTLm1hcChwcm9wID0+IGNoYW5uZWxbcHJvcF0pO1xuICAgICAgaWYgKGNoYW5uZWxQcm9wTmFtZXMuc29tZShwcm9wID0+IHByb3AgaW4gY2hhbmdlZCkpIHtcbiAgICAgICAgbmV4dFN0YXRlID0gbGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgbGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlKFxuICAgICAgICAgICAgb2xkTGF5ZXIsXG4gICAgICAgICAgICBwaWNrKG5ld0xheWVyLmNvbmZpZywgY2hhbm5lbFByb3BOYW1lcyksXG4gICAgICAgICAgICBjaGFubmVsTmFtZVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGNoYW5uZWxQcm9wTmFtZXMpIHtcbiAgICAgICAgICBkZWxldGUgY2hhbmdlZFtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZWQpLmxlbmd0aCA+IDApIHtcbiAgICAgIG5leHRTdGF0ZSA9IGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICBsYXllckNvbmZpZ0NoYW5nZShvbGRMYXllciwgcGljayhuZXdMYXllci5jb25maWcsIE9iamVjdC5rZXlzKGNoYW5nZWQpKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGFjdGlvbi5uZXdDb25maWcpO1xuICBpZiAoXG4gICAgdHlwZW9mIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkID09PSAnc3RyaW5nJyAmJlxuICAgIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkICE9PSBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gICkge1xuICAgIGNvbnN0IHtkYXRhSWQsIC4uLnJlc3RDb25maWd9ID0gYWN0aW9uLm5ld0NvbmZpZztcbiAgICBjb25zdCBzdGF0ZVdpdGhEYXRhSWQgPSBsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICAgIG9sZExheWVyLFxuICAgICAgbmV3Q29uZmlnOiB7ZGF0YUlkfVxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRMYXllciA9IHN0YXRlV2l0aERhdGFJZC5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgICByZXR1cm4gbmV4dExheWVyICYmIE9iamVjdC5rZXlzKHJlc3RDb25maWcpLmxlbmd0aFxuICAgICAgPyBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGVXaXRoRGF0YUlkLCB7b2xkTGF5ZXI6IG5leHRMYXllciwgbmV3Q29uZmlnOiByZXN0Q29uZmlnfSlcbiAgICAgIDogc3RhdGVXaXRoRGF0YUlkO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoYWN0aW9uLm5ld0NvbmZpZyk7XG5cbiAgbGV0IGxheWVyRGF0YTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuXG4gICAgY29uc3QgdXBkYXRlTGF5ZXJEYXRhUmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICBuZXdMYXllciA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllcjtcbiAgICBsYXllckRhdGEgPSB1cGRhdGVMYXllckRhdGFSZXN1bHQubGF5ZXJEYXRhO1xuICB9XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmICgnaXNWaXNpYmxlJyBpbiBhY3Rpb24ubmV3Q29uZmlnKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlKHN0YXRlLCBuZXdMYXllcik7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7XG4gICAgbGF5ZXI6IG5ld0xheWVyLFxuICAgIGxheWVyRGF0YSxcbiAgICBpZHhcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBpc1ZhbGlkIGZsYWcgb2YgYSBsYXllci5cbiAqIFVwZGF0ZXMgaXNWaXNpYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBpc1ZhbGlkLlxuICogVHJpZ2dlcnMgdXBkYXRlIG9mIGRhdGEgZm9yIHRoZSBsYXllciBpbiBvcmRlciB0byBnZXQgZXJyb3JzIGFnYWluIGR1cmluZyBuZXh0IHVwZGF0ZSBpdGVyYXRpb24uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclNldElzVmFsaWRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyU2V0SXNWYWxpZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBpc1ZhbGlkfSA9IGFjdGlvbjtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBsYXllclRvVXBkYXRlID0gc3RhdGUubGF5ZXJzW2lkeF07XG4gIGlmIChsYXllclRvVXBkYXRlKSB7XG4gICAgbGV0IG5ld0xheWVyO1xuICAgIGxldCBuZXdEYXRhID0gbnVsbDtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAvLyBUcmlnZ2VyIGRhdGEgdXBkYXRlIGluIG9yZGVyIHRvIHNob3cgZXJyb3JzIGFnYWluIGlmIHByZXNlbnQuXG4gICAgICBjb25zdCB7bGF5ZXIsIGxheWVyRGF0YX0gPSBjYWxjdWxhdGVMYXllckRhdGEobGF5ZXJUb1VwZGF0ZSwgc3RhdGUsIHVuZGVmaW5lZCk7XG4gICAgICBuZXdMYXllciA9IGxheWVyO1xuICAgICAgbmV3RGF0YSA9IGxheWVyRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXIgPSBsYXllclRvVXBkYXRlLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBuZXdMYXllci5pc1ZhbGlkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2lkeCwgbGF5ZXI6IG5ld0xheWVyLCBsYXllckRhdGE6IG5ld0RhdGF9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKG5ld0ZpZWxkcywgdGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsID0gREVGQVVMVF9URVhUX0xBQkVMKSB7XG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBjb25zdCBjdXJyZW50RmllbGRzID0gdGV4dExhYmVsLm1hcCh0bCA9PiB0bC5maWVsZCAmJiB0bC5maWVsZC5uYW1lKS5maWx0ZXIoZCA9PiBkKTtcblxuICBjb25zdCBhZGRGaWVsZHMgPSBuZXdGaWVsZHMuZmlsdGVyKGYgPT4gIWN1cnJlbnRGaWVsZHMuaW5jbHVkZXMoZi5uYW1lKSk7XG4gIGNvbnN0IGRlbGV0ZUZpZWxkcyA9IGN1cnJlbnRGaWVsZHMuZmlsdGVyKGYgPT4gIW5ld0ZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IGYpKTtcblxuICAvLyBkZWxldGVcbiAgbmV3VGV4dExhYmVsID0gbmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCAmJiAhZGVsZXRlRmllbGRzLmluY2x1ZGVzKHRsLmZpZWxkLm5hbWUpKTtcbiAgbmV3VGV4dExhYmVsID0gIW5ld1RleHRMYWJlbC5sZW5ndGggPyBbZGVmYXVsdFRleHRMYWJlbF0gOiBuZXdUZXh0TGFiZWw7XG5cbiAgLy8gYWRkXG4gIG5ld1RleHRMYWJlbCA9IFtcbiAgICAuLi5uZXdUZXh0TGFiZWwuZmlsdGVyKHRsID0+IHRsLmZpZWxkKSxcbiAgICAuLi5hZGRGaWVsZHMubWFwKGFmID0+ICh7XG4gICAgICAuLi5kZWZhdWx0VGV4dExhYmVsLFxuICAgICAgZmllbGQ6IGFmXG4gICAgfSkpXG4gIF07XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIHRleHRMYWJlbCkge1xuICBpZiAoIXRleHRMYWJlbFtpZHhdLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgcmV0dXJuIHRleHRMYWJlbDtcbiAgfVxuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBpZiAocHJvcCA9PT0gJ2ZpZWxkJyAmJiB2YWx1ZSA9PT0gbnVsbCAmJiB0ZXh0TGFiZWwubGVuZ3RoID4gMSkge1xuICAgIC8vIHJlbW92ZSBsYWJlbCB3aGVuIGZpZWxkIHZhbHVlIGlzIHNldCB0byBudWxsXG4gICAgbmV3VGV4dExhYmVsLnNwbGljZShpZHgsIDEpO1xuICB9IGVsc2UgaWYgKHByb3ApIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwubWFwKCh0bCwgaSkgPT4gKGkgPT09IGlkeCA/IHsuLi50bCwgW3Byb3BdOiB2YWx1ZX0gOiB0bCkpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaWR4LCBwcm9wLCB2YWx1ZX0gPSBhY3Rpb247XG4gIGNvbnN0IHt0ZXh0TGFiZWx9ID0gb2xkTGF5ZXIuY29uZmlnO1xuXG4gIC8vIHdoZW4gYWRkaW5nIGEgbmV3IGVtcHR5IHRleHQgbGFiZWwsXG4gIC8vIHJlbHkgb24gdGhlIGxheWVyJ3MgZGVmYXVsdCBjb25maWcsIG9yIHVzZSB0aGUgY29uc3RhbnQgREVGQVVMVF9URVhUX0xBQkVMXG4gIGNvbnN0IGRlZmF1bHRUZXh0TGFiZWwgPVxuICAgIG9sZExheWVyLmdldERlZmF1bHRMYXllckNvbmZpZyh7ZGF0YUlkOiAnJ30pPy50ZXh0TGFiZWw/LlswXSA/PyBERUZBVUxUX1RFWFRfTEFCRUw7XG5cbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuICBpZiAoIXRleHRMYWJlbFtpZHhdICYmIGlkeCA9PT0gdGV4dExhYmVsLmxlbmd0aCkge1xuICAgIC8vIGlmIGlkeCBpcyBzZXQgdG8gbGVuZ3RoLCBhZGQgZW1wdHkgdGV4dCBsYWJlbFxuICAgIG5ld1RleHRMYWJlbCA9IFsuLi50ZXh0TGFiZWwsIGRlZmF1bHRUZXh0TGFiZWxdO1xuICB9XG5cbiAgaWYgKGlkeCA9PT0gJ2FsbCcgJiYgcHJvcCA9PT0gJ2ZpZWxkcycpIHtcbiAgICBuZXdUZXh0TGFiZWwgPSBhZGRPclJlbW92ZVRleHRMYWJlbHModmFsdWUsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3VGV4dExhYmVsID0gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIG5ld1RleHRMYWJlbCk7XG4gIH1cbiAgLy8gdXBkYXRlIHRleHQgbGFiZWwgcHJvcCBhbmQgdmFsdWVcbiAgcmV0dXJuIGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgIG9sZExheWVyLFxuICAgIG5ld0NvbmZpZzoge3RleHRMYWJlbDogbmV3VGV4dExhYmVsfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoZGF0YXNldCwgbGF5ZXJDbGFzc2VzLCBsYXllciwgc2NoZW1hKSB7XG4gIGNvbnN0IGxvYWRlZExheWVyID0gc2VyaWFsaXplTGF5ZXIobGF5ZXIsIHNjaGVtYSk7XG4gIHJldHVybiBsb2FkZWRMYXllclxuICAgID8gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxvYWRlZExheWVyLCBsYXllckNsYXNzZXMsIHtcbiAgICAgICAgYWxsb3dFbXB0eUNvbHVtbjogdHJ1ZVxuICAgICAgfSlcbiAgICA6IG51bGw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGNvbmZpZyBkYXRhSWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBvbGRMYXllcjogTGF5ZXI7XG4gICAgbmV3Q29uZmlnOiB7XG4gICAgICBkYXRhSWQ6IHN0cmluZztcbiAgICB9O1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdDb25maWc7XG5cbiAgaWYgKCFvbGRMYXllciB8fCAhc3RhdGUuZGF0YXNldHNbZGF0YUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWR9KTtcbiAgLy8gdGhpcyBtYXkgaGFwcGVuIHdoZW4gYSBsYXllciBpcyBuZXcgKHR5cGU6IG51bGwgYW5kIG5vIGNvbHVtbnMpIGJ1dCBpdCdzIG5vdCByZWFkeSB0byBiZSBzYXZlZFxuICBpZiAobmV3TGF5ZXIuaXNWYWxpZFRvU2F2ZSgpKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEoXG4gICAgICBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLFxuICAgICAgc3RhdGUubGF5ZXJDbGFzc2VzLFxuICAgICAgbmV3TGF5ZXIsXG4gICAgICBzdGF0ZS5zY2hlbWFcbiAgICApO1xuICAgIC8vIGlmIGNhbnQgdmFsaWRhdGUgaXQgd2l0aCBkYXRhIGNyZWF0ZSBhIG5ldyBvbmVcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUT0RPOiBjaGVja2luZyBvbGRMYXllci50eXBlICE9PSBudWxsXG4gICAgICBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbb2xkTGF5ZXIudHlwZV0oe2RhdGFJZCwgaWQ6IG9sZExheWVyLmlkfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gdmFsaWRhdGVkO1xuICAgIH1cbiAgfVxuXG4gIG5ld0xheWVyID0gbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgIGlzVmlzaWJsZTogb2xkTGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZVxuICB9KTtcblxuICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0SW5pdGlhbExheWVyQ29uZmlnKGxheWVyLCBkYXRhc2V0cywgbGF5ZXJDbGFzc2VzKTogTGF5ZXIge1xuICBsZXQgbmV3TGF5ZXIgPSBsYXllcjtcbiAgaWYgKCFPYmplY3Qua2V5cyhkYXRhc2V0cykubGVuZ3RoKSB7XG4gICAgLy8gbm8gZGF0YSBpcyBsb2FkZWRcbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cbiAgaWYgKCFsYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgLy8gc2V0IGxheWVyIGRhdGFJZFxuICAgIG5ld0xheWVyID0gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe2RhdGFJZDogT2JqZWN0LmtleXMoZGF0YXNldHMpWzBdfSk7XG4gIH1cbiAgY29uc3QgZGF0YXNldCA9IGRhdGFzZXRzW25ld0xheWVyLmNvbmZpZy5kYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gbGF5ZXI7XG4gIH1cblxuICAvLyBmaW5kIGRlZmF1dCBsYXllciBwcm9wc1xuICBjb25zdCByZXN1bHQgPVxuICAgIHR5cGVvZiBsYXllckNsYXNzZXNbbmV3TGF5ZXIudHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzID09PSAnZnVuY3Rpb24nXG4gICAgICA/IGxheWVyQ2xhc3Nlc1tuZXdMYXllci50eXBlXS5maW5kRGVmYXVsdExheWVyUHJvcHMoZGF0YXNldCwgW10pXG4gICAgICA6IHtwcm9wczogW119O1xuXG4gIC8vIGFuIGFycmF5IG9mIHBvc3NpYmxlIHByb3BzLCB1c2UgMXN0IG9uZVxuICBjb25zdCBwcm9wcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IHJlc3VsdC5wcm9wcyB8fCBbXTtcblxuICBpZiAocHJvcHMubGVuZ3RoKSB7XG4gICAgbmV3TGF5ZXIgPSBuZXcgbGF5ZXJDbGFzc2VzW2xheWVyLnR5cGVdKHtcbiAgICAgIC4uLnByb3BzWzBdLFxuICAgICAgbGFiZWw6IG5ld0xheWVyLmNvbmZpZy5sYWJlbCxcbiAgICAgIGRhdGFJZDogbmV3TGF5ZXIuY29uZmlnLmRhdGFJZCxcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiBuZXdMYXllci5jb25maWcuaXNDb25maWdBY3RpdmVcbiAgICB9KTtcblxuICAgIHJldHVybiB0eXBlb2YgbmV3TGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nXG4gICAgICA/IG5ld0xheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyhkYXRhc2V0KVxuICAgICAgOiBuZXdMYXllcjtcbiAgfVxuXG4gIHJldHVybiBuZXdMYXllcjtcbn1cbi8qKlxuICogVXBkYXRlIGxheWVyIHR5cGUuIFByZXZpZXdzIGxheWVyIGNvbmZpZyB3aWxsIGJlIGNvcGllZCBpZiBhcHBsaWNhYmxlLlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIG5ld1R5cGV9ID0gYWN0aW9uO1xuICBpZiAoIW9sZExheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IG9sZElkID0gb2xkTGF5ZXIuaWQ7XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRJZCk7XG5cbiAgaWYgKCFzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0pIHtcbiAgICBDb25zb2xlLmVycm9yKGAke25ld1R5cGV9IGlzIG5vdCBhIHZhbGlkIGxheWVyIHR5cGVgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0xheWVyID0gbmV3IHN0YXRlLmxheWVyQ2xhc3Nlc1tuZXdUeXBlXSh7XG4gICAgLy8ga2VlcCBvbGQgbGF5ZXIgbGFibGUgYW5kIGlzQ29uZmlnQWN0aXZlXG4gICAgbGFiZWw6IG9sZExheWVyLmNvbmZpZy5sYWJlbCxcbiAgICBpc0NvbmZpZ0FjdGl2ZTogb2xkTGF5ZXIuY29uZmlnLmlzQ29uZmlnQWN0aXZlLFxuICAgIGRhdGFJZDogb2xkTGF5ZXIuY29uZmlnLmRhdGFJZFxuICB9KTtcblxuICBpZiAoIW9sZExheWVyLnR5cGUpIHtcbiAgICAvLyBpZiBzZXR0aW5nIGxheWVyIHR5cGUgb24gYW4gZW1wdHkgbGF5ZXJcbiAgICBuZXdMYXllciA9IHNldEluaXRpYWxMYXllckNvbmZpZyhuZXdMYXllciwgc3RhdGUuZGF0YXNldHMsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gZ2V0IGEgbWludCBsYXllciwgd2l0aCBuZXcgaWQgYW5kIHR5cGVcbiAgICAvLyBiZWNhdXNlIGRlY2suZ2wgdXNlcyBpZCB0byBtYXRjaCBiZXR3ZWVuIG5ldyBhbmQgb2xkIGxheWVyLlxuICAgIC8vIElmIHR5cGUgaGFzIGNoYW5nZWQgYnV0IGlkIGlzIHRoZSBzYW1lLCBpdCB3aWxsIGJyZWFrXG4gICAgbmV3TGF5ZXIuYXNzaWduQ29uZmlnVG9MYXllcihvbGRMYXllci5jb25maWcsIG9sZExheWVyLnZpc0NvbmZpZ1NldHRpbmdzKTtcbiAgICBuZXdMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cyk7XG4gIH1cblxuICBjb25zdCB7Y2xpY2tlZCwgaG92ZXJJbmZvfSA9IHN0YXRlO1xuXG4gIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBjbGlja2VkOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChjbGlja2VkKSA/IHVuZGVmaW5lZCA6IGNsaWNrZWQsXG4gICAgaG92ZXJJbmZvOiBvbGRMYXllci5pc0xheWVySG92ZXJlZChob3ZlckluZm8pID8gdW5kZWZpbmVkIDogaG92ZXJJbmZvXG4gIH07XG5cbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBuZXdTdGF0ZSk7XG4gIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKG5ld1N0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCB8fCBvbGRMYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQpIHtcbiAgICBuZXdTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXdTdGF0ZSk7XG4gIH1cblxuICAvLyB1cGRhdGUgc3BsaXRNYXAgbGF5ZXIgaWRcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBuZXdTdGF0ZS5zcGxpdE1hcHMubWFwKHNldHRpbmdzID0+IHtcbiAgICAgICAgY29uc3Qge1tvbGRJZF06IG9sZExheWVyTWFwLCAuLi5vdGhlckxheWVyc30gPSBzZXR0aW5ncy5sYXllcnM7XG4gICAgICAgIHJldHVybiBvbGRJZCBpbiBzZXR0aW5ncy5sYXllcnNcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAgIC4uLm90aGVyTGF5ZXJzLFxuICAgICAgICAgICAgICAgIFtsYXllci5pZF06IG9sZExheWVyTWFwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHNldHRpbmdzO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgLy8gdXBkYXRlIGxheWVyT3JkZXIgd2l0aCBuZXcgaWRcbiAgbmV3U3RhdGUgPSB7XG4gICAgLi4ubmV3U3RhdGUsXG4gICAgbGF5ZXJPcmRlcjogbmV3U3RhdGUubGF5ZXJPcmRlci5tYXAobGF5ZXJJZCA9PlxuICAgICAgbGF5ZXJJZCA9PT0gb2xkTGF5ZXIuaWQgPyBuZXdMYXllci5pZCA6IGxheWVySWRcbiAgICApXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciB2aXN1YWwgY2hhbm5lbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3Q29uZmlnLCBjaGFubmVsfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tvbGRMYXllci5jb25maWcuZGF0YUlkXTtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZyk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsIGNoYW5uZWwpO1xuXG4gIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBvbGRMYXllckRhdGEpO1xuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYHZpc0NvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcn0gPSBhY3Rpb247XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoYWN0aW9uLm5ld1Zpc0NvbmZpZyk7XG4gIGNvbnN0IG5ld1Zpc0NvbmZpZyA9IHtcbiAgICAuLi5vbGRMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIC4uLmFjdGlvbi5uZXdWaXNDb25maWdcbiAgfTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHt2aXNDb25maWc6IG5ld1Zpc0NvbmZpZ30pO1xuXG4gIGlmIChuZXdMYXllci5zaG91bGRDYWxjdWxhdGVMYXllckRhdGEocHJvcHMpKSB7XG4gICAgY29uc3Qgb2xkTGF5ZXJEYXRhID0gc3RhdGUubGF5ZXJEYXRhW2lkeF07XG4gICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXI6IG5ld0xheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIoc3RhdGUsIGFjdGlvbik7XG59XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBhbmltYXRpb24gd2luZG93XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uV2luZG93VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIGFuaW1hdGlvbldpbmRvd306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoZiA9PlxuICAgICAgZi5pZCA9PT0gaWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5mLFxuICAgICAgICAgICAgYW5pbWF0aW9uV2luZG93XG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59XG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgcHJvcGVydHlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2lkeCwgcHJvcCwgdmFsdWUsIHZhbHVlSW5kZXggPSAwfSA9IGFjdGlvbjtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVycy4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdGaWx0ZXIgPSBzZXQoW3Byb3BdLCB2YWx1ZSwgb2xkRmlsdGVyKTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG5cbiAgY29uc3Qge2RhdGFJZH0gPSBuZXdGaWx0ZXI7XG5cbiAgLy8gRW5zdXJpbmcgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBsZXQgZGF0YXNldElkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICBzd2l0Y2ggKHByb3ApIHtcbiAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBpZiB3ZSB1cGRhdGUgZGF0YUlkLCB3ZSBuZWVkIHRvIGNvbnNpZGVyIHR3byBjYXNlczpcbiAgICAvLyAxLiBkYXRhSWQgaXMgZW1wdHk6IGNyZWF0ZSBhIGRlZmF1bHQgZmlsdGVyXG4gICAgLy8gMi4gQWRkIGEgbmV3IGRhdGFzZXQgaWRcbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLmRhdGFJZDpcbiAgICAgIC8vIGlmIHRyeWluZyB0byB1cGRhdGUgZmlsdGVyIGRhdGFJZC4gY3JlYXRlIGFuIGVtcHR5IG5ldyBmaWx0ZXJcbiAgICAgIG5ld0ZpbHRlciA9IHVwZGF0ZUZpbHRlckRhdGFJZChkYXRhSWQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLm5hbWU6XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gbmV3RmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIG5ld0ZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YXNldElkXSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogZmFsc2V9XG4gICAgICApO1xuICAgICAgaWYgKCF1cGRhdGVkRmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgbmV3RmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcblxuICAgICAgaWYgKG5ld0ZpbHRlci5ncHUpIHtcbiAgICAgICAgbmV3RmlsdGVyID0gc2V0RmlsdGVyR3B1TW9kZShuZXdGaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICBuZXdGaWx0ZXIgPSBhc3NpZ25HcHVDaGFubmVsKG5ld0ZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICB9XG5cbiAgICAgIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG5cbiAgICAgIC8vIG9ubHkgZmlsdGVyIHRoZSBjdXJyZW50IGRhdGFzZXRcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRklMVEVSX1VQREFURVJfUFJPUFMubGF5ZXJJZDpcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIG9ubHkgZGF0YXNldElkL3MgaWYgd2UgaGF2ZSBhZGRlZC9yZW1vdmVkIGxheWVyc1xuICAgICAgLy8gLSBjaGVjayBmb3IgbGF5ZXJJZCBjaGFuZ2VzIChYT1Igd29ya3MgYmVjYXVzZSBvZiBzdHJpbmcgdmFsdWVzKVxuICAgICAgLy8gaWYgbm8gZGlmZmVyZW5jZXMgYmV0d2VlbiBsYXllcklkcywgZG9uJ3QgZG8gYW55IGZpbHRlcmluZ1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgY29uc3QgbGF5ZXJJZERpZmZlcmVuY2UgPSB4b3IobmV3RmlsdGVyLmxheWVySWQsIG9sZEZpbHRlci5sYXllcklkKTtcblxuICAgICAgY29uc3QgbGF5ZXJEYXRhSWRzID0gdW5pcTxzdHJpbmc+KFxuICAgICAgICBsYXllcklkRGlmZmVyZW5jZVxuICAgICAgICAgIC5tYXAobGlkID0+XG4gICAgICAgICAgICBnZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gbGlkKSxcbiAgICAgICAgICAgICAgWydjb25maWcnLCAnZGF0YUlkJ11cbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgLmZpbHRlcihkID0+IGQpIGFzIHN0cmluZ1tdXG4gICAgICApO1xuXG4gICAgICAvLyBvbmx5IGZpbHRlciBkYXRhc2V0c0lkc1xuICAgICAgZGF0YXNldElkcyA9IGxheWVyRGF0YUlkcztcblxuICAgICAgLy8gVXBkYXRlIG5ld0ZpbHRlciBkYXRhSWRzXG4gICAgICBjb25zdCBuZXdEYXRhSWRzID0gdW5pcTxzdHJpbmc+KFxuICAgICAgICBuZXdGaWx0ZXIubGF5ZXJJZFxuICAgICAgICAgID8ubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgbmV3RmlsdGVyID0ge1xuICAgICAgICAuLi5uZXdGaWx0ZXIsXG4gICAgICAgIGRhdGFJZDogbmV3RGF0YUlkc1xuICAgICAgfTtcblxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgZW5sYXJnZWRGaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZiA9PiBmLnZpZXcgPT09IEZJTFRFUl9WSUVXX1RZUEVTLmVubGFyZ2VkKTtcblxuICBpZiAoZW5sYXJnZWRGaWx0ZXIgJiYgZW5sYXJnZWRGaWx0ZXIuaWQgIT09IG5ld0ZpbHRlci5pZCkge1xuICAgIC8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBlbmxhcmdlZCBmaWx0ZXJcbiAgICBuZXdGaWx0ZXIudmlldyA9IEZJTFRFUl9WSUVXX1RZUEVTLnNpZGU7XG4gIH1cblxuICAvLyBzYXZlIG5ldyBmaWx0ZXJzIHRvIG5ld1N0YXRlXG4gIG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycycsIGlkeF0sIG5ld0ZpbHRlciwgbmV3U3RhdGUpO1xuXG4gIC8vIGlmIHdlIGFyZSBjdXJyZW50bHkgc2V0dGluZyBhIHByb3AgdGhhdCBvbmx5IHJlcXVpcmVzIHRvIGZpbHRlciB0aGUgY3VycmVudFxuICAvLyBkYXRhc2V0IHdlIHdpbGwgcGFzcyBvbmx5IHRoZSBjdXJyZW50IGRhdGFzZXQgdG8gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyBhbmRcbiAgLy8gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhIG90aGVyd2lzZSB3ZSBwYXNzIHRoZSBhbGwgbGlzdCBvZiBkYXRhc2V0cyBhcyBkZWZpbmVkIGluIGRhdGFJZFxuICBjb25zdCBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBMSU1JVEVEX0ZJTFRFUl9FRkZFQ1RfUFJPUFNbcHJvcF1cbiAgICA/IFtkYXRhc2V0SWRzW3ZhbHVlSW5kZXhdXVxuICAgIDogZGF0YXNldElkcztcblxuICAvLyBmaWx0ZXIgZGF0YVxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhcbiAgICBkYXRhc2V0SWRzVG9GaWx0ZXIsXG4gICAgbmV3U3RhdGUuZGF0YXNldHMsXG4gICAgbmV3U3RhdGUuZmlsdGVycyxcbiAgICBuZXdTdGF0ZS5sYXllcnNcbiAgKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJ10sIGZpbHRlcmVkRGF0YXNldHMsIG5ld1N0YXRlKTtcbiAgLy8gZGF0YUlkIGlzIGFuIGFycmF5XG4gIC8vIHBhc3Mgb25seSB0aGUgZGF0YXNldCB3ZSBuZWVkIHRvIHVwZGF0ZVxuICBuZXdTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShuZXdTdGF0ZSwgZGF0YXNldElkc1RvRmlsdGVyLCBuZXdGaWx0ZXIpO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wLCB2YWx1ZUluZGV4ID0gMH06IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJQbG90VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBsZXQgbmV3RmlsdGVyID0gey4uLnN0YXRlLmZpbHRlcnNbaWR4XSwgLi4ubmV3UHJvcH07XG4gIGNvbnN0IHByb3AgPSBPYmplY3Qua2V5cyhuZXdQcm9wKVswXTtcbiAgaWYgKHByb3AgPT09ICd5QXhpcycpIHtcbiAgICBjb25zdCBwbG90VHlwZSA9IGdldERlZmF1bHRGaWx0ZXJQbG90VHlwZShuZXdGaWx0ZXIpO1xuICAgIC8vIFRPRE86IHBsb3QgaXMgbm90IHN1cHBvcnRlZCBpbiBtdWx0aSBkYXRhc2V0IGZpbHRlciBmb3Igbm93XG4gICAgaWYgKHBsb3RUeXBlKSB7XG4gICAgICBuZXdGaWx0ZXIgPSB7XG4gICAgICAgIC4uLm5ld0ZpbHRlcixcbiAgICAgICAgLi4uZ2V0RmlsdGVyUGxvdCh7Li4ubmV3RmlsdGVyLCBwbG90VHlwZX0sIHN0YXRlLmRhdGFzZXRzW25ld0ZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF1dKSxcbiAgICAgICAgcGxvdFR5cGVcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGlkeCA/IG5ld0ZpbHRlciA6IGYpKVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PlxuICAhYWN0aW9uLmRhdGFJZFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBnZXREZWZhdWx0RmlsdGVyKHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIGlkOiBhY3Rpb24uaWR9KV1cbiAgICAgIH07XG5cbi8qKlxuICogU2V0IGxheWVyIGNvbG9yIHBhbGV0dGUgdWkgc3RhdGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvbGRMYXllciwgcHJvcCwgbmV3Q29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgb2xkVml4Q29uZmlnID0gb2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbG9yVUkocHJvcCwgbmV3Q29uZmlnKTtcbiAgY29uc3QgbmV3VmlzQ29uZmlnID0gbmV3TGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1twcm9wXTtcbiAgaWYgKG9sZFZpeENvbmZpZyAhPT0gbmV3VmlzQ29uZmlnKSB7XG4gICAgcmV0dXJuIGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihzdGF0ZSwge1xuICAgICAgb2xkTGF5ZXIsXG4gICAgICBuZXdWaXNDb25maWc6IHtcbiAgICAgICAgW3Byb3BdOiBuZXdWaXNDb25maWdcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcChsID0+IChsLmlkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyIDogbCkpXG4gIH07XG59O1xuXG4vKipcbiAqIFN0YXJ0IGFuZCBlbmQgZmlsdGVyIGFuaW1hdGlvblxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gYWN0aW9uLmlkeCA/IHsuLi5mLCBpc0FuaW1hdGluZzogIWYuaXNBbmltYXRpbmd9IDogZikpXG59KTtcblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJBbmltYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICBpc0FuaW1hdGluZzogIXN0YXRlLmFuaW1hdGlvbkNvbmZpZy5pc0FuaW1hdGluZ1xuICB9XG59KTtcblxuLyoqXG4gKiBIaWRlIGFuZCBzaG93IGxheWVyIGFuaW1hdGlvbiBjb250cm9sXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJBbmltYXRpb25Db250cm9sVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgIGhpZGVDb250cm9sOiAhc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmhpZGVDb250cm9sXG4gIH1cbn0pO1xuXG4vKipcbiAqIENoYW5nZSBmaWx0ZXIgYW5pbWF0aW9uIHNwZWVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gYWN0aW9uLmlkeCA/IHsuLi5mLCBzcGVlZDogYWN0aW9uLnNwZWVkfSA6IGYpKVxufSk7XG5cbi8qKlxuICogUmVzZXQgYW5pbWF0aW9uIGNvbmZpZyBjdXJyZW50IHRpbWUgdG8gYSBzcGVjaWZpZWQgdmFsdWVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKlxuICovXG5leHBvcnQgY29uc3Qgc2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7dmFsdWV9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICBjdXJyZW50VGltZTogdmFsdWVcbiAgfVxufSk7XG5cbi8qKlxuICogVXBkYXRlIGFuaW1hdGlvbiBzcGVlZCB3aXRoIHRoZSB2ZXJ0aWNhbCBzcGVlZCBzbGlkZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKlxuICovXG5leHBvcnQgY29uc3QgdXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge3NwZWVkfTogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgICBzcGVlZFxuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogU2hvdyBsYXJnZXIgdGltZSBmaWx0ZXIgYXQgYm90dG9tIGZvciB0aW1lIHBsYXliYWNrIChhcHBseSB0byB0aW1lIGZpbHRlciBvbmx5KVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEZpbHRlclZpZXdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclZpZXdVcGRhdGVyQWN0aW9uXG4pID0+IHtcbiAgY29uc3Qge3ZpZXcsIGlkeH0gPSBhY3Rpb247XG4gIGNvbnN0IHNob3VsZFJlc2V0T3RoZXJGaWx0ZXJzVmlldyA9IHZpZXcgPT09IEZJTFRFUl9WSUVXX1RZUEVTLmVubGFyZ2VkO1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PlxuICAgICAgaSA9PT0gaWR4XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIHZpZXdcbiAgICAgICAgICB9XG4gICAgICAgIDogc2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIHZpZXc6IEZJTFRFUl9WSUVXX1RZUEVTLnNpZGVcbiAgICAgICAgICB9XG4gICAgICAgIDogZlxuICAgIClcbiAgfTtcbn07XG5cbi8qKlxuICogVG9nZ2xlcyBmaWx0ZXIgZmVhdHVyZSB2aXNpYmlsaXR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1thY3Rpb24uaWR4XTtcbiAgY29uc3QgaXNWaXNpYmxlID0gZ2V0KGZpbHRlciwgWyd2YWx1ZScsICdwcm9wZXJ0aWVzJywgJ2lzVmlzaWJsZSddKTtcblxuICBsZXQgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKHN0YXRlLCB7XG4gICAgaWR4OiBhY3Rpb24uaWR4LFxuICAgIHByb3A6ICdlbmFibGVkJyxcbiAgICB2YWx1ZTogIWlzVmlzaWJsZVxuICB9KTtcblxuICBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZHg6IGFjdGlvbi5pZHgsXG4gICAgcHJvcDogJ3ZhbHVlJyxcbiAgICB2YWx1ZTogZmVhdHVyZVRvRmlsdGVyVmFsdWUoZmlsdGVyLnZhbHVlLCBmaWx0ZXIuaWQsIHtcbiAgICAgIGlzVmlzaWJsZTogIWlzVmlzaWJsZVxuICAgIH0pXG4gIH0pO1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtpZHh9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YUlkLCBpZH0gPSBzdGF0ZS5maWx0ZXJzW2lkeF07XG5cbiAgY29uc3QgbmV3RmlsdGVycyA9IFtcbiAgICAuLi5zdGF0ZS5maWx0ZXJzLnNsaWNlKDAsIGlkeCksXG4gICAgLi4uc3RhdGUuZmlsdGVycy5zbGljZShpZHggKyAxLCBzdGF0ZS5maWx0ZXJzLmxlbmd0aClcbiAgXTtcblxuICBjb25zdCBmaWx0ZXJlZERhdGFzZXRzID0gYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyhkYXRhSWQsIHN0YXRlLmRhdGFzZXRzLCBuZXdGaWx0ZXJzLCBzdGF0ZS5sYXllcnMpO1xuICBjb25zdCBuZXdFZGl0b3IgPVxuICAgIGdldEZpbHRlcklkSW5GZWF0dXJlKHN0YXRlLmVkaXRvci5zZWxlY3RlZEZlYXR1cmUpID09PSBpZFxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICAgICAgICB9XG4gICAgICA6IHN0YXRlLmVkaXRvcjtcblxuICBsZXQgbmV3U3RhdGUgPSBzZXQoWydmaWx0ZXJzJ10sIG5ld0ZpbHRlcnMsIHN0YXRlKTtcbiAgbmV3U3RhdGUgPSBzZXQoWydkYXRhc2V0cyddLCBmaWx0ZXJlZERhdGFzZXRzLCBuZXdTdGF0ZSk7XG4gIG5ld1N0YXRlID0gc2V0KFsnZWRpdG9yJ10sIG5ld0VkaXRvciwgbmV3U3RhdGUpO1xuXG4gIHJldHVybiB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEobmV3U3RhdGUsIGRhdGFJZCwgdW5kZWZpbmVkKTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZExheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBsZXQgbmV3TGF5ZXI7XG4gIGxldCBuZXdMYXllckRhdGE7XG4gIGlmIChhY3Rpb24uY29uZmlnKSB7XG4gICAgbmV3TGF5ZXIgPSBjcmVhdGVMYXllckZyb21Db25maWcoc3RhdGUsIGFjdGlvbi5jb25maWcpO1xuICAgIGlmICghbmV3TGF5ZXIpIHtcbiAgICAgIENvbnNvbGUud2FybihcbiAgICAgICAgJ0ZhaWxlZCB0byBjcmVhdGUgbGF5ZXIgZnJvbSBjb25maWcsIGl0IHVzdWFsbHkgbWVhbnMgdGhlIGNvbmZpZyBpcyBub3QgYmUgaW4gY29ycmVjdCBmb3JtYXQnLFxuICAgICAgICBhY3Rpb24uY29uZmlnXG4gICAgICApO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUpO1xuICAgIG5ld0xheWVyID0gcmVzdWx0LmxheWVyO1xuICAgIG5ld0xheWVyRGF0YSA9IHJlc3VsdC5sYXllckRhdGE7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGFuIGVtcHR5IGxheWVyIHdpdGggYSBzcGVjaWZpYyBkYXRhc2V0IG9yIGEgZGVmYXVsdCBvbmVcbiAgICBjb25zdCBkZWZhdWx0RGF0YXNldCA9IGFjdGlvbi5kYXRhc2V0SWQgPz8gT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpWzBdO1xuICAgIG5ld0xheWVyID0gbmV3IExheWVyKHtcbiAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiB0cnVlLFxuICAgICAgZGF0YUlkOiBkZWZhdWx0RGF0YXNldFxuICAgIH0pO1xuICAgIG5ld0xheWVyRGF0YSA9IHt9O1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCBuZXdMYXllcl0sXG4gICAgbGF5ZXJEYXRhOiBbLi4uc3RhdGUubGF5ZXJEYXRhLCBuZXdMYXllckRhdGFdLFxuICAgIC8vIGFkZCBuZXcgbGF5ZXIgYXQgdGhlIHRvcFxuICAgIGxheWVyT3JkZXI6IFtuZXdMYXllci5pZCwgLi4uc3RhdGUubGF5ZXJPcmRlcl0sXG4gICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKHN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXIpXG4gIH07XG59O1xuXG4vKipcbiAqIHJlbW92ZSBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUxheWVyVXBkYXRlcjxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZUxheWVyVXBkYXRlckFjdGlvblxuKTogVCB7XG4gIGNvbnN0IGlkeCA9IE51bWJlci5pc0Zpbml0ZShpZClcbiAgICA/IC8vIHN1cHBvcnQgb2xkZXIgQVBJLCByZW1vdmUgbGF5ZXIgYnkgaWR4XG4gICAgICBOdW1iZXIoaWQpXG4gICAgOiBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc3RhdGUubGF5ZXJzLmxlbmd0aCkge1xuICAgIC8vIGludmFsaWQgaW5kZXhcbiAgICBDb25zb2xlLndhcm4oYGNhbiBub3QgcmVtb3ZlIGxheWVyIHdpdGggaW52YWxpZCBpZHxpZHggJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7bGF5ZXJzLCBsYXllckRhdGEsIGxheWVyT3JkZXIsIGNsaWNrZWQsIGhvdmVySW5mb30gPSBzdGF0ZTtcbiAgY29uc3QgbGF5ZXJUb1JlbW92ZSA9IGxheWVyc1tpZHhdO1xuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IGZpbHRlck91dEJ5SWQobGF5ZXJUb1JlbW92ZS5pZCkobGF5ZXJzKSxcbiAgICBsYXllckRhdGE6IHJlbW92ZUVsZW1lbnRBdEluZGV4KGlkeCkobGF5ZXJEYXRhKSxcbiAgICBsYXllck9yZGVyOiBsYXllck9yZGVyLmZpbHRlcihsYXllcklkID0+IGxheWVySWQgIT09IGxheWVyVG9SZW1vdmUuaWQpLFxuICAgIGNsaWNrZWQ6IGxheWVyVG9SZW1vdmUuaXNMYXllckhvdmVyZWQoY2xpY2tlZCkgPyB1bmRlZmluZWQgOiBjbGlja2VkLFxuICAgIGhvdmVySW5mbzogbGF5ZXJUb1JlbW92ZS5pc0xheWVySG92ZXJlZChob3ZlckluZm8pID8gdW5kZWZpbmVkIDogaG92ZXJJbmZvLFxuICAgIHNwbGl0TWFwczogcmVtb3ZlTGF5ZXJGcm9tU3BsaXRNYXBzKHN0YXRlLnNwbGl0TWFwcywgbGF5ZXJUb1JlbW92ZSlcbiAgICAvLyBUT0RPOiB1cGRhdGUgZmlsdGVycywgY3JlYXRlIGhlbHBlciB0byByZW1vdmUgbGF5ZXIgZm9ybSBmaWx0ZXIgKHJlbW92ZSBsYXllcmlkIGFuZCBkYXRhaWQpIGlmIG1hcHBlZFxuICB9O1xuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xufVxuXG4vKipcbiAqIFJlb3JkZXIgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW9yZGVyTGF5ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtvcmRlcn06IFZpc1N0YXRlQWN0aW9ucy5SZW9yZGVyTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJPcmRlcjogb3JkZXJcbn0pO1xuXG4vKipcbiAqIGR1cGxpY2F0ZSBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGR1cGxpY2F0ZUxheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuRHVwbGljYXRlTGF5ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGlkeCA9IE51bWJlci5pc0Zpbml0ZShpZClcbiAgICA/IC8vIHN1cHBvcnQgb2xkZXIgQVBJLCByZW1vdmUgbGF5ZXIgYnkgaWR4XG4gICAgICBOdW1iZXIoaWQpXG4gICAgOiBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCB8fCAhc3RhdGUubGF5ZXJzW2lkeF0pIHtcbiAgICBDb25zb2xlLndhcm4oYGxheWVyICR7aWR4fSBub3QgZm91bmQgaW4gbGF5ZXJPcmRlcmApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG4gIGNvbnN0IG9yaWdpbmFsID0gbGF5ZXJzW2lkeF07XG5cbiAgY29uc3Qgb3JpZ2luYWxMYXllck9yZGVySWR4ID0gc3RhdGUubGF5ZXJPcmRlci5maW5kSW5kZXgobGlkID0+IGxpZCA9PT0gb3JpZ2luYWwuaWQpO1xuICBsZXQgbmV3TGFiZWwgPSBgQ29weSBvZiAke29yaWdpbmFsLmNvbmZpZy5sYWJlbH1gO1xuICBsZXQgcG9zdGZpeCA9IDA7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgd2hpbGUgKGxheWVycy5maW5kKGwgPT4gbC5jb25maWcubGFiZWwgPT09IG5ld0xhYmVsKSkge1xuICAgIG5ld0xhYmVsID0gYENvcHkgb2YgJHtvcmlnaW5hbC5jb25maWcubGFiZWx9ICR7Kytwb3N0Zml4fWA7XG4gIH1cblxuICAvLyBjb2xsZWN0IGxheWVyIGNvbmZpZyBmcm9tIG9yaWdpbmFsXG4gIGNvbnN0IGxvYWRlZExheWVyID0gc2VyaWFsaXplTGF5ZXIob3JpZ2luYWwsIHN0YXRlLnNjaGVtYSk7XG5cbiAgLy8gYXNzaWduIG5ldyBpZCBhbmQgbGFiZWwgdG8gY29waWVkIGxheWVyXG4gIGlmICghbG9hZGVkTGF5ZXI/LmNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsb2FkZWRMYXllci5jb25maWcubGFiZWwgPSBuZXdMYWJlbDtcbiAgbG9hZGVkTGF5ZXIuaWQgPSBnZW5lcmF0ZUhhc2hJZChMQVlFUl9JRF9MRU5HVEgpO1xuXG4gIC8vIGFkZCBsYXllciB0byBzdGF0ZVxuICBsZXQgbmV4dFN0YXRlID0gYWRkTGF5ZXJVcGRhdGVyKHN0YXRlLCB7Y29uZmlnOiBsb2FkZWRMYXllcn0pO1xuICAvLyByZXRyaWV2ZSBuZXdseSBjcmVhdGVkIGxheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gbmV4dFN0YXRlLmxheWVyc1tuZXh0U3RhdGUubGF5ZXJzLmxlbmd0aCAtIDFdO1xuICAvLyB1cGRhdGUgbGF5ZXIgb3JkZXIgd2l0aCBuZXdMeWFlci5pZFxuICBjb25zdCBuZXdMYXllck9yZGVyID0gYXJyYXlJbnNlcnQoXG4gICAgbmV4dFN0YXRlLmxheWVyT3JkZXIuc2xpY2UoMSwgbmV4dFN0YXRlLmxheWVyT3JkZXIubGVuZ3RoKSxcbiAgICBvcmlnaW5hbExheWVyT3JkZXJJZHgsXG4gICAgbmV3TGF5ZXIuaWRcbiAgKTtcblxuICBuZXh0U3RhdGUgPSByZW9yZGVyTGF5ZXJVcGRhdGVyKG5leHRTdGF0ZSwge29yZGVyOiBuZXdMYXllck9yZGVyfSk7XG5cbiAgcmV0dXJuIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbihuZXh0U3RhdGUpO1xufTtcblxuLyoqXG4gKiBBZGQgYSBuZXcgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IG5ld0VmZmVjdCA9IGNyZWF0ZURlY2tFZmZlY3RGcm9tQ29uZmlnKGFjdGlvbi5jb25maWcpO1xuXG4gIC8vIGNvbGxhcHNlIGNvbmZpZ3VyYXRvcnMgZm9yIG90aGVyIGVmZmVjdHNcbiAgc3RhdGUuZWZmZWN0cy5mb3JFYWNoKGVmZmVjdCA9PiBlZmZlY3QudXBkYXRlQ29uZmlnKHtpc0NvbmZpZ0FjdGl2ZTogZmFsc2V9KSk7XG5cbiAgY29uc3QgZWZmZWN0cyA9IFsuLi5zdGF0ZS5lZmZlY3RzLCBuZXdFZmZlY3RdO1xuICBjb25zdCBlZmZlY3RPcmRlciA9IGZpeEVmZmVjdE9yZGVyKGVmZmVjdHMsIFtuZXdFZmZlY3QuaWQsIC4uLnN0YXRlLmVmZmVjdE9yZGVyXSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzLFxuICAgIGVmZmVjdE9yZGVyXG4gIH07XG59O1xuXG4vKipcbiAqIHJlbW92ZSBlZmZlY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmVmZmVjdHMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gc3RhdGUuZWZmZWN0cy5sZW5ndGgpIHtcbiAgICBDb25zb2xlLndhcm4oYGNhbiBub3QgcmVtb3ZlIGVmZmVjdCB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7ZWZmZWN0cywgZWZmZWN0T3JkZXJ9ID0gc3RhdGU7XG4gIGNvbnN0IGVmZmVjdFRvUmVtb3ZlID0gZWZmZWN0c1tpZHhdO1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZml4ZWQgaW4gdHNcbiAgICBlZmZlY3RzOiBmaWx0ZXJPdXRCeUlkKGVmZmVjdFRvUmVtb3ZlLmlkKShlZmZlY3RzKSxcbiAgICBlZmZlY3RPcmRlcjogZWZmZWN0T3JkZXIuZmlsdGVyKGVmZmVjdElkID0+IGVmZmVjdElkICE9PSBlZmZlY3RUb1JlbW92ZS5pZClcbiAgfTtcbn07XG5cbi8qKlxuICogUmVvcmRlciBlZmZlY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW9yZGVyRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7b3JkZXJ9OiBWaXNTdGF0ZUFjdGlvbnMuUmVvcmRlckVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBlZmZlY3RPcmRlcjogZml4RWZmZWN0T3JkZXIoc3RhdGUuZWZmZWN0cywgWy4uLm9yZGVyXSlcbn0pO1xuXG4vKipcbiAqIFVwZGF0ZSBlZmZlY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVFZmZlY3RVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZCwgcHJvcHN9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBzdGF0ZS5lZmZlY3RzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmVmZmVjdHMubGVuZ3RoKSB7XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHVwZGF0ZSBlZmZlY3Qgd2l0aCBpbnZhbGlkIGlkICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgbmV3RWZmZWN0cyA9IFsuLi5zdGF0ZS5lZmZlY3RzXTtcbiAgbmV3RWZmZWN0c1tpZHhdLnVwZGF0ZUNvbmZpZyhwcm9wcyk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZmZlY3RzOiBuZXdFZmZlY3RzXG4gIH07XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGRhdGFzZXQgYW5kIGFsbCBsYXllcnMsIGZpbHRlcnMsIHRvb2x0aXAgY29uZmlncyB0aGF0IGJhc2VkIG9uIGl0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGF0YXNldFVwZGF0ZXI8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBUIHtcbiAgLy8gZXh0cmFjdCBkYXRhc2V0IGtleVxuICBjb25zdCB7ZGF0YUlkOiBkYXRhc2V0S2V5fSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuXG4gIC8vIGNoZWNrIGlmIGRhdGFzZXQgaXMgcHJlc2VudFxuICBpZiAoIWRhdGFzZXRzW2RhdGFzZXRLZXldKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgY29uc3Qge1xuICAgIGxheWVycyxcbiAgICBkYXRhc2V0czoge1tkYXRhc2V0S2V5XTogZGF0YXNldCwgLi4ubmV3RGF0YXNldHN9XG4gIH0gPSBzdGF0ZTtcbiAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4gIGNvbnN0IGxheWVyc1RvUmVtb3ZlID0gbGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCA9PT0gZGF0YXNldEtleSkubWFwKGwgPT4gbC5pZCk7XG5cbiAgLy8gcmVtb3ZlIGxheWVycyBhbmQgZGF0YXNldHNcbiAgbGV0IG5ld1N0YXRlID0gbGF5ZXJzVG9SZW1vdmUucmVkdWNlKChhY2N1LCBpZCkgPT4gcmVtb3ZlTGF5ZXJVcGRhdGVyKGFjY3UsIHtpZH0pLCB7XG4gICAgLi4uc3RhdGUsXG4gICAgZGF0YXNldHM6IG5ld0RhdGFzZXRzXG4gIH0pO1xuXG4gIC8vIHJlbW92ZSBmaWx0ZXJzXG4gIGNvbnN0IGZpbHRlcnMgPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbHRlcihmaWx0ZXIgPT4gIWZpbHRlci5kYXRhSWQuaW5jbHVkZXMoZGF0YXNldEtleSkpO1xuXG4gIG5ld1N0YXRlID0gey4uLm5ld1N0YXRlLCBmaWx0ZXJzfTtcblxuICByZXR1cm4gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhuZXdTdGF0ZSwge2RhdGFJZDogZGF0YXNldEtleX0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnKHN0YXRlLCB7ZGF0YUlkfSkge1xuICBsZXQge2ludGVyYWN0aW9uQ29uZmlnfSA9IHN0YXRlO1xuICBjb25zdCB7dG9vbHRpcH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcbiAgaWYgKHRvb2x0aXApIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRvb2x0aXA7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICBjb25zdCB7W2RhdGFJZF06IGZpZWxkcywgLi4uZmllbGRzVG9TaG93fSA9IGNvbmZpZy5maWVsZHNUb1Nob3c7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgIGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICB0b29sdGlwOiB7Li4udG9vbHRpcCwgY29uZmlnOiB7Li4uY29uZmlnLCBmaWVsZHNUb1Nob3d9fVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gey4uLnN0YXRlLCBpbnRlcmFjdGlvbkNvbmZpZ307XG59XG4vKipcbiAqIHVwZGF0ZSBsYXllciBibGVuZGluZyBtb2RlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBsYXllckJsZW5kaW5nOiBhY3Rpb24ubW9kZVxufSk7XG5cbi8qKlxuICogdXBkYXRlIG92ZXJsYXkgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlT3ZlcmxheUJsZW5kaW5nVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG92ZXJsYXlCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIERpc3BsYXkgZGF0YXNldCB0YWJsZSBpbiBhIG1vZGFsXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0aW5nRGF0YXNldDogYWN0aW9uLmRhdGFJZFxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgY3VzdG9tIGNvbG9yIGZvciBkYXRhc2V0cyBhbmQgbGF5ZXJzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVGFibGVDb2xvclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlRGF0YXNldENvbG9yVXBkYXRlclxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihzdGF0ZSwge2RhdGFJZDogYWN0aW9uLmRhdGFJZCwgcHJvcHM6IHtjb2xvcjogYWN0aW9uLm5ld0NvbG9yfX0pO1xufTtcblxuLyoqXG4gKiByZXNldCB2aXNTdGF0ZSB0byBpbml0aWFsIFN0YXRlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVzZXRNYXBDb25maWdVcGRhdGVyID0gKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlID0+ICh7XG4gIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAuLi5zdGF0ZS5pbml0aWFsU3RhdGUsXG4gIGluaXRpYWxTdGF0ZTogc3RhdGUuaW5pdGlhbFN0YXRlXG59KTtcblxuLyoqXG4gKiBQcm9wYWdhdGUgYHZpc1N0YXRlYCByZWR1Y2VyIHdpdGggYSBuZXcgY29uZmlndXJhdGlvbi4gQ3VycmVudCBjb25maWcgd2lsbCBiZSBvdmVycmlkZS5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7XG4gICAgcGF5bG9hZDoge2NvbmZpZyA9IHt9LCBvcHRpb25zID0ge319XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoIWNvbmZpZy52aXNTdGF0ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHtrZWVwRXhpc3RpbmdDb25maWd9ID0gb3B0aW9ucztcblxuICAvLyByZXNldCBjb25maWcgaWYga2VlcEV4aXN0aW5nQ29uZmlnIGlzIGZhbHN5XG4gIGxldCBtZXJnZWRTdGF0ZSA9ICFrZWVwRXhpc3RpbmdDb25maWcgPyByZXNldE1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUpIDogc3RhdGU7XG4gIGZvciAoY29uc3QgbWVyZ2VyIG9mIHN0YXRlLm1lcmdlcnMpIHtcbiAgICBpZiAoaXNWYWxpZE1lcmdlcihtZXJnZXIpICYmIGhhc1Byb3BzVG9NZXJnZShjb25maWcudmlzU3RhdGUsIG1lcmdlci5wcm9wKSkge1xuICAgICAgbWVyZ2VkU3RhdGUgPSBtZXJnZXIubWVyZ2UoXG4gICAgICAgIG1lcmdlZFN0YXRlLFxuICAgICAgICBnZXRQcm9wVmFsdWVUb01lcmdlcihjb25maWcudmlzU3RhdGUsIG1lcmdlci5wcm9wLCBtZXJnZXIudG9NZXJnZVByb3ApLFxuICAgICAgICAvLyBmcm9tQ29uZmlnXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlZFN0YXRlO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxheWVyIGhvdmVyIGV2ZW50IHdpdGggaG92ZXJlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckhvdmVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5PbkxheWVySG92ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgaG92ZXJJbmZvOiB7XG4gICAgLy8gZGVjay5nbCBpbmZvIGlzIG11dGFibGVcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcblxuLyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cyAqL1xuXG4vKipcbiAqIFVwZGF0ZSBgaW50ZXJhY3Rpb25Db25maWdgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkludGVyYWN0aW9uQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29uZmlnfSA9IGFjdGlvbjtcblxuICBjb25zdCBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAuLi5zdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAuLi57W2NvbmZpZy5pZF06IGNvbmZpZ31cbiAgfTtcblxuICAvLyBEb24ndCBlbmFibGUgdG9vbHRpcCBhbmQgYnJ1c2ggYXQgdGhlIHNhbWUgdGltZVxuICAvLyBidXQgY29vcmRpbmF0ZXMgY2FuIGJlIHNob3duIGF0IGFsbCB0aW1lXG4gIGNvbnN0IGNvbnRyYWRpY3QgPSBbJ2JydXNoJywgJ3Rvb2x0aXAnXTtcblxuICBpZiAoXG4gICAgY29udHJhZGljdC5pbmNsdWRlcyhjb25maWcuaWQpICYmXG4gICAgY29uZmlnLmVuYWJsZWQgJiZcbiAgICAhc3RhdGUuaW50ZXJhY3Rpb25Db25maWdbY29uZmlnLmlkXS5lbmFibGVkXG4gICkge1xuICAgIC8vIG9ubHkgZW5hYmxlIG9uZSBpbnRlcmFjdGlvbiBhdCBhIHRpbWVcbiAgICBjb250cmFkaWN0LmZvckVhY2goayA9PiB7XG4gICAgICBpZiAoayAhPT0gY29uZmlnLmlkKSB7XG4gICAgICAgIGludGVyYWN0aW9uQ29uZmlnW2tdID0gey4uLmludGVyYWN0aW9uQ29uZmlnW2tdLCBlbmFibGVkOiBmYWxzZX07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnRlcmFjdGlvbkNvbmZpZ1xuICB9O1xuXG4gIGlmIChjb25maWcuaWQgPT09ICdnZW9jb2RlcicgJiYgIWNvbmZpZy5lbmFibGVkKSB7XG4gICAgcmV0dXJuIHJlbW92ZURhdGFzZXRVcGRhdGVyKG5ld1N0YXRlLCB7ZGF0YUlkOiAnZ2VvY29kZXJfZGF0YXNldCd9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGxheWVyIGNsaWNrIGV2ZW50IHdpdGggY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsYXllckNsaWNrVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5PbkxheWVyQ2xpY2tVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbW91c2VQb3M6IHN0YXRlLmludGVyYWN0aW9uQ29uZmlnLmNvb3JkaW5hdGUuZW5hYmxlZFxuICAgID8ge1xuICAgICAgICAuLi5zdGF0ZS5tb3VzZVBvcyxcbiAgICAgICAgcGlubmVkOiBzdGF0ZS5tb3VzZVBvcy5waW5uZWQgPyBudWxsIDogY2xvbmVEZWVwKHN0YXRlLm1vdXNlUG9zKVxuICAgICAgfVxuICAgIDogc3RhdGUubW91c2VQb3MsXG4gIGNsaWNrZWQ6IGFjdGlvbi5pbmZvICYmIGFjdGlvbi5pbmZvLnBpY2tlZCA/IGFjdGlvbi5pbmZvIDogbnVsbFxufSk7XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgY2xpY2sgZXZlbnQsIHVuc2VsZWN0IGNsaWNrZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbWFwQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTWFwQ2xpY2tVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgY2xpY2tlZDogbnVsbFxuICB9O1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBtb3ZlIGV2ZW50XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbW91c2VNb3ZlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZXZ0fTogVmlzU3RhdGVBY3Rpb25zLk9uTW91c2VNb3ZlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoT2JqZWN0LnZhbHVlcyhzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZykuc29tZShjb25maWcgPT4gY29uZmlnLmVuYWJsZWQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbW91c2VQb3M6IHtcbiAgICAgICAgLi4uc3RhdGUubW91c2VQb3MsXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KGV2dC5wb2ludCkgPyB7bW91c2VQb3NpdGlvbjogWy4uLmV2dC5wb2ludF19IDoge30pLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQubG5nTGF0KSA/IHtjb29yZGluYXRlOiBbLi4uZXZ0LmxuZ0xhdF19IDoge30pXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG4vKipcbiAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGEgbGF5ZXIgZm9yIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT5cbiAgc3RhdGUuc3BsaXRNYXBzICYmIHN0YXRlLnNwbGl0TWFwcy5sZW5ndGggPT09IDBcbiAgICA/IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIC8vIG1heWJlIHdlIHNob3VsZCB1c2UgYW4gYXJyYXkgdG8gc3RvcmUgc3RhdGUgZm9yIGEgc2luZ2xlIG1hcCBhcyB3ZWxsXG4gICAgICAgIC8vIGlmIGN1cnJlbnQgbWFwcyBsZW5ndGggaXMgZXF1YWwgdG8gMCBpdCBtZWFucyB0aGF0IHdlIGFyZSBhYm91dCB0byBzcGxpdCB0aGUgdmlld1xuICAgICAgICBzcGxpdE1hcHM6IGNvbXB1dGVTcGxpdE1hcExheWVycyhzdGF0ZS5sYXllcnMsIHtkdXBsaWNhdGU6IGZhbHNlfSlcbiAgICAgIH1cbiAgICA6IGNsb3NlU3BlY2lmaWNNYXBBdEluZGV4KHN0YXRlLCBhY3Rpb24pO1xuXG4vKipcbiAqIFRvZ2dsZSB2aXNpYmlsaXR5IG9mIGEgbGF5ZXIgaW4gYSBzcGxpdCBtYXBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21hcEluZGV4LCBsYXllcklkfTogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7c3BsaXRNYXBzfSA9IHN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgc3BsaXRNYXBzOiBzcGxpdE1hcHMubWFwKChzbSwgaSkgPT5cbiAgICAgIGkgPT09IG1hcEluZGV4XG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uc3BsaXRNYXBzW2ldLFxuICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXS5sYXllcnMsXG4gICAgICAgICAgICAgIC8vIGlmIGxheWVySWQgbm90IGluIGxheWVycywgc2V0IGl0IHRvIHZpc2libGVcbiAgICAgICAgICAgICAgW2xheWVySWRdOiAhc3BsaXRNYXBzW2ldLmxheWVyc1tsYXllcklkXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgOiBzbVxuICAgIClcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGNvbnN0IHVwZGF0ZVZpc0RhdGFVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZVZpc0RhdGFVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIGRhdGFzZXRzIGNhbiBiZSBhIHNpbmdsZSBkYXRhIGVudHJpZXMgb3IgYW4gYXJyYXkgb2YgbXVsdGlwbGUgZGF0YSBlbnRyaWVzXG4gIGNvbnN0IHtjb25maWcsIG9wdGlvbnN9ID0gYWN0aW9uO1xuXG4gIC8vIGFwcGx5IGNvbmZpZyBpZiBwYXNzZWQgZnJvbSBhY3Rpb25cbiAgLy8gVE9ETzogd2UgZG9uJ3QgaGFuZGxlIGFzeW4gbWVyZ2VycyBoZXJlIHlldFxuICBjb25zdCBwcmV2aW91c1N0YXRlID0gY29uZmlnXG4gICAgPyByZWNlaXZlTWFwQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBwYXlsb2FkOiB7Y29uZmlnLCBvcHRpb25zfVxuICAgICAgfSlcbiAgICA6IHN0YXRlO1xuXG4gIGNvbnN0IGRhdGFzZXRzID0gdG9BcnJheShhY3Rpb24uZGF0YXNldHMpO1xuXG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gZGF0YXNldHMucmVkdWNlKFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgIFR5cGUgJ3t9JyBpcyBtaXNzaW5nIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIHR5cGUgJ1Byb3RvRGF0YXNldCc6IGRhdGEsIGluZm9cbiAgICAoYWNjdSwge2luZm8gPSB7fSwgLi4ucmVzdH0gPSB7fSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oY3JlYXRlTmV3RGF0YUVudHJ5KHtpbmZvLCAuLi5yZXN0fSwgc3RhdGUuZGF0YXNldHMpIHx8IHt9KVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG5cbiAgLy8gc2F2ZSBuZXcgZGF0YXNldCBlbnRyeSB0byBzdGF0ZVxuICBjb25zdCBtZXJnZWRTdGF0ZSA9IHtcbiAgICAuLi5wcmV2aW91c1N0YXRlLFxuICAgIGRhdGFzZXRzOiBtZXJnZURhdGFzZXRzQnlPcmRlcihwcmV2aW91c1N0YXRlLCBuZXdEYXRhRW50cmllcylcbiAgfTtcblxuICAvLyBtZXJnZSBzdGF0ZSB3aXRoIGNvbmZpZyB0byBiZSBtZXJnZWRcbiAgY29uc3QgbGF5ZXJNZXJnZXJzID0gc3RhdGUubWVyZ2Vycy5maWx0ZXIobSA9PiBtLndhaXRGb3JMYXllckRhdGEpO1xuICBjb25zdCBkYXRhc2V0TWVyZ2VycyA9IHN0YXRlLm1lcmdlcnMuZmlsdGVyKG0gPT4gIWxheWVyTWVyZ2Vycy5pbmNsdWRlcyhtKSk7XG5cbiAgY29uc3QgbmV3RGF0YUlkcyA9IE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKTtcbiAgY29uc3QgcG9zdE1lcmdlclBheWxvYWQgPSB7XG4gICAgbmV3RGF0YUlkcyxcbiAgICBvcHRpb25zLFxuICAgIGxheWVyTWVyZ2Vyc1xuICB9O1xuXG4gIHJldHVybiBhcHBseU1lcmdlcnNVcGRhdGVyKG1lcmdlZFN0YXRlLCB7bWVyZ2VyczogZGF0YXNldE1lcmdlcnMsIHBvc3RNZXJnZXJQYXlsb2FkfSk7XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNZXJnZXJzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IHtcbiAgICBtZXJnZXJzOiBNZXJnZXI8YW55PltdO1xuICAgIHBvc3RNZXJnZXJQYXlsb2FkOiBQb3N0TWVyZ2VyUGF5bG9hZDtcbiAgfVxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7bWVyZ2VycywgcG9zdE1lcmdlclBheWxvYWR9ID0gYWN0aW9uO1xuXG4gIC8vIG1lcmdlIHN0YXRlIHdpdGggY29uZmlnIHRvIGJlIG1lcmdlZFxuICBjb25zdCBtZXJnZVN0YXRlUmVzdWx0ID0gbWVyZ2VTdGF0ZUZyb21NZXJnZXJzKFxuICAgIHN0YXRlLFxuICAgIHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlXG4gICAgfSxcbiAgICBtZXJnZXJzLFxuICAgIC8vIG5ld0RhdGFJZHMsXG4gICAgcG9zdE1lcmdlclBheWxvYWRcbiAgKTtcblxuICAvLyBpZiBhbGwgbWVyZ2VkLCBraWNrdXAgcG9zdCBtZXJnZSBwcm9jZXNzXG4gIC8vIGlmIG5vdCB3YWl0XG4gIHJldHVybiBtZXJnZVN0YXRlUmVzdWx0LmFsbE1lcmdlZFxuICAgID8gcG9zdE1lcmdlVXBkYXRlcihtZXJnZVN0YXRlUmVzdWx0Lm1lcmdlZFN0YXRlLCBwb3N0TWVyZ2VyUGF5bG9hZClcbiAgICA6IG1lcmdlU3RhdGVSZXN1bHQubWVyZ2VkU3RhdGU7XG59XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKi9cbmZ1bmN0aW9uIHBvc3RNZXJnZVVwZGF0ZXIobWVyZ2VkU3RhdGU6IFZpc1N0YXRlLCBwb3N0TWVyZ2VyUGF5bG9hZDogUG9zdE1lcmdlclBheWxvYWQpOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtuZXdEYXRhSWRzLCBvcHRpb25zLCBsYXllck1lcmdlcnN9ID0gcG9zdE1lcmdlclBheWxvYWQ7XG4gIGNvbnN0IG5ld0ZpbHRlcnMgPSBtZXJnZWRTdGF0ZS5maWx0ZXJzLmZpbHRlcihmID0+XG4gICAgZi5kYXRhSWQuZmluZChmRGF0YUlkID0+IG5ld0RhdGFJZHMuaW5jbHVkZXMoZkRhdGFJZCkpXG4gICk7XG4gIGNvbnN0IGRhdGFzZXRGaWx0ZXJlZDogc3RyaW5nW10gPSB1bmlxKFxuICAgIG5ld0ZpbHRlcnMucmVkdWNlKChhY2N1LCBmKSA9PiBbLi4uYWNjdSwgLi4uZi5kYXRhSWRdLCBbXSBhcyBzdHJpbmdbXSlcbiAgKTtcbiAgY29uc3QgZGF0YUVtcHR5ID0gbmV3RGF0YUlkcy5sZW5ndGggPCAxO1xuXG4gIGxldCBuZXdMYXllcnMgPSAhZGF0YUVtcHR5XG4gICAgPyBtZXJnZWRTdGF0ZS5sYXllcnMuZmlsdGVyKGwgPT4gbC5jb25maWcuZGF0YUlkICYmIG5ld0RhdGFJZHMuaW5jbHVkZXMobC5jb25maWcuZGF0YUlkKSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gbmV3RGF0YUlkcy5yZWR1Y2UoXG4gICAgKGFjY3UsIGlkKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtpZF06IG1lcmdlZFN0YXRlLmRhdGFzZXRzW2lkXVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG5cbiAgaWYgKCFuZXdMYXllcnMubGVuZ3RoICYmIChvcHRpb25zIHx8IHt9KS5hdXRvQ3JlYXRlTGF5ZXJzICE9PSBmYWxzZSkge1xuICAgIC8vIG5vIGxheWVyIG1lcmdlZCwgZmluZCBkZWZhdWx0c1xuICAgIGNvbnN0IHJlc3VsdCA9IGFkZERlZmF1bHRMYXllcnMobWVyZ2VkU3RhdGUsIG5ld0RhdGFFbnRyaWVzKTtcbiAgICBtZXJnZWRTdGF0ZSA9IHJlc3VsdC5zdGF0ZTtcbiAgICBuZXdMYXllcnMgPSByZXN1bHQubmV3TGF5ZXJzO1xuICB9XG5cbiAgaWYgKG1lcmdlZFN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICAvLyBpZiBtYXAgaXMgc3BsaXQsIGFkZCBuZXcgbGF5ZXJzIHRvIHNwbGl0TWFwc1xuICAgIG5ld0xheWVycyA9IG1lcmdlZFN0YXRlLmxheWVycy5maWx0ZXIoXG4gICAgICBsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBuZXdEYXRhSWRzLmluY2x1ZGVzKGwuY29uZmlnLmRhdGFJZClcbiAgICApO1xuICAgIG1lcmdlZFN0YXRlID0ge1xuICAgICAgLi4ubWVyZ2VkU3RhdGUsXG4gICAgICBzcGxpdE1hcHM6IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAobWVyZ2VkU3RhdGUuc3BsaXRNYXBzLCBuZXdMYXllcnMpXG4gICAgfTtcbiAgfVxuXG4gIC8vIGlmIG5vIHRvb2x0aXBzIG1lcmdlZCBhZGQgZGVmYXVsdCB0b29sdGlwc1xuICBuZXdEYXRhSWRzLmZvckVhY2goZGF0YUlkID0+IHtcbiAgICBjb25zdCB0b29sdGlwRmllbGRzID0gbWVyZ2VkU3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG4gICAgLy8gbG9hZGluZyBkYXRhc2V0OiBhdXRvQ3JlYXRlVG9vbHRpcHMgaXMgZmFsc2UgYW5kIHdlIGRvbid0IHdhbnQgdG8gcnVuIGFkZERlZmF1bHRUb29sdGlwcyB3aGVuIHRvb2x0aXBGaWVsZHMgaXMgZW1wdHlcbiAgICBpZiAoXG4gICAgICBvcHRpb25zPy5hdXRvQ3JlYXRlVG9vbHRpcHMgIT09IGZhbHNlICYmXG4gICAgICAoIUFycmF5LmlzQXJyYXkodG9vbHRpcEZpZWxkcykgfHwgIXRvb2x0aXBGaWVsZHMubGVuZ3RoKVxuICAgICkge1xuICAgICAgLy8gYWRkaW5nIGRhdGFzZXQ6IGF1dG9DcmVhdGVUb29sdGlwcyBpcyB0cnVlXG4gICAgICBtZXJnZWRTdGF0ZSA9IGFkZERlZmF1bHRUb29sdGlwcyhtZXJnZWRTdGF0ZSwgbmV3RGF0YUVudHJpZXNbZGF0YUlkXSk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCB1cGRhdGVkRGF0YXNldHMgPSBkYXRhRW1wdHlcbiAgICA/IE9iamVjdC5rZXlzKG1lcmdlZFN0YXRlLmRhdGFzZXRzKVxuICAgIDogdW5pcShPYmplY3Qua2V5cyhuZXdEYXRhRW50cmllcykuY29uY2F0KGRhdGFzZXRGaWx0ZXJlZCkpO1xuXG4gIGxldCB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEobWVyZ2VkU3RhdGUsIHVwZGF0ZWREYXRhc2V0cywgdW5kZWZpbmVkKTtcblxuICAvLyByZWdpc3RlciBsYXllciBhbmltYXRpb24gZG9tYWluLFxuICAvLyBuZWVkIHRvIGJlIGNhbGxlZCBhZnRlciBsYXllciBkYXRhIGlzIGNhbGN1bGF0ZWRcbiAgdXBkYXRlZFN0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKHVwZGF0ZWRTdGF0ZSk7XG5cbiAgLy8gdHJ5IHRvIHByb2Nlc3MgbGF5ZXJNZXJnZXJzIGFmdGVyIGRhdGFzZXQrZGF0YXNldE1lcmdlcnNcbiAgcmV0dXJuIGxheWVyTWVyZ2VycyAmJiBsYXllck1lcmdlcnMubGVuZ3RoID4gMFxuICAgID8gYXBwbHlNZXJnZXJzVXBkYXRlcih1cGRhdGVkU3RhdGUsIHtcbiAgICAgICAgbWVyZ2VyczogbGF5ZXJNZXJnZXJzLFxuICAgICAgICBwb3N0TWVyZ2VyUGF5bG9hZDogey4uLnBvc3RNZXJnZXJQYXlsb2FkLCBsYXllck1lcmdlcnM6IFtdfVxuICAgICAgfSlcbiAgICA6IHVwZGF0ZWRTdGF0ZTtcbn1cblxuLyoqXG4gKiBSZW5hbWUgYW4gZXhpc3RpbmcgZGF0YXNldCBpbiBgdmlzU3RhdGVgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuYW1lRGF0YXNldFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVuYW1lRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7bGFiZWw6IGFjdGlvbi5sYWJlbH19KTtcbn1cblxuY29uc3QgQUxMT1dFRF9VUERBVEVfREFUQVNFVF9QUk9QUyA9IFsnbGFiZWwnLCAnY29sb3InLCAnbWV0YWRhdGEnXTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgcHJvcGVydGllcyBiZWZvcmUgdXBkYXRpbmcgdGhlIGRhdGFzZXQuXG4gKiBNYWtlcyBzdXJlIGVhY2ggcHJvcGVydHkgaXMgaW4gdGhlIGFsbG93ZWQgbGlzdFxuICogTWFrZXMgc3VyZSBjb2xvciB2YWx1ZSBpcyBSR0JcbiAqIFBlcmZvcm1zIGRlZXAgbWVyZ2Ugd2hlbiB1cGRhdGluZyBtZXRhZGF0YVxuICovXG5jb25zdCB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyA9IChwcm9wcywgZGF0YXNldCkgPT4ge1xuICBjb25zdCB2YWxpZGF0ZWRQcm9wcyA9IE9iamVjdC5lbnRyaWVzKHByb3BzKS5yZWR1Y2UoKGFjYywgZW50cnkpID0+IHtcbiAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBlbnRyeTtcbiAgICAvLyBpcyBpdCBhbGxvd2VkID9cbiAgICBpZiAoIUFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSBhcmUgYWRkaW5nIGEgY29sb3IgYnV0IGl0IGlzIG5vdCBSR0Igd2UgZG9uJ3QgYWNjZXB0IHRoZSB2YWx1ZVxuICAgIC8vIGluIHRoZSBmdXR1cmUgYXMgd2UgYWRkIG1vcmUgcHJvcHMgd2Ugc2hvdWxkIGNoYW5nZSB0aGlzIGlmIGludG8gYSBzd2l0Y2hcbiAgICBpZiAoa2V5ID09PSAnY29sb3InICYmICFpc1JnYkNvbG9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG5cbiAgICAvLyBkbyB3ZSBuZWVkIGRlZXAgbWVyZ2UgP1xuICAgIHJldHVybiB7Li4uYWNjLCBba2V5XTogaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyBkZWVwbWVyZ2UoZGF0YXNldFtrZXldIHx8IHt9LCB2YWx1ZSkgOiB2YWx1ZX07XG4gIH0sIHt9KTtcblxuICByZXR1cm4gdmFsaWRhdGVkUHJvcHM7XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBEYXRhc2V0IHByb3BzIChsYWJlbCwgY29sb3IsIG1ldGEpLiBEbyBub3QgdXNlIHRvIHVwZGF0ZSBkYXRhIG9yIGFueSByZWxhdGVkIHByb3BlcnRpZXNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2RhdGFJZCwgcHJvcHN9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG4gIGNvbnN0IGV4aXN0aW5nID0gZGF0YXNldHNbZGF0YUlkXTtcblxuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBjb25zdCB2YWxpZGF0ZWRQcm9wcyA9IHZhbGlkYXRlRGF0YXNldFVwZGF0ZVByb3BzKHByb3BzLCBleGlzdGluZyk7XG4gICAgLy8gIHZhbGlkYXRlIHByb3BzOiBqdXN0IGNvbG9yIGZvciBub3dcbiAgICAvLyAgd2Ugb25seSBhbGxvdyBsYWJlbCwgY29sb3IgYW5kIG1ldGEgdG8gYmUgdXBkYXRlZFxuICAgIC8vIGNvbnN0IG5ld1RhYmxlID0gY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgZGF0YXNldHM6IHtcbiAgICAgICAgLi4uZGF0YXNldHMsXG4gICAgICAgIFtkYXRhSWRdOiBjb3B5VGFibGVBbmRVcGRhdGUoZXhpc3RpbmcsIHZhbGlkYXRlZFByb3BzKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogV2hlbiBhIHVzZXIgY2xpY2tzIG9uIHRoZSBzcGVjaWZpYyBtYXAgY2xvc2luZyBpY29uXG4gKiB0aGUgYXBwbGljYXRpb24gd2lsbCBjbG9zZSB0aGUgc2VsZWN0ZWQgbWFwXG4gKiBhbmQgd2lsbCBtZXJnZSB0aGUgcmVtYWluaW5nIG9uZSB3aXRoIHRoZSBnbG9iYWwgc3RhdGVcbiAqIFRPRE86IGkgdGhpbmsgaW4gdGhlIGZ1dHVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgY2FsbGVkIG1lcmdlIG1hcCBsYXllcnMgd2l0aCBnbG9iYWwgc2V0dGluZ3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZSBgdmlzU3RhdGVgXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIGFjdGlvblxuICogQHJldHVybnMge09iamVjdH0gbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleDxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBTIHtcbiAgLy8gcmV0cmlldmUgbGF5ZXJzIG1ldGEgZGF0YSBmcm9tIHRoZSByZW1haW5pbmcgbWFwIHRoYXQgd2UgbmVlZCB0byBrZWVwXG4gIGNvbnN0IGluZGV4VG9SZXRyaWV2ZSA9IDEgLSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3QgbWFwTGF5ZXJzID0gc3RhdGUuc3BsaXRNYXBzW2luZGV4VG9SZXRyaWV2ZV0/LmxheWVycztcbiAgY29uc3Qge2xheWVyc30gPSBzdGF0ZTtcblxuICAvLyB1cGRhdGUgbGF5ZXIgdmlzaWJpbGl0eVxuICBjb25zdCBuZXdMYXllcnMgPSBsYXllcnMubWFwKGxheWVyID0+XG4gICAgbWFwTGF5ZXJzICYmICFtYXBMYXllcnNbbGF5ZXIuaWRdICYmIGxheWVyLmNvbmZpZy5pc1Zpc2libGVcbiAgICAgID8gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgICAgIC8vIGlmIGxheWVyLmlkIGlzIG5vdCBpbiBtYXBMYXllcnMsIGl0IHNob3VsZCBiZSBpblZpc2libGVcbiAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICA6IGxheWVyXG4gICk7XG5cbiAgLy8gZGVsZXRlIG1hcFxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIHNwbGl0TWFwczogW11cbiAgfTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGZpbGUgbG9hZGluZyBkaXNwYXRjaCBgYWRkRGF0YVRvTWFwYCBpZiBzdWNjZWVkLCBvciBgbG9hZEZpbGVzRXJyYCBpZiBmYWlsZWRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge2ZpbGVzLCBvbkZpbmlzaCA9IGxvYWRGaWxlc1N1Y2Nlc3N9ID0gYWN0aW9uO1xuICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVMb2FkaW5nUHJvZ3Jlc3MgPSBBcnJheS5mcm9tKGZpbGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGYsIGkpID0+IG1lcmdlXyhpbml0aWFsRmlsZUxvYWRpbmdQcm9ncmVzcyhmLCBpKSkoYWNjdSksXG4gICAge31cbiAgKTtcblxuICBjb25zdCBmaWxlTG9hZGluZyA9IHtcbiAgICBmaWxlQ2FjaGU6IFtdLFxuICAgIGZpbGVzVG9Mb2FkOiBmaWxlcyxcbiAgICBvbkZpbmlzaFxuICB9O1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IG1lcmdlXyh7ZmlsZUxvYWRpbmdQcm9ncmVzcywgZmlsZUxvYWRpbmd9KShzdGF0ZSk7XG5cbiAgcmV0dXJuIGxvYWROZXh0RmlsZVVwZGF0ZXIobmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogU3VjZXNzZnVsbHkgbG9hZGVkIG9uZSBmaWxlLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlU3RlcFN1Y2Nlc3NVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxvYWRGaWxlU3RlcFN1Y2Nlc3NBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZU5hbWUsIGZpbGVDYWNoZX0gPSBhY3Rpb247XG4gIGNvbnN0IHtmaWxlc1RvTG9hZCwgb25GaW5pc2h9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdEb25lJ31cbiAgfSk7XG5cbiAgLy8gc2F2ZSBwcm9jZXNzZWQgZmlsZSB0byBmaWxlQ2FjaGVcbiAgY29uc3Qgc3RhdGVXaXRoQ2FjaGUgPSBwaWNrXygnZmlsZUxvYWRpbmcnKShtZXJnZV8oe2ZpbGVDYWNoZX0pKShzdGF0ZVdpdGhQcm9ncmVzcyk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aENhY2hlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn1cblxuLy8gd2l0aFRhc2s8VD4oc3RhdGU6IFQsIHRhc2s6IGFueSk6IFRcblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWROZXh0RmlsZVVwZGF0ZXIoc3RhdGU6IFZpc1N0YXRlKTogVmlzU3RhdGUge1xuICBpZiAoIXN0YXRlLmZpbGVMb2FkaW5nKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHtmaWxlc1RvTG9hZH0gPSBzdGF0ZS5maWxlTG9hZGluZztcbiAgY29uc3QgW2ZpbGUsIC4uLnJlbWFpbmluZ0ZpbGVzVG9Mb2FkXSA9IGZpbGVzVG9Mb2FkO1xuXG4gIC8vIHNhdmUgZmlsZXNUb0xvYWQgdG8gc3RhdGVcbiAgY29uc3QgbmV4dFN0YXRlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlc1RvTG9hZDogcmVtYWluaW5nRmlsZXNUb0xvYWR9KSkoc3RhdGUpO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIobmV4dFN0YXRlLCB7XG4gICAgZmlsZU5hbWU6IGZpbGUubmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDAsIG1lc3NhZ2U6ICdsb2FkaW5nLi4uJ31cbiAgfSk7XG5cbiAgY29uc3Qge2xvYWRlcnMsIGxvYWRPcHRpb25zfSA9IHN0YXRlO1xuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgbWFrZUxvYWRGaWxlVGFzayhcbiAgICAgIGZpbGUsXG4gICAgICBuZXh0U3RhdGUuZmlsZUxvYWRpbmcgJiYgbmV4dFN0YXRlLmZpbGVMb2FkaW5nLmZpbGVDYWNoZSxcbiAgICAgIGxvYWRlcnMsXG4gICAgICBsb2FkT3B0aW9uc1xuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VMb2FkRmlsZVRhc2soZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzOiBMb2FkZXJbXSA9IFtdLCBsb2FkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBMT0FEX0ZJTEVfVEFTSyh7ZmlsZSwgZmlsZUNhY2hlLCBsb2FkZXJzLCBsb2FkT3B0aW9uc30pLmJpbWFwKFxuICAgIC8vIHByZXR0aWVyIGlnbm9yZVxuICAgIC8vIHN1Y2Nlc3NcbiAgICBnZW4gPT5cbiAgICAgIG5leHRGaWxlQmF0Y2goe1xuICAgICAgICBnZW4sXG4gICAgICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIG9uRmluaXNoOiByZXN1bHQgPT5cbiAgICAgICAgICBwcm9jZXNzRmlsZUNvbnRlbnQoe1xuICAgICAgICAgICAgY29udGVudDogcmVzdWx0LFxuICAgICAgICAgICAgZmlsZUNhY2hlXG4gICAgICAgICAgfSlcbiAgICAgIH0pLFxuXG4gICAgLy8gZXJyb3JcbiAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGUubmFtZSwgZXJyKVxuICApO1xufVxuXG4vKipcbiAqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Qcm9jZXNzRmlsZUNvbnRlbnRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb250ZW50LCBmaWxlQ2FjaGV9ID0gYWN0aW9uLnBheWxvYWQ7XG5cbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiB7cGVyY2VudDogMSwgbWVzc2FnZTogJ3Byb2Nlc3NpbmcuLi4nfVxuICB9KTtcblxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgc3RhdGVXaXRoUHJvZ3Jlc3MsXG4gICAgUFJPQ0VTU19GSUxFX0RBVEEoe2NvbnRlbnQsIGZpbGVDYWNoZX0pLmJpbWFwKFxuICAgICAgcmVzdWx0ID0+IGxvYWRGaWxlU3RlcFN1Y2Nlc3Moe2ZpbGVOYW1lOiBjb250ZW50LmZpbGVOYW1lLCBmaWxlQ2FjaGU6IHJlc3VsdH0pLFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0Vycihjb250ZW50LmZpbGVOYW1lLCBlcnIpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQcm9ncmVzcyhwcmV2UHJvZ3Jlc3MgPSB7fSwgcHJvZ3Jlc3MpIHtcbiAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcmVjZWl2aW5nIHF1ZXJ5IG1ldGFkYXRhIG9yIG90aGVyIGNhc2VzIHdlIGRvbid0XG4gIC8vIGhhdmUgYW4gdXBkYXRlIGZvciB0aGUgdXNlci5cbiAgaWYgKCFwcm9ncmVzcyB8fCAhcHJvZ3Jlc3MucGVyY2VudCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyY2VudDogcHJvZ3Jlc3MucGVyY2VudFxuICB9O1xufVxuXG4vKipcbiAqIGdldHMgY2FsbGVkIHdpdGggcGF5bG9hZCA9IEFzeW5jR2VuZXJhdG9yPD8/Pz5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBuZXh0RmlsZUJhdGNoVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7XG4gICAgcGF5bG9hZDoge2dlbiwgZmlsZU5hbWUsIHByb2dyZXNzLCBhY2N1bXVsYXRlZCwgb25GaW5pc2h9XG4gIH06IFZpc1N0YXRlQWN0aW9ucy5OZXh0RmlsZUJhdGNoVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHBhcnNlUHJvZ3Jlc3Moc3RhdGUuZmlsZUxvYWRpbmdQcm9ncmVzc1tmaWxlTmFtZV0sIHByb2dyZXNzKVxuICB9KTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFVOV1JBUF9UQVNLKGdlbi5uZXh0KCkpLmJpbWFwKFxuICAgICAgKHt2YWx1ZSwgZG9uZX0pID0+IHtcbiAgICAgICAgcmV0dXJuIGRvbmVcbiAgICAgICAgICA/IG9uRmluaXNoKGFjY3VtdWxhdGVkKVxuICAgICAgICAgIDogbmV4dEZpbGVCYXRjaCh7XG4gICAgICAgICAgICAgIGdlbixcbiAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgIHByb2dyZXNzOiB2YWx1ZS5wcm9ncmVzcyxcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZWQ6IHZhbHVlLFxuICAgICAgICAgICAgICBvbkZpbmlzaFxuICAgICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsb2FkaW5nIGZpbGUgZXJyb3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNFcnJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtlcnJvciwgZmlsZU5hbWV9OiBWaXNTdGF0ZUFjdGlvbnMuTG9hZEZpbGVzRXJyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyB1cGRhdGUgdWkgd2l0aCBlcnJvciBtZXNzYWdlXG4gIENvbnNvbGUud2FybihlcnJvcik7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVzVG9Mb2FkLCBvbkZpbmlzaCwgZmlsZUNhY2hlfSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtlcnJvcn1cbiAgfSk7XG5cbiAgLy8ga2ljayBvZmYgbmV4dCBmaWxlIG9yIGZpbmlzaFxuICByZXR1cm4gd2l0aFRhc2soXG4gICAgbmV4dFN0YXRlLFxuICAgIERFTEFZX1RBU0soMjAwKS5tYXAoZmlsZXNUb0xvYWQubGVuZ3RoID8gbG9hZE5leHRGaWxlIDogKCkgPT4gb25GaW5pc2goZmlsZUNhY2hlKSlcbiAgKTtcbn07XG5cbi8qKlxuICogV2hlbiBzZWxlY3QgZGF0YXNldCBmb3IgZXhwb3J0LCBhcHBseSBjcHUgZmlsdGVyIHRvIHNlbGVjdGVkIGRhdGFzZXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseUNQVUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZH06IFZpc1N0YXRlQWN0aW9ucy5BcHBseUNQVUZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgLy8gYXBwbHkgY3B1RmlsdGVyXG4gIGNvbnN0IGRhdGFJZHMgPSB0b0FycmF5KGRhdGFJZCk7XG5cbiAgcmV0dXJuIGRhdGFJZHMucmVkdWNlKChhY2N1LCBpZCkgPT4gZmlsdGVyRGF0YXNldENQVShhY2N1LCBpZCksIHN0YXRlKTtcbn07XG5cbi8qKlxuICogVXNlciBpbnB1dCB0byB1cGRhdGUgdGhlIGluZm8gb2YgdGhlIG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldE1hcEluZm9VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldE1hcEluZm9VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbWFwSW5mbzoge1xuICAgIC4uLnN0YXRlLm1hcEluZm8sXG4gICAgLi4uYWN0aW9uLmluZm9cbiAgfVxufSk7XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgQWxsIGxheWVyIGRvbWFpbiBhbmQgbGF5ZXIgZGF0YSBvZiBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdExheWVycyhcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBkYXRhc2V0czogRGF0YXNldHNcbik6IHtzdGF0ZTogVmlzU3RhdGU7IG5ld0xheWVyczogTGF5ZXJbXX0ge1xuICBjb25zdCBlbXB0eTogTGF5ZXJbXSA9IFtdO1xuICBjb25zdCBkZWZhdWx0TGF5ZXJzID0gT2JqZWN0LnZhbHVlcyhkYXRhc2V0cykucmVkdWNlKChhY2N1OiBMYXllcltdLCBkYXRhc2V0KSA9PiB7XG4gICAgY29uc3QgZm91bmRMYXllcnMgPSBmaW5kRGVmYXVsdExheWVyKGRhdGFzZXQsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gICAgcmV0dXJuIGZvdW5kTGF5ZXJzICYmIGZvdW5kTGF5ZXJzLmxlbmd0aCA/IGFjY3UuY29uY2F0KGZvdW5kTGF5ZXJzKSA6IGFjY3U7XG4gIH0sIGVtcHR5KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxheWVyczogWy4uLnN0YXRlLmxheWVycywgLi4uZGVmYXVsdExheWVyc10sXG4gICAgICBsYXllck9yZGVyOiBbXG4gICAgICAgIC8vIHB1dCBuZXcgbGF5ZXJzIG9uIHRvcCBvZiBvbGQgb25lcyBpbiByZXZlcnNlXG4gICAgICAgIC4uLmdldExheWVyT3JkZXJGcm9tTGF5ZXJzKGRlZmF1bHRMYXllcnMpLFxuICAgICAgICAuLi5zdGF0ZS5sYXllck9yZGVyXG4gICAgICBdXG4gICAgfSxcbiAgICBuZXdMYXllcnM6IGRlZmF1bHRMYXllcnNcbiAgfTtcbn1cblxuLyoqXG4gKiBoZWxwZXIgZnVuY3Rpb24gdG8gZmluZCBkZWZhdWx0IHRvb2x0aXBzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhc2V0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERlZmF1bHRUb29sdGlwcyhzdGF0ZSwgZGF0YXNldCkge1xuICBjb25zdCB0b29sdGlwRmllbGRzID0gZmluZEZpZWxkc1RvU2hvdyh7XG4gICAgLi4uZGF0YXNldCxcbiAgICBtYXhEZWZhdWx0VG9vbHRpcHM6IHN0YXRlLm1heERlZmF1bHRUb29sdGlwc1xuICB9KTtcbiAgY29uc3QgbWVyZ2VkID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAuLi50b29sdGlwRmllbGRzXG4gIH07XG5cbiAgcmV0dXJuIHNldChbJ2ludGVyYWN0aW9uQ29uZmlnJywgJ3Rvb2x0aXAnLCAnY29uZmlnJywgJ2ZpZWxkc1RvU2hvdyddLCBtZXJnZWQsIHN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzKGZpbGUsIGluZGV4KSB7XG4gIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lIHx8IGBVbnRpdGxlZCBGaWxlICR7aW5kZXh9YDtcbiAgcmV0dXJuIHtcbiAgICBbZmlsZU5hbWVdOiB7XG4gICAgICAvLyBwZXJjZW50IG9mIGN1cnJlbnQgZmlsZVxuICAgICAgcGVyY2VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgZmlsZU5hbWUsXG4gICAgICBlcnJvcjogbnVsbFxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7ZmlsZU5hbWUsIHByb2dyZXNzfSkge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBwaWNrXygnZmlsZUxvYWRpbmdQcm9ncmVzcycpKHBpY2tfKGZpbGVOYW1lKShtZXJnZV8ocHJvZ3Jlc3MpKSkoc3RhdGUpO1xufVxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdXBkYXRlIGxheWVyIGRvbWFpbnMgZm9yIGFuIGFycmF5IG9mIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhSWRzID0gdHlwZW9mIGRhdGFJZCA9PT0gJ3N0cmluZycgPyBbZGF0YUlkXSA6IGRhdGFJZDtcbiAgY29uc3QgbmV3TGF5ZXJzOiBMYXllcltdID0gW107XG4gIGNvbnN0IG5ld0xheWVyRGF0YTogYW55W10gPSBbXTtcblxuICBzdGF0ZS5sYXllcnMuZm9yRWFjaCgob2xkTGF5ZXIsIGkpID0+IHtcbiAgICBpZiAob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCAmJiBkYXRhSWRzLmluY2x1ZGVzKG9sZExheWVyLmNvbmZpZy5kYXRhSWQpKSB7XG4gICAgICAvLyBObyBuZWVkIHRvIHJlY2FsY3VsYXRlIGxheWVyIGRvbWFpbiBpZiBmaWx0ZXIgaGFzIGZpeGVkIGRvbWFpblxuICAgICAgY29uc3QgbmV3TGF5ZXIgPVxuICAgICAgICB1cGRhdGVkRmlsdGVyICYmIHVwZGF0ZWRGaWx0ZXIuZml4ZWREb21haW5cbiAgICAgICAgICA/IG9sZExheWVyXG4gICAgICAgICAgOiBvbGRMYXllci51cGRhdGVMYXllckRvbWFpbihzdGF0ZS5kYXRhc2V0cywgdXBkYXRlZEZpbHRlcik7XG5cbiAgICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIHN0YXRlLmxheWVyRGF0YVtpXSk7XG5cbiAgICAgIG5ld0xheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKGxheWVyRGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVycy5wdXNoKG9sZExheWVyKTtcbiAgICAgIG5ld0xheWVyRGF0YS5wdXNoKHN0YXRlLmxheWVyRGF0YVtpXSk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBsYXllckRhdGE6IG5ld0xheWVyRGF0YVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFuaW1hdGlvbkRvbWFpbjxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTKTogUyB7XG4gIC8vIG1lcmdlIGFsbCBhbmltYXRhYmxlIGxheWVyIGRvbWFpbiBhbmQgdXBkYXRlIGdsb2JhbCBjb25maWdcbiAgY29uc3QgYW5pbWF0YWJsZUxheWVycyA9IHN0YXRlLmxheWVycy5maWx0ZXIoXG4gICAgbCA9PlxuICAgICAgbC5jb25maWcuaXNWaXNpYmxlICYmXG4gICAgICBsLmNvbmZpZy5hbmltYXRpb24gJiZcbiAgICAgIGwuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkICYmXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRyaXAtbGF5ZXItb25seVxuICAgICAgQXJyYXkuaXNBcnJheShsLmFuaW1hdGlvbkRvbWFpbilcbiAgKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBkZWZhdWx0VGltZUZvcm1hdDogbnVsbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBjb25zdCBtZXJnZWREb21haW46IFtudW1iZXIsIG51bWJlcl0gPSBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZShcbiAgICAoYWNjdSwgbGF5ZXIpID0+IFtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHJpcC1sYXllci1vbmx5XG4gICAgICBNYXRoLm1pbihhY2N1WzBdLCBsYXllci5hbmltYXRpb25Eb21haW5bMF0pLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cmlwLWxheWVyLW9ubHlcbiAgICAgIE1hdGgubWF4KGFjY3VbMV0sIGxheWVyLmFuaW1hdGlvbkRvbWFpblsxXSlcbiAgICBdLFxuICAgIFtOdW1iZXIoSW5maW5pdHkpLCAtSW5maW5pdHldXG4gICk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGN1cnJlbnRUaW1lOiBpc0luUmFuZ2Uoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lLCBtZXJnZWREb21haW4pXG4gICAgICAgID8gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lXG4gICAgICAgIDogbWVyZ2VkRG9tYWluWzBdLFxuICAgICAgZG9tYWluOiBtZXJnZWREb21haW4sXG4gICAgICBkZWZhdWx0VGltZUZvcm1hdFxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZWRpdG9yXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0RWRpdG9yTW9kZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge21vZGV9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RWRpdG9yTW9kZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBlZGl0b3I6IHtcbiAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgbW9kZSxcbiAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgfVxufSk7XG5cbi8vIGNvbnN0IGZlYXR1cmVUb0ZpbHRlclZhbHVlID0gKGZlYXR1cmUpID0+ICh7Li4uZmVhdHVyZSwgaWQ6IGZlYXR1cmUuaWR9KTtcbi8qKlxuICogVXBkYXRlIGVkaXRvciBmZWF0dXJlc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZlYXR1cmVzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZXMgPSBbXX06IFZpc1N0YXRlQWN0aW9ucy5TZXRGZWF0dXJlc1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgbGFzdEZlYXR1cmUgPSBmZWF0dXJlcy5sZW5ndGggJiYgZmVhdHVyZXNbZmVhdHVyZXMubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAvLyBvbmx5IHNhdmUgbm9uZSBmaWx0ZXIgZmVhdHVyZXMgdG8gZWRpdG9yXG4gICAgICBmZWF0dXJlczogZmVhdHVyZXMuZmlsdGVyKGYgPT4gIWdldEZpbHRlcklkSW5GZWF0dXJlKGYpKSxcbiAgICAgIG1vZGU6IGxhc3RGZWF0dXJlICYmIGxhc3RGZWF0dXJlLnByb3BlcnRpZXMuaXNDbG9zZWQgPyBFRElUT1JfTU9ERVMuRURJVCA6IHN0YXRlLmVkaXRvci5tb2RlXG4gICAgfVxuICB9O1xuXG4gIC8vIFJldHJpZXZlIGV4aXN0aW5nIGZlYXR1cmVcbiAgY29uc3Qge3NlbGVjdGVkRmVhdHVyZX0gPSBzdGF0ZS5lZGl0b3I7XG5cbiAgLy8gSWYgbm8gZmVhdHVyZSBpcyBzZWxlY3RlZCB3ZSBjYW4gc2ltcGx5IHJldHVybiBzaW5jZSBubyBvcGVyYXRpb25zXG4gIGlmICghc2VsZWN0ZWRGZWF0dXJlKSB7XG4gICAgcmV0dXJuIG5ld1N0YXRlO1xuICB9XG5cbiAgLy8gVE9ETzogY2hlY2sgaWYgdGhlIGZlYXR1cmUgaGFzIGNoYW5nZWRcbiAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzLmZpbmQoZiA9PiBmLmlkID09PSBzZWxlY3RlZEZlYXR1cmUuaWQpO1xuXG4gIC8vIGlmIGZlYXR1cmUgaXMgcGFydCBvZiBhIGZpbHRlclxuICBjb25zdCBmaWx0ZXJJZCA9IGZlYXR1cmUgJiYgZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG4gIGlmIChmaWx0ZXJJZCAmJiBmZWF0dXJlKSB7XG4gICAgY29uc3QgZmVhdHVyZVZhbHVlID0gZmVhdHVyZVRvRmlsdGVyVmFsdWUoZmVhdHVyZSwgZmlsdGVySWQpO1xuICAgIGNvbnN0IGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGZpbCA9PiBmaWwuaWQgPT09IGZpbHRlcklkKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySWR4LFxuICAgICAgcHJvcDogJ3ZhbHVlJyxcbiAgICAgIHZhbHVlOiBmZWF0dXJlVmFsdWVcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgZmVhdHVyZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZSwgc2VsZWN0aW9uQ29udGV4dH06IFZpc1N0YXRlQWN0aW9ucy5TZXRTZWxlY3RlZEZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICBzZWxlY3RlZEZlYXR1cmU6IGZlYXR1cmUsXG4gICAgICBzZWxlY3Rpb25Db250ZXh0XG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBEZWxldGUgZXhpc3RpbmcgZmVhdHVyZSBmcm9tIGZpbHRlcnNcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVGZWF0dXJlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZmVhdHVyZX06IFZpc1N0YXRlQWN0aW9ucy5EZWxldGVGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWZlYXR1cmUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICAgIH1cbiAgfTtcblxuICBpZiAoZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSkpIHtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBuZXdTdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGdldEZpbHRlcklkSW5GZWF0dXJlKGZlYXR1cmUpKTtcblxuICAgIHJldHVybiBmaWx0ZXJJZHggPiAtMSA/IHJlbW92ZUZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtpZHg6IGZpbHRlcklkeH0pIDogbmV3U3RhdGU7XG4gIH1cblxuICAvLyBtb2RpZnkgZWRpdG9yIG9iamVjdFxuICBjb25zdCBuZXdFZGl0b3IgPSB7XG4gICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IG5ld0VkaXRvclxuICB9O1xufVxuXG4vKipcbiAqIFRvZ2dsZSBmZWF0dXJlIGFzIGxheWVyIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF5bG9hZDogVmlzU3RhdGVBY3Rpb25zLlNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2xheWVyLCBmZWF0dXJlfSA9IHBheWxvYWQ7XG4gIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSk7XG5cbiAgLy8gbGV0IG5ld0ZpbHRlciA9IG51bGw7XG4gIGxldCBmaWx0ZXJJZHg7XG4gIGxldCBuZXdMYXllcklkID0gW2xheWVyLmlkXTtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIC8vIElmIHBvbHlnb24gZmlsdGVyIGFscmVhZHkgZXhpc3RzLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmIHRoZSBjdXJyZW50IGxheWVyIGlzIGFscmVhZHkgaW5jbHVkZWRcbiAgaWYgKGZpbHRlcklkKSB7XG4gICAgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmaWx0ZXJJZCk7XG5cbiAgICBpZiAoIXN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSkge1xuICAgICAgLy8gd2hhdCBpZiBmaWx0ZXIgZG9lc24ndCBleGlzdD8uLi4gbm90IHBvc3NpYmxlLlxuICAgICAgLy8gYmVjYXVzZSBmZWF0dXJlcyBpbiB0aGUgZWRpdG9yIGlzIHBhc3NlZCBpbiBmcm9tIGZpbHRlcnMgYW5kIGVkaXRvcnMuXG4gICAgICAvLyBidXQgd2Ugd2lsbCBtb3ZlIHRoaXMgZmVhdHVyZSBiYWNrIHRvIGVkaXRvciBqdXN0IGluIGNhc2VcbiAgICAgIGNvbnN0IG5vbmVGaWx0ZXJGZWF0dXJlID0ge1xuICAgICAgICAuLi5mZWF0dXJlLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgLi4uZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIGZpbHRlcklkOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlZGl0b3I6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgICAgZmVhdHVyZXM6IFsuLi5zdGF0ZS5lZGl0b3IuZmVhdHVyZXMsIG5vbmVGaWx0ZXJGZWF0dXJlXSxcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG5vbmVGaWx0ZXJGZWF0dXJlXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XTtcbiAgICBjb25zdCB7bGF5ZXJJZCA9IFtdfSA9IGZpbHRlcjtcbiAgICBjb25zdCBpc0xheWVySW5jbHVkZWQgPSBsYXllcklkLmluY2x1ZGVzKGxheWVyLmlkKTtcblxuICAgIG5ld0xheWVySWQgPSBpc0xheWVySW5jbHVkZWRcbiAgICAgID8gLy8gaWYgbGF5ZXIgaXMgaW5jbHVkZWQsIHJlbW92ZSBpdFxuICAgICAgICBsYXllcklkLmZpbHRlcihsID0+IGwgIT09IGxheWVyLmlkKVxuICAgICAgOiBbLi4ubGF5ZXJJZCwgbGF5ZXIuaWRdO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIHdlIGhhdmVuJ3QgY3JlYXRlIHRoZSBwb2x5Z29uIGZpbHRlciwgY3JlYXRlIGl0XG4gICAgY29uc3QgbmV3RmlsdGVyID0gZ2VuZXJhdGVQb2x5Z29uRmlsdGVyKFtdLCBmZWF0dXJlKTtcbiAgICBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmxlbmd0aDtcblxuICAgIC8vIGFkZCBmZWF0dXJlLCByZW1vdmUgZmVhdHVyZSBmcm9tIGVpZHRvclxuICAgIG5ld1N0YXRlID0ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBmaWx0ZXJzOiBbLi4uc3RhdGUuZmlsdGVycywgbmV3RmlsdGVyXSxcbiAgICAgIGVkaXRvcjoge1xuICAgICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICAgIGZlYXR1cmVzOiBzdGF0ZS5lZGl0b3IuZmVhdHVyZXMuZmlsdGVyKGYgPT4gZi5pZCAhPT0gZmVhdHVyZS5pZCksXG4gICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbmV3RmlsdGVyLnZhbHVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBmaWx0ZXJJZHgsXG4gICAgcHJvcDogJ2xheWVySWQnLFxuICAgIHZhbHVlOiBuZXdMYXllcklkXG4gIH0pO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbiwgbW9kZX06IFZpc1N0YXRlQWN0aW9ucy5Tb3J0VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IHNvcnRNb2RlID0gbW9kZTtcbiAgaWYgKCFzb3J0TW9kZSkge1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gZ2V0KGRhdGFzZXQsIFsnc29ydENvbHVtbicsIGNvbHVtbl0pO1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzaG91bGQgYmUgZml4YWJsZSBpbiBhIFRTIGZpbGVcbiAgICBzb3J0TW9kZSA9IGN1cnJlbnRNb2RlXG4gICAgICA/IE9iamVjdC5rZXlzKFNPUlRfT1JERVIpLmZpbmQobSA9PiBtICE9PSBjdXJyZW50TW9kZSlcbiAgICAgIDogU09SVF9PUkRFUi5BU0NFTkRJTkc7XG4gIH1cblxuICBjb25zdCBzb3J0ZWQgPSBzb3J0RGF0YXNldEJ5Q29sdW1uKGRhdGFzZXQsIGNvbHVtbiwgc29ydE1vZGUpO1xuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBzb3J0ZWQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5QaW5UYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBuZXdEYXRhc2V0ID0gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQsIGNvbHVtbik7XG5cbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIENvcHkgY29sdW1uIGNvbnRlbnQgYXMgc3RyaW5nc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLkNvcHlUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0LmZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IHRleHQgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAubWFwKHJvdyA9PiBwYXJzZUZpZWxkVmFsdWUocm93LnZhbHVlQXQoZmllbGRJZHgpLCB0eXBlKSwgdHJ1ZSlcbiAgICAuam9pbignXFxuJyk7XG5cbiAgY29weSh0ZXh0KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogU2V0IGRpc3BsYXkgZm9ybWF0IGZyb20gY29sdW1ucyBmcm9tIHVzZXIgc2VsZWN0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgZm9ybWF0c306IFZpc1N0YXRlQWN0aW9ucy5TZXRDb2x1bW5EaXNwbGF5Rm9ybWF0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdGaWVsZHMgPSBkYXRhc2V0LmZpZWxkcztcbiAgT2JqZWN0LmtleXMoZm9ybWF0cykuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGNvbnN0IGZpZWxkSWR4ID0gZGF0YXNldC5maWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICAgIGlmIChmaWVsZElkeCA+PSAwKSB7XG4gICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gZm9ybWF0c1tjb2x1bW5dO1xuICAgICAgY29uc3QgZmllbGQgPSBuZXdGaWVsZHNbZmllbGRJZHhdO1xuICAgICAgbmV3RmllbGRzID0gc3dhcF8obWVyZ2VfKHtkaXNwbGF5Rm9ybWF0fSkoZmllbGQpIGFzIHtpZDogc3RyaW5nfSkoXG4gICAgICAgIG5ld0ZpZWxkcyBhcyB7aWQ6IHN0cmluZ31bXVxuICAgICAgKSBhcyBGaWVsZFtdO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbmV3RGF0YXNldCA9IGNvcHlUYWJsZUFuZFVwZGF0ZShkYXRhc2V0LCB7ZmllbGRzOiBuZXdGaWVsZHMgYXMgRmllbGRbXX0pO1xuICByZXR1cm4gcGlja18oJ2RhdGFzZXRzJykobWVyZ2VfKHtbZGF0YUlkXTogbmV3RGF0YXNldH0pKShzdGF0ZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlRWRpdG9yVmlzaWJpbGl0eVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHZpc2libGU6ICFzdGF0ZS5lZGl0b3IudmlzaWJsZVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtpZHgsIGNvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKG9sZEZpbHRlci50eXBlICE9PSBGSUxURVJfVFlQRVMudGltZVJhbmdlKSB7XG4gICAgQ29uc29sZS5lcnJvcihcbiAgICAgIGBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnIGNhbiBvbmx5IGJlIGNhbGxlZCB0byB1cGRhdGUgYSB0aW1lIGZpbHRlci4gY2hlY2sgZmlsdGVyLnR5cGUgPT09ICd0aW1lUmFuZ2UnYFxuICAgICk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlcyA9IGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKTtcblxuICByZXR1cm4gcGlja18oJ2ZpbHRlcnMnKShzd2FwXyhtZXJnZV8odXBkYXRlcykob2xkRmlsdGVyKSkpKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpIHtcbiAgY29uc3QgYWxsb3dlZCA9IFsndGltZUZvcm1hdCcsICd0aW1lem9uZSddO1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29uZmlnKS5yZWR1Y2UoKGFjY3UsIHByb3ApID0+IHtcbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWcgdGFrZXMgdGltZUZvcm1hdCBhbmQvb3IgdGltZXpvbmUgYXMgb3B0aW9ucywgZm91bmQgJHtwcm9wfWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG5cbiAgICAvLyBoZXJlIHdlIGFyZSBOT1QgY2hlY2tpbmcgaWYgdGltZXpvbmUgb3IgdGltZUZvcm1hdCBpbnB1dCBpcyB2YWxpZFxuICAgIGFjY3VbcHJvcF0gPSBjb25maWdbcHJvcF07XG4gICAgcmV0dXJuIGFjY3U7XG4gIH0sIHt9KTtcbn1cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7Y29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ0FjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB1cGRhdGVzID0gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpO1xuICByZXR1cm4gcGlja18oJ2FuaW1hdGlvbkNvbmZpZycpKG1lcmdlXyh1cGRhdGVzKSkoc3RhdGUpO1xufVxuXG4vLyBGaW5kIGRhdGFJZCBmcm9tIGEgc2F2ZWQgdmlzU3RhdGUgcHJvcGVydHk6XG4vLyBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9ucywgbGF5ZXJCbGVuZGluZywgb3ZlcmxheUJsZW5kaW5nLCBzcGxpdE1hcHMsIGFuaW1hdGlvbkNvbmZpZywgZWRpdG9yXG4vLyByZXBsYWNlIGl0IHdpdGggYW5vdGhlciBkYXRhSWRcbmZ1bmN0aW9uIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2YWx1ZTogYW55LCBkYXRhSWQ6IHN0cmluZywgZGF0YUlkVG9SZXBsYWNlOiBzdHJpbmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgcmVwbGFjZWQgPSB2YWx1ZVxuICAgICAgLm1hcCh2ID0+IGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyh2LCBkYXRhSWQsIGRhdGFJZFRvUmVwbGFjZSkpXG4gICAgICAuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIHJlcGxhY2VkLmxlbmd0aCA/IHJlcGxhY2VkIDogbnVsbDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlLmRhdGFJZCA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZGF0YUlkID09PSBkYXRhSWQpIHtcbiAgICAvLyBvdGhlcnNcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBkYXRhSWQ6IGRhdGFJZFRvUmVwbGFjZVxuICAgIH07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5kYXRhSWQpICYmIHZhbHVlLmRhdGFJZC5pbmNsdWRlcyhkYXRhSWQpKSB7XG4gICAgLy8gZmlsdGVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZGF0YUlkOiB2YWx1ZS5kYXRhSWQubWFwKGQgPT4gKGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvUmVwbGFjZSA6IGQpKVxuICAgIH07XG4gIH0gZWxzZSBpZiAodmFsdWUuY29uZmlnPy5kYXRhSWQgJiYgdmFsdWUuY29uZmlnPy5kYXRhSWQgPT09IGRhdGFJZCkge1xuICAgIC8vIGxheWVyXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLnZhbHVlLmNvbmZpZyxcbiAgICAgICAgZGF0YUlkOiBkYXRhSWRUb1JlcGxhY2VcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbHVlKSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eShkYXRhSWQpKSB7XG4gICAgLy8gZm9yIHZhbHVlIHNhdmVkIGFzIHtbZGF0YUlkXTogey4uLn19XG4gICAgcmV0dXJuIHtbZGF0YUlkVG9SZXBsYWNlXTogdmFsdWVbZGF0YUlkXX07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gRmluZCBkYXRhc2V0SWRzIGRlcml2ZWQgYSBzYXZlZCB2aXNTdGF0ZSBQcm9wZXJ0eTtcbmZ1bmN0aW9uIGZpbmRDaGlsZERhdGFzZXRJZHModmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgY2hpbGREYXRhSWRzID0gdmFsdWUubWFwKGZpbmRDaGlsZERhdGFzZXRJZHMpLmZpbHRlcihkID0+IGQpO1xuICAgIHJldHVybiBjaGlsZERhdGFJZHMubGVuZ3RoID8gY2hpbGREYXRhSWRzIDogbnVsbDtcbiAgfVxuXG4gIC8vIGNoaWxkIGRhdGEgaWQgdXN1YWxseSBzdG9yZXMgaW4gdGhlIGRlcml2ZWQgZGF0YXNldCBpbmZvXG4gIHJldHVybiB2YWx1ZT8ubmV3RGF0YXNldD8uaW5mby5pZCB8fCBudWxsO1xufVxuXG4vLyBtb3ZlZCB1bm1lcmdlZCBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9uc1xuZnVuY3Rpb24gbW92ZVZhbHVlVG9CZU1lcmdlZChzdGF0ZSwgcHJvcFZhbHVlcywge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KSB7XG4gIC8vIHJlbW92ZSBwcm9wIHZhbHVlIGZyb20gc3RhdGVcbiAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCByZW1vdmUgdXBkYXRlciB0byBtZXJnZXIgYXMgd2VsbD9cbiAgaWYgKCFwcm9wVmFsdWVzKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHN0YXRlUmVtb3ZlZCA9XG4gICAgcHJvcCA9PT0gJ2xheWVycydcbiAgICAgID8gcHJvcFZhbHVlcy5yZWR1Y2UoKGFjY3UsIHByb3BWYWx1ZSkgPT4gcmVtb3ZlTGF5ZXJVcGRhdGVyKGFjY3UsIHtpZDogcHJvcFZhbHVlLmlkfSksIHN0YXRlKVxuICAgICAgOiBBcnJheS5pc0FycmF5KHN0YXRlW3Byb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgW3Byb3BdOiBzdGF0ZVtwcm9wXS5maWx0ZXIocCA9PiAhcHJvcFZhbHVlcy5maW5kKHByb3BWYWx1ZSA9PiBwLmlkID09PSBwcm9wVmFsdWUuaWQpKVxuICAgICAgICB9XG4gICAgICA6IC8vIGlmIG5vdCBhcnJheSwgd2Ugd29uJ3QgcmVtb3ZlIGl0LCByZW1vdmUgZGF0YXNldCBzaG91bGQgaGFuZGxlIGl0XG4gICAgICAgIHN0YXRlO1xuXG4gIC8vIG1vdmUgdG8gc3RhdGVUb0JlTWVyZ2VkXG4gIGNvbnN0IHRvQmVNZXJnZWQgPSB7XG4gICAgW3RvTWVyZ2VQcm9wXTogc2F2ZVVubWVyZ2VkXG4gICAgICA/IC8vIGNhbGwgbWVyZ2Ugc2F2ZVVubWVyZ2VkIG1ldGhvZFxuICAgICAgICBzYXZlVW5tZXJnZWQoc3RhdGVSZW1vdmVkLCBwcm9wVmFsdWVzKVxuICAgICAgOiAvLyBpZiB0b01lcmdlUHJvcCBpcyBhcmFheSwgYXBwZW5kIHRvIGl0XG4gICAgICBBcnJheS5pc0FycmF5KHN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0pXG4gICAgICA/IFsuLi5zdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdLCAuLi5wcm9wVmFsdWVzXVxuICAgICAgOiAvLyBzYXZlIHByb3BWYWx1ZXMgdG8gdG9NZXJnZVxuICAgICAgaXNPYmplY3Qoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sXG4gICAgICAgICAgLi4ucHJvcFZhbHVlc1xuICAgICAgICB9XG4gICAgICA6IHN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlUmVtb3ZlZCxcbiAgICAuLi50b0JlTWVyZ2VkXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0QW5kRGVwczxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbik6IFQge1xuICByZXR1cm4gY29tcG9zZV88VD4oW1xuICAgIGFwcGx5XyhyZXBsYWNlRGF0YXNldERlcHNJblN0YXRlLCB7ZGF0YUlkLCBkYXRhSWRUb1VzZX0pLFxuICAgIGFwcGx5XyhyZW1vdmVEYXRhc2V0VXBkYXRlciwge2RhdGFJZH0pXG4gIF0pKHN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTdGF0ZUZvckRhdGFzZXRSZXBsYWNlPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuICBjb25zdCBuZXh0U3RhdGUgPSByZXBsYWNlRGF0YXNldEFuZERlcHMoc3RhdGUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAvLyBtYWtlIGEgY29weSBvZiBsYXllck9yZGVyLCBiZWNhdXNlIGxheWVyIGlkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGl0IGJ5IGNhbGxpbmcgcmVtb3ZlTGF5ZXJVcGRhdGVyXG4gIGNvbnN0IHByZXNlcnZlTGF5ZXJPcmRlciA9IFsuLi5zdGF0ZS5sYXllck9yZGVyXTtcblxuICAvLyBwcmVzZXJ2ZSBkYXRhc2V0IG9yZGVyXG4gIG5leHRTdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlciA9IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKS5tYXAoZCA9PlxuICAgIGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZFxuICApO1xuXG4gIC8vIHByZXNlcnZlTGF5ZXJPcmRlclxuICBpZiAobmV4dFN0YXRlLmxheWVyVG9CZU1lcmdlZD8ubGVuZ3RoKSB7XG4gICAgLy8gY29weSBzcGxpdCBtYXBzIHRvIGJlIG1lcmdlZCwgYmVjYXVzZSBpdCB3aWxsIGJlIHJlc2V0IGluIHJlbW92ZSBsYXllclxuICAgIG5leHRTdGF0ZS5zcGxpdE1hcHNUb0JlTWVyZ2VkID0gc2VyaWFsaXplZFN0YXRlPy5zcGxpdE1hcHMgPz8gW107XG4gICAgbmV4dFN0YXRlLmxheWVyT3JkZXIgPSBbLi4ucHJlc2VydmVMYXllck9yZGVyXTtcbiAgfVxuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlRGF0YXNldERlcHNJblN0YXRlPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICB7ZGF0YUlkLCBkYXRhSWRUb1VzZX06IHtkYXRhSWQ6IHN0cmluZzsgZGF0YUlkVG9Vc2U6IHN0cmluZ31cbik6IFQge1xuICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShzdGF0ZSwgc3RhdGUuc2NoZW1hKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBzdGF0ZS5tZXJnZXJzLnJlZHVjZShcbiAgICAoXG4gICAgICBhY2N1U3RhdGUsXG4gICAgICB7cHJvcCwgdG9NZXJnZVByb3AsIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzLCBnZXRDaGlsZERhdGFzZXRJZHMsIHNhdmVVbm1lcmdlZCwgcHJlc2VydmVPcmRlcn1cbiAgICApID0+IHtcbiAgICAgIC8vIGdldCBkYXRhc2V0IGlkcyB0aGF0IGFyZSBkZXBlbmRzIG9uIHRoaXMgZGF0YXNldFxuICAgICAgY29uc3QgcHJvcHMgPSB0b0FycmF5KHByb3ApO1xuICAgICAgY29uc3QgdG9NZXJnZVByb3BzID0gdG9BcnJheSh0b01lcmdlUHJvcCk7XG4gICAgICBjb25zdCBzYXZlZFByb3BzID0gc2VyaWFsaXplZFN0YXRlID8gcHJvcHMubWFwKHAgPT4gc2VyaWFsaXplZFN0YXRlW3BdKSA6IFtdO1xuXG4gICAgICBsZXQgcmVwbGFjZWRTdGF0ZSA9IGFjY3VTdGF0ZTtcbiAgICAgIHNhdmVkUHJvcHMuZm9yRWFjaCgocHJvcFZhbHVlLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlck9wdGlvbnMgPSB7XG4gICAgICAgICAgcHJvcDogcHJvcHNbaV0sXG4gICAgICAgICAgdG9NZXJnZVByb3A6IHRvTWVyZ2VQcm9wc1tpXSxcbiAgICAgICAgICBnZXRDaGlsZERhdGFzZXRJZHMsXG4gICAgICAgICAgc2F2ZVVubWVyZ2VkXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVwbGFjZWRJdGVtID1cbiAgICAgICAgICByZXBsYWNlUGFyZW50RGF0YXNldElkcz8uKHByb3BWYWx1ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSkgfHxcbiAgICAgICAgICBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKTtcbiAgICAgICAgcmVwbGFjZWRTdGF0ZSA9IHJlcGxhY2VkSXRlbVxuICAgICAgICAgID8gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUocmVwbGFjZWRTdGF0ZSwgcmVwbGFjZWRJdGVtLCBtZXJnZXJPcHRpb25zKVxuICAgICAgICAgIDogcmVwbGFjZWRTdGF0ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVyZ2VyT3B0aW9ucy50b01lcmdlUHJvcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgcmVwbGFjZWRTdGF0ZVttZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wXT8ubGVuZ3RoICYmXG4gICAgICAgICAgcHJlc2VydmVPcmRlclxuICAgICAgICApIHtcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW3ByZXNlcnZlT3JkZXJdID0gcHJvcFZhbHVlLm1hcChpdGVtID0+IGl0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcGxhY2VkU3RhdGU7XG4gICAgfSxcbiAgICBzdGF0ZVxuICApO1xuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQcm9wVmFsdWVJblN0YXRlKFxuICBzdGF0ZSxcbiAgcmVwbGFjZWRJdGVtLFxuICB7cHJvcCwgdG9NZXJnZVByb3AsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkfVxuKSB7XG4gIC8vIHByb3AgaXMgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCB0byBiZSByZXBsYWNlZFxuICAvLyByZW1vdmUgcHJvcCBmcm9tIHN0YXRlLCBhbmQgbW92ZSBpdCB0byB0b0JlTWVyZ2VkXG4gIGxldCBuZXh0U3RhdGUgPSBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCByZXBsYWNlZEl0ZW0sIHtwcm9wLCB0b01lcmdlUHJvcCwgc2F2ZVVubWVyZ2VkfSk7XG4gIGNvbnN0IGNoaWxkRGF0YUlkcyA9IGdldENoaWxkRGF0YXNldElkcz8uKHJlcGxhY2VkSXRlbSkgfHwgZmluZENoaWxkRGF0YXNldElkcyhyZXBsYWNlZEl0ZW0pO1xuXG4gIGlmIChjaGlsZERhdGFJZHMpIHtcbiAgICBuZXh0U3RhdGUgPSB0b0FycmF5KGNoaWxkRGF0YUlkcykucmVkdWNlKChhY2N1LCBjaGlsZERhdGFJZCkgPT4ge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY2hhbmdlIGNoaWxkIGRhdGFzZXQgaWQsXG4gICAgICAvLyBidXQgc3RpbGwgbmVlZCB0byBtb3ZlIG91dCBvZiBzdGF0ZSBhbmQgbWVyZ2UgYmFjayBpblxuICAgICAgcmV0dXJuIHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhhY2N1LCBjaGlsZERhdGFJZCwgY2hpbGREYXRhSWQpO1xuICAgIH0sIG5leHRTdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cbiJdfQ==