@mnaoumov/typescript-dev-toolkit 3.3.0 → 3.5.0
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/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library-build.cjs +3 -2
- package/dist/lib/cjs/validate-dependencies.cjs +150 -0
- package/dist/lib/cjs/validate-dependencies.d.cts +37 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library-build.mjs +3 -2
- package/dist/lib/esm/validate-dependencies.d.mts +37 -0
- package/dist/lib/esm/validate-dependencies.mjs +121 -0
- package/package.json +3 -1
package/dist/lib/cjs/index.cjs
CHANGED
|
@@ -66,6 +66,7 @@ __export(index_exports, {
|
|
|
66
66
|
"upstream-sync": () => upstream_sync,
|
|
67
67
|
"upstream-sync-cli": () => upstream_sync_cli,
|
|
68
68
|
"validate-declarations": () => validate_declarations,
|
|
69
|
+
"validate-dependencies": () => validate_dependencies,
|
|
69
70
|
version: () => version
|
|
70
71
|
});
|
|
71
72
|
module.exports = __toCommonJS(index_exports);
|
|
@@ -102,6 +103,7 @@ var test_runners = __toESM(((module) => module && module.__esModule && 'default'
|
|
|
102
103
|
var upstream_sync_cli = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./upstream-sync-cli.cjs')), 1);
|
|
103
104
|
var upstream_sync = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./upstream-sync.cjs')), 1);
|
|
104
105
|
var validate_declarations = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./validate-declarations.cjs')), 1);
|
|
106
|
+
var validate_dependencies = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./validate-dependencies.cjs')), 1);
|
|
105
107
|
var version = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./version.cjs')), 1);
|
|
106
108
|
// Annotate the CommonJS export names for ESM import in node:
|
|
107
109
|
0 && (module.exports = {
|
|
@@ -138,6 +140,7 @@ var version = __toESM(((module) => module && module.__esModule && 'default' in m
|
|
|
138
140
|
"upstream-sync": null,
|
|
139
141
|
"upstream-sync-cli": null,
|
|
140
142
|
"validate-declarations": null,
|
|
143
|
+
"validate-dependencies": null,
|
|
141
144
|
version
|
|
142
145
|
});
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidW5kbGVycycgZnJvbSAnLi9idW5kbGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnY2hlY2stcHJvamVjdC10eXBlcycgZnJvbSAnLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdjbGktdXRpbHMnIGZyb20gJy4vY2xpLXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdjb2RlLWdlbmVyYXRvcicgZnJvbSAnLi9jb2RlLWdlbmVyYXRvci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1jb25maWcnIGZyb20gJy4vY29tbWl0bGludC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyJyBmcm9tICcuL2NvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZScgZnJvbSAnLi9kb2NzLXNpdGUvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2Vudi10b2dnbGUnIGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5leHBvcnQgKiBhcyAnZXhlYycgZnJvbSAnLi9leGVjLnRzJztcbmV4cG9ydCAqIGFzICdmb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdmb3JtYXR0ZXJzJyBmcm9tICcuL2Zvcm1hdHRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2ZzJyBmcm9tICcuL2ZzLnRzJztcbmV4cG9ydCAqIGFzICdnYXRlJyBmcm9tICcuL2dhdGUudHMnO1xuZXhwb3J0ICogYXMgJ2dpdCcgZnJvbSAnLi9naXQudHMnO1xuZXhwb3J0ICogYXMgJ2pzb24nIGZyb20gJy4vanNvbi50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeS1idWlsZCcgZnJvbSAnLi9saWJyYXJ5LWJ1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbG9jay1pbnRlZ3JpdHknIGZyb20gJy4vcGFja2FnZS1sb2NrLWludGVncml0eS50cyc7XG5leHBvcnQgKiBhcyAncGFja2FnZS1tYW5hZ2VyJyBmcm9tICcuL3BhY2thZ2UtbWFuYWdlci50cyc7XG5leHBvcnQgKiBhcyAncmVsZWFzZWQtaXNzdWVzJyBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5leHBvcnQgKiBhcyAncmVwby1wYXRocycgZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3NoYXJlZC1jb25maWctZmlsZXMnIGZyb20gJy4vc2hhcmVkLWNvbmZpZy1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndXBzdHJlYW0tc3luYy1jbGknIGZyb20gJy4vdXBzdHJlYW0tc3luYy1jbGkudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMnIGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVwZW5kZW5jaWVzJyBmcm9tICcuL3ZhbGlkYXRlLWRlcGVuZGVuY2llcy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsK0JBQUFBO0FBQUEsRUFBQSxtQkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsMkJBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLHNDQUFBQztBQUFBLEVBQUEsbUJBQUFDO0FBQUEsRUFBQSxvQkFBQUM7QUFBQSxFQUFBO0FBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBQUFDO0FBQUEsRUFBQTtBQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLGlCQUFBQztBQUFBLEVBQUEsZ0NBQUFDO0FBQUEsRUFBQSx5QkFBQUM7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUEsb0JBQUFDO0FBQUEsRUFBQTtBQUFBLCtCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBLDJCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUE7QUFBQTtBQUVBLFlBQXlCO0FBQ3pCLGVBQTRCO0FBQzVCLElBQUF0QixzQkFBdUM7QUFDdkMsSUFBQUMsWUFBNkI7QUFDN0IsSUFBQUMsaUJBQWtDO0FBQ2xDLElBQUFDLG9CQUFxQztBQUNyQyxJQUFBQyxnQ0FBaUQ7QUFDakQsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLFlBQTZCO0FBQzdCLElBQUFDLGFBQThCO0FBQzlCLFdBQXdCO0FBQ3hCLElBQUFDLHFCQUFzQztBQUN0QyxpQkFBOEI7QUFDOUIsU0FBc0I7QUFDdEIsV0FBd0I7QUFDeEIsVUFBdUI7QUFDdkIsV0FBd0I7QUFDeEIsSUFBQUMsZ0JBQWlDO0FBQ2pDLGNBQTJCO0FBQzNCLElBQUFDLHFCQUFzQztBQUN0QyxJQUFBQyxjQUErQjtBQUMvQixJQUFBQyxVQUEyQjtBQUMzQixVQUF1QjtBQUN2QixJQUFBQyx5QkFBMEM7QUFDMUMsSUFBQUMsa0JBQW1DO0FBQ25DLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxhQUE4QjtBQUM5QixXQUF3QjtBQUN4QixJQUFBQyxzQkFBdUM7QUFDdkMsSUFBQUMsZUFBZ0M7QUFDaEMsSUFBQUUsb0JBQXFDO0FBQ3JDLElBQUFELGdCQUFpQztBQUNqQyxJQUFBRSx3QkFBeUM7QUFDekMsSUFBQUMsd0JBQXlDO0FBQ3pDLGNBQTJCOyIsCiAgIm5hbWVzIjogWyJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyIiwgImRvY3Mtc2l0ZSIsICJlbnYtdG9nZ2xlIiwgImZvcmJpZGRlbi1wYXR0ZXJucyIsICJsaWJyYXJ5LWJ1aWxkIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMiLCAidXBzdHJlYW0tc3luYy1jbGkiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
|
package/dist/lib/cjs/index.d.cts
CHANGED
|
@@ -36,4 +36,5 @@ export * as 'test-runners' from './test-runners/index.cjs';
|
|
|
36
36
|
export * as 'upstream-sync-cli' from './upstream-sync-cli.cjs';
|
|
37
37
|
export * as 'upstream-sync' from './upstream-sync.cjs';
|
|
38
38
|
export * as 'validate-declarations' from './validate-declarations.cjs';
|
|
39
|
+
export * as 'validate-dependencies' from './validate-dependencies.cjs';
|
|
39
40
|
export * as 'version' from './version.cjs';
|
|
@@ -113,7 +113,8 @@ const LIBRARY_BUILD_STEPS = [
|
|
|
113
113
|
"build:types",
|
|
114
114
|
"build:validate-declarations",
|
|
115
115
|
"build:lib",
|
|
116
|
-
"build:generate-exports"
|
|
116
|
+
"build:generate-exports",
|
|
117
|
+
"build:validate-dependencies"
|
|
117
118
|
];
|
|
118
119
|
const SOURCE_CONDITION = "@mnaoumov/source";
|
|
119
120
|
const DECLARATION_REFERENCE_TYPES = /* @__PURE__ */ new Set(["node"]);
|
|
@@ -544,4 +545,4 @@ async function writeSubpathPackageJson(folder, packageJson) {
|
|
|
544
545
|
generateLibraryIndex,
|
|
545
546
|
runBuildSteps
|
|
546
547
|
});
|
|
547
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIGZpbGVzIHRoYXQgYXJlIG5vdCBidWlsdCBmcm9tIGEgc291cmNlIGZvbGRlciAoYSBmb2xkZXIgb2Ygc2hhcmVkIGB0c2NvbmZpZ2AgcHJlc2V0cywgYW1iaWVudCBgLmQudHNgXG4gICAqIGZpbGVzKSwga2V5ZWQgYnkgc3VicGF0aC4gVGhleSBnbyBpbnRvIHRoZSBtYXAgYWZ0ZXIgdGhlIGdlbmVyYXRlZCBlbnRyaWVzLCBhcyBnaXZlbiwgYW5kIGNvdW50IHRvd2FyZCBpdHMgY2hhbmdlXG4gICAqIGNoZWNrOyBubyBzdWJwYXRoIHN0dWIgaXMgd3JpdHRlbiBmb3IgdGhlbS4gQSBrZXkgYSBzb3VyY2UgZm9sZGVyIGFscmVhZHkgZ2VuZXJhdGVzIHRocm93cy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxFeHBvcnRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGFja2FnZUpzb24uRXhwb3J0cz4+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgYSBob3N0J3MgZ2xvYmFscyByYXRoZXIgdGhhbiB0aGUgbGFuZ3VhZ2UsIHdoaWNoIGNvbnN1bWVycyBjb25mbGljdCBvdmVyLiBFYWNoIGRlY2xhcmF0aW9uXG4vLyBnZXRzIHRoZSBvbmVzIGl0IHVzZXM7IGV2ZXJ5IG90aGVyIGxpYiBpcyBzaGFyZWQgdGhyb3VnaCBgbGlicmFyeS1yZWZlcmVuY2VzYC5cbmNvbnN0IEVOVklST05NRU5UX0xJQl9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RvbScsICdzY3JpcHRob3N0JywgJ3dlYndvcmtlciddO1xuY29uc3QgTk9ERV9UWVBFU19QQVRIX1NFR01FTlQgPSAnL25vZGVfbW9kdWxlcy9AdHlwZXMvbm9kZS8nO1xuY29uc3QgTElCX1JFUExBQ0VNRU5UX1JFR19FWFAgPSAvXFwvbm9kZV9tb2R1bGVzXFwvQHR5cGVzY3JpcHRcXC9saWItKD88TGliPlteL10rKVxcLyg/PFN1YkxpYj4uKylcXC5kXFwudHMkLztcblxuLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQgY2FycmllcyBvbmx5IHRoZSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2VzLiBFdmVyeSBkZWNsYXJhdGlvbiBidXQgdGhlIHJvb3Qgb25lIHJlZmVyZW5jZXNcbi8vIGl0LCByYXRoZXIgdGhhbiB0aGUgcm9vdCBiYXJyZWwsIHdoaWNoIHdvdWxkIGxvYWQgZXZlcnkgbW9kdWxlIG9mIHRoZSBwYWNrYWdlLCBvcHRpb25hbCBwZWVycycgdHlwZXMgaW5jbHVkZWQuXG5jb25zdCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FID0gJ2xpYnJhcnktcmVmZXJlbmNlcyc7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldEV4cG9ydFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnM7XG4gIHJlYWRvbmx5IGlzV2lsZGNhcmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRvRGlzdFBhdGhQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW1wb3J0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVyeXRoaW5nIGFuIGVhcmxpZXIgYnVpbGQgbGVmdDogYGRpc3QvYCwgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgIGJhcnJlbHMsIHRoZSBgLmQudHNgIGZpbGVzIGB0c2NgIHdyb3RlXG4gKiBiZXNpZGUgdGhlIHNvdXJjZXMgKGhhbmQtYXV0aG9yZWQgb25lcyB1bmRlciBgQHR5cGVzYCBzdGF5KSwgYW5kIHRoZSBwZXItc3VicGF0aCBgcGFja2FnZS5qc29uYCBzdHVicy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnl0aGluZyBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbkxpYnJhcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGJ1aWxkQ2xlYW4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmIChiYXNlbmFtZShmaWxlKSA9PT0gUmVwb1BhdGhzLkluZGV4VHMgYXMgc3RyaW5nKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcykpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKChiYXNlbmFtZShmaWxlKSAhPT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgKGZpbGUgPT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IGZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuTm9kZU1vZHVsZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBybShmaWxlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBldmVyeSBzb3VyY2UgbW9kdWxlLCB1bmJ1bmRsZWQsIGludG8gYGRpc3QvbGliL2Nqc2AgKGAuY2pzYCkgYW5kIGBkaXN0L2xpYi9lc21gIChgLm1qc2ApLlxuICpcbiAqIFRoZSBvdXRwdXQgZm9sZGVycyBtdXN0IGFscmVhZHkgZXhpc3Q7IHtAbGluayBidWlsZExpYnJhcnlUeXBlc30gY3JlYXRlcyB0aGVtLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYm90aCBmb3JtYXRzIGhhdmUgYmVlbiBidWlsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeShvcHRpb25zOiBCdWlsZExpYnJhcnlPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSA9IChpc0VzbTogYm9vbGVhbik6IFBsdWdpbiA9PiBwcmVwcm9jZXNzUGx1Z2luKHsgaXNFc20gfSkgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpYkZpbGVzID0gYXdhaXQgZ2V0TGliRmlsZXMoKTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnY2pzJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdlc20nLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlY2xhcmF0aW9ucyB3aXRoIGB0c2MgLS1wcm9qZWN0IC4vdHNjb25maWcudHlwZXMuanNvbmAsIHRoZW4gY29waWVzIGVhY2ggb25lIGludG8gYGRpc3QvbGliYCB0d2ljZTogYXMgYVxuICogYC5kLmN0c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAuY2pzYCBmaWxlcyBhbmQgd2hvc2UgYmFyZSB0eXBlIGltcG9ydHMgY2FycnkgYHJlc29sdXRpb24tbW9kZTogaW1wb3J0YCwgYW5kXG4gKiBhcyBhIGAuZC5tdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLm1qc2AgZmlsZXMuXG4gKlxuICogVGhlIGxpYnJhcnkncyByb290IGRlY2xhcmF0aW9uIChgbGlicmFyeS50c2Agd2hlcmUgdGhlIHBhY2thZ2UgaGFzIG9uZSwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCkgY2Fycmllc1xuICogZXZlcnkgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlIHRoZSBwYWNrYWdlIG5lZWRzLiBFdmVyeSBvdGhlciBkZWNsYXJhdGlvbiByZWZlcmVuY2VzIGEgYGxpYnJhcnktcmVmZXJlbmNlc2BcbiAqIGRlY2xhcmF0aW9uIGJlc2lkZSBpdCBieSBwYXRoLCBuZXZlciB0aGUgcm9vdDogdGhlIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgZXZlcnkgbW9kdWxlLCBzbyByZWZlcmVuY2luZyBpdCBtYWRlIGVhY2hcbiAqIHN1YnBhdGggbG9hZCB0aGUgd2hvbGUgcGFja2FnZSwgYW5kIGEgY29uc3VtZXIgdHlwZS1jaGVja2luZyB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCB0aGVuIG5lZWRlZCBldmVyeSBvcHRpb25hbFxuICogcGVlciBpbnN0YWxsZWQuXG4gKlxuICogYGxpYnJhcnktcmVmZXJlbmNlc2AgY2FycmllcyBvbmx5IHRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgdGhlIGxhbmd1YWdlIChgZXMyMDIyYCwgYGVzbmV4dC5kaXNwb3NhYmxlYCksIHdoaWNoIG5vXG4gKiBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIG9uZXMgdGhhdCBkZXNjcmliZSBhIGhvc3QgKGBkb21gLCBgZG9tLml0ZXJhYmxlYCwgYHdlYndvcmtlcmApIGFuZCBgdHlwZXM9XCJub2RlXCJgIGdvXG4gKiBvbmx5IGludG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IG5hbWUgb25lIG9mIHRoZWlyIGdsb2JhbHMsIGZvdW5kIGJ5IHJlc29sdmluZyBldmVyeSBuYW1lIGluIHRoZSBlbWl0dGVkXG4gKiBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgdHlwZSBjaGVja2VyLiBPdGhlcndpc2UgYSBicm93c2VyIGNvbnN1bWVyIG9mIGEgcHVyZSBzdWJwYXRoIGdvdCBhbGwgb2YgYEB0eXBlcy9ub2RlYCwgYW5kIGl0c1xuICogYHNldFRpbWVvdXRgIHJldHVybmVkIGBOb2RlSlMuVGltZW91dGAuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWNsYXJhdGlvbnMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKiBAdGhyb3dzIElmIGEgc291cmNlIG1vZHVsZSBpcyBuYW1lZCBgbGlicmFyeS1yZWZlcmVuY2VzYCwgd2hpY2ggd291bGQgY29sbGlkZSB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlUeXBlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBgJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufWApKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3JjLyR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn0gY29sbGlkZXMgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIG5hbWUuYCk7XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1wcm9qZWN0JywgJy4vdHNjb25maWcudHlwZXMuanNvbiddKTtcblxuICBjb25zdCBsaWJyYXJ5RmlsZU5hbWUgPSBleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgJ2xpYnJhcnkudHMnKSkgPyAnbGlicmFyeScgOiAnaW5kZXgnO1xuICBjb25zdCBhbGxMaWJzID0gYXdhaXQgY29sbGVjdEFsbExpYnMoKTtcbiAgY29uc3QgYWxsVHlwZXMgPSBjb2xsZWN0QWxsVHlwZXMoKTtcbiAgY29uc3QgZGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKGFsbFR5cGVzKTtcbiAgLy8gT25seSB0aGUgbGlicyBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIGVudmlyb25tZW50IGdsb2JhbHMgZ28gdG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHVzZSB0aGVtLlxuICBjb25zdCBzaGFyZWREaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMuZmlsdGVyKChsaWIpID0+ICFpc0Vudmlyb25tZW50TGliKGxpYikpKTtcblxuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZXMgPSBzcmNGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKTtcbiAgY29uc3QgZW52aXJvbm1lbnREaXJlY3RpdmVzID0gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyh7IGF2YWlsYWJsZVR5cGVzOiBhbGxUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVEaXJlY3RpdmVzID0gZW52aXJvbm1lbnREaXJlY3RpdmVzLmdldChmaWxlKSA/PyAnJztcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogbXRzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShjdHNQYXRoLCBjdHNDb250ZW50KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobXRzUGF0aCwgbXRzQ29udGVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdlbmVyYXRlcyB0aGUgYGV4cG9ydHNgIG1hcCBvZiB0aGUgcGFja2FnZSdzIGBwYWNrYWdlLmpzb25gIGZyb20gaXRzIHNvdXJjZSBmb2xkZXJzLCBhbmQgd3JpdGVzIGEgYHBhY2thZ2UuanNvbmBcbiAqIHN0dWIgcGVyIHN1YnBhdGggZm9yIHJlc29sdmVycyB0aGF0IGRvIG5vdCByZWFkIGBleHBvcnRzYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtYXAgaXMgY3VycmVudC5cbiAqIEB0aHJvd3MgSWYgdGhlIG1hcCBjaGFuZ2VkLCBzbyB0aGUgY2hhbmdlIGdldHMgcmV2aWV3ZWQgYW5kIGNvbW1pdHRlZCByYXRoZXIgdGhhbiBzaGlwcGVkIHVuc2Vlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUV4cG9ydHMob3B0aW9uczogR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxFeHBvcnRzID0ge30sIHNvdXJjZUNvbmRpdGlvbiB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3JjRm9sZGVyczogc3RyaW5nW10gPSBbUmVwb1BhdGhzLlNyY107XG5cbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcblxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5TdHlsZXMpIHx8IHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3JjRm9sZGVycy5wdXNoKHBhdGgpO1xuICB9XG5cbiAgc3JjRm9sZGVycy5zb3J0KCk7XG5cbiAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbihhc3luYyAocGFja2FnZUpzb24pID0+IHtcbiAgICBjb25zdCBvbGRFeHBvcnRzID0gcGFja2FnZUpzb24uZXhwb3J0cztcbiAgICBjb25zdCBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zID0ge307XG4gICAgcGFja2FnZUpzb24uZXhwb3J0cyA9IGV4cG9ydENvbmRpdGlvbnM7XG4gICAgZm9yIChjb25zdCBzcmNGb2xkZXIgb2Ygc3JjRm9sZGVycykge1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogZmFsc2UsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogdHJ1ZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3VicGF0aCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxFeHBvcnRzKSkge1xuICAgICAgaWYgKGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhZGRpdGlvbmFsIGV4cG9ydCAnJHtzdWJwYXRofScgY29sbGlkZXMgd2l0aCBhbiBlbnRyeSBnZW5lcmF0ZWQgZnJvbSBhIHNvdXJjZSBmb2xkZXIuYCk7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gPSBlbnRyeTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwg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
|
|
548
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG50eXBlIE1vZHVsZUZvcm1hdCA9ICdjanMnIHwgJ2VzbSc7XG5cbmNvbnN0IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUyA9IG5ldyBTZXQoWydub2RlJ10pO1xuXG4vLyBUaGUgbGlicyB0aGF0IGRlc2NyaWJlIGEgaG9zdCdzIGdsb2JhbHMgcmF0aGVyIHRoYW4gdGhlIGxhbmd1YWdlLCB3aGljaCBjb25zdW1lcnMgY29uZmxpY3Qgb3Zlci4gRWFjaCBkZWNsYXJhdGlvblxuLy8gZ2V0cyB0aGUgb25lcyBpdCB1c2VzOyBldmVyeSBvdGhlciBsaWIgaXMgc2hhcmVkIHRocm91Z2ggYGxpYnJhcnktcmVmZXJlbmNlc2AuXG5jb25zdCBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkb20nLCAnc2NyaXB0aG9zdCcsICd3ZWJ3b3JrZXInXTtcbmNvbnN0IE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvQHR5cGVzL25vZGUvJztcbmNvbnN0IExJQl9SRVBMQUNFTUVOVF9SRUdfRVhQID0gL1xcL25vZGVfbW9kdWxlc1xcL0B0eXBlc2NyaXB0XFwvbGliLSg/PExpYj5bXi9dKylcXC8oPzxTdWJMaWI+LispXFwuZFxcLnRzJC87XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHN5bWJvbDogVHNTeW1ib2w7XG4gIHJlYWRvbmx5IHR5cGVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogTW9kdWxlRm9ybWF0O1xuICByZWFkb25seSBsaWJGaWxlczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5OiAoaXNFc206IGJvb2xlYW4pID0+IFBsdWdpbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZHVsZURpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGF2YWlsYWJsZVR5cGVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYXJyZWxzIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5SW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoUmVwb1BhdGhzLlNyYyk7XG59XG5cbi8qKlxuICogUnVucyBlYWNoIG5hbWVkIG5wbSBzY3JpcHQgdGhlIHBhY2thZ2UgZGVmaW5lcywgaW4gb3JkZXIsIHNraXBwaW5nIHRoZSBvbmVzIGl0IGRvZXMgbm90IGRlZmluZS5cbiAqXG4gKiBAcGFyYW0gc3RlcHMgLSBUaGUgbnBtIHNjcmlwdCBuYW1lcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzKHN0ZXBzOiByZWFkb25seSBzdHJpbmdbXSA9IExJQlJBUllfQlVJTERfU1RFUFMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoc3RlcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdoYXQgYSBjb25zdW1lciBuZWVkcyBsb2FkZWQgZm9yIG9uZSBzeW1ib2wgYSBkZWNsYXJhdGlvbiBuYW1lcy4gQSBzeW1ib2wgYW55IEVTIGxpYiBkZWNsYXJlcyBuZWVkcyBub3RoaW5nLFxuICogYmVjYXVzZSBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aCB0aG9zZSBsaWJzLiBPdGhlcndpc2UgZWFjaCBlbnZpcm9ubWVudCBsaWIgdGhhdCBkZWNsYXJlcyBpdCBhZGRzIGl0c2VsZiwgYW5kXG4gKiBmYWlsaW5nIHRoYXQgYEB0eXBlcy9ub2RlYCBhZGRzIGBub2RlYC4gQSBzeW1ib2wgZGVjbGFyZWQgaW4gdGhlIHBhY2thZ2UncyBvd24gZmlsZXMgYWRkcyBub3RoaW5nOiB0aGUgZGVjbGFyYXRpb25cbiAqIHRoYXQgaG9sZHMgaXQgY2FycmllcyBpdHMgb3duIGRpcmVjdGl2ZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzeW1ib2wsIHRoZSBwcm9ncmFtIGl0IHdhcyByZXNvbHZlZCBpbiwgYW5kIHRoZSBzZXRzIHRvIGFkZCB0by5cbiAqL1xuZnVuY3Rpb24gYWRkRW52aXJvbm1lbnRHbG9iYWxzKHBhcmFtczogQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sLCB0eXBlcyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnZpcm9ubWVudExpYnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpc05vZGUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgIGlmIChwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KHNvdXJjZUZpbGUpKSB7XG4gICAgICBjb25zdCBsaWIgPSB0b0xpYk5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBpZiAoIWlzRW52aXJvbm1lbnRMaWIobGliKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbnZpcm9ubWVudExpYnMucHVzaChsaWIpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlRmlsZS5maWxlTmFtZS5pbmNsdWRlcyhOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCkpIHtcbiAgICAgIGlzTm9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVudmlyb25tZW50TGlicy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgZW52aXJvbm1lbnRMaWJzKSB7XG4gICAgICBsaWJzLmFkZChsaWIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc05vZGUpIHtcbiAgICB0eXBlcy5hZGQoJ25vZGUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiB0b0xpYk5hbWUobGliKSkpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGl0cyBvbmUgZ3JvdXAsIHNvIG5vIGZhbGxiYWNrIGZvciBhIG1pc3Npbmcgb25lIGlzIG5lZWRlZC5cbiAgICBmb3IgKGNvbnN0IFssIGxpYl0gb2Ygc291cmNlQ29udGVudC5tYXRjaEFsbChSRUZFUkVOQ0VfTElCX1JFR19FWFApKSB7XG4gICAgICBsaWJzLmFkZChTdHJpbmcobGliKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmxpYnNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEFsbFR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICByZXR1cm4gKG9wdGlvbnMudHlwZXMgPz8gW10pXG4gICAgLmZpbHRlcigodHlwZSkgPT4gREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTLmhhcyh0eXBlKSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHBhcmFtczogQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGF2YWlsYWJsZVR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucywgbm9FbWl0OiB0cnVlIH0sXG4gICAgcm9vdE5hbWVzOiBkZWNsYXJhdGlvbkZpbGVzLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSlcbiAgfSk7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgLy8gVGhlIHByb2dyYW0gd2FzIGhhbmRlZCBldmVyeSBvbmUgb2YgdGhlc2UgYXMgYSByb290IG5hbWUsIHNvIGVhY2ggb25lIGlzIGluIGl0LlxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBlbnN1cmVOb25OdWxsYWJsZShwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICAgIGNvbnN0IGxpYnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSB8fCBpc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRFbnZpcm9ubWVudEdsb2JhbHMoeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2w6IHJlc29sdmVBbGlhcyhjaGVja2VyLCBzeW1ib2wpLCB0eXBlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG5cbiAgICBjb25zdCBuZWVkZWRUeXBlcyA9IFsuLi50eXBlc10uZmlsdGVyKCh0eXBlKSA9PiBhdmFpbGFibGVUeXBlcy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgaWYgKGxpYnMuc2l6ZSA+IDAgfHwgbmVlZGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgZGlyZWN0aXZlc0J5RmlsZS5zZXQoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIChsaWJzLnNpemUgPiAwID8gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKFsuLi5saWJzXS5zb3J0KCkpIDogJycpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMobmVlZGVkVHlwZXMuc29ydCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aXZlc0J5RmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFbnZpcm9ubWVudExpYihsaWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gbGliLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBuYW1lID09PSAnc2V0dXAudHMnIHx8IG5hbWUuZW5kc1dpdGgoJy1zZXR1cC50cycpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuSW5kZXhUcywgUmVwb1BhdGhzLlR5cGVzLCBSZXBvUGF0aHMuU3R5bGVzLCBSZXBvUGF0aHMuVGVzdEhlbHBlcnNdO1xuICBjb25zdCBpc0V4Y2x1ZGVkRW50cnkgPSBleGNsdWRlZE5hbWVzLmluY2x1ZGVzKGRpcmVudC5uYW1lKSB8fCBkaXJlbnQubmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSB8fCBmb2xkZXIuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICByZXR1cm4gaXNFeGNsdWRlZEVudHJ5IHx8IChkaXJlbnQuaXNGaWxlKCkgJiYgaXNFeGNsdWRlZEZpbGVOYW1lKGRpcmVudC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGlhcyhjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCk6IFRzU3ltYm9sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UgLS0gYFN5bWJvbEZsYWdzYCBpcyBhIGJpdCBzZXQuXG4gIHJldHVybiAoc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gc3ltYm9sIDogY2hlY2tlci5nZXRBbGlhc2VkU3ltYm9sKHN5bWJvbCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEV4cG9ydChwYXJhbXM6IFNldEV4cG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGltcG9ydFBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBzcmNGb2xkZXIsXG4gICAgcmVwbGFjZXI6IFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLFxuICAgIHNlYXJjaFZhbHVlOiBSZXBvUGF0aHMuU3JjXG4gIH0pO1xuICBjb25zdCBjb25kaXRpb25QYXRoID0gaXNXaWxkY2FyZCA/IGAke2ltcG9ydFBhdGh9LyR7UmVwb1BhdGhzLkFueX1gIDogaW1wb3J0UGF0aDtcbiAgY29uc3QgZG10c1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueURtdHMgOiBSZXBvUGF0aHMuSW5kZXhEbXRzIH0pO1xuICBjb25zdCBkY3RzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RGN0cyA6IFJlcG9QYXRocy5JbmRleERjdHMgfSk7XG4gIGNvbnN0IGRtdHNGb2xkZXJQYXRoID0gZGlybmFtZShkbXRzUGF0aCk7XG4gIGNvbnN0IGRjdHNGb2xkZXJQYXRoID0gZGlybmFtZShkY3RzUGF0aCk7XG5cbiAgaWYgKCFpc1dpbGRjYXJkICYmICFleGlzdHNTeW5jKGRjdHNQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzVHlwZXNPbmx5ID0gaW1wb3J0UGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICBjb25zdCBtanNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkVzbSwgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlNanMgOiBSZXBvUGF0aHMuSW5kZXhNanMgfSk7XG4gIGNvbnN0IGNqc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuQ2pzLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueUNqcyA6IFJlcG9QYXRocy5JbmRleENqcyB9KTtcblxuICBpZiAoaXNUeXBlc09ubHkpIHtcbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGltcG9ydFBhdGgsIGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55VHMgOiBSZXBvUGF0aHMuSW5kZXhUcykpO1xuXG4gICAgZXhwb3J0Q29uZGl0aW9uc1tjb25kaXRpb25QYXRoXSA9IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgICAgLy8gRmlyc3QsIHNvIGl0IHdpbnMgd2hlcmV2ZXIgaXQgaXMgc2V0OiBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIGJlZm9yZSBhbnl0aGluZyBpcyBidWlsdC5cbiAgICAgIC4uLihzb3VyY2VDb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IFtzb3VyY2VDb25kaXRpb25dOiBzb3VyY2VQYXRoIH0pLFxuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aCxcbiAgICAgICAgZGVmYXVsdDogbWpzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBjanNQYXRoXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgIH07XG4gIH1cblxuICBpZiAoaW1wb3J0UGF0aCA9PT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc1dpbGRjYXJkKSB7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBpbXBvcnRQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICAgICAgOiB7IG1haW46IHJlbGF0aXZlKGltcG9ydFBhdGgsIGNqc1BhdGgpLCBtb2R1bGU6IHJlbGF0aXZlKGltcG9ydFBhdGgsIG1qc1BhdGgpLCB0eXBlOiAnbW9kdWxlJywgdHlwZXM6IHJlbGF0aXZlKGltcG9ydFBhdGgsIGRjdHNQYXRoKSB9XG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRjdHNGb2xkZXJQYXRoKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uRm9sZGVyUGF0aCA9IGpvaW4oaW1wb3J0UGF0aCwgbmFtZSk7XG4gICAgY29uc3QgdHlwZXMgPSByZWxhdGl2ZShwYWNrYWdlSnNvbkZvbGRlclBhdGgsIGpvaW4oZGN0c0ZvbGRlclBhdGgsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpO1xuICAgIGF3YWl0IHdyaXRlU3VicGF0aFBhY2thZ2VKc29uKFxuICAgICAgcGFja2FnZUpzb25Gb2xkZXJQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlcyB9XG4gICAgICAgIDoge1xuICAgICAgICAgIG1haW46IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5DanNFeHRlbnNpb24pKSxcbiAgICAgICAgICBtb2R1bGU6IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkbXRzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5NanNFeHRlbnNpb24pKSxcbiAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICB0eXBlc1xuICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0N0c0NvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+LmNqc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5janMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuXG4gIC8vIEEgYC5kLmN0c2AgZmlsZSBpcyBhIENvbW1vbkpTIG1vZHVsZS4gVHlwZS1vbmx5IGltcG9ydHMgb2YgYSBiYXJlIHNwZWNpZmllciByZXNvbHZpbmcgdG8gYW5cbiAgLy8gRVNNLW9ubHkgcGFja2FnZSBuZWVkIGEgYHJlc29sdXRpb24tbW9kZWAgYXR0cmlidXRlLCBlbHNlIGB0c2NgIHJlcG9ydHMgVFMxNTQxIC8gVFMxNTQyLlxuICAvLyBQYXNzaW5nIGAnaW1wb3J0J2AgaXMgdmFsaWQgZm9yIENvbW1vbkpTIHRhcmdldHMgdG9vLCBzbyBldmVyeSBiYXJlIHNwZWNpZmllciByZWNlaXZlcyBpdC5cbiAgLy8gVGhlIEVTTSBgLmQubXRzYCBuZWVkcyBubyBzdWNoIGF0dHJpYnV0ZSwgc28gdGhpcyB0cmFuc2Zvcm0gcnVucyBvbiBDb21tb25KUyBjb250ZW50IG9ubHkuXG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0IHR5cGUgJDxDbGF1c2U+IGZyb20gXFwnJDxTcGVjaWZpZXI+XFwnIHdpdGggeyBcXCdyZXNvbHV0aW9uLW1vZGVcXCc6IFxcJ2ltcG9ydFxcJyB9OycsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoXCIkPFNwZWNpZmllcj5cIiwgeyB3aXRoOiB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH0gfSknLFxuICAgIHNlYXJjaFZhbHVlOiBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Rpc3RQYXRoKHBhcmFtczogVG9EaXN0UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIHBhcmFtcy5mb3JtYXQsIHBhcmFtcy5pbXBvcnRQYXRoLCBwYXJhbXMubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0xpYk5hbWUobGliRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgbGliIGEgcGFja2FnZSByZXBsYWNlZCAoYEB0eXBlc2NyaXB0L2xpYi1kb21gLCBgQHR5cGVzY3JpcHQvbGliLWRvbS9pdGVyYWJsZS5kLnRzYCkgaXMgbmFtZWQgYnkgaXRzIHBhdGgsIG5vdCBieVxuICAvLyBpdHMgZmlsZSBuYW1lLCB3aGljaCBpcyBgaW5kZXguZC50c2AgZm9yIHRoZSBsaWIncyByb290LlxuICBjb25zdCByZXBsYWNlbWVudE1hdGNoID0gTElCX1JFUExBQ0VNRU5UX1JFR19FWFAuZXhlYyhsaWJGaWxlUGF0aCk7XG4gIGlmIChyZXBsYWNlbWVudE1hdGNoPy5ncm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGJvdGggZ3JvdXBzLlxuICAgIGNvbnN0IGxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snTGliJ10pO1xuICAgIGNvbnN0IHN1YkxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snU3ViTGliJ10pO1xuICAgIHJldHVybiAoc3ViTGliID09PSAnaW5kZXgnID8gbGliIDogYCR7bGlifS4ke3N1YkxpYi5yZXBsYWNlQWxsKCcvJywgJy4nKX1gKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBiYXNlbmFtZShsaWJGaWxlUGF0aCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkEsbUJBQXlCO0FBQ3pCLDBCQUE0QjtBQUM1QixrQkFPTztBQUNQLG9CQUEyQjtBQUMzQix5QkFBa0M7QUFDbEMscUJBQXdCO0FBQ3hCLHFCQUdPO0FBQ1Asc0JBS087QUFDUCx1QkFHTztBQUNQLDBCQUFvQjtBQUNwQix3QkFNTztBQUlQLG1CQUEyQjtBQUMzQixxQ0FBc0M7QUFDdEMsNEJBQTZCO0FBQzdCLCtCQUFpQztBQUNqQyxpQ0FBOEI7QUFDOUIsNEJBQXlCO0FBQ3pCLGdCQUE2QjtBQUM3QixrQkFBMEI7QUFDMUIscUJBQStCO0FBQy9CLGlCQUFnQztBQUNoQyw2QkFBbUM7QUFDbkMsd0JBQTBCO0FBQzFCLGtCQUE2QjtBQUt0QixNQUFNLGlCQUFpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU3ZCLE1BQU0sc0JBQXlDO0FBQUEsRUFDcEQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFPTyxNQUFNLG1CQUFtQjtBQWtDaEMsTUFBTSw4QkFBOEIsb0JBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUlwRCxNQUFNLDJCQUE4QyxDQUFDLE9BQU8sY0FBYyxXQUFXO0FBQ3JGLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMEJBQTBCO0FBSWhDLE1BQU0sK0JBQStCO0FBR3JDLE1BQU0sMEJBQTBCLENBQUMsY0FBYyxNQUFNLEVBQUUsS0FBSyxHQUFHO0FBQy9ELE1BQU0sd0JBQXdCO0FBRzlCLE1BQU0sMkJBQTJCO0FBR2pDLE1BQU0sa0NBQWtDO0FBRXhDLE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0seUJBQXlCO0FBa0QvQixlQUFzQixvQkFBbUM7QUFDdkQsWUFBTSx5QkFBVztBQUNqQixhQUFXLFFBQVEsVUFBTSx3QkFBYSw0QkFBVSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUMsR0FBRztBQUN6RSxZQUFJLHNCQUFTLElBQUksTUFBTSw0QkFBVSxTQUFtQjtBQUNsRCxnQkFBTSx3QkFBRyxrQkFBSyw0QkFBVSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3BDO0FBRUEsUUFBSSxLQUFLLFNBQVMsNEJBQVUsWUFBWSxLQUFLLENBQUMsS0FBSyxNQUFNLEdBQUcsRUFBRSxTQUFTLDRCQUFVLEtBQUssR0FBRztBQUN2RixnQkFBTSx3QkFBRyxrQkFBSyw0QkFBVSxLQUFLLElBQUksQ0FBQztBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUVBLGFBQVcsUUFBUSxVQUFNLHdCQUFhLDRCQUFVLGVBQWUsRUFBRSxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQ25GLFlBQUssc0JBQVMsSUFBSSxNQUFNLDRCQUFVLGVBQTJCLFNBQVMsNEJBQVUsZUFBMEIsS0FBSyxXQUFXLDRCQUFVLFdBQVcsR0FBRztBQUNoSjtBQUFBLElBQ0Y7QUFFQSxjQUFNLG9CQUFHLElBQUk7QUFBQSxFQUNmO0FBQ0Y7QUFVQSxlQUFzQixhQUFhLFVBQStCLENBQUMsR0FBa0I7QUFDbkYsUUFBTSxFQUFFLDBCQUEwQixDQUFDLGNBQTJCLDJDQUFpQixFQUFFLE1BQU0sQ0FBQyxFQUFFLElBQUk7QUFDOUYsUUFBTSxXQUFXLE1BQU0sWUFBWTtBQUNuQyxRQUFNLG1CQUFtQixFQUFFLFFBQVEsT0FBTyxVQUFVLHdCQUF3QixDQUFDO0FBQzdFLFFBQU0sbUJBQW1CLEVBQUUsUUFBUSxPQUFPLFVBQVUsd0JBQXdCLENBQUM7QUFDL0U7QUFzQkEsZUFBc0Isb0JBQW1DO0FBQ3ZELFVBQUksK0JBQVcsa0JBQUssNEJBQVUsS0FBSyxHQUFHLDRCQUE0QixHQUFHLDRCQUFVLFdBQVcsRUFBRSxDQUFDLEdBQUc7QUFDOUYsVUFBTSxJQUFJLE1BQU0sT0FBTyw0QkFBNEIsR0FBRyw0QkFBVSxXQUFXLDREQUE0RDtBQUFBLEVBQ3pJO0FBRUEsWUFBTSwwQkFBYSxDQUFDLE9BQUcsMkNBQW1CLEVBQUUsTUFBTSxNQUFNLENBQUMsR0FBRyxhQUFhLHVCQUF1QixDQUFDO0FBRWpHLFFBQU0sc0JBQWtCLCtCQUFXLGtCQUFLLDRCQUFVLEtBQUssWUFBWSxDQUFDLElBQUksWUFBWTtBQUNwRixRQUFNLFVBQVUsTUFBTSxlQUFlO0FBQ3JDLFFBQU0sV0FBVyxnQkFBZ0I7QUFDakMsUUFBTSxhQUFhLCtCQUErQixPQUFPLElBQUksaUNBQWlDLFFBQVE7QUFFdEcsUUFBTSxtQkFBbUIsK0JBQStCLFFBQVEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFFdkcsWUFBTSwyQkFBTSxrQkFBSyw0QkFBVSxTQUFTLDRCQUFVLEdBQUcsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ3ZFLFlBQU0sMkJBQU0sa0JBQUssNEJBQVUsU0FBUyw0QkFBVSxHQUFHLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN2RSxZQUFNLCtCQUFVLGtCQUFLLDRCQUFVLFNBQVMsNEJBQVUsS0FBSywrQkFBK0IsNEJBQVUsYUFBYSxHQUFHLGdCQUFnQjtBQUNoSSxZQUFNLCtCQUFVLGtCQUFLLDRCQUFVLFNBQVMsNEJBQVUsS0FBSywrQkFBK0IsNEJBQVUsYUFBYSxHQUFHLGdCQUFnQjtBQUVoSSxRQUFNLFdBQVcsVUFBTSx3QkFBYSw0QkFBVSxLQUFLLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDdEUsUUFBTSxtQkFBbUIsU0FBUyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsNEJBQVUsWUFBWSxLQUFLLENBQUMsS0FBSyxXQUFXLDRCQUFVLFdBQVcsQ0FBQztBQUNuSSxRQUFNLHdCQUF3Qiw2QkFBNkIsRUFBRSxnQkFBZ0IsVUFBVSxpQkFBaUIsQ0FBQztBQUV6RyxhQUFXLFFBQVEsa0JBQWtCO0FBQ25DLFVBQU0sYUFBUyxxQkFBUSxJQUFJO0FBQzNCLFVBQU0sV0FBTyxzQkFBUyxNQUFNLDRCQUFVLFlBQVk7QUFDbEQsVUFBTSxVQUFVLFVBQU0sOEJBQVMsa0JBQUssNEJBQVUsS0FBSyxJQUFJLEdBQUcsT0FBTztBQUVqRSxVQUFNLGNBQVUsa0JBQUssNEJBQVUsU0FBUyw0QkFBVSxLQUFLLFFBQVEsT0FBTyw0QkFBVSxhQUFhO0FBQzdGLFVBQU0sY0FBVSxrQkFBSyw0QkFBVSxTQUFTLDRCQUFVLEtBQUssUUFBUSxPQUFPLDRCQUFVLGFBQWE7QUFFN0YsY0FBTSwyQkFBTSxxQkFBUSxPQUFPLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNqRCxjQUFNLDJCQUFNLHFCQUFRLE9BQU8sR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBRWpELFFBQUksYUFBYSxhQUFhLE9BQU87QUFDckMsUUFBSSxhQUFhLGFBQWEsT0FBTztBQUVyQyxRQUFJLFNBQVMsbUJBQW1CLFdBQVcsS0FBSztBQUM5QyxtQkFBYSxhQUFhO0FBQzFCLG1CQUFhLGFBQWE7QUFBQSxJQUM1QixPQUFPO0FBQ0wsWUFBTSxpQkFBaUIsc0JBQXNCLElBQUksSUFBSSxLQUFLO0FBQzFELG1CQUFhLDRCQUE0QixFQUFFLHFCQUFxQixTQUFTLFdBQVcsNEJBQVUsZUFBZSxpQkFBaUIsNEJBQVUsSUFBSSxDQUFDLElBQ3pJLGlCQUFpQjtBQUNyQixtQkFBYSw0QkFBNEIsRUFBRSxxQkFBcUIsU0FBUyxXQUFXLDRCQUFVLGVBQWUsaUJBQWlCLDRCQUFVLElBQUksQ0FBQyxJQUN6SSxpQkFBaUI7QUFBQSxJQUN2QjtBQUVBLGNBQU0sMkJBQVUsU0FBUyxVQUFVO0FBQ25DLGNBQU0sMkJBQVUsU0FBUyxVQUFVO0FBQUEsRUFDckM7QUFDRjtBQVVBLGVBQXNCLHVCQUF1QixVQUF5QyxDQUFDLEdBQWtCO0FBQ3ZHLFFBQU0sRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLGdCQUFnQixJQUFJO0FBQ3BELFFBQU0sYUFBdUIsQ0FBQyw0QkFBVSxHQUFHO0FBRTNDLGFBQVcsVUFBVSxVQUFNLHdCQUFhLDRCQUFVLEtBQUssRUFBRSxXQUFXLE1BQU0sZUFBZSxLQUFLLENBQUMsR0FBRztBQUNoRyxRQUFJLENBQUMsT0FBTyxZQUFZLEdBQUc7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxXQUFPLGtCQUFLLE9BQU8sWUFBWSxPQUFPLElBQUk7QUFFaEQsUUFBSSxLQUFLLFNBQVMsNEJBQVUsTUFBTSxLQUFLLEtBQUssU0FBUyw0QkFBVSxXQUFXLEdBQUc7QUFDM0U7QUFBQSxJQUNGO0FBRUEsZUFBVyxLQUFLLElBQUk7QUFBQSxFQUN0QjtBQUVBLGFBQVcsS0FBSztBQUVoQixNQUFJLFlBQVk7QUFFaEIsWUFBTSw0QkFBZ0IsT0FBTyxnQkFBZ0I7QUFDM0MsVUFBTSxhQUFhLFlBQVk7QUFDL0IsVUFBTSxtQkFBaUQsQ0FBQztBQUN4RCxnQkFBWSxVQUFVO0FBQ3RCLGVBQVcsYUFBYSxZQUFZO0FBQ2xDLFlBQU0sVUFBVSxFQUFFLGtCQUFrQixZQUFZLE9BQU8saUJBQWlCLFVBQVUsQ0FBQztBQUNuRixZQUFNLFVBQVUsRUFBRSxrQkFBa0IsWUFBWSxNQUFNLGlCQUFpQixVQUFVLENBQUM7QUFBQSxJQUNwRjtBQUVBLGVBQVcsQ0FBQyxTQUFTLEtBQUssS0FBSyxPQUFPLFFBQVEsaUJBQWlCLEdBQUc7QUFDaEUsVUFBSSxpQkFBaUIsT0FBTyxNQUFNLFFBQVc7QUFDM0MsY0FBTSxJQUFJLE1BQU0sMEJBQTBCLE9BQU8sMERBQTBEO0FBQUEsTUFDN0c7QUFFQSx1QkFBaUIsT0FBTyxJQUFJO0FBQUEsSUFDOUI7QUFFQSxnQkFBWSxLQUFDLGlDQUFZLFlBQVksWUFBWSxPQUFPO0FBQUEsRUFDMUQsQ0FBQztBQUdELE1BQUksV0FBVztBQUNiLFVBQU0sSUFBSSxNQUFNLDBFQUEwRTtBQUFBLEVBQzVGO0FBQ0Y7QUFRQSxlQUFzQix1QkFBc0M7QUFDMUQsUUFBTSxjQUFjLDRCQUFVLEdBQUc7QUFDbkM7QUFRQSxlQUFzQixjQUFjLFFBQTJCLHFCQUFvQztBQUNqRyxhQUFXLFFBQVEsT0FBTztBQUN4QixjQUFNLCtCQUFlLElBQUk7QUFBQSxFQUMzQjtBQUNGO0FBVUEsU0FBUyxzQkFBc0IsUUFBMkM7QUFDeEUsUUFBTSxFQUFFLE1BQU0sU0FBUyxRQUFRLE1BQU0sSUFBSTtBQUN6QyxRQUFNLGtCQUE0QixDQUFDO0FBQ25DLE1BQUksU0FBUztBQUViLGFBQVcsZUFBZSxPQUFPLGdCQUFnQixDQUFDLEdBQUc7QUFDbkQsVUFBTSxhQUFhLFlBQVksY0FBYztBQUM3QyxRQUFJLFFBQVEsMkJBQTJCLFVBQVUsR0FBRztBQUNsRCxZQUFNLE1BQU0sVUFBVSxXQUFXLFFBQVE7QUFDekMsVUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUc7QUFDMUI7QUFBQSxNQUNGO0FBQ0Esc0JBQWdCLEtBQUssR0FBRztBQUFBLElBQzFCLFdBQVcsV0FBVyxTQUFTLFNBQVMsdUJBQXVCLEdBQUc7QUFDaEUsZUFBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBRUEsTUFBSSxnQkFBZ0IsU0FBUyxHQUFHO0FBQzlCLGVBQVcsT0FBTyxpQkFBaUI7QUFDakMsV0FBSyxJQUFJLEdBQUc7QUFBQSxJQUNkO0FBQUEsRUFDRixXQUFXLFFBQVE7QUFDakIsVUFBTSxJQUFJLE1BQU07QUFBQSxFQUNsQjtBQUNGO0FBRUEsU0FBUywrQkFBK0IsTUFBd0I7QUFDOUQsU0FBTyxHQUNMLEtBQ0csSUFBSSxDQUFDLFFBQVEsT0FBTyx1QkFBdUIsSUFBSSxHQUFHLE1BQU0sRUFDeEQsS0FBSyxJQUFJLENBQ2Q7QUFBQTtBQUNGO0FBRUEsU0FBUyxpQ0FBaUMsT0FBeUI7QUFDakUsU0FBTyxNQUFNLFdBQVcsSUFDcEIsS0FDQSxHQUNBLE1BQ0csSUFBSSxDQUFDLFNBQVMseUJBQXlCLElBQUksTUFBTSxFQUNqRCxLQUFLLElBQUksQ0FDZDtBQUFBO0FBQ0o7QUFFQSxlQUFlLG1CQUFtQixRQUFpRDtBQUNqRixRQUFNLEVBQUUsUUFBUSxVQUFVLHdCQUF3QixJQUFJO0FBQ3RELFFBQU0sWUFBWSxXQUFXLFFBQVEsNEJBQVUsZUFBZSw0QkFBVTtBQUN4RSxRQUFNLGVBQTZCO0FBQUE7QUFBQTtBQUFBLElBR2pDLGVBQWUsb0JBQUFBLFFBQVEsSUFBSTtBQUFBLElBQzNCLFFBQVE7QUFBQSxNQUNOLElBQUk7QUFBQSxJQUNOO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixhQUFhO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1YsWUFBUSxrQkFBSyw0QkFBVSxTQUFTLE1BQU07QUFBQSxJQUN0QyxVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsTUFDUCx3QkFBd0IsV0FBVyxLQUFLO0FBQUEsVUFDeEMsb0NBQWE7QUFBQSxVQUNiLHNEQUFzQixTQUFTO0FBQUEsSUFDakM7QUFBQSxJQUNBLFdBQVc7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLGFBQWE7QUFBQSxJQUNiLE9BQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLFVBQU0sd0JBQVEsWUFBWTtBQUMvQyxNQUFJO0FBQ0YsVUFBTSxhQUFhLFFBQVE7QUFBQSxFQUM3QixVQUFFO0FBQ0EsVUFBTSxhQUFhLFFBQVE7QUFBQSxFQUM3QjtBQUNGO0FBRUEsU0FBUyw0QkFBNEIsUUFBbUQ7QUFDdEYsUUFBTSxFQUFFLHFCQUFxQixXQUFXLGdCQUFnQixJQUFJO0FBQzVELFFBQU0sc0JBQWtCLGtCQUFLLDRCQUFVLFNBQVMsaUJBQWlCLCtCQUErQixTQUFTO0FBQ3pHLE1BQUksbUJBQWUsaUJBQUFDLGNBQWUscUJBQVEsbUJBQW1CLEdBQUcsZUFBZSxFQUFFLFdBQVcsTUFBTSxHQUFHO0FBQ3JHLE1BQUksQ0FBQyxhQUFhLFdBQVcsR0FBRyxHQUFHO0FBQ2pDLG1CQUFlLEtBQUssWUFBWTtBQUFBLEVBQ2xDO0FBQ0EsU0FBTyx3QkFBd0IsWUFBWTtBQUFBO0FBQzdDO0FBRUEsZUFBZSxpQkFBb0M7QUFHakQsUUFBTSxFQUFFLFFBQVEsUUFBSSwwQ0FBYyw0QkFBVSxZQUFZO0FBQ3hELFFBQU0sT0FBTyxJQUFJLEtBQUssUUFBUSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBRXJFLGFBQVcsUUFBUSxVQUFNLHdCQUFhLDRCQUFVLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQyxHQUFHO0FBQ3pFLFFBQUksQ0FBQyxLQUFLLFNBQVMsS0FBSyxHQUFHO0FBQ3pCO0FBQUEsSUFDRjtBQUVBLFVBQU0sb0JBQWdCLGlDQUFhLGtCQUFLLDRCQUFVLEtBQUssSUFBSSxHQUFHLE9BQU87QUFFckUsZUFBVyxDQUFDLEVBQUUsR0FBRyxLQUFLLGNBQWMsU0FBUyxxQkFBcUIsR0FBRztBQUNuRSxXQUFLLElBQUksT0FBTyxHQUFHLEVBQUUsWUFBWSxDQUFDO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBRUEsU0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUs7QUFDeEI7QUFFQSxTQUFTLGtCQUE0QjtBQUNuQyxRQUFNLEVBQUUsUUFBUSxRQUFJLDBDQUFjLDRCQUFVLFlBQVk7QUFDeEQsVUFBUSxRQUFRLFNBQVMsQ0FBQyxHQUN2QixPQUFPLENBQUMsU0FBUyw0QkFBNEIsSUFBSSxJQUFJLENBQUMsRUFDdEQsS0FBSztBQUNWO0FBRUEsU0FBUyw2QkFBNkIsUUFBaUU7QUFDckcsUUFBTSxFQUFFLGdCQUFnQixpQkFBaUIsSUFBSTtBQUM3QyxRQUFNLEVBQUUsUUFBUSxRQUFJLDBDQUFjLDRCQUFVLFlBQVk7QUFDeEQsUUFBTSxjQUFVLGlDQUFjO0FBQUEsSUFDNUIsU0FBUyxFQUFFLEdBQUcsU0FBUyxRQUFRLEtBQUs7QUFBQSxJQUNwQyxXQUFXLGlCQUFpQixJQUFJLENBQUMsYUFBUyxpQkFBQUMsU0FBYyw0QkFBVSxLQUFLLElBQUksQ0FBQztBQUFBLEVBQzlFLENBQUM7QUFDRCxRQUFNLFVBQVUsUUFBUSxlQUFlO0FBQ3ZDLFFBQU0sbUJBQW1CLG9CQUFJLElBQW9CO0FBRWpELGFBQVcsUUFBUSxrQkFBa0I7QUFNbkMsUUFBU0MsU0FBVCxTQUFlLE1BQWtCO0FBQy9CLGNBQUksZ0NBQWEsSUFBSSxTQUFLLG1DQUFnQixJQUFJLEdBQUc7QUFDL0MsY0FBTSxTQUFTLFFBQVEsb0JBQW9CLElBQUk7QUFDL0MsWUFBSSxXQUFXLFFBQVc7QUFDeEIsZ0NBQXNCLEVBQUUsTUFBTSxTQUFTLFFBQVEsYUFBYSxTQUFTLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFBQSxRQUN2RjtBQUFBLE1BQ0Y7QUFDQSwwQ0FBYSxNQUFNQSxNQUFLO0FBQUEsSUFDMUI7QUFSUyxnQkFBQUE7QUFKVCxVQUFNLGlCQUFhLHNDQUFrQixRQUFRLGtCQUFjLGlCQUFBRCxTQUFjLDRCQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDOUYsVUFBTSxPQUFPLG9CQUFJLElBQVk7QUFDN0IsVUFBTSxRQUFRLG9CQUFJLElBQVk7QUFXOUIsSUFBQUMsT0FBTSxVQUFVO0FBRWhCLFVBQU0sY0FBYyxDQUFDLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxTQUFTLGVBQWUsU0FBUyxJQUFJLENBQUM7QUFDN0UsUUFBSSxLQUFLLE9BQU8sS0FBSyxZQUFZLFNBQVMsR0FBRztBQUMzQyx1QkFBaUI7QUFBQSxRQUNmO0FBQUEsU0FDQyxLQUFLLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLGlDQUFpQyxZQUFZLEtBQUssQ0FBQztBQUFBLE1BQy9IO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxlQUFlLGNBQWMsUUFBOEM7QUFDekUsUUFBTSxVQUFVLFVBQU0sd0JBQWEsUUFBUSxFQUFFLGVBQWUsS0FBSyxDQUFDO0FBQ2xFLFFBQU0sYUFBYSxVQUFNLHVCQUFTLFNBQVMsQ0FBQyxXQUFXLGtCQUFrQixRQUFRLE1BQU0sQ0FBQztBQUN4RixRQUFNLFFBQVEsV0FBVyxPQUFPLENBQUMsU0FBUyxTQUFTLE1BQVM7QUFFNUQsTUFBSSxNQUFNLFdBQVcsR0FBRztBQUN0QixXQUFPO0FBQUEsRUFDVDtBQUVBLFlBQU0sb0NBQVMsa0JBQUssUUFBUSw0QkFBVSxPQUFPLEdBQUcsS0FBSztBQUNyRCxTQUFPO0FBQ1Q7QUFFQSxlQUFlLGNBQWlDO0FBQzlDLE1BQUksUUFBUSxVQUFNLHdCQUFhLDRCQUFVLEtBQUssRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNqRSxVQUFRLE1BQU0sSUFBSSxDQUFDLGFBQVMscUNBQW9CLGtCQUFLLDRCQUFVLEtBQUssSUFBSSxDQUFDLENBQUM7QUFDMUUsU0FBTyxNQUFNO0FBQUEsSUFBTyxDQUFDLFNBQ25CLEtBQUssU0FBUyw0QkFBVSxXQUFXLEtBQUssQ0FBQyxLQUFLLFNBQVMsNEJBQVUsWUFBWSxLQUFLLENBQUMsS0FBSyxTQUFTLFVBQVUsS0FDeEcsQ0FBQyxLQUFLLFNBQVMsSUFBSSw0QkFBVSxXQUFXLEdBQUc7QUFBQSxFQUNoRDtBQUNGO0FBRUEsZUFBZSxrQkFBa0IsUUFBZ0IsUUFBNkM7QUFDNUYsTUFBSSxvQkFBb0IsUUFBUSxNQUFNLEdBQUc7QUFDdkM7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNKLE1BQUk7QUFDSixNQUFJLE9BQU8sWUFBWSxHQUFHO0FBQ3hCLFVBQU0sU0FBUyxNQUFNLGtCQUFjLGtCQUFLLFFBQVEsT0FBTyxJQUFJLENBQUM7QUFDNUQsUUFBSSxXQUFXLHlCQUE2QjtBQUMxQztBQUFBLElBQ0Y7QUFDQSxxQkFBYSxxQ0FBb0Isa0JBQUssT0FBTyxNQUFNLDRCQUFVLE9BQU8sQ0FBQztBQUNyRSxXQUFPLE9BQU87QUFBQSxFQUNoQixPQUFPO0FBQ0wsVUFBTSxnQkFBWSxxQkFBUSxPQUFPLElBQUk7QUFDckMsZUFBTyxzQkFBUyxPQUFPLE1BQU0sU0FBUztBQUN0QyxxQkFBYSxpQ0FBb0IsT0FBTyxJQUFJO0FBQUEsRUFDOUM7QUFFQSxTQUFPLGdCQUFnQixJQUFJLFdBQVcsVUFBVTtBQUNsRDtBQUVBLFNBQVMsaUJBQWlCLEtBQXNCO0FBQzlDLFNBQU8seUJBQXlCLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxNQUFNLENBQUM7QUFDekU7QUFFQSxTQUFTLG1CQUFtQixNQUF1QjtBQUNqRCxTQUFPLENBQUMsS0FBSyxTQUFTLDRCQUFVLFdBQVcsS0FBSyxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsY0FBYyxLQUFLLFNBQVMsV0FBVztBQUMvSDtBQUVBLFNBQVMsb0JBQW9CLFFBQWdCLFFBQXlCO0FBQ3BFLFFBQU0sZ0JBQW1DLENBQUMsNEJBQVUsU0FBUyw0QkFBVSxPQUFPLDRCQUFVLFFBQVEsNEJBQVUsV0FBVztBQUNySCxRQUFNLGtCQUFrQixjQUFjLFNBQVMsT0FBTyxJQUFJLEtBQUssT0FBTyxLQUFLLFNBQVMsNEJBQVUsWUFBWSxLQUFLLE9BQU8sTUFBTSxHQUFHLEVBQUUsU0FBUyw0QkFBVSxLQUFLO0FBQ3pKLFNBQU8sbUJBQW9CLE9BQU8sT0FBTyxLQUFLLG1CQUFtQixPQUFPLElBQUk7QUFDOUU7QUFFQSxTQUFTLGFBQWEsU0FBc0IsUUFBNEI7QUFFdEUsVUFBUSxPQUFPLFFBQVEsOEJBQVksV0FBVyxJQUFJLFNBQVMsUUFBUSxpQkFBaUIsTUFBTTtBQUM1RjtBQUVBLGVBQWUsVUFBVSxRQUF3QztBQUMvRCxRQUFNLEVBQUUsa0JBQWtCLFlBQVksaUJBQWlCLFVBQVUsSUFBSTtBQUNyRSxRQUFNLGlCQUFhLDBCQUFXO0FBQUEsSUFDNUIsU0FBUztBQUFBLElBQ1QsVUFBVSw0QkFBVTtBQUFBLElBQ3BCLGFBQWEsNEJBQVU7QUFBQSxFQUN6QixDQUFDO0FBQ0QsUUFBTSxnQkFBZ0IsYUFBYSxHQUFHLFVBQVUsSUFBSSw0QkFBVSxHQUFHLEtBQUs7QUFDdEUsUUFBTSxXQUFXLFdBQVcsRUFBRSxRQUFRLDRCQUFVLEtBQUssWUFBWSxNQUFNLGFBQWEsNEJBQVUsVUFBVSw0QkFBVSxVQUFVLENBQUM7QUFDN0gsUUFBTSxXQUFXLFdBQVcsRUFBRSxRQUFRLDRCQUFVLEtBQUssWUFBWSxNQUFNLGFBQWEsNEJBQVUsVUFBVSw0QkFBVSxVQUFVLENBQUM7QUFDN0gsUUFBTSxxQkFBaUIscUJBQVEsUUFBUTtBQUN2QyxRQUFNLHFCQUFpQixxQkFBUSxRQUFRO0FBRXZDLE1BQUksQ0FBQyxjQUFjLEtBQUMsMkJBQVcsUUFBUSxHQUFHO0FBQ3hDO0FBQUEsRUFDRjtBQUVBLFFBQU0sY0FBYyxXQUFXLFNBQVMsNEJBQVUsS0FBSztBQUN2RCxRQUFNLFVBQVUsV0FBVyxFQUFFLFFBQVEsNEJBQVUsS0FBSyxZQUFZLE1BQU0sYUFBYSw0QkFBVSxTQUFTLDRCQUFVLFNBQVMsQ0FBQztBQUMxSCxRQUFNLFVBQVUsV0FBVyxFQUFFLFFBQVEsNEJBQVUsS0FBSyxZQUFZLE1BQU0sYUFBYSw0QkFBVSxTQUFTLDRCQUFVLFNBQVMsQ0FBQztBQUUxSCxNQUFJLGFBQWE7QUFDZixxQkFBaUIsYUFBYSxJQUFJO0FBQUEsTUFDaEMsUUFBUTtBQUFBLFFBQ04sT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLFNBQVM7QUFBQSxRQUNQLE9BQU87QUFBQSxNQUNUO0FBQUEsSUFDRjtBQUFBLEVBQ0YsT0FBTztBQUNMLFVBQU0saUJBQWEscUNBQW9CLGtCQUFLLDRCQUFVLEtBQUssWUFBWSxhQUFhLDRCQUFVLFFBQVEsNEJBQVUsT0FBTyxDQUFDO0FBRXhILHFCQUFpQixhQUFhLElBQUk7QUFBQTtBQUFBO0FBQUEsTUFHaEMsR0FBSSxvQkFBb0IsVUFBYSxFQUFFLENBQUMsZUFBZSxHQUFHLFdBQVc7QUFBQSxNQUNyRSxRQUFRO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsTUFDWDtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsU0FBUztBQUFBLE1BQ1g7QUFBQTtBQUFBLElBRUY7QUFBQSxFQUNGO0FBRUEsTUFBSSxlQUFlLDRCQUFVLGVBQXlCO0FBQ3BEO0FBQUEsRUFDRjtBQUVBLE1BQUksQ0FBQyxZQUFZO0FBQ2YsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBLGNBQ0ksRUFBRSxNQUFNLFVBQVUsV0FBTyxzQkFBUyxZQUFZLFFBQVEsRUFBRSxJQUN4RCxFQUFFLFVBQU0sc0JBQVMsWUFBWSxPQUFPLEdBQUcsWUFBUSxzQkFBUyxZQUFZLE9BQU8sR0FBRyxNQUFNLFVBQVUsV0FBTyxzQkFBUyxZQUFZLFFBQVEsRUFBRTtBQUFBLElBQzFJO0FBQ0E7QUFBQSxFQUNGO0FBRUEsYUFBVyxRQUFRLFVBQU0sd0JBQWEsY0FBYyxHQUFHO0FBQ3JELFFBQUksQ0FBQyxLQUFLLFNBQVMsNEJBQVUsYUFBYSxHQUFHO0FBQzNDO0FBQUEsSUFDRjtBQUNBLFVBQU0sV0FBTyxzQkFBUyxNQUFNLDRCQUFVLGFBQWE7QUFDbkQsVUFBTSw0QkFBd0Isa0JBQUssWUFBWSxJQUFJO0FBQ25ELFVBQU0sWUFBUSxzQkFBUywyQkFBdUIsa0JBQUssZ0JBQWdCLE9BQU8sNEJBQVUsYUFBYSxDQUFDO0FBQ2xHLFVBQU07QUFBQSxNQUNKO0FBQUEsTUFDQSxjQUNJLEVBQUUsTUFBTSxVQUFVLE1BQU0sSUFDeEI7QUFBQSxRQUNBLFVBQU0sc0JBQVMsMkJBQXVCLGtCQUFLLGdCQUFnQixPQUFPLDRCQUFVLFlBQVksQ0FBQztBQUFBLFFBQ3pGLFlBQVEsc0JBQVMsMkJBQXVCLGtCQUFLLGdCQUFnQixPQUFPLDRCQUFVLFlBQVksQ0FBQztBQUFBLFFBQzNGLE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDRjtBQUFBLElBQ0o7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGFBQWEsU0FBeUI7QUFDN0MsTUFBSSxpQkFBYSwwQkFBVztBQUFBLElBQzFCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxtQkFBYSwwQkFBVztBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFNRCxtQkFBYSwwQkFBVztBQUFBLElBQ3RCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNIO0FBRUEsU0FBUyxXQUFXLFFBQWtDO0FBQ3BELGFBQU8scUNBQW9CLGtCQUFLLDRCQUFVLFNBQVMsT0FBTyxRQUFRLE9BQU8sWUFBWSxPQUFPLElBQUksQ0FBQztBQUNuRztBQUVBLFNBQVMsVUFBVSxhQUE2QjtBQUc5QyxRQUFNLG1CQUFtQix3QkFBd0IsS0FBSyxXQUFXO0FBQ2pFLE1BQUksa0JBQWtCLFdBQVcsUUFBVztBQUUxQyxVQUFNLE1BQU0sT0FBTyxpQkFBaUIsT0FBTyxLQUFLLENBQUM7QUFDakQsVUFBTSxTQUFTLE9BQU8saUJBQWlCLE9BQU8sUUFBUSxDQUFDO0FBQ3ZELFlBQVEsV0FBVyxVQUFVLE1BQU0sR0FBRyxHQUFHLElBQUksT0FBTyxXQUFXLEtBQUssR0FBRyxDQUFDLElBQUksWUFBWTtBQUFBLEVBQzFGO0FBQ0EsYUFBTyxzQkFBUyxXQUFXLEVBQUUsWUFBWSxFQUFFLFFBQVEsVUFBVSxFQUFFLEVBQUUsUUFBUSxZQUFZLEVBQUU7QUFDekY7QUFFQSxTQUFTLGFBQWEsU0FBeUI7QUFDN0MsUUFBTSxpQkFBYSwwQkFBVztBQUFBLElBQzVCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNIO0FBRUEsZUFBZSx3QkFBd0IsUUFBZ0IsYUFBeUM7QUFDOUYsWUFBTSx1QkFBTSxRQUFRLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDdkMsWUFBTSwyQkFBVSxrQkFBSyxRQUFRLDRCQUFVLFdBQVcsR0FBRyxXQUFXO0FBQ2xFOyIsIm5hbWVzIjpbInByb2Nlc3MiLCJyZWxhdGl2ZU5hdGl2ZSIsInJlc29sdmVOYXRpdmUiLCJ2aXNpdCJdfQ==
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
"use strict";
|
|
40
|
+
var __create = Object.create;
|
|
41
|
+
var __defProp = Object.defineProperty;
|
|
42
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
43
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
44
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
45
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
46
|
+
var __export = (target, all) => {
|
|
47
|
+
for (var name in all)
|
|
48
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
49
|
+
};
|
|
50
|
+
var __copyProps = (to, from, except, desc) => {
|
|
51
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
52
|
+
for (let key of __getOwnPropNames(from))
|
|
53
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
54
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
55
|
+
}
|
|
56
|
+
return to;
|
|
57
|
+
};
|
|
58
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
59
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
60
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
61
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
62
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
63
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
64
|
+
mod
|
|
65
|
+
));
|
|
66
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
67
|
+
var validate_dependencies_exports = {};
|
|
68
|
+
__export(validate_dependencies_exports, {
|
|
69
|
+
DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS: () => DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS,
|
|
70
|
+
validateDependencies: () => validateDependencies
|
|
71
|
+
});
|
|
72
|
+
module.exports = __toCommonJS(validate_dependencies_exports);
|
|
73
|
+
var import_node_fs = require('node:fs');
|
|
74
|
+
var import_promises = require('node:fs/promises');
|
|
75
|
+
var import_node_module = require('node:module');
|
|
76
|
+
var import_node_path = require('node:path');
|
|
77
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
78
|
+
var import_typescript = require('typescript');
|
|
79
|
+
var import_npm = require('./npm.cjs');
|
|
80
|
+
var import_repo_paths = require('./repo-paths.cjs');
|
|
81
|
+
const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS = [import_repo_paths.RepoPaths.DistLib, "bin"];
|
|
82
|
+
const ELECTRON_BUILTIN_PACKAGE_NAMES = /* @__PURE__ */ new Set(["electron", "original-fs"]);
|
|
83
|
+
const NODE_SCHEME = "node:";
|
|
84
|
+
const DECLARATION_FILE_PATTERN = /\.d\.(?:cts|mts|ts)$/u;
|
|
85
|
+
const SCANNED_FILE_PATTERN = /\.(?:cjs|cts|js|mjs|mts|ts)$/u;
|
|
86
|
+
const TYPES_SCOPE = "@types/";
|
|
87
|
+
const SCOPED_PACKAGE_NAME_SEGMENT_COUNT = 2;
|
|
88
|
+
async function validateDependencies(options = {}) {
|
|
89
|
+
const root = import_node_process.default.cwd();
|
|
90
|
+
const packageJson = await (0, import_npm.readPackageJson)(root);
|
|
91
|
+
const installedPackageNames = /* @__PURE__ */ new Set([
|
|
92
|
+
...Object.keys(packageJson.dependencies ?? {}),
|
|
93
|
+
...Object.keys(packageJson.optionalDependencies ?? {}),
|
|
94
|
+
...Object.keys(packageJson.peerDependencies ?? {})
|
|
95
|
+
]);
|
|
96
|
+
if (packageJson.name) {
|
|
97
|
+
installedPackageNames.add(packageJson.name);
|
|
98
|
+
}
|
|
99
|
+
const undeclaredImports = [];
|
|
100
|
+
for (const folder of options.folders ?? DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS) {
|
|
101
|
+
for (const filePath of await getFilePaths((0, import_node_path.join)(root, folder))) {
|
|
102
|
+
const isDeclarationFile = DECLARATION_FILE_PATTERN.test(filePath);
|
|
103
|
+
for (const specifier of getImportSpecifiers(await (0, import_promises.readFile)(filePath, "utf-8"))) {
|
|
104
|
+
const packageName = getPackageName(specifier);
|
|
105
|
+
if (packageName === null || installedPackageNames.has(packageName)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (isDeclarationFile && installedPackageNames.has(getTypesPackageName(packageName))) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
undeclaredImports.push(`${(0, import_node_path.relative)(root, filePath).replaceAll("\\", "/")}: ${specifier}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (undeclaredImports.length > 0) {
|
|
116
|
+
throw new Error(
|
|
117
|
+
`The published output imports packages that are not in dependencies, optionalDependencies or peerDependencies:
|
|
118
|
+
${undeclaredImports.join("\n")}`
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function getFilePaths(folder) {
|
|
123
|
+
if (!(0, import_node_fs.existsSync)(folder)) {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const entries = await (0, import_promises.readdir)(folder, { recursive: true, withFileTypes: true });
|
|
127
|
+
return entries.filter((entry) => entry.isFile() && SCANNED_FILE_PATTERN.test(entry.name)).map((entry) => (0, import_node_path.join)(entry.parentPath, entry.name)).sort();
|
|
128
|
+
}
|
|
129
|
+
function getImportSpecifiers(sourceText) {
|
|
130
|
+
const { importedFiles } = (0, import_typescript.preProcessFile)(sourceText, true, true);
|
|
131
|
+
return importedFiles.map((importedFile) => importedFile.fileName);
|
|
132
|
+
}
|
|
133
|
+
function getPackageName(specifier) {
|
|
134
|
+
if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith(NODE_SCHEME) || (0, import_node_module.isBuiltin)(specifier)) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const segments = specifier.split("/");
|
|
138
|
+
const segmentCount = specifier.startsWith("@") ? SCOPED_PACKAGE_NAME_SEGMENT_COUNT : 1;
|
|
139
|
+
const packageName = segments.slice(0, segmentCount).join("/");
|
|
140
|
+
return ELECTRON_BUILTIN_PACKAGE_NAMES.has(packageName) ? null : packageName;
|
|
141
|
+
}
|
|
142
|
+
function getTypesPackageName(packageName) {
|
|
143
|
+
return TYPES_SCOPE + packageName.replace(/^@/u, "").replace("/", "__");
|
|
144
|
+
}
|
|
145
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
146
|
+
0 && (module.exports = {
|
|
147
|
+
DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS,
|
|
148
|
+
validateDependencies
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBidWlsdGluIChhbnkgYG5vZGU6YCBzcGVjaWZpZXIsIE5vZGUncyBvd24sIGFuZCBFbGVjdHJvbidzIGBlbGVjdHJvbmAgYW5kIGBvcmlnaW5hbC1mc2ApOyBhIGRlY2xhcmF0aW9uXG4gKiBmaWxlJ3MgaW1wb3J0IG1heSBhbHNvIGJlIHNlcnZlZCBieSB0aGUgcGFja2FnZSdzIGBAdHlwZXNgIG9uZS4gQSBwYWNrYWdlIGluXG4gKiBgZGV2RGVwZW5kZW5jaWVzYCBvbmx5IGlzIHByZXNlbnQgaW4gdGhlIHBhY2thZ2UncyBvd24gcmVwb3NpdG9yeSBhbmQgYWJzZW50IGZyb20gYVxuICogY29uc3VtZXIncyBpbnN0YWxsLCBzbyBub3RoaW5nIHRoZXJlIGZhaWxzLCBhbmQgdGhlIGNvbnN1bWVyIGdldHMgYENhbm5vdCBmaW5kIG1vZHVsZWAuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0J1aWx0aW4gfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHByZVByb2Nlc3NGaWxlIH0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5cbi8qKlxuICogVGhlIGZvbGRlcnMge0BsaW5rIHZhbGlkYXRlRGVwZW5kZW5jaWVzfSBzY2FucyB3aGVuIG5vbmUgYXJlIGdpdmVuLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WQUxJREFURV9ERVBFTkRFTkNJRVNfRk9MREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUmVwb1BhdGhzLkRpc3RMaWIsICdiaW4nXTtcblxuLyoqXG4gKiBUaGUgbW9kdWxlcyBFbGVjdHJvbiBwcm92aWRlcyB0byBpdHMgb3duIHByb2Nlc3Nlcywgd2hpY2ggbm8gcGFja2FnZSBpbnN0YWxsczogTm9kZSdzIGBpc0J1aWx0aW5gIGRvZXMgbm90IGtub3cgdGhlbS5cbiAqIGBlbGVjdHJvbmAgYWxzbyBjb3ZlcnMgaXRzIGBlbGVjdHJvbi9tYWluYCwgYGVsZWN0cm9uL3JlbmRlcmVyYCBhbmQgYGVsZWN0cm9uL2NvbW1vbmAgc3VicGF0aHMuXG4gKi9cbmNvbnN0IEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydlbGVjdHJvbicsICdvcmlnaW5hbC1mcyddKTtcbmNvbnN0IE5PREVfU0NIRU1FID0gJ25vZGU6JztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGEgYnVpbHRpbiBvZiBOb2RlIG9yIEVsZWN0cm9uLCBvciBhbnlcbiAqIGBub2RlOmAtc2NoZW1lIHNwZWNpZmllcjogbm8gcGFja2FnZSBuYW1lIGNhbiBzdGFydCB3aXRoIGBub2RlOmAsIGFuZCBFbGVjdHJvbidzIGBub2RlOm9yaWdpbmFsLWZzYCBpcyBvbmUgTm9kZSdzIG93blxuICogbGlzdCBsYWNrcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aChOT0RFX1NDSEVNRSkgfHwgaXNCdWlsdGluKHNwZWNpZmllcilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICBjb25zdCBzZWdtZW50Q291bnQgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gU0NPUEVEX1BBQ0tBR0VfTkFNRV9TRUdNRU5UX0NPVU5UIDogMTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBzZWdtZW50cy5zbGljZSgwLCBzZWdtZW50Q291bnQpLmpvaW4oJy8nKTtcbiAgcmV0dXJuIEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUy5oYXMocGFja2FnZU5hbWUpID8gbnVsbCA6IHBhY2thZ2VOYW1lO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIERlZmluaXRlbHlUeXBlZCBwYWNrYWdlIHRoYXQgZGVjbGFyZXMgYSBwYWNrYWdlJ3MgdHlwZXMsIHdoaWNoIGlzIHdoYXQgYSBkZWNsYXJhdGlvbiBmaWxlJ3MgaW1wb3J0IG9mXG4gKiB0aGF0IHBhY2thZ2UgcmVzb2x2ZXMgdG8gd2hlbiB0aGUgcGFja2FnZSBzaGlwcyBubyB0eXBlcyBvZiBpdHMgb3duIChgZXN0cmVlYCDihpIgYEB0eXBlcy9lc3RyZWVgLFxuICogYEBzY29wZS9uYW1lYCDihpIgYEB0eXBlcy9zY29wZV9fbmFtZWApLlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBwYWNrYWdlIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgYEB0eXBlc2AgcGFja2FnZSBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlc1BhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVFlQRVNfU0NPUEUgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQC91LCAnJykucmVwbGFjZSgnLycsICdfXycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxxQkFBMkI7QUFDM0Isc0JBR087QUFDUCx5QkFBMEI7QUFDMUIsdUJBR087QUFDUCwwQkFBb0I7QUFDcEIsd0JBQStCO0FBRS9CLGlCQUFnQztBQUNoQyx3QkFBMEI7QUFLbkIsTUFBTSx3Q0FBMkQsQ0FBQyw0QkFBVSxTQUFTLEtBQUs7QUFNakcsTUFBTSxpQ0FBc0Qsb0JBQUksSUFBSSxDQUFDLFlBQVksYUFBYSxDQUFDO0FBQy9GLE1BQU0sY0FBYztBQUNwQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxvQ0FBb0M7QUFzQjFDLGVBQXNCLHFCQUFxQixVQUF1QyxDQUFDLEdBQWtCO0FBQ25HLFFBQU0sT0FBTyxvQkFBQUEsUUFBUSxJQUFJO0FBQ3pCLFFBQU0sY0FBYyxVQUFNLDRCQUFnQixJQUFJO0FBQzlDLFFBQU0sd0JBQXdCLG9CQUFJLElBQUk7QUFBQSxJQUNwQyxHQUFHLE9BQU8sS0FBSyxZQUFZLGdCQUFnQixDQUFDLENBQUM7QUFB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
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Fails the build when the published output imports a package that `package.json` does not install for a consumer.
|
|
6
|
+
*
|
|
7
|
+
* Every bare specifier in the scanned folders (`dist/lib` and `bin` by default, code and declarations, ESM and
|
|
8
|
+
* CommonJS) must name a package in `dependencies`, `optionalDependencies` or `peerDependencies`, the package itself,
|
|
9
|
+
* or a builtin (any `node:` specifier, Node's own, and Electron's `electron` and `original-fs`); a declaration
|
|
10
|
+
* file's import may also be served by the package's `@types` one. A package in
|
|
11
|
+
* `devDependencies` only is present in the package's own repository and absent from a
|
|
12
|
+
* consumer's install, so nothing there fails, and the consumer gets `Cannot find module`.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The folders {@link validateDependencies} scans when none are given.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* Options for {@link validateDependencies}.
|
|
20
|
+
*/
|
|
21
|
+
export interface ValidateDependenciesOptions {
|
|
22
|
+
/**
|
|
23
|
+
* The folders to scan, relative to the current working folder. A folder that does not exist is skipped.
|
|
24
|
+
*
|
|
25
|
+
* @default {@link DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS}
|
|
26
|
+
*/
|
|
27
|
+
readonly folders?: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks that every bare import in the published output names a package a consumer installs.
|
|
31
|
+
*
|
|
32
|
+
* @param options - The options controlling which folders are scanned.
|
|
33
|
+
* @returns A {@link Promise} that resolves when every import is declared.
|
|
34
|
+
* @throws If any import names a package that is not in `dependencies`, `optionalDependencies` or `peerDependencies`,
|
|
35
|
+
* the package itself, or a Node builtin. The error lists each offending file and specifier.
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateDependencies(options?: ValidateDependenciesOptions): Promise<void>;
|
package/dist/lib/esm/index.d.mts
CHANGED
|
@@ -36,4 +36,5 @@ export * as 'test-runners' from './test-runners/index.mjs';
|
|
|
36
36
|
export * as 'upstream-sync-cli' from './upstream-sync-cli.mjs';
|
|
37
37
|
export * as 'upstream-sync' from './upstream-sync.mjs';
|
|
38
38
|
export * as 'validate-declarations' from './validate-declarations.mjs';
|
|
39
|
+
export * as 'validate-dependencies' from './validate-dependencies.mjs';
|
|
39
40
|
export * as 'version' from './version.mjs';
|
package/dist/lib/esm/index.mjs
CHANGED
|
@@ -36,6 +36,7 @@ import * as test_runners from "./test-runners/index.mjs";
|
|
|
36
36
|
import * as upstream_sync_cli from "./upstream-sync-cli.mjs";
|
|
37
37
|
import * as upstream_sync from "./upstream-sync.mjs";
|
|
38
38
|
import * as validate_declarations from "./validate-declarations.mjs";
|
|
39
|
+
import * as validate_dependencies from "./validate-dependencies.mjs";
|
|
39
40
|
import * as version from "./version.mjs";
|
|
40
41
|
export {
|
|
41
42
|
build,
|
|
@@ -71,6 +72,7 @@ export {
|
|
|
71
72
|
upstream_sync as "upstream-sync",
|
|
72
73
|
upstream_sync_cli as "upstream-sync-cli",
|
|
73
74
|
validate_declarations as "validate-declarations",
|
|
75
|
+
validate_dependencies as "validate-dependencies",
|
|
74
76
|
version
|
|
75
77
|
};
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2J1aWxkJyBmcm9tICcuL2J1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdidW5kbGVycycgZnJvbSAnLi9idW5kbGVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAnY2hlY2stcHJvamVjdC10eXBlcycgZnJvbSAnLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcbmV4cG9ydCAqIGFzICdjbGktdXRpbHMnIGZyb20gJy4vY2xpLXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdjb2RlLWdlbmVyYXRvcicgZnJvbSAnLi9jb2RlLWdlbmVyYXRvci50cyc7XG5leHBvcnQgKiBhcyAnY29tbWl0bGludC1jb25maWcnIGZyb20gJy4vY29tbWl0bGludC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zJyBmcm9tICcuL2NvbW1pdGxpbnQtZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyJyBmcm9tICcuL2NvbW1pdGxpbnQtc3BlbGxjaGVjay1oZWFkZXIudHMnO1xuZXhwb3J0ICogYXMgJ2RvY3Mtc2l0ZScgZnJvbSAnLi9kb2NzLXNpdGUvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2Vudi10b2dnbGUnIGZyb20gJy4vZW52LXRvZ2dsZS50cyc7XG5leHBvcnQgKiBhcyAnZXhlYycgZnJvbSAnLi9leGVjLnRzJztcbmV4cG9ydCAqIGFzICdmb3JiaWRkZW4tcGF0dGVybnMnIGZyb20gJy4vZm9yYmlkZGVuLXBhdHRlcm5zLnRzJztcbmV4cG9ydCAqIGFzICdmb3JtYXR0ZXJzJyBmcm9tICcuL2Zvcm1hdHRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ2ZzJyBmcm9tICcuL2ZzLnRzJztcbmV4cG9ydCAqIGFzICdnYXRlJyBmcm9tICcuL2dhdGUudHMnO1xuZXhwb3J0ICogYXMgJ2dpdCcgZnJvbSAnLi9naXQudHMnO1xuZXhwb3J0ICogYXMgJ2pzb24nIGZyb20gJy4vanNvbi50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeS1idWlsZCcgZnJvbSAnLi9saWJyYXJ5LWJ1aWxkLnRzJztcbmV4cG9ydCAqIGFzICdsaW50ZXJzJyBmcm9tICcuL2xpbnRlcnMvaW5kZXgudHMnO1xuZXhwb3J0ICogYXMgJ25hbm8tc3RhZ2VkLWNvbmZpZycgZnJvbSAnLi9uYW5vLXN0YWdlZC1jb25maWcudHMnO1xuZXhwb3J0ICogYXMgJ25wbS1wdWJsaXNoJyBmcm9tICcuL25wbS1wdWJsaXNoLnRzJztcbmV4cG9ydCAqIGFzICducG0tcnVuJyBmcm9tICcuL25wbS1ydW4udHMnO1xuZXhwb3J0ICogYXMgJ25wbScgZnJvbSAnLi9ucG0udHMnO1xuZXhwb3J0ICogYXMgJ3BhY2thZ2UtbG9jay1pbnRlZ3JpdHknIGZyb20gJy4vcGFja2FnZS1sb2NrLWludGVncml0eS50cyc7XG5leHBvcnQgKiBhcyAncGFja2FnZS1tYW5hZ2VyJyBmcm9tICcuL3BhY2thZ2UtbWFuYWdlci50cyc7XG5leHBvcnQgKiBhcyAncmVsZWFzZWQtaXNzdWVzJyBmcm9tICcuL3JlbGVhc2VkLWlzc3Vlcy50cyc7XG5leHBvcnQgKiBhcyAncmVwby1wYXRocycgZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmV4cG9ydCAqIGFzICdyb290JyBmcm9tICcuL3Jvb3QudHMnO1xuZXhwb3J0ICogYXMgJ3NoYXJlZC1jb25maWctZmlsZXMnIGZyb20gJy4vc2hhcmVkLWNvbmZpZy1maWxlcy50cyc7XG5leHBvcnQgKiBhcyAndGVzdC1ydW5uZXJzJyBmcm9tICcuL3Rlc3QtcnVubmVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndXBzdHJlYW0tc3luYy1jbGknIGZyb20gJy4vdXBzdHJlYW0tc3luYy1jbGkudHMnO1xuZXhwb3J0ICogYXMgJ3Vwc3RyZWFtLXN5bmMnIGZyb20gJy4vdXBzdHJlYW0tc3luYy50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVjbGFyYXRpb25zJyBmcm9tICcuL3ZhbGlkYXRlLWRlY2xhcmF0aW9ucy50cyc7XG5leHBvcnQgKiBhcyAndmFsaWRhdGUtZGVwZW5kZW5jaWVzJyBmcm9tICcuL3ZhbGlkYXRlLWRlcGVuZGVuY2llcy50cyc7XG5leHBvcnQgKiBhcyAndmVyc2lvbicgZnJvbSAnLi92ZXJzaW9uLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWSxXQUFhO0FBQ3pCLFlBQVksY0FBZ0I7QUFDNUIsWUFBWUEseUJBQTJCO0FBQ3ZDLFlBQVlDLGVBQWlCO0FBQzdCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyx1QkFBeUI7QUFDckMsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGtDQUFvQztBQUNoRCxZQUFZQyxlQUFpQjtBQUM3QixZQUFZQyxnQkFBa0I7QUFDOUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZLGdCQUFrQjtBQUM5QixZQUFZLFFBQVU7QUFDdEIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksU0FBVztBQUN2QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVksYUFBZTtBQUMzQixZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGFBQWU7QUFDM0IsWUFBWSxTQUFXO0FBQ3ZCLFlBQVlDLDRCQUE4QjtBQUMxQyxZQUFZQyxxQkFBdUI7QUFDbkMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLGdCQUFrQjtBQUM5QixZQUFZLFVBQVk7QUFDeEIsWUFBWUMseUJBQTJCO0FBQ3ZDLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyx1QkFBeUI7QUFDckMsWUFBWUMsbUJBQXFCO0FBQ2pDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWSxhQUFlOyIsCiAgIm5hbWVzIjogWyJjaGVjay1wcm9qZWN0LXR5cGVzIiwgImNsaS11dGlscyIsICJjb2RlLWdlbmVyYXRvciIsICJjb21taXRsaW50LWNvbmZpZyIsICJjb21taXRsaW50LWZvcmJpZGRlbi1wYXR0ZXJucyIsICJjb21taXRsaW50LXNwZWxsY2hlY2staGVhZGVyIiwgImRvY3Mtc2l0ZSIsICJlbnYtdG9nZ2xlIiwgImZvcmJpZGRlbi1wYXR0ZXJucyIsICJsaWJyYXJ5LWJ1aWxkIiwgIm5hbm8tc3RhZ2VkLWNvbmZpZyIsICJucG0tcHVibGlzaCIsICJucG0tcnVuIiwgInBhY2thZ2UtbG9jay1pbnRlZ3JpdHkiLCAicGFja2FnZS1tYW5hZ2VyIiwgInJlbGVhc2VkLWlzc3VlcyIsICJyZXBvLXBhdGhzIiwgInNoYXJlZC1jb25maWctZmlsZXMiLCAidGVzdC1ydW5uZXJzIiwgInVwc3RyZWFtLXN5bmMtY2xpIiwgInVwc3RyZWFtLXN5bmMiLCAidmFsaWRhdGUtZGVjbGFyYXRpb25zIiwgInZhbGlkYXRlLWRlcGVuZGVuY2llcyJdCn0K
|
|
@@ -96,7 +96,8 @@ const LIBRARY_BUILD_STEPS = [
|
|
|
96
96
|
"build:types",
|
|
97
97
|
"build:validate-declarations",
|
|
98
98
|
"build:lib",
|
|
99
|
-
"build:generate-exports"
|
|
99
|
+
"build:generate-exports",
|
|
100
|
+
"build:validate-dependencies"
|
|
100
101
|
];
|
|
101
102
|
const SOURCE_CONDITION = "@mnaoumov/source";
|
|
102
103
|
const DECLARATION_REFERENCE_TYPES = /* @__PURE__ */ new Set(["node"]);
|
|
@@ -526,4 +527,4 @@ export {
|
|
|
526
527
|
generateLibraryIndex,
|
|
527
528
|
runBuildSteps
|
|
528
529
|
};
|
|
529
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnXG5dO1xuXG4vKipcbiAqIFRoZSBleHBvcnQgY29uZGl0aW9uIGEgcmVwb3NpdG9yeSBob2xkaW5nIHNldmVyYWwgcGFja2FnZXMgbWFwcyBldmVyeSBzdWJwYXRoIG9udG8gaXRzIFR5cGVTY3JpcHQgc291cmNlIHdpdGgsIHNvXG4gKiBhIHBhY2thZ2UgdGhlcmUgY2FuIGltcG9ydCBhIHNpYmxpbmcgcGFja2FnZSdzIHNvdXJjZSBiZWZvcmUgYW55dGhpbmcgaXMgYnVpbHQuIFBhc3MgaXQgdG9cbiAqIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfSB0aHJvdWdoIHtAbGluayBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucy5zb3VyY2VDb25kaXRpb259LlxuICovXG5leHBvcnQgY29uc3QgU09VUkNFX0NPTkRJVElPTiA9ICdAbW5hb3Vtb3Yvc291cmNlJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYnVpbGRMaWJyYXJ5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZExpYnJhcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHByZXByb2Nlc3MgcGx1Z2luIGZvciBvbmUgb3V0cHV0IGZvcm1hdC4gRGVmYXVsdHMgdG8gdGhlIGdlbmVyaWMgb25lLCB3aGljaCBjYXJyaWVzIG5vXG4gICAqIGVudmlyb25tZW50LXNwZWNpZmljIGByZXF1aXJlYCBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5PzogKGlzRXNtOiBib29sZWFuKSA9PiBQbHVnaW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlicmFyeUV4cG9ydHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIGZpbGVzIHRoYXQgYXJlIG5vdCBidWlsdCBmcm9tIGEgc291cmNlIGZvbGRlciAoYSBmb2xkZXIgb2Ygc2hhcmVkIGB0c2NvbmZpZ2AgcHJlc2V0cywgYW1iaWVudCBgLmQudHNgXG4gICAqIGZpbGVzKSwga2V5ZWQgYnkgc3VicGF0aC4gVGhleSBnbyBpbnRvIHRoZSBtYXAgYWZ0ZXIgdGhlIGdlbmVyYXRlZCBlbnRyaWVzLCBhcyBnaXZlbiwgYW5kIGNvdW50IHRvd2FyZCBpdHMgY2hhbmdlXG4gICAqIGNoZWNrOyBubyBzdWJwYXRoIHN0dWIgaXMgd3JpdHRlbiBmb3IgdGhlbS4gQSBrZXkgYSBzb3VyY2UgZm9sZGVyIGFscmVhZHkgZ2VuZXJhdGVzIHRocm93cy5cbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxFeHBvcnRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgUGFja2FnZUpzb24uRXhwb3J0cz4+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBbiBleHBvcnQgY29uZGl0aW9uIHRvIHB1dCBmaXJzdCBpbiBldmVyeSBlbnRyeSwgbWFwcGluZyB0aGUgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZS4gT25seSBhXG4gICAqIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIHRoYXQgaW1wb3J0IGVhY2ggb3RoZXIgbmVlZHMgb25lOyBub3RoaW5nIG91dHNpZGUgaXQgc2V0cyB0aGUgY29uZGl0aW9uLCBhbmRcbiAgICogdGhlIHNvdXJjZXMgaXQgcG9pbnRzIGF0IGRvIG5vdCBzaGlwLCBzbyB0aGUgcHVibGlzaCBoYXMgdG8gc3RyaXAgaXQgYWdhaW4uIE9taXR0ZWQsIHRoZSBtYXAgaGFzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTW9kdWxlRm9ybWF0ID0gJ2NqcycgfCAnZXNtJztcblxuY29uc3QgREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTID0gbmV3IFNldChbJ25vZGUnXSk7XG5cbi8vIFRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgYSBob3N0J3MgZ2xvYmFscyByYXRoZXIgdGhhbiB0aGUgbGFuZ3VhZ2UsIHdoaWNoIGNvbnN1bWVycyBjb25mbGljdCBvdmVyLiBFYWNoIGRlY2xhcmF0aW9uXG4vLyBnZXRzIHRoZSBvbmVzIGl0IHVzZXM7IGV2ZXJ5IG90aGVyIGxpYiBpcyBzaGFyZWQgdGhyb3VnaCBgbGlicmFyeS1yZWZlcmVuY2VzYC5cbmNvbnN0IEVOVklST05NRU5UX0xJQl9QUkVGSVhFUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RvbScsICdzY3JpcHRob3N0JywgJ3dlYndvcmtlciddO1xuY29uc3QgTk9ERV9UWVBFU19QQVRIX1NFR01FTlQgPSAnL25vZGVfbW9kdWxlcy9AdHlwZXMvbm9kZS8nO1xuY29uc3QgTElCX1JFUExBQ0VNRU5UX1JFR19FWFAgPSAvXFwvbm9kZV9tb2R1bGVzXFwvQHR5cGVzY3JpcHRcXC9saWItKD88TGliPlteL10rKVxcLyg/PFN1YkxpYj4uKylcXC5kXFwudHMkLztcblxuLy8gVGhlIGRlY2xhcmF0aW9uIHRoYXQgY2FycmllcyBvbmx5IHRoZSBgbGliYCBhbmQgYHR5cGVzYCByZWZlcmVuY2VzLiBFdmVyeSBkZWNsYXJhdGlvbiBidXQgdGhlIHJvb3Qgb25lIHJlZmVyZW5jZXNcbi8vIGl0LCByYXRoZXIgdGhhbiB0aGUgcm9vdCBiYXJyZWwsIHdoaWNoIHdvdWxkIGxvYWQgZXZlcnkgbW9kdWxlIG9mIHRoZSBwYWNrYWdlLCBvcHRpb25hbCBwZWVycycgdHlwZXMgaW5jbHVkZWQuXG5jb25zdCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FID0gJ2xpYnJhcnktcmVmZXJlbmNlcyc7XG4vLyBTcGVsbGVkIGFwYXJ0IG9uIHB1cnBvc2U6IHtAbGluayBjb2xsZWN0QWxsTGlic30gc2NhbnMgZXZlcnkgc291cmNlIGZpbGUgb2YgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQgZm9yIHRoZVxuLy8gZGlyZWN0aXZlLCB0aGlzIG9uZSBpbmNsdWRlZCwgc28gYSBsaXRlcmFsIG9uZSBoZXJlIHdvdWxkIGJlIHJlYWQgYXMgYSBsaWIgdGhpcyBwYWNrYWdlIG5lZWRzLlxuY29uc3QgUkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkUgPSBbJzxyZWZlcmVuY2UnLCAnbGliPSddLmpvaW4oJyAnKTtcbmNvbnN0IFJFRkVSRU5DRV9MSUJfUkVHX0VYUCA9IC9cXC9cXC9cXC8gPHJlZmVyZW5jZSBsaWI9XCIoPzxMaWI+W15cIl0rKVwiIFxcLz4vZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgdHlwZS1vbmx5IGltcG9ydCwgZS5nLiBgaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztgLlxuY29uc3QgQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQID0gL15pbXBvcnQgdHlwZSAoPzxDbGF1c2U+Lis/KSBmcm9tICcoPzxTcGVjaWZpZXI+W14uJ11bXiddKiknOyQvZ207XG5cbi8vIEEgYmFyZS1zcGVjaWZpZXIgKG5vbi1yZWxhdGl2ZSkgaW5saW5lIGltcG9ydCB0eXBlIG5vZGUsIGUuZy4gYGltcG9ydChcInR5cGUtZmVzdFwiKS5Qcm9taXNhYmxlYC5cbmNvbnN0IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFAgPSAvaW1wb3J0XFwoXCIoPzxTcGVjaWZpZXI+W14uXCJdW15cIl0qKVwiXFwpL2c7XG5cbmNvbnN0IFNUQVRJQ19JTVBPUlRfUkVHX0VYUCA9IC9mcm9tICcoPzxJbXBvcnRQYXRoPi4rPylcXC50cyc7L2dtO1xuXG4vLyBJbmxpbmUgaW1wb3J0LXR5cGUgbm9kZXMgKGB0eXBlb2YgaW1wb3J0KCcuL2Zvby50cycpYCkgcHJlc2VydmUgdGhlIHNvdXJjZSBxdW90ZSBzdHlsZS5cbi8vIEhhbmQtYXV0aG9yZWQgYC5kLnRzYCBmaWxlcyBlbWl0IHNpbmdsZSBxdW90ZXM7IHRzYy1nZW5lcmF0ZWQgZGVjbGFyYXRpb25zIGVtaXQgZG91YmxlIHF1b3Rlcy5cbi8vIENhcHR1cmUgdGhlIHF1b3RlIGFuZCByZXVzZSBpdCBpbiB0aGUgcmVwbGFjZW1lbnQgc28gYm90aCBzdHlsZXMgYXJlIHJld3JpdHRlbi5cbmNvbnN0IERZTkFNSUNfSU1QT1JUX1JFR19FWFAgPSAvaW1wb3J0XFwoKD88UXVvdGU+WydcIl0pKD88SW1wb3J0UGF0aD4uKz8pXFwudHNcXGs8UXVvdGU+XFwpL2dtO1xuXG5lbnVtIEdlbmVyYXRlSW5kZXhSZXN1bHQge1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnXG59XG5cbmludGVyZmFjZSBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMge1xuICByZWFkb25seSBsaWJzOiBTZXQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc3ltYm9sOiBUc1N5bWJvbDtcbiAgcmVhZG9ubHkgdHlwZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgQnVpbGRMaWJyYXJ5Rm9ybWF0UGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBNb2R1bGVGb3JtYXQ7XG4gIHJlYWRvbmx5IGxpYkZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlcHJvY2Vzc1BsdWdpbkZhY3Rvcnk6IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG5pbnRlcmZhY2UgQnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kdWxlRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXZhaWxhYmxlVHlwZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICByZWFkb25seSBkZWNsYXJhdGlvbkZpbGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFNldEV4cG9ydFBhcmFtcyB7XG4gIHJlYWRvbmx5IGV4cG9ydENvbmRpdGlvbnM6IFBhY2thZ2VKc29uLkV4cG9ydENvbmRpdGlvbnM7XG4gIHJlYWRvbmx5IGlzV2lsZGNhcmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNvdXJjZUNvbmRpdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRvRGlzdFBhdGhQYXJhbXMge1xuICByZWFkb25seSBmb3JtYXQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW1wb3J0UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVyeXRoaW5nIGFuIGVhcmxpZXIgYnVpbGQgbGVmdDogYGRpc3QvYCwgdGhlIGdlbmVyYXRlZCBgaW5kZXgudHNgIGJhcnJlbHMsIHRoZSBgLmQudHNgIGZpbGVzIGB0c2NgIHdyb3RlXG4gKiBiZXNpZGUgdGhlIHNvdXJjZXMgKGhhbmQtYXV0aG9yZWQgb25lcyB1bmRlciBgQHR5cGVzYCBzdGF5KSwgYW5kIHRoZSBwZXItc3VicGF0aCBgcGFja2FnZS5qc29uYCBzdHVicy5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gZXZlcnl0aGluZyBoYXMgYmVlbiByZW1vdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDbGVhbkxpYnJhcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGJ1aWxkQ2xlYW4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmIChiYXNlbmFtZShmaWxlKSA9PT0gUmVwb1BhdGhzLkluZGV4VHMgYXMgc3RyaW5nKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAoZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcykpIHtcbiAgICAgIGF3YWl0IHJtKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgaWYgKChiYXNlbmFtZShmaWxlKSAhPT0gUmVwb1BhdGhzLlBhY2thZ2VKc29uIGFzIHN0cmluZykgfHwgKGZpbGUgPT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IGZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuTm9kZU1vZHVsZXMpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBhd2FpdCBybShmaWxlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBldmVyeSBzb3VyY2UgbW9kdWxlLCB1bmJ1bmRsZWQsIGludG8gYGRpc3QvbGliL2Nqc2AgKGAuY2pzYCkgYW5kIGBkaXN0L2xpYi9lc21gIChgLm1qc2ApLlxuICpcbiAqIFRoZSBvdXRwdXQgZm9sZGVycyBtdXN0IGFscmVhZHkgZXhpc3Q7IHtAbGluayBidWlsZExpYnJhcnlUeXBlc30gY3JlYXRlcyB0aGVtLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGJ1aWxkIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYm90aCBmb3JtYXRzIGhhdmUgYmVlbiBidWlsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeShvcHRpb25zOiBCdWlsZExpYnJhcnlPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSA9IChpc0VzbTogYm9vbGVhbik6IFBsdWdpbiA9PiBwcmVwcm9jZXNzUGx1Z2luKHsgaXNFc20gfSkgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxpYkZpbGVzID0gYXdhaXQgZ2V0TGliRmlsZXMoKTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnY2pzJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xuICBhd2FpdCBidWlsZExpYnJhcnlGb3JtYXQoeyBmb3JtYXQ6ICdlc20nLCBsaWJGaWxlcywgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgfSk7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlY2xhcmF0aW9ucyB3aXRoIGB0c2MgLS1wcm9qZWN0IC4vdHNjb25maWcudHlwZXMuanNvbmAsIHRoZW4gY29waWVzIGVhY2ggb25lIGludG8gYGRpc3QvbGliYCB0d2ljZTogYXMgYVxuICogYC5kLmN0c2Agd2hvc2UgcmVsYXRpdmUgaW1wb3J0cyBuYW1lIGAuY2pzYCBmaWxlcyBhbmQgd2hvc2UgYmFyZSB0eXBlIGltcG9ydHMgY2FycnkgYHJlc29sdXRpb24tbW9kZTogaW1wb3J0YCwgYW5kXG4gKiBhcyBhIGAuZC5tdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLm1qc2AgZmlsZXMuXG4gKlxuICogVGhlIGxpYnJhcnkncyByb290IGRlY2xhcmF0aW9uIChgbGlicmFyeS50c2Agd2hlcmUgdGhlIHBhY2thZ2UgaGFzIG9uZSwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCkgY2Fycmllc1xuICogZXZlcnkgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlIHRoZSBwYWNrYWdlIG5lZWRzLiBFdmVyeSBvdGhlciBkZWNsYXJhdGlvbiByZWZlcmVuY2VzIGEgYGxpYnJhcnktcmVmZXJlbmNlc2BcbiAqIGRlY2xhcmF0aW9uIGJlc2lkZSBpdCBieSBwYXRoLCBuZXZlciB0aGUgcm9vdDogdGhlIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgZXZlcnkgbW9kdWxlLCBzbyByZWZlcmVuY2luZyBpdCBtYWRlIGVhY2hcbiAqIHN1YnBhdGggbG9hZCB0aGUgd2hvbGUgcGFja2FnZSwgYW5kIGEgY29uc3VtZXIgdHlwZS1jaGVja2luZyB3aXRoIGBza2lwTGliQ2hlY2s6IGZhbHNlYCB0aGVuIG5lZWRlZCBldmVyeSBvcHRpb25hbFxuICogcGVlciBpbnN0YWxsZWQuXG4gKlxuICogYGxpYnJhcnktcmVmZXJlbmNlc2AgY2FycmllcyBvbmx5IHRoZSBsaWJzIHRoYXQgZGVzY3JpYmUgdGhlIGxhbmd1YWdlIChgZXMyMDIyYCwgYGVzbmV4dC5kaXNwb3NhYmxlYCksIHdoaWNoIG5vXG4gKiBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIG9uZXMgdGhhdCBkZXNjcmliZSBhIGhvc3QgKGBkb21gLCBgZG9tLml0ZXJhYmxlYCwgYHdlYndvcmtlcmApIGFuZCBgdHlwZXM9XCJub2RlXCJgIGdvXG4gKiBvbmx5IGludG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IG5hbWUgb25lIG9mIHRoZWlyIGdsb2JhbHMsIGZvdW5kIGJ5IHJlc29sdmluZyBldmVyeSBuYW1lIGluIHRoZSBlbWl0dGVkXG4gKiBkZWNsYXJhdGlvbnMgd2l0aCB0aGUgdHlwZSBjaGVja2VyLiBPdGhlcndpc2UgYSBicm93c2VyIGNvbnN1bWVyIG9mIGEgcHVyZSBzdWJwYXRoIGdvdCBhbGwgb2YgYEB0eXBlcy9ub2RlYCwgYW5kIGl0c1xuICogYHNldFRpbWVvdXRgIHJldHVybmVkIGBOb2RlSlMuVGltZW91dGAuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkZWNsYXJhdGlvbnMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKiBAdGhyb3dzIElmIGEgc291cmNlIG1vZHVsZSBpcyBuYW1lZCBgbGlicmFyeS1yZWZlcmVuY2VzYCwgd2hpY2ggd291bGQgY29sbGlkZSB3aXRoIHRoZSBnZW5lcmF0ZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlUeXBlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGV4aXN0c1N5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBgJHtMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FfSR7UmVwb1BhdGhzLlRzRXh0ZW5zaW9ufWApKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgc3JjLyR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn0gY29sbGlkZXMgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uIG9mIHRoZSBzYW1lIG5hbWUuYCk7XG4gIH1cblxuICBhd2FpdCBleGVjRnJvbVJvb3QoWy4uLnJlc29sdmVUb29sQ29tbWFuZCh7IHRvb2w6ICd0c2MnIH0pLCAnLS1wcm9qZWN0JywgJy4vdHNjb25maWcudHlwZXMuanNvbiddKTtcblxuICBjb25zdCBsaWJyYXJ5RmlsZU5hbWUgPSBleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgJ2xpYnJhcnkudHMnKSkgPyAnbGlicmFyeScgOiAnaW5kZXgnO1xuICBjb25zdCBhbGxMaWJzID0gYXdhaXQgY29sbGVjdEFsbExpYnMoKTtcbiAgY29uc3QgYWxsVHlwZXMgPSBjb2xsZWN0QWxsVHlwZXMoKTtcbiAgY29uc3QgZGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzKSArIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKGFsbFR5cGVzKTtcbiAgLy8gT25seSB0aGUgbGlicyBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aC4gVGhlIGVudmlyb25tZW50IGdsb2JhbHMgZ28gdG8gdGhlIGRlY2xhcmF0aW9ucyB0aGF0IHVzZSB0aGVtLlxuICBjb25zdCBzaGFyZWREaXJlY3RpdmVzID0gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKGFsbExpYnMuZmlsdGVyKChsaWIpID0+ICFpc0Vudmlyb25tZW50TGliKGxpYikpKTtcblxuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IG1rZGlyKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20pLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5DanMsIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkVzbSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKSwgc2hhcmVkRGlyZWN0aXZlcyk7XG5cbiAgY29uc3Qgc3JjRmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IGRlY2xhcmF0aW9uRmlsZXMgPSBzcmNGaWxlcy5maWx0ZXIoKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3RhcnRzV2l0aChSZXBvUGF0aHMuVGVzdEhlbHBlcnMpKTtcbiAgY29uc3QgZW52aXJvbm1lbnREaXJlY3RpdmVzID0gY29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlcyh7IGF2YWlsYWJsZVR5cGVzOiBhbGxUeXBlcywgZGVjbGFyYXRpb25GaWxlcyB9KTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZGVjbGFyYXRpb25GaWxlcykge1xuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoZmlsZSk7XG4gICAgY29uc3QgbmFtZSA9IGJhc2VuYW1lKGZpbGUsIFJlcG9QYXRocy5EdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpLCAndXRmLTgnKTtcblxuICAgIGNvbnN0IGN0c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgbXRzUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIGZvbGRlciwgbmFtZSArIFJlcG9QYXRocy5EbXRzRXh0ZW5zaW9uKTtcblxuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoY3RzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUobXRzUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgbGV0IGN0c0NvbnRlbnQgPSB0b0N0c0NvbnRlbnQoY29udGVudCk7XG4gICAgbGV0IG10c0NvbnRlbnQgPSB0b010c0NvbnRlbnQoY29udGVudCk7XG5cbiAgICBpZiAobmFtZSA9PT0gbGlicmFyeUZpbGVOYW1lICYmIGZvbGRlciA9PT0gJy4nKSB7XG4gICAgICBjdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gZGlyZWN0aXZlcyArIG10c0NvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVEaXJlY3RpdmVzID0gZW52aXJvbm1lbnREaXJlY3RpdmVzLmdldChmaWxlKSA/PyAnJztcbiAgICAgIGN0c0NvbnRlbnQgPSBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUoeyBkZWNsYXJhdGlvbkZpbGVQYXRoOiBjdHNQYXRoLCBleHRlbnNpb246IFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3Rvcnk6IFJlcG9QYXRocy5DanMgfSlcbiAgICAgICAgKyBmaWxlRGlyZWN0aXZlcyArIGN0c0NvbnRlbnQ7XG4gICAgICBtdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogbXRzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuRXNtIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShjdHNQYXRoLCBjdHNDb250ZW50KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUobXRzUGF0aCwgbXRzQ29udGVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdlbmVyYXRlcyB0aGUgYGV4cG9ydHNgIG1hcCBvZiB0aGUgcGFja2FnZSdzIGBwYWNrYWdlLmpzb25gIGZyb20gaXRzIHNvdXJjZSBmb2xkZXJzLCBhbmQgd3JpdGVzIGEgYHBhY2thZ2UuanNvbmBcbiAqIHN0dWIgcGVyIHN1YnBhdGggZm9yIHJlc29sdmVycyB0aGF0IGRvIG5vdCByZWFkIGBleHBvcnRzYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtYXAgaXMgY3VycmVudC5cbiAqIEB0aHJvd3MgSWYgdGhlIG1hcCBjaGFuZ2VkLCBzbyB0aGUgY2hhbmdlIGdldHMgcmV2aWV3ZWQgYW5kIGNvbW1pdHRlZCByYXRoZXIgdGhhbiBzaGlwcGVkIHVuc2Vlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlTGlicmFyeUV4cG9ydHMob3B0aW9uczogR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGFkZGl0aW9uYWxFeHBvcnRzID0ge30sIHNvdXJjZUNvbmRpdGlvbiB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc3JjRm9sZGVyczogc3RyaW5nW10gPSBbUmVwb1BhdGhzLlNyY107XG5cbiAgZm9yIChjb25zdCBkaXJlbnQgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgaWYgKCFkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGpvaW4oZGlyZW50LnBhcmVudFBhdGgsIGRpcmVudC5uYW1lKTtcblxuICAgIGlmIChwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5TdHlsZXMpIHx8IHBhdGguaW5jbHVkZXMoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgc3JjRm9sZGVycy5wdXNoKHBhdGgpO1xuICB9XG5cbiAgc3JjRm9sZGVycy5zb3J0KCk7XG5cbiAgbGV0IGlzQ2hhbmdlZCA9IGZhbHNlO1xuXG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbihhc3luYyAocGFja2FnZUpzb24pID0+IHtcbiAgICBjb25zdCBvbGRFeHBvcnRzID0gcGFja2FnZUpzb24uZXhwb3J0cztcbiAgICBjb25zdCBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zID0ge307XG4gICAgcGFja2FnZUpzb24uZXhwb3J0cyA9IGV4cG9ydENvbmRpdGlvbnM7XG4gICAgZm9yIChjb25zdCBzcmNGb2xkZXIgb2Ygc3JjRm9sZGVycykge1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogZmFsc2UsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgICAgYXdhaXQgc2V0RXhwb3J0KHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZDogdHJ1ZSwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3VicGF0aCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxFeHBvcnRzKSkge1xuICAgICAgaWYgKGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhZGRpdGlvbmFsIGV4cG9ydCAnJHtzdWJwYXRofScgY29sbGlkZXMgd2l0aCBhbiBlbnRyeSBnZW5lcmF0ZWQgZnJvbSBhIHNvdXJjZSBmb2xkZXIuYCk7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydENvbmRpdGlvbnNbc3VicGF0aF0gPSBlbnRyeTtcbiAgICB9XG5cbiAgICBpc0NoYW5nZWQgPSAhaXNEZWVwRXF1YWwob2xkRXhwb3J0cywgcGFja2FnZUpzb24uZXhwb3J0cyk7XG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IGNoYW5nZWQgaW4gdGhlIGBlZGl0UGFja2FnZUpzb25gLCBFU0xpbnQgbWlzdGFrZW5seSBkb2VzIG5vdCByZWNvZ25pemUgaXQuXG4gIGlmIChpc0NoYW5nZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhY2thZ2UgZXhwb3J0cyBoYXZlIGNoYW5nZWQuIFBsZWFzZSByZXZpZXcgdGhlIGNoYW5nZXMgYW5kIGNvbW1pdCB0aGVtLicpO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIGBpbmRleC50c2AgYmFycmVsIGluIGV2ZXJ5IHNvdXJjZSBmb2xkZXIgdGhhdCBoYXMgc29tZXRoaW5nIHRvIGV4cG9ydCwgcmUtZXhwb3J0aW5nIGVhY2ggbW9kdWxlIGFuZFxuICogZWFjaCBzdWItYmFycmVsIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhcnJlbHMgaGF2ZSBiZWVuIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2VuZXJhdGVJbmRleChSZXBvUGF0aHMuU3JjKTtcbn1cblxuLyoqXG4gKiBSdW5zIGVhY2ggbmFtZWQgbnBtIHNjcmlwdCB0aGUgcGFja2FnZSBkZWZpbmVzLCBpbiBvcmRlciwgc2tpcHBpbmcgdGhlIG9uZXMgaXQgZG9lcyBub3QgZGVmaW5lLlxuICpcbiAqIEBwYXJhbSBzdGVwcyAtIFRoZSBucG0gc2NyaXB0IG5hbWVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5IHN0ZXAgaGFzIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHMoc3RlcHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gTElCUkFSWV9CVUlMRF9TVEVQUyk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcHMpIHtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbChzdGVwKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgd2hhdCBhIGNvbnN1bWVyIG5lZWRzIGxvYWRlZCBmb3Igb25lIHN5bWJvbCBhIGRlY2xhcmF0aW9uIG5hbWVzLiBBIHN5bWJvbCBhbnkgRVMgbGliIGRlY2xhcmVzIG5lZWRzIG5vdGhpbmcsXG4gKiBiZWNhdXNlIG5vIGNvbnN1bWVyIGNvbmZsaWN0cyB3aXRoIHRob3NlIGxpYnMuIE90aGVyd2lzZSBlYWNoIGVudmlyb25tZW50IGxpYiB0aGF0IGRlY2xhcmVzIGl0IGFkZHMgaXRzZWxmLCBhbmRcbiAqIGZhaWxpbmcgdGhhdCBgQHR5cGVzL25vZGVgIGFkZHMgYG5vZGVgLiBBIHN5bWJvbCBkZWNsYXJlZCBpbiB0aGUgcGFja2FnZSdzIG93biBmaWxlcyBhZGRzIG5vdGhpbmc6IHRoZSBkZWNsYXJhdGlvblxuICogdGhhdCBob2xkcyBpdCBjYXJyaWVzIGl0cyBvd24gZGlyZWN0aXZlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN5bWJvbCwgdGhlIHByb2dyYW0gaXQgd2FzIHJlc29sdmVkIGluLCBhbmQgdGhlIHNldHMgdG8gYWRkIHRvLlxuICovXG5mdW5jdGlvbiBhZGRFbnZpcm9ubWVudEdsb2JhbHMocGFyYW1zOiBBZGRFbnZpcm9ubWVudEdsb2JhbHNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2wsIHR5cGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudmlyb25tZW50TGliczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGlzTm9kZSA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sLmRlY2xhcmF0aW9ucyA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKHByb2dyYW0uaXNTb3VyY2VGaWxlRGVmYXVsdExpYnJhcnkoc291cmNlRmlsZSkpIHtcbiAgICAgIGNvbnN0IGxpYiA9IHRvTGliTmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICAgIGlmICghaXNFbnZpcm9ubWVudExpYihsaWIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVudmlyb25tZW50TGlicy5wdXNoKGxpYik7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VGaWxlLmZpbGVOYW1lLmluY2x1ZGVzKE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UKSkge1xuICAgICAgaXNOb2RlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoZW52aXJvbm1lbnRMaWJzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IGxpYiBvZiBlbnZpcm9ubWVudExpYnMpIHtcbiAgICAgIGxpYnMuYWRkKGxpYik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTm9kZSkge1xuICAgIHR5cGVzLmFkZCgnbm9kZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhsaWJzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICBsaWJzXG4gICAgICAubWFwKChsaWIpID0+IGAvLy8gJHtSRUZFUkVOQ0VfTElCX0RJUkVDVElWRX1cIiR7bGlifVwiIC8+YClcbiAgICAgIC5qb2luKCdcXG4nKVxuICB9XFxuYDtcbn1cblxuZnVuY3Rpb24gYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXModHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IGAke1xuICAgICAgdHlwZXNcbiAgICAgICAgLm1hcCgodHlwZSkgPT4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiJHt0eXBlfVwiIC8+YClcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfVxcbmA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkTGlicmFyeUZvcm1hdChwYXJhbXM6IEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZvcm1hdCwgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGZvcm1hdCA9PT0gJ2NqcycgPyBSZXBvUGF0aHMuQ2pzRXh0ZW5zaW9uIDogUmVwb1BhdGhzLk1qc0V4dGVuc2lvbjtcbiAgY29uc3QgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnMgPSB7XG4gICAgLy8gRXhwbGljaXQsIGJlY2F1c2UgZXNidWlsZCBvdGhlcndpc2UgdGFrZXMgdGhlIGZvbGRlciBpdHMgc2VydmljZSBwcm9jZXNzIHN0YXJ0ZWQgaW4uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gZXNidWlsZCdzIG93biBvcHRpb24gbmFtZS5cbiAgICBhYnNXb3JraW5nRGlyOiBwcm9jZXNzLmN3ZCgpLFxuICAgIGJhbm5lcjoge1xuICAgICAganM6IExJQlJBUllfQkFOTkVSXG4gICAgfSxcbiAgICBidW5kbGU6IGZhbHNlLFxuICAgIGVudHJ5UG9pbnRzOiBsaWJGaWxlcyxcbiAgICBmb3JtYXQsXG4gICAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgICBvdXRkaXI6IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIGZvcm1hdCksXG4gICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeShmb3JtYXQgPT09ICdlc20nKSxcbiAgICAgIGZpeEVzbVBsdWdpbigpLFxuICAgICAgY2hhbmdlRXh0ZW5zaW9uUGx1Z2luKGV4dGVuc2lvbilcbiAgICBdLFxuICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICB3cml0ZTogZmFsc2VcbiAgfTtcblxuICBjb25zdCBidWlsZENvbnRleHQgPSBhd2FpdCBjb250ZXh0KGJ1aWxkT3B0aW9ucyk7XG4gIHRyeSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LnJlYnVpbGQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBidWlsZENvbnRleHQuZGlzcG9zZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZShwYXJhbXM6IEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVjbGFyYXRpb25GaWxlUGF0aCwgZXh0ZW5zaW9uLCBtb2R1bGVEaXJlY3RvcnkgfSA9IHBhcmFtcztcbiAgY29uc3QgbGlicmFyeUZpbGVQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgbW9kdWxlRGlyZWN0b3J5LCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgZXh0ZW5zaW9uKTtcbiAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlTmF0aXZlKGRpcm5hbWUoZGVjbGFyYXRpb25GaWxlUGF0aCksIGxpYnJhcnlGaWxlUGF0aCkucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cbiAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSBwYXRoPVwiJHtyZWxhdGl2ZVBhdGh9XCIgLz5cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0QWxsTGlicygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIFRoZSBSRVNPTFZFRCBvcHRpb25zLCBiZWNhdXNlIGEgcGFja2FnZSdzIGB0c2NvbmZpZy5qc29uYCBpbmhlcml0cyBgbGliYCBmcm9tIHRoZSBzaGFyZWQgYmFzZS4gVGhlIHJlc29sdmVkXG4gIC8vIG5hbWVzIGFyZSBmaWxlIG5hbWVzIChgbGliLmRvbS5pdGVyYWJsZS5kLnRzYCksIHNvIHRoZXkgYXJlIG1hcHBlZCBiYWNrIG9udG8gdGhlIG5hbWVzIGEgZGlyZWN0aXZlIHRha2VzLlxuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIGNvbnN0IGxpYnMgPSBuZXcgU2V0KChvcHRpb25zLmxpYiA/PyBbXSkubWFwKChsaWIpID0+IHRvTGliTmFtZShsaWIpKSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aCgnLnRzJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgaXRzIG9uZSBncm91cCwgc28gbm8gZmFsbGJhY2sgZm9yIGEgbWlzc2luZyBvbmUgaXMgbmVlZGVkLlxuICAgIGZvciAoY29uc3QgWywgbGliXSBvZiBzb3VyY2VDb250ZW50Lm1hdGNoQWxsKFJFRkVSRU5DRV9MSUJfUkVHX0VYUCkpIHtcbiAgICAgIGxpYnMuYWRkKFN0cmluZyhsaWIpLnRvTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbLi4ubGlic10uc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0QWxsVHlwZXMoKTogc3RyaW5nW10ge1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcoUmVwb1BhdGhzLlRzQ29uZmlnSnNvbik7XG4gIHJldHVybiAob3B0aW9ucy50eXBlcyA/PyBbXSlcbiAgICAuZmlsdGVyKCh0eXBlKSA9PiBERUNMQVJBVElPTl9SRUZFUkVOQ0VfVFlQRVMuaGFzKHR5cGUpKVxuICAgIC5zb3J0KCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMocGFyYW1zOiBDb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzUGFyYW1zKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHsgYXZhaWxhYmxlVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSh7XG4gICAgb3B0aW9uczogeyAuLi5vcHRpb25zLCBub0VtaXQ6IHRydWUgfSxcbiAgICByb290TmFtZXM6IGRlY2xhcmF0aW9uRmlsZXMubWFwKChmaWxlKSA9PiByZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKVxuICB9KTtcbiAgY29uc3QgY2hlY2tlciA9IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKTtcbiAgY29uc3QgZGlyZWN0aXZlc0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICAvLyBUaGUgcHJvZ3JhbSB3YXMgaGFuZGVkIGV2ZXJ5IG9uZSBvZiB0aGVzZSBhcyBhIHJvb3QgbmFtZSwgc28gZWFjaCBvbmUgaXMgaW4gaXQuXG4gICAgY29uc3Qgc291cmNlRmlsZSA9IGVuc3VyZU5vbk51bGxhYmxlKHByb2dyYW0uZ2V0U291cmNlRmlsZShyZXNvbHZlTmF0aXZlKFJlcG9QYXRocy5TcmMsIGZpbGUpKSk7XG4gICAgY29uc3QgbGlicyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IHR5cGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgICBpZiAoaXNJZGVudGlmaWVyKG5vZGUpIHx8IGlzU3RyaW5nTGl0ZXJhbChub2RlKSkge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24obm9kZSk7XG4gICAgICAgIGlmIChzeW1ib2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZEVudmlyb25tZW50R2xvYmFscyh7IGxpYnMsIHByb2dyYW0sIHN5bWJvbDogcmVzb2x2ZUFsaWFzKGNoZWNrZXIsIHN5bWJvbCksIHR5cGVzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXQpO1xuICAgIH1cbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcblxuICAgIGNvbnN0IG5lZWRlZFR5cGVzID0gWy4uLnR5cGVzXS5maWx0ZXIoKHR5cGUpID0+IGF2YWlsYWJsZVR5cGVzLmluY2x1ZGVzKHR5cGUpKTtcbiAgICBpZiAobGlicy5zaXplID4gMCB8fCBuZWVkZWRUeXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXJlY3RpdmVzQnlGaWxlLnNldChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgKGxpYnMuc2l6ZSA+IDAgPyBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoWy4uLmxpYnNdLnNvcnQoKSkgOiAnJykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhuZWVkZWRUeXBlcy5zb3J0KCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXJlY3RpdmVzQnlGaWxlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4KGZvbGRlcjogc3RyaW5nKTogUHJvbWlzZTxHZW5lcmF0ZUluZGV4UmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyUG9zaXgoZm9sZGVyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IG1heWJlTGluZXMgPSBhd2FpdCBhc3luY01hcChkaXJlbnRzLCAoZGlyZW50KSA9PiBoYW5kbGVJbmRleERpcmVudChmb2xkZXIsIGRpcmVudCkpO1xuICBjb25zdCBsaW5lcyA9IG1heWJlTGluZXMuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSB1bmRlZmluZWQpO1xuXG4gIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5Ta2lwcGVkO1xuICB9XG5cbiAgYXdhaXQgZ2VuZXJhdGUoam9pbihmb2xkZXIsIFJlcG9QYXRocy5JbmRleFRzKSwgbGluZXMpO1xuICByZXR1cm4gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRMaWJGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGxldCBmaWxlcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgZmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICByZXR1cm4gZmlsZXMuZmlsdGVyKChmaWxlKSA9PlxuICAgIGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSAmJiAhZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKVxuICAgICYmICFmaWxlLmluY2x1ZGVzKGAvJHtSZXBvUGF0aHMuVGVzdEhlbHBlcnN9L2ApXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUluZGV4RGlyZW50KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlciwgZGlyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzb3VyY2VGaWxlOiBzdHJpbmc7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmIChkaXJlbnQuaXNEaXJlY3RvcnkoKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdlbmVyYXRlSW5kZXgoam9pbihmb2xkZXIsIGRpcmVudC5uYW1lKSk7XG4gICAgaWYgKHJlc3VsdCAhPT0gR2VuZXJhdGVJbmRleFJlc3VsdC5TdWNjZXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNvdXJjZUZpbGUgPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oZGlyZW50Lm5hbWUsIFJlcG9QYXRocy5JbmRleFRzKSk7XG4gICAgbmFtZSA9IGRpcmVudC5uYW1lO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZGlyZW50Lm5hbWUpO1xuICAgIG5hbWUgPSBiYXNlbmFtZShkaXJlbnQubmFtZSwgZXh0ZW5zaW9uKTtcbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShkaXJlbnQubmFtZSk7XG4gIH1cblxuICByZXR1cm4gYGV4cG9ydCAqIGFzICcke25hbWV9JyBmcm9tICcke3NvdXJjZUZpbGV9JztgO1xufVxuXG5mdW5jdGlvbiBpc0Vudmlyb25tZW50TGliKGxpYjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVMuc29tZSgocHJlZml4KSA9PiBsaWIuc3RhcnRzV2l0aChwcmVmaXgpKTtcbn1cblxuZnVuY3Rpb24gaXNFeGNsdWRlZEZpbGVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIW5hbWUuZW5kc1dpdGgoUmVwb1BhdGhzLlRzRXh0ZW5zaW9uKSB8fCBuYW1lLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IG5hbWUgPT09ICdzZXR1cC50cycgfHwgbmFtZS5lbmRzV2l0aCgnLXNldHVwLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGcm9tSW5kZXgoZm9sZGVyOiBzdHJpbmcsIGRpcmVudDogRGlyZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IGV4Y2x1ZGVkTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JlcG9QYXRocy5JbmRleFRzLCBSZXBvUGF0aHMuVHlwZXMsIFJlcG9QYXRocy5TdHlsZXMsIFJlcG9QYXRocy5UZXN0SGVscGVyc107XG4gIGNvbnN0IGlzRXhjbHVkZWRFbnRyeSA9IGV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMoZGlyZW50Lm5hbWUpIHx8IGRpcmVudC5uYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pIHx8IGZvbGRlci5zcGxpdCgnLycpLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIHJldHVybiBpc0V4Y2x1ZGVkRW50cnkgfHwgKGRpcmVudC5pc0ZpbGUoKSAmJiBpc0V4Y2x1ZGVkRmlsZU5hbWUoZGlyZW50Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUFsaWFzKGNoZWNrZXI6IFR5cGVDaGVja2VyLCBzeW1ib2w6IFRzU3ltYm9sKTogVHNTeW1ib2wge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZSAtLSBgU3ltYm9sRmxhZ3NgIGlzIGEgYml0IHNldC5cbiAgcmV0dXJuIChzeW1ib2wuZmxhZ3MgJiBTeW1ib2xGbGFncy5BbGlhcykgPT09IDAgPyBzeW1ib2wgOiBjaGVja2VyLmdldEFsaWFzZWRTeW1ib2woc3ltYm9sKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0RXhwb3J0KHBhcmFtczogU2V0RXhwb3J0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZXhwb3J0Q29uZGl0aW9ucywgaXNXaWxkY2FyZCwgc291cmNlQ29uZGl0aW9uLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgaW1wb3J0UGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHNyY0ZvbGRlcixcbiAgICByZXBsYWNlcjogUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIsXG4gICAgc2VhcmNoVmFsdWU6IFJlcG9QYXRocy5TcmNcbiAgfSk7XG4gIGNvbnN0IGNvbmRpdGlvblBhdGggPSBpc1dpbGRjYXJkID8gYCR7aW1wb3J0UGF0aH0vJHtSZXBvUGF0aHMuQW55fWAgOiBpbXBvcnRQYXRoO1xuICBjb25zdCBkbXRzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5Fc20sIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RG10cyA6IFJlcG9QYXRocy5JbmRleERtdHMgfSk7XG4gIGNvbnN0IGRjdHNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkNqcywgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlEY3RzIDogUmVwb1BhdGhzLkluZGV4RGN0cyB9KTtcbiAgY29uc3QgZG10c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRtdHNQYXRoKTtcbiAgY29uc3QgZGN0c0ZvbGRlclBhdGggPSBkaXJuYW1lKGRjdHNQYXRoKTtcblxuICBpZiAoIWlzV2lsZGNhcmQgJiYgIWV4aXN0c1N5bmMoZGN0c1BhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaXNUeXBlc09ubHkgPSBpbXBvcnRQYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UeXBlcyk7XG4gIGNvbnN0IG1qc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueU1qcyA6IFJlcG9QYXRocy5JbmRleE1qcyB9KTtcbiAgY29uc3QgY2pzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55Q2pzIDogUmVwb1BhdGhzLkluZGV4Q2pzIH0pO1xuXG4gIGlmIChpc1R5cGVzT25seSkge1xuICAgIGV4cG9ydENvbmRpdGlvbnNbY29uZGl0aW9uUGF0aF0gPSB7XG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGhcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgaW1wb3J0UGF0aCwgaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlUcyA6IFJlcG9QYXRocy5JbmRleFRzKSk7XG5cbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgICAvLyBGaXJzdCwgc28gaXQgd2lucyB3aGVyZXZlciBpdCBpcyBzZXQ6IGluc2lkZSB0aGUgcmVwb3NpdG9yeSwgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LlxuICAgICAgLi4uKHNvdXJjZUNvbmRpdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgW3NvdXJjZUNvbmRpdGlvbl06IHNvdXJjZVBhdGggfSksXG4gICAgICBpbXBvcnQ6IHtcbiAgICAgICAgdHlwZXM6IGRtdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBtanNQYXRoXG4gICAgICB9LFxuICAgICAgcmVxdWlyZToge1xuICAgICAgICB0eXBlczogZGN0c1BhdGgsXG4gICAgICAgIGRlZmF1bHQ6IGNqc1BhdGhcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgcGVyZmVjdGlvbmlzdC9zb3J0LW9iamVjdHMgLS0gT3JkZXIgbWF0dGVycyBvbmNlIGl0IGlzIHdyaXR0ZW4gdG8gYHBhY2thZ2UuanNvbmAuICovXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpbXBvcnRQYXRoID09PSBSZXBvUGF0aHMuQ3VycmVudEZvbGRlciBhcyBzdHJpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWlzV2lsZGNhcmQpIHtcbiAgICBhd2FpdCB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihcbiAgICAgIGltcG9ydFBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzOiByZWxhdGl2ZShpbXBvcnRQYXRoLCBkY3RzUGF0aCkgfVxuICAgICAgICA6IHsgbWFpbjogcmVsYXRpdmUoaW1wb3J0UGF0aCwgY2pzUGF0aCksIG1vZHVsZTogcmVsYXRpdmUoaW1wb3J0UGF0aCwgbWpzUGF0aCksIHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoZGN0c0ZvbGRlclBhdGgpKSB7XG4gICAgaWYgKCFmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbik7XG4gICAgY29uc3QgcGFja2FnZUpzb25Gb2xkZXJQYXRoID0gam9pbihpbXBvcnRQYXRoLCBuYW1lKTtcbiAgICBjb25zdCB0eXBlcyA9IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5EY3RzRXh0ZW5zaW9uKSk7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBwYWNrYWdlSnNvbkZvbGRlclBhdGgsXG4gICAgICBpc1R5cGVzT25seVxuICAgICAgICA/IHsgdHlwZTogJ21vZHVsZScsIHR5cGVzIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgbWFpbjogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRjdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLkNqc0V4dGVuc2lvbikpLFxuICAgICAgICAgIG1vZHVsZTogcmVsYXRpdmUocGFja2FnZUpzb25Gb2xkZXJQYXRoLCBqb2luKGRtdHNGb2xkZXJQYXRoLCBuYW1lICsgUmVwb1BhdGhzLk1qc0V4dGVuc2lvbikpLFxuICAgICAgICAgIHR5cGU6ICdtb2R1bGUnLFxuICAgICAgICAgIHR5cGVzXG4gICAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvQ3RzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGNvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdmcm9tIFxcJyQ8SW1wb3J0UGF0aD4uY2pzXFwnOycsXG4gICAgc2VhcmNoVmFsdWU6IFNUQVRJQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoJDxRdW90ZT4kPEltcG9ydFBhdGg+LmNqcyQ8UXVvdGU+KScsXG4gICAgc2VhcmNoVmFsdWU6IERZTkFNSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG5cbiAgLy8gQSBgLmQuY3RzYCBmaWxlIGlzIGEgQ29tbW9uSlMgbW9kdWxlLiBUeXBlLW9ubHkgaW1wb3J0cyBvZiBhIGJhcmUgc3BlY2lmaWVyIHJlc29sdmluZyB0byBhblxuICAvLyBFU00tb25seSBwYWNrYWdlIG5lZWQgYSBgcmVzb2x1dGlvbi1tb2RlYCBhdHRyaWJ1dGUsIGVsc2UgYHRzY2AgcmVwb3J0cyBUUzE1NDEgLyBUUzE1NDIuXG4gIC8vIFBhc3NpbmcgYCdpbXBvcnQnYCBpcyB2YWxpZCBmb3IgQ29tbW9uSlMgdGFyZ2V0cyB0b28sIHNvIGV2ZXJ5IGJhcmUgc3BlY2lmaWVyIHJlY2VpdmVzIGl0LlxuICAvLyBUaGUgRVNNIGAuZC5tdHNgIG5lZWRzIG5vIHN1Y2ggYXR0cmlidXRlLCBzbyB0aGlzIHRyYW5zZm9ybSBydW5zIG9uIENvbW1vbkpTIGNvbnRlbnQgb25seS5cbiAgY3RzQ29udGVudCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQgdHlwZSAkPENsYXVzZT4gZnJvbSBcXCckPFNwZWNpZmllcj5cXCcgd2l0aCB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH07JyxcbiAgICBzZWFyY2hWYWx1ZTogQkFSRV9UWVBFX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY3RzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydChcIiQ8U3BlY2lmaWVyPlwiLCB7IHdpdGg6IHsgXFwncmVzb2x1dGlvbi1tb2RlXFwnOiBcXCdpbXBvcnRcXCcgfSB9KScsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfSU5MSU5FX0lNUE9SVF9UWVBFX1JFR19FWFBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRvRGlzdFBhdGgocGFyYW1zOiBUb0Rpc3RQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZUlmUmVsYXRpdmUoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgcGFyYW1zLmZvcm1hdCwgcGFyYW1zLmltcG9ydFBhdGgsIHBhcmFtcy5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHRvTGliTmFtZShsaWJGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQSBsaWIgYSBwYWNrYWdlIHJlcGxhY2VkIChgQHR5cGVzY3JpcHQvbGliLWRvbWAsIGBAdHlwZXNjcmlwdC9saWItZG9tL2l0ZXJhYmxlLmQudHNgKSBpcyBuYW1lZCBieSBpdHMgcGF0aCwgbm90IGJ5XG4gIC8vIGl0cyBmaWxlIG5hbWUsIHdoaWNoIGlzIGBpbmRleC5kLnRzYCBmb3IgdGhlIGxpYidzIHJvb3QuXG4gIGNvbnN0IHJlcGxhY2VtZW50TWF0Y2ggPSBMSUJfUkVQTEFDRU1FTlRfUkVHX0VYUC5leGVjKGxpYkZpbGVQYXRoKTtcbiAgaWYgKHJlcGxhY2VtZW50TWF0Y2g/Lmdyb3VwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbHdheXMgY2FwdHVyZXMgYm90aCBncm91cHMuXG4gICAgY29uc3QgbGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydMaWInXSk7XG4gICAgY29uc3Qgc3ViTGliID0gU3RyaW5nKHJlcGxhY2VtZW50TWF0Y2guZ3JvdXBzWydTdWJMaWInXSk7XG4gICAgcmV0dXJuIChzdWJMaWIgPT09ICdpbmRleCcgPyBsaWIgOiBgJHtsaWJ9LiR7c3ViTGliLnJlcGxhY2VBbGwoJy8nLCAnLicpfWApLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VuYW1lKGxpYkZpbGVQYXRoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15saWJcXC4vLCAnJykucmVwbGFjZSgvXFwuZFxcLnRzJC8sICcnKTtcbn1cblxuZnVuY3Rpb24gdG9NdHNDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG10c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+Lm1qc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBtdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5tanMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZVN1YnBhdGhQYWNrYWdlSnNvbihmb2xkZXI6IHN0cmluZywgcGFja2FnZUpzb246IFBhY2thZ2VKc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlSnNvbihqb2luKGZvbGRlciwg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
|
|
530
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWJyYXJ5LWJ1aWxkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYnVpbGQgcGlwZWxpbmUgb2YgYSBUeXBlU2NyaXB0IExJQlJBUlkgcGFja2FnZTogb25lIGBkaXN0L2xpYi97Y2pzLGVzbX1gIHRyZWUgb2YgdW5idW5kbGVkIG1vZHVsZXMgYmVzaWRlIGl0c1xuICogYC5kLmN0c2AgLyBgLmQubXRzYCBkZWNsYXJhdGlvbnMsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCBhbmQgdGhlIGdlbmVyYXRlZCBgcGFja2FnZS5qc29uYCBgZXhwb3J0c2AgbWFwLlxuICpcbiAqIEVhY2ggc3RlcCB3b3JrcyBvbiB0aGUgY3VycmVudCB3b3JraW5nIGZvbGRlciwgd2hpY2ggaXMgdGhlIHBhY2thZ2UgYmVpbmcgYnVpbHQuIEEgcmVwb3NpdG9yeSdzXG4gKiBgc2NyaXB0cy9idWlsZC0qLnRzYCBlbnRyeSBwb2ludHMgYXJlIHRoaW4gYHdyYXBDbGlUYXNrYCB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBhbmQgaXRzIGBidWlsZGAgc2NyaXB0XG4gKiBydW5zIHRoZW0gaW4gb3JkZXIgdGhyb3VnaCB7QGxpbmsgcnVuQnVpbGRTdGVwc30uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBCdWlsZE9wdGlvbnMsXG4gIFBsdWdpblxufSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB0eXBlIHsgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFN5bWJvbCBhcyBUc1N5bWJvbCxcbiAgVHlwZUNoZWNrZXJcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzeW5jTWFwIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGlzRGVlcEVxdWFsIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbm9ybWFsaXplSWZSZWxhdGl2ZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBybSxcbiAgd3JpdGVGaWxlXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgcmVsYXRpdmUgYXMgcmVsYXRpdmVOYXRpdmUsXG4gIHJlc29sdmUgYXMgcmVzb2x2ZU5hdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIGNyZWF0ZVByb2dyYW0sXG4gIGZvckVhY2hDaGlsZCxcbiAgaXNJZGVudGlmaWVyLFxuICBpc1N0cmluZ0xpdGVyYWwsXG4gIFN5bWJvbEZsYWdzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuXG5pbXBvcnQgeyBidWlsZENsZWFuIH0gZnJvbSAnLi9idWlsZC50cyc7XG5pbXBvcnQgeyBjaGFuZ2VFeHRlbnNpb25QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9jaGFuZ2UtZXh0ZW5zaW9uLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBmaXhFc21QbHVnaW4gfSBmcm9tICcuL2J1bmRsZXJzL2VzYnVpbGQtaW1wbC9maXgtZXNtLXBsdWdpbi50cyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzUGx1Z2luIH0gZnJvbSAnLi9idW5kbGVycy9lc2J1aWxkLWltcGwvcHJlcHJvY2Vzcy1wbHVnaW4udHMnO1xuaW1wb3J0IHsgcGFyc2VUc0NvbmZpZyB9IGZyb20gJy4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gJy4vY29kZS1nZW5lcmF0b3IudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyB3cml0ZUpzb24gfSBmcm9tICcuL2pzb24udHMnO1xuaW1wb3J0IHsgbnBtUnVuT3B0aW9uYWwgfSBmcm9tICcuL25wbS1ydW4udHMnO1xuaW1wb3J0IHsgZWRpdFBhY2thZ2VKc29uIH0gZnJvbSAnLi9ucG0udHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVRvb2xDb21tYW5kIH0gZnJvbSAnLi9wYWNrYWdlLW1hbmFnZXIudHMnO1xuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi9yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGV4ZWNGcm9tUm9vdCB9IGZyb20gJy4vcm9vdC50cyc7XG5cbi8qKlxuICogVGhlIGJhbm5lciBldmVyeSBlbWl0dGVkIGxpYnJhcnkgbW9kdWxlIG9wZW5zIHdpdGguXG4gKi9cbmV4cG9ydCBjb25zdCBMSUJSQVJZX0JBTk5FUiA9IGAvKlxuVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgRVNCVUlMRFxuaWYgeW91IHdhbnQgdG8gdmlldyB0aGUgc291cmNlLCBwbGVhc2UgdmlzaXQgdGhlIGdpdGh1YiByZXBvc2l0b3J5IG9mIHRoaXMgcGx1Z2luXG4qL1xuYDtcblxuLyoqXG4gKiBUaGUgc3RlcHMgb2YgYSBsaWJyYXJ5IGJ1aWxkLCBpbiB0aGUgb3JkZXIge0BsaW5rIHJ1bkJ1aWxkU3RlcHN9IHJ1bnMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IExJQlJBUllfQlVJTERfU1RFUFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnYnVpbGQ6Y2xlYW4nLFxuICAnYnVpbGQ6Z2VuZXJhdGUtaW5kZXgnLFxuICAnYnVpbGQ6Y29tcGlsZScsXG4gICdidWlsZDp0eXBlcycsXG4gICdidWlsZDp2YWxpZGF0ZS1kZWNsYXJhdGlvbnMnLFxuICAnYnVpbGQ6bGliJyxcbiAgJ2J1aWxkOmdlbmVyYXRlLWV4cG9ydHMnLFxuICAnYnVpbGQ6dmFsaWRhdGUtZGVwZW5kZW5jaWVzJ1xuXTtcblxuLyoqXG4gKiBUaGUgZXhwb3J0IGNvbmRpdGlvbiBhIHJlcG9zaXRvcnkgaG9sZGluZyBzZXZlcmFsIHBhY2thZ2VzIG1hcHMgZXZlcnkgc3VicGF0aCBvbnRvIGl0cyBUeXBlU2NyaXB0IHNvdXJjZSB3aXRoLCBzb1xuICogYSBwYWNrYWdlIHRoZXJlIGNhbiBpbXBvcnQgYSBzaWJsaW5nIHBhY2thZ2UncyBzb3VyY2UgYmVmb3JlIGFueXRoaW5nIGlzIGJ1aWx0LiBQYXNzIGl0IHRvXG4gKiB7QGxpbmsgZ2VuZXJhdGVMaWJyYXJ5RXhwb3J0c30gdGhyb3VnaCB7QGxpbmsgR2VuZXJhdGVMaWJyYXJ5RXhwb3J0c09wdGlvbnMuc291cmNlQ29uZGl0aW9ufS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9DT05ESVRJT04gPSAnQG1uYW91bW92L3NvdXJjZSc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGJ1aWxkTGlicmFyeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRMaWJyYXJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBwcmVwcm9jZXNzIHBsdWdpbiBmb3Igb25lIG91dHB1dCBmb3JtYXQuIERlZmF1bHRzIHRvIHRoZSBnZW5lcmljIG9uZSwgd2hpY2ggY2FycmllcyBub1xuICAgKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBgcmVxdWlyZWAgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeT86IChpc0VzbTogYm9vbGVhbikgPT4gUGx1Z2luO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUxpYnJhcnlFeHBvcnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBFbnRyaWVzIGZvciBmaWxlcyB0aGF0IGFyZSBub3QgYnVpbHQgZnJvbSBhIHNvdXJjZSBmb2xkZXIgKGEgZm9sZGVyIG9mIHNoYXJlZCBgdHNjb25maWdgIHByZXNldHMsIGFtYmllbnQgYC5kLnRzYFxuICAgKiBmaWxlcyksIGtleWVkIGJ5IHN1YnBhdGguIFRoZXkgZ28gaW50byB0aGUgbWFwIGFmdGVyIHRoZSBnZW5lcmF0ZWQgZW50cmllcywgYXMgZ2l2ZW4sIGFuZCBjb3VudCB0b3dhcmQgaXRzIGNoYW5nZVxuICAgKiBjaGVjazsgbm8gc3VicGF0aCBzdHViIGlzIHdyaXR0ZW4gZm9yIHRoZW0uIEEga2V5IGEgc291cmNlIGZvbGRlciBhbHJlYWR5IGdlbmVyYXRlcyB0aHJvd3MuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsRXhwb3J0cz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFBhY2thZ2VKc29uLkV4cG9ydHM+PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQW4gZXhwb3J0IGNvbmRpdGlvbiB0byBwdXQgZmlyc3QgaW4gZXZlcnkgZW50cnksIG1hcHBpbmcgdGhlIHN1YnBhdGggb250byBpdHMgVHlwZVNjcmlwdCBzb3VyY2UuIE9ubHkgYVxuICAgKiByZXBvc2l0b3J5IGhvbGRpbmcgc2V2ZXJhbCBwYWNrYWdlcyB0aGF0IGltcG9ydCBlYWNoIG90aGVyIG5lZWRzIG9uZTsgbm90aGluZyBvdXRzaWRlIGl0IHNldHMgdGhlIGNvbmRpdGlvbiwgYW5kXG4gICAqIHRoZSBzb3VyY2VzIGl0IHBvaW50cyBhdCBkbyBub3Qgc2hpcCwgc28gdGhlIHB1Ymxpc2ggaGFzIHRvIHN0cmlwIGl0IGFnYWluLiBPbWl0dGVkLCB0aGUgbWFwIGhhcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29uZGl0aW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG50eXBlIE1vZHVsZUZvcm1hdCA9ICdjanMnIHwgJ2VzbSc7XG5cbmNvbnN0IERFQ0xBUkFUSU9OX1JFRkVSRU5DRV9UWVBFUyA9IG5ldyBTZXQoWydub2RlJ10pO1xuXG4vLyBUaGUgbGlicyB0aGF0IGRlc2NyaWJlIGEgaG9zdCdzIGdsb2JhbHMgcmF0aGVyIHRoYW4gdGhlIGxhbmd1YWdlLCB3aGljaCBjb25zdW1lcnMgY29uZmxpY3Qgb3Zlci4gRWFjaCBkZWNsYXJhdGlvblxuLy8gZ2V0cyB0aGUgb25lcyBpdCB1c2VzOyBldmVyeSBvdGhlciBsaWIgaXMgc2hhcmVkIHRocm91Z2ggYGxpYnJhcnktcmVmZXJlbmNlc2AuXG5jb25zdCBFTlZJUk9OTUVOVF9MSUJfUFJFRklYRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkb20nLCAnc2NyaXB0aG9zdCcsICd3ZWJ3b3JrZXInXTtcbmNvbnN0IE5PREVfVFlQRVNfUEFUSF9TRUdNRU5UID0gJy9ub2RlX21vZHVsZXMvQHR5cGVzL25vZGUvJztcbmNvbnN0IExJQl9SRVBMQUNFTUVOVF9SRUdfRVhQID0gL1xcL25vZGVfbW9kdWxlc1xcL0B0eXBlc2NyaXB0XFwvbGliLSg/PExpYj5bXi9dKylcXC8oPzxTdWJMaWI+LispXFwuZFxcLnRzJC87XG5cbi8vIFRoZSBkZWNsYXJhdGlvbiB0aGF0IGNhcnJpZXMgb25seSB0aGUgYGxpYmAgYW5kIGB0eXBlc2AgcmVmZXJlbmNlcy4gRXZlcnkgZGVjbGFyYXRpb24gYnV0IHRoZSByb290IG9uZSByZWZlcmVuY2VzXG4vLyBpdCwgcmF0aGVyIHRoYW4gdGhlIHJvb3QgYmFycmVsLCB3aGljaCB3b3VsZCBsb2FkIGV2ZXJ5IG1vZHVsZSBvZiB0aGUgcGFja2FnZSwgb3B0aW9uYWwgcGVlcnMnIHR5cGVzIGluY2x1ZGVkLlxuY29uc3QgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSA9ICdsaWJyYXJ5LXJlZmVyZW5jZXMnO1xuLy8gU3BlbGxlZCBhcGFydCBvbiBwdXJwb3NlOiB7QGxpbmsgY29sbGVjdEFsbExpYnN9IHNjYW5zIGV2ZXJ5IHNvdXJjZSBmaWxlIG9mIHRoZSBwYWNrYWdlIGJlaW5nIGJ1aWx0IGZvciB0aGVcbi8vIGRpcmVjdGl2ZSwgdGhpcyBvbmUgaW5jbHVkZWQsIHNvIGEgbGl0ZXJhbCBvbmUgaGVyZSB3b3VsZCBiZSByZWFkIGFzIGEgbGliIHRoaXMgcGFja2FnZSBuZWVkcy5cbmNvbnN0IFJFRkVSRU5DRV9MSUJfRElSRUNUSVZFID0gWyc8cmVmZXJlbmNlJywgJ2xpYj0nXS5qb2luKCcgJyk7XG5jb25zdCBSRUZFUkVOQ0VfTElCX1JFR19FWFAgPSAvXFwvXFwvXFwvIDxyZWZlcmVuY2UgbGliPVwiKD88TGliPlteXCJdKylcIiBcXC8+L2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIHR5cGUtb25seSBpbXBvcnQsIGUuZy4gYGltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7YC5cbmNvbnN0IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUCA9IC9eaW1wb3J0IHR5cGUgKD88Q2xhdXNlPi4rPykgZnJvbSAnKD88U3BlY2lmaWVyPlteLiddW14nXSopJzskL2dtO1xuXG4vLyBBIGJhcmUtc3BlY2lmaWVyIChub24tcmVsYXRpdmUpIGlubGluZSBpbXBvcnQgdHlwZSBub2RlLCBlLmcuIGBpbXBvcnQoXCJ0eXBlLWZlc3RcIikuUHJvbWlzYWJsZWAuXG5jb25zdCBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQID0gL2ltcG9ydFxcKFwiKD88U3BlY2lmaWVyPlteLlwiXVteXCJdKilcIlxcKS9nO1xuXG5jb25zdCBTVEFUSUNfSU1QT1JUX1JFR19FWFAgPSAvZnJvbSAnKD88SW1wb3J0UGF0aD4uKz8pXFwudHMnOy9nbTtcblxuLy8gSW5saW5lIGltcG9ydC10eXBlIG5vZGVzIChgdHlwZW9mIGltcG9ydCgnLi9mb28udHMnKWApIHByZXNlcnZlIHRoZSBzb3VyY2UgcXVvdGUgc3R5bGUuXG4vLyBIYW5kLWF1dGhvcmVkIGAuZC50c2AgZmlsZXMgZW1pdCBzaW5nbGUgcXVvdGVzOyB0c2MtZ2VuZXJhdGVkIGRlY2xhcmF0aW9ucyBlbWl0IGRvdWJsZSBxdW90ZXMuXG4vLyBDYXB0dXJlIHRoZSBxdW90ZSBhbmQgcmV1c2UgaXQgaW4gdGhlIHJlcGxhY2VtZW50IHNvIGJvdGggc3R5bGVzIGFyZSByZXdyaXR0ZW4uXG5jb25zdCBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQID0gL2ltcG9ydFxcKCg/PFF1b3RlPlsnXCJdKSg/PEltcG9ydFBhdGg+Lis/KVxcLnRzXFxrPFF1b3RlPlxcKS9nbTtcblxuZW51bSBHZW5lcmF0ZUluZGV4UmVzdWx0IHtcbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgU3VjY2VzcyA9ICdzdWNjZXNzJ1xufVxuXG5pbnRlcmZhY2UgQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliczogU2V0PHN0cmluZz47XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHN5bWJvbDogVHNTeW1ib2w7XG4gIHJlYWRvbmx5IHR5cGVzOiBTZXQ8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkTGlicmFyeUZvcm1hdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGZvcm1hdDogTW9kdWxlRm9ybWF0O1xuICByZWFkb25seSBsaWJGaWxlczogc3RyaW5nW107XG4gIHJlYWRvbmx5IHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5OiAoaXNFc206IGJvb2xlYW4pID0+IFBsdWdpbjtcbn1cblxuaW50ZXJmYWNlIEJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGRlY2xhcmF0aW9uRmlsZVBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZHVsZURpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyB7XG4gIHJlYWRvbmx5IGF2YWlsYWJsZVR5cGVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZGVjbGFyYXRpb25GaWxlczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBTZXRFeHBvcnRQYXJhbXMge1xuICByZWFkb25seSBleHBvcnRDb25kaXRpb25zOiBQYWNrYWdlSnNvbi5FeHBvcnRDb25kaXRpb25zO1xuICByZWFkb25seSBpc1dpbGRjYXJkOiBib29sZWFuO1xuICByZWFkb25seSBzb3VyY2VDb25kaXRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUb0Rpc3RQYXRoUGFyYW1zIHtcbiAgcmVhZG9ubHkgZm9ybWF0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltcG9ydFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXZlcnl0aGluZyBhbiBlYXJsaWVyIGJ1aWxkIGxlZnQ6IGBkaXN0L2AsIHRoZSBnZW5lcmF0ZWQgYGluZGV4LnRzYCBiYXJyZWxzLCB0aGUgYC5kLnRzYCBmaWxlcyBgdHNjYCB3cm90ZVxuICogYmVzaWRlIHRoZSBzb3VyY2VzIChoYW5kLWF1dGhvcmVkIG9uZXMgdW5kZXIgYEB0eXBlc2Agc3RheSksIGFuZCB0aGUgcGVyLXN1YnBhdGggYHBhY2thZ2UuanNvbmAgc3R1YnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ2xlYW5MaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBidWlsZENsZWFuKCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoYmFzZW5hbWUoZmlsZSkgPT09IFJlcG9QYXRocy5JbmRleFRzIGFzIHN0cmluZykge1xuICAgICAgYXdhaXQgcm0oam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSk7XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpKSB7XG4gICAgICBhd2FpdCBybShqb2luKFJlcG9QYXRocy5TcmMsIGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgIGlmICgoYmFzZW5hbWUoZmlsZSkgIT09IFJlcG9QYXRocy5QYWNrYWdlSnNvbiBhcyBzdHJpbmcpIHx8IChmaWxlID09PSBSZXBvUGF0aHMuUGFja2FnZUpzb24gYXMgc3RyaW5nKSB8fCBmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLk5vZGVNb2R1bGVzKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYXdhaXQgcm0oZmlsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgZXZlcnkgc291cmNlIG1vZHVsZSwgdW5idW5kbGVkLCBpbnRvIGBkaXN0L2xpYi9janNgIChgLmNqc2ApIGFuZCBgZGlzdC9saWIvZXNtYCAoYC5tanNgKS5cbiAqXG4gKiBUaGUgb3V0cHV0IGZvbGRlcnMgbXVzdCBhbHJlYWR5IGV4aXN0OyB7QGxpbmsgYnVpbGRMaWJyYXJ5VHlwZXN9IGNyZWF0ZXMgdGhlbS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGJvdGggZm9ybWF0cyBoYXZlIGJlZW4gYnVpbHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnkob3B0aW9uczogQnVpbGRMaWJyYXJ5T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkgPSAoaXNFc206IGJvb2xlYW4pOiBQbHVnaW4gPT4gcHJlcHJvY2Vzc1BsdWdpbih7IGlzRXNtIH0pIH0gPSBvcHRpb25zO1xuICBjb25zdCBsaWJGaWxlcyA9IGF3YWl0IGdldExpYkZpbGVzKCk7XG4gIGF3YWl0IGJ1aWxkTGlicmFyeUZvcm1hdCh7IGZvcm1hdDogJ2NqcycsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9KTtcbiAgYXdhaXQgYnVpbGRMaWJyYXJ5Rm9ybWF0KHsgZm9ybWF0OiAnZXNtJywgbGliRmlsZXMsIHByZXByb2Nlc3NQbHVnaW5GYWN0b3J5IH0pO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZWNsYXJhdGlvbnMgd2l0aCBgdHNjIC0tcHJvamVjdCAuL3RzY29uZmlnLnR5cGVzLmpzb25gLCB0aGVuIGNvcGllcyBlYWNoIG9uZSBpbnRvIGBkaXN0L2xpYmAgdHdpY2U6IGFzIGFcbiAqIGAuZC5jdHNgIHdob3NlIHJlbGF0aXZlIGltcG9ydHMgbmFtZSBgLmNqc2AgZmlsZXMgYW5kIHdob3NlIGJhcmUgdHlwZSBpbXBvcnRzIGNhcnJ5IGByZXNvbHV0aW9uLW1vZGU6IGltcG9ydGAsIGFuZFxuICogYXMgYSBgLmQubXRzYCB3aG9zZSByZWxhdGl2ZSBpbXBvcnRzIG5hbWUgYC5tanNgIGZpbGVzLlxuICpcbiAqIFRoZSBsaWJyYXJ5J3Mgcm9vdCBkZWNsYXJhdGlvbiAoYGxpYnJhcnkudHNgIHdoZXJlIHRoZSBwYWNrYWdlIGhhcyBvbmUsIG90aGVyd2lzZSB0aGUgZ2VuZXJhdGVkIGBpbmRleC50c2ApIGNhcnJpZXNcbiAqIGV2ZXJ5IGBsaWJgIGFuZCBgdHlwZXNgIHJlZmVyZW5jZSB0aGUgcGFja2FnZSBuZWVkcy4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gcmVmZXJlbmNlcyBhIGBsaWJyYXJ5LXJlZmVyZW5jZXNgXG4gKiBkZWNsYXJhdGlvbiBiZXNpZGUgaXQgYnkgcGF0aCwgbmV2ZXIgdGhlIHJvb3Q6IHRoZSByb290IGJhcnJlbCByZS1leHBvcnRzIGV2ZXJ5IG1vZHVsZSwgc28gcmVmZXJlbmNpbmcgaXQgbWFkZSBlYWNoXG4gKiBzdWJwYXRoIGxvYWQgdGhlIHdob2xlIHBhY2thZ2UsIGFuZCBhIGNvbnN1bWVyIHR5cGUtY2hlY2tpbmcgd2l0aCBgc2tpcExpYkNoZWNrOiBmYWxzZWAgdGhlbiBuZWVkZWQgZXZlcnkgb3B0aW9uYWxcbiAqIHBlZXIgaW5zdGFsbGVkLlxuICpcbiAqIGBsaWJyYXJ5LXJlZmVyZW5jZXNgIGNhcnJpZXMgb25seSB0aGUgbGlicyB0aGF0IGRlc2NyaWJlIHRoZSBsYW5ndWFnZSAoYGVzMjAyMmAsIGBlc25leHQuZGlzcG9zYWJsZWApLCB3aGljaCBub1xuICogY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBvbmVzIHRoYXQgZGVzY3JpYmUgYSBob3N0IChgZG9tYCwgYGRvbS5pdGVyYWJsZWAsIGB3ZWJ3b3JrZXJgKSBhbmQgYHR5cGVzPVwibm9kZVwiYCBnb1xuICogb25seSBpbnRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCBuYW1lIG9uZSBvZiB0aGVpciBnbG9iYWxzLCBmb3VuZCBieSByZXNvbHZpbmcgZXZlcnkgbmFtZSBpbiB0aGUgZW1pdHRlZFxuICogZGVjbGFyYXRpb25zIHdpdGggdGhlIHR5cGUgY2hlY2tlci4gT3RoZXJ3aXNlIGEgYnJvd3NlciBjb25zdW1lciBvZiBhIHB1cmUgc3VicGF0aCBnb3QgYWxsIG9mIGBAdHlwZXMvbm9kZWAsIGFuZCBpdHNcbiAqIGBzZXRUaW1lb3V0YCByZXR1cm5lZCBgTm9kZUpTLlRpbWVvdXRgLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGVjbGFyYXRpb25zIGhhdmUgYmVlbiB3cml0dGVuLlxuICogQHRocm93cyBJZiBhIHNvdXJjZSBtb2R1bGUgaXMgbmFtZWQgYGxpYnJhcnktcmVmZXJlbmNlc2AsIHdoaWNoIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZ2VuZXJhdGVkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRMaWJyYXJ5VHlwZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChleGlzdHNTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgYCR7TElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRX0ke1JlcG9QYXRocy5Uc0V4dGVuc2lvbn1gKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNyYy8ke0xJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUV9JHtSZXBvUGF0aHMuVHNFeHRlbnNpb259IGNvbGxpZGVzIHdpdGggdGhlIGdlbmVyYXRlZCBkZWNsYXJhdGlvbiBvZiB0aGUgc2FtZSBuYW1lLmApO1xuICB9XG5cbiAgYXdhaXQgZXhlY0Zyb21Sb290KFsuLi5yZXNvbHZlVG9vbENvbW1hbmQoeyB0b29sOiAndHNjJyB9KSwgJy0tcHJvamVjdCcsICcuL3RzY29uZmlnLnR5cGVzLmpzb24nXSk7XG5cbiAgY29uc3QgbGlicmFyeUZpbGVOYW1lID0gZXhpc3RzU3luYyhqb2luKFJlcG9QYXRocy5TcmMsICdsaWJyYXJ5LnRzJykpID8gJ2xpYnJhcnknIDogJ2luZGV4JztcbiAgY29uc3QgYWxsTGlicyA9IGF3YWl0IGNvbGxlY3RBbGxMaWJzKCk7XG4gIGNvbnN0IGFsbFR5cGVzID0gY29sbGVjdEFsbFR5cGVzKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXMgPSBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMoYWxsTGlicykgKyBidWlsZEFsbFJlZmVyZW5jZVR5cGVzRGlyZWN0aXZlcyhhbGxUeXBlcyk7XG4gIC8vIE9ubHkgdGhlIGxpYnMgbm8gY29uc3VtZXIgY29uZmxpY3RzIHdpdGguIFRoZSBlbnZpcm9ubWVudCBnbG9iYWxzIGdvIHRvIHRoZSBkZWNsYXJhdGlvbnMgdGhhdCB1c2UgdGhlbS5cbiAgY29uc3Qgc2hhcmVkRGlyZWN0aXZlcyA9IGJ1aWxkQWxsUmVmZXJlbmNlTGliRGlyZWN0aXZlcyhhbGxMaWJzLmZpbHRlcigobGliKSA9PiAhaXNFbnZpcm9ubWVudExpYihsaWIpKSk7XG5cbiAgYXdhaXQgbWtkaXIoam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBta2Rpcihqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuQ2pzLCBMSUJSQVJZX1JFRkVSRU5DRVNfRklMRV9OQU1FICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pLCBzaGFyZWREaXJlY3RpdmVzKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIFJlcG9QYXRocy5Fc20sIExJQlJBUllfUkVGRVJFTkNFU19GSUxFX05BTUUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbiksIHNoYXJlZERpcmVjdGl2ZXMpO1xuXG4gIGNvbnN0IHNyY0ZpbGVzID0gYXdhaXQgcmVhZGRpclBvc2l4KFJlcG9QYXRocy5TcmMsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZWNsYXJhdGlvbkZpbGVzID0gc3JjRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5EdHNFeHRlbnNpb24pICYmICFmaWxlLnN0YXJ0c1dpdGgoUmVwb1BhdGhzLlRlc3RIZWxwZXJzKSk7XG4gIGNvbnN0IGVudmlyb25tZW50RGlyZWN0aXZlcyA9IGNvbGxlY3RFbnZpcm9ubWVudERpcmVjdGl2ZXMoeyBhdmFpbGFibGVUeXBlczogYWxsVHlwZXMsIGRlY2xhcmF0aW9uRmlsZXMgfSk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGRlY2xhcmF0aW9uRmlsZXMpIHtcbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGUpO1xuICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShmaWxlLCBSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoam9pbihSZXBvUGF0aHMuU3JjLCBmaWxlKSwgJ3V0Zi04Jyk7XG5cbiAgICBjb25zdCBjdHNQYXRoID0gam9pbihSZXBvUGF0aHMuRGlzdExpYiwgUmVwb1BhdGhzLkNqcywgZm9sZGVyLCBuYW1lICsgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IG10c1BhdGggPSBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBSZXBvUGF0aHMuRXNtLCBmb2xkZXIsIG5hbWUgKyBSZXBvUGF0aHMuRG10c0V4dGVuc2lvbik7XG5cbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGN0c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG10c1BhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGxldCBjdHNDb250ZW50ID0gdG9DdHNDb250ZW50KGNvbnRlbnQpO1xuICAgIGxldCBtdHNDb250ZW50ID0gdG9NdHNDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgaWYgKG5hbWUgPT09IGxpYnJhcnlGaWxlTmFtZSAmJiBmb2xkZXIgPT09ICcuJykge1xuICAgICAgY3RzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGRpcmVjdGl2ZXMgKyBtdHNDb250ZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmaWxlRGlyZWN0aXZlcyA9IGVudmlyb25tZW50RGlyZWN0aXZlcy5nZXQoZmlsZSkgPz8gJyc7XG4gICAgICBjdHNDb250ZW50ID0gYnVpbGRSZWZlcmVuY2VQYXRoRGlyZWN0aXZlKHsgZGVjbGFyYXRpb25GaWxlUGF0aDogY3RzUGF0aCwgZXh0ZW5zaW9uOiBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5OiBSZXBvUGF0aHMuQ2pzIH0pXG4gICAgICAgICsgZmlsZURpcmVjdGl2ZXMgKyBjdHNDb250ZW50O1xuICAgICAgbXRzQ29udGVudCA9IGJ1aWxkUmVmZXJlbmNlUGF0aERpcmVjdGl2ZSh7IGRlY2xhcmF0aW9uRmlsZVBhdGg6IG10c1BhdGgsIGV4dGVuc2lvbjogUmVwb1BhdGhzLkRtdHNFeHRlbnNpb24sIG1vZHVsZURpcmVjdG9yeTogUmVwb1BhdGhzLkVzbSB9KVxuICAgICAgICArIGZpbGVEaXJlY3RpdmVzICsgbXRzQ29udGVudDtcbiAgICB9XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoY3RzUGF0aCwgY3RzQ29udGVudCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKG10c1BhdGgsIG10c0NvbnRlbnQpO1xuICB9XG59XG5cbi8qKlxuICogUmVnZW5lcmF0ZXMgdGhlIGBleHBvcnRzYCBtYXAgb2YgdGhlIHBhY2thZ2UncyBgcGFja2FnZS5qc29uYCBmcm9tIGl0cyBzb3VyY2UgZm9sZGVycywgYW5kIHdyaXRlcyBhIGBwYWNrYWdlLmpzb25gXG4gKiBzdHViIHBlciBzdWJwYXRoIGZvciByZXNvbHZlcnMgdGhhdCBkbyBub3QgcmVhZCBgZXhwb3J0c2AuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFwIGlzIGN1cnJlbnQuXG4gKiBAdGhyb3dzIElmIHRoZSBtYXAgY2hhbmdlZCwgc28gdGhlIGNoYW5nZSBnZXRzIHJldmlld2VkIGFuZCBjb21taXR0ZWQgcmF0aGVyIHRoYW4gc2hpcHBlZCB1bnNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUxpYnJhcnlFeHBvcnRzKG9wdGlvbnM6IEdlbmVyYXRlTGlicmFyeUV4cG9ydHNPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhZGRpdGlvbmFsRXhwb3J0cyA9IHt9LCBzb3VyY2VDb25kaXRpb24gfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNyY0ZvbGRlcnM6IHN0cmluZ1tdID0gW1JlcG9QYXRocy5TcmNdO1xuXG4gIGZvciAoY29uc3QgZGlyZW50IG9mIGF3YWl0IHJlYWRkaXJQb3NpeChSZXBvUGF0aHMuU3JjLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBqb2luKGRpcmVudC5wYXJlbnRQYXRoLCBkaXJlbnQubmFtZSk7XG5cbiAgICBpZiAocGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuU3R5bGVzKSB8fCBwYXRoLmluY2x1ZGVzKFJlcG9QYXRocy5UZXN0SGVscGVycykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHNyY0ZvbGRlcnMucHVzaChwYXRoKTtcbiAgfVxuXG4gIHNyY0ZvbGRlcnMuc29ydCgpO1xuXG4gIGxldCBpc0NoYW5nZWQgPSBmYWxzZTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUpzb24oYXN5bmMgKHBhY2thZ2VKc29uKSA9PiB7XG4gICAgY29uc3Qgb2xkRXhwb3J0cyA9IHBhY2thZ2VKc29uLmV4cG9ydHM7XG4gICAgY29uc3QgZXhwb3J0Q29uZGl0aW9uczogUGFja2FnZUpzb24uRXhwb3J0Q29uZGl0aW9ucyA9IHt9O1xuICAgIHBhY2thZ2VKc29uLmV4cG9ydHMgPSBleHBvcnRDb25kaXRpb25zO1xuICAgIGZvciAoY29uc3Qgc3JjRm9sZGVyIG9mIHNyY0ZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IGZhbHNlLCBzb3VyY2VDb25kaXRpb24sIHNyY0ZvbGRlciB9KTtcbiAgICAgIGF3YWl0IHNldEV4cG9ydCh7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQ6IHRydWUsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnBhdGgsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRXhwb3J0cykpIHtcbiAgICAgIGlmIChleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWRkaXRpb25hbCBleHBvcnQgJyR7c3VicGF0aH0nIGNvbGxpZGVzIHdpdGggYW4gZW50cnkgZ2VuZXJhdGVkIGZyb20gYSBzb3VyY2UgZm9sZGVyLmApO1xuICAgICAgfVxuXG4gICAgICBleHBvcnRDb25kaXRpb25zW3N1YnBhdGhdID0gZW50cnk7XG4gICAgfVxuXG4gICAgaXNDaGFuZ2VkID0gIWlzRGVlcEVxdWFsKG9sZEV4cG9ydHMsIHBhY2thZ2VKc29uLmV4cG9ydHMpO1xuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBJdCBjaGFuZ2VkIGluIHRoZSBgZWRpdFBhY2thZ2VKc29uYCwgRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICBpZiAoaXNDaGFuZ2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQYWNrYWdlIGV4cG9ydHMgaGF2ZSBjaGFuZ2VkLiBQbGVhc2UgcmV2aWV3IHRoZSBjaGFuZ2VzIGFuZCBjb21taXQgdGhlbS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhbiBgaW5kZXgudHNgIGJhcnJlbCBpbiBldmVyeSBzb3VyY2UgZm9sZGVyIHRoYXQgaGFzIHNvbWV0aGluZyB0byBleHBvcnQsIHJlLWV4cG9ydGluZyBlYWNoIG1vZHVsZSBhbmRcbiAqIGVhY2ggc3ViLWJhcnJlbCB1bmRlciBpdHMgb3duIG5hbWUuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYXJyZWxzIGhhdmUgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVMaWJyYXJ5SW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdlbmVyYXRlSW5kZXgoUmVwb1BhdGhzLlNyYyk7XG59XG5cbi8qKlxuICogUnVucyBlYWNoIG5hbWVkIG5wbSBzY3JpcHQgdGhlIHBhY2thZ2UgZGVmaW5lcywgaW4gb3JkZXIsIHNraXBwaW5nIHRoZSBvbmVzIGl0IGRvZXMgbm90IGRlZmluZS5cbiAqXG4gKiBAcGFyYW0gc3RlcHMgLSBUaGUgbnBtIHNjcmlwdCBuYW1lcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBzdGVwIGhhcyBydW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzKHN0ZXBzOiByZWFkb25seSBzdHJpbmdbXSA9IExJQlJBUllfQlVJTERfU1RFUFMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBzKSB7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoc3RlcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGRzIHdoYXQgYSBjb25zdW1lciBuZWVkcyBsb2FkZWQgZm9yIG9uZSBzeW1ib2wgYSBkZWNsYXJhdGlvbiBuYW1lcy4gQSBzeW1ib2wgYW55IEVTIGxpYiBkZWNsYXJlcyBuZWVkcyBub3RoaW5nLFxuICogYmVjYXVzZSBubyBjb25zdW1lciBjb25mbGljdHMgd2l0aCB0aG9zZSBsaWJzLiBPdGhlcndpc2UgZWFjaCBlbnZpcm9ubWVudCBsaWIgdGhhdCBkZWNsYXJlcyBpdCBhZGRzIGl0c2VsZiwgYW5kXG4gKiBmYWlsaW5nIHRoYXQgYEB0eXBlcy9ub2RlYCBhZGRzIGBub2RlYC4gQSBzeW1ib2wgZGVjbGFyZWQgaW4gdGhlIHBhY2thZ2UncyBvd24gZmlsZXMgYWRkcyBub3RoaW5nOiB0aGUgZGVjbGFyYXRpb25cbiAqIHRoYXQgaG9sZHMgaXQgY2FycmllcyBpdHMgb3duIGRpcmVjdGl2ZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzeW1ib2wsIHRoZSBwcm9ncmFtIGl0IHdhcyByZXNvbHZlZCBpbiwgYW5kIHRoZSBzZXRzIHRvIGFkZCB0by5cbiAqL1xuZnVuY3Rpb24gYWRkRW52aXJvbm1lbnRHbG9iYWxzKHBhcmFtczogQWRkRW52aXJvbm1lbnRHbG9iYWxzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgbGlicywgcHJvZ3JhbSwgc3ltYm9sLCB0eXBlcyB9ID0gcGFyYW1zO1xuICBjb25zdCBlbnZpcm9ubWVudExpYnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpc05vZGUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbC5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICAgIGlmIChwcm9ncmFtLmlzU291cmNlRmlsZURlZmF1bHRMaWJyYXJ5KHNvdXJjZUZpbGUpKSB7XG4gICAgICBjb25zdCBsaWIgPSB0b0xpYk5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBpZiAoIWlzRW52aXJvbm1lbnRMaWIobGliKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbnZpcm9ubWVudExpYnMucHVzaChsaWIpO1xuICAgIH0gZWxzZSBpZiAoc291cmNlRmlsZS5maWxlTmFtZS5pbmNsdWRlcyhOT0RFX1RZUEVTX1BBVEhfU0VHTUVOVCkpIHtcbiAgICAgIGlzTm9kZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKGVudmlyb25tZW50TGlicy5sZW5ndGggPiAwKSB7XG4gICAgZm9yIChjb25zdCBsaWIgb2YgZW52aXJvbm1lbnRMaWJzKSB7XG4gICAgICBsaWJzLmFkZChsaWIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc05vZGUpIHtcbiAgICB0eXBlcy5hZGQoJ25vZGUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZEFsbFJlZmVyZW5jZUxpYkRpcmVjdGl2ZXMobGliczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7XG4gICAgbGlic1xuICAgICAgLm1hcCgobGliKSA9PiBgLy8vICR7UkVGRVJFTkNFX0xJQl9ESVJFQ1RJVkV9XCIke2xpYn1cIiAvPmApXG4gICAgICAuam9pbignXFxuJylcbiAgfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWxsUmVmZXJlbmNlVHlwZXNEaXJlY3RpdmVzKHR5cGVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgJHtcbiAgICAgIHR5cGVzXG4gICAgICAgIC5tYXAoKHR5cGUpID0+IGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIiR7dHlwZX1cIiAvPmApXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZExpYnJhcnlGb3JtYXQocGFyYW1zOiBCdWlsZExpYnJhcnlGb3JtYXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBmb3JtYXQsIGxpYkZpbGVzLCBwcmVwcm9jZXNzUGx1Z2luRmFjdG9yeSB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRlbnNpb24gPSBmb3JtYXQgPT09ICdjanMnID8gUmVwb1BhdGhzLkNqc0V4dGVuc2lvbiA6IFJlcG9QYXRocy5NanNFeHRlbnNpb247XG4gIGNvbnN0IGJ1aWxkT3B0aW9uczogQnVpbGRPcHRpb25zID0ge1xuICAgIC8vIEV4cGxpY2l0LCBiZWNhdXNlIGVzYnVpbGQgb3RoZXJ3aXNlIHRha2VzIHRoZSBmb2xkZXIgaXRzIHNlcnZpY2UgcHJvY2VzcyBzdGFydGVkIGluLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGVzYnVpbGQncyBvd24gb3B0aW9uIG5hbWUuXG4gICAgYWJzV29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICBiYW5uZXI6IHtcbiAgICAgIGpzOiBMSUJSQVJZX0JBTk5FUlxuICAgIH0sXG4gICAgYnVuZGxlOiBmYWxzZSxcbiAgICBlbnRyeVBvaW50czogbGliRmlsZXMsXG4gICAgZm9ybWF0LFxuICAgIGxvZ0xldmVsOiAnaW5mbycsXG4gICAgb3V0ZGlyOiBqb2luKFJlcG9QYXRocy5EaXN0TGliLCBmb3JtYXQpLFxuICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgcGx1Z2luczogW1xuICAgICAgcHJlcHJvY2Vzc1BsdWdpbkZhY3RvcnkoZm9ybWF0ID09PSAnZXNtJyksXG4gICAgICBmaXhFc21QbHVnaW4oKSxcbiAgICAgIGNoYW5nZUV4dGVuc2lvblBsdWdpbihleHRlbnNpb24pXG4gICAgXSxcbiAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgd3JpdGU6IGZhbHNlXG4gIH07XG5cbiAgY29uc3QgYnVpbGRDb250ZXh0ID0gYXdhaXQgY29udGV4dChidWlsZE9wdGlvbnMpO1xuICB0cnkge1xuICAgIGF3YWl0IGJ1aWxkQ29udGV4dC5yZWJ1aWxkKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgYnVpbGRDb250ZXh0LmRpc3Bvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBidWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmUocGFyYW1zOiBCdWlsZFJlZmVyZW5jZVBhdGhEaXJlY3RpdmVQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGRlY2xhcmF0aW9uRmlsZVBhdGgsIGV4dGVuc2lvbiwgbW9kdWxlRGlyZWN0b3J5IH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpYnJhcnlGaWxlUGF0aCA9IGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIG1vZHVsZURpcmVjdG9yeSwgTElCUkFSWV9SRUZFUkVOQ0VTX0ZJTEVfTkFNRSArIGV4dGVuc2lvbik7XG4gIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZU5hdGl2ZShkaXJuYW1lKGRlY2xhcmF0aW9uRmlsZVBhdGgpLCBsaWJyYXJ5RmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICB9XG4gIHJldHVybiBgLy8vIDxyZWZlcmVuY2UgcGF0aD1cIiR7cmVsYXRpdmVQYXRofVwiIC8+XFxuYDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29sbGVjdEFsbExpYnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAvLyBUaGUgUkVTT0xWRUQgb3B0aW9ucywgYmVjYXVzZSBhIHBhY2thZ2UncyBgdHNjb25maWcuanNvbmAgaW5oZXJpdHMgYGxpYmAgZnJvbSB0aGUgc2hhcmVkIGJhc2UuIFRoZSByZXNvbHZlZFxuICAvLyBuYW1lcyBhcmUgZmlsZSBuYW1lcyAoYGxpYi5kb20uaXRlcmFibGUuZC50c2ApLCBzbyB0aGV5IGFyZSBtYXBwZWQgYmFjayBvbnRvIHRoZSBuYW1lcyBhIGRpcmVjdGl2ZSB0YWtlcy5cbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICBjb25zdCBsaWJzID0gbmV3IFNldCgob3B0aW9ucy5saWIgPz8gW10pLm1hcCgobGliKSA9PiB0b0xpYk5hbWUobGliKSkpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSkpIHtcbiAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy50cycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gcmVhZEZpbGVTeW5jKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSksICd1dGYtOCcpO1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGl0cyBvbmUgZ3JvdXAsIHNvIG5vIGZhbGxiYWNrIGZvciBhIG1pc3Npbmcgb25lIGlzIG5lZWRlZC5cbiAgICBmb3IgKGNvbnN0IFssIGxpYl0gb2Ygc291cmNlQ29udGVudC5tYXRjaEFsbChSRUZFUkVOQ0VfTElCX1JFR19FWFApKSB7XG4gICAgICBsaWJzLmFkZChTdHJpbmcobGliKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gWy4uLmxpYnNdLnNvcnQoKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdEFsbFR5cGVzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgeyBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKFJlcG9QYXRocy5Uc0NvbmZpZ0pzb24pO1xuICByZXR1cm4gKG9wdGlvbnMudHlwZXMgPz8gW10pXG4gICAgLmZpbHRlcigodHlwZSkgPT4gREVDTEFSQVRJT05fUkVGRVJFTkNFX1RZUEVTLmhhcyh0eXBlKSlcbiAgICAuc29ydCgpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0RW52aXJvbm1lbnREaXJlY3RpdmVzKHBhcmFtczogQ29sbGVjdEVudmlyb25tZW50RGlyZWN0aXZlc1BhcmFtcyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB7IGF2YWlsYWJsZVR5cGVzLCBkZWNsYXJhdGlvbkZpbGVzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhSZXBvUGF0aHMuVHNDb25maWdKc29uKTtcbiAgY29uc3QgcHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oe1xuICAgIG9wdGlvbnM6IHsgLi4ub3B0aW9ucywgbm9FbWl0OiB0cnVlIH0sXG4gICAgcm9vdE5hbWVzOiBkZWNsYXJhdGlvbkZpbGVzLm1hcCgoZmlsZSkgPT4gcmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSlcbiAgfSk7XG4gIGNvbnN0IGNoZWNrZXIgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gIGNvbnN0IGRpcmVjdGl2ZXNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiBkZWNsYXJhdGlvbkZpbGVzKSB7XG4gICAgLy8gVGhlIHByb2dyYW0gd2FzIGhhbmRlZCBldmVyeSBvbmUgb2YgdGhlc2UgYXMgYSByb290IG5hbWUsIHNvIGVhY2ggb25lIGlzIGluIGl0LlxuICAgIGNvbnN0IHNvdXJjZUZpbGUgPSBlbnN1cmVOb25OdWxsYWJsZShwcm9ncmFtLmdldFNvdXJjZUZpbGUocmVzb2x2ZU5hdGl2ZShSZXBvUGF0aHMuU3JjLCBmaWxlKSkpO1xuICAgIGNvbnN0IGxpYnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCB0eXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgICAgaWYgKGlzSWRlbnRpZmllcihub2RlKSB8fCBpc1N0cmluZ0xpdGVyYWwobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKG5vZGUpO1xuICAgICAgICBpZiAoc3ltYm9sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhZGRFbnZpcm9ubWVudEdsb2JhbHMoeyBsaWJzLCBwcm9ncmFtLCBzeW1ib2w6IHJlc29sdmVBbGlhcyhjaGVja2VyLCBzeW1ib2wpLCB0eXBlcyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0KTtcbiAgICB9XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG5cbiAgICBjb25zdCBuZWVkZWRUeXBlcyA9IFsuLi50eXBlc10uZmlsdGVyKCh0eXBlKSA9PiBhdmFpbGFibGVUeXBlcy5pbmNsdWRlcyh0eXBlKSk7XG4gICAgaWYgKGxpYnMuc2l6ZSA+IDAgfHwgbmVlZGVkVHlwZXMubGVuZ3RoID4gMCkge1xuICAgICAgZGlyZWN0aXZlc0J5RmlsZS5zZXQoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIChsaWJzLnNpemUgPiAwID8gYnVpbGRBbGxSZWZlcmVuY2VMaWJEaXJlY3RpdmVzKFsuLi5saWJzXS5zb3J0KCkpIDogJycpICsgYnVpbGRBbGxSZWZlcmVuY2VUeXBlc0RpcmVjdGl2ZXMobmVlZGVkVHlwZXMuc29ydCgpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlyZWN0aXZlc0J5RmlsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleChmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8R2VuZXJhdGVJbmRleFJlc3VsdD4ge1xuICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpclBvc2l4KGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBtYXliZUxpbmVzID0gYXdhaXQgYXN5bmNNYXAoZGlyZW50cywgKGRpcmVudCkgPT4gaGFuZGxlSW5kZXhEaXJlbnQoZm9sZGVyLCBkaXJlbnQpKTtcbiAgY29uc3QgbGluZXMgPSBtYXliZUxpbmVzLmZpbHRlcigobGluZSkgPT4gbGluZSAhPT0gdW5kZWZpbmVkKTtcblxuICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU2tpcHBlZDtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlKGpvaW4oZm9sZGVyLCBSZXBvUGF0aHMuSW5kZXhUcyksIGxpbmVzKTtcbiAgcmV0dXJuIEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0TGliRmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBsZXQgZmlsZXMgPSBhd2FpdCByZWFkZGlyUG9zaXgoUmVwb1BhdGhzLlNyYywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGZpbGVzID0gZmlsZXMubWFwKChmaWxlKSA9PiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLlNyYywgZmlsZSkpKTtcbiAgcmV0dXJuIGZpbGVzLmZpbHRlcigoZmlsZSkgPT5cbiAgICBmaWxlLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoUmVwb1BhdGhzLkR0c0V4dGVuc2lvbikgJiYgIWZpbGUuZW5kc1dpdGgoJy50ZXN0LnRzJylcbiAgICAmJiAhZmlsZS5pbmNsdWRlcyhgLyR7UmVwb1BhdGhzLlRlc3RIZWxwZXJzfS9gKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVJbmRleERpcmVudChmb2xkZXI6IHN0cmluZywgZGlyZW50OiBEaXJlbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoaXNFeGNsdWRlZEZyb21JbmRleChmb2xkZXIsIGRpcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc291cmNlRmlsZTogc3RyaW5nO1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUluZGV4KGpvaW4oZm9sZGVyLCBkaXJlbnQubmFtZSkpO1xuICAgIGlmIChyZXN1bHQgIT09IEdlbmVyYXRlSW5kZXhSZXN1bHQuU3VjY2Vzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzb3VyY2VGaWxlID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKGRpcmVudC5uYW1lLCBSZXBvUGF0aHMuSW5kZXhUcykpO1xuICAgIG5hbWUgPSBkaXJlbnQubmFtZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGRpcmVudC5uYW1lKTtcbiAgICBuYW1lID0gYmFzZW5hbWUoZGlyZW50Lm5hbWUsIGV4dGVuc2lvbik7XG4gICAgc291cmNlRmlsZSA9IG5vcm1hbGl6ZUlmUmVsYXRpdmUoZGlyZW50Lm5hbWUpO1xuICB9XG5cbiAgcmV0dXJuIGBleHBvcnQgKiBhcyAnJHtuYW1lfScgZnJvbSAnJHtzb3VyY2VGaWxlfSc7YDtcbn1cblxuZnVuY3Rpb24gaXNFbnZpcm9ubWVudExpYihsaWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5WSVJPTk1FTlRfTElCX1BSRUZJWEVTLnNvbWUoKHByZWZpeCkgPT4gbGliLnN0YXJ0c1dpdGgocHJlZml4KSk7XG59XG5cbmZ1bmN0aW9uIGlzRXhjbHVkZWRGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFuYW1lLmVuZHNXaXRoKFJlcG9QYXRocy5Uc0V4dGVuc2lvbikgfHwgbmFtZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBuYW1lID09PSAnc2V0dXAudHMnIHx8IG5hbWUuZW5kc1dpdGgoJy1zZXR1cC50cycpO1xufVxuXG5mdW5jdGlvbiBpc0V4Y2x1ZGVkRnJvbUluZGV4KGZvbGRlcjogc3RyaW5nLCBkaXJlbnQ6IERpcmVudCk6IGJvb2xlYW4ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtSZXBvUGF0aHMuSW5kZXhUcywgUmVwb1BhdGhzLlR5cGVzLCBSZXBvUGF0aHMuU3R5bGVzLCBSZXBvUGF0aHMuVGVzdEhlbHBlcnNdO1xuICBjb25zdCBpc0V4Y2x1ZGVkRW50cnkgPSBleGNsdWRlZE5hbWVzLmluY2x1ZGVzKGRpcmVudC5uYW1lKSB8fCBkaXJlbnQubmFtZS5lbmRzV2l0aChSZXBvUGF0aHMuRHRzRXh0ZW5zaW9uKSB8fCBmb2xkZXIuc3BsaXQoJy8nKS5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICByZXR1cm4gaXNFeGNsdWRlZEVudHJ5IHx8IChkaXJlbnQuaXNGaWxlKCkgJiYgaXNFeGNsdWRlZEZpbGVOYW1lKGRpcmVudC5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBbGlhcyhjaGVja2VyOiBUeXBlQ2hlY2tlciwgc3ltYm9sOiBUc1N5bWJvbCk6IFRzU3ltYm9sIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2UgLS0gYFN5bWJvbEZsYWdzYCBpcyBhIGJpdCBzZXQuXG4gIHJldHVybiAoc3ltYm9sLmZsYWdzICYgU3ltYm9sRmxhZ3MuQWxpYXMpID09PSAwID8gc3ltYm9sIDogY2hlY2tlci5nZXRBbGlhc2VkU3ltYm9sKHN5bWJvbCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldEV4cG9ydChwYXJhbXM6IFNldEV4cG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGV4cG9ydENvbmRpdGlvbnMsIGlzV2lsZGNhcmQsIHNvdXJjZUNvbmRpdGlvbiwgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGltcG9ydFBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBzcmNGb2xkZXIsXG4gICAgcmVwbGFjZXI6IFJlcG9QYXRocy5DdXJyZW50Rm9sZGVyLFxuICAgIHNlYXJjaFZhbHVlOiBSZXBvUGF0aHMuU3JjXG4gIH0pO1xuICBjb25zdCBjb25kaXRpb25QYXRoID0gaXNXaWxkY2FyZCA/IGAke2ltcG9ydFBhdGh9LyR7UmVwb1BhdGhzLkFueX1gIDogaW1wb3J0UGF0aDtcbiAgY29uc3QgZG10c1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuRXNtLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueURtdHMgOiBSZXBvUGF0aHMuSW5kZXhEbXRzIH0pO1xuICBjb25zdCBkY3RzUGF0aCA9IHRvRGlzdFBhdGgoeyBmb3JtYXQ6IFJlcG9QYXRocy5DanMsIGltcG9ydFBhdGgsIG5hbWU6IGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55RGN0cyA6IFJlcG9QYXRocy5JbmRleERjdHMgfSk7XG4gIGNvbnN0IGRtdHNGb2xkZXJQYXRoID0gZGlybmFtZShkbXRzUGF0aCk7XG4gIGNvbnN0IGRjdHNGb2xkZXJQYXRoID0gZGlybmFtZShkY3RzUGF0aCk7XG5cbiAgaWYgKCFpc1dpbGRjYXJkICYmICFleGlzdHNTeW5jKGRjdHNQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGlzVHlwZXNPbmx5ID0gaW1wb3J0UGF0aC5pbmNsdWRlcyhSZXBvUGF0aHMuVHlwZXMpO1xuICBjb25zdCBtanNQYXRoID0gdG9EaXN0UGF0aCh7IGZvcm1hdDogUmVwb1BhdGhzLkVzbSwgaW1wb3J0UGF0aCwgbmFtZTogaXNXaWxkY2FyZCA/IFJlcG9QYXRocy5BbnlNanMgOiBSZXBvUGF0aHMuSW5kZXhNanMgfSk7XG4gIGNvbnN0IGNqc1BhdGggPSB0b0Rpc3RQYXRoKHsgZm9ybWF0OiBSZXBvUGF0aHMuQ2pzLCBpbXBvcnRQYXRoLCBuYW1lOiBpc1dpbGRjYXJkID8gUmVwb1BhdGhzLkFueUNqcyA6IFJlcG9QYXRocy5JbmRleENqcyB9KTtcblxuICBpZiAoaXNUeXBlc09ubHkpIHtcbiAgICBleHBvcnRDb25kaXRpb25zW2NvbmRpdGlvblBhdGhdID0ge1xuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplSWZSZWxhdGl2ZShqb2luKFJlcG9QYXRocy5TcmMsIGltcG9ydFBhdGgsIGlzV2lsZGNhcmQgPyBSZXBvUGF0aHMuQW55VHMgOiBSZXBvUGF0aHMuSW5kZXhUcykpO1xuXG4gICAgZXhwb3J0Q29uZGl0aW9uc1tjb25kaXRpb25QYXRoXSA9IHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgICAgLy8gRmlyc3QsIHNvIGl0IHdpbnMgd2hlcmV2ZXIgaXQgaXMgc2V0OiBpbnNpZGUgdGhlIHJlcG9zaXRvcnksIGJlZm9yZSBhbnl0aGluZyBpcyBidWlsdC5cbiAgICAgIC4uLihzb3VyY2VDb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJiB7IFtzb3VyY2VDb25kaXRpb25dOiBzb3VyY2VQYXRoIH0pLFxuICAgICAgaW1wb3J0OiB7XG4gICAgICAgIHR5cGVzOiBkbXRzUGF0aCxcbiAgICAgICAgZGVmYXVsdDogbWpzUGF0aFxuICAgICAgfSxcbiAgICAgIHJlcXVpcmU6IHtcbiAgICAgICAgdHlwZXM6IGRjdHNQYXRoLFxuICAgICAgICBkZWZhdWx0OiBjanNQYXRoXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHBlcmZlY3Rpb25pc3Qvc29ydC1vYmplY3RzIC0tIE9yZGVyIG1hdHRlcnMgb25jZSBpdCBpcyB3cml0dGVuIHRvIGBwYWNrYWdlLmpzb25gLiAqL1xuICAgIH07XG4gIH1cblxuICBpZiAoaW1wb3J0UGF0aCA9PT0gUmVwb1BhdGhzLkN1cnJlbnRGb2xkZXIgYXMgc3RyaW5nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpc1dpbGRjYXJkKSB7XG4gICAgYXdhaXQgd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oXG4gICAgICBpbXBvcnRQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlczogcmVsYXRpdmUoaW1wb3J0UGF0aCwgZGN0c1BhdGgpIH1cbiAgICAgICAgOiB7IG1haW46IHJlbGF0aXZlKGltcG9ydFBhdGgsIGNqc1BhdGgpLCBtb2R1bGU6IHJlbGF0aXZlKGltcG9ydFBhdGgsIG1qc1BhdGgpLCB0eXBlOiAnbW9kdWxlJywgdHlwZXM6IHJlbGF0aXZlKGltcG9ydFBhdGgsIGRjdHNQYXRoKSB9XG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KGRjdHNGb2xkZXJQYXRoKSkge1xuICAgIGlmICghZmlsZS5lbmRzV2l0aChSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gYmFzZW5hbWUoZmlsZSwgUmVwb1BhdGhzLkRjdHNFeHRlbnNpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uRm9sZGVyUGF0aCA9IGpvaW4oaW1wb3J0UGF0aCwgbmFtZSk7XG4gICAgY29uc3QgdHlwZXMgPSByZWxhdGl2ZShwYWNrYWdlSnNvbkZvbGRlclBhdGgsIGpvaW4oZGN0c0ZvbGRlclBhdGgsIG5hbWUgKyBSZXBvUGF0aHMuRGN0c0V4dGVuc2lvbikpO1xuICAgIGF3YWl0IHdyaXRlU3VicGF0aFBhY2thZ2VKc29uKFxuICAgICAgcGFja2FnZUpzb25Gb2xkZXJQYXRoLFxuICAgICAgaXNUeXBlc09ubHlcbiAgICAgICAgPyB7IHR5cGU6ICdtb2R1bGUnLCB0eXBlcyB9XG4gICAgICAgIDoge1xuICAgICAgICAgIG1haW46IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkY3RzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5DanNFeHRlbnNpb24pKSxcbiAgICAgICAgICBtb2R1bGU6IHJlbGF0aXZlKHBhY2thZ2VKc29uRm9sZGVyUGF0aCwgam9pbihkbXRzRm9sZGVyUGF0aCwgbmFtZSArIFJlcG9QYXRocy5NanNFeHRlbnNpb24pKSxcbiAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICB0eXBlc1xuICAgICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0N0c0NvbnRlbnQoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjb250ZW50LFxuICAgIHJlcGxhY2VyOiAnZnJvbSBcXCckPEltcG9ydFBhdGg+LmNqc1xcJzsnLFxuICAgIHNlYXJjaFZhbHVlOiBTVEFUSUNfSU1QT1JUX1JFR19FWFBcbiAgfSk7XG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0KCQ8UXVvdGU+JDxJbXBvcnRQYXRoPi5janMkPFF1b3RlPiknLFxuICAgIHNlYXJjaFZhbHVlOiBEWU5BTUlDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuXG4gIC8vIEEgYC5kLmN0c2AgZmlsZSBpcyBhIENvbW1vbkpTIG1vZHVsZS4gVHlwZS1vbmx5IGltcG9ydHMgb2YgYSBiYXJlIHNwZWNpZmllciByZXNvbHZpbmcgdG8gYW5cbiAgLy8gRVNNLW9ubHkgcGFja2FnZSBuZWVkIGEgYHJlc29sdXRpb24tbW9kZWAgYXR0cmlidXRlLCBlbHNlIGB0c2NgIHJlcG9ydHMgVFMxNTQxIC8gVFMxNTQyLlxuICAvLyBQYXNzaW5nIGAnaW1wb3J0J2AgaXMgdmFsaWQgZm9yIENvbW1vbkpTIHRhcmdldHMgdG9vLCBzbyBldmVyeSBiYXJlIHNwZWNpZmllciByZWNlaXZlcyBpdC5cbiAgLy8gVGhlIEVTTSBgLmQubXRzYCBuZWVkcyBubyBzdWNoIGF0dHJpYnV0ZSwgc28gdGhpcyB0cmFuc2Zvcm0gcnVucyBvbiBDb21tb25KUyBjb250ZW50IG9ubHkuXG4gIGN0c0NvbnRlbnQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBjdHNDb250ZW50LFxuICAgIHJlcGxhY2VyOiAnaW1wb3J0IHR5cGUgJDxDbGF1c2U+IGZyb20gXFwnJDxTcGVjaWZpZXI+XFwnIHdpdGggeyBcXCdyZXNvbHV0aW9uLW1vZGVcXCc6IFxcJ2ltcG9ydFxcJyB9OycsXG4gICAgc2VhcmNoVmFsdWU6IEJBUkVfVFlQRV9JTVBPUlRfUkVHX0VYUFxuICB9KTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IGN0c0NvbnRlbnQsXG4gICAgcmVwbGFjZXI6ICdpbXBvcnQoXCIkPFNwZWNpZmllcj5cIiwgeyB3aXRoOiB7IFxcJ3Jlc29sdXRpb24tbW9kZVxcJzogXFwnaW1wb3J0XFwnIH0gfSknLFxuICAgIHNlYXJjaFZhbHVlOiBCQVJFX0lOTElORV9JTVBPUlRfVFlQRV9SRUdfRVhQXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0Rpc3RQYXRoKHBhcmFtczogVG9EaXN0UGF0aFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBub3JtYWxpemVJZlJlbGF0aXZlKGpvaW4oUmVwb1BhdGhzLkRpc3RMaWIsIHBhcmFtcy5mb3JtYXQsIHBhcmFtcy5pbXBvcnRQYXRoLCBwYXJhbXMubmFtZSkpO1xufVxuXG5mdW5jdGlvbiB0b0xpYk5hbWUobGliRmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEEgbGliIGEgcGFja2FnZSByZXBsYWNlZCAoYEB0eXBlc2NyaXB0L2xpYi1kb21gLCBgQHR5cGVzY3JpcHQvbGliLWRvbS9pdGVyYWJsZS5kLnRzYCkgaXMgbmFtZWQgYnkgaXRzIHBhdGgsIG5vdCBieVxuICAvLyBpdHMgZmlsZSBuYW1lLCB3aGljaCBpcyBgaW5kZXguZC50c2AgZm9yIHRoZSBsaWIncyByb290LlxuICBjb25zdCByZXBsYWNlbWVudE1hdGNoID0gTElCX1JFUExBQ0VNRU5UX1JFR19FWFAuZXhlYyhsaWJGaWxlUGF0aCk7XG4gIGlmIChyZXBsYWNlbWVudE1hdGNoPy5ncm91cHMgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gYWx3YXlzIGNhcHR1cmVzIGJvdGggZ3JvdXBzLlxuICAgIGNvbnN0IGxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snTGliJ10pO1xuICAgIGNvbnN0IHN1YkxpYiA9IFN0cmluZyhyZXBsYWNlbWVudE1hdGNoLmdyb3Vwc1snU3ViTGliJ10pO1xuICAgIHJldHVybiAoc3ViTGliID09PSAnaW5kZXgnID8gbGliIDogYCR7bGlifS4ke3N1YkxpYi5yZXBsYWNlQWxsKCcvJywgJy4nKX1gKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIHJldHVybiBiYXNlbmFtZShsaWJGaWxlUGF0aCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9ebGliXFwuLywgJycpLnJlcGxhY2UoL1xcLmRcXC50cyQvLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHRvTXRzQ29udGVudChjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtdHNDb250ZW50ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogY29udGVudCxcbiAgICByZXBsYWNlcjogJ2Zyb20gXFwnJDxJbXBvcnRQYXRoPi5tanNcXCc7JyxcbiAgICBzZWFyY2hWYWx1ZTogU1RBVElDX0lNUE9SVF9SRUdfRVhQXG4gIH0pO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbXRzQ29udGVudCxcbiAgICByZXBsYWNlcjogJ2ltcG9ydCgkPFF1b3RlPiQ8SW1wb3J0UGF0aD4ubWpzJDxRdW90ZT4pJyxcbiAgICBzZWFyY2hWYWx1ZTogRFlOQU1JQ19JTVBPUlRfUkVHX0VYUFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVTdWJwYXRoUGFja2FnZUpzb24oZm9sZGVyOiBzdHJpbmcsIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBta2Rpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUpzb24oam9pbihmb2xkZXIsIFJlcG9QYXRocy5QYWNrYWdlSnNvbiksIHBhY2thZ2VKc29uKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkEsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyxtQkFBbUI7QUFDNUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRSxZQUFZO0FBQUEsRUFDWixXQUFXO0FBQUEsT0FDTjtBQUNQLE9BQU8sYUFBYTtBQUNwQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMscUJBQXFCO0FBQzlCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsb0JBQW9CO0FBS3RCLE1BQU0saUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTdkIsTUFBTSxzQkFBeUM7QUFBQSxFQUNwRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU9PLE1BQU0sbUJBQW1C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
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/// <reference path="./library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Fails the build when the published output imports a package that `package.json` does not install for a consumer.
|
|
6
|
+
*
|
|
7
|
+
* Every bare specifier in the scanned folders (`dist/lib` and `bin` by default, code and declarations, ESM and
|
|
8
|
+
* CommonJS) must name a package in `dependencies`, `optionalDependencies` or `peerDependencies`, the package itself,
|
|
9
|
+
* or a builtin (any `node:` specifier, Node's own, and Electron's `electron` and `original-fs`); a declaration
|
|
10
|
+
* file's import may also be served by the package's `@types` one. A package in
|
|
11
|
+
* `devDependencies` only is present in the package's own repository and absent from a
|
|
12
|
+
* consumer's install, so nothing there fails, and the consumer gets `Cannot find module`.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The folders {@link validateDependencies} scans when none are given.
|
|
16
|
+
*/
|
|
17
|
+
export declare const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* Options for {@link validateDependencies}.
|
|
20
|
+
*/
|
|
21
|
+
export interface ValidateDependenciesOptions {
|
|
22
|
+
/**
|
|
23
|
+
* The folders to scan, relative to the current working folder. A folder that does not exist is skipped.
|
|
24
|
+
*
|
|
25
|
+
* @default {@link DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS}
|
|
26
|
+
*/
|
|
27
|
+
readonly folders?: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Checks that every bare import in the published output names a package a consumer installs.
|
|
31
|
+
*
|
|
32
|
+
* @param options - The options controlling which folders are scanned.
|
|
33
|
+
* @returns A {@link Promise} that resolves when every import is declared.
|
|
34
|
+
* @throws If any import names a package that is not in `dependencies`, `optionalDependencies` or `peerDependencies`,
|
|
35
|
+
* the package itself, or a Node builtin. The error lists each offending file and specifier.
|
|
36
|
+
*/
|
|
37
|
+
export declare function validateDependencies(options?: ValidateDependenciesOptions): Promise<void>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return '/';
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: 'android'
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const existingProcess = globalThis.process;
|
|
17
|
+
|
|
18
|
+
if (!existingProcess) {
|
|
19
|
+
globalThis.process = browserProcess;
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (existingProcess.versions?.node) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const existingProcessRecord = existingProcess;
|
|
28
|
+
|
|
29
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
30
|
+
existingProcessRecord[key] ??= value;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
existingProcessRecord['browser'] = true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ensureBrowserProcess();
|
|
37
|
+
})();
|
|
38
|
+
|
|
39
|
+
import { existsSync } from "node:fs";
|
|
40
|
+
import {
|
|
41
|
+
readdir,
|
|
42
|
+
readFile
|
|
43
|
+
} from "node:fs/promises";
|
|
44
|
+
import { isBuiltin } from "node:module";
|
|
45
|
+
import {
|
|
46
|
+
join,
|
|
47
|
+
relative
|
|
48
|
+
} from "node:path";
|
|
49
|
+
import process from "node:process";
|
|
50
|
+
import { preProcessFile } from "typescript";
|
|
51
|
+
import { readPackageJson } from "./npm.mjs";
|
|
52
|
+
import { RepoPaths } from "./repo-paths.mjs";
|
|
53
|
+
const DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS = [RepoPaths.DistLib, "bin"];
|
|
54
|
+
const ELECTRON_BUILTIN_PACKAGE_NAMES = /* @__PURE__ */ new Set(["electron", "original-fs"]);
|
|
55
|
+
const NODE_SCHEME = "node:";
|
|
56
|
+
const DECLARATION_FILE_PATTERN = /\.d\.(?:cts|mts|ts)$/u;
|
|
57
|
+
const SCANNED_FILE_PATTERN = /\.(?:cjs|cts|js|mjs|mts|ts)$/u;
|
|
58
|
+
const TYPES_SCOPE = "@types/";
|
|
59
|
+
const SCOPED_PACKAGE_NAME_SEGMENT_COUNT = 2;
|
|
60
|
+
async function validateDependencies(options = {}) {
|
|
61
|
+
const root = process.cwd();
|
|
62
|
+
const packageJson = await readPackageJson(root);
|
|
63
|
+
const installedPackageNames = /* @__PURE__ */ new Set([
|
|
64
|
+
...Object.keys(packageJson.dependencies ?? {}),
|
|
65
|
+
...Object.keys(packageJson.optionalDependencies ?? {}),
|
|
66
|
+
...Object.keys(packageJson.peerDependencies ?? {})
|
|
67
|
+
]);
|
|
68
|
+
if (packageJson.name) {
|
|
69
|
+
installedPackageNames.add(packageJson.name);
|
|
70
|
+
}
|
|
71
|
+
const undeclaredImports = [];
|
|
72
|
+
for (const folder of options.folders ?? DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS) {
|
|
73
|
+
for (const filePath of await getFilePaths(join(root, folder))) {
|
|
74
|
+
const isDeclarationFile = DECLARATION_FILE_PATTERN.test(filePath);
|
|
75
|
+
for (const specifier of getImportSpecifiers(await readFile(filePath, "utf-8"))) {
|
|
76
|
+
const packageName = getPackageName(specifier);
|
|
77
|
+
if (packageName === null || installedPackageNames.has(packageName)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (isDeclarationFile && installedPackageNames.has(getTypesPackageName(packageName))) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
undeclaredImports.push(`${relative(root, filePath).replaceAll("\\", "/")}: ${specifier}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (undeclaredImports.length > 0) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
`The published output imports packages that are not in dependencies, optionalDependencies or peerDependencies:
|
|
90
|
+
${undeclaredImports.join("\n")}`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async function getFilePaths(folder) {
|
|
95
|
+
if (!existsSync(folder)) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
const entries = await readdir(folder, { recursive: true, withFileTypes: true });
|
|
99
|
+
return entries.filter((entry) => entry.isFile() && SCANNED_FILE_PATTERN.test(entry.name)).map((entry) => join(entry.parentPath, entry.name)).sort();
|
|
100
|
+
}
|
|
101
|
+
function getImportSpecifiers(sourceText) {
|
|
102
|
+
const { importedFiles } = preProcessFile(sourceText, true, true);
|
|
103
|
+
return importedFiles.map((importedFile) => importedFile.fileName);
|
|
104
|
+
}
|
|
105
|
+
function getPackageName(specifier) {
|
|
106
|
+
if (specifier.startsWith(".") || specifier.startsWith("/") || specifier.startsWith(NODE_SCHEME) || isBuiltin(specifier)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
const segments = specifier.split("/");
|
|
110
|
+
const segmentCount = specifier.startsWith("@") ? SCOPED_PACKAGE_NAME_SEGMENT_COUNT : 1;
|
|
111
|
+
const packageName = segments.slice(0, segmentCount).join("/");
|
|
112
|
+
return ELECTRON_BUILTIN_PACKAGE_NAMES.has(packageName) ? null : packageName;
|
|
113
|
+
}
|
|
114
|
+
function getTypesPackageName(packageName) {
|
|
115
|
+
return TYPES_SCOPE + packageName.replace(/^@/u, "").replace("/", "__");
|
|
116
|
+
}
|
|
117
|
+
export {
|
|
118
|
+
DEFAULT_VALIDATE_DEPENDENCIES_FOLDERS,
|
|
119
|
+
validateDependencies
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0ZS1kZXBlbmRlbmNpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZhaWxzIHRoZSBidWlsZCB3aGVuIHRoZSBwdWJsaXNoZWQgb3V0cHV0IGltcG9ydHMgYSBwYWNrYWdlIHRoYXQgYHBhY2thZ2UuanNvbmAgZG9lcyBub3QgaW5zdGFsbCBmb3IgYSBjb25zdW1lci5cbiAqXG4gKiBFdmVyeSBiYXJlIHNwZWNpZmllciBpbiB0aGUgc2Nhbm5lZCBmb2xkZXJzIChgZGlzdC9saWJgIGFuZCBgYmluYCBieSBkZWZhdWx0LCBjb2RlIGFuZCBkZWNsYXJhdGlvbnMsIEVTTSBhbmRcbiAqIENvbW1vbkpTKSBtdXN0IG5hbWUgYSBwYWNrYWdlIGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCwgdGhlIHBhY2thZ2UgaXRzZWxmLFxuICogb3IgYSBidWlsdGluIChhbnkgYG5vZGU6YCBzcGVjaWZpZXIsIE5vZGUncyBvd24sIGFuZCBFbGVjdHJvbidzIGBlbGVjdHJvbmAgYW5kIGBvcmlnaW5hbC1mc2ApOyBhIGRlY2xhcmF0aW9uXG4gKiBmaWxlJ3MgaW1wb3J0IG1heSBhbHNvIGJlIHNlcnZlZCBieSB0aGUgcGFja2FnZSdzIGBAdHlwZXNgIG9uZS4gQSBwYWNrYWdlIGluXG4gKiBgZGV2RGVwZW5kZW5jaWVzYCBvbmx5IGlzIHByZXNlbnQgaW4gdGhlIHBhY2thZ2UncyBvd24gcmVwb3NpdG9yeSBhbmQgYWJzZW50IGZyb20gYVxuICogY29uc3VtZXIncyBpbnN0YWxsLCBzbyBub3RoaW5nIHRoZXJlIGZhaWxzLCBhbmQgdGhlIGNvbnN1bWVyIGdldHMgYENhbm5vdCBmaW5kIG1vZHVsZWAuXG4gKi9cblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBpc0J1aWx0aW4gfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHByZVByb2Nlc3NGaWxlIH0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IHJlYWRQYWNrYWdlSnNvbiB9IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IFJlcG9QYXRocyB9IGZyb20gJy4vcmVwby1wYXRocy50cyc7XG5cbi8qKlxuICogVGhlIGZvbGRlcnMge0BsaW5rIHZhbGlkYXRlRGVwZW5kZW5jaWVzfSBzY2FucyB3aGVuIG5vbmUgYXJlIGdpdmVuLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9WQUxJREFURV9ERVBFTkRFTkNJRVNfRk9MREVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUmVwb1BhdGhzLkRpc3RMaWIsICdiaW4nXTtcblxuLyoqXG4gKiBUaGUgbW9kdWxlcyBFbGVjdHJvbiBwcm92aWRlcyB0byBpdHMgb3duIHByb2Nlc3Nlcywgd2hpY2ggbm8gcGFja2FnZSBpbnN0YWxsczogTm9kZSdzIGBpc0J1aWx0aW5gIGRvZXMgbm90IGtub3cgdGhlbS5cbiAqIGBlbGVjdHJvbmAgYWxzbyBjb3ZlcnMgaXRzIGBlbGVjdHJvbi9tYWluYCwgYGVsZWN0cm9uL3JlbmRlcmVyYCBhbmQgYGVsZWN0cm9uL2NvbW1vbmAgc3VicGF0aHMuXG4gKi9cbmNvbnN0IEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWydlbGVjdHJvbicsICdvcmlnaW5hbC1mcyddKTtcbmNvbnN0IE5PREVfU0NIRU1FID0gJ25vZGU6JztcbmNvbnN0IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTiA9IC9cXC5kXFwuKD86Y3RzfG10c3x0cykkL3U7XG5jb25zdCBTQ0FOTkVEX0ZJTEVfUEFUVEVSTiA9IC9cXC4oPzpjanN8Y3RzfGpzfG1qc3xtdHN8dHMpJC91O1xuY29uc3QgVFlQRVNfU0NPUEUgPSAnQHR5cGVzLyc7XG5jb25zdCBTQ09QRURfUEFDS0FHRV9OQU1FX1NFR01FTlRfQ09VTlQgPSAyO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB2YWxpZGF0ZURlcGVuZGVuY2llc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVEZXBlbmRlbmNpZXNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIHRvIHNjYW4sIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZm9sZGVyLiBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IGlzIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX1ZBTElEQVRFX0RFUEVOREVOQ0lFU19GT0xERVJTfVxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IGJhcmUgaW1wb3J0IGluIHRoZSBwdWJsaXNoZWQgb3V0cHV0IG5hbWVzIGEgcGFja2FnZSBhIGNvbnN1bWVyIGluc3RhbGxzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hpY2ggZm9sZGVycyBhcmUgc2Nhbm5lZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBldmVyeSBpbXBvcnQgaXMgZGVjbGFyZWQuXG4gKiBAdGhyb3dzIElmIGFueSBpbXBvcnQgbmFtZXMgYSBwYWNrYWdlIHRoYXQgaXMgbm90IGluIGBkZXBlbmRlbmNpZXNgLCBgb3B0aW9uYWxEZXBlbmRlbmNpZXNgIG9yIGBwZWVyRGVwZW5kZW5jaWVzYCxcbiAqIHRoZSBwYWNrYWdlIGl0c2VsZiwgb3IgYSBOb2RlIGJ1aWx0aW4uIFRoZSBlcnJvciBsaXN0cyBlYWNoIG9mZmVuZGluZyBmaWxlIGFuZCBzcGVjaWZpZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcyhvcHRpb25zOiBWYWxpZGF0ZURlcGVuZGVuY2llc09wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocm9vdCk7XG4gIGNvbnN0IGluc3RhbGxlZFBhY2thZ2VOYW1lcyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcyA/PyB7fSksXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgIC4uLk9iamVjdC5rZXlzKHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pXG4gIF0pO1xuICBpZiAocGFja2FnZUpzb24ubmFtZSkge1xuICAgIGluc3RhbGxlZFBhY2thZ2VOYW1lcy5hZGQocGFja2FnZUpzb24ubmFtZSk7XG4gIH1cblxuICBjb25zdCB1bmRlY2xhcmVkSW1wb3J0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmb2xkZXIgb2Ygb3B0aW9ucy5mb2xkZXJzID8/IERFRkFVTFRfVkFMSURBVEVfREVQRU5ERU5DSUVTX0ZPTERFUlMpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGF3YWl0IGdldEZpbGVQYXRocyhqb2luKHJvb3QsIGZvbGRlcikpKSB7XG4gICAgICBjb25zdCBpc0RlY2xhcmF0aW9uRmlsZSA9IERFQ0xBUkFUSU9OX0ZJTEVfUEFUVEVSTi50ZXN0KGZpbGVQYXRoKTtcbiAgICAgIGZvciAoY29uc3Qgc3BlY2lmaWVyIG9mIGdldEltcG9ydFNwZWNpZmllcnMoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpKSkge1xuICAgICAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKHNwZWNpZmllcik7XG4gICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PT0gbnVsbCB8fCBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlY2xhcmF0aW9uRmlsZSAmJiBpbnN0YWxsZWRQYWNrYWdlTmFtZXMuaGFzKGdldFR5cGVzUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVuZGVjbGFyZWRJbXBvcnRzLnB1c2goYCR7cmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpfTogJHtzcGVjaWZpZXJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHVuZGVjbGFyZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHB1Ymxpc2hlZCBvdXRwdXQgaW1wb3J0cyBwYWNrYWdlcyB0aGF0IGFyZSBub3QgaW4gZGVwZW5kZW5jaWVzLCBvcHRpb25hbERlcGVuZGVuY2llcyBvciBwZWVyRGVwZW5kZW5jaWVzOlxcbiR7dW5kZWNsYXJlZEltcG9ydHMuam9pbignXFxuJyl9YFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgc2Nhbm5lZCBmaWxlcyB1bmRlciBhIGZvbGRlciwgcmVjdXJzaXZlbHkuXG4gKlxuICogQHBhcmFtIGZvbGRlciAtIFRoZSBhYnNvbHV0ZSBmb2xkZXIgcGF0aC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRocyBvZiB0aGUgc2Nhbm5lZCBmaWxlcywgb3Igbm9uZSB3aGVuIHRoZSBmb2xkZXIgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVQYXRocyhmb2xkZXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZvbGRlcikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihmb2xkZXIsIHsgcmVjdXJzaXZlOiB0cnVlLCB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBTQ0FOTkVEX0ZJTEVfUEFUVEVSTi50ZXN0KGVudHJ5Lm5hbWUpKVxuICAgIC5tYXAoKGVudHJ5KSA9PiBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKVxuICAgIC5zb3J0KCk7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIG1vZHVsZSBzcGVjaWZpZXJzIGEgc291cmNlIGZpbGUgaW1wb3J0cywgcmVxdWlyZXMgb3IgcmVmZXJlbmNlcywgaWdub3Jpbmcgc3RyaW5ncyBhbmQgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHNvdXJjZVRleHQgLSBUaGUgc291cmNlIHRleHQuXG4gKiBAcmV0dXJucyBUaGUgbW9kdWxlIHNwZWNpZmllcnMuXG4gKi9cbmZ1bmN0aW9uIGdldEltcG9ydFNwZWNpZmllcnMoc291cmNlVGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGltcG9ydGVkRmlsZXMgfSA9IHByZVByb2Nlc3NGaWxlKHNvdXJjZVRleHQsIHRydWUsIHRydWUpO1xuICByZXR1cm4gaW1wb3J0ZWRGaWxlcy5tYXAoKGltcG9ydGVkRmlsZSkgPT4gaW1wb3J0ZWRGaWxlLmZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYWNrYWdlIGEgYmFyZSBzcGVjaWZpZXIgbmFtZXMuXG4gKlxuICogQHBhcmFtIHNwZWNpZmllciAtIFRoZSBtb2R1bGUgc3BlY2lmaWVyLlxuICogQHJldHVybnMgVGhlIHBhY2thZ2UgbmFtZSwgb3IgYG51bGxgIGZvciBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGEgYnVpbHRpbiBvZiBOb2RlIG9yIEVsZWN0cm9uLCBvciBhbnlcbiAqIGBub2RlOmAtc2NoZW1lIHNwZWNpZmllcjogbm8gcGFja2FnZSBuYW1lIGNhbiBzdGFydCB3aXRoIGBub2RlOmAsIGFuZCBFbGVjdHJvbidzIGBub2RlOm9yaWdpbmFsLWZzYCBpcyBvbmUgTm9kZSdzIG93blxuICogbGlzdCBsYWNrcy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWUoc3BlY2lmaWVyOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKFxuICAgIHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aChOT0RFX1NDSEVNRSkgfHwgaXNCdWlsdGluKHNwZWNpZmllcilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzZWdtZW50cyA9IHNwZWNpZmllci5zcGxpdCgnLycpO1xuICBjb25zdCBzZWdtZW50Q291bnQgPSBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpID8gU0NPUEVEX1BBQ0tBR0VfTkFNRV9TRUdNRU5UX0NPVU5UIDogMTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBzZWdtZW50cy5zbGljZSgwLCBzZWdtZW50Q291bnQpLmpvaW4oJy8nKTtcbiAgcmV0dXJuIEVMRUNUUk9OX0JVSUxUSU5fUEFDS0FHRV9OQU1FUy5oYXMocGFja2FnZU5hbWUpID8gbnVsbCA6IHBhY2thZ2VOYW1lO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIERlZmluaXRlbHlUeXBlZCBwYWNrYWdlIHRoYXQgZGVjbGFyZXMgYSBwYWNrYWdlJ3MgdHlwZXMsIHdoaWNoIGlzIHdoYXQgYSBkZWNsYXJhdGlvbiBmaWxlJ3MgaW1wb3J0IG9mXG4gKiB0aGF0IHBhY2thZ2UgcmVzb2x2ZXMgdG8gd2hlbiB0aGUgcGFja2FnZSBzaGlwcyBubyB0eXBlcyBvZiBpdHMgb3duIChgZXN0cmVlYCDihpIgYEB0eXBlcy9lc3RyZWVgLFxuICogYEBzY29wZS9uYW1lYCDihpIgYEB0eXBlcy9zY29wZV9fbmFtZWApLlxuICpcbiAqIEBwYXJhbSBwYWNrYWdlTmFtZSAtIFRoZSBwYWNrYWdlIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgYEB0eXBlc2AgcGFja2FnZSBuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlc1BhY2thZ2VOYW1lKHBhY2thZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVFlQRVNfU0NPUEUgKyBwYWNrYWdlTmFtZS5yZXBsYWNlKC9eQC91LCAnJykucmVwbGFjZSgnLycsICdfXycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFBLFNBQVMsa0JBQWtCO0FBQzNCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxPQUFPLGFBQWE7QUFDcEIsU0FBUyxzQkFBc0I7QUFFL0IsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFLbkIsTUFBTSx3Q0FBMkQsQ0FBQyxVQUFVLFNBQVMsS0FBSztBQU1qRyxNQUFNLGlDQUFzRCxvQkFBSSxJQUFJLENBQUMsWUFBWSxhQUFhLENBQUM7QUFDL0YsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sY0FBYztBQUNwQixNQUFNLG9DQUFvQztBQXNCMUMsZUFBc0IscUJBQXFCLFVBQXVDLENBQUMsR0FBa0I7QUFDbkcsUUFBTSxPQUFPLFFBQVEsSUFBSTtBQUN6QixRQUFNLGNBQWMsTUFBTSxnQkFBZ0IsSUFBSTtBQUM5QyxRQUFNLHdCQUF3QixvQkFBSSxJQUFJO0FBQUEsSUFDcEMsR0FBRyxPQUFPLEtBQUssWUFBWSxnQkFBZ0IsQ0FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mnaoumov/typescript-dev-toolkit",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Generic TypeScript project tooling: build, lint, format, spellcheck, test, gate and release scripts.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -259,6 +259,7 @@
|
|
|
259
259
|
"build:lib": "jiti scripts/build-lib.ts",
|
|
260
260
|
"build:types": "jiti scripts/build-types.ts",
|
|
261
261
|
"build:validate-declarations": "jiti scripts/build-validate-declarations.ts",
|
|
262
|
+
"build:validate-dependencies": "jiti scripts/build-validate-dependencies.ts",
|
|
262
263
|
"commit": "jiti scripts/commit.ts",
|
|
263
264
|
"docs:build": "jiti scripts/docs-build.ts",
|
|
264
265
|
"docs:dev": "jiti scripts/docs-dev.ts",
|
|
@@ -290,6 +291,7 @@
|
|
|
290
291
|
"@mnaoumov/typescript-lib": "^1.0.0",
|
|
291
292
|
"@stylistic/eslint-plugin": "^5.10.0",
|
|
292
293
|
"@tsconfig/strictest": "^2.0.8",
|
|
294
|
+
"@types/estree": "^1.0.9",
|
|
293
295
|
"@types/node": "^26.6.2",
|
|
294
296
|
"@types/semver": "^7.8.0",
|
|
295
297
|
"@typescript-eslint/rule-tester": "^8.71.2",
|