@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.11

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