@dbx-tools/appkit-mastra 0.9.5 → 0.9.6
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 +16 -18
- package/index.ts +1 -3
- package/lib/index.d.ts +1 -3
- package/lib/index.js +2 -3
- package/lib/src/agents.d.ts +2 -2
- package/lib/src/agents.js +6 -6
- package/lib/src/chart.js +23 -23
- package/lib/src/evaluation.js +3 -3
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +20 -20
- package/lib/src/memory.js +9 -26
- package/lib/src/mlflow.js +4 -4
- package/lib/src/model.js +4 -4
- package/lib/src/monty-sandbox.js +6 -6
- package/lib/src/observability.js +3 -3
- package/lib/src/plugin.js +26 -21
- package/lib/src/remote-skills.js +20 -30
- package/lib/src/sandbox.js +10 -10
- package/lib/src/server.js +5 -5
- package/lib/src/serving-sanitize.js +12 -9
- package/lib/src/serving.js +8 -8
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +3 -3
- package/lib/src/workspaces.js +9 -9
- package/lib/src/writer.js +3 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/src/agents.ts +8 -8
- package/src/chart.ts +24 -24
- package/src/evaluation.ts +2 -2
- package/src/genie.ts +20 -20
- package/src/memory.ts +11 -27
- package/src/mlflow.ts +3 -3
- package/src/model.ts +3 -3
- package/src/monty-sandbox.ts +5 -5
- package/src/observability.ts +2 -2
- package/src/plugin.ts +30 -20
- package/src/remote-skills.ts +36 -38
- package/src/sandbox.ts +9 -9
- package/src/server.ts +4 -4
- package/src/serving-sanitize.ts +11 -13
- package/src/serving.ts +7 -7
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +2 -2
- package/src/workspaces.ts +8 -8
- package/src/writer.ts +2 -2
- package/lib/src/pagination.d.ts +0 -33
- package/lib/src/pagination.js +0 -36
- package/src/pagination.ts +0 -47
package/lib/src/agents.js
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
* @module
|
|
16
16
|
*/
|
|
17
17
|
import { ConfigurationError } from "@databricks/appkit";
|
|
18
|
-
import {
|
|
19
|
-
import { object,
|
|
18
|
+
import { toolkitEntries } from "@dbx-tools/appkit";
|
|
19
|
+
import { object, stringUtils } from "@dbx-tools/shared-core";
|
|
20
20
|
import { Agent } from "@mastra/core/agent";
|
|
21
21
|
import { MASTRA_RESOURCE_ID_KEY } from "@mastra/core/request-context";
|
|
22
22
|
import { createTool } from "@mastra/core/tools";
|
|
@@ -76,7 +76,7 @@ export function tool(opts) {
|
|
|
76
76
|
* words don't collide in traces. Stable across runs.
|
|
77
77
|
*/
|
|
78
78
|
function deriveToolId(description) {
|
|
79
|
-
return
|
|
79
|
+
return stringUtils.toUniqueSlug(description, { fallbackPrefix: "tool" });
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
82
|
* Identity helper that brands a definition as a Mastra agent. Mirrors
|
|
@@ -426,7 +426,7 @@ function resolveDefinitions(config) {
|
|
|
426
426
|
/** Derive a registry id from a definition's `name`, with a fallback. */
|
|
427
427
|
function deriveAgentKey(def, index) {
|
|
428
428
|
if (def.name) {
|
|
429
|
-
const slug =
|
|
429
|
+
const slug = stringUtils.toIdentifier(def.name);
|
|
430
430
|
if (slug)
|
|
431
431
|
return slug;
|
|
432
432
|
}
|
|
@@ -578,7 +578,7 @@ function adaptPluginToolkit(plugin, pluginName) {
|
|
|
578
578
|
};
|
|
579
579
|
}
|
|
580
580
|
function toolkitEntriesFromDefinitions(pluginName, definitions, options = {}) {
|
|
581
|
-
return
|
|
581
|
+
return toolkitEntries.entries(pluginName, definitions, options);
|
|
582
582
|
}
|
|
583
583
|
function isPromiseLike(value) {
|
|
584
584
|
return typeof value?.then === "function";
|
|
@@ -626,4 +626,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
|
|
|
626
626
|
},
|
|
627
627
|
});
|
|
628
628
|
}
|
|
629
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQVUsT0FBTyxJQUFJLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBTyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPN0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUloRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFtQmxELHlFQUF5RTtBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBdUI7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUs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QUFDLEdBQUcsQ0FBQyxVQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsR0FBRyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUM7Z0JBQ0UsR0FBRyxFQUFFO29CQUNILFdBQVcsRUFBRTt3QkFDWCxZQUFZLEVBQUUsTUFBTSxLQUFLLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUk7d0JBQ2hFLGVBQWUsRUFBRSxNQUFNLEtBQUssYUFBYSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssSUFBSTt3QkFDN0UsY0FBYyxFQUFFLFdBQVcsQ0FBQyxVQUFVO3FCQUN2QztpQkFDRjthQUNGO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtZQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUtMLENBQUM7WUFDZCxNQUFNLFVBQVUsR0FBRyxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxDQUFDLGdCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUU7Z0JBQzlFLEdBQUcsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMxRCxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQgcmVnaXN0cmF0aW9uIGZvciB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uXG4gKlxuICogTWlycm9ycyB0aGUgc2hhcGUgb2YgdGhlIEFwcEtpdCBgYWdlbnRzYCBwbHVnaW4gKGBjb25maWcuYWdlbnRzYCBtYXBcbiAqIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LCBkdWFsLWZvcm0gYHRvb2xzYCBhY2NlcHRpbmcgYSBwbGFpblxuICogcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2spLiBSZXNvbHZlcyBlYWNoIGRlZmluaXRpb25cbiAqIGludG8gYSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZSBkdXJpbmcgcGx1Z2luIHNldHVwOyB1c2VyLXN1cHBsaWVkXG4gKiB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBleGFjdGx5IG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwIGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnMuXG4gKlxuICogV2hlbiBubyBhZ2VudHMgYXJlIHJlZ2lzdGVyZWQgdGhlIHBsdWdpbiBmYWxscyBiYWNrIHRvIGEgc2luZ2xlXG4gKiBidWlsdC1pbiBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nXG4gKiBzdHJlYW1hYmxlIGFnZW50IGZvciBkZW1vcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICBQbHVnaW5Ub29sa2l0UHJvdmlkZXIsXG4gIFRvb2xraXRFbnRyeSxcbiAgVG9vbGtpdE9wdGlvbnMgYXMgQXBwS2l0VG9vbGtpdE9wdGlvbnMsXG4gIFRvb2xQcm92aWRlcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4sIHRvb2xraXQgYXMgYXBwa2l0VG9vbGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50Q29uZmlnLFxuICBBZ2VudEV4ZWN1dGlvbk9wdGlvbnMsXG4gIEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBUb29sc0lucHV0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgeyBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlCdWlsZGVyIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsLCBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV29ya3NwYWNlIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZy50b1VuaXF1ZVNsdWcoZGVzY3JpcHRpb24sIHsgZmFsbGJhY2tQcmVmaXg6IFwidG9vbFwiIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IGhlbHBlciB0aGF0IGJyYW5kcyBhIGRlZmluaXRpb24gYXMgYSBNYXN0cmEgYWdlbnQuIE1pcnJvcnNcbiAqIEFwcEtpdCdzIGBjcmVhdGVBZ2VudChkZWYpYCBzbyB0aGUgcmVnaXN0cmF0aW9uIHNoYXBlIG1hdGNoZXM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHN1cHBvcnQgPSBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgbW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7IHJldHVybiB7IC4uLiB9OyB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBBZGRzIHRoZSBwYWNrYWdlJ3MgZGVmYXVsdCB3b3Jrc3BhY2Ugd2hlbiB0aGUgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIFRoYXRcbiAqIHdvcmtzcGFjZSBjYXJyaWVzIERhdGFicmlja3Mgc2tpbGwgbW91bnRzIGFuZCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZFxuICogZXhlY3V0aW9uLiBBbiBleHBsaWNpdCB3b3Jrc3BhY2UgcmVtYWlucyB0aGUgY2FsbGVyJ3MgY29tcGxldGUgb3ZlcnJpZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBZ2VudDxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbiAgVERlZmluaXRpb24gZXh0ZW5kcyBNYXN0cmFBZ2VudERlZmluaXRpb248VFJlcXVlc3RDb250ZXh0PiA9XG4gICAgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4sXG4+KGRlZjogVERlZmluaXRpb24pOiBURGVmaW5pdGlvbiB7XG4gIGlmIChkZWYud29ya3NwYWNlKSByZXR1cm4geyAuLi5kZWYgfTtcbiAgY29uc3Qgd29ya3NwYWNlID0gY3JlYXRlV29ya3NwYWNlKCk7XG4gIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gIHJldHVybiB7IC4uLmRlZiwgd29ya3NwYWNlIH07XG59XG5cbi8qKlxuICogQnJhbmQgZm9yIGEge0BsaW5rIFdvcmtzcGFjZX0gdGhhdCBgY3JlYXRlQWdlbnRgIGJ1aWx0IHdpdGggbm8gY2FsbGVyXG4gKiBvcHRpb25zLCBzbyB7QGxpbmsgYnVpbGRBZ2VudHN9IG1heSByZWJ1aWxkIGl0IHdpdGggc3RhcnR1cC1wcm92aXNpb25lZFxuICogYGV4dHJhU2tpbGxQYXRoc2AgKGEgY2FsbGVyLXN1cHBsaWVkIHdvcmtzcGFjZSBpcyBuZXZlciB0b3VjaGVkKS5cbiAqL1xuY29uc3QgREVGQVVMVF9XT1JLU1BBQ0UgPSBTeW1ib2wuZm9yKFwiZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvZGVmYXVsdC13b3Jrc3BhY2VcIik7XG5cbi8qKiBCcmFuZCBgd29ya3NwYWNlYCBhcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHQuICovXG5mdW5jdGlvbiBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSk6IHZvaWQge1xuICAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSA9IHRydWU7XG59XG5cbi8qKiBXaGV0aGVyIGB3b3Jrc3BhY2VgIHdhcyBhdXRvLWNyZWF0ZWQgYnkge0BsaW5rIGNyZWF0ZUFnZW50fS4gKi9cbmZ1bmN0aW9uIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbih3b3Jrc3BhY2UgJiYgKHdvcmtzcGFjZSBhcyB1bmtub3duIGFzIFJlY29yZDxzeW1ib2wsIGJvb2xlYW4+KVtERUZBVUxUX1dPUktTUEFDRV0pO1xufVxuXG4vKipcbiAqIEZpbHRlciAvIHJlbmFtZSBvcHRpb25zIGFjY2VwdGVkIGJ5IGV2ZXJ5IHBsdWdpbidzIGAudG9vbGtpdCgpYFxuICogbWV0aG9kLCBkaXJlY3RseSBzb3VyY2VkIGZyb20gQXBwS2l0J3MgcHVibGljIGJldGEgY29udHJhY3QuXG4gKi9cbmV4cG9ydCB0eXBlIFRvb2xraXRPcHRpb25zID0gQXBwS2l0VG9vbGtpdE9wdGlvbnM7XG5cbi8qKlxuICogVG9vbGtpdCBwcm92aWRlciBzaGFwZSBldmVyeSBlbnRyeSBpbiB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcFxuICogZXhwb3Nlcy4gSWRlbnRpY2FsIHRvIEFwcEtpdCdzIGBQbHVnaW5Ub29sa2l0UHJvdmlkZXJgIC0gYW55IEFwcEtpdFxuICogcGx1Z2luIHRoYXQgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGdldEFnZW50VG9vbHNgICsgYGV4ZWN1dGVBZ2VudFRvb2xgICsgYHRvb2xraXRgKSBpcyByZWFjaGFibGVcbiAqIHRocm91Z2ggdGhpcyBzdXJmYWNlIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIFJldHVybnMgYSBNYXN0cmEtc2hhcGVkIHRvb2xzIHJlY29yZCBhZGFwdGVkIGZyb20gdGhlIHBsdWdpbidzXG4gICAqIGFnZW50IHRvb2xzLiBFYWNoIHRvb2wgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggdGhlIHBsdWdpbidzXG4gICAqIGBleGVjdXRlQWdlbnRUb29sYCBzbyBPQk8gYXV0aCBhbmQgdGVsZW1ldHJ5IHNwYW5zIHN0YXkgaW50YWN0LlxuICAgKi9cbiAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xufVxuXG4vKipcbiAqIFBsdWdpbiBtYXAgaGFuZGVkIHRvIHRoZSBmdW5jdGlvbiBmb3JtIG9mXG4gKiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luc2BcbiAqIHR5cGUgZXhhY3RseTogYSBzdHJpbmcta2V5ZWQgcmVjb3JkIHdoZXJlIGV2ZXJ5IHZhbHVlIGV4cG9zZXNcbiAqIGAudG9vbGtpdChvcHRzKWAuXG4gKlxuICogSW1wbGVtZW50ZWQgYXMgYSBydW50aW1lIFByb3h5IHRoYXQgYXV0by1kaXNjb3ZlcnMgYW55IHJlZ2lzdGVyZWRcbiAqIEFwcEtpdCBwbHVnaW4gaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgYW5hbHl0aWNzYCwgYGZpbGVzYCwgYGxha2ViYXNlYCwgYGdlbmllYCwgcGx1cyBhbnkgdGhpcmQtcGFydHlcbiAqIHBsdWdpbiB0aGF0IGRvZXMgdGhlIHNhbWUpLiBVbmtub3duIG5hbWVzIHJlc29sdmUgdG8gYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUsIHNvIGd1YXJkIHdpdGggYD8uYCBhbmQgYD8/IHt9YCB3aGVuIHNwcmVhZGluZyBmcm9tIGFcbiAqIHBsdWdpbiB0aGF0IG1heSBub3QgYmUgcmVnaXN0ZXJlZCBpbiBldmVyeSBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBhc3luYyB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmFuYWx5dGljcy50b29sa2l0KCkpLFxuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuZmlsZXMudG9vbGtpdCh7IG9ubHk6IFtcInVwbG9hZHMucmVhZFwiXSB9KSksXG4gKiAgICAgICBnZXRfd2VhdGhlcjogdG9vbCh7XG4gKiAgICAgICAgIGRlc2NyaXB0aW9uOiBcIldlYXRoZXJcIixcbiAqICAgICAgICAgc2NoZW1hOiB6Lm9iamVjdCh7IGNpdHk6IHouc3RyaW5nKCkgfSksXG4gKiAgICAgICAgIGV4ZWN1dGU6IGFzeW5jICh7IGNpdHkgfSkgPT4gYFN1bm55IGluICR7Y2l0eX1gLFxuICogICAgICAgfSksXG4gKiAgICAgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVBsdWdpbnMgPSBSZWNvcmQ8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLnRvb2xzfS4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzRm4gPSAocGx1Z2luczogTWFzdHJhUGx1Z2lucykgPT4gTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi53b3Jrc3BhY2V9OyBgdW5kZWZpbmVkYCBkaXNhYmxlcyBpdCBmb3IgdGhpcyBhZ2VudC4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXIgPSAoKSA9PiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBjb2RlLWRlZmluZWQgTWFzdHJhIGFnZW50LiBNaXJyb3JzIHRoZSBzaGFwZSBBcHBLaXQncyBgYWdlbnRzYFxuICogcGx1Z2luIHVzZXMgZm9yIGBBZ2VudERlZmluaXRpb25gLiBUaGUgcmVnaXN0cnkga2V5IHVuZGVyXG4gKiBgY29uZmlnLmFnZW50c2AgaXMgdGhlIGBhZ2VudElkYCB0aGUgY2xpZW50IHN0cmVhbXMgYWdhaW5zdDsgYG5hbWVgXG4gKiBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbCAoZGVmYXVsdHMgdG8gdGhlIGtleSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhQWdlbnREZWZpbml0aW9uPFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuPiB7XG4gIC8qKiBEaXNwbGF5IG5hbWUgdXNlZCBhcyBgQWdlbnQubmFtZWAuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RyeSBrZXkuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBsb25nLWZvcm0gZGVzY3JpcHRpb247IHN1cmZhY2VkIGFzIGBBZ2VudC5kZXNjcmlwdGlvbmAuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBzeXN0ZW0gaW5zdHJ1Y3Rpb25zLiAqL1xuICBpbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBzY2hlbWEgdGhhdCB2YWxpZGF0ZXMgYW5kIHR5cGVzIGFwcGxpY2F0aW9uIHJlcXVlc3QgY29udGV4dC4gKi9cbiAgcmVxdWVzdENvbnRleHRTY2hlbWE/OiBBZ2VudENvbmZpZzxcbiAgICBzdHJpbmcsXG4gICAgVG9vbHNJbnB1dCxcbiAgICB1bmRlZmluZWQsXG4gICAgVFJlcXVlc3RDb250ZXh0XG4gID5bXCJyZXF1ZXN0Q29udGV4dFNjaGVtYVwiXTtcbiAgLyoqXG4gICAqIE1hc3RyYS1uYXRpdmUgcGVyLWNhbGwgYXBwcm92YWwgZ2F0ZSBmb3IgdGhpcyBhZ2VudCdzIHRvb2xzLiBTdXBwb3J0cyBhblxuICAgKiBhc3luYyBDbGFzc2lmaWVyLWJhY2tlZCBmdW5jdGlvbjsgdG9vbC1sZXZlbCBhcHByb3ZhbCByZW1haW5zIGF1dGhvcml0YXRpdmUuXG4gICAqL1xuICByZXF1aXJlVG9vbEFwcHJvdmFsPzogQWdlbnRFeGVjdXRpb25PcHRpb25zW1wicmVxdWlyZVRvb2xBcHByb3ZhbFwiXTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBtb2RlbCBvdmVycmlkZS5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGZhbGxzIGJhY2sgdG8gdGhlIHdvcmtzcGFjZVxuICAgKiAgIGAvc2VydmluZy1lbmRwb2ludHNgIHJlc29sdmVyIHRoYXQge0BsaW5rIGJ1aWxkTW9kZWx9IGNvbmZpZ3VyZXNcbiAgICogICBmcm9tIHRoZSBwZXItcmVxdWVzdCBgV29ya3NwYWNlQ2xpZW50YC5cbiAgICogLSBgc3RyaW5nYDogc2hvcnRoYW5kIGZvciBcInVzZSB0aGUgZGVmYXVsdCByZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLW1ldGEtbGxhbWEtMy0zLTcwYi1pbnN0cnVjdFwiYCkuXG4gICAqIC0gQW55IG90aGVyIE1hc3RyYSBgRHluYW1pY0FyZ3VtZW50PE1hc3RyYU1vZGVsQ29uZmlnPmA6IHBhc3NlZFxuICAgKiAgIHN0cmFpZ2h0IHRocm91Z2ggdG8gYEFnZW50Lm1vZGVsYC4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsXG4gICAqICAgY29udHJvbCBvdmVyIGF1dGggb3IgcHJvdmlkZXJJZC5cbiAgICovXG4gIG1vZGVsPzogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJtb2RlbFwiXSB8IHN0cmluZztcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0b29sIHJlY29yZC4gRWl0aGVyIGEgcGxhaW4gbWFwIG9yIGEgY2FsbGJhY2sgdGhhdFxuICAgKiByZWNlaXZlcyB0aGUgdHlwZWQge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHNpYmxpbmctcGx1Z2luIGluZGV4IGFuZFxuICAgKiByZXR1cm5zIGEgbWFwLiBUaGUgY2FsbGJhY2sgcnVucyBleGFjdGx5IG9uY2UgYXQgYWdlbnQgc2V0dXA7IHRoZVxuICAgKiByZXN1bHQgaXMgY2FjaGVkIGZvciB0aGUgYWdlbnQncyBsaWZldGltZS5cbiAgICovXG4gIHRvb2xzPzogTWFzdHJhVG9vbHMgfCBNYXN0cmFUb29sc0ZuO1xuICAvKipcbiAgICogUGVyLWFnZW50IHNlbWFudGljIHJlY2FsbCAoUGdWZWN0b3IpIG92ZXJyaWRlLiBDYXNjYWRlcyBmcm9tXG4gICAqIGBjb25maWcubWVtb3J5YDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcubWVtb3J5YC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgKipzaGFyZXMgdGhlIHBsdWdpbi1sZXZlbCBzaW5nbGV0b24gYFBnVmVjdG9yYFxuICAgKiAgIGluc3RhbmNlKiogKGNyb3NzLWFnZW50IHNlbWFudGljIHJlY2FsbCBhY3Jvc3MgdGhlIHNhbWUgaW5kZXgpLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc2VtYW50aWMgcmVjYWxsIGZvciB0aGlzIGFnZW50IG9ubHkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgdXNpbmcgdGhlIHNoYXJlZCBzaW5nbGV0b24gKHNhbWUgYXMgZGVmYXVsdCB3aGVuXG4gICAqICAgcGx1Z2luIG1lbW9yeSBpcyBlbmFibGVkOyB1c2VmdWwgdG8gb3B0IGluIHdoZW4gcGx1Z2luIGRpc2FibGVkKS5cbiAgICogLSB7QGxpbmsgTWFzdHJhTWVtb3J5Q29uZmlnfSBvYmplY3Q6IGRlZGljYXRlZCBgUGdWZWN0b3JgIGZvciB0aGlzXG4gICAqICAgYWdlbnQgKHByaXZhdGUgcmVjYWxsIGluZGV4KS4gQnlwYXNzZXMgdGhlIHNoYXJlZCBzaW5nbGV0b24uXG4gICAqL1xuICBtZW1vcnk/OiBib29sZWFuIHwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdGhyZWFkL21lc3NhZ2Ugc3RvcmFnZSAoYFBvc3RncmVzU3RvcmVgKSBvdmVycmlkZS5cbiAgICogQ2FzY2FkZXMgZnJvbSBgY29uZmlnLnN0b3JhZ2VgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5zdG9yYWdlYC4gV2hlbiB0aGF0J3NcbiAgICogICBlbmFibGVkLCB0aGUgYWdlbnQgZ2V0cyBpdHMgKipvd24gcGVyLWFnZW50IGBQb3N0Z3Jlc1N0b3JlYCoqXG4gICAqICAga2V5ZWQgYnkge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHNvIHRocmVhZHMgYW5kXG4gICAqICAgbWVzc2FnZXMgc3RheSBpc29sYXRlZCBiZXR3ZWVuIGFnZW50cyBpbiB0aGUgc2FtZSBkYXRhYmFzZS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHN0b3JhZ2UgZm9yIHRoaXMgYWdlbnQgb25seSAocHVyZWx5IGluLW1lbW9yeSkuXG4gICAqIC0gYHRydWVgOiBlbmFibGUgd2l0aCB0aGUgcGVyLWFnZW50IGRlZmF1bHQgc2NoZW1hLlxuICAgKiAtIHtAbGluayBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGV9IG9iamVjdDogZGVkaWNhdGVkXG4gICAqICAgYFBvc3RncmVzU3RvcmVgIGNvbmZpZyAoY3VzdG9tIHNjaGVtYSwgY29ubmVjdGlvbiwgZXRjLikuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSBmb3IgdGhpcyBhZ2VudCAoZmlsZXN5c3RlbSwgc2FuZGJveCwgb3Igb3RoZXJcbiAgICogcHJvdmlkZXJzKS4gQXNzaXN0YW50IHNraWxscyBmcm9tIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGhzIGFyZSB3aXJlZFxuICAgKiB2aWEge0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uXG4gICAqL1xuICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2UgfCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyO1xufVxuXG4vKiogVHlwZS1lcmFzZWQgcmVnaXN0cnkgbWVtYmVyOyBlYWNoIGRlZmluaXRpb24gcmV0YWlucyB0eXBpbmcgYXQgYGNyZWF0ZUFnZW50YC4gKi9cbmV4cG9ydCB0eXBlIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiA9IE1hc3RyYUFnZW50RGVmaW5pdGlvbjxhbnk+O1xuXG4vKipcbiAqIERpc3RyaWJ1dGl2ZSBgT21pdGAgc28gdW5pb25zIGluIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCAvXG4gKiBgUGdWZWN0b3JDb25maWdgIGtlZXAgdGhlaXIgZGlzY3JpbWluYW50cyBhZnRlciB0aGUgb3ZlcnJpZGUgdHlwZXNcbiAqIHN0cmlwIGBpZGAuIFRoZSBidWlsdC1pbiBgT21pdGAgY29sbGFwc2VzIHVuaW9ucyB0byBvbmUgc2hhcGUgd2l0aFxuICogY29tbW9uIGZpZWxkcyBvbmx5LCB3aGljaCBsb3NlcyB0aGUgY29ubmVjdGlvbi1zdHlsZSBkaXNjcmltaW5hbnRzLlxuICovXG50eXBlIERpc3RyaWJ1dGl2ZU9taXQ8VCwgSyBleHRlbmRzIGtleW9mIG5ldmVyPiA9IFQgZXh0ZW5kcyB1bmtub3duID8gT21pdDxULCBLPiA6IG5ldmVyO1xuXG4vKipcbiAqIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHN0b3JhZ2Ugc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleSBzbyB0cmFjZXMgc3RheSBzdGFibGUuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UG9zdGdyZXNTdG9yZUNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIGBQZ1ZlY3RvckNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCB2ZWN0b3Igc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBnVmVjdG9yQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKiBIb3cgYW4gYWdlbnQncyB1bnBpbm5lZCBtb2RlbCBpcyByZXNvbHZlZC4gKi9cbmV4cG9ydCB0eXBlIEFnZW50RGVmYXVsdE1vZGVsID1cbiAgeyBraW5kOiBcImF1dG9cIiB9IHwgeyBraW5kOiBcImNvbmZpZ3VyZWRcIjsgbW9kZWw6IHN0cmluZyB9IHwgeyBraW5kOiBcImR5bmFtaWNcIiB9O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRGVmYXVsdCBtb2RlbCBpbnRlbnQgcGVyIGFnZW50IGlkLiBBbiB1bmNvbmZpZ3VyZWQgYWdlbnQgaXMgYFwiYXV0b1wiYCBhbmRcbiAgICogcmVzb2x2ZXMgdGhlIGhpZ2hlc3QtcmFua2VkIGxpdmUgZW5kcG9pbnQ7IGEgc3RyaW5nIGlzIGBcImNvbmZpZ3VyZWRcImA7IGFcbiAgICogY3VzdG9tIGZ1bmN0aW9uIGlzIGBcImR5bmFtaWNcImAuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIEFnZW50RGVmYXVsdE1vZGVsPjtcbiAgLyoqXG4gICAqIEFtYmllbnQgdG9vbHMgc2hhcmVkIGFjcm9zcyBldmVyeSBhZ2VudCAodGhlIGJ1aWx0LWluIHN5c3RlbSB0b29sc1xuICAgKiBzcHJlYWQgd2l0aCBgY29uZmlnLnRvb2xzYCkuIFN1cmZhY2VkIHNvIHRoZSBvcHRpb25hbCBNQ1Agc2VydmVyXG4gICAqIGNhbiByZS1leHBvc2UgdGhlbSB3aGVuIHtAbGluayBNYXN0cmFNY3BDb25maWcudG9vbHN9IGlzIGVuYWJsZWQuXG4gICAqL1xuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogRmFsbGJhY2sgYWdlbnQgaWQgdXNlZCB3aGVuIGBjb25maWcuYWdlbnRzYCBpcyBvbWl0dGVkIGVudGlyZWx5LiAqL1xuZXhwb3J0IGNvbnN0IEZBTExCQUNLX0FHRU5UX0lEID0gXCJkZWZhdWx0XCI7XG5cbi8qKlxuICogRGVmYXVsdCBwZXItdHVybiBzdGVwIGNlaWxpbmcgYXBwbGllZCB0byBldmVyeSByZWdpc3RlcmVkIGFnZW50XG4gKiB3aGVuIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRNYXhTdGVwc30gaXMgdW5zZXQuIFNpemVkIHRvXG4gKiBmaXQgYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWBcbiAqIGNhbGxzICsgYHByZXBhcmVfY2hhcnRgIHBlciBkYXRhc2V0ICsgdGhlIGZpbmFsLXRleHQgcmVwbHkpIHdpdGhcbiAqIGhlYWRyb29tIGZvciB0aGUgbW9kZWwgdG8gY2hhaW4gYSBjb3VwbGUgb2YgZm9sbG93LXVwcyBiZWZvcmVcbiAqIGFuc3dlcmluZyAtIHdlbGwgYWJvdmUgTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZlxuICogNSwgd2hpY2ggd291bGQgY3V0IG11bHRpLXN0ZXAgb3JjaGVzdHJhdGlvbiBvZmYgbWlkLWxvb3AuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyA9IDI1O1xuXG5jb25zdCBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMgPSBgWW91IGFyZSBhIGRhdGEgYW5hbHlzdC4gVGhlIHVzZXIgd2lsbCBhc2sgcXVlc3Rpb25zIGFib3V0XG5idXNpbmVzcyBtZXRyaWNzIGFuZCBtYXkgc2hhcmUgcGVyc29uYWwgcHJlZmVyZW5jZXMgeW91IHNob3VsZCByZW1lbWJlciBhY3Jvc3MgdHVybnMuXG5cblJ1bGVzOlxuXG4xLiBRdW90ZSBudW1iZXJzIGV4YWN0bHkuIE5ldmVyIGludmVudCBkYXRhLlxuMi4gV2hlbiB0aGUgdXNlciBzdGF0ZXMgYSBwcmVmZXJlbmNlIG9yIGR1cmFibGUgZmFjdCBhYm91dCB0aGVtc2VsdmVzXG4gICAoXCJJJ20gaW4gRVUgc28gdXNlIEVVUlwiLCBcImFsd2F5cyBzaG93IG1lIHRoZSBTUUxcIiksIGFja25vd2xlZGdlIHRoYXRcbiAgIHlvdSB3aWxsIHJlbWVtYmVyIGl0LlxuMy4gSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFuc3dlciwgYXNrIGEgY2xhcmlmeWluZ1xuICAgcXVlc3Rpb24gaW5zdGVhZCBvZiBndWVzc2luZy5gO1xuXG4vKipcbiAqIFN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBgaW5zdHJ1Y3Rpb25zYCB0byBjdXJiXG4gKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCBleGNlc3NpdmVcbiAqIGhlZGdpbmcsIHRocm93YXdheSBjbG9zZXJzKS4gQXBwZW5kZWQgcmF0aGVyIHRoYW4gcHJlcGVuZGVkIHNvIHRoZVxuICogYWdlbnQncyByb2xlL2NvbnRleHQgY29tZXMgZmlyc3Q7IHRoZSBtb2RlbCdzIHJlY2VuY3kgYmlhcyB0aGVuXG4gKiBoZWxwcyB0aGUgc3R5bGUgcnVsZXMgZG9taW5hdGUgdGhlIHJlc3BvbnNlIHN1cmZhY2UuXG4gKlxuICogT3ZlcnJpZGUgZ2xvYmFsbHkgdmlhIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuc3R5bGVJbnN0cnVjdGlvbnN9XG4gKiAocGFzcyBgZmFsc2VgIHRvIGRpc2FibGUgZW50aXJlbHksIG9yIGEgc3RyaW5nIHRvIHJlcGxhY2UpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgPSBbXG4gIFwiT3V0cHV0IHN0eWxlOlwiLFxuICBcIlwiLFxuICBcIlVzZSBtYXJrZG93biBmb3JtYXR0aW5nLCBpbmNsdWRpbmcgaGVhZGluZ3MsIGxpc3RzLCBhbmQgY29kZSBibG9ja3MuXCIsXG4gIFwiQXZvaWQgbGlzdHMgYW5kIGhlYWRlcnMgZm9yIHNob3J0IHJlcGxpZXMuXCIsXG4gIFwiUGxhaW4gcHJvc2UuXCIsXG4gIFRZUE9HUkFQSFlfUlVMRSxcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqIEFwcGVuZCB0aGUgc3R5bGUgYmxvY2sgd2l0aG91dCBuYXJyb3dpbmcgTWFzdHJhJ3MgbmF0aXZlIGluc3RydWN0aW9uIHNoYXBlcy4gKi9cbmZ1bmN0aW9uIGFwcGVuZFN0eWxlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50SW5zdHJ1Y3Rpb25zIHtcbiAgaWYgKCFzdHlsZSkgcmV0dXJuIGluc3RydWN0aW9ucztcbiAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYCR7aW5zdHJ1Y3Rpb25zLnRyaW1FbmQoKX1cXG5cXG4ke3N0eWxlfWA7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMuZXZlcnkoKGluc3RydWN0aW9uKSA9PiB0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgc3R5bGVdIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdHlsZSB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgfVxuICByZXR1cm4gW2luc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdHlsZSB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb21wb3NlIHN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHNoYXJlZCBzdHlsZVxuICogcG9saWN5IHdoaWxlIHByZXNlcnZpbmcgTWFzdHJhJ3MgbmF0aXZlIGdlbmVyaWMgaW5mZXJlbmNlLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGFnZW50SW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4pOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSB7XG4gIGlmICh0eXBlb2YgYWdlbnRJbnN0cnVjdGlvbnMgIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBhcHBlbmRTdHlsZUluc3RydWN0aW9ucyhhZ2VudEluc3RydWN0aW9ucywgc3R5bGUpIGFzIEFnZW50Q29uZmlnPFxuICAgICAgc3RyaW5nLFxuICAgICAgVG9vbHNJbnB1dCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFRSZXF1ZXN0Q29udGV4dFxuICAgID5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIH1cbiAgcmV0dXJuIChhc3luYyAoYXJncykgPT5cbiAgICBhcHBlbmRTdHlsZUluc3RydWN0aW9ucyhhd2FpdCBhZ2VudEluc3RydWN0aW9ucyhhcmdzKSwgc3R5bGUpKSBhcyBBZ2VudENvbmZpZzxcbiAgICBzdHJpbmcsXG4gICAgVG9vbHNJbnB1dCxcbiAgICB1bmRlZmluZWQsXG4gICAgVFJlcXVlc3RDb250ZXh0XG4gID5bXCJpbnN0cnVjdGlvbnNcIl07XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIGRlc2NyaXB0aW9uIGZvciBhbiBhZ2VudCB3aG9zZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gS2VwdFxuICogZ2VuZXJpYyAodGhlIGFnZW50J3Mgb3duIG5hbWUgaXMgdGhlIG9ubHkgcmVsaWFibGUgc2lnbmFsIGF0IGJ1aWxkXG4gKiB0aW1lKSBzbyBpdCByZWFkcyBzZW5zaWJseSBhcyB0aGUgYGFza188aWQ+YCBNQ1AgdG9vbCdzIGRlc2NyaXB0aW9uXG4gKiBhbmQgaW4gYWdlbnQgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBZ2VudERlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgQ29udmVyc2F0aW9uYWwgQUkgYWdlbnQgXCIke25hbWV9XCIuYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGV2ZXJ5IGVudHJ5IGluIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgTWFzdHJhIGBBZ2VudGBcbiAqIGluc3RhbmNlLiBXaGVuIGBjb25maWcuYWdlbnRzYCBpcyBvbWl0dGVkIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGFcbiAqIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGxcbiAqIHlpZWxkcyBhIHdvcmtpbmcgYWdlbnQuXG4gKlxuICogUGVyLWFnZW50IHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gaW5kZXggYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2luc1xuICogKGN1cnJlbnRseSBgZ2VuaWVgOyBleHRlbmQgYE1hc3RyYVBsdWdpbnNgIHRvIHN1cmZhY2UgbW9yZSkuXG4gKlxuICogQHRocm93cyB3aGVuIGBjb25maWcuZGVmYXVsdEFnZW50YCBpcyBzZXQgdG8gYW4gaWQgdGhhdCBpc24ndCBpbiB0aGVcbiAqICAgcmVzb2x2ZWQgcmVnaXN0cnk7IHRoaXMgaXMgYSB3aXJpbmcgYnVnLCBub3QgYSBydW50aW1lIGNvbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWdlbnRzKG9wdHM6IHtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZDtcbiAgbWVtb3J5QnVpbGRlcj86IE1lbW9yeUJ1aWxkZXI7XG4gIGxvZzogbG9nLkxvZ2dlcjtcbiAgLyoqXG4gICAqIExvY2FsIHNraWxsIHNjYW4gcGF0aHMgKHJlbW90ZSBza2lsbHMgcHJvdmlzaW9uZWQgdG8gYSB0ZW1wIGRpciBhdFxuICAgKiBzdGFydHVwKSBmb2xkZWQgaW50byBldmVyeSBhZ2VudCB0aGF0IHVzZXMgdGhlIGF1dG8tY3JlYXRlZCBkZWZhdWx0XG4gICAqIHdvcmtzcGFjZS5cbiAgICovXG4gIGV4dHJhU2tpbGxQYXRocz86IHN0cmluZ1tdO1xufSk6IFByb21pc2U8QnVpbHRBZ2VudHM+IHtcbiAgY29uc3QgeyBjb25maWcsIGNvbnRleHQsIG1lbW9yeUJ1aWxkZXIsIGxvZywgZXh0cmFTa2lsbFBhdGhzIH0gPSBvcHRzO1xuICBjb25zdCBkZWZpbml0aW9ucyA9IHJlc29sdmVEZWZpbml0aW9ucyhjb25maWcpO1xuICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucyk7XG4gIGNvbnN0IGRlZmF1bHRBZ2VudElkID0gY29uZmlnLmRlZmF1bHRBZ2VudCA/PyBpZHNbMF0gPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG5cbiAgY29uc3QgcGx1Z2lucyA9IGJ1aWxkUGx1Z2luc01hcChjb25maWcsIGNvbnRleHQpO1xuICAvLyBTeXN0ZW0tZGVmYXVsdCBhbWJpZW50IHRvb2xzIGV2ZXJ5IGFnZW50IGdldHMgb3V0IG9mIHRoZSBib3g6XG4gIC8vIGByZW5kZXJfZGF0YWAgZm9yIGlubGluZSB2aXN1YWxpemF0aW9ucyBhbmQgYHN1bW1hcml6ZWAgZm9yXG4gIC8vIG9mZmxvYWRpbmcgdGV4dCBjb25kZW5zaW5nIHRvIHRoZSBmYXN0IC8gc21hbGwgY2hhdCB0aWVyLiBUaGVcbiAgLy8gdXNlciBjYW4gc2hhZG93IGVpdGhlciBieSBpbmNsdWRpbmcgYSBzYW1lLW5hbWVkIHRvb2wgaW4gdGhlaXIgb3duXG4gIC8vIGBjb25maWcudG9vbHNgIG9yIHBlci1hZ2VudCBgdG9vbHNgLiBPcmRlciBpbiB7QGxpbmsgcmVzb2x2ZVRvb2xzfVxuICAvLyBpcyBgc3lzdGVtIC0+IHVzZXItYW1iaWVudCAtPiBwZXItYWdlbnRgLCBsYXN0IHdyaXRlIHdpbnMuXG4gIGNvbnN0IHN5c3RlbVRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICByZW5kZXJfZGF0YTogYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWcpLFxuICAgIHN1bW1hcml6ZTogYnVpbGRTdW1tYXJpemVUb29sKGNvbmZpZyksXG4gIH07XG4gIGNvbnN0IGFtYmllbnRUb29scyA9IHtcbiAgICAuLi5zeXN0ZW1Ub29scyxcbiAgICAuLi4oY29uZmlnLnRvb2xzID8/IHt9KSxcbiAgfTtcbiAgY29uc3Qgc3R5bGUgPSByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnKTtcbiAgLy8gRGVmYXVsdC1vbiBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIG1vZGVsIGNvcHlpbmcgdHVybi1zY29wZWRcbiAgLy8gY2hhcnRJZHMgZnJvbSBwcmlvciBhc3Npc3RhbnQgdG9vbCByZXN1bHRzIGludG8gdGhlIG5ld1xuICAvLyB0dXJuJ3MgYFtjaGFydDo8aWQ+XWAgbWFya2Vycy4gT3B0IG91dCBwZXItcGx1Z2luIHZpYVxuICAvLyBgY29uZmlnLnN0cmlwU3RhbGVDaGFydHM6IGZhbHNlYC5cbiAgY29uc3QgaW5wdXRQcm9jZXNzb3JzID0gW1xuICAgIC4uLihjb25maWcuc3RyaXBTdGFsZUNoYXJ0cyA9PT0gZmFsc2UgPyBbXSA6IFtzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yXSksXG4gIF07XG4gIGNvbnN0IGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIEFnZW50RGVmYXVsdE1vZGVsPiA9IHt9O1xuICBjb25zdCBhcHByb3ZhbEdhdGVkQnlBZ2VudDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBbaWQsIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoZGVmaW5pdGlvbnMpKSB7XG4gICAgY29uc3QgdG9vbHMgPSBhd2FpdCByZXNvbHZlVG9vbHMoZGVmLnRvb2xzLCBwbHVnaW5zLCBhbWJpZW50VG9vbHMpO1xuICAgIGxldCB3b3Jrc3BhY2UgPSByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoZGVmLndvcmtzcGFjZSk7XG4gICAgaWYgKFxuICAgICAgKGRlZi53b3Jrc3BhY2UgPT09IHVuZGVmaW5lZCAmJiAhd29ya3NwYWNlKSB8fFxuICAgICAgKChleHRyYVNraWxsUGF0aHM/Lmxlbmd0aCB8fCBjb25maWcuc2FuZGJveCAhPT0gdW5kZWZpbmVkKSAmJiBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKSlcbiAgICApIHtcbiAgICAgIHdvcmtzcGFjZSA9IGNyZWF0ZVdvcmtzcGFjZSh7XG4gICAgICAgIGV4dHJhU2tpbGxQYXRocyxcbiAgICAgICAgc2FuZGJveDpcbiAgICAgICAgICBjb25maWcuc2FuZGJveCA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5zYW5kYm94ID09PSB0cnVlID8gXCJkYXRhYnJpY2tzXCIgOiBjb25maWcuc2FuZGJveCxcbiAgICAgIH0pO1xuICAgICAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgICB9XG4gICAgY29uc3QgZ2F0ZWQgPSBhcHByb3ZhbEdhdGVkVG9vbElkcyh0b29scyk7XG4gICAgaWYgKGdhdGVkLmxlbmd0aCA+IDApIGFwcHJvdmFsR2F0ZWRCeUFnZW50LnB1c2goeyBhZ2VudElkOiBpZCwgdG9vbElkczogZ2F0ZWQgfSk7XG4gICAgY29uc3QgbWVtb3J5ID0gbWVtb3J5QnVpbGRlcj8uZm9yQWdlbnQoaWQsIGRlZik7XG4gICAgYWdlbnRzW2lkXSA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUpLFxuICAgICAgLi4uKGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSA/IHsgcmVxdWVzdENvbnRleHRTY2hlbWE6IGRlZi5yZXF1ZXN0Q29udGV4dFNjaGVtYSB9IDoge30pLFxuICAgICAgbW9kZWw6IHJlc29sdmVNb2RlbChjb25maWcsIGRlZi5tb2RlbCksXG4gICAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgICBtYXhTdGVwczogY29uZmlnLmFnZW50TWF4U3RlcHMgPz8gREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMsXG4gICAgICAgIHByb3ZpZGVyT3B0aW9uczogUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgIC4uLihkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IHJlcXVpcmVUb29sQXBwcm92YWw6IGRlZi5yZXF1aXJlVG9vbEFwcHJvdmFsIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0sXG4gICAgICB0b29scyxcbiAgICAgIC4uLihtZW1vcnkgPyB7IG1lbW9yeSB9IDoge30pLFxuICAgICAgLi4uKHdvcmtzcGFjZSA/IHsgd29ya3NwYWNlIH0gOiB7fSksXG4gICAgICBpbnB1dFByb2Nlc3NvcnMsXG4gICAgfSk7XG4gICAgLy8gU3VyZmFjZSB0aGUgZWZmZWN0aXZlIGRlZmF1bHQgbW9kZWwgcGVyIGFnZW50IHNvIG9wZXJhdG9ycyBjYW5cbiAgICAvLyBzZWUgYXQgYSBnbGFuY2Ugd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgd2l0aG91dFxuICAgIC8vIGhhdmluZyB0byBmaXJlIGEgcmVxdWVzdCBhbmQgaW5zcGVjdCBhIHRyYWNlLiBUaGUgdmFsdWUgaXMgdGhlXG4gICAgLy8gKnN0YXRpYyogZGVmYXVsdDsgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVzIChoZWFkZXIgLyBxdWVyeSAvXG4gICAgLy8gYm9keSkgYW5kIHRoZSB3b3Jrc3BhY2UtY2F0YWxvZ3VlIGZ1enp5IG1hdGNoIHN0aWxsIGFwcGx5IGF0XG4gICAgLy8gY2FsbCB0aW1lLlxuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnLCBkZWYpO1xuICAgIGRlZmF1bHRNb2RlbHNbaWRdID0gZGVmYXVsdE1vZGVsO1xuICAgIGxvZy5pbmZvKFwiYWdlbnQgcmVnaXN0ZXJlZFwiLCB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgZGVmYXVsdE1vZGVsOlxuICAgICAgICBkZWZhdWx0TW9kZWwua2luZCA9PT0gXCJjb25maWd1cmVkXCIgPyBkZWZhdWx0TW9kZWwubW9kZWwgOiBgPCR7ZGVmYXVsdE1vZGVsLmtpbmR9PmAsXG4gICAgICB0b29sczogT2JqZWN0LmtleXModG9vbHMpLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogRGVzY3JpYmUgaG93IGFuIGFnZW50IHJlc29sdmVzIGl0cyB1bnBpbm5lZCBtb2RlbDpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIGlzIGNvbmZpZ3VyZWQ7IGEgZnVuY3Rpb24gaXNcbiAqICAgICAgZHluYW1pYykuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEF1dG9tYXRpYyBsaXZlLWNhdGFsb2d1ZSByYW5raW5nIHdoZW4gbm9uZSBpcyBzZXQuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogYGRlZmF1bHRNb2RlbEZhbGxiYWNrc2AgcmVtYWlucyBhbiBvcGVyYXRvci1waW5uZWQgY2FuZGlkYXRlIGxpc3QgaW5zaWRlIHRoZVxuICogYXV0b21hdGljIGxpdmUgbG9va3VwOyBpdCBpcyBub3QgYWR2ZXJ0aXNlZCBhcyBhIG1vZGVsIHVudGlsIGF2YWlsYWJpbGl0eSBpc1xuICogY2hlY2tlZC5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLFxuKTogQWdlbnREZWZhdWx0TW9kZWwge1xuICBjb25zdCBlZmZlY3RpdmUgPSBkZWYubW9kZWwgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHJldHVybiB7IGtpbmQ6IFwiY29uZmlndXJlZFwiLCBtb2RlbDogZWZmZWN0aXZlIH07XG4gIGlmIChlZmZlY3RpdmUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsga2luZDogXCJkeW5hbWljXCIgfTtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgcmV0dXJuIGVudmlyb25tZW50ID8geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVudmlyb25tZW50IH0gOiB7IGtpbmQ6IFwiYXV0b1wiIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgYFJlY29yZDxpZCwgZGVmaW5pdGlvbj5gLiBBY2NlcHRzXG4gKiBhbnkgb2YgdGhlIHRocmVlIHNoYXBlcyBkb2N1bWVudGVkIG9uXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c306XG4gKlxuICogLSBSZWNvcmQgLSByZXR1cm5lZCBhcy1pcyB3aGVuIG5vbi1lbXB0eS5cbiAqIC0gU2luZ2xlIGRlZmluaXRpb24gKGRldGVjdGVkIHZpYSB0aGUgcmVxdWlyZWQgYGluc3RydWN0aW9uc2BcbiAqICAgZmllbGQpIC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgRkFMTEJBQ0tfQUdFTlRfSURgLlxuICogLSBBcnJheSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYGFnZW50XyR7aX1gOyBkdXBsaWNhdGVcbiAqICAgc2x1Z3MgZmFpbCBsb3VkbHkgc28gdXNlcnMga25vdyB0byBzZXQgZXhwbGljaXQgbmFtZXMuXG4gKlxuICogT21pdHRlZCBvciBlbXB0eSBpbnB1dHMgZmFsbCBiYWNrIHRvIGEgc2luZ2xlIGJ1aWx0LWluIGFuYWx5c3Qgc29cbiAqIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgcm91dGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEZWZpbml0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4ge1xuICBjb25zdCBpbnB1dCA9IGNvbmZpZy5hZ2VudHM7XG4gIGlmICghaW5wdXQpIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4gPSB7fTtcbiAgICBpbnB1dC5mb3JFYWNoKChkZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGRlcml2ZUFnZW50S2V5KGRlZiwgaSk7XG4gICAgICBpZiAob3V0W2tleV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgICBgbWFzdHJhOiBkdXBsaWNhdGUgYWdlbnQgaWQgXCIke2tleX1cIiBkZXJpdmVkIGZyb20gbmFtZSBcIiR7ZGVmLm5hbWUgPz8gXCJcIn1cIjsgYCArXG4gICAgICAgICAgICBgc2V0IHVuaXF1ZSBcXGBuYW1lXFxgcyBvbiBlYWNoIGRlZmluaXRpb25gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgb3V0W2tleV0gPSBkZWY7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIFNpbmdsZS1kZWZpbml0aW9uIHNob3J0aGFuZDogYW4gYWdlbnQgb3ducyB0aGUgcmVxdWlyZWQgYGluc3RydWN0aW9uc2BcbiAgLy8gZmllbGQgKHN0YXRpYyBvciBkeW5hbWljKTsgYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIG93bnMgaXQgZGlyZWN0bHkuXG4gIGlmIChcImluc3RydWN0aW9uc1wiIGluIGlucHV0KSB7XG4gICAgY29uc3QgZGVmID0gaW5wdXQgYXMgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uO1xuICAgIGNvbnN0IGtleSA9IGRlcml2ZUFnZW50S2V5KGRlZik7XG4gICAgcmV0dXJuIHsgW2tleV06IGRlZiB9O1xuICB9XG5cbiAgY29uc3QgcmVjb3JkID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPjtcbiAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG4vKiogRGVyaXZlIGEgcmVnaXN0cnkgaWQgZnJvbSBhIGRlZmluaXRpb24ncyBgbmFtZWAsIHdpdGggYSBmYWxsYmFjay4gKi9cbmZ1bmN0aW9uIGRlcml2ZUFnZW50S2V5KGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBpbmRleD86IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkZWYubmFtZSkge1xuICAgIGNvbnN0IHNsdWcgPSBzdHJpbmcudG9JZGVudGlmaWVyKGRlZi5uYW1lKTtcbiAgICBpZiAoc2x1ZykgcmV0dXJuIHNsdWc7XG4gIH1cbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgPyBGQUxMQkFDS19BR0VOVF9JRCA6IGBhZ2VudF8ke2luZGV4fWA7XG59XG5cbi8qKiBCdWlsdC1pbiBmYWxsYmFjayByZWdpc3RyeSB1c2VkIHdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCAvIGVtcHR5LiAqL1xuZnVuY3Rpb24gZmFsbGJhY2tEZWZpbml0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgcmV0dXJuIHtcbiAgICBbRkFMTEJBQ0tfQUdFTlRfSURdOiB7XG4gICAgICBuYW1lOiBcIkRlZmF1bHQgQWdlbnRcIixcbiAgICAgIGluc3RydWN0aW9uczogRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZWZmZWN0aXZlIG1vZGVsIHNwZWMgZm9yIGFuIGFnZW50LiBGYWxsYmFjayBsYWRkZXIsIGluXG4gKiBvcmRlcjpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yIGBEeW5hbWljQXJndW1lbnRgKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yXG4gKiAgICAgIGBEeW5hbWljQXJndW1lbnRgKSAtIG1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gKiAgIDMuIFRoZSBhdXRvLXJlc29sdmVyIHRoYXQgbWludHMgdXNlci1zY29wZWQgdG9rZW5zIGFnYWluc3RcbiAqICAgICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgdmlhIHtAbGluayBidWlsZE1vZGVsfS5cbiAqXG4gKiBTdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBtb2RlbElkYCBzdWdhciBhbmQgdGhyZWFkZWQgdGhyb3VnaFxuICogYGJ1aWxkTW9kZWxgJ3Mgb3ZlcnJpZGUgaG9vayBzbyB0aGUgcnVudGltZSBmdXp6eSBtYXRjaGVyIGFuZCB0aGVcbiAqIHBlci1yZXF1ZXN0IGBYLU1hc3RyYS1Nb2RlbGAgb3ZlcnJpZGUgbGF5ZXIgb24gdG9wIG9mIHRoZSBzdGF0aWNcbiAqIGNob2ljZS4gTm9uLXN0cmluZyBgRHluYW1pY0FyZ3VtZW50YHMgYXJlIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltO1xuICogY2FsbGVycyB0aGF0IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYHByb3ZpZGVySWRgIC8gYGhlYWRlcnNgIC9cbiAqIGBtb2RlbElkYCBieXBhc3MgdGhlIHJlc29sdmVyIHBpcGVsaW5lIGVudGlyZWx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBvdmVycmlkZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibW9kZWxcIl0sXG4pOiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gb3ZlcnJpZGUgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKGVmZmVjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZWZmZWN0aXZlO1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxJZCB9KTtcbiAgfVxuICByZXR1cm4gZWZmZWN0aXZlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBkZWZpbml0aW9uJ3MgYHRvb2xzYCBmaWVsZCB0byBhIGZsYXQgYE1hc3RyYVRvb2xzYCByZWNvcmQsXG4gKiBtZXJnaW5nIGluIHBsdWdpbi1sZXZlbCBhbWJpZW50IHRvb2xzIChwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleVxuICogY29sbGlzaW9uKS4gQ2FsbGJhY2sgZXJyb3JzIHByb3BhZ2F0ZSB2ZXJiYXRpbSBzbyB0aGUgb3JpZ2luYWwgc3RhY2tcbiAqIHN1cnZpdmVzIC0gdGhlIGNhbGxlciBhbHJlYWR5IGtub3dzIHdoaWNoIGFnZW50IHdhcyByZWdpc3RlcmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRvb2xzKFxuICBkZWZUb29sczogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1widG9vbHNcIl0sXG4gIHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMsXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHMsXG4pOiBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gIGlmICghZGVmVG9vbHMpIHJldHVybiB7IC4uLmFtYmllbnRUb29scyB9O1xuICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBkZWZUb29scyA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgZGVmVG9vbHMocGx1Z2lucykgOiBkZWZUb29scztcbiAgcmV0dXJuIHsgLi4uYW1iaWVudFRvb2xzLCAuLi5yZXNvbHZlZCB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoXG4gIHdvcmtzcGFjZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wid29ya3NwYWNlXCJdLFxuKTogV29ya3NwYWNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3b3Jrc3BhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygd29ya3NwYWNlID09PSBcImZ1bmN0aW9uXCIgPyB3b3Jrc3BhY2UoKSA6IHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHJ1bnRpbWUgcHJveHkgaGFuZGVkIHRvXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrcy5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIGBQcm94eWAgb3ZlciB0aGUgQXBwS2l0IHBsdWdpbiBjb250ZXh0IHNvXG4gKiBgcGx1Z2lucy48bmFtZT5gIHJlc29sdmVzIGF0IGZpcnN0IGFjY2Vzcy4gQW55IHNpYmxpbmcgcGx1Z2luIHRoYXRcbiAqIGltcGxlbWVudHMgQXBwS2l0J3Mgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYHRvb2xraXQob3B0cz8pYCArIGBleGVjdXRlQWdlbnRUb29sKG5hbWUsIGFyZ3MsIHNpZ25hbD8sIGNvbnRleHQ/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IE1hc3RyYVBsdWdpbnMge1xuICBjb25zdCBjYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsPigpO1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIE1hc3RyYVBsdWdpbnMsIHtcbiAgICBnZXQoX3RhcmdldCwgcHJvcE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcE5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY2FjaGUuaGFzKHByb3BOYW1lKSkgcmV0dXJuIGNhY2hlLmdldChwcm9wTmFtZSkgPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcHJvdmlkZXIgPSByZXNvbHZlUHJvdmlkZXIoY29uZmlnLCBjb250ZXh0LCBwcm9wTmFtZSk7XG4gICAgICBjYWNoZS5zZXQocHJvcE5hbWUsIHByb3ZpZGVyKTtcbiAgICAgIHJldHVybiBwcm92aWRlciA/PyB1bmRlZmluZWQ7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgcmlnaHQge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0gZm9yIGEgc2libGluZ1xuICogcGx1Z2luIGxvb2t1cC4gUmV0dXJucyB0aGUgR2VuaWUgYWdlbnQtYmFja2VkIGFkYXB0ZXIgd2hlblxuICogdGhlIGNhbGxlciBhc2tzIGZvciBgZ2VuaWVgIEFORCBhdCBsZWFzdCBvbmUgc3BhY2UgaXMgcmVhY2hhYmxlXG4gKiB2aWEge0BsaW5rIHJlc29sdmVHZW5pZVNwYWNlc30gKHRoZSBleHBsaWNpdFxuICogYGNvbmZpZy5nZW5pZVNwYWNlc2AsIHRoZSByZWdpc3RlcmVkIEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luJ3NcbiAqIGBzcGFjZXNgIGNvbmZpZywgb3IgdGhlIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyKS5cbiAqIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgQXBwS2l0IGBUb29sUHJvdmlkZXJgIGFkYXB0ZXIgZm9yXG4gKiBldmVyeSBvdGhlciBwbHVnaW4gbmFtZS4gYGNvbmZpZ2AgaXMgdGhyZWFkZWQgdGhyb3VnaCBzbyB0aGVcbiAqIEdlbmllIGFnZW50IGluaGVyaXRzIHRoZSBzYW1lIG1vZGVsIHJlc29sdmVyIC8gZmFsbGJhY2tcbiAqIGxhZGRlciB0aGUgY2FsbGluZyBhZ2VudHMgdXNlLlxuICpcbiAqIFRoZSBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2ggYEBkYngtdG9vbHMvZ2VuaWVgXG4gKiAoYGdlbmllRXZlbnRDaGF0YCkgYW5kIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgXG4gKiBBUEk7IEFwcEtpdCdzIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGNvbnRyaWJ1dGVzIG9ubHkgaXRzIHJlc291cmNlXG4gKiBtYW5pZmVzdCBhbmQgYHNwYWNlc2AgY29uZmlnLCBzbyBhbiBgYXBwLnlhbWxgIHJlc291cmNlIGJpbmRpbmcgYW5kIGFcbiAqIGBnZW5pZSh7IHNwYWNlcyB9KWAgcmVjb3JkIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBoZXJlIGFzIHRoZXkgZG8gdGhlcmUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVQcm92aWRlcihcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4sIHByb3BOYW1lKTtcbn1cblxudHlwZSBDb250ZXh0dWFsVG9vbFByb3ZpZGVyID0gUGFydGlhbDxQaWNrPFRvb2xQcm92aWRlciwgXCJnZXRBZ2VudFRvb2xzXCI+PiAmIHtcbiAgdG9vbGtpdD86IChcbiAgICBvcHRzPzogVG9vbGtpdE9wdGlvbnMsXG4gICkgPT5cbiAgICB8IFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT5cbiAgICB8IFByb21pc2U8UmV0dXJuVHlwZTxQbHVnaW5Ub29sa2l0UHJvdmlkZXJbXCJ0b29sa2l0XCJdPj47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IHsgcmVzb3VyY2VJZD86IHN0cmluZyB9LFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIEFkYXB0IGFuIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBwbHVnaW4gaW5zdGFuY2UgaW50byBhXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfS4gUmV0dXJucyBgbnVsbGAgZm9yIGFueSBwbHVnaW5cbiAqIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgYGV4ZWN1dGVBZ2VudFRvb2xgIHBsdXMgZWl0aGVyIEFwcEtpdCdzIG5hdGl2ZVxuICogYHRvb2xraXRgIG9yIGBnZXRBZ2VudFRvb2xzYCBzdXJmYWNlLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQoXG4gIHBsdWdpbjogdW5rbm93bixcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIENvbnRleHR1YWxUb29sUHJvdmlkZXI7XG4gIGlmIChcbiAgICB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIHAudG9vbGtpdCAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBwLmdldEFnZW50VG9vbHMgIT09IFwiZnVuY3Rpb25cIilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICAgICAgY29uc3QgZW50cmllcyA9XG4gICAgICAgIHR5cGVvZiBwLnRvb2xraXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcC50b29sa2l0KG9wdHMpXG4gICAgICAgICAgOiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhwbHVnaW5OYW1lLCBwLmdldEFnZW50VG9vbHMhKCksIG9wdHMpO1xuICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoZW50cmllcykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMudGhlbigocmVzb2x2ZWQpID0+IHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhyZXNvbHZlZCwgcCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhlbnRyaWVzLCBwKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uczogQWdlbnRUb29sRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gIHJldHVybiBhcHBraXRUb29sa2l0LmVudHJpZXMocGx1Z2luTmFtZSwgZGVmaW5pdGlvbnMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPik6IHZhbHVlIGlzIFByb21pc2U8VD4ge1xuICByZXR1cm4gdHlwZW9mICh2YWx1ZSBhcyB7IHRoZW4/OiB1bmtub3duIH0pPy50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhcbiAgZW50cmllczogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PixcbiAgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyLFxuKTogTWFzdHJhVG9vbHMge1xuICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICB0b29sc1trZXldID0gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5LCBwbHVnaW4pO1xuICB9XG4gIHJldHVybiB0b29scztcbn1cblxuLyoqXG4gKiBXcmFwIGEgc2luZ2xlIHtAbGluayBBcHBLaXRUb29sa2l0RW50cnl9IGFzIGEgTWFzdHJhIHRvb2wgd2hvc2VcbiAqIGBleGVjdXRlYCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCBgcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2woLi4uKWAgc29cbiAqIEFwcEtpdCdzIE9CTyBhdXRoIChgYXNVc2VyYCksIHRlbGVtZXRyeSBzcGFucywgYW5kIHRoZSBNYXN0cmEgbWVtb3J5IHJlc291cmNlXG4gKiBpZCBzdGF5IGludGFjdC4gSlNPTiBTY2hlbWEgcGFyYW1ldGVycyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkIC0gTWFzdHJhJ3NcbiAqIGBQdWJsaWNTY2hlbWFgIGFjY2VwdHMgYEpTT05TY2hlbWE3YCBkaXJlY3RseSB2aWEgYEBtYXN0cmEvc2NoZW1hLWNvbXBhdGAuXG4gKi9cbmZ1bmN0aW9uIHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeTogVG9vbGtpdEVudHJ5LCBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIpOiBUb29sIHtcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSBlbnRyeS5hbm5vdGF0aW9ucyA/PyBlbnRyeS5kZWYuYW5ub3RhdGlvbnM7XG4gIGNvbnN0IGVmZmVjdCA9IGFubm90YXRpb25zPy5lZmZlY3Q7XG4gIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucz8uZGVzdHJ1Y3RpdmUgPT09IHRydWU7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIC4uLihyZXF1aXJlc0FwcHJvdmFsID8geyByZXF1aXJlQXBwcm92YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oYW5ub3RhdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIG1jcDoge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgcmVhZE9ubHlIaW50OiBlZmZlY3QgPT09IFwicmVhZFwiIHx8IGFubm90YXRpb25zLnJlYWRPbmx5ID09PSB0cnVlLFxuICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zLmRlc3RydWN0aXZlID09PSB0cnVlLFxuICAgICAgICAgICAgICBpZGVtcG90ZW50SGludDogYW5ub3RhdGlvbnMuaWRlbXBvdGVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb24gPSBjb250ZXh0IGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0PzogeyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIH07XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc291cmNlSWQgPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09VUkNFX0lEX0tFWSk7XG4gICAgICByZXR1cm4gcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2whKGVudHJ5LmxvY2FsTmFtZSwgaW5wdXQsIGV4ZWN1dGlvbj8uYWJvcnRTaWduYWwsIHtcbiAgICAgICAgLi4uKHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8geyByZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
|
|
629
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVF4RCxPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBTyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUloRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFtQmxELHlFQUF5RTtBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBdUI7SUFDMUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxZQUFZ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Q0FBQyxVQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEQsR0FBRyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUM7Z0JBQ0UsR0FBRyxFQUFFO29CQUNILFdBQVcsRUFBRTt3QkFDWCxZQUFZLEVBQUUsTUFBTSxLQUFLLE1BQU0sSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUk7d0JBQ2hFLGVBQWUsRUFBRSxNQUFNLEtBQUssYUFBYSxJQUFJLFdBQVcsQ0FBQyxXQUFXLEtBQUssSUFBSTt3QkFDN0UsY0FBYyxFQUFFLFdBQVcsQ0FBQyxVQUFVO3FCQUN2QztpQkFDRjthQUNGO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBYyxFQUFFLE9BQWdCLEVBQUUsRUFBRTtZQUNsRCxNQUFNLFNBQVMsR0FBRyxPQUtMLENBQUM7WUFDZCxNQUFNLFVBQVUsR0FBRyxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxDQUFDLGdCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUU7Z0JBQzlFLEdBQUcsQ0FBQyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUMxRCxDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWdlbnQgcmVnaXN0cmF0aW9uIGZvciB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uXG4gKlxuICogTWlycm9ycyB0aGUgc2hhcGUgb2YgdGhlIEFwcEtpdCBgYWdlbnRzYCBwbHVnaW4gKGBjb25maWcuYWdlbnRzYCBtYXBcbiAqIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LCBkdWFsLWZvcm0gYHRvb2xzYCBhY2NlcHRpbmcgYSBwbGFpblxuICogcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2spLiBSZXNvbHZlcyBlYWNoIGRlZmluaXRpb25cbiAqIGludG8gYSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZSBkdXJpbmcgcGx1Z2luIHNldHVwOyB1c2VyLXN1cHBsaWVkXG4gKiB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBleGFjdGx5IG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwIGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnMuXG4gKlxuICogV2hlbiBubyBhZ2VudHMgYXJlIHJlZ2lzdGVyZWQgdGhlIHBsdWdpbiBmYWxscyBiYWNrIHRvIGEgc2luZ2xlXG4gKiBidWlsdC1pbiBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nXG4gKiBzdHJlYW1hYmxlIGFnZW50IGZvciBkZW1vcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudFRvb2xEZWZpbml0aW9uLFxuICBQbHVnaW5Ub29sa2l0UHJvdmlkZXIsXG4gIFRvb2xraXRFbnRyeSxcbiAgVG9vbGtpdE9wdGlvbnMgYXMgQXBwS2l0VG9vbGtpdE9wdGlvbnMsXG4gIFRvb2xQcm92aWRlcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSwgdG9vbGtpdEVudHJpZXMgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50Q29uZmlnLFxuICBBZ2VudEV4ZWN1dGlvbk9wdGlvbnMsXG4gIEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBUb29sc0lucHV0LFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgeyBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlCdWlsZGVyIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsLCBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3R5bGUudHNcIjtcbmltcG9ydCB7IGJ1aWxkU3VtbWFyaXplVG9vbCB9IGZyb20gXCIuL3N1bW1hcml6ZS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV29ya3NwYWNlIH0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgYW5kIERhdGFicmlja3MgU2FuZGJveCBjb21tYW5kXG4gKiBleGVjdXRpb24uIEFuIGV4cGxpY2l0IHdvcmtzcGFjZSByZW1haW5zIHRoZSBjYWxsZXIncyBjb21wbGV0ZSBvdmVycmlkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuICBURGVmaW5pdGlvbiBleHRlbmRzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+ID1cbiAgICBNYXN0cmFBZ2VudERlZmluaXRpb248VFJlcXVlc3RDb250ZXh0Pixcbj4oZGVmOiBURGVmaW5pdGlvbik6IFREZWZpbml0aW9uIHtcbiAgaWYgKGRlZi53b3Jrc3BhY2UpIHJldHVybiB7IC4uLmRlZiB9O1xuICBjb25zdCB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbFBhdGhzYCAoYSBjYWxsZXItc3VwcGxpZWQgd29ya3NwYWNlIGlzIG5ldmVyIHRvdWNoZWQpLlxuICovXG5jb25zdCBERUZBVUxUX1dPUktTUEFDRSA9IFN5bWJvbC5mb3IoXCJkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9kZWZhdWx0LXdvcmtzcGFjZVwiKTtcblxuLyoqIEJyYW5kIGB3b3Jrc3BhY2VgIGFzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdC4gKi9cbmZ1bmN0aW9uIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG4gICh3b3Jrc3BhY2UgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3ltYm9sLCBib29sZWFuPilbREVGQVVMVF9XT1JLU1BBQ0VdID0gdHJ1ZTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKHdvcmtzcGFjZSAmJiAod29ya3NwYWNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN5bWJvbCwgYm9vbGVhbj4pW0RFRkFVTFRfV09SS1NQQUNFXSk7XG59XG5cbi8qKlxuICogRmlsdGVyIC8gcmVuYW1lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgcGx1Z2luJ3MgYC50b29sa2l0KClgXG4gKiBtZXRob2QsIGRpcmVjdGx5IHNvdXJjZWQgZnJvbSBBcHBLaXQncyBwdWJsaWMgYmV0YSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbGtpdE9wdGlvbnMgPSBBcHBLaXRUb29sa2l0T3B0aW9ucztcblxuLyoqXG4gKiBUb29sa2l0IHByb3ZpZGVyIHNoYXBlIGV2ZXJ5IGVudHJ5IGluIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwXG4gKiBleHBvc2VzLiBJZGVudGljYWwgdG8gQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgLSBhbnkgQXBwS2l0XG4gKiBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgZ2V0QWdlbnRUb29sc2AgKyBgZXhlY3V0ZUFnZW50VG9vbGAgKyBgdG9vbGtpdGApIGlzIHJlYWNoYWJsZVxuICogdGhyb3VnaCB0aGlzIHN1cmZhY2UgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIE1hc3RyYS1zaGFwZWQgdG9vbHMgcmVjb3JkIGFkYXB0ZWQgZnJvbSB0aGUgcGx1Z2luJ3NcbiAgICogYWdlbnQgdG9vbHMuIEVhY2ggdG9vbCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCB0aGUgcGx1Z2luJ3NcbiAgICogYGV4ZWN1dGVBZ2VudFRvb2xgIHNvIE9CTyBhdXRoIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuXG4gICAqL1xuICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG59XG5cbi8qKlxuICogUGx1Z2luIG1hcCBoYW5kZWQgdG8gdGhlIGZ1bmN0aW9uIGZvcm0gb2ZcbiAqIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5zYFxuICogdHlwZSBleGFjdGx5OiBhIHN0cmluZy1rZXllZCByZWNvcmQgd2hlcmUgZXZlcnkgdmFsdWUgZXhwb3Nlc1xuICogYC50b29sa2l0KG9wdHMpYC5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIHJ1bnRpbWUgUHJveHkgdGhhdCBhdXRvLWRpc2NvdmVycyBhbnkgcmVnaXN0ZXJlZFxuICogQXBwS2l0IHBsdWdpbiBpbXBsZW1lbnRpbmcgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBhbmFseXRpY3NgLCBgZmlsZXNgLCBgbGFrZWJhc2VgLCBgZ2VuaWVgLCBwbHVzIGFueSB0aGlyZC1wYXJ0eVxuICogcGx1Z2luIHRoYXQgZG9lcyB0aGUgc2FtZSkuIFVua25vd24gbmFtZXMgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYFxuICogYXQgcnVudGltZSwgc28gZ3VhcmQgd2l0aCBgPy5gIGFuZCBgPz8ge31gIHdoZW4gc3ByZWFkaW5nIGZyb20gYVxuICogcGx1Z2luIHRoYXQgbWF5IG5vdCBiZSByZWdpc3RlcmVkIGluIGV2ZXJ5IGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuYW5hbHl0aWNzLnRvb2xraXQoKSksXG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5maWxlcy50b29sa2l0KHsgb25seTogW1widXBsb2Fkcy5yZWFkXCJdIH0pKSxcbiAqICAgICAgIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgICAgICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiAgICAgICB9KSxcbiAqICAgICB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhUGx1Z2lucyA9IFJlY29yZDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcj47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHNGbiA9IChwbHVnaW5zOiBNYXN0cmFQbHVnaW5zKSA9PiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLndvcmtzcGFjZX07IGB1bmRlZmluZWRgIGRpc2FibGVzIGl0IGZvciB0aGlzIGFnZW50LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb248XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4+IHtcbiAgLyoqIERpc3BsYXkgbmFtZSB1c2VkIGFzIGBBZ2VudC5uYW1lYC4gRGVmYXVsdHMgdG8gdGhlIHJlZ2lzdHJ5IGtleS4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGxvbmctZm9ybSBkZXNjcmlwdGlvbjsgc3VyZmFjZWQgYXMgYEFnZW50LmRlc2NyaXB0aW9uYC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIHN5c3RlbSBpbnN0cnVjdGlvbnMuICovXG4gIGluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIC8qKiBOYXRpdmUgTWFzdHJhIHNjaGVtYSB0aGF0IHZhbGlkYXRlcyBhbmQgdHlwZXMgYXBwbGljYXRpb24gcmVxdWVzdCBjb250ZXh0LiAqL1xuICByZXF1ZXN0Q29udGV4dFNjaGVtYT86IEFnZW50Q29uZmlnPFxuICAgIHN0cmluZyxcbiAgICBUb29sc0lucHV0LFxuICAgIHVuZGVmaW5lZCxcbiAgICBUUmVxdWVzdENvbnRleHRcbiAgPltcInJlcXVlc3RDb250ZXh0U2NoZW1hXCJdO1xuICAvKipcbiAgICogTWFzdHJhLW5hdGl2ZSBwZXItY2FsbCBhcHByb3ZhbCBnYXRlIGZvciB0aGlzIGFnZW50J3MgdG9vbHMuIFN1cHBvcnRzIGFuXG4gICAqIGFzeW5jIENsYXNzaWZpZXItYmFja2VkIGZ1bmN0aW9uOyB0b29sLWxldmVsIGFwcHJvdmFsIHJlbWFpbnMgYXV0aG9yaXRhdGl2ZS5cbiAgICovXG4gIHJlcXVpcmVUb29sQXBwcm92YWw/OiBBZ2VudEV4ZWN1dGlvbk9wdGlvbnNbXCJyZXF1aXJlVG9vbEFwcHJvdmFsXCJdO1xuICAvKipcbiAgICogUGVyLWFnZW50IG1vZGVsIG92ZXJyaWRlLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZmFsbHMgYmFjayB0byB0aGUgd29ya3NwYWNlXG4gICAqICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgcmVzb2x2ZXIgdGhhdCB7QGxpbmsgYnVpbGRNb2RlbH0gY29uZmlndXJlc1xuICAgKiAgIGZyb20gdGhlIHBlci1yZXF1ZXN0IGBXb3Jrc3BhY2VDbGllbnRgLlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBkZWZhdWx0IHJlc29sdmVyIGJ1dCBzd2FwIHRoZVxuICAgKiAgIGBtb2RlbElkYFwiIChlLmcuIGBcImRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiLWluc3RydWN0XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgc3RyYWlnaHQgdGhyb3VnaCB0byBgQWdlbnQubW9kZWxgLiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGZ1bGxcbiAgICogICBjb250cm9sIG92ZXIgYXV0aCBvciBwcm92aWRlcklkLlxuICAgKi9cbiAgbW9kZWw/OiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRvb2wgcmVjb3JkLiBFaXRoZXIgYSBwbGFpbiBtYXAgb3IgYSBjYWxsYmFjayB0aGF0XG4gICAqIHJlY2VpdmVzIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luc30gc2libGluZy1wbHVnaW4gaW5kZXggYW5kXG4gICAqIHJldHVybnMgYSBtYXAuIFRoZSBjYWxsYmFjayBydW5zIGV4YWN0bHkgb25jZSBhdCBhZ2VudCBzZXR1cDsgdGhlXG4gICAqIHJlc3VsdCBpcyBjYWNoZWQgZm9yIHRoZSBhZ2VudCdzIGxpZmV0aW1lLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scyB8IE1hc3RyYVRvb2xzRm47XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgc2VtYW50aWMgcmVjYWxsIChQZ1ZlY3Rvcikgb3ZlcnJpZGUuIENhc2NhZGVzIGZyb21cbiAgICogYGNvbmZpZy5tZW1vcnlgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5tZW1vcnlgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCAqKnNoYXJlcyB0aGUgcGx1Z2luLWxldmVsIHNpbmdsZXRvbiBgUGdWZWN0b3JgXG4gICAqICAgaW5zdGFuY2UqKiAoY3Jvc3MtYWdlbnQgc2VtYW50aWMgcmVjYWxsIGFjcm9zcyB0aGUgc2FtZSBpbmRleCkuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzZW1hbnRpYyByZWNhbGwgZm9yIHRoaXMgYWdlbnQgb25seS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB1c2luZyB0aGUgc2hhcmVkIHNpbmdsZXRvbiAoc2FtZSBhcyBkZWZhdWx0IHdoZW5cbiAgICogICBwbHVnaW4gbWVtb3J5IGlzIGVuYWJsZWQ7IHVzZWZ1bCB0byBvcHQgaW4gd2hlbiBwbHVnaW4gZGlzYWJsZWQpLlxuICAgKiAtIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWd9IG9iamVjdDogZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXNcbiAgICogICBhZ2VudCAocHJpdmF0ZSByZWNhbGwgaW5kZXgpLiBCeXBhc3NlcyB0aGUgc2hhcmVkIHNpbmdsZXRvbi5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0aHJlYWQvbWVzc2FnZSBzdG9yYWdlIChgUG9zdGdyZXNTdG9yZWApIG92ZXJyaWRlLlxuICAgKiBDYXNjYWRlcyBmcm9tIGBjb25maWcuc3RvcmFnZWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLnN0b3JhZ2VgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCBnZXRzIGl0cyAqKm93biBwZXItYWdlbnQgYFBvc3RncmVzU3RvcmVgKipcbiAgICogICBrZXllZCBieSB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gc28gdGhyZWFkcyBhbmRcbiAgICogICBtZXNzYWdlcyBzdGF5IGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lIGRhdGFiYXNlLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc3RvcmFnZSBmb3IgdGhpcyBhZ2VudCBvbmx5IChwdXJlbHkgaW4tbWVtb3J5KS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB3aXRoIHRoZSBwZXItYWdlbnQgZGVmYXVsdCBzY2hlbWEuXG4gICAqIC0ge0BsaW5rIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZX0gb2JqZWN0OiBkZWRpY2F0ZWRcbiAgICogICBgUG9zdGdyZXNTdG9yZWAgY29uZmlnIChjdXN0b20gc2NoZW1hLCBjb25uZWN0aW9uLCBldGMuKS5cbiAgICovXG4gIHN0b3JhZ2U/OiBib29sZWFuIHwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9IGZvciB0aGlzIGFnZW50IChmaWxlc3lzdGVtLCBzYW5kYm94LCBvciBvdGhlclxuICAgKiBwcm92aWRlcnMpLiBBc3Npc3RhbnQgc2tpbGxzIGZyb20gRGF0YWJyaWNrcyB3b3Jrc3BhY2UgcGF0aHMgYXJlIHdpcmVkXG4gICAqIHZpYSB7QGxpbmsgY3JlYXRlV29ya3NwYWNlfS5cbiAgICovXG4gIHdvcmtzcGFjZT86IFdvcmtzcGFjZSB8IE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXI7XG59XG5cbi8qKiBUeXBlLWVyYXNlZCByZWdpc3RyeSBtZW1iZXI7IGVhY2ggZGVmaW5pdGlvbiByZXRhaW5zIHR5cGluZyBhdCBgY3JlYXRlQWdlbnRgLiAqL1xuZXhwb3J0IHR5cGUgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uID0gTWFzdHJhQWdlbnREZWZpbml0aW9uPGFueT47XG5cbi8qKlxuICogRGlzdHJpYnV0aXZlIGBPbWl0YCBzbyB1bmlvbnMgaW4gYFBvc3RncmVzU3RvcmVDb25maWdgIC9cbiAqIGBQZ1ZlY3RvckNvbmZpZ2Aga2VlcCB0aGVpciBkaXNjcmltaW5hbnRzIGFmdGVyIHRoZSBvdmVycmlkZSB0eXBlc1xuICogc3RyaXAgYGlkYC4gVGhlIGJ1aWx0LWluIGBPbWl0YCBjb2xsYXBzZXMgdW5pb25zIHRvIG9uZSBzaGFwZSB3aXRoXG4gKiBjb21tb24gZmllbGRzIG9ubHksIHdoaWNoIGxvc2VzIHRoZSBjb25uZWN0aW9uLXN0eWxlIGRpc2NyaW1pbmFudHMuXG4gKi9cbnR5cGUgRGlzdHJpYnV0aXZlT21pdDxULCBLIGV4dGVuZHMga2V5b2YgbmV2ZXI+ID0gVCBleHRlbmRzIHVua25vd24gPyBPbWl0PFQsIEs+IDogbmV2ZXI7XG5cbi8qKlxuICogYFBvc3RncmVzU3RvcmVDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgc3RvcmFnZSBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5IHNvIHRyYWNlcyBzdGF5IHN0YWJsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQb3N0Z3Jlc1N0b3JlQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogYFBnVmVjdG9yQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHZlY3RvciBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5LlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UGdWZWN0b3JDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIEhvdyBhbiBhZ2VudCdzIHVucGlubmVkIG1vZGVsIGlzIHJlc29sdmVkLiAqL1xuZXhwb3J0IHR5cGUgQWdlbnREZWZhdWx0TW9kZWwgPVxuICB7IGtpbmQ6IFwiYXV0b1wiIH0gfCB7IGtpbmQ6IFwiY29uZmlndXJlZFwiOyBtb2RlbDogc3RyaW5nIH0gfCB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1vZGVsIGludGVudCBwZXIgYWdlbnQgaWQuIEFuIHVuY29uZmlndXJlZCBhZ2VudCBpcyBgXCJhdXRvXCJgIGFuZFxuICAgKiByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgbGl2ZSBlbmRwb2ludDsgYSBzdHJpbmcgaXMgYFwiY29uZmlndXJlZFwiYDsgYVxuICAgKiBjdXN0b20gZnVuY3Rpb24gaXMgYFwiZHluYW1pY1wiYC4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBGYWxsYmFjayBhZ2VudCBpZCB1c2VkIHdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHkuICovXG5leHBvcnQgY29uc3QgRkFMTEJBQ0tfQUdFTlRfSUQgPSBcImRlZmF1bHRcIjtcblxuLyoqXG4gKiBEZWZhdWx0IHBlci10dXJuIHN0ZXAgY2VpbGluZyBhcHBsaWVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnRcbiAqIHdoZW4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudE1heFN0ZXBzfSBpcyB1bnNldC4gU2l6ZWQgdG9cbiAqIGZpdCBhIGRlY29tcG9zZWQgR2VuaWUgdHVybiAoZ3JvdW5kaW5nICsgc2V2ZXJhbCBgYXNrX2dlbmllYFxuICogY2FsbHMgKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICogaGVhZHJvb20gZm9yIHRoZSBtb2RlbCB0byBjaGFpbiBhIGNvdXBsZSBvZiBmb2xsb3ctdXBzIGJlZm9yZVxuICogYW5zd2VyaW5nIC0gd2VsbCBhYm92ZSBNYXN0cmEncyBvd24gYGFnZW50LmdlbmVyYXRlYCBkZWZhdWx0IG9mXG4gKiA1LCB3aGljaCB3b3VsZCBjdXQgbXVsdGktc3RlcCBvcmNoZXN0cmF0aW9uIG9mZiBtaWQtbG9vcC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTID0gMjU7XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKlxuICogU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvIGN1cmJcbiAqIGNvbW1vbiBMTE0taXNtcyAoZW0gZGFzaGVzLCBlbW9qaXMsIHN5Y29waGFudGljIG9wZW5lcnMsIGV4Y2Vzc2l2ZVxuICogaGVkZ2luZywgdGhyb3dhd2F5IGNsb3NlcnMpLiBBcHBlbmRlZCByYXRoZXIgdGhhbiBwcmVwZW5kZWQgc28gdGhlXG4gKiBhZ2VudCdzIHJvbGUvY29udGV4dCBjb21lcyBmaXJzdDsgdGhlIG1vZGVsJ3MgcmVjZW5jeSBiaWFzIHRoZW5cbiAqIGhlbHBzIHRoZSBzdHlsZSBydWxlcyBkb21pbmF0ZSB0aGUgcmVzcG9uc2Ugc3VyZmFjZS5cbiAqXG4gKiBPdmVycmlkZSBnbG9iYWxseSB2aWEge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5zdHlsZUluc3RydWN0aW9uc31cbiAqIChwYXNzIGBmYWxzZWAgdG8gZGlzYWJsZSBlbnRpcmVseSwgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJPdXRwdXQgc3R5bGU6XCIsXG4gIFwiXCIsXG4gIFwiVXNlIG1hcmtkb3duIGZvcm1hdHRpbmcsIGluY2x1ZGluZyBoZWFkaW5ncywgbGlzdHMsIGFuZCBjb2RlIGJsb2Nrcy5cIixcbiAgXCJBdm9pZCBsaXN0cyBhbmQgaGVhZGVycyBmb3Igc2hvcnQgcmVwbGllcy5cIixcbiAgXCJQbGFpbiBwcm9zZS5cIixcbiAgVFlQT0dSQVBIWV9SVUxFLFxuICBcIlNraXAgb3BlbmVycyBsaWtlICdHcmVhdCBxdWVzdGlvbicsICdBYnNvbHV0ZWx5JywgYW5kICdJJ2QgYmUgaGFwcHkgdG8gaGVscCcuXCIsXG4gIFwiU2tpcCBjbG9zZXJzIGxpa2UgJ0xldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMnLlwiLFxuICBcIlNraXAgc2VsZi1kaXNjbGFpbWVycyBsaWtlICdJIHNob3VsZCBtZW50aW9uJyBhbmQgJ0l0J3MgaW1wb3J0YW50IHRvIG5vdGUnLlwiLFxuICBcIkFuc3dlciBkaXJlY3RseS5cIixcbiAgXCJEbyBub3QgaW5jbHVkZSBhIHByZWFtYmxlIGJlZm9yZSB0aGUgYWN0dWFsIGFuc3dlci5cIixcbiAgXCJVc2UgbGlzdHMgYW5kIGhlYWRlcnMgb25seSB3aGVuIHRoZXkgY2xhcmlmeSBhIG11bHRpLXBhcnQgYW5zd2VyLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIHN0eWxlIGJsb2NrIHRvIGFwcGVuZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy5cbiAqIFJldHVybnMgYG51bGxgIHdoZW4gdGhlIGNhbGxlciBvcHRlZCBvdXQgKGBzdHlsZUluc3RydWN0aW9uczogZmFsc2VgKS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IGZhbHNlKSByZXR1cm4gbnVsbDtcbiAgaWYgKHR5cGVvZiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zO1xuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TO1xufVxuXG4vKiogQXBwZW5kIHRoZSBzdHlsZSBibG9jayB3aXRob3V0IG5hcnJvd2luZyBNYXN0cmEncyBuYXRpdmUgaW5zdHJ1Y3Rpb24gc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kU3R5bGVJbnN0cnVjdGlvbnMoXG4gIGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsXG4gIHN0eWxlOiBzdHJpbmcgfCBudWxsLFxuKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBpZiAoIXN0eWxlKSByZXR1cm4gaW5zdHJ1Y3Rpb25zO1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3R5bGV9YDtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBzdHlsZV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN0eWxlIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN0eWxlIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKipcbiAqIENvbXBvc2Ugc3RhdGljIG9yIHJlcXVlc3QtY29udGV4dC1hd2FyZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc2hhcmVkIHN0eWxlXG4gKiBwb2xpY3kgd2hpbGUgcHJlc2VydmluZyBNYXN0cmEncyBuYXRpdmUgZ2VuZXJpYyBpbmZlcmVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnM8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgYWdlbnRJbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdIHtcbiAgaWYgKHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIGFwcGVuZFN0eWxlSW5zdHJ1Y3Rpb25zKGFnZW50SW5zdHJ1Y3Rpb25zLCBzdHlsZSkgYXMgQWdlbnRDb25maWc8XG4gICAgICBzdHJpbmcsXG4gICAgICBUb29sc0lucHV0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVFJlcXVlc3RDb250ZXh0XG4gICAgPltcImluc3RydWN0aW9uc1wiXTtcbiAgfVxuICByZXR1cm4gKGFzeW5jIChhcmdzKSA9PlxuICAgIGFwcGVuZFN0eWxlSW5zdHJ1Y3Rpb25zKGF3YWl0IGFnZW50SW5zdHJ1Y3Rpb25zKGFyZ3MpLCBzdHlsZSkpIGFzIEFnZW50Q29uZmlnPFxuICAgIHN0cmluZyxcbiAgICBUb29sc0lucHV0LFxuICAgIHVuZGVmaW5lZCxcbiAgICBUUmVxdWVzdENvbnRleHRcbiAgPltcImluc3RydWN0aW9uc1wiXTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZWQgZGVzY3JpcHRpb24gZm9yIGFuIGFnZW50IHdob3NlIGRlZmluaXRpb24gb21pdHMgb25lLiBLZXB0XG4gKiBnZW5lcmljICh0aGUgYWdlbnQncyBvd24gbmFtZSBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwgYXQgYnVpbGRcbiAqIHRpbWUpIHNvIGl0IHJlYWRzIHNlbnNpYmx5IGFzIHRoZSBgYXNrXzxpZD5gIE1DUCB0b29sJ3MgZGVzY3JpcHRpb25cbiAqIGFuZCBpbiBhZ2VudCBtZXRhZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFnZW50RGVzY3JpcHRpb24obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBDb252ZXJzYXRpb25hbCBBSSBhZ2VudCBcIiR7bmFtZX1cIi5gO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZXZlcnkgZW50cnkgaW4gYGNvbmZpZy5hZ2VudHNgIGludG8gYSBNYXN0cmEgYEFnZW50YFxuICogaW5zdGFuY2UuIFdoZW4gYGNvbmZpZy5hZ2VudHNgIGlzIG9taXR0ZWQgdGhlIHBsdWdpbiByZWdpc3RlcnMgYVxuICogc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbFxuICogeWllbGRzIGEgd29ya2luZyBhZ2VudC5cbiAqXG4gKiBQZXItYWdlbnQgdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBpbmRleCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zXG4gKiAoY3VycmVudGx5IGBnZW5pZWA7IGV4dGVuZCBgTWFzdHJhUGx1Z2luc2AgdG8gc3VyZmFjZSBtb3JlKS5cbiAqXG4gKiBAdGhyb3dzIHdoZW4gYGNvbmZpZy5kZWZhdWx0QWdlbnRgIGlzIHNldCB0byBhbiBpZCB0aGF0IGlzbid0IGluIHRoZVxuICogICByZXNvbHZlZCByZWdpc3RyeTsgdGhpcyBpcyBhIHdpcmluZyBidWcsIG5vdCBhIHJ1bnRpbWUgY29uZGl0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBZ2VudHMob3B0czoge1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQ7XG4gIG1lbW9yeUJ1aWxkZXI/OiBNZW1vcnlCdWlsZGVyO1xuICBsb2c6IGxvZy5Mb2dnZXI7XG4gIC8qKlxuICAgKiBMb2NhbCBza2lsbCBzY2FuIHBhdGhzIChyZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgdGVtcCBkaXIgYXRcbiAgICogc3RhcnR1cCkgZm9sZGVkIGludG8gZXZlcnkgYWdlbnQgdGhhdCB1c2VzIHRoZSBhdXRvLWNyZWF0ZWQgZGVmYXVsdFxuICAgKiB3b3Jrc3BhY2UuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHsgY29uZmlnLCBjb250ZXh0LCBtZW1vcnlCdWlsZGVyLCBsb2csIGV4dHJhU2tpbGxQYXRocyB9ID0gb3B0cztcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnKTtcbiAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZGVmaW5pdGlvbnMpO1xuICBjb25zdCBkZWZhdWx0QWdlbnRJZCA9IGNvbmZpZy5kZWZhdWx0QWdlbnQgPz8gaWRzWzBdID8/IEZBTExCQUNLX0FHRU5UX0lEO1xuXG4gIGNvbnN0IHBsdWdpbnMgPSBidWlsZFBsdWdpbnNNYXAoY29uZmlnLCBjb250ZXh0KTtcbiAgLy8gU3lzdGVtLWRlZmF1bHQgYW1iaWVudCB0b29scyBldmVyeSBhZ2VudCBnZXRzIG91dCBvZiB0aGUgYm94OlxuICAvLyBgcmVuZGVyX2RhdGFgIGZvciBpbmxpbmUgdmlzdWFsaXphdGlvbnMgYW5kIGBzdW1tYXJpemVgIGZvclxuICAvLyBvZmZsb2FkaW5nIHRleHQgY29uZGVuc2luZyB0byB0aGUgZmFzdCAvIHNtYWxsIGNoYXQgdGllci4gVGhlXG4gIC8vIHVzZXIgY2FuIHNoYWRvdyBlaXRoZXIgYnkgaW5jbHVkaW5nIGEgc2FtZS1uYW1lZCB0b29sIGluIHRoZWlyIG93blxuICAvLyBgY29uZmlnLnRvb2xzYCBvciBwZXItYWdlbnQgYHRvb2xzYC4gT3JkZXIgaW4ge0BsaW5rIHJlc29sdmVUb29sc31cbiAgLy8gaXMgYHN5c3RlbSAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBzeXN0ZW1Ub29sczogTWFzdHJhVG9vbHMgPSB7XG4gICAgcmVuZGVyX2RhdGE6IGJ1aWxkUmVuZGVyRGF0YVRvb2woY29uZmlnKSxcbiAgICBzdW1tYXJpemU6IGJ1aWxkU3VtbWFyaXplVG9vbChjb25maWcpLFxuICB9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IGlucHV0UHJvY2Vzc29ycyA9IFtcbiAgICAuLi4oY29uZmlnLnN0cmlwU3RhbGVDaGFydHMgPT09IGZhbHNlID8gW10gOiBbc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcl0pLFxuICBdO1xuICBjb25zdCBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PiA9IHt9O1xuICBjb25zdCBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHRvb2xzID0gYXdhaXQgcmVzb2x2ZVRvb2xzKGRlZi50b29scywgcGx1Z2lucywgYW1iaWVudFRvb2xzKTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChcbiAgICAgIChkZWYud29ya3NwYWNlID09PSB1bmRlZmluZWQgJiYgIXdvcmtzcGFjZSkgfHxcbiAgICAgICgoZXh0cmFTa2lsbFBhdGhzPy5sZW5ndGggfHwgY29uZmlnLnNhbmRib3ggIT09IHVuZGVmaW5lZCkgJiYgaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSkpXG4gICAgKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBjcmVhdGVXb3Jrc3BhY2Uoe1xuICAgICAgICBleHRyYVNraWxsUGF0aHMsXG4gICAgICAgIHNhbmRib3g6XG4gICAgICAgICAgY29uZmlnLnNhbmRib3ggPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc2FuZGJveCA9PT0gdHJ1ZSA/IFwiZGF0YWJyaWNrc1wiIDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGFnZW50c1tpZF0gPSBuZXcgQWdlbnQoe1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIC8vIEFsd2F5cyBjYXJyeSBhIG5vbi1lbXB0eSBkZXNjcmlwdGlvbjogaXQncyBzdXJmYWNlZCB0byBNQ1BcbiAgICAgIC8vIGNsaWVudHMgKHdoaWNoIHJlamVjdCBhIGRlc2NyaXB0aW9uLWxlc3MgYWdlbnQpIGFuZCBpbiBhZ2VudFxuICAgICAgLy8gbWV0YWRhdGEuIEZhbGwgYmFjayB0byBhIGdlbmVyYXRlZCBvbmUgd2hlbiB0aGUgZGVmaW5pdGlvblxuICAgICAgLy8gb21pdHMgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogZGVmLmRlc2NyaXB0aW9uPy50cmltKCkgfHwgZGVmYXVsdEFnZW50RGVzY3JpcHRpb24oZGVmLm5hbWUgPz8gaWQpLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBjb21wb3NlSW5zdHJ1Y3Rpb25zKGRlZi5pbnN0cnVjdGlvbnMsIHN0eWxlKSxcbiAgICAgIC4uLihkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgPyB7IHJlcXVlc3RDb250ZXh0U2NoZW1hOiBkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIG1vZGVsOiByZXNvbHZlTW9kZWwoY29uZmlnLCBkZWYubW9kZWwpLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgICAgbWF4U3RlcHM6IGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLFxuICAgICAgICBwcm92aWRlck9wdGlvbnM6IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TLFxuICAgICAgICAuLi4oZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyByZXF1aXJlVG9vbEFwcHJvdmFsOiBkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzLFxuICAgIH0pO1xuICAgIC8vIFN1cmZhY2UgdGhlIGVmZmVjdGl2ZSBkZWZhdWx0IG1vZGVsIHBlciBhZ2VudCBzbyBvcGVyYXRvcnMgY2FuXG4gICAgLy8gc2VlIGF0IGEgZ2xhbmNlIHdoaWNoIGVuZHBvaW50IGVhY2ggYWdlbnQgcG9pbnRzIGF0IHdpdGhvdXRcbiAgICAvLyBoYXZpbmcgdG8gZmlyZSBhIHJlcXVlc3QgYW5kIGluc3BlY3QgYSB0cmFjZS4gVGhlIHZhbHVlIGlzIHRoZVxuICAgIC8vICpzdGF0aWMqIGRlZmF1bHQ7IHBlci1yZXF1ZXN0IG92ZXJyaWRlcyAoaGVhZGVyIC8gcXVlcnkgL1xuICAgIC8vIGJvZHkpIGFuZCB0aGUgd29ya3NwYWNlLWNhdGFsb2d1ZSBmdXp6eSBtYXRjaCBzdGlsbCBhcHBseSBhdFxuICAgIC8vIGNhbGwgdGltZS5cbiAgICBjb25zdCBkZWZhdWx0TW9kZWwgPSBkZXNjcmliZUFnZW50RGVmYXVsdE1vZGVsKGNvbmZpZywgZGVmKTtcbiAgICBkZWZhdWx0TW9kZWxzW2lkXSA9IGRlZmF1bHRNb2RlbDtcbiAgICBsb2cuaW5mbyhcImFnZW50IHJlZ2lzdGVyZWRcIiwge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiBkZWYubmFtZSA/PyBpZCxcbiAgICAgIGRlZmF1bHRNb2RlbDpcbiAgICAgICAgZGVmYXVsdE1vZGVsLmtpbmQgPT09IFwiY29uZmlndXJlZFwiID8gZGVmYXVsdE1vZGVsLm1vZGVsIDogYDwke2RlZmF1bHRNb2RlbC5raW5kfT5gLFxuICAgICAgdG9vbHM6IE9iamVjdC5rZXlzKHRvb2xzKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICghYWdlbnRzW2RlZmF1bHRBZ2VudElkXSkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYG1hc3RyYSBkZWZhdWx0QWdlbnQgXCIke2RlZmF1bHRBZ2VudElkfVwiYCxcbiAgICAgIGBSZWdpc3RlcmVkIGFnZW50czogJHtpZHMuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifS5gLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShhcHByb3ZhbEdhdGVkQnlBZ2VudCwgbWVtb3J5QnVpbGRlcik7XG5cbiAgbG9nLmluZm8oXCJhZ2VudHMgcmVhZHlcIiwgeyBpZHMsIGRlZmF1bHRBZ2VudElkIH0pO1xuICByZXR1cm4geyBhZ2VudHMsIGRlZmF1bHRBZ2VudElkLCBkZWZhdWx0TW9kZWxzLCBhbWJpZW50VG9vbHMgfTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5vYmplY3RcbiAgICAgIC5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGhvdyBhbiBhZ2VudCByZXNvbHZlcyBpdHMgdW5waW5uZWQgbW9kZWw6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBpcyBjb25maWd1cmVkOyBhIGZ1bmN0aW9uIGlzXG4gKiAgICAgIGR5bmFtaWMpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBBdXRvbWF0aWMgbGl2ZS1jYXRhbG9ndWUgcmFua2luZyB3aGVuIG5vbmUgaXMgc2V0LlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIGBkZWZhdWx0TW9kZWxGYWxsYmFja3NgIHJlbWFpbnMgYW4gb3BlcmF0b3ItcGlubmVkIGNhbmRpZGF0ZSBsaXN0IGluc2lkZSB0aGVcbiAqIGF1dG9tYXRpYyBsaXZlIGxvb2t1cDsgaXQgaXMgbm90IGFkdmVydGlzZWQgYXMgYSBtb2RlbCB1bnRpbCBhdmFpbGFiaWxpdHkgaXNcbiAqIGNoZWNrZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbixcbik6IEFnZW50RGVmYXVsdE1vZGVsIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVmZmVjdGl2ZSB9O1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG4gIGNvbnN0IGVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBlbnZpcm9ubWVudCA/IHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlbnZpcm9ubWVudCB9IDogeyBraW5kOiBcImF1dG9cIiB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IG93bnMgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gIC8vIGZpZWxkIChzdGF0aWMgb3IgZHluYW1pYyk7IGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBvd25zIGl0IGRpcmVjdGx5LlxuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gc3RyaW5nVXRpbHMudG9JZGVudGlmaWVyKGRlZi5uYW1lKTtcbiAgICBpZiAoc2x1ZykgcmV0dXJuIHNsdWc7XG4gIH1cbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgPyBGQUxMQkFDS19BR0VOVF9JRCA6IGBhZ2VudF8ke2luZGV4fWA7XG59XG5cbi8qKiBCdWlsdC1pbiBmYWxsYmFjayByZWdpc3RyeSB1c2VkIHdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCAvIGVtcHR5LiAqL1xuZnVuY3Rpb24gZmFsbGJhY2tEZWZpbml0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgcmV0dXJuIHtcbiAgICBbRkFMTEJBQ0tfQUdFTlRfSURdOiB7XG4gICAgICBuYW1lOiBcIkRlZmF1bHQgQWdlbnRcIixcbiAgICAgIGluc3RydWN0aW9uczogRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZWZmZWN0aXZlIG1vZGVsIHNwZWMgZm9yIGFuIGFnZW50LiBGYWxsYmFjayBsYWRkZXIsIGluXG4gKiBvcmRlcjpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yIGBEeW5hbWljQXJndW1lbnRgKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yXG4gKiAgICAgIGBEeW5hbWljQXJndW1lbnRgKSAtIG1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gKiAgIDMuIFRoZSBhdXRvLXJlc29sdmVyIHRoYXQgbWludHMgdXNlci1zY29wZWQgdG9rZW5zIGFnYWluc3RcbiAqICAgICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgdmlhIHtAbGluayBidWlsZE1vZGVsfS5cbiAqXG4gKiBTdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBtb2RlbElkYCBzdWdhciBhbmQgdGhyZWFkZWQgdGhyb3VnaFxuICogYGJ1aWxkTW9kZWxgJ3Mgb3ZlcnJpZGUgaG9vayBzbyB0aGUgcnVudGltZSBmdXp6eSBtYXRjaGVyIGFuZCB0aGVcbiAqIHBlci1yZXF1ZXN0IGBYLU1hc3RyYS1Nb2RlbGAgb3ZlcnJpZGUgbGF5ZXIgb24gdG9wIG9mIHRoZSBzdGF0aWNcbiAqIGNob2ljZS4gTm9uLXN0cmluZyBgRHluYW1pY0FyZ3VtZW50YHMgYXJlIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltO1xuICogY2FsbGVycyB0aGF0IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYHByb3ZpZGVySWRgIC8gYGhlYWRlcnNgIC9cbiAqIGBtb2RlbElkYCBieXBhc3MgdGhlIHJlc29sdmVyIHBpcGVsaW5lIGVudGlyZWx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBvdmVycmlkZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibW9kZWxcIl0sXG4pOiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gb3ZlcnJpZGUgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKGVmZmVjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZWZmZWN0aXZlO1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxJZCB9KTtcbiAgfVxuICByZXR1cm4gZWZmZWN0aXZlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBkZWZpbml0aW9uJ3MgYHRvb2xzYCBmaWVsZCB0byBhIGZsYXQgYE1hc3RyYVRvb2xzYCByZWNvcmQsXG4gKiBtZXJnaW5nIGluIHBsdWdpbi1sZXZlbCBhbWJpZW50IHRvb2xzIChwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleVxuICogY29sbGlzaW9uKS4gQ2FsbGJhY2sgZXJyb3JzIHByb3BhZ2F0ZSB2ZXJiYXRpbSBzbyB0aGUgb3JpZ2luYWwgc3RhY2tcbiAqIHN1cnZpdmVzIC0gdGhlIGNhbGxlciBhbHJlYWR5IGtub3dzIHdoaWNoIGFnZW50IHdhcyByZWdpc3RlcmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRvb2xzKFxuICBkZWZUb29sczogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1widG9vbHNcIl0sXG4gIHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMsXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHMsXG4pOiBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gIGlmICghZGVmVG9vbHMpIHJldHVybiB7IC4uLmFtYmllbnRUb29scyB9O1xuICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBkZWZUb29scyA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgZGVmVG9vbHMocGx1Z2lucykgOiBkZWZUb29scztcbiAgcmV0dXJuIHsgLi4uYW1iaWVudFRvb2xzLCAuLi5yZXNvbHZlZCB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoXG4gIHdvcmtzcGFjZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wid29ya3NwYWNlXCJdLFxuKTogV29ya3NwYWNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3b3Jrc3BhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygd29ya3NwYWNlID09PSBcImZ1bmN0aW9uXCIgPyB3b3Jrc3BhY2UoKSA6IHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHJ1bnRpbWUgcHJveHkgaGFuZGVkIHRvXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrcy5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIGBQcm94eWAgb3ZlciB0aGUgQXBwS2l0IHBsdWdpbiBjb250ZXh0IHNvXG4gKiBgcGx1Z2lucy48bmFtZT5gIHJlc29sdmVzIGF0IGZpcnN0IGFjY2Vzcy4gQW55IHNpYmxpbmcgcGx1Z2luIHRoYXRcbiAqIGltcGxlbWVudHMgQXBwS2l0J3Mgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYHRvb2xraXQob3B0cz8pYCArIGBleGVjdXRlQWdlbnRUb29sKG5hbWUsIGFyZ3MsIHNpZ25hbD8sIGNvbnRleHQ/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luLCBwcm9wTmFtZSk7XG59XG5cbnR5cGUgQ29udGV4dHVhbFRvb2xQcm92aWRlciA9IFBhcnRpYWw8UGljazxUb29sUHJvdmlkZXIsIFwiZ2V0QWdlbnRUb29sc1wiPj4gJiB7XG4gIHRvb2xraXQ/OiAoXG4gICAgb3B0cz86IFRvb2xraXRPcHRpb25zLFxuICApID0+XG4gICAgfCBSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+XG4gICAgfCBQcm9taXNlPFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT4+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiB7IHJlc291cmNlSWQ/OiBzdHJpbmcgfSxcbiAgKSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuLyoqXG4gKiBBZGFwdCBhbiBBcHBLaXQgYFRvb2xQcm92aWRlcmAgcGx1Z2luIGluc3RhbmNlIGludG8gYVxuICoge0BsaW5rIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcn0uIFJldHVybnMgYG51bGxgIGZvciBhbnkgcGx1Z2luXG4gKiB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50IGBleGVjdXRlQWdlbnRUb29sYCBwbHVzIGVpdGhlciBBcHBLaXQncyBuYXRpdmVcbiAqIGB0b29sa2l0YCBvciBgZ2V0QWdlbnRUb29sc2Agc3VyZmFjZS5cbiAqL1xuZnVuY3Rpb24gYWRhcHRQbHVnaW5Ub29sa2l0KFxuICBwbHVnaW46IHVua25vd24sXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAoIXBsdWdpbiB8fCB0eXBlb2YgcGx1Z2luICE9PSBcIm9iamVjdFwiKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcCA9IHBsdWdpbiBhcyBDb250ZXh0dWFsVG9vbFByb3ZpZGVyO1xuICBpZiAoXG4gICAgdHlwZW9mIHAuZXhlY3V0ZUFnZW50VG9vbCAhPT0gXCJmdW5jdGlvblwiIHx8XG4gICAgKHR5cGVvZiBwLnRvb2xraXQgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgcC5nZXRBZ2VudFRvb2xzICE9PSBcImZ1bmN0aW9uXCIpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChvcHRzPzogVG9vbGtpdE9wdGlvbnMpOiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgcC50b29sa2l0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHAudG9vbGtpdChvcHRzKVxuICAgICAgICAgIDogdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMocGx1Z2luTmFtZSwgcC5nZXRBZ2VudFRvb2xzISgpLCBvcHRzKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGVudHJpZXMpKSB7XG4gICAgICAgIHJldHVybiBlbnRyaWVzLnRoZW4oKHJlc29sdmVkKSA9PiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMocmVzb2x2ZWQsIHApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoZW50cmllcywgcCk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNGcm9tRGVmaW5pdGlvbnMoXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgZGVmaW5pdGlvbnM6IEFnZW50VG9vbERlZmluaXRpb25bXSxcbiAgb3B0aW9uczogVG9vbGtpdE9wdGlvbnMgPSB7fSxcbik6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4ge1xuICByZXR1cm4gdG9vbGtpdEVudHJpZXMuZW50cmllcyhwbHVnaW5OYW1lLCBkZWZpbml0aW9ucywgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+KTogdmFsdWUgaXMgUHJvbWlzZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgKHZhbHVlIGFzIHsgdGhlbj86IHVua25vd24gfSk/LnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZnVuY3Rpb24gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKFxuICBlbnRyaWVzOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+LFxuICBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIsXG4pOiBNYXN0cmFUb29scyB7XG4gIGNvbnN0IHRvb2xzOiBNYXN0cmFUb29scyA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgIHRvb2xzW2tleV0gPSB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnksIHBsdWdpbik7XG4gIH1cbiAgcmV0dXJuIHRvb2xzO1xufVxuXG4vKipcbiAqIFdyYXAgYSBzaW5nbGUge0BsaW5rIEFwcEtpdFRvb2xraXRFbnRyeX0gYXMgYSBNYXN0cmEgdG9vbCB3aG9zZVxuICogYGV4ZWN1dGVgIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIGBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCguLi4pYCBzb1xuICogQXBwS2l0J3MgT0JPIGF1dGggKGBhc1VzZXJgKSwgdGVsZW1ldHJ5IHNwYW5zLCBhbmQgdGhlIE1hc3RyYSBtZW1vcnkgcmVzb3VyY2VcbiAqIGlkIHN0YXkgaW50YWN0LiBKU09OIFNjaGVtYSBwYXJhbWV0ZXJzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQgLSBNYXN0cmEnc1xuICogYFB1YmxpY1NjaGVtYWAgYWNjZXB0cyBgSlNPTlNjaGVtYTdgIGRpcmVjdGx5IHZpYSBgQG1hc3RyYS9zY2hlbWEtY29tcGF0YC5cbiAqL1xuZnVuY3Rpb24gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5OiBUb29sa2l0RW50cnksIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcik6IFRvb2wge1xuICBjb25zdCBhbm5vdGF0aW9ucyA9IGVudHJ5LmFubm90YXRpb25zID8/IGVudHJ5LmRlZi5hbm5vdGF0aW9ucztcbiAgY29uc3QgZWZmZWN0ID0gYW5ub3RhdGlvbnM/LmVmZmVjdDtcbiAgY29uc3QgcmVxdWlyZXNBcHByb3ZhbCA9IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zPy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiBgJHtlbnRyeS5wbHVnaW5OYW1lfV9fJHtlbnRyeS5sb2NhbE5hbWV9YCxcbiAgICBkZXNjcmlwdGlvbjogZW50cnkuZGVmLmRlc2NyaXB0aW9uLFxuICAgIC4uLihlbnRyeS5kZWYucGFyYW1ldGVycyA/IHsgaW5wdXRTY2hlbWE6IGVudHJ5LmRlZi5wYXJhbWV0ZXJzIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgLi4uKHJlcXVpcmVzQXBwcm92YWwgPyB7IHJlcXVpcmVBcHByb3ZhbDogdHJ1ZSB9IDoge30pLFxuICAgIC4uLihhbm5vdGF0aW9uc1xuICAgICAgPyB7XG4gICAgICAgICAgbWNwOiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uczoge1xuICAgICAgICAgICAgICByZWFkT25seUhpbnQ6IGVmZmVjdCA9PT0gXCJyZWFkXCIgfHwgYW5ub3RhdGlvbnMucmVhZE9ubHkgPT09IHRydWUsXG4gICAgICAgICAgICAgIGRlc3RydWN0aXZlSGludDogZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnMuZGVzdHJ1Y3RpdmUgPT09IHRydWUsXG4gICAgICAgICAgICAgIGlkZW1wb3RlbnRIaW50OiBhbm5vdGF0aW9ucy5pZGVtcG90ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoaW5wdXQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbiA9IGNvbnRleHQgYXNcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ/OiB7IGdldChrZXk6IHN0cmluZyk6IHVua25vd24gfTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgZXhlY3V0aW9uPy5hYm9ydFNpZ25hbCwge1xuICAgICAgICAuLi4odHlwZW9mIHJlc291cmNlSWQgPT09IFwic3RyaW5nXCIgPyB7IHJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufVxuIl19
|