system-testing 1.0.119 → 1.0.120
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/system-test.js +8 -2
- package/package.json +2 -2
package/build/system-test.js
CHANGED
|
@@ -287,7 +287,7 @@ class SystemTest extends Browser {
|
|
|
287
287
|
}
|
|
288
288
|
}
|
|
289
289
|
/**
|
|
290
|
-
* Visits a path.
|
|
290
|
+
* Visits a path. Connected browser contexts navigate in-app to preserve local state; unavailable web bridges reload through the driver.
|
|
291
291
|
* @param {string} path
|
|
292
292
|
* @param {import("./browser.js").BrowserNavigationArgs} [args]
|
|
293
293
|
* @returns {Promise<void>}
|
|
@@ -297,6 +297,12 @@ class SystemTest extends Browser {
|
|
|
297
297
|
await super.visit(path, args);
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
|
+
const commandWebSocket = this.communicator?.ws;
|
|
301
|
+
const canUseInAppNavigation = this.communicatorExists() && commandWebSocket?.readyState === 1;
|
|
302
|
+
if (canUseInAppNavigation) {
|
|
303
|
+
await super.visit(this.buildSystemTestPath(path), args);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
300
306
|
await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while visiting path: ${path}` }, async () => {
|
|
301
307
|
await this.visitPathWithDriverAndReconnect(path);
|
|
302
308
|
await this.initializeBrowserContext();
|
|
@@ -1086,4 +1092,4 @@ class SystemTest extends Browser {
|
|
|
1086
1092
|
}
|
|
1087
1093
|
SystemTest.rootPath = "/blank?systemTest=true";
|
|
1088
1094
|
export default SystemTest;
|
|
1089
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFFeEUsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUE7QUFDN0MsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTTtJQUN2QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFO0lBQ2hFLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFD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bUMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3RGLElBQUksT0FBTztvQkFBRSxPQUFNO2dCQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQTtZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ25ELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O29CQUMzQixNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7O0FBdmxDTSxtQkFBUSxHQUFHLHdCQUF3QixBQUEzQixDQUEyQjtlQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgU2VydmVyIGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvc2VydmVyL2luZGV4LmpzXCJcbmltcG9ydCBTZXJ2ZXJXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuaW1wb3J0IFN5c3RlbVRlc3RIdHRwU2VydmVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWh0dHAtc2VydmVyLmpzXCJcbmltcG9ydCB7d2FpdCwgd2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIlxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiXG5pbXBvcnQge2lzQXBwaXVtTmF0aXZlQXBwRHJpdmVyQ29uZmlnfSBmcm9tIFwiLi9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanNcIlxuXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDMwMDAwXG5jb25zdCBJTklUSUFMX1JPT1RfVklTSVRfUkVUUllfREVMQVlfTVMgPSAxMDBcbmNvbnN0IE5BVElWRV9DTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDEyMDAwMFxuXG4vKipcbiAqIFdoZXRoZXIgYSBzeXN0ZW0gdGVzdCBydW5zIGFnYWluc3QgYSBuYXRpdmUgYXBwIHJhdGhlciB0aGFuIGEgd2ViL2Rpc3QgYnJvd3Nlci5cbiAqIFRydWUgZm9yIGBTWVNURU1fVEVTVF9IT1NUPW5hdGl2ZWAgYW5kIGZvciBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9ucyByZWdhcmRsZXNzIG9mIGhvc3QuXG4gKiBAcGFyYW0ge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlQXBwU2Vzc2lvbihkcml2ZXIpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCIgfHwgaXNBcHBpdW1OYXRpdmVBcHBEcml2ZXJDb25maWcoZHJpdmVyKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7e2RyaXZlcj86IFN5c3RlbVRlc3REcml2ZXJDb25maWd9fSBbYXJnc11cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2xpZW50V2ViU29ja2V0Q29ubmVjdFRpbWVvdXQoe2RyaXZlcn0gPSB7fSkge1xuICByZXR1cm4gaXNOYXRpdmVBcHBTZXNzaW9uKGRyaXZlcikgPyBOQVRJVkVfQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVMgOiBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NU1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3RBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIEhvc3RuYW1lIGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gUG9ydCBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBIb3N0XSBIb3N0bmFtZSBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHR0cFBvcnRdIFBvcnQgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBDb25uZWN0SG9zdF0gSG9zdG5hbWUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIHJlYWNoIHRoZSBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBhbnkpID0+IGJvb2xlYW59IFtlcnJvckZpbHRlcl0gRmlsdGVyIGZvciBicm93c2VyIGVycm9ycyAocmV0dXJuIGZhbHNlIHRvIGlnbm9yZSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsT25Ccm93c2VyRXJyb3JdIFRocm93IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMgZnJvbSBmaW5kZXIvaW50ZXJhY3QgaGVscGVycy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxPbkNvbnNvbGVFcnJvcl0gVHJlYXQgYnJvd3NlciBjb25zb2xlLmVycm9yIGNhbGxzIGFzIHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWVudFdzUG9ydF0gUG9ydCBmb3IgdGhlIGJyb3dzZXItY29tbWFuZCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGllbnRXc0Nvbm5lY3RUaW1lb3V0XSBUaW1lb3V0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBjbGllbnQgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2NvdW5kcmVsUG9ydF0gUG9ydCBmb3IgdGhlIFNjb3VuZHJlbCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbdXJsQXJnc10gUXVlcnkgcGFyYW1zIGFwcGVuZGVkIHRvIHRoZSByb290IHBhdGguXG4gKiBAcHJvcGVydHkge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtTeXN0ZW1UZXN0QXJncyAmIHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmU/OiBib29sZWFufX0gU3lzdGVtVGVzdFJ1bkFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge1wiYWN0aW9uc1wiIHwgXCJodW1hblwiIHwgXCJqc1wifSBbbWV0aG9kXSBPdmVycmlkZSB0aGUgY2xpY2sgcGF0aC4gYFwiYWN0aW9uc1wiYCB1c2VzIHRoZSBTZWxlbml1bSBBY3Rpb25zIEFQSSAocmVhbCBwb2ludGVyIG1vdmUgKyBjbGljayk7IGBcImh1bWFuXCJgIHVzZXMgbXVsdGlwbGUgcG9pbnRlciBtb3ZlcyBhbmQgcGF1c2VzIGJlZm9yZSBjbGlja2luZzsgYFwianNcImAgZGlzcGF0Y2hlcyBgZWxlbWVudC5jbGljaygpYCB2aWEgYGV4ZWN1dGVTY3JpcHRgIGluc2lkZSB0aGUgcGFnZSdzIEpTIGNvbnRleHQgYW5kIGlzIGZvciBkaWFnbm9zdGljcyBvbmx5LCBub3QgY29tbWl0dGVkIHN0YWJpbGl6YXRpb24gZml4ZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWNrT2Zmc2V0WF0gWCBvZmZzZXQgZm9yIGBhY3Rpb25zYC9gaHVtYW5gIHBvaW50ZXIgY2xpY2tzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRZXSBZIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBEZWxheV0gUGF1c2UgZHVyYXRpb24gaW4gbXMgYmV0d2VlbiBodW1hbiBwb2ludGVyIG1vdmVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBzXSBOdW1iZXIgb2YgaW50ZXJtZWRpYXRlIHBvaW50ZXIgbW92ZXMgYmVmb3JlIHRoZSBmaW5hbCBjbGljayB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzY3JvbGxDb250YWluZXJUZXN0SURzXSBOYXRpdmUgdGVzdCBJRHMgdGhhdCBzaG91bGQgYmUgdHJpZWQgYXMgc2Nyb2xsIGNvbnRhaW5lcnMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB2aWV3cG9ydCBnZXN0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7RmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn19IEludGVyYWN0QXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXRGb3JOb1NlbGVjdG9yQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWNhdGlvbk1lc3NhZ2VBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzXSBXaGV0aGVyIHRvIGRpc21pc3MgdGhlIG5vdGlmaWNhdGlvbiBhZnRlciBpdCBhcHBlYXJzLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSB7XG4gIHJldHVybiAvKD86XnxcXHMtXFxzKVxcW0RPTVxcXSBQYXNzd29yZCBmaWVsZCBpcyBub3QgY29udGFpbmVkIGluIGEgZm9ybTovaS50ZXN0KG1lc3NhZ2UpXG59XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbmNvbnN0IGdsb2JhbEFueSA9IGdsb2JhbFRoaXNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdCBleHRlbmRzIEJyb3dzZXIge1xuICBzdGF0aWMgcm9vdFBhdGggPSBcIi9ibGFuaz9zeXN0ZW1UZXN0PXRydWVcIlxuXG4gIC8qKiBAdHlwZSB7U3lzdGVtVGVzdENvbW11bmljYXRvciB8IHVuZGVmaW5lZH0gKi9cbiAgY29tbXVuaWNhdG9yID0gdW5kZWZpbmVkXG5cbiAgX3N0YXJ0ZWQgPSBmYWxzZVxuICBfY2xpZW50V3NQb3J0ID0gMTk4NVxuICBfY2xpZW50V3NDb25uZWN0VGltZW91dCA9IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TXG4gIF9odHRwSG9zdCA9IFwibG9jYWxob3N0XCJcbiAgX2h0dHBQb3J0ID0gMTk4NFxuICBfZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZVxuICBfZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2VcbiAgLyoqIEB0eXBlIHsoKGVycm9yOiBhbnkpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfSAqL1xuICBfZXJyb3JGaWx0ZXIgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvcltdfSAqL1xuICBfYnJvd3NlckVycm9ycyA9IFtdXG4gIF9zY291bmRyZWxQb3J0ID0gODA5MFxuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIHNjb3VuZHJlbFdzcyA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgY2xpZW50V3NzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtTeXN0ZW1UZXN0fVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoYXJncyA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxBbnkuc3lzdGVtVGVzdCkge1xuICAgICAgZ2xvYmFsQW55LnN5c3RlbVRlc3QgPSBuZXcgU3lzdGVtVGVzdChhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxBbnkuc3lzdGVtVGVzdC5hcHBseUFyZ3MoYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gZ2xvYmFsQW55LnN5c3RlbVRlc3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG11dGFibGUgb3B0aW9ucyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgc2luZ2xldG9uIFN5c3RlbVRlc3QuXG4gICAqIEBwYXJhbSB7UGFydGlhbDxTeXN0ZW1UZXN0QXJncz59IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUFyZ3MoYXJncyA9IHt9KSB7XG4gICAgaWYgKFwiZGVidWdcIiBpbiBhcmdzKSB0aGlzLl9kZWJ1ZyA9IGFyZ3MuZGVidWcgPz8gZmFsc2VcbiAgICBpZiAoXCJlcnJvckZpbHRlclwiIGluIGFyZ3MpIHRoaXMuX2Vycm9yRmlsdGVyID0gYXJncy5lcnJvckZpbHRlclxuICAgIGlmIChcImZhaWxPbkJyb3dzZXJFcnJvclwiIGluIGFyZ3MpIHRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvciA9IGFyZ3MuZmFpbE9uQnJvd3NlckVycm9yID8/IHRydWVcbiAgICBpZiAoXCJmYWlsT25Db25zb2xlRXJyb3JcIiBpbiBhcmdzKSB0aGlzLl9mYWlsT25Db25zb2xlRXJyb3IgPSBhcmdzLmZhaWxPbkNvbnNvbGVFcnJvciA/PyBmYWxzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yfSAqL1xuICBnZXRDb21tdW5pY2F0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbW11bmljYXRvclxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcG9zc2libGUgZnJvbSB0aGUgcGF5bG9hZCBzZW50IGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119IHwgRXJyb3J9IGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlKSA/IGRhdGEudmFsdWVbMF0gOiB1bmRlZmluZWRcblxuICAgIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGZpcnN0VmFsdWUubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWUubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWVcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYnJvd3NlciBlcnJvciBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBidWlsdC1pbiBydWxlcyBhbmQgYW4gb3B0aW9uYWwgZXJyb3IgZmlsdGVyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfX0gZGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNob3VsZElnbm9yZUVycm9yKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5leHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpXG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOFwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOVwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXJyb3JGaWx0ZXIgJiYgdGhpcy5fZXJyb3JGaWx0ZXIoZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzIHwgZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFthcmdzXVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbY2FsbGJhY2tdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihhcmdzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlc29sdmVkQ2FsbGJhY2sgPSB0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8gYXJncyA6IGNhbGxiYWNrXG4gICAgY29uc3Qge3JlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSA9IHRydWUsIC4uLnN5c3RlbVRlc3RBcmdzfSA9IC8qKiBAdHlwZSB7U3lzdGVtVGVzdFJ1bkFyZ3N9ICovICh0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8ge30gOiBhcmdzIHx8IHt9KVxuICAgIGNvbnN0IHN5c3RlbVRlc3QgPSB0aGlzLmN1cnJlbnQoc3lzdGVtVGVzdEFyZ3MpXG5cbiAgICBpZiAoIXJlc29sdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5c3RlbVRlc3QucnVuIHJlcXVpcmVzIGEgY2FsbGJhY2tcIilcbiAgICB9XG5cbiAgICBzeXN0ZW1UZXN0Ll9icm93c2VyRXJyb3JzID0gW11cbiAgICBzeXN0ZW1UZXN0LmFwcGx5QXJncyh7ZmFpbE9uQnJvd3NlckVycm9yOiB0cnVlLCBmYWlsT25Db25zb2xlRXJyb3I6IGZhbHNlLCAuLi5zeXN0ZW1UZXN0QXJnc30pXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVzZXR0aW5nIGJyb3dzZXIgY29va2llcyBiZWZvcmUgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZGVsZXRlQWxsQ29va2llcygpXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkJyb3dzZXIgY29va2llcyBjbGVhcmVkXCIpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZ2V0Um9vdFBhdGhcIilcbiAgICBjb25zdCByb290UGF0aCA9IHN5c3RlbVRlc3QuZ2V0Um9vdFBhdGgoKVxuXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5yZXNldFRvUm9vdFBhdGhGb3JSdW4ocm9vdFBhdGgpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIHN0YXJ0ZWQgLSBzZW5kIGluaXRpYWxpemVcIilcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG5cbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHJ1bkVycm9yID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCB0ZWFyZG93bkVycm9yID0gdW5kZWZpbmVkXG5cbiAgICB0cnkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcImZpbmRCeVRlc3RJRCBibGFua1RleHRcIilcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZmluZEJ5VGVzdElEKFwiYmxhbmtUZXh0XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJGb3VuZCBibGFua1RleHRcIilcblxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcInJlc29sdmVkQ2FsbGJhY2tcIilcbiAgICAgIGF3YWl0IHJlc29sdmVkQ2FsbGJhY2soc3lzdGVtVGVzdClcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gY2FsbGJhY2sgY29tcGxldGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYFJ1biBlcnJvciBjYXVnaHQsIHRha2luZyBzY3JlZW5zaG90OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YClcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QudGFrZVNjcmVlbnNob3QoKVxuXG4gICAgICBydW5FcnJvciA9IGVycm9yXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmluaXNoZWQgLSBzZW5kIHRlYXJkb3duXCIpXG4gICAgICBjb25zdCB0ZWFyZG93bldzID0gc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS53c1xuICAgICAgLy8gV2ViU29ja2V0LkNMT1NJTkcgKDIpIGFuZCBXZWJTb2NrZXQuQ0xPU0VEICgzKSBjYW5ub3QgcmVjb3Zlciwgc28gc2tpcCB0ZWFyZG93bi5cbiAgICAgIC8vIE9QRU4gKDEpIHNlbmRzIGltbWVkaWF0ZWx5LiBDT05ORUNUSU5HICgwKSBxdWV1ZXMgdGhlIGNvbW1hbmQgYW5kIGZsdXNoZXMgb25cbiAgICAgIC8vIG9uT3BlbiDigJQgdGhlIDEwcyB0aW1lb3V0IGJlbG93IGNvdmVycyB0aGUgd2FpdC5cbiAgICAgIGNvbnN0IHdzQ2xvc2VkID0gIXRlYXJkb3duV3MgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAyIHx8IHRlYXJkb3duV3MucmVhZHlTdGF0ZSA9PT0gM1xuXG4gICAgICBpZiAod3NDbG9zZWQpIHtcbiAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlNraXBwaW5nIHRlYXJkb3duIOKAlCBicm93c2VyIHdlYnNvY2tldCBpcyBjbG9zZWQgKGxpa2VseSBieSBuYXZpZ2F0aW9uL3NpZ24tb3V0IGR1cmluZyB0aGUgdGVzdClcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyB0ZWFyZG93biB0byB1c2VTeXN0ZW1UZXN0KCkgdGltZWQgb3V0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcInRlYXJkb3duXCJ9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGVhcmRvd25FcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3lzdGVtVGVzdC5fYnJvd3NlckVycm9ycyA9IFtdXG4gICAgICBzeXN0ZW1UZXN0LmFwcGx5QXJncyh7ZXJyb3JGaWx0ZXI6IHVuZGVmaW5lZCwgZmFpbE9uQnJvd3NlckVycm9yOiB0cnVlLCBmYWlsT25Db25zb2xlRXJyb3I6IGZhbHNlfSlcbiAgICB9XG5cbiAgICBpZiAocnVuRXJyb3IpIHtcbiAgICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCB0ZWFyZG93biBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIHRlYXJkb3duRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHJ1blwiKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCByZWluaXRpYWxpemUgZmFpbGVkIGFmdGVyIHRlc3QgZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBydW5FcnJvclxuICAgIH1cblxuICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICBpZiAocmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlRlYXJkb3duIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHRlYXJkb3duXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVhcmRvd24gZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyB0ZWFyZG93bkVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYXBwIHRvIHRoZSByb290IHRlc3Qgcm91dGUgYmVmb3JlIGVhY2ggcnVuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXNldFRvUm9vdFBhdGhGb3JSdW4ocm9vdFBhdGgpIHtcbiAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdCByb290UGF0aCB3aXRoIGRpc21pc3NUbzogJHtyb290UGF0aH1gKVxuICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RvKHJvb3RQYXRoKVxuICAgIHRoaXMuZGVidWdMb2coYERpc21pc3NlZCB0byByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgaWYgKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gMSkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBub3QgY29ubmVjdGVkIGFmdGVyIGRpc21pc3NUbywgd2FpdGluZyBmb3IgcmVjb25uZWN0aW9uXCIpXG4gICAgICB0aGlzLndzID0gbnVsbFxuICAgICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQ2xpZW50IHdlYnNvY2tldCByZWNvbm5lY3RlZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBwYXRoLiBOYXRpdmUgdXNlcyB0aGUgaW4tYXBwIGhlbHBlcjsgd2ViIHJlbG9hZHMgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCByZWNvbm5lY3RzIHRoZSB0ZXN0IGJyaWRnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jyb3dzZXIuanNcIikuQnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAoaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnZpc2l0KHBhdGgsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBpbml0aWFsaXplQnJvd3NlckNvbnRleHQoKSB7XG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbml0aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYSB3ZWIgcm91dGUgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgY29tbWFuZCB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKSB7XG4gICAgdGhpcy5pZ25vcmVFeGlzdGluZ1Njb3VuZHJlbENsaWVudHMoKVxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHRoaXMuYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSlcbiAgICB0aGlzLmRlYnVnTG9nKGBEcml2ZXIgdmlzaXRlZCBwYXRoICR7cGF0aH1gKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWQgYWZ0ZXIgZHJpdmVyIG5hdmlnYXRpb25cIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgaWdub3JlRXhpc3RpbmdTY291bmRyZWxDbGllbnRzKCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzKCkubGVuZ3RoXG4gICAgdGhpcy5kZWJ1Z0xvZyhgSWdub3JpbmcgJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9IFNjb3VuZHJlbCBjbGllbnQocykgZnJvbSBwcmV2aW91cyBicm93c2VyIGNvbnRleHRzYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSlcbiAgICB0aGlzLl9odHRwSG9zdCA9IGh0dHBIb3N0XG4gICAgdGhpcy5faHR0cFBvcnQgPSBodHRwUG9ydFxuICAgIHRoaXMuX2h0dHBDb25uZWN0SG9zdCA9IGh0dHBDb25uZWN0SG9zdFxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9lcnJvckZpbHRlciA9IGVycm9yRmlsdGVyXG4gICAgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gZmFpbE9uQnJvd3NlckVycm9yXG4gICAgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gZmFpbE9uQ29uc29sZUVycm9yXG4gICAgdGhpcy5fc2NvdW5kcmVsUG9ydCA9IHNjb3VuZHJlbFBvcnRcbiAgICB0aGlzLl91cmxBcmdzID0gdXJsQXJnc1xuICAgIHRoaXMuX3Jvb3RQYXRoID0gdGhpcy5idWlsZFJvb3RQYXRoKClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgb2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZXNwb25zZXMgPSB7fVxuXG4gICAgdGhpcy5fc2VuZENvdW50ID0gMFxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe29uQ29tbWFuZDogdGhpcy5vbkNvbW1hbmRSZWNlaXZlZH0pXG4gICAgdGhpcy5zZXRDb21tdW5pY2F0b3IodGhpcy5jb21tdW5pY2F0b3IpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIFNjb3VuZHJlbCBzZXJ2ZXIgd2hpY2ggdGhlIGJyb3dzZXIgY29ubmVjdHMgdG8gZm9yIHJlbW90ZSBldmFsdWF0aW9uIGluIHRoZSBicm93c2VyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2NvdW5kcmVsV3NzKSB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGFscmVhZHkgc3RhcnRlZFwiKVxuXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB0aGlzLl9zY291bmRyZWxQb3J0fSlcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IG5ldyBTZXJ2ZXJXZWJTb2NrZXQodGhpcy5zY291bmRyZWxXc3MpXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKHRoaXMuc2VydmVyV2ViU29ja2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBzdG9wXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLnNlcnZlcj59ICovICh0aGlzLnNlcnZlcikuY2xvc2UoKSlcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLnNjb3VuZHJlbFdzcywgXCJTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgU2NvdW5kcmVsIGNsaWVudCAoYnJvd3NlcikgdG8gY29ubmVjdCBhbmQgcmV0dXJucyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0TXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBhc3luYyBnZXRTY291bmRyZWxDbGllbnQodGltZW91dE1zID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGlzIG5vdCBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogd2FpdGluZyBmb3IgYnJvd3NlciBTY291bmRyZWwgaW5pdGlhbGl6YXRpb25cIilcbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXMsIGVycm9yTWVzc2FnZTogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU2NvdW5kcmVsIHRvIGluaXRpYWxpemVcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwid2FpdEZvclNjb3VuZHJlbFwifSlcbiAgICB9KVxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IGJyb3dzZXIgcmVwb3J0ZWQgU2NvdW5kcmVsIGluaXRpYWxpemVkXCIpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2FueX0gY2xpZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29uc3QgaXNPcGVuQ2xpZW50ID0gKGNsaWVudCkgPT4gY2xpZW50Py5iYWNrZW5kPy53cz8ucmVhZHlTdGF0ZSA9PT0gMVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRzID0gdGhpcy5zZXJ2ZXIuZ2V0Q2xpZW50cygpXG4gICAgY29uc3QgY3VycmVudENsaWVudHMgPSBleGlzdGluZ0NsaWVudHMuc2xpY2UodGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50KVxuICAgIGNvbnN0IG9wZW5FeGlzdGluZ0NsaWVudHMgPSBjdXJyZW50Q2xpZW50cy5maWx0ZXIoaXNPcGVuQ2xpZW50KVxuXG4gICAgaWYgKG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHMubGVuZ3RofSwgaWdub3JlZDogJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9KWApXG5cbiAgICBpZiAoIXRoaXMuc2VydmVyLmV2ZW50cz8ub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgZXZlbnRzIGFyZSB1bmF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7KChjbGllbnQ6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9uTmV3Q2xpZW50XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKG9uTmV3Q2xpZW50KSB7XG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub2ZmKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCBjbGllbnRcIn0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG9uTmV3Q2xpZW50ID0gKC8qKiBAdHlwZSB7YW55fSAqLyBjbGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWlzT3BlbkNsaWVudChjbGllbnQpKSByZXR1cm5cbiAgICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHJlY2VpdmVkIG5ldyBvcGVuIGNsaWVudFwiKVxuICAgICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vbihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgQ1NTIHNlbGVjdG9yIG1hdGNoZXMgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmV4aXN0cyhzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdmlzaWJsZSB0ZXh0IGZyb20gYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50ZXh0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaGFzVGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIC8vIE5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIGxhdW5jaCBhbiBpbnN0YWxsZWQgYXBwIGluc3RlYWQgb2YgYSB3ZWIgcGFnZSwgc28gdGhleSBmb2xsb3cgdGhlXG4gICAgLy8gbmF0aXZlIGxpZmVjeWNsZSAobm8gZGlzdCBIVFRQIHNlcnZlciwgbm8gZHJpdmVyIG5hdmlnYXRpb24sIFdlYlNvY2tldCBzdGFydGVkIGJlZm9yZSB0aGUgYXBwKVxuICAgIC8vIGV2ZW4gd2hlbiBTWVNURU1fVEVTVF9IT1NUIGlzIFwiZGlzdFwiLlxuICAgIGNvbnN0IGlzTmF0aXZlQXBwID0gaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZylcblxuICAgIGlmIChpc05hdGl2ZUFwcCkge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gXCJuYXRpdmU6Ly9cIlxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlVzaW5nIG5hdGl2ZSBhcHAgaG9zdFwiKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImV4cG8tZGV2LXNlcnZlclwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faG9zdH06JHt0aGlzLl9wb3J0fWBcbiAgICAgIHRoaXMuZGVidWdMb2coYFVzaW5nIGV4cG8tZGV2LXNlcnZlciBhdCAke3RoaXMuY3VycmVudFVybH1gKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImRpc3RcIikge1xuICAgICAgY29uc3QgY29ubmVjdEhvc3QgPSB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPz8gdGhpcy5faHR0cEhvc3RcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHtjb25uZWN0SG9zdH06JHt0aGlzLl9odHRwUG9ydH1gXG5cbiAgICAgIHRoaXMuZGVidWdMb2coYFNwYXduaW5nIEhUVFAgc2VydmVyIGZvciBkaXN0IG9uICR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YClcbiAgICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSBuZXcgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIoe1xuICAgICAgICBob3N0OiB0aGlzLl9odHRwSG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5faHR0cFBvcnQsXG4gICAgICAgIGRlYnVnOiB0aGlzLl9kZWJ1ZyxcbiAgICAgICAgb25FcnJvcjogdGhpcy5vbkh0dHBTZXJ2ZXJFcnJvclxuICAgICAgfSlcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIEhUVFAgc2VydmVyXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLnN0YXJ0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDaGVja2luZyBIVFRQIHNlcnZlciBoZWFsdGhcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuYXNzZXJ0UmVhY2hhYmxlKHt0aW1lb3V0TXM6IHRoaXMuZ2V0VGltZW91dHMoKX0pXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicsICdkaXN0Jywgb3IgJ25hdGl2ZSdcIilcbiAgICB9XG5cbiAgICB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRCYXNlVXJsKHRoaXMuY3VycmVudFVybClcblxuICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgV2ViU29ja2V0IHNlcnZlciBiZWZvcmUgdGhlIGRyaXZlciBmb3IgbmF0aXZlIGFwcCBzZXNzaW9ucyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlQXBwKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlciAoYmVmb3JlIGRyaXZlciBmb3IgbmF0aXZlKVwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIGRyaXZlclwiKVxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnN0YXJ0KClcbiAgICB0aGlzLmRlYnVnTG9nKFwiRHJpdmVyIHN0YXJ0ZWRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMudmlzaXRJbml0aWFsUm9vdFBhdGgocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTZXR0aW5nIGJhc2Ugc2VsZWN0b3IgdG8gZm9jdXNlZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICB0aGlzLnNldEJhc2VTZWxlY3RvcihcIltkYXRhLXRlc3RpZD0nc3lzdGVtVGVzdGluZ0NvbXBvbmVudCddW2RhdGEtZm9jdXNzZWQ9J3RydWUnXVwiKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkJhc2Ugc2VsZWN0b3Igc2V0XCIpXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjb21wbGV0ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGJyb3dzZXIgZHJpdmVyIHRvIHJlYWNoIHRoZSByb290IHJvdXRlIGFmdGVyIHN0YXJ0dXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aCBJbml0aWFsIGFwcCByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdEluaXRpYWxSb290UGF0aChyb290UGF0aCkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMuZ2V0VGltZW91dHMoKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdmlzaXRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yLCBcImluaXRpYWwgcm9vdCBwYXRoIHZpc2l0IGVycm9yXCIpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB2aXNpdEVycm9yLm1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmV0cnlhYmxlTmV0d29ya0Vycm9yID0gbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0FERFJFU1NfVU5SRUFDSEFCTEVcIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0NPTk5FQ1RJT05fUkVGVVNFRFwiKVxuXG4gICAgICAgIGlmICghcmV0cnlhYmxlTmV0d29ya0Vycm9yIHx8IERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICB0aHJvdyB2aXNpdEVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnTG9nKGBJbml0aWFsIHJvb3QgcGF0aCB2aXNpdCB3YWl0aW5nIGZvciBkcml2ZXIgbmV0d29yayByZWFkaW5lc3M6ICR7bWVzc2FnZX1gKVxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUywgTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRSb290UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdFBhdGggPz8gU3lzdGVtVGVzdC5yb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5fcm9vdFBhdGggPSByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFJvb3RQYXRoKCkge1xuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5idWlsZFN5c3RlbVRlc3RQYXRoKFN5c3RlbVRlc3Qucm9vdFBhdGgpXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHN5c3RlbS10ZXN0IHF1ZXJ5IHBhcmFtcyB0byBhIHBhdGggdGhhdCB3aWxsIHJlbG9hZCB0aGUgd2ViIGFwcC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0XCIpKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RcIiwgXCJ0cnVlXCIpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIikgJiYgdGhpcy5fY2xpZW50V3NQb3J0ICE9PSAxOTg1KSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIiwgdGhpcy5fY2xpZW50V3NQb3J0KVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiKSAmJiB0aGlzLl9zY291bmRyZWxQb3J0ICE9PSA4MDkwKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIsIHRoaXMuX3Njb3VuZHJlbFBvcnQpXG4gICAgfVxuXG4gICAgaWYgKGlzQWJzb2x1dGVVcmwpIHJldHVybiB1cmwuaHJlZlxuXG4gICAgcmV0dXJuIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjbGllbnQgd2ViIHNvY2tldCB0byBjb25uZWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNsaWVudFdlYlNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5fY2xpZW50V3NDb25uZWN0VGltZW91dCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faHR0cFNlcnZlckVycm9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgICB0aGlzLnNldENvbW11bmljYXRvcih0aGlzLmNvbW11bmljYXRvcilcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSB3c3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbG9zZVdlYlNvY2tldFNlcnZlcih3c3MsIGxhYmVsID0gXCJXZWJTb2NrZXQgc2VydmVyXCIpIHtcbiAgICBpZiAoIXdzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgY2xvc2luZyAke2xhYmVsfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICBjb25zdCB0ZXJtaW5hdGVDbGllbnQgPSAoLyoqIEB0eXBlIHthbnl9ICovIGNsaWVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsaWVudC50ZXJtaW5hdGUoKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGVybWluYXRpb24gZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRsZSA9ICgvKiogQHR5cGUgeyh2YWx1ZTogYW55KSA9PiB2b2lkfSAqLyBjYWxsYmFjaywgLyoqIEB0eXBlIHthbnl9ICovIGFyZykgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKGFyZylcbiAgICAgIH1cblxuICAgICAgd3NzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKSlcbiAgICAgIHdzcy5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBzZXR0bGUocmVqZWN0LCBlcnJvcikpXG4gICAgICBpZiAod3NzLmNsaWVudHMgJiYgd3NzLmNsaWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgd3NzLmNsaWVudHMuZm9yRWFjaCh0ZXJtaW5hdGVDbGllbnQpXG4gICAgICB9XG4gICAgICB3c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgc2V0dGxlKHJlamVjdCwgZXJyb3IpXG4gICAgICAgIGVsc2Ugc2V0dGxlKHJlc29sdmUsIHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSkpXG4gIH1cbn1cbiJdfQ==
|
|
1095
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFFeEUsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUE7QUFDN0MsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTTtJQUN2QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFO0lBQ2hFLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFD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QUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUEvbENNLG1CQUFRLEdBQUcsd0JBQXdCLEFBQTNCLENBQTJCO2VBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBTZXJ2ZXIgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvaW5kZXguanNcIlxuaW1wb3J0IFNlcnZlcldlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIGZyb20gXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtaHR0cC1zZXJ2ZXIuanNcIlxuaW1wb3J0IHt3YWl0LCB3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IHtlbnN1cmVFcnJvcn0gZnJvbSBcInR5cGFuaWNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyLmpzXCJcbmltcG9ydCB7aXNBcHBpdW1OYXRpdmVBcHBEcml2ZXJDb25maWd9IGZyb20gXCIuL2RyaXZlcnMvYXBwaXVtLWRyaXZlci5qc1wiXG5cbmNvbnN0IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TID0gMzAwMDBcbmNvbnN0IElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUyA9IDEwMFxuY29uc3QgTkFUSVZFX0NMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TID0gMTIwMDAwXG5cbi8qKlxuICogV2hldGhlciBhIHN5c3RlbSB0ZXN0IHJ1bnMgYWdhaW5zdCBhIG5hdGl2ZSBhcHAgcmF0aGVyIHRoYW4gYSB3ZWIvZGlzdCBicm93c2VyLlxuICogVHJ1ZSBmb3IgYFNZU1RFTV9URVNUX0hPU1Q9bmF0aXZlYCBhbmQgZm9yIG5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIHJlZ2FyZGxlc3Mgb2YgaG9zdC5cbiAqIEBwYXJhbSB7U3lzdGVtVGVzdERyaXZlckNvbmZpZ30gW2RyaXZlcl1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXRpdmVBcHBTZXNzaW9uKGRyaXZlcikge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PT0gXCJuYXRpdmVcIiB8fCBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXIpXG59XG5cbi8qKlxuICogQHBhcmFtIHt7ZHJpdmVyPzogU3lzdGVtVGVzdERyaXZlckNvbmZpZ319IFthcmdzXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSA9IHt9KSB7XG4gIHJldHVybiBpc05hdGl2ZUFwcFNlc3Npb24oZHJpdmVyKSA/IE5BVElWRV9DTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA6IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3lzdGVtVGVzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSBQb3J0IGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cEhvc3RdIEhvc3RuYW1lIGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodHRwUG9ydF0gUG9ydCBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cENvbm5lY3RIb3N0XSBIb3N0bmFtZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gcmVhY2ggdGhlIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IGFueSkgPT4gYm9vbGVhbn0gW2Vycm9yRmlsdGVyXSBGaWx0ZXIgZm9yIGJyb3dzZXIgZXJyb3JzIChyZXR1cm4gZmFsc2UgdG8gaWdub3JlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxPbkJyb3dzZXJFcnJvcl0gVGhyb3cgcmVnaXN0ZXJlZCBicm93c2VyIGVycm9ycyBmcm9tIGZpbmRlci9pbnRlcmFjdCBoZWxwZXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbE9uQ29uc29sZUVycm9yXSBUcmVhdCBicm93c2VyIGNvbnNvbGUuZXJyb3IgY2FsbHMgYXMgcmVnaXN0ZXJlZCBicm93c2VyIGVycm9ycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpZW50V3NQb3J0XSBQb3J0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWVudFdzQ29ubmVjdFRpbWVvdXRdIFRpbWVvdXQgZm9yIHRoZSBicm93c2VyLWNvbW1hbmQgV2ViU29ja2V0IGNsaWVudCBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY291bmRyZWxQb3J0XSBQb3J0IGZvciB0aGUgU2NvdW5kcmVsIFdlYlNvY2tldCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFt1cmxBcmdzXSBRdWVyeSBwYXJhbXMgYXBwZW5kZWQgdG8gdGhlIHJvb3QgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7U3lzdGVtVGVzdERyaXZlckNvbmZpZ30gW2RyaXZlcl0gRHJpdmVyIGNvbmZpZ3VyYXRpb24uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1N5c3RlbVRlc3RBcmdzICYge3JlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZT86IGJvb2xlYW59fSBTeXN0ZW1UZXN0UnVuQXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3REcml2ZXJDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJzZWxlbml1bVwifFwiYXBwaXVtXCJ9IFt0eXBlXSBEcml2ZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gRHJpdmVyLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7XCJhY3Rpb25zXCIgfCBcImh1bWFuXCIgfCBcImpzXCJ9IFttZXRob2RdIE92ZXJyaWRlIHRoZSBjbGljayBwYXRoLiBgXCJhY3Rpb25zXCJgIHVzZXMgdGhlIFNlbGVuaXVtIEFjdGlvbnMgQVBJIChyZWFsIHBvaW50ZXIgbW92ZSArIGNsaWNrKTsgYFwiaHVtYW5cImAgdXNlcyBtdWx0aXBsZSBwb2ludGVyIG1vdmVzIGFuZCBwYXVzZXMgYmVmb3JlIGNsaWNraW5nOyBgXCJqc1wiYCBkaXNwYXRjaGVzIGBlbGVtZW50LmNsaWNrKClgIHZpYSBgZXhlY3V0ZVNjcmlwdGAgaW5zaWRlIHRoZSBwYWdlJ3MgSlMgY29udGV4dCBhbmQgaXMgZm9yIGRpYWdub3N0aWNzIG9ubHksIG5vdCBjb21taXR0ZWQgc3RhYmlsaXphdGlvbiBmaXhlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRYXSBYIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGlja09mZnNldFldIFkgb2Zmc2V0IGZvciBgYWN0aW9uc2AvYGh1bWFuYCBwb2ludGVyIGNsaWNrcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcERlbGF5XSBQYXVzZSBkdXJhdGlvbiBpbiBtcyBiZXR3ZWVuIGh1bWFuIHBvaW50ZXIgbW92ZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcHNdIE51bWJlciBvZiBpbnRlcm1lZGlhdGUgcG9pbnRlciBtb3ZlcyBiZWZvcmUgdGhlIGZpbmFsIGNsaWNrIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufX0gSW50ZXJhY3RBcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdEZvck5vU2VsZWN0b3JBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uTWVzc2FnZUFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc21pc3NdIFdoZXRoZXIgdG8gZGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uIGFmdGVyIGl0IGFwcGVhcnMuXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIC8oPzpefFxccy1cXHMpXFxbRE9NXFxdIFBhc3N3b3JkIGZpZWxkIGlzIG5vdCBjb250YWluZWQgaW4gYSBmb3JtOi9pLnRlc3QobWVzc2FnZSlcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuY29uc3QgZ2xvYmFsQW55ID0gZ2xvYmFsVGhpc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeXN0ZW1UZXN0IGV4dGVuZHMgQnJvd3NlciB7XG4gIHN0YXRpYyByb290UGF0aCA9IFwiL2JsYW5rP3N5c3RlbVRlc3Q9dHJ1ZVwiXG5cbiAgLyoqIEB0eXBlIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIHwgdW5kZWZpbmVkfSAqL1xuICBjb21tdW5pY2F0b3IgPSB1bmRlZmluZWRcblxuICBfc3RhcnRlZCA9IGZhbHNlXG4gIF9jbGllbnRXc1BvcnQgPSAxOTg1XG4gIF9jbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID0gQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVNcbiAgX2h0dHBIb3N0ID0gXCJsb2NhbGhvc3RcIlxuICBfaHR0cFBvcnQgPSAxOTg0XG4gIF9mYWlsT25Ccm93c2VyRXJyb3IgPSB0cnVlXG4gIF9mYWlsT25Db25zb2xlRXJyb3IgPSBmYWxzZVxuICAvKiogQHR5cGUgeygoZXJyb3I6IGFueSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gIF9lcnJvckZpbHRlciA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge0Vycm9yW119ICovXG4gIF9icm93c2VyRXJyb3JzID0gW11cbiAgX3Njb3VuZHJlbFBvcnQgPSA4MDkwXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBfaWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50ID0gMFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBjbGllbnRXc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzeXN0ZW0gdGVzdCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1N5c3RlbVRlc3R9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudChhcmdzID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbEFueS5zeXN0ZW1UZXN0KSB7XG4gICAgICBnbG9iYWxBbnkuc3lzdGVtVGVzdCA9IG5ldyBTeXN0ZW1UZXN0KGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JhbEFueS5zeXN0ZW1UZXN0LmFwcGx5QXJncyhhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBnbG9iYWxBbnkuc3lzdGVtVGVzdFxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgbXV0YWJsZSBvcHRpb25zIHRvIGFuIGFscmVhZHktcnVubmluZyBzaW5nbGV0b24gU3lzdGVtVGVzdC5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPFN5c3RlbVRlc3RBcmdzPn0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5QXJncyhhcmdzID0ge30pIHtcbiAgICBpZiAoXCJkZWJ1Z1wiIGluIGFyZ3MpIHRoaXMuX2RlYnVnID0gYXJncy5kZWJ1ZyA/PyBmYWxzZVxuICAgIGlmIChcImVycm9yRmlsdGVyXCIgaW4gYXJncykgdGhpcy5fZXJyb3JGaWx0ZXIgPSBhcmdzLmVycm9yRmlsdGVyXG4gICAgaWYgKFwiZmFpbE9uQnJvd3NlckVycm9yXCIgaW4gYXJncykgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gYXJncy5mYWlsT25Ccm93c2VyRXJyb3IgPz8gdHJ1ZVxuICAgIGlmIChcImZhaWxPbkNvbnNvbGVFcnJvclwiIGluIGFyZ3MpIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGFyZ3MuZmFpbE9uQ29uc29sZUVycm9yID8/IGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RDb21tdW5pY2F0b3J9ICovXG4gIGdldENvbW11bmljYXRvcigpIHtcbiAgICBpZiAoIXRoaXMuY29tbXVuaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tdW5pY2F0b3IgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYW4gZXJyb3IgbWVzc2FnZSBpZiBwb3NzaWJsZSBmcm9tIHRoZSBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX0gfCBFcnJvcn0gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YVxuXG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZGF0YT8udmFsdWUpID8gZGF0YS52YWx1ZVswXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlb2YgZmlyc3RWYWx1ZS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBicm93c2VyIGVycm9yIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIGJ1aWx0LWluIHJ1bGVzIGFuZCBhbiBvcHRpb25hbCBlcnJvciBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119fSBkYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSlcblxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE4XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE5XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9lcnJvckZpbHRlciAmJiB0aGlzLl9lcnJvckZpbHRlcihkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3N9IGFyZ3NcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3MgfCBmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFtjYWxsYmFja11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcnVuKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRDYWxsYmFjayA9IHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyBhcmdzIDogY2FsbGJhY2tcbiAgICBjb25zdCB7cmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlID0gdHJ1ZSwgLi4uc3lzdGVtVGVzdEFyZ3N9ID0gLyoqIEB0eXBlIHtTeXN0ZW1UZXN0UnVuQXJnc30gKi8gKHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyB7fSA6IGFyZ3MgfHwge30pXG4gICAgY29uc3Qgc3lzdGVtVGVzdCA9IHRoaXMuY3VycmVudChzeXN0ZW1UZXN0QXJncylcblxuICAgIGlmICghcmVzb2x2ZWRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3lzdGVtVGVzdC5ydW4gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIHN5c3RlbVRlc3QuX2Jyb3dzZXJFcnJvcnMgPSBbXVxuICAgIHN5c3RlbVRlc3QuYXBwbHlBcmdzKHtmYWlsT25Ccm93c2VyRXJyb3I6IHRydWUsIGZhaWxPbkNvbnNvbGVFcnJvcjogZmFsc2UsIC4uLnN5c3RlbVRlc3RBcmdzfSlcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZXNldHRpbmcgYnJvd3NlciBjb29raWVzIGJlZm9yZSBpbml0aWFsaXplXCIpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5kZWxldGVBbGxDb29raWVzKClcbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiQnJvd3NlciBjb29raWVzIGNsZWFyZWRcIilcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJnZXRSb290UGF0aFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gc3lzdGVtVGVzdC5nZXRSb290UGF0aCgpXG5cbiAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlc2V0VG9Sb290UGF0aEZvclJ1bihyb290UGF0aClcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gc3RhcnRlZCAtIHNlbmQgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuaW5pdGlhbGl6ZUJyb3dzZXJDb250ZXh0KClcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgcnVuRXJyb3IgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHRlYXJkb3duRXJyb3IgPSB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZmluZEJ5VGVzdElEIGJsYW5rVGV4dFwiKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC5maW5kQnlUZXN0SUQoXCJibGFua1RleHRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkZvdW5kIGJsYW5rVGV4dFwiKVxuXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwicmVzb2x2ZWRDYWxsYmFja1wiKVxuICAgICAgYXdhaXQgcmVzb2x2ZWRDYWxsYmFjayhzeXN0ZW1UZXN0KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBjYWxsYmFjayBjb21wbGV0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgUnVuIGVycm9yIGNhdWdodCwgdGFraW5nIHNjcmVlbnNob3Q6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC50YWtlU2NyZWVuc2hvdCgpXG5cbiAgICAgIHJ1bkVycm9yID0gZXJyb3JcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBmaW5pc2hlZCAtIHNlbmQgdGVhcmRvd25cIilcbiAgICAgIGNvbnN0IHRlYXJkb3duV3MgPSBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLndzXG4gICAgICAvLyBXZWJTb2NrZXQuQ0xPU0lORyAoMikgYW5kIFdlYlNvY2tldC5DTE9TRUQgKDMpIGNhbm5vdCByZWNvdmVyLCBzbyBza2lwIHRlYXJkb3duLlxuICAgICAgLy8gT1BFTiAoMSkgc2VuZHMgaW1tZWRpYXRlbHkuIENPTk5FQ1RJTkcgKDApIHF1ZXVlcyB0aGUgY29tbWFuZCBhbmQgZmx1c2hlcyBvblxuICAgICAgLy8gb25PcGVuIOKAlCB0aGUgMTBzIHRpbWVvdXQgYmVsb3cgY292ZXJzIHRoZSB3YWl0LlxuICAgICAgY29uc3Qgd3NDbG9zZWQgPSAhdGVhcmRvd25XcyB8fCB0ZWFyZG93bldzLnJlYWR5U3RhdGUgPT09IDIgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAzXG5cbiAgICAgIGlmICh3c0Nsb3NlZCkge1xuICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiU2tpcHBpbmcgdGVhcmRvd24g4oCUIGJyb3dzZXIgd2Vic29ja2V0IGlzIGNsb3NlZCAobGlrZWx5IGJ5IG5hdmlnYXRpb24vc2lnbi1vdXQgZHVyaW5nIHRoZSB0ZXN0KVwiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAxMF8wMDAsIGVycm9yTWVzc2FnZTogXCJTZW5kaW5nIHRlYXJkb3duIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwidGVhcmRvd25cIn0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0ZWFyZG93bkVycm9yID0gZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzeXN0ZW1UZXN0Ll9icm93c2VyRXJyb3JzID0gW11cbiAgICAgIHN5c3RlbVRlc3QuYXBwbHlBcmdzKHtlcnJvckZpbHRlcjogdW5kZWZpbmVkLCBmYWlsT25Ccm93c2VyRXJyb3I6IHRydWUsIGZhaWxPbkNvbnNvbGVFcnJvcjogZmFsc2V9KVxuICAgIH1cblxuICAgIGlmIChydW5FcnJvcikge1xuICAgICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHRlYXJkb3duIGZhaWxlZCBhZnRlciB0ZXN0IGZhaWx1cmVcIiwgdGVhcmRvd25FcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKHJlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgcnVuXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJ1bkVycm9yXG4gICAgfVxuXG4gICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiVGVhcmRvd24gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgdGVhcmRvd25cIilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciB0ZWFyZG93biBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHRlYXJkb3duRXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBhcHAgdG8gdGhlIHJvb3QgdGVzdCByb3V0ZSBiZWZvcmUgZWFjaCBydW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlc2V0VG9Sb290UGF0aEZvclJ1bihyb290UGF0aCkge1xuICAgIHRoaXMuZGVidWdMb2coYFZpc2l0IHJvb3RQYXRoIHdpdGggZGlzbWlzc1RvOiAke3Jvb3RQYXRofWApXG4gICAgYXdhaXQgdGhpcy5kaXNtaXNzVG8ocm9vdFBhdGgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhgRGlzbWlzc2VkIHRvIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICBpZiAoIXRoaXMud3MgfHwgdGhpcy53cy5yZWFkeVN0YXRlICE9PSAxKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IG5vdCBjb25uZWN0ZWQgYWZ0ZXIgZGlzbWlzc1RvLCB3YWl0aW5nIGZvciByZWNvbm5lY3Rpb25cIilcbiAgICAgIHRoaXMud3MgPSBudWxsXG4gICAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDbGllbnQgd2Vic29ja2V0IHJlY29ubmVjdGVkXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGguIENvbm5lY3RlZCBicm93c2VyIGNvbnRleHRzIG5hdmlnYXRlIGluLWFwcCB0byBwcmVzZXJ2ZSBsb2NhbCBzdGF0ZTsgdW5hdmFpbGFibGUgd2ViIGJyaWRnZXMgcmVsb2FkIHRocm91Z2ggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jyb3dzZXIuanNcIikuQnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAoaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnZpc2l0KHBhdGgsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kV2ViU29ja2V0ID0gdGhpcy5jb21tdW5pY2F0b3I/LndzXG4gICAgY29uc3QgY2FuVXNlSW5BcHBOYXZpZ2F0aW9uID0gdGhpcy5jb21tdW5pY2F0b3JFeGlzdHMoKSAmJiBjb21tYW5kV2ViU29ja2V0Py5yZWFkeVN0YXRlID09PSAxXG5cbiAgICBpZiAoY2FuVXNlSW5BcHBOYXZpZ2F0aW9uKSB7XG4gICAgICBhd2FpdCBzdXBlci52aXNpdCh0aGlzLmJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCksIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBpbml0aWFsaXplQnJvd3NlckNvbnRleHQoKSB7XG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbml0aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYSB3ZWIgcm91dGUgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgY29tbWFuZCB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKSB7XG4gICAgdGhpcy5pZ25vcmVFeGlzdGluZ1Njb3VuZHJlbENsaWVudHMoKVxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHRoaXMuYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSlcbiAgICB0aGlzLmRlYnVnTG9nKGBEcml2ZXIgdmlzaXRlZCBwYXRoICR7cGF0aH1gKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWQgYWZ0ZXIgZHJpdmVyIG5hdmlnYXRpb25cIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgaWdub3JlRXhpc3RpbmdTY291bmRyZWxDbGllbnRzKCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzKCkubGVuZ3RoXG4gICAgdGhpcy5kZWJ1Z0xvZyhgSWdub3JpbmcgJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9IFNjb3VuZHJlbCBjbGllbnQocykgZnJvbSBwcmV2aW91cyBicm93c2VyIGNvbnRleHRzYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSlcbiAgICB0aGlzLl9odHRwSG9zdCA9IGh0dHBIb3N0XG4gICAgdGhpcy5faHR0cFBvcnQgPSBodHRwUG9ydFxuICAgIHRoaXMuX2h0dHBDb25uZWN0SG9zdCA9IGh0dHBDb25uZWN0SG9zdFxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9lcnJvckZpbHRlciA9IGVycm9yRmlsdGVyXG4gICAgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gZmFpbE9uQnJvd3NlckVycm9yXG4gICAgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gZmFpbE9uQ29uc29sZUVycm9yXG4gICAgdGhpcy5fc2NvdW5kcmVsUG9ydCA9IHNjb3VuZHJlbFBvcnRcbiAgICB0aGlzLl91cmxBcmdzID0gdXJsQXJnc1xuICAgIHRoaXMuX3Jvb3RQYXRoID0gdGhpcy5idWlsZFJvb3RQYXRoKClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgb2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZXNwb25zZXMgPSB7fVxuXG4gICAgdGhpcy5fc2VuZENvdW50ID0gMFxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe29uQ29tbWFuZDogdGhpcy5vbkNvbW1hbmRSZWNlaXZlZH0pXG4gICAgdGhpcy5zZXRDb21tdW5pY2F0b3IodGhpcy5jb21tdW5pY2F0b3IpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIFNjb3VuZHJlbCBzZXJ2ZXIgd2hpY2ggdGhlIGJyb3dzZXIgY29ubmVjdHMgdG8gZm9yIHJlbW90ZSBldmFsdWF0aW9uIGluIHRoZSBicm93c2VyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2NvdW5kcmVsV3NzKSB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGFscmVhZHkgc3RhcnRlZFwiKVxuXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB0aGlzLl9zY291bmRyZWxQb3J0fSlcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IG5ldyBTZXJ2ZXJXZWJTb2NrZXQodGhpcy5zY291bmRyZWxXc3MpXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKHRoaXMuc2VydmVyV2ViU29ja2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBzdG9wXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLnNlcnZlcj59ICovICh0aGlzLnNlcnZlcikuY2xvc2UoKSlcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLnNjb3VuZHJlbFdzcywgXCJTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgU2NvdW5kcmVsIGNsaWVudCAoYnJvd3NlcikgdG8gY29ubmVjdCBhbmQgcmV0dXJucyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0TXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBhc3luYyBnZXRTY291bmRyZWxDbGllbnQodGltZW91dE1zID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGlzIG5vdCBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogd2FpdGluZyBmb3IgYnJvd3NlciBTY291bmRyZWwgaW5pdGlhbGl6YXRpb25cIilcbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXMsIGVycm9yTWVzc2FnZTogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU2NvdW5kcmVsIHRvIGluaXRpYWxpemVcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwid2FpdEZvclNjb3VuZHJlbFwifSlcbiAgICB9KVxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IGJyb3dzZXIgcmVwb3J0ZWQgU2NvdW5kcmVsIGluaXRpYWxpemVkXCIpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2FueX0gY2xpZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29uc3QgaXNPcGVuQ2xpZW50ID0gKGNsaWVudCkgPT4gY2xpZW50Py5iYWNrZW5kPy53cz8ucmVhZHlTdGF0ZSA9PT0gMVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRzID0gdGhpcy5zZXJ2ZXIuZ2V0Q2xpZW50cygpXG4gICAgY29uc3QgY3VycmVudENsaWVudHMgPSBleGlzdGluZ0NsaWVudHMuc2xpY2UodGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50KVxuICAgIGNvbnN0IG9wZW5FeGlzdGluZ0NsaWVudHMgPSBjdXJyZW50Q2xpZW50cy5maWx0ZXIoaXNPcGVuQ2xpZW50KVxuXG4gICAgaWYgKG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHMubGVuZ3RofSwgaWdub3JlZDogJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9KWApXG5cbiAgICBpZiAoIXRoaXMuc2VydmVyLmV2ZW50cz8ub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgZXZlbnRzIGFyZSB1bmF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7KChjbGllbnQ6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9uTmV3Q2xpZW50XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKG9uTmV3Q2xpZW50KSB7XG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub2ZmKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCBjbGllbnRcIn0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG9uTmV3Q2xpZW50ID0gKC8qKiBAdHlwZSB7YW55fSAqLyBjbGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWlzT3BlbkNsaWVudChjbGllbnQpKSByZXR1cm5cbiAgICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHJlY2VpdmVkIG5ldyBvcGVuIGNsaWVudFwiKVxuICAgICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vbihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgQ1NTIHNlbGVjdG9yIG1hdGNoZXMgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmV4aXN0cyhzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdmlzaWJsZSB0ZXh0IGZyb20gYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50ZXh0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaGFzVGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIC8vIE5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIGxhdW5jaCBhbiBpbnN0YWxsZWQgYXBwIGluc3RlYWQgb2YgYSB3ZWIgcGFnZSwgc28gdGhleSBmb2xsb3cgdGhlXG4gICAgLy8gbmF0aXZlIGxpZmVjeWNsZSAobm8gZGlzdCBIVFRQIHNlcnZlciwgbm8gZHJpdmVyIG5hdmlnYXRpb24sIFdlYlNvY2tldCBzdGFydGVkIGJlZm9yZSB0aGUgYXBwKVxuICAgIC8vIGV2ZW4gd2hlbiBTWVNURU1fVEVTVF9IT1NUIGlzIFwiZGlzdFwiLlxuICAgIGNvbnN0IGlzTmF0aXZlQXBwID0gaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZylcblxuICAgIGlmIChpc05hdGl2ZUFwcCkge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gXCJuYXRpdmU6Ly9cIlxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlVzaW5nIG5hdGl2ZSBhcHAgaG9zdFwiKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImV4cG8tZGV2LXNlcnZlclwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faG9zdH06JHt0aGlzLl9wb3J0fWBcbiAgICAgIHRoaXMuZGVidWdMb2coYFVzaW5nIGV4cG8tZGV2LXNlcnZlciBhdCAke3RoaXMuY3VycmVudFVybH1gKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImRpc3RcIikge1xuICAgICAgY29uc3QgY29ubmVjdEhvc3QgPSB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPz8gdGhpcy5faHR0cEhvc3RcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHtjb25uZWN0SG9zdH06JHt0aGlzLl9odHRwUG9ydH1gXG5cbiAgICAgIHRoaXMuZGVidWdMb2coYFNwYXduaW5nIEhUVFAgc2VydmVyIGZvciBkaXN0IG9uICR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YClcbiAgICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSBuZXcgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIoe1xuICAgICAgICBob3N0OiB0aGlzLl9odHRwSG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5faHR0cFBvcnQsXG4gICAgICAgIGRlYnVnOiB0aGlzLl9kZWJ1ZyxcbiAgICAgICAgb25FcnJvcjogdGhpcy5vbkh0dHBTZXJ2ZXJFcnJvclxuICAgICAgfSlcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIEhUVFAgc2VydmVyXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLnN0YXJ0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDaGVja2luZyBIVFRQIHNlcnZlciBoZWFsdGhcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuYXNzZXJ0UmVhY2hhYmxlKHt0aW1lb3V0TXM6IHRoaXMuZ2V0VGltZW91dHMoKX0pXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicsICdkaXN0Jywgb3IgJ25hdGl2ZSdcIilcbiAgICB9XG5cbiAgICB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRCYXNlVXJsKHRoaXMuY3VycmVudFVybClcblxuICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgV2ViU29ja2V0IHNlcnZlciBiZWZvcmUgdGhlIGRyaXZlciBmb3IgbmF0aXZlIGFwcCBzZXNzaW9ucyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlQXBwKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlciAoYmVmb3JlIGRyaXZlciBmb3IgbmF0aXZlKVwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIGRyaXZlclwiKVxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnN0YXJ0KClcbiAgICB0aGlzLmRlYnVnTG9nKFwiRHJpdmVyIHN0YXJ0ZWRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMudmlzaXRJbml0aWFsUm9vdFBhdGgocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTZXR0aW5nIGJhc2Ugc2VsZWN0b3IgdG8gZm9jdXNlZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICB0aGlzLnNldEJhc2VTZWxlY3RvcihcIltkYXRhLXRlc3RpZD0nc3lzdGVtVGVzdGluZ0NvbXBvbmVudCddW2RhdGEtZm9jdXNzZWQ9J3RydWUnXVwiKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkJhc2Ugc2VsZWN0b3Igc2V0XCIpXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjb21wbGV0ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGJyb3dzZXIgZHJpdmVyIHRvIHJlYWNoIHRoZSByb290IHJvdXRlIGFmdGVyIHN0YXJ0dXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aCBJbml0aWFsIGFwcCByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdEluaXRpYWxSb290UGF0aChyb290UGF0aCkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMuZ2V0VGltZW91dHMoKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdmlzaXRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yLCBcImluaXRpYWwgcm9vdCBwYXRoIHZpc2l0IGVycm9yXCIpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB2aXNpdEVycm9yLm1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmV0cnlhYmxlTmV0d29ya0Vycm9yID0gbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0FERFJFU1NfVU5SRUFDSEFCTEVcIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0NPTk5FQ1RJT05fUkVGVVNFRFwiKVxuXG4gICAgICAgIGlmICghcmV0cnlhYmxlTmV0d29ya0Vycm9yIHx8IERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICB0aHJvdyB2aXNpdEVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnTG9nKGBJbml0aWFsIHJvb3QgcGF0aCB2aXNpdCB3YWl0aW5nIGZvciBkcml2ZXIgbmV0d29yayByZWFkaW5lc3M6ICR7bWVzc2FnZX1gKVxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUywgTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRSb290UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdFBhdGggPz8gU3lzdGVtVGVzdC5yb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5fcm9vdFBhdGggPSByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFJvb3RQYXRoKCkge1xuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5idWlsZFN5c3RlbVRlc3RQYXRoKFN5c3RlbVRlc3Qucm9vdFBhdGgpXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHN5c3RlbS10ZXN0IHF1ZXJ5IHBhcmFtcyB0byBhIHBhdGggdGhhdCB3aWxsIHJlbG9hZCB0aGUgd2ViIGFwcC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0XCIpKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RcIiwgXCJ0cnVlXCIpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIikgJiYgdGhpcy5fY2xpZW50V3NQb3J0ICE9PSAxOTg1KSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIiwgdGhpcy5fY2xpZW50V3NQb3J0KVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiKSAmJiB0aGlzLl9zY291bmRyZWxQb3J0ICE9PSA4MDkwKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIsIHRoaXMuX3Njb3VuZHJlbFBvcnQpXG4gICAgfVxuXG4gICAgaWYgKGlzQWJzb2x1dGVVcmwpIHJldHVybiB1cmwuaHJlZlxuXG4gICAgcmV0dXJuIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjbGllbnQgd2ViIHNvY2tldCB0byBjb25uZWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNsaWVudFdlYlNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5fY2xpZW50V3NDb25uZWN0VGltZW91dCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faHR0cFNlcnZlckVycm9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgICB0aGlzLnNldENvbW11bmljYXRvcih0aGlzLmNvbW11bmljYXRvcilcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSB3c3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbG9zZVdlYlNvY2tldFNlcnZlcih3c3MsIGxhYmVsID0gXCJXZWJTb2NrZXQgc2VydmVyXCIpIHtcbiAgICBpZiAoIXdzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgY2xvc2luZyAke2xhYmVsfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICBjb25zdCB0ZXJtaW5hdGVDbGllbnQgPSAoLyoqIEB0eXBlIHthbnl9ICovIGNsaWVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsaWVudC50ZXJtaW5hdGUoKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGVybWluYXRpb24gZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRsZSA9ICgvKiogQHR5cGUgeyh2YWx1ZTogYW55KSA9PiB2b2lkfSAqLyBjYWxsYmFjaywgLyoqIEB0eXBlIHthbnl9ICovIGFyZykgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKGFyZylcbiAgICAgIH1cblxuICAgICAgd3NzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKSlcbiAgICAgIHdzcy5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBzZXR0bGUocmVqZWN0LCBlcnJvcikpXG4gICAgICBpZiAod3NzLmNsaWVudHMgJiYgd3NzLmNsaWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgd3NzLmNsaWVudHMuZm9yRWFjaCh0ZXJtaW5hdGVDbGllbnQpXG4gICAgICB9XG4gICAgICB3c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgc2V0dGxlKHJlamVjdCwgZXJyb3IpXG4gICAgICAgIGVsc2Ugc2V0dGxlKHJlc29sdmUsIHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSkpXG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "system-testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.120",
|
|
4
4
|
"description": "System testing with Selenium and browsers.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"system-testing": "build/cli.js"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"prepare:dummy": "npm run build && rm -rf spec/dummy/node_modules/system-testing && mkdir -p spec/dummy/node_modules/system-testing && cp -r build package.json spec/dummy/node_modules/system-testing/",
|
|
34
34
|
"build": "rm -rf build && npm run compile",
|
|
35
35
|
"compile": "tsc",
|
|
36
|
-
"build:apk:dummy": "npm run prepare:dummy && cd spec/dummy && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 npx expo prebuild --platform android --no-install --non-interactive && node ../../scripts/set-gradle-wrapper-network-timeout.mjs android/gradle/wrapper/gradle-wrapper.properties 60000 && cd android && SDK_ROOT=${ANDROID_SDK_ROOT:-/usr/lib/android-sdk} && echo \"sdk.dir=$SDK_ROOT\" > local.properties && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 ANDROID_SDK_ROOT=$SDK_ROOT ANDROID_HOME=$SDK_ROOT ANDROID_SDK_HOME=/tmp/android-sdk-home GRADLE_USER_HOME=/tmp/gradle-home ./gradlew --no-daemon --stacktrace assembleRelease",
|
|
36
|
+
"build:apk:dummy": "npm run prepare:dummy && cd spec/dummy && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 npx expo prebuild --platform android --no-install --non-interactive && node ../../scripts/set-gradle-wrapper-network-timeout.mjs android/gradle/wrapper/gradle-wrapper.properties 60000 && cd android && SDK_ROOT=${ANDROID_SDK_ROOT:-/usr/lib/android-sdk} && echo \"sdk.dir=$SDK_ROOT\" > local.properties && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 ANDROID_SDK_ROOT=$SDK_ROOT ANDROID_HOME=$SDK_ROOT ANDROID_SDK_HOME=/tmp/android-sdk-home GRADLE_USER_HOME=/tmp/gradle-home HEARTBEAT_LABEL=\"Gradle assembleRelease\" node ../../../scripts/run-with-heartbeat.js ./gradlew --no-daemon --stacktrace assembleRelease",
|
|
37
37
|
"export:web": "npm run prepare:dummy && npm --prefix spec/dummy run export:web",
|
|
38
38
|
"lint": "npm run eslint && npm run typecheck",
|
|
39
39
|
"prepublishOnly": "npm run build",
|