scoundrel-remote-eval 1.0.12 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # Scoundrel JavaScript
2
+
3
+ JavaScript client for running remote evaluations with Scoundrel.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install scoundrel-remote-eval
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ import Client from "scoundrel-remote-eval/src/client/index.js"
15
+ import ClientWebSocket from "scoundrel-remote-eval/src/client/connections/web-socket/index.js"
16
+ import PythonWebSocketRunner from "scoundrel-remote-eval/src/python-web-socket-runner.js"
17
+
18
+ const pythonWebSocketRunner = new PythonWebSocketRunner()
19
+ const ws = new WebSocket("ws://localhost:53874")
20
+ const clientWebSocket = new ClientWebSocket(ws)
21
+
22
+ await clientWebSocket.waitForOpened()
23
+
24
+ const client = new Client(clientWebSocket)
25
+
26
+ const math = await client.import("math")
27
+ const pi = await math.readAttributeWithReference("pi")
28
+ const cosOfPi = await math.callMethodWithReference("cos", pi)
29
+ const result = await cosOfPi.serialize()
30
+
31
+ expect(result).toEqual(-1)
32
+
33
+ client.close()
34
+ pythonWebSocketRunner.close()
35
+ ```
36
+
37
+ ## Calling static methods on classes
38
+
39
+ You can ask for a reference to a class (either globally available or registered with `registerClass`) and call its static methods:
40
+
41
+ ```js
42
+ class TestMath {
43
+ static add(a, b) { return a + b }
44
+ }
45
+
46
+ // Make the class available for lookups (for example, on a server-controlled client)
47
+ client.registerClass("TestMath", TestMath)
48
+
49
+ // Later, fetch the class reference and call its static method
50
+ const testMath = await client.getObject("TestMath")
51
+ const sum = await testMath.callMethod("add", 2, 3)
52
+
53
+ expect(sum).toEqual(5)
54
+ ```
55
+
56
+ ## Server-to-client control
57
+
58
+ By default, a client refuses server-initiated commands. Enable it by passing `enableServerControl: true` when constructing the client:
59
+
60
+ ```js
61
+ const client = new Client(clientWebSocket, {enableServerControl: true})
62
+ ```
63
+
64
+ If you want to explicitly disable server control (the default), pass `enableServerControl: false` or omit the option:
65
+
66
+ ```js
67
+ const client = new Client(clientWebSocket, {enableServerControl: false})
68
+ // equivalent to: new Client(clientWebSocket)
69
+ ```
70
+
71
+ Registered objects and classes are available inside `evalWithReference`:
72
+
73
+ ```js
74
+ const client = new Client(clientWebSocket, {enableServerControl: true})
75
+
76
+ class TestGreeter {
77
+ constructor(prefix) {
78
+ this.prefix = prefix
79
+ }
80
+
81
+ greet(name) {
82
+ return `${this.prefix} ${name}`
83
+ }
84
+ }
85
+
86
+ client.registerClass("TestGreeter", TestGreeter)
87
+ client.registerObject("testSettings", {prefix: "Hello"})
88
+
89
+ const serverClient = server.getClients()[0] // from your ScoundrelServer instance
90
+ const greetingRef = await serverClient.evalWithReference("(() => { const greeter = new TestGreeter(testSettings.prefix); return greeter.greet('World') })()")
91
+ const greeting = await greetingRef.serialize()
92
+
93
+ expect(greeting).toEqual("Hello World")
94
+ ```
@@ -127,6 +127,13 @@ export default class Client {
127
127
  * @param {any} classInstance
128
128
  */
129
129
  registerClass(className: string, classInstance: any): void;
130
+ /**
131
+ * Gets a registered class by name
132
+ *
133
+ * @param {string} className
134
+ * @returns {any}
135
+ */
136
+ _getRegisteredClass(className: string): any;
130
137
  /**
131
138
  * Gets a registered class by name
132
139
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"AASA;IACE;;;;;OAKG;IACH,qBAHW,GAAG,YACH;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAC,EA2BzC;IAxBC,aAAsB;IAGtB,kCAAkC;IAClC,kBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACJ;IAC1B,qBAA0B;IAC1B,8BAA8B;IAE9B,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,wCAAwC;IACxC,YADW,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAChB;IAEpB,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACb;IAEjB,qBAAqB;IAErB,sBAAsB;IACtB,sBADW,OAAO,CAC8C;IAGlE;;OAEG;IACH,uBAEC;IAED;;;;;;;OAOG;IACH,mCALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAWxB;IAED;;;;;;;OAOG;IACH,gDALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;;OAKG;IACH,8BAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAM9B;IAED;;;;;OAKG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;;;OAMG;IACH,kCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;OAIG;IACH,qBAHW,GAAG,GACD,OAAO,CAQnB;IAED;;;;;;;;OAQG;IACH,YAAa,0EANV;QAAqB,OAAO,EAApB,MAAM;QACO,UAAU,EAAvB,MAAM;QACI,IAAI,EAAd,GAAG;QACW,KAAK,GAAnB,MAAM;QACQ,UAAU,GAAxB,MAAM;KAEkE,UAsKlF;IAED;;;;;OAKG;IACH,cAHW,GAAG,GACD,GAAG,CAwBf;IAED;;;;;;OAMG;IACH,mDAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAW9B;IAED;;;;;;OAMG;IACH,sCAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CASxB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,iBACN,GAAG,QAMb;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;;OAKG;IACH,2BAHW,MAAM,kBACN,GAAG,QAMb;IAED;;;;;OAKG;IACH,iCAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;OAIG;IACH,4BAHW,MAAM,QACN,GAAG,QAIb;IAED;;;;;OAKG;IACH,qBAJW,MAAM,QACN,GAAG,GACD,OAAO,CAAC,GAAG,CAAC,CAkBxB;IAED;;;OAGG;IACH,WAFW,GAAG,QAIb;IAED;;;;;OAKG;IACH,gCAHW,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CAMxB;IAED;;;;;OAKG;IACH,mBAHW,MAAM,GACJ,SAAS,CAQrB;IAED,4BAEC;CACF;sBA/gBqB,gBAAgB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"AASA;IACE;;;;;OAKG;IACH,qBAHW,GAAG,YACH;QAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;KAAC,EA2BzC;IAxBC,aAAsB;IAGtB,kCAAkC;IAClC,kBADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACJ;IAC1B,qBAA0B;IAC1B,8BAA8B;IAE9B,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,kCAAkC;IAClC,UADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAElB,wCAAwC;IACxC,YADW,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAChB;IAEpB,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACb;IAEjB,qBAAqB;IAErB,sBAAsB;IACtB,sBADW,OAAO,CAC8C;IAGlE;;OAEG;IACH,uBAEC;IAED;;;;;;;OAOG;IACH,mCALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,GAAG,CAAC,CAWxB;IAED;;;;;;;OAOG;IACH,gDALW,MAAM,cACN,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;;OAKG;IACH,8BAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;;OAKG;IACH,mBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;;OAKG;IACH,sBAHW,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAY9B;IAED;;;;;;OAMG;IACH,kCAJW,MAAM,WACF,GAAG,EAAA,GACL,OAAO,CAAC,SAAS,CAAC,CAe9B;IAED;;;;OAIG;IACH,qBAHW,GAAG,GACD,OAAO,CAQnB;IAED;;;;;;;;OAQG;IACH,YAAa,0EANV;QAAqB,OAAO,EAApB,MAAM;QACO,UAAU,EAAvB,MAAM;QACI,IAAI,EAAd,GAAG;QACW,KAAK,GAAnB,MAAM;QACQ,UAAU,GAAxB,MAAM;KAEkE,UA6KlF;IAED;;;;;OAKG;IACH,cAHW,GAAG,GACD,GAAG,CAwBf;IAED;;;;;;OAMG;IACH,mDAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,SAAS,CAAC,CAW9B;IAED;;;;;;OAMG;IACH,sCAJW,MAAM,iBACN,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CASxB;IAED;;;;;OAKG;IACH,yBAHW,MAAM,iBACN,GAAG,QAMb;IAED;;;;;OAKG;IACH,+BAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;;OAKG;IACH,2BAHW,MAAM,kBACN,GAAG,QAMb;IAED;;;;;OAKG;IACH,iCAHW,MAAM,GACJ,GAAG,CAIf;IAED;;;;OAIG;IACH,4BAHW,MAAM,QACN,GAAG,QAIb;IAED;;;;;OAKG;IACH,qBAJW,MAAM,QACN,GAAG,GACD,OAAO,CAAC,GAAG,CAAC,CAkBxB;IAED;;;OAGG;IACH,WAFW,GAAG,QAIb;IAED;;;;;OAKG;IACH,gCAHW,MAAM,GACJ,OAAO,CAAC,GAAG,CAAC,CAMxB;IAED;;;;;OAKG;IACH,mBAHW,MAAM,GACJ,SAAS,CAQrB;IAED,4BAEC;CACF;sBAziBqB,gBAAgB"}
@@ -70,13 +70,17 @@ export default class Client {
70
70
  }
71
71
  else if (command == "get_object") {
72
72
  const serverObject = this._getRegisteredObject(data.object_name);
73
+ const serverClass = this._getRegisteredClass(data.object_name);
73
74
  let object;
74
- if (serverObject) {
75
+ if (serverObject !== undefined) {
75
76
  object = serverObject;
76
77
  }
78
+ else if (serverClass !== undefined) {
79
+ object = serverClass;
80
+ }
77
81
  else {
78
82
  object = globalThis[data.object_name];
79
- if (!object)
83
+ if (object === undefined)
80
84
  throw new Error(`No such object: ${data.object_name}`);
81
85
  }
82
86
  const objectId = ++this.objectsCount;
@@ -152,7 +156,11 @@ export default class Client {
152
156
  this.respondToCommand(commandID, { response: evalResult });
153
157
  }
154
158
  };
155
- const evalResult = eval(data.eval_string);
159
+ const scope = { ...this._objects, ...this._classes };
160
+ const scopeKeys = Object.keys(scope);
161
+ // Ensure registered objects/classes are available as locals inside the eval
162
+ const evaluator = new Function("__evalString", ...scopeKeys, "return eval(__evalString)");
163
+ const evalResult = evaluator(data.eval_string, ...scopeKeys.map((key) => scope[key]));
156
164
  if (evalResult && typeof evalResult.then == "function") {
157
165
  evalResult.then(respondWithResult).catch((promiseError) => {
158
166
  if (promiseError instanceof Error) {
@@ -247,8 +255,16 @@ export default class Client {
247
255
  * @returns {Promise<Reference>}
248
256
  */
249
257
  async evalWithReference(evalString) {
250
- const evalReference = await this.getObject("eval");
251
- return await evalReference.callMethodWithReference("call", null, evalString);
258
+ const result = await this.sendCommand("eval", {
259
+ eval_string: evalString,
260
+ with_reference: true
261
+ });
262
+ if (!result)
263
+ throw new Error("Blank result given");
264
+ const objectId = result.object_id;
265
+ if (!objectId)
266
+ throw new Error(`No object ID given in result: ${JSON.stringify(result)}`);
267
+ return this.spawnReference(objectId);
252
268
  }
253
269
  /**
254
270
  * Imports a module and returns a reference to it
@@ -382,6 +398,15 @@ export default class Client {
382
398
  throw new Error(`Class already exists: ${className}`);
383
399
  this._classes[className] = classInstance;
384
400
  }
401
+ /**
402
+ * Gets a registered class by name
403
+ *
404
+ * @param {string} className
405
+ * @returns {any}
406
+ */
407
+ _getRegisteredClass(className) {
408
+ return this._classes[className];
409
+ }
385
410
  /**
386
411
  * Gets a registered class by name
387
412
  *
@@ -474,4 +499,4 @@ export default class Client {
474
499
  this.serverControlEnabled = true;
475
500
  }
476
501
  }
477
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFFdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtBQUU3Qyx3QkFBd0I7QUFFeEIsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7OztPQUtHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUErSmpDOzs7Ozs7OztXQVFHO1FBQ0gsY0FBUyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsRUFBQyxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXhGLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO3dCQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixTQUFTLGVB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O0lBQ0gsSUFBSSxDQUFDLElBQUk7UUFDUCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBVztRQUNsQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQTtRQUV2RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLEVBQUU7UUFDZixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUE7UUFFL0IsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKFwiU2NvdW5kcmVsIENsaWVudFwiKVxuXG4vLyBsb2dnZXIuc2V0RGVidWcodHJ1ZSlcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgU2NvdW5kcmVsIENsaWVudFxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gYmFja2VuZCBUaGUgYmFja2VuZCBjb25uZWN0aW9uIChlLmcuLCBXZWJTb2NrZXQpXG4gICAqIEBwYXJhbSB7e2VuYWJsZVNlcnZlckNvbnRyb2w/OiBib29sZWFufX0gW29wdGlvbnNdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kXG4gICAgdGhpcy5iYWNrZW5kLm9uQ29tbWFuZCh0aGlzLm9uQ29tbWFuZClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMuaW5jb21pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fb2JqZWN0cyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT59ICovXG4gICAgdGhpcy5yZWZlcmVuY2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm9iamVjdHMgPSB7fVxuXG4gICAgdGhpcy5vYmplY3RzQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5zZXJ2ZXJDb250cm9sRW5hYmxlZCA9IEJvb2xlYW4ob3B0aW9ucy5lbmFibGVTZXJ2ZXJDb250cm9sKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgY2xpZW50IGNvbm5lY3Rpb25cbiAgICovXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIHRoaXMuYmFja2VuZC5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiY2FsbF9tZXRob2Rfb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBtZXRob2RfbmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fVxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIG1ldGhvZF9uYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVmZXJlbmNlXCJcbiAgICB9KVxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmFsU3RyaW5nXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59XG4gICAqL1xuICBhc3luYyBldmFsV2l0aFJlZmVyZW5jZShldmFsU3RyaW5nKSB7XG4gICAgY29uc3QgZXZhbFJlZmVyZW5jZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0KFwiZXZhbFwiKVxuXG4gICAgcmV0dXJuIGF3YWl0IGV2YWxSZWZlcmVuY2UuY2FsbE1ldGhvZFdpdGhSZWZlcmVuY2UoXCJjYWxsXCIsIG51bGwsIGV2YWxTdHJpbmcpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGltcG9ydE5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiaW1wb3J0XCIsIHtcbiAgICAgIGltcG9ydF9uYW1lOiBpbXBvcnROYW1lXG4gICAgfSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiaW1wb3J0XCIsIHtyZXN1bHR9XSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3VsdC5vYmplY3RfaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJnZXRfb2JqZWN0XCIsIHtcbiAgICAgIG9iamVjdF9uYW1lOiBvYmplY3ROYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn1cbiAgICovXG4gIGFzeW5jIG5ld09iamVjdFdpdGhSZWZlcmVuY2UoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIGNsYXNzX25hbWU6IGNsYXNzTmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IGlzIGEgcGxhaW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7YW55fSBpbnB1dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzUGxhaW5PYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIGluY29taW5nIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhcmdzLmNvbW1hbmRfaWRcbiAgICogQHBhcmFtIHthbnl9IGFyZ3MuZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5lcnJvclN0YWNrXVxuICAgKi9cbiAgb25Db21tYW5kID0gKHtjb21tYW5kLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGRhdGEsIGVycm9yLCBlcnJvclN0YWNrLCAuLi5yZXN0QXJnc30pID0+IHtcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uQ29tbWFuZFwiLCB7Y29tbWFuZCwgY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgcmVzdEFyZ3N9XSlcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGtleSBnaXZlbiBpbiBkYXRhOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNvbW1hbmRfcmVzcG9uc2VcIikge1xuICAgICAgICBpZiAoIShjb21tYW5kSUQgaW4gdGhpcy5vdXRnb2luZ0NvbW1hbmRzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0Z29pbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gbm90IGZvdW5kOiAke09iamVjdC5rZXlzKHRoaXMub3V0Z29pbmdDb21tYW5kcykuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYXZlZENvbW1hbmQgPSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yVG9UaHJvdyA9IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZVN0YWNrID0gKHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvbm9kZV9tb2R1bGVzXFwvd3N8bm9kZTp8aW50ZXJuYWxcXC8vLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLnN0YXJ0c1dpdGgoXCJFcnJvcjpcIikpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFwiU2VydmVyIGNvbnRyb2wgaXMgZGlzYWJsZWRcIn0pXG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwiZ2V0X29iamVjdFwiKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlck9iamVjdCA9IHRoaXMuX2dldFJlZ2lzdGVyZWRPYmplY3QoZGF0YS5vYmplY3RfbmFtZSlcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmIChzZXJ2ZXJPYmplY3QpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJPYmplY3RcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmplY3QgPSBnbG9iYWxUaGlzW2RhdGEub2JqZWN0X25hbWVdXG5cbiAgICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFRoaXNbY2xhc3NOYW1lXVxuXG4gICAgICAgICAgaWYgKCFDbGFzc0luc3RhbmNlKSB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggY2xhc3M6ICR7Y2xhc3NOYW1lfWApXG5cbiAgICAgICAgICBvYmplY3QgPSBuZXcgQ2xhc3NJbnN0YW5jZSguLi5kYXRhLmFyZ3MpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgY2xhc3MgbmFtZTogJHt0eXBlb2YgY2xhc3NOYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgY29uc3QgbWV0aG9kID0gb2JqZWN0W2RhdGEubWV0aG9kX25hbWVdXG5cbiAgICAgICAgaWYgKCFtZXRob2QpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kIGNhbGxlZCAnJHtkYXRhLm1ldGhvZF9uYW1lfScgb24gYSAnJHtvYmplY3QuY29uc3RydWN0b3IubmFtZX0nYClcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IG1ldGhvZC5jYWxsKG9iamVjdCwgLi4uZGF0YS5hcmdzKVxuXG4gICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IHJlc3BvbnNlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09IFwic2VyaWFsaXplX3JlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghb2JqZWN0KSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG5cbiAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwgSlNPTi5zdHJpbmdpZnkob2JqZWN0KSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInJlYWRfYXR0cmlidXRlXCIpIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGRhdGEuYXR0cmlidXRlX25hbWVcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCByZXR1cm5XaXRoID0gZGF0YS53aXRoXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IG9iamVjdFthdHRyaWJ1dGVOYW1lXVxuXG4gICAgICAgIGlmIChyZXR1cm5XaXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBhdHRyaWJ1dGVcbiAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IGF0dHJpYnV0ZX0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImV2YWxcIikge1xuICAgICAgICBjb25zdCByZXNwb25kV2l0aFJlc3VsdCA9IChldmFsUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEud2l0aF9yZWZlcmVuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdElkID0gKyt0aGlzLm9iamVjdHNDb3VudFxuXG4gICAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gZXZhbFJlc3VsdFxuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge29iamVjdF9pZDogb2JqZWN0SWR9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IGV2YWxSZXN1bHR9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2YWxSZXN1bHQgPSBldmFsKGRhdGEuZXZhbF9zdHJpbmcpXG5cbiAgICAgICAgaWYgKGV2YWxSZXN1bHQgJiYgdHlwZW9mIGV2YWxSZXN1bHQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBldmFsUmVzdWx0LnRoZW4ocmVzcG9uZFdpdGhSZXN1bHQpLmNhdGNoKChwcm9taXNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBwcm9taXNlRXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogcHJvbWlzZUVycm9yLnN0YWNrfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhwcm9taXNlRXJyb3IpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoUmVzdWx0KGV2YWxSZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogZXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogZXJyb3Iuc3RhY2t9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKGVycm9yKX0pXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyYXNlcyBhbiBhcmd1bWVudCBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyXG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBhcmdcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIHBhcnNlQXJnKGFyZykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiBhcmcubWFwKChhcmdJbkFycmF5KSA9PiB0aGlzLnBhcnNlQXJnKGFyZ0luQXJyYXkpKVxuICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfX3Njb3VuZHJlbF9vYmplY3RfaWQ6IGFyZy5pZCxcbiAgICAgICAgX19zY291bmRyZWxfdHlwZTogXCJyZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPGFueSwgYW55Pn0gKi9cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldXG5cbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSB0aGlzLnBhcnNlQXJnKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3T2JqZWN0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInJlYWRfYXR0cmlidXRlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZV9uYW1lOiBhdHRyaWJ1dGVOYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVmZXJlbmNlXCJcbiAgICB9KVxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIHJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJyZWFkX2F0dHJpYnV0ZVwiLCB7XG4gICAgICBhdHRyaWJ1dGVfbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlc3VsdFwiXG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2xhc3MgYnkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGdldENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWVcbiAgICogQHBhcmFtIHthbnl9IG9iamVjdEluc3RhbmNlXG4gICAqL1xuICByZWdpc3Rlck9iamVjdChvYmplY3ROYW1lLCBvYmplY3RJbnN0YW5jZSkge1xuICAgIGlmIChvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGFscmVhZHkgZXhpc3RzOiAke29iamVjdE5hbWV9YClcblxuICAgIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV0gPSBvYmplY3RJbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byBhIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWFuZElkXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhXG4gICAqL1xuICByZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJZCwgZGF0YSkge1xuICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YToge2NvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YX19KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgYmFja2VuZCBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZFxuICAgKiBAcGFyYW0ge2FueX0gZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgc2VuZENvbW1hbmQoY29tbWFuZCwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvdXRnb2luZ0NvbW1hbmRDb3VudCA9ICsrdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnRcbiAgICAgIGNvbnN0IG9yaWdpbkVycm9yID0gbmV3IEVycm9yKGBDb21tYW5kICcke2NvbW1hbmR9JyBkaXNwYXRjaGVkYClcbiAgICAgIC8vIFN0cmlwIHRoZSBzZW5kQ29tbWFuZCBmcmFtZSB0byBoaWdobGlnaHQgdGhlIGNhbGxlciBzaXRlLlxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvcmlnaW5FcnJvciwgdGhpcy5zZW5kQ29tbWFuZClcbiAgICAgIGNvbnN0IGNvbW1hbmREYXRhID0ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBjb21tYW5kX2lkOiBvdXRnb2luZ0NvbW1hbmRDb3VudCxcbiAgICAgICAgZGF0YVxuICAgICAgfVxuXG4gICAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNbb3V0Z29pbmdDb21tYW5kQ291bnRdID0ge3Jlc29sdmUsIHJlamVjdCwgb3JpZ2luU3RhY2s6IG9yaWdpbkVycm9yLnN0YWNrfVxuICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJTZW5kaW5nXCIsIGNvbW1hbmREYXRhXSlcbiAgICAgIHRoaXMuc2VuZChjb21tYW5kRGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGRhdGEgdG8gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHthbnl9IGRhdGFcbiAgICovXG4gIHNlbmQoZGF0YSkge1xuICAgIHRoaXMuYmFja2VuZC5zZW5kKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgc2VyaWFsaXplUmVmZXJlbmNlKHJlZmVyZW5jZUlkKSB7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJzZXJpYWxpemVfcmVmZXJlbmNlXCIsIHtyZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkfSlcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqIEByZXR1cm5zIHtSZWZlcmVuY2V9XG4gICAqL1xuICBzcGF3blJlZmVyZW5jZShpZCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UodGhpcywgaWQpXG5cbiAgICB0aGlzLnJlZmVyZW5jZXNbaWRdID0gcmVmZXJlbmNlXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlXG4gIH1cblxuICBlbmFibGVTZXJ2ZXJDb250cm9sKCkge1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSB0cnVlXG4gIH1cbn1cbiJdfQ==
502
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFFdEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtBQUU3Qyx3QkFBd0I7QUFFeEIsTUFBTSxDQUFDLE9BQU8sT0FBTyxNQUFNO0lBQ3pCOzs7OztPQUtHO0lBQ0gsWUFBWSxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUU7UUF3S2pDOzs7Ozs7OztXQVFHO1FBQ0gsY0FBUyxHQUFHLENBQUMsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsRUFBQyxFQUFFLEVBQUU7WUFDckYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBRXhGLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2dCQUN0RixDQUFDO3FCQUFNLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO3dCQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixTQUFTLGVB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QyxrQkFBa0IsQ0FBQyxXQUFXO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxFQUFDLFlBQVksRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO1FBRXZGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsRUFBRTtRQUNmLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUUvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7SUFDbEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4uL2xvZ2dlci5qc1wiXG5pbXBvcnQgUmVmZXJlbmNlIGZyb20gXCIuL3JlZmVyZW5jZS5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgQ2xpZW50XCIpXG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBTY291bmRyZWwgQ2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSB7YW55fSBiYWNrZW5kIFRoZSBiYWNrZW5kIGNvbm5lY3Rpb24gKGUuZy4sIFdlYlNvY2tldClcbiAgICogQHBhcmFtIHt7ZW5hYmxlU2VydmVyQ29udHJvbD86IGJvb2xlYW59fSBbb3B0aW9uc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKGJhY2tlbmQsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuYmFja2VuZCA9IGJhY2tlbmRcbiAgICB0aGlzLmJhY2tlbmQub25Db21tYW5kKHRoaXMub25Db21tYW5kKVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub3V0Z29pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5pbmNvbWluZ0NvbW1hbmRzID0ge31cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9jbGFzc2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9vYmplY3RzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPn0gKi9cbiAgICB0aGlzLnJlZmVyZW5jZXMgPSB7fVxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSAqL1xuICAgIHRoaXMub2JqZWN0cyA9IHt9XG5cbiAgICB0aGlzLm9iamVjdHNDb3VudCA9IDBcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gQm9vbGVhbihvcHRpb25zLmVuYWJsZVNlcnZlckNvbnRyb2wpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5iYWNrZW5kLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZShyZWZlcmVuY2VJZCwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIiwge1xuICAgICAgYXJnczogdGhpcy5wYXJzZUFyZyhhcmdzKSxcbiAgICAgIG1ldGhvZF9uYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IFwicmVzdWx0XCJcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59XG4gICAqL1xuICBhc3luYyBjYWxsTWV0aG9kT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgbWV0aG9kX25hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZWZlcmVuY2VcIlxuICAgIH0pXG4gICAgY29uc3QgaWQgPSByZXN1bHQucmVzcG9uc2VcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmdcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn1cbiAgICovXG4gIGFzeW5jIGV2YWxXaXRoUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn1cbiAgICovXG4gIGFzeW5jIGltcG9ydChpbXBvcnROYW1lKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fVxuICAgKi9cbiAgYXN5bmMgZ2V0T2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59XG4gICAqL1xuICBhc3luYyBuZXdPYmplY3RXaXRoUmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1BsYWluT2JqZWN0KGlucHV0KSB7XG4gICAgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBpbmNvbWluZyBjb21tYW5kIGZyb20gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29tbWFuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21tYW5kX2lkXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzLmRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmVycm9yXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JTdGFja11cbiAgICovXG4gIG9uQ29tbWFuZCA9ICh7Y29tbWFuZCwgY29tbWFuZF9pZDogY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgLi4ucmVzdEFyZ3N9KSA9PiB7XG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJvbkNvbW1hbmRcIiwge2NvbW1hbmQsIGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlc3RBcmdzfV0pXG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29tbWFuZCBrZXkgZ2l2ZW4gaW4gZGF0YTogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjb21tYW5kX3Jlc3BvbnNlXCIpIHtcbiAgICAgICAgaWYgKCEoY29tbWFuZElEIGluIHRoaXMub3V0Z29pbmdDb21tYW5kcykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE91dGdvaW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IG5vdCBmb3VuZDogJHtPYmplY3Qua2V5cyh0aGlzLm91dGdvaW5nQ29tbWFuZHMpLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2F2ZWRDb21tYW5kID0gdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBkZWxldGUgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW2NvbW1hbmRJRF1cblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnJvclRvVGhyb3cgPSBuZXcgRXJyb3IoZXJyb3IpXG4gICAgICAgICAgY29uc3Qgc2FuaXRpemVTdGFjayA9IChzdGFjaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFzdGFjaykgcmV0dXJuIFtdXG4gICAgICAgICAgICByZXR1cm4gc3RhY2tcbiAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhL25vZGVfbW9kdWxlc1xcL3dzfG5vZGU6fGludGVybmFsXFwvLy50ZXN0KGxpbmUpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiAhbGluZS5zdGFydHNXaXRoKFwiRXJyb3I6XCIpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZvcm1hdFNlY3Rpb24gPSAobGFiZWwsIHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IHNhbml0aXplU3RhY2soc3RhY2spXG4gICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBbYCR7bGFiZWx9ICR7bGluZXNbMF19YCwgLi4ubGluZXMuc2xpY2UoMSldXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29tYmluZWRTdGFjayA9IFtcbiAgICAgICAgICAgIGBFcnJvcjogJHtlcnJvcn1gLFxuICAgICAgICAgICAgLi4uZm9ybWF0U2VjdGlvbihcIltTQ09VTlREUkVMLVNFUlZFUl1cIiwgZXJyb3JTdGFjayksXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VORFJFTC1DTElFTlRdXCIsIGVycm9yVG9UaHJvdy5zdGFjayksXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VORFJFTC1DTElFTlRdXCIsIHNhdmVkQ29tbWFuZC5vcmlnaW5TdGFjayA/IGBDb21tYW5kIGNyZWF0ZWQgYXQ6XFxuJHtzYXZlZENvbW1hbmQub3JpZ2luU3RhY2t9YCA6IG51bGwpXG4gICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG5cbiAgICAgICAgICBlcnJvclRvVGhyb3cuc3RhY2sgPSBjb21iaW5lZFN0YWNrXG5cbiAgICAgICAgICBzYXZlZENvbW1hbmQucmVqZWN0KGVycm9yVG9UaHJvdylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIubG9nKCgpID0+IFtgUmVzb2x2aW5nIGNvbW1hbmQgJHtjb21tYW5kSUR9IHdpdGggZGF0YWAsIGRhdGFdKVxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZXNvbHZlKGRhdGEuZGF0YSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZXJ2ZXJDb250cm9sRW5hYmxlZCkge1xuICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBcIlNlcnZlciBjb250cm9sIGlzIGRpc2FibGVkXCJ9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImdldF9vYmplY3RcIikge1xuICAgICAgICBjb25zdCBzZXJ2ZXJPYmplY3QgPSB0aGlzLl9nZXRSZWdpc3RlcmVkT2JqZWN0KGRhdGEub2JqZWN0X25hbWUpXG4gICAgICAgIGNvbnN0IHNlcnZlckNsYXNzID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZENsYXNzKGRhdGEub2JqZWN0X25hbWUpXG4gICAgICAgIGxldCBvYmplY3RcblxuICAgICAgICBpZiAoc2VydmVyT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBvYmplY3QgPSBzZXJ2ZXJPYmplY3RcbiAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJDbGFzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyQ2xhc3NcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmplY3QgPSBnbG9iYWxUaGlzW2RhdGEub2JqZWN0X25hbWVdXG5cbiAgICAgICAgICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBvYmplY3Q6ICR7ZGF0YS5vYmplY3RfbmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gZGF0YS5jbGFzc19uYW1lXG4gICAgICAgIGxldCBvYmplY3RcblxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzTmFtZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgQ2xhc3NJbnN0YW5jZSA9IHRoaXMuZ2V0Q2xhc3MoY2xhc3NOYW1lKSB8fCBnbG9iYWxUaGlzW2NsYXNzTmFtZV1cblxuICAgICAgICAgIGlmICghQ2xhc3NJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGNsYXNzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgICAgICAgb2JqZWN0ID0gbmV3IENsYXNzSW5zdGFuY2UoLi4uZGF0YS5hcmdzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGNsYXNzIG5hbWU6ICR7dHlwZW9mIGNsYXNzTmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG9iamVjdFtkYXRhLm1ldGhvZF9uYW1lXVxuXG4gICAgICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCBjYWxsZWQgJyR7ZGF0YS5tZXRob2RfbmFtZX0nIG9uIGEgJyR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9J2ApXG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBtZXRob2QuY2FsbChvYmplY3QsIC4uLmRhdGEuYXJncylcblxuICAgICAgICBpZiAoZGF0YS53aXRoID09IFwicmVmZXJlbmNlXCIpIHtcbiAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVxuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogb2JqZWN0SWR9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZX0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIW9iamVjdCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuXG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIEpTT04uc3RyaW5naWZ5KG9iamVjdCkpXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyZWFkX2F0dHJpYnV0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBkYXRhLmF0dHJpYnV0ZV9uYW1lXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3QgcmV0dXJuV2l0aCA9IGRhdGEud2l0aFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFvYmplY3QpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvYmplY3RbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAocmV0dXJuV2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gYXR0cmlidXRlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBhdHRyaWJ1dGV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJldmFsXCIpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uZFdpdGhSZXN1bHQgPSAoZXZhbFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGhfcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IGV2YWxSZXN1bHRcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBldmFsUmVzdWx0fSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY29wZSA9IHsuLi50aGlzLl9vYmplY3RzLCAuLi50aGlzLl9jbGFzc2VzfVxuICAgICAgICBjb25zdCBzY29wZUtleXMgPSBPYmplY3Qua2V5cyhzY29wZSlcbiAgICAgICAgLy8gRW5zdXJlIHJlZ2lzdGVyZWQgb2JqZWN0cy9jbGFzc2VzIGFyZSBhdmFpbGFibGUgYXMgbG9jYWxzIGluc2lkZSB0aGUgZXZhbFxuICAgICAgICBjb25zdCBldmFsdWF0b3IgPSBuZXcgRnVuY3Rpb24oXCJfX2V2YWxTdHJpbmdcIiwgLi4uc2NvcGVLZXlzLCBcInJldHVybiBldmFsKF9fZXZhbFN0cmluZylcIilcbiAgICAgICAgY29uc3QgZXZhbFJlc3VsdCA9IGV2YWx1YXRvcihkYXRhLmV2YWxfc3RyaW5nLCAuLi5zY29wZUtleXMubWFwKChrZXkpID0+IHNjb3BlW2tleV0pKVxuXG4gICAgICAgIGlmIChldmFsUmVzdWx0ICYmIHR5cGVvZiBldmFsUmVzdWx0LnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXZhbFJlc3VsdC50aGVuKHJlc3BvbmRXaXRoUmVzdWx0KS5jYXRjaCgocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNwb25kV2l0aFJlc3VsdChldmFsUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IGVycm9yLnN0YWNrfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZXJyb3I6IFN0cmluZyhlcnJvcil9KVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcmFzZXMgYW4gYXJndW1lbnQgZm9yIHNlbmRpbmcgdG8gdGhlIHNlcnZlclxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gYXJnXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBwYXJzZUFyZyhhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYXJnSW5BcnJheSkgPT4gdGhpcy5wYXJzZUFyZyhhcmdJbkFycmF5KSlcbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBhcmcuaWQsXG4gICAgICAgIF9fc2NvdW5kcmVsX3R5cGU6IFwicmVmZXJlbmNlXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhcmcpKSB7XG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdba2V5XVxuXG4gICAgICAgIG5ld09iamVjdFtrZXldID0gdGhpcy5wYXJzZUFyZyh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZShyZWZlcmVuY2VJZCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJyZWFkX2F0dHJpYnV0ZVwiLCB7XG4gICAgICBhdHRyaWJ1dGVfbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgIHJlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWQsXG4gICAgICB3aXRoOiBcInJlZmVyZW5jZVwiXG4gICAgfSlcbiAgICBjb25zdCBpZCA9IHJlc3VsdC5yZXNwb25zZVxuXG4gICAgcmV0dXJuIHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwicmVhZF9hdHRyaWJ1dGVcIiwge1xuICAgICAgYXR0cmlidXRlX25hbWU6IGF0dHJpYnV0ZU5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZXN1bHRcIlxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcGFyYW0ge2FueX0gY2xhc3NJbnN0YW5jZVxuICAgKi9cbiAgcmVnaXN0ZXJDbGFzcyhjbGFzc05hbWUsIGNsYXNzSW5zdGFuY2UpIHtcbiAgICBpZiAoY2xhc3NOYW1lIGluIHRoaXMuX2NsYXNzZXMpIHRocm93IG5ldyBFcnJvcihgQ2xhc3MgYWxyZWFkeSBleGlzdHM6ICR7Y2xhc3NOYW1lfWApXG5cbiAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkQ2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIGNsYXNzIGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZ2V0Q2xhc3MoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBvYmplY3QgYnkgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gb2JqZWN0SW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWVcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbmRzIHRvIGEgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tYW5kSWRcbiAgICogQHBhcmFtIHthbnl9IGRhdGFcbiAgICovXG4gIHJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElkLCBkYXRhKSB7XG4gICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhOiB7Y29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhfX0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBiYWNrZW5kIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBzZW5kQ29tbWFuZChjb21tYW5kLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG91dGdvaW5nQ29tbWFuZENvdW50ID0gKyt0aGlzLm91dGdvaW5nQ29tbWFuZHNDb3VudFxuICAgICAgY29uc3Qgb3JpZ2luRXJyb3IgPSBuZXcgRXJyb3IoYENvbW1hbmQgJyR7Y29tbWFuZH0nIGRpc3BhdGNoZWRgKVxuICAgICAgLy8gU3RyaXAgdGhlIHNlbmRDb21tYW5kIGZyYW1lIHRvIGhpZ2hsaWdodCB0aGUgY2FsbGVyIHNpdGUuXG4gICAgICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKG9yaWdpbkVycm9yLCB0aGlzLnNlbmRDb21tYW5kKVxuICAgICAgY29uc3QgY29tbWFuZERhdGEgPSB7XG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIGNvbW1hbmRfaWQ6IG91dGdvaW5nQ29tbWFuZENvdW50LFxuICAgICAgICBkYXRhXG4gICAgICB9XG5cbiAgICAgIHRoaXMub3V0Z29pbmdDb21tYW5kc1tvdXRnb2luZ0NvbW1hbmRDb3VudF0gPSB7cmVzb2x2ZSwgcmVqZWN0LCBvcmlnaW5TdGFjazogb3JpZ2luRXJyb3Iuc3RhY2t9XG4gICAgICBsb2dnZXIubG9nKCgpID0+IFtcIlNlbmRpbmdcIiwgY29tbWFuZERhdGFdKVxuICAgICAgdGhpcy5zZW5kKGNvbW1hbmREYXRhKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgZGF0YSB0byB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge2FueX0gZGF0YVxuICAgKi9cbiAgc2VuZChkYXRhKSB7XG4gICAgdGhpcy5iYWNrZW5kLnNlbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIiwge3JlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWR9KVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGF3bnMgYSBuZXcgcmVmZXJlbmNlIHRvIGFuIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICogQHJldHVybnMge1JlZmVyZW5jZX1cbiAgICovXG4gIHNwYXduUmVmZXJlbmNlKGlkKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gbmV3IFJlZmVyZW5jZSh0aGlzLCBpZClcblxuICAgIHRoaXMucmVmZXJlbmNlc1tpZF0gPSByZWZlcmVuY2VcblxuICAgIHJldHVybiByZWZlcmVuY2VcbiAgfVxuXG4gIGVuYWJsZVNlcnZlckNvbnRyb2woKSB7XG4gICAgdGhpcy5zZXJ2ZXJDb250cm9sRW5hYmxlZCA9IHRydWVcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scoundrel-remote-eval",
3
3
  "type": "module",
4
- "version": "1.0.12",
4
+ "version": "1.0.14",
5
5
  "description": "",
6
6
  "main": "build/index.js",
7
7
  "types": "build/index.d.ts",