system-testing 1.0.120 → 1.0.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/build/browser.d.ts +1 -1
- package/build/browser.js +2 -17
- package/build/drivers/appium-driver.d.ts +15 -1
- package/build/drivers/appium-driver.js +38 -7
- package/build/drivers/webdriver-driver.js +4 -3
- package/build/system-test.d.ts +1 -1
- package/build/test-id-selector.d.ts +13 -0
- package/build/test-id-selector.js +19 -0
- package/package.json +6 -2
|
@@ -6,6 +6,7 @@ import { Origin } from "selenium-webdriver/lib/input.js";
|
|
|
6
6
|
import { wait } from "awaitery";
|
|
7
7
|
import timeout from "awaitery/build/timeout.js";
|
|
8
8
|
import WebDriverDriver from "./webdriver-driver.js";
|
|
9
|
+
import { testIdSelector } from "../test-id-selector.js";
|
|
9
10
|
const MAX_NATIVE_VIEWPORT_SCROLL_STEPS = 8;
|
|
10
11
|
const DEFAULT_NATIVE_NEW_COMMAND_TIMEOUT_SECONDS = 180;
|
|
11
12
|
/**
|
|
@@ -281,11 +282,7 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
281
282
|
this.serverUrl = this.options.serverUrl;
|
|
282
283
|
}
|
|
283
284
|
else {
|
|
284
|
-
const
|
|
285
|
-
const appiumMain = appiumModule.main ?? appiumModule.default?.main;
|
|
286
|
-
if (!appiumMain) {
|
|
287
|
-
throw new Error("Appium main() is unavailable from the appium package");
|
|
288
|
-
}
|
|
285
|
+
const appiumMain = await this.resolveAppiumMain();
|
|
289
286
|
this.appiumServer = await appiumMain(serverArgs);
|
|
290
287
|
this.serverUrl = this.buildServerUrl(serverArgs);
|
|
291
288
|
}
|
|
@@ -315,6 +312,40 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
315
312
|
throw error;
|
|
316
313
|
}
|
|
317
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* Imports the optional `appium` package. Isolated as a seam so the missing-package
|
|
317
|
+
* path can be unit tested without uninstalling Appium. The specifier is widened to
|
|
318
|
+
* `string` so the build/typecheck does not statically require appium's types when the
|
|
319
|
+
* optional dependency is not installed.
|
|
320
|
+
* @returns {Promise<Record<string, any>>}
|
|
321
|
+
*/
|
|
322
|
+
async loadAppiumModule() {
|
|
323
|
+
const appiumPackage = /** @type {string} */ ("appium");
|
|
324
|
+
return await import(appiumPackage);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Resolves Appium's `main()` for the embedded-server path, surfacing an actionable
|
|
328
|
+
* install instruction when the optional `appium` package is not installed.
|
|
329
|
+
* @returns {Promise<(serverArgs: Record<string, any>) => Promise<any>>}
|
|
330
|
+
*/
|
|
331
|
+
async resolveAppiumMain() {
|
|
332
|
+
let appiumModule;
|
|
333
|
+
try {
|
|
334
|
+
appiumModule = await this.loadAppiumModule();
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
const code = error instanceof Error ? /** @type {{code?: string}} */ (error).code : undefined;
|
|
338
|
+
if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") {
|
|
339
|
+
throw errorWithCause("The Appium driver requires the optional 'appium' package, which is not installed. Run `npm install --save-dev appium` (plus any Appium drivers you need, e.g. appium-uiautomator2-driver), or pass driver.options.serverUrl to use an external Appium server.", error);
|
|
340
|
+
}
|
|
341
|
+
throw error;
|
|
342
|
+
}
|
|
343
|
+
const appiumMain = appiumModule.main ?? appiumModule.default?.main;
|
|
344
|
+
if (!appiumMain) {
|
|
345
|
+
throw new Error("Appium main() is unavailable from the appium package");
|
|
346
|
+
}
|
|
347
|
+
return appiumMain;
|
|
348
|
+
}
|
|
318
349
|
/**
|
|
319
350
|
* @returns {Promise<void>}
|
|
320
351
|
*/
|
|
@@ -384,7 +415,7 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
384
415
|
const testIdStrategy = this.options.testIdStrategy ?? "accessibilityId";
|
|
385
416
|
if (testIdStrategy === "css") {
|
|
386
417
|
const testIdAttribute = this.options.testIdAttribute ?? "data-testid";
|
|
387
|
-
return await this.find(
|
|
418
|
+
return await this.find(testIdSelector(testID, testIdAttribute), args);
|
|
388
419
|
}
|
|
389
420
|
if (testIdStrategy === "id") {
|
|
390
421
|
return await this.findById(testID, args);
|
|
@@ -946,4 +977,4 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
946
977
|
return `http://${address}:${port}${basePath}`;
|
|
947
978
|
}
|
|
948
979
|
}
|
|
949
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUMxQyxNQUFNLDBDQUEwQyxHQUFHLEdBQUcsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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TyxJQUFJLFdBQVcsQ0FBQTtRQUNqRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFbkksT0FBTyxVQUFVLE9BQU8sSUFBSSxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQge0NvbW1hbmQsIE5hbWV9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2NvbW1hbmQuanNcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbmNvbnN0IE1BWF9OQVRJVkVfVklFV1BPUlRfU0NST0xMX1NURVBTID0gOFxuY29uc3QgREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTID0gMTgwXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogS2VlcHMgbmF0aXZlIEFwcGl1bSBzZXNzaW9ucyBhbGl2ZSB3aGlsZSB0aGUgUmVhY3QgTmF0aXZlIGFwcCBvcGVucyB0aGUgc3lzdGVtLXRlc3QgV2ViU29ja2V0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTmF0aXZlTmV3Q29tbWFuZFRpbWVvdXRDYXBhYmlsaXR5KHtjYXBhYmlsaXRpZXN9KSB7XG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhbmRyb2lkXCIpIHJldHVyblxuICBpZiAodHlwZW9mIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXNbXCJhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXRcIl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdID0gREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTXG59XG5cbi8qKlxuICogV2hldGhlciBhIGRyaXZlciBjb25maWcgcmVzb2x2ZXMgdG8gYSBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9uIHJhdGhlciB0aGFuIGEgYnJvd3Nlci5cbiAqIE5hdGl2ZSBhcHAgc2Vzc2lvbnMgbGF1bmNoIGFuIGluc3RhbGxlZCBhcHAgKG5vIGBicm93c2VyTmFtZWApLCBzbyB0aGUgc3lzdGVtLXRlc3QgaGFybmVzc1xuICogbXVzdCBzdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyBhbmQgYWxsb3cgdGhlIG5hdGl2ZS1zYWZlIGNvbm5lY3QgdGltZW91dC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5Ccm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXJDb25maWcpIHtcbiAgaWYgKGRyaXZlckNvbmZpZz8udHlwZSAhPT0gXCJhcHBpdW1cIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlckNvbmZpZy5vcHRpb25zID8/IHt9XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gb3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IG9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICByZXR1cm4gdHlwZW9mIGJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IGJyb3dzZXJOYW1lLmxlbmd0aCA9PT0gMFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhcHBpdW1cIilcbiAgICAgIGNvbnN0IGFwcGl1bU1haW4gPSBhcHBpdW1Nb2R1bGUubWFpbiA/PyBhcHBpdW1Nb2R1bGUuZGVmYXVsdD8ubWFpblxuXG4gICAgICBpZiAoIWFwcGl1bU1haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IGF3YWl0IGFwcGl1bU1haW4oc2VydmVyQXJncylcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5idWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMgPyB7Li4udGhpcy5vcHRpb25zLmNhcGFiaWxpdGllc30gOiB7fVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSAmJiAhY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBcIlwiXG4gICAgfVxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IGF3YWl0IGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7XG4gICAgICBicm93c2VyTmFtZTogdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lLFxuICAgICAgY2FwYWJpbGl0aWVzXG4gICAgfSlcbiAgICBlbnN1cmVOYXRpdmVOZXdDb21tYW5kVGltZW91dENhcGFiaWxpdHkoe2NhcGFiaWxpdGllc30pXG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS51c2luZ1NlcnZlcih0aGlzLnNlcnZlclVybClcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYXBhYmlsaXRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIud2l0aENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYkRyaXZlciA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKVxuXG4gICAgICB0aGlzLnNldFdlYkRyaXZlcih3ZWJEcml2ZXIpXG4gICAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnN0b3AoKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5hcHBpdW1TZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBBcHBpdW0gc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmFwcGl1bVNlcnZlcj59ICovICh0aGlzLmFwcGl1bVNlcnZlcikuY2xvc2UoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpIHtcbiAgICBpZiAoIXRoaXMuY2hyb21lVXNlckRhdGFEaXIpIHJldHVyblxuXG4gICAgY29uc3QgY2hyb21lVXNlckRhdGFEaXIgPSB0aGlzLmNocm9tZVVzZXJEYXRhRGlyXG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgZnMucm0oY2hyb21lVXNlckRhdGFEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzLiBTa2lwcGVkIGZvciBuYXRpdmUgYXBwIGNvbnRleHRzIHdoZXJlIGNvb2tpZVxuICAgKiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVWlBdXRvbWF0b3IyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVyblxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8ucGxhdGZvcm1OYW1lXG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIlxuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiAhYnJvd3Nlck5hbWUpIHtcbiAgICAgIGxldCBlbnRyaWVzXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQoXCJsb2djYXRcIilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nY2F0TG9ncyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaCA/IG1lc3NhZ2VNYXRjaFs0XSA6IGVudHJ5Lm1lc3NhZ2VcblxuICAgICAgICBsb2djYXRMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9nY2F0TG9nc1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgdGVzdElkU3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMudGVzdElkU3RyYXRlZ3kgPz8gXCJhY2Nlc3NpYmlsaXR5SWRcIlxuXG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImNzc1wiKSB7XG4gICAgICBjb25zdCB0ZXN0SWRBdHRyaWJ1dGUgPSB0aGlzLm9wdGlvbnMudGVzdElkQXR0cmlidXRlID8/IFwiZGF0YS10ZXN0aWRcIlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgWyR7dGVzdElkQXR0cmlidXRlfT0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBvd25zIGV4cGVjdGVkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciB1bmRlciB0aGUgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgYXdhaXQgc3VwZXIud2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IHNjb3BlZFRleHRYcGF0aCA9IGFuZHJvaWRTY29wZWRUZXh0WHBhdGgodGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2Ygc2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgc2VsZWN0b3IpKVxuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3ZXJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbMF0pIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZWRUZXh0RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS54cGF0aChzY29wZWRUZXh0WHBhdGgpKVxuICAgICAgaWYgKHNjb3BlZFRleHRFbGVtZW50c1swXSkgcmV0dXJuIHNjb3BlZFRleHRFbGVtZW50c1swXVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBBbmRyb2lkIGNvbnRyb2wgYnkgcmVzb3VyY2UgaWQsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgZmlyc3Qgd2hlbiByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SWQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwLCBzY3JvbGxUbzogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkOiAke3Rlc3RJZH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IFthbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCldXG4gICAgICB9LCBhcmdzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgY29udHJvbCwgdHJ5aW5nIGRpcmVjdCBsb29rdXAsIFVpU2Nyb2xsYWJsZSwgYW5kIHZpZXdwb3J0IGdlc3R1cmUgc2Nyb2xsaW5nLlxuICAgKiBAcGFyYW0ge05hdGl2ZUNvbnRyb2xMb29rdXB9IGxvb2t1cCBMb29rdXAgY2FsbGJhY2tzIGFuZCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyhsb29rdXAsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzID0gW10sIHNjcm9sbFRvID0gdHJ1ZSwgdGltZW91dCA9IDEwMDAwfSA9IGFyZ3NcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgIGlmICghYXR0ZW1wdGVkVWlTZWxlY3RvclNjcm9sbCkge1xuICAgICAgICAgIGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSB0cnVlXG4gICAgICAgICAgZm9yIChjb25zdCBzY3JvbGxTZWxlY3RvciBvZiBsb29rdXAuc2Nyb2xsU2VsZWN0b3JzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyhzY3JvbGxTZWxlY3Rvciwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2Nhbihsb29rdXAuZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQgPT09IDApIGJyZWFrXG4gICAgICBhd2FpdCB3YWl0KDEwMClcbiAgICB9IHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dClcblxuICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5ICR7bG9va3VwLmRlc2NyaXB0aW9ufWAsIGxhc3RFcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBuYXRpdmUgY29udGVudCBhcm91bmQgdGhlIGN1cnJlbnQgdmlld3BvcnQgc28gcmV0YWluZWQgb2Zmc2V0cyBhbmRcbiAgICogYmVsb3ctZm9sZCB0YXJnZXRzIGFyZSBib3RoIHJlYWNoYWJsZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIHRpbWVvdXQgYnVkZ2V0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBkaXJlY3RGaW5kIExvb2t1cCB0byByZXRyeSBhZnRlciBlYWNoIHNjcm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgY29udHJvbC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2NhbihkaXJlY3RGaW5kLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3QgdXBTY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG4gICAgY29uc3QgZG93blNjcm9sbFN0YXRlID0gdGhpcy5uZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKClcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUzsgaW5kZXggKz0gMSkge1xuICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydCh1cFNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcInVwXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQoZG93blNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcImRvd25cIilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIG5hdGl2ZSB2aWV3cG9ydCBzY2FuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IEZyZXNoIHNjcm9sbCBmYWxsYmFjayBzdGF0ZS5cbiAgICovXG4gIG5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyeUVsZW1lbnRTY3JvbGw6IHRydWUsXG4gICAgICB0cnlWaWV3cG9ydFNjcm9sbDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IG5hdGl2ZSBwb2xsaW5nIHdpdGhvdXQgQXBwaXVtJ3MgaW1wbGljaXQgd2FpdCBleHRlbmRpbmcgZXZlcnkgZmFpbGVkIHByb2JlLlxuICAgKiBAdGVtcGxhdGUgVFJlc3VsdCBSZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGltcGxpY2l0V2FpdE1zIEltcGxpY2l0IHdhaXQgZHVyYXRpb24gdG8gYXBwbHkgZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRSZXN1bHQ+fSBjYWxsYmFjayBXb3JrIHRoYXQgb3ducyBpdHMgb3duIHBvbGxpbmcgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhOYXRpdmVJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdGltZW91dHMgPSAvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRzfSAqLyAoYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5nZXRUaW1lb3V0cygpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiBpbXBsaWNpdFdhaXRNc30pKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKC8qKiBAdHlwZSB7TmF0aXZlVGltZW91dE9wdGlvbnN9ICovICh7aW1wbGljaXQ6IHRpbWVvdXRzLmltcGxpY2l0fSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpc2libGUgbmF0aXZlIHZpZXdwb3J0IHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHBhcmFtIHtOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvbn0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBzY3JvbGwgdGhlIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBBcHBpdW0gcGVyZm9ybXMgdGhlIGdlc3R1cmUuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVWaWV3cG9ydChzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgd2luZG93UmVjdCA9IC8qKiBAdHlwZSB7TmF0aXZlV2luZG93UmVjdH0gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkud2luZG93KCkuZ2V0UmVjdCgpKVxuICAgIGNvbnN0IGhvcml6b250YWxJbnNldCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC53aWR0aCAqIDAuMSkpXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuMikpXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCB3aW5kb3dSZWN0LndpZHRoIC0gaG9yaXpvbnRhbEluc2V0ICogMilcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3QuaGVpZ2h0ICogMC42KSlcblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsICYmIHNjcm9sbENvbnRhaW5lclRlc3RJRHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzY3JvbGxDb250YWluZXJUZXN0SUQgb2Ygc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlRWxlbWVudChzY3JvbGxDb250YWluZXJUZXN0SUQsIGRpcmVjdGlvbilcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IGhvcml6b250YWxJbnNldCxcbiAgICAgICAgICBwZXJjZW50OiAwLjc1LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZGlkU2Nyb2xsID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclggPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueCArIHdpbmRvd1JlY3Qud2lkdGggLyAyKVxuICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuNzggOiAwLjI4KSlcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIChkaXJlY3Rpb24gPT09IFwiZG93blwiID8gMC4yOCA6IDAuNzgpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlKG5ldyBDb21tYW5kKE5hbWUuQUNUSU9OUykuc2V0UGFyYW1ldGVyKFwiYWN0aW9uc1wiLCBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7ZHVyYXRpb246IDEwMCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogc3RhcnRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJEb3duXCJ9LFxuICAgICAgICAgIHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgdHlwZTogXCJwb2ludGVyTW92ZVwiLCB4OiBjZW50ZXJYLCB5OiBlbmRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJVcFwifVxuICAgICAgICBdLFxuICAgICAgICBpZDogXCJuYXRpdmUgc2Nyb2xsIGZpbmdlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcG9pbnRlclR5cGU6IFwidG91Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcInBvaW50ZXJcIlxuICAgICAgfVxuICAgIF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYSBzcGVjaWZpYyBuYXRpdmUgQW5kcm9pZCBlbGVtZW50IGJ5IHRlc3QgaWQgd2hlbiBBcHBpdW0gZXhwb3NlcyBpdCBhcyBhIHNjcm9sbCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBBcHBpdW0gcmVwb3J0ZWQgbW9yZSBjb250ZW50IHRvIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZUVsZW1lbnQodGVzdElkLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGVsZW1lbnRJZDogYXdhaXQgc2Nyb2xsRWxlbWVudC5nZXRJZCgpLFxuICAgICAgcGVyY2VudDogMC43NVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGlkU2Nyb2xsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYW4gb2Zmc2NyZWVuIEFuZHJvaWQgY29udHJvbCBpbnRvIGEgU2Nyb2xsVmlldy1iYWNrZWQgbmF0aXZlIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpU2VsZWN0b3IgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgY29udHJvbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBVaUF1dG9tYXRvciBhdHRlbXB0cyB0aGUgc2Nyb2xsLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVWlTZWxlY3RvckludG9WaWV3KHVpU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlU2VsZWN0b3JzID0gW1xuICAgICAgLi4uc2Nyb2xsQ29udGFpbmVyVGVzdElEcy5tYXAoKHNjcm9sbENvbnRhaW5lclRlc3RJRCkgPT4gYW5kcm9pZFJlc291cmNlSWRTZWxlY3RvcihzY3JvbGxDb250YWluZXJUZXN0SUQpKSxcbiAgICAgIFwibmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpXCJcbiAgICBdXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBsYXN0RXJyb3JcblxuICAgIGZvciAoY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9yIG9mIHNjcm9sbGFibGVTZWxlY3RvcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYG5ldyBVaVNjcm9sbGFibGUoJHtzY3JvbGxhYmxlU2VsZWN0b3J9KS5zY3JvbGxJbnRvVmlldygke3VpU2VsZWN0b3J9KWApKVxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsYXN0RXJyb3IpIHRocm93IGxhc3RFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
|
|
980
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxnQ0FBZ0MsR0FBRyxDQUFDLENBQUE7QUFDMUMsTUFBTSwwQ0FBMEMsR0FBRyxHQUFHLENBQUE7QUFFdEQ7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUMxRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNuQixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFB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QUE7UUFFbkksT0FBTyxVQUFVLE9BQU8sSUFBSSxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQge0NvbW1hbmQsIE5hbWV9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2NvbW1hbmQuanNcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5pbXBvcnQge3Rlc3RJZFNlbGVjdG9yfSBmcm9tIFwiLi4vdGVzdC1pZC1zZWxlY3Rvci5qc1wiXG5cbmNvbnN0IE1BWF9OQVRJVkVfVklFV1BPUlRfU0NST0xMX1NURVBTID0gOFxuY29uc3QgREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTID0gMTgwXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogS2VlcHMgbmF0aXZlIEFwcGl1bSBzZXNzaW9ucyBhbGl2ZSB3aGlsZSB0aGUgUmVhY3QgTmF0aXZlIGFwcCBvcGVucyB0aGUgc3lzdGVtLXRlc3QgV2ViU29ja2V0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTmF0aXZlTmV3Q29tbWFuZFRpbWVvdXRDYXBhYmlsaXR5KHtjYXBhYmlsaXRpZXN9KSB7XG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhbmRyb2lkXCIpIHJldHVyblxuICBpZiAodHlwZW9mIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXNbXCJhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXRcIl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdID0gREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTXG59XG5cbi8qKlxuICogV2hldGhlciBhIGRyaXZlciBjb25maWcgcmVzb2x2ZXMgdG8gYSBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9uIHJhdGhlciB0aGFuIGEgYnJvd3Nlci5cbiAqIE5hdGl2ZSBhcHAgc2Vzc2lvbnMgbGF1bmNoIGFuIGluc3RhbGxlZCBhcHAgKG5vIGBicm93c2VyTmFtZWApLCBzbyB0aGUgc3lzdGVtLXRlc3QgaGFybmVzc1xuICogbXVzdCBzdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyBhbmQgYWxsb3cgdGhlIG5hdGl2ZS1zYWZlIGNvbm5lY3QgdGltZW91dC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5Ccm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXJDb25maWcpIHtcbiAgaWYgKGRyaXZlckNvbmZpZz8udHlwZSAhPT0gXCJhcHBpdW1cIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlckNvbmZpZy5vcHRpb25zID8/IHt9XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gb3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IG9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICByZXR1cm4gdHlwZW9mIGJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IGJyb3dzZXJOYW1lLmxlbmd0aCA9PT0gMFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1NYWluID0gYXdhaXQgdGhpcy5yZXNvbHZlQXBwaXVtTWFpbigpXG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gYXdhaXQgYXBwaXVtTWFpbihzZXJ2ZXJBcmdzKVxuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLmJ1aWxkU2VydmVyVXJsKHNlcnZlckFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcyA/IHsuLi50aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzfSA6IHt9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lICYmICFjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IFwiXCJcbiAgICB9XG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gYXdhaXQgZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHtcbiAgICAgIGJyb3dzZXJOYW1lOiB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUsXG4gICAgICBjYXBhYmlsaXRpZXNcbiAgICB9KVxuICAgIGVuc3VyZU5hdGl2ZU5ld0NvbW1hbmRUaW1lb3V0Q2FwYWJpbGl0eSh7Y2FwYWJpbGl0aWVzfSlcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpLnVzaW5nU2VydmVyKHRoaXMuc2VydmVyVXJsKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhcGFiaWxpdGllcykubGVuZ3RoID4gMCkge1xuICAgICAgYnVpbGRlci53aXRoQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViRHJpdmVyID0gYXdhaXQgYnVpbGRlci5idWlsZCgpXG5cbiAgICAgIHRoaXMuc2V0V2ViRHJpdmVyKHdlYkRyaXZlcilcbiAgICAgIHRoaXMuaW5zdGFsbEV4aXRIYW5kbGVycygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgdGhlIG9wdGlvbmFsIGBhcHBpdW1gIHBhY2thZ2UuIElzb2xhdGVkIGFzIGEgc2VhbSBzbyB0aGUgbWlzc2luZy1wYWNrYWdlXG4gICAqIHBhdGggY2FuIGJlIHVuaXQgdGVzdGVkIHdpdGhvdXQgdW5pbnN0YWxsaW5nIEFwcGl1bS4gVGhlIHNwZWNpZmllciBpcyB3aWRlbmVkIHRvXG4gICAqIGBzdHJpbmdgIHNvIHRoZSBidWlsZC90eXBlY2hlY2sgZG9lcyBub3Qgc3RhdGljYWxseSByZXF1aXJlIGFwcGl1bSdzIHR5cGVzIHdoZW4gdGhlXG4gICAqIG9wdGlvbmFsIGRlcGVuZGVuY3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBhc3luYyBsb2FkQXBwaXVtTW9kdWxlKCkge1xuICAgIGNvbnN0IGFwcGl1bVBhY2thZ2UgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFwiYXBwaXVtXCIpXG5cbiAgICByZXR1cm4gYXdhaXQgaW1wb3J0KGFwcGl1bVBhY2thZ2UpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQXBwaXVtJ3MgYG1haW4oKWAgZm9yIHRoZSBlbWJlZGRlZC1zZXJ2ZXIgcGF0aCwgc3VyZmFjaW5nIGFuIGFjdGlvbmFibGVcbiAgICogaW5zdGFsbCBpbnN0cnVjdGlvbiB3aGVuIHRoZSBvcHRpb25hbCBgYXBwaXVtYCBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPChzZXJ2ZXJBcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPGFueT4+fVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUFwcGl1bU1haW4oKSB7XG4gICAgbGV0IGFwcGl1bU1vZHVsZVxuXG4gICAgdHJ5IHtcbiAgICAgIGFwcGl1bU1vZHVsZSA9IGF3YWl0IHRoaXMubG9hZEFwcGl1bU1vZHVsZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gLyoqIEB0eXBlIHt7Y29kZT86IHN0cmluZ319ICovIChlcnJvcikuY29kZSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiIHx8IGNvZGUgPT09IFwiTU9EVUxFX05PVF9GT1VORFwiKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKFwiVGhlIEFwcGl1bSBkcml2ZXIgcmVxdWlyZXMgdGhlIG9wdGlvbmFsICdhcHBpdW0nIHBhY2thZ2UsIHdoaWNoIGlzIG5vdCBpbnN0YWxsZWQuIFJ1biBgbnBtIGluc3RhbGwgLS1zYXZlLWRldiBhcHBpdW1gIChwbHVzIGFueSBBcHBpdW0gZHJpdmVycyB5b3UgbmVlZCwgZS5nLiBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlciksIG9yIHBhc3MgZHJpdmVyLm9wdGlvbnMuc2VydmVyVXJsIHRvIHVzZSBhbiBleHRlcm5hbCBBcHBpdW0gc2VydmVyLlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBhcHBpdW1NYWluID0gYXBwaXVtTW9kdWxlLm1haW4gPz8gYXBwaXVtTW9kdWxlLmRlZmF1bHQ/Lm1haW5cblxuICAgIGlmICghYXBwaXVtTWFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBhcHBpdW1NYWluXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5zdG9wKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuYXBwaXVtU2VydmVyPy5jbG9zZSkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgQXBwaXVtIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5hcHBpdW1TZXJ2ZXI+fSAqLyAodGhpcy5hcHBpdW1TZXJ2ZXIpLmNsb3NlKCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKSB7XG4gICAgaWYgKCF0aGlzLmNocm9tZVVzZXJEYXRhRGlyKSByZXR1cm5cblxuICAgIGNvbnN0IGNocm9tZVVzZXJEYXRhRGlyID0gdGhpcy5jaHJvbWVVc2VyRGF0YURpclxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IGZzLnJtKGNocm9tZVVzZXJEYXRhRGlyLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcy4gU2tpcHBlZCBmb3IgbmF0aXZlIGFwcCBjb250ZXh0cyB3aGVyZSBjb29raWVcbiAgICogbWFuYWdlbWVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFVpQXV0b21hdG9yMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDb29raWVzKCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm5cblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZUFsbENvb2tpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG4gICAgY29uc3QgaXNBbmRyb2lkID0gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCJcblxuICAgIGlmIChpc0FuZHJvaWQgJiYgIWJyb3dzZXJOYW1lKSB7XG4gICAgICBsZXQgZW50cmllc1xuXG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KFwibG9nY2F0XCIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvZ2NhdExvZ3MgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2ggPyBtZXNzYWdlTWF0Y2hbNF0gOiBlbnRyeS5tZXNzYWdlXG5cbiAgICAgICAgbG9nY2F0TG9ncy5wdXNoKGAke2VudHJ5LmxldmVsLm5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvZ2NhdExvZ3NcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuZ2V0QnJvd3NlckxvZ3MoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IHRlc3RJZFN0cmF0ZWd5ID0gdGhpcy5vcHRpb25zLnRlc3RJZFN0cmF0ZWd5ID8/IFwiYWNjZXNzaWJpbGl0eUlkXCJcblxuICAgIGlmICh0ZXN0SWRTdHJhdGVneSA9PT0gXCJjc3NcIikge1xuICAgICAgY29uc3QgdGVzdElkQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLnRlc3RJZEF0dHJpYnV0ZSA/PyBcImRhdGEtdGVzdGlkXCJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQodGVzdElkU2VsZWN0b3IodGVzdElELCB0ZXN0SWRBdHRyaWJ1dGUpLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBvd25zIGV4cGVjdGVkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciB1bmRlciB0aGUgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgYXdhaXQgc3VwZXIud2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IHNjb3BlZFRleHRYcGF0aCA9IGFuZHJvaWRTY29wZWRUZXh0WHBhdGgodGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2Ygc2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgc2VsZWN0b3IpKVxuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3ZXJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbMF0pIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZWRUZXh0RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS54cGF0aChzY29wZWRUZXh0WHBhdGgpKVxuICAgICAgaWYgKHNjb3BlZFRleHRFbGVtZW50c1swXSkgcmV0dXJuIHNjb3BlZFRleHRFbGVtZW50c1swXVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBBbmRyb2lkIGNvbnRyb2wgYnkgcmVzb3VyY2UgaWQsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgZmlyc3Qgd2hlbiByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SWQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwLCBzY3JvbGxUbzogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkOiAke3Rlc3RJZH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IFthbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCldXG4gICAgICB9LCBhcmdzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgY29udHJvbCwgdHJ5aW5nIGRpcmVjdCBsb29rdXAsIFVpU2Nyb2xsYWJsZSwgYW5kIHZpZXdwb3J0IGdlc3R1cmUgc2Nyb2xsaW5nLlxuICAgKiBAcGFyYW0ge05hdGl2ZUNvbnRyb2xMb29rdXB9IGxvb2t1cCBMb29rdXAgY2FsbGJhY2tzIGFuZCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyhsb29rdXAsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzID0gW10sIHNjcm9sbFRvID0gdHJ1ZSwgdGltZW91dCA9IDEwMDAwfSA9IGFyZ3NcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgIGlmICghYXR0ZW1wdGVkVWlTZWxlY3RvclNjcm9sbCkge1xuICAgICAgICAgIGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSB0cnVlXG4gICAgICAgICAgZm9yIChjb25zdCBzY3JvbGxTZWxlY3RvciBvZiBsb29rdXAuc2Nyb2xsU2VsZWN0b3JzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyhzY3JvbGxTZWxlY3Rvciwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2Nhbihsb29rdXAuZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQgPT09IDApIGJyZWFrXG4gICAgICBhd2FpdCB3YWl0KDEwMClcbiAgICB9IHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dClcblxuICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5ICR7bG9va3VwLmRlc2NyaXB0aW9ufWAsIGxhc3RFcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBuYXRpdmUgY29udGVudCBhcm91bmQgdGhlIGN1cnJlbnQgdmlld3BvcnQgc28gcmV0YWluZWQgb2Zmc2V0cyBhbmRcbiAgICogYmVsb3ctZm9sZCB0YXJnZXRzIGFyZSBib3RoIHJlYWNoYWJsZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIHRpbWVvdXQgYnVkZ2V0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBkaXJlY3RGaW5kIExvb2t1cCB0byByZXRyeSBhZnRlciBlYWNoIHNjcm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgY29udHJvbC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2NhbihkaXJlY3RGaW5kLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3QgdXBTY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG4gICAgY29uc3QgZG93blNjcm9sbFN0YXRlID0gdGhpcy5uZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKClcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUzsgaW5kZXggKz0gMSkge1xuICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydCh1cFNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcInVwXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQoZG93blNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcImRvd25cIilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIG5hdGl2ZSB2aWV3cG9ydCBzY2FuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IEZyZXNoIHNjcm9sbCBmYWxsYmFjayBzdGF0ZS5cbiAgICovXG4gIG5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyeUVsZW1lbnRTY3JvbGw6IHRydWUsXG4gICAgICB0cnlWaWV3cG9ydFNjcm9sbDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IG5hdGl2ZSBwb2xsaW5nIHdpdGhvdXQgQXBwaXVtJ3MgaW1wbGljaXQgd2FpdCBleHRlbmRpbmcgZXZlcnkgZmFpbGVkIHByb2JlLlxuICAgKiBAdGVtcGxhdGUgVFJlc3VsdCBSZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGltcGxpY2l0V2FpdE1zIEltcGxpY2l0IHdhaXQgZHVyYXRpb24gdG8gYXBwbHkgZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRSZXN1bHQ+fSBjYWxsYmFjayBXb3JrIHRoYXQgb3ducyBpdHMgb3duIHBvbGxpbmcgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhOYXRpdmVJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdGltZW91dHMgPSAvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRzfSAqLyAoYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5nZXRUaW1lb3V0cygpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiBpbXBsaWNpdFdhaXRNc30pKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKC8qKiBAdHlwZSB7TmF0aXZlVGltZW91dE9wdGlvbnN9ICovICh7aW1wbGljaXQ6IHRpbWVvdXRzLmltcGxpY2l0fSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpc2libGUgbmF0aXZlIHZpZXdwb3J0IHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHBhcmFtIHtOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvbn0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBzY3JvbGwgdGhlIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBBcHBpdW0gcGVyZm9ybXMgdGhlIGdlc3R1cmUuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVWaWV3cG9ydChzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgd2luZG93UmVjdCA9IC8qKiBAdHlwZSB7TmF0aXZlV2luZG93UmVjdH0gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkud2luZG93KCkuZ2V0UmVjdCgpKVxuICAgIGNvbnN0IGhvcml6b250YWxJbnNldCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC53aWR0aCAqIDAuMSkpXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuMikpXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCB3aW5kb3dSZWN0LndpZHRoIC0gaG9yaXpvbnRhbEluc2V0ICogMilcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3QuaGVpZ2h0ICogMC42KSlcblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsICYmIHNjcm9sbENvbnRhaW5lclRlc3RJRHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzY3JvbGxDb250YWluZXJUZXN0SUQgb2Ygc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlRWxlbWVudChzY3JvbGxDb250YWluZXJUZXN0SUQsIGRpcmVjdGlvbilcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IGhvcml6b250YWxJbnNldCxcbiAgICAgICAgICBwZXJjZW50OiAwLjc1LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZGlkU2Nyb2xsID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclggPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueCArIHdpbmRvd1JlY3Qud2lkdGggLyAyKVxuICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuNzggOiAwLjI4KSlcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIChkaXJlY3Rpb24gPT09IFwiZG93blwiID8gMC4yOCA6IDAuNzgpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlKG5ldyBDb21tYW5kKE5hbWUuQUNUSU9OUykuc2V0UGFyYW1ldGVyKFwiYWN0aW9uc1wiLCBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7ZHVyYXRpb246IDEwMCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogc3RhcnRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJEb3duXCJ9LFxuICAgICAgICAgIHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgdHlwZTogXCJwb2ludGVyTW92ZVwiLCB4OiBjZW50ZXJYLCB5OiBlbmRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJVcFwifVxuICAgICAgICBdLFxuICAgICAgICBpZDogXCJuYXRpdmUgc2Nyb2xsIGZpbmdlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcG9pbnRlclR5cGU6IFwidG91Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcInBvaW50ZXJcIlxuICAgICAgfVxuICAgIF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYSBzcGVjaWZpYyBuYXRpdmUgQW5kcm9pZCBlbGVtZW50IGJ5IHRlc3QgaWQgd2hlbiBBcHBpdW0gZXhwb3NlcyBpdCBhcyBhIHNjcm9sbCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBBcHBpdW0gcmVwb3J0ZWQgbW9yZSBjb250ZW50IHRvIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZUVsZW1lbnQodGVzdElkLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGVsZW1lbnRJZDogYXdhaXQgc2Nyb2xsRWxlbWVudC5nZXRJZCgpLFxuICAgICAgcGVyY2VudDogMC43NVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGlkU2Nyb2xsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYW4gb2Zmc2NyZWVuIEFuZHJvaWQgY29udHJvbCBpbnRvIGEgU2Nyb2xsVmlldy1iYWNrZWQgbmF0aXZlIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpU2VsZWN0b3IgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgY29udHJvbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBVaUF1dG9tYXRvciBhdHRlbXB0cyB0aGUgc2Nyb2xsLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVWlTZWxlY3RvckludG9WaWV3KHVpU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlU2VsZWN0b3JzID0gW1xuICAgICAgLi4uc2Nyb2xsQ29udGFpbmVyVGVzdElEcy5tYXAoKHNjcm9sbENvbnRhaW5lclRlc3RJRCkgPT4gYW5kcm9pZFJlc291cmNlSWRTZWxlY3RvcihzY3JvbGxDb250YWluZXJUZXN0SUQpKSxcbiAgICAgIFwibmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpXCJcbiAgICBdXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBsYXN0RXJyb3JcblxuICAgIGZvciAoY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9yIG9mIHNjcm9sbGFibGVTZWxlY3RvcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYG5ldyBVaVNjcm9sbGFibGUoJHtzY3JvbGxhYmxlU2VsZWN0b3J9KS5zY3JvbGxJbnRvVmlldygke3VpU2VsZWN0b3J9KWApKVxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsYXN0RXJyb3IpIHRocm93IGxhc3RFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
|