@kepler.gl/reducers 3.3.0-alpha.4 → 3.3.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/combined-updaters.js +491 -0
- package/dist/cjs/composer-helpers.js +101 -0
- package/dist/cjs/composers.js +22 -0
- package/dist/cjs/core.js +105 -0
- package/dist/cjs/data-utils.js +53 -0
- package/dist/cjs/export-utils.js +91 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/interaction-utils.js +105 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +654 -0
- package/dist/cjs/map-state.js +35 -0
- package/dist/cjs/map-style-updaters.js +660 -0
- package/dist/cjs/map-style.js +33 -0
- package/dist/cjs/merger-handler.js +105 -0
- package/dist/cjs/middleware.js +27 -0
- package/dist/cjs/provider-state-updaters.js +465 -0
- package/dist/cjs/provider-state.js +34 -0
- package/dist/cjs/root.js +207 -0
- package/dist/cjs/ui-state-updaters.js +905 -0
- package/dist/cjs/ui-state.js +36 -0
- package/dist/cjs/vis-state-merger.js +1193 -0
- package/dist/cjs/vis-state-selectors.js +30 -0
- package/dist/cjs/vis-state-updaters.js +4114 -0
- package/dist/cjs/vis-state.js +35 -0
- package/dist/{combined-updaters.js → esm/combined-updaters.js} +74 -81
- package/dist/esm/composer-helpers.js +85 -0
- package/dist/esm/composers.js +14 -0
- package/dist/esm/core.js +101 -0
- package/dist/esm/data-utils.js +47 -0
- package/dist/esm/export-utils.js +86 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/interaction-utils.js +96 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +646 -0
- package/dist/esm/map-state.js +29 -0
- package/dist/esm/map-style-updaters.js +652 -0
- package/dist/esm/map-style.js +27 -0
- package/dist/esm/merger-handler.js +96 -0
- package/dist/esm/middleware.js +19 -0
- package/dist/esm/provider-state-updaters.js +458 -0
- package/dist/esm/provider-state.js +28 -0
- package/dist/esm/root.js +201 -0
- package/dist/esm/ui-state-updaters.js +900 -0
- package/dist/esm/ui-state.js +30 -0
- package/dist/esm/vis-state-merger.js +1161 -0
- package/dist/esm/vis-state-selectors.js +24 -0
- package/dist/esm/vis-state-updaters.js +4035 -0
- package/dist/esm/vis-state.js +29 -0
- package/package.json +31 -24
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -22
- package/dist/core.js +0 -105
- package/dist/data-utils.js +0 -53
- package/dist/export-utils.js +0 -91
- package/dist/interaction-utils.js +0 -105
- package/dist/layer-utils.js +0 -635
- package/dist/map-state-updaters.js +0 -649
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -660
- package/dist/map-style.js +0 -33
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -465
- package/dist/provider-state.js +0 -34
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -905
- package/dist/ui-state.js +0 -36
- package/dist/vis-state-merger.js +0 -1193
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state-updaters.js +0 -4114
- package/dist/vis-state.js +0 -35
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.addLayerOrGroupToLayerOrder = addLayerOrGroupToLayerOrder;
|
|
8
|
+
exports.addLayerToLayerOrder = addLayerToLayerOrder;
|
|
9
|
+
exports.areAnyDeckLayersLoading = areAnyDeckLayersLoading;
|
|
10
|
+
exports.bindLayerCallbacks = bindLayerCallbacks;
|
|
11
|
+
exports.buildLayerOrderHierarchy = buildLayerOrderHierarchy;
|
|
12
|
+
exports.calculateLayerData = calculateLayerData;
|
|
13
|
+
exports.computeDeckLayers = computeDeckLayers;
|
|
14
|
+
exports.findDefaultLayer = findDefaultLayer;
|
|
15
|
+
exports.findParentGroupForLayer = findParentGroupForLayer;
|
|
16
|
+
exports.getCustomDeckLayers = getCustomDeckLayers;
|
|
17
|
+
exports.getFlatLayerOrder = getFlatLayerOrder;
|
|
18
|
+
exports.getIndexFromLayerEntryId = getIndexFromLayerEntryId;
|
|
19
|
+
exports.getLayerGroupFromLayerOrder = getLayerGroupFromLayerOrder;
|
|
20
|
+
exports.getLayerHoverProp = getLayerHoverProp;
|
|
21
|
+
exports.getLayerHoverPropValue = getLayerHoverPropValue;
|
|
22
|
+
exports.getLayerOrderFromLayers = getLayerOrderFromLayers;
|
|
23
|
+
exports.getNewLayerGroup = getNewLayerGroup;
|
|
24
|
+
exports.isLayerPresentInLayerOrder = isLayerPresentInLayerOrder;
|
|
25
|
+
exports.isLayerRenderable = isLayerRenderable;
|
|
26
|
+
exports.isLayerVisible = isLayerVisible;
|
|
27
|
+
exports.mergeLayerVisConfigForNewDatasets = mergeLayerVisConfigForNewDatasets;
|
|
28
|
+
exports.prepareLayersForDeck = prepareLayersForDeck;
|
|
29
|
+
exports.prepareLayersToRender = prepareLayersToRender;
|
|
30
|
+
exports.removeElementFromLayerOrder = removeElementFromLayerOrder;
|
|
31
|
+
exports.removeGhostLayerFromLayerOrder = removeGhostLayerFromLayerOrder;
|
|
32
|
+
exports.renderDeckGlLayer = renderDeckGlLayer;
|
|
33
|
+
exports.reorderLayerOrder = reorderLayerOrder;
|
|
34
|
+
exports.replaceLayerEntryInLayerOrder = replaceLayerEntryInLayerOrder;
|
|
35
|
+
exports.updateLayerGroupInLayerOrder = updateLayerGroupInLayerOrder;
|
|
36
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
37
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
38
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
39
|
+
var _console = _interopRequireDefault(require("global/console"));
|
|
40
|
+
var _constants = require("@kepler.gl/constants");
|
|
41
|
+
var _layers = require("@kepler.gl/layers");
|
|
42
|
+
var _utils = require("@kepler.gl/utils");
|
|
43
|
+
var _commonUtils = require("@kepler.gl/common-utils");
|
|
44
|
+
var _deckglLayers = require("@kepler.gl/deckgl-layers");
|
|
45
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
46
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
47
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
48
|
+
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; }
|
|
49
|
+
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
|
|
50
|
+
// Copyright contributors to the kepler.gl project
|
|
51
|
+
/**
|
|
52
|
+
* Find default layers from fields
|
|
53
|
+
*/
|
|
54
|
+
function findDefaultLayer(dataset, layerClasses) {
|
|
55
|
+
if (!dataset) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
var layerProps = Object.keys(layerClasses).reduce(function (previous, lc) {
|
|
59
|
+
var result = typeof layerClasses[lc].findDefaultLayerProps === 'function' ? layerClasses[lc].findDefaultLayerProps(dataset, previous) : {
|
|
60
|
+
props: []
|
|
61
|
+
};
|
|
62
|
+
var props = Array.isArray(result) ? result : result.props || [];
|
|
63
|
+
var foundLayers = result.foundLayers || previous;
|
|
64
|
+
return foundLayers.concat(props.map(function (p) {
|
|
65
|
+
return _objectSpread(_objectSpread({}, p), {}, {
|
|
66
|
+
type: lc,
|
|
67
|
+
dataId: dataset.id
|
|
68
|
+
}, lc === 'arc' || lc === 'line' ? {
|
|
69
|
+
isVisible: false
|
|
70
|
+
} : {});
|
|
71
|
+
}));
|
|
72
|
+
}, []);
|
|
73
|
+
|
|
74
|
+
// go through all layerProps to create layer
|
|
75
|
+
return layerProps.map(function (props) {
|
|
76
|
+
var layer = new layerClasses[props.type](props);
|
|
77
|
+
return typeof layer.setInitialLayerConfig === 'function' && dataset.dataContainer ? layer.setInitialLayerConfig(dataset) : layer;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Applies `patch` to `config.visConfig` only for layers whose `dataId` is in `datasetIdsToPatch`.
|
|
83
|
+
* Layers for datasets that were already on the map are left unchanged — `addDataToMap`
|
|
84
|
+
* Keys whose patch value is `undefined` are skipped so existing visConfig is not cleared.
|
|
85
|
+
*/
|
|
86
|
+
function mergeLayerVisConfigForNewDatasets(state, patch, datasetIdsToPatch) {
|
|
87
|
+
if (!patch || !Object.keys(patch).length) {
|
|
88
|
+
return state;
|
|
89
|
+
}
|
|
90
|
+
var hasDefinedPatchValue = Object.keys(patch).some(function (key) {
|
|
91
|
+
return patch[key] !== undefined;
|
|
92
|
+
});
|
|
93
|
+
if (!hasDefinedPatchValue) {
|
|
94
|
+
return state;
|
|
95
|
+
}
|
|
96
|
+
var datasetIdSet = new Set(datasetIdsToPatch);
|
|
97
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
98
|
+
layers: state.layers.map(function (layer) {
|
|
99
|
+
if (!layer.config.dataId || !datasetIdSet.has(layer.config.dataId)) {
|
|
100
|
+
return layer;
|
|
101
|
+
}
|
|
102
|
+
var settings = layer.visConfigSettings;
|
|
103
|
+
if (!settings) {
|
|
104
|
+
return layer;
|
|
105
|
+
}
|
|
106
|
+
var allowedKeys = Object.keys(patch).filter(function (key) {
|
|
107
|
+
return Object.prototype.hasOwnProperty.call(settings, key) && patch[key] !== undefined;
|
|
108
|
+
});
|
|
109
|
+
if (!allowedKeys.length) {
|
|
110
|
+
return layer;
|
|
111
|
+
}
|
|
112
|
+
var partial = allowedKeys.reduce(function (acc, key) {
|
|
113
|
+
acc[key] = patch[key];
|
|
114
|
+
return acc;
|
|
115
|
+
}, {});
|
|
116
|
+
return layer.updateLayerVisConfig(partial);
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Calculate layer data based on layer type, col Config,
|
|
122
|
+
* return updated layer if colorDomain, dataMap has changed.
|
|
123
|
+
* Also, returns updated layer in case the input layer was in invalid state.
|
|
124
|
+
* Adds an error message to the layer in case of an exception.
|
|
125
|
+
*/
|
|
126
|
+
function calculateLayerData(layer, state, oldLayerData) {
|
|
127
|
+
var layerData;
|
|
128
|
+
try {
|
|
129
|
+
// Make sure the layer updates data after an error
|
|
130
|
+
if (!layer.isValid) {
|
|
131
|
+
layer._oldDataUpdateTriggers = undefined;
|
|
132
|
+
}
|
|
133
|
+
if (!layer.type || !layer.hasAllColumns() || !layer.config.dataId) {
|
|
134
|
+
return {
|
|
135
|
+
layer: layer,
|
|
136
|
+
layerData: {}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
layerData = layer.formatLayerData(state.datasets, oldLayerData);
|
|
140
|
+
|
|
141
|
+
// At this point the data for the layer is updated without errors
|
|
142
|
+
if (!layer.isValid) {
|
|
143
|
+
// Switch to visible after an error
|
|
144
|
+
layer = layer.updateLayerConfig({
|
|
145
|
+
isVisible: true
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
layer.isValid = true;
|
|
149
|
+
layer.errorMessage = null;
|
|
150
|
+
} catch (err) {
|
|
151
|
+
_console["default"].error(err);
|
|
152
|
+
layer = layer.updateLayerConfig({
|
|
153
|
+
isVisible: false
|
|
154
|
+
});
|
|
155
|
+
layer.isValid = false;
|
|
156
|
+
layer.errorMessage = err instanceof Error && err.message ? err.message.substring(0, 100) : 'Unknown error';
|
|
157
|
+
layerData = {};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
layer: layer,
|
|
161
|
+
layerData: layerData
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Calculate props passed to LayerHoverInfo
|
|
167
|
+
*/
|
|
168
|
+
function getLayerHoverProp(_ref) {
|
|
169
|
+
var animationConfig = _ref.animationConfig,
|
|
170
|
+
interactionConfig = _ref.interactionConfig,
|
|
171
|
+
hoverInfo = _ref.hoverInfo,
|
|
172
|
+
layers = _ref.layers,
|
|
173
|
+
layersToRender = _ref.layersToRender,
|
|
174
|
+
datasets = _ref.datasets;
|
|
175
|
+
if (interactionConfig.tooltip.enabled && hoverInfo && hoverInfo.picked) {
|
|
176
|
+
// if anything hovered
|
|
177
|
+
var object = hoverInfo.object,
|
|
178
|
+
overlay = hoverInfo.layer;
|
|
179
|
+
|
|
180
|
+
// deckgl layer to kepler-gl layer
|
|
181
|
+
var layer = layers[overlay.props.idx];
|
|
182
|
+
|
|
183
|
+
// NOTE: for binary format GeojsonLayer, deck will return object=null but hoverInfo.index >= 0
|
|
184
|
+
if ((object || hoverInfo.index >= 0) && layer && layer.getHoverData && layersToRender[layer.id]) {
|
|
185
|
+
// if layer is visible and have hovered data
|
|
186
|
+
var dataId = layer.config.dataId;
|
|
187
|
+
if (!dataId) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
var _datasets$dataId = datasets[dataId],
|
|
191
|
+
dataContainer = _datasets$dataId.dataContainer,
|
|
192
|
+
fields = _datasets$dataId.fields;
|
|
193
|
+
var data = layer.getHoverData(object || hoverInfo.index, dataContainer, fields, animationConfig, hoverInfo);
|
|
194
|
+
if (!data) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
var fieldsToShow = interactionConfig.tooltip.config.fieldsToShow[dataId];
|
|
198
|
+
return {
|
|
199
|
+
data: data,
|
|
200
|
+
fields: fields,
|
|
201
|
+
fieldsToShow: fieldsToShow,
|
|
202
|
+
layer: layer,
|
|
203
|
+
currentTime: animationConfig.currentTime
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
function renderDeckGlLayer(props, layerCallbacks) {
|
|
210
|
+
var datasets = props.datasets,
|
|
211
|
+
layer = props.layer,
|
|
212
|
+
layerIndex = props.layerIndex,
|
|
213
|
+
data = props.data,
|
|
214
|
+
hoverInfo = props.hoverInfo,
|
|
215
|
+
clicked = props.clicked,
|
|
216
|
+
mapState = props.mapState,
|
|
217
|
+
interactionConfig = props.interactionConfig,
|
|
218
|
+
animationConfig = props.animationConfig,
|
|
219
|
+
mapLayers = props.mapLayers,
|
|
220
|
+
experimentalContext = props.experimentalContext;
|
|
221
|
+
var dataset = datasets[layer.config.dataId];
|
|
222
|
+
var _ref2 = dataset || {},
|
|
223
|
+
gpuFilter = _ref2.gpuFilter;
|
|
224
|
+
var objectHovered = clicked || hoverInfo;
|
|
225
|
+
var visible = !mapLayers || mapLayers && mapLayers[layer.id];
|
|
226
|
+
// Layer is Layer class
|
|
227
|
+
return layer.renderLayer({
|
|
228
|
+
data: data,
|
|
229
|
+
gpuFilter: gpuFilter,
|
|
230
|
+
idx: layerIndex,
|
|
231
|
+
interactionConfig: interactionConfig,
|
|
232
|
+
layerCallbacks: layerCallbacks,
|
|
233
|
+
mapState: mapState,
|
|
234
|
+
animationConfig: animationConfig,
|
|
235
|
+
objectHovered: objectHovered,
|
|
236
|
+
visible: visible,
|
|
237
|
+
dataset: dataset,
|
|
238
|
+
experimentalContext: experimentalContext
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function isLayerRenderable(layer, layerData) {
|
|
242
|
+
return layer.id !== _constants.GEOCODER_LAYER_ID && layer.shouldRenderLayer(layerData);
|
|
243
|
+
}
|
|
244
|
+
function isLayerVisible(layer, mapLayers) {
|
|
245
|
+
return layer.config.isVisible && (
|
|
246
|
+
// if layer.id is not in mapLayers, don't render it
|
|
247
|
+
!mapLayers || mapLayers && mapLayers[layer.id]);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Prepare a dict of layers rendered by the deck.gl
|
|
251
|
+
// Note, isVisible: false layer is passed to deck.gl here
|
|
252
|
+
// return {[id]: true \ false}
|
|
253
|
+
function prepareLayersForDeck(layers, layerData) {
|
|
254
|
+
return layers.reduce(function (accu, layer, idx) {
|
|
255
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && layer.overlayType === _layers.OVERLAY_TYPE_CONST.deckgl));
|
|
256
|
+
}, {});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Prepare a dict of rendered layers rendered in the map
|
|
260
|
+
// This includes only the visibile layers for single map view and split map view
|
|
261
|
+
// return {[id]: true \ false}
|
|
262
|
+
function prepareLayersToRender(layers, layerData, mapLayers) {
|
|
263
|
+
return layers.reduce(function (accu, layer, idx) {
|
|
264
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, isLayerRenderable(layer, layerData[idx]) && isLayerVisible(layer, mapLayers)));
|
|
265
|
+
}, {});
|
|
266
|
+
}
|
|
267
|
+
function getCustomDeckLayers(deckGlProps) {
|
|
268
|
+
var bottomDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.layers() : [];
|
|
269
|
+
var topDeckLayers = Array.isArray(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers : (0, _utils.isFunction)(deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers) ? deckGlProps === null || deckGlProps === void 0 ? void 0 : deckGlProps.topLayers() : [];
|
|
270
|
+
return [bottomDeckLayers, topDeckLayers];
|
|
271
|
+
}
|
|
272
|
+
function bindLayerCallbacks() {
|
|
273
|
+
var layerCallbacks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
274
|
+
var idx = arguments.length > 1 ? arguments[1] : undefined;
|
|
275
|
+
return Object.keys(layerCallbacks).reduce(function (accu, key) {
|
|
276
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, function (val) {
|
|
277
|
+
return layerCallbacks[key](idx, val);
|
|
278
|
+
}));
|
|
279
|
+
}, {});
|
|
280
|
+
}
|
|
281
|
+
function computeDeckLayersFromLayerOrder(layerOrder, layers, layerData, currentLayersForDeck, renderProps, layerCallbacks) {
|
|
282
|
+
var datasets = renderProps.datasets,
|
|
283
|
+
hoverInfo = renderProps.hoverInfo,
|
|
284
|
+
clicked = renderProps.clicked,
|
|
285
|
+
mapState = renderProps.mapState,
|
|
286
|
+
interactionConfig = renderProps.interactionConfig,
|
|
287
|
+
animationConfig = renderProps.animationConfig,
|
|
288
|
+
mapLayers = renderProps.mapLayers,
|
|
289
|
+
hasShadowEffect = renderProps.hasShadowEffect;
|
|
290
|
+
return layerOrder.slice().reverse().reduce(function (overlays, element) {
|
|
291
|
+
if ((0, _utils.isPlainObject)(element)) {
|
|
292
|
+
var layerGroup = element;
|
|
293
|
+
if (!layerGroup.isVisible) {
|
|
294
|
+
return overlays;
|
|
295
|
+
}
|
|
296
|
+
return overlays.concat(computeDeckLayersFromLayerOrder(layerGroup.layerOrder, layers, layerData, currentLayersForDeck, renderProps, layerCallbacks));
|
|
297
|
+
}
|
|
298
|
+
var layerId = element;
|
|
299
|
+
if (!currentLayersForDeck[layerId]) {
|
|
300
|
+
return overlays;
|
|
301
|
+
}
|
|
302
|
+
var layerIndex = layers.findIndex(function (_ref3) {
|
|
303
|
+
var id = _ref3.id;
|
|
304
|
+
return id === layerId;
|
|
305
|
+
});
|
|
306
|
+
if (layerIndex === -1) {
|
|
307
|
+
return overlays;
|
|
308
|
+
}
|
|
309
|
+
var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
|
|
310
|
+
var layer = layers[layerIndex];
|
|
311
|
+
var data = layerData[layerIndex];
|
|
312
|
+
var layerOverlay = renderDeckGlLayer({
|
|
313
|
+
datasets: datasets,
|
|
314
|
+
layer: layer,
|
|
315
|
+
layerIndex: layerIndex,
|
|
316
|
+
data: data,
|
|
317
|
+
hoverInfo: hoverInfo,
|
|
318
|
+
clicked: clicked,
|
|
319
|
+
mapState: mapState,
|
|
320
|
+
interactionConfig: interactionConfig,
|
|
321
|
+
animationConfig: animationConfig,
|
|
322
|
+
mapLayers: mapLayers,
|
|
323
|
+
experimentalContext: {
|
|
324
|
+
hasShadowEffect: hasShadowEffect
|
|
325
|
+
}
|
|
326
|
+
}, bindedLayerCallbacks);
|
|
327
|
+
return overlays.concat(layerOverlay || []);
|
|
328
|
+
}, []);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// eslint-disable-next-line complexity
|
|
332
|
+
function computeDeckLayers(_ref4, options, layerCallbacks, deckGlProps) {
|
|
333
|
+
var visState = _ref4.visState,
|
|
334
|
+
mapState = _ref4.mapState,
|
|
335
|
+
mapStyle = _ref4.mapStyle;
|
|
336
|
+
var datasets = visState.datasets,
|
|
337
|
+
effects = visState.effects,
|
|
338
|
+
layers = visState.layers,
|
|
339
|
+
layerOrder = visState.layerOrder,
|
|
340
|
+
layerData = visState.layerData,
|
|
341
|
+
hoverInfo = visState.hoverInfo,
|
|
342
|
+
clicked = visState.clicked,
|
|
343
|
+
interactionConfig = visState.interactionConfig,
|
|
344
|
+
animationConfig = visState.animationConfig,
|
|
345
|
+
splitMaps = visState.splitMaps;
|
|
346
|
+
var _ref5 = options || {},
|
|
347
|
+
mapIndex = _ref5.mapIndex,
|
|
348
|
+
mapboxApiAccessToken = _ref5.mapboxApiAccessToken,
|
|
349
|
+
mapboxApiUrl = _ref5.mapboxApiUrl,
|
|
350
|
+
primaryMap = _ref5.primaryMap,
|
|
351
|
+
layersForDeck = _ref5.layersForDeck,
|
|
352
|
+
editorInfo = _ref5.editorInfo;
|
|
353
|
+
var dataLayers = [];
|
|
354
|
+
var hasShadowEffect = effects.some(function (effect) {
|
|
355
|
+
return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type;
|
|
356
|
+
});
|
|
357
|
+
if (layerData && layerData.length) {
|
|
358
|
+
var mapLayers = (0, _utils.getMapLayersFromSplitMaps)(splitMaps, mapIndex || 0);
|
|
359
|
+
var currentLayersForDeck = layersForDeck || prepareLayersForDeck(layers, layerData);
|
|
360
|
+
dataLayers = layerOrder.slice().reverse().reduce(function (overlays, element) {
|
|
361
|
+
if ((0, _utils.isPlainObject)(element)) {
|
|
362
|
+
var layerGroup = element;
|
|
363
|
+
if (!layerGroup.isVisible) {
|
|
364
|
+
return overlays;
|
|
365
|
+
}
|
|
366
|
+
return overlays.concat(computeDeckLayersFromLayerOrder(layerGroup.layerOrder, layers, layerData, currentLayersForDeck, {
|
|
367
|
+
datasets: datasets,
|
|
368
|
+
hoverInfo: hoverInfo,
|
|
369
|
+
clicked: clicked,
|
|
370
|
+
mapState: mapState,
|
|
371
|
+
interactionConfig: interactionConfig,
|
|
372
|
+
animationConfig: animationConfig,
|
|
373
|
+
mapLayers: mapLayers,
|
|
374
|
+
hasShadowEffect: hasShadowEffect
|
|
375
|
+
}, layerCallbacks));
|
|
376
|
+
}
|
|
377
|
+
var layerId = element;
|
|
378
|
+
if (!currentLayersForDeck[layerId]) {
|
|
379
|
+
return overlays;
|
|
380
|
+
}
|
|
381
|
+
var layerIndex = layers.findIndex(function (_ref6) {
|
|
382
|
+
var id = _ref6.id;
|
|
383
|
+
return id === layerId;
|
|
384
|
+
});
|
|
385
|
+
if (layerIndex === -1) {
|
|
386
|
+
return overlays;
|
|
387
|
+
}
|
|
388
|
+
var bindedLayerCallbacks = layerCallbacks ? bindLayerCallbacks(layerCallbacks, layerIndex) : {};
|
|
389
|
+
var layer = layers[layerIndex];
|
|
390
|
+
var data = layerData[layerIndex];
|
|
391
|
+
var layerOverlay = renderDeckGlLayer({
|
|
392
|
+
datasets: datasets,
|
|
393
|
+
layer: layer,
|
|
394
|
+
layerIndex: layerIndex,
|
|
395
|
+
data: data,
|
|
396
|
+
hoverInfo: hoverInfo,
|
|
397
|
+
clicked: clicked,
|
|
398
|
+
mapState: mapState,
|
|
399
|
+
interactionConfig: interactionConfig,
|
|
400
|
+
animationConfig: animationConfig,
|
|
401
|
+
mapLayers: mapLayers,
|
|
402
|
+
experimentalContext: {
|
|
403
|
+
hasShadowEffect: hasShadowEffect
|
|
404
|
+
}
|
|
405
|
+
}, bindedLayerCallbacks);
|
|
406
|
+
return overlays.concat(layerOverlay || []);
|
|
407
|
+
}, []);
|
|
408
|
+
}
|
|
409
|
+
if (!primaryMap) {
|
|
410
|
+
return dataLayers;
|
|
411
|
+
}
|
|
412
|
+
if (mapStyle !== null && mapStyle !== void 0 && mapStyle.visibleLayerGroups['3d building'] && primaryMap && mapboxApiAccessToken && mapboxApiUrl) {
|
|
413
|
+
dataLayers.push(new _deckglLayers.ThreeDBuildingLayer({
|
|
414
|
+
id: '_keplergl_3d-building',
|
|
415
|
+
mapboxApiAccessToken: mapboxApiAccessToken,
|
|
416
|
+
mapboxApiUrl: mapboxApiUrl,
|
|
417
|
+
threeDBuildingColor: mapStyle.threeDBuildingColor,
|
|
418
|
+
updateTriggers: {
|
|
419
|
+
getFillColor: mapStyle.threeDBuildingColor
|
|
420
|
+
}
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
var _getCustomDeckLayers = getCustomDeckLayers(deckGlProps),
|
|
424
|
+
_getCustomDeckLayers2 = (0, _slicedToArray2["default"])(_getCustomDeckLayers, 2),
|
|
425
|
+
customBottomDeckLayers = _getCustomDeckLayers2[0],
|
|
426
|
+
customTopDeckLayers = _getCustomDeckLayers2[1];
|
|
427
|
+
var editorLayer = [];
|
|
428
|
+
if (editorInfo) {
|
|
429
|
+
editorLayer.push((0, _layers.getEditorLayer)(_objectSpread(_objectSpread({}, editorInfo), {}, {
|
|
430
|
+
mapState: mapState
|
|
431
|
+
})));
|
|
432
|
+
}
|
|
433
|
+
return [].concat((0, _toConsumableArray2["default"])(customBottomDeckLayers), (0, _toConsumableArray2["default"])(dataLayers), (0, _toConsumableArray2["default"])(customTopDeckLayers), editorLayer);
|
|
434
|
+
}
|
|
435
|
+
function getLayerOrderFromLayers(layers) {
|
|
436
|
+
return layers.map(function (_ref7) {
|
|
437
|
+
var id = _ref7.id;
|
|
438
|
+
return id;
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// --- Layer Group Utilities ---
|
|
443
|
+
|
|
444
|
+
function getNewLayerGroup(props) {
|
|
445
|
+
var _props$id, _props$label, _props$isVisible, _props$layerOrder, _props$isIncludedInLe;
|
|
446
|
+
return {
|
|
447
|
+
id: (_props$id = props === null || props === void 0 ? void 0 : props.id) !== null && _props$id !== void 0 ? _props$id : (0, _commonUtils.generateHashId)(6),
|
|
448
|
+
label: (_props$label = props === null || props === void 0 ? void 0 : props.label) !== null && _props$label !== void 0 ? _props$label : 'New group',
|
|
449
|
+
isVisible: (_props$isVisible = props === null || props === void 0 ? void 0 : props.isVisible) !== null && _props$isVisible !== void 0 ? _props$isVisible : true,
|
|
450
|
+
layerOrder: (_props$layerOrder = props === null || props === void 0 ? void 0 : props.layerOrder) !== null && _props$layerOrder !== void 0 ? _props$layerOrder : [],
|
|
451
|
+
isIncludedInLegend: (_props$isIncludedInLe = props === null || props === void 0 ? void 0 : props.isIncludedInLegend) !== null && _props$isIncludedInLe !== void 0 ? _props$isIncludedInLe : true
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
function addLayerOrGroupToLayerOrder(layerOrder, element, atIndex) {
|
|
455
|
+
var idx = atIndex !== null && atIndex !== void 0 ? atIndex : 0;
|
|
456
|
+
var result = (0, _toConsumableArray2["default"])(layerOrder);
|
|
457
|
+
result.splice(idx, 0, element);
|
|
458
|
+
return result;
|
|
459
|
+
}
|
|
460
|
+
function removeElementFromLayerOrder(layerOrder, element) {
|
|
461
|
+
if (!layerOrder) return [];
|
|
462
|
+
var elementId = typeof element === 'string' ? element : element.id;
|
|
463
|
+
var newLayerOrder = layerOrder.filter(function (entry) {
|
|
464
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
465
|
+
return entry.id !== elementId;
|
|
466
|
+
}
|
|
467
|
+
return entry !== elementId;
|
|
468
|
+
});
|
|
469
|
+
newLayerOrder = newLayerOrder.map(function (entry) {
|
|
470
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
471
|
+
var group = entry;
|
|
472
|
+
return _objectSpread(_objectSpread({}, group), {}, {
|
|
473
|
+
layerOrder: removeElementFromLayerOrder(group.layerOrder, elementId)
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
return entry;
|
|
477
|
+
});
|
|
478
|
+
return newLayerOrder;
|
|
479
|
+
}
|
|
480
|
+
function getLayerGroupFromLayerOrder(layerOrder, layerGroupId) {
|
|
481
|
+
var group;
|
|
482
|
+
for (var i = 0; i < layerOrder.length && !group; i++) {
|
|
483
|
+
var entry = layerOrder[i];
|
|
484
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
485
|
+
var grp = entry;
|
|
486
|
+
group = grp.id === layerGroupId ? grp : getLayerGroupFromLayerOrder(grp.layerOrder, layerGroupId);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return group;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Find the parent group that contains a given layer ID.
|
|
494
|
+
* Returns undefined if the layer is at the root level.
|
|
495
|
+
*/
|
|
496
|
+
function findParentGroupForLayer(layerOrder, layerId) {
|
|
497
|
+
var _iterator = _createForOfIteratorHelper(layerOrder),
|
|
498
|
+
_step;
|
|
499
|
+
try {
|
|
500
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
501
|
+
var entry = _step.value;
|
|
502
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
503
|
+
var group = entry;
|
|
504
|
+
if (group.layerOrder.some(function (e) {
|
|
505
|
+
return typeof e === 'string' && e === layerId;
|
|
506
|
+
})) {
|
|
507
|
+
return group;
|
|
508
|
+
}
|
|
509
|
+
var nested = findParentGroupForLayer(group.layerOrder, layerId);
|
|
510
|
+
if (nested) return nested;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
} catch (err) {
|
|
514
|
+
_iterator.e(err);
|
|
515
|
+
} finally {
|
|
516
|
+
_iterator.f();
|
|
517
|
+
}
|
|
518
|
+
return undefined;
|
|
519
|
+
}
|
|
520
|
+
function getIndexFromLayerEntryId(layerOrder, layerEntryId) {
|
|
521
|
+
return layerOrder.findIndex(function (entry) {
|
|
522
|
+
return (0, _utils.isPlainObject)(entry) ? entry.id === layerEntryId : entry === layerEntryId;
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
function isLayerPresentInLayerOrder(layerOrder, layerId) {
|
|
526
|
+
var found = false;
|
|
527
|
+
for (var i = 0; i < layerOrder.length && !found; i++) {
|
|
528
|
+
var entry = layerOrder[i];
|
|
529
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
530
|
+
found = isLayerPresentInLayerOrder(entry.layerOrder, layerId);
|
|
531
|
+
} else {
|
|
532
|
+
found = layerId === entry;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return found;
|
|
536
|
+
}
|
|
537
|
+
function replaceLayerEntryInLayerOrder(layerOrder, oldEntry, newEntry) {
|
|
538
|
+
var oldEntryId = typeof oldEntry === 'string' ? oldEntry : oldEntry.id;
|
|
539
|
+
return layerOrder.map(function (entry) {
|
|
540
|
+
if (typeof entry === 'string') {
|
|
541
|
+
return entry === oldEntryId ? newEntry : entry;
|
|
542
|
+
} else if ((0, _utils.isPlainObject)(entry)) {
|
|
543
|
+
var grp = entry;
|
|
544
|
+
if (grp.id === oldEntryId) {
|
|
545
|
+
return newEntry;
|
|
546
|
+
}
|
|
547
|
+
return _objectSpread(_objectSpread({}, grp), {}, {
|
|
548
|
+
layerOrder: replaceLayerEntryInLayerOrder(grp.layerOrder, oldEntry, newEntry)
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
return entry;
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
function updateLayerGroupInLayerOrder(layerOrder, newLayerGroup) {
|
|
555
|
+
return layerOrder.map(function (entry) {
|
|
556
|
+
if ((0, _utils.isPlainObject)(entry)) {
|
|
557
|
+
var grp = entry;
|
|
558
|
+
if (grp.id === newLayerGroup.id) {
|
|
559
|
+
return newLayerGroup;
|
|
560
|
+
}
|
|
561
|
+
return _objectSpread(_objectSpread({}, grp), {}, {
|
|
562
|
+
layerOrder: updateLayerGroupInLayerOrder(grp.layerOrder, newLayerGroup)
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
return entry;
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
function getFlatLayerOrder(layerOrder) {
|
|
569
|
+
return layerOrder.reduce(function (acc, orderEntry) {
|
|
570
|
+
if ((0, _utils.isPlainObject)(orderEntry)) {
|
|
571
|
+
return [].concat((0, _toConsumableArray2["default"])(acc), (0, _toConsumableArray2["default"])(getFlatLayerOrder(orderEntry.layerOrder)));
|
|
572
|
+
}
|
|
573
|
+
return [].concat((0, _toConsumableArray2["default"])(acc), [orderEntry]);
|
|
574
|
+
}, []);
|
|
575
|
+
}
|
|
576
|
+
function buildLayerOrderHierarchy(layerOrder, layers) {
|
|
577
|
+
var validLayers = layers === null || layers === void 0 ? void 0 : layers.filter(Boolean);
|
|
578
|
+
return layerOrder.reduce(function (acc, element) {
|
|
579
|
+
if ((0, _utils.isPlainObject)(element)) {
|
|
580
|
+
return [].concat((0, _toConsumableArray2["default"])(acc), [['layerGroup', element]]);
|
|
581
|
+
}
|
|
582
|
+
var layer = validLayers === null || validLayers === void 0 ? void 0 : validLayers.find(function (l) {
|
|
583
|
+
return l.id === element;
|
|
584
|
+
});
|
|
585
|
+
if (!layer || layer.config.hidden) {
|
|
586
|
+
return acc;
|
|
587
|
+
}
|
|
588
|
+
return [].concat((0, _toConsumableArray2["default"])(acc), [['layer', layer]]);
|
|
589
|
+
}, []);
|
|
590
|
+
}
|
|
591
|
+
function removeGhostLayerFromLayerOrder(layerOrder, layers) {
|
|
592
|
+
return layerOrder.reduce(function (acc, entry) {
|
|
593
|
+
if (typeof entry === 'string') {
|
|
594
|
+
if (layers.find(function (l) {
|
|
595
|
+
return l.id === entry;
|
|
596
|
+
})) {
|
|
597
|
+
acc.push(entry);
|
|
598
|
+
}
|
|
599
|
+
} else {
|
|
600
|
+
var grp = entry;
|
|
601
|
+
if (grp.layerOrder) {
|
|
602
|
+
acc.push(_objectSpread(_objectSpread({}, grp), {}, {
|
|
603
|
+
layerOrder: removeGhostLayerFromLayerOrder(grp.layerOrder, layers)
|
|
604
|
+
}));
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return acc;
|
|
608
|
+
}, []);
|
|
609
|
+
}
|
|
610
|
+
function reorderLayerOrder(layerOrder, originLayerId, destinationLayerId) {
|
|
611
|
+
var activeIndex = getIndexFromLayerEntryId(layerOrder, originLayerId);
|
|
612
|
+
var overIndex = getIndexFromLayerEntryId(layerOrder, destinationLayerId);
|
|
613
|
+
if (activeIndex === -1 || overIndex === -1) {
|
|
614
|
+
return layerOrder;
|
|
615
|
+
}
|
|
616
|
+
return (0, _commonUtils.arrayMove)(layerOrder, activeIndex, overIndex);
|
|
617
|
+
}
|
|
618
|
+
function addLayerToLayerOrder(layerOrder, layerId) {
|
|
619
|
+
return [layerId].concat((0, _toConsumableArray2["default"])(layerOrder));
|
|
620
|
+
}
|
|
621
|
+
function getLayerHoverPropValue(data, fieldIndex) {
|
|
622
|
+
if (!data) return undefined;
|
|
623
|
+
if (data instanceof _utils.DataRow) return data.valueAt(fieldIndex);
|
|
624
|
+
return data[fieldIndex];
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
/** Checks if any Deck layers are in the process of loading. */
|
|
628
|
+
function areAnyDeckLayersLoading(layers) {
|
|
629
|
+
return layers.some(
|
|
630
|
+
// layer.isLoaded changes frequently in Deck (even on hover) so we check additional properties
|
|
631
|
+
function (layer) {
|
|
632
|
+
return layer.internalState && !layer.isLoaded;
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc29sZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvbnN0YW50cyIsIl9sYXllcnMiLCJfdXRpbHMiLCJfY29tbW9uVXRpbHMiLCJfZGVja2dsTGF5ZXJzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZmluZERlZmF1bHRMYXllciIsImRhdGFzZXQiLCJsYXllckNsYXNzZXMiLCJsYXllclByb3BzIiwicmVkdWNlIiwicHJldmlvdXMiLCJsYyIsInJlc3VsdCIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsInByb3BzIiwiZm91bmRMYXllcnMiLCJjb25jYXQiLCJtYXAiLCJwIiwidHlwZSIsImRhdGFJZCIsImlkIiwiaXNWaXNpYmxlIiwibGF5ZXIiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJkYXRhQ29udGFpbmVyIiwibWVyZ2VMYXllclZpc0NvbmZpZ0Zvck5ld0RhdGFzZXRzIiwic3RhdGUiLCJwYXRjaCIsImRhdGFzZXRJZHNUb1BhdGNoIiwiaGFzRGVmaW5lZFBhdGNoVmFsdWUiLCJzb21lIiwia2V5IiwidW5kZWZpbmVkIiwiZGF0YXNldElkU2V0IiwiU2V0IiwibGF5ZXJzIiwiY29uZmlnIiwiaGFzIiwic2V0dGluZ3MiLCJ2aXNDb25maWdTZXR0aW5ncyIsImFsbG93ZWRLZXlzIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwYXJ0aWFsIiwiYWNjIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJjYWxjdWxhdGVMYXllckRhdGEiLCJvbGRMYXllckRhdGEiLCJsYXllckRhdGEiLCJpc1ZhbGlkIiwiX29sZERhdGFVcGRhdGVUcmlnZ2VycyIsImhhc0FsbENvbHVtbnMiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsInVwZGF0ZUxheWVyQ29uZmlnIiwiZXJyb3JNZXNzYWdlIiwiZXJyIiwiQ29uc29sZSIsImVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwic3Vic3RyaW5nIiwiZ2V0TGF5ZXJIb3ZlclByb3AiLCJfcmVmIiwiYW5pbWF0aW9uQ29uZmlnIiwiaW50ZXJhY3Rpb25Db25maWciLCJob3ZlckluZm8iLCJsYXllcnNUb1JlbmRlciIsInRvb2x0aXAiLCJlbmFibGVkIiwicGlja2VkIiwib2JqZWN0Iiwib3ZlcmxheSIsImlkeCIsImluZGV4IiwiZ2V0SG92ZXJEYXRhIiwiX2RhdGFzZXRzJGRhdGFJZCIsImZpZWxkcyIsImRhdGEiLCJmaWVsZHNUb1Nob3ciLCJjdXJyZW50VGltZSIsInJlbmRlckRlY2tHbExheWVyIiwibGF5ZXJDYWxsYmFja3MiLCJsYXllckluZGV4IiwiY2xpY2tlZCIsIm1hcFN0YXRlIiwibWFwTGF5ZXJzIiwiZXhwZXJpbWVudGFsQ29udGV4dCIsIl9yZWYyIiwiZ3B1RmlsdGVyIiwib2JqZWN0SG92ZXJlZCIsInZpc2libGUiLCJyZW5kZXJMYXllciIsImlzTGF5ZXJSZW5kZXJhYmxlIiwiR0VPQ09ERVJfTEFZRVJfSUQiLCJzaG91bGRSZW5kZXJMYXllciIsImlzTGF5ZXJWaXNpYmxlIiwicHJlcGFyZUxheWVyc0ZvckRlY2siLCJhY2N1Iiwib3ZlcmxheVR5cGUiLCJPVkVSTEFZX1RZUEVfQ09OU1QiLCJkZWNrZ2wiLCJwcmVwYXJlTGF5ZXJzVG9SZW5kZXIiLCJnZXRDdXN0b21EZWNrTGF5ZXJzIiwiZGVja0dsUHJvcHMiLCJib3R0b21EZWNrTGF5ZXJzIiwiaXNGdW5jdGlvbiIsInRvcERlY2tMYXllcnMiLCJ0b3BMYXllcnMiLCJiaW5kTGF5ZXJDYWxsYmFja3MiLCJ2YWwiLCJjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyIiwibGF5ZXJPcmRlciIsImN1cnJlbnRMYXllcnNGb3JEZWNrIiwicmVuZGVyUHJvcHMiLCJoYXNTaGFkb3dFZmZlY3QiLCJyZXZlcnNlIiwib3ZlcmxheXMiLCJlbGVtZW50IiwiaXNQbGFpbk9iamVjdCIsImxheWVyR3JvdXAiLCJsYXllcklkIiwiZmluZEluZGV4IiwiX3JlZjMiLCJiaW5kZWRMYXllckNhbGxiYWNrcyIsImxheWVyT3ZlcmxheSIsImNvbXB1dGVEZWNrTGF5ZXJzIiwiX3JlZjQiLCJvcHRpb25zIiwidmlzU3RhdGUiLCJtYXBTdHlsZSIsImVmZmVjdHMiLCJzcGxpdE1hcHMiLCJfcmVmNSIsIm1hcEluZGV4IiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJwcmltYXJ5TWFwIiwibGF5ZXJzRm9yRGVjayIsImVkaXRvckluZm8iLCJkYXRhTGF5ZXJzIiwiZWZmZWN0IiwiTElHSFRfQU5EX1NIQURPV19FRkZFQ1QiLCJnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzIiwiX3JlZjYiLCJ2aXNpYmxlTGF5ZXJHcm91cHMiLCJUaHJlZURCdWlsZGluZ0xheWVyIiwidGhyZWVEQnVpbGRpbmdDb2xvciIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0RmlsbENvbG9yIiwiX2dldEN1c3RvbURlY2tMYXllcnMiLCJfZ2V0Q3VzdG9tRGVja0xheWVyczIiLCJfc2xpY2VkVG9BcnJheTIiLCJjdXN0b21Cb3R0b21EZWNrTGF5ZXJzIiwiY3VzdG9tVG9wRGVja0xheWVycyIsImVkaXRvckxheWVyIiwiZ2V0RWRpdG9yTGF5ZXIiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMiLCJfcmVmNyIsImdldE5ld0xheWVyR3JvdXAiLCJfcHJvcHMkaWQiLCJfcHJvcHMkbGFiZWwiLCJfcHJvcHMkaXNWaXNpYmxlIiwiX3Byb3BzJGxheWVyT3JkZXIiLCJfcHJvcHMkaXNJbmNsdWRlZEluTGUiLCJnZW5lcmF0ZUhhc2hJZCIsImxhYmVsIiwiaXNJbmNsdWRlZEluTGVnZW5kIiwiYWRkTGF5ZXJPckdyb3VwVG9MYXllck9yZGVyIiwiYXRJbmRleCIsInNwbGljZSIsInJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlciIsImVsZW1lbnRJZCIsIm5ld0xheWVyT3JkZXIiLCJlbnRyeSIsImdyb3VwIiwiZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyIiwibGF5ZXJHcm91cElkIiwiaSIsImdycCIsImZpbmRQYXJlbnRHcm91cEZvckxheWVyIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJuZXN0ZWQiLCJnZXRJbmRleEZyb21MYXllckVudHJ5SWQiLCJsYXllckVudHJ5SWQiLCJpc0xheWVyUHJlc2VudEluTGF5ZXJPcmRlciIsImZvdW5kIiwicmVwbGFjZUxheWVyRW50cnlJbkxheWVyT3JkZXIiLCJvbGRFbnRyeSIsIm5ld0VudHJ5Iiwib2xkRW50cnlJZCIsInVwZGF0ZUxheWVyR3JvdXBJbkxheWVyT3JkZXIiLCJuZXdMYXllckdyb3VwIiwiZ2V0RmxhdExheWVyT3JkZXIiLCJvcmRlckVudHJ5IiwiYnVpbGRMYXllck9yZGVySGllcmFyY2h5IiwidmFsaWRMYXllcnMiLCJCb29sZWFuIiwiZmluZCIsImwiLCJoaWRkZW4iLCJyZW1vdmVHaG9zdExheWVyRnJvbUxheWVyT3JkZXIiLCJyZW9yZGVyTGF5ZXJPcmRlciIsIm9yaWdpbkxheWVySWQiLCJkZXN0aW5hdGlvbkxheWVySWQiLCJhY3RpdmVJbmRleCIsIm92ZXJJbmRleCIsImFycmF5TW92ZSIsImFkZExheWVyVG9MYXllck9yZGVyIiwiZ2V0TGF5ZXJIb3ZlclByb3BWYWx1ZSIsImZpZWxkSW5kZXgiLCJEYXRhUm93IiwidmFsdWVBdCIsImFyZUFueURlY2tMYXllcnNMb2FkaW5nIiwiaW50ZXJuYWxTdGF0ZSIsImlzTG9hZGVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVyLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBDb25zb2xlIGZyb20gJ2dsb2JhbC9jb25zb2xlJztcblxuaW1wb3J0IHtHRU9DT0RFUl9MQVlFUl9JRCwgTElHSFRfQU5EX1NIQURPV19FRkZFQ1R9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TGF5ZXIgYXMgRGVja0xheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbnR5cGUgRGVja0xheWVyUHJvcHMgPSBhbnk7XG5pbXBvcnQge1xuICBGaWVsZCxcbiAgTGF5ZXJWaXNDb25maWcsXG4gIFRvb2x0aXBGaWVsZCxcbiAgQ29tcGFyZVR5cGUsXG4gIFNwbGl0TWFwTGF5ZXJzLFxuICBFZGl0b3IsXG4gIEZlYXR1cmUsXG4gIEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0LFxuICBCaW5kZWRMYXllckNhbGxiYWNrcyxcbiAgTGF5ZXJDYWxsYmFja3MsXG4gIFZpZXdwb3J0LFxuICBMYXllck9yZGVyR3JvdXAsXG4gIExheWVyT3JkZXIsXG4gIExheWVyT3JkZXJFbnRyeSxcbiAgRmxhdExheWVyT3JkZXIsXG4gIExheWVyT3JkZXJIaWVyYXJjaHlcbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge1xuICBGaW5kRGVmYXVsdExheWVyUHJvcHNSZXR1cm5WYWx1ZSxcbiAgRmluZERlZmF1bHRMYXllclByb3BzLFxuICBMYXllcixcbiAgTGF5ZXJDbGFzc2VzVHlwZSxcbiAgT1ZFUkxBWV9UWVBFX0NPTlNULFxuICBnZXRFZGl0b3JMYXllclxufSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5cbmltcG9ydCBLZXBsZXJUYWJsZSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2lzRnVuY3Rpb24sIGdldE1hcExheWVyc0Zyb21TcGxpdE1hcHMsIERhdGFSb3csIGlzUGxhaW5PYmplY3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHthcnJheU1vdmUsIGdlbmVyYXRlSGFzaElkfSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG5cbmltcG9ydCB7VGhyZWVEQnVpbGRpbmdMYXllcn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgTGF5ZXJzVG9SZW5kZXIgPSB7XG4gIFtsYXllcklkOiBzdHJpbmddOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSA9IHtcbiAgcG9pbnRzOiBhbnlbXTtcbiAgY29sb3JWYWx1ZT86IGFueTtcbiAgZWxldmF0aW9uVmFsdWU/OiBhbnk7XG4gIGFnZ3JlZ2F0ZWREYXRhPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICBtZWFzdXJlOiBzdHJpbmc7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICB9XG4gID47XG59O1xuXG5leHBvcnQgdHlwZSBMYXllckhvdmVyUHJvcCA9IHtcbiAgZGF0YTogRGF0YVJvdyB8IEFnZ3JlZ2F0aW9uTGF5ZXJIb3ZlckRhdGEgfCBhbnlbXSB8IG51bGw7XG4gIGZpZWxkczogRmllbGRbXTtcbiAgZmllbGRzVG9TaG93OiBUb29sdGlwRmllbGRbXTtcbiAgbGF5ZXI6IExheWVyO1xuICBwcmltYXJ5RGF0YT86IERhdGFSb3cgfCBBZ2dyZWdhdGlvbkxheWVySG92ZXJEYXRhIHwgYW55W10gfCBudWxsO1xuICBjb21wYXJlVHlwZT86IENvbXBhcmVUeXBlO1xuICBjdXJyZW50VGltZT86IFZpc1N0YXRlWydhbmltYXRpb25Db25maWcnXVsnY3VycmVudFRpbWUnXTtcbn07XG5cbi8qKlxuICogRmluZCBkZWZhdWx0IGxheWVycyBmcm9tIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZERlZmF1bHRMYXllcihkYXRhc2V0OiBLZXBsZXJUYWJsZSwgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXNUeXBlKTogTGF5ZXJbXSB7XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxheWVyUHJvcHMgPSAoT2JqZWN0LmtleXMobGF5ZXJDbGFzc2VzKSBhcyBBcnJheTxrZXlvZiBMYXllckNsYXNzZXNUeXBlPikucmVkdWNlKFxuICAgIChwcmV2aW91cywgbGMpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogRmluZERlZmF1bHRMYXllclByb3BzUmV0dXJuVmFsdWUgPVxuICAgICAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW2xjXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGxheWVyQ2xhc3Nlc1tsY10uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIHByZXZpb3VzKVxuICAgICAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgICAgIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuICAgICAgY29uc3QgZm91bmRMYXllcnMgPSByZXN1bHQuZm91bmRMYXllcnMgfHwgcHJldmlvdXM7XG5cbiAgICAgIHJldHVybiBmb3VuZExheWVycy5jb25jYXQoXG4gICAgICAgIHByb3BzLm1hcChwID0+ICh7XG4gICAgICAgICAgLi4ucCxcbiAgICAgICAgICB0eXBlOiBsYyxcbiAgICAgICAgICBkYXRhSWQ6IGRhdGFzZXQuaWQsXG4gICAgICAgICAgLy8gc2V0IGFyYyBsYXllciBpbml0aWFsIHZpc2libGl0eSB0byBmYWxzZSwgYmVjYXVzZSBhcmNzIHRlbmQgdG8gYmUgdG9vIG11c3lcbiAgICAgICAgICAuLi4obGMgPT09ICdhcmMnIHx8IGxjID09PSAnbGluZScgPyB7aXNWaXNpYmxlOiBmYWxzZX0gOiB7fSlcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH0sXG4gICAgW10gYXMgKEZpbmREZWZhdWx0TGF5ZXJQcm9wcyAmIHt0eXBlOiBzdHJpbmd9KVtdXG4gICk7XG5cbiAgLy8gZ28gdGhyb3VnaCBhbGwgbGF5ZXJQcm9wcyB0byBjcmVhdGUgbGF5ZXJcbiAgcmV0dXJuIGxheWVyUHJvcHMubWFwKHByb3BzID0+IHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBsYXllckNsYXNzZXNbcHJvcHMudHlwZV0ocHJvcHMpO1xuICAgIHJldHVybiB0eXBlb2YgbGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nICYmIGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgICAgPyBsYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbGF5ZXI7XG4gIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYHBhdGNoYCB0byBgY29uZmlnLnZpc0NvbmZpZ2Agb25seSBmb3IgbGF5ZXJzIHdob3NlIGBkYXRhSWRgIGlzIGluIGBkYXRhc2V0SWRzVG9QYXRjaGAuXG4gKiBMYXllcnMgZm9yIGRhdGFzZXRzIHRoYXQgd2VyZSBhbHJlYWR5IG9uIHRoZSBtYXAgYXJlIGxlZnQgdW5jaGFuZ2VkIOKAlCBgYWRkRGF0YVRvTWFwYFxuICogS2V5cyB3aG9zZSBwYXRjaCB2YWx1ZSBpcyBgdW5kZWZpbmVkYCBhcmUgc2tpcHBlZCBzbyBleGlzdGluZyB2aXNDb25maWcgaXMgbm90IGNsZWFyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxheWVyVmlzQ29uZmlnRm9yTmV3RGF0YXNldHMoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF0Y2g6IFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+IHwgdW5kZWZpbmVkLFxuICBkYXRhc2V0SWRzVG9QYXRjaDogc3RyaW5nW11cbik6IFZpc1N0YXRlIHtcbiAgaWYgKCFwYXRjaCB8fCAhT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGhhc0RlZmluZWRQYXRjaFZhbHVlID0gKE9iamVjdC5rZXlzKHBhdGNoKSBhcyBBcnJheTxrZXlvZiBMYXllclZpc0NvbmZpZz4pLnNvbWUoXG4gICAga2V5ID0+IHBhdGNoW2tleV0gIT09IHVuZGVmaW5lZFxuICApO1xuICBpZiAoIWhhc0RlZmluZWRQYXRjaFZhbHVlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgZGF0YXNldElkU2V0ID0gbmV3IFNldChkYXRhc2V0SWRzVG9QYXRjaCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IHN0YXRlLmxheWVycy5tYXAobGF5ZXIgPT4ge1xuICAgICAgaWYgKCFsYXllci5jb25maWcuZGF0YUlkIHx8ICFkYXRhc2V0SWRTZXQuaGFzKGxheWVyLmNvbmZpZy5kYXRhSWQpKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gbGF5ZXIudmlzQ29uZmlnU2V0dGluZ3M7XG4gICAgICBpZiAoIXNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbG93ZWRLZXlzID0gKE9iamVjdC5rZXlzKHBhdGNoKSBhcyBBcnJheTxrZXlvZiBMYXllclZpc0NvbmZpZz4pLmZpbHRlcihcbiAgICAgICAga2V5ID0+IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywga2V5KSAmJiBwYXRjaFtrZXldICE9PSB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBpZiAoIWFsbG93ZWRLZXlzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGF5ZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJ0aWFsID0gYWxsb3dlZEtleXMucmVkdWNlPFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+PigoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBwYXRjaFtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pO1xuICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyVmlzQ29uZmlnKHBhcnRpYWwpO1xuICAgIH0pXG4gIH07XG59XG5cbnR5cGUgTWluVmlzU3RhdGVGb3JMYXllckRhdGEgPSB7XG4gIGRhdGFzZXRzOiBWaXNTdGF0ZVsnZGF0YXNldHMnXTtcbiAgYW5pbWF0aW9uQ29uZmlnOiBWaXNTdGF0ZVsnYW5pbWF0aW9uQ29uZmlnJ107XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBsYXllciBkYXRhIGJhc2VkIG9uIGxheWVyIHR5cGUsIGNvbCBDb25maWcsXG4gKiByZXR1cm4gdXBkYXRlZCBsYXllciBpZiBjb2xvckRvbWFpbiwgZGF0YU1hcCBoYXMgY2hhbmdlZC5cbiAqIEFsc28sIHJldHVybnMgdXBkYXRlZCBsYXllciBpbiBjYXNlIHRoZSBpbnB1dCBsYXllciB3YXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAqIEFkZHMgYW4gZXJyb3IgbWVzc2FnZSB0byB0aGUgbGF5ZXIgaW4gY2FzZSBvZiBhbiBleGNlcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVMYXllckRhdGE8UyBleHRlbmRzIE1pblZpc1N0YXRlRm9yTGF5ZXJEYXRhPihcbiAgbGF5ZXI6IExheWVyLFxuICBzdGF0ZTogUyxcbiAgb2xkTGF5ZXJEYXRhPzogYW55XG4pOiB7XG4gIGxheWVyRGF0YTogYW55O1xuICBsYXllcjogTGF5ZXI7XG59IHtcbiAgbGV0IGxheWVyRGF0YTtcbiAgdHJ5IHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIHVwZGF0ZXMgZGF0YSBhZnRlciBhbiBlcnJvclxuICAgIGlmICghbGF5ZXIuaXNWYWxpZCkge1xuICAgICAgbGF5ZXIuX29sZERhdGFVcGRhdGVUcmlnZ2VycyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIWxheWVyLnR5cGUgfHwgIWxheWVyLmhhc0FsbENvbHVtbnMoKSB8fCAhbGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgICAgcmV0dXJuIHtsYXllciwgbGF5ZXJEYXRhOiB7fX07XG4gICAgfVxuXG4gICAgbGF5ZXJEYXRhID0gbGF5ZXIuZm9ybWF0TGF5ZXJEYXRhKHN0YXRlLmRhdGFzZXRzLCBvbGRMYXllckRhdGEpO1xuXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgZGF0YSBmb3IgdGhlIGxheWVyIGlzIHVwZGF0ZWQgd2l0aG91dCBlcnJvcnNcbiAgICBpZiAoIWxheWVyLmlzVmFsaWQpIHtcbiAgICAgIC8vIFN3aXRjaCB0byB2aXNpYmxlIGFmdGVyIGFuIGVycm9yXG4gICAgICBsYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gICAgbGF5ZXIuaXNWYWxpZCA9IHRydWU7XG4gICAgbGF5ZXIuZXJyb3JNZXNzYWdlID0gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgQ29uc29sZS5lcnJvcihlcnIpO1xuICAgIGxheWVyID0gbGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe1xuICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgIH0pO1xuICAgIGxheWVyLmlzVmFsaWQgPSBmYWxzZTtcblxuICAgIGxheWVyLmVycm9yTWVzc2FnZSA9XG4gICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnIubWVzc2FnZSA/IGVyci5tZXNzYWdlLnN1YnN0cmluZygwLCAxMDApIDogJ1Vua25vd24gZXJyb3InO1xuXG4gICAgbGF5ZXJEYXRhID0ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGxheWVyLFxuICAgIGxheWVyRGF0YVxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBwcm9wcyBwYXNzZWQgdG8gTGF5ZXJIb3ZlckluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExheWVySG92ZXJQcm9wKHtcbiAgYW5pbWF0aW9uQ29uZmlnLFxuICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgaG92ZXJJbmZvLFxuICBsYXllcnMsXG4gIGxheWVyc1RvUmVuZGVyLFxuICBkYXRhc2V0c1xufToge1xuICBpbnRlcmFjdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2ludGVyYWN0aW9uQ29uZmlnJ107XG4gIGFuaW1hdGlvbkNvbmZpZzogVmlzU3RhdGVbJ2FuaW1hdGlvbkNvbmZpZyddO1xuICBob3ZlckluZm86IFZpc1N0YXRlWydob3ZlckluZm8nXTtcbiAgbGF5ZXJzOiBWaXNTdGF0ZVsnbGF5ZXJzJ107XG4gIGxheWVyc1RvUmVuZGVyOiBMYXllcnNUb1JlbmRlcjtcbiAgZGF0YXNldHM6IFZpc1N0YXRlWydkYXRhc2V0cyddO1xufSk6IExheWVySG92ZXJQcm9wIHwgbnVsbCB7XG4gIGlmIChpbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmVuYWJsZWQgJiYgaG92ZXJJbmZvICYmIGhvdmVySW5mby5waWNrZWQpIHtcbiAgICAvLyBpZiBhbnl0aGluZyBob3ZlcmVkXG4gICAgY29uc3Qge29iamVjdCwgbGF5ZXI6IG92ZXJsYXl9ID0gaG92ZXJJbmZvO1xuXG4gICAgLy8gZGVja2dsIGxheWVyIHRvIGtlcGxlci1nbCBsYXllclxuICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW292ZXJsYXkucHJvcHMuaWR4XTtcblxuICAgIC8vIE5PVEU6IGZvciBiaW5hcnkgZm9ybWF0IEdlb2pzb25MYXllciwgZGVjayB3aWxsIHJldHVybiBvYmplY3Q9bnVsbCBidXQgaG92ZXJJbmZvLmluZGV4ID49IDBcbiAgICBpZiAoXG4gICAgICAob2JqZWN0IHx8IGhvdmVySW5mby5pbmRleCA+PSAwKSAmJlxuICAgICAgbGF5ZXIgJiZcbiAgICAgIGxheWVyLmdldEhvdmVyRGF0YSAmJlxuICAgICAgbGF5ZXJzVG9SZW5kZXJbbGF5ZXIuaWRdXG4gICAgKSB7XG4gICAgICAvLyBpZiBsYXllciBpcyB2aXNpYmxlIGFuZCBoYXZlIGhvdmVyZWQgZGF0YVxuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IHtkYXRhSWR9XG4gICAgICB9ID0gbGF5ZXI7XG4gICAgICBpZiAoIWRhdGFJZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtkYXRhQ29udGFpbmVyLCBmaWVsZHN9ID0gZGF0YXNldHNbZGF0YUlkXTtcbiAgICAgIGNvbnN0IGRhdGE6IERhdGFSb3cgfCBudWxsID0gbGF5ZXIuZ2V0SG92ZXJEYXRhKFxuICAgICAgICBvYmplY3QgfHwgaG92ZXJJbmZvLmluZGV4LFxuICAgICAgICBkYXRhQ29udGFpbmVyLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgaG92ZXJJbmZvXG4gICAgICApO1xuICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgZmllbGRzVG9TaG93ID0gaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93W2RhdGFJZF07XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGZpZWxkcyxcbiAgICAgICAgZmllbGRzVG9TaG93LFxuICAgICAgICBsYXllcixcbiAgICAgICAgY3VycmVudFRpbWU6IGFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckRlY2tHbExheWVyKHByb3BzOiBhbnksIGxheWVyQ2FsbGJhY2tzOiB7W2tleTogc3RyaW5nXTogYW55fSkge1xuICBjb25zdCB7XG4gICAgZGF0YXNldHMsXG4gICAgbGF5ZXIsXG4gICAgbGF5ZXJJbmRleCxcbiAgICBkYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBtYXBMYXllcnMsXG4gICAgZXhwZXJpbWVudGFsQ29udGV4dFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tsYXllci5jb25maWcuZGF0YUlkXTtcbiAgY29uc3Qge2dwdUZpbHRlcn0gPSBkYXRhc2V0IHx8IHt9O1xuICBjb25zdCBvYmplY3RIb3ZlcmVkID0gY2xpY2tlZCB8fCBob3ZlckluZm87XG4gIGNvbnN0IHZpc2libGUgPSAhbWFwTGF5ZXJzIHx8IChtYXBMYXllcnMgJiYgbWFwTGF5ZXJzW2xheWVyLmlkXSk7XG4gIC8vIExheWVyIGlzIExheWVyIGNsYXNzXG4gIHJldHVybiBsYXllci5yZW5kZXJMYXllcih7XG4gICAgZGF0YSxcbiAgICBncHVGaWx0ZXIsXG4gICAgaWR4OiBsYXllckluZGV4LFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGxheWVyQ2FsbGJhY2tzLFxuICAgIG1hcFN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBvYmplY3RIb3ZlcmVkLFxuICAgIHZpc2libGUsXG4gICAgZGF0YXNldCxcbiAgICBleHBlcmltZW50YWxDb250ZXh0XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclJlbmRlcmFibGUobGF5ZXI6IExheWVyLCBsYXllckRhdGEpIHtcbiAgcmV0dXJuIGxheWVyLmlkICE9PSBHRU9DT0RFUl9MQVlFUl9JRCAmJiBsYXllci5zaG91bGRSZW5kZXJMYXllcihsYXllckRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycykge1xuICByZXR1cm4gKFxuICAgIGxheWVyLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBkb24ndCByZW5kZXIgaXRcbiAgICAoIW1hcExheWVycyB8fCAobWFwTGF5ZXJzICYmIG1hcExheWVyc1tsYXllci5pZF0pKVxuICApO1xufVxuXG4vLyBQcmVwYXJlIGEgZGljdCBvZiBsYXllcnMgcmVuZGVyZWQgYnkgdGhlIGRlY2suZ2xcbi8vIE5vdGUsIGlzVmlzaWJsZTogZmFsc2UgbGF5ZXIgaXMgcGFzc2VkIHRvIGRlY2suZ2wgaGVyZVxuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNGb3JEZWNrKFxuICBsYXllcnM6IExheWVyW10sXG4gIGxheWVyRGF0YTogVmlzU3RhdGVbJ2xheWVyRGF0YSddXG4pOiB7XG4gIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG59IHtcbiAgcmV0dXJuIGxheWVycy5yZWR1Y2UoXG4gICAgKGFjY3UsIGxheWVyLCBpZHgpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2xheWVyLmlkXTpcbiAgICAgICAgaXNMYXllclJlbmRlcmFibGUobGF5ZXIsIGxheWVyRGF0YVtpZHhdKSAmJiBsYXllci5vdmVybGF5VHlwZSA9PT0gT1ZFUkxBWV9UWVBFX0NPTlNULmRlY2tnbFxuICAgIH0pLFxuICAgIHt9XG4gICk7XG59XG5cbi8vIFByZXBhcmUgYSBkaWN0IG9mIHJlbmRlcmVkIGxheWVycyByZW5kZXJlZCBpbiB0aGUgbWFwXG4vLyBUaGlzIGluY2x1ZGVzIG9ubHkgdGhlIHZpc2liaWxlIGxheWVycyBmb3Igc2luZ2xlIG1hcCB2aWV3IGFuZCBzcGxpdCBtYXAgdmlld1xuLy8gcmV0dXJuIHtbaWRdOiB0cnVlIFxcIGZhbHNlfVxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMYXllcnNUb1JlbmRlcihcbiAgbGF5ZXJzOiBMYXllcltdLFxuICBsYXllckRhdGE6IFZpc1N0YXRlWydsYXllckRhdGEnXSxcbiAgbWFwTGF5ZXJzPzogU3BsaXRNYXBMYXllcnMgfCB1bmRlZmluZWQgfCBudWxsXG4pOiBMYXllcnNUb1JlbmRlciB7XG4gIHJldHVybiBsYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllciwgaWR4KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtsYXllci5pZF06IGlzTGF5ZXJSZW5kZXJhYmxlKGxheWVyLCBsYXllckRhdGFbaWR4XSkgJiYgaXNMYXllclZpc2libGUobGF5ZXIsIG1hcExheWVycylcbiAgICB9KSxcbiAgICB7fVxuICApO1xufVxuXG50eXBlIEN1c3RvbURlY2tMYXllciA9IERlY2tMYXllcjxEZWNrTGF5ZXJQcm9wcz47XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXN0b21EZWNrTGF5ZXJzKGRlY2tHbFByb3BzPzogYW55KTogW0N1c3RvbURlY2tMYXllcltdLCBDdXN0b21EZWNrTGF5ZXJbXV0ge1xuICBjb25zdCBib3R0b21EZWNrTGF5ZXJzID0gQXJyYXkuaXNBcnJheShkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVyc1xuICAgIDogaXNGdW5jdGlvbihkZWNrR2xQcm9wcz8ubGF5ZXJzKVxuICAgID8gZGVja0dsUHJvcHM/LmxheWVycygpXG4gICAgOiBbXTtcbiAgY29uc3QgdG9wRGVja0xheWVycyA9IEFycmF5LmlzQXJyYXkoZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnNcbiAgICA6IGlzRnVuY3Rpb24oZGVja0dsUHJvcHM/LnRvcExheWVycylcbiAgICA/IGRlY2tHbFByb3BzPy50b3BMYXllcnMoKVxuICAgIDogW107XG5cbiAgcmV0dXJuIFtib3R0b21EZWNrTGF5ZXJzLCB0b3BEZWNrTGF5ZXJzXTtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcHV0ZURlY2tMYXllcnNQcm9wcyA9IHtcbiAgbWFwSW5kZXg/OiBudW1iZXI7XG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICBtYXBib3hBcGlVcmw/OiBzdHJpbmc7XG4gIHByaW1hcnlNYXA/OiBib29sZWFuO1xuICBsYXllcnNGb3JEZWNrPzoge1trZXk6IHN0cmluZ106IGJvb2xlYW59O1xuICBlZGl0b3JJbmZvPzoge1xuICAgIGVkaXRvcjogRWRpdG9yO1xuICAgIGVkaXRvck1lbnVBY3RpdmU6IGJvb2xlYW47XG4gICAgb25TZXRGZWF0dXJlczogKGZlYXR1cmVzOiBGZWF0dXJlW10pID0+IGFueTtcbiAgICBzZXRTZWxlY3RlZEZlYXR1cmU6IChcbiAgICAgIGZlYXR1cmU6IEZlYXR1cmUgfCBudWxsLFxuICAgICAgc2VsZWN0aW9uQ29udGV4dD86IEZlYXR1cmVTZWxlY3Rpb25Db250ZXh0XG4gICAgKSA9PiBhbnk7XG4gICAgb25BcHBseVBvbHlnb25GaWx0ZXJBbGw/OiAoZmVhdHVyZTogRmVhdHVyZSkgPT4gYW55O1xuICAgIGZlYXR1cmVDb2xsZWN0aW9uOiB7XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICBmZWF0dXJlczogRmVhdHVyZVtdO1xuICAgIH07XG4gICAgc2VsZWN0ZWRGZWF0dXJlSW5kZXhlczogbnVtYmVyW107XG4gICAgdmlld3BvcnQ6IFZpZXdwb3J0O1xuICB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRMYXllckNhbGxiYWNrcyhcbiAgbGF5ZXJDYWxsYmFja3M6IExheWVyQ2FsbGJhY2tzID0ge30sXG4gIGlkeDogbnVtYmVyXG4pOiBCaW5kZWRMYXllckNhbGxiYWNrcyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhsYXllckNhbGxiYWNrcykucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgW2tleV06IHZhbCA9PiBsYXllckNhbGxiYWNrc1trZXldKGlkeCwgdmFsKVxuICAgIH0pLFxuICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsICh2YWw6IHVua25vd24pID0+IHZvaWQ+XG4gICk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEZWNrTGF5ZXJzRnJvbUxheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IExheWVyT3JkZXIsXG4gIGxheWVyczogTGF5ZXJbXSxcbiAgbGF5ZXJEYXRhOiBhbnlbXSxcbiAgY3VycmVudExheWVyc0ZvckRlY2s6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSxcbiAgcmVuZGVyUHJvcHM6IHtcbiAgICBkYXRhc2V0czogYW55O1xuICAgIGhvdmVySW5mbzogYW55O1xuICAgIGNsaWNrZWQ6IGFueTtcbiAgICBtYXBTdGF0ZTogYW55O1xuICAgIGludGVyYWN0aW9uQ29uZmlnOiBhbnk7XG4gICAgYW5pbWF0aW9uQ29uZmlnOiBhbnk7XG4gICAgbWFwTGF5ZXJzOiBhbnk7XG4gICAgaGFzU2hhZG93RWZmZWN0OiBib29sZWFuO1xuICB9LFxuICBsYXllckNhbGxiYWNrcz86IGFueVxuKTogYW55W10ge1xuICBjb25zdCB7ZGF0YXNldHMsIGhvdmVySW5mbywgY2xpY2tlZCwgbWFwU3RhdGUsIGludGVyYWN0aW9uQ29uZmlnLCBhbmltYXRpb25Db25maWcsIG1hcExheWVycywgaGFzU2hhZG93RWZmZWN0fSA9IHJlbmRlclByb3BzO1xuICByZXR1cm4gbGF5ZXJPcmRlclxuICAgIC5zbGljZSgpXG4gICAgLnJldmVyc2UoKVxuICAgIC5yZWR1Y2UoKG92ZXJsYXlzLCBlbGVtZW50KSA9PiB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChlbGVtZW50KSkge1xuICAgICAgICBjb25zdCBsYXllckdyb3VwID0gZWxlbWVudCBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICAgIGlmICghbGF5ZXJHcm91cC5pc1Zpc2libGUpIHtcbiAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG92ZXJsYXlzLmNvbmNhdChcbiAgICAgICAgICBjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyKFxuICAgICAgICAgICAgbGF5ZXJHcm91cC5sYXllck9yZGVyLFxuICAgICAgICAgICAgbGF5ZXJzLFxuICAgICAgICAgICAgbGF5ZXJEYXRhLFxuICAgICAgICAgICAgY3VycmVudExheWVyc0ZvckRlY2ssXG4gICAgICAgICAgICByZW5kZXJQcm9wcyxcbiAgICAgICAgICAgIGxheWVyQ2FsbGJhY2tzXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbGF5ZXJJZCA9IGVsZW1lbnQgYXMgc3RyaW5nO1xuICAgICAgaWYgKCFjdXJyZW50TGF5ZXJzRm9yRGVja1tsYXllcklkXSkge1xuICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXllckluZGV4ID0gbGF5ZXJzLmZpbmRJbmRleCgoe2lkfSkgPT4gaWQgPT09IGxheWVySWQpO1xuICAgICAgaWYgKGxheWVySW5kZXggPT09IC0xKSB7XG4gICAgICAgIHJldHVybiBvdmVybGF5cztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJpbmRlZExheWVyQ2FsbGJhY2tzID0gbGF5ZXJDYWxsYmFja3NcbiAgICAgICAgPyBiaW5kTGF5ZXJDYWxsYmFja3MobGF5ZXJDYWxsYmFja3MsIGxheWVySW5kZXgpXG4gICAgICAgIDoge307XG4gICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllckluZGV4XTtcbiAgICAgIGNvbnN0IGRhdGEgPSBsYXllckRhdGFbbGF5ZXJJbmRleF07XG4gICAgICBjb25zdCBsYXllck92ZXJsYXkgPSByZW5kZXJEZWNrR2xMYXllcihcbiAgICAgICAge1xuICAgICAgICAgIGRhdGFzZXRzLFxuICAgICAgICAgIGxheWVyLFxuICAgICAgICAgIGxheWVySW5kZXgsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBob3ZlckluZm8sXG4gICAgICAgICAgY2xpY2tlZCxcbiAgICAgICAgICBtYXBTdGF0ZSxcbiAgICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZyxcbiAgICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgICAgbWFwTGF5ZXJzLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbENvbnRleHQ6IHtcbiAgICAgICAgICAgIGhhc1NoYWRvd0VmZmVjdFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYmluZGVkTGF5ZXJDYWxsYmFja3NcbiAgICAgICk7XG4gICAgICByZXR1cm4gb3ZlcmxheXMuY29uY2F0KGxheWVyT3ZlcmxheSB8fCBbXSk7XG4gICAgfSwgW10gYXMgYW55W10pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVEZWNrTGF5ZXJzKFxuICB7dmlzU3RhdGUsIG1hcFN0YXRlLCBtYXBTdHlsZX06IGFueSxcbiAgb3B0aW9ucz86IENvbXB1dGVEZWNrTGF5ZXJzUHJvcHMsXG4gIGxheWVyQ2FsbGJhY2tzPzogTGF5ZXJDYWxsYmFja3MsXG4gIGRlY2tHbFByb3BzPzogYW55XG4pOiBMYXllcltdIHtcbiAgY29uc3Qge1xuICAgIGRhdGFzZXRzLFxuICAgIGVmZmVjdHMsXG4gICAgbGF5ZXJzLFxuICAgIGxheWVyT3JkZXIsXG4gICAgbGF5ZXJEYXRhLFxuICAgIGhvdmVySW5mbyxcbiAgICBjbGlja2VkLFxuICAgIGludGVyYWN0aW9uQ29uZmlnLFxuICAgIGFuaW1hdGlvbkNvbmZpZyxcbiAgICBzcGxpdE1hcHNcbiAgfSA9IHZpc1N0YXRlO1xuXG4gIGNvbnN0IHttYXBJbmRleCwgbWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCwgcHJpbWFyeU1hcCwgbGF5ZXJzRm9yRGVjaywgZWRpdG9ySW5mb30gPVxuICAgIG9wdGlvbnMgfHwge307XG5cbiAgbGV0IGRhdGFMYXllcnM6IGFueVtdID0gW107XG5cbiAgY29uc3QgaGFzU2hhZG93RWZmZWN0ID0gZWZmZWN0cy5zb21lKGVmZmVjdCA9PiB7XG4gICAgcmV0dXJuIGVmZmVjdC50eXBlID09PSBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC50eXBlO1xuICB9KTtcblxuICBpZiAobGF5ZXJEYXRhICYmIGxheWVyRGF0YS5sZW5ndGgpIHtcbiAgICBjb25zdCBtYXBMYXllcnMgPSBnZXRNYXBMYXllcnNGcm9tU3BsaXRNYXBzKHNwbGl0TWFwcywgbWFwSW5kZXggfHwgMCk7XG5cbiAgICBjb25zdCBjdXJyZW50TGF5ZXJzRm9yRGVjayA9IGxheWVyc0ZvckRlY2sgfHwgcHJlcGFyZUxheWVyc0ZvckRlY2sobGF5ZXJzLCBsYXllckRhdGEpO1xuXG4gICAgZGF0YUxheWVycyA9IGxheWVyT3JkZXJcbiAgICAgIC5zbGljZSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAucmVkdWNlKChvdmVybGF5cywgZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChlbGVtZW50KSkge1xuICAgICAgICAgIGNvbnN0IGxheWVyR3JvdXAgPSBlbGVtZW50IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgICAgICBpZiAoIWxheWVyR3JvdXAuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdmVybGF5cy5jb25jYXQoXG4gICAgICAgICAgICBjb21wdXRlRGVja0xheWVyc0Zyb21MYXllck9yZGVyKFxuICAgICAgICAgICAgICBsYXllckdyb3VwLmxheWVyT3JkZXIsXG4gICAgICAgICAgICAgIGxheWVycyxcbiAgICAgICAgICAgICAgbGF5ZXJEYXRhLFxuICAgICAgICAgICAgICBjdXJyZW50TGF5ZXJzRm9yRGVjayxcbiAgICAgICAgICAgICAge2RhdGFzZXRzLCBob3ZlckluZm8sIGNsaWNrZWQsIG1hcFN0YXRlLCBpbnRlcmFjdGlvbkNvbmZpZywgYW5pbWF0aW9uQ29uZmlnLCBtYXBMYXllcnMsIGhhc1NoYWRvd0VmZmVjdH0sXG4gICAgICAgICAgICAgIGxheWVyQ2FsbGJhY2tzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsYXllcklkID0gZWxlbWVudCBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghY3VycmVudExheWVyc0ZvckRlY2tbbGF5ZXJJZF0pIHtcbiAgICAgICAgICByZXR1cm4gb3ZlcmxheXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGF5ZXJJbmRleCA9IGxheWVycy5maW5kSW5kZXgoKHtpZH0pID0+IGlkID09PSBsYXllcklkKTtcbiAgICAgICAgaWYgKGxheWVySW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIG92ZXJsYXlzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpbmRlZExheWVyQ2FsbGJhY2tzID0gbGF5ZXJDYWxsYmFja3NcbiAgICAgICAgICA/IGJpbmRMYXllckNhbGxiYWNrcyhsYXllckNhbGxiYWNrcywgbGF5ZXJJbmRleClcbiAgICAgICAgICA6IHt9O1xuICAgICAgICBjb25zdCBsYXllciA9IGxheWVyc1tsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGxheWVyRGF0YVtsYXllckluZGV4XTtcbiAgICAgICAgY29uc3QgbGF5ZXJPdmVybGF5ID0gcmVuZGVyRGVja0dsTGF5ZXIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgIGxheWVySW5kZXgsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgaG92ZXJJbmZvLFxuICAgICAgICAgICAgY2xpY2tlZCxcbiAgICAgICAgICAgIG1hcFN0YXRlLFxuICAgICAgICAgICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgICAgICBhbmltYXRpb25Db25maWcsXG4gICAgICAgICAgICBtYXBMYXllcnMsXG4gICAgICAgICAgICBleHBlcmltZW50YWxDb250ZXh0OiB7XG4gICAgICAgICAgICAgIGhhc1NoYWRvd0VmZmVjdFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYmluZGVkTGF5ZXJDYWxsYmFja3NcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG92ZXJsYXlzLmNvbmNhdChsYXllck92ZXJsYXkgfHwgW10pO1xuICAgICAgfSwgW10pO1xuICB9XG5cbiAgaWYgKCFwcmltYXJ5TWFwKSB7XG4gICAgcmV0dXJuIGRhdGFMYXllcnM7XG4gIH1cblxuICBpZiAoXG4gICAgbWFwU3R5bGU/LnZpc2libGVMYXllckdyb3Vwc1snM2QgYnVpbGRpbmcnXSAmJlxuICAgIHByaW1hcnlNYXAgJiZcbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbiAmJlxuICAgIG1hcGJveEFwaVVybFxuICApIHtcbiAgICBkYXRhTGF5ZXJzLnB1c2goXG4gICAgICBuZXcgVGhyZWVEQnVpbGRpbmdMYXllcih7XG4gICAgICAgIGlkOiAnX2tlcGxlcmdsXzNkLWJ1aWxkaW5nJyxcbiAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICAgIG1hcGJveEFwaVVybCxcbiAgICAgICAgdGhyZWVEQnVpbGRpbmdDb2xvcjogbWFwU3R5bGUudGhyZWVEQnVpbGRpbmdDb2xvcixcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICBnZXRGaWxsQ29sb3I6IG1hcFN0eWxlLnRocmVlREJ1aWxkaW5nQ29sb3JcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW2N1c3RvbUJvdHRvbURlY2tMYXllcnMsIGN1c3RvbVRvcERlY2tMYXllcnNdID0gZ2V0Q3VzdG9tRGVja0xheWVycyhkZWNrR2xQcm9wcyk7XG5cbiAgY29uc3QgZWRpdG9yTGF5ZXI6IGFueVtdID0gW107XG4gIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgZWRpdG9yTGF5ZXIucHVzaChcbiAgICAgIGdldEVkaXRvckxheWVyKHtcbiAgICAgICAgLi4uZWRpdG9ySW5mbyxcbiAgICAgICAgbWFwU3RhdGVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBbLi4uY3VzdG9tQm90dG9tRGVja0xheWVycywgLi4uZGF0YUxheWVycywgLi4uY3VzdG9tVG9wRGVja0xheWVycywgLi4uZWRpdG9yTGF5ZXJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJPcmRlckZyb21MYXllcnM8VCBleHRlbmRzIHtpZDogc3RyaW5nfT4obGF5ZXJzOiBUW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBsYXllcnMubWFwKCh7aWR9KSA9PiBpZCk7XG59XG5cbi8vIC0tLSBMYXllciBHcm91cCBVdGlsaXRpZXMgLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdMYXllckdyb3VwKHByb3BzPzogUGFydGlhbDxMYXllck9yZGVyR3JvdXA+KTogTGF5ZXJPcmRlckdyb3VwIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogcHJvcHM/LmlkID8/IGdlbmVyYXRlSGFzaElkKDYpLFxuICAgIGxhYmVsOiBwcm9wcz8ubGFiZWwgPz8gJ05ldyBncm91cCcsXG4gICAgaXNWaXNpYmxlOiBwcm9wcz8uaXNWaXNpYmxlID8/IHRydWUsXG4gICAgbGF5ZXJPcmRlcjogcHJvcHM/LmxheWVyT3JkZXIgPz8gW10sXG4gICAgaXNJbmNsdWRlZEluTGVnZW5kOiBwcm9wcz8uaXNJbmNsdWRlZEluTGVnZW5kID8/IHRydWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZExheWVyT3JHcm91cFRvTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogTGF5ZXJPcmRlcixcbiAgZWxlbWVudDogTGF5ZXJPcmRlckVudHJ5LFxuICBhdEluZGV4PzogbnVtYmVyXG4pOiBMYXllck9yZGVyIHtcbiAgY29uc3QgaWR4ID0gYXRJbmRleCA/PyAwO1xuICBjb25zdCByZXN1bHQgPSBbLi4ubGF5ZXJPcmRlcl07XG4gIHJlc3VsdC5zcGxpY2UoaWR4LCAwLCBlbGVtZW50KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogTGF5ZXJPcmRlcixcbiAgZWxlbWVudDogTGF5ZXJPcmRlckVudHJ5XG4pOiBMYXllck9yZGVyIHtcbiAgaWYgKCFsYXllck9yZGVyKSByZXR1cm4gW107XG4gIGNvbnN0IGVsZW1lbnRJZCA9IHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyA/IGVsZW1lbnQgOiBlbGVtZW50LmlkO1xuICBsZXQgbmV3TGF5ZXJPcmRlciA9IGxheWVyT3JkZXIuZmlsdGVyKGVudHJ5ID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIHJldHVybiAoZW50cnkgYXMgTGF5ZXJPcmRlckdyb3VwKS5pZCAhPT0gZWxlbWVudElkO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnkgIT09IGVsZW1lbnRJZDtcbiAgfSk7XG5cbiAgbmV3TGF5ZXJPcmRlciA9IG5ld0xheWVyT3JkZXIubWFwKGVudHJ5ID0+IHtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZW50cnkgYXMgTGF5ZXJPcmRlckdyb3VwO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgIGxheWVyT3JkZXI6IHJlbW92ZUVsZW1lbnRGcm9tTGF5ZXJPcmRlcihncm91cC5sYXllck9yZGVyLCBlbGVtZW50SWQpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0pO1xuXG4gIHJldHVybiBuZXdMYXllck9yZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllckdyb3VwSWQ6IHN0cmluZ1xuKTogTGF5ZXJPcmRlckdyb3VwIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGdyb3VwOiBMYXllck9yZGVyR3JvdXAgfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5ZXJPcmRlci5sZW5ndGggJiYgIWdyb3VwOyBpKyspIHtcbiAgICBjb25zdCBlbnRyeSA9IGxheWVyT3JkZXJbaV07XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICBjb25zdCBncnAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBncm91cCA9XG4gICAgICAgIGdycC5pZCA9PT0gbGF5ZXJHcm91cElkID8gZ3JwIDogZ2V0TGF5ZXJHcm91cEZyb21MYXllck9yZGVyKGdycC5sYXllck9yZGVyLCBsYXllckdyb3VwSWQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXA7XG59XG5cbi8qKlxuICogRmluZCB0aGUgcGFyZW50IGdyb3VwIHRoYXQgY29udGFpbnMgYSBnaXZlbiBsYXllciBJRC5cbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBsYXllciBpcyBhdCB0aGUgcm9vdCBsZXZlbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQYXJlbnRHcm91cEZvckxheWVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcklkOiBzdHJpbmdcbik6IExheWVyT3JkZXJHcm91cCB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgbGF5ZXJPcmRlcikge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGVudHJ5KSkge1xuICAgICAgY29uc3QgZ3JvdXAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBpZiAoZ3JvdXAubGF5ZXJPcmRlci5zb21lKGUgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnICYmIGUgPT09IGxheWVySWQpKSB7XG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5lc3RlZCA9IGZpbmRQYXJlbnRHcm91cEZvckxheWVyKGdyb3VwLmxheWVyT3JkZXIsIGxheWVySWQpO1xuICAgICAgaWYgKG5lc3RlZCkgcmV0dXJuIG5lc3RlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4RnJvbUxheWVyRW50cnlJZChsYXllck9yZGVyOiBMYXllck9yZGVyLCBsYXllckVudHJ5SWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBsYXllck9yZGVyLmZpbmRJbmRleChlbnRyeSA9PlxuICAgIGlzUGxhaW5PYmplY3QoZW50cnkpID8gKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCkuaWQgPT09IGxheWVyRW50cnlJZCA6IGVudHJ5ID09PSBsYXllckVudHJ5SWRcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJQcmVzZW50SW5MYXllck9yZGVyKGxheWVyT3JkZXI6IExheWVyT3JkZXIsIGxheWVySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllck9yZGVyLmxlbmd0aCAmJiAhZm91bmQ7IGkrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gbGF5ZXJPcmRlcltpXTtcbiAgICBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGZvdW5kID0gaXNMYXllclByZXNlbnRJbkxheWVyT3JkZXIoKGVudHJ5IGFzIExheWVyT3JkZXJHcm91cCkubGF5ZXJPcmRlciwgbGF5ZXJJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvdW5kID0gbGF5ZXJJZCA9PT0gZW50cnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3VuZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VMYXllckVudHJ5SW5MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBvbGRFbnRyeTogTGF5ZXJPcmRlckVudHJ5LFxuICBuZXdFbnRyeTogTGF5ZXJPcmRlckVudHJ5XG4pOiBMYXllck9yZGVyIHtcbiAgY29uc3Qgb2xkRW50cnlJZCA9IHR5cGVvZiBvbGRFbnRyeSA9PT0gJ3N0cmluZycgPyBvbGRFbnRyeSA6IG9sZEVudHJ5LmlkO1xuICByZXR1cm4gbGF5ZXJPcmRlci5tYXAoZW50cnkgPT4ge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZW50cnkgPT09IG9sZEVudHJ5SWQgPyBuZXdFbnRyeSA6IGVudHJ5O1xuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgIGNvbnN0IGdycCA9IGVudHJ5IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgIGlmIChncnAuaWQgPT09IG9sZEVudHJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIG5ld0VudHJ5O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JwLFxuICAgICAgICBsYXllck9yZGVyOiByZXBsYWNlTGF5ZXJFbnRyeUluTGF5ZXJPcmRlcihncnAubGF5ZXJPcmRlciwgb2xkRW50cnksIG5ld0VudHJ5KVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxheWVyR3JvdXBJbkxheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IExheWVyT3JkZXIsXG4gIG5ld0xheWVyR3JvdXA6IExheWVyT3JkZXJHcm91cFxuKTogTGF5ZXJPcmRlciB7XG4gIHJldHVybiBsYXllck9yZGVyLm1hcChlbnRyeSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZW50cnkpKSB7XG4gICAgICBjb25zdCBncnAgPSBlbnRyeSBhcyBMYXllck9yZGVyR3JvdXA7XG4gICAgICBpZiAoZ3JwLmlkID09PSBuZXdMYXllckdyb3VwLmlkKSB7XG4gICAgICAgIHJldHVybiBuZXdMYXllckdyb3VwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ3JwLFxuICAgICAgICBsYXllck9yZGVyOiB1cGRhdGVMYXllckdyb3VwSW5MYXllck9yZGVyKGdycC5sYXllck9yZGVyLCBuZXdMYXllckdyb3VwKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZsYXRMYXllck9yZGVyKGxheWVyT3JkZXI6IExheWVyT3JkZXIpOiBGbGF0TGF5ZXJPcmRlciB7XG4gIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBvcmRlckVudHJ5KSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3Qob3JkZXJFbnRyeSkpIHtcbiAgICAgIHJldHVybiBbLi4uYWNjLCAuLi5nZXRGbGF0TGF5ZXJPcmRlcigob3JkZXJFbnRyeSBhcyBMYXllck9yZGVyR3JvdXApLmxheWVyT3JkZXIpXTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5hY2MsIG9yZGVyRW50cnkgYXMgc3RyaW5nXTtcbiAgfSwgW10gYXMgRmxhdExheWVyT3JkZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRMYXllck9yZGVySGllcmFyY2h5KFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcnM/OiBMYXllcltdIHwgcmVhZG9ubHkgTGF5ZXJbXVxuKTogTGF5ZXJPcmRlckhpZXJhcmNoeSB7XG4gIGNvbnN0IHZhbGlkTGF5ZXJzID0gbGF5ZXJzPy5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBsYXllck9yZGVyLnJlZHVjZSgoYWNjLCBlbGVtZW50KSA9PiB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBbLi4uYWNjLCBbJ2xheWVyR3JvdXAnLCBlbGVtZW50IGFzIExheWVyT3JkZXJHcm91cF0gYXMgY29uc3RdO1xuICAgIH1cbiAgICBjb25zdCBsYXllciA9IHZhbGlkTGF5ZXJzPy5maW5kKGwgPT4gbC5pZCA9PT0gZWxlbWVudCk7XG4gICAgaWYgKCFsYXllciB8fCBsYXllci5jb25maWcuaGlkZGVuKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmFjYywgWydsYXllcicsIGxheWVyXSBhcyBjb25zdF07XG4gIH0sIFtdIGFzIExheWVyT3JkZXJIaWVyYXJjaHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlR2hvc3RMYXllckZyb21MYXllck9yZGVyKFxuICBsYXllck9yZGVyOiBMYXllck9yZGVyLFxuICBsYXllcnM6IHtpZDogc3RyaW5nfVtdXG4pOiBMYXllck9yZGVyIHtcbiAgcmV0dXJuIGxheWVyT3JkZXIucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChsYXllcnMuZmluZChsID0+IGwuaWQgPT09IGVudHJ5KSkge1xuICAgICAgICBhY2MucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdycCA9IGVudHJ5IGFzIExheWVyT3JkZXJHcm91cDtcbiAgICAgIGlmIChncnAubGF5ZXJPcmRlcikge1xuICAgICAgICBhY2MucHVzaCh7XG4gICAgICAgICAgLi4uZ3JwLFxuICAgICAgICAgIGxheWVyT3JkZXI6IHJlbW92ZUdob3N0TGF5ZXJGcm9tTGF5ZXJPcmRlcihncnAubGF5ZXJPcmRlciwgbGF5ZXJzKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10gYXMgTGF5ZXJPcmRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW9yZGVyTGF5ZXJPcmRlcihcbiAgbGF5ZXJPcmRlcjogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSxcbiAgb3JpZ2luTGF5ZXJJZDogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkxheWVySWQ6IHN0cmluZ1xuKTogVmlzU3RhdGVbJ2xheWVyT3JkZXInXSB7XG4gIGNvbnN0IGFjdGl2ZUluZGV4ID0gZ2V0SW5kZXhGcm9tTGF5ZXJFbnRyeUlkKGxheWVyT3JkZXIsIG9yaWdpbkxheWVySWQpO1xuICBjb25zdCBvdmVySW5kZXggPSBnZXRJbmRleEZyb21MYXllckVudHJ5SWQobGF5ZXJPcmRlciwgZGVzdGluYXRpb25MYXllcklkKTtcblxuICBpZiAoYWN0aXZlSW5kZXggPT09IC0xIHx8IG92ZXJJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gbGF5ZXJPcmRlcjtcbiAgfVxuICByZXR1cm4gYXJyYXlNb3ZlKGxheWVyT3JkZXIsIGFjdGl2ZUluZGV4LCBvdmVySW5kZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTGF5ZXJUb0xheWVyT3JkZXIoXG4gIGxheWVyT3JkZXI6IFZpc1N0YXRlWydsYXllck9yZGVyJ10sXG4gIGxheWVySWQ6IHN0cmluZ1xuKTogTGF5ZXJPcmRlciB7XG4gIHJldHVybiBbbGF5ZXJJZCwgLi4ubGF5ZXJPcmRlcl07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXllckhvdmVyUHJvcFZhbHVlKFxuICBkYXRhOiBEYXRhUm93IHwgQWdncmVnYXRpb25MYXllckhvdmVyRGF0YSB8IGFueVtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZmllbGRJbmRleDogbnVtYmVyXG4pIHtcbiAgaWYgKCFkYXRhKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGFSb3cpIHJldHVybiBkYXRhLnZhbHVlQXQoZmllbGRJbmRleCk7XG4gIHJldHVybiBkYXRhW2ZpZWxkSW5kZXhdO1xufVxuXG4vKiogQ2hlY2tzIGlmIGFueSBEZWNrIGxheWVycyBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgbG9hZGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcmVBbnlEZWNrTGF5ZXJzTG9hZGluZyhsYXllcnM6IERlY2tMYXllcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBsYXllcnMuc29tZShcbiAgICAvLyBsYXllci5pc0xvYWRlZCBjaGFuZ2VzIGZyZXF1ZW50bHkgaW4gRGVjayAoZXZlbiBvbiBob3Zlcikgc28gd2UgY2hlY2sgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAgbGF5ZXIgPT4gbGF5ZXIuaW50ZXJuYWxTdGF0ZSAmJiAhbGF5ZXIuaXNMb2FkZWRcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxRQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFxQkEsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBV0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksWUFBQSxHQUFBSixPQUFBO0FBRUEsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQTZELFNBQUFNLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEsQ0FBQUMsT0FBQSxDQUFBTixDQUFBLE1BQUFFLENBQUEsR0FBQUssMkJBQUEsQ0FBQVAsQ0FBQSxNQUFBQyxDQUFBLElBQUFELENBQUEsdUJBQUFBLENBQUEsQ0FBQVEsTUFBQSxJQUFBTixDQUFBLEtBQUFGLENBQUEsR0FBQUUsQ0FBQSxPQUFBTyxFQUFBLE1BQUFDLENBQUEsWUFBQUEsRUFBQSxlQUFBQyxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQSxFQUFBLFdBQUFILEVBQUEsSUFBQVQsQ0FBQSxDQUFBUSxNQUFBLEtBQUFLLElBQUEsV0FBQUEsSUFBQSxNQUFBQyxLQUFBLEVBQUFkLENBQUEsQ0FBQVMsRUFBQSxVQUFBUixDQUFBLFdBQUFBLEVBQUFELENBQUEsVUFBQUEsQ0FBQSxLQUFBZSxDQUFBLEVBQUFMLENBQUEsZ0JBQUFNLFNBQUEsaUpBQUFDLENBQUEsRUFBQUMsQ0FBQSxPQUFBQyxDQUFBLGdCQUFBUixDQUFBLFdB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bkksR0FBRyxDQUFDakQsSUFBSSxDQUFDb0wsS0FBSyxDQUFDO01BQ2pCO0lBQ0YsQ0FBQyxNQUFNO01BQ0wsSUFBTUssR0FBRyxHQUFHTCxLQUF3QjtNQUNwQyxJQUFJSyxHQUFHLENBQUNwRSxVQUFVLEVBQUU7UUFDbEJwRSxHQUFHLENBQUNqRCxJQUFJLENBQUFFLGFBQUEsQ0FBQUEsYUFBQSxLQUNIdUwsR0FBRztVQUNOcEUsVUFBVSxFQUFFMkYsOEJBQThCLENBQUN2QixHQUFHLENBQUNwRSxVQUFVLEVBQUU3RSxNQUFNO1FBQUMsRUFDbkUsQ0FBQztNQUNKO0lBQ0Y7SUFDQSxPQUFPUyxHQUFHO0VBQ1osQ0FBQyxFQUFFLEVBQWdCLENBQUM7QUFDdEI7QUFFTyxTQUFTZ0ssaUJBQWlCQSxDQUMvQjVGLFVBQWtDLEVBQ2xDNkYsYUFBcUIsRUFDckJDLGtCQUEwQixFQUNGO0VBQ3hCLElBQU1DLFdBQVcsR0FBR3RCLHdCQUF3QixDQUFDekUsVUFBVSxFQUFFNkYsYUFBYSxDQUFDO0VBQ3ZFLElBQU1HLFNBQVMsR0FBR3ZCLHdCQUF3QixDQUFDekUsVUFBVSxFQUFFOEYsa0JBQWtCLENBQUM7RUFFMUUsSUFBSUMsV0FBVyxLQUFLLENBQUMsQ0FBQyxJQUFJQyxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7SUFDMUMsT0FBT2hHLFVBQVU7RUFDbkI7RUFDQSxPQUFPLElBQUFpRyxzQkFBUyxFQUFDakcsVUFBVSxFQUFFK0YsV0FBVyxFQUFFQyxTQUFTLENBQUM7QUFDdEQ7QUFFTyxTQUFTRSxvQkFBb0JBLENBQ2xDbEcsVUFBa0MsRUFDbENTLE9BQWUsRUFDSDtFQUNaLFFBQVFBLE9BQU8sRUFBQTFHLE1BQUEsS0FBQThJLG1CQUFBLGFBQUs3QyxVQUFVO0FBQ2hDO0FBRU8sU0FBU21HLHNCQUFzQkEsQ0FDcENySSxJQUFvRSxFQUNwRXNJLFVBQWtCLEVBQ2xCO0VBQ0EsSUFBSSxDQUFDdEksSUFBSSxFQUFFLE9BQU85QyxTQUFTO0VBQzNCLElBQUk4QyxJQUFJLFlBQVl1SSxjQUFPLEVBQUUsT0FBT3ZJLElBQUksQ0FBQ3dJLE9BQU8sQ0FBQ0YsVUFBVSxDQUFDO0VBQzVELE9BQU90SSxJQUFJLENBQUNzSSxVQUFVLENBQUM7QUFDekI7O0FBRUE7QUFDTyxTQUFTRyx1QkFBdUJBLENBQUNwTCxNQUFtQixFQUFXO0VBQ3BFLE9BQU9BLE1BQU0sQ0FBQ0wsSUFBSTtFQUNoQjtFQUNBLFVBQUFSLEtBQUs7SUFBQSxPQUFJQSxLQUFLLENBQUNrTSxhQUFhLElBQUksQ0FBQ2xNLEtBQUssQ0FBQ21NLFFBQVE7RUFBQSxDQUNqRCxDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=
|