scoundrel-remote-eval 1.0.25 → 1.0.28
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/build/client/index.d.ts +3 -1
- package/build/client/index.d.ts.map +1 -1
- package/build/client/index.js +37 -21
- package/build/client/reference.d.ts +3 -1
- package/build/client/reference.d.ts.map +1 -1
- package/build/client/reference.js +4 -2
- package/build/utils/safe-json-stringify.d.ts.map +1 -1
- package/build/utils/safe-json-stringify.js +32 -5
- package/package.json +1 -1
package/build/client/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export default class Client {
|
|
|
27
27
|
/** @type {Record<number, any>} */
|
|
28
28
|
objects: Record<number, any>;
|
|
29
29
|
objectsCount: number;
|
|
30
|
+
instanceId: any;
|
|
30
31
|
/** @type {boolean} */
|
|
31
32
|
serverControlEnabled: boolean;
|
|
32
33
|
/**
|
|
@@ -301,9 +302,10 @@ export default class Client {
|
|
|
301
302
|
/**
|
|
302
303
|
* Spawns a new reference to an object
|
|
303
304
|
* @param {string} id Reference identifier
|
|
305
|
+
* @param {string | undefined} [instanceId] Owning instance identifier
|
|
304
306
|
* @returns {Reference} Reference instance
|
|
305
307
|
*/
|
|
306
|
-
spawnReference(id: string): Reference;
|
|
308
|
+
spawnReference(id: string, instanceId?: string | undefined): Reference;
|
|
307
309
|
enableServerControl(): void;
|
|
308
310
|
}
|
|
309
311
|
export type Proxy = import("./reference-proxy.js").Proxy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"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"}
|
package/build/client/index.js
CHANGED
|
@@ -4,6 +4,12 @@ import Reference from "./reference.js";
|
|
|
4
4
|
import referenceProxy from "./reference-proxy.js";
|
|
5
5
|
import safeJSONStringify from "../utils/safe-json-stringify.js";
|
|
6
6
|
const logger = new Logger("Scoundrel Client");
|
|
7
|
+
const generateInstanceId = () => {
|
|
8
|
+
const randomUUID = globalThis.crypto?.randomUUID;
|
|
9
|
+
if (typeof randomUUID === "function")
|
|
10
|
+
return randomUUID.call(globalThis.crypto);
|
|
11
|
+
return `scoundrel-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
12
|
+
};
|
|
7
13
|
/** @typedef {import("./reference-proxy.js").Proxy} Proxy */
|
|
8
14
|
// logger.setDebug(true)
|
|
9
15
|
/**
|
|
@@ -95,7 +101,7 @@ export default class Client {
|
|
|
95
101
|
}
|
|
96
102
|
const objectId = ++this.objectsCount;
|
|
97
103
|
this.objects[objectId] = object;
|
|
98
|
-
this.respondToCommand(commandID, { object_id: objectId });
|
|
104
|
+
this.respondToCommand(commandID, { object_id: objectId, instance_id: this.instanceId });
|
|
99
105
|
}
|
|
100
106
|
else if (command == "new_object_with_reference") {
|
|
101
107
|
const className = data.class_name;
|
|
@@ -111,13 +117,14 @@ export default class Client {
|
|
|
111
117
|
}
|
|
112
118
|
const objectId = ++this.objectsCount;
|
|
113
119
|
this.objects[objectId] = object;
|
|
114
|
-
this.respondToCommand(commandID, { object_id: objectId });
|
|
120
|
+
this.respondToCommand(commandID, { object_id: objectId, instance_id: this.instanceId });
|
|
115
121
|
}
|
|
116
122
|
else if (command == "call_method_on_reference") {
|
|
117
123
|
const referenceId = data.reference_id;
|
|
118
124
|
const object = this.objects[referenceId];
|
|
119
|
-
if (!
|
|
125
|
+
if (!Object.prototype.hasOwnProperty.call(this.objects, referenceId)) {
|
|
120
126
|
throw new Error(`No object by that ID: ${referenceId}`);
|
|
127
|
+
}
|
|
121
128
|
const method = object[data.method_name];
|
|
122
129
|
if (!method)
|
|
123
130
|
throw new Error(`No method called '${data.method_name}' on a '${object.constructor.name}'`);
|
|
@@ -125,7 +132,7 @@ export default class Client {
|
|
|
125
132
|
if (data.with == "reference") {
|
|
126
133
|
const objectId = ++this.objectsCount;
|
|
127
134
|
this.objects[objectId] = responseValue;
|
|
128
|
-
this.respondToCommand(commandID, { response: objectId });
|
|
135
|
+
this.respondToCommand(commandID, { response: objectId, instance_id: this.instanceId });
|
|
129
136
|
}
|
|
130
137
|
else {
|
|
131
138
|
this.respondToCommand(commandID, { response: responseValue });
|
|
@@ -149,8 +156,9 @@ export default class Client {
|
|
|
149
156
|
else if (command == "serialize_reference") {
|
|
150
157
|
const referenceId = data.reference_id;
|
|
151
158
|
const object = this.objects[referenceId];
|
|
152
|
-
if (!
|
|
159
|
+
if (!Object.prototype.hasOwnProperty.call(this.objects, referenceId)) {
|
|
153
160
|
throw new Error(`No object by that ID: ${referenceId}`);
|
|
161
|
+
}
|
|
154
162
|
const serialized = safeJSONStringify(object);
|
|
155
163
|
this.respondToCommand(commandID, serialized);
|
|
156
164
|
}
|
|
@@ -159,13 +167,14 @@ export default class Client {
|
|
|
159
167
|
const referenceId = data.reference_id;
|
|
160
168
|
const returnWith = data.with;
|
|
161
169
|
const object = this.objects[referenceId];
|
|
162
|
-
if (!
|
|
170
|
+
if (!Object.prototype.hasOwnProperty.call(this.objects, referenceId)) {
|
|
163
171
|
throw new Error(`No object by that ID: ${referenceId}`);
|
|
172
|
+
}
|
|
164
173
|
const attribute = object[attributeName];
|
|
165
174
|
if (returnWith == "reference") {
|
|
166
175
|
const objectId = ++this.objectsCount;
|
|
167
176
|
this.objects[objectId] = attribute;
|
|
168
|
-
this.respondToCommand(commandID, { response: objectId });
|
|
177
|
+
this.respondToCommand(commandID, { response: objectId, instance_id: this.instanceId });
|
|
169
178
|
}
|
|
170
179
|
else {
|
|
171
180
|
this.respondToCommand(commandID, { response: attribute });
|
|
@@ -176,7 +185,7 @@ export default class Client {
|
|
|
176
185
|
if (data.with_reference) {
|
|
177
186
|
const objectId = ++this.objectsCount;
|
|
178
187
|
this.objects[objectId] = evalResult;
|
|
179
|
-
this.respondToCommand(commandID, { object_id: objectId });
|
|
188
|
+
this.respondToCommand(commandID, { object_id: objectId, instance_id: this.instanceId });
|
|
180
189
|
}
|
|
181
190
|
else {
|
|
182
191
|
this.respondToCommand(commandID, { response: evalResult });
|
|
@@ -283,6 +292,7 @@ export default class Client {
|
|
|
283
292
|
/** @type {Record<number, any>} */
|
|
284
293
|
this.objects = {};
|
|
285
294
|
this.objectsCount = 0;
|
|
295
|
+
this.instanceId = generateInstanceId();
|
|
286
296
|
/** @type {boolean} */
|
|
287
297
|
this.serverControlEnabled = Boolean(options.enableServerControl);
|
|
288
298
|
}
|
|
@@ -383,7 +393,7 @@ export default class Client {
|
|
|
383
393
|
const objectId = result.response;
|
|
384
394
|
if (!objectId)
|
|
385
395
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
386
|
-
const spawnedReference = this.spawnReference(objectId);
|
|
396
|
+
const spawnedReference = this.spawnReference(objectId, result.instance_id);
|
|
387
397
|
return returnProxy ? referenceProxy(spawnedReference) : spawnedReference;
|
|
388
398
|
}
|
|
389
399
|
return result.response;
|
|
@@ -417,7 +427,7 @@ export default class Client {
|
|
|
417
427
|
const objectId = result.object_id;
|
|
418
428
|
if (!objectId)
|
|
419
429
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
420
|
-
const spawnedReference = this.spawnReference(objectId);
|
|
430
|
+
const spawnedReference = this.spawnReference(objectId, result.instance_id);
|
|
421
431
|
return referenceProxy(spawnedReference);
|
|
422
432
|
}
|
|
423
433
|
/**
|
|
@@ -438,7 +448,7 @@ export default class Client {
|
|
|
438
448
|
const objectId = result.object_id;
|
|
439
449
|
if (!objectId)
|
|
440
450
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
441
|
-
return this.spawnReference(objectId);
|
|
451
|
+
return this.spawnReference(objectId, result.instance_id);
|
|
442
452
|
}
|
|
443
453
|
/**
|
|
444
454
|
* Evaluates a string and returns the result directly
|
|
@@ -476,7 +486,7 @@ export default class Client {
|
|
|
476
486
|
if (!result.object_id)
|
|
477
487
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
478
488
|
const id = result.object_id;
|
|
479
|
-
const spawnedReference = this.spawnReference(id);
|
|
489
|
+
const spawnedReference = this.spawnReference(id, result.instance_id);
|
|
480
490
|
return referenceProxy(spawnedReference);
|
|
481
491
|
}
|
|
482
492
|
/**
|
|
@@ -496,7 +506,7 @@ export default class Client {
|
|
|
496
506
|
if (!result.object_id)
|
|
497
507
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
498
508
|
const id = result.object_id;
|
|
499
|
-
return this.spawnReference(id);
|
|
509
|
+
return this.spawnReference(id, result.instance_id);
|
|
500
510
|
}
|
|
501
511
|
/**
|
|
502
512
|
* Imports a module and returns the serialized result
|
|
@@ -530,7 +540,7 @@ export default class Client {
|
|
|
530
540
|
if (!result)
|
|
531
541
|
throw new Error("Blank result given");
|
|
532
542
|
const id = result.object_id;
|
|
533
|
-
return this.spawnReference(id);
|
|
543
|
+
return this.spawnReference(id, result.instance_id);
|
|
534
544
|
}
|
|
535
545
|
/**
|
|
536
546
|
* Gets a registered object by name and returns the serialized result
|
|
@@ -559,7 +569,7 @@ export default class Client {
|
|
|
559
569
|
const id = result.object_id;
|
|
560
570
|
if (!id)
|
|
561
571
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
562
|
-
const spawnedReference = this.spawnReference(id);
|
|
572
|
+
const spawnedReference = this.spawnReference(id, result.instance_id);
|
|
563
573
|
return referenceProxy(spawnedReference);
|
|
564
574
|
}
|
|
565
575
|
/**
|
|
@@ -580,7 +590,7 @@ export default class Client {
|
|
|
580
590
|
const id = result.object_id;
|
|
581
591
|
if (!id)
|
|
582
592
|
throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
|
|
583
|
-
return this.spawnReference(id);
|
|
593
|
+
return this.spawnReference(id, result.instance_id);
|
|
584
594
|
}
|
|
585
595
|
/**
|
|
586
596
|
* Spawns a new reference to an object and returns the serialized result
|
|
@@ -613,10 +623,15 @@ export default class Client {
|
|
|
613
623
|
return arg.map((argInArray) => this.parseArg(argInArray));
|
|
614
624
|
}
|
|
615
625
|
else if (arg instanceof Reference) {
|
|
616
|
-
|
|
626
|
+
/** @type {Record<string, any>} */
|
|
627
|
+
const referencePayload = {
|
|
617
628
|
__scoundrel_object_id: arg.id,
|
|
618
629
|
__scoundrel_type: "reference"
|
|
619
630
|
};
|
|
631
|
+
if (arg.instanceId) {
|
|
632
|
+
referencePayload.__scoundrel_instance_id = arg.instanceId;
|
|
633
|
+
}
|
|
634
|
+
return referencePayload;
|
|
620
635
|
}
|
|
621
636
|
else if (this.isPlainObject(arg)) {
|
|
622
637
|
/** @type {Record<any, any>} */
|
|
@@ -782,7 +797,7 @@ export default class Client {
|
|
|
782
797
|
if (!withReference)
|
|
783
798
|
return result.response;
|
|
784
799
|
const id = result.response;
|
|
785
|
-
const spawnedReference = this.spawnReference(id);
|
|
800
|
+
const spawnedReference = this.spawnReference(id, result.instance_id);
|
|
786
801
|
return returnProxy ? referenceProxy(spawnedReference) : spawnedReference;
|
|
787
802
|
}
|
|
788
803
|
/**
|
|
@@ -897,10 +912,11 @@ export default class Client {
|
|
|
897
912
|
/**
|
|
898
913
|
* Spawns a new reference to an object
|
|
899
914
|
* @param {string} id Reference identifier
|
|
915
|
+
* @param {string | undefined} [instanceId] Owning instance identifier
|
|
900
916
|
* @returns {Reference} Reference instance
|
|
901
917
|
*/
|
|
902
|
-
spawnReference(id) {
|
|
903
|
-
const reference = new Reference(this, id);
|
|
918
|
+
spawnReference(id, instanceId) {
|
|
919
|
+
const reference = new Reference(this, id, instanceId);
|
|
904
920
|
this.references[id] = reference;
|
|
905
921
|
return reference;
|
|
906
922
|
}
|
|
@@ -908,4 +924,4 @@ export default class Client {
|
|
|
908
924
|
this.serverControlEnabled = true;
|
|
909
925
|
}
|
|
910
926
|
}
|
|
911
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBRTdDLDREQUE0RDtBQUU1RCx3QkFBd0I7QUFFeEI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sTUFBTTtJQUN6Qjs7OztPQUlHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUErWGpDOzs7Ozs7OztXQVFHO1FBQ0gsY0FBUyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsRUFBQyxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXhGLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ3pDLElBQUks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bEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUE7UUFFdkYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLEVBQUU7UUFDZixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUE7UUFFL0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuaW1wb3J0IHJlZmVyZW5jZVByb3h5IGZyb20gXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2NvdW5kcmVsIENsaWVudFwiKVxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vcmVmZXJlbmNlLXByb3h5LmpzXCIpLlByb3h5fSBQcm94eSAqL1xuXG4vLyBsb2dnZXIuc2V0RGVidWcodHJ1ZSlcblxuLyoqXG4gKiBAdHlwZWRlZiB7e3JlZmVyZW5jZT86IGJvb2xlYW4sIHJlc3VsdD86IGJvb2xlYW4sIHByb3h5PzogYm9vbGVhbn19IFJldHVybk9wdGlvbnNcbiAqIEB0eXBlZGVmIHtSZXR1cm5PcHRpb25zICYge3Jlc3VsdD86IGZhbHNlfX0gUmV0dXJuUmVmZXJlbmNlT3B0aW9uc1xuICogQHR5cGVkZWYge1JldHVybk9wdGlvbnMgJiB7cmVzdWx0OiB0cnVlLCByZWZlcmVuY2U/OiBmYWxzZX19IFJldHVyblJlc3VsdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2NvdW5kcmVsIENsaWVudFxuICAgKiBAcGFyYW0ge2FueX0gYmFja2VuZCBUaGUgYmFja2VuZCBjb25uZWN0aW9uIChlLmcuLCBXZWJTb2NrZXQpXG4gICAqIEBwYXJhbSB7e2VuYWJsZVNlcnZlckNvbnRyb2w/OiBib29sZWFufX0gW29wdGlvbnNdIENsaWVudCBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmRcbiAgICB0aGlzLmJhY2tlbmQub25Db21tYW5kKHRoaXMub25Db21tYW5kKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5pbmNvbWluZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9jbGFzc2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9vYmplY3RzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPn0gKi9cbiAgICB0aGlzLnJlZmVyZW5jZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub2JqZWN0cyA9IHt9XG5cbiAgICB0aGlzLm9iamVjdHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gQm9vbGVhbihvcHRpb25zLmVuYWJsZVNlcnZlckNvbnRyb2wpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5iYWNrZW5kLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHk+fSBSZWZlcmVuY2Ugb3IgcHJveHkgdG8gdGhlIHJldHVybmVkIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9ucyB8IGFueX0gW29wdGlvbnNPckFyZ10gT3B0aW9ucyBmb3IgdGhlIGNhbGwgb3IgZmlyc3QgYXJndW1lbnRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBSZXN1bHQgb3IgcmVmZXJlbmNlIGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIG9wdGlvbnNPckFyZywgLi4uYXJncykge1xuICAgIGNvbnN0IGFsbG93ZWRPcHRpb25zID0gbmV3IFNldChbXCJyZWZlcmVuY2VcIiwgXCJyZXN1bHRcIiwgXCJwcm94eVwiXSlcbiAgICAvKiogQHR5cGUge1JldHVybk9wdGlvbnMgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9wdGlvbnNcbiAgICAvKiogQHR5cGUge2FueVtdfSAqL1xuICAgIGxldCBtZXRob2RBcmdzXG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbWV0aG9kQXJncyA9IGFyZ3NcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JBcmcpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMob3B0aW9uc09yQXJnKVxuICAgICAgY29uc3QgaGFzT3B0aW9uS2V5ID0gb3B0aW9uS2V5cy5zb21lKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuXG4gICAgICBpZiAoaGFzT3B0aW9uS2V5KSB7XG4gICAgICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gb3B0aW9uS2V5cy5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICBpZiAodW5rbm93bk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWVzQXJlQm9vbGVhbiA9IG9wdGlvbktleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgICAgICAuZXZlcnkoKGtleSkgPT4gdHlwZW9mIG9wdGlvbnNPckFyZ1trZXldID09PSBcImJvb2xlYW5cIilcblxuICAgICAgICAgIGlmIChvcHRpb25WYWx1ZXNBcmVCb29sZWFuKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAob3B0aW9uc09yQXJnKVxuICAgICAgICAgICAgbWV0aG9kQXJncyA9IGFyZ3NcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjYWxsTWV0aG9kT25SZWZlcmVuY2Ugb3B0aW9uczogJHt1bmtub3duT3B0aW9ucy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbGxNZXRob2RPblJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2UgfHwgcmV0dXJuUHJveHlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcobWV0aG9kQXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiB3aXRoUmVmZXJlbmNlID8gXCJyZWZlcmVuY2VcIiA6IFwicmVzdWx0XCJcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgaWYgKHdpdGhSZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICAgIGNvbnN0IHNwYXduZWRSZWZlcmVuY2UgPSB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkKVxuICAgICAgcmV0dXJuIHJldHVyblByb3h5ID8gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSkgOiBzcGF3bmVkUmVmZXJlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc29sZS53YXJuKFwiU2NvdW5kcmVsIENsaWVudFwiLCBcImNhbGxNZXRob2RPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UgaXMgZGVwcmVjYXRlZDsgdXNlIGNhbGxNZXRob2RPblJlZmVyZW5jZSB3aXRoIHJlZmVyZW5jZSBpbnN0ZWFkLlwiKVxuICAgIHJldHVybiB0aGlzLmNhbGxNZXRob2RPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwge3JlZmVyZW5jZTogdHJ1ZX0sIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgcHJveHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcm94eT59IFByb3h5IHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGV2YWwoZXZhbFN0cmluZykge1xuICAgIGlmICh0eXBlb2YgZXZhbFN0cmluZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXZhbCByZXF1aXJlcyBhbiBldmFsIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJldmFsXCIsIHtcbiAgICAgIGV2YWxfc3RyaW5nOiBldmFsU3RyaW5nLFxuICAgICAgd2l0aF9yZWZlcmVuY2U6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3Qgb2JqZWN0SWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIW9iamVjdElkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2Uob2JqZWN0SWQpXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nIENvZGUgdG8gZXZhbHVhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBldmFsdWF0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGV2YWxSZWZlcmVuY2UoZXZhbFN0cmluZykge1xuICAgIGlmICh0eXBlb2YgZXZhbFN0cmluZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXZhbFJlZmVyZW5jZSByZXF1aXJlcyBhbiBldmFsIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJldmFsXCIsIHtcbiAgICAgIGV2YWxfc3RyaW5nOiBldmFsU3RyaW5nLFxuICAgICAgd2l0aF9yZWZlcmVuY2U6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3Qgb2JqZWN0SWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIW9iamVjdElkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2Uob2JqZWN0SWQpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBFdmFsdWF0ZWQgcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsUmVzdWx0KGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZXN1bHQgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiBmYWxzZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCEoXCJyZXNwb25zZVwiIGluIHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihgTm8gcmVzcG9uc2UgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIGEgcHJveHkgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGltcG9ydE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGltcG9ydE5hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcImltcG9ydCByZXF1aXJlcyBhIG1vZHVsZSBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiaW1wb3J0XCIsIHtcbiAgICAgIGltcG9ydF9uYW1lOiBpbXBvcnROYW1lXG4gICAgfSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiaW1wb3J0XCIsIHtyZXN1bHR9XSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3VsdC5vYmplY3RfaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcblxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgbW9kdWxlXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZWZlcmVuY2UoaW1wb3J0TmFtZSkge1xuICAgIGlmICh0eXBlb2YgaW1wb3J0TmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiaW1wb3J0UmVmZXJlbmNlIHJlcXVpcmVzIGEgbW9kdWxlIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJpbXBvcnRcIiwge1xuICAgICAgaW1wb3J0X25hbWU6IGltcG9ydE5hbWVcbiAgICB9KVxuXG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJpbXBvcnRcIiwge3Jlc3VsdH1dKVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIk5vIHJlc3VsdCBnaXZlblwiKVxuICAgIGlmICghcmVzdWx0Lm9iamVjdF9pZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyB0aGUgc2VyaWFsaXplZCByZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFNlcmlhbGl6ZWQgcmVzdWx0IGZvciB0aGUgbW9kdWxlXG4gICAqL1xuICBhc3luYyBpbXBvcnRSZXN1bHQoaW1wb3J0TmFtZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMuaW1wb3J0UmVmZXJlbmNlKGltcG9ydE5hbWUpXG4gICAgcmV0dXJuIGF3YWl0IHJlZmVyZW5jZS5zZXJpYWxpemUoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lIGFuZCByZXR1cm5zIGEgcHJveHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgUmVnaXN0ZXJlZCBvYmplY3QgbmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQcm94eT59IFByb3h5IHRvIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSlcbiAgICByZXR1cm4gcmVmZXJlbmNlUHJveHkocmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdFJlZmVyZW5jZShvYmplY3ROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3ROYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJnZXRPYmplY3RSZWZlcmVuY2UgcmVxdWlyZXMgYW4gb2JqZWN0IG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJnZXRfb2JqZWN0XCIsIHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3ROYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdFJlc3VsdChvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSlcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3QoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIm5ld09iamVjdCByZXF1aXJlcyBhIGNsYXNzIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBuZXcgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIG5ld09iamVjdFJlZmVyZW5jZShjbGFzc05hbWUsIC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwibmV3T2JqZWN0UmVmZXJlbmNlIHJlcXVpcmVzIGEgY2xhc3MgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIGNsYXNzX25hbWU6IGNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgc2VyaWFsaXplZCByZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFNlcmlhbGl6ZWQgcmVzdWx0IGZvciB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3RSZXN1bHQoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5uZXdPYmplY3RSZWZlcmVuY2UoY2xhc3NOYW1lLCAuLi5hcmdzKVxuICAgIHJldHVybiBhd2FpdCByZWZlcmVuY2Uuc2VyaWFsaXplKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IGlzIGEgcGxhaW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7YW55fSBpbnB1dCBWYWx1ZSB0byBpbnNwZWN0XG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIHdoZW4gdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0XG4gICAqL1xuICBpc1BsYWluT2JqZWN0KGlucHV0KSB7XG4gICAgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBpbmNvbWluZyBjb21tYW5kIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgQ29tbWFuZCBwYXlsb2FkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbW1hbmQgQ29tbWFuZCBuYW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1hbmRfaWQgQ29tbWFuZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzLmRhdGEgQ29tbWFuZCBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5lcnJvcl0gRXJyb3IgbWVzc2FnZSBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5lcnJvclN0YWNrXSBFcnJvciBzdGFjayBmcm9tIHRoZSBiYWNrZW5kXG4gICAqL1xuICBvbkNvbW1hbmQgPSAoe2NvbW1hbmQsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIC4uLnJlc3RBcmdzfSkgPT4ge1xuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wib25Db21tYW5kXCIsIHtjb21tYW5kLCBjb21tYW5kSUQsIGRhdGEsIGVycm9yLCBlcnJvclN0YWNrLCByZXN0QXJnc31dKVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvbW1hbmQga2V5IGdpdmVuIGluIGRhdGE6ICR7T2JqZWN0LmtleXMocmVzdEFyZ3MpLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY29tbWFuZF9yZXNwb25zZVwiKSB7XG4gICAgICAgIGlmICghKGNvbW1hbmRJRCBpbiB0aGlzLm91dGdvaW5nQ29tbWFuZHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPdXRnb2luZyBjb21tYW5kICR7Y29tbWFuZElEfSBub3QgZm91bmQ6ICR7T2JqZWN0LmtleXModGhpcy5vdXRnb2luZ0NvbW1hbmRzKS5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNhdmVkQ29tbWFuZCA9IHRoaXMub3V0Z29pbmdDb21tYW5kc1tjb21tYW5kSURdXG5cbiAgICAgICAgZGVsZXRlIHRoaXMub3V0Z29pbmdDb21tYW5kc1tjb21tYW5kSURdXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JUb1Rocm93ID0gbmV3IEVycm9yKGVycm9yKVxuICAgICAgICAgIGNvbnN0IHNhbml0aXplU3RhY2sgPSAoc3RhY2spID0+IHtcbiAgICAgICAgICAgIGlmICghc3RhY2spIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrXG4gICAgICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgICAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS9ub2RlX21vZHVsZXNcXC93cy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClub2RlOi8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClub2RlOmludGVybmFsXFwvLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhLyg/Ol58XFwoKWludGVybmFsXFwvLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKFwiRXJyb3I6XCIpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZvcm1hdFNlY3Rpb24gPSAobGFiZWwsIHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IHNhbml0aXplU3RhY2soc3RhY2spXG4gICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBbYCR7bGFiZWx9ICR7bGluZXNbMF19YCwgLi4ubGluZXMuc2xpY2UoMSldXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29tYmluZWRTdGFjayA9IFtcbiAgICAgICAgICAgIGBFcnJvcjogJHtlcnJvcn1gLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTlREUkVMLVNFUlZFUl1cIiwgZXJyb3JTdGFjayksXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VORFJFTC1DTElFTlRdXCIsIGVycm9yVG9UaHJvdy5zdGFjayksXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VORFJFTC1DTElFTlRdXCIsIHNhdmVkQ29tbWFuZC5vcmlnaW5TdGFjayA/IGBDb21tYW5kIGNyZWF0ZWQgYXQ6XFxuJHtzYXZlZENvbW1hbmQub3JpZ2luU3RhY2t9YCA6IG51bGwpXG4gICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG5cbiAgICAgICAgICBlcnJvclRvVGhyb3cuc3RhY2sgPSBjb21iaW5lZFN0YWNrXG5cbiAgICAgICAgICBzYXZlZENvbW1hbmQucmVqZWN0KGVycm9yVG9UaHJvdylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIubG9nKCgpID0+IFtgUmVzb2x2aW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IHdpdGggZGF0YWAsIGRhdGFdKVxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZXNvbHZlKGRhdGEuZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZXJ2ZXJDb250cm9sRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBcIlNlcnZlciBjb250cm9sIGlzIGRpc2FibGVkXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImdldF9vYmplY3RcIikge1xuICAgICAgICBjb25zdCBzZXJ2ZXJPYmplY3QgPSB0aGlzLl9nZXRSZWdpc3RlcmVkT2JqZWN0KGRhdGEub2JqZWN0X25hbWUpXG4gICAgICAgIGNvbnN0IHNlcnZlckNsYXNzID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZENsYXNzKGRhdGEub2JqZWN0X25hbWUpXG4gICAgICAgIGxldCBvYmplY3RcblxuICAgICAgICBpZiAoc2VydmVyT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJPYmplY3RcbiAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJDbGFzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyQ2xhc3NcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmplY3QgPSBnbG9iYWxUaGlzW2RhdGEub2JqZWN0X25hbWVdXG5cbiAgICAgICAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBvYmplY3Q6ICR7ZGF0YS5vYmplY3RfbmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gZGF0YS5jbGFzc19uYW1lXG4gICAgICAgIGxldCBvYmplY3RcblxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgQ2xhc3NJbnN0YW5jZSA9IHRoaXMuZ2V0Q2xhc3MoY2xhc3NOYW1lKSB8fCBnbG9iYWxUaGlzW2NsYXNzTmFtZV1cblxuICAgICAgICAgIGlmICghQ2xhc3NJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGNsYXNzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgICAgICAgb2JqZWN0ID0gbmV3IENsYXNzSW5zdGFuY2UoLi4uZGF0YS5hcmdzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGNsYXNzIG5hbWU6ICR7dHlwZW9mIGNsYXNzTmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG9iamVjdFtkYXRhLm1ldGhvZF9uYW1lXVxuXG4gICAgICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCBjYWxsZWQgJyR7ZGF0YS5tZXRob2RfbmFtZX0nIG9uIGEgJyR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9J2ApXG5cbiAgICAgICAgY29uc3QgcmVzcG9uZFdpdGhWYWx1ZSA9IChyZXNwb25zZVZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEud2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IHJlc3BvbnNlVmFsdWVcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogb2JqZWN0SWR9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IHJlc3BvbnNlVmFsdWV9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWV0aG9kLmNhbGwob2JqZWN0LCAuLi5kYXRhLmFyZ3MpXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHR5cGVvZiByZXNwb25zZS50aGVuID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJlc3BvbnNlLnRoZW4ocmVzcG9uZFdpdGhWYWx1ZSkuY2F0Y2goKHByb21pc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKHByb21pc2VFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IHByb21pc2VFcnJvci5tZXNzYWdlLCBlcnJvclN0YWNrOiBwcm9taXNlRXJyb3Iuc3RhY2t9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKHByb21pc2VFcnJvcil9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uZFdpdGhWYWx1ZShyZXNwb25zZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic2VyaWFsaXplX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHNhZmVKU09OU3RyaW5naWZ5KG9iamVjdClcbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwgc2VyaWFsaXplZClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInJlYWRfYXR0cmlidXRlXCIpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGRhdGEuYXR0cmlidXRlX25hbWVcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCByZXR1cm5XaXRoID0gZGF0YS53aXRoXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG9iamVjdFthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICAgIGlmIChyZXR1cm5XaXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBhdHRyaWJ1dGVcbiAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IGF0dHJpYnV0ZX0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImV2YWxcIikge1xuICAgICAgICBjb25zdCByZXNwb25kV2l0aFJlc3VsdCA9IChldmFsUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEud2l0aF9yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gZXZhbFJlc3VsdFxuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWR9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IGV2YWxSZXN1bHR9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjb3BlID0gey4uLnRoaXMuX29iamVjdHMsIC4uLnRoaXMuX2NsYXNzZXN9XG4gICAgICAgIGNvbnN0IHJlc2VydmVkSWRlbnRpZmllcnMgPSBuZXcgU2V0KFtcbiAgICAgICAgICBcImJyZWFrXCIsXG4gICAgICAgICAgXCJjYXNlXCIsXG4gICAgICAgICAgXCJjYXRjaFwiLFxuICAgICAgICAgIFwiY2xhc3NcIixcbiAgICAgICAgICBcImNvbnN0XCIsXG4gICAgICAgICAgXCJjb250aW51ZVwiLFxuICAgICAgICAgIFwiZGVidWdnZXJcIixcbiAgICAgICAgICBcImRlZmF1bHRcIixcbiAgICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICAgIFwiZG9cIixcbiAgICAgICAgICBcImVsc2VcIixcbiAgICAgICAgICBcImV4cG9ydFwiLFxuICAgICAgICAgIFwiZXh0ZW5kc1wiLFxuICAgICAgICAgIFwiZmluYWxseVwiLFxuICAgICAgICAgIFwiZm9yXCIsXG4gICAgICAgICAgXCJmdW5jdGlvblwiLFxuICAgICAgICAgIFwiaWZcIixcbiAgICAgICAgICBcImltcG9ydFwiLFxuICAgICAgICAgIFwiaW5cIixcbiAgICAgICAgICBcImluc3RhbmNlb2ZcIixcbiAgICAgICAgICBcIm5ld1wiLFxuICAgICAgICAgIFwicmV0dXJuXCIsXG4gICAgICAgICAgXCJzdXBlclwiLFxuICAgICAgICAgIFwic3dpdGNoXCIsXG4gICAgICAgICAgXCJ0aGlzXCIsXG4gICAgICAgICAgXCJ0aHJvd1wiLFxuICAgICAgICAgIFwidHJ5XCIsXG4gICAgICAgICAgXCJ0eXBlb2ZcIixcbiAgICAgICAgICBcInZhclwiLFxuICAgICAgICAgIFwidm9pZFwiLFxuICAgICAgICAgIFwid2hpbGVcIixcbiAgICAgICAgICBcIndpdGhcIixcbiAgICAgICAgICBcInlpZWxkXCIsXG4gICAgICAgICAgXCJsZXRcIixcbiAgICAgICAgICBcImVudW1cIixcbiAgICAgICAgICBcImF3YWl0XCIsXG4gICAgICAgICAgXCJpbXBsZW1lbnRzXCIsXG4gICAgICAgICAgXCJwYWNrYWdlXCIsXG4gICAgICAgICAgXCJwcm90ZWN0ZWRcIixcbiAgICAgICAgICBcInN0YXRpY1wiLFxuICAgICAgICAgIFwiaW50ZXJmYWNlXCIsXG4gICAgICAgICAgXCJwcml2YXRlXCIsXG4gICAgICAgICAgXCJwdWJsaWNcIixcbiAgICAgICAgICBcImV2YWxcIlxuICAgICAgICBdKVxuXG4gICAgICAgIGNvbnN0IGlzVmFsaWRJZGVudGlmaWVyID0gKG5hbWUpID0+XG4gICAgICAgICAgL14oPzpbJF9dfFxccHtJRF9TdGFydH0pKD86WyRfXXxcXHB7SURfQ29udGludWV9KSokL3UudGVzdChuYW1lKSAmJiAhcmVzZXJ2ZWRJZGVudGlmaWVycy5oYXMobmFtZSlcblxuICAgICAgICBjb25zdCBzY29wZUtleXMgPSBPYmplY3Qua2V5cyhzY29wZSlcbiAgICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBzY29wZUtleXMuZmlsdGVyKChrZXkpID0+ICFpc1ZhbGlkSWRlbnRpZmllcihrZXkpKVxuXG4gICAgICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlZ2lzdGVyZWQgaWRlbnRpZmllcihzKTogJHtpbnZhbGlkS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSByZWdpc3RlcmVkIG9iamVjdHMvY2xhc3NlcyBhcmUgYXZhaWxhYmxlIGFzIGxvY2FscyBpbnNpZGUgdGhlIGV2YWxcbiAgICAgICAgY29uc3QgZXZhbHVhdG9yID0gbmV3IEZ1bmN0aW9uKFwiX19ldmFsU3RyaW5nXCIsIC4uLnNjb3BlS2V5cywgXCJyZXR1cm4gZXZhbChfX2V2YWxTdHJpbmcpXCIpXG4gICAgICAgIGNvbnN0IGV2YWxBcmdzID0gc2NvcGVLZXlzLm1hcCgoa2V5KSA9PiBzY29wZVtrZXldKVxuICAgICAgICBjb25zdCBldmFsU3RyaW5nID0gYChhc3luYyAoKSA9PiB7XFxuJHtkYXRhLmV2YWxfc3RyaW5nfVxcbn0pKClgXG4gICAgICAgIGNvbnN0IGV2YWxSZXN1bHQgPSBldmFsdWF0b3IoZXZhbFN0cmluZywgLi4uZXZhbEFyZ3MpXG5cbiAgICAgICAgaWYgKGV2YWxSZXN1bHQgJiYgdHlwZW9mIGV2YWxSZXN1bHQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBldmFsUmVzdWx0LnRoZW4ocmVzcG9uZFdpdGhSZXN1bHQpLmNhdGNoKChwcm9taXNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBwcm9taXNlRXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogcHJvbWlzZUVycm9yLnN0YWNrfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhwcm9taXNlRXJyb3IpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoUmVzdWx0KGV2YWxSZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogZXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogZXJyb3Iuc3RhY2t9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKGVycm9yKX0pXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyYXNlcyBhbiBhcmd1bWVudCBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplIGZvciB0cmFuc3BvcnRcbiAgICogQHJldHVybnMge2FueX0gU2VyaWFsaXplZCBhcmd1bWVudCBwYXlsb2FkXG4gICAqL1xuICBwYXJzZUFyZyhhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYXJnSW5BcnJheSkgPT4gdGhpcy5wYXJzZUFyZyhhcmdJbkFycmF5KSlcbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBhcmcuaWQsXG4gICAgICAgIF9fc2NvdW5kcmVsX3R5cGU6IFwicmVmZXJlbmNlXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XVxuXG4gICAgICAgIG5ld09iamVjdFtrZXldID0gdGhpcy5wYXJzZUFyZyh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9uc09yQXJnIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zT3JBcmcgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnN9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVmZXJlbmNlLCBwcm94eSwgb3IgcmVzdWx0XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lLCBvcHRpb25zT3JBcmcpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqL1xuICAgIGxldCBvcHRpb25zID0ge3JlZmVyZW5jZTogdHJ1ZX1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBvcHRpb25zID0ge3JlZmVyZW5jZTogdHJ1ZX1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JBcmcpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMob3B0aW9uc09yQXJnKVxuICAgICAgY29uc3QgaGFzT3B0aW9uS2V5ID0gb3B0aW9uS2V5cy5zb21lKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuXG4gICAgICBpZiAoaGFzT3B0aW9uS2V5KSB7XG4gICAgICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gb3B0aW9uS2V5cy5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICBpZiAodW5rbm93bk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRSZXR1cm4gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9uc09yQXJnLCBcInJlZmVyZW5jZVwiKVxuICAgICAgICAgICAgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnNPckFyZywgXCJyZXN1bHRcIilcbiAgICAgICAgICAgIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zT3JBcmcsIFwicHJveHlcIilcbiAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAoe1xuICAgICAgICAgICAgLi4uKGhhc0V4cGxpY2l0UmV0dXJuID8ge30gOiB7cmVmZXJlbmNlOiB0cnVlfSksXG4gICAgICAgICAgICAuLi5vcHRpb25zT3JBcmdcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UgZG9lcyBub3QgYWNjZXB0IHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UgZG9lcyBub3QgYWNjZXB0IHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuUmVmZXJlbmNlID0gb3B0aW9ucz8ucmVmZXJlbmNlID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUmVzdWx0ID0gb3B0aW9ucz8ucmVzdWx0ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUHJveHkgPSBvcHRpb25zPy5wcm94eSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVybkZsYWdzID0gW3JldHVyblJlZmVyZW5jZSwgcmV0dXJuUmVzdWx0LCByZXR1cm5Qcm94eV0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aFxuXG4gICAgaWYgKHJldHVybkZsYWdzID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgb3B0aW9ucywgYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSByZXN1bHQgb3IgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZXR1cm5PcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBBdHRyaWJ1dGUgdmFsdWUgb3IgcmVmZXJlbmNlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBBdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBSZXR1cm5PcHRpb25zfSBhdHRyaWJ1dGVOYW1lT3JPcHRpb25zIEF0dHJpYnV0ZSBuYW1lIG9yIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IFthdHRyaWJ1dGVOYW1lXSBBdHRyaWJ1dGUgbmFtZSB3aGVuIHVzaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBBdHRyaWJ1dGUgdmFsdWUgb3IgcmVmZXJlbmNlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvcHRpb25zXG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHRhcmdldEF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lXG5cbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIG9wdGlvbnMgPSAvKiogQHR5cGUge1JldHVybk9wdGlvbnN9ICovIChhdHRyaWJ1dGVOYW1lT3JPcHRpb25zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWFkQXR0cmlidXRlT25SZWZlcmVuY2Ugb3B0aW9uczogJHt1bmtub3duT3B0aW9ucy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0QXR0cmlidXRlTmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0QXR0cmlidXRlTmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldEF0dHJpYnV0ZU5hbWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2UgfHwgcmV0dXJuUHJveHlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwicmVhZF9hdHRyaWJ1dGVcIiwge1xuICAgICAgYXR0cmlidXRlX25hbWU6IHRhcmdldEF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogd2l0aFJlZmVyZW5jZSA/IFwicmVmZXJlbmNlXCIgOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIGlmICghd2l0aFJlZmVyZW5jZSkgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQucmVzcG9uc2VcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcblxuICAgIHJldHVybiByZXR1cm5Qcm94eSA/IHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpIDogc3Bhd25lZFJlZmVyZW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlIENsYXNzIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3RlckNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICghKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSkgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBkb2VzIG5vdCBleGlzdDogJHtjbGFzc05hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBpZiAoIShvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBkb2VzIG5vdCBleGlzdDogJHtvYmplY3ROYW1lfWApXG5cbiAgICBkZWxldGUgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byBhIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWFuZElkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBSZXNwb25zZSBwYXlsb2FkXG4gICAqL1xuICByZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJZCwgZGF0YSkge1xuICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YToge2NvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YX19KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgYmFja2VuZCBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgQ29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3BvbnNlIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3V0Z29pbmdDb21tYW5kQ291bnQgPSArK3RoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50XG4gICAgICBjb25zdCBvcmlnaW5FcnJvciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtjb21tYW5kfScgZGlzcGF0Y2hlZGApXG4gICAgICAvLyBTdHJpcCB0aGUgc2VuZENvbW1hbmQgZnJhbWUgdG8gaGlnaGxpZ2h0IHRoZSBjYWxsZXIgc2l0ZS5cbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uob3JpZ2luRXJyb3IsIHRoaXMuc2VuZENvbW1hbmQpXG4gICAgICBjb25zdCBjb21tYW5kRGF0YSA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgY29tbWFuZF9pZDogb3V0Z29pbmdDb21tYW5kQ291bnQsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW291dGdvaW5nQ29tbWFuZENvdW50XSA9IHtyZXNvbHZlLCByZWplY3QsIG9yaWdpblN0YWNrOiBvcmlnaW5FcnJvci5zdGFja31cbiAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiU2VuZGluZ1wiLCBjb21tYW5kRGF0YV0pXG4gICAgICB0aGlzLnNlbmQoY29tbWFuZERhdGEpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBkYXRhIHRvIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFBheWxvYWQgdG8gc2VuZFxuICAgKi9cbiAgc2VuZChkYXRhKSB7XG4gICAgdGhpcy5iYWNrZW5kLnNlbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFBhcnNlZCBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIiwge3JlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWR9KVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1JlZmVyZW5jZX0gUmVmZXJlbmNlIGluc3RhbmNlXG4gICAqL1xuICBzcGF3blJlZmVyZW5jZShpZCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UodGhpcywgaWQpXG5cbiAgICB0aGlzLnJlZmVyZW5jZXNbaWRdID0gcmVmZXJlbmNlXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlXG4gIH1cblxuICBlbmFibGVTZXJ2ZXJDb250cm9sKCkge1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSB0cnVlXG4gIH1cbn1cbiJdfQ==
|
|
927
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUUvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBQzdDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxFQUFFO0lBQzlCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFBO0lBQ2hELElBQUksT0FBTyxVQUFVLEtBQUssVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0UsT0FBTyxhQUFhLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDMUYsQ0FBQyxDQUFBO0FBRUQsNERBQTREO0FBRTVELHdCQUF3QjtBQUV4Qjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7O09BSUc7SUFDSCxZQUFZLE9BQU8sRUFBRSxPQUFPLEdBQUcsRUFBRTtRQWdZakM7Ozs7Ozs7O1dBUUc7UUFDSCxjQUFTLEdBQUcsQ0FBQyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxFQUFDLEVBQUUsRUFBRTtZQUNyRixN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QUMsQ0FBQTtZQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ3hCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksQ0FBQyxJQUFJO1FBQ1AsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVztRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUV2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVO1FBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUE7UUFFckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUE7UUFFL0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuaW1wb3J0IHJlZmVyZW5jZVByb3h5IGZyb20gXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2NvdW5kcmVsIENsaWVudFwiKVxuY29uc3QgZ2VuZXJhdGVJbnN0YW5jZUlkID0gKCkgPT4ge1xuICBjb25zdCByYW5kb21VVUlEID0gZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSURcbiAgaWYgKHR5cGVvZiByYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiByYW5kb21VVUlELmNhbGwoZ2xvYmFsVGhpcy5jcnlwdG8pXG4gIHJldHVybiBgc2NvdW5kcmVsLSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWBcbn1cblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiKS5Qcm94eX0gUHJveHkgKi9cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge3tyZWZlcmVuY2U/OiBib29sZWFuLCByZXN1bHQ/OiBib29sZWFuLCBwcm94eT86IGJvb2xlYW59fSBSZXR1cm5PcHRpb25zXG4gKiBAdHlwZWRlZiB7UmV0dXJuT3B0aW9ucyAmIHtyZXN1bHQ/OiBmYWxzZX19IFJldHVyblJlZmVyZW5jZU9wdGlvbnNcbiAqIEB0eXBlZGVmIHtSZXR1cm5PcHRpb25zICYge3Jlc3VsdDogdHJ1ZSwgcmVmZXJlbmNlPzogZmFsc2V9fSBSZXR1cm5SZXN1bHRPcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNjb3VuZHJlbCBDbGllbnRcbiAgICogQHBhcmFtIHthbnl9IGJhY2tlbmQgVGhlIGJhY2tlbmQgY29ubmVjdGlvbiAoZS5nLiwgV2ViU29ja2V0KVxuICAgKiBAcGFyYW0ge3tlbmFibGVTZXJ2ZXJDb250cm9sPzogYm9vbGVhbn19IFtvcHRpb25zXSBDbGllbnQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kXG4gICAgdGhpcy5iYWNrZW5kLm9uQ29tbWFuZCh0aGlzLm9uQ29tbWFuZClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMuaW5jb21pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fb2JqZWN0cyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT59ICovXG4gICAgdGhpcy5yZWZlcmVuY2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm9iamVjdHMgPSB7fVxuXG4gICAgdGhpcy5vYmplY3RzQ291bnQgPSAwXG4gICAgdGhpcy5pbnN0YW5jZUlkID0gZ2VuZXJhdGVJbnN0YW5jZUlkKClcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gQm9vbGVhbihvcHRpb25zLmVuYWJsZVNlcnZlckNvbnRyb2wpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5iYWNrZW5kLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHk+fSBSZWZlcmVuY2Ugb3IgcHJveHkgdG8gdGhlIHJldHVybmVkIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNhbGxcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9ucyB8IGFueX0gW29wdGlvbnNPckFyZ10gT3B0aW9ucyBmb3IgdGhlIGNhbGwgb3IgZmlyc3QgYXJndW1lbnRcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBSZXN1bHQgb3IgcmVmZXJlbmNlIGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIG9wdGlvbnNPckFyZywgLi4uYXJncykge1xuICAgIGNvbnN0IGFsbG93ZWRPcHRpb25zID0gbmV3IFNldChbXCJyZWZlcmVuY2VcIiwgXCJyZXN1bHRcIiwgXCJwcm94eVwiXSlcbiAgICAvKiogQHR5cGUge1JldHVybk9wdGlvbnMgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9wdGlvbnNcbiAgICAvKiogQHR5cGUge2FueVtdfSAqL1xuICAgIGxldCBtZXRob2RBcmdzXG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbWV0aG9kQXJncyA9IGFyZ3NcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JBcmcpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMob3B0aW9uc09yQXJnKVxuICAgICAgY29uc3QgaGFzT3B0aW9uS2V5ID0gb3B0aW9uS2V5cy5zb21lKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuXG4gICAgICBpZiAoaGFzT3B0aW9uS2V5KSB7XG4gICAgICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gb3B0aW9uS2V5cy5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICBpZiAodW5rbm93bk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWVzQXJlQm9vbGVhbiA9IG9wdGlvbktleXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgICAgICAuZXZlcnkoKGtleSkgPT4gdHlwZW9mIG9wdGlvbnNPckFyZ1trZXldID09PSBcImJvb2xlYW5cIilcblxuICAgICAgICAgIGlmIChvcHRpb25WYWx1ZXNBcmVCb29sZWFuKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAob3B0aW9uc09yQXJnKVxuICAgICAgICAgICAgbWV0aG9kQXJncyA9IGFyZ3NcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjYWxsTWV0aG9kT25SZWZlcmVuY2Ugb3B0aW9uczogJHt1bmtub3duT3B0aW9ucy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kQXJncyA9IFtvcHRpb25zT3JBcmcsIC4uLmFyZ3NdXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbGxNZXRob2RPblJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2UgfHwgcmV0dXJuUHJveHlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcobWV0aG9kQXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiB3aXRoUmVmZXJlbmNlID8gXCJyZWZlcmVuY2VcIiA6IFwicmVzdWx0XCJcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgaWYgKHdpdGhSZWZlcmVuY2UpIHtcbiAgICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICAgIGNvbnN0IHNwYXduZWRSZWZlcmVuY2UgPSB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gICAgICByZXR1cm4gcmV0dXJuUHJveHkgPyByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKSA6IHNwYXduZWRSZWZlcmVuY2VcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oXCJTY291bmRyZWwgQ2xpZW50XCIsIFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBpcyBkZXByZWNhdGVkOyB1c2UgY2FsbE1ldGhvZE9uUmVmZXJlbmNlIHdpdGggcmVmZXJlbmNlIGluc3RlYWQuXCIpXG4gICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCB7cmVmZXJlbmNlOiB0cnVlfSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbChldmFsU3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImV2YWxcIiwge1xuICAgICAgZXZhbF9zdHJpbmc6IGV2YWxTdHJpbmcsXG4gICAgICB3aXRoX3JlZmVyZW5jZTogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgZXZhbHVhdGVkIHZhbHVlXG4gICAqL1xuICBhc3luYyBldmFsUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZWZlcmVuY2UgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBFdmFsdWF0ZWQgcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsUmVzdWx0KGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZXN1bHQgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiBmYWxzZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCEoXCJyZXNwb25zZVwiIGluIHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihgTm8gcmVzcG9uc2UgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIGEgcHJveHkgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGltcG9ydE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGltcG9ydE5hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcImltcG9ydCByZXF1aXJlcyBhIG1vZHVsZSBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiaW1wb3J0XCIsIHtcbiAgICAgIGltcG9ydF9uYW1lOiBpbXBvcnROYW1lXG4gICAgfSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiaW1wb3J0XCIsIHtyZXN1bHR9XSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3VsdC5vYmplY3RfaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBpbXBvcnROYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbXBvcnRSZWZlcmVuY2UgcmVxdWlyZXMgYSBtb2R1bGUgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbXBvcnROYW1lIE1vZHVsZSBuYW1lIHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0UmVzdWx0KGltcG9ydE5hbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLmltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKVxuICAgIHJldHVybiBhd2FpdCByZWZlcmVuY2Uuc2VyaWFsaXplKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHByb3h5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0UmVmZXJlbmNlKG9iamVjdE5hbWUpXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHJlZmVyZW5jZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBSZWdpc3RlcmVkIG9iamVjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0TmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiZ2V0T2JqZWN0UmVmZXJlbmNlIHJlcXVpcmVzIGFuIG9iamVjdCBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdFJlc3VsdChvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSlcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3QoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIm5ld09iamVjdCByZXF1aXJlcyBhIGNsYXNzIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQsIHJlc3VsdC5pbnN0YW5jZV9pZClcblxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJuZXdPYmplY3RSZWZlcmVuY2UgcmVxdWlyZXMgYSBjbGFzcyBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVzdWx0KGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMubmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncylcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXQgVmFsdWUgdG8gaW5zcGVjdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuICAgKi9cbiAgaXNQbGFpbk9iamVjdChpbnB1dCkge1xuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIENvbW1hbmQgcGF5bG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21tYW5kX2lkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5kYXRhIENvbW1hbmQgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JdIEVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JTdGFja10gRXJyb3Igc3RhY2sgZnJvbSB0aGUgYmFja2VuZFxuICAgKi9cbiAgb25Db21tYW5kID0gKHtjb21tYW5kLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGRhdGEsIGVycm9yLCBlcnJvclN0YWNrLCAuLi5yZXN0QXJnc30pID0+IHtcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uQ29tbWFuZFwiLCB7Y29tbWFuZCwgY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgcmVzdEFyZ3N9XSlcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGtleSBnaXZlbiBpbiBkYXRhOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNvbW1hbmRfcmVzcG9uc2VcIikge1xuICAgICAgICBpZiAoIShjb21tYW5kSUQgaW4gdGhpcy5vdXRnb2luZ0NvbW1hbmRzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0Z29pbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gbm90IGZvdW5kOiAke09iamVjdC5rZXlzKHRoaXMub3V0Z29pbmdDb21tYW5kcykuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYXZlZENvbW1hbmQgPSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yVG9UaHJvdyA9IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZVN0YWNrID0gKHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvbm9kZV9tb2R1bGVzXFwvd3MvLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTovLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTppbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClpbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb3JtYXRTZWN0aW9uID0gKGxhYmVsLCBzdGFjaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSBzYW5pdGl6ZVN0YWNrKHN0YWNrKVxuICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gW2Ake2xhYmVsfSAke2xpbmVzWzBdfWAsIC4uLmxpbmVzLnNsaWNlKDEpXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGNvbWJpbmVkU3RhY2sgPSBbXG4gICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3J9YCxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5URFJFTC1TRVJWRVJdXCIsIGVycm9yU3RhY2spLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTkRSRUwtQ0xJRU5UXVwiLCBlcnJvclRvVGhyb3cuc3RhY2spLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTkRSRUwtQ0xJRU5UXVwiLCBzYXZlZENvbW1hbmQub3JpZ2luU3RhY2sgPyBgQ29tbWFuZCBjcmVhdGVkIGF0OlxcbiR7c2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrfWAgOiBudWxsKVxuICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuXG4gICAgICAgICAgZXJyb3JUb1Rocm93LnN0YWNrID0gY29tYmluZWRTdGFja1xuXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlamVjdChlcnJvclRvVGhyb3cpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbYFJlc29sdmluZyBjb21tYW5kICR7Y29tbWFuZElEfSB3aXRoIGRhdGFgLCBkYXRhXSlcbiAgICAgICAgICBzYXZlZENvbW1hbmQucmVzb2x2ZShkYXRhLmRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogXCJTZXJ2ZXIgY29udHJvbCBpcyBkaXNhYmxlZFwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJnZXRfb2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyT2JqZWN0ID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZE9iamVjdChkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBjb25zdCBzZXJ2ZXJDbGFzcyA9IHRoaXMuX2dldFJlZ2lzdGVyZWRDbGFzcyhkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHNlcnZlck9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyT2JqZWN0XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmVyQ2xhc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlckNsYXNzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqZWN0ID0gZ2xvYmFsVGhpc1tkYXRhLm9iamVjdF9uYW1lXVxuXG4gICAgICAgICAgaWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggb2JqZWN0OiAke2RhdGEub2JqZWN0X25hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBvYmplY3RcbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWQsIGluc3RhbmNlX2lkOiB0aGlzLmluc3RhbmNlSWR9KVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IGRhdGEuY2xhc3NfbmFtZVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGNvbnN0IENsYXNzSW5zdGFuY2UgPSB0aGlzLmdldENsYXNzKGNsYXNzTmFtZSkgfHwgZ2xvYmFsVGhpc1tjbGFzc05hbWVdXG5cbiAgICAgICAgICBpZiAoIUNsYXNzSW5zdGFuY2UpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBjbGFzczogJHtjbGFzc05hbWV9YClcblxuICAgICAgICAgIG9iamVjdCA9IG5ldyBDbGFzc0luc3RhbmNlKC4uLmRhdGEuYXJncylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERvbid0IGtub3cgaG93IHRvIGhhbmRsZSBjbGFzcyBuYW1lOiAke3R5cGVvZiBjbGFzc05hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBvYmplY3RcbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWQsIGluc3RhbmNlX2lkOiB0aGlzLmluc3RhbmNlSWR9KVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vYmplY3RzLCByZWZlcmVuY2VJZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRob2QgPSBvYmplY3RbZGF0YS5tZXRob2RfbmFtZV1cblxuICAgICAgICBpZiAoIW1ldGhvZCkgdGhyb3cgbmV3IEVycm9yKGBObyBtZXRob2QgY2FsbGVkICcke2RhdGEubWV0aG9kX25hbWV9JyBvbiBhICcke29iamVjdC5jb25zdHJ1Y3Rvci5uYW1lfSdgKVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG1ldGhvZC5jYWxsKG9iamVjdCwgLi4uZGF0YS5hcmdzKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXNwb25zZS50aGVuKHJlc3BvbmRXaXRoVmFsdWUpLmNhdGNoKChwcm9taXNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBwcm9taXNlRXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogcHJvbWlzZUVycm9yLnN0YWNrfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhwcm9taXNlRXJyb3IpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9iamVjdHMsIHJlZmVyZW5jZUlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzYWZlSlNPTlN0cmluZ2lmeShvYmplY3QpXG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHNlcmlhbGl6ZWQpXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyZWFkX2F0dHJpYnV0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBkYXRhLmF0dHJpYnV0ZV9uYW1lXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3QgcmV0dXJuV2l0aCA9IGRhdGEud2l0aFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vYmplY3RzLCByZWZlcmVuY2VJZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvYmplY3RbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAocmV0dXJuV2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gYXR0cmlidXRlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBhdHRyaWJ1dGV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJldmFsXCIpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uZFdpdGhSZXN1bHQgPSAoZXZhbFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGhfcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGV2YWxSZXN1bHRcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBldmFsUmVzdWx0fSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY29wZSA9IHsuLi50aGlzLl9vYmplY3RzLCAuLi50aGlzLl9jbGFzc2VzfVxuICAgICAgICBjb25zdCByZXNlcnZlZElkZW50aWZpZXJzID0gbmV3IFNldChbXG4gICAgICAgICAgXCJicmVha1wiLFxuICAgICAgICAgIFwiY2FzZVwiLFxuICAgICAgICAgIFwiY2F0Y2hcIixcbiAgICAgICAgICBcImNsYXNzXCIsXG4gICAgICAgICAgXCJjb25zdFwiLFxuICAgICAgICAgIFwiY29udGludWVcIixcbiAgICAgICAgICBcImRlYnVnZ2VyXCIsXG4gICAgICAgICAgXCJkZWZhdWx0XCIsXG4gICAgICAgICAgXCJkZWxldGVcIixcbiAgICAgICAgICBcImRvXCIsXG4gICAgICAgICAgXCJlbHNlXCIsXG4gICAgICAgICAgXCJleHBvcnRcIixcbiAgICAgICAgICBcImV4dGVuZHNcIixcbiAgICAgICAgICBcImZpbmFsbHlcIixcbiAgICAgICAgICBcImZvclwiLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIixcbiAgICAgICAgICBcImlmXCIsXG4gICAgICAgICAgXCJpbXBvcnRcIixcbiAgICAgICAgICBcImluXCIsXG4gICAgICAgICAgXCJpbnN0YW5jZW9mXCIsXG4gICAgICAgICAgXCJuZXdcIixcbiAgICAgICAgICBcInJldHVyblwiLFxuICAgICAgICAgIFwic3VwZXJcIixcbiAgICAgICAgICBcInN3aXRjaFwiLFxuICAgICAgICAgIFwidGhpc1wiLFxuICAgICAgICAgIFwidGhyb3dcIixcbiAgICAgICAgICBcInRyeVwiLFxuICAgICAgICAgIFwidHlwZW9mXCIsXG4gICAgICAgICAgXCJ2YXJcIixcbiAgICAgICAgICBcInZvaWRcIixcbiAgICAgICAgICBcIndoaWxlXCIsXG4gICAgICAgICAgXCJ3aXRoXCIsXG4gICAgICAgICAgXCJ5aWVsZFwiLFxuICAgICAgICAgIFwibGV0XCIsXG4gICAgICAgICAgXCJlbnVtXCIsXG4gICAgICAgICAgXCJhd2FpdFwiLFxuICAgICAgICAgIFwiaW1wbGVtZW50c1wiLFxuICAgICAgICAgIFwicGFja2FnZVwiLFxuICAgICAgICAgIFwicHJvdGVjdGVkXCIsXG4gICAgICAgICAgXCJzdGF0aWNcIixcbiAgICAgICAgICBcImludGVyZmFjZVwiLFxuICAgICAgICAgIFwicHJpdmF0ZVwiLFxuICAgICAgICAgIFwicHVibGljXCIsXG4gICAgICAgICAgXCJldmFsXCJcbiAgICAgICAgXSlcblxuICAgICAgICBjb25zdCBpc1ZhbGlkSWRlbnRpZmllciA9IChuYW1lKSA9PlxuICAgICAgICAgIC9eKD86WyRfXXxcXHB7SURfU3RhcnR9KSg/OlskX118XFxwe0lEX0NvbnRpbnVlfSkqJC91LnRlc3QobmFtZSkgJiYgIXJlc2VydmVkSWRlbnRpZmllcnMuaGFzKG5hbWUpXG5cbiAgICAgICAgY29uc3Qgc2NvcGVLZXlzID0gT2JqZWN0LmtleXMoc2NvcGUpXG4gICAgICAgIGNvbnN0IGludmFsaWRLZXlzID0gc2NvcGVLZXlzLmZpbHRlcigoa2V5KSA9PiAhaXNWYWxpZElkZW50aWZpZXIoa2V5KSlcblxuICAgICAgICBpZiAoaW52YWxpZEtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWdpc3RlcmVkIGlkZW50aWZpZXIocyk6ICR7aW52YWxpZEtleXMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgcmVnaXN0ZXJlZCBvYmplY3RzL2NsYXNzZXMgYXJlIGF2YWlsYWJsZSBhcyBsb2NhbHMgaW5zaWRlIHRoZSBldmFsXG4gICAgICAgIGNvbnN0IGV2YWx1YXRvciA9IG5ldyBGdW5jdGlvbihcIl9fZXZhbFN0cmluZ1wiLCAuLi5zY29wZUtleXMsIFwicmV0dXJuIGV2YWwoX19ldmFsU3RyaW5nKVwiKVxuICAgICAgICBjb25zdCBldmFsQXJncyA9IHNjb3BlS2V5cy5tYXAoKGtleSkgPT4gc2NvcGVba2V5XSlcbiAgICAgICAgY29uc3QgZXZhbFN0cmluZyA9IGAoYXN5bmMgKCkgPT4ge1xcbiR7ZGF0YS5ldmFsX3N0cmluZ31cXG59KSgpYFxuICAgICAgICBjb25zdCBldmFsUmVzdWx0ID0gZXZhbHVhdG9yKGV2YWxTdHJpbmcsIC4uLmV2YWxBcmdzKVxuXG4gICAgICAgIGlmIChldmFsUmVzdWx0ICYmIHR5cGVvZiBldmFsUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXZhbFJlc3VsdC50aGVuKHJlc3BvbmRXaXRoUmVzdWx0KS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFJlc3VsdChldmFsUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IGVycm9yLnN0YWNrfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhlcnJvcil9KVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFzZXMgYW4gYXJndW1lbnQgZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHNlcmlhbGl6ZSBmb3IgdHJhbnNwb3J0XG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VBcmcoYXJnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgICAgcmV0dXJuIGFyZy5tYXAoKGFyZ0luQXJyYXkpID0+IHRoaXMucGFyc2VBcmcoYXJnSW5BcnJheSkpXG4gICAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBSZWZlcmVuY2UpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICAgIGNvbnN0IHJlZmVyZW5jZVBheWxvYWQgPSB7XG4gICAgICAgIF9fc2NvdW5kcmVsX29iamVjdF9pZDogYXJnLmlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcInJlZmVyZW5jZVwiXG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcuaW5zdGFuY2VJZCkge1xuICAgICAgICByZWZlcmVuY2VQYXlsb2FkLl9fc2NvdW5kcmVsX2luc3RhbmNlX2lkID0gYXJnLmluc3RhbmNlSWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZmVyZW5jZVBheWxvYWRcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XVxuXG4gICAgICAgIG5ld09iamVjdFtrZXldID0gdGhpcy5wYXJzZUFyZyh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9uc09yQXJnIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zT3JBcmcgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnN9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVmZXJlbmNlLCBwcm94eSwgb3IgcmVzdWx0XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lLCBvcHRpb25zT3JBcmcpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqL1xuICAgIGxldCBvcHRpb25zID0ge3JlZmVyZW5jZTogdHJ1ZX1cblxuICAgIGlmICh0eXBlb2Ygb3B0aW9uc09yQXJnID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBvcHRpb25zID0ge3JlZmVyZW5jZTogdHJ1ZX1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChvcHRpb25zT3JBcmcpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMob3B0aW9uc09yQXJnKVxuICAgICAgY29uc3QgaGFzT3B0aW9uS2V5ID0gb3B0aW9uS2V5cy5zb21lKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuXG4gICAgICBpZiAoaGFzT3B0aW9uS2V5KSB7XG4gICAgICAgIGNvbnN0IHVua25vd25PcHRpb25zID0gb3B0aW9uS2V5cy5maWx0ZXIoKGtleSkgPT4gIWFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICBpZiAodW5rbm93bk9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgaGFzRXhwbGljaXRSZXR1cm4gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9uc09yQXJnLCBcInJlZmVyZW5jZVwiKVxuICAgICAgICAgICAgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnNPckFyZywgXCJyZXN1bHRcIilcbiAgICAgICAgICAgIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zT3JBcmcsIFwicHJveHlcIilcbiAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAoe1xuICAgICAgICAgICAgLi4uKGhhc0V4cGxpY2l0UmV0dXJuID8ge30gOiB7cmVmZXJlbmNlOiB0cnVlfSksXG4gICAgICAgICAgICAuLi5vcHRpb25zT3JBcmdcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UgZG9lcyBub3QgYWNjZXB0IHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UgZG9lcyBub3QgYWNjZXB0IHBvc2l0aW9uYWwgYXJndW1lbnRzXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuUmVmZXJlbmNlID0gb3B0aW9ucz8ucmVmZXJlbmNlID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUmVzdWx0ID0gb3B0aW9ucz8ucmVzdWx0ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuUHJveHkgPSBvcHRpb25zPy5wcm94eSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVybkZsYWdzID0gW3JldHVyblJlZmVyZW5jZSwgcmV0dXJuUmVzdWx0LCByZXR1cm5Qcm94eV0uZmlsdGVyKEJvb2xlYW4pLmxlbmd0aFxuXG4gICAgaWYgKHJldHVybkZsYWdzID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgb3B0aW9ucywgYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSByZXN1bHQgb3IgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZXR1cm5PcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBBdHRyaWJ1dGUgdmFsdWUgb3IgcmVmZXJlbmNlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JldHVyblJlc3VsdE9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBBdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBSZXR1cm5PcHRpb25zfSBhdHRyaWJ1dGVOYW1lT3JPcHRpb25zIEF0dHJpYnV0ZSBuYW1lIG9yIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IFthdHRyaWJ1dGVOYW1lXSBBdHRyaWJ1dGUgbmFtZSB3aGVuIHVzaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlIHwgUHJveHkgfCBhbnk+fSBBdHRyaWJ1dGUgdmFsdWUgb3IgcmVmZXJlbmNlXG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvcHRpb25zXG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IHRhcmdldEF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lXG5cbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpKSB7XG4gICAgICBjb25zdCBvcHRpb25LZXlzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIG9wdGlvbnMgPSAvKiogQHR5cGUge1JldHVybk9wdGlvbnN9ICovIChhdHRyaWJ1dGVOYW1lT3JPcHRpb25zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWFkQXR0cmlidXRlT25SZWZlcmVuY2Ugb3B0aW9uczogJHt1bmtub3duT3B0aW9ucy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0QXR0cmlidXRlTmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0QXR0cmlidXRlTmFtZSA9IC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldEF0dHJpYnV0ZU5hbWUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSByZXF1aXJlcyBhbiBhdHRyaWJ1dGUgbmFtZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSBvcHRpb25zIHJlZmVyZW5jZSwgcmVzdWx0LCBhbmQgcHJveHkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiKVxuICAgIH1cblxuICAgIGNvbnN0IHdpdGhSZWZlcmVuY2UgPSByZXR1cm5SZWZlcmVuY2UgfHwgcmV0dXJuUHJveHlcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwicmVhZF9hdHRyaWJ1dGVcIiwge1xuICAgICAgYXR0cmlidXRlX25hbWU6IHRhcmdldEF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogd2l0aFJlZmVyZW5jZSA/IFwicmVmZXJlbmNlXCIgOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIGlmICghd2l0aFJlZmVyZW5jZSkgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQucmVzcG9uc2VcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuXG4gICAgcmV0dXJuIHJldHVyblByb3h5ID8gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSkgOiBzcGF3bmVkUmVmZXJlbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnl9IGNsYXNzSW5zdGFuY2UgQ2xhc3MgY29uc3RydWN0b3Igb3IgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyQ2xhc3MoY2xhc3NOYW1lLCBjbGFzc0luc3RhbmNlKSB7XG4gICAgaWYgKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSB0aHJvdyBuZXcgRXJyb3IoYENsYXNzIGFscmVhZHkgZXhpc3RzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdID0gY2xhc3NJbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY2xhc3MgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgaWYgKCEoY2xhc3NOYW1lIGluIHRoaXMuX2NsYXNzZXMpKSB0aHJvdyBuZXcgRXJyb3IoYENsYXNzIGRvZXMgbm90IGV4aXN0OiAke2NsYXNzTmFtZX1gKVxuXG4gICAgZGVsZXRlIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBjbGFzcyBvciB1bmRlZmluZWRcbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBjbGFzcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnl9IG9iamVjdEluc3RhbmNlIE9iamVjdCBpbnN0YW5jZVxuICAgKi9cbiAgcmVnaXN0ZXJPYmplY3Qob2JqZWN0TmFtZSwgb2JqZWN0SW5zdGFuY2UpIHtcbiAgICBpZiAob2JqZWN0TmFtZSBpbiB0aGlzLl9vYmplY3RzKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBhbHJlYWR5IGV4aXN0czogJHtvYmplY3ROYW1lfWApXG5cbiAgICB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdID0gb2JqZWN0SW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhbiBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byByZW1vdmVcbiAgICovXG4gIHVucmVnaXN0ZXJPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGlmICghKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykpIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGRvZXMgbm90IGV4aXN0OiAke29iamVjdE5hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gbG9vayB1cFxuICAgKiBAcmV0dXJucyB7YW55fSBSZWdpc3RlcmVkIG9iamVjdCBvciB1bmRlZmluZWRcbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbmRzIHRvIGEgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tYW5kSWQgQ29tbWFuZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFJlc3BvbnNlIHBheWxvYWRcbiAgICovXG4gIHJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElkLCBkYXRhKSB7XG4gICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhOiB7Y29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhfX0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBiYWNrZW5kIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBDb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzcG9uc2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKi9cbiAgc2VuZENvbW1hbmQoY29tbWFuZCwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvdXRnb2luZ0NvbW1hbmRDb3VudCA9ICsrdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnRcbiAgICAgIGNvbnN0IG9yaWdpbkVycm9yID0gbmV3IEVycm9yKGBDb21tYW5kICcke2NvbW1hbmR9JyBkaXNwYXRjaGVkYClcbiAgICAgIC8vIFN0cmlwIHRoZSBzZW5kQ29tbWFuZCBmcmFtZSB0byBoaWdobGlnaHQgdGhlIGNhbGxlciBzaXRlLlxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvcmlnaW5FcnJvciwgdGhpcy5zZW5kQ29tbWFuZClcbiAgICAgIGNvbnN0IGNvbW1hbmREYXRhID0ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBjb21tYW5kX2lkOiBvdXRnb2luZ0NvbW1hbmRDb3VudCxcbiAgICAgICAgZGF0YVxuICAgICAgfVxuXG4gICAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNbb3V0Z29pbmdDb21tYW5kQ291bnRdID0ge3Jlc29sdmUsIHJlamVjdCwgb3JpZ2luU3RhY2s6IG9yaWdpbkVycm9yLnN0YWNrfVxuICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJTZW5kaW5nXCIsIGNvbW1hbmREYXRhXSlcbiAgICAgIHRoaXMuc2VuZChjb21tYW5kRGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGRhdGEgdG8gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgUGF5bG9hZCB0byBzZW5kXG4gICAqL1xuICBzZW5kKGRhdGEpIHtcbiAgICB0aGlzLmJhY2tlbmQuc2VuZChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUGFyc2VkIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZVJlZmVyZW5jZShyZWZlcmVuY2VJZCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwic2VyaWFsaXplX3JlZmVyZW5jZVwiLCB7cmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZH0pXG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2luc3RhbmNlSWRdIE93bmluZyBpbnN0YW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtSZWZlcmVuY2V9IFJlZmVyZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgc3Bhd25SZWZlcmVuY2UoaWQsIGluc3RhbmNlSWQpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKHRoaXMsIGlkLCBpbnN0YW5jZUlkKVxuXG4gICAgdGhpcy5yZWZlcmVuY2VzW2lkXSA9IHJlZmVyZW5jZVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVxuICB9XG5cbiAgZW5hYmxlU2VydmVyQ29udHJvbCgpIHtcbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gdHJ1ZVxuICB9XG59XG4iXX0=
|
|
@@ -4,10 +4,12 @@ export default class Reference {
|
|
|
4
4
|
* Creates a new Reference
|
|
5
5
|
* @param {any} client The client instance
|
|
6
6
|
* @param {string} id The reference ID
|
|
7
|
+
* @param {string | undefined} [instanceId] Owning instance identifier
|
|
7
8
|
*/
|
|
8
|
-
constructor(client: any, id: string);
|
|
9
|
+
constructor(client: any, id: string, instanceId?: string | undefined);
|
|
9
10
|
client: any;
|
|
10
11
|
id: string;
|
|
12
|
+
instanceId: string;
|
|
11
13
|
/**
|
|
12
14
|
* Calls a method on the reference and returns a proxy
|
|
13
15
|
* @param {string} methodName Method name to invoke
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/client/reference.js"],"names":[],"mappings":"AAEA,4DAA4D;AAE5D;IACE
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/client/reference.js"],"names":[],"mappings":"AAEA,4DAA4D;AAE5D;IACE;;;;;OAKG;IACH,oBAJW,GAAG,MACH,MAAM,eACN,MAAM,GAAG,SAAS,EAQ5B;IALC,YAAoB;IACpB,WAAY;IACZ,mBAA4B;IAK9B;;;;;OAKG;IACH,uBAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,KAAK,CAAC,CAI1B;IAED;;;;;OAKG;IACH,gCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAI9B;IAED;;;;;OAKG;IACH,6BAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;;OAIG;IACH,6BAHW,MAAM,GAAG,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CAI1B;IAED;;;;OAIG;IACH,sCAHW,MAAM,GAAG,MAAM,GACb,OAAO,CAAC,SAAS,CAAC,CAI9B;IAED;;;;OAIG;IACH,mCAHW,MAAM,GAAG,MAAM,GACb,OAAO,CAAC,GAAG,CAAC,CAIxB;IAED;;;OAGG;IACH,aAFa,OAAO,CAAC,GAAG,CAAC,CAIxB;CACF;oBAjFa,OAAO,sBAAsB,EAAE,KAAK"}
|
|
@@ -5,10 +5,12 @@ export default class Reference {
|
|
|
5
5
|
* Creates a new Reference
|
|
6
6
|
* @param {any} client The client instance
|
|
7
7
|
* @param {string} id The reference ID
|
|
8
|
+
* @param {string | undefined} [instanceId] Owning instance identifier
|
|
8
9
|
*/
|
|
9
|
-
constructor(client, id) {
|
|
10
|
+
constructor(client, id, instanceId) {
|
|
10
11
|
this.client = client;
|
|
11
12
|
this.id = id;
|
|
13
|
+
this.instanceId = instanceId;
|
|
12
14
|
if (!id)
|
|
13
15
|
throw new Error(`Invalid ID given: ${id}`);
|
|
14
16
|
}
|
|
@@ -71,4 +73,4 @@ export default class Reference {
|
|
|
71
73
|
return await this.client.serializeReference(this.id);
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9yZWZlcmVuY2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDREQUE0RDtBQUU1RCxNQUFNLENBQUMsT0FBTyxPQUFPLFNBQVM7SUFDNUI7Ozs7O09BS0c7SUFDSCxZQUFZLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVTtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBO1FBRTVCLElBQUksQ0FBQyxFQUFFO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDbEMsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUM3RixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSTtRQUMzQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ2pHLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7SUFDOUYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWE7UUFDL0IsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhO1FBQ3hDLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDOUYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CLENBQUMsYUFBYTtRQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzNGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsU0FBUztRQUNiLE9BQU8sTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiKS5Qcm94eX0gUHJveHkgKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7YW55fSBjbGllbnQgVGhlIGNsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgVGhlIHJlZmVyZW5jZSBJRFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2luc3RhbmNlSWRdIE93bmluZyBpbnN0YW5jZSBpZGVudGlmaWVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbGllbnQsIGlkLCBpbnN0YW5jZUlkKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnRcbiAgICB0aGlzLmlkID0gaWRcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSUQgZ2l2ZW46ICR7aWR9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiB0aGUgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgcHJveHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZChtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGxNZXRob2RPblJlZmVyZW5jZSh0aGlzLmlkLCBtZXRob2ROYW1lLCB7cHJveHk6IHRydWV9LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gaW52b2tlXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kUmVmZXJlbmNlKG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHRoaXMuaWQsIG1ldGhvZE5hbWUsIHtyZWZlcmVuY2U6IHRydWV9LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIG1ldGhvZCBjYWxsXG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kUmVzdWx0KG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHRoaXMuaWQsIG1ldGhvZE5hbWUsIHtyZXN1bHQ6IHRydWV9LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSh0aGlzLmlkLCB7cHJveHk6IHRydWV9LCBhdHRyaWJ1dGVOYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBmcm9tIHRoZSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZVJlZmVyZW5jZShhdHRyaWJ1dGVOYW1lKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LnJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZSh0aGlzLmlkLCB7cmVmZXJlbmNlOiB0cnVlfSwgYXR0cmlidXRlTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgZnJvbSB0aGUgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBBdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIGFzeW5jIHJlYWRBdHRyaWJ1dGVSZXN1bHQoYXR0cmlidXRlTmFtZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2UodGhpcy5pZCwge3Jlc3VsdDogdHJ1ZX0sIGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyB0aGUgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUGFyc2VkIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuc2VyaWFsaXplUmVmZXJlbmNlKHRoaXMuaWQpXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-json-stringify.d.ts","sourceRoot":"","sources":["../../src/utils/safe-json-stringify.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,iDAHW,GAAG,GACD,MAAM,
|
|
1
|
+
{"version":3,"file":"safe-json-stringify.d.ts","sourceRoot":"","sources":["../../src/utils/safe-json-stringify.js"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,iDAHW,GAAG,GACD,MAAM,CA4ElB"}
|
|
@@ -5,6 +5,30 @@
|
|
|
5
5
|
* @returns {string} JSON string representation
|
|
6
6
|
*/
|
|
7
7
|
export default function safeJSONStringify(value) {
|
|
8
|
+
if (typeof value === "undefined")
|
|
9
|
+
return "null";
|
|
10
|
+
const valueType = typeof value;
|
|
11
|
+
if (valueType === "function")
|
|
12
|
+
throw new Error("Cannot serialize function at value");
|
|
13
|
+
if (valueType === "symbol")
|
|
14
|
+
throw new Error("Cannot serialize symbol at value");
|
|
15
|
+
if (valueType === "number" && !Number.isFinite(value)) {
|
|
16
|
+
throw new Error("Cannot serialize non-finite number at value");
|
|
17
|
+
}
|
|
18
|
+
if (valueType === "bigint") {
|
|
19
|
+
const numberValue = Number(value);
|
|
20
|
+
if (!Number.isFinite(numberValue)) {
|
|
21
|
+
throw new Error("Cannot serialize non-finite number at value");
|
|
22
|
+
}
|
|
23
|
+
return JSON.stringify(numberValue);
|
|
24
|
+
}
|
|
25
|
+
if (value && valueType === "object") {
|
|
26
|
+
const prototype = Object.getPrototypeOf(value);
|
|
27
|
+
if (prototype !== Object.prototype && prototype !== null && !Array.isArray(value)) {
|
|
28
|
+
const constructorName = value.constructor && value.constructor.name ? value.constructor.name : "Object";
|
|
29
|
+
throw new Error(`Cannot serialize non-plain object '${constructorName}' at value`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
8
32
|
const pathMap = new WeakMap();
|
|
9
33
|
if (value && typeof value === "object") {
|
|
10
34
|
pathMap.set(value, "value");
|
|
@@ -13,16 +37,19 @@ export default function safeJSONStringify(value) {
|
|
|
13
37
|
const parentPath = pathMap.get(this) || "value";
|
|
14
38
|
const currentPath = key === "" ? parentPath : Array.isArray(this) ? `${parentPath}[${key}]` : `${parentPath}.${key}`;
|
|
15
39
|
const valType = typeof val;
|
|
16
|
-
if (valType === "undefined")
|
|
17
|
-
throw new Error(`Cannot serialize undefined at ${currentPath}`);
|
|
18
40
|
if (valType === "function")
|
|
19
41
|
throw new Error(`Cannot serialize function at ${currentPath}`);
|
|
20
42
|
if (valType === "symbol")
|
|
21
43
|
throw new Error(`Cannot serialize symbol at ${currentPath}`);
|
|
22
|
-
if (valType === "bigint")
|
|
23
|
-
throw new Error(`Cannot serialize bigint at ${currentPath}`);
|
|
24
44
|
if (valType === "number" && !Number.isFinite(val))
|
|
25
45
|
throw new Error(`Cannot serialize non-finite number at ${currentPath}`);
|
|
46
|
+
if (valType === "bigint") {
|
|
47
|
+
const numberValue = Number(val);
|
|
48
|
+
if (!Number.isFinite(numberValue)) {
|
|
49
|
+
throw new Error(`Cannot serialize non-finite number at ${currentPath}`);
|
|
50
|
+
}
|
|
51
|
+
return numberValue;
|
|
52
|
+
}
|
|
26
53
|
if (val === null)
|
|
27
54
|
return val;
|
|
28
55
|
if (Array.isArray(val)) {
|
|
@@ -49,4 +76,4 @@ export default function safeJSONStringify(value) {
|
|
|
49
76
|
throw new Error(String(error));
|
|
50
77
|
}
|
|
51
78
|
}
|
|
52
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS1qc29uLXN0cmluZ2lmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zYWZlLWpzb24tc3RyaW5naWZ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sVUFBVSxpQkFBaUIsQ0FBQyxLQUFLO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVztRQUFFLE9BQU8sTUFBTSxDQUFBO0lBRS9DLE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxDQUFBO0lBQzlCLElBQUksU0FBUyxLQUFLLFVBQVU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDbkYsSUFBSSxTQUFTLEtBQUssUUFBUTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUMvRSxJQUFJLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFDRCxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBSSxLQUFLLElBQUksU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENB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QXNDLGVBQWUsUUFBUSxXQUFXLEVBQUUsQ0FBQyxDQUFBO1lBQzdGLENBQUM7WUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUM3QixPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUMsQ0FBQTtJQUVELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLO1lBQUUsTUFBTSxLQUFLLENBQUE7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIFNhZmVseSBzdHJpbmdpZmllcyBKU09OLWZyaWVuZGx5IHZhbHVlcyB3aGlsZSB0aHJvd2luZyBkZXNjcmlwdGl2ZSBlcnJvcnMgZm9yIHVuc3VwcG9ydGVkIHR5cGVzLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZVxuICogQHJldHVybnMge3N0cmluZ30gSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2FmZUpTT05TdHJpbmdpZnkodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIFwibnVsbFwiXG5cbiAgY29uc3QgdmFsdWVUeXBlID0gdHlwZW9mIHZhbHVlXG4gIGlmICh2YWx1ZVR5cGUgPT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNlcmlhbGl6ZSBmdW5jdGlvbiBhdCB2YWx1ZVwiKVxuICBpZiAodmFsdWVUeXBlID09PSBcInN5bWJvbFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc2VyaWFsaXplIHN5bWJvbCBhdCB2YWx1ZVwiKVxuICBpZiAodmFsdWVUeXBlID09PSBcIm51bWJlclwiICYmICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNlcmlhbGl6ZSBub24tZmluaXRlIG51bWJlciBhdCB2YWx1ZVwiKVxuICB9XG4gIGlmICh2YWx1ZVR5cGUgPT09IFwiYmlnaW50XCIpIHtcbiAgICBjb25zdCBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWx1ZSlcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXJWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBzZXJpYWxpemUgbm9uLWZpbml0ZSBudW1iZXIgYXQgdmFsdWVcIilcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG51bWJlclZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIHZhbHVlVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcbiAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgPyB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIDogXCJPYmplY3RcIlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2VyaWFsaXplIG5vbi1wbGFpbiBvYmplY3QgJyR7Y29uc3RydWN0b3JOYW1lfScgYXQgdmFsdWVgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBhdGhNYXAgPSBuZXcgV2Vha01hcCgpXG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHBhdGhNYXAuc2V0KHZhbHVlLCBcInZhbHVlXCIpXG4gIH1cblxuICBjb25zdCByZXBsYWNlciA9IGZ1bmN0aW9uKGtleSwgdmFsKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGhNYXAuZ2V0KHRoaXMpIHx8IFwidmFsdWVcIlxuICAgIGNvbnN0IGN1cnJlbnRQYXRoID0ga2V5ID09PSBcIlwiID8gcGFyZW50UGF0aCA6IEFycmF5LmlzQXJyYXkodGhpcykgPyBgJHtwYXJlbnRQYXRofVske2tleX1dYCA6IGAke3BhcmVudFBhdGh9LiR7a2V5fWBcbiAgICBjb25zdCB2YWxUeXBlID0gdHlwZW9mIHZhbFxuXG4gICAgaWYgKHZhbFR5cGUgPT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2VyaWFsaXplIGZ1bmN0aW9uIGF0ICR7Y3VycmVudFBhdGh9YClcbiAgICBpZiAodmFsVHlwZSA9PT0gXCJzeW1ib2xcIikgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2VyaWFsaXplIHN5bWJvbCBhdCAke2N1cnJlbnRQYXRofWApXG4gICAgaWYgKHZhbFR5cGUgPT09IFwibnVtYmVyXCIgJiYgIU51bWJlci5pc0Zpbml0ZSh2YWwpKSB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXJpYWxpemUgbm9uLWZpbml0ZSBudW1iZXIgYXQgJHtjdXJyZW50UGF0aH1gKVxuICAgIGlmICh2YWxUeXBlID09PSBcImJpZ2ludFwiKSB7XG4gICAgICBjb25zdCBudW1iZXJWYWx1ZSA9IE51bWJlcih2YWwpXG4gICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXJWYWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2VyaWFsaXplIG5vbi1maW5pdGUgbnVtYmVyIGF0ICR7Y3VycmVudFBhdGh9YClcbiAgICAgIH1cbiAgICAgIHJldHVybiBudW1iZXJWYWx1ZVxuICAgIH1cblxuICAgIGlmICh2YWwgPT09IG51bGwpIHJldHVybiB2YWxcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgIHBhdGhNYXAuc2V0KHZhbCwgY3VycmVudFBhdGgpXG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuXG4gICAgaWYgKHZhbFR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpXG4gICAgICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB2YWwuY29uc3RydWN0b3IgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPyB2YWwuY29uc3RydWN0b3IubmFtZSA6IFwiT2JqZWN0XCJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2VyaWFsaXplIG5vbi1wbGFpbiBvYmplY3QgJyR7Y29uc3RydWN0b3JOYW1lfScgYXQgJHtjdXJyZW50UGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBwYXRoTWFwLnNldCh2YWwsIGN1cnJlbnRQYXRoKVxuICAgICAgcmV0dXJuIHZhbFxuICAgIH1cblxuICAgIHJldHVybiB2YWxcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCByZXBsYWNlcilcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgdGhyb3cgZXJyb3JcbiAgICB0aHJvdyBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSlcbiAgfVxufVxuIl19
|