appium 2.0.0-beta.23 → 2.0.0-beta.26
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/README.md +1 -2
- package/build/lib/appium-config.schema.json +278 -0
- package/build/lib/appium.js +62 -71
- package/build/lib/cli/args.js +31 -53
- package/build/lib/cli/driver-command.js +5 -9
- package/build/lib/cli/extension-command.js +73 -64
- package/build/lib/cli/extension.js +10 -23
- package/build/lib/cli/parser.js +10 -20
- package/build/lib/cli/plugin-command.js +5 -9
- package/build/lib/cli/utils.js +2 -4
- package/build/lib/config-file.js +5 -10
- package/build/lib/config.js +67 -30
- package/build/lib/constants.js +60 -0
- package/build/lib/extension/driver-config.js +190 -0
- package/build/lib/extension/extension-config.js +297 -0
- package/build/lib/extension/index.js +77 -0
- package/build/lib/extension/manifest.js +246 -0
- package/build/lib/extension/package-changed.js +68 -0
- package/build/lib/extension/plugin-config.js +87 -0
- package/build/lib/grid-register.js +2 -4
- package/build/lib/logger.js +2 -4
- package/build/lib/logsink.js +2 -4
- package/build/lib/main.js +64 -92
- package/build/lib/schema/appium-config-schema.js +2 -4
- package/build/lib/schema/arg-spec.js +14 -15
- package/build/lib/schema/cli-args.js +8 -16
- package/build/lib/schema/cli-transformers.js +2 -4
- package/build/lib/schema/index.js +2 -4
- package/build/lib/schema/keywords.js +2 -4
- package/build/lib/schema/schema.js +136 -41
- package/build/lib/utils.js +13 -64
- package/lib/appium.js +74 -55
- package/lib/cli/args.js +36 -37
- package/lib/cli/driver-command.js +10 -2
- package/lib/cli/extension-command.js +216 -135
- package/lib/cli/extension.js +7 -15
- package/lib/cli/parser.js +7 -15
- package/lib/cli/plugin-command.js +1 -2
- package/lib/config-file.js +12 -15
- package/lib/config.js +111 -36
- package/lib/constants.js +79 -0
- package/lib/extension/driver-config.js +230 -0
- package/lib/extension/extension-config.js +459 -0
- package/lib/extension/index.js +103 -0
- package/lib/extension/manifest.js +590 -0
- package/lib/extension/package-changed.js +64 -0
- package/lib/extension/plugin-config.js +111 -0
- package/lib/grid-register.js +4 -4
- package/lib/main.js +110 -96
- package/lib/schema/arg-spec.js +11 -5
- package/lib/schema/cli-args.js +7 -30
- package/lib/schema/keywords.js +1 -1
- package/lib/schema/schema.js +206 -48
- package/lib/utils.js +27 -58
- package/package.json +29 -21
- package/{postinstall.js → scripts/postinstall.js} +1 -1
- package/types/types.d.ts +72 -28
- package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
- package/build/check-npm-pack-files.js +0 -23
- package/build/commands-yml/parse.js +0 -319
- package/build/commands-yml/validator.js +0 -130
- package/build/index.js +0 -19
- package/build/lib/cli/npm.js +0 -220
- package/build/lib/driver-config.js +0 -100
- package/build/lib/drivers.js +0 -100
- package/build/lib/ext-config-io.js +0 -165
- package/build/lib/extension-config.js +0 -320
- package/build/lib/plugin-config.js +0 -69
- package/build/lib/plugins.js +0 -16
- package/build/postinstall.js +0 -90
- package/build/test/cli/cli-e2e-specs.js +0 -221
- package/build/test/cli/cli-helpers.js +0 -86
- package/build/test/cli/cli-specs.js +0 -71
- package/build/test/cli/fixtures/test-driver/package.json +0 -27
- package/build/test/cli/schema-args-specs.js +0 -48
- package/build/test/cli/schema-e2e-specs.js +0 -47
- package/build/test/config-e2e-specs.js +0 -112
- package/build/test/config-file-e2e-specs.js +0 -209
- package/build/test/config-file-specs.js +0 -281
- package/build/test/config-specs.js +0 -159
- package/build/test/driver-e2e-specs.js +0 -435
- package/build/test/driver-specs.js +0 -321
- package/build/test/ext-config-io-specs.js +0 -181
- package/build/test/extension-config-specs.js +0 -365
- package/build/test/fixtures/allow-feat.txt +0 -5
- package/build/test/fixtures/caps.json +0 -3
- package/build/test/fixtures/config/allow-insecure.txt +0 -3
- package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
- package/build/test/fixtures/config/appium.config.bad.json +0 -32
- package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
- package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
- package/build/test/fixtures/config/appium.config.good.js +0 -40
- package/build/test/fixtures/config/appium.config.good.json +0 -33
- package/build/test/fixtures/config/appium.config.good.yaml +0 -30
- package/build/test/fixtures/config/appium.config.invalid.json +0 -31
- package/build/test/fixtures/config/appium.config.security-array.json +0 -5
- package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
- package/build/test/fixtures/config/appium.config.security-path.json +0 -5
- package/build/test/fixtures/config/driver-fake.config.json +0 -8
- package/build/test/fixtures/config/nodeconfig.json +0 -3
- package/build/test/fixtures/config/plugin-fake.config.json +0 -0
- package/build/test/fixtures/default-args.js +0 -35
- package/build/test/fixtures/deny-feat.txt +0 -5
- package/build/test/fixtures/driver.schema.js +0 -20
- package/build/test/fixtures/extensions.yaml +0 -27
- package/build/test/fixtures/flattened-schema.js +0 -504
- package/build/test/fixtures/plugin.schema.js +0 -20
- package/build/test/fixtures/schema-with-extensions.js +0 -28
- package/build/test/grid-register-specs.js +0 -74
- package/build/test/helpers.js +0 -75
- package/build/test/logger-specs.js +0 -76
- package/build/test/npm-specs.js +0 -20
- package/build/test/parser-specs.js +0 -314
- package/build/test/plugin-e2e-specs.js +0 -316
- package/build/test/schema/arg-spec-specs.js +0 -70
- package/build/test/schema/cli-args-specs.js +0 -431
- package/build/test/schema/schema-specs.js +0 -389
- package/build/test/utils-specs.js +0 -266
- package/lib/cli/npm.js +0 -251
- package/lib/driver-config.js +0 -101
- package/lib/drivers.js +0 -84
- package/lib/ext-config-io.js +0 -287
- package/lib/extension-config.js +0 -366
- package/lib/plugin-config.js +0 -63
- package/lib/plugins.js +0 -11
|
@@ -5,9 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.
|
|
9
|
-
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
+
exports.validate = exports.resetSchema = exports.registerSchema = exports.isFinalized = exports.isAllowedSchemaFileExtension = exports.hasArgSpec = exports.getSchema = exports.getDefaultsForSchema = exports.getDefaultsForExtension = exports.getArgSpec = exports.getAllArgSpecs = exports.flattenSchema = exports.finalizeSchema = exports.SchemaUnsupportedSchemaError = exports.SchemaUnknownSchemaError = exports.SchemaNameConflictError = exports.SchemaFinalizationError = exports.RoachHotelMap = exports.ALLOWED_SCHEMA_EXTENSIONS = void 0;
|
|
11
9
|
|
|
12
10
|
require("source-map-support/register");
|
|
13
11
|
|
|
@@ -19,9 +17,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
19
17
|
|
|
20
18
|
var _path = _interopRequireDefault(require("path"));
|
|
21
19
|
|
|
22
|
-
var
|
|
23
|
-
|
|
24
|
-
var _utils = require("../utils");
|
|
20
|
+
var _constants = require("../constants");
|
|
25
21
|
|
|
26
22
|
var _appiumConfigSchema = _interopRequireDefault(require("./appium-config-schema"));
|
|
27
23
|
|
|
@@ -29,30 +25,52 @@ var _argSpec = require("./arg-spec");
|
|
|
29
25
|
|
|
30
26
|
var _keywords = require("./keywords");
|
|
31
27
|
|
|
28
|
+
class RoachHotelMap extends Map {
|
|
29
|
+
set(key, value) {
|
|
30
|
+
if (this.has(key)) {
|
|
31
|
+
throw new Error(`${key} is already set`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return super.set(key, value);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
delete(key) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
clear() {
|
|
42
|
+
throw new Error(`Cannot clear RoachHotelMap`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
exports.RoachHotelMap = RoachHotelMap;
|
|
32
48
|
const ALLOWED_SCHEMA_EXTENSIONS = new Set(['.json', '.js', '.cjs']);
|
|
33
49
|
exports.ALLOWED_SCHEMA_EXTENSIONS = ALLOWED_SCHEMA_EXTENSIONS;
|
|
34
50
|
|
|
35
51
|
class AppiumSchema {
|
|
52
|
+
_argSpecs = new RoachHotelMap();
|
|
53
|
+
_registeredSchemas = {
|
|
54
|
+
[_constants.DRIVER_TYPE]: new Map(),
|
|
55
|
+
[_constants.PLUGIN_TYPE]: new Map()
|
|
56
|
+
};
|
|
57
|
+
_ajv;
|
|
58
|
+
static _instance;
|
|
59
|
+
_finalizedSchemas = null;
|
|
60
|
+
|
|
36
61
|
constructor() {
|
|
37
|
-
(0, _defineProperty2.default)(this, "_argSpecs", new _utils.ReadonlyMap());
|
|
38
|
-
(0, _defineProperty2.default)(this, "_registeredSchemas", {
|
|
39
|
-
[_extensionConfig.DRIVER_TYPE]: new Map(),
|
|
40
|
-
[_extensionConfig.PLUGIN_TYPE]: new Map()
|
|
41
|
-
});
|
|
42
|
-
(0, _defineProperty2.default)(this, "_ajv", void 0);
|
|
43
|
-
(0, _defineProperty2.default)(this, "_finalizedSchemas", null);
|
|
44
62
|
this._ajv = AppiumSchema._instantiateAjv();
|
|
45
63
|
}
|
|
46
64
|
|
|
47
65
|
static create() {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
AppiumSchema._instance = instance;
|
|
66
|
+
if (!AppiumSchema._instance) {
|
|
67
|
+
const instance = new AppiumSchema();
|
|
68
|
+
AppiumSchema._instance = instance;
|
|
52
69
|
|
|
53
|
-
|
|
70
|
+
_lodash.default.bindAll(instance, ['finalize', 'flatten', 'getAllArgSpecs', 'getArgSpec', 'getDefaults', 'getDefaultsForExtension', 'getSchema', 'hasArgSpec', 'isFinalized', 'registerSchema', 'hasRegisteredSchema', 'reset', 'validate']);
|
|
71
|
+
}
|
|
54
72
|
|
|
55
|
-
return
|
|
73
|
+
return AppiumSchema._instance;
|
|
56
74
|
}
|
|
57
75
|
|
|
58
76
|
hasRegisteredSchema(extType, extName) {
|
|
@@ -63,6 +81,10 @@ class AppiumSchema {
|
|
|
63
81
|
return Boolean(this._finalizedSchemas);
|
|
64
82
|
}
|
|
65
83
|
|
|
84
|
+
getAllArgSpecs() {
|
|
85
|
+
return this._argSpecs;
|
|
86
|
+
}
|
|
87
|
+
|
|
66
88
|
finalize() {
|
|
67
89
|
if (this.isFinalized()) {
|
|
68
90
|
return this._finalizedSchemas;
|
|
@@ -89,7 +111,7 @@ class AppiumSchema {
|
|
|
89
111
|
}
|
|
90
112
|
};
|
|
91
113
|
|
|
92
|
-
addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [
|
|
114
|
+
addArgSpecs(_lodash.default.omit(baseSchema.properties.server.properties, [_constants.DRIVER_TYPE, _constants.PLUGIN_TYPE]));
|
|
93
115
|
const finalizedSchemas = {};
|
|
94
116
|
|
|
95
117
|
const finalSchema = _lodash.default.reduce(this._registeredSchemas, (baseSchema, extensionSchemas, extType) => {
|
|
@@ -136,18 +158,22 @@ class AppiumSchema {
|
|
|
136
158
|
this._ajv.removeSchema(schemaId);
|
|
137
159
|
}
|
|
138
160
|
|
|
139
|
-
this._argSpecs = new
|
|
161
|
+
this._argSpecs = new RoachHotelMap();
|
|
140
162
|
this._registeredSchemas = {
|
|
141
|
-
[
|
|
142
|
-
[
|
|
163
|
+
[_constants.DRIVER_TYPE]: new Map(),
|
|
164
|
+
[_constants.PLUGIN_TYPE]: new Map()
|
|
143
165
|
};
|
|
144
166
|
this._finalizedSchemas = null;
|
|
145
167
|
this._ajv = AppiumSchema._instantiateAjv();
|
|
146
168
|
}
|
|
147
169
|
|
|
148
170
|
registerSchema(extType, extName, schema) {
|
|
149
|
-
if (!(extType && extName
|
|
150
|
-
throw new TypeError('Expected
|
|
171
|
+
if (!(extType && extName) || _lodash.default.isUndefined(schema)) {
|
|
172
|
+
throw new TypeError('Expected extension type, extension name, and a defined schema');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!AppiumSchema.isSupportedSchemaType(schema)) {
|
|
176
|
+
throw new SchemaUnsupportedSchemaError(schema, extType, extName);
|
|
151
177
|
}
|
|
152
178
|
|
|
153
179
|
const normalizedExtName = _lodash.default.kebabCase(extName);
|
|
@@ -173,12 +199,12 @@ class AppiumSchema {
|
|
|
173
199
|
return this._argSpecs.has(_argSpec.ArgSpec.toArg(name, extType, extName));
|
|
174
200
|
}
|
|
175
201
|
|
|
176
|
-
getDefaults() {
|
|
202
|
+
getDefaults(flatten = true) {
|
|
177
203
|
if (!this.isFinalized()) {
|
|
178
204
|
throw new SchemaFinalizationError();
|
|
179
205
|
}
|
|
180
206
|
|
|
181
|
-
|
|
207
|
+
const reducer = flatten ? (defaults, {
|
|
182
208
|
defaultValue,
|
|
183
209
|
dest
|
|
184
210
|
}) => {
|
|
@@ -186,6 +212,35 @@ class AppiumSchema {
|
|
|
186
212
|
defaults[dest] = defaultValue;
|
|
187
213
|
}
|
|
188
214
|
|
|
215
|
+
return defaults;
|
|
216
|
+
} : (defaults, {
|
|
217
|
+
defaultValue,
|
|
218
|
+
dest
|
|
219
|
+
}) => {
|
|
220
|
+
if (!_lodash.default.isUndefined(defaultValue)) {
|
|
221
|
+
_lodash.default.set(defaults, dest, defaultValue);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return defaults;
|
|
225
|
+
};
|
|
226
|
+
const retval = {};
|
|
227
|
+
return [...this._argSpecs.values()].reduce(reducer, retval);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
getDefaultsForExtension(extType, extName) {
|
|
231
|
+
if (!this.isFinalized()) {
|
|
232
|
+
throw new SchemaFinalizationError();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const specs = [...this._argSpecs.values()].filter(spec => spec.extType === extType && spec.extName === extName);
|
|
236
|
+
return specs.reduce((defaults, {
|
|
237
|
+
defaultValue,
|
|
238
|
+
rawDest
|
|
239
|
+
}) => {
|
|
240
|
+
if (!_lodash.default.isUndefined(defaultValue)) {
|
|
241
|
+
defaults[rawDest] = defaultValue;
|
|
242
|
+
}
|
|
243
|
+
|
|
189
244
|
return defaults;
|
|
190
245
|
}, {});
|
|
191
246
|
}
|
|
@@ -236,7 +291,7 @@ class AppiumSchema {
|
|
|
236
291
|
properties: refSchema.properties,
|
|
237
292
|
prefix: [...prefix, key, normalizedExtName]
|
|
238
293
|
});
|
|
239
|
-
} else if (key !==
|
|
294
|
+
} else if (key !== _constants.DRIVER_TYPE && key !== _constants.PLUGIN_TYPE) {
|
|
240
295
|
const [extType, extName] = prefix;
|
|
241
296
|
const argSpec = this.getArgSpec(key, extType, extName);
|
|
242
297
|
|
|
@@ -283,14 +338,17 @@ class AppiumSchema {
|
|
|
283
338
|
return ALLOWED_SCHEMA_EXTENSIONS.has(_path.default.extname(filename));
|
|
284
339
|
}
|
|
285
340
|
|
|
286
|
-
|
|
341
|
+
static isSupportedSchemaType(schema) {
|
|
342
|
+
return _lodash.default.isPlainObject(schema) && schema.$async !== true;
|
|
343
|
+
}
|
|
287
344
|
|
|
288
|
-
|
|
345
|
+
}
|
|
289
346
|
|
|
290
347
|
class SchemaFinalizationError extends Error {
|
|
348
|
+
code = 'APPIUMERR_SCHEMA_FINALIZATION';
|
|
349
|
+
|
|
291
350
|
constructor() {
|
|
292
351
|
super('Schema not yet finalized; `finalize()` must be called first.');
|
|
293
|
-
(0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_FINALIZATION');
|
|
294
352
|
}
|
|
295
353
|
|
|
296
354
|
}
|
|
@@ -298,10 +356,11 @@ class SchemaFinalizationError extends Error {
|
|
|
298
356
|
exports.SchemaFinalizationError = SchemaFinalizationError;
|
|
299
357
|
|
|
300
358
|
class SchemaNameConflictError extends Error {
|
|
359
|
+
code = 'APPIUMERR_SCHEMA_NAME_CONFLICT';
|
|
360
|
+
data;
|
|
361
|
+
|
|
301
362
|
constructor(extType, extName) {
|
|
302
363
|
super(`Name for ${extType} schema "${extName}" conflicts with an existing schema`);
|
|
303
|
-
(0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_NAME_CONFLICT');
|
|
304
|
-
(0, _defineProperty2.default)(this, "data", void 0);
|
|
305
364
|
this.data = {
|
|
306
365
|
extType,
|
|
307
366
|
extName
|
|
@@ -313,10 +372,11 @@ class SchemaNameConflictError extends Error {
|
|
|
313
372
|
exports.SchemaNameConflictError = SchemaNameConflictError;
|
|
314
373
|
|
|
315
374
|
class SchemaUnknownSchemaError extends ReferenceError {
|
|
375
|
+
code = 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA';
|
|
376
|
+
data;
|
|
377
|
+
|
|
316
378
|
constructor(schemaId) {
|
|
317
379
|
super(`Unknown schema: "${schemaId}"`);
|
|
318
|
-
(0, _defineProperty2.default)(this, "code", 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA');
|
|
319
|
-
(0, _defineProperty2.default)(this, "data", void 0);
|
|
320
380
|
this.data = {
|
|
321
381
|
schemaId
|
|
322
382
|
};
|
|
@@ -325,9 +385,43 @@ class SchemaUnknownSchemaError extends ReferenceError {
|
|
|
325
385
|
}
|
|
326
386
|
|
|
327
387
|
exports.SchemaUnknownSchemaError = SchemaUnknownSchemaError;
|
|
388
|
+
|
|
389
|
+
class SchemaUnsupportedSchemaError extends TypeError {
|
|
390
|
+
code = 'APPIUMERR_SCHEMA_UNSUPPORTED_SCHEMA';
|
|
391
|
+
data;
|
|
392
|
+
|
|
393
|
+
constructor(schema, extType, extName) {
|
|
394
|
+
super((() => {
|
|
395
|
+
let msg = `Unsupported schema from ${extType} "${extName}":`;
|
|
396
|
+
|
|
397
|
+
if (_lodash.default.isBoolean(schema)) {
|
|
398
|
+
return `${msg} schema cannot be a boolean`;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if (_lodash.default.isPlainObject(schema)) {
|
|
402
|
+
if (schema.$async) {
|
|
403
|
+
return `${msg} schema cannot be an async schema`;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
throw new TypeError(`schema IS supported; this error should not be thrown (this is a bug). value of schema: ${JSON.stringify(schema)}`);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return `${msg} schema must be a plain object without a true "$async" property`;
|
|
410
|
+
})());
|
|
411
|
+
this.data = {
|
|
412
|
+
schema,
|
|
413
|
+
extType,
|
|
414
|
+
extName
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
exports.SchemaUnsupportedSchemaError = SchemaUnsupportedSchemaError;
|
|
328
421
|
const appiumSchema = AppiumSchema.create();
|
|
329
422
|
const {
|
|
330
423
|
registerSchema,
|
|
424
|
+
getAllArgSpecs,
|
|
331
425
|
getArgSpec,
|
|
332
426
|
hasArgSpec,
|
|
333
427
|
isFinalized,
|
|
@@ -336,9 +430,11 @@ const {
|
|
|
336
430
|
validate,
|
|
337
431
|
getSchema,
|
|
338
432
|
flatten: flattenSchema,
|
|
339
|
-
getDefaults:
|
|
433
|
+
getDefaults: getDefaultsForSchema,
|
|
434
|
+
getDefaultsForExtension
|
|
340
435
|
} = appiumSchema;
|
|
341
|
-
exports.
|
|
436
|
+
exports.getDefaultsForExtension = getDefaultsForExtension;
|
|
437
|
+
exports.getDefaultsForSchema = getDefaultsForSchema;
|
|
342
438
|
exports.flattenSchema = flattenSchema;
|
|
343
439
|
exports.getSchema = getSchema;
|
|
344
440
|
exports.validate = validate;
|
|
@@ -347,11 +443,10 @@ exports.finalizeSchema = finalizeSchema;
|
|
|
347
443
|
exports.isFinalized = isFinalized;
|
|
348
444
|
exports.hasArgSpec = hasArgSpec;
|
|
349
445
|
exports.getArgSpec = getArgSpec;
|
|
446
|
+
exports.getAllArgSpecs = getAllArgSpecs;
|
|
350
447
|
exports.registerSchema = registerSchema;
|
|
351
448
|
const {
|
|
352
449
|
isAllowedSchemaFileExtension
|
|
353
450
|
} = AppiumSchema;
|
|
354
|
-
exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIkFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMiLCJTZXQiLCJBcHBpdW1TY2hlbWEiLCJjb25zdHJ1Y3RvciIsIlJlYWRvbmx5TWFwIiwiRFJJVkVSX1RZUEUiLCJNYXAiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFudGlhdGVBanYiLCJjcmVhdGUiLCJpbnN0YW5jZSIsIl9pbnN0YW5jZSIsIl8iLCJiaW5kQWxsIiwiaGFzUmVnaXN0ZXJlZFNjaGVtYSIsImV4dFR5cGUiLCJleHROYW1lIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiaGFzIiwiaXNGaW5hbGl6ZWQiLCJCb29sZWFuIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJmaW5hbGl6ZSIsImFqdiIsImJhc2VTY2hlbWEiLCJjbG9uZURlZXAiLCJhcHBpdW1Db25maWdTY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIl9hcmdTcGVjcyIsInNldCIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJBanYiLCJhbGxFcnJvcnMiLCJrZXl3b3JkcyIsImtleXdvcmQiLCJhZGRLZXl3b3JkIiwicmVzZXQiLCJzY2hlbWFJZCIsImtleXMiLCJyZW1vdmVTY2hlbWEiLCJyZWdpc3RlclNjaGVtYSIsImlzRW1wdHkiLCJUeXBlRXJyb3IiLCJub3JtYWxpemVkRXh0TmFtZSIsImtlYmFiQ2FzZSIsImdldCIsIlNjaGVtYU5hbWVDb25mbGljdEVycm9yIiwiZ2V0QXJnU3BlYyIsIm5hbWUiLCJ0b0FyZyIsImhhc0FyZ1NwZWMiLCJnZXREZWZhdWx0cyIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIiwidmFsdWVzIiwiZGVmYXVsdHMiLCJpc1VuZGVmaW5lZCIsImZsYXR0ZW4iLCJnZXRTY2hlbWEiLCJzdGFjayIsInByZWZpeCIsImZsYXR0ZW5lZCIsInBhaXJzIiwidG9QYWlycyIsImtleSIsInZhbHVlIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJFcnJvciIsImRhdGEiLCJhcHBpdW1TY2hlbWEiLCJmaW5hbGl6ZVNjaGVtYSIsInJlc2V0U2NoZW1hIiwiZmxhdHRlblNjaGVtYSIsImdldERlZmF1bHRzRnJvbVNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtPLE1BQU1BLHlCQUF5QixHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDLE9BQUQsRUFBVSxLQUFWLEVBQWlCLE1BQWpCLENBQVIsQ0FBbEM7OztBQU9QLE1BQU1DLFlBQU4sQ0FBbUI7QUFtRGpCQyxFQUFBQSxXQUFXLEdBQUk7QUFBQSxxREF6Q0gsSUFBSUMsa0JBQUosRUF5Q0c7QUFBQSw4REEvQk07QUFB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RStELFFBQUYsRUFBWTtBQUNyQixVQUFPLG9CQUFtQkEsUUFBUyxHQUFuQztBQURxQixnREFWaEIsaUNBVWdCO0FBQUE7QUFFckIsU0FBSytDLElBQUwsR0FBWTtBQUFDL0MsTUFBQUE7QUFBRCxLQUFaO0FBQ0Q7O0FBakIwRDs7O0FBb0I3RCxNQUFNZ0QsWUFBWSxHQUFHaEgsWUFBWSxDQUFDUSxNQUFiLEVBQXJCO0FBRU8sTUFBTTtBQUNYMkQsRUFBQUEsY0FEVztBQUVYTyxFQUFBQSxVQUZXO0FBR1hHLEVBQUFBLFVBSFc7QUFJWDNELEVBQUFBLFdBSlc7QUFLWEcsRUFBQUEsUUFBUSxFQUFFNEYsY0FMQztBQU1YbEQsRUFBQUEsS0FBSyxFQUFFbUQsV0FOSTtBQU9YWCxFQUFBQSxRQVBXO0FBUVhuQixFQUFBQSxTQVJXO0FBU1hELEVBQUFBLE9BQU8sRUFBRWdDLGFBVEU7QUFVWHJDLEVBQUFBLFdBQVcsRUFBRXNDO0FBVkYsSUFXVEosWUFYRzs7Ozs7Ozs7Ozs7QUFZQSxNQUFNO0FBQUNOLEVBQUFBO0FBQUQsSUFBaUMxRyxZQUF2QyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgYWRkRm9ybWF0cyBmcm9tICdhanYtZm9ybWF0cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge0RSSVZFUl9UWVBFLCBQTFVHSU5fVFlQRX0gZnJvbSAnLi4vZXh0ZW5zaW9uLWNvbmZpZyc7XG5pbXBvcnQge1JlYWRvbmx5TWFwfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgYXBwaXVtQ29uZmlnU2NoZW1hIGZyb20gJy4vYXBwaXVtLWNvbmZpZy1zY2hlbWEnO1xuaW1wb3J0IHtBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRH0gZnJvbSAnLi9hcmctc3BlYyc7XG5pbXBvcnQge2tleXdvcmRzfSBmcm9tICcuL2tleXdvcmRzJztcblxuLyoqXG4gKiBFeHRlbnNpb25zIHRoYXQgYW4gZXh0ZW5zaW9uIHNjaGVtYSBmaWxlIGNhbiBoYXZlLlxuICovXG5leHBvcnQgY29uc3QgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuanNvbicsICcuanMnLCAnLmNqcyddKTtcblxuLyoqXG4gKiBBIHdyYXBwZXIgYXJvdW5kIEFqdiBhbmQgc2NoZW1hLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICpcbiAqIFNob3VsZCBoYXZlIGJlZW4gbmFtZWQgSGlnaGxhbmRlciwgYmVjYXVzZSBfdGhlcmUgY2FuIG9ubHkgYmUgb25lX1xuICovXG5jbGFzcyBBcHBpdW1TY2hlbWEge1xuICAvKipcbiAgICogQSBtYXBwaW5nIG9mIHVuaXF1ZSBhcmd1bWVudCBJRHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY31zLlxuICAgKlxuICAgKiBBbiBcImFyZ3VtZW50XCIgaXMgYSBDTEkgYXJndW1lbnQgb3IgYSBjb25maWcgcHJvcGVydHkuXG4gICAqXG4gICAqIFVzZWQgdG8gcHJvdmlkZSBlYXN5IGxvb2t1cHMgb2YgYXJndW1lbnQgbWV0YWRhdGEgd2hlbiBjb252ZXJ0aW5nIGJldHdlZW4gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aG9zZSBhcmd1bWVudHMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWFkb25seU1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUmVhZG9ubHlNYXAoKTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgZXh0ZW5zaW9uIHR5cGVzIHRvIGV4dGVuc2lvbiBuYW1lcyB0byBzY2hlbWEgb2JqZWN0cy5cbiAgICpcbiAgICogVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbmFtaW5nIGNvbmZsaWN0cy4gVGhlIHNjaGVtYXNcbiAgICogYXJlIHN0b3JlZCBoZXJlIGluIG1lbW9yeSB1bnRpbCB0aGUgaW5zdGFuY2UgaXMgX2ZpbmFsaXplZF8uXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8RXh0ZW5zaW9uVHlwZSxNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD4+fVxuICAgKi9cbiAgX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1tEUklWRVJfVFlQRV06IG5ldyBNYXAoKSwgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpfTtcblxuICAvKipcbiAgICogQWp2IGluc3RhbmNlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBanZ9XG4gICAqL1xuICBfYWp2O1xuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbmNlO1xuXG4gIC8qKlxuICAgKiBMb29rdXAgb2Ygc2NoZW1hIElEcyB0byBmaW5hbGl6ZWQgc2NoZW1hcy5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHJlZmVyZW5jZXMsIGJ1dCByYXRoZXIgdGhlIHJvb3Qgc2NoZW1hcyB0aGVtc2VsdmVzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+P31cbiAgICovXG4gIF9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgQWp2LCBhZGRzIHN0YW5kYXJkIGZvcm1hdHMgYW5kIG91ciBjdXN0b20ga2V5d29yZHMuXG4gICAqIEBzZWUgaHR0cHM6Ly9ucG0uaW0vYWp2LWZvcm1hdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSBmdW5jdGlvbiBmb3Ige0BsaW5rIEFwcGl1bVNjaGVtYX0gaW5zdGFuY2VzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBjcmVhdGVzIGEgbmV3IG9uZS5cbiAgICogQmluZHMgcHVibGljIG1ldGhvZHMgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7QXBwaXVtU2NoZW1hfVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZSAoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID8/IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICBBcHBpdW1TY2hlbWEuX2luc3RhbmNlID0gaW5zdGFuY2U7XG5cbiAgICBfLmJpbmRBbGwoaW5zdGFuY2UsIFtcbiAgICAgICdmaW5hbGl6ZScsXG4gICAgICAnZmxhdHRlbicsXG4gICAgICAnZ2V0QXJnU3BlYycsXG4gICAgICAnZ2V0RGVmYXVsdHMnLFxuICAgICAgJ2dldFNjaGVtYScsXG4gICAgICAnaGFzQXJnU3BlYycsXG4gICAgICAnaXNGaW5hbGl6ZWQnLFxuICAgICAgJ3JlZ2lzdGVyU2NoZW1hJyxcbiAgICAgICdyZXNldCcsXG4gICAgICAndmFsaWRhdGUnLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGEgc2NoZW1hIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdXNpbmcgZ2l2ZW4gZXh0ZW5zaW9uIHR5cGUgYW5kIG5hbWUuXG4gICAqXG4gICAqIFRoaXMgZG9lcyBub3QgZGVwZW5kIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBfZmluYWxpemVkXy5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBOYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNSZWdpc3RlcmVkU2NoZW1hIChleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmhhcyhleHROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYHRydWVgIGlmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemUgZmluYWxpemV9IGhhcyBiZWVuIGNhbGxlZFxuICAgKiBzdWNjZXNzZnVsbHkgYW5kIHtAbGluayBBcHBpdW1TY2hlbWEucmVzZXQgcmVzZXR9IGhhcyBub3QgYmVlbiBjYWxsZWQgc2luY2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBJZiBmaW5hbGl6ZWRcbiAgICovXG4gIGlzRmluYWxpemVkICgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplICgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD59ICovIChcbiAgICAgICAgdGhpcy5fZmluYWxpemVkU2NoZW1hc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhanYgPSB0aGlzLl9hanY7XG5cbiAgICAvLyBBanYgd2lsbCBfbXV0YXRlXyB0aGUgc2NoZW1hLCBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0LlxuICAgIGNvbnN0IGJhc2VTY2hlbWEgPSBfLmNsb25lRGVlcCgvKiogQHR5cGUge1N0cmljdFNjaGVtYU9iamVjdH0gKi8oYXBwaXVtQ29uZmlnU2NoZW1hKSk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWFcbiAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV1cbiAgICAgKi9cbiAgICBjb25zdCBhZGRBcmdTcGVjcyA9IChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpID0+IHtcbiAgICAgIGZvciAobGV0IFtwcm9wTmFtZSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICBjb25zdCBhcmdTcGVjID0gQXJnU3BlYy5jcmVhdGUocHJvcE5hbWUsIHtcbiAgICAgICAgICBkZXN0OiBwcm9wU2NoZW1hLmFwcGl1bUNsaURlc3QsXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wU2NoZW1hLmRlZmF1bHQsXG4gICAgICAgICAgZXh0VHlwZSxcbiAgICAgICAgICBleHROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qge2FyZ30gPSBhcmdTcGVjO1xuICAgICAgICB0aGlzLl9hcmdTcGVjcy5zZXQoYXJnLCBhcmdTcGVjKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkQXJnU3BlY3MoXG4gICAgICBfLm9taXQoYmFzZVNjaGVtYS5wcm9wZXJ0aWVzLnNlcnZlci5wcm9wZXJ0aWVzLCBbXG4gICAgICAgIERSSVZFUl9UWVBFLFxuICAgICAgICBQTFVHSU5fVFlQRSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID1cbiAgICAgICAgICAgIHskcmVmLCAkY29tbWVudDogZXh0TmFtZX07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovKHNjaGVtYSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmFzZVNjaGVtYTtcbiAgICAgIH0sXG4gICAgICBiYXNlU2NoZW1hLFxuICAgICk7XG5cbiAgICBhanYuYWRkU2NoZW1hKGZpbmFsU2NoZW1hLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCk7XG4gICAgZmluYWxpemVkU2NoZW1hc1tBUFBJVU1fQ09ORklHX1NDSEVNQV9JRF0gPSBmaW5hbFNjaGVtYTtcbiAgICBhanYudmFsaWRhdGVTY2hlbWEoZmluYWxTY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IGZpbmFsaXplZFNjaGVtYXM7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBhbmQgY3JlYXRlcyBhbiBBanYgaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtBanZ9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbnRpYXRlQWp2ICgpIHtcbiAgICBjb25zdCBhanYgPSBhZGRGb3JtYXRzKFxuICAgICAgbmV3IEFqdih7XG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBub3QgbXVjaCB2YWxpZGF0aW9uIGFjdHVhbGx5IGhhcHBlbnNcbiAgICAgICAgYWxsRXJyb3JzOiB0cnVlLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIGFkZCBjdXN0b20ga2V5d29yZHMgdG8gYWp2LiBzZWUgc2NoZW1hLWtleXdvcmRzLmpzXG4gICAgXy5mb3JFYWNoKGtleXdvcmRzLCAoa2V5d29yZCkgPT4ge1xuICAgICAgYWp2LmFkZEtleXdvcmQoa2V5d29yZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWp2O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGlzIGluc3RhbmNlIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogLSBSZW1vdmVzIGFsbCBhZGRlZCBzY2hlbWFzIGZyb20gdGhlIGBBanZgIGluc3RhbmNlXG4gICAqIC0gUmVzZXRzIHRoZSBtYXAgb2Yge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9XG4gICAqIC0gUmVzZXRzIHRoZSBtYXAgb2YgcmVnaXN0ZXJlZCBzY2hlbWFzXG4gICAqIC0gU2V0cyB0aGUge0BsaW5rIEFwcGl1bVNjaGVtYS5fZmluYWxpemVkIF9maW5hbGl6ZWR9IGZsYWcgdG8gYGZhbHNlYFxuICAgKlxuICAgKiBJZiB5b3UgbmVlZCB0byBjYWxsIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGFnYWluLCB5b3UnbGwgd2FudCB0byBjYWxsIHRoaXMgZmlyc3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVzZXQgKCkge1xuICAgIGZvciAoY29uc3Qgc2NoZW1hSWQgb2YgT2JqZWN0LmtleXModGhpcy5fZmluYWxpemVkU2NoZW1hcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuX2Fqdi5yZW1vdmVTY2hlbWEoc2NoZW1hSWQpO1xuICAgIH1cbiAgICB0aGlzLl9hcmdTcGVjcyA9IG5ldyBSZWFkb25seU1hcCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1xuICAgICAgW0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLFxuICAgICAgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IG51bGw7XG5cbiAgICAvLyBBanYgc2VlbXMgdG8gaGF2ZSBhbiBvdmVyLWVhZ2VyIGNhY2hlLCBzbyB3ZSBoYXZlIHRvIGR1bXAgdGhlIG9iamVjdCBlbnRpcmVseS5cbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc2NoZW1hIGZyb20gYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIFwiZmFpbC1mYXN0XCIgaW4gdGhhdCB0aGUgc2NoZW1hIHdpbGwgaW1tZWRpYXRlbHkgYmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgX29yXyB3aGF0ZXZlciB0aGUgdmFsdWUgb2YgdGhlIHNjaGVtYSdzIGAkc2NoZW1hYCBwcm9wIGlzLlxuICAgKlxuICAgKiBEb2VzIF9ub3RfIGFkZCB0aGUgc2NoZW1hIHRvIHRoZSBgYWp2YCBpbnN0YW5jZSAodGhpcyBpcyBkb25lIGJ5IHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9KS5cbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBVbmlxdWUgZXh0ZW5zaW9uIG5hbWUgZm9yIGB0eXBlYFxuICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hIC0gU2NoZW1hIG9iamVjdFxuICAgKiBAdGhyb3dzIHtTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBhbiBpbnZhbGlkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXJTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSkge1xuICAgIGlmICghKGV4dFR5cGUgJiYgZXh0TmFtZSAmJiAhXy5pc0VtcHR5KHNjaGVtYSkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgbm9uZW1wdHkgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lIGFuZCBzY2hlbWEgcGFyYW1ldGVycycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHROYW1lID0gXy5rZWJhYkNhc2UoZXh0TmFtZSk7XG4gICAgaWYgKHRoaXMuaGFzUmVnaXN0ZXJlZFNjaGVtYShleHRUeXBlLCBub3JtYWxpemVkRXh0TmFtZSkpIHtcbiAgICAgIGlmICh0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5nZXQobm9ybWFsaXplZEV4dE5hbWUpID09PSBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNjaGVtYU5hbWVDb25mbGljdEVycm9yKGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9hanYudmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0cnVlKTtcblxuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLnNldChub3JtYWxpemVkRXh0TmFtZSwgc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEge0BsaW5rIEFyZ1NwZWN9IGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7QXJnU3BlY3x1bmRlZmluZWR9IEFyZ1NwZWMgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRBcmdTcGVjIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzLmdldChBcmdTcGVjLnRvQXJnKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5zdGFuY2Uga25vd3MgYWJvdXQgYW4gYXJndW1lbnQgYnkgdGhlIGdpdmVuIGBuYW1lYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBDTEkgYXJndW1lbnQgbmFtZVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV0gLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHN1Y2ggYW4ge0BsaW5rIEFyZ1NwZWN9IGV4aXN0c1xuICAgKi9cbiAgaGFzQXJnU3BlYyAobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5oYXMoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBSZWNvcmRgIG9mIGFyZ3VtZW50IFwiZGVzdFwiIHN0cmluZ3MgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBcImRlc3RcIiBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gb2JqZWN0IHJldHVybmVkIGJ5IGBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlclsncGFyc2VfYXJncyddYC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsQXJnU3BlY1snZGVmYXVsdFZhbHVlJ10+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHMgKCkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi50aGlzLl9hcmdTcGVjcy52YWx1ZXMoKV0ucmVkdWNlKFxuICAgICAgKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIGRlZmF1bHRzW2Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH0sXG4gICAgICB7fSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gc2NoZW1hIGludG8gYW4gYXJyYXkgb2YgYFNjaGVtYU9iamVjdGBzIGFuZCBhc3NvY2lhdGVkXG4gICAqIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfS5cbiAgICpcbiAgICogQ29udmVydHMgbmVzdGVkIGV4dGVuc2lvbiBzY2hlbWFzIHRvIGtleXMgYmFzZWQgb24gdGhlIGV4dGVuc2lvbiB0eXBlIGFuZFxuICAgKiBuYW1lLiBVc2VkIHdoZW4gdHJhbnNsYXRpbmcgdG8gYGFyZ3BhcnNlYCBvcHRpb25zIG9yIGdldHRpbmcgdGhlIGxpc3Qgb2ZcbiAgICogZGVmYXVsdCB2YWx1ZXMgKHNlZSB7QGxpbmsgQXBwaXVtU2NoZW1hLmdldERlZmF1bHRzfSkgZm9yIENMSSBvciBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gaW50ZXJtZWRpYXRlIHJlcHJzZW50YXRpb24gdXNlZCBieSBgY2xpLWFyZ3NgXG4gICAqIG1vZHVsZSdzIGB0b1BhcnNlckFyZ3NgLCB3aGljaCBjb252ZXJ0cyB0aGUgZmluYWxpemVkIHNjaGVtYSB0byBwYXJhbWV0ZXJzXG4gICAqIHVzZWQgYnkgYGFyZ3BhcnNlYC5cbiAgICogQHRocm93cyBJZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBoYXMgbm90IGJlZW4gY2FsbGVkIHlldC5cbiAgICogQHJldHVybnMge0ZsYXR0ZW5lZFNjaGVtYX1cbiAgICovXG4gIGZsYXR0ZW4gKCkge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCk7XG5cbiAgICAvKiogQHR5cGUge3twcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3QsIHByZWZpeDogc3RyaW5nW119W119ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9XG4gICAgICAgICAgICBBcmdTcGVjLmV4dGVuc2lvbkluZm9Gcm9tUm9vdFNjaGVtYUlkKCRyZWYpO1xuICAgICAgICAgIGlmICghbm9ybWFsaXplZEV4dE5hbWUpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZGV0ZXJtaW5lIGV4dGVuc2lvbiBuYW1lIGZyb20gc2NoZW1hIElEICR7JHJlZn0uIFRoaXMgaXMgYSBidWcuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllczogcmVmU2NoZW1hLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBwcmVmaXg6IFsuLi5wcmVmaXgsIGtleSwgbm9ybWFsaXplZEV4dE5hbWVdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gRFJJVkVSX1RZUEUgJiYga2V5ICE9PSBQTFVHSU5fVFlQRSkge1xuICAgICAgICAgIGNvbnN0IFtleHRUeXBlLCBleHROYW1lXSA9IHByZWZpeDtcbiAgICAgICAgICBjb25zdCBhcmdTcGVjID0gdGhpcy5nZXRBcmdTcGVjKFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgLyoqIEB0eXBlIHtFeHRlbnNpb25UeXBlfSAqLyAoZXh0VHlwZSksXG4gICAgICAgICAgICBleHROYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFhcmdTcGVjKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgVW5rbm93biBhcmd1bWVudCB3aXRoIGtleSAke2tleX0sIGV4dFR5cGUgJHtleHRUeXBlfSBhbmQgZXh0TmFtZSAke2V4dE5hbWV9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbGF0dGVuZWQucHVzaCh7c2NoZW1hOiBfLmNsb25lRGVlcCh2YWx1ZSksIGFyZ1NwZWN9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzY2hlbWEgaXRzZWxmXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtyZWZdIC0gU2NoZW1hIElEXG4gICAqIEB0aHJvd3MgSWYgdGhlIHNjaGVtYSBoYXMgbm90IHlldCBiZWVuIF9maW5hbGl6ZWRfXG4gICAqIEByZXR1cm5zIHtTY2hlbWFPYmplY3R9XG4gICAqL1xuICBnZXRTY2hlbWEgKHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7U2NoZW1hT2JqZWN0fSAqLyAodGhpcy5fZ2V0VmFsaWRhdG9yKHJlZikuc2NoZW1hKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgc2NoZW1hIHZhbGlkYXRvciBmdW5jdGlvbiBmcm9tIEFqdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2lkXSAtIFNjaGVtYSBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9ufVxuICAgKi9cbiAgX2dldFZhbGlkYXRvciAoaWQgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2Fqdi5nZXRTY2hlbWEoaWQpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICBpZiAoaWQgPT09IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcihpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0LCB2YWxpZGF0ZXMgaXQgYWdhaW5zdCB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gICAqIElmIGVycm9ycyBvY2N1ciwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgbm9uLWVtcHR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgKGhvcGVmdWxseSBhbiBvYmplY3QpIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSUQgb3IgcmVmLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IEFycmF5IG9mIGVycm9ycywgaWYgYW55LlxuICAgKi9cbiAgdmFsaWRhdGUgKHZhbHVlLCByZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IC8qKiBAdHlwZSB7aW1wb3J0KCdhanYnKS5WYWxpZGF0ZUZ1bmN0aW9ufSAqLyAoXG4gICAgICB0aGlzLl9nZXRWYWxpZGF0b3IocmVmKVxuICAgICk7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgPyBbLi4udmFsaWRhdG9yLmVycm9yc11cbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYGZpbGVuYW1lYCdzIGZpbGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgKGluIHtAbGluayBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TfSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZCwgYnV0XG4gKiB0aGUgbWV0aG9kIGNhbGxlZCByZXF1aXJlcyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpbmFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfRklOQUxJWkFUSU9OJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoJ1NjaGVtYSBub3QgeWV0IGZpbmFsaXplZDsgYGZpbmFsaXplKClgIG11c3QgYmUgY2FsbGVkIGZpcnN0LicpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBcInVuaXF1ZVwiIHNjaGVtYSBJRCBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgSUQuXG4gKlxuICogVGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgY2F1c2VkIGJ5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2NoZW1hIHR3aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9OQU1FX0NPTkZMSUNUJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBOYW1lIGZvciAke2V4dFR5cGV9IHNjaGVtYSBcIiR7ZXh0TmFtZX1cIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWFgLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hSWQpIHtcbiAgICBzdXBlcihgVW5rbm93biBzY2hlbWE6IFwiJHtzY2hlbWFJZH1cImApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWFJZH07XG4gIH1cbn1cblxuY29uc3QgYXBwaXVtU2NoZW1hID0gQXBwaXVtU2NoZW1hLmNyZWF0ZSgpO1xuXG5leHBvcnQgY29uc3Qge1xuICByZWdpc3RlclNjaGVtYSxcbiAgZ2V0QXJnU3BlYyxcbiAgaGFzQXJnU3BlYyxcbiAgaXNGaW5hbGl6ZWQsXG4gIGZpbmFsaXplOiBmaW5hbGl6ZVNjaGVtYSxcbiAgcmVzZXQ6IHJlc2V0U2NoZW1hLFxuICB2YWxpZGF0ZSxcbiAgZ2V0U2NoZW1hLFxuICBmbGF0dGVuOiBmbGF0dGVuU2NoZW1hLFxuICBnZXREZWZhdWx0czogZ2V0RGVmYXVsdHNGcm9tU2NoZW1hLFxufSA9IGFwcGl1bVNjaGVtYTtcbmV4cG9ydCBjb25zdCB7aXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbn0gPSBBcHBpdW1TY2hlbWE7XG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0fSBTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dC1jb25maWctaW8nKS5FeHRlbnNpb25UeXBlfSBFeHRlbnNpb25UeXBlXG4gKi9cblxuLyoqXG4gKiBBbiBvYmplY3QgaGF2aW5nIHByb3BlcnR5IGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHJpY3RQcm9wXG4gKiBAcHJvcGVydHkge2ZhbHNlfSBhZGRpdGlvbmFsUHJvcGVydGllc1xuICovXG5cbi8qKlxuICogQSB7QGxpbmsgU2NoZW1hT2JqZWN0fSB3aXRoIGBhZGRpdGlvbmFsUHJvcGVydGllczogZmFsc2VgXG4gKiBAdHlwZWRlZiB7U2NoZW1hT2JqZWN0ICYgU3RyaWN0UHJvcH0gU3RyaWN0U2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBBIGxpc3Qgb2Ygc2NoZW1hcyBhc3NvY2lhdGVkIHdpdGggcHJvcGVydGllcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgQXJnU3BlY30gb2JqZWN0cy5cbiAqXG4gKiBJbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB3aGVuIGNvbnZlcnRpbmcgdGhlIGVudGlyZSBzY2hlbWEgZG93biB0byBDTEkgYXJndW1lbnRzLlxuICogQHR5cGVkZWYge3tzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXX0gRmxhdHRlbmVkU2NoZW1hXG4gKi9cbiJdLCJmaWxlIjoibGliL3NjaGVtYS9zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
|
451
|
+
exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;
|
|
452
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hLmpzIl0sIm5hbWVzIjpbIlJvYWNoSG90ZWxNYXAiLCJNYXAiLCJzZXQiLCJrZXkiLCJ2YWx1ZSIsImhhcyIsIkVycm9yIiwiZGVsZXRlIiwiY2xlYXIiLCJBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TIiwiU2V0IiwiQXBwaXVtU2NoZW1hIiwiX2FyZ1NwZWNzIiwiX3JlZ2lzdGVyZWRTY2hlbWFzIiwiRFJJVkVSX1RZUEUiLCJQTFVHSU5fVFlQRSIsIl9hanYiLCJfaW5zdGFuY2UiLCJfZmluYWxpemVkU2NoZW1hcyIsImNvbnN0cnVjdG9yIiwiX2luc3RhbnRpYXRlQWp2IiwiY3JlYXRlIiwiaW5zdGFuY2UiLCJfIiwiYmluZEFsbCIsImhhc1JlZ2lzdGVyZWRTY2hlbWEiLCJleHRUeXBlIiwiZXh0TmFtZSIsImlzRmluYWxpemVkIiwiQm9vbGVhbiIsImdldEFsbEFyZ1NwZWNzIiwiZmluYWxpemUiLCJhanYiLCJiYXNlU2NoZW1hIiwiY2xvbmVEZWVwIiwiYXBwaXVtQ29uZmlnU2NoZW1hIiwiYWRkQXJnU3BlY3MiLCJzY2hlbWEiLCJwcm9wTmFtZSIsInByb3BTY2hlbWEiLCJPYmplY3QiLCJlbnRyaWVzIiwiYXJnU3BlYyIsIkFyZ1NwZWMiLCJkZXN0IiwiYXBwaXVtQ2xpRGVzdCIsImRlZmF1bHRWYWx1ZSIsImRlZmF1bHQiLCJhcmciLCJvbWl0IiwicHJvcGVydGllcyIsInNlcnZlciIsImZpbmFsaXplZFNjaGVtYXMiLCJmaW5hbFNjaGVtYSIsInJlZHVjZSIsImV4dGVuc2lvblNjaGVtYXMiLCJmb3JFYWNoIiwiJHJlZiIsInRvU2NoZW1hQmFzZVJlZiIsIiRpZCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiJGNvbW1lbnQiLCJ2YWxpZGF0ZVNjaGVtYSIsImFkZFNjaGVtYSIsIkFQUElVTV9DT05GSUdfU0NIRU1BX0lEIiwiZnJlZXplIiwiQWp2IiwiYWxsRXJyb3JzIiwia2V5d29yZHMiLCJrZXl3b3JkIiwiYWRkS2V5d29yZCIsInJlc2V0Iiwic2NoZW1hSWQiLCJrZXlzIiwicmVtb3ZlU2NoZW1hIiwicmVnaXN0ZXJTY2hlbWEiLCJpc1VuZGVmaW5lZCIsIlR5cGVFcnJvciIsImlzU3VwcG9ydGVkU2NoZW1hVHlwZSIsIlNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3IiLCJub3JtYWxpemVkRXh0TmFtZSIsImtlYmFiQ2FzZSIsImdldCIsIlNjaGVtYU5hbWVDb25mbGljdEVycm9yIiwiZ2V0QXJnU3BlYyIsIm5hbWUiLCJ0b0FyZyIsImhhc0FyZ1NwZWMiLCJnZXREZWZhdWx0cyIsImZsYXR0ZW4iLCJTY2hlbWFGaW5hbGl6YXRpb25FcnJvciIsInJlZHVjZXIiLCJkZWZhdWx0cyIsInJldHZhbCIsInZhbHVlcyIsImdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIiwic3BlY3MiLCJmaWx0ZXIiLCJzcGVjIiwicmF3RGVzdCIsImdldFNjaGVtYSIsInN0YWNrIiwicHJlZml4IiwiZmxhdHRlbmVkIiwicGFpcnMiLCJ0b1BhaXJzIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJpc1BsYWluT2JqZWN0IiwiJGFzeW5jIiwiY29kZSIsImRhdGEiLCJtc2ciLCJpc0Jvb2xlYW4iLCJKU09OIiwic3RyaW5naWZ5IiwiYXBwaXVtU2NoZW1hIiwiZmluYWxpemVTY2hlbWEiLCJyZXNldFNjaGVtYSIsImZsYXR0ZW5TY2hlbWEiLCJnZXREZWZhdWx0c0ZvclNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7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QUFNeUcsWUFBWSxHQUFHekgsWUFBWSxDQUFDVSxNQUFiLEVBQXJCO0FBRU8sTUFBTTtBQUNYc0QsRUFBQUEsY0FEVztBQUVYN0MsRUFBQUEsY0FGVztBQUdYc0QsRUFBQUEsVUFIVztBQUlYRyxFQUFBQSxVQUpXO0FBS1gzRCxFQUFBQSxXQUxXO0FBTVhHLEVBQUFBLFFBQVEsRUFBRXNHLGNBTkM7QUFPWDlELEVBQUFBLEtBQUssRUFBRStELFdBUEk7QUFRWGpCLEVBQUFBLFFBUlc7QUFTWGpCLEVBQUFBLFNBVFc7QUFVWFgsRUFBQUEsT0FBTyxFQUFFOEMsYUFWRTtBQVdYL0MsRUFBQUEsV0FBVyxFQUFFZ0Qsb0JBWEY7QUFZWHpDLEVBQUFBO0FBWlcsSUFhVHFDLFlBYkc7Ozs7Ozs7Ozs7Ozs7QUFjQSxNQUFNO0FBQUNaLEVBQUFBO0FBQUQsSUFBaUM3RyxZQUF2QyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQWp2IGZyb20gJ2Fqdic7XG5pbXBvcnQgYWRkRm9ybWF0cyBmcm9tICdhanYtZm9ybWF0cyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IGFwcGl1bUNvbmZpZ1NjaGVtYSBmcm9tICcuL2FwcGl1bS1jb25maWctc2NoZW1hJztcbmltcG9ydCB7IEFQUElVTV9DT05GSUdfU0NIRU1BX0lELCBBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FIH0gZnJvbSAnLi9hcmctc3BlYyc7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gJy4va2V5d29yZHMnO1xuXG4vKipcbiAqIEtleS92YWx1ZSBwYWlycyBnbyBpbi4uLiBidXQgdGhleSBkb24ndCBjb21lIG91dC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAZXh0ZW5kcyB7TWFwPEssVj59XG4gKi9cbmV4cG9ydCBjbGFzcyBSb2FjaEhvdGVsTWFwIGV4dGVuZHMgTWFwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAgICovXG4gIHNldCAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBhbHJlYWR5IHNldGApO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgZGVsZXRlIChrZXkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjbGVhciAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgUm9hY2hIb3RlbE1hcGApO1xuICB9XG59XG5cbi8qKlxuICogRXh0ZW5zaW9ucyB0aGF0IGFuIGV4dGVuc2lvbiBzY2hlbWEgZmlsZSBjYW4gaGF2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmpzb24nLCAnLmpzJywgJy5janMnXSk7XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBBanYgYW5kIHNjaGVtYS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBTaG91bGQgaGF2ZSBiZWVuIG5hbWVkIEhpZ2hsYW5kZXIsIGJlY2F1c2UgX3RoZXJlIGNhbiBvbmx5IGJlIG9uZV9cbiAqL1xuY2xhc3MgQXBwaXVtU2NoZW1hIHtcbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB1bmlxdWUgYXJndW1lbnQgSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9cy5cbiAgICpcbiAgICogQW4gXCJhcmd1bWVudFwiIGlzIGEgQ0xJIGFyZ3VtZW50IG9yIGEgY29uZmlnIHByb3BlcnR5LlxuICAgKlxuICAgKiBVc2VkIHRvIHByb3ZpZGUgZWFzeSBsb29rdXBzIG9mIGFyZ3VtZW50IG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgb2YgdGhvc2UgYXJndW1lbnRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Um9hY2hIb3RlbE1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBleHRlbnNpb24gdHlwZXMgdG8gZXh0ZW5zaW9uIG5hbWVzIHRvIHNjaGVtYSBvYmplY3RzLlxuICAgKlxuICAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuYW1pbmcgY29uZmxpY3RzLiBUaGUgc2NoZW1hc1xuICAgKiBhcmUgc3RvcmVkIGhlcmUgaW4gbWVtb3J5IHVudGlsIHRoZSBpbnN0YW5jZSBpcyBfZmluYWxpemVkXy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxFeHRlbnNpb25UeXBlLE1hcDxzdHJpbmcsU2NoZW1hT2JqZWN0Pj59XG4gICAqL1xuICBfcmVnaXN0ZXJlZFNjaGVtYXMgPSB7W0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLCBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCl9O1xuXG4gIC8qKlxuICAgKiBBanYgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Fqdn1cbiAgICovXG4gIF9hanY7XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBvZiBzY2hlbWEgSURzIHRvIGZpbmFsaXplZCBzY2hlbWFzLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVmZXJlbmNlcywgYnV0IHJhdGhlciB0aGUgcm9vdCBzY2hlbWFzIHRoZW1zZWx2ZXMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4/fVxuICAgKi9cbiAgX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBBanYsIGFkZHMgc3RhbmRhcmQgZm9ybWF0cyBhbmQgb3VyIGN1c3RvbSBrZXl3b3Jkcy5cbiAgICogQHNlZSBodHRwczovL25wbS5pbS9hanYtZm9ybWF0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIFJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIGNyZWF0ZXMgYSBuZXcgb25lLlxuICAgKiBCaW5kcyBwdWJsaWMgbWV0aG9kcyB0byB0aGUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtBcHBpdW1TY2hlbWF9XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlICgpIHtcbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5faW5zdGFuY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEFwcGl1bVNjaGVtYSgpO1xuICAgICAgQXBwaXVtU2NoZW1hLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgXy5iaW5kQWxsKGluc3RhbmNlLCBbXG4gICAgICAgICdmaW5hbGl6ZScsXG4gICAgICAgICdmbGF0dGVuJyxcbiAgICAgICAgJ2dldEFsbEFyZ1NwZWNzJyxcbiAgICAgICAgJ2dldEFyZ1NwZWMnLFxuICAgICAgICAnZ2V0RGVmYXVsdHMnLFxuICAgICAgICAnZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24nLFxuICAgICAgICAnZ2V0U2NoZW1hJyxcbiAgICAgICAgJ2hhc0FyZ1NwZWMnLFxuICAgICAgICAnaXNGaW5hbGl6ZWQnLFxuICAgICAgICAncmVnaXN0ZXJTY2hlbWEnLFxuICAgICAgICAnaGFzUmVnaXN0ZXJlZFNjaGVtYScsXG4gICAgICAgICdyZXNldCcsXG4gICAgICAgICd2YWxpZGF0ZScsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gQXBwaXVtU2NoZW1hLl9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBhIHNjaGVtYSBoYXMgYmVlbiByZWdpc3RlcmVkIHVzaW5nIGdpdmVuIGV4dGVuc2lvbiB0eXBlIGFuZCBuYW1lLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGRlcGVuZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gX2ZpbmFsaXplZF8uXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzUmVnaXN0ZXJlZFNjaGVtYSAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5oYXMoZXh0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplIGZpbmFsaXplfSBoYXMgYmVlbiBjYWxsZWRcbiAgICogc3VjY2Vzc2Z1bGx5IGFuZCB7QGxpbmsgQXBwaXVtU2NoZW1hLnJlc2V0IHJlc2V0fSBoYXMgbm90IGJlZW4gY2FsbGVkIHNpbmNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZmluYWxpemVkXG4gICAqL1xuICBpc0ZpbmFsaXplZCAoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICBnZXRBbGxBcmdTcGVjcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyB3aGVuIG5vIG1vcmUgc2NoZW1hcyB3aWxsIGJlIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIFRoaXMgZG9lcyB0aHJlZSB0aGluZ3M6XG4gICAqIDEuIEl0IGNvbWJpbmVzIGFsbCBzY2hlbWFzIGZyb20gZXh0ZW5zaW9ucyBpbnRvIHRoZSBBcHBpdW0gY29uZmlnIHNjaGVtYSxcbiAgICogICAgdGhlbiBhZGRzIHRoZSByZXN1bHQgdG8gdGhlIGBBanZgIGluc3RhbmNlLlxuICAgKiAyLiBJdCBhZGRzIHNjaGVtYXMgZm9yIF9lYWNoXyBhcmd1bWVudC9wcm9wZXJ0eSBmb3IgdmFsaWRhdGlvbiBwdXJwb3Nlcy5cbiAgICogICAgVGhlIENMSSB1c2VzIHRoZXNlIHNjaGVtYXMgdG8gdmFsaWRhdGUgc3BlY2lmaWMgYXJndW1lbnRzLlxuICAgKiAzLiBUaGUgc2NoZW1hcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgKHdoaWNoIGlzIHRoZVxuICAgKiAgICBvbmx5IG9uZSBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lKVxuICAgKlxuICAgKiBBbnkgbWV0aG9kIGluIHRoaXMgaW5zdGFuY2UgdGhhdCBuZWVkcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiB3aWxsIHRocm93IGlmIHRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQuXG4gICAqXG4gICAqIElmIHRoZSBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsaXplZCwgdGhpcyBpcyBhIG5vLW9wLlxuICAgKiBAcHVibGljXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgc2NoZW1hIGlzIG5vdCB2YWxpZFxuICAgKiBAcmV0dXJucyB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+Pn0gUmVjb3JkIG9mIHNjaGVtYSBJRHMgdG8gZnVsbCBzY2hlbWEgb2JqZWN0c1xuICAgKi9cbiAgZmluYWxpemUgKCkge1xuICAgIGlmICh0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzPn0gKi8gKFxuICAgICAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IHRoaXMuX2FqdjtcblxuICAgIC8vIEFqdiB3aWxsIF9tdXRhdGVfIHRoZSBzY2hlbWEsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgY29uc3QgYmFzZVNjaGVtYSA9IF8uY2xvbmVEZWVwKGFwcGl1bUNvbmZpZ1NjaGVtYSk7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWFcbiAgICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IFtleHRUeXBlXVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZXh0TmFtZV1cbiAgICAgKi9cbiAgICBjb25zdCBhZGRBcmdTcGVjcyA9IChzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWUpID0+IHtcbiAgICAgIGZvciAobGV0IFtwcm9wTmFtZSwgcHJvcFNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoc2NoZW1hKSkge1xuICAgICAgICBjb25zdCBhcmdTcGVjID0gQXJnU3BlYy5jcmVhdGUocHJvcE5hbWUsIHtcbiAgICAgICAgICBkZXN0OiBwcm9wU2NoZW1hLmFwcGl1bUNsaURlc3QsXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBwcm9wU2NoZW1hLmRlZmF1bHQsXG4gICAgICAgICAgZXh0VHlwZSxcbiAgICAgICAgICBleHROYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qge2FyZ30gPSBhcmdTcGVjO1xuICAgICAgICB0aGlzLl9hcmdTcGVjcy5zZXQoYXJnLCBhcmdTcGVjKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkQXJnU3BlY3MoXG4gICAgICBfLm9taXQoYmFzZVNjaGVtYS5wcm9wZXJ0aWVzLnNlcnZlci5wcm9wZXJ0aWVzLCBbXG4gICAgICAgIERSSVZFUl9UWVBFLFxuICAgICAgICBQTFVHSU5fVFlQRSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID1cbiAgICAgICAgICAgIHskcmVmLCAkY29tbWVudDogZXh0TmFtZX07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovIChzY2hlbWEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJhc2VTY2hlbWE7XG4gICAgICB9LFxuICAgICAgYmFzZVNjaGVtYSxcbiAgICApO1xuXG4gICAgYWp2LmFkZFNjaGVtYShmaW5hbFNjaGVtYSwgQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpO1xuICAgIGZpbmFsaXplZFNjaGVtYXNbQVBQSVVNX0NPTkZJR19TQ0hFTUFfSURdID0gZmluYWxTY2hlbWE7XG4gICAgYWp2LnZhbGlkYXRlU2NoZW1hKGZpbmFsU2NoZW1hLCB0cnVlKTtcblxuICAgIHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMgPSBmaW5hbGl6ZWRTY2hlbWFzO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKGZpbmFsaXplZFNjaGVtYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgYW5kIGNyZWF0ZXMgYW4gQWp2IGluc3RhbmNlLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7QWp2fVxuICAgKi9cbiAgc3RhdGljIF9pbnN0YW50aWF0ZUFqdiAoKSB7XG4gICAgY29uc3QgYWp2ID0gYWRkRm9ybWF0cyhcbiAgICAgIG5ldyBBanYoe1xuICAgICAgICAvLyB3aXRob3V0IHRoaXMgbm90IG11Y2ggdmFsaWRhdGlvbiBhY3R1YWxseSBoYXBwZW5zXG4gICAgICAgIGFsbEVycm9yczogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBhZGQgY3VzdG9tIGtleXdvcmRzIHRvIGFqdi4gc2VlIHNjaGVtYS1rZXl3b3Jkcy5qc1xuICAgIF8uZm9yRWFjaChrZXl3b3JkcywgKGtleXdvcmQpID0+IHtcbiAgICAgIGFqdi5hZGRLZXl3b3JkKGtleXdvcmQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFqdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuXG4gICAqXG4gICAqIC0gUmVtb3ZlcyBhbGwgYWRkZWQgc2NoZW1hcyBmcm9tIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHJlZ2lzdGVyZWQgc2NoZW1hc1xuICAgKiAtIFNldHMgdGhlIHtAbGluayBBcHBpdW1TY2hlbWEuX2ZpbmFsaXplZCBfZmluYWxpemVkfSBmbGFnIHRvIGBmYWxzZWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBhZ2FpbiwgeW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIGZpcnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlc2V0ICgpIHtcbiAgICBmb3IgKGNvbnN0IHNjaGVtYUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMgPz8ge30pKSB7XG4gICAgICB0aGlzLl9hanYucmVtb3ZlU2NoZW1hKHNjaGVtYUlkKTtcbiAgICB9XG4gICAgdGhpcy5fYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzID0ge1xuICAgICAgW0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLFxuICAgICAgW1BMVUdJTl9UWVBFXTogbmV3IE1hcCgpLFxuICAgIH07XG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IG51bGw7XG5cbiAgICAvLyBBanYgc2VlbXMgdG8gaGF2ZSBhbiBvdmVyLWVhZ2VyIGNhY2hlLCBzbyB3ZSBoYXZlIHRvIGR1bXAgdGhlIG9iamVjdCBlbnRpcmVseS5cbiAgICB0aGlzLl9hanYgPSBBcHBpdW1TY2hlbWEuX2luc3RhbnRpYXRlQWp2KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgc2NoZW1hIGZyb20gYW4gZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIFwiZmFpbC1mYXN0XCIgaW4gdGhhdCB0aGUgc2NoZW1hIHdpbGwgaW1tZWRpYXRlbHkgYmUgdmFsaWRhdGVkIGFnYWluc3QgSlNPTiBzY2hlbWEgZHJhZnQtMDcgX29yXyB3aGF0ZXZlciB0aGUgdmFsdWUgb2YgdGhlIHNjaGVtYSdzIGAkc2NoZW1hYCBwcm9wIGlzLlxuICAgKlxuICAgKiBEb2VzIF9ub3RfIGFkZCB0aGUgc2NoZW1hIHRvIHRoZSBgYWp2YCBpbnN0YW5jZSAodGhpcyBpcyBkb25lIGJ5IHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9KS5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBVbmlxdWUgZXh0ZW5zaW9uIG5hbWUgZm9yIGB0eXBlYFxuICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hIC0gU2NoZW1hIG9iamVjdFxuICAgKiBAdGhyb3dzIHtTY2hlbWFOYW1lQ29uZmxpY3RFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBhbiBpbnZhbGlkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcmVnaXN0ZXJTY2hlbWEgKGV4dFR5cGUsIGV4dE5hbWUsIHNjaGVtYSkge1xuICAgIGlmICghKGV4dFR5cGUgJiYgZXh0TmFtZSkgfHwgXy5pc1VuZGVmaW5lZChzY2hlbWEpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lLCBhbmQgYSBkZWZpbmVkIHNjaGVtYScsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5pc1N1cHBvcnRlZFNjaGVtYVR5cGUoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3Ioc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4dE5hbWUgPSBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgICBpZiAodGhpcy5oYXNSZWdpc3RlcmVkU2NoZW1hKGV4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lKSkge1xuICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmdldChub3JtYWxpemVkRXh0TmFtZSkgPT09IHNjaGVtYSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX2Fqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uc2V0KG5vcm1hbGl6ZWRFeHROYW1lLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgQXJnU3BlY30gZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtBcmdTcGVjfHVuZGVmaW5lZH0gQXJnU3BlYyBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFyZ1NwZWMgKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJnU3BlY3MuZ2V0KEFyZ1NwZWMudG9BcmcobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBpbnN0YW5jZSBrbm93cyBhYm91dCBhbiBhcmd1bWVudCBieSB0aGUgZ2l2ZW4gYG5hbWVgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgc3VjaCBhbiB7QGxpbmsgQXJnU3BlY30gZXhpc3RzXG4gICAqL1xuICBoYXNBcmdTcGVjIChuYW1lLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ1NwZWNzLmhhcyhBcmdTcGVjLnRvQXJnKG5hbWUsIGV4dFR5cGUsIGV4dE5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYFJlY29yZGAgb2YgYXJndW1lbnQgXCJkZXN0XCIgc3RyaW5ncyB0byBkZWZhdWx0IHZhbHVlcy5cbiAgICpcbiAgICogVGhlIFwiZGVzdFwiIHN0cmluZyBpcyB0aGUgcHJvcGVydHkgbmFtZSBpbiBvYmplY3QgcmV0dXJuZWQgYnlcbiAgICogYGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyWydwYXJzZV9hcmdzJ11gLlxuICAgKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAgICogQHBhcmFtIHtGbGF0dGVuZWR9IFtmbGF0dGVuPXRydWVdIC0gSWYgYHRydWVgLCBmbGF0dGVucyB0aGUgcmV0dXJuZWQgb2JqZWN0XG4gICAqIHVzaW5nIFwia2V5cGF0aFwiLXN0eWxlIGtleXMgb2YgdGhlIGZvcm1hdCBgPGV4dFR5cGU+LjxleHROYW1lPi48YXJnTmFtZT5gLlxuICAgKiBPdGhlcndpc2UsIHJldHVybnMgYSBuZXN0ZWQgb2JqZWN0IHVzaW5nIGBleHRUeXBlYCBhbmQgYGV4dE5hbWVgIGFzXG4gICAqIHByb3BlcnRpZXMuIEJhc2UgYXJndW1lbnRzIChzZXJ2ZXIgYXJndW1lbnRzKSBhcmUgYWx3YXlzIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAqIEByZXR1cm5zIHtEZWZhdWx0VmFsdWVzPEZsYXR0ZW5lZD59XG4gICAqL1xuICBnZXREZWZhdWx0cyAoZmxhdHRlbiA9IC8qKiBAdHlwZSB7RmxhdHRlbmVkfSAqLyAodHJ1ZSkpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY2FsbGJhY2sgRGVmYXVsdFJlZHVjZXJcbiAgICAgKiBAcGFyYW0ge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gZGVmYXVsdHNcbiAgICAgKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWNcbiAgICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgICAqL1xuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFJlZHVjZXJ9ICovXG4gICAgY29uc3QgcmVkdWNlciA9IGZsYXR0ZW5cbiAgICAgID8gKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIGRlZmF1bHRzW2Rlc3RdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH1cbiAgICAgIDogKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgIF8uc2V0KGRlZmF1bHRzLCBkZXN0LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgIH07XG5cbiAgICAvKiogQHR5cGUge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gKi9cbiAgICBjb25zdCByZXR2YWwgPSB7fTtcbiAgICByZXR1cm4gWy4uLnRoaXMuX2FyZ1NwZWNzLnZhbHVlcygpXS5yZWR1Y2UocmVkdWNlciwgcmV0dmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZmxhdHRlbmVkIFJlY29yZCBvZiBkZWZhdWx0cyBmb3IgYSBzcGVjaWZpYyBleHRlbnNpb24uIEtleXMgd2lsbFxuICAgKiBiZSBvZiBmb3JtYXQgYDxhcmdOYW1lPmAuXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZSAtIEV4dGVuc2lvbiB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsQXJnU3BlY0RlZmF1bHRWYWx1ZT59XG4gICAqL1xuICBnZXREZWZhdWx0c0ZvckV4dGVuc2lvbiAoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIGlmICghdGhpcy5pc0ZpbmFsaXplZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IoKTtcbiAgICB9XG4gICAgY29uc3Qgc3BlY3MgPSBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLmZpbHRlcihcbiAgICAgIChzcGVjKSA9PiBzcGVjLmV4dFR5cGUgPT09IGV4dFR5cGUgJiYgc3BlYy5leHROYW1lID09PSBleHROYW1lLFxuICAgICk7XG4gICAgcmV0dXJuIHNwZWNzLnJlZHVjZSgoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIHJhd0Rlc3R9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBkZWZhdWx0c1tyYXdEZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBzY2hlbWEgaW50byBhbiBhcnJheSBvZiBgU2NoZW1hT2JqZWN0YHMgYW5kIGFzc29jaWF0ZWRcbiAgICoge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9LlxuICAgKlxuICAgKiBDb252ZXJ0cyBuZXN0ZWQgZXh0ZW5zaW9uIHNjaGVtYXMgdG8ga2V5cyBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kXG4gICAqIG5hbWUuIFVzZWQgd2hlbiB0cmFuc2xhdGluZyB0byBgYXJncGFyc2VgIG9wdGlvbnMgb3IgZ2V0dGluZyB0aGUgbGlzdCBvZlxuICAgKiBkZWZhdWx0IHZhbHVlcyAoc2VlIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9KSBmb3IgQ0xJIG9yIG90aGVyd2lzZS5cbiAgICpcbiAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnRlcm1lZGlhdGUgcmVwcnNlbnRhdGlvbiB1c2VkIGJ5IGBjbGktYXJnc2BcbiAgICogbW9kdWxlJ3MgYHRvUGFyc2VyQXJnc2AsIHdoaWNoIGNvbnZlcnRzIHRoZSBmaW5hbGl6ZWQgc2NoZW1hIHRvIHBhcmFtZXRlcnNcbiAgICogdXNlZCBieSBgYXJncGFyc2VgLlxuICAgKiBAdGhyb3dzIElmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LlxuICAgKiBAcmV0dXJucyB7RmxhdHRlbmVkU2NoZW1hfVxuICAgKi9cbiAgZmxhdHRlbiAoKSB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoKTtcblxuICAgIC8qKiBAdHlwZSB7IHtwcm9wZXJ0aWVzOiBTY2hlbWFPYmplY3QsIHByZWZpeDogc3RyaW5nW119W10gfSAqL1xuICAgIGNvbnN0IHN0YWNrID0gW3twcm9wZXJ0aWVzOiBzY2hlbWEucHJvcGVydGllcywgcHJlZml4OiBbXX1dO1xuICAgIC8qKiBAdHlwZSB7RmxhdHRlbmVkU2NoZW1hfSAqL1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFtdO1xuXG4gICAgLy8gdGhpcyBiaXQgaXMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIHJld3JpdHRlbiBhcyBhIGZvciBsb29wLlxuICAgIC8vIHdoZW4gd2UgZmluZCBzb21ldGhpbmcgd2Ugd2FudCB0byB0cmF2ZXJzZSwgd2UgYWRkIGl0IHRvIGBzdGFja2BcbiAgICBmb3IgKGNvbnN0IHtwcm9wZXJ0aWVzLCBwcmVmaXh9IG9mIHN0YWNrKSB7XG4gICAgICBjb25zdCBwYWlycyA9IF8udG9QYWlycyhwcm9wZXJ0aWVzKTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IHtwcm9wZXJ0aWVzLCAkcmVmfSA9IHZhbHVlO1xuICAgICAgICBpZiAocHJvcGVydGllcykge1xuICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIHByZWZpeDoga2V5ID09PSBTRVJWRVJfUFJPUF9OQU1FID8gW10gOiBbLi4ucHJlZml4LCBrZXldLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCRyZWYpIHtcbiAgICAgICAgICBsZXQgcmVmU2NoZW1hO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZWZTY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgkcmVmKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBleHRlbnNpb24gc2NoZW1hIHN1cHBsaWVzIGEgJHJlZiB0byBhIG5vbi1leGlzdGVudCBzY2hlbWFcbiAgICAgICAgICAgIHRocm93IG5ldyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IoJHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHtub3JtYWxpemVkRXh0TmFtZX0gPVxuICAgICAgICAgICAgQXJnU3BlYy5leHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCgkcmVmKTtcbiAgICAgICAgICBpZiAoIW5vcm1hbGl6ZWRFeHROYW1lKSB7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICAgICBgQ291bGQgbm90IGRldGVybWluZSBleHRlbnNpb24gbmFtZSBmcm9tIHNjaGVtYSBJRCAkeyRyZWZ9LiBUaGlzIGlzIGEgYnVnLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHJlZlNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBbLi4ucHJlZml4LCBrZXksIG5vcm1hbGl6ZWRFeHROYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IERSSVZFUl9UWVBFICYmIGtleSAhPT0gUExVR0lOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBbZXh0VHlwZSwgZXh0TmFtZV0gPSBwcmVmaXg7XG4gICAgICAgICAgY29uc3QgYXJnU3BlYyA9IHRoaXMuZ2V0QXJnU3BlYyhcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZX0gKi8gKGV4dFR5cGUpLFxuICAgICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghYXJnU3BlYykge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFVua25vd24gYXJndW1lbnQgd2l0aCBrZXkgJHtrZXl9LCBleHRUeXBlICR7ZXh0VHlwZX0gYW5kIGV4dE5hbWUgJHtleHROYW1lfS4gVGhpcyBpcyBhIGJ1Zy5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhdHRlbmVkLnB1c2goe3NjaGVtYTogXy5jbG9uZURlZXAodmFsdWUpLCBhcmdTcGVjfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGl0c2VsZlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRFxuICAgKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWRcbiAgICogQHJldHVybnMge1NjaGVtYU9iamVjdH1cbiAgICovXG4gIGdldFNjaGVtYSAocmVmID0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtTY2hlbWFPYmplY3R9ICovICh0aGlzLl9nZXRWYWxpZGF0b3IocmVmKS5zY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBzY2hlbWEgdmFsaWRhdG9yIGZ1bmN0aW9uIGZyb20gQWp2XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaWRdIC0gU2NoZW1hIElEXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLlZhbGlkYXRlRnVuY3Rpb259XG4gICAqL1xuICBfZ2V0VmFsaWRhdG9yIChpZCA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fYWp2LmdldFNjaGVtYShpZCk7XG4gICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgIGlmIChpZCA9PT0gQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgU2NoZW1hVW5rbm93blNjaGVtYUVycm9yKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBvYmplY3QsIHZhbGlkYXRlcyBpdCBhZ2FpbnN0IHRoZSBBcHBpdW0gY29uZmlnIHNjaGVtYS5cbiAgICogSWYgZXJyb3JzIG9jY3VyLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBiZSBub24tZW1wdHkuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSAoaG9wZWZ1bGx5IGFuIG9iamVjdCkgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRCBvciByZWYuXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuRXJyb3JPYmplY3RbXX0gQXJyYXkgb2YgZXJyb3JzLCBpZiBhbnkuXG4gICAqL1xuICB2YWxpZGF0ZSAodmFsdWUsIHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fZ2V0VmFsaWRhdG9yKHJlZik7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKVxuICAgICAgPyBbLi4udmFsaWRhdG9yLmVycm9yc11cbiAgICAgIDogW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYGZpbGVuYW1lYCdzIGZpbGUgZXh0ZW5zaW9uIGlzIGFsbG93ZWQgKGluIHtAbGluayBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TfSkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHN0YXRpYyBpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9uIChmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgc2NoZW1hYCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgbm9uLXRydWUgYCRhc3luY2AgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWEgLSBTY2hlbWEgdG8gY2hlY2tcbiAgICogQHJldHVybnMge3NjaGVtYSBpcyBTY2hlbWFPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRTY2hlbWFUeXBlIChzY2hlbWEpIHtcbiAgICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KHNjaGVtYSkgJiYgc2NoZW1hLiRhc3luYyAhPT0gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB7QGxpbmsgQXBwaXVtU2NoZW1hfSBpbnN0YW5jZSBoYXMgbm90IHlldCBiZWVuIGZpbmFsaXplZCwgYnV0XG4gKiB0aGUgbWV0aG9kIGNhbGxlZCByZXF1aXJlcyBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpbmFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfRklOQUxJWkFUSU9OJztcblxuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoJ1NjaGVtYSBub3QgeWV0IGZpbmFsaXplZDsgYGZpbmFsaXplKClgIG11c3QgYmUgY2FsbGVkIGZpcnN0LicpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBcInVuaXF1ZVwiIHNjaGVtYSBJRCBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWEgSUQuXG4gKlxuICogVGhpcyBpcyBsaWtlbHkgZ29pbmcgdG8gYmUgY2F1c2VkIGJ5IGF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc2NoZW1hIHR3aWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9OQU1FX0NPTkZMSUNUJztcblxuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHtleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IgKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihcbiAgICAgIGBOYW1lIGZvciAke2V4dFR5cGV9IHNjaGVtYSBcIiR7ZXh0TmFtZX1cIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBzY2hlbWFgLFxuICAgICk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hSWQpIHtcbiAgICBzdXBlcihgVW5rbm93biBzY2hlbWE6IFwiJHtzY2hlbWFJZH1cImApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWFJZH07XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNjaGVtYSBpcyBwcm92aWRlZCwgYnV0IGl0J3Mgb2YgYW4gdW5zdXBwb3J0ZWQgdHlwZS5cbiAqXG4gKiBcIlZhbGlkXCIgc2NoZW1hcyB3aGljaCBhcmUgdW5zdXBwb3J0ZWQgaW5jbHVkZSBib29sZWFuIHNjaGVtYXMgYW5kIGFzeW5jIHNjaGVtYXNcbiAqIChoYXZpbmcgYSBgdHJ1ZWAgYCRhc3luY2AgcHJvcGVydHkpLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hVW5zdXBwb3J0ZWRTY2hlbWFFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTlNVUFBPUlRFRF9TQ0hFTUEnO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8e3NjaGVtYTogYW55LCBleHRUeXBlOiBFeHRlbnNpb25UeXBlLCBleHROYW1lOiBzdHJpbmd9Pn1cbiAgICovXG4gIGRhdGE7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWFcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHROYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvciAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy84Mjc3XG4gICAgc3VwZXIoXG4gICAgICAoKCkgPT4ge1xuICAgICAgICBsZXQgbXNnID0gYFVuc3VwcG9ydGVkIHNjaGVtYSBmcm9tICR7ZXh0VHlwZX0gXCIke2V4dE5hbWV9XCI6YDtcbiAgICAgICAgaWYgKF8uaXNCb29sZWFuKHNjaGVtYSkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGEgYm9vbGVhbmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChzY2hlbWEpKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYS4kYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBjYW5ub3QgYmUgYW4gYXN5bmMgc2NoZW1hYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgYHNjaGVtYSBJUyBzdXBwb3J0ZWQ7IHRoaXMgZXJyb3Igc2hvdWxkIG5vdCBiZSB0aHJvd24gKHRoaXMgaXMgYSBidWcpLiB2YWx1ZSBvZiBzY2hlbWE6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHNjaGVtYSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHttc2d9IHNjaGVtYSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0IHdpdGhvdXQgYSB0cnVlIFwiJGFzeW5jXCIgcHJvcGVydHlgO1xuICAgICAgfSkoKSxcbiAgICApO1xuICAgIHRoaXMuZGF0YSA9IHtzY2hlbWEsIGV4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbmNvbnN0IGFwcGl1bVNjaGVtYSA9IEFwcGl1bVNjaGVtYS5jcmVhdGUoKTtcblxuZXhwb3J0IGNvbnN0IHtcbiAgcmVnaXN0ZXJTY2hlbWEsXG4gIGdldEFsbEFyZ1NwZWNzLFxuICBnZXRBcmdTcGVjLFxuICBoYXNBcmdTcGVjLFxuICBpc0ZpbmFsaXplZCxcbiAgZmluYWxpemU6IGZpbmFsaXplU2NoZW1hLFxuICByZXNldDogcmVzZXRTY2hlbWEsXG4gIHZhbGlkYXRlLFxuICBnZXRTY2hlbWEsXG4gIGZsYXR0ZW46IGZsYXR0ZW5TY2hlbWEsXG4gIGdldERlZmF1bHRzOiBnZXREZWZhdWx0c0ZvclNjaGVtYSxcbiAgZ2V0RGVmYXVsdHNGb3JFeHRlbnNpb24sXG59ID0gYXBwaXVtU2NoZW1hO1xuZXhwb3J0IGNvbnN0IHtpc0FsbG93ZWRTY2hlbWFGaWxlRXh0ZW5zaW9ufSA9IEFwcGl1bVNjaGVtYTtcblxuLyoqXG4gKiBBcHBpdW0gb25seSBzdXBwb3J0cyBzY2hlbWFzIHRoYXQgYXJlIHBsYWluIG9iamVjdHM7IG5vdCBhcnJheXMuXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdhanYnKS5TY2hlbWFPYmplY3QgJiB7W2tleTogbnVtYmVyXTogbmV2ZXJ9fSBTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2V4dGVuc2lvbi9tYW5pZmVzdCcpLkV4dGVuc2lvblR5cGV9IEV4dGVuc2lvblR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBoYXZpbmcgcHJvcGVydHkgYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIFN0cmljdFByb3BcbiAqIEBwcm9wZXJ0eSB7ZmFsc2V9IGFkZGl0aW9uYWxQcm9wZXJ0aWVzXG4gKi9cblxuLyoqXG4gKiBBIHtAbGluayBTY2hlbWFPYmplY3R9IHdpdGggYGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZWBcbiAqIEB0eXBlZGVmIHtTY2hlbWFPYmplY3QgJiBTdHJpY3RQcm9wfSBTdHJpY3RTY2hlbWFPYmplY3RcbiAqL1xuXG4vKipcbiAqIEEgbGlzdCBvZiBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0aWVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBBcmdTcGVjfSBvYmplY3RzLlxuICpcbiAqIEludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZSB1c2VkIHdoZW4gY29udmVydGluZyB0aGUgZW50aXJlIHNjaGVtYSBkb3duIHRvIENMSSBhcmd1bWVudHMuXG4gKiBAdHlwZWRlZiB7IHtzY2hlbWE6IFNjaGVtYU9iamVjdCwgYXJnU3BlYzogQXJnU3BlY31bXSB9IEZsYXR0ZW5lZFNjaGVtYVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FyZ1NwZWNbJ2RlZmF1bHRWYWx1ZSddfSBBcmdTcGVjRGVmYXVsdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBlLmcuIGB7ZHJpdmVyOiB7Zm9vOiAnYmFyJ319YCB3aGVyZSBgZm9vYCBpcyB0aGUgYXJnIG5hbWUgYW5kIGBiYXJgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsUmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPj59IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9XG4gKiBAdGVtcGxhdGUge2Jvb2xlYW58dW5kZWZpbmVkfSBGbGF0dGVuZWRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLEZsYXR0ZW5lZCBleHRlbmRzIHRydWUgPyBBcmdTcGVjRGVmYXVsdFZhbHVlIDogQXJnU3BlY0RlZmF1bHRWYWx1ZSB8IE5lc3RlZEFyZ1NwZWNEZWZhdWx0VmFsdWU+fSBEZWZhdWx0VmFsdWVzXG4gKi9cbiJdfQ==
|