scoundrel-remote-eval 1.0.33 → 1.0.34

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 CHANGED
@@ -109,6 +109,16 @@ expect(config).toEqual({mode: "test"})
109
109
  client.unregisterObject("config")
110
110
  ```
111
111
 
112
+ Replace a registered object explicitly when a stable name should point at the latest instance:
113
+
114
+ ```js
115
+ client.registerObject("screen", {state: "old"})
116
+ client.replaceObject("screen", {state: "current"})
117
+
118
+ const screen = await client.getObjectResult("screen")
119
+ expect(screen).toEqual({state: "current"})
120
+ ```
121
+
112
122
  Reference/result variants:
113
123
 
114
124
  ```js
@@ -1,10 +1,10 @@
1
- export default class WebSocket {
1
+ export default class ClientWebSocket {
2
2
  /**
3
3
  * Creates a new WebSocket connection handler
4
- * @param {WebSocket} ws The WebSocket instance
4
+ * @param {globalThis.WebSocket | import("ws").WebSocket} ws The WebSocket instance
5
5
  */
6
- constructor(ws: WebSocket);
7
- ws: WebSocket;
6
+ constructor(ws: globalThis.WebSocket | import("ws").WebSocket);
7
+ ws: WebSocket | import("ws").default;
8
8
  commands: {};
9
9
  commandsCount: number;
10
10
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/connections/web-socket/index.js"],"names":[],"mappings":"AASA;IACE;;;OAGG;IACH,gBAFW,SAAS,EAgBnB;IAbC,cAAY;IAWZ,aAAkB;IAClB,sBAAsB;IAGxB,uBAEC;IAED;;OAEG;IACH,oBAFW,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,QAI7B;IADC,2BAHgB,GAAG,KAAK,IAAI,cAGK;IAGnC;;OAEG;IACH,gBAAiB,OAFN,KAEW,UAErB;IAED;;OAEG;IACH,kBAAmB,OAFR,YAEa,UAUvB;IAED;;OAEG;IACH,eAAgB,OAFL,KAEU,UAEpB;IAED;;OAEG;IACH,WAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAQ7B;IAED,kCAME;CACH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/connections/web-socket/index.js"],"names":[],"mappings":"AASA;IACE;;;OAGG;IACH,gBAFW,UAAU,CAAC,SAAS,GAAG,OAAO,IAAI,EAAE,SAAS,EAgBvD;IAbC,qCAAY;IAWZ,aAAkB;IAClB,sBAAsB;IAGxB,uBAEC;IAED;;OAEG;IACH,oBAFW,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,QAI7B;IADC,2BAHgB,GAAG,KAAK,IAAI,cAGK;IAGnC;;OAEG;IACH,gBAAiB,OAFN,KAEW,UAErB;IAED;;OAEG;IACH,kBAAmB,OAFR,YAEa,UAUvB;IAED;;OAEG;IACH,eAAgB,OAFL,KAEU,UAEpB;IAED;;OAEG;IACH,WAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAQ7B;IAED,kCAME;CACH"}
@@ -3,10 +3,10 @@ import Logger from "../../../logger.js";
3
3
  import { parseScoundrelJSON, serializeScoundrelJSON } from "../../../utils/scoundrel-json.js";
4
4
  const logger = new Logger("Scoundrel WebSocket");
5
5
  // logger.setDebug(true)
6
- export default class WebSocket {
6
+ export default class ClientWebSocket {
7
7
  /**
8
8
  * Creates a new WebSocket connection handler
9
- * @param {WebSocket} ws The WebSocket instance
9
+ * @param {globalThis.WebSocket | import("ws").WebSocket} ws The WebSocket instance
10
10
  */
11
11
  constructor(ws) {
12
12
  /**
@@ -67,4 +67,4 @@ export default class WebSocket {
67
67
  this.ws.send(sendData);
68
68
  }
69
69
  }
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpZW50L2Nvbm5lY3Rpb25zL3dlYi1zb2NrZXQvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFBO0FBQ3ZDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFBO0FBRTNGLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7QUFFaEQsd0JBQXdCO0FBRXhCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sU0FBUztJQUM1Qjs7O09BR0c7SUFDSCxZQUFZLEVBQUU7UUEyQmQ7O1dBRUc7UUFDSCxrQkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzlDLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsb0JBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUUzQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUUxRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtZQUNoRSxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMzQyxDQUFDLENBQUE7UUFhRCxrQkFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3BELGFBQWE7WUFDYixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUV6QyxhQUFhO1lBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDM0MsQ0FBQyxDQUFDLENBQUE7UUF4RUEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFFWixhQUFhO1FBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJELGFBQWE7UUFDYixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFbkQsYUFBYTtRQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUV6RCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFFBQVE7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQTtJQUNuQyxDQUFDO0lBK0JEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQUk7UUFDUCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFFdkMsYUFBYTtRQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FTRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHtwYXJzZVNjb3VuZHJlbEpTT04sIHNlcmlhbGl6ZVNjb3VuZHJlbEpTT059IGZyb20gXCIuLi8uLi8uLi91dGlscy9zY291bmRyZWwtanNvbi5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgV2ViU29ja2V0XCIpXG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJTb2NrZXQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBoYW5kbGVyXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0fSB3cyBUaGUgV2ViU29ja2V0IGluc3RhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih3cykge1xuICAgIHRoaXMud3MgPSB3c1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMub25Tb2NrZXRFcnJvcilcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIHRoaXMub25Tb2NrZXRPcGVuKVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5vblNvY2tldE1lc3NhZ2UpXG5cbiAgICB0aGlzLmNvbW1hbmRzID0ge31cbiAgICB0aGlzLmNvbW1hbmRzQ291bnQgPSAwXG4gIH1cblxuICBhc3luYyBjbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLndzLmNsb3NlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyhkYXRhOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIEhhbmRsZXIgZm9yIGluY29taW5nIGNvbW1hbmRzXG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLm9uQ29tbWFuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBXZWJTb2NrZXQgZXJyb3IgZXZlbnRcbiAgICovXG4gIG9uU29ja2V0RXJyb3IgPSAoZXZlbnQpID0+IHtcbiAgICBsb2dnZXIuZXJyb3IoKCkgPT4gW1wib25Tb2NrZXRFcnJvclwiLCBldmVudF0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IGV2ZW50IFdlYlNvY2tldCBtZXNzYWdlIGV2ZW50XG4gICAqL1xuICBvblNvY2tldE1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBkYXRhID0gcGFyc2VTY291bmRyZWxKU09OKGV2ZW50LmRhdGEpXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIkNsaWVudDo6Q29ubmVjdGlvbnM6OldlYlNvY2tldCBvblNvY2tldE1lc3NhZ2VcIiwgZGF0YV0pXG5cbiAgICBpZiAoIXRoaXMub25Db21tYW5kQ2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG9uQ29tbWFuZCBjYWxsYmFjayBzZXQsIGlnbm9yaW5nIG1lc3NhZ2VcIilcbiAgICB9XG5cbiAgICB0aGlzLm9uQ29tbWFuZENhbGxiYWNrKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgV2ViU29ja2V0IG9wZW4gZXZlbnRcbiAgICovXG4gIG9uU29ja2V0T3BlbiA9IChldmVudCkgPT4ge1xuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wib25Tb2NrZXRPcGVuXCIsIGV2ZW50XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgUGF5bG9hZCB0byBzZW5kXG4gICAqL1xuICBzZW5kKGRhdGEpIHtcbiAgICBjb25zdCBzZW5kRGF0YSA9IHNlcmlhbGl6ZVNjb3VuZHJlbEpTT04oZGF0YSlcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIlNlbmRpbmdcIiwgc2VuZERhdGFdKVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3Muc2VuZChzZW5kRGF0YSlcbiAgfVxuXG4gIHdhaXRGb3JPcGVuZWQgPSAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgcmVzb2x2ZSlcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCByZWplY3QpXG4gIH0pXG59XG4iXX0=
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xpZW50L2Nvbm5lY3Rpb25zL3dlYi1zb2NrZXQvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sTUFBTSxNQUFNLG9CQUFvQixDQUFBO0FBQ3ZDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFBO0FBRTNGLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7QUFFaEQsd0JBQXdCO0FBRXhCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZTtJQUNsQzs7O09BR0c7SUFDSCxZQUFZLEVBQUU7UUEyQmQ7O1dBRUc7UUFDSCxrQkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzlDLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsb0JBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzFCLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUUzQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtZQUUxRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtZQUNoRSxDQUFDO1lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQTtRQUVEOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMzQyxDQUFDLENBQUE7UUFhRCxrQkFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3BELGFBQWE7WUFDYixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUV6QyxhQUFhO1lBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDM0MsQ0FBQyxDQUFDLENBQUE7UUF4RUEsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFFWixhQUFhO1FBQ2IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJELGFBQWE7UUFDYixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFbkQsYUFBYTtRQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUV6RCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNsQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxDQUFDLFFBQVE7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQTtJQUNuQyxDQUFDO0lBK0JEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQUk7UUFDUCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFFdkMsYUFBYTtRQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FTRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi8uLi8uLi9sb2dnZXIuanNcIlxuaW1wb3J0IHtwYXJzZVNjb3VuZHJlbEpTT04sIHNlcmlhbGl6ZVNjb3VuZHJlbEpTT059IGZyb20gXCIuLi8uLi8uLi91dGlscy9zY291bmRyZWwtanNvbi5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgV2ViU29ja2V0XCIpXG5cbi8vIGxvZ2dlci5zZXREZWJ1Zyh0cnVlKVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRXZWJTb2NrZXQge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBXZWJTb2NrZXQgY29ubmVjdGlvbiBoYW5kbGVyXG4gICAqIEBwYXJhbSB7Z2xvYmFsVGhpcy5XZWJTb2NrZXQgfCBpbXBvcnQoXCJ3c1wiKS5XZWJTb2NrZXR9IHdzIFRoZSBXZWJTb2NrZXQgaW5zdGFuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHdzKSB7XG4gICAgdGhpcy53cyA9IHdzXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5vblNvY2tldEVycm9yKVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgdGhpcy5vblNvY2tldE9wZW4pXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uU29ja2V0TWVzc2FnZSlcblxuICAgIHRoaXMuY29tbWFuZHMgPSB7fVxuICAgIHRoaXMuY29tbWFuZHNDb3VudCA9IDBcbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCkge1xuICAgIGF3YWl0IHRoaXMud3MuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KGRhdGE6IGFueSkgPT4gdm9pZH0gY2FsbGJhY2sgSGFuZGxlciBmb3IgaW5jb21pbmcgY29tbWFuZHNcbiAgICovXG4gIG9uQ29tbWFuZChjYWxsYmFjaykge1xuICAgIHRoaXMub25Db21tYW5kQ2FsbGJhY2sgPSBjYWxsYmFja1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFdlYlNvY2tldCBlcnJvciBldmVudFxuICAgKi9cbiAgb25Tb2NrZXRFcnJvciA9IChldmVudCkgPT4ge1xuICAgIGxvZ2dlci5lcnJvcigoKSA9PiBbXCJvblNvY2tldEVycm9yXCIsIGV2ZW50XSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge01lc3NhZ2VFdmVudH0gZXZlbnQgV2ViU29ja2V0IG1lc3NhZ2UgZXZlbnRcbiAgICovXG4gIG9uU29ja2V0TWVzc2FnZSA9IChldmVudCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBwYXJzZVNjb3VuZHJlbEpTT04oZXZlbnQuZGF0YSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiQ2xpZW50OjpDb25uZWN0aW9uczo6V2ViU29ja2V0IG9uU29ja2V0TWVzc2FnZVwiLCBkYXRhXSlcblxuICAgIGlmICghdGhpcy5vbkNvbW1hbmRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb25Db21tYW5kIGNhbGxiYWNrIHNldCwgaWdub3JpbmcgbWVzc2FnZVwiKVxuICAgIH1cblxuICAgIHRoaXMub25Db21tYW5kQ2FsbGJhY2soZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBXZWJTb2NrZXQgb3BlbiBldmVudFxuICAgKi9cbiAgb25Tb2NrZXRPcGVuID0gKGV2ZW50KSA9PiB7XG4gICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJvblNvY2tldE9wZW5cIiwgZXZlbnRdKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YSBQYXlsb2FkIHRvIHNlbmRcbiAgICovXG4gIHNlbmQoZGF0YSkge1xuICAgIGNvbnN0IHNlbmREYXRhID0gc2VyaWFsaXplU2NvdW5kcmVsSlNPTihkYXRhKVxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiU2VuZGluZ1wiLCBzZW5kRGF0YV0pXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy53cy5zZW5kKHNlbmREYXRhKVxuICB9XG5cbiAgd2FpdEZvck9wZW5lZCA9ICgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCByZXNvbHZlKVxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlamVjdClcbiAgfSlcbn1cbiJdfQ==
@@ -310,6 +310,12 @@ export default class Client {
310
310
  * @param {any} objectInstance Object instance
311
311
  */
312
312
  registerObject(objectName: string, objectInstance: any): void;
313
+ /**
314
+ * Replaces a registered object by name, or registers it when it does not exist
315
+ * @param {string} objectName Object name to replace
316
+ * @param {any} objectInstance Object instance
317
+ */
318
+ replaceObject(objectName: string, objectInstance: any): void;
313
319
  /**
314
320
  * Unregisters an object by name
315
321
  * @param {string} objectName Object name to remove
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.js"],"names":[],"mappings":"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"}
@@ -1069,6 +1069,14 @@ export default class Client {
1069
1069
  throw new Error(`Object already exists: ${objectName}`);
1070
1070
  this._objects[objectName] = objectInstance;
1071
1071
  }
1072
+ /**
1073
+ * Replaces a registered object by name, or registers it when it does not exist
1074
+ * @param {string} objectName Object name to replace
1075
+ * @param {any} objectInstance Object instance
1076
+ */
1077
+ replaceObject(objectName, objectInstance) {
1078
+ this._objects[objectName] = objectInstance;
1079
+ }
1072
1080
  /**
1073
1081
  * Unregisters an object by name
1074
1082
  * @param {string} objectName Object name to remove
@@ -1210,4 +1218,4 @@ export default class Client {
1210
1218
  this.serverControlEnabled = true;
1211
1219
  }
1212
1220
  }
1213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUU3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBQzdDLHNEQUFzRDtBQUN0RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUE7QUFDOUIsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDOUIsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUE7SUFDaEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvRSxPQUFPLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQTtBQUMxRixDQUFDLENBQUE7QUFFRCw0REFBNEQ7QUFFNUQsd0JBQXdCO0FBRXhCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDekI7Ozs7T0FJRztJQUNILFlBQVksT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBa2JqQzs7Ozs7Ozs7O1dBU0c7UUFDSCxjQUFTLEdBQUcsQ0FBQyxFQUFDLE9B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QztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBRXZELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDckQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3JDLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFlBQVk7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVyRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuaW1wb3J0IHJlZmVyZW5jZVByb3h5IGZyb20gXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuaW1wb3J0IHtwYXJzZVNjb3VuZHJlbEpTT059IGZyb20gXCIuLi91dGlscy9zY291bmRyZWwtanNvbi5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgQ2xpZW50XCIpXG4vKiogQHR5cGUge3R5cGVvZiBnbG9iYWxUaGlzICYgUmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbmNvbnN0IGdsb2JhbFNjb3BlID0gZ2xvYmFsVGhpc1xuY29uc3QgZ2VuZXJhdGVJbnN0YW5jZUlkID0gKCkgPT4ge1xuICBjb25zdCByYW5kb21VVUlEID0gZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSURcbiAgaWYgKHR5cGVvZiByYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiByYW5kb21VVUlELmNhbGwoZ2xvYmFsVGhpcy5jcnlwdG8pXG4gIHJldHVybiBgc2NvdW5kcmVsLSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWBcbn1cblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiKS5Qcm94eX0gUHJveHkgKi9cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge3tyZWZlcmVuY2U/OiBib29sZWFuLCByZXN1bHQ/OiBib29sZWFuLCBwcm94eT86IGJvb2xlYW59fSBSZXR1cm5PcHRpb25zXG4gKiBAdHlwZWRlZiB7UmV0dXJuT3B0aW9ucyAmIHtyZXN1bHQ/OiBmYWxzZX19IFJldHVyblJlZmVyZW5jZU9wdGlvbnNcbiAqIEB0eXBlZGVmIHtSZXR1cm5PcHRpb25zICYge3Jlc3VsdDogdHJ1ZSwgcmVmZXJlbmNlPzogZmFsc2V9fSBSZXR1cm5SZXN1bHRPcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNjb3VuZHJlbCBDbGllbnRcbiAgICogQHBhcmFtIHthbnl9IGJhY2tlbmQgVGhlIGJhY2tlbmQgY29ubmVjdGlvbiAoZS5nLiwgV2ViU29ja2V0KVxuICAgKiBAcGFyYW0ge3tlbmFibGVTZXJ2ZXJDb250cm9sPzogYm9vbGVhbn19IFtvcHRpb25zXSBDbGllbnQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kXG4gICAgdGhpcy5iYWNrZW5kLm9uQ29tbWFuZCh0aGlzLm9uQ29tbWFuZClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMuaW5jb21pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fb2JqZWN0cyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlZmVyZW5jZSB8IFdlYWtSZWY8UmVmZXJlbmNlPj59ICovXG4gICAgdGhpcy5yZWZlcmVuY2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm9iamVjdHMgPSB7fVxuXG4gICAgdGhpcy5vYmplY3RzQ291bnQgPSAwXG4gICAgdGhpcy5pbnN0YW5jZUlkID0gZ2VuZXJhdGVJbnN0YW5jZUlkKClcbiAgICB0aGlzLnN1cHBvcnRzV2Vha1JlZmVyZW5jZXMgPSB0eXBlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgPT09IFwiZnVuY3Rpb25cIlxuICAgIHRoaXMucmVmZXJlbmNlUmVsZWFzZVJlZ2lzdHJ5ID0gdGhpcy5zdXBwb3J0c1dlYWtSZWZlcmVuY2VzXG4gICAgICA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgocmVmZXJlbmNlSWQpID0+IHRoaXMucXVldWVSZWxlYXNlZFJlZmVyZW5jZShyZWZlcmVuY2VJZCkpXG4gICAgICA6IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZWZlcmVuY2VSZWxlYXNlcyA9IG5ldyBTZXQoKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMuZW5hYmxlU2VydmVyQ29udHJvbClcblxuICAgIC8qKiBAdHlwZSB7KChlcnJvcjogRXJyb3IpID0+IHZvaWQpIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uVW5oYW5kbGVkUmVqZWN0aW9uID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHsoKGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpID0+IHZvaWQpIHwgbnVsbH0gKi9cbiAgICB0aGlzLl91bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgJiYgdHlwZW9mIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLl91bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gKC8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGlvbkV2ZW50fSAqLyBldmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWFzb24gPSBldmVudC5yZWFzb25cbiAgICAgICAgY29uc3QgZXJyb3IgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8ge21lc3NhZ2U6IHJlYXNvbi5tZXNzYWdlLCBzdGFjazogcmVhc29uLnN0YWNrfVxuICAgICAgICAgIDoge21lc3NhZ2U6IFN0cmluZyhyZWFzb24pfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcInVuaGFuZGxlZF9yZWplY3Rpb25cIiwgZGF0YTogZXJyb3J9KVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBDb25uZWN0aW9uIG1heSBiZSBjbG9zZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgdGhpcy5fdW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3VuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgJiYgdHlwZW9mIGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgdGhpcy5fdW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcilcbiAgICAgIHRoaXMuX3VuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBudWxsXG4gICAgfVxuICAgIHRoaXMuYmFja2VuZC5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBSZXN1bHQgZnJvbSB0aGUgbWV0aG9kIGNhbGxcbiAgICovXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHtSZXR1cm5SZWZlcmVuY2VPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjYWxsXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSByZXR1cm5lZCB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjYWxsXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnMgfCBhbnl9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSBjYWxsIG9yIGZpcnN0IGFyZ3VtZW50XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVzdWx0IG9yIHJlZmVyZW5jZSBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCBvcHRpb25zT3JBcmcsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvcHRpb25zXG4gICAgLyoqIEB0eXBlIHthbnlbXX0gKi9cbiAgICBsZXQgbWV0aG9kQXJnc1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JBcmcgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIG1ldGhvZEFyZ3MgPSBhcmdzXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qob3B0aW9uc09yQXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnNPckFyZylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IG9wdGlvblZhbHVlc0FyZUJvb2xlYW4gPSBvcHRpb25LZXlzXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICAgICAgLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBvcHRpb25zT3JBcmdba2V5XSA9PT0gXCJib29sZWFuXCIpXG5cbiAgICAgICAgICBpZiAob3B0aW9uVmFsdWVzQXJlQm9vbGVhbikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKG9wdGlvbnNPckFyZylcbiAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSBhcmdzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2FsbE1ldGhvZE9uUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXRob2RBcmdzID0gW29wdGlvbnNPckFyZywgLi4uYXJnc11cbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5SZWZlcmVuY2UgPSBvcHRpb25zPy5yZWZlcmVuY2UgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5SZXN1bHQgPSBvcHRpb25zPy5yZXN1bHQgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5Qcm94eSA9IG9wdGlvbnM/LnByb3h5ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRmxhZ3MgPSBbcmV0dXJuUmVmZXJlbmNlLCByZXR1cm5SZXN1bHQsIHJldHVyblByb3h5XS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoXG5cbiAgICBpZiAocmV0dXJuRmxhZ3MgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsTWV0aG9kT25SZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoUmVmZXJlbmNlID0gcmV0dXJuUmVmZXJlbmNlIHx8IHJldHVyblByb3h5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKG1ldGhvZEFyZ3MpLFxuICAgICAgbWV0aG9kX25hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogd2l0aFJlZmVyZW5jZSA/IFwicmVmZXJlbmNlXCIgOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGlmICh3aXRoUmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5yZXNwb25zZVxuXG4gICAgICBpZiAoIW9iamVjdElkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICAgICAgcmV0dXJuIHJldHVyblByb3h5ID8gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSkgOiBzcGF3bmVkUmVmZXJlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIGZ1bmN0aW9uIGNhbGxcbiAgICovXG4gIGFzeW5jIGNhbGxGdW5jdGlvbk9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImNhbGxfZnVuY3Rpb25fb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VGdW5jdGlvbkFyZ3MoYXJncyksXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oXCJTY291bmRyZWwgQ2xpZW50XCIsIFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBpcyBkZXByZWNhdGVkOyB1c2UgY2FsbE1ldGhvZE9uUmVmZXJlbmNlIHdpdGggcmVmZXJlbmNlIGluc3RlYWQuXCIpXG4gICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCB7cmVmZXJlbmNlOiB0cnVlfSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbChldmFsU3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImV2YWxcIiwge1xuICAgICAgZXZhbF9zdHJpbmc6IGV2YWxTdHJpbmcsXG4gICAgICB3aXRoX3JlZmVyZW5jZTogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgZXZhbHVhdGVkIHZhbHVlXG4gICAqL1xuICBhc3luYyBldmFsUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZWZlcmVuY2UgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBFdmFsdWF0ZWQgcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsUmVzdWx0KGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZXN1bHQgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiBmYWxzZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCEoXCJyZXNwb25zZVwiIGluIHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihgTm8gcmVzcG9uc2UgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIGEgcHJveHkgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGltcG9ydE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGltcG9ydE5hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcImltcG9ydCByZXF1aXJlcyBhIG1vZHVsZSBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiaW1wb3J0XCIsIHtcbiAgICAgIGltcG9ydF9uYW1lOiBpbXBvcnROYW1lXG4gICAgfSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiaW1wb3J0XCIsIHtyZXN1bHR9XSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3VsdC5vYmplY3RfaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBpbXBvcnROYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbXBvcnRSZWZlcmVuY2UgcmVxdWlyZXMgYSBtb2R1bGUgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbXBvcnROYW1lIE1vZHVsZSBuYW1lIHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0UmVzdWx0KGltcG9ydE5hbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLmltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKVxuICAgIHJldHVybiBhd2FpdCByZWZlcmVuY2Uuc2VyaWFsaXplKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHByb3h5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0UmVmZXJlbmNlKG9iamVjdE5hbWUpXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHJlZmVyZW5jZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBSZWdpc3RlcmVkIG9iamVjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0TmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiZ2V0T2JqZWN0UmVmZXJlbmNlIHJlcXVpcmVzIGFuIG9iamVjdCBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdFJlc3VsdChvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSlcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3QoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIm5ld09iamVjdCByZXF1aXJlcyBhIGNsYXNzIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQsIHJlc3VsdC5pbnN0YW5jZV9pZClcblxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJuZXdPYmplY3RSZWZlcmVuY2UgcmVxdWlyZXMgYSBjbGFzcyBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVzdWx0KGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMubmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncylcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXQgVmFsdWUgdG8gaW5zcGVjdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuICAgKi9cbiAgaXNQbGFpbk9iamVjdChpbnB1dCkge1xuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIENvbW1hbmQgcGF5bG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21tYW5kX2lkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5kYXRhIENvbW1hbmQgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JdIEVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JTdGFja10gRXJyb3Igc3RhY2sgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbYXJncy5yZWxlYXNlZF9yZWZlcmVuY2VfaWRzXSBSZWZlcmVuY2UgSURzIHJlbGVhc2VkIGJ5IHRoZSBwZWVyXG4gICAqL1xuICBvbkNvbW1hbmQgPSAoe2NvbW1hbmQsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlbGVhc2VkX3JlZmVyZW5jZV9pZHM6IHJlbGVhc2VkUmVmZXJlbmNlSWRzLCAuLi5yZXN0QXJnc30pID0+IHtcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uQ29tbWFuZFwiLCB7Y29tbWFuZCwgY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgcmVzdEFyZ3N9XSlcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlbGVhc2VSZWZlcmVuY2VzKHJlbGVhc2VkUmVmZXJlbmNlSWRzKVxuXG4gICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGtleSBnaXZlbiBpbiBkYXRhOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNvbW1hbmRfcmVzcG9uc2VcIikge1xuICAgICAgICBpZiAoIShjb21tYW5kSUQgaW4gdGhpcy5vdXRnb2luZ0NvbW1hbmRzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0Z29pbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gbm90IGZvdW5kOiAke09iamVjdC5rZXlzKHRoaXMub3V0Z29pbmdDb21tYW5kcykuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYXZlZENvbW1hbmQgPSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yVG9UaHJvdyA9IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIGludGVybmFsIHJ1bnRpbWUgZnJhbWVzIHNvIHJlbW90ZSBjb21tYW5kIGZhaWx1cmVzIHBvaW50IGF0IHVzZXIgY29kZS5cbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZCB8IG51bGx9IHN0YWNrIFN0YWNrIHRyYWNlIHRvIHNhbml0aXplXG4gICAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfSBTYW5pdGl6ZWQgc3RhY2sgbGluZXNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZVN0YWNrID0gKHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvbm9kZV9tb2R1bGVzXFwvd3MvLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTovLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTppbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClpbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBQcmVmaXhlcyBlYWNoIHN0YWNrIHNlY3Rpb24gc28gY29tYmluZWQgcmVtb3RlL2xvY2FsIHRyYWNlcyBzdGF5IHJlYWRhYmxlLlxuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBTdGFjayBzZWN0aW9uIGxhYmVsXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsfSBzdGFjayBTdGFjayB0cmFjZSB0byBmb3JtYXRcbiAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEZvcm1hdHRlZCBzdGFjayBzZWN0aW9uXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ1bmhhbmRsZWRfcmVqZWN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgcmVqZWN0aW9uRXJyb3IgPSBuZXcgRXJyb3IoZGF0YS5tZXNzYWdlIHx8IFwiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXCIpXG5cbiAgICAgICAgcmVqZWN0aW9uRXJyb3Iuc3RhY2sgPSBkYXRhLnN0YWNrIHx8IHJlamVjdGlvbkVycm9yLnN0YWNrXG4gICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiUmVjZWl2ZWQgdW5oYW5kbGVkIHJlamVjdGlvbiBmcm9tIHBlZXI6XCIsIGRhdGEubWVzc2FnZV0pXG5cbiAgICAgICAgaWYgKHRoaXMub25VbmhhbmRsZWRSZWplY3Rpb24pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5vblVuaGFuZGxlZFJlamVjdGlvbihyZWplY3Rpb25FcnJvcilcbiAgICAgICAgICB9IGNhdGNoIChjYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uVW5oYW5kbGVkUmVqZWN0aW9uIGNhbGxiYWNrIHRocmV3OlwiLCBjYWxsYmFja0Vycm9yXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmUtdGhyb3cgYXMgdW5oYW5kbGVkIHJlamVjdGlvbiBvbiB0aGUgc2VydmVyIHNvIGl0IHN1cmZhY2VzIGluIHRlc3Qgb3V0cHV0XG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uRXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfZnVuY3Rpb25fb25fcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBmdW5jID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMub2JqZWN0cywgcmVmZXJlbmNlSWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZ1bmN0aW9uIGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge2FueX0gcmVzcG9uc2VWYWx1ZSBSZXNwb25zZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gdGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MsIHthbGxvd1JlbW90ZVJlZmVyZW5jZXM6IHRydWV9KVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGZ1bmMoLi4ucGFyc2VkQXJncylcblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzcG9uc2UudGhlbihyZXNwb25kV2l0aFZhbHVlKS5jYXRjaChcbiAgICAgICAgICAgIC8qKiBAcGFyYW0ge2FueX0gcHJvbWlzZUVycm9yIFByb21pc2UgcmVqZWN0aW9uIHZhbHVlIGZyb20gdGhlIGludm9rZWQgZnVuY3Rpb24uICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogXCJTZXJ2ZXIgY29udHJvbCBpcyBkaXNhYmxlZFwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJnZXRfb2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyT2JqZWN0ID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZE9iamVjdChkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBjb25zdCBzZXJ2ZXJDbGFzcyA9IHRoaXMuX2dldFJlZ2lzdGVyZWRDbGFzcyhkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHNlcnZlck9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyT2JqZWN0XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmVyQ2xhc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlckNsYXNzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqZWN0ID0gZ2xvYmFsU2NvcGVbZGF0YS5vYmplY3RfbmFtZV1cblxuICAgICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFNjb3BlW2NsYXNzTmFtZV1cblxuICAgICAgICAgIGlmICghQ2xhc3NJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGNsYXNzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgICAgICAgb2JqZWN0ID0gbmV3IENsYXNzSW5zdGFuY2UoLi4udGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGNsYXNzIG5hbWU6ICR7dHlwZW9mIGNsYXNzTmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9iamVjdHMsIHJlZmVyZW5jZUlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG9iamVjdFtkYXRhLm1ldGhvZF9uYW1lXVxuXG4gICAgICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCBjYWxsZWQgJyR7ZGF0YS5tZXRob2RfbmFtZX0nIG9uIGEgJyR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9J2ApXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7YW55fSByZXNwb25zZVZhbHVlIFJlc3BvbnNlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBtZXRob2RcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gdGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWV0aG9kLmNhbGwob2JqZWN0LCAuLi5wYXJzZWRBcmdzKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXNwb25zZS50aGVuKHJlc3BvbmRXaXRoVmFsdWUpLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7YW55fSBwcm9taXNlRXJyb3IgUHJvbWlzZSByZWplY3Rpb24gdmFsdWUgZnJvbSB0aGUgaW52b2tlZCBtZXRob2QuICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9iamVjdHMsIHJlZmVyZW5jZUlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzYWZlSlNPTlN0cmluZ2lmeShvYmplY3QpXG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHNlcmlhbGl6ZWQpXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyZWFkX2F0dHJpYnV0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBkYXRhLmF0dHJpYnV0ZV9uYW1lXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3QgcmV0dXJuV2l0aCA9IGRhdGEud2l0aFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vYmplY3RzLCByZWZlcmVuY2VJZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvYmplY3RbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAocmV0dXJuV2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gYXR0cmlidXRlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBhdHRyaWJ1dGV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJldmFsXCIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7YW55fSBldmFsUmVzdWx0IEV2YWx1YXRlZCByZXN1bHRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoUmVzdWx0ID0gKGV2YWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBldmFsUmVzdWx0XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogZXZhbFJlc3VsdH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB7Li4udGhpcy5fb2JqZWN0cywgLi4udGhpcy5fY2xhc3Nlc31cbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwiYnJlYWtcIixcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgXCJkZWJ1Z2dlclwiLFxuICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgXCJkb1wiLFxuICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgIFwiZXhwb3J0XCIsXG4gICAgICAgICAgXCJleHRlbmRzXCIsXG4gICAgICAgICAgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgXCJmb3JcIixcbiAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJpZlwiLFxuICAgICAgICAgIFwiaW1wb3J0XCIsXG4gICAgICAgICAgXCJpblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgICAgICAgIFwibmV3XCIsXG4gICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICBcInN1cGVyXCIsXG4gICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICBcInRoaXNcIixcbiAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgXCJ0cnlcIixcbiAgICAgICAgICBcInR5cGVvZlwiLFxuICAgICAgICAgIFwidmFyXCIsXG4gICAgICAgICAgXCJ2b2lkXCIsXG4gICAgICAgICAgXCJ3aGlsZVwiLFxuICAgICAgICAgIFwid2l0aFwiLFxuICAgICAgICAgIFwieWllbGRcIixcbiAgICAgICAgICBcImxldFwiLFxuICAgICAgICAgIFwiZW51bVwiLFxuICAgICAgICAgIFwiYXdhaXRcIixcbiAgICAgICAgICBcImltcGxlbWVudHNcIixcbiAgICAgICAgICBcInBhY2thZ2VcIixcbiAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICAgIFwiZXZhbFwiXG4gICAgICAgIF0pXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIElkZW50aWZpZXIgY2FuZGlkYXRlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYW1lIGNhbiBiZSB1c2VkIGFzIGEgbG9jYWwgdmFyaWFibGVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzVmFsaWRJZGVudGlmaWVyID0gKG5hbWUpID0+XG4gICAgICAgICAgL14oPzpbJF9dfFxccHtJRF9TdGFydH0pKD86WyRfXXxcXHB7SURfQ29udGludWV9KSokL3UudGVzdChuYW1lKSAmJiAhcmVzZXJ2ZWRJZGVudGlmaWVycy5oYXMobmFtZSlcblxuICAgICAgICBjb25zdCBzY29wZUtleXMgPSBPYmplY3Qua2V5cyhzY29wZSlcbiAgICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBzY29wZUtleXMuZmlsdGVyKChrZXkpID0+ICFpc1ZhbGlkSWRlbnRpZmllcihrZXkpKVxuXG4gICAgICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlZ2lzdGVyZWQgaWRlbnRpZmllcihzKTogJHtpbnZhbGlkS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSByZWdpc3RlcmVkIG9iamVjdHMvY2xhc3NlcyBhcmUgYXZhaWxhYmxlIGFzIGxvY2FscyBpbnNpZGUgdGhlIGV2YWxcbiAgICAgICAgY29uc3QgZXZhbHVhdG9yID0gbmV3IEZ1bmN0aW9uKFwiX19ldmFsU3RyaW5nXCIsIC4uLnNjb3BlS2V5cywgXCJyZXR1cm4gZXZhbChfX2V2YWxTdHJpbmcpXCIpXG4gICAgICAgIGNvbnN0IGV2YWxBcmdzID0gc2NvcGVLZXlzLm1hcCgoa2V5KSA9PiBzY29wZVtrZXldKVxuICAgICAgICBjb25zdCBldmFsU3RyaW5nID0gYChhc3luYyAoKSA9PiB7XFxuJHtkYXRhLmV2YWxfc3RyaW5nfVxcbn0pKClgXG4gICAgICAgIGNvbnN0IGV2YWxSZXN1bHQgPSBldmFsdWF0b3IoZXZhbFN0cmluZywgLi4uZXZhbEFyZ3MpXG5cbiAgICAgICAgaWYgKGV2YWxSZXN1bHQgJiYgdHlwZW9mIGV2YWxSZXN1bHQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBldmFsUmVzdWx0LnRoZW4ocmVzcG9uZFdpdGhSZXN1bHQpLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7YW55fSBwcm9taXNlRXJyb3IgUHJvbWlzZSByZWplY3Rpb24gdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGNvZGUuICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoUmVzdWx0KGV2YWxSZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogZXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogZXJyb3Iuc3RhY2t9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKGVycm9yKX0pXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyYXNlcyBhbiBhcmd1bWVudCBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplIGZvciB0cmFuc3BvcnRcbiAgICogQHJldHVybnMge2FueX0gU2VyaWFsaXplZCBhcmd1bWVudCBwYXlsb2FkXG4gICAqL1xuICBwYXJzZUFyZyhhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYXJnSW5BcnJheSkgPT4gdGhpcy5wYXJzZUFyZyhhcmdJbkFycmF5KSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZnVuY3Rpb25JZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgdGhpcy5vYmplY3RzW2Z1bmN0aW9uSWRdID0gYXJnXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fc2NvdW5kcmVsX2Z1bmN0aW9uX2lkOiBmdW5jdGlvbklkLFxuICAgICAgICBfX3Njb3VuZHJlbF9pbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcImZ1bmN0aW9uXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgICAgY29uc3QgcmVmZXJlbmNlUGF5bG9hZCA9IHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBhcmcuaWQsXG4gICAgICAgIF9fc2NvdW5kcmVsX3R5cGU6IFwicmVmZXJlbmNlXCJcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5pbnN0YW5jZUlkKSB7XG4gICAgICAgIHJlZmVyZW5jZVBheWxvYWQuX19zY291bmRyZWxfaW5zdGFuY2VfaWQgPSBhcmcuaW5zdGFuY2VJZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVmZXJlbmNlUGF5bG9hZFxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPGFueSwgYW55Pn0gKi9cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldXG5cbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSB0aGlzLnBhcnNlQXJnKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3T2JqZWN0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBhcmd1bWVudCBwYXlsb2FkIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7e2FsbG93UmVtb3RlUmVmZXJlbmNlcz86IGJvb2xlYW59fSBbb3B0aW9uc10gUGFyc2luZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHthbnl9IFBhcnNlZCBhcmd1bWVudFxuICAgKi9cbiAgcGFyc2VJbmNvbWluZ0FyZyhhcmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiBhcmcubWFwKChhcmdJbkFycmF5KSA9PiB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnSW5BcnJheSwgb3B0aW9ucykpXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoYXJnKSkge1xuICAgICAgaWYgKGFyZy5fX3Njb3VuZHJlbF90eXBlID09PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSBhcmcuX19zY291bmRyZWxfaW5zdGFuY2VfaWRcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBhcmcuX19zY291bmRyZWxfb2JqZWN0X2lkXG5cbiAgICAgICAgaWYgKGluc3RhbmNlSWQgPT09IHVuZGVmaW5lZCB8fCBpbnN0YW5jZUlkID09PSB0aGlzLmluc3RhbmNlSWQpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMub2JqZWN0cywgcmVmZXJlbmNlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhcmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmFsbG93UmVtb3RlUmVmZXJlbmNlcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBpbnN0YW5jZUlkKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyZ1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLl9fc2NvdW5kcmVsX3R5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gYXJnLl9fc2NvdW5kcmVsX2Z1bmN0aW9uX2lkXG4gICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59ICovXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uV3JhcHBlciA9ICguLi5hcmdzKSA9PiB0aGlzLmNhbGxGdW5jdGlvbk9uUmVmZXJlbmNlKGZ1bmN0aW9uSWQsIC4uLmFyZ3MpXG5cbiAgICAgICAgdGhpcy50cmFja0Z1bmN0aW9uV3JhcHBlcihmdW5jdGlvbldyYXBwZXIsIGZ1bmN0aW9uSWQpXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uV3JhcHBlclxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnW2tleV0sIG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGFyZ3VtZW50cyBhcnJheSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBcmd1bWVudHMgdG8gcGFyc2VcbiAgICogQHBhcmFtIHt7YWxsb3dSZW1vdGVSZWZlcmVuY2VzPzogYm9vbGVhbn19IFtvcHRpb25zXSBQYXJzaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge2FueVtdfSBQYXJzZWQgYXJndW1lbnRzXG4gICAqL1xuICBwYXJzZUluY29taW5nQXJncyhhcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnLCBvcHRpb25zKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFyZ3VtZW50cyBmb3IgYSBmdW5jdGlvbiBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFyZ3VtZW50cyB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMge2FueVtdfSBTZXJpYWxpemVkIGFyZ3VtZW50c1xuICAgKi9cbiAgcGFyc2VGdW5jdGlvbkFyZ3MoYXJncykge1xuICAgIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB0aGlzLnBhcnNlRnVuY3Rpb25BcmcoYXJnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFuIGFyZ3VtZW50IGZvciBhIGZ1bmN0aW9uIGNhbGxiYWNrXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VGdW5jdGlvbkFyZyhhcmcpIHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJnXG5cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUFyZyhhcmcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcbiAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBhcmdcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBvYmplY3RJZCxcbiAgICAgICAgX19zY291bmRyZWxfaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCxcbiAgICAgICAgX19zY291bmRyZWxfdHlwZTogXCJyZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9uc09yQXJnIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zT3JBcmcgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnN9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVmZXJlbmNlLCBwcm94eSwgb3IgcmVzdWx0XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lLCBvcHRpb25zT3JBcmcpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqL1xuICAgIGxldCBvcHRpb25zXG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgb3B0aW9ucyA9IHtyZWZlcmVuY2U6IHRydWV9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qob3B0aW9uc09yQXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnNPckFyZylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UmV0dXJuID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnNPckFyZywgXCJyZWZlcmVuY2VcIilcbiAgICAgICAgICAgIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zT3JBcmcsIFwicmVzdWx0XCIpXG4gICAgICAgICAgICB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9uc09yQXJnLCBcInByb3h5XCIpXG4gICAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKHtcbiAgICAgICAgICAgIC4uLihoYXNFeHBsaWNpdFJldHVybiA/IHt9IDoge3JlZmVyZW5jZTogdHJ1ZX0pLFxuICAgICAgICAgICAgLi4ub3B0aW9uc09yQXJnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBvcHRpb25zOiAke3Vua25vd25PcHRpb25zLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG9wdGlvbnMsIGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eT59IFJlZmVyZW5jZSBvciBwcm94eSB0byB0aGUgYXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9yIHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgUmV0dXJuT3B0aW9uc30gYXR0cmlidXRlTmFtZU9yT3B0aW9ucyBBdHRyaWJ1dGUgbmFtZSBvciBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBbYXR0cmlidXRlTmFtZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lT3JPcHRpb25zLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYWxsb3dlZE9wdGlvbnMgPSBuZXcgU2V0KFtcInJlZmVyZW5jZVwiLCBcInJlc3VsdFwiLCBcInByb3h5XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9ucyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0YXJnZXRBdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZVxuXG4gICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVOYW1lT3JPcHRpb25zKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICBjb25zdCBoYXNPcHRpb25LZXkgPSBvcHRpb25LZXlzLnNvbWUoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG5cbiAgICAgIGlmIChoYXNPcHRpb25LZXkpIHtcbiAgICAgICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBvcHRpb25LZXlzLmZpbHRlcigoa2V5KSA9PiAhYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgIGlmICh1bmtub3duT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXRBdHRyaWJ1dGVOYW1lID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2UgcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5SZWZlcmVuY2UgPSBvcHRpb25zPy5yZWZlcmVuY2UgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5SZXN1bHQgPSBvcHRpb25zPy5yZXN1bHQgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5Qcm94eSA9IG9wdGlvbnM/LnByb3h5ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRmxhZ3MgPSBbcmV0dXJuUmVmZXJlbmNlLCByZXR1cm5SZXN1bHQsIHJldHVyblByb3h5XS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoXG5cbiAgICBpZiAocmV0dXJuRmxhZ3MgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoUmVmZXJlbmNlID0gcmV0dXJuUmVmZXJlbmNlIHx8IHJldHVyblByb3h5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInJlYWRfYXR0cmlidXRlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZV9uYW1lOiB0YXJnZXRBdHRyaWJ1dGVOYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IHdpdGhSZWZlcmVuY2UgPyBcInJlZmVyZW5jZVwiIDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXdpdGhSZWZlcmVuY2UpIHJldHVybiByZXN1bHQucmVzcG9uc2VcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQsIHJlc3VsdC5pbnN0YW5jZV9pZClcblxuICAgIHJldHVybiByZXR1cm5Qcm94eSA/IHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpIDogc3Bhd25lZFJlZmVyZW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlIENsYXNzIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3RlckNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICghKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSkgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBkb2VzIG5vdCBleGlzdDogJHtjbGFzc05hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYW4gb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gcmVtb3ZlXG4gICAqL1xuICB1bnJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICBpZiAoIShvYmplY3ROYW1lIGluIHRoaXMuX29iamVjdHMpKSB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBkb2VzIG5vdCBleGlzdDogJHtvYmplY3ROYW1lfWApXG5cbiAgICBkZWxldGUgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIGxvb2sgdXBcbiAgICogQHJldHVybnMge2FueX0gUmVnaXN0ZXJlZCBvYmplY3Qgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZE9iamVjdChvYmplY3ROYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHNbb2JqZWN0TmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNwb25kcyB0byBhIGNvbW1hbmQgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWFuZElkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBSZXNwb25zZSBwYXlsb2FkXG4gICAqL1xuICByZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJZCwgZGF0YSkge1xuICAgIHRoaXMuc2VuZCh7Y29tbWFuZDogXCJjb21tYW5kX3Jlc3BvbnNlXCIsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YToge2NvbW1hbmRfaWQ6IGNvbW1hbmRJZCwgZGF0YX19KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgYmFja2VuZCBhbmQgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBDb21tYW5kIG5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgQ29tbWFuZCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3BvbnNlIGZyb20gdGhlIGJhY2tlbmRcbiAgICovXG4gIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb3V0Z29pbmdDb21tYW5kQ291bnQgPSArK3RoaXMub3V0Z29pbmdDb21tYW5kc0NvdW50XG4gICAgICBjb25zdCBvcmlnaW5FcnJvciA9IG5ldyBFcnJvcihgQ29tbWFuZCAnJHtjb21tYW5kfScgZGlzcGF0Y2hlZGApXG4gICAgICAvLyBTdHJpcCB0aGUgc2VuZENvbW1hbmQgZnJhbWUgdG8gaGlnaGxpZ2h0IHRoZSBjYWxsZXIgc2l0ZS5cbiAgICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2Uob3JpZ2luRXJyb3IsIHRoaXMuc2VuZENvbW1hbmQpXG4gICAgICBjb25zdCBjb21tYW5kRGF0YSA9IHtcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgY29tbWFuZF9pZDogb3V0Z29pbmdDb21tYW5kQ291bnQsXG4gICAgICAgIGRhdGFcbiAgICAgIH1cblxuICAgICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzW291dGdvaW5nQ29tbWFuZENvdW50XSA9IHtyZXNvbHZlLCByZWplY3QsIG9yaWdpblN0YWNrOiBvcmlnaW5FcnJvci5zdGFja31cbiAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiU2VuZGluZ1wiLCBjb21tYW5kRGF0YV0pXG4gICAgICB0aGlzLnNlbmQoY29tbWFuZERhdGEpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBkYXRhIHRvIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFBheWxvYWQgdG8gc2VuZFxuICAgKi9cbiAgc2VuZChkYXRhKSB7XG4gICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHJlbGVhc2VkSWRzID0gdGhpcy50YWtlUmVsZWFzZWRSZWZlcmVuY2VJZHMoKVxuICAgICAgaWYgKHJlbGVhc2VkSWRzLmxlbmd0aCA+IDApIGRhdGEucmVsZWFzZWRfcmVmZXJlbmNlX2lkcyA9IHJlbGVhc2VkSWRzXG4gICAgfVxuXG4gICAgdGhpcy5iYWNrZW5kLnNlbmQoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFBhcnNlZCBKU09OIHJlcHJlc2VudGF0aW9uXG4gICAqL1xuICBhc3luYyBzZXJpYWxpemVSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIiwge3JlZmVyZW5jZV9pZDogcmVmZXJlbmNlSWR9KVxuXG4gICAgcmV0dXJuIHBhcnNlU2NvdW5kcmVsSlNPTihqc29uKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gW2luc3RhbmNlSWRdIE93bmluZyBpbnN0YW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtSZWZlcmVuY2V9IFJlZmVyZW5jZSBpbnN0YW5jZVxuICAgKi9cbiAgc3Bhd25SZWZlcmVuY2UoaWQsIGluc3RhbmNlSWQpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlKHRoaXMsIGlkLCBpbnN0YW5jZUlkKVxuXG4gICAgdGhpcy50cmFja1JlZmVyZW5jZShyZWZlcmVuY2UpXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlXG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgc3Bhd25lZCByZWZlcmVuY2Ugc28gd2Vhay1yZWZlcmVuY2UgY2xlYW51cCBjYW4gcmVsZWFzZSBpdCBsYXRlci5cbiAgICogQHBhcmFtIHtSZWZlcmVuY2V9IHJlZmVyZW5jZSBSZWZlcmVuY2UgdG8gdHJhY2tcbiAgICovXG4gIHRyYWNrUmVmZXJlbmNlKHJlZmVyZW5jZSkge1xuICAgIGlmICh0aGlzLnN1cHBvcnRzV2Vha1JlZmVyZW5jZXMpIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlc1tyZWZlcmVuY2UuaWRdID0gbmV3IFdlYWtSZWYocmVmZXJlbmNlKVxuICAgICAgdGhpcy5yZWZlcmVuY2VSZWxlYXNlUmVnaXN0cnk/LnJlZ2lzdGVyKHJlZmVyZW5jZSwgcmVmZXJlbmNlLmlkKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXNbcmVmZXJlbmNlLmlkXSA9IHJlZmVyZW5jZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgYSBmdW5jdGlvbiB3cmFwcGVyIGZvciBmaW5hbGl6YXRpb24tYmFzZWQgcmVsZWFzZS5cbiAgICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8YW55Pn0gZnVuY3Rpb25XcmFwcGVyIFdyYXBwZXIgZnVuY3Rpb24gZXhwb3NlZCB0byBjYWxsZXJzXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gZnVuY3Rpb25JZCBGdW5jdGlvbiByZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKi9cbiAgdHJhY2tGdW5jdGlvbldyYXBwZXIoZnVuY3Rpb25XcmFwcGVyLCBmdW5jdGlvbklkKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzV2Vha1JlZmVyZW5jZXMpIHJldHVyblxuICAgIGlmIChmdW5jdGlvbklkID09PSB1bmRlZmluZWQgfHwgZnVuY3Rpb25JZCA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICB0aGlzLnJlZmVyZW5jZVJlbGVhc2VSZWdpc3RyeT8ucmVnaXN0ZXIoZnVuY3Rpb25XcmFwcGVyLCBmdW5jdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIHJlZmVyZW5jZSBpZCBmb3IgcmVsZWFzZSBvbiB0aGUgbmV4dCBvdXRib3VuZCBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyIHRvIHJlbGVhc2VcbiAgICovXG4gIHF1ZXVlUmVsZWFzZWRSZWZlcmVuY2UocmVmZXJlbmNlSWQpIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNXZWFrUmVmZXJlbmNlcykgcmV0dXJuXG4gICAgaWYgKHJlZmVyZW5jZUlkID09PSB1bmRlZmluZWQgfHwgcmVmZXJlbmNlSWQgPT09IG51bGwpIHJldHVyblxuICAgIHRoaXMucGVuZGluZ1JlZmVyZW5jZVJlbGVhc2VzLmFkZChyZWZlcmVuY2VJZClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyW119IFJlZmVyZW5jZSBpZHMgcXVldWVkIGZvciByZWxlYXNlLiAqL1xuICB0YWtlUmVsZWFzZWRSZWZlcmVuY2VJZHMoKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzV2Vha1JlZmVyZW5jZXMpIHJldHVybiBbXVxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWZlcmVuY2VSZWxlYXNlcy5zaXplID09PSAwKSByZXR1cm4gW11cblxuICAgIGNvbnN0IGlkcyA9IEFycmF5LmZyb20odGhpcy5wZW5kaW5nUmVmZXJlbmNlUmVsZWFzZXMpXG4gICAgdGhpcy5wZW5kaW5nUmVmZXJlbmNlUmVsZWFzZXMuY2xlYXIoKVxuICAgIHJldHVybiBpZHNcbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyByZWxlYXNlZCBsb2NhbCBvYmplY3QgcmVmZXJlbmNlcyBhbm5vdW5jZWQgYnkgdGhlIHBlZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyW10gfCB1bmRlZmluZWR9IHJlZmVyZW5jZUlkcyBSZWZlcmVuY2UgaWRzIHRvIHJlbGVhc2VcbiAgICovXG4gIHJlbGVhc2VSZWZlcmVuY2VzKHJlZmVyZW5jZUlkcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShyZWZlcmVuY2VJZHMpIHx8IHJlZmVyZW5jZUlkcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgZm9yIChjb25zdCByZWZlcmVuY2VJZCBvZiByZWZlcmVuY2VJZHMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG4gICAgfVxuICB9XG5cbiAgZW5hYmxlU2VydmVyQ29udHJvbCgpIHtcbiAgICB0aGlzLnNlcnZlckNvbnRyb2xFbmFibGVkID0gdHJ1ZVxuICB9XG59XG4iXX0=
1221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFDakMsT0FBTyxTQUFTLE1BQU0sZ0JBQWdCLENBQUE7QUFDdEMsT0FBTyxjQUFjLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxpQkFBaUIsTUFBTSxpQ0FBaUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUU3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO0FBQzdDLHNEQUFzRDtBQUN0RCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUE7QUFDOUIsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDOUIsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUE7SUFDaEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMvRSxPQUFPLGFBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQTtBQUMxRixDQUFDLENBQUE7QUFFRCw0REFBNEQ7QUFFNUQsd0JBQXdCO0FBRXhCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU07SUFDekI7Ozs7T0FJRztJQUNILFlBQVksT0FBTyxFQUFFLE9BQU8sR0FBRyxFQUFFO1FBa2JqQzs7Ozs7Ozs7O1dBU0c7UUFDSCxjQUFTLEdBQUcsQ0FBQyxFQUFDLE9B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QkFBd0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0I7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUMzQyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFBO1FBRXZELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDckQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3JDLE9BQU8sR0FBRyxDQUFBO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNILGlCQUFpQixDQUFDLFlBQVk7UUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTTtRQUVyRSxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuLi9sb2dnZXIuanNcIlxuaW1wb3J0IFJlZmVyZW5jZSBmcm9tIFwiLi9yZWZlcmVuY2UuanNcIlxuaW1wb3J0IHJlZmVyZW5jZVByb3h5IGZyb20gXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiXG5pbXBvcnQgc2FmZUpTT05TdHJpbmdpZnkgZnJvbSBcIi4uL3V0aWxzL3NhZmUtanNvbi1zdHJpbmdpZnkuanNcIlxuaW1wb3J0IHtwYXJzZVNjb3VuZHJlbEpTT059IGZyb20gXCIuLi91dGlscy9zY291bmRyZWwtanNvbi5qc1wiXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJTY291bmRyZWwgQ2xpZW50XCIpXG4vKiogQHR5cGUge3R5cGVvZiBnbG9iYWxUaGlzICYgUmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbmNvbnN0IGdsb2JhbFNjb3BlID0gZ2xvYmFsVGhpc1xuY29uc3QgZ2VuZXJhdGVJbnN0YW5jZUlkID0gKCkgPT4ge1xuICBjb25zdCByYW5kb21VVUlEID0gZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSURcbiAgaWYgKHR5cGVvZiByYW5kb21VVUlEID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiByYW5kb21VVUlELmNhbGwoZ2xvYmFsVGhpcy5jcnlwdG8pXG4gIHJldHVybiBgc2NvdW5kcmVsLSR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgMTApfWBcbn1cblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3JlZmVyZW5jZS1wcm94eS5qc1wiKS5Qcm94eX0gUHJveHkgKi9cblxuLy8gbG9nZ2VyLnNldERlYnVnKHRydWUpXG5cbi8qKlxuICogQHR5cGVkZWYge3tyZWZlcmVuY2U/OiBib29sZWFuLCByZXN1bHQ/OiBib29sZWFuLCBwcm94eT86IGJvb2xlYW59fSBSZXR1cm5PcHRpb25zXG4gKiBAdHlwZWRlZiB7UmV0dXJuT3B0aW9ucyAmIHtyZXN1bHQ/OiBmYWxzZX19IFJldHVyblJlZmVyZW5jZU9wdGlvbnNcbiAqIEB0eXBlZGVmIHtSZXR1cm5PcHRpb25zICYge3Jlc3VsdDogdHJ1ZSwgcmVmZXJlbmNlPzogZmFsc2V9fSBSZXR1cm5SZXN1bHRPcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFNjb3VuZHJlbCBDbGllbnRcbiAgICogQHBhcmFtIHthbnl9IGJhY2tlbmQgVGhlIGJhY2tlbmQgY29ubmVjdGlvbiAoZS5nLiwgV2ViU29ja2V0KVxuICAgKiBAcGFyYW0ge3tlbmFibGVTZXJ2ZXJDb250cm9sPzogYm9vbGVhbn19IFtvcHRpb25zXSBDbGllbnQgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kXG4gICAgdGhpcy5iYWNrZW5kLm9uQ29tbWFuZCh0aGlzLm9uQ29tbWFuZClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHMgPSB7fVxuICAgIHRoaXMuaW5jb21pbmdDb21tYW5kcyA9IHt9XG4gICAgdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnQgPSAwXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fY2xhc3NlcyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgdGhpcy5fb2JqZWN0cyA9IHt9XG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJlZmVyZW5jZSB8IFdlYWtSZWY8UmVmZXJlbmNlPj59ICovXG4gICAgdGhpcy5yZWZlcmVuY2VzID0ge31cblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgYW55Pn0gKi9cbiAgICB0aGlzLm9iamVjdHMgPSB7fVxuXG4gICAgdGhpcy5vYmplY3RzQ291bnQgPSAwXG4gICAgdGhpcy5pbnN0YW5jZUlkID0gZ2VuZXJhdGVJbnN0YW5jZUlkKClcbiAgICB0aGlzLnN1cHBvcnRzV2Vha1JlZmVyZW5jZXMgPSB0eXBlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgPT09IFwiZnVuY3Rpb25cIlxuICAgIHRoaXMucmVmZXJlbmNlUmVsZWFzZVJlZ2lzdHJ5ID0gdGhpcy5zdXBwb3J0c1dlYWtSZWZlcmVuY2VzXG4gICAgICA/IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgocmVmZXJlbmNlSWQpID0+IHRoaXMucXVldWVSZWxlYXNlZFJlZmVyZW5jZShyZWZlcmVuY2VJZCkpXG4gICAgICA6IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZWZlcmVuY2VSZWxlYXNlcyA9IG5ldyBTZXQoKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMuZW5hYmxlU2VydmVyQ29udHJvbClcblxuICAgIC8qKiBAdHlwZSB7KChlcnJvcjogRXJyb3IpID0+IHZvaWQpIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uVW5oYW5kbGVkUmVqZWN0aW9uID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHsoKGV2ZW50OiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpID0+IHZvaWQpIHwgbnVsbH0gKi9cbiAgICB0aGlzLl91bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gbnVsbFxuXG4gICAgaWYgKHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgJiYgdHlwZW9mIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLl91bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyID0gKC8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGlvbkV2ZW50fSAqLyBldmVudCkgPT4ge1xuICAgICAgICBjb25zdCByZWFzb24gPSBldmVudC5yZWFzb25cbiAgICAgICAgY29uc3QgZXJyb3IgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgID8ge21lc3NhZ2U6IHJlYXNvbi5tZXNzYWdlLCBzdGFjazogcmVhc29uLnN0YWNrfVxuICAgICAgICAgIDoge21lc3NhZ2U6IFN0cmluZyhyZWFzb24pfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcInVuaGFuZGxlZF9yZWplY3Rpb25cIiwgZGF0YTogZXJyb3J9KVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBDb25uZWN0aW9uIG1heSBiZSBjbG9zZWRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgdGhpcy5fdW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjbGllbnQgY29ubmVjdGlvblxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3VuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgJiYgdHlwZW9mIGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ1bmhhbmRsZWRyZWplY3Rpb25cIiwgdGhpcy5fdW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcilcbiAgICAgIHRoaXMuX3VuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBudWxsXG4gICAgfVxuICAgIHRoaXMuYmFja2VuZC5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0gIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBSZXN1bHQgZnJvbSB0aGUgbWV0aG9kIGNhbGxcbiAgICovXG4gIC8qKlxuICAgKiBDYWxscyBhIG1ldGhvZCBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHtSZXR1cm5SZWZlcmVuY2VPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjYWxsXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSByZXR1cm5lZCB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjYWxsXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IFJlc3VsdCBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGludm9rZVxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnMgfCBhbnl9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSBjYWxsIG9yIGZpcnN0IGFyZ3VtZW50XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVzdWx0IG9yIHJlZmVyZW5jZSBmcm9tIHRoZSBtZXRob2QgY2FsbFxuICAgKi9cbiAgYXN5bmMgY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCBvcHRpb25zT3JBcmcsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvcHRpb25zXG4gICAgLyoqIEB0eXBlIHthbnlbXX0gKi9cbiAgICBsZXQgbWV0aG9kQXJnc1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zT3JBcmcgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIG1ldGhvZEFyZ3MgPSBhcmdzXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qob3B0aW9uc09yQXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnNPckFyZylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IG9wdGlvblZhbHVlc0FyZUJvb2xlYW4gPSBvcHRpb25LZXlzXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IGFsbG93ZWRPcHRpb25zLmhhcyhrZXkpKVxuICAgICAgICAgICAgLmV2ZXJ5KChrZXkpID0+IHR5cGVvZiBvcHRpb25zT3JBcmdba2V5XSA9PT0gXCJib29sZWFuXCIpXG5cbiAgICAgICAgICBpZiAob3B0aW9uVmFsdWVzQXJlQm9vbGVhbikge1xuICAgICAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKG9wdGlvbnNPckFyZylcbiAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSBhcmdzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY2FsbE1ldGhvZE9uUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZEFyZ3MgPSBbb3B0aW9uc09yQXJnLCAuLi5hcmdzXVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXRob2RBcmdzID0gW29wdGlvbnNPckFyZywgLi4uYXJnc11cbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5SZWZlcmVuY2UgPSBvcHRpb25zPy5yZWZlcmVuY2UgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5SZXN1bHQgPSBvcHRpb25zPy5yZXN1bHQgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5Qcm94eSA9IG9wdGlvbnM/LnByb3h5ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRmxhZ3MgPSBbcmV0dXJuUmVmZXJlbmNlLCByZXR1cm5SZXN1bHQsIHJldHVyblByb3h5XS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoXG5cbiAgICBpZiAocmV0dXJuRmxhZ3MgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsTWV0aG9kT25SZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoUmVmZXJlbmNlID0gcmV0dXJuUmVmZXJlbmNlIHx8IHJldHVyblByb3h5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImNhbGxfbWV0aG9kX29uX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKG1ldGhvZEFyZ3MpLFxuICAgICAgbWV0aG9kX25hbWU6IG1ldGhvZE5hbWUsXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogd2l0aFJlZmVyZW5jZSA/IFwicmVmZXJlbmNlXCIgOiBcInJlc3VsdFwiXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGlmICh3aXRoUmVmZXJlbmNlKSB7XG4gICAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5yZXNwb25zZVxuXG4gICAgICBpZiAoIW9iamVjdElkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICAgICAgcmV0dXJuIHJldHVyblByb3h5ID8gcmVmZXJlbmNlUHJveHkoc3Bhd25lZFJlZmVyZW5jZSkgOiBzcGF3bmVkUmVmZXJlbmNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC5yZXNwb25zZVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb25cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzdWx0IGZyb20gdGhlIGZ1bmN0aW9uIGNhbGxcbiAgICovXG4gIGFzeW5jIGNhbGxGdW5jdGlvbk9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCAuLi5hcmdzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImNhbGxfZnVuY3Rpb25fb25fcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VGdW5jdGlvbkFyZ3MoYXJncyksXG4gICAgICByZWZlcmVuY2VfaWQ6IHJlZmVyZW5jZUlkLFxuICAgICAgd2l0aDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICByZXR1cm4gcmVzdWx0LnJlc3BvbnNlXG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYSBtZXRob2Qgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBNZXRob2QgbmFtZSB0byBpbnZva2VcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2RcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICovXG4gIGFzeW5jIGNhbGxNZXRob2RPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2UocmVmZXJlbmNlSWQsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLndhcm4oXCJTY291bmRyZWwgQ2xpZW50XCIsIFwiY2FsbE1ldGhvZE9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBpcyBkZXByZWNhdGVkOyB1c2UgY2FsbE1ldGhvZE9uUmVmZXJlbmNlIHdpdGggcmVmZXJlbmNlIGluc3RlYWQuXCIpXG4gICAgcmV0dXJuIHRoaXMuY2FsbE1ldGhvZE9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBtZXRob2ROYW1lLCB7cmVmZXJlbmNlOiB0cnVlfSwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzdHJpbmcgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIGV2YWx1YXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZXZhbChldmFsU3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiBldmFsU3RyaW5nICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmFsIHJlcXVpcmVzIGFuIGV2YWwgc3RyaW5nXCIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImV2YWxcIiwge1xuICAgICAgZXZhbF9zdHJpbmc6IGV2YWxTdHJpbmcsXG4gICAgICB3aXRoX3JlZmVyZW5jZTogdHJ1ZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBvYmplY3RJZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIGlmICghb2JqZWN0SWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShvYmplY3RJZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZhbFN0cmluZyBDb2RlIHRvIGV2YWx1YXRlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgZXZhbHVhdGVkIHZhbHVlXG4gICAqL1xuICBhc3luYyBldmFsUmVmZXJlbmNlKGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZWZlcmVuY2UgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiB0cnVlXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IG9iamVjdElkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFvYmplY3RJZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKG9iamVjdElkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc3RyaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2YWxTdHJpbmcgQ29kZSB0byBldmFsdWF0ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBFdmFsdWF0ZWQgcmVzdWx0XG4gICAqL1xuICBhc3luYyBldmFsUmVzdWx0KGV2YWxTdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGV2YWxTdHJpbmcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImV2YWxSZXN1bHQgcmVxdWlyZXMgYW4gZXZhbCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZXZhbFwiLCB7XG4gICAgICBldmFsX3N0cmluZzogZXZhbFN0cmluZyxcbiAgICAgIHdpdGhfcmVmZXJlbmNlOiBmYWxzZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCEoXCJyZXNwb25zZVwiIGluIHJlc3VsdCkpIHRocm93IG5ldyBFcnJvcihgTm8gcmVzcG9uc2UgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiByZXN1bHQucmVzcG9uc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgbW9kdWxlIGFuZCByZXR1cm5zIGEgcHJveHkgdG8gaXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGltcG9ydE5hbWUgTW9kdWxlIG5hbWUgdG8gaW1wb3J0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFByb3h5Pn0gUHJveHkgdG8gdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGltcG9ydE5hbWUpIHtcbiAgICBpZiAodHlwZW9mIGltcG9ydE5hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcImltcG9ydCByZXF1aXJlcyBhIG1vZHVsZSBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiaW1wb3J0XCIsIHtcbiAgICAgIGltcG9ydF9uYW1lOiBpbXBvcnROYW1lXG4gICAgfSlcblxuICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiaW1wb3J0XCIsIHtyZXN1bHR9XSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZXN1bHQgZ2l2ZW5cIilcbiAgICBpZiAoIXJlc3VsdC5vYmplY3RfaWQpIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IElEIGdpdmVuIGluIHJlc3VsdDogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcbiAgICBjb25zdCBzcGF3bmVkUmVmZXJlbmNlID0gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpXG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0cyBhIG1vZHVsZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW1wb3J0TmFtZSBNb2R1bGUgbmFtZSB0byBpbXBvcnRcbiAgICogQHJldHVybnMge1Byb21pc2U8UmVmZXJlbmNlPn0gUmVmZXJlbmNlIHRvIHRoZSBtb2R1bGVcbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiBpbXBvcnROYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbXBvcnRSZWZlcmVuY2UgcmVxdWlyZXMgYSBtb2R1bGUgbmFtZVwiKVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcImltcG9ydFwiLCB7XG4gICAgICBpbXBvcnRfbmFtZTogaW1wb3J0TmFtZVxuICAgIH0pXG5cbiAgICBsb2dnZXIubG9nKCgpID0+IFtcImltcG9ydFwiLCB7cmVzdWx0fV0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVzdWx0IGdpdmVuXCIpXG4gICAgaWYgKCFyZXN1bHQub2JqZWN0X2lkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICByZXR1cm4gdGhpcy5zcGF3blJlZmVyZW5jZShpZCwgcmVzdWx0Lmluc3RhbmNlX2lkKVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgYSBtb2R1bGUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbXBvcnROYW1lIE1vZHVsZSBuYW1lIHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG1vZHVsZVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0UmVzdWx0KGltcG9ydE5hbWUpIHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSBhd2FpdCB0aGlzLmltcG9ydFJlZmVyZW5jZShpbXBvcnROYW1lKVxuICAgIHJldHVybiBhd2FpdCByZWZlcmVuY2Uuc2VyaWFsaXplKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHByb3h5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMuZ2V0T2JqZWN0UmVmZXJlbmNlKG9iamVjdE5hbWUpXG4gICAgcmV0dXJuIHJlZmVyZW5jZVByb3h5KHJlZmVyZW5jZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBvYmplY3QgYnkgbmFtZSBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBSZWdpc3RlcmVkIG9iamVjdCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZT59IFJlZmVyZW5jZSB0byB0aGUgb2JqZWN0XG4gICAqL1xuICBhc3luYyBnZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSkge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0TmFtZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKFwiZ2V0T2JqZWN0UmVmZXJlbmNlIHJlcXVpcmVzIGFuIG9iamVjdCBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwiZ2V0X29iamVjdFwiLCB7XG4gICAgICBvYmplY3RfbmFtZTogb2JqZWN0TmFtZVxuICAgIH0pXG5cbiAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKFwiQmxhbmsgcmVzdWx0IGdpdmVuXCIpXG5cbiAgICBjb25zdCBpZCA9IHJlc3VsdC5vYmplY3RfaWRcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIFJlZ2lzdGVyZWQgb2JqZWN0IG5hbWVcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gU2VyaWFsaXplZCByZXN1bHQgZm9yIHRoZSBvYmplY3RcbiAgICovXG4gIGFzeW5jIGdldE9iamVjdFJlc3VsdChvYmplY3ROYW1lKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYXdhaXQgdGhpcy5nZXRPYmplY3RSZWZlcmVuY2Uob2JqZWN0TmFtZSlcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgYSBwcm94eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIENsYXNzIG5hbWUgdG8gY29uc3RydWN0XG4gICAqIEBwYXJhbSAgey4uLmFueX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8UHJveHk+fSBQcm94eSB0byB0aGUgbmV3IGluc3RhbmNlXG4gICAqL1xuICBhc3luYyBuZXdPYmplY3QoY2xhc3NOYW1lLCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIm5ld09iamVjdCByZXF1aXJlcyBhIGNsYXNzIG5hbWVcIilcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoXCJuZXdfb2JqZWN0X3dpdGhfcmVmZXJlbmNlXCIsIHtcbiAgICAgIGFyZ3M6IHRoaXMucGFyc2VBcmcoYXJncyksXG4gICAgICBjbGFzc19uYW1lOiBjbGFzc05hbWVcbiAgICB9KVxuXG4gICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihcIkJsYW5rIHJlc3VsdCBnaXZlblwiKVxuXG4gICAgY29uc3QgaWQgPSByZXN1bHQub2JqZWN0X2lkXG5cbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBJRCBnaXZlbiBpbiByZXN1bHQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0KX1gKVxuXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQsIHJlc3VsdC5pbnN0YW5jZV9pZClcblxuICAgIHJldHVybiByZWZlcmVuY2VQcm94eShzcGF3bmVkUmVmZXJlbmNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFNwYXducyBhIG5ldyByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoXCJuZXdPYmplY3RSZWZlcmVuY2UgcmVxdWlyZXMgYSBjbGFzcyBuYW1lXCIpXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwibmV3X29iamVjdF93aXRoX3JlZmVyZW5jZVwiLCB7XG4gICAgICBhcmdzOiB0aGlzLnBhcnNlQXJnKGFyZ3MpLFxuICAgICAgY2xhc3NfbmFtZTogY2xhc3NOYW1lXG4gICAgfSlcblxuICAgIGlmICghcmVzdWx0KSB0aHJvdyBuZXcgRXJyb3IoXCJCbGFuayByZXN1bHQgZ2l2ZW5cIilcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0Lm9iamVjdF9pZFxuXG4gICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgSUQgZ2l2ZW4gaW4gcmVzdWx0OiAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YClcblxuICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKGlkLCByZXN1bHQuaW5zdGFuY2VfaWQpXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3QgYW5kIHJldHVybnMgdGhlIHNlcmlhbGl6ZWQgcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBjb25zdHJ1Y3RcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fSBTZXJpYWxpemVkIHJlc3VsdCBmb3IgdGhlIG5ldyBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgbmV3T2JqZWN0UmVzdWx0KGNsYXNzTmFtZSwgLi4uYXJncykge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IGF3YWl0IHRoaXMubmV3T2JqZWN0UmVmZXJlbmNlKGNsYXNzTmFtZSwgLi4uYXJncylcbiAgICByZXR1cm4gYXdhaXQgcmVmZXJlbmNlLnNlcmlhbGl6ZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCBpcyBhIHBsYWluIG9iamVjdFxuICAgKiBAcGFyYW0ge2FueX0gaW5wdXQgVmFsdWUgdG8gaW5zcGVjdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdFxuICAgKi9cbiAgaXNQbGFpbk9iamVjdChpbnB1dCkge1xuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIENvbW1hbmQgcGF5bG9hZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge251bWJlcn0gYXJncy5jb21tYW5kX2lkIENvbW1hbmQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5kYXRhIENvbW1hbmQgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JdIEVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZXJyb3JTdGFja10gRXJyb3Igc3RhY2sgZnJvbSB0aGUgYmFja2VuZFxuICAgKiBAcGFyYW0ge251bWJlcltdfSBbYXJncy5yZWxlYXNlZF9yZWZlcmVuY2VfaWRzXSBSZWZlcmVuY2UgSURzIHJlbGVhc2VkIGJ5IHRoZSBwZWVyXG4gICAqL1xuICBvbkNvbW1hbmQgPSAoe2NvbW1hbmQsIGNvbW1hbmRfaWQ6IGNvbW1hbmRJRCwgZGF0YSwgZXJyb3IsIGVycm9yU3RhY2ssIHJlbGVhc2VkX3JlZmVyZW5jZV9pZHM6IHJlbGVhc2VkUmVmZXJlbmNlSWRzLCAuLi5yZXN0QXJnc30pID0+IHtcbiAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uQ29tbWFuZFwiLCB7Y29tbWFuZCwgY29tbWFuZElELCBkYXRhLCBlcnJvciwgZXJyb3JTdGFjaywgcmVzdEFyZ3N9XSlcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlbGVhc2VSZWZlcmVuY2VzKHJlbGVhc2VkUmVmZXJlbmNlSWRzKVxuXG4gICAgICBpZiAoIWNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjb21tYW5kIGtleSBnaXZlbiBpbiBkYXRhOiAke09iamVjdC5rZXlzKHJlc3RBcmdzKS5qb2luKFwiLCBcIil9YClcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNvbW1hbmRfcmVzcG9uc2VcIikge1xuICAgICAgICBpZiAoIShjb21tYW5kSUQgaW4gdGhpcy5vdXRnb2luZ0NvbW1hbmRzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3V0Z29pbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gbm90IGZvdW5kOiAke09iamVjdC5rZXlzKHRoaXMub3V0Z29pbmdDb21tYW5kcykuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYXZlZENvbW1hbmQgPSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLm91dGdvaW5nQ29tbWFuZHNbY29tbWFuZElEXVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yVG9UaHJvdyA9IG5ldyBFcnJvcihlcnJvcilcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBSZW1vdmVzIGludGVybmFsIHJ1bnRpbWUgZnJhbWVzIHNvIHJlbW90ZSBjb21tYW5kIGZhaWx1cmVzIHBvaW50IGF0IHVzZXIgY29kZS5cbiAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZCB8IG51bGx9IHN0YWNrIFN0YWNrIHRyYWNlIHRvIHNhbml0aXplXG4gICAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfSBTYW5pdGl6ZWQgc3RhY2sgbGluZXNcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBzYW5pdGl6ZVN0YWNrID0gKHN0YWNrKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXN0YWNrKSByZXR1cm4gW11cbiAgICAgICAgICAgIHJldHVybiBzdGFja1xuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvbm9kZV9tb2R1bGVzXFwvd3MvLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTovLnRlc3QobGluZSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKGxpbmUpID0+ICEvKD86XnxcXCgpbm9kZTppbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIS8oPzpefFxcKClpbnRlcm5hbFxcLy8udGVzdChsaW5lKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gIWxpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBQcmVmaXhlcyBlYWNoIHN0YWNrIHNlY3Rpb24gc28gY29tYmluZWQgcmVtb3RlL2xvY2FsIHRyYWNlcyBzdGF5IHJlYWRhYmxlLlxuICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBTdGFjayBzZWN0aW9uIGxhYmVsXG4gICAgICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsfSBzdGFjayBTdGFjayB0cmFjZSB0byBmb3JtYXRcbiAgICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nW119IEZvcm1hdHRlZCBzdGFjayBzZWN0aW9uXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZm9ybWF0U2VjdGlvbiA9IChsYWJlbCwgc3RhY2spID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gc2FuaXRpemVTdGFjayhzdGFjaylcbiAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHJldHVybiBbXVxuICAgICAgICAgICAgcmV0dXJuIFtgJHtsYWJlbH0gJHtsaW5lc1swXX1gLCAuLi5saW5lcy5zbGljZSgxKV1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21iaW5lZFN0YWNrID0gW1xuICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yfWAsXG4gICAgICAgICAgICAuLi5mb3JtYXRTZWN0aW9uKFwiW1NDT1VOVERSRUwtU0VSVkVSXVwiLCBlcnJvclN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgZXJyb3JUb1Rocm93LnN0YWNrKSxcbiAgICAgICAgICAgIC4uLmZvcm1hdFNlY3Rpb24oXCJbU0NPVU5EUkVMLUNMSUVOVF1cIiwgc2F2ZWRDb21tYW5kLm9yaWdpblN0YWNrID8gYENvbW1hbmQgY3JlYXRlZCBhdDpcXG4ke3NhdmVkQ29tbWFuZC5vcmlnaW5TdGFja31gIDogbnVsbClcbiAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcblxuICAgICAgICAgIGVycm9yVG9UaHJvdy5zdGFjayA9IGNvbWJpbmVkU3RhY2tcblxuICAgICAgICAgIHNhdmVkQ29tbWFuZC5yZWplY3QoZXJyb3JUb1Rocm93KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW2BSZXNvbHZpbmcgY29tbWFuZCAke2NvbW1hbmRJRH0gd2l0aCBkYXRhYCwgZGF0YV0pXG4gICAgICAgICAgc2F2ZWRDb21tYW5kLnJlc29sdmUoZGF0YS5kYXRhKVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJ1bmhhbmRsZWRfcmVqZWN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgcmVqZWN0aW9uRXJyb3IgPSBuZXcgRXJyb3IoZGF0YS5tZXNzYWdlIHx8IFwiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uXCIpXG5cbiAgICAgICAgcmVqZWN0aW9uRXJyb3Iuc3RhY2sgPSBkYXRhLnN0YWNrIHx8IHJlamVjdGlvbkVycm9yLnN0YWNrXG4gICAgICAgIGxvZ2dlci5sb2coKCkgPT4gW1wiUmVjZWl2ZWQgdW5oYW5kbGVkIHJlamVjdGlvbiBmcm9tIHBlZXI6XCIsIGRhdGEubWVzc2FnZV0pXG5cbiAgICAgICAgaWYgKHRoaXMub25VbmhhbmRsZWRSZWplY3Rpb24pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5vblVuaGFuZGxlZFJlamVjdGlvbihyZWplY3Rpb25FcnJvcilcbiAgICAgICAgICB9IGNhdGNoIChjYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKCgpID0+IFtcIm9uVW5oYW5kbGVkUmVqZWN0aW9uIGNhbGxiYWNrIHRocmV3OlwiLCBjYWxsYmFja0Vycm9yXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmUtdGhyb3cgYXMgdW5oYW5kbGVkIHJlamVjdGlvbiBvbiB0aGUgc2VydmVyIHNvIGl0IHN1cmZhY2VzIGluIHRlc3Qgb3V0cHV0XG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uRXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcImNhbGxfZnVuY3Rpb25fb25fcmVmZXJlbmNlXCIpIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBkYXRhLnJlZmVyZW5jZV9pZFxuICAgICAgICBjb25zdCBmdW5jID0gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuXG4gICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMub2JqZWN0cywgcmVmZXJlbmNlSWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBvYmplY3QgYnkgdGhhdCBJRDogJHtyZWZlcmVuY2VJZH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZ1bmN0aW9uIGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0ge2FueX0gcmVzcG9uc2VWYWx1ZSBSZXNwb25zZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gdGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MsIHthbGxvd1JlbW90ZVJlZmVyZW5jZXM6IHRydWV9KVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGZ1bmMoLi4ucGFyc2VkQXJncylcblxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgdHlwZW9mIHJlc3BvbnNlLnRoZW4gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmVzcG9uc2UudGhlbihyZXNwb25kV2l0aFZhbHVlKS5jYXRjaChcbiAgICAgICAgICAgIC8qKiBAcGFyYW0ge2FueX0gcHJvbWlzZUVycm9yIFByb21pc2UgcmVqZWN0aW9uIHZhbHVlIGZyb20gdGhlIGludm9rZWQgZnVuY3Rpb24uICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogXCJTZXJ2ZXIgY29udHJvbCBpcyBkaXNhYmxlZFwifSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJnZXRfb2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qgc2VydmVyT2JqZWN0ID0gdGhpcy5fZ2V0UmVnaXN0ZXJlZE9iamVjdChkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBjb25zdCBzZXJ2ZXJDbGFzcyA9IHRoaXMuX2dldFJlZ2lzdGVyZWRDbGFzcyhkYXRhLm9iamVjdF9uYW1lKVxuICAgICAgICBsZXQgb2JqZWN0XG5cbiAgICAgICAgaWYgKHNlcnZlck9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgb2JqZWN0ID0gc2VydmVyT2JqZWN0XG4gICAgICAgIH0gZWxzZSBpZiAoc2VydmVyQ2xhc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9iamVjdCA9IHNlcnZlckNsYXNzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2JqZWN0ID0gZ2xvYmFsU2NvcGVbZGF0YS5vYmplY3RfbmFtZV1cblxuICAgICAgICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIG9iamVjdDogJHtkYXRhLm9iamVjdF9uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gb2JqZWN0XG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtvYmplY3RfaWQ6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcIm5ld19vYmplY3Rfd2l0aF9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhLmNsYXNzX25hbWVcbiAgICAgICAgbGV0IG9iamVjdFxuXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NOYW1lID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zdCBDbGFzc0luc3RhbmNlID0gdGhpcy5nZXRDbGFzcyhjbGFzc05hbWUpIHx8IGdsb2JhbFNjb3BlW2NsYXNzTmFtZV1cblxuICAgICAgICAgIGlmICghQ2xhc3NJbnN0YW5jZSkgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIGNsYXNzOiAke2NsYXNzTmFtZX1gKVxuXG4gICAgICAgICAgb2JqZWN0ID0gbmV3IENsYXNzSW5zdGFuY2UoLi4udGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGNsYXNzIG5hbWU6ICR7dHlwZW9mIGNsYXNzTmFtZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgdGhpcy5vYmplY3RzW29iamVjdElkXSA9IG9iamVjdFxuICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJjYWxsX21ldGhvZF9vbl9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9iamVjdHMsIHJlZmVyZW5jZUlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG9iamVjdFtkYXRhLm1ldGhvZF9uYW1lXVxuXG4gICAgICAgIGlmICghbWV0aG9kKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCBjYWxsZWQgJyR7ZGF0YS5tZXRob2RfbmFtZX0nIG9uIGEgJyR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9J2ApXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7YW55fSByZXNwb25zZVZhbHVlIFJlc3BvbnNlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBtZXRob2RcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoVmFsdWUgPSAocmVzcG9uc2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhLndpdGggPT0gXCJyZWZlcmVuY2VcIikge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSByZXNwb25zZVZhbHVlXG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7cmVzcG9uc2U6IG9iamVjdElkLCBpbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiByZXNwb25zZVZhbHVlfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gdGhpcy5wYXJzZUluY29taW5nQXJncyhkYXRhLmFyZ3MpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gbWV0aG9kLmNhbGwob2JqZWN0LCAuLi5wYXJzZWRBcmdzKVxuXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXNwb25zZS50aGVuKHJlc3BvbmRXaXRoVmFsdWUpLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7YW55fSBwcm9taXNlRXJyb3IgUHJvbWlzZSByZWplY3Rpb24gdmFsdWUgZnJvbSB0aGUgaW52b2tlZCBtZXRob2QuICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoVmFsdWUocmVzcG9uc2UpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSBcInNlcmlhbGl6ZV9yZWZlcmVuY2VcIikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJZCA9IGRhdGEucmVmZXJlbmNlX2lkXG4gICAgICAgIGNvbnN0IG9iamVjdCA9IHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cblxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLm9iamVjdHMsIHJlZmVyZW5jZUlkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gb2JqZWN0IGJ5IHRoYXQgSUQ6ICR7cmVmZXJlbmNlSWR9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzYWZlSlNPTlN0cmluZ2lmeShvYmplY3QpXG4gICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHNlcmlhbGl6ZWQpXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJyZWFkX2F0dHJpYnV0ZVwiKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBkYXRhLmF0dHJpYnV0ZV9uYW1lXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZGF0YS5yZWZlcmVuY2VfaWRcbiAgICAgICAgY29uc3QgcmV0dXJuV2l0aCA9IGRhdGEud2l0aFxuICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLm9iamVjdHNbcmVmZXJlbmNlSWRdXG5cbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vYmplY3RzLCByZWZlcmVuY2VJZCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9iamVjdCBieSB0aGF0IElEOiAke3JlZmVyZW5jZUlkfWApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBvYmplY3RbYXR0cmlidXRlTmFtZV1cblxuICAgICAgICBpZiAocmV0dXJuV2l0aCA9PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICB0aGlzLm9iamVjdHNbb2JqZWN0SWRdID0gYXR0cmlidXRlXG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXNwb25kVG9Db21tYW5kKGNvbW1hbmRJRCwge3Jlc3BvbnNlOiBhdHRyaWJ1dGV9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gXCJldmFsXCIpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7YW55fSBldmFsUmVzdWx0IEV2YWx1YXRlZCByZXN1bHRcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHJlc3BvbmRXaXRoUmVzdWx0ID0gKGV2YWxSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS53aXRoX3JlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgb2JqZWN0SWQgPSArK3RoaXMub2JqZWN0c0NvdW50XG5cbiAgICAgICAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBldmFsUmVzdWx0XG4gICAgICAgICAgICB0aGlzLnJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElELCB7b2JqZWN0X2lkOiBvYmplY3RJZCwgaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uZFRvQ29tbWFuZChjb21tYW5kSUQsIHtyZXNwb25zZTogZXZhbFJlc3VsdH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSB7Li4udGhpcy5fb2JqZWN0cywgLi4udGhpcy5fY2xhc3Nlc31cbiAgICAgICAgY29uc3QgcmVzZXJ2ZWRJZGVudGlmaWVycyA9IG5ldyBTZXQoW1xuICAgICAgICAgIFwiYnJlYWtcIixcbiAgICAgICAgICBcImNhc2VcIixcbiAgICAgICAgICBcImNhdGNoXCIsXG4gICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgIFwiY29uc3RcIixcbiAgICAgICAgICBcImNvbnRpbnVlXCIsXG4gICAgICAgICAgXCJkZWJ1Z2dlclwiLFxuICAgICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgICAgXCJkb1wiLFxuICAgICAgICAgIFwiZWxzZVwiLFxuICAgICAgICAgIFwiZXhwb3J0XCIsXG4gICAgICAgICAgXCJleHRlbmRzXCIsXG4gICAgICAgICAgXCJmaW5hbGx5XCIsXG4gICAgICAgICAgXCJmb3JcIixcbiAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgXCJpZlwiLFxuICAgICAgICAgIFwiaW1wb3J0XCIsXG4gICAgICAgICAgXCJpblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VvZlwiLFxuICAgICAgICAgIFwibmV3XCIsXG4gICAgICAgICAgXCJyZXR1cm5cIixcbiAgICAgICAgICBcInN1cGVyXCIsXG4gICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICBcInRoaXNcIixcbiAgICAgICAgICBcInRocm93XCIsXG4gICAgICAgICAgXCJ0cnlcIixcbiAgICAgICAgICBcInR5cGVvZlwiLFxuICAgICAgICAgIFwidmFyXCIsXG4gICAgICAgICAgXCJ2b2lkXCIsXG4gICAgICAgICAgXCJ3aGlsZVwiLFxuICAgICAgICAgIFwid2l0aFwiLFxuICAgICAgICAgIFwieWllbGRcIixcbiAgICAgICAgICBcImxldFwiLFxuICAgICAgICAgIFwiZW51bVwiLFxuICAgICAgICAgIFwiYXdhaXRcIixcbiAgICAgICAgICBcImltcGxlbWVudHNcIixcbiAgICAgICAgICBcInBhY2thZ2VcIixcbiAgICAgICAgICBcInByb3RlY3RlZFwiLFxuICAgICAgICAgIFwic3RhdGljXCIsXG4gICAgICAgICAgXCJpbnRlcmZhY2VcIixcbiAgICAgICAgICBcInByaXZhdGVcIixcbiAgICAgICAgICBcInB1YmxpY1wiLFxuICAgICAgICAgIFwiZXZhbFwiXG4gICAgICAgIF0pXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIElkZW50aWZpZXIgY2FuZGlkYXRlXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBuYW1lIGNhbiBiZSB1c2VkIGFzIGEgbG9jYWwgdmFyaWFibGVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGlzVmFsaWRJZGVudGlmaWVyID0gKG5hbWUpID0+XG4gICAgICAgICAgL14oPzpbJF9dfFxccHtJRF9TdGFydH0pKD86WyRfXXxcXHB7SURfQ29udGludWV9KSokL3UudGVzdChuYW1lKSAmJiAhcmVzZXJ2ZWRJZGVudGlmaWVycy5oYXMobmFtZSlcblxuICAgICAgICBjb25zdCBzY29wZUtleXMgPSBPYmplY3Qua2V5cyhzY29wZSlcbiAgICAgICAgY29uc3QgaW52YWxpZEtleXMgPSBzY29wZUtleXMuZmlsdGVyKChrZXkpID0+ICFpc1ZhbGlkSWRlbnRpZmllcihrZXkpKVxuXG4gICAgICAgIGlmIChpbnZhbGlkS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlZ2lzdGVyZWQgaWRlbnRpZmllcihzKTogJHtpbnZhbGlkS2V5cy5qb2luKFwiLCBcIil9YClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSByZWdpc3RlcmVkIG9iamVjdHMvY2xhc3NlcyBhcmUgYXZhaWxhYmxlIGFzIGxvY2FscyBpbnNpZGUgdGhlIGV2YWxcbiAgICAgICAgY29uc3QgZXZhbHVhdG9yID0gbmV3IEZ1bmN0aW9uKFwiX19ldmFsU3RyaW5nXCIsIC4uLnNjb3BlS2V5cywgXCJyZXR1cm4gZXZhbChfX2V2YWxTdHJpbmcpXCIpXG4gICAgICAgIGNvbnN0IGV2YWxBcmdzID0gc2NvcGVLZXlzLm1hcCgoa2V5KSA9PiBzY29wZVtrZXldKVxuICAgICAgICBjb25zdCBldmFsU3RyaW5nID0gYChhc3luYyAoKSA9PiB7XFxuJHtkYXRhLmV2YWxfc3RyaW5nfVxcbn0pKClgXG4gICAgICAgIGNvbnN0IGV2YWxSZXN1bHQgPSBldmFsdWF0b3IoZXZhbFN0cmluZywgLi4uZXZhbEFyZ3MpXG5cbiAgICAgICAgaWYgKGV2YWxSZXN1bHQgJiYgdHlwZW9mIGV2YWxSZXN1bHQudGhlbiA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBldmFsUmVzdWx0LnRoZW4ocmVzcG9uZFdpdGhSZXN1bHQpLmNhdGNoKFxuICAgICAgICAgICAgLyoqIEBwYXJhbSB7YW55fSBwcm9taXNlRXJyb3IgUHJvbWlzZSByZWplY3Rpb24gdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGNvZGUuICovXG4gICAgICAgICAgICAocHJvbWlzZUVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZUVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogcHJvbWlzZUVycm9yLm1lc3NhZ2UsIGVycm9yU3RhY2s6IHByb21pc2VFcnJvci5zdGFja30pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnNlbmQoe2NvbW1hbmQ6IFwiY29tbWFuZF9yZXNwb25zZVwiLCBjb21tYW5kX2lkOiBjb21tYW5kSUQsIGVycm9yOiBTdHJpbmcocHJvbWlzZUVycm9yKX0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3BvbmRXaXRoUmVzdWx0KGV2YWxSZXN1bHQpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogZXJyb3IubWVzc2FnZSwgZXJyb3JTdGFjazogZXJyb3Iuc3RhY2t9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElELCBlcnJvcjogU3RyaW5nKGVycm9yKX0pXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyYXNlcyBhbiBhcmd1bWVudCBmb3Igc2VuZGluZyB0byB0aGUgc2VydmVyXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplIGZvciB0cmFuc3BvcnRcbiAgICogQHJldHVybnMge2FueX0gU2VyaWFsaXplZCBhcmd1bWVudCBwYXlsb2FkXG4gICAqL1xuICBwYXJzZUFyZyhhcmcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYXJnSW5BcnJheSkgPT4gdGhpcy5wYXJzZUFyZyhhcmdJbkFycmF5KSlcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3QgZnVuY3Rpb25JZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcblxuICAgICAgdGhpcy5vYmplY3RzW2Z1bmN0aW9uSWRdID0gYXJnXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9fc2NvdW5kcmVsX2Z1bmN0aW9uX2lkOiBmdW5jdGlvbklkLFxuICAgICAgICBfX3Njb3VuZHJlbF9pbnN0YW5jZV9pZDogdGhpcy5pbnN0YW5jZUlkLFxuICAgICAgICBfX3Njb3VuZHJlbF90eXBlOiBcImZ1bmN0aW9uXCJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIFJlZmVyZW5jZSkge1xuICAgICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgICAgY29uc3QgcmVmZXJlbmNlUGF5bG9hZCA9IHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBhcmcuaWQsXG4gICAgICAgIF9fc2NvdW5kcmVsX3R5cGU6IFwicmVmZXJlbmNlXCJcbiAgICAgIH1cblxuICAgICAgaWYgKGFyZy5pbnN0YW5jZUlkKSB7XG4gICAgICAgIHJlZmVyZW5jZVBheWxvYWQuX19zY291bmRyZWxfaW5zdGFuY2VfaWQgPSBhcmcuaW5zdGFuY2VJZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVmZXJlbmNlUGF5bG9hZFxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGFyZykpIHtcbiAgICAgIC8qKiBAdHlwZSB7UmVjb3JkPGFueSwgYW55Pn0gKi9cbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IHt9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGFyZykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ1trZXldXG5cbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSB0aGlzLnBhcnNlQXJnKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3T2JqZWN0XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZ1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBhcmd1bWVudCBwYXlsb2FkIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgKiBAcGFyYW0ge2FueX0gYXJnIEFyZ3VtZW50IHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7e2FsbG93UmVtb3RlUmVmZXJlbmNlcz86IGJvb2xlYW59fSBbb3B0aW9uc10gUGFyc2luZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHthbnl9IFBhcnNlZCBhcmd1bWVudFxuICAgKi9cbiAgcGFyc2VJbmNvbWluZ0FyZyhhcmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiBhcmcubWFwKChhcmdJbkFycmF5KSA9PiB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnSW5BcnJheSwgb3B0aW9ucykpXG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoYXJnKSkge1xuICAgICAgaWYgKGFyZy5fX3Njb3VuZHJlbF90eXBlID09PSBcInJlZmVyZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSBhcmcuX19zY291bmRyZWxfaW5zdGFuY2VfaWRcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBhcmcuX19zY291bmRyZWxfb2JqZWN0X2lkXG5cbiAgICAgICAgaWYgKGluc3RhbmNlSWQgPT09IHVuZGVmaW5lZCB8fCBpbnN0YW5jZUlkID09PSB0aGlzLmluc3RhbmNlSWQpIHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMub2JqZWN0cywgcmVmZXJlbmNlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vYmplY3RzW3JlZmVyZW5jZUlkXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhcmdcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmFsbG93UmVtb3RlUmVmZXJlbmNlcykge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNwYXduUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBpbnN0YW5jZUlkKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyZ1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJnLl9fc2NvdW5kcmVsX3R5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gYXJnLl9fc2NvdW5kcmVsX2Z1bmN0aW9uX2lkXG4gICAgICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59ICovXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uV3JhcHBlciA9ICguLi5hcmdzKSA9PiB0aGlzLmNhbGxGdW5jdGlvbk9uUmVmZXJlbmNlKGZ1bmN0aW9uSWQsIC4uLmFyZ3MpXG5cbiAgICAgICAgdGhpcy50cmFja0Z1bmN0aW9uV3JhcHBlcihmdW5jdGlvbldyYXBwZXIsIGZ1bmN0aW9uSWQpXG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uV3JhcHBlclxuICAgICAgfVxuXG4gICAgICAvKiogQHR5cGUge1JlY29yZDxhbnksIGFueT59ICovXG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhcmcpIHtcbiAgICAgICAgbmV3T2JqZWN0W2tleV0gPSB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnW2tleV0sIG9wdGlvbnMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXdPYmplY3RcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGFyZ3VtZW50cyBhcnJheSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBcmd1bWVudHMgdG8gcGFyc2VcbiAgICogQHBhcmFtIHt7YWxsb3dSZW1vdGVSZWZlcmVuY2VzPzogYm9vbGVhbn19IFtvcHRpb25zXSBQYXJzaW5nIG9wdGlvbnNcbiAgICogQHJldHVybnMge2FueVtdfSBQYXJzZWQgYXJndW1lbnRzXG4gICAqL1xuICBwYXJzZUluY29taW5nQXJncyhhcmdzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MpKSByZXR1cm4gW11cblxuICAgIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB0aGlzLnBhcnNlSW5jb21pbmdBcmcoYXJnLCBvcHRpb25zKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFyZ3VtZW50cyBmb3IgYSBmdW5jdGlvbiBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFyZ3VtZW50cyB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMge2FueVtdfSBTZXJpYWxpemVkIGFyZ3VtZW50c1xuICAgKi9cbiAgcGFyc2VGdW5jdGlvbkFyZ3MoYXJncykge1xuICAgIHJldHVybiBhcmdzLm1hcCgoYXJnKSA9PiB0aGlzLnBhcnNlRnVuY3Rpb25BcmcoYXJnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGFuIGFyZ3VtZW50IGZvciBhIGZ1bmN0aW9uIGNhbGxiYWNrXG4gICAqIEBwYXJhbSB7YW55fSBhcmcgQXJndW1lbnQgdG8gc2VyaWFsaXplXG4gICAqIEByZXR1cm5zIHthbnl9IFNlcmlhbGl6ZWQgYXJndW1lbnQgcGF5bG9hZFxuICAgKi9cbiAgcGFyc2VGdW5jdGlvbkFyZyhhcmcpIHtcbiAgICBpZiAoYXJnID09PSBudWxsIHx8IGFyZyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYXJnXG5cbiAgICBpZiAoYXJnIGluc3RhbmNlb2YgUmVmZXJlbmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUFyZyhhcmcpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhcmcgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGFyZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvYmplY3RJZCA9ICsrdGhpcy5vYmplY3RzQ291bnRcbiAgICAgIHRoaXMub2JqZWN0c1tvYmplY3RJZF0gPSBhcmdcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX19zY291bmRyZWxfb2JqZWN0X2lkOiBvYmplY3RJZCxcbiAgICAgICAgX19zY291bmRyZWxfaW5zdGFuY2VfaWQ6IHRoaXMuaW5zdGFuY2VJZCxcbiAgICAgICAgX19zY291bmRyZWxfdHlwZTogXCJyZWZlcmVuY2VcIlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhcmdcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgYSBuZXcgcmVmZXJlbmNlXG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2U+fSBSZWZlcmVuY2UgdG8gdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEBwYXJhbSB7UmV0dXJuUmVmZXJlbmNlT3B0aW9uc30gb3B0aW9uc09yQXJnIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5Pn0gUmVmZXJlbmNlIG9yIHByb3h5IHRvIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICovXG4gIC8qKlxuICAgKiBSZWFkcyBhbiBhdHRyaWJ1dGUgb24gYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zT3JBcmcgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcGFyYW0ge1JldHVybk9wdGlvbnN9IFtvcHRpb25zT3JBcmddIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gUmVmZXJlbmNlLCBwcm94eSwgb3IgcmVzdWx0XG4gICAqL1xuICBhc3luYyByZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lLCBvcHRpb25zT3JBcmcpIHtcbiAgICBjb25zdCBhbGxvd2VkT3B0aW9ucyA9IG5ldyBTZXQoW1wicmVmZXJlbmNlXCIsIFwicmVzdWx0XCIsIFwicHJveHlcIl0pXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqL1xuICAgIGxldCBvcHRpb25zXG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnNPckFyZyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgb3B0aW9ucyA9IHtyZWZlcmVuY2U6IHRydWV9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUGxhaW5PYmplY3Qob3B0aW9uc09yQXJnKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnNPckFyZylcbiAgICAgIGNvbnN0IGhhc09wdGlvbktleSA9IG9wdGlvbktleXMuc29tZSgoa2V5KSA9PiBhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcblxuICAgICAgaWYgKGhhc09wdGlvbktleSkge1xuICAgICAgICBjb25zdCB1bmtub3duT3B0aW9ucyA9IG9wdGlvbktleXMuZmlsdGVyKChrZXkpID0+ICFhbGxvd2VkT3B0aW9ucy5oYXMoa2V5KSlcbiAgICAgICAgaWYgKHVua25vd25PcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UmV0dXJuID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnNPckFyZywgXCJyZWZlcmVuY2VcIilcbiAgICAgICAgICAgIHx8IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zT3JBcmcsIFwicmVzdWx0XCIpXG4gICAgICAgICAgICB8fCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9uc09yQXJnLCBcInByb3h5XCIpXG4gICAgICAgICAgb3B0aW9ucyA9IC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9uc30gKi8gKHtcbiAgICAgICAgICAgIC4uLihoYXNFeHBsaWNpdFJldHVybiA/IHt9IDoge3JlZmVyZW5jZTogdHJ1ZX0pLFxuICAgICAgICAgICAgLi4ub3B0aW9uc09yQXJnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlV2l0aFJlZmVyZW5jZSBvcHRpb25zOiAke3Vua25vd25PcHRpb25zLmpvaW4oXCIsIFwiKX1gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2VXaXRoUmVmZXJlbmNlIGRvZXMgbm90IGFjY2VwdCBwb3NpdGlvbmFsIGFyZ3VtZW50c1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblJlZmVyZW5jZSA9IG9wdGlvbnM/LnJlZmVyZW5jZSA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblJlc3VsdCA9IG9wdGlvbnM/LnJlc3VsdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHJldHVyblByb3h5ID0gb3B0aW9ucz8ucHJveHkgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5GbGFncyA9IFtyZXR1cm5SZWZlcmVuY2UsIHJldHVyblJlc3VsdCwgcmV0dXJuUHJveHldLmZpbHRlcihCb29sZWFuKS5sZW5ndGhcblxuICAgIGlmIChyZXR1cm5GbGFncyA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlYWRBdHRyaWJ1dGVPblJlZmVyZW5jZVdpdGhSZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWFkQXR0cmlidXRlT25SZWZlcmVuY2UocmVmZXJlbmNlSWQsIG9wdGlvbnMsIGF0dHJpYnV0ZU5hbWUpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59IEF0dHJpYnV0ZSB2YWx1ZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyBhIG5ldyByZWZlcmVuY2VcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSByZWZlcmVuY2VJZCBSZWZlcmVuY2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JldHVyblJlZmVyZW5jZU9wdGlvbnN9IG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIHJlYWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGF0dHJpYnV0ZU5hbWUgQXR0cmlidXRlIG5hbWUgdG8gcmVhZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWZlcmVuY2UgfCBQcm94eT59IFJlZmVyZW5jZSBvciBwcm94eSB0byB0aGUgYXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9yIHJlZmVyZW5jZVxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmV0dXJuT3B0aW9uc30gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgcmVhZFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gYXR0cmlidXRlTmFtZSBBdHRyaWJ1dGUgbmFtZSB0byByZWFkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgLyoqXG4gICAqIFJlYWRzIGFuIGF0dHJpYnV0ZSBvbiBhIHJlZmVyZW5jZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGRpcmVjdGx5XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZXR1cm5SZXN1bHRPcHRpb25zfSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSByZWFkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBhdHRyaWJ1dGVOYW1lIEF0dHJpYnV0ZSBuYW1lIHRvIHJlYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gQXR0cmlidXRlIHZhbHVlXG4gICAqL1xuICAvKipcbiAgICogUmVhZHMgYW4gYXR0cmlidXRlIG9uIGEgcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgZGlyZWN0bHlcbiAgICogQHBhcmFtIHtudW1iZXJ9IHJlZmVyZW5jZUlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgUmV0dXJuT3B0aW9uc30gYXR0cmlidXRlTmFtZU9yT3B0aW9ucyBBdHRyaWJ1dGUgbmFtZSBvciBvcHRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBbYXR0cmlidXRlTmFtZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlZmVyZW5jZSB8IFByb3h5IHwgYW55Pn0gQXR0cmlidXRlIHZhbHVlIG9yIHJlZmVyZW5jZVxuICAgKi9cbiAgYXN5bmMgcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlKHJlZmVyZW5jZUlkLCBhdHRyaWJ1dGVOYW1lT3JPcHRpb25zLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYWxsb3dlZE9wdGlvbnMgPSBuZXcgU2V0KFtcInJlZmVyZW5jZVwiLCBcInJlc3VsdFwiLCBcInByb3h5XCJdKVxuICAgIC8qKiBAdHlwZSB7UmV0dXJuT3B0aW9ucyB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgb3B0aW9uc1xuICAgIC8qKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCB0YXJnZXRBdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZVxuXG4gICAgaWYgKHRoaXMuaXNQbGFpbk9iamVjdChhdHRyaWJ1dGVOYW1lT3JPcHRpb25zKSkge1xuICAgICAgY29uc3Qgb3B0aW9uS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICBjb25zdCBoYXNPcHRpb25LZXkgPSBvcHRpb25LZXlzLnNvbWUoKGtleSkgPT4gYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG5cbiAgICAgIGlmIChoYXNPcHRpb25LZXkpIHtcbiAgICAgICAgY29uc3QgdW5rbm93bk9wdGlvbnMgPSBvcHRpb25LZXlzLmZpbHRlcigoa2V5KSA9PiAhYWxsb3dlZE9wdGlvbnMuaGFzKGtleSkpXG4gICAgICAgIGlmICh1bmtub3duT3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHtSZXR1cm5PcHRpb25zfSAqLyAoYXR0cmlidXRlTmFtZU9yT3B0aW9ucylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVhZEF0dHJpYnV0ZU9uUmVmZXJlbmNlIG9wdGlvbnM6ICR7dW5rbm93bk9wdGlvbnMuam9pbihcIiwgXCIpfWApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldEF0dHJpYnV0ZU5hbWUgPSAvKiogQHR5cGUge3N0cmluZyB8IG51bWJlcn0gKi8gKGF0dHJpYnV0ZU5hbWVPck9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXRBdHRyaWJ1dGVOYW1lID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2UgcmVxdWlyZXMgYW4gYXR0cmlidXRlIG5hbWVcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5SZWZlcmVuY2UgPSBvcHRpb25zPy5yZWZlcmVuY2UgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5SZXN1bHQgPSBvcHRpb25zPy5yZXN1bHQgPT09IHRydWVcbiAgICBjb25zdCByZXR1cm5Qcm94eSA9IG9wdGlvbnM/LnByb3h5ID09PSB0cnVlXG4gICAgY29uc3QgcmV0dXJuRmxhZ3MgPSBbcmV0dXJuUmVmZXJlbmNlLCByZXR1cm5SZXN1bHQsIHJldHVyblByb3h5XS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoXG5cbiAgICBpZiAocmV0dXJuRmxhZ3MgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWFkQXR0cmlidXRlT25SZWZlcmVuY2Ugb3B0aW9ucyByZWZlcmVuY2UsIHJlc3VsdCwgYW5kIHByb3h5IGFyZSBtdXR1YWxseSBleGNsdXNpdmVcIilcbiAgICB9XG5cbiAgICBjb25zdCB3aXRoUmVmZXJlbmNlID0gcmV0dXJuUmVmZXJlbmNlIHx8IHJldHVyblByb3h5XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChcInJlYWRfYXR0cmlidXRlXCIsIHtcbiAgICAgIGF0dHJpYnV0ZV9uYW1lOiB0YXJnZXRBdHRyaWJ1dGVOYW1lLFxuICAgICAgcmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZCxcbiAgICAgIHdpdGg6IHdpdGhSZWZlcmVuY2UgPyBcInJlZmVyZW5jZVwiIDogXCJyZXN1bHRcIlxuICAgIH0pXG5cbiAgICBpZiAoIXdpdGhSZWZlcmVuY2UpIHJldHVybiByZXN1bHQucmVzcG9uc2VcblxuICAgIGNvbnN0IGlkID0gcmVzdWx0LnJlc3BvbnNlXG4gICAgY29uc3Qgc3Bhd25lZFJlZmVyZW5jZSA9IHRoaXMuc3Bhd25SZWZlcmVuY2UoaWQsIHJlc3VsdC5pbnN0YW5jZV9pZClcblxuICAgIHJldHVybiByZXR1cm5Qcm94eSA/IHJlZmVyZW5jZVByb3h5KHNwYXduZWRSZWZlcmVuY2UpIDogc3Bhd25lZFJlZmVyZW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBjbGFzc0luc3RhbmNlIENsYXNzIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlXG4gICAqL1xuICByZWdpc3RlckNsYXNzKGNsYXNzTmFtZSwgY2xhc3NJbnN0YW5jZSkge1xuICAgIGlmIChjbGFzc05hbWUgaW4gdGhpcy5fY2xhc3NlcykgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBhbHJlYWR5IGV4aXN0czogJHtjbGFzc05hbWV9YClcblxuICAgIHRoaXMuX2NsYXNzZXNbY2xhc3NOYW1lXSA9IGNsYXNzSW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGNsYXNzIGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBDbGFzcyBuYW1lIHRvIHJlbW92ZVxuICAgKi9cbiAgdW5yZWdpc3RlckNsYXNzKGNsYXNzTmFtZSkge1xuICAgIGlmICghKGNsYXNzTmFtZSBpbiB0aGlzLl9jbGFzc2VzKSkgdGhyb3cgbmV3IEVycm9yKGBDbGFzcyBkb2VzIG5vdCBleGlzdDogJHtjbGFzc05hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBfZ2V0UmVnaXN0ZXJlZENsYXNzKGNsYXNzTmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9jbGFzc2VzW2NsYXNzTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgcmVnaXN0ZXJlZCBjbGFzcyBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBsb29rIHVwXG4gICAqIEByZXR1cm5zIHthbnl9IFJlZ2lzdGVyZWQgY2xhc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRDbGFzcyhjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3Nlc1tjbGFzc05hbWVdXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBieSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIE9iamVjdCBuYW1lIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlZ2lzdGVyT2JqZWN0KG9iamVjdE5hbWUsIG9iamVjdEluc3RhbmNlKSB7XG4gICAgaWYgKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykgdGhyb3cgbmV3IEVycm9yKGBPYmplY3QgYWxyZWFkeSBleGlzdHM6ICR7b2JqZWN0TmFtZX1gKVxuXG4gICAgdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXSA9IG9iamVjdEluc3RhbmNlXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYSByZWdpc3RlcmVkIG9iamVjdCBieSBuYW1lLCBvciByZWdpc3RlcnMgaXQgd2hlbiBpdCBkb2VzIG5vdCBleGlzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byByZXBsYWNlXG4gICAqIEBwYXJhbSB7YW55fSBvYmplY3RJbnN0YW5jZSBPYmplY3QgaW5zdGFuY2VcbiAgICovXG4gIHJlcGxhY2VPYmplY3Qob2JqZWN0TmFtZSwgb2JqZWN0SW5zdGFuY2UpIHtcbiAgICB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdID0gb2JqZWN0SW5zdGFuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhbiBvYmplY3QgYnkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSBPYmplY3QgbmFtZSB0byByZW1vdmVcbiAgICovXG4gIHVucmVnaXN0ZXJPYmplY3Qob2JqZWN0TmFtZSkge1xuICAgIGlmICghKG9iamVjdE5hbWUgaW4gdGhpcy5fb2JqZWN0cykpIHRocm93IG5ldyBFcnJvcihgT2JqZWN0IGRvZXMgbm90IGV4aXN0OiAke29iamVjdE5hbWV9YClcblxuICAgIGRlbGV0ZSB0aGlzLl9vYmplY3RzW29iamVjdE5hbWVdXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHJlZ2lzdGVyZWQgb2JqZWN0IGJ5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgT2JqZWN0IG5hbWUgdG8gbG9vayB1cFxuICAgKiBAcmV0dXJucyB7YW55fSBSZWdpc3RlcmVkIG9iamVjdCBvciB1bmRlZmluZWRcbiAgICovXG4gIF9nZXRSZWdpc3RlcmVkT2JqZWN0KG9iamVjdE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0c1tvYmplY3ROYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc3BvbmRzIHRvIGEgY29tbWFuZCBmcm9tIHRoZSBiYWNrZW5kXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tYW5kSWQgQ29tbWFuZCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7YW55fSBkYXRhIFJlc3BvbnNlIHBheWxvYWRcbiAgICovXG4gIHJlc3BvbmRUb0NvbW1hbmQoY29tbWFuZElkLCBkYXRhKSB7XG4gICAgdGhpcy5zZW5kKHtjb21tYW5kOiBcImNvbW1hbmRfcmVzcG9uc2VcIiwgY29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhOiB7Y29tbWFuZF9pZDogY29tbWFuZElkLCBkYXRhfX0pXG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBjb21tYW5kIHRvIHRoZSBiYWNrZW5kIGFuZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIENvbW1hbmQgbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSBDb21tYW5kIHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUmVzcG9uc2UgZnJvbSB0aGUgYmFja2VuZFxuICAgKi9cbiAgc2VuZENvbW1hbmQoY29tbWFuZCwgZGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvdXRnb2luZ0NvbW1hbmRDb3VudCA9ICsrdGhpcy5vdXRnb2luZ0NvbW1hbmRzQ291bnRcbiAgICAgIGNvbnN0IG9yaWdpbkVycm9yID0gbmV3IEVycm9yKGBDb21tYW5kICcke2NvbW1hbmR9JyBkaXNwYXRjaGVkYClcbiAgICAgIC8vIFN0cmlwIHRoZSBzZW5kQ29tbWFuZCBmcmFtZSB0byBoaWdobGlnaHQgdGhlIGNhbGxlciBzaXRlLlxuICAgICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShvcmlnaW5FcnJvciwgdGhpcy5zZW5kQ29tbWFuZClcbiAgICAgIGNvbnN0IGNvbW1hbmREYXRhID0ge1xuICAgICAgICBjb21tYW5kLFxuICAgICAgICBjb21tYW5kX2lkOiBvdXRnb2luZ0NvbW1hbmRDb3VudCxcbiAgICAgICAgZGF0YVxuICAgICAgfVxuXG4gICAgICB0aGlzLm91dGdvaW5nQ29tbWFuZHNbb3V0Z29pbmdDb21tYW5kQ291bnRdID0ge3Jlc29sdmUsIHJlamVjdCwgb3JpZ2luU3RhY2s6IG9yaWdpbkVycm9yLnN0YWNrfVxuICAgICAgbG9nZ2VyLmxvZygoKSA9PiBbXCJTZW5kaW5nXCIsIGNvbW1hbmREYXRhXSlcbiAgICAgIHRoaXMuc2VuZChjb21tYW5kRGF0YSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGRhdGEgdG8gdGhlIGJhY2tlbmRcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgUGF5bG9hZCB0byBzZW5kXG4gICAqL1xuICBzZW5kKGRhdGEpIHtcbiAgICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcmVsZWFzZWRJZHMgPSB0aGlzLnRha2VSZWxlYXNlZFJlZmVyZW5jZUlkcygpXG4gICAgICBpZiAocmVsZWFzZWRJZHMubGVuZ3RoID4gMCkgZGF0YS5yZWxlYXNlZF9yZWZlcmVuY2VfaWRzID0gcmVsZWFzZWRJZHNcbiAgICB9XG5cbiAgICB0aGlzLmJhY2tlbmQuc2VuZChkYXRhKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWZlcmVuY2UgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseVxuICAgKiBAcGFyYW0ge251bWJlcn0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gUGFyc2VkIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICovXG4gIGFzeW5jIHNlcmlhbGl6ZVJlZmVyZW5jZShyZWZlcmVuY2VJZCkge1xuICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKFwic2VyaWFsaXplX3JlZmVyZW5jZVwiLCB7cmVmZXJlbmNlX2lkOiByZWZlcmVuY2VJZH0pXG5cbiAgICByZXR1cm4gcGFyc2VTY291bmRyZWxKU09OKGpzb24pXG4gIH1cblxuICAvKipcbiAgICogU3Bhd25zIGEgbmV3IHJlZmVyZW5jZSB0byBhbiBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbaW5zdGFuY2VJZF0gT3duaW5nIGluc3RhbmNlIGlkZW50aWZpZXJcbiAgICogQHJldHVybnMge1JlZmVyZW5jZX0gUmVmZXJlbmNlIGluc3RhbmNlXG4gICAqL1xuICBzcGF3blJlZmVyZW5jZShpZCwgaW5zdGFuY2VJZCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2UodGhpcywgaWQsIGluc3RhbmNlSWQpXG5cbiAgICB0aGlzLnRyYWNrUmVmZXJlbmNlKHJlZmVyZW5jZSlcblxuICAgIHJldHVybiByZWZlcmVuY2VcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja3MgYSBzcGF3bmVkIHJlZmVyZW5jZSBzbyB3ZWFrLXJlZmVyZW5jZSBjbGVhbnVwIGNhbiByZWxlYXNlIGl0IGxhdGVyLlxuICAgKiBAcGFyYW0ge1JlZmVyZW5jZX0gcmVmZXJlbmNlIFJlZmVyZW5jZSB0byB0cmFja1xuICAgKi9cbiAgdHJhY2tSZWZlcmVuY2UocmVmZXJlbmNlKSB7XG4gICAgaWYgKHRoaXMuc3VwcG9ydHNXZWFrUmVmZXJlbmNlcykge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzW3JlZmVyZW5jZS5pZF0gPSBuZXcgV2Vha1JlZihyZWZlcmVuY2UpXG4gICAgICB0aGlzLnJlZmVyZW5jZVJlbGVhc2VSZWdpc3RyeT8ucmVnaXN0ZXIocmVmZXJlbmNlLCByZWZlcmVuY2UuaWQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVmZXJlbmNlc1tyZWZlcmVuY2UuaWRdID0gcmVmZXJlbmNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIGZ1bmN0aW9uIHdyYXBwZXIgZm9yIGZpbmFsaXphdGlvbi1iYXNlZCByZWxlYXNlLlxuICAgKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+fSBmdW5jdGlvbldyYXBwZXIgV3JhcHBlciBmdW5jdGlvbiBleHBvc2VkIHRvIGNhbGxlcnNcbiAgICogQHBhcmFtIHtudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBmdW5jdGlvbklkIEZ1bmN0aW9uIHJlZmVyZW5jZSBpZGVudGlmaWVyXG4gICAqL1xuICB0cmFja0Z1bmN0aW9uV3JhcHBlcihmdW5jdGlvbldyYXBwZXIsIGZ1bmN0aW9uSWQpIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNXZWFrUmVmZXJlbmNlcykgcmV0dXJuXG4gICAgaWYgKGZ1bmN0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBmdW5jdGlvbklkID09PSBudWxsKSByZXR1cm5cblxuICAgIHRoaXMucmVmZXJlbmNlUmVsZWFzZVJlZ2lzdHJ5Py5yZWdpc3RlcihmdW5jdGlvbldyYXBwZXIsIGZ1bmN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgcmVmZXJlbmNlIGlkIGZvciByZWxlYXNlIG9uIHRoZSBuZXh0IG91dGJvdW5kIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gcmVmZXJlbmNlSWQgUmVmZXJlbmNlIGlkZW50aWZpZXIgdG8gcmVsZWFzZVxuICAgKi9cbiAgcXVldWVSZWxlYXNlZFJlZmVyZW5jZShyZWZlcmVuY2VJZCkge1xuICAgIGlmICghdGhpcy5zdXBwb3J0c1dlYWtSZWZlcmVuY2VzKSByZXR1cm5cbiAgICBpZiAocmVmZXJlbmNlSWQgPT09IHVuZGVmaW5lZCB8fCByZWZlcmVuY2VJZCA9PT0gbnVsbCkgcmV0dXJuXG4gICAgdGhpcy5wZW5kaW5nUmVmZXJlbmNlUmVsZWFzZXMuYWRkKHJlZmVyZW5jZUlkKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtudW1iZXJbXX0gUmVmZXJlbmNlIGlkcyBxdWV1ZWQgZm9yIHJlbGVhc2UuICovXG4gIHRha2VSZWxlYXNlZFJlZmVyZW5jZUlkcygpIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydHNXZWFrUmVmZXJlbmNlcykgcmV0dXJuIFtdXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlZmVyZW5jZVJlbGVhc2VzLnNpemUgPT09IDApIHJldHVybiBbXVxuXG4gICAgY29uc3QgaWRzID0gQXJyYXkuZnJvbSh0aGlzLnBlbmRpbmdSZWZlcmVuY2VSZWxlYXNlcylcbiAgICB0aGlzLnBlbmRpbmdSZWZlcmVuY2VSZWxlYXNlcy5jbGVhcigpXG4gICAgcmV0dXJuIGlkc1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIHJlbGVhc2VkIGxvY2FsIG9iamVjdCByZWZlcmVuY2VzIGFubm91bmNlZCBieSB0aGUgcGVlci5cbiAgICogQHBhcmFtIHtudW1iZXJbXSB8IHVuZGVmaW5lZH0gcmVmZXJlbmNlSWRzIFJlZmVyZW5jZSBpZHMgdG8gcmVsZWFzZVxuICAgKi9cbiAgcmVsZWFzZVJlZmVyZW5jZXMocmVmZXJlbmNlSWRzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlZmVyZW5jZUlkcykgfHwgcmVmZXJlbmNlSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZUlkIG9mIHJlZmVyZW5jZUlkcykge1xuICAgICAgZGVsZXRlIHRoaXMub2JqZWN0c1tyZWZlcmVuY2VJZF1cbiAgICB9XG4gIH1cblxuICBlbmFibGVTZXJ2ZXJDb250cm9sKCkge1xuICAgIHRoaXMuc2VydmVyQ29udHJvbEVuYWJsZWQgPSB0cnVlXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scoundrel-remote-eval",
3
3
  "type": "module",
4
- "version": "1.0.33",
4
+ "version": "1.0.34",
5
5
  "description": "",
6
6
  "main": "build/index.js",
7
7
  "types": "build/index.d.ts",