@sapui5/sap.fe.base 1.125.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +38 -0
- package/README.md +15 -0
- package/package.json +12 -0
- package/src/sap/fe/base/.library +38 -0
- package/src/sap/fe/base/ClassSupport.js +590 -0
- package/src/sap/fe/base/ClassSupport.ts +714 -0
- package/src/sap/fe/base/jsx-runtime/Fragment.js +14 -0
- package/src/sap/fe/base/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/base/jsx-runtime/ViewLoader.js +93 -0
- package/src/sap/fe/base/jsx-runtime/ViewLoader.tsx +86 -0
- package/src/sap/fe/base/jsx-runtime/jsx-control.js +177 -0
- package/src/sap/fe/base/jsx-runtime/jsx-control.ts +197 -0
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.js +44 -0
- package/src/sap/fe/base/jsx-runtime/jsx-renderManager.ts +43 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.js +237 -0
- package/src/sap/fe/base/jsx-runtime/jsx-xml.ts +246 -0
- package/src/sap/fe/base/jsx-runtime/jsx.js +56 -0
- package/src/sap/fe/base/jsx-runtime/jsx.ts +91 -0
- package/src/sap/fe/base/jsx-runtime/jsxs.js +10 -0
- package/src/sap/fe/base/jsx-runtime/jsxs.ts +3 -0
- package/src/sap/fe/base/jsx-runtime.js +17 -0
- package/src/sap/fe/base/jsx-runtime.ts +8 -0
- package/src/sap/fe/base/library.js +31 -0
- package/src/sap/fe/base/library.ts +23 -0
- package/ui5.yaml +8 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2024 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util/uid", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata"], function (ObjectPath, merge, uid, Metadata, BaseObject, ControllerMetadata) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
const ensureMetadata = function (target) {
|
|
10
|
+
target.metadata = merge({
|
|
11
|
+
controllerExtensions: {},
|
|
12
|
+
properties: {},
|
|
13
|
+
aggregations: {},
|
|
14
|
+
references: {},
|
|
15
|
+
associations: {},
|
|
16
|
+
methods: {},
|
|
17
|
+
events: {},
|
|
18
|
+
interfaces: []
|
|
19
|
+
}, target.metadata ?? {});
|
|
20
|
+
return target.metadata;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Method that will find the correct API object based on the current control hierarchy.
|
|
25
|
+
*
|
|
26
|
+
* @param target
|
|
27
|
+
* @returns The proper getAPI function for this constructor
|
|
28
|
+
*/
|
|
29
|
+
function prepareGetAPIFunction(target) {
|
|
30
|
+
return function (oEvent) {
|
|
31
|
+
let apiFQN = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : target.getMetadata().getName();
|
|
32
|
+
let oSource = oEvent.getSource();
|
|
33
|
+
if (target._getAPIExtension) {
|
|
34
|
+
oSource = target._getAPIExtension(oSource) ?? oSource;
|
|
35
|
+
}
|
|
36
|
+
while (oSource && !oSource.isA(apiFQN) && oSource.getParent) {
|
|
37
|
+
if (this.isDependentBound) {
|
|
38
|
+
const oDependents = oSource.getDependents();
|
|
39
|
+
const hasCorrectDependent = oDependents.find(oDependent => oDependent.isA(apiFQN));
|
|
40
|
+
if (hasCorrectDependent) {
|
|
41
|
+
oSource = hasCorrectDependent;
|
|
42
|
+
} else {
|
|
43
|
+
oSource = oSource.getParent();
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
oSource = oSource.getParent();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!oSource || !oSource.isA(apiFQN)) {
|
|
50
|
+
const oSourceMap = this.instanceMap.get(this);
|
|
51
|
+
oSource = oSourceMap === null || oSourceMap === void 0 ? void 0 : oSourceMap[oSourceMap.length - 1];
|
|
52
|
+
}
|
|
53
|
+
let targetControl;
|
|
54
|
+
if (oSource && oSource.isA(apiFQN)) {
|
|
55
|
+
targetControl = oSource;
|
|
56
|
+
}
|
|
57
|
+
return targetControl;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Ensures that when an xmlEventHandler is defined, the `getAPI` function is properly assigned.
|
|
63
|
+
*
|
|
64
|
+
* @param target The class constructor that should hold the static functions
|
|
65
|
+
*/
|
|
66
|
+
const ensureGetAPI = function (target) {
|
|
67
|
+
if (!target.__apiRegistered) {
|
|
68
|
+
target.__apiRegistered = true;
|
|
69
|
+
target.instanceMap = new WeakMap();
|
|
70
|
+
target.registerInstance = function (_instance) {
|
|
71
|
+
if (!this.instanceMap.get(_instance.constructor)) {
|
|
72
|
+
this.instanceMap.set(_instance.constructor, []);
|
|
73
|
+
}
|
|
74
|
+
this.instanceMap.get(_instance.constructor).push(_instance);
|
|
75
|
+
};
|
|
76
|
+
target.getAPI = prepareGetAPIFunction(target);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/* #region CONTROLLER EXTENSIONS */
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Defines that the following method is an override for the method name with the same name in the specific controller extension or base implementation.
|
|
84
|
+
*
|
|
85
|
+
* @param extensionName The name of the extension that will be overridden
|
|
86
|
+
* @returns The decorated method
|
|
87
|
+
*/
|
|
88
|
+
function methodOverride(extensionName) {
|
|
89
|
+
return function (target, propertyKey) {
|
|
90
|
+
if (!target.override) {
|
|
91
|
+
target.override = {};
|
|
92
|
+
}
|
|
93
|
+
if (!target.overrides) {
|
|
94
|
+
target.overrides = {};
|
|
95
|
+
}
|
|
96
|
+
let currentTarget = target.overrides;
|
|
97
|
+
if (extensionName) {
|
|
98
|
+
if (!currentTarget.extension) {
|
|
99
|
+
currentTarget.extension = {};
|
|
100
|
+
}
|
|
101
|
+
if (!currentTarget.extension[extensionName]) {
|
|
102
|
+
currentTarget.extension[extensionName] = {};
|
|
103
|
+
}
|
|
104
|
+
currentTarget = currentTarget.extension[extensionName];
|
|
105
|
+
}
|
|
106
|
+
currentTarget[propertyKey.toString()] = target[propertyKey.toString()];
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
|
|
112
|
+
*
|
|
113
|
+
* @param overrideExecutionType The OverrideExecution defining when the override should run (Before / After / Instead)
|
|
114
|
+
* @returns The decorated method
|
|
115
|
+
*/
|
|
116
|
+
_exports.methodOverride = methodOverride;
|
|
117
|
+
function extensible(overrideExecutionType) {
|
|
118
|
+
return function (target, propertyKey) {
|
|
119
|
+
const metadata = ensureMetadata(target);
|
|
120
|
+
if (!metadata.methods[propertyKey.toString()]) {
|
|
121
|
+
metadata.methods[propertyKey.toString()] = {};
|
|
122
|
+
}
|
|
123
|
+
metadata.methods[propertyKey.toString()].overrideExecution = overrideExecutionType;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Defines that the method will be publicly available for controller extension usage.
|
|
129
|
+
*
|
|
130
|
+
* @returns The decorated method
|
|
131
|
+
*/
|
|
132
|
+
_exports.extensible = extensible;
|
|
133
|
+
function publicExtension() {
|
|
134
|
+
return function (target, propertyKey, descriptor) {
|
|
135
|
+
const metadata = ensureMetadata(target);
|
|
136
|
+
descriptor.enumerable = true;
|
|
137
|
+
if (!metadata.methods[propertyKey.toString()]) {
|
|
138
|
+
metadata.methods[propertyKey.toString()] = {};
|
|
139
|
+
}
|
|
140
|
+
metadata.methods[propertyKey.toString()].public = true;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Defines that the method will be only available for internal usage of the controller extension.
|
|
145
|
+
*
|
|
146
|
+
* @returns The decorated method
|
|
147
|
+
*/
|
|
148
|
+
_exports.publicExtension = publicExtension;
|
|
149
|
+
function privateExtension() {
|
|
150
|
+
return function (target, propertyKey, descriptor) {
|
|
151
|
+
const metadata = ensureMetadata(target);
|
|
152
|
+
descriptor.enumerable = true;
|
|
153
|
+
if (!metadata.methods[propertyKey.toString()]) {
|
|
154
|
+
metadata.methods[propertyKey.toString()] = {};
|
|
155
|
+
}
|
|
156
|
+
metadata.methods[propertyKey.toString()].public = false;
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Defines that the method cannot be further extended by other controller extension.
|
|
161
|
+
*
|
|
162
|
+
* @returns The decorated method
|
|
163
|
+
*/
|
|
164
|
+
_exports.privateExtension = privateExtension;
|
|
165
|
+
function finalExtension() {
|
|
166
|
+
return function (target, propertyKey, descriptor) {
|
|
167
|
+
const metadata = ensureMetadata(target);
|
|
168
|
+
descriptor.enumerable = true;
|
|
169
|
+
if (!metadata.methods[propertyKey.toString()]) {
|
|
170
|
+
metadata.methods[propertyKey.toString()] = {};
|
|
171
|
+
}
|
|
172
|
+
metadata.methods[propertyKey.toString()].final = true;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Defines that we are going to use instantiate a controller extension under the following variable name.
|
|
178
|
+
*
|
|
179
|
+
* @param extensionClass The controller extension that will be instantiated
|
|
180
|
+
* @returns The decorated property
|
|
181
|
+
*/
|
|
182
|
+
_exports.finalExtension = finalExtension;
|
|
183
|
+
function usingExtension(extensionClass) {
|
|
184
|
+
return function (target, propertyKey, propertyDescriptor) {
|
|
185
|
+
const metadata = ensureMetadata(target);
|
|
186
|
+
delete propertyDescriptor.initializer;
|
|
187
|
+
metadata.controllerExtensions[propertyKey.toString()] = extensionClass;
|
|
188
|
+
return propertyDescriptor;
|
|
189
|
+
}; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* #endregion */
|
|
193
|
+
|
|
194
|
+
/* #region CONTROL */
|
|
195
|
+
/**
|
|
196
|
+
* Indicates that the property shall be declared as an event on the control metadata.
|
|
197
|
+
*
|
|
198
|
+
* @returns The decorated property
|
|
199
|
+
*/
|
|
200
|
+
_exports.usingExtension = usingExtension;
|
|
201
|
+
function event() {
|
|
202
|
+
return function (target, eventKey) {
|
|
203
|
+
const metadata = ensureMetadata(target);
|
|
204
|
+
if (!metadata.events[eventKey.toString()]) {
|
|
205
|
+
metadata.events[eventKey.toString()] = {};
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Defines the following property in the control metatada.
|
|
212
|
+
*
|
|
213
|
+
* @param attributeDefinition The property definition
|
|
214
|
+
* @returns The decorated property.
|
|
215
|
+
*/
|
|
216
|
+
_exports.event = event;
|
|
217
|
+
function property(attributeDefinition) {
|
|
218
|
+
return function (target, propertyKey, propertyDescriptor) {
|
|
219
|
+
var _initializer, _ref;
|
|
220
|
+
const metadata = ensureMetadata(target);
|
|
221
|
+
if (attributeDefinition.bindable === undefined) {
|
|
222
|
+
attributeDefinition.bindable = true;
|
|
223
|
+
}
|
|
224
|
+
if (attributeDefinition.isBindingInfo === true) {
|
|
225
|
+
attributeDefinition.bindable = false;
|
|
226
|
+
attributeDefinition.group = "Data";
|
|
227
|
+
}
|
|
228
|
+
if (!metadata.properties[propertyKey]) {
|
|
229
|
+
metadata.properties[propertyKey] = attributeDefinition;
|
|
230
|
+
}
|
|
231
|
+
delete propertyDescriptor.writable;
|
|
232
|
+
attributeDefinition.defaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
|
|
233
|
+
delete propertyDescriptor.initializer;
|
|
234
|
+
return propertyDescriptor;
|
|
235
|
+
}; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Defines and configure the following aggregation in the control metatada.
|
|
240
|
+
*
|
|
241
|
+
* @param aggregationDefinition The aggregation definition
|
|
242
|
+
* @returns The decorated property.
|
|
243
|
+
*/
|
|
244
|
+
_exports.property = property;
|
|
245
|
+
function aggregation(aggregationDefinition) {
|
|
246
|
+
return function (target, propertyKey, propertyDescriptor) {
|
|
247
|
+
const metadata = ensureMetadata(target);
|
|
248
|
+
if (aggregationDefinition.multiple === undefined) {
|
|
249
|
+
// UI5 defaults this to true but this is just weird...
|
|
250
|
+
aggregationDefinition.multiple = false;
|
|
251
|
+
}
|
|
252
|
+
if (!metadata.aggregations[propertyKey]) {
|
|
253
|
+
metadata.aggregations[propertyKey] = aggregationDefinition;
|
|
254
|
+
}
|
|
255
|
+
if (aggregationDefinition.isDefault) {
|
|
256
|
+
metadata.defaultAggregation = propertyKey;
|
|
257
|
+
}
|
|
258
|
+
delete propertyDescriptor.writable;
|
|
259
|
+
delete propertyDescriptor.initializer;
|
|
260
|
+
return propertyDescriptor;
|
|
261
|
+
}; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Defines and configure the following association in the control metatada.
|
|
266
|
+
*
|
|
267
|
+
* @param ui5AssociationMetadata The definition of the association.
|
|
268
|
+
* @returns The decorated property
|
|
269
|
+
*/
|
|
270
|
+
_exports.aggregation = aggregation;
|
|
271
|
+
function association(ui5AssociationMetadata) {
|
|
272
|
+
return function (target, propertyKey, propertyDescriptor) {
|
|
273
|
+
const metadata = ensureMetadata(target);
|
|
274
|
+
if (!metadata.associations[propertyKey]) {
|
|
275
|
+
metadata.associations[propertyKey] = ui5AssociationMetadata;
|
|
276
|
+
}
|
|
277
|
+
delete propertyDescriptor.writable;
|
|
278
|
+
delete propertyDescriptor.initializer;
|
|
279
|
+
return propertyDescriptor;
|
|
280
|
+
}; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Defines in the metadata that this control implements a specific interface.
|
|
285
|
+
*
|
|
286
|
+
* @param interfaceName The name of the implemented interface
|
|
287
|
+
* @returns The decorated method
|
|
288
|
+
*/
|
|
289
|
+
_exports.association = association;
|
|
290
|
+
function implementInterface(interfaceName) {
|
|
291
|
+
return function (target) {
|
|
292
|
+
const metadata = ensureMetadata(target);
|
|
293
|
+
metadata.interfaces.push(interfaceName);
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Indicates that the following method should also be exposed statically so we can call it from XML.
|
|
299
|
+
*
|
|
300
|
+
* @returns The decorated method
|
|
301
|
+
*/
|
|
302
|
+
_exports.implementInterface = implementInterface;
|
|
303
|
+
function xmlEventHandler() {
|
|
304
|
+
return function (target, propertykey) {
|
|
305
|
+
const currentConstructor = target.constructor;
|
|
306
|
+
ensureGetAPI(currentConstructor);
|
|
307
|
+
currentConstructor[propertykey.toString()] = function () {
|
|
308
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
309
|
+
args[_key] = arguments[_key];
|
|
310
|
+
}
|
|
311
|
+
if (args && args.length) {
|
|
312
|
+
const currentTarget = currentConstructor.getAPI(args[0]);
|
|
313
|
+
currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget[propertykey.toString()](...args);
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
_exports.xmlEventHandler = xmlEventHandler;
|
|
319
|
+
/**
|
|
320
|
+
* Indicates that the following class should define a UI5 control of the specified name.
|
|
321
|
+
*
|
|
322
|
+
* @param sTarget The fully qualified name of the UI5 class
|
|
323
|
+
* @param metadataDefinition Inline metadata definition
|
|
324
|
+
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
325
|
+
* @returns A class decorator that will create a ui5 class
|
|
326
|
+
*/
|
|
327
|
+
function defineUI5Class(sTarget, metadataDefinition) {
|
|
328
|
+
let forceDefineCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
329
|
+
return function (constructor) {
|
|
330
|
+
if (!constructor.prototype.metadata) {
|
|
331
|
+
constructor.prototype.metadata = {};
|
|
332
|
+
}
|
|
333
|
+
if (metadataDefinition) {
|
|
334
|
+
for (const key in metadataDefinition) {
|
|
335
|
+
if (constructor.prototype.metadata[key]) {
|
|
336
|
+
if (Array.isArray(constructor.prototype.metadata[key])) {
|
|
337
|
+
constructor.prototype.metadata[key] = constructor.prototype.metadata[key].concat(metadataDefinition[key]);
|
|
338
|
+
} else {
|
|
339
|
+
constructor.prototype.metadata[key] = {
|
|
340
|
+
...constructor.prototype.metadata[key],
|
|
341
|
+
...metadataDefinition[key]
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
constructor.prototype.metadata[key] = metadataDefinition[key];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return registerUI5Metadata(constructor, sTarget, constructor.prototype, forceDefineCall);
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
_exports.defineUI5Class = defineUI5Class;
|
|
353
|
+
function createReference() {
|
|
354
|
+
return {
|
|
355
|
+
current: undefined,
|
|
356
|
+
setCurrent: function (oControlInstance) {
|
|
357
|
+
this.current = oControlInstance;
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Defines that the following object will hold a reference to a control through jsx templating.
|
|
363
|
+
*
|
|
364
|
+
* @returns The decorated property.
|
|
365
|
+
*/
|
|
366
|
+
_exports.createReference = createReference;
|
|
367
|
+
function defineReference() {
|
|
368
|
+
return function (target, propertyKey, propertyDescriptor) {
|
|
369
|
+
const metadata = ensureMetadata(target);
|
|
370
|
+
delete propertyDescriptor.writable;
|
|
371
|
+
delete propertyDescriptor.initializer;
|
|
372
|
+
if (BaseObject.isObjectA(target, "sap.ui.core.Control")) {
|
|
373
|
+
if (!metadata.references[propertyKey]) {
|
|
374
|
+
metadata.references[propertyKey] = true;
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
propertyDescriptor.initializer = createReference;
|
|
378
|
+
}
|
|
379
|
+
return propertyDescriptor;
|
|
380
|
+
}; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Internal heavy lifting that will take care of creating the class property for ui5 to use.
|
|
385
|
+
*
|
|
386
|
+
* @param clazz The class prototype
|
|
387
|
+
* @param name The name of the class to create
|
|
388
|
+
* @param inObj The metadata object
|
|
389
|
+
* @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
|
|
390
|
+
* @returns The metadata class
|
|
391
|
+
*/
|
|
392
|
+
_exports.defineReference = defineReference;
|
|
393
|
+
function registerUI5Metadata(clazz, name, inObj, forceDefineCall) {
|
|
394
|
+
var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata;
|
|
395
|
+
if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
|
|
396
|
+
Object.getOwnPropertyNames(inObj).forEach(objName => {
|
|
397
|
+
const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
|
|
398
|
+
if (descriptor && !descriptor.enumerable) {
|
|
399
|
+
descriptor.enumerable = true;
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
404
|
+
const obj = {};
|
|
405
|
+
obj.metadata = inObj.metadata || {};
|
|
406
|
+
obj.override = inObj.override;
|
|
407
|
+
obj.constructor = clazz;
|
|
408
|
+
obj.metadata.baseType = Object.getPrototypeOf(clazz.prototype).getMetadata().getName();
|
|
409
|
+
if ((clazz === null || clazz === void 0 ? void 0 : (_clazz$getMetadata2 = clazz.getMetadata()) === null || _clazz$getMetadata2 === void 0 ? void 0 : _clazz$getMetadata2.getStereotype()) === "control") {
|
|
410
|
+
const rendererDefinition = inObj.renderer || clazz.renderer || clazz.render;
|
|
411
|
+
obj.renderer = {
|
|
412
|
+
apiVersion: 2
|
|
413
|
+
};
|
|
414
|
+
if (typeof rendererDefinition === "function") {
|
|
415
|
+
obj.renderer.render = rendererDefinition;
|
|
416
|
+
} else if (rendererDefinition != undefined) {
|
|
417
|
+
obj.renderer = rendererDefinition;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
obj.metadata.interfaces = ((_inObj$metadata = inObj.metadata) === null || _inObj$metadata === void 0 ? void 0 : _inObj$metadata.interfaces) || ((_clazz$metadata = clazz.metadata) === null || _clazz$metadata === void 0 ? void 0 : _clazz$metadata.interfaces);
|
|
421
|
+
Object.keys(clazz.prototype).forEach(key => {
|
|
422
|
+
if (key !== "metadata") {
|
|
423
|
+
try {
|
|
424
|
+
obj[key] = clazz.prototype[key];
|
|
425
|
+
} catch (e) {
|
|
426
|
+
// Do nothing
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
|
|
431
|
+
for (const cExtName in obj.metadata.controllerExtensions) {
|
|
432
|
+
obj[cExtName] = obj.metadata.controllerExtensions[cExtName];
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
const output = clazz.extend(name, obj);
|
|
436
|
+
const fnInit = output.prototype.init;
|
|
437
|
+
output.prototype.init = function () {
|
|
438
|
+
var _this = this;
|
|
439
|
+
if (fnInit) {
|
|
440
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
441
|
+
args[_key2] = arguments[_key2];
|
|
442
|
+
}
|
|
443
|
+
fnInit.apply(this, args);
|
|
444
|
+
}
|
|
445
|
+
if (clazz.registerInstance) {
|
|
446
|
+
clazz.registerInstance(this);
|
|
447
|
+
}
|
|
448
|
+
this.metadata = obj.metadata;
|
|
449
|
+
if (obj.metadata.properties) {
|
|
450
|
+
const aPropertyKeys = Object.keys(obj.metadata.properties);
|
|
451
|
+
aPropertyKeys.forEach(propertyKey => {
|
|
452
|
+
const propertyDef = obj.metadata.properties[propertyKey];
|
|
453
|
+
if (propertyDef.isBindingInfo === true) {
|
|
454
|
+
this._bindingProperties ??= {};
|
|
455
|
+
Object.defineProperty(this, propertyKey, {
|
|
456
|
+
configurable: true,
|
|
457
|
+
set: v => {
|
|
458
|
+
this._bindingProperties[propertyKey] = v;
|
|
459
|
+
this.mProperties[propertyKey] = v;
|
|
460
|
+
return this;
|
|
461
|
+
},
|
|
462
|
+
get() {
|
|
463
|
+
const propValue = this._bindingProperties[propertyKey] ?? this.getProperty(propertyKey);
|
|
464
|
+
if (typeof propValue === "object") {
|
|
465
|
+
return {
|
|
466
|
+
...propValue
|
|
467
|
+
}; // Create shallow copy
|
|
468
|
+
} else {
|
|
469
|
+
return propValue;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
} else {
|
|
474
|
+
Object.defineProperty(this, propertyKey, {
|
|
475
|
+
configurable: true,
|
|
476
|
+
set: v => {
|
|
477
|
+
return this.setProperty(propertyKey, v);
|
|
478
|
+
},
|
|
479
|
+
get: () => {
|
|
480
|
+
return this.getProperty(propertyKey);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
if (propertyDef.defaultValue !== undefined) {
|
|
485
|
+
this._applyingSettings = true;
|
|
486
|
+
this[propertyKey] = propertyDef.defaultValue;
|
|
487
|
+
this._applyingSettings = false;
|
|
488
|
+
delete this._applyingSettings;
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
const aAggregationKeys = Object.keys(obj.metadata.aggregations);
|
|
492
|
+
aAggregationKeys.forEach(aggregationKey => {
|
|
493
|
+
Object.defineProperty(this, aggregationKey, {
|
|
494
|
+
configurable: true,
|
|
495
|
+
set: v => {
|
|
496
|
+
return this.setAggregation(aggregationKey, v);
|
|
497
|
+
},
|
|
498
|
+
get: () => {
|
|
499
|
+
const aggregationContent = this.getAggregation(aggregationKey);
|
|
500
|
+
if (obj.metadata.aggregations[aggregationKey].multiple) {
|
|
501
|
+
return aggregationContent || [];
|
|
502
|
+
} else {
|
|
503
|
+
return aggregationContent;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
const aAssociationKeys = Object.keys(obj.metadata.associations);
|
|
509
|
+
aAssociationKeys.forEach(associationKey => {
|
|
510
|
+
Object.defineProperty(this, associationKey, {
|
|
511
|
+
configurable: true,
|
|
512
|
+
set: v => {
|
|
513
|
+
return this.setAssociation(associationKey, v);
|
|
514
|
+
},
|
|
515
|
+
get: () => {
|
|
516
|
+
const aggregationContent = this.getAssociation(associationKey);
|
|
517
|
+
if (obj.metadata.associations[associationKey].multiple) {
|
|
518
|
+
return aggregationContent || [];
|
|
519
|
+
} else {
|
|
520
|
+
return aggregationContent;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
if (obj.metadata.references) {
|
|
527
|
+
const referenceProperties = Object.keys(obj.metadata.references);
|
|
528
|
+
referenceProperties.forEach(propertyKey => {
|
|
529
|
+
Object.defineProperty(this, propertyKey, {
|
|
530
|
+
configurable: true,
|
|
531
|
+
value: createReference()
|
|
532
|
+
});
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
if (obj.metadata.methods) {
|
|
536
|
+
for (const methodName in obj.metadata.methods) {
|
|
537
|
+
const methodDefinition = obj.metadata.methods[methodName];
|
|
538
|
+
if (methodDefinition.overrideExecution === "AfterAsync" || methodDefinition.overrideExecution === "BeforeAsync") {
|
|
539
|
+
if (!this.methodHolder) {
|
|
540
|
+
this.methodHolder = [];
|
|
541
|
+
}
|
|
542
|
+
this.methodHolder[methodName] = [this[methodName]];
|
|
543
|
+
Object.defineProperty(this, methodName, {
|
|
544
|
+
configurable: true,
|
|
545
|
+
set: v => {
|
|
546
|
+
return this.methodHolder[methodName].push(v);
|
|
547
|
+
},
|
|
548
|
+
get: () => {
|
|
549
|
+
return async function () {
|
|
550
|
+
const methodArrays = _this.methodHolder[methodName];
|
|
551
|
+
if (methodDefinition.overrideExecution === "BeforeAsync") {
|
|
552
|
+
methodArrays.reverse();
|
|
553
|
+
}
|
|
554
|
+
for (var _len3 = arguments.length, methodArgs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
|
555
|
+
methodArgs[_key3] = arguments[_key3];
|
|
556
|
+
}
|
|
557
|
+
for (const arg of methodArrays) {
|
|
558
|
+
await arg.apply(_this, methodArgs);
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
};
|
|
567
|
+
clazz.override = function (oExtension) {
|
|
568
|
+
const pol = {};
|
|
569
|
+
pol.constructor = function () {
|
|
570
|
+
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
571
|
+
args[_key4] = arguments[_key4];
|
|
572
|
+
}
|
|
573
|
+
return clazz.apply(this, args);
|
|
574
|
+
};
|
|
575
|
+
const oClass = Metadata.createClass(clazz, `anonymousExtension~${uid()}`, pol, ControllerMetadata);
|
|
576
|
+
oClass.getMetadata()._staticOverride = oExtension;
|
|
577
|
+
oClass.getMetadata()._override = clazz.getMetadata()._override;
|
|
578
|
+
return oClass;
|
|
579
|
+
};
|
|
580
|
+
ObjectPath.set(name, output);
|
|
581
|
+
if (forceDefineCall) {
|
|
582
|
+
sap.ui.define(output.getMetadata().getName().replaceAll(".", "/"), () => {
|
|
583
|
+
return output;
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
return output;
|
|
587
|
+
}
|
|
588
|
+
return _exports;
|
|
589
|
+
}, false);
|
|
590
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJsZW5ndGgiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJtZXRob2RPdmVycmlkZSIsImV4dGVuc2lvbk5hbWUiLCJwcm9wZXJ0eUtleSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uVHlwZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwicHVibGljRXh0ZW5zaW9uIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdWJsaWMiLCJwcml2YXRlRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJmaW5hbCIsInVzaW5nRXh0ZW5zaW9uIiwiZXh0ZW5zaW9uQ2xhc3MiLCJwcm9wZXJ0eURlc2NyaXB0b3IiLCJpbml0aWFsaXplciIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJiaW5kYWJsZSIsInVuZGVmaW5lZCIsImlzQmluZGluZ0luZm8iLCJncm91cCIsIndyaXRhYmxlIiwiZGVmYXVsdFZhbHVlIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJtdWx0aXBsZSIsImlzRGVmYXVsdCIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFzc29jaWF0aW9uIiwidWk1QXNzb2NpYXRpb25NZXRhZGF0YSIsImltcGxlbWVudEludGVyZmFjZSIsImludGVyZmFjZU5hbWUiLCJ4bWxFdmVudEhhbmRsZXIiLCJwcm9wZXJ0eWtleSIsImN1cnJlbnRDb25zdHJ1Y3RvciIsImFyZ3MiLCJkZWZpbmVVSTVDbGFzcyIsInNUYXJnZXQiLCJtZXRhZGF0YURlZmluaXRpb24iLCJmb3JjZURlZmluZUNhbGwiLCJwcm90b3R5cGUiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsImNsYXp6IiwibmFtZSIsImluT2JqIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJvYmpOYW1lIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib2JqIiwiYmFzZVR5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldFN0ZXJlb3R5cGUiLCJyZW5kZXJlckRlZmluaXRpb24iLCJyZW5kZXJlciIsInJlbmRlciIsImFwaVZlcnNpb24iLCJrZXlzIiwiZSIsImNFeHROYW1lIiwib3V0cHV0IiwiZXh0ZW5kIiwiZm5Jbml0IiwiaW5pdCIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmIiwiX2JpbmRpbmdQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJ2IiwibVByb3BlcnRpZXMiLCJwcm9wVmFsdWUiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ29udGVudCIsImdldEFnZ3JlZ2F0aW9uIiwiYUFzc29jaWF0aW9uS2V5cyIsImFzc29jaWF0aW9uS2V5Iiwic2V0QXNzb2NpYXRpb24iLCJnZXRBc3NvY2lhdGlvbiIsInJlZmVyZW5jZVByb3BlcnRpZXMiLCJ2YWx1ZSIsIm1ldGhvZE5hbWUiLCJtZXRob2REZWZpbml0aW9uIiwibWV0aG9kSG9sZGVyIiwibWV0aG9kQXJyYXlzIiwicmV2ZXJzZSIsIm1ldGhvZEFyZ3MiLCJhcmciLCJvRXh0ZW5zaW9uIiwicG9sIiwib0NsYXNzIiwiTWV0YWRhdGEiLCJjcmVhdGVDbGFzcyIsInVpZCIsIkNvbnRyb2xsZXJNZXRhZGF0YSIsIl9zdGF0aWNPdmVycmlkZSIsIl9vdmVycmlkZSIsIk9iamVjdFBhdGgiLCJzYXAiLCJ1aSIsImRlZmluZSIsInJlcGxhY2VBbGwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNsYXNzU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NZXRhZGF0YVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyAkQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQ29udHJvbGxlck1ldGFkYXRhIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlck1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5cbnR5cGUgT3ZlcnJpZGVEZWZpbml0aW9uID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xudHlwZSBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGVFeGVjdXRpb24/OiBPdmVycmlkZUV4ZWN1dGlvbjtcblx0cHVibGljPzogYm9vbGVhbjtcblx0ZmluYWw/OiBib29sZWFuO1xufTtcbnR5cGUgVUk1UHJvcGVydHlNZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRiaW5kYWJsZT86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGJ5VmFsdWU/OiBib29sZWFuO1xuXHRpc0JpbmRpbmdJbmZvPzogYm9vbGVhbjtcblx0ZXhwZWN0ZWRBbm5vdGF0aW9ucz86IHN0cmluZ1tdO1xuXHRleHBlY3RlZFR5cGVzPzogc3RyaW5nW107XG5cdGFsbG93ZWRWYWx1ZXM/OiBzdHJpbmdbXTtcbn07XG5leHBvcnQgdHlwZSBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGFsdFR5cGVzPzogc3RyaW5nW107XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblx0ZGVmYXVsdENsYXNzPzogdW5rbm93bjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUFzc29jaWF0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiA9IHtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xuXHRjb250cm9sbGVyRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdHlwZW9mIENvbnRyb2xsZXJFeHRlbnNpb24gfCBGdW5jdGlvbj47XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFVJNVByb3BlcnR5TWV0YWRhdGE+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGE+O1xuXHRyZWZlcmVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcblx0YXNzb2NpYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhPjtcblx0bWV0aG9kczogUmVjb3JkPHN0cmluZywgVUk1Q29udHJvbGxlck1ldGhvZERlZmluaXRpb24+O1xuXHRldmVudHM6IFJlY29yZDxzdHJpbmcsIHt9Pjtcblx0aW50ZXJmYWNlczogc3RyaW5nW107XG5cdGxpYnJhcnk/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG5cdGNvbmZpZz86IHtcblx0XHRmdWxsV2lkdGg/OiBib29sZWFuO1xuXHR9O1xuXHRtYW5pZmVzdD86IHN0cmluZyB8IHVua25vd247XG5cdHJldHVyblR5cGVzPzogc3RyaW5nW107XG5cdGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IHVua25vd247XG59O1xudHlwZSBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGU/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG92ZXJyaWRlcz86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVDb250cm9sRGVmaW5pdGlvbiA9IHtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRvdmVycmlkZT86IHVua25vd247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUFQSUNvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG5cdF9fYXBpUmVnaXN0ZXJlZDogYm9vbGVhbjtcbn0gJiB7XG5cdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFhNTEV2ZW50SG9sZGVyID0ge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG59O1xuXG50eXBlIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+ID0ge1xuXHQvLyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgVFMgY29tcGlsZXJcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGFydGlhbDxQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+Pj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQYXJ0aWFsPFBpY2s8VCwgSz4+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIENvbnZlcnRDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBLIGV4dGVuZHMgXCJtZXRhUGF0aFwiIHwgXCJjb250ZXh0UGF0aFwiID8gc3RyaW5nIDogVFtLXTtcbn07XG5leHBvcnQgdHlwZSBTdHJpY3RQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQaWNrPFQsIEs+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIFVJNUFjY2Vzc29yczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgZ2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBnZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICgpID0+IFRbUF07XG59O1xuZXhwb3J0IHR5cGUgVUk1U2V0dGVyczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgc2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBzZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICh2YWx1ZTogVFtQXSkgPT4gVDtcbn07XG5leHBvcnQgdHlwZSBFbmhhbmNlV2l0aFVJNTxUPiA9IHtcblx0bmV3IChwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG5cdG5ldyAoc0lkOiBzdHJpbmcsIHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcbn0gJiBUICZcblx0VUk1QWNjZXNzb3JzPFQ+ICZcblx0VUk1U2V0dGVyczxUPjtcblxuY29uc3QgZW5zdXJlTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiB7XG5cdHRhcmdldC5tZXRhZGF0YSA9IG1lcmdlKFxuXHRcdHtcblx0XHRcdGNvbnRyb2xsZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7fSxcblx0XHRcdHJlZmVyZW5jZXM6IHt9LFxuXHRcdFx0YXNzb2NpYXRpb25zOiB7fSxcblx0XHRcdG1ldGhvZHM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fSxcblx0XHRcdGludGVyZmFjZXM6IFtdXG5cdFx0fSxcblx0XHR0YXJnZXQubWV0YWRhdGEgPz8ge31cblx0KSBhcyBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZXR1cm4gdGFyZ2V0Lm1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdGhhdCB3aWxsIGZpbmQgdGhlIGNvcnJlY3QgQVBJIG9iamVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250cm9sIGhpZXJhcmNoeS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcmV0dXJucyBUaGUgcHJvcGVyIGdldEFQSSBmdW5jdGlvbiBmb3IgdGhpcyBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0OiBVSTVBUElDb250cm9sKSB7XG5cdHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIFVJNUFQSUNvbnRyb2w+KFxuXHRcdHRoaXM6IFVJNUFQSUNvbnRyb2wsXG5cdFx0b0V2ZW50OiBVSTVFdmVudCxcblx0XHRhcGlGUU46IHN0cmluZyA9IHRhcmdldC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKVxuXHQpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBNYW5hZ2VkT2JqZWN0IHwgbnVsbDtcblx0XHRpZiAodGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24pIHtcblx0XHRcdG9Tb3VyY2UgPSB0YXJnZXQuX2dldEFQSUV4dGVuc2lvbihvU291cmNlKSA/PyBvU291cmNlO1xuXHRcdH1cblx0XHR3aGlsZSAob1NvdXJjZSAmJiAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSAmJiBvU291cmNlLmdldFBhcmVudCkge1xuXHRcdFx0aWYgKHRoaXMuaXNEZXBlbmRlbnRCb3VuZCkge1xuXHRcdFx0XHRjb25zdCBvRGVwZW5kZW50cyA9IChvU291cmNlIGFzIENvbnRyb2wpLmdldERlcGVuZGVudHMoKTtcblx0XHRcdFx0Y29uc3QgaGFzQ29ycmVjdERlcGVuZGVudCA9IG9EZXBlbmRlbnRzLmZpbmQoKG9EZXBlbmRlbnQ6IFVJNUVsZW1lbnQpID0+IG9EZXBlbmRlbnQuaXNBKGFwaUZRTikpO1xuXHRcdFx0XHRpZiAoaGFzQ29ycmVjdERlcGVuZGVudCkge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBoYXNDb3JyZWN0RGVwZW5kZW50IGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghb1NvdXJjZSB8fCAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZU1hcCA9IHRoaXMuaW5zdGFuY2VNYXAuZ2V0KHRoaXMpIGFzIFRbXTtcblx0XHRcdG9Tb3VyY2UgPSBvU291cmNlTWFwPy5bb1NvdXJjZU1hcC5sZW5ndGggLSAxXTtcblx0XHR9XG5cdFx0bGV0IHRhcmdldENvbnRyb2w7XG5cdFx0aWYgKG9Tb3VyY2UgJiYgb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbCA9IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHJldHVybiB0YXJnZXRDb250cm9sO1xuXHR9O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB3aGVuIGFuIHhtbEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGUgYGdldEFQSWAgZnVuY3Rpb24gaXMgcHJvcGVybHkgYXNzaWduZWQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBzaG91bGQgaG9sZCB0aGUgc3RhdGljIGZ1bmN0aW9uc1xuICovXG5jb25zdCBlbnN1cmVHZXRBUEkgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVBUElDb250cm9sKTogdm9pZCB7XG5cdGlmICghdGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCkge1xuXHRcdHRhcmdldC5fX2FwaVJlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHRhcmdldC5pbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG5cdFx0dGFyZ2V0LnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbiAoX2luc3RhbmNlOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpKSB7XG5cdFx0XHRcdHRoaXMuaW5zdGFuY2VNYXAuc2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvciwgW10pO1xuXHRcdFx0fVxuXHRcdFx0KHRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikgYXMgb2JqZWN0W10pLnB1c2goX2luc3RhbmNlKTtcblx0XHR9O1xuXHRcdHRhcmdldC5nZXRBUEkgPSBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0KTtcblx0fVxufTtcblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZE92ZXJyaWRlKGV4dGVuc2lvbk5hbWU/OiBzdHJpbmcpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5KSB7XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGUpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZSA9IHt9O1xuXHRcdH1cblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZXMpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZXMgPSB7fTtcblx0XHR9XG5cdFx0bGV0IGN1cnJlbnRUYXJnZXQgPSB0YXJnZXQub3ZlcnJpZGVzO1xuXHRcdGlmIChleHRlbnNpb25OYW1lKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdID0ge307XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV07XG5cdFx0fVxuXHRcdGN1cnJlbnRUYXJnZXRbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPilbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBkZWZpbmVkIG92ZXJyaWRlRXhlY3V0aW9uVHlwZS5cbiAqXG4gKiBAcGFyYW0gb3ZlcnJpZGVFeGVjdXRpb25UeXBlIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvblR5cGU/OiBPdmVycmlkZUV4ZWN1dGlvbiB8IFwiQWZ0ZXJBc3luY1wiIHwgXCJCZWZvcmVBc3luY1wiKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5vdmVycmlkZUV4ZWN1dGlvbiA9IG92ZXJyaWRlRXhlY3V0aW9uVHlwZSBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IGZhbHNlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIGV2ZW50S2V5KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiBUaGUgYWdncmVnYXRpb24gZGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogVUk1QWdncmVnYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gVUk1IGRlZmF1bHRzIHRoaXMgdG8gdHJ1ZSBidXQgdGhpcyBpcyBqdXN0IHdlaXJkLi4uXG5cdFx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLmlzRGVmYXVsdCkge1xuXHRcdFx0bWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uID0gcHJvcGVydHlLZXk7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuZCBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBhc3NvY2lhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhdGFkYS5cbiAqXG4gKiBAcGFyYW0gdWk1QXNzb2NpYXRpb25NZXRhZGF0YSBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgYXNzb2NpYXRpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NvY2lhdGlvbih1aTVBc3NvY2lhdGlvbk1ldGFkYXRhOiBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5hc3NvY2lhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hc3NvY2lhdGlvbnNbcHJvcGVydHlLZXldID0gdWk1QXNzb2NpYXRpb25NZXRhZGF0YTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcGxlbWVudEludGVyZmFjZShpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblxuXHRcdG1ldGFkYXRhLmludGVyZmFjZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0fTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBleHBvc2VkIHN0YXRpY2FsbHkgc28gd2UgY2FuIGNhbGwgaXQgZnJvbSBYTUwuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEV2ZW50SGFuZGxlcigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5a2V5KSB7XG5cdFx0Y29uc3QgY3VycmVudENvbnN0cnVjdG9yOiBVSTVBUElDb250cm9sID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMgVUk1QVBJQ29udHJvbDtcblx0XHRlbnN1cmVHZXRBUEkoY3VycmVudENvbnN0cnVjdG9yKTtcblx0XHRjdXJyZW50Q29uc3RydWN0b3JbcHJvcGVydHlrZXkudG9TdHJpbmcoKV0gPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRpZiAoYXJncyAmJiBhcmdzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKlxuICogQHBhcmFtIHNUYXJnZXQgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBVSTUgY2xhc3NcbiAqIEBwYXJhbSBtZXRhZGF0YURlZmluaXRpb24gSW5saW5lIG1ldGFkYXRhIGRlZmluaXRpb25cbiAqIEBwYXJhbSBmb3JjZURlZmluZUNhbGwgV2hldGhlciBhIGRlZmluZSBjYWxsIHNob3VsZCBiZSBhZGRlZCBmb3IgdGhpcywgdXNlZnVsIHdoZW4gZGVmaW5pbmcgc3ViIGNsYXNzZXNcbiAqIEByZXR1cm5zIEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgd2lsbCBjcmVhdGUgYSB1aTUgY2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVJNUNsYXNzKFxuXHRzVGFyZ2V0OiBzdHJpbmcsXG5cdG1ldGFkYXRhRGVmaW5pdGlvbj86IFBhcnRpYWw8VUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbj4sXG5cdGZvcmNlRGVmaW5lQ2FsbCA9IGZhbHNlXG4pOiBDbGFzc0RlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0b3I6IFVJNUNvbnRyb2xBbmRNb3JlKSB7XG5cdFx0aWYgKCFjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEpIHtcblx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSA9IHt9O1xuXHRcdH1cblx0XHRpZiAobWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdC4uLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLFxuXHRcdFx0XHRcdFx0XHQuLi4obWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXSBhcyBvYmplY3QpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY29uc3RydWN0b3IsIHNUYXJnZXQsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZm9yY2VEZWZpbmVDYWxsKTtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZmVyZW5jZTxUIGV4dGVuZHMgVUk1RWxlbWVudD4oKTogUmVmPFQ+IHtcblx0cmV0dXJuIHtcblx0XHRjdXJyZW50OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBULFxuXHRcdHNldEN1cnJlbnQ6IGZ1bmN0aW9uIChvQ29udHJvbEluc3RhbmNlOiBUKTogdm9pZCB7XG5cdFx0XHR0aGlzLmN1cnJlbnQgPSBvQ29udHJvbEluc3RhbmNlO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgb2JqZWN0IHdpbGwgaG9sZCBhIHJlZmVyZW5jZSB0byBhIGNvbnRyb2wgdGhyb3VnaCBqc3ggdGVtcGxhdGluZy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVmZXJlbmNlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKEJhc2VPYmplY3QuaXNPYmplY3RBKHRhcmdldCwgXCJzYXAudWkuY29yZS5Db250cm9sXCIpKSB7XG5cdFx0XHRpZiAoIW1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdG1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0KHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplciA9IGNyZWF0ZVJlZmVyZW5jZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBoZWF2eSBsaWZ0aW5nIHRoYXQgd2lsbCB0YWtlIGNhcmUgb2YgY3JlYXRpbmcgdGhlIGNsYXNzIHByb3BlcnR5IGZvciB1aTUgdG8gdXNlLlxuICpcbiAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgcHJvdG90eXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gKiBAcGFyYW0gaW5PYmogVGhlIG1ldGFkYXRhIG9iamVjdFxuICogQHBhcmFtIGZvcmNlRGVmaW5lQ2FsbCBXaGV0aGVyIGEgZGVmaW5lIGNhbGwgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGlzLCB1c2VmdWwgd2hlbiBkZWZpbmluZyBzdWIgY2xhc3Nlc1xuICogQHJldHVybnMgVGhlIG1ldGFkYXRhIGNsYXNzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVUk1TWV0YWRhdGEoXG5cdGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSxcblx0bmFtZTogc3RyaW5nLFxuXHRpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbixcblx0Zm9yY2VEZWZpbmVDYWxsOiBib29sZWFuXG4pOiBGdW5jdGlvbiB7XG5cdGlmIChjbGF6ei5nZXRNZXRhZGF0YT8uKCkuaXNBKFwic2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb25cIikpIHtcblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbk9iaikuZm9yRWFjaCgob2JqTmFtZSkgPT4ge1xuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5PYmosIG9iak5hbWUpO1xuXHRcdFx0aWYgKGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSkge1xuXHRcdFx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IG9iajogYW55ID0ge307XG5cdG9iai5tZXRhZGF0YSA9IGluT2JqLm1ldGFkYXRhIHx8IHt9O1xuXHRvYmoub3ZlcnJpZGUgPSBpbk9iai5vdmVycmlkZTtcblx0b2JqLmNvbnN0cnVjdG9yID0gY2xheno7XG5cdG9iai5tZXRhZGF0YS5iYXNlVHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbGF6ei5wcm90b3R5cGUpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpO1xuXG5cdGlmICgoY2xheno/LmdldE1ldGFkYXRhKCkgYXMgdW5rbm93biBhcyB7IGdldFN0ZXJlb3R5cGU6IEZ1bmN0aW9uIH0pPy5nZXRTdGVyZW90eXBlKCkgPT09IFwiY29udHJvbFwiKSB7XG5cdFx0Y29uc3QgcmVuZGVyZXJEZWZpbml0aW9uID0gaW5PYmoucmVuZGVyZXIgfHwgY2xhenoucmVuZGVyZXIgfHwgY2xhenoucmVuZGVyO1xuXHRcdG9iai5yZW5kZXJlciA9IHsgYXBpVmVyc2lvbjogMiB9O1xuXHRcdGlmICh0eXBlb2YgcmVuZGVyZXJEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG9iai5yZW5kZXJlci5yZW5kZXIgPSByZW5kZXJlckRlZmluaXRpb247XG5cdFx0fSBlbHNlIGlmIChyZW5kZXJlckRlZmluaXRpb24gIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvYmoucmVuZGVyZXIgPSByZW5kZXJlckRlZmluaXRpb247XG5cdFx0fVxuXHR9XG5cdG9iai5tZXRhZGF0YS5pbnRlcmZhY2VzID0gaW5PYmoubWV0YWRhdGE/LmludGVyZmFjZXMgfHwgY2xhenoubWV0YWRhdGE/LmludGVyZmFjZXM7XG5cdE9iamVjdC5rZXlzKGNsYXp6LnByb3RvdHlwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0aWYgKGtleSAhPT0gXCJtZXRhZGF0YVwiKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvYmpba2V5XSA9IGNsYXp6LnByb3RvdHlwZVtrZXldO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRpZiAob2JqLm1ldGFkYXRhPy5jb250cm9sbGVyRXh0ZW5zaW9ucyAmJiBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGNFeHROYW1lIGluIG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykge1xuXHRcdFx0b2JqW2NFeHROYW1lXSA9IG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1tjRXh0TmFtZV07XG5cdFx0fVxuXHR9XG5cdGNvbnN0IG91dHB1dCA9IGNsYXp6LmV4dGVuZChuYW1lLCBvYmopIGFzIHR5cGVvZiBDb250cm9sICYgRnVuY3Rpb247XG5cdGNvbnN0IGZuSW5pdCA9IG91dHB1dC5wcm90b3R5cGUuaW5pdDtcblx0b3V0cHV0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdGlmIChmbkluaXQpIHtcblx0XHRcdGZuSW5pdC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9XG5cdFx0aWYgKGNsYXp6LnJlZ2lzdGVySW5zdGFuY2UpIHtcblx0XHRcdGNsYXp6LnJlZ2lzdGVySW5zdGFuY2UodGhpcyk7XG5cdFx0fVxuXHRcdHRoaXMubWV0YWRhdGEgPSBvYmoubWV0YWRhdGE7XG5cblx0XHRpZiAob2JqLm1ldGFkYXRhLnByb3BlcnRpZXMpIHtcblx0XHRcdGNvbnN0IGFQcm9wZXJ0eUtleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEucHJvcGVydGllcyk7XG5cdFx0XHRhUHJvcGVydHlLZXlzLmZvckVhY2goKHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmID0gb2JqLm1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldO1xuXHRcdFx0XHRpZiAocHJvcGVydHlEZWYuaXNCaW5kaW5nSW5mbyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzID8/PSB7fTtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA/PyB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZi5kZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGFnZ3JlZ2F0aW9uS2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5LCB2KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Db250ZW50ID0gdGhpcy5nZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbktleSk7XG5cdFx0XHRcdFx0XHRpZiAob2JqLm1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1thZ2dyZWdhdGlvbktleV0ubXVsdGlwbGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudCB8fCBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYUFzc29jaWF0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnMpO1xuXHRcdFx0YUFzc29jaWF0aW9uS2V5cy5mb3JFYWNoKChhc3NvY2lhdGlvbktleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYXNzb2NpYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFzc29jaWF0aW9uKGFzc29jaWF0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYXNzb2NpYXRpb25zW2Fzc29jaWF0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEucmVmZXJlbmNlcykge1xuXHRcdFx0Y29uc3QgcmVmZXJlbmNlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKTtcblx0XHRcdHJlZmVyZW5jZVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiBjcmVhdGVSZWZlcmVuY2UoKVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAob2JqLm1ldGFkYXRhLm1ldGhvZHMpIHtcblx0XHRcdGZvciAoY29uc3QgbWV0aG9kTmFtZSBpbiBvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0XHRjb25zdCBtZXRob2REZWZpbml0aW9uID0gb2JqLm1ldGFkYXRhLm1ldGhvZHNbbWV0aG9kTmFtZV07XG5cdFx0XHRcdGlmIChtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkFmdGVyQXN5bmNcIiB8fCBtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMubWV0aG9kSG9sZGVyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm1ldGhvZEhvbGRlciA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXSA9IFt0aGlzW21ldGhvZE5hbWVdXTtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbWV0aG9kTmFtZSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogRnVuY3Rpb24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdLnB1c2godik7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhc3luYyAoLi4ubWV0aG9kQXJnczogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWV0aG9kQXJyYXlzID0gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kQXJyYXlzLnJldmVyc2UoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhcmcgb2YgbWV0aG9kQXJyYXlzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBhcmcuYXBwbHkodGhpcywgbWV0aG9kQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRpZiAoZm9yY2VEZWZpbmVDYWxsKSB7XG5cdFx0c2FwLnVpLmRlZmluZShvdXRwdXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpLCAoKSA9PiB7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG91dHB1dDtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUE2SEEsTUFBTUEsY0FBYyxHQUFHLFVBQVVDLE1BQXNELEVBQWdDO0lBQ3RIQSxNQUFNLENBQUNDLFFBQVEsR0FBR0MsS0FBSyxDQUN0QjtNQUNDQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7TUFDeEJDLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZEMsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLE1BQU0sRUFBRSxDQUFDLENBQUM7TUFDVkMsVUFBVSxFQUFFO0lBQ2IsQ0FBQyxFQUNEVixNQUFNLENBQUNDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FDVztJQUNqQyxPQUFPRCxNQUFNLENBQUNDLFFBQVE7RUFDdkIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTVSxxQkFBcUIsQ0FBQ1gsTUFBcUIsRUFBRTtJQUNyRCxPQUFPLFVBRU5ZLE1BQWdCLEVBRUE7TUFBQSxJQURoQkMsTUFB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
|