@sapui5/sap.fe.core 1.105.0 → 1.105.2
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/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/CommonUtils.js +7 -1
- package/src/sap/fe/core/CommonUtils.ts +9 -0
- package/src/sap/fe/core/ExtensionAPI.js +34 -1
- package/src/sap/fe/core/ExtensionAPI.ts +30 -0
- package/src/sap/fe/core/PageController.js +9 -7
- package/src/sap/fe/core/PageController.ts +10 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +0 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +80 -243
- package/src/sap/fe/core/controllerextensions/PageReady.ts +76 -222
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +2 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +1 -4
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +405 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +273 -0
- package/src/sap/fe/core/converters/annotations/DataField.js +9 -7
- package/src/sap/fe/core/converters/annotations/DataField.ts +10 -7
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -2
- package/src/sap/fe/core/converters/controls/Common/Table.ts +0 -2
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +75 -29
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +62 -36
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -3
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +3 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import Log from "sap/base/Log";
|
|
2
|
+
import type Event from "sap/ui/base/Event";
|
|
3
|
+
import type EventProvider from "sap/ui/base/EventProvider";
|
|
4
|
+
import type Control from "sap/ui/core/Control";
|
|
5
|
+
import type Chart from "sap/ui/mdc/Chart";
|
|
6
|
+
import type FilterBar from "sap/ui/mdc/FilterBar";
|
|
7
|
+
import type Table from "sap/ui/mdc/Table";
|
|
8
|
+
import type Binding from "sap/ui/model/Binding";
|
|
9
|
+
|
|
10
|
+
class DataQueryWatcher {
|
|
11
|
+
protected _aBindingRegistrations: { binding: Binding; boundControl?: Control; requestedCount: number; receivedCount: number }[] = [];
|
|
12
|
+
protected _aOtherEventSources: EventProvider[] = [];
|
|
13
|
+
protected _isSearchPending = false;
|
|
14
|
+
protected _isDataReceived?: boolean;
|
|
15
|
+
protected _aMDCTables: Table[] = [];
|
|
16
|
+
protected _aMDCCharts: Chart[] = [];
|
|
17
|
+
public constructor(protected _oEventProvider: EventProvider, protected _fnOnFinished: () => void) {}
|
|
18
|
+
// Accessors
|
|
19
|
+
public isSearchPending() {
|
|
20
|
+
return this._isSearchPending;
|
|
21
|
+
}
|
|
22
|
+
public isDataReceived() {
|
|
23
|
+
return this._isDataReceived;
|
|
24
|
+
}
|
|
25
|
+
public resetDataReceived() {
|
|
26
|
+
this._isDataReceived = undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reset the state: unsubscribe to all data events and remove all registered objects.
|
|
30
|
+
*/
|
|
31
|
+
public reset(): void {
|
|
32
|
+
// Remove all remaining callbacks
|
|
33
|
+
this._aBindingRegistrations.forEach((reg) => {
|
|
34
|
+
reg.binding.detachEvent("dataRequested", this.onDataRequested, this);
|
|
35
|
+
reg.binding.detachEvent("dataReceived", this.onDataReceived, this);
|
|
36
|
+
});
|
|
37
|
+
this._aOtherEventSources.forEach((oElement: any) => {
|
|
38
|
+
oElement.detachEvent("search", this.onSearch, this);
|
|
39
|
+
oElement.detachEvent("bindingUpdated", this.register, this);
|
|
40
|
+
});
|
|
41
|
+
this._aBindingRegistrations = [];
|
|
42
|
+
this._aOtherEventSources = [];
|
|
43
|
+
this._aMDCTables = [];
|
|
44
|
+
this._aMDCCharts = [];
|
|
45
|
+
this._isSearchPending = false;
|
|
46
|
+
this._isDataReceived = undefined;
|
|
47
|
+
}
|
|
48
|
+
// //////////////////////////////////////////////////
|
|
49
|
+
// Callback when data is received on a binding.
|
|
50
|
+
protected onDataReceived(oEvent: Event, params: { triggeredBySearch: boolean }): void {
|
|
51
|
+
// Look for the corresponding binding registration
|
|
52
|
+
const binding = oEvent.getSource() as Binding;
|
|
53
|
+
const bindingRegistration = this._aBindingRegistrations.find((reg) => {
|
|
54
|
+
return reg.binding === binding;
|
|
55
|
+
});
|
|
56
|
+
if (!bindingRegistration) {
|
|
57
|
+
Log.error("PageReady - data received on an unregistered binding");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
switch ((binding as any).getGroupId()) {
|
|
61
|
+
case "$auto.Workers":
|
|
62
|
+
this._oEventProvider.fireEvent("workersBatchReceived");
|
|
63
|
+
break;
|
|
64
|
+
case "$auto.Heroes":
|
|
65
|
+
this._oEventProvider.fireEvent("heroesBatchReceived");
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
}
|
|
69
|
+
bindingRegistration.receivedCount++;
|
|
70
|
+
if (bindingRegistration.receivedCount < bindingRegistration.requestedCount) {
|
|
71
|
+
// There are other request pending --> resubscribe to wait until they return
|
|
72
|
+
binding.attachEventOnce("dataReceived", { triggeredBySearch: params.triggeredBySearch }, this.onDataReceived, this);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Check if at least one binding has requested data, and all bindings that have requested data have received it
|
|
76
|
+
const bAllDone =
|
|
77
|
+
this._aBindingRegistrations.some((reg) => {
|
|
78
|
+
return reg.requestedCount !== 0;
|
|
79
|
+
}) &&
|
|
80
|
+
this._aBindingRegistrations.every((reg) => {
|
|
81
|
+
return reg.requestedCount === 0 || reg.receivedCount >= reg.requestedCount;
|
|
82
|
+
});
|
|
83
|
+
if (params.triggeredBySearch || bindingRegistration.receivedCount >= bindingRegistration.requestedCount) {
|
|
84
|
+
this._isSearchPending = false;
|
|
85
|
+
}
|
|
86
|
+
if (bAllDone) {
|
|
87
|
+
this._isDataReceived = true;
|
|
88
|
+
this._fnOnFinished();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// //////////////////////////////////////////////////
|
|
92
|
+
// Callback when data is requested on a binding.
|
|
93
|
+
protected onDataRequested(oEvent: Event, params: { triggeredBySearch: boolean }): void {
|
|
94
|
+
// Look for the corresponding binding registration
|
|
95
|
+
const binding = oEvent.getSource() as Binding;
|
|
96
|
+
const bindingRegistration = this._aBindingRegistrations.find((reg) => {
|
|
97
|
+
return reg.binding === binding;
|
|
98
|
+
});
|
|
99
|
+
if (!bindingRegistration) {
|
|
100
|
+
Log.error("PageReady - data requested on an unregistered binding");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
bindingRegistration.requestedCount++;
|
|
104
|
+
this._isDataReceived = false;
|
|
105
|
+
if (bindingRegistration.requestedCount - bindingRegistration.receivedCount === 1) {
|
|
106
|
+
// Listen to dataReceived only if there's no other request pending
|
|
107
|
+
// Otherwise the 'dataReceived' handler would be called several times when the first query returns
|
|
108
|
+
// and we wouldn't wait for all queries to be finished
|
|
109
|
+
// (we will resubscribe to the dataReceived event in onDataReceived if necessary)
|
|
110
|
+
binding.attachEventOnce("dataReceived", { triggeredBySearch: params.triggeredBySearch }, this.onDataReceived, this);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// //////////////////////////////////////////////////
|
|
114
|
+
// Callback when a search is triggered from a filterbar
|
|
115
|
+
protected onSearch(oEvent: Event): void {
|
|
116
|
+
const aMDCTableLinkedToFilterBar = this._aMDCTables.filter((oTable) => {
|
|
117
|
+
return (
|
|
118
|
+
(oEvent.getSource() as any).sId === oTable.getFilter() &&
|
|
119
|
+
oTable.getVisible() &&
|
|
120
|
+
!oTable.getParent()?.getProperty("bindingSuspended")
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
const aMDCChartsLinkedToFilterBar = this._aMDCCharts.filter((oChart) => {
|
|
124
|
+
return (oEvent.getSource() as any).sId === oChart.getFilter() && oChart.getVisible();
|
|
125
|
+
});
|
|
126
|
+
if (aMDCTableLinkedToFilterBar.length > 0 || aMDCChartsLinkedToFilterBar.length > 0) {
|
|
127
|
+
this._isSearchPending = true;
|
|
128
|
+
}
|
|
129
|
+
aMDCTableLinkedToFilterBar.forEach((oTable) => {
|
|
130
|
+
this.registerTable(oTable, true);
|
|
131
|
+
});
|
|
132
|
+
aMDCChartsLinkedToFilterBar.forEach(async (oChart: any) => {
|
|
133
|
+
try {
|
|
134
|
+
if (oChart.innerChartBoundPromise) {
|
|
135
|
+
await oChart.innerChartBoundPromise;
|
|
136
|
+
}
|
|
137
|
+
this.registerChart(oChart, true);
|
|
138
|
+
} catch (oError: any) {
|
|
139
|
+
Log.error("Cannot find a inner bound chart", oError);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// //////////////////////////////////////////////////
|
|
144
|
+
// Register a binding (with an optional table/chart)
|
|
145
|
+
// and attach callbacks on dateRequested/dataReceived events
|
|
146
|
+
public register(_event: Event | null, data: { binding?: Binding; table?: Table; chart?: Chart; triggeredBySearch: boolean }): void {
|
|
147
|
+
const binding: Binding | undefined =
|
|
148
|
+
data.binding ||
|
|
149
|
+
data.table?.getRowBinding() ||
|
|
150
|
+
(data.chart as any)?.getControlDelegate().getInnerChart(data.chart).getBinding("data");
|
|
151
|
+
const boundControl = (data.table || data.chart) as Control | undefined;
|
|
152
|
+
if (!binding) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// Check if the binding is already registered
|
|
156
|
+
let bindingRegistration = this._aBindingRegistrations.find((reg) => {
|
|
157
|
+
return reg.binding === binding;
|
|
158
|
+
});
|
|
159
|
+
if (bindingRegistration) {
|
|
160
|
+
if (boundControl) {
|
|
161
|
+
// The binding was already registerd without boundControl information --> update boundControl
|
|
162
|
+
bindingRegistration.boundControl = boundControl;
|
|
163
|
+
}
|
|
164
|
+
// This binding has already requested data, but we're registering it again (on search) --> attach to dataRequested again
|
|
165
|
+
if (bindingRegistration.requestedCount > 0) {
|
|
166
|
+
binding.detachEvent("dataRequested", this.onDataRequested, this);
|
|
167
|
+
binding.attachEventOnce("dataRequested", { triggeredBySearch: data.triggeredBySearch }, this.onDataRequested, this);
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (boundControl) {
|
|
172
|
+
// Check if there's a different binding registered for the bound control
|
|
173
|
+
bindingRegistration = this._aBindingRegistrations.find((reg) => {
|
|
174
|
+
return reg.boundControl === boundControl;
|
|
175
|
+
});
|
|
176
|
+
if (bindingRegistration && bindingRegistration.binding !== binding) {
|
|
177
|
+
// The control had a different binding. This can happen in case of MDC charts who recreated their binding after search
|
|
178
|
+
// The previous binding is destroyed, we can replace it with the new and reset counters
|
|
179
|
+
bindingRegistration.binding = binding;
|
|
180
|
+
bindingRegistration.requestedCount = 0;
|
|
181
|
+
bindingRegistration.receivedCount = 0;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!bindingRegistration) {
|
|
185
|
+
bindingRegistration = {
|
|
186
|
+
binding: binding,
|
|
187
|
+
boundControl: boundControl,
|
|
188
|
+
requestedCount: 0,
|
|
189
|
+
receivedCount: 0
|
|
190
|
+
};
|
|
191
|
+
this._aBindingRegistrations.push(bindingRegistration);
|
|
192
|
+
}
|
|
193
|
+
binding.detachEvent("dataRequested", this.onDataRequested, this);
|
|
194
|
+
binding.attachEventOnce("dataRequested", { triggeredBySearch: data.triggeredBySearch }, this.onDataRequested, this);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Registers a binding for watching its data events (dataRequested and dataReceived).
|
|
198
|
+
*
|
|
199
|
+
* @param binding The binding
|
|
200
|
+
*/
|
|
201
|
+
public registerBinding(binding: Binding) {
|
|
202
|
+
this.register(null, { binding, triggeredBySearch: false });
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Registers an MDCTable for watching the data events on its row binding (dataRequested and dataReceived).
|
|
206
|
+
*
|
|
207
|
+
* @param table The table
|
|
208
|
+
* @param triggeredBySearch True if this registration is triggered by a filterBar search
|
|
209
|
+
*/
|
|
210
|
+
protected registerTable(table: Table, triggeredBySearch = false) {
|
|
211
|
+
if (this._aMDCTables.indexOf(table) < 0) {
|
|
212
|
+
this._aMDCTables.push(table);
|
|
213
|
+
}
|
|
214
|
+
const oRowBinding = table.getRowBinding();
|
|
215
|
+
if (oRowBinding) {
|
|
216
|
+
this.register(null, { table, triggeredBySearch });
|
|
217
|
+
}
|
|
218
|
+
if (this._aOtherEventSources.indexOf(table) === -1) {
|
|
219
|
+
table.attachEvent("bindingUpdated", { table, triggeredBySearch }, this.register, this);
|
|
220
|
+
this._aOtherEventSources.push(table);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Registers an MDCChart for watching the data events on its inner data binding (dataRequested and dataReceived).
|
|
225
|
+
*
|
|
226
|
+
* @param chart The chart
|
|
227
|
+
* @param triggeredBySearch True if this registration is triggered by a filterBar search
|
|
228
|
+
*/
|
|
229
|
+
protected registerChart(chart: Chart, triggeredBySearch = false) {
|
|
230
|
+
if (this._aMDCCharts.indexOf(chart) < 0) {
|
|
231
|
+
this._aMDCCharts.push(chart);
|
|
232
|
+
}
|
|
233
|
+
const oInnerChart = (chart as any).getControlDelegate().getInnerChart(chart);
|
|
234
|
+
const binding = oInnerChart?.getBinding("data");
|
|
235
|
+
if (binding) {
|
|
236
|
+
this.register(null, { chart, triggeredBySearch });
|
|
237
|
+
}
|
|
238
|
+
if (this._aOtherEventSources.indexOf(chart) === -1) {
|
|
239
|
+
chart.attachEvent("bindingUpdated", { chart, triggeredBySearch }, this.register, this);
|
|
240
|
+
this._aOtherEventSources.push(chart);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Registers an MDCTable or MDCChart for watching the data events on its inner data binding (dataRequested and dataReceived).
|
|
245
|
+
*
|
|
246
|
+
* @param element The table or chart
|
|
247
|
+
*/
|
|
248
|
+
public async registerTableOrChart(element: Table | Chart): Promise<void> {
|
|
249
|
+
if (!element.isA("sap.ui.mdc.Table") && !element.isA("sap.ui.mdc.Chart")) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
await element.initialized(); // access binding only after table/chart is bound
|
|
254
|
+
if (element.isA("sap.ui.mdc.Table")) {
|
|
255
|
+
this.registerTable(element as Table);
|
|
256
|
+
} else {
|
|
257
|
+
this.registerChart(element as Chart);
|
|
258
|
+
}
|
|
259
|
+
} catch (oError: any) {
|
|
260
|
+
Log.error("PageReady - Cannot register a table or a chart", oError);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Registers an MDCFilterBar for watching its search event.
|
|
265
|
+
*
|
|
266
|
+
* @param filterBar The filter bar
|
|
267
|
+
*/
|
|
268
|
+
public registerFilterBar(filterBar: FilterBar) {
|
|
269
|
+
filterBar.attachEvent("search", this.onSearch, this);
|
|
270
|
+
this._aOtherEventSources.push(filterBar);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
export default DataQueryWatcher;
|
|
@@ -228,7 +228,7 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
|
|
|
228
228
|
// no default
|
|
229
229
|
}
|
|
230
230
|
} else {
|
|
231
|
-
var _property$annotations5, _property$annotations6, _property$annotations7, _property$annotations8, _property$annotations9, _property$annotations10, _property$Target, _property$Target$$tar, _property$annotations11, _property$annotations12, _property$annotations13, _property$annotations14, _property$annotations15
|
|
231
|
+
var _property$annotations5, _property$annotations6, _property$annotations7, _property$annotations8, _property$annotations9, _property$annotations10, _property$Target, _property$Target$$tar, _property$annotations11, _property$annotations12, _property$annotations13, _property$annotations14, _property$annotations15;
|
|
232
232
|
|
|
233
233
|
// Check for field containing Currency Or Unit Properties or Timezone
|
|
234
234
|
var currencyOrUoMProperty = getAssociatedCurrencyProperty(property) || getAssociatedUnitProperty(property);
|
|
@@ -273,11 +273,12 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
|
|
|
273
273
|
targetValue = (dataPointDefaultProperty.Target.$target.TargetValue || dataPointDefaultProperty.Target.$target.TargetValue.MaximumValue).toString();
|
|
274
274
|
|
|
275
275
|
_appendTemplate("{".concat(valueIndex, "}/").concat(targetValue));
|
|
276
|
-
} else if (
|
|
277
|
-
var _property$
|
|
276
|
+
} else if (property.$Type === "com.sap.vocabularies.Communication.v1.ContactType") {
|
|
277
|
+
var _property$fn, _property$fn2;
|
|
278
278
|
|
|
279
|
-
|
|
280
|
-
|
|
279
|
+
var contactProperty = (_property$fn = property.fn) === null || _property$fn === void 0 ? void 0 : _property$fn.$target;
|
|
280
|
+
var contactPropertyPath = (_property$fn2 = property.fn) === null || _property$fn2 === void 0 ? void 0 : _property$fn2.path;
|
|
281
|
+
valueIndex = _pushUnique(navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath, contactProperty);
|
|
281
282
|
|
|
282
283
|
_appendTemplate("{".concat(valueIndex, "}"));
|
|
283
284
|
} else if (!ignoreSelf) {
|
|
@@ -362,7 +363,8 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
|
|
|
362
363
|
break;
|
|
363
364
|
|
|
364
365
|
case "com.sap.vocabularies.Communication.v1.ContactType":
|
|
365
|
-
|
|
366
|
+
var dataFieldContact = dataField.Target.$target;
|
|
367
|
+
relatedProperties = collectRelatedProperties(dataField.Target.value, dataFieldContact, converterContext, false, tableType, relatedProperties, isEmbedded);
|
|
366
368
|
break;
|
|
367
369
|
|
|
368
370
|
default:
|
|
@@ -434,4 +436,4 @@ sap.ui.define(["sap/fe/core/templating/DisplayModeFormatter", "sap/fe/core/templ
|
|
|
434
436
|
_exports.getDataFieldDataType = getDataFieldDataType;
|
|
435
437
|
return _exports;
|
|
436
438
|
}, false);
|
|
437
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsIlZhbHVlIiwiJHRhcmdldCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIkNvbW1vbiIsIlNlbWFudGljT2JqZWN0IiwidW5kZWZpbmVkIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImlzUHJvcGVydHkiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsInRhcmdldCIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiX3R5cGUiLCJoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwicHJvcGVydGllcyIsImFkZFVuaXRJblRlbXBsYXRlIiwiX3B1c2hVbmlxdWUiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImtleXMiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5nc1RlbXBsYXRlIiwidGV4dEFubm90YXRpb24iLCJUZXh0IiwidmFsdWVJbmRleCIsInRhcmdldFZhbHVlIiwiY3VycmVuY3lPclVvTUluZGV4IiwidGltZXpvbmVPclVvTUluZGV4IiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsInZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkIiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsIm5hbWUiLCJleHBvcnRVbml0TmFtZSIsImV4cG9ydFRpbWV6b25lTmFtZSIsIlRhcmdldCIsIlZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsIlRhcmdldFZhbHVlIiwiTWF4aW11bVZhbHVlIiwidG9TdHJpbmciLCJEYXRhRmllbGREZWZhdWx0IiwiJFR5cGUiLCJkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkiLCJleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eSIsImZuIiwiZXhwb3J0VW5pdFN0cmluZyIsImV4cG9ydFRpbWV6b25lU3RyaW5nIiwibGVuZ3RoIiwiY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkiLCJpc0VtYmVkZGVkIiwiRGF0YSIsImZvckVhY2giLCJpbm5lckRhdGFGaWVsZCIsImdldERhdGFGaWVsZERhdGFUeXBlIiwib0RhdGFGaWVsZCIsInNEYXRhVHlwZSIsInR5cGUiLCJzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50XG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzVGVtcGxhdGU/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzV3JhcHBpbmc/OiBib29sZWFuO1xuXHRleHBvcnRTZXR0aW5nc0NvbnRhY3RQcm9wZXJ0eT86IHN0cmluZztcblx0dmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQ/OiBzdHJpbmc7XG5cdGV4cG9ydFVuaXROYW1lPzogc3RyaW5nO1xuXHRleHBvcnRVbml0U3RyaW5nPzogc3RyaW5nO1xuXHRleHBvcnRUaW1lem9uZU5hbWU/OiBzdHJpbmc7XG5cdGV4cG9ydFRpbWV6b25lU3RyaW5nPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RcIi5cbiAqIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IGhhcyBhbiBpbmxpbmUgYWN0aW9uIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkVHlwZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkVHlwZXMoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGdpdmVuIERhdGFGaWVsZCBoYXMgYSBzdGF0aWMgaGlkZGVuIGFubm90YXRpb24uXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBUaGUgRGF0YUZpZWxkIHRvIGNoZWNrXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgRGF0YUZpZWxkIG9yIHJlZmVyZW5jZWQgcHJvcGVydHkgaGFzIGEgc3RhdGljIEhpZGRlbiBhbm5vdGF0aW9uLCBmYWxzZSBlbHNlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRBbHdheXNIaWRkZW4oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0ZGF0YUZpZWxkLmFubm90YXRpb25zPy5VST8uSGlkZGVuPy52YWx1ZU9mKCkgPT09IHRydWUgfHxcblx0XHQoaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQpICYmIGRhdGFGaWVsZC5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4gPT09IHRydWUpXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgb2JqZWN0OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuXHRcdGlmIChpc0RhdGFGaWVsZFR5cGVzKG9iamVjdCkgJiYgb2JqZWN0LlZhbHVlPy4kdGFyZ2V0KSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG9iamVjdC5WYWx1ZT8uJHRhcmdldDtcblx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKHByb3BlcnR5Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNQcm9wZXJ0eShvYmplY3QpKSB7XG5cdFx0XHRpZiAob2JqZWN0Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgob2JqZWN0Py5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggZm9yIGEgcHJvcGVydHkgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1Byb3BlcnR5XG4gKiBAcmV0dXJucyBUaGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBGb3IgZS5nLiAvRW50aXR5VHlwZS9OYXZpZ2F0aW9uL1xuICovXG5mdW5jdGlvbiBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHBhdGguaW5kZXhPZihcIi9cIikgPiAtMSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3BlcnR5IG9yIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aFByZWZpeCBOYXZpZ2F0aW9uIHBhdGggcHJlZml4LCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUYWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdHRhcmdldDogUHJpbWl0aXZlVHlwZSxcblx0bmF2aWdhdGlvblBhdGhQcmVmaXg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb24gPSB0YXJnZXQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdFx0aWYgKGhpZGRlbkFubm90YXRpb24/LnBhdGggJiYgaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0Py5fdHlwZSA9PT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBoaWRkZW5Bbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHQvLyBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBhZGRlZCB0byBhZGRpdGlvbmFsUHJvcGVydGllcyBtYXAgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1toaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoXSA9IGhpZGRlbkFubm90YXRpb24uJHRhcmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSdzIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gcmVsYXRlZCBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFRydWUgaWYgdGhlIHVuaXQvY3VycmVuY3kgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaW4gdGhlIGV4cG9ydCB0ZW1wbGF0ZVxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpZ25vcmVTZWxmOiBib29sZWFuLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7IHByb3BlcnRpZXM6IHt9LCBhZGRpdGlvbmFsUHJvcGVydGllczoge30gfSxcblx0YWRkVW5pdEluVGVtcGxhdGU6IGJvb2xlYW4gPSBmYWxzZVxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdC8qKlxuXHQgKiBIZWxwZXIgdG8gcHVzaCB1bmlxdWUgcmVsYXRlZCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydGllcyBvYmplY3QgY29udGFpbmluZyB2YWx1ZSBwcm9wZXJ0eSwgZGVzY3JpcHRpb24gcHJvcGVydHkuLi5cblx0ICogQHJldHVybnMgSW5kZXggYXQgd2hpY2ggdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZVxuXHQgKi9cblx0ZnVuY3Rpb24gX3B1c2hVbmlxdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBQcm9wZXJ0eSk6IG51bWJlciB7XG5cdFx0aWYgKCFyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuXHRcdH1cblx0XHRyZXR1cm4gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykuaW5kZXhPZihrZXkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlbHBlciB0byBhcHBlbmQgdGhlIGV4cG9ydCBzZXR0aW5ncyB0ZW1wbGF0ZSB3aXRoIGEgZm9ybWF0dGVkIHRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuXHQgKi9cblx0ZnVuY3Rpb24gX2FwcGVuZFRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1RlbXBsYXRlID0gcmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NUZW1wbGF0ZVxuXHRcdFx0PyBgJHtyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1RlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdFx0OiBgJHt2YWx1ZX1gO1xuXHR9XG5cblx0aWYgKHBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblxuXHRcdC8vIENoZWNrIGZvciBUZXh0IGFubm90YXRpb24uXG5cdFx0Y29uc3QgdGV4dEFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UZXh0O1xuXHRcdGxldCB2YWx1ZUluZGV4OiBudW1iZXI7XG5cdFx0bGV0IHRhcmdldFZhbHVlOiBzdHJpbmc7XG5cdFx0bGV0IGN1cnJlbmN5T3JVb01JbmRleDogbnVtYmVyO1xuXHRcdGxldCB0aW1lem9uZU9yVW9NSW5kZXg6IG51bWJlcjtcblxuXHRcdGlmIChyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1RlbXBsYXRlKSB7XG5cdFx0XHQvLyBGaWVsZEdyb3VwIHVzZS1jYXNlLiBOZWVkIHRvIGFkZCBlYWNoIEZpZWxkIGluIG5ldyBsaW5lLlxuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKFwiXFxuXCIpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3NXcmFwcGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRleHRBbm5vdGF0aW9uPy5wYXRoICYmIHRleHRBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgVGV4dCBBcnJhbmdlbWVudC5cblx0XHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRcdGNvbnN0IHRleHRBbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0ZXh0QW5ub3RhdGlvbi5wYXRoO1xuXHRcdFx0Y29uc3QgZGlzcGxheU1vZGUgPSBnZXREaXNwbGF5TW9kZShwcm9wZXJ0eSwgZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0XHRsZXQgZGVzY3JpcHRpb25JbmRleDogbnVtYmVyO1xuXHRcdFx0c3dpdGNoIChkaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjYXNlIFwiVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0Ly8gS2VlcCB2YWx1ZSB3aGVuIGV4cG9ydGluZyAoc3BsaXQgbW9kZSkgb24gdGV4dCBBcnJhbmdlbWVudCBkZWZpbmVkIGFzICNUZXh0T25seSAoT25seSB2YWx1ZXMgYXJlIGV4cGVjdGVkIG9uIHBhc3RlIGZyb20gRXhjZWwgZnVuY3Rpb25hbGl0eSlcblx0XHRcdFx0XHRfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9wdXNoVW5pcXVlKHRleHRBbm5vdGF0aW9uUHJvcGVydHlQYXRoLCB0ZXh0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkID0gcGF0aDtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVmFsdWVEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9wdXNoVW5pcXVlKHRleHRBbm5vdGF0aW9uUHJvcGVydHlQYXRoLCB0ZXh0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fSAoeyR7ZGVzY3JpcHRpb25JbmRleH19KWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7ZGVzY3JpcHRpb25JbmRleH19ICh7JHt2YWx1ZUluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdC8vIG5vIGRlZmF1bHRcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIGZpZWxkIGNvbnRhaW5pbmcgQ3VycmVuY3kgT3IgVW5pdCBQcm9wZXJ0aWVzIG9yIFRpbWV6b25lXG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW9NUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24gPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSB8fCBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5Vbml0O1xuXHRcdFx0Y29uc3QgdGltZXpvbmVQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRUaW1lem9uZVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHRpbWV6b25lQW5ub3RhdGlvbiA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5UaW1lem9uZTtcblxuXHRcdFx0aWYgKGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSAmJiBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Y3VycmVuY3lPclVvTUluZGV4ID0gX3B1c2hVbmlxdWUoY3VycmVuY3lPclVvTVByb3BlcnR5Lm5hbWUsIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VW5pdE5hbWUgPSBjdXJyZW5jeU9yVW9NUHJvcGVydHkubmFtZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh0aW1lem9uZVByb3BlcnR5ICYmIHRpbWV6b25lQW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHR0aW1lem9uZU9yVW9NSW5kZXggPSBfcHVzaFVuaXF1ZSh0aW1lem9uZVByb3BlcnR5Lm5hbWUsIHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0KTtcblx0XHRcdFx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0gIHske3RpbWV6b25lT3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0VGltZXpvbmVOYW1lID0gdGltZXpvbmVQcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uVmlzdWFsaXphdGlvbikge1xuXHRcdFx0XHRjb25zdCBkYXRhUG9pbnRQcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSA9IHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LlZhbHVlLiR0YXJnZXQ7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBkYXRhUG9pbnRQcm9wZXJ0eSk7XG5cdFx0XHRcdC8vIE5ldyBmYWtlIHByb3BlcnR5IGNyZWF0ZWQgZm9yIHRoZSBSYXRpbmcvUHJvZ3Jlc3MgVGFyZ2V0IFZhbHVlLiBJdCdsbCBiZSB1c2VkIGZvciB0aGUgZXhwb3J0IG9uIHNwbGl0IG1vZGUuXG5cdFx0XHRcdF9wdXNoVW5pcXVlKHByb3BlcnR5LlRhcmdldC52YWx1ZSwgcHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQpO1xuXHRcdFx0XHR0YXJnZXRWYWx1ZSA9IChwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5UYXJnZXRWYWx1ZSB8fCBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5NYXhpbXVtVmFsdWUpLnRvU3RyaW5nKCk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdD8uVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHQvLyBEYXRhUG9pbnQgdXNlLWNhc2UgdXNpbmcgRGF0YUZpZWxkRGVmYXVsdC5cblx0XHRcdFx0Y29uc3QgZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5OiBQcmltaXRpdmVUeXBlID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUkuRGF0YUZpZWxkRGVmYXVsdDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0Ly8gTmV3IGZha2UgcHJvcGVydHkgY3JlYXRlZCBmb3IgdGhlIFJhdGluZy9Qcm9ncmVzcyBUYXJnZXQgVmFsdWUuIEl0J2xsIGJlIHVzZWQgZm9yIHRoZSBleHBvcnQgb24gc3BsaXQgbW9kZS5cblx0XHRcdFx0X3B1c2hVbmlxdWUoZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5LlRhcmdldC52YWx1ZSwgcHJvcGVydHkpO1xuXHRcdFx0XHR0YXJnZXRWYWx1ZSA9IChcblx0XHRcdFx0XHRkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVGFyZ2V0VmFsdWUgfHwgZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LlRhcmdldFZhbHVlLk1heGltdW1WYWx1ZVxuXHRcdFx0XHQpLnRvU3RyaW5nKCk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbXVuaWNhdGlvbi52MS5Db250YWN0VHlwZVwiKSB7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzQ29udGFjdFByb3BlcnR5ID1cblx0XHRcdFx0XHRwcm9wZXJ0eS5UYXJnZXQudmFsdWUuc3Vic3RyaW5nKDAsIHByb3BlcnR5LlRhcmdldC52YWx1ZS5pbmRleE9mKFwiL1wiKSArIDEpICsgcHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuZm4/LnBhdGg7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5mbi4kdGFyZ2V0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRVbml0U3RyaW5nID0gYCR7Y3VycmVuY3lPclVuaXRBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgY3VycmVuY3kvdW5pdFxuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lQW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFRpbWV6b25lU3RyaW5nID0gYCR7dGltZXpvbmVBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgdGltZXpvbmVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShwcm9wZXJ0eSwgbmF2aWdhdGlvblBhdGhQcmVmaXgsIHRhYmxlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXMpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllcykubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eSBpZiBub3QgY29sbGVjdGVkIGFscmVhZHkuXG5cdFx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFyZSBtYWRlIGF2YWlsYWJsZSBvbmx5IHRvIGNvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCBwcm9wZXJ0aWVzIGNvbnN1bWVkIGJ5IGEgRGF0YUZpZWxkLlxuICogVGhpcyBpcyBmb3IgcG9wdWxhdGluZyB0aGUgQ29tcGxleFByb3BlcnR5SW5mb3Mgb2YgdGhlIHRhYmxlIGRlbGVnYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBmb3Igd2hpY2ggdGhlIHByb3BlcnRpZXMgbmVlZCB0byBiZSBpZGVudGlmaWVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBpc0VtYmVkZGVkIFRydWUgaWYgdGhlIERhdGFGaWVsZCBpcyBlbWJlZGRlZCBpbiBhbm90aGVyIGFubm90YXRpb24gKGUuZy4gRmllbGRHcm91cCkuXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7IHByb3BlcnRpZXM6IHt9LCBhZGRpdGlvbmFsUHJvcGVydGllczoge30gfSxcblx0aXNFbWJlZGRlZDogYm9vbGVhbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0c3dpdGNoIChkYXRhRmllbGQ/LiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGRhdGFGaWVsZC5WYWx1ZTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRwcm9wZXJ0eS4kdGFyZ2V0LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0aXNFbWJlZGRlZFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHByb3BlcnR5LnBhdGgpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4LFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0c3dpdGNoIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdFx0aW5uZXJEYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tdW5pY2F0aW9uLnYxLkNvbnRhY3RUeXBlXCI6XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRpc0VtYmVkZGVkXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RGF0YUZpZWxkRGF0YVR5cGUgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IFByb3BlcnR5KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0bGV0IHNEYXRhVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykuJFR5cGU7XG5cdHN3aXRjaCAoc0RhdGFUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y29uc3Qgc0RhdGFUeXBlRm9yRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldC4kVHlwZTtcblx0XHRcdGlmIChzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdGlmICgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSAoKChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldCBhcyBDb250YWN0KT8uZm4gYXMgYW55KS4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSkge1xuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHQoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kUGF0aD8uJFR5cGUgfHxcblx0XHRcdFx0XHRcdCgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50KT8uVmFsdWU/LiR0YXJnZXQudHlwZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBlLmcuIEZpZWxkR3JvdXAgb3IgQ2hhcnRcblx0XHRcdFx0XHQvLyBGaWVsZEdyb3VwIFByb3BlcnRpZXMgaGF2ZSBubyB0eXBlLCBzbyB3ZSBkZWZpbmUgaXQgYXMgYSBib29sZWFuIHR5cGUgdG8gcHJldmVudCBleGNlcHRpb25zIGR1cmluZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHdpZHRoXG5cdFx0XHRcdFx0c0RhdGFUeXBlID1cblx0XHRcdFx0XHRcdChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldC4kVHlwZSA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5DaGFydERlZmluaXRpb25UeXBlXCJcblx0XHRcdFx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0XHRcdFx0OiBcIkVkbS5Cb29sZWFuXCI7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNEYXRhVHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHR9XG5cblx0cmV0dXJuIHNEYXRhVHlwZTtcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBbUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU0EsNEJBQVQsQ0FBc0NDLFNBQXRDLEVBQXVIO0lBQzdILE9BQVFBLFNBQUQsQ0FBK0NDLGNBQS9DLENBQThELFFBQTlELENBQVA7RUFDQTtFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztFQUNPLFNBQVNDLGdCQUFULENBQTBCRixTQUExQixFQUEwRjtJQUNoRyxPQUFRQSxTQUFELENBQThCQyxjQUE5QixDQUE2QyxPQUE3QyxDQUFQO0VBQ0E7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7RUFDTyxTQUFTRSx1QkFBVCxDQUFpQ0gsU0FBakMsRUFBNkU7SUFBQTs7SUFDbkYsT0FDQywwQkFBQUEsU0FBUyxDQUFDSSxXQUFWLDBHQUF1QkMsRUFBdkIsNEdBQTJCQyxNQUEzQixrRkFBbUNDLE9BQW5DLFFBQWlELElBQWpELElBQ0NMLGdCQUFnQixDQUFDRixTQUFELENBQWhCLElBQStCLHFCQUFBQSxTQUFTLENBQUNRLEtBQVYsK0ZBQWlCQyxPQUFqQiwwR0FBMEJMLFdBQTFCLDRHQUF1Q0Ms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
|
|
439
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGRBbHdheXNIaWRkZW4iLCJhbm5vdGF0aW9ucyIsIlVJIiwiSGlkZGVuIiwidmFsdWVPZiIsIlZhbHVlIiwiJHRhcmdldCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJwcm9wZXJ0eSIsIkNvbW1vbiIsIlNlbWFudGljT2JqZWN0IiwidW5kZWZpbmVkIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImlzUHJvcGVydHkiLCJfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgiLCJwYXRoIiwiaW5kZXhPZiIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsInRhcmdldCIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiX3R5cGUiLCJoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMiLCJpZ25vcmVTZWxmIiwicHJvcGVydGllcyIsImFkZFVuaXRJblRlbXBsYXRlIiwiX3B1c2hVbmlxdWUiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImtleXMiLCJfYXBwZW5kVGVtcGxhdGUiLCJleHBvcnRTZXR0aW5nc1RlbXBsYXRlIiwidGV4dEFubm90YXRpb24iLCJUZXh0IiwidmFsdWVJbmRleCIsInRhcmdldFZhbHVlIiwiY3VycmVuY3lPclVvTUluZGV4IiwidGltZXpvbmVPclVvTUluZGV4IiwiZXhwb3J0U2V0dGluZ3NXcmFwcGluZyIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwidGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgiLCJkaXNwbGF5TW9kZSIsImdldERpc3BsYXlNb2RlIiwiZGVzY3JpcHRpb25JbmRleCIsInZpc3VhbFNldHRpbmdzVG9CZUV4Y2x1ZGVkIiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsIm5hbWUiLCJleHBvcnRVbml0TmFtZSIsImV4cG9ydFRpbWV6b25lTmFtZSIsIlRhcmdldCIsIlZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsIlRhcmdldFZhbHVlIiwiTWF4aW11bVZhbHVlIiwidG9TdHJpbmciLCJEYXRhRmllbGREZWZhdWx0IiwiJFR5cGUiLCJkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkiLCJjb250YWN0UHJvcGVydHkiLCJmbiIsImNvbnRhY3RQcm9wZXJ0eVBhdGgiLCJleHBvcnRVbml0U3RyaW5nIiwiZXhwb3J0VGltZXpvbmVTdHJpbmciLCJsZW5ndGgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRW1iZWRkZWQiLCJEYXRhIiwiZm9yRWFjaCIsImlubmVyRGF0YUZpZWxkIiwiZGF0YUZpZWxkQ29udGFjdCIsImdldERhdGFGaWVsZERhdGFUeXBlIiwib0RhdGFGaWVsZCIsInNEYXRhVHlwZSIsInR5cGUiLCJzRGF0YVR5cGVGb3JEYXRhRmllbGRGb3JBbm5vdGF0aW9uIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRUeXBlcyxcblx0RGF0YVBvaW50XG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9VSVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aXNQcm9wZXJ0eVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwiLi4vQ29udmVydGVyQ29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzVGVtcGxhdGU/OiBzdHJpbmc7XG5cdGV4cG9ydFNldHRpbmdzV3JhcHBpbmc/OiBib29sZWFuO1xuXHR2aXN1YWxTZXR0aW5nc1RvQmVFeGNsdWRlZD86IHN0cmluZztcblx0ZXhwb3J0VW5pdE5hbWU/OiBzdHJpbmc7XG5cdGV4cG9ydFVuaXRTdHJpbmc/OiBzdHJpbmc7XG5cdGV4cG9ydFRpbWV6b25lTmFtZT86IHN0cmluZztcblx0ZXhwb3J0VGltZXpvbmVTdHJpbmc/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFwiLlxuICogRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QgaGFzIGFuIGlubGluZSBhY3Rpb24gZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdChkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcyB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMpLmhhc093blByb3BlcnR5KFwiQWN0aW9uXCIpO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkVHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgZ2l2ZW4gRGF0YUZpZWxkIGhhcyBhIHN0YXRpYyBoaWRkZW4gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBEYXRhRmllbGQgb3IgcmVmZXJlbmNlZCBwcm9wZXJ0eSBoYXMgYSBzdGF0aWMgSGlkZGVuIGFubm90YXRpb24sIGZhbHNlIGVsc2VcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEFsd2F5c0hpZGRlbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRkYXRhRmllbGQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW4/LnZhbHVlT2YoKSA9PT0gdHJ1ZSB8fFxuXHRcdChpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZCkgJiYgZGF0YUZpZWxkLlZhbHVlPy4kdGFyZ2V0Py5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbiA9PT0gdHJ1ZSlcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCBvYmplY3Q6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0aWYgKGlzRGF0YUZpZWxkVHlwZXMob2JqZWN0KSAmJiBvYmplY3QuVmFsdWU/LiR0YXJnZXQpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gb2JqZWN0LlZhbHVlPy4kdGFyZ2V0O1xuXHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHk/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1Byb3BlcnR5KG9iamVjdCkpIHtcblx0XHRcdGlmIChvYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChvYmplY3Q/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBmb3IgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSA6IFwiXCI7XG59XG5cbi8qKlxuICogQ29sbGVjdCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG4gKlxuICogRm9yIGUuZy4gSWYgVUkuSGlkZGVuIHBvaW50cyB0byBhIHByb3BlcnR5LCBpbmNsdWRlIHRoaXMgcHJvcGVydHkgaW4gdGhlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG9mIENvbXBsZXhQcm9wZXJ0eUluZm8gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgUHJvcGVydHkgb3IgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIG5hdmlnYXRpb25QYXRoUHJlZml4IE5hdmlnYXRpb24gcGF0aCBwcmVmaXgsIGFwcGxpY2FibGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0dGFyZ2V0OiBQcmltaXRpdmVUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aFByZWZpeDogc3RyaW5nLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvbiA9IHRhcmdldC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbjtcblx0XHRpZiAoaGlkZGVuQW5ub3RhdGlvbj8ucGF0aCAmJiBoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQ/Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGhpZGRlbkFubm90YXRpb24ucGF0aDtcblx0XHRcdC8vIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGFkZGVkIHRvIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG1hcCBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2hpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGhdID0gaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5J3MgYW5ub3RhdGlvbnMuXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZFxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0XG4gKiBAcGFyYW0gaWdub3JlU2VsZiBXaGV0aGVyIHRvIGV4Y2x1ZGUgdGhlIHNhbWUgcHJvcGVydHkgZnJvbSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgVHJ1ZSBpZiB0aGUgdW5pdC9jdXJyZW5jeSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgZXhwb3J0IHRlbXBsYXRlXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdHBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHsgcHJvcGVydGllczoge30sIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSB9LFxuXHRhZGRVbml0SW5UZW1wbGF0ZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0LyoqXG5cdCAqIEhlbHBlciB0byBwdXNoIHVuaXF1ZSByZWxhdGVkIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHZhbHVlIFRoZSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nIHZhbHVlIHByb3BlcnR5LCBkZXNjcmlwdGlvbiBwcm9wZXJ0eS4uLlxuXHQgKiBAcmV0dXJucyBJbmRleCBhdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlXG5cdCAqL1xuXHRmdW5jdGlvbiBfcHVzaFVuaXF1ZShrZXk6IHN0cmluZywgdmFsdWU6IFByb3BlcnR5KTogbnVtYmVyIHtcblx0XHRpZiAoIXJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldID0gdmFsdWU7XG5cdFx0fVxuXHRcdHJldHVybiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5pbmRleE9mKGtleSk7XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIHRvIGFwcGVuZCB0aGUgZXhwb3J0IHNldHRpbmdzIHRlbXBsYXRlIHdpdGggYSBmb3JtYXR0ZWQgdGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHZhbHVlIEZvcm1hdHRlZCB0ZXh0XG5cdCAqL1xuXHRmdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUodmFsdWU6IHN0cmluZykge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1RlbXBsYXRlXG5cdFx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGV9JHt2YWx1ZX1gXG5cdFx0XHQ6IGAke3ZhbHVlfWA7XG5cdH1cblxuXHRpZiAocGF0aCAmJiBwcm9wZXJ0eSkge1xuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIFRleHQgYW5ub3RhdGlvbi5cblx0XHRjb25zdCB0ZXh0QW5ub3RhdGlvbiA9IHByb3BlcnR5LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ7XG5cdFx0bGV0IHZhbHVlSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgdGFyZ2V0VmFsdWU6IHN0cmluZztcblx0XHRsZXQgY3VycmVuY3lPclVvTUluZGV4OiBudW1iZXI7XG5cdFx0bGV0IHRpbWV6b25lT3JVb01JbmRleDogbnVtYmVyO1xuXG5cdFx0aWYgKHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzVGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUoXCJcXG5cIik7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5nc1dyYXBwaW5nID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGV4dEFubm90YXRpb24/LnBhdGggJiYgdGV4dEFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdC8vIENoZWNrIGZvciBUZXh0IEFycmFuZ2VtZW50LlxuXHRcdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdFx0Y29uc3QgdGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRleHRBbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5LCBkYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHQvLyBLZWVwIHZhbHVlIHdoZW4gZXhwb3J0aW5nIChzcGxpdCBtb2RlKSBvbiB0ZXh0IEFycmFuZ2VtZW50IGRlZmluZWQgYXMgI1RleHRPbmx5IChPbmx5IHZhbHVlcyBhcmUgZXhwZWN0ZWQgb24gcGFzdGUgZnJvbSBFeGNlbCBmdW5jdGlvbmFsaXR5KVxuXHRcdFx0XHRcdF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7ZGVzY3JpcHRpb25JbmRleH19YCk7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMudmlzdWFsU2V0dGluZ3NUb0JlRXhjbHVkZWQgPSBwYXRoO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3B1c2hVbmlxdWUodGV4dEFubm90YXRpb25Qcm9wZXJ0eVBhdGgsIHRleHRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfcHVzaFVuaXF1ZSh0ZXh0QW5ub3RhdGlvblByb3BlcnR5UGF0aCwgdGV4dEFubm90YXRpb24uJHRhcmdldCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Ly8gbm8gZGVmYXVsdFxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KSB8fCBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbiA9IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5ICYmIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbj8uJHRhcmdldCkge1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW5jeU9yVW9NSW5kZXggPSBfcHVzaFVuaXF1ZShjdXJyZW5jeU9yVW9NUHJvcGVydHkubmFtZSwgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fSAgeyR7Y3VycmVuY3lPclVvTUluZGV4fX1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRVbml0TmFtZSA9IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eS5uYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lUHJvcGVydHkgJiYgdGltZXpvbmVBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdHRpbWV6b25lT3JVb01JbmRleCA9IF9wdXNoVW5pcXVlKHRpbWV6b25lUHJvcGVydHkubmFtZSwgdGltZXpvbmVBbm5vdGF0aW9uLiR0YXJnZXQpO1xuXHRcdFx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUoYHske3ZhbHVlSW5kZXh9fSAgeyR7dGltZXpvbmVPclVvTUluZGV4fX1gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRUaW1lem9uZU5hbWUgPSB0aW1lem9uZVByb3BlcnR5Lm5hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WaXN1YWxpemF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFQb2ludFByb3BlcnR5OiBQcmltaXRpdmVUeXBlID0gcHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVmFsdWUuJHRhcmdldDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKHBhdGgsIGRhdGFQb2ludFByb3BlcnR5KTtcblx0XHRcdFx0Ly8gTmV3IGZha2UgcHJvcGVydHkgY3JlYXRlZCBmb3IgdGhlIFJhdGluZy9Qcm9ncmVzcyBUYXJnZXQgVmFsdWUuIEl0J2xsIGJlIHVzZWQgZm9yIHRoZSBleHBvcnQgb24gc3BsaXQgbW9kZS5cblx0XHRcdFx0X3B1c2hVbmlxdWUocHJvcGVydHkuVGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eS5UYXJnZXQuJHRhcmdldCk7XG5cdFx0XHRcdHRhcmdldFZhbHVlID0gKHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0LlRhcmdldFZhbHVlIHx8IHByb3BlcnR5LlRhcmdldC4kdGFyZ2V0Lk1heGltdW1WYWx1ZSkudG9TdHJpbmcoKTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0vJHt0YXJnZXRWYWx1ZX1gKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlKSB7XG5cdFx0XHRcdC8vIERhdGFQb2ludCB1c2UtY2FzZSB1c2luZyBEYXRhRmllbGREZWZhdWx0LlxuXHRcdFx0XHRjb25zdCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHk6IFByaW1pdGl2ZVR5cGUgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5VSS5EYXRhRmllbGREZWZhdWx0O1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHQvLyBOZXcgZmFrZSBwcm9wZXJ0eSBjcmVhdGVkIGZvciB0aGUgUmF0aW5nL1Byb2dyZXNzIFRhcmdldCBWYWx1ZS4gSXQnbGwgYmUgdXNlZCBmb3IgdGhlIGV4cG9ydCBvbiBzcGxpdCBtb2RlLlxuXHRcdFx0XHRfcHVzaFVuaXF1ZShkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdHRhcmdldFZhbHVlID0gKFxuXHRcdFx0XHRcdGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eS5UYXJnZXQuJHRhcmdldC5UYXJnZXRWYWx1ZSB8fCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkuVGFyZ2V0LiR0YXJnZXQuVGFyZ2V0VmFsdWUuTWF4aW11bVZhbHVlXG5cdFx0XHRcdCkudG9TdHJpbmcoKTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX0vJHt0YXJnZXRWYWx1ZX1gKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5ID0gcHJvcGVydHkuZm4/LiR0YXJnZXQ7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5mbj8ucGF0aDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9wdXNoVW5pcXVlKFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjb250YWN0UHJvcGVydHlQYXRoIDogY29udGFjdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRjb250YWN0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfcHVzaFVuaXF1ZShwYXRoLCBwcm9wZXJ0eSk7XG5cdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRVbml0U3RyaW5nID0gYCR7Y3VycmVuY3lPclVuaXRBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgY3VycmVuY3kvdW5pdFxuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lQW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFRpbWV6b25lU3RyaW5nID0gYCR7dGltZXpvbmVBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgdGltZXpvbmVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShwcm9wZXJ0eSwgbmF2aWdhdGlvblBhdGhQcmVmaXgsIHRhYmxlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXMpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllcykubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eSBpZiBub3QgY29sbGVjdGVkIGFscmVhZHkuXG5cdFx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFyZSBtYWRlIGF2YWlsYWJsZSBvbmx5IHRvIGNvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHR2YWx1ZUluZGV4ID0gX3B1c2hVbmlxdWUocGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogQ29sbGVjdCBwcm9wZXJ0aWVzIGNvbnN1bWVkIGJ5IGEgRGF0YUZpZWxkLlxuICogVGhpcyBpcyBmb3IgcG9wdWxhdGluZyB0aGUgQ29tcGxleFByb3BlcnR5SW5mb3Mgb2YgdGhlIHRhYmxlIGRlbGVnYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgVGhlIERhdGFGaWVsZCBmb3Igd2hpY2ggdGhlIHByb3BlcnRpZXMgbmVlZCB0byBiZSBpZGVudGlmaWVkLlxuICogQHBhcmFtIGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0LlxuICogQHBhcmFtIHRhYmxlVHlwZSBUaGUgdGFibGUgdHlwZS5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBpc0VtYmVkZGVkIFRydWUgaWYgdGhlIERhdGFGaWVsZCBpcyBlbWJlZGRlZCBpbiBhbm90aGVyIGFubm90YXRpb24gKGUuZy4gRmllbGRHcm91cCkuXG4gKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBEYXRhRmllbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7IHByb3BlcnRpZXM6IHt9LCBhZGRpdGlvbmFsUHJvcGVydGllczoge30gfSxcblx0aXNFbWJlZGRlZDogYm9vbGVhbiA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0c3dpdGNoIChkYXRhRmllbGQ/LiRUeXBlKSB7XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGQ6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoVXJsOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhBY3Rpb246XG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGRhdGFGaWVsZC5WYWx1ZTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRwcm9wZXJ0eS5wYXRoLFxuXHRcdFx0XHRwcm9wZXJ0eS4kdGFyZ2V0LFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0dGFibGVUeXBlLFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0aXNFbWJlZGRlZFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHByb3BlcnR5LnBhdGgpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4LFxuXHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjpcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uOlxuXHRcdFx0c3dpdGNoIChkYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlOlxuXHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQuJHRhcmdldC5EYXRhPy5mb3JFYWNoKChpbm5lckRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcykgPT4ge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdFx0aW5uZXJEYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlOlxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWRcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LnZhbHVlLFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkQ29udGFjdCxcblx0XHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGxldCBzRGF0YVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEFic3RyYWN0VHlwZXMpLiRUeXBlO1xuXHRzd2l0Y2ggKHNEYXRhVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhOYXZpZ2F0aW9uUGF0aDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdHNEYXRhVHlwZSA9IChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/LlZhbHVlPy4kdGFyZ2V0Py50eXBlO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb246XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGNvbnN0IHNEYXRhVHlwZUZvckRhdGFGaWVsZEZvckFubm90YXRpb24gPSAob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGU7XG5cdFx0XHRpZiAoc0RhdGFUeXBlRm9yRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikge1xuXHRcdFx0XHRpZiAoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlKSB7XG5cdFx0XHRcdFx0c0RhdGFUeXBlID0gKCgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgQ29udGFjdCk/LmZuIGFzIGFueSkuJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmICgob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPVxuXHRcdFx0XHRcdFx0KChvRGF0YUZpZWxkIGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnQpPy5WYWx1ZT8uJFBhdGg/LiRUeXBlIHx8XG5cdFx0XHRcdFx0XHQoKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbikuVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludCk/LlZhbHVlPy4kdGFyZ2V0LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHQob0RhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZVwiXG5cdFx0XHRcdFx0XHRcdD8gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHRcdDogXCJFZG0uQm9vbGVhblwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiBzRGF0YVR5cGU7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7OztFQWtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNBLDRCQUFULENBQXNDQyxTQUF0QyxFQUF1SDtJQUM3SCxPQUFRQSxTQUFELENBQStDQyxjQUEvQyxDQUE4RCxRQUE5RCxDQUFQO0VBQ0E7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7RUFDTyxTQUFTQyxnQkFBVCxDQUEwQkYsU0FBMUIsRUFBMEY7SUFDaEcsT0FBUUEsU0FBRCxDQUE4QkMsY0FBOUIsQ0FBNkMsT0FBN0MsQ0FBUDtFQUNBO0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0VBQ08sU0FBU0UsdUJBQVQsQ0FBaUNILFNBQWpDLEVBQTZFO0lBQUE7O0lBQ25GLE9BQ0MsMEJBQUFBLFNBQVMsQ0FBQ0ksV0FBViwwR0FBdUJDLEVBQXZCLDRHQUEyQkMsTUFBM0Isa0ZBQW1DQyxPQUFuQyxRQUFpRCxJQUFqRCxJQUNDTCxnQkFBZ0IsQ0FBQ0YsU0FBRCxDQUFoQixJQUErQixxQkFBQUEsU0FBUyxD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
|
|
@@ -25,7 +25,6 @@ export type ComplexPropertyInfo = {
|
|
|
25
25
|
additionalProperties: Record<string, Property>;
|
|
26
26
|
exportSettingsTemplate?: string;
|
|
27
27
|
exportSettingsWrapping?: boolean;
|
|
28
|
-
exportSettingsContactProperty?: string;
|
|
29
28
|
visualSettingsToBeExcluded?: string;
|
|
30
29
|
exportUnitName?: string;
|
|
31
30
|
exportUnitString?: string;
|
|
@@ -258,10 +257,13 @@ export function collectRelatedProperties(
|
|
|
258
257
|
dataPointDefaultProperty.Target.$target.TargetValue || dataPointDefaultProperty.Target.$target.TargetValue.MaximumValue
|
|
259
258
|
).toString();
|
|
260
259
|
_appendTemplate(`{${valueIndex}}/${targetValue}`);
|
|
261
|
-
} else if (property
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
valueIndex = _pushUnique(
|
|
260
|
+
} else if (property.$Type === CommunicationAnnotationTypes.ContactType) {
|
|
261
|
+
const contactProperty = property.fn?.$target;
|
|
262
|
+
const contactPropertyPath = property.fn?.path;
|
|
263
|
+
valueIndex = _pushUnique(
|
|
264
|
+
navigationPathPrefix ? navigationPathPrefix + contactPropertyPath : contactPropertyPath,
|
|
265
|
+
contactProperty
|
|
266
|
+
);
|
|
265
267
|
_appendTemplate(`{${valueIndex}}`);
|
|
266
268
|
} else if (!ignoreSelf) {
|
|
267
269
|
// Collect underlying property
|
|
@@ -360,10 +362,11 @@ export function collectRelatedPropertiesRecursively(
|
|
|
360
362
|
);
|
|
361
363
|
break;
|
|
362
364
|
|
|
363
|
-
case
|
|
365
|
+
case CommunicationAnnotationTypes.ContactType:
|
|
366
|
+
const dataFieldContact = dataField.Target.$target as Contact;
|
|
364
367
|
relatedProperties = collectRelatedProperties(
|
|
365
368
|
dataField.Target.value,
|
|
366
|
-
|
|
369
|
+
dataFieldContact,
|
|
367
370
|
converterContext,
|
|
368
371
|
false,
|
|
369
372
|
tableType,
|