@kepler.gl/reducers 3.0.0-alpha.0

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 (47) hide show
  1. package/dist/combined-updaters.d.ts +50 -0
  2. package/dist/combined-updaters.js +212 -0
  3. package/dist/composer-helpers.d.ts +21 -0
  4. package/dist/composer-helpers.js +133 -0
  5. package/dist/composers.d.ts +12 -0
  6. package/dist/composers.js +47 -0
  7. package/dist/core.d.ts +64 -0
  8. package/dist/core.js +149 -0
  9. package/dist/data-utils.d.ts +8 -0
  10. package/dist/data-utils.js +60 -0
  11. package/dist/export-utils.d.ts +21 -0
  12. package/dist/export-utils.js +124 -0
  13. package/dist/index.d.ts +36 -0
  14. package/dist/index.js +372 -0
  15. package/dist/interaction-utils.d.ts +35 -0
  16. package/dist/interaction-utils.js +149 -0
  17. package/dist/layer-utils.d.ts +66 -0
  18. package/dist/layer-utils.js +289 -0
  19. package/dist/map-state-updaters.d.ts +62 -0
  20. package/dist/map-state-updaters.js +250 -0
  21. package/dist/map-state.d.ts +3 -0
  22. package/dist/map-state.js +67 -0
  23. package/dist/map-style-updaters.d.ts +173 -0
  24. package/dist/map-style-updaters.js +538 -0
  25. package/dist/map-style.d.ts +4 -0
  26. package/dist/map-style.js +66 -0
  27. package/dist/middleware.d.ts +8 -0
  28. package/dist/middleware.js +46 -0
  29. package/dist/provider-state-updaters.d.ts +42 -0
  30. package/dist/provider-state-updaters.js +512 -0
  31. package/dist/provider-state.d.ts +4 -0
  32. package/dist/provider-state.js +66 -0
  33. package/dist/root.d.ts +31 -0
  34. package/dist/root.js +235 -0
  35. package/dist/ui-state-updaters.d.ts +355 -0
  36. package/dist/ui-state-updaters.js +866 -0
  37. package/dist/ui-state.d.ts +3 -0
  38. package/dist/ui-state.js +68 -0
  39. package/dist/vis-state-merger.d.ts +102 -0
  40. package/dist/vis-state-merger.js +635 -0
  41. package/dist/vis-state-selectors.d.ts +2 -0
  42. package/dist/vis-state-selectors.js +53 -0
  43. package/dist/vis-state-updaters.d.ts +419 -0
  44. package/dist/vis-state-updaters.js +2472 -0
  45. package/dist/vis-state.d.ts +3 -0
  46. package/dist/vis-state.js +66 -0
  47. package/package.json +83 -0
@@ -0,0 +1,866 @@
1
+ // Copyright (c) 2022 Uber Technologies, Inc.
2
+ //
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+ //
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+ //
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ "use strict";
22
+
23
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
24
+
25
+ Object.defineProperty(exports, "__esModule", {
26
+ value: true
27
+ });
28
+ exports.toggleLayerPanelListViewUpdater = exports.setLocaleUpdater = exports.showDatasetTableUpdater = exports.toggleSplitMapUpdater = exports.loadFilesErrUpdater = exports.loadFilesSuccessUpdater = exports.loadFilesUpdater = exports.removeNotificationUpdater = exports.addNotificationUpdater = exports.setExportMapHTMLModeUpdater = exports.setExportMapFormatUpdater = exports.setUserMapboxAccessTokenUpdater = exports.setExportDataUpdater = exports.setExportFilteredUpdater = exports.setExportDataTypeUpdater = exports.setExportSelectedDatasetUpdater = exports.startExportingImageUpdater = exports.cleanupExportImageUpdater = exports.setExportImageErrorUpdater = exports.setExportImageDataUriUpdater = exports.setExportImageSettingUpdater = exports.openDeleteModalUpdater = exports.setMapControlVisibilityUpdater = exports.toggleMapControlUpdater = exports.hideExportDropdownUpdater = exports.showExportDropdownUpdater = exports.toggleModalUpdater = exports.toggleSidePanelUpdater = exports.initUiStateUpdater = exports.INITIAL_UI_STATE = exports.DEFAULT_EXPORT_MAP = exports.DEFAULT_EXPORT_JSON = exports.DEFAULT_EXPORT_HTML = exports.DEFAULT_NOTIFICATIONS = exports.DEFAULT_EXPORT_DATA = exports.DEFAULT_LOAD_FILES = exports.DEFAULT_EXPORT_IMAGE = exports.DEFAULT_MAP_CONTROLS = exports.DEFAULT_MODAL = exports.DEFAULT_ACTIVE_SIDE_PANEL = void 0;
29
+
30
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
31
+
32
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
33
+
34
+ var _constants = require("@kepler.gl/constants");
35
+
36
+ var _localization = require("@kepler.gl/localization");
37
+
38
+ var _utils = require("@kepler.gl/utils");
39
+
40
+ var _composerHelpers = require("./composer-helpers");
41
+
42
+ var _DEFAULT_EXPORT_MAP;
43
+
44
+ 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; }
45
+
46
+ 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; }
47
+
48
+ var DEFAULT_ACTIVE_SIDE_PANEL = 'layer';
49
+ exports.DEFAULT_ACTIVE_SIDE_PANEL = DEFAULT_ACTIVE_SIDE_PANEL;
50
+ var DEFAULT_MODAL = _constants.ADD_DATA_ID;
51
+ /**
52
+ * Updaters for `uiState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
53
+ * Read more about [Using updaters](../advanced-usage/using-updaters.md)
54
+ *
55
+ * @public
56
+ * @example
57
+ *
58
+ * import keplerGlReducer, {uiStateUpdaters} from 'kepler.gl/reducers';
59
+ * // Root Reducer
60
+ * const reducers = combineReducers({
61
+ * keplerGl: keplerGlReducer,
62
+ * app: appReducer
63
+ * });
64
+ *
65
+ * const composedReducer = (state, action) => {
66
+ * switch (action.type) {
67
+ * // click button to close side panel
68
+ * case 'CLICK_BUTTON':
69
+ * return {
70
+ * ...state,
71
+ * keplerGl: {
72
+ * ...state.keplerGl,
73
+ * foo: {
74
+ * ...state.keplerGl.foo,
75
+ * uiState: uiStateUpdaters.toggleSidePanelUpdater(
76
+ * uiState, {payload: null}
77
+ * )
78
+ * }
79
+ * }
80
+ * };
81
+ * }
82
+ * return reducers(state, action);
83
+ * };
84
+ *
85
+ * export default composedReducer;
86
+ */
87
+
88
+ /* eslint-disable no-unused-vars */
89
+ // @ts-ignore
90
+
91
+ exports.DEFAULT_MODAL = DEFAULT_MODAL;
92
+ var uiStateUpdaters = null;
93
+ /* eslint-enable no-unused-vars */
94
+
95
+ var DEFAULT_MAP_CONTROLS_FEATURES = {
96
+ show: true,
97
+ active: false,
98
+ disableClose: false,
99
+ // defines which map index users are interacting with (through map controls)
100
+ activeMapIndex: 0
101
+ };
102
+ /**
103
+ * A list of map control visibility and whether is it active.
104
+ * @memberof uiStateUpdaters
105
+ * @constant
106
+ * @property visibleLayers Default: `{show: true, active: false}`
107
+ * @property mapLegend Default: `{show: true, active: false}`
108
+ * @property toggle3d Default: `{show: true}`
109
+ * @property splitMap Default: `{show: true}`
110
+ * @property mapDraw Default: `{show: true, active: false}`
111
+ * @property mapLocale Default: `{show: false, active: false}`
112
+ * @public
113
+ */
114
+
115
+ var DEFAULT_MAP_CONTROLS = Object.keys(_constants.MAP_CONTROLS).reduce(function (_final, current) {
116
+ return _objectSpread(_objectSpread({}, _final), {}, (0, _defineProperty2["default"])({}, current, DEFAULT_MAP_CONTROLS_FEATURES));
117
+ }, {});
118
+ /**
119
+ * Default image export config
120
+ * @memberof uiStateUpdaters
121
+ * @constant
122
+ * @property ratio Default: `'SCREEN'`,
123
+ * @property resolution Default: `'ONE_X'`,
124
+ * @property legend Default: `false`,
125
+ * @property mapH Default: 0,
126
+ * @property mapW Default: 0,
127
+ * @property imageSize Default: {zoomOffset: 0, scale: 1, imageW: 0, imageH: 0},
128
+ * @property imageDataUri Default: `''`,
129
+ * @property exporting Default: `false`
130
+ * @property error Default: `false`
131
+ * @public
132
+ */
133
+
134
+ exports.DEFAULT_MAP_CONTROLS = DEFAULT_MAP_CONTROLS;
135
+ var DEFAULT_EXPORT_IMAGE = {
136
+ // user options
137
+ ratio: _constants.EXPORT_IMG_RATIOS.SCREEN,
138
+ resolution: _constants.RESOLUTIONS.ONE_X,
139
+ legend: false,
140
+ mapH: 0,
141
+ mapW: 0,
142
+ imageSize: {
143
+ zoomOffset: 0,
144
+ scale: 1,
145
+ imageW: 0,
146
+ imageH: 0
147
+ },
148
+ // when this is set to true, the mock map viewport will move to the center of data
149
+ center: false,
150
+ // exporting state
151
+ imageDataUri: '',
152
+ // exporting: used to attach plot-container to dom
153
+ exporting: false,
154
+ // processing: used as loading indicator when export image is being produced
155
+ processing: false,
156
+ error: false
157
+ };
158
+ exports.DEFAULT_EXPORT_IMAGE = DEFAULT_EXPORT_IMAGE;
159
+ var DEFAULT_LOAD_FILES = {
160
+ fileLoading: false
161
+ };
162
+ /**
163
+ * Default initial `exportData` settings
164
+ * @memberof uiStateUpdaters
165
+ * @constant
166
+ * @property selectedDataset Default: `''`,
167
+ * @property dataType Default: `'csv'`,
168
+ * @property filtered Default: `true`,
169
+ * @public
170
+ */
171
+
172
+ exports.DEFAULT_LOAD_FILES = DEFAULT_LOAD_FILES;
173
+ var DEFAULT_EXPORT_DATA = {
174
+ selectedDataset: '',
175
+ dataType: _constants.EXPORT_DATA_TYPE.CSV,
176
+ filtered: true
177
+ };
178
+ /**
179
+ * @constant
180
+ */
181
+
182
+ exports.DEFAULT_EXPORT_DATA = DEFAULT_EXPORT_DATA;
183
+ var DEFAULT_NOTIFICATIONS = [];
184
+ /**
185
+ * @constant
186
+ * @property exportMapboxAccessToken - Default: null, this is used when we provide a default mapbox token for users to take advantage of
187
+ * @property userMapboxToken - Default: '', mapbox token provided by user through input field
188
+ * @property mode - Default: 'READ', read only or editable
189
+ * @public
190
+ */
191
+
192
+ exports.DEFAULT_NOTIFICATIONS = DEFAULT_NOTIFICATIONS;
193
+ var DEFAULT_EXPORT_HTML = {
194
+ exportMapboxAccessToken: null,
195
+ userMapboxToken: '',
196
+ mode: _constants.EXPORT_HTML_MAP_MODES.READ
197
+ };
198
+ /**
199
+ * @constant
200
+ * @property hasData - Default: 'true',
201
+ * @public
202
+ */
203
+
204
+ exports.DEFAULT_EXPORT_HTML = DEFAULT_EXPORT_HTML;
205
+ var DEFAULT_EXPORT_JSON = {
206
+ hasData: true
207
+ };
208
+ /**
209
+ * Export Map Config
210
+ * @constant
211
+ * @property HTML - Default: 'DEFAULT_EXPORT_HTML',
212
+ * @property JSON - Default: 'DEFAULT_EXPORT_JSON',
213
+ * @property format - Default: 'HTML',
214
+ * @public
215
+ */
216
+
217
+ exports.DEFAULT_EXPORT_JSON = DEFAULT_EXPORT_JSON;
218
+ var DEFAULT_EXPORT_MAP = (_DEFAULT_EXPORT_MAP = {}, (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, _constants.EXPORT_MAP_FORMATS.HTML, DEFAULT_EXPORT_HTML), (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, _constants.EXPORT_MAP_FORMATS.JSON, DEFAULT_EXPORT_JSON), (0, _defineProperty2["default"])(_DEFAULT_EXPORT_MAP, "format", _constants.EXPORT_MAP_FORMATS.HTML), _DEFAULT_EXPORT_MAP);
219
+ /**
220
+ * Default initial `uiState`
221
+ * @memberof uiStateUpdaters
222
+ * @constant
223
+ * @property readOnly Default: `false`
224
+ * @property activeSidePanel Default: `'layer'`
225
+ * @property currentModal Default: `'addData'`
226
+ * @property datasetKeyToRemove Default: `null`
227
+ * @property visibleDropdown Default: `null`
228
+ * @property exportImage Default: [`DEFAULT_EXPORT_IMAGE`](#default_export_image)
229
+ * @property exportData Default: [`DEFAULT_EXPORT_DATA`](#default_export_data)
230
+ * @property exportMap Default: [`DEFAULT_EXPORT_MAP`](#default_export_map)
231
+ * @property mapControls Default: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
232
+ * @property notifications Default: `[]`
233
+ * @property notifications Default: `[]`
234
+ * @property loadFiles
235
+ * @public
236
+ */
237
+
238
+ exports.DEFAULT_EXPORT_MAP = DEFAULT_EXPORT_MAP;
239
+ var INITIAL_UI_STATE = {
240
+ readOnly: false,
241
+ activeSidePanel: DEFAULT_ACTIVE_SIDE_PANEL,
242
+ currentModal: DEFAULT_MODAL,
243
+ datasetKeyToRemove: null,
244
+ visibleDropdown: null,
245
+ // export image modal ui
246
+ exportImage: DEFAULT_EXPORT_IMAGE,
247
+ // export data modal ui
248
+ exportData: DEFAULT_EXPORT_DATA,
249
+ // html export
250
+ exportMap: DEFAULT_EXPORT_MAP,
251
+ // map control panels
252
+ mapControls: DEFAULT_MAP_CONTROLS,
253
+ // ui notifications
254
+ notifications: DEFAULT_NOTIFICATIONS,
255
+ // load files
256
+ loadFiles: DEFAULT_LOAD_FILES,
257
+ // Locale of the UI
258
+ locale: _localization.LOCALE_CODES.en,
259
+ layerPanelListView: 'list'
260
+ };
261
+ /* Updaters */
262
+
263
+ /**
264
+ * @memberof uiStateUpdaters
265
+
266
+ */
267
+
268
+ exports.INITIAL_UI_STATE = INITIAL_UI_STATE;
269
+
270
+ var initUiStateUpdater = function initUiStateUpdater(state, action) {
271
+ return _objectSpread(_objectSpread({}, state), (action.payload || {}).initialUiState);
272
+ };
273
+ /**
274
+ * Toggle active side panel
275
+ * @memberof uiStateUpdaters
276
+ * @param state `uiState`
277
+ * @param action
278
+ * @param action.payload id of side panel to be shown, one of `layer`, `filter`, `interaction`, `map`. close side panel if `null`
279
+ * @returns nextState
280
+ * @public
281
+ */
282
+
283
+
284
+ exports.initUiStateUpdater = initUiStateUpdater;
285
+
286
+ var toggleSidePanelUpdater = function toggleSidePanelUpdater(state, _ref) {
287
+ var id = _ref.payload;
288
+ return id === state.activeSidePanel ? state : _objectSpread(_objectSpread({}, state), {}, {
289
+ activeSidePanel: id
290
+ });
291
+ };
292
+ /**
293
+ * Show and hide modal dialog
294
+ * @memberof uiStateUpdaters
295
+ * @param state `uiState`
296
+ * @param action
297
+ * @paramaction.payload id of modal to be shown, null to hide modals. One of:
298
+ * - [`DATA_TABLE_ID`](../constants/default-settings.md#data_table_id)
299
+ * - [`DELETE_DATA_ID`](../constants/default-settings.md#delete_data_id)
300
+ * - [`ADD_DATA_ID`](../constants/default-settings.md#add_data_id)
301
+ * - [`EXPORT_IMAGE_ID`](../constants/default-settings.md#export_image_id)
302
+ * - [`EXPORT_DATA_ID`](../constants/default-settings.md#export_data_id)
303
+ * - [`ADD_MAP_STYLE_ID`](../constants/default-settings.md#add_map_style_id)
304
+ * @returns nextState
305
+ * @public
306
+ */
307
+
308
+
309
+ exports.toggleSidePanelUpdater = toggleSidePanelUpdater;
310
+
311
+ var toggleModalUpdater = function toggleModalUpdater(state, _ref2) {
312
+ var id = _ref2.payload;
313
+ return _objectSpread(_objectSpread({}, state), {}, {
314
+ currentModal: id
315
+ });
316
+ };
317
+ /**
318
+ * Hide and show side panel header dropdown, activated by clicking the share link on top of the side panel
319
+ * @memberof uiStateUpdaters
320
+ * @public
321
+ */
322
+
323
+
324
+ exports.toggleModalUpdater = toggleModalUpdater;
325
+
326
+ var showExportDropdownUpdater = function showExportDropdownUpdater(state, _ref3) {
327
+ var id = _ref3.payload;
328
+ return _objectSpread(_objectSpread({}, state), {}, {
329
+ visibleDropdown: id
330
+ });
331
+ };
332
+ /**
333
+ * Hide side panel header dropdown, activated by clicking the share link on top of the side panel
334
+ * @memberof uiStateUpdaters
335
+ * @public
336
+ */
337
+
338
+
339
+ exports.showExportDropdownUpdater = showExportDropdownUpdater;
340
+
341
+ var hideExportDropdownUpdater = function hideExportDropdownUpdater(state) {
342
+ return _objectSpread(_objectSpread({}, state), {}, {
343
+ visibleDropdown: null
344
+ });
345
+ };
346
+ /**
347
+ * Toggle active map control panel
348
+ * @memberof uiStateUpdaters
349
+ * @param state `uiState`
350
+ * @param action action
351
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
352
+ * @returns nextState
353
+ * @public
354
+ */
355
+
356
+
357
+ exports.hideExportDropdownUpdater = hideExportDropdownUpdater;
358
+
359
+ var toggleMapControlUpdater = function toggleMapControlUpdater(state, _ref4) {
360
+ var _ref4$payload = _ref4.payload,
361
+ panelId = _ref4$payload.panelId,
362
+ _ref4$payload$index = _ref4$payload.index,
363
+ index = _ref4$payload$index === void 0 ? 0 : _ref4$payload$index;
364
+ return _objectSpread(_objectSpread({}, state), {}, {
365
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
366
+ // this handles split map interaction
367
+ // Toggling from within the same map will simply toggle the active property
368
+ // Toggling from within different maps we set the active property to true
369
+ active: index === state.mapControls[panelId].activeMapIndex ? !state.mapControls[panelId].active : true,
370
+ activeMapIndex: index
371
+ })))
372
+ });
373
+ };
374
+ /**
375
+ * Toggle map control visibility
376
+ * @memberof uiStateUpdaters
377
+ * @param state `uiState`
378
+ * @param action action
379
+ * @param action.payload map control panel id, one of the keys of: [`DEFAULT_MAP_CONTROLS`](#default_map_controls)
380
+ * @returns nextState
381
+ * @public
382
+ */
383
+
384
+
385
+ exports.toggleMapControlUpdater = toggleMapControlUpdater;
386
+
387
+ var setMapControlVisibilityUpdater = function setMapControlVisibilityUpdater(state, _ref5) {
388
+ var _state$mapControls;
389
+
390
+ var _ref5$payload = _ref5.payload,
391
+ panelId = _ref5$payload.panelId,
392
+ show = _ref5$payload.show;
393
+
394
+ if (!((_state$mapControls = state.mapControls) !== null && _state$mapControls !== void 0 && _state$mapControls[panelId])) {
395
+ return state;
396
+ }
397
+
398
+ return _objectSpread(_objectSpread({}, state), {}, {
399
+ mapControls: _objectSpread(_objectSpread({}, state.mapControls), {}, (0, _defineProperty2["default"])({}, panelId, _objectSpread(_objectSpread({}, state.mapControls[panelId]), {}, {
400
+ show: Boolean(show)
401
+ })))
402
+ });
403
+ };
404
+ /**
405
+ * Toggle active map control panel
406
+ * @memberof uiStateUpdaters
407
+ * @param state `uiState`
408
+ * @param action
409
+ * @param action.payload dataset id
410
+ * @returns nextState
411
+ * @public
412
+ */
413
+
414
+
415
+ exports.setMapControlVisibilityUpdater = setMapControlVisibilityUpdater;
416
+
417
+ var openDeleteModalUpdater = function openDeleteModalUpdater(state, _ref6) {
418
+ var datasetKeyToRemove = _ref6.payload;
419
+ return _objectSpread(_objectSpread({}, state), {}, {
420
+ currentModal: _constants.DELETE_DATA_ID,
421
+ datasetKeyToRemove: datasetKeyToRemove
422
+ });
423
+ };
424
+ /**
425
+ * Set `exportImage.legend` to `true` or `false`
426
+ * @memberof uiStateUpdaters
427
+ * @param state `uiState`
428
+ * @returns nextState
429
+ * @public
430
+ */
431
+
432
+
433
+ exports.openDeleteModalUpdater = openDeleteModalUpdater;
434
+
435
+ var setExportImageSettingUpdater = function setExportImageSettingUpdater(state, _ref7) {
436
+ var newSetting = _ref7.payload;
437
+
438
+ var updated = _objectSpread(_objectSpread({}, state.exportImage), newSetting);
439
+
440
+ var imageSize = (0, _utils.calculateExportImageSize)(updated) || state.exportImage.imageSize;
441
+ return _objectSpread(_objectSpread({}, state), {}, {
442
+ exportImage: _objectSpread(_objectSpread({}, updated), {}, {
443
+ // @ts-expect-error
444
+ // TODO: calculateExportImageSize does not return imageSize.zoomOffset,
445
+ // do we need take this value from current state, or return defaul value = 0
446
+ imageSize: imageSize
447
+ })
448
+ });
449
+ };
450
+ /**
451
+ * Set `exportImage.setExportImageDataUri` to a image dataUri
452
+ * @memberof uiStateUpdaters
453
+ * @param state `uiState`
454
+ * @param action
455
+ * @param action.payload export image data uri
456
+ * @returns nextState
457
+ * @public
458
+ */
459
+
460
+
461
+ exports.setExportImageSettingUpdater = setExportImageSettingUpdater;
462
+
463
+ var setExportImageDataUriUpdater = function setExportImageDataUriUpdater(state, _ref8) {
464
+ var dataUri = _ref8.payload;
465
+ return _objectSpread(_objectSpread({}, state), {}, {
466
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
467
+ processing: false,
468
+ imageDataUri: dataUri
469
+ })
470
+ });
471
+ };
472
+ /**
473
+ * @memberof uiStateUpdaters
474
+ * @public
475
+ */
476
+
477
+
478
+ exports.setExportImageDataUriUpdater = setExportImageDataUriUpdater;
479
+
480
+ var setExportImageErrorUpdater = function setExportImageErrorUpdater(state, _ref9) {
481
+ var error = _ref9.payload;
482
+ return _objectSpread(_objectSpread({}, state), {}, {
483
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
484
+ processing: false,
485
+ error: error
486
+ })
487
+ });
488
+ };
489
+ /**
490
+ * Delete cached export image
491
+ * @memberof uiStateUpdaters
492
+ * @public
493
+ */
494
+
495
+
496
+ exports.setExportImageErrorUpdater = setExportImageErrorUpdater;
497
+
498
+ var cleanupExportImageUpdater = function cleanupExportImageUpdater(state) {
499
+ return _objectSpread(_objectSpread({}, state), {}, {
500
+ exportImage: _objectSpread(_objectSpread({}, state.exportImage), {}, {
501
+ exporting: false,
502
+ imageDataUri: '',
503
+ error: false,
504
+ processing: false,
505
+ center: false
506
+ })
507
+ });
508
+ };
509
+ /**
510
+ * Start image exporting flow
511
+ * @memberof uiStateUpdaters
512
+ * @param state
513
+ * @param options
514
+ * @returns {UiState}
515
+ * @public
516
+ */
517
+
518
+
519
+ exports.cleanupExportImageUpdater = cleanupExportImageUpdater;
520
+
521
+ var startExportingImageUpdater = function startExportingImageUpdater(state, _ref10) {
522
+ var _ref10$payload = _ref10.payload,
523
+ options = _ref10$payload === void 0 ? {} : _ref10$payload;
524
+
525
+ var imageSettings = _objectSpread(_objectSpread({}, options), {}, {
526
+ exporting: true
527
+ });
528
+
529
+ return (0, _composerHelpers.compose_)([cleanupExportImageUpdater, (0, _composerHelpers.apply_)(setExportImageSettingUpdater, (0, _composerHelpers.payload_)(imageSettings))])(state);
530
+ };
531
+ /**
532
+ * Set selected dataset for export
533
+ * @memberof uiStateUpdaters
534
+ * @param state `uiState`
535
+ * @param action
536
+ * @param action.payload dataset id
537
+ * @returns nextState
538
+ * @public
539
+ */
540
+
541
+
542
+ exports.startExportingImageUpdater = startExportingImageUpdater;
543
+
544
+ var setExportSelectedDatasetUpdater = function setExportSelectedDatasetUpdater(state, _ref11) {
545
+ var dataset = _ref11.payload;
546
+ return _objectSpread(_objectSpread({}, state), {}, {
547
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
548
+ selectedDataset: dataset
549
+ })
550
+ });
551
+ };
552
+ /**
553
+ * Set data format for exporting data
554
+ * @memberof uiStateUpdaters
555
+ * @param state `uiState`
556
+ * @param action
557
+ * @param action.payload one of `'text/csv'`
558
+ * @returns nextState
559
+ * @public
560
+ */
561
+
562
+
563
+ exports.setExportSelectedDatasetUpdater = setExportSelectedDatasetUpdater;
564
+
565
+ var setExportDataTypeUpdater = function setExportDataTypeUpdater(state, _ref12) {
566
+ var dataType = _ref12.payload;
567
+ return _objectSpread(_objectSpread({}, state), {}, {
568
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
569
+ dataType: dataType
570
+ })
571
+ });
572
+ };
573
+ /**
574
+ * Whether to export filtered data, `true` or `false`
575
+ * @memberof uiStateUpdaters
576
+ * @param state `uiState`
577
+ * @param action
578
+ * @param action.payload
579
+ * @returns nextState
580
+ * @public
581
+ */
582
+
583
+
584
+ exports.setExportDataTypeUpdater = setExportDataTypeUpdater;
585
+
586
+ var setExportFilteredUpdater = function setExportFilteredUpdater(state, _ref13) {
587
+ var filtered = _ref13.payload;
588
+ return _objectSpread(_objectSpread({}, state), {}, {
589
+ exportData: _objectSpread(_objectSpread({}, state.exportData), {}, {
590
+ filtered: filtered
591
+ })
592
+ });
593
+ };
594
+ /**
595
+ * Whether to including data in map config, toggle between `true` or `false`
596
+ * @memberof uiStateUpdaters
597
+ * @param state `uiState`
598
+ * @returns nextState
599
+ * @public
600
+ */
601
+
602
+
603
+ exports.setExportFilteredUpdater = setExportFilteredUpdater;
604
+
605
+ var setExportDataUpdater = function setExportDataUpdater(state) {
606
+ return _objectSpread(_objectSpread({}, state), {}, {
607
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.JSON, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON]), {}, {
608
+ hasData: !state.exportMap[_constants.EXPORT_MAP_FORMATS.JSON].hasData
609
+ })))
610
+ });
611
+ };
612
+ /**
613
+ * whether to export a mapbox access to HTML single page
614
+ * @param state - `uiState`
615
+ * @param action
616
+ * @param action.payload
617
+ * @returns nextState
618
+ * @public
619
+ */
620
+
621
+
622
+ exports.setExportDataUpdater = setExportDataUpdater;
623
+
624
+ var setUserMapboxAccessTokenUpdater = function setUserMapboxAccessTokenUpdater(state, _ref14) {
625
+ var userMapboxToken = _ref14.payload;
626
+ return _objectSpread(_objectSpread({}, state), {}, {
627
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
628
+ userMapboxToken: userMapboxToken
629
+ })))
630
+ });
631
+ };
632
+ /**
633
+ * Sets the export map format
634
+ * @param state - `uiState`
635
+ * @param action
636
+ * @param action.payload format to use to export the map into
637
+ * @return nextState
638
+ */
639
+
640
+
641
+ exports.setUserMapboxAccessTokenUpdater = setUserMapboxAccessTokenUpdater;
642
+
643
+ var setExportMapFormatUpdater = function setExportMapFormatUpdater(state, _ref15) {
644
+ var format = _ref15.payload;
645
+ return _objectSpread(_objectSpread({}, state), {}, {
646
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, {
647
+ // @ts-expect-error
648
+ format: format
649
+ })
650
+ });
651
+ };
652
+ /**
653
+ * Set the export html map mode
654
+ * @param state - `uiState`
655
+ * @param action
656
+ * @param action.payload to be set (available modes: EXPORT_HTML_MAP_MODES)
657
+ * @return nextState
658
+ */
659
+
660
+
661
+ exports.setExportMapFormatUpdater = setExportMapFormatUpdater;
662
+
663
+ var setExportMapHTMLModeUpdater = function setExportMapHTMLModeUpdater(state, _ref16) {
664
+ var mode = _ref16.payload;
665
+ return _objectSpread(_objectSpread({}, state), {}, {
666
+ exportMap: _objectSpread(_objectSpread({}, state.exportMap), {}, (0, _defineProperty2["default"])({}, _constants.EXPORT_MAP_FORMATS.HTML, _objectSpread(_objectSpread({}, state.exportMap[_constants.EXPORT_MAP_FORMATS.HTML]), {}, {
667
+ mode: mode
668
+ })))
669
+ });
670
+ };
671
+ /**
672
+ * Adds a new notification.
673
+ * Updates a notification in case of matching ids.
674
+ * @memberof uiStateUpdaters
675
+ * @param state `uiState`
676
+ * @param action
677
+ * @param action.payload Params of a notification
678
+ * @returns nextState
679
+ * @public
680
+ */
681
+
682
+
683
+ exports.setExportMapHTMLModeUpdater = setExportMapHTMLModeUpdater;
684
+
685
+ var addNotificationUpdater = function addNotificationUpdater(state, _ref17) {
686
+ var payload = _ref17.payload;
687
+ var notifications; // @ts-expect-error
688
+
689
+ var payloadId = payload === null || payload === void 0 ? void 0 : payload.id;
690
+ var notificationToUpdate = payloadId ? state.notifications.find(function (n) {
691
+ return n.id === payloadId;
692
+ }) : null;
693
+
694
+ if (notificationToUpdate) {
695
+ notifications = state.notifications.map(function (n) {
696
+ return n.id === payloadId ? (0, _utils.createNotification)(payload) : n;
697
+ });
698
+ } else {
699
+ notifications = [].concat((0, _toConsumableArray2["default"])(state.notifications || []), [(0, _utils.createNotification)(payload)]);
700
+ }
701
+
702
+ return _objectSpread(_objectSpread({}, state), {}, {
703
+ notifications: notifications
704
+ });
705
+ };
706
+ /**
707
+ * Remove a notification
708
+ * @memberof uiStateUpdaters
709
+ * @param state `uiState`
710
+ * @param action
711
+ * @param action.payload id of the notification to be removed
712
+ * @returns nextState
713
+ * @public
714
+ */
715
+
716
+
717
+ exports.addNotificationUpdater = addNotificationUpdater;
718
+
719
+ var removeNotificationUpdater = function removeNotificationUpdater(state, _ref18) {
720
+ var id = _ref18.payload;
721
+ return _objectSpread(_objectSpread({}, state), {}, {
722
+ notifications: state.notifications.filter(function (n) {
723
+ return n.id !== id;
724
+ })
725
+ });
726
+ };
727
+ /**
728
+ * Fired when file loading begin
729
+ * @memberof uiStateUpdaters
730
+ * @param state `uiState`
731
+ * @returns nextState
732
+ * @public
733
+ */
734
+
735
+
736
+ exports.removeNotificationUpdater = removeNotificationUpdater;
737
+
738
+ var loadFilesUpdater = function loadFilesUpdater(state) {
739
+ return _objectSpread(_objectSpread({}, state), {}, {
740
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
741
+ fileLoading: true
742
+ })
743
+ });
744
+ };
745
+ /**
746
+ * Handles loading file success and set fileLoading property to false
747
+ * @memberof uiStateUpdaters
748
+ * @param state `uiState`
749
+ * @returns nextState
750
+ */
751
+
752
+
753
+ exports.loadFilesUpdater = loadFilesUpdater;
754
+
755
+ var loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state) {
756
+ return _objectSpread(_objectSpread({}, state), {}, {
757
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
758
+ fileLoading: false
759
+ })
760
+ });
761
+ };
762
+ /**
763
+ * Handles load file error and set fileLoading property to false
764
+ * @memberof uiStateUpdaters
765
+ * @param state
766
+ * @param action
767
+ * @param action.error
768
+ * @returns nextState
769
+ * @public
770
+ */
771
+
772
+
773
+ exports.loadFilesSuccessUpdater = loadFilesSuccessUpdater;
774
+
775
+ var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref19) {
776
+ var error = _ref19.error;
777
+ return addNotificationUpdater(_objectSpread(_objectSpread({}, state), {}, {
778
+ loadFiles: _objectSpread(_objectSpread({}, state.loadFiles), {}, {
779
+ fileLoading: false
780
+ })
781
+ }), {
782
+ payload: (0, _utils.errorNotification)({
783
+ message: (error || {}).message || 'Failed to upload files',
784
+ topic: _constants.DEFAULT_NOTIFICATION_TOPICS.global
785
+ })
786
+ });
787
+ };
788
+ /**
789
+ * Handles toggle map split and reset all map control index to 0
790
+ * @memberof uiStateUpdaters
791
+ * @param state
792
+ * @returns nextState
793
+ * @public
794
+ */
795
+
796
+
797
+ exports.loadFilesErrUpdater = loadFilesErrUpdater;
798
+
799
+ var toggleSplitMapUpdater = function toggleSplitMapUpdater(state) {
800
+ return _objectSpread(_objectSpread({}, state), {}, {
801
+ mapControls: Object.entries(state.mapControls).reduce(function (acc, entry) {
802
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], _objectSpread(_objectSpread({}, entry[1]), {}, {
803
+ activeMapIndex: 0
804
+ })));
805
+ }, {})
806
+ });
807
+ };
808
+ /**
809
+ * Toggle modal data
810
+ * @memberof uiStateUpdaters
811
+ * @param state
812
+ * @returns nextState
813
+ * @public
814
+ */
815
+
816
+
817
+ exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
818
+
819
+ var showDatasetTableUpdater = function showDatasetTableUpdater(state) {
820
+ return toggleModalUpdater(state, {
821
+ payload: _constants.DATA_TABLE_ID
822
+ });
823
+ };
824
+ /**
825
+ * Set the locale of the UI
826
+ * @memberof uiStateUpdaters
827
+ * @param state `uiState`
828
+ * @param action
829
+ * @param action.payload
830
+ * @param action.payload.locale locale
831
+ * @returns nextState
832
+ * @public
833
+ */
834
+
835
+
836
+ exports.showDatasetTableUpdater = showDatasetTableUpdater;
837
+
838
+ var setLocaleUpdater = function setLocaleUpdater(state, _ref20) {
839
+ var locale = _ref20.payload.locale;
840
+ return _objectSpread(_objectSpread({}, state), {}, {
841
+ locale: locale
842
+ });
843
+ };
844
+ /**
845
+ * Toggle layer panel list view
846
+ * @memberof uiStateUpdaters
847
+ * @param state `uiState`
848
+ * @param action
849
+ * @param action.payload layer panel listView value. Can be 'list' or 'sortByDataset'
850
+ * @returns nextState
851
+ * @public
852
+ */
853
+
854
+
855
+ exports.setLocaleUpdater = setLocaleUpdater;
856
+
857
+ var toggleLayerPanelListViewUpdater = function toggleLayerPanelListViewUpdater(state, _ref21) {
858
+ var listView = _ref21.payload;
859
+ // @ts-expect-error
860
+ return listView === state.layerPanelListView ? state : _objectSpread(_objectSpread({}, state), {}, {
861
+ layerPanelListView: listView
862
+ });
863
+ };
864
+
865
+ exports.toggleLayerPanelListViewUpdater = toggleLayerPanelListViewUpdater;
866
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91aS1zdGF0ZS11cGRhdGVycy50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0FDVElWRV9TSURFX1BBTkVMIiwiREVGQVVMVF9NT0RBTCIsIkFERF9EQVRBX0lEIiwidWlTdGF0ZVVwZGF0ZXJzIiwiREVGQVVMVF9NQVBfQ09OVFJPTFNfRkVBVFVSRVMiLCJzaG93IiwiYWN0aXZlIiwiZGlzYWJsZUNsb3NlIiwiYWN0aXZlTWFwSW5kZXgiLCJERUZBVUxUX01BUF9DT05UUk9MUyIsIk9iamVjdCIsImtleXMiLCJNQVBfQ09OVFJPTFMiLCJyZWR1Y2UiLCJmaW5hbCIsImN1cnJlbnQiLCJERUZBVUxUX0VYUE9SVF9JTUFHRSIsInJhdGlvIiwiRVhQT1JUX0lNR19SQVRJT1MiLCJTQ1JFRU4iLCJyZXNvbHV0aW9uIiwiUkVTT0xVVElPTlMiLCJPTkVfWCIsImxlZ2VuZCIsIm1hcEgiLCJtYXBXIiwiaW1hZ2VTaXplIiwiem9vbU9mZnNldCIsInNjYWxlIiwiaW1hZ2VXIiwiaW1hZ2VIIiwiY2VudGVyIiwiaW1hZ2VEYXRhVXJpIiwiZXhwb3J0aW5nIiwicHJvY2Vzc2luZyIsImVycm9yIiwiREVGQVVMVF9MT0FEX0ZJTEVTIiwiZmlsZUxvYWRpbmciLCJERUZBVUxUX0VYUE9SVF9EQVRBIiwic2VsZWN0ZWREYXRhc2V0IiwiZGF0YVR5cGUiLCJFWFBPUlRfREFUQV9UWVBFIiwiQ1NWIiwiZmlsdGVyZWQiLCJERUZBVUxUX05PVElGSUNBVElPTlMiLCJERUZBVUxUX0VYUE9SVF9IVE1MIiwiZXhwb3J0TWFwYm94QWNjZXNzVG9rZW4iLCJ1c2VyTWFwYm94VG9rZW4iLCJtb2RlIiwiRVhQT1JUX0hUTUxfTUFQX01PREVTIiwiUkVBRCIsIkRFRkFVTFRfRVhQT1JUX0pTT04iLCJoYXNEYXRhIiwiREVGQVVMVF9FWFBPUlRfTUFQIiwiRVhQT1JUX01BUF9GT1JNQVRTIiwiSFRNTCIsIkpTT04iLCJJTklUSUFMX1VJX1NUQVRFIiwicmVhZE9ubHkiLCJhY3RpdmVTaWRlUGFuZWwiLCJjdXJyZW50TW9kYWwiLCJkYXRhc2V0S2V5VG9SZW1vdmUiLCJ2aXNpYmxlRHJvcGRvd24iLCJleHBvcnRJbWFnZSIsImV4cG9ydERhdGEiLCJleHBvcnRNYXAiLCJtYXBDb250cm9scyIsIm5vdGlmaWNhdGlvbnMiLCJsb2FkRmlsZXMiLCJsb2NhbGUiLCJMT0NBTEVfQ09ERVMiLCJlbiIsImxheWVyUGFuZWxMaXN0VmlldyIsImluaXRVaVN0YXRlVXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwicGF5bG9hZCIsImluaXRpYWxVaVN0YXRlIiwidG9nZ2xlU2lkZVBhbmVsVXBkYXRlciIsImlkIiwidG9nZ2xlTW9kYWxVcGRhdGVyIiwic2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlciIsImhpZGVFeHBvcnREcm9wZG93blVwZGF0ZXIiLCJ0b2dnbGVNYXBDb250cm9sVXBkYXRlciIsInBhbmVsSWQiLCJpbmRleCIsInNldE1hcENvbnRyb2xWaXNpYmlsaXR5VXBkYXRlciIsIkJvb2xlYW4iLCJvcGVuRGVsZXRlTW9kYWxVcGRhdGVyIiwiREVMRVRFX0RBVEFfSUQiLCJzZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyIiwibmV3U2V0dGluZyIsInVwZGF0ZWQiLCJzZXRFeHBvcnRJbWFnZURhdGFVcmlVcGRhdGVyIiwiZGF0YVVyaSIsInNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyIiwiY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlciIsInN0YXJ0RXhwb3J0aW5nSW1hZ2VVcGRhdGVyIiwib3B0aW9ucyIsImltYWdlU2V0dGluZ3MiLCJzZXRFeHBvcnRTZWxlY3RlZERhdGFzZXRVcGRhdGVyIiwiZGF0YXNldCIsInNldEV4cG9ydERhdGFUeXBlVXBkYXRlciIsInNldEV4cG9ydEZpbHRlcmVkVXBkYXRlciIsInNldEV4cG9ydERhdGFVcGRhdGVyIiwic2V0VXNlck1hcGJveEFjY2Vzc1Rva2VuVXBkYXRlciIsInNldEV4cG9ydE1hcEZvcm1hdFVwZGF0ZXIiLCJmb3JtYXQiLCJzZXRFeHBvcnRNYXBIVE1MTW9kZVVwZGF0ZXIiLCJhZGROb3RpZmljYXRpb25VcGRhdGVyIiwicGF5bG9hZElkIiwibm90aWZpY2F0aW9uVG9VcGRhdGUiLCJmaW5kIiwibiIsIm1hcCIsInJlbW92ZU5vdGlmaWNhdGlvblVwZGF0ZXIiLCJmaWx0ZXIiLCJsb2FkRmlsZXNVcGRhdGVyIiwibG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIiLCJsb2FkRmlsZXNFcnJVcGRhdGVyIiwibWVzc2FnZSIsInRvcGljIiwiREVGQVVMVF9OT1RJRklDQVRJT05fVE9QSUNTIiwiZ2xvYmFsIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwiZW50cmllcyIsImFjYyIsImVudHJ5Iiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJEQVRBX1RBQkxFX0lEIiwic2V0TG9jYWxlVXBkYXRlciIsInRvZ2dsZUxheWVyUGFuZWxMaXN0Vmlld1VwZGF0ZXIiLCJsaXN0VmlldyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFhQTs7QUFDQTs7QUFLQTs7Ozs7Ozs7QUFrQk8sSUFBTUEseUJBQXlCLEdBQUcsT0FBbEM7O0FBQ0EsSUFBTUMsYUFBYSxHQUFHQyxzQkFBdEI7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTs7O0FBQ0EsSUFBTUMsZUFBZSxHQUFHLElBQXhCO0FBQ0E7O0FBRUEsSUFBTUMsNkJBQXlDLEdBQUc7QUFDaERDLEVBQUFBLElBQUksRUFBRSxJQUQwQztBQUVoREMsRUFBQUEsTUFBTSxFQUFFLEtBRndDO0FBR2hEQyxFQUFBQSxZQUFZLEVBQUUsS0FIa0M7QUFJaEQ7QUFDQUMsRUFBQUEsY0FBYyxFQUFF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O0FBQUNFLElBQUFBLE9BQU8sRUFBRXFEO0FBQVYsR0FBUixDQURtQjtBQUFBLENBQWhDO0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixDQUM5QnhELEtBRDhCO0FBQUEsTUFFbkJMLE1BRm1CLFVBRTdCTyxPQUY2QixDQUVuQlAsTUFGbUI7QUFBQSx5Q0FJM0JLLEtBSjJCO0FBSzlCTCxJQUFBQSxNQUFNLEVBQU5BO0FBTDhCO0FBQUEsQ0FBekI7QUFRUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTThELCtCQUErQixHQUFHLFNBQWxDQSwrQkFBa0MsQ0FDN0N6RCxLQUQ2QyxVQUdqQztBQUFBLE1BREYwRCxRQUNFLFVBRFh4RCxPQUNXO0FBQ1o7QUFDQSxTQUFPd0QsUUFBUSxLQUFLMUQsS0FBSyxDQUFDRixrQkFBbkIsR0FDSEUsS0FERyxtQ0FHRUEsS0FIRjtBQUlERixJQUFBQSxrQkFBa0IsRUFBRTREO0FBSm5CLElBQVA7QUFNRCxDQVhNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIyIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgQUREX0RBVEFfSUQsXG4gIERBVEFfVEFCTEVfSUQsXG4gIERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUyxcbiAgREVMRVRFX0RBVEFfSUQsXG4gIEVYUE9SVF9EQVRBX1RZUEUsXG4gIEVYUE9SVF9IVE1MX01BUF9NT0RFUyxcbiAgRVhQT1JUX0lNR19SQVRJT1MsXG4gIEVYUE9SVF9NQVBfRk9STUFUUyxcbiAgUkVTT0xVVElPTlMsXG4gIE1BUF9DT05UUk9MUyxcbiAgRXhwb3J0SW1hZ2Vcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0NBTEVfQ09ERVN9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7XG4gIGNyZWF0ZU5vdGlmaWNhdGlvbixcbiAgZXJyb3JOb3RpZmljYXRpb24sXG4gIGNhbGN1bGF0ZUV4cG9ydEltYWdlU2l6ZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5XywgY29tcG9zZV99IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBMb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uLFxuICBVSVN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0SHRtbCxcbiAgRXhwb3J0SnNvbixcbiAgRXhwb3J0TWFwLFxuICBNYXBDb250cm9sLFxuICBNYXBDb250cm9scyxcbiAgVWlTdGF0ZVxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUNUSVZFX1NJREVfUEFORUwgPSAnbGF5ZXInO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTU9EQUwgPSBBRERfREFUQV9JRDtcblxuLyoqXG4gKiBVcGRhdGVycyBmb3IgYHVpU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICpcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge3VpU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIC8vIGNsaWNrIGJ1dHRvbiB0byBjbG9zZSBzaWRlIHBhbmVsXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgdWlTdGF0ZTogdWlTdGF0ZVVwZGF0ZXJzLnRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIHVpU3RhdGUsIHtwYXlsb2FkOiBudWxsfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB1aVN0YXRlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5jb25zdCBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFUzogTWFwQ29udHJvbCA9IHtcbiAgc2hvdzogdHJ1ZSxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZUNsb3NlOiBmYWxzZSxcbiAgLy8gZGVmaW5lcyB3aGljaCBtYXAgaW5kZXggdXNlcnMgYXJlIGludGVyYWN0aW5nIHdpdGggKHRocm91Z2ggbWFwIGNvbnRyb2xzKVxuICBhY3RpdmVNYXBJbmRleDogMFxufTtcblxuLyoqXG4gKiBBIGxpc3Qgb2YgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eSBhbmQgd2hldGhlciBpcyBpdCBhY3RpdmUuXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSB2aXNpYmxlTGF5ZXJzIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgbWFwTGVnZW5kIERlZmF1bHQ6IGB7c2hvdzogdHJ1ZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHJvcGVydHkgdG9nZ2xlM2QgRGVmYXVsdDogYHtzaG93OiB0cnVlfWBcbiAqIEBwcm9wZXJ0eSBzcGxpdE1hcCBEZWZhdWx0OiBge3Nob3c6IHRydWV9YFxuICogQHByb3BlcnR5IG1hcERyYXcgRGVmYXVsdDogYHtzaG93OiB0cnVlLCBhY3RpdmU6IGZhbHNlfWBcbiAqIEBwcm9wZXJ0eSBtYXBMb2NhbGUgRGVmYXVsdDogYHtzaG93OiBmYWxzZSwgYWN0aXZlOiBmYWxzZX1gXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BUF9DT05UUk9MUzogTWFwQ29udHJvbHMgPSAoT2JqZWN0LmtleXMoTUFQX0NPTlRST0xTKSBhcyBBcnJheTxcbiAga2V5b2YgdHlwZW9mIE1BUF9DT05UUk9MU1xuPikucmVkdWNlKFxuICAoZmluYWwsIGN1cnJlbnQpID0+ICh7XG4gICAgLi4uZmluYWwsXG4gICAgW2N1cnJlbnRdOiBERUZBVUxUX01BUF9DT05UUk9MU19GRUFUVVJFU1xuICB9KSxcbiAge30gYXMgTWFwQ29udHJvbHNcbik7XG5cbi8qKlxuICogRGVmYXVsdCBpbWFnZSBleHBvcnQgY29uZmlnXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSByYXRpbyBEZWZhdWx0OiBgJ1NDUkVFTidgLFxuICogQHByb3BlcnR5IHJlc29sdXRpb24gRGVmYXVsdDogYCdPTkVfWCdgLFxuICogQHByb3BlcnR5IGxlZ2VuZCBEZWZhdWx0OiBgZmFsc2VgLFxuICogQHByb3BlcnR5IG1hcEggRGVmYXVsdDogMCxcbiAqIEBwcm9wZXJ0eSBtYXBXIERlZmF1bHQ6IDAsXG4gKiBAcHJvcGVydHkgaW1hZ2VTaXplIERlZmF1bHQ6IHt6b29tT2Zmc2V0OiAwLCBzY2FsZTogMSwgaW1hZ2VXOiAwLCBpbWFnZUg6IDB9LFxuICogQHByb3BlcnR5IGltYWdlRGF0YVVyaSBEZWZhdWx0OiBgJydgLFxuICogQHByb3BlcnR5IGV4cG9ydGluZyBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgZXJyb3IgRGVmYXVsdDogYGZhbHNlYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSU1BR0U6IEV4cG9ydEltYWdlID0ge1xuICAvLyB1c2VyIG9wdGlvbnNcbiAgcmF0aW86IEVYUE9SVF9JTUdfUkFUSU9TLlNDUkVFTixcbiAgcmVzb2x1dGlvbjogUkVTT0xVVElPTlMuT05FX1gsXG4gIGxlZ2VuZDogZmFsc2UsXG4gIG1hcEg6IDAsXG4gIG1hcFc6IDAsXG4gIGltYWdlU2l6ZToge1xuICAgIHpvb21PZmZzZXQ6IDAsXG4gICAgc2NhbGU6IDEsXG4gICAgaW1hZ2VXOiAwLFxuICAgIGltYWdlSDogMFxuICB9LFxuICAvLyB3aGVuIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBtb2NrIG1hcCB2aWV3cG9ydCB3aWxsIG1vdmUgdG8gdGhlIGNlbnRlciBvZiBkYXRhXG4gIGNlbnRlcjogZmFsc2UsXG4gIC8vIGV4cG9ydGluZyBzdGF0ZVxuICBpbWFnZURhdGFVcmk6ICcnLFxuICAvLyBleHBvcnRpbmc6IHVzZWQgdG8gYXR0YWNoIHBsb3QtY29udGFpbmVyIHRvIGRvbVxuICBleHBvcnRpbmc6IGZhbHNlLFxuICAvLyBwcm9jZXNzaW5nOiB1c2VkIGFzIGxvYWRpbmcgaW5kaWNhdG9yIHdoZW4gZXhwb3J0IGltYWdlIGlzIGJlaW5nIHByb2R1Y2VkXG4gIHByb2Nlc3Npbmc6IGZhbHNlLFxuICBlcnJvcjogZmFsc2Vcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPQURfRklMRVMgPSB7XG4gIGZpbGVMb2FkaW5nOiBmYWxzZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYGV4cG9ydERhdGFgIHNldHRpbmdzXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBzZWxlY3RlZERhdGFzZXQgRGVmYXVsdDogYCcnYCxcbiAqIEBwcm9wZXJ0eSBkYXRhVHlwZSBEZWZhdWx0OiBgJ2NzdidgLFxuICogQHByb3BlcnR5IGZpbHRlcmVkIERlZmF1bHQ6IGB0cnVlYCxcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhQT1JUX0RBVEE6IEV4cG9ydERhdGEgPSB7XG4gIHNlbGVjdGVkRGF0YXNldDogJycsXG4gIGRhdGFUeXBlOiBFWFBPUlRfREFUQV9UWVBFLkNTVixcbiAgZmlsdGVyZWQ6IHRydWVcbn07XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX05PVElGSUNBVElPTlMgPSBbXTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBleHBvcnRNYXBib3hBY2Nlc3NUb2tlbiAtIERlZmF1bHQ6IG51bGwsIHRoaXMgaXMgdXNlZCB3aGVuIHdlIHByb3ZpZGUgYSBkZWZhdWx0IG1hcGJveCB0b2tlbiBmb3IgdXNlcnMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2ZcbiAqIEBwcm9wZXJ0eSB1c2VyTWFwYm94VG9rZW4gLSBEZWZhdWx0OiAnJywgbWFwYm94IHRva2VuIHByb3ZpZGVkIGJ5IHVzZXIgdGhyb3VnaCBpbnB1dCBmaWVsZFxuICogQHByb3BlcnR5IG1vZGUgLSBEZWZhdWx0OiAnUkVBRCcsIHJlYWQgb25seSBvciBlZGl0YWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfSFRNTDogRXhwb3J0SHRtbCA9IHtcbiAgZXhwb3J0TWFwYm94QWNjZXNzVG9rZW46IG51bGwsXG4gIHVzZXJNYXBib3hUb2tlbjogJycsXG4gIG1vZGU6IEVYUE9SVF9IVE1MX01BUF9NT0RFUy5SRUFEXG59O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IGhhc0RhdGEgLSBEZWZhdWx0OiAndHJ1ZScsXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYUE9SVF9KU09OOiBFeHBvcnRKc29uID0ge1xuICBoYXNEYXRhOiB0cnVlXG59O1xuXG4vKipcbiAqIEV4cG9ydCBNYXAgQ29uZmlnXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBIVE1MIC0gRGVmYXVsdDogJ0RFRkFVTFRfRVhQT1JUX0hUTUwnLFxuICogQHByb3BlcnR5IEpTT04gLSBEZWZhdWx0OiAnREVGQVVMVF9FWFBPUlRfSlNPTicsXG4gKiBAcHJvcGVydHkgZm9ybWF0IC0gRGVmYXVsdDogJ0hUTUwnLFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFBPUlRfTUFQOiBFeHBvcnRNYXAgPSB7XG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSFRNTF06IERFRkFVTFRfRVhQT1JUX0hUTUwsXG4gIFtFWFBPUlRfTUFQX0ZPUk1BVFMuSlNPTl06IERFRkFVTFRfRVhQT1JUX0pTT04sXG4gIGZvcm1hdDogRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGB1aVN0YXRlYFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQGNvbnN0YW50XG4gKiBAcHJvcGVydHkgcmVhZE9ubHkgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IGFjdGl2ZVNpZGVQYW5lbCBEZWZhdWx0OiBgJ2xheWVyJ2BcbiAqIEBwcm9wZXJ0eSBjdXJyZW50TW9kYWwgRGVmYXVsdDogYCdhZGREYXRhJ2BcbiAqIEBwcm9wZXJ0eSBkYXRhc2V0S2V5VG9SZW1vdmUgRGVmYXVsdDogYG51bGxgXG4gKiBAcHJvcGVydHkgdmlzaWJsZURyb3Bkb3duIERlZmF1bHQ6IGBudWxsYFxuICogQHByb3BlcnR5IGV4cG9ydEltYWdlIERlZmF1bHQ6IFtgREVGQVVMVF9FWFBPUlRfSU1BR0VgXSgjZGVmYXVsdF9leHBvcnRfaW1hZ2UpXG4gKiBAcHJvcGVydHkgZXhwb3J0RGF0YSBEZWZhdWx0OiBbYERFRkFVTFRfRVhQT1JUX0RBVEFgXSgjZGVmYXVsdF9leHBvcnRfZGF0YSlcbiAqIEBwcm9wZXJ0eSBleHBvcnRNYXAgRGVmYXVsdDogW2BERUZBVUxUX0VYUE9SVF9NQVBgXSgjZGVmYXVsdF9leHBvcnRfbWFwKVxuICogQHByb3BlcnR5IG1hcENvbnRyb2xzIERlZmF1bHQ6IFtgREVGQVVMVF9NQVBfQ09OVFJPTFNgXSgjZGVmYXVsdF9tYXBfY29udHJvbHMpXG4gKiBAcHJvcGVydHkgbm90aWZpY2F0aW9ucyBEZWZhdWx0OiBgW11gXG4gKiBAcHJvcGVydHkgbm90aWZpY2F0aW9ucyBEZWZhdWx0OiBgW11gXG4gKiBAcHJvcGVydHkgbG9hZEZpbGVzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBJTklUSUFMX1VJX1NUQVRFOiBVaVN0YXRlID0ge1xuICByZWFkT25seTogZmFsc2UsXG4gIGFjdGl2ZVNpZGVQYW5lbDogREVGQVVMVF9BQ1RJVkVfU0lERV9QQU5FTCxcbiAgY3VycmVudE1vZGFsOiBERUZBVUxUX01PREFMLFxuICBkYXRhc2V0S2V5VG9SZW1vdmU6IG51bGwsXG4gIHZpc2libGVEcm9wZG93bjogbnVsbCxcbiAgLy8gZXhwb3J0IGltYWdlIG1vZGFsIHVpXG4gIGV4cG9ydEltYWdlOiBERUZBVUxUX0VYUE9SVF9JTUFHRSxcbiAgLy8gZXhwb3J0IGRhdGEgbW9kYWwgdWlcbiAgZXhwb3J0RGF0YTogREVGQVVMVF9FWFBPUlRfREFUQSxcbiAgLy8gaHRtbCBleHBvcnRcbiAgZXhwb3J0TWFwOiBERUZBVUxUX0VYUE9SVF9NQVAsXG4gIC8vIG1hcCBjb250cm9sIHBhbmVsc1xuICBtYXBDb250cm9sczogREVGQVVMVF9NQVBfQ09OVFJPTFMsXG4gIC8vIHVpIG5vdGlmaWNhdGlvbnNcbiAgbm90aWZpY2F0aW9uczogREVGQVVMVF9OT1RJRklDQVRJT05TLFxuICAvLyBsb2FkIGZpbGVzXG4gIGxvYWRGaWxlczogREVGQVVMVF9MT0FEX0ZJTEVTLFxuICAvLyBMb2NhbGUgb2YgdGhlIFVJXG4gIGxvY2FsZTogTE9DQUxFX0NPREVTLmVuLFxuICBsYXllclBhbmVsTGlzdFZpZXc6ICdsaXN0J1xufTtcblxuLyogVXBkYXRlcnMgKi9cbi8qKlxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0VWlTdGF0ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICBhY3Rpb246IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzWydJTklUJ107XG4gICAgcGF5bG9hZDogS2VwbGVyR2xJbml0UGF5bG9hZDtcbiAgfVxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgLi4uKGFjdGlvbi5wYXlsb2FkIHx8IHt9KS5pbml0aWFsVWlTdGF0ZVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgaWQgb2Ygc2lkZSBwYW5lbCB0byBiZSBzaG93biwgb25lIG9mIGBsYXllcmAsIGBmaWx0ZXJgLCBgaW50ZXJhY3Rpb25gLCBgbWFwYC4gY2xvc2Ugc2lkZSBwYW5lbCBpZiBgbnVsbGBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU2lkZVBhbmVsVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZVNpZGVQYW5lbFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICByZXR1cm4gaWQgPT09IHN0YXRlLmFjdGl2ZVNpZGVQYW5lbFxuICAgID8gc3RhdGVcbiAgICA6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGFjdGl2ZVNpZGVQYW5lbDogaWRcbiAgICAgIH07XG59O1xuXG4vKipcbiAqIFNob3cgYW5kIGhpZGUgbW9kYWwgZGlhbG9nXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW1hY3Rpb24ucGF5bG9hZCBpZCBvZiBtb2RhbCB0byBiZSBzaG93biwgbnVsbCB0byBoaWRlIG1vZGFscy4gT25lIG9mOlxuICogIC0gW2BEQVRBX1RBQkxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZGF0YV90YWJsZV9pZClcbiAqICAtIFtgREVMRVRFX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNkZWxldGVfZGF0YV9pZClcbiAqICAtIFtgQUREX0RBVEFfSURgXSguLi9jb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncy5tZCNhZGRfZGF0YV9pZClcbiAqICAtIFtgRVhQT1JUX0lNQUdFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjZXhwb3J0X2ltYWdlX2lkKVxuICogIC0gW2BFWFBPUlRfREFUQV9JRGBdKC4uL2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzLm1kI2V4cG9ydF9kYXRhX2lkKVxuICogIC0gW2BBRERfTUFQX1NUWUxFX0lEYF0oLi4vY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MubWQjYWRkX21hcF9zdHlsZV9pZClcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTW9kYWxVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuVG9nZ2xlTW9kYWxVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBjdXJyZW50TW9kYWw6IGlkXG59KTtcblxuLyoqXG4gKiBIaWRlIGFuZCBzaG93IHNpZGUgcGFuZWwgaGVhZGVyIGRyb3Bkb3duLCBhY3RpdmF0ZWQgYnkgY2xpY2tpbmcgdGhlIHNoYXJlIGxpbmsgb24gdG9wIG9mIHRoZSBzaWRlIHBhbmVsXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RXhwb3J0RHJvcGRvd25VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGlkfTogVUlTdGF0ZUFjdGlvbnMuU2hvd0V4cG9ydERyb3Bkb3duVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdmlzaWJsZURyb3Bkb3duOiBpZFxufSk7XG5cbi8qKlxuICogSGlkZSBzaWRlIHBhbmVsIGhlYWRlciBkcm9wZG93biwgYWN0aXZhdGVkIGJ5IGNsaWNraW5nIHRoZSBzaGFyZSBsaW5rIG9uIHRvcCBvZiB0aGUgc2lkZSBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaGlkZUV4cG9ydERyb3Bkb3duVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIHZpc2libGVEcm9wZG93bjogbnVsbFxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGFjdGl2ZSBtYXAgY29udHJvbCBwYW5lbFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVNYXBDb250cm9sVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiB7cGFuZWxJZCwgaW5kZXggPSAwfX06IFVJU3RhdGVBY3Rpb25zLlRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBDb250cm9sczoge1xuICAgIC4uLnN0YXRlLm1hcENvbnRyb2xzLFxuICAgIFtwYW5lbElkXToge1xuICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAvLyB0aGlzIGhhbmRsZXMgc3BsaXQgbWFwIGludGVyYWN0aW9uXG4gICAgICAvLyBUb2dnbGluZyBmcm9tIHdpdGhpbiB0aGUgc2FtZSBtYXAgd2lsbCBzaW1wbHkgdG9nZ2xlIHRoZSBhY3RpdmUgcHJvcGVydHlcbiAgICAgIC8vIFRvZ2dsaW5nIGZyb20gd2l0aGluIGRpZmZlcmVudCBtYXBzIHdlIHNldCB0aGUgYWN0aXZlIHByb3BlcnR5IHRvIHRydWVcbiAgICAgIGFjdGl2ZTpcbiAgICAgICAgaW5kZXggPT09IHN0YXRlLm1hcENvbnRyb2xzW3BhbmVsSWRdLmFjdGl2ZU1hcEluZGV4XG4gICAgICAgICAgPyAhc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0uYWN0aXZlXG4gICAgICAgICAgOiB0cnVlLFxuICAgICAgYWN0aXZlTWFwSW5kZXg6IGluZGV4XG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbWFwIGNvbnRyb2wgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvbiBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBtYXAgY29udHJvbCBwYW5lbCBpZCwgb25lIG9mIHRoZSBrZXlzIG9mOiBbYERFRkFVTFRfTUFQX0NPTlRST0xTYF0oI2RlZmF1bHRfbWFwX2NvbnRyb2xzKVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRNYXBDb250cm9sVmlzaWJpbGl0eVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDoge3BhbmVsSWQsIHNob3d9fTogVUlTdGF0ZUFjdGlvbnMuc2V0TWFwQ29udHJvbFZpc2liaWxpdHlVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+IHtcbiAgaWYgKCFzdGF0ZS5tYXBDb250cm9scz8uW3BhbmVsSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtYXBDb250cm9sczoge1xuICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHMsXG4gICAgICBbcGFuZWxJZF06IHtcbiAgICAgICAgLi4uc3RhdGUubWFwQ29udHJvbHNbcGFuZWxJZF0sXG4gICAgICAgIHNob3c6IEJvb2xlYW4oc2hvdylcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBhY3RpdmUgbWFwIGNvbnRyb2wgcGFuZWxcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBkYXRhc2V0IGlkXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG9wZW5EZWxldGVNb2RhbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YXNldEtleVRvUmVtb3ZlfTogVUlTdGF0ZUFjdGlvbnMuT3BlbkRlbGV0ZU1vZGFsVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgY3VycmVudE1vZGFsOiBERUxFVEVfREFUQV9JRCxcbiAgZGF0YXNldEtleVRvUmVtb3ZlXG59KTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydEltYWdlLmxlZ2VuZGAgdG8gYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBuZXdTZXR0aW5nfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGNvbnN0IHVwZGF0ZWQgPSB7Li4uc3RhdGUuZXhwb3J0SW1hZ2UsIC4uLm5ld1NldHRpbmd9O1xuICBjb25zdCBpbWFnZVNpemUgPSBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUodXBkYXRlZCkgfHwgc3RhdGUuZXhwb3J0SW1hZ2UuaW1hZ2VTaXplO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZXhwb3J0SW1hZ2U6IHtcbiAgICAgIC4uLnVwZGF0ZWQsXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAvLyBUT0RPOiBjYWxjdWxhdGVFeHBvcnRJbWFnZVNpemUgZG9lcyBub3QgcmV0dXJuIGltYWdlU2l6ZS56b29tT2Zmc2V0LFxuICAgICAgLy8gZG8gd2UgbmVlZCB0YWtlIHRoaXMgdmFsdWUgZnJvbSBjdXJyZW50IHN0YXRlLCBvciByZXR1cm4gZGVmYXVsIHZhbHVlID0gMFxuICAgICAgaW1hZ2VTaXplXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBTZXQgYGV4cG9ydEltYWdlLnNldEV4cG9ydEltYWdlRGF0YVVyaWAgdG8gYSBpbWFnZSBkYXRhVXJpXG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZXhwb3J0IGltYWdlIGRhdGEgdXJpXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZGF0YVVyaX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydEltYWdlRGF0YVVyaVVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgaW1hZ2VEYXRhVXJpOiBkYXRhVXJpXG4gIH1cbn0pO1xuXG4vKipcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydEltYWdlRXJyb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IGVycm9yfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SW1hZ2VFcnJvclVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydEltYWdlOiB7XG4gICAgLi4uc3RhdGUuZXhwb3J0SW1hZ2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgZXJyb3JcbiAgfVxufSk7XG5cbi8qKlxuICogRGVsZXRlIGNhY2hlZCBleHBvcnQgaW1hZ2VcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGNsZWFudXBFeHBvcnRJbWFnZVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRJbWFnZToge1xuICAgIC4uLnN0YXRlLmV4cG9ydEltYWdlLFxuICAgIGV4cG9ydGluZzogZmFsc2UsXG4gICAgaW1hZ2VEYXRhVXJpOiAnJyxcbiAgICBlcnJvcjogZmFsc2UsXG4gICAgcHJvY2Vzc2luZzogZmFsc2UsXG4gICAgY2VudGVyOiBmYWxzZVxuICB9XG59KTtcblxuLyoqXG4gKiBTdGFydCBpbWFnZSBleHBvcnRpbmcgZmxvd1xuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHJldHVybnMge1VpU3RhdGV9XG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFydEV4cG9ydGluZ0ltYWdlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBvcHRpb25zID0ge319OiB7cGF5bG9hZDogUGFydGlhbDxFeHBvcnRJbWFnZT59XG4pOiBVaVN0YXRlID0+IHtcbiAgY29uc3QgaW1hZ2VTZXR0aW5ncyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGV4cG9ydGluZzogdHJ1ZVxuICB9O1xuXG4gIHJldHVybiBjb21wb3NlXyhbXG4gICAgY2xlYW51cEV4cG9ydEltYWdlVXBkYXRlcixcbiAgICBhcHBseV8oc2V0RXhwb3J0SW1hZ2VTZXR0aW5nVXBkYXRlciwgcGF5bG9hZF8oaW1hZ2VTZXR0aW5ncykpXG4gIF0pKHN0YXRlKTtcbn07XG5cbi8qKlxuICogU2V0IHNlbGVjdGVkIGRhdGFzZXQgZm9yIGV4cG9ydFxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkIGRhdGFzZXQgaWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhc2V0fTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0U2VsZWN0ZWREYXRhc2V0VXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgc2VsZWN0ZWREYXRhc2V0OiBkYXRhc2V0XG4gIH1cbn0pO1xuXG4vKipcbiAqIFNldCBkYXRhIGZvcm1hdCBmb3IgZXhwb3J0aW5nIGRhdGFcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBvbmUgb2YgYCd0ZXh0L2NzdidgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydERhdGFUeXBlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBkYXRhVHlwZX06IFVJU3RhdGVBY3Rpb25zLlNldEV4cG9ydERhdGFUeXBlVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZXhwb3J0RGF0YToge1xuICAgIC4uLnN0YXRlLmV4cG9ydERhdGEsXG4gICAgZGF0YVR5cGVcbiAgfVxufSk7XG5cbi8qKlxuICogV2hldGhlciB0byBleHBvcnQgZmlsdGVyZWQgZGF0YSwgYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogZmlsdGVyZWR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRGaWx0ZXJlZFVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydERhdGE6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnREYXRhLFxuICAgIGZpbHRlcmVkXG4gIH1cbn0pO1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gaW5jbHVkaW5nIGRhdGEgaW4gbWFwIGNvbmZpZywgdG9nZ2xlIGJldHdlZW4gYHRydWVgIG9yIGBmYWxzZWBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0RGF0YVVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5KU09OXSxcbiAgICAgIGhhc0RhdGE6ICFzdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkpTT05dLmhhc0RhdGFcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIHdoZXRoZXIgdG8gZXhwb3J0IGEgbWFwYm94IGFjY2VzcyB0byBIVE1MIHNpbmdsZSBwYWdlXG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRVc2VyTWFwYm94QWNjZXNzVG9rZW5VcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHVzZXJNYXBib3hUb2tlbn06IFVJU3RhdGVBY3Rpb25zLlNldFVzZXJNYXBib3hBY2Nlc3NUb2tlblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGV4cG9ydE1hcDoge1xuICAgIC4uLnN0YXRlLmV4cG9ydE1hcCxcbiAgICBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdOiB7XG4gICAgICAuLi5zdGF0ZS5leHBvcnRNYXBbRVhQT1JUX01BUF9GT1JNQVRTLkhUTUxdLFxuICAgICAgdXNlck1hcGJveFRva2VuXG4gICAgfVxuICB9XG59KTtcblxuLyoqXG4gKiBTZXRzIHRoZSBleHBvcnQgbWFwIGZvcm1hdFxuICogQHBhcmFtIHN0YXRlIC0gYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgZm9ybWF0IHRvIHVzZSB0byBleHBvcnQgdGhlIG1hcCBpbnRvXG4gKiBAcmV0dXJuIG5leHRTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0RXhwb3J0TWFwRm9ybWF0VXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBmb3JtYXR9OiBVSVN0YXRlQWN0aW9ucy5TZXRFeHBvcnRNYXBGb3JtYXRVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIGZvcm1hdFxuICB9XG59KTtcblxuLyoqXG4gKiBTZXQgdGhlIGV4cG9ydCBodG1sIG1hcCBtb2RlXG4gKiBAcGFyYW0gc3RhdGUgLSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCB0byBiZSBzZXQgKGF2YWlsYWJsZSBtb2RlczogRVhQT1JUX0hUTUxfTUFQX01PREVTKVxuICogQHJldHVybiBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IHNldEV4cG9ydE1hcEhUTUxNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBtb2RlfTogVUlTdGF0ZUFjdGlvbnMuU2V0RXhwb3J0SFRNTE1hcE1vZGVVcGRhdGVyQWN0aW9uXG4pOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBleHBvcnRNYXA6IHtcbiAgICAuLi5zdGF0ZS5leHBvcnRNYXAsXG4gICAgW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXToge1xuICAgICAgLi4uc3RhdGUuZXhwb3J0TWFwW0VYUE9SVF9NQVBfRk9STUFUUy5IVE1MXSxcbiAgICAgIG1vZGVcbiAgICB9XG4gIH1cbn0pO1xuXG4vKipcbiAqIEFkZHMgYSBuZXcgbm90aWZpY2F0aW9uLlxuICogVXBkYXRlcyBhIG5vdGlmaWNhdGlvbiBpbiBjYXNlIG9mIG1hdGNoaW5nIGlkcy5cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBQYXJhbXMgb2YgYSBub3RpZmljYXRpb25cbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYWRkTm90aWZpY2F0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkfTogVUlTdGF0ZUFjdGlvbnMuQWRkTm90aWZpY2F0aW9uVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiB7XG4gIGxldCBub3RpZmljYXRpb25zO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgcGF5bG9hZElkID0gcGF5bG9hZD8uaWQ7XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRvVXBkYXRlID0gcGF5bG9hZElkID8gc3RhdGUubm90aWZpY2F0aW9ucy5maW5kKG4gPT4gbi5pZCA9PT0gcGF5bG9hZElkKSA6IG51bGw7XG4gIGlmIChub3RpZmljYXRpb25Ub1VwZGF0ZSkge1xuICAgIG5vdGlmaWNhdGlvbnMgPSBzdGF0ZS5ub3RpZmljYXRpb25zLm1hcChuID0+XG4gICAgICBuLmlkID09PSBwYXlsb2FkSWQgPyBjcmVhdGVOb3RpZmljYXRpb24ocGF5bG9hZCkgOiBuXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBub3RpZmljYXRpb25zID0gWy4uLihzdGF0ZS5ub3RpZmljYXRpb25zIHx8IFtdKSwgY3JlYXRlTm90aWZpY2F0aW9uKHBheWxvYWQpXTtcbiAgfVxuXG4gIHJldHVybiB7Li4uc3RhdGUsIG5vdGlmaWNhdGlvbnN9O1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBub3RpZmljYXRpb25cbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgdWlTdGF0ZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBpZCBvZiB0aGUgbm90aWZpY2F0aW9uIHRvIGJlIHJlbW92ZWRcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlTm90aWZpY2F0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFVpU3RhdGUsXG4gIHtwYXlsb2FkOiBpZH06IFVJU3RhdGVBY3Rpb25zLlJlbW92ZU5vdGlmaWNhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG5vdGlmaWNhdGlvbnM6IHN0YXRlLm5vdGlmaWNhdGlvbnMuZmlsdGVyKG4gPT4gbi5pZCAhPT0gaWQpXG59KTtcblxuLyoqXG4gKiBGaXJlZCB3aGVuIGZpbGUgbG9hZGluZyBiZWdpblxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNVcGRhdGVyID0gKHN0YXRlOiBVaVN0YXRlKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9hZEZpbGVzOiB7XG4gICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgIGZpbGVMb2FkaW5nOiB0cnVlXG4gIH1cbn0pO1xuXG4vKipcbiAqIEhhbmRsZXMgbG9hZGluZyBmaWxlIHN1Y2Nlc3MgYW5kIHNldCBmaWxlTG9hZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxvYWRGaWxlczoge1xuICAgIC4uLnN0YXRlLmxvYWRGaWxlcyxcbiAgICBmaWxlTG9hZGluZzogZmFsc2VcbiAgfVxufSk7XG5cbi8qKlxuICogSGFuZGxlcyBsb2FkIGZpbGUgZXJyb3IgYW5kIHNldCBmaWxlTG9hZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLmVycm9yXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUsIHtlcnJvcn06IExvYWRGaWxlc0VyclVwZGF0ZXJBY3Rpb24pOiBVaVN0YXRlID0+XG4gIGFkZE5vdGlmaWNhdGlvblVwZGF0ZXIoXG4gICAge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsb2FkRmlsZXM6IHtcbiAgICAgICAgLi4uc3RhdGUubG9hZEZpbGVzLFxuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IGVycm9yTm90aWZpY2F0aW9uKHtcbiAgICAgICAgbWVzc2FnZTogKGVycm9yIHx8IHt9KS5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdXBsb2FkIGZpbGVzJyxcbiAgICAgICAgdG9waWM6IERFRkFVTFRfTk9USUZJQ0FUSU9OX1RPUElDUy5nbG9iYWxcbiAgICAgIH0pXG4gICAgfVxuICApO1xuXG4vKipcbiAqIEhhbmRsZXMgdG9nZ2xlIG1hcCBzcGxpdCBhbmQgcmVzZXQgYWxsIG1hcCBjb250cm9sIGluZGV4IHRvIDBcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFVwZGF0ZXIgPSAoc3RhdGU6IFVpU3RhdGUpOiBVaVN0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBDb250cm9sczogT2JqZWN0LmVudHJpZXMoc3RhdGUubWFwQ29udHJvbHMpLnJlZHVjZShcbiAgICAoYWNjLCBlbnRyeSkgPT4gKHtcbiAgICAgIC4uLmFjYyxcbiAgICAgIFtlbnRyeVswXV06IHtcbiAgICAgICAgLi4uZW50cnlbMV0sXG4gICAgICAgIGFjdGl2ZU1hcEluZGV4OiAwXG4gICAgICB9XG4gICAgfSksXG4gICAge30gYXMgTWFwQ29udHJvbHNcbiAgKVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIG1vZGFsIGRhdGFcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzaG93RGF0YXNldFRhYmxlVXBkYXRlciA9IChzdGF0ZTogVWlTdGF0ZSk6IFVpU3RhdGUgPT5cbiAgdG9nZ2xlTW9kYWxVcGRhdGVyKHN0YXRlLCB7cGF5bG9hZDogREFUQV9UQUJMRV9JRH0pO1xuXG4vKipcbiAqIFNldCB0aGUgbG9jYWxlIG9mIHRoZSBVSVxuICogQG1lbWJlcm9mIHVpU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGB1aVN0YXRlYFxuICogQHBhcmFtIGFjdGlvblxuICogQHBhcmFtIGFjdGlvbi5wYXlsb2FkXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQubG9jYWxlIGxvY2FsZVxuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMb2NhbGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVWlTdGF0ZSxcbiAge3BheWxvYWQ6IHtsb2NhbGV9fTogVUlTdGF0ZUFjdGlvbnMuU2V0TG9jYWxlVXBkYXRlckFjdGlvblxuKTogVWlTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbG9jYWxlXG59KTtcblxuLyoqXG4gKiBUb2dnbGUgbGF5ZXIgcGFuZWwgbGlzdCB2aWV3XG4gKiBAbWVtYmVyb2YgdWlTdGF0ZVVwZGF0ZXJzXG4gKiBAcGFyYW0gc3RhdGUgYHVpU3RhdGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgbGF5ZXIgcGFuZWwgbGlzdFZpZXcgdmFsdWUuIENhbiBiZSAnbGlzdCcgb3IgJ3NvcnRCeURhdGFzZXQnXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUxheWVyUGFuZWxMaXN0Vmlld1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBVaVN0YXRlLFxuICB7cGF5bG9hZDogbGlzdFZpZXd9OiBVSVN0YXRlQWN0aW9ucy5Ub2dnbGVMYXllclBhbmVsTGlzdFZpZXdBY3Rpb25cbik6IFVpU3RhdGUgPT4ge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIHJldHVybiBsaXN0VmlldyA9PT0gc3RhdGUubGF5ZXJQYW5lbExpc3RWaWV3XG4gICAgPyBzdGF0ZVxuICAgIDoge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbGF5ZXJQYW5lbExpc3RWaWV3OiBsaXN0Vmlld1xuICAgICAgfTtcbn07XG4iXX0=