sonamu 0.11.6 → 0.11.7
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/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +23 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +14 -7
- package/dist/migration/postgresql-schema-reader.d.ts +1 -0
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +21 -7
- package/package.json +1 -1
- package/src/migration/code-generation.ts +37 -8
- package/src/migration/migration-set.ts +12 -2
- package/src/migration/postgresql-schema-reader.ts +21 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration-set.d.ts","sourceRoot":"","sources":["../../src/migration/migration-set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"migration-set.d.ts","sourceRoot":"","sources":["../../src/migration/migration-set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAgB/C,OAAO,EAOL,KAAK,wBAAwB,EAC9B,MAAM,gBAAgB,CAAC;AAOxB;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CA+MlF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { exhaustive, init_utils } from "../utils/utils.js";
|
|
3
|
-
import { init_types, isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isNumberProp, isNumericProp, isOneToOneRelationProp, isRelationProp, isStringProp, isVectorProp, isVirtualProp } from "../types/types.js";
|
|
3
|
+
import { init_types, isBelongsToOneRelationProp, isHasManyRelationProp, isManyToManyRelationProp, isNumberProp, isNumberSingleProp, isNumericProp, isNumericSingleProp, isOneToOneRelationProp, isRelationProp, isStringProp, isVectorProp, isVirtualProp } from "../types/types.js";
|
|
4
4
|
import { EntityManager, init_entity_manager } from "../entity/entity-manager.js";
|
|
5
5
|
import inflection from "inflection";
|
|
6
6
|
//#region src/migration/migration-set.ts
|
|
@@ -25,11 +25,18 @@ function getMigrationSetFromEntity(entity) {
|
|
|
25
25
|
...isStringProp(prop) && prop.length !== void 0 && { length: prop.length },
|
|
26
26
|
...(isNumberProp(prop) || isNumericProp(prop)) && (() => {
|
|
27
27
|
const numberType = isNumberProp(prop) ? prop.numberType ?? "numeric" : "numeric";
|
|
28
|
-
if (numberType === "numeric")
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
if (numberType === "numeric") {
|
|
29
|
+
if (isNumberSingleProp(prop) || isNumericSingleProp(prop)) return {
|
|
30
|
+
numberType,
|
|
31
|
+
precision: prop.precision ?? NUMERIC_DEFAULT_PRECISION,
|
|
32
|
+
scale: prop.scale ?? NUMERIC_DEFAULT_SCALE
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
numberType,
|
|
36
|
+
...prop.precision !== void 0 && { precision: prop.precision },
|
|
37
|
+
...prop.scale !== void 0 && { scale: prop.scale }
|
|
38
|
+
};
|
|
39
|
+
}
|
|
33
40
|
return {
|
|
34
41
|
numberType,
|
|
35
42
|
precision: prop.precision,
|
|
@@ -177,4 +184,4 @@ var init_migration_set = __esmMin((() => {
|
|
|
177
184
|
init_migration_set();
|
|
178
185
|
export { getMigrationSetFromEntity, init_migration_set };
|
|
179
186
|
|
|
180
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNldC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL21pZ3JhdGlvbi1zZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNOdW1iZXJQcm9wLFxuICBpc051bWVyaWNQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdQcm9wLFxuICBpc1ZlY3RvclByb3AsXG4gIGlzVmlydHVhbFByb3AsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIE1pZ3JhdGlvbkNvbHVtbixcbiAgdHlwZSBNaWdyYXRpb25Db2x1bW5UeXBlLFxuICB0eXBlIE1pZ3JhdGlvbkZvcmVpZ24sXG4gIHR5cGUgTWlncmF0aW9uSW5kZXgsXG4gIHR5cGUgTWlncmF0aW9uSm9pblRhYmxlLFxuICB0eXBlIE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBleGhhdXN0aXZlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbi8vIG51bWVyaWMg7Lus65+87JeQ7IScIHByZWNpc2lvbi9zY2FsZeydhCDsg53rnrXtlojsnYQg65WMIOyLpOygnOuhnCDsg53shLHrkJjripQg6rCSKGtuZXggZGVjaW1hbOydmCDquLDrs7jqsJIp7J2064ukLlxuY29uc3QgTlVNRVJJQ19ERUZBVUxUX1BSRUNJU0lPTiA9IDg7XG5jb25zdCBOVU1FUklDX0RFRkFVTFRfU0NBTEUgPSAyO1xuXG4vKipcbiAqIEVudGl0eeulvCDsnb3slrTshJwgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxl7J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHkgRW50aXR5IOqwneyytFxuICogQHJldHVybnMgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlIOqwneyytFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWlncmF0aW9uU2V0RnJvbUVudGl0eShlbnRpdHk6IEVudGl0eSk6IE1pZ3JhdGlvblNldEFuZEpvaW5UYWJsZSB7XG4gIGNvbnN0IG1pZ3JhdGlvblNldDogTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlID0gZW50aXR5LnByb3BzLnJlZHVjZShcbiAgICAociwgcHJvcCkgPT4ge1xuICAgICAgLy8gdmlydHVhbCDtlYTrk5wg7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cbiAgICAgIC8vIEhhc01hbnkg7LyA7J207Iqk64qUIOyVhOustCDsspjrpqzrj4Qg7ZWY7KeAIOyViuydjFxuICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB7XG4gICAgICAgICAgbmFtZTogcHJvcC5uYW1lLFxuICAgICAgICAgIHR5cGU6IHJlc29sdmVFbnRpdHlQcm9wVHlwZVRvTWlncmF0aW9uQ29sdW1uVHlwZShwcm9wKSxcbiAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3AuZGJEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0VG86IHByb3AuZGJEZWZhdWx0LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH0pKCksXG4gICAgICAgICAgLy8gU3RyaW5nIO2DgOyeheyXkCBsZW5ndGgg7J6I64qUIOqyveyasCDstpTqsIBcbiAgICAgICAgICAuLi4oaXNTdHJpbmdQcm9wKHByb3ApICYmXG4gICAgICAgICAgICBwcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgbGVuZ3RoOiBwcm9wLmxlbmd0aCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIE51bWJlci9OdW1lcmljIO2DgOyeheydmCDqsr3smrAgcHJlY2lzaW9uLCBzY2FsZSDstpTqsIBcbiAgICAgICAgICAuLi4oKGlzTnVtYmVyUHJvcChwcm9wKSB8fCBpc051bWVyaWNQcm9wKHByb3ApKSAmJlxuICAgICAgICAgICAgKCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbnVtYmVyVHlwZSA9IGlzTnVtYmVyUHJvcChwcm9wKSA/IChwcm9wLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpIDogXCJudW1lcmljXCI7XG5cbiAgICAgICAgICAgICAgLy8gbnVtZXJpY+yXkOyEnCBwcmVjaXNpb24vc2NhbGXsnYQg7IOd65617ZWY66m0IGtuZXggZGVjaW1hbOydmCDquLDrs7jqsJIoOCwgMinsnLzroZwg7Lus65+87J20XG4gICAgICAgICAgICAgIC8vIOunjOuTpOyWtOyngOuKlOuNsCwgRELsl5DshJzripQg6re4IOqwkuydtCDqt7jrjIDroZwg7J297Z6I66+A66GcIOyXlO2LsO2LsCDsqr3snYQgdW5kZWZpbmVk66GcIOuRkOuptFxuICAgICAgICAgICAgICAvLyDrp6Trsogg67aI7J287LmY66GcIOyeoe2ejOuLpC4g67mE6rWQIOyghOyXkCDqsJnsnYAg6riw67O46rCS7J2EIOyxhOybjCDsi6TsoJwg7Iqk7YKk66eI7JmAIOunnuy2mOuLpC5cbiAgICAgICAgICAgICAgaWYgKG51bWJlclR5cGUgPT09IFwibnVtZXJpY1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIG51bWJlclR5cGUsXG4gICAgICAgICAgICAgICAgICBwcmVjaXNpb246IHByb3AucHJlY2lzaW9uID8/IE5VTUVSSUNfREVGQVVMVF9QUkVDSVNJT04sXG4gICAgICAgICAgICAgICAgICBzY2FsZTogcHJvcC5zY2FsZSA/PyBOVU1FUklDX0RFRkFVTFRfU0NBTEUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHJlYWwvZG91YmxlIHByZWNpc2lvbuydgCBwcmVjaXNpb24vc2NhbGXsnYQg7JOw7KeAIOyViuuKlOuLpChEQiDrpqzrjZTrj4Qg67CY7ZmY7ZWY7KeAIOyViuydjCkuXG4gICAgICAgICAgICAgIHJldHVybiB7IG51bWJlclR5cGUsIHByZWNpc2lvbjogcHJvcC5wcmVjaXNpb24sIHNjYWxlOiBwcm9wLnNjYWxlIH07XG4gICAgICAgICAgICB9KSgpKSxcbiAgICAgICAgICAvLyBWZWN0b3Ig7YOA7J6F7J2YIOqyveyasCBkaW1lbnNpb25zIOy2lOqwgFxuICAgICAgICAgIC4uLihpc1ZlY3RvclByb3AocHJvcCkgJiYge1xuICAgICAgICAgICAgZGltZW5zaW9uczogcHJvcC5kaW1lbnNpb25zLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW4g7KCV67O0IOy2lOqwgFxuICAgICAgICAgIC4uLihwcm9wLmdlbmVyYXRlZCAmJiB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHByb3AuZ2VuZXJhdGVkLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHIuY29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gTWFueVRvTWFueSDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCB0YWJsZTEgPSBlbnRpdHkudGFibGU7XG4gICAgICAgIGNvbnN0IHRhYmxlMiA9IHJlbE1kLnRhYmxlO1xuXG4gICAgICAgIC8vIOqwgSDsl5Tti7Dti7DsnZggUEsg7YOA7J6FIOygleuztCDqsIDsoLjsmKTquLBcbiAgICAgICAgY29uc3QgdGhpc1BrVHlwZSA9IGVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgICAgY29uc3QgdGhpc1BrUHJvcCA9IGVudGl0eS5nZXRQa1Byb3AoKTtcbiAgICAgICAgY29uc3QgcmVsUGtUeXBlID0gcmVsTWQuZ2V0UGtUeXBlKCk7XG4gICAgICAgIGNvbnN0IHJlbFBrUHJvcCA9IHJlbE1kLmdldFBrUHJvcCgpO1xuXG4gICAgICAgIGNvbnN0IGpvaW4gPSB7XG4gICAgICAgICAgZnJvbTogYCR7ZW50aXR5LnRhYmxlfS5pZGAsXG4gICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgZnJvbTogYCR7cHJvcC5qb2luVGFibGV9LiR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTEpfV9pZGAsXG4gICAgICAgICAgICB0bzogYCR7cHJvcC5qb2luVGFibGV9LiR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTIpfV9pZGAsXG4gICAgICAgICAgICBvblVwZGF0ZTogcHJvcC5vblVwZGF0ZSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwcm9wLm9uRGVsZXRlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG86IGAke3JlbE1kLnRhYmxlfS5pZGAsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRocm91Z2ggPSBqb2luLnRocm91Z2g7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IFt0aHJvdWdoLmZyb20sIHRocm91Z2gudG9dO1xuICAgICAgICByLmpvaW5UYWJsZXMucHVzaCh7XG4gICAgICAgICAgdGFibGU6IHRocm91Z2guZnJvbS5zcGxpdChcIi5cIilbMF0sXG4gICAgICAgICAgaW5kZXhlczogZW50aXR5LmluZGV4ZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGluZGV4KSA9PiBpbmRleC5jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUuaW5jbHVkZXMoYCR7cHJvcC5qb2luVGFibGV9LmApKSlcbiAgICAgICAgICAgIC5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAuLi5pbmRleCxcbiAgICAgICAgICAgICAgY29sdW1uczogaW5kZXguY29sdW1ucy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBjb2wubmFtZS5yZXBsYWNlKGAke3Byb3Auam9pblRhYmxlfS5gLCBcIlwiKSxcbiAgICAgICAgICAgICAgICBudWxsc0ZpcnN0OiBjb2wubnVsbHNGaXJzdCxcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IGNvbC5zb3J0T3JkZXIsXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIEZLXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGFibGUxKX1faWRgLFxuICAgICAgICAgICAgICB0eXBlOiB0aGlzUGtUeXBlLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIC4uLih0aGlzUGtUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgdGhpc1BrUHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgdGhpc1BrUHJvcC5sZW5ndGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IHRoaXNQa1Byb3AubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIOywuOyhsCDsl5Tti7Dti7DsnZggRktcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTIpfV9pZGAsXG4gICAgICAgICAgICAgIHR5cGU6IHJlbFBrVHlwZSxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAuLi4ocmVsUGtUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgcmVsUGtQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICByZWxQa1Byb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICAgICAgbGVuZ3RoOiByZWxQa1Byb3AubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGZvcmVpZ25zOiBmaWVsZHMubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2VhOuTnOqwgCDslrTrlqQg7YWM7J2067iU7JeQIOyGje2VmOuKlOyngCDtjJDri6hcbiAgICAgICAgICAgIGNvbnN0IGNvbCA9IGZpZWxkLnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IHRvID0gKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoam9pbi50by5zcGxpdChcIi5cIilbMF0pfV9pZGAgPT09IGNvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2luLnRvO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBqb2luLmZyb207XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb2x1bW5zOiBbY29sXSxcbiAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICAgIG9uVXBkYXRlOiB0aHJvdWdoLm9uVXBkYXRlLFxuICAgICAgICAgICAgICBvbkRlbGV0ZTogdGhyb3VnaC5vbkRlbGV0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICkge1xuICAgICAgICAvLyAtT25lUmVsYXRpb24g7LyA7J207IqkXG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgICAgY29uc3QgcGtQcm9wID0gcmVsRW50aXR5LmdldFBrUHJvcCgpO1xuXG4gICAgICAgIGNvbnN0IGlkQ29sdW1uTmFtZSA9IGAke3Byb3AubmFtZX1faWRgO1xuICAgICAgICByLmNvbHVtbnMucHVzaCh7XG4gICAgICAgICAgbmFtZTogaWRDb2x1bW5OYW1lLFxuICAgICAgICAgIHR5cGU6IHBrVHlwZSxcbiAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSA/PyBmYWxzZSxcbiAgICAgICAgICAvLyBzdHJpbmcgRkvsnbgg6rK97JqwIGxlbmd0aOuPhCDsoITri6xcbiAgICAgICAgICAuLi4ocGtUeXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwa1Byb3AudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgcGtQcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgbGVuZ3RoOiBwa1Byb3AubGVuZ3RoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJvcC51c2VDb25zdHJhaW50ID8/IHRydWUpIHtcbiAgICAgICAgICByLmZvcmVpZ25zLnB1c2goe1xuICAgICAgICAgICAgY29sdW1uczogW2lkQ29sdW1uTmFtZV0sXG4gICAgICAgICAgICB0bzogYCR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKHByb3Aud2l0aCkpLnRvTG93ZXJDYXNlKCl9LmlkYCxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBwcm9wLm9uVXBkYXRlID8/IFwiUkVTVFJJQ1RcIixcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwcm9wLm9uRGVsZXRlID8/IFwiUkVTVFJJQ1RcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhYmxlOiBlbnRpdHkudGFibGUsXG4gICAgICBjb2x1bW5zOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgaW5kZXhlczpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgICAgZm9yZWlnbnM6XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgam9pblRhYmxlczpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Kb2luVGFibGVbXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGluZGV4ZXNcbiAgbWlncmF0aW9uU2V0LmluZGV4ZXMgPSBlbnRpdHkuaW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgIGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSxcbiAgKTtcblxuICByZXR1cm4gbWlncmF0aW9uU2V0O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRW50aXR5UHJvcFR5cGVUb01pZ3JhdGlvbkNvbHVtblR5cGUocHJvcDogRW50aXR5UHJvcCk6IE1pZ3JhdGlvbkNvbHVtblR5cGUge1xuICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgfHwgcHJvcC50eXBlID09PSBcInZpcnR1YWxcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5yZXNvbHZlZCBjb2x1bW4gdHlwZTogJHtwcm9wLnR5cGV9YCk7XG4gIH1cblxuICBzd2l0Y2ggKHByb3AudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcImVudW1bXVwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nW11cIjtcbiAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgcmV0dXJuIFwiaW50ZWdlclwiO1xuICAgIGNhc2UgXCJpbnRlZ2VyW11cIjpcbiAgICAgIHJldHVybiBcImludGVnZXJbXVwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdJbnRlZ2VyXCI7XG4gICAgY2FzZSBcImJpZ0ludGVnZXJbXVwiOlxuICAgICAgcmV0dXJuIFwiYmlnSW50ZWdlcltdXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwibnVtYmVyT3JOdW1lcmljXCI7XG4gICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNbXVwiO1xuICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNcIjtcbiAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNbXVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcImJvb2xlYW5bXVwiOlxuICAgICAgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcImRhdGVcIjtcbiAgICBjYXNlIFwiZGF0ZVtdXCI6XG4gICAgICByZXR1cm4gXCJkYXRlW11cIjtcbiAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgcmV0dXJuIFwidXVpZFwiO1xuICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgIHJldHVybiBcInV1aWRbXVwiO1xuICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICByZXR1cm4gXCJqc29uXCI7XG4gICAgY2FzZSBcInNlYXJjaFRleHRcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBcInZlY3RvclwiO1xuICAgIGNhc2UgXCJ2ZWN0b3JbXVwiOlxuICAgICAgcmV0dXJuIFwidmVjdG9yW11cIjtcbiAgICBjYXNlIFwidHN2ZWN0b3JcIjpcbiAgICAgIHJldHVybiBcInRzdmVjdG9yXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIGV4aGF1c3RpdmUocHJvcCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIGVudGl0eSBwcm9wIHR5cGU6ICR7LyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAocHJvcCBhcyB7IHR5cGU6IHN0cmluZyB9KS50eXBlfWAsXG4gICAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBb0NBLFNBQWdCLDBCQUEwQixRQUEwQztDQUNsRixNQUFNLGVBQXlDLE9BQU8sTUFBTSxRQUN6RCxHQUFHLFNBQVM7RUFFWCxJQUFJLGNBQWMsSUFBSSxHQUNwQixPQUFPO0VBR1QsSUFBSSxzQkFBc0IsSUFBSSxHQUM1QixPQUFPO0VBSVQsSUFBSSxDQUFDLGVBQWUsSUFBSSxHQUFHO0dBQ3pCLE1BQU0sU0FBUztJQUNiLE1BQU0sS0FBSztJQUNYLE1BQU0sMkNBQTJDLElBQUk7SUFDckQsVUFBVSxLQUFLLGFBQWE7SUFDNUIsVUFBVTtLQUNSLElBQUksS0FBSyxjQUFjLFFBQ3JCLE9BQU8sRUFDTCxXQUFXLEtBQUssVUFDbEI7S0FFRixPQUFPLENBQUM7SUFDVixFQUFBLENBQUc7SUFFSCxHQUFJLGFBQWEsSUFBSSxLQUNuQixLQUFLLFdBQVcsVUFBYSxFQUMzQixRQUFRLEtBQUssT0FDZjtJQUVGLElBQUssYUFBYSxJQUFJLEtBQUssY0FBYyxJQUFJ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
|
|
187
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNldC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9uL21pZ3JhdGlvbi1zZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuaW1wb3J0IHsgdHlwZSBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNOdW1iZXJQcm9wLFxuICBpc051bWJlclNpbmdsZVByb3AsXG4gIGlzTnVtZXJpY1Byb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1N0cmluZ1Byb3AsXG4gIGlzVmVjdG9yUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgTWlncmF0aW9uQ29sdW1uLFxuICB0eXBlIE1pZ3JhdGlvbkNvbHVtblR5cGUsXG4gIHR5cGUgTWlncmF0aW9uRm9yZWlnbixcbiAgdHlwZSBNaWdyYXRpb25JbmRleCxcbiAgdHlwZSBNaWdyYXRpb25Kb2luVGFibGUsXG4gIHR5cGUgTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aGF1c3RpdmUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLy8gbnVtZXJpYyDsu6zrn7zsl5DshJwgcHJlY2lzaW9uL3NjYWxl7J2EIOyDneuete2WiOydhCDrlYwg7Iuk7KCc66GcIOyDneyEseuQmOuKlCDqsJIoa25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkinsnbTri6QuXG5jb25zdCBOVU1FUklDX0RFRkFVTFRfUFJFQ0lTSU9OID0gODtcbmNvbnN0IE5VTUVSSUNfREVGQVVMVF9TQ0FMRSA9IDI7XG5cbi8qKlxuICogRW50aXR566W8IOydveyWtOyEnCBNaWdyYXRpb25TZXRBbmRKb2luVGFibGXsnYQg66eM65Ok7Ja07Ji164uI64ukLlxuICogQHBhcmFtIGVudGl0eSBFbnRpdHkg6rCd7LK0XG4gKiBAcmV0dXJucyBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUg6rCd7LK0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaWdyYXRpb25TZXRGcm9tRW50aXR5KGVudGl0eTogRW50aXR5KTogTWlncmF0aW9uU2V0QW5kSm9pblRhYmxlIHtcbiAgY29uc3QgbWlncmF0aW9uU2V0OiBNaWdyYXRpb25TZXRBbmRKb2luVGFibGUgPSBlbnRpdHkucHJvcHMucmVkdWNlKFxuICAgIChyLCBwcm9wKSA9PiB7XG4gICAgICAvLyB2aXJ0dWFsIO2VhOuTnCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuICAgICAgLy8gSGFzTWFueSDsvIDsnbTsiqTripQg7JWE66y0IOyymOumrOuPhCDtlZjsp4Ag7JWK7J2MXG4gICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7Lus65+8XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IHtcbiAgICAgICAgICBuYW1lOiBwcm9wLm5hbWUsXG4gICAgICAgICAgdHlwZTogcmVzb2x2ZUVudGl0eVByb3BUeXBlVG9NaWdyYXRpb25Db2x1bW5UeXBlKHByb3ApLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID09PSB0cnVlLFxuICAgICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRUbzogcHJvcC5kYkRlZmF1bHQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgfSkoKSxcbiAgICAgICAgICAvLyBTdHJpbmcg7YOA7J6F7JeQIGxlbmd0aCDsnojripQg6rK97JqwIOy2lOqwgFxuICAgICAgICAgIC4uLihpc1N0cmluZ1Byb3AocHJvcCkgJiZcbiAgICAgICAgICAgIHByb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHByb3AubGVuZ3RoLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gTnVtYmVyL051bWVyaWMg7YOA7J6F7J2YIOqyveyasCBwcmVjaXNpb24sIHNjYWxlIOy2lOqwgFxuICAgICAgICAgIC4uLigoaXNOdW1iZXJQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1Byb3AocHJvcCkpICYmXG4gICAgICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBudW1iZXJUeXBlID0gaXNOdW1iZXJQcm9wKHByb3ApID8gKHByb3AubnVtYmVyVHlwZSA/PyBcIm51bWVyaWNcIikgOiBcIm51bWVyaWNcIjtcblxuICAgICAgICAgICAgICAvLyBudW1lcmlj7JeQ7IScIHByZWNpc2lvbi9zY2FsZeydhCDsg53rnrXtlZjrqbQga25leCBkZWNpbWFs7J2YIOq4sOuzuOqwkig4LCAyKeycvOuhnCDsu6zrn7zsnbRcbiAgICAgICAgICAgICAgLy8g66eM65Ok7Ja07KeA64qU642wLCBEQuyXkOyEnOuKlCDqt7gg6rCS7J20IOq3uOuMgOuhnCDsnb3tnojrr4DroZwg7JeU7Yuw7YuwIOyqveydhCB1bmRlZmluZWTroZwg65GQ66m0XG4gICAgICAgICAgICAgIC8vIOunpOuyiCDrtojsnbzsuZjroZwg7J6h7Z6M64ukLiDruYTqtZAg7KCE7JeQIOqwmeydgCDquLDrs7jqsJLsnYQg7LGE7JuMIOyLpOygnCDsiqTtgqTrp4jsmYAg66ee7LaY64ukLlxuICAgICAgICAgICAgICBpZiAobnVtYmVyVHlwZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApIHx8IGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIG51bWJlclR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogcHJvcC5wcmVjaXNpb24gPz8gTlVNRVJJQ19ERUZBVUxUX1BSRUNJU0lPTixcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHByb3Auc2NhbGUgPz8gTlVNRVJJQ19ERUZBVUxUX1NDQUxFLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbnVtYmVyVHlwZSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiB9KSxcbiAgICAgICAgICAgICAgICAgIC4uLihwcm9wLnNjYWxlICE9PSB1bmRlZmluZWQgJiYgeyBzY2FsZTogcHJvcC5zY2FsZSB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gcmVhbC9kb3VibGUgcHJlY2lzaW9u7J2AIHByZWNpc2lvbi9zY2FsZeydhCDsk7Dsp4Ag7JWK64qU64ukKERCIOumrOuNlOuPhCDrsJjtmZjtlZjsp4Ag7JWK7J2MKS5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgbnVtYmVyVHlwZSwgcHJlY2lzaW9uOiBwcm9wLnByZWNpc2lvbiwgc2NhbGU6IHByb3Auc2NhbGUgfTtcbiAgICAgICAgICAgIH0pKCkpLFxuICAgICAgICAgIC8vIFZlY3RvciDtg4DsnoXsnZgg6rK97JqwIGRpbWVuc2lvbnMg7LaU6rCAXG4gICAgICAgICAgLi4uKGlzVmVjdG9yUHJvcChwcm9wKSAmJiB7XG4gICAgICAgICAgICBkaW1lbnNpb25zOiBwcm9wLmRpbWVuc2lvbnMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7LaU6rCAXG4gICAgICAgICAgLi4uKHByb3AuZ2VuZXJhdGVkICYmIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogcHJvcC5nZW5lcmF0ZWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgci5jb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBNYW55VG9NYW55IOy8gOydtOyKpFxuICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IHRhYmxlMSA9IGVudGl0eS50YWJsZTtcbiAgICAgICAgY29uc3QgdGFibGUyID0gcmVsTWQudGFibGU7XG5cbiAgICAgICAgLy8g6rCBIOyXlO2LsO2LsOydmCBQSyDtg4DsnoUg7KCV67O0IOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCB0aGlzUGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCB0aGlzUGtQcm9wID0gZW50aXR5LmdldFBrUHJvcCgpO1xuICAgICAgICBjb25zdCByZWxQa1R5cGUgPSByZWxNZC5nZXRQa1R5cGUoKTtcbiAgICAgICAgY29uc3QgcmVsUGtQcm9wID0gcmVsTWQuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3Qgam9pbiA9IHtcbiAgICAgICAgICBmcm9tOiBgJHtlbnRpdHkudGFibGV9LmlkYCxcbiAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICBmcm9tOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMSl9X2lkYCxcbiAgICAgICAgICAgIHRvOiBgJHtwcm9wLmpvaW5UYWJsZX0uJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgIG9uVXBkYXRlOiBwcm9wLm9uVXBkYXRlLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0bzogYCR7cmVsTWQudGFibGV9LmlkYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdGhyb3VnaCA9IGpvaW4udGhyb3VnaDtcbiAgICAgICAgY29uc3QgZmllbGRzID0gW3Rocm91Z2guZnJvbSwgdGhyb3VnaC50b107XG4gICAgICAgIHIuam9pblRhYmxlcy5wdXNoKHtcbiAgICAgICAgICB0YWJsZTogdGhyb3VnaC5mcm9tLnNwbGl0KFwiLlwiKVswXSxcbiAgICAgICAgICBpbmRleGVzOiBlbnRpdHkuaW5kZXhlc1xuICAgICAgICAgICAgLmZpbHRlcigoaW5kZXgpID0+IGluZGV4LmNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZS5pbmNsdWRlcyhgJHtwcm9wLmpvaW5UYWJsZX0uYCkpKVxuICAgICAgICAgICAgLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIC4uLmluZGV4LFxuICAgICAgICAgICAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGNvbC5uYW1lLnJlcGxhY2UoYCR7cHJvcC5qb2luVGFibGV9LmAsIFwiXCIpLFxuICAgICAgICAgICAgICAgIG51bGxzRmlyc3Q6IGNvbC5udWxsc0ZpcnN0LFxuICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlcixcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgbnVsbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZggRktcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0YWJsZTEpfV9pZGAsXG4gICAgICAgICAgICAgIHR5cGU6IHRoaXNQa1R5cGUsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgLi4uKHRoaXNQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICB0aGlzUGtQcm9wLmxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpc1BrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8g7LC47KGwIOyXlO2LsO2LsOydmCBGS1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRhYmxlMil9X2lkYCxcbiAgICAgICAgICAgICAgdHlwZTogcmVsUGtUeXBlLFxuICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIC4uLihyZWxQa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICByZWxQa1Byb3AudHlwZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIHJlbFBrUHJvcC5sZW5ndGggIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgICAgICAgICAgICBsZW5ndGg6IHJlbFBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZm9yZWlnbnM6IGZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7ZWE65Oc6rCAIOyWtOuWpCDthYzsnbTruJTsl5Ag7IaN7ZWY64qU7KeAIO2MkOuLqFxuICAgICAgICAgICAgY29uc3QgY29sID0gZmllbGQuc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgdG8gPSAoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShqb2luLnRvLnNwbGl0KFwiLlwiKVswXSl9X2lkYCA9PT0gY29sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4udG87XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGpvaW4uZnJvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6IFtjb2xdLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgICAgb25VcGRhdGU6IHRocm91Z2gub25VcGRhdGUsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiB0aHJvdWdoLm9uRGVsZXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgKSB7XG4gICAgICAgIC8vIC1PbmVSZWxhdGlvbiDsvIDsnbTsiqRcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgICBjb25zdCBwa1Byb3AgPSByZWxFbnRpdHkuZ2V0UGtQcm9wKCk7XG5cbiAgICAgICAgY29uc3QgaWRDb2x1bW5OYW1lID0gYCR7cHJvcC5uYW1lfV9pZGA7XG4gICAgICAgIHIuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBpZENvbHVtbk5hbWUsXG4gICAgICAgICAgdHlwZTogcGtUeXBlLFxuICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlID8/IGZhbHNlLFxuICAgICAgICAgIC8vIHN0cmluZyBGS+yduCDqsr3smrAgbGVuZ3Ro64+EIOyghOuLrFxuICAgICAgICAgIC4uLihwa1R5cGUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIHBrUHJvcC50eXBlID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBwa1Byb3AubGVuZ3RoICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgICAgICBsZW5ndGg6IHBrUHJvcC5sZW5ndGgsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwcm9wLnVzZUNvbnN0cmFpbnQgPz8gdHJ1ZSkge1xuICAgICAgICAgIHIuZm9yZWlnbnMucHVzaCh7XG4gICAgICAgICAgICBjb2x1bW5zOiBbaWRDb2x1bW5OYW1lXSxcbiAgICAgICAgICAgIHRvOiBgJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUocHJvcC53aXRoKSkudG9Mb3dlckNhc2UoKX0uaWRgLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3Aub25VcGRhdGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgICAgb25EZWxldGU6IHByb3Aub25EZWxldGUgPz8gXCJSRVNUUklDVFwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdGFibGU6IGVudGl0eS50YWJsZSxcbiAgICAgIGNvbHVtbnM6XG4gICAgICAgIC8qIFNBRkVUWTogS25leOyZgCBQb3N0Z3JlU1FMIOyKpO2CpOuniCDsobDtmowg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgICBpbmRleGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgICBmb3JlaWduczpcbiAgICAgICAgLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBqb2luVGFibGVzOlxuICAgICAgICAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIFtdIGFzIE1pZ3JhdGlvbkpvaW5UYWJsZVtdLFxuICAgIH0sXG4gICk7XG5cbiAgLy8gaW5kZXhlc1xuICBtaWdyYXRpb25TZXQuaW5kZXhlcyA9IGVudGl0eS5pbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgaW5kZXguY29sdW1ucy5maW5kKChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpLFxuICApO1xuXG4gIHJldHVybiBtaWdyYXRpb25TZXQ7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFbnRpdHlQcm9wVHlwZVRvTWlncmF0aW9uQ29sdW1uVHlwZShwcm9wOiBFbnRpdHlQcm9wKTogTWlncmF0aW9uQ29sdW1uVHlwZSB7XG4gIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiB8fCBwcm9wLnR5cGUgPT09IFwidmlydHVhbFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlc29sdmVkIGNvbHVtbiB0eXBlOiAke3Byb3AudHlwZX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInN0cmluZ1tdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIFwiZW51bVtdXCI6XG4gICAgICByZXR1cm4gXCJzdHJpbmdbXVwiO1xuICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgcmV0dXJuIFwiaW50ZWdlcltdXCI7XG4gICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgIHJldHVybiBcImJpZ0ludGVnZXJcIjtcbiAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICByZXR1cm4gXCJiaWdJbnRlZ2VyW11cIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJPck51bWVyaWNcIjtcbiAgICBjYXNlIFwibnVtYmVyW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1wiO1xuICAgIGNhc2UgXCJudW1lcmljW11cIjpcbiAgICAgIHJldHVybiBcIm51bWJlck9yTnVtZXJpY1tdXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuW11cIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiZGF0ZVwiO1xuICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgIHJldHVybiBcImRhdGVbXVwiO1xuICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICByZXR1cm4gXCJ1dWlkXCI7XG4gICAgY2FzZSBcInV1aWRbXVwiOlxuICAgICAgcmV0dXJuIFwidXVpZFtdXCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25cIjtcbiAgICBjYXNlIFwic2VhcmNoVGV4dFwiOlxuICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidmVjdG9yXCI7XG4gICAgY2FzZSBcInZlY3RvcltdXCI6XG4gICAgICByZXR1cm4gXCJ2ZWN0b3JbXVwiO1xuICAgIGNhc2UgXCJ0c3ZlY3RvclwiOlxuICAgICAgcmV0dXJuIFwidHN2ZWN0b3JcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgZXhoYXVzdGl2ZShwcm9wKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVua25vd24gZW50aXR5IHByb3AgdHlwZTogJHsvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChwcm9wIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YCxcbiAgICAgICk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFzQ0EsU0FBZ0IsMEJBQTBCLFFBQTBDO0NBQ2xG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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF,KAAK,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"postgresql-schema-reader.d.ts","sourceRoot":"","sources":["../../src/migration/postgresql-schema-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,yBAAyB;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,mBAAmB;IACnB,QAAQ,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,KAAK,SAAS,GAAG;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAQF,KAAK,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAiBxC,cAAM,2BAA2B;IAC/B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAyD;IAE3F;;;;;OAKG;IACG,qBAAqB,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAe9B;IAED;;;;;;;;;OASG;IACG,wBAAwB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAoB5F;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAmJzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACG,SAAS,CACb,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAO/C;IAED;;;;;;OAMG;YACW,UAAU;IAoMxB,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,yBAAyB;IAsBjC,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,gBAAgB;IAuFxB,OAAO,CAAC,uBAAuB;IA+C/B;;;OAGG;IACG,yBAAyB,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA6C7F;IAED;;;OAGG;YACW,mBAAmB;IAOjC;;;OAGG;YACW,sBAAsB;IA8BpC;;OAEG;IACH,gBAAgB,CACd,QAAQ,EAAE,QAAQ,GACjB,IAAI,CACL,eAAe,EACf,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,GAAG,YAAY,GAAG,YAAY,CACxE,CA6FA;CACF;AAED,eAAO,MAAM,sBAAsB,6BAAoC,CAAC"}
|
|
@@ -2,6 +2,16 @@ import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
|
2
2
|
import { group } from "radashi";
|
|
3
3
|
import assert from "assert";
|
|
4
4
|
//#region src/migration/postgresql-schema-reader.ts
|
|
5
|
+
function decodeNumericTypeModifier(typeModifier) {
|
|
6
|
+
if (typeModifier === void 0 || typeModifier === null || typeModifier < 4) return null;
|
|
7
|
+
const modifier = typeModifier - 4;
|
|
8
|
+
const precision = modifier >>> 16;
|
|
9
|
+
const unsignedScale = modifier & 2047;
|
|
10
|
+
return {
|
|
11
|
+
precision,
|
|
12
|
+
scale: unsignedScale >= 1024 ? unsignedScale - 2048 : unsignedScale
|
|
13
|
+
};
|
|
14
|
+
}
|
|
5
15
|
var PostgreSQLSchemaReaderClass, PostgreSQLSchemaReader;
|
|
6
16
|
var init_postgresql_schema_reader = __esmMin((() => {
|
|
7
17
|
PostgreSQLSchemaReaderClass = class {
|
|
@@ -180,6 +190,7 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
180
190
|
) AS character_maximum_length,
|
|
181
191
|
COALESCE(c.datetime_precision, c.numeric_precision) AS precision,
|
|
182
192
|
c.numeric_scale,
|
|
193
|
+
a.atttypmod,
|
|
183
194
|
c.is_nullable,
|
|
184
195
|
c.column_default,
|
|
185
196
|
COALESCE(a.attgenerated, '') as is_generated,
|
|
@@ -625,14 +636,17 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
625
636
|
...character_maximum_length && { length: character_maximum_length }
|
|
626
637
|
};
|
|
627
638
|
if (udt_name === "text") return { type: `string${singleOrArray}` };
|
|
628
|
-
if (udt_name === "numeric")
|
|
629
|
-
|
|
630
|
-
numberType: "numeric",
|
|
631
|
-
...precision !== null && numeric_scale !== null && {
|
|
639
|
+
if (udt_name === "numeric") {
|
|
640
|
+
const numericMetadata = decodeNumericTypeModifier(dbColumn.atttypmod) ?? (precision !== null && numeric_scale !== null ? {
|
|
632
641
|
precision,
|
|
633
642
|
scale: numeric_scale
|
|
634
|
-
}
|
|
635
|
-
|
|
643
|
+
} : {});
|
|
644
|
+
return {
|
|
645
|
+
type: `numberOrNumeric${singleOrArray}`,
|
|
646
|
+
numberType: "numeric",
|
|
647
|
+
...numericMetadata
|
|
648
|
+
};
|
|
649
|
+
}
|
|
636
650
|
if (udt_name === "float4") return {
|
|
637
651
|
type: `numberOrNumeric${singleOrArray}`,
|
|
638
652
|
numberType: "real"
|
|
@@ -661,4 +675,4 @@ var init_postgresql_schema_reader = __esmMin((() => {
|
|
|
661
675
|
init_postgresql_schema_reader();
|
|
662
676
|
export { PostgreSQLSchemaReader, init_postgresql_schema_reader };
|
|
663
677
|
|
|
664
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuXG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQge1xuICB0eXBlIE1pZ3JhdGlvbkNvbHVtbixcbiAgdHlwZSBNaWdyYXRpb25Gb3JlaWduLFxuICB0eXBlIE1pZ3JhdGlvbkluZGV4LFxuICB0eXBlIE1pZ3JhdGlvblNldCxcbiAgdHlwZSBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG4gIGNvbHVtbl9vcmRlcjogbnVtYmVyO1xuICBpbmRleF9kZWZpbml0aW9uOiBzdHJpbmc7XG4gIHByZWRpY2F0ZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG50eXBlIFRhYmxlU2NoZW1hUm93cyA9IHtcbiAgY29sdW1uczogUGdDb2x1bW5bXTtcbiAgaW5kZXhlczogUGdJbmRleFtdO1xuICBmb3JlaWduczogUGdGb3JlaWduW107XG59O1xuXG50eXBlIFJhd0NhcGFibGVLbmV4ID0gUGljazxLbmV4LCBcInJhd1wiPjtcblxuY2xhc3MgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnZW5lcmljSW5kZXhUeXBlcyA9IG5ldyBTZXQoW1wiYnRyZWVcIiwgXCJoYXNoXCIsIFwiZ2luXCIsIFwiZ2lzdFwiLCBcInBncm9vbmdhXCJdKTtcblxuICAvKipcbiAgICogRELsl5DshJwg7YWM7J2067iUIOygleuztOulvCDsnb3slrTshJwgTWlncmF0aW9uU2V07J2EIOunjOuTpOyWtOyYteuLiOuLpC5cbiAgICogQHBhcmFtIGNvbXBhcmVEQiBLbmV4IOyduOyKpO2EtOyKpFxuICAgKiBAcGFyYW0gdGFibGUg7YWM7J2067iUIOydtOumhFxuICAgKiBAcmV0dXJucyBNaWdyYXRpb25TZXQg6rCd7LK0XG4gICAqL1xuICBhc3luYyBnZXRNaWdyYXRpb25TZXRGcm9tREIoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZTogc3RyaW5nLFxuICApOiBQcm9taXNlPE1pZ3JhdGlvblNldCB8IG51bGw+IHtcbiAgICBsZXQgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLCBkYkluZGV4ZXM6IFBnSW5kZXhbXSwgZGJGb3JlaWduczogUGdGb3JlaWduW107XG4gICAgdHJ5IHtcbiAgICAgIFtkYkNvbHVtbnMsIGRiSW5kZXhlcywgZGJGb3JlaWduc10gPSBhd2FpdCB0aGlzLnJlYWRUYWJsZShjb21wYXJlREIsIHRhYmxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcIlRhYmxlIG5vdCBmb3VuZFwiKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgLy8gdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25zIOyhsO2ajFxuICAgIGNvbnN0IHZlY3RvckRpbWVuc2lvbnMgPSBhd2FpdCB0aGlzLmdldFZlY3RvckRpbWVuc2lvbnMoY29tcGFyZURCLCB0YWJsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5idWlsZE1pZ3JhdGlvblNldCh0YWJsZSwgZGJDb2x1bW5zLCBkYkluZGV4ZXMsIGRiRm9yZWlnbnMsIHZlY3RvckRpbWVuc2lvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIHB1YmxpYyDsiqTtgqTrp4jsnZgg66qo65OgIO2FjOydtOu4lOydhCDtlZwg67KI7JeQIOydveyWtOyEnCDthYzsnbTruJTrs4QgTWlncmF0aW9uU2V07J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogZ2V0TWlncmF0aW9uU2V0RnJvbURC66W8IO2FjOydtOu4lOuniOuLpCDtmLjstpztlZjrqbQgKOy7rOufvC/snbjrjbHsiqQvRksv67Kh7YSw7LCo7JuQKSDDlyDthYzsnbTruJQg7IiYIOunjO2BvFxuICAgKiDsmZXrs7XsnbQg67Cc7IOd7ZWc64ukLiDruYTqtZAg64yA7IOB7J20IOyImOyLrSDqsJzrqbQg7JuQ6rKpIERC7JeQ7IScIOyZleuztSDruYTsmqnsnbQg7KeA67Cw7KCB7J20IOuQmOuvgOuhnCxcbiAgICog7KKF66WY67OE66GcIO2VnCDrsojslKnrp4wg7KGw7ZqM7ZWc64ukLiDtlokg7ZW07ISd7J2AIGdldE1pZ3JhdGlvblNldEZyb21EQuyZgCDrj5nsnbztlZxcbiAgICogYnVpbGRNaWdyYXRpb25TZXTsnYQg6rO17Jyg7ZWc64ukLlxuICAgKlxuICAgKiBAcmV0dXJucyDthYzsnbTruJTrqoUg4oaSIE1pZ3JhdGlvblNldC4gRELsl5Ag7JeG64qUIO2FjOydtOu4lOydgCDtla3rqqnsnbQg7JeG64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0TWlncmF0aW9uU2V0RnJvbURCQWxsKGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgpOiBQcm9taXNlPE1hcDxzdHJpbmcsIE1pZ3JhdGlvblNldD4+IHtcbiAgICBjb25zdCBbdGFibGVzLCB2ZWN0b3JEaW1lbnNpb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucmVhZFRhYmxlcyhjb21wYXJlREIpLFxuICAgICAgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zQWxsKGNvbXBhcmVEQiksXG4gICAgXSk7XG5cbiAgICBjb25zdCBtaWdyYXRpb25TZXRzID0gbmV3IE1hcDxzdHJpbmcsIE1pZ3JhdGlvblNldD4oKTtcbiAgICBmb3IgKGNvbnN0IFt0YWJsZSwgcm93c10gb2YgdGFibGVzKSB7XG4gICAgICBtaWdyYXRpb25TZXRzLnNldChcbiAgICAgICAgdGFibGUsXG4gICAgICAgIHRoaXMuYnVpbGRNaWdyYXRpb25TZXQoXG4gICAgICAgICAgdGFibGUsXG4gICAgICAgICAgcm93cy5jb2x1bW5zLFxuICAgICAgICAgIHJvd3MuaW5kZXhlcyxcbiAgICAgICAgICByb3dzLmZvcmVpZ25zLFxuICAgICAgICAgIHZlY3RvckRpbWVuc2lvbnMuZ2V0KHRhYmxlKSA/PyB7fSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBtaWdyYXRpb25TZXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIOyhsO2ajCDqsrDqs7wg7ZaJ65Ok7J2EIE1pZ3JhdGlvblNldOycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqIO2FjOydtOu4lCDri6jsnIQg7KGw7ZqMKGdldE1pZ3JhdGlvblNldEZyb21EQinsmYAg7KCE7LK0IOydvOq0hCDsobDtmowoZ2V0TWlncmF0aW9uU2V0RnJvbURCQWxsKeqwgFxuICAgKiDsnbQg66Gc7KeB7J2EIOqzteycoO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNaWdyYXRpb25TZXQoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBkYkNvbHVtbnM6IFBnQ29sdW1uW10sXG4gICAgZGJJbmRleGVzOiBQZ0luZGV4W10sXG4gICAgZGJGb3JlaWduczogUGdGb3JlaWduW10sXG4gICAgdmVjdG9yRGltZW5zaW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyPixcbiAgKTogTWlncmF0aW9uU2V0IHtcbiAgICBjb25zdCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSA9IGRiQ29sdW1ucy5tYXAoKGRiQ29sdW1uKSA9PiB7XG4gICAgICBjb25zdCBkYkNvbFR5cGUgPSB0aGlzLnJlc29sdmVEQkNvbFR5cGUoZGJDb2x1bW4pO1xuXG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J24IOqyveyasCBkaW1lbnNpb25zIOyEpOyglVxuICAgICAgaWYgKGRiQ29sVHlwZS50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgICAgIGRiQ29sVHlwZS5kaW1lbnNpb25zID0gdmVjdG9yRGltZW5zaW9uc1tkYkNvbHVtbi5jb2x1bW5fbmFtZV0gPz8gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGJDb2x1bW4uY29sdW1uX25hbWUsXG4gICAgICAgIG51bGxhYmxlOiBkYkNvbHVtbi5pc19udWxsYWJsZSA9PT0gXCJZRVNcIixcbiAgICAgICAgLi4uZGJDb2xUeXBlLFxuICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1uIOyymOumrFxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgPyBcIlNUT1JFRFwiIDogXCJWSVJUVUFMXCIsXG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogZGJDb2x1bW4uZ2VuZXJhdGlvbl9leHByZXNzaW9uID8/IFwiXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pKCksXG4gICAgICAgIC8vIERlZmF1bHQg6rCSIOyymOumrCAoR2VuZXJhdGVkIENvbHVtbuydtCDslYTri4wg6rK97Jqw66eMKVxuICAgICAgICAuLi4oKCkgPT4ge1xuICAgICAgICAgIC8vIEdlbmVyYXRlZCBDb2x1bW7snYAgZGVmYXVsdCDqsJLsnbQg7JeG7J2MXG4gICAgICAgICAgaWYgKGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJzXCIgfHwgZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInZcIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUG9zdGdyZVNRTCBkZWZhdWx0IOqwkiDsoJXrpqwgKG5leHR2YWwsIENVUlJFTlRfVElNRVNUQU1QIOuTsSlcbiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBkYkNvbHVtbi5jb2x1bW5fZGVmYXVsdDtcblxuICAgICAgICAgICAgLy8gbmV4dHZhbCDsoJzqsbAgKFNFUklBTCDtg4DsnoUpXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCJuZXh0dmFsKFwiKSkge1xuICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIO2DgOyehSDsupDsiqTtjIUg7KCc6rGwICjsmIg6ICcxJzo6aW50ZWdlciDihpIgMSlcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZS5yZXBsYWNlKC86OltcXHdcXHNdKyQvZywgXCJcIik7XG5cbiAgICAgICAgICAgIC8vIOuUsOyYtO2RnOqwgCBzaW5nbGUgcXVvdGXsnbgg6rK97JqwIGRvdWJsZSBxdW90ZeuhnCDrs4DtmZhcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUuc3RhcnRzV2l0aChcIidcIikgJiYgZGVmYXVsdFZhbHVlLmVuZHNXaXRoKFwiJ1wiKSkge1xuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZUFsbChcIidcIiwgJ1wiJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRlZmF1bHRUbzogZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFBSSU1BUlkgS0VZ7JmAIGZvcmVpZ24ga2V57JqpIOyduOuNseyKpCDsoJzsmbhcbiAgICBjb25zdCBkYkluZGV4ZXNHcm91cCA9IGdyb3VwKFxuICAgICAgZGJJbmRleGVzLmZpbHRlcihcbiAgICAgICAgKGRiSW5kZXgpID0+XG4gICAgICAgICAgIWRiSW5kZXguaXNfcHJpbWFyeSAmJlxuICAgICAgICAgICFkYkZvcmVpZ25zLmZpbmQoKGRiRm9yZWlnbikgPT4gZGJJbmRleC5pbmRleF9uYW1lLmluY2x1ZGVzKGRiRm9yZWlnbi5jb25zdHJhaW50X25hbWUpKSxcbiAgICAgICksXG4gICAgICAoZGJJbmRleCkgPT4gZGJJbmRleC5pbmRleF9uYW1lLFxuICAgICk7XG5cbiAgICAvLyBpbmRleGVzIOyymOumrFxuICAgIGNvbnN0IGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGluZGV4TmFtZSBvZiBPYmplY3Qua2V5cyhkYkluZGV4ZXNHcm91cCkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleGVzID0gZGJJbmRleGVzR3JvdXBbaW5kZXhOYW1lXT8udG9Tb3J0ZWQoXG4gICAgICAgIChsZWZ0LCByaWdodCkgPT4gbGVmdC5jb2x1bW5fb3JkZXIgLSByaWdodC5jb2x1bW5fb3JkZXIsXG4gICAgICApO1xuICAgICAgYXNzZXJ0KGN1cnJlbnRJbmRleGVzKTtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IGN1cnJlbnRJbmRleGVzWzBdO1xuICAgICAgY29uc3QgcGFyc2VkSW5kZXhEZWZpbml0aW9uID0gdGhpcy5wYXJzZUluZGV4RGVmaW5pdGlvbihmaXJzdEluZGV4LmluZGV4X2RlZmluaXRpb24pO1xuICAgICAgY29uc3QgcmVzdG9yZWRJbmRleFR5cGUgPSB0aGlzLnJlc3RvcmVNaWdyYXRpb25JbmRleFR5cGUoXG4gICAgICAgIGZpcnN0SW5kZXgsXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QsXG4gICAgICApO1xuICAgICAgY29uc3QgdXNpbmcgPSB0aGlzLnJlc3RvcmVHZW5lcmljVXNpbmcoXG4gICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5hY2Nlc3NNZXRob2QgPz8gZmlyc3RJbmRleC5pbmRleF90eXBlLFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW5kZXhDb2x1bW5zOiBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY3VycmVudEluZGV4IG9mIGN1cnJlbnRJbmRleGVzKSB7XG4gICAgICAgIGNvbnN0IG9wY2xhc3MgPSB0aGlzLmV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoXG4gICAgICAgICAgcGFyc2VkSW5kZXhEZWZpbml0aW9uLmNvbHVtbkRlZmluaXRpb25zW2N1cnJlbnRJbmRleC5jb2x1bW5fb3JkZXIgLSAxXSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29sdW1uOiBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl1bbnVtYmVyXSA9IHtcbiAgICAgICAgICBuYW1lOiBjdXJyZW50SW5kZXguY29sdW1uX25hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcGNsYXNzKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHsgb3BjbGFzcyB9KTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHVzaW5nKSB7XG4gICAgICAgICAgY2FzZSBcImJ0cmVlXCI6XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICAgICAgICBzb3J0T3JkZXI6IGN1cnJlbnRJbmRleC5zb3J0X29yZGVyLFxuICAgICAgICAgICAgICBudWxsc0ZpcnN0OiBjdXJyZW50SW5kZXgubnVsbHNfZmlyc3QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4Q29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleDogTWlncmF0aW9uSW5kZXggPSB7XG4gICAgICAgIHR5cGU6IHJlc3RvcmVkSW5kZXhUeXBlLFxuICAgICAgICBuYW1lOiBpbmRleE5hbWUsXG4gICAgICAgIGNvbHVtbnM6IGluZGV4Q29sdW1ucyxcbiAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogZmlyc3RJbmRleC5udWxsc19ub3RfZGlzdGluY3QsXG4gICAgICAgIC4uLnRoaXMucGFyc2VWZWN0b3JJbmRleE9wdGlvbnMocmVzdG9yZWRJbmRleFR5cGUsIHBhcnNlZEluZGV4RGVmaW5pdGlvbi53aXRoT3B0aW9ucyksXG4gICAgICB9O1xuICAgICAgaWYgKGZpcnN0SW5kZXgucHJlZGljYXRlKSB7XG4gICAgICAgIGluZGV4LndoZXJlID0gZmlyc3RJbmRleC5wcmVkaWNhdGU7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmcpIHtcbiAgICAgICAgaW5kZXgudXNpbmcgPSB1c2luZztcbiAgICAgIH1cbiAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gZm9yZWlnbnMg7LKY66asXG4gICAgY29uc3QgZm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSA9IGRiRm9yZWlnbnMubWFwKChkYkZvcmVpZ24pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IFtkYkZvcmVpZ24uY29sdW1uX25hbWVdLFxuICAgICAgICB0bzogYCR7ZGJGb3JlaWduLmZvcmVpZ25fdGFibGVfbmFtZX0uJHtkYkZvcmVpZ24uZm9yZWlnbl9jb2x1bW5fbmFtZX1gLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24oZGJGb3JlaWduLmRlbGV0ZV9ydWxlKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGUsXG4gICAgICBjb2x1bW5zLFxuICAgICAgaW5kZXhlcyxcbiAgICAgIGZvcmVpZ25zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUG9zdGdyZVNRTOydmCBjb25zdHJhaW50IGFjdGlvbuydhCBLbmV4IO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgbWFwQ29uc3RyYWludEFjdGlvbihhY3Rpb246IHN0cmluZyk6IFJlbGF0aW9uT24ge1xuICAgIGNvbnN0IGFjdGlvbk1hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWxhdGlvbk9uPihbXG4gICAgICBbXCJOTyBBQ1RJT05cIiwgXCJOTyBBQ1RJT05cIl0sXG4gICAgICBbXCJSRVNUUklDVFwiLCBcIlJFU1RSSUNUXCJdLFxuICAgICAgW1wiQ0FTQ0FERVwiLCBcIkNBU0NBREVcIl0sXG4gICAgICBbXCJTRVQgTlVMTFwiLCBcIlNFVCBOVUxMXCJdLFxuICAgICAgW1wiU0VUIERFRkFVTFRcIiwgXCJTRVQgREVGQVVMVFwiXSxcbiAgICBdKTtcbiAgICByZXR1cm4gYWN0aW9uTWFwLmdldChhY3Rpb24pID8/IFwiTk8gQUNUSU9OXCI7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IO2FjOydtOu4lCDsnb3slrTshJwgY29scywgaW5kZXhlcywgZm9yZWlnbnMg67CY7ZmYXG4gICAqL1xuICBhc3luYyByZWFkVGFibGUoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxbUGdDb2x1bW5bXSwgUGdJbmRleFtdLCBQZ0ZvcmVpZ25bXV0+IHtcbiAgICBjb25zdCB0YWJsZXMgPSBhd2FpdCB0aGlzLnJlYWRUYWJsZXMoY29tcGFyZURCLCB0YWJsZU5hbWUpO1xuICAgIGNvbnN0IHJvd3MgPSB0YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKHJvd3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBub3QgZm91bmQ6ICR7dGFibGVOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gW3Jvd3MuY29sdW1ucywgcm93cy5pbmRleGVzLCByb3dzLmZvcmVpZ25zXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdWJsaWMg7Iqk7YKk66eIIO2FjOydtOu4lOuTpOydmCBjb2xzL2luZGV4ZXMvZm9yZWlnbnPrpbwg7YWM7J2067iU67OE66GcIOustuyWtOyEnCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIHRhYmxlTmFtZeydhCDso7zrqbQg6re4IO2FjOydtOu4lOunjCwg7IOd65617ZWY66m0IOyghOyytOulvCDsobDtmoztlanri4jri6QuIOy/vOumrOuKlCDrkZAg6rK966Gc6rCAIOqzteycoO2VmOuvgOuhnFxuICAgKiDri6jsnbwg7KGw7ZqM7JmAIOydvOq0hCDsobDtmozsnZgg7ZW07ISd7J20IOqwiOudvOyngOyngCDslYrsirXri4jri6QuIOyghOyytCDsobDtmowg7Iuc7JeQ64qUIO2FjOydtOu4lOuniOuLpCA067KI7JSpXG4gICAqIOyZleuzte2VmOuKlCDrjIDsi6Ag7KKF66WY67OE66GcIO2VnCDrsojslKnrp4wg64+M6riwIOuVjOusuOyXkCwg7JuQ6rKpIERC7JeQ7IScIOyZleuztSDruYTsmqnsnbQg7YGs6rKMIOykhOyWtOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZFRhYmxlcyhcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUYWJsZVNjaGVtYVJvd3M+PiB7XG4gICAgY29uc3QgYmluZGluZ3MgPSB0YWJsZU5hbWUgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RhYmxlTmFtZSwgdGFibGVOYW1lLCB0YWJsZU5hbWVdO1xuICAgIGNvbnN0IHRhYmxlRmlsdGVyID0gKGNvbHVtbjogc3RyaW5nKSA9PiAodGFibGVOYW1lID09PSB1bmRlZmluZWQgPyBcIlwiIDogYEFORCAke2NvbHVtbn0gPSA/YCk7XG5cbiAgICAvLyBDb2x1bW5zIOyhsO2ajCAoR2VuZXJhdGVkIENvbHVtbiDsoJXrs7Qg7Y+s7ZWoKVxuICAgIGNvbnN0IGNvbHVtbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjLnRhYmxlX25hbWUsXG4gICAgICAgIGMuY29sdW1uX25hbWUsXG4gICAgICAgIGMuZGF0YV90eXBlLFxuICAgICAgICBjLnVkdF9uYW1lLFxuICAgICAgICBDT0FMRVNDRShcbiAgICAgICAgICBjLmNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgICBDQVNFIFdIRU4gYy5kYXRhX3R5cGUgPSAnQVJSQVknIEFORCBhLmF0dHR5cG1vZCA+IDBcbiAgICAgICAgICAgIFRIRU4gYS5hdHR0eXBtb2QgLSA0XG4gICAgICAgICAgICBFTFNFIE5VTExcbiAgICAgICAgICBFTkRcbiAgICAgICAgKSBBUyBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgIENPQUxFU0NFKGMuZGF0ZXRpbWVfcHJlY2lzaW9uLCBjLm51bWVyaWNfcHJlY2lzaW9uKSBBUyBwcmVjaXNpb24sXG4gICAgICAgIGMubnVtZXJpY19zY2FsZSxcbiAgICAgICAgYy5pc19udWxsYWJsZSxcbiAgICAgICAgYy5jb2x1bW5fZGVmYXVsdCxcbiAgICAgICAgQ09BTEVTQ0UoYS5hdHRnZW5lcmF0ZWQsICcnKSBhcyBpc19nZW5lcmF0ZWQsXG4gICAgICAgIGMuZ2VuZXJhdGlvbl9leHByZXNzaW9uXG4gICAgICBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5jb2x1bW5zIGNcbiAgICAgIExFRlQgSk9JTiBwZ19hdHRyaWJ1dGUgYSBPTiBhLmF0dG5hbWUgPSBjLmNvbHVtbl9uYW1lXG4gICAgICAgIEFORCBhLmF0dHJlbGlkID0gKFxuICAgICAgICAgIFNFTEVDVCBvaWQgRlJPTSBwZ19jbGFzcyBXSEVSRSByZWxuYW1lID0gYy50YWJsZV9uYW1lXG4gICAgICAgICAgQU5EIHJlbG5hbWVzcGFjZSA9IChTRUxFQ1Qgb2lkIEZST00gcGdfbmFtZXNwYWNlIFdIRVJFIG5zcG5hbWUgPSBjLnRhYmxlX3NjaGVtYSlcbiAgICAgICAgKVxuICAgICAgV0hFUkUgYy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgICAgICAke3RhYmxlRmlsdGVyKFwiYy50YWJsZV9uYW1lXCIpfVxuICAgICAgT1JERVIgQlkgYy50YWJsZV9uYW1lLCBjLm9yZGluYWxfcG9zaXRpb25cbiAgICBgO1xuXG4gICAgLy8gSW5kZXhlcyDsobDtmowgKFBHcm9vbmdhIO2RnO2YhOyLnSDsnbjrjbHsiqQg7Y+s7ZWoKVxuICAgIGNvbnN0IGluZGV4ZXNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICAgIHQucmVsbmFtZSBBUyB0YWJsZV9uYW1lLFxuICAgICAgICAgIGkucmVsbmFtZSBBUyBpbmRleF9uYW1lLFxuICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgV0hFTiBhbS5hbW5hbWUgPSAncGdyb29uZ2EnIEFORCB1LmF0dG51bSA9IDAgVEhFTlxuICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFRSSU0ocGdyb29uZ2FfY29sLmNvbHVtbl9leHByKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJzo6dGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICdbKCldJyxcbiAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAnZydcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgRUxTRSBhLmF0dG5hbWVcbiAgICAgICAgICBFTkQgQVMgY29sdW1uX25hbWUsXG4gICAgICAgICAgaXguaW5kaXN1bmlxdWUgQVMgaXNfdW5pcXVlLFxuICAgICAgICAgIGl4LmluZGlzcHJpbWFyeSBBUyBpc19wcmltYXJ5LFxuICAgICAgICAgIGFtLmFtbmFtZSBBUyBpbmRleF90eXBlLFxuICAgICAgICAgIENPQUxFU0NFKCh1Lm9wdCAmIDIpID0gMiwgRkFMU0UpIEFTIG51bGxzX2ZpcnN0LFxuICAgICAgICAgIENBU0UgXG4gICAgICAgICAgICAgIFdIRU4gKHUub3B0ICYgMSkgPSAxIFRIRU4gJ0RFU0MnXG4gICAgICAgICAgICAgIEVMU0UgJ0FTQydcbiAgICAgICAgICBFTkQgQVMgc29ydF9vcmRlcixcbiAgICAgICAgICBpeC5pbmRudWxsc25vdGRpc3RpbmN0IEFTIG51bGxzX25vdF9kaXN0aW5jdCxcbiAgICAgICAgICB1Lm9yZCBBUyBjb2x1bW5fb3JkZXIsXG4gICAgICAgICAgcGdfZ2V0X2luZGV4ZGVmKGl4LmluZGV4cmVsaWQpIEFTIGluZGV4X2RlZmluaXRpb24sXG4gICAgICAgICAgcGdfZ2V0X2V4cHIoaXguaW5kcHJlZCwgaXguaW5kcmVsaWQpIEFTIHByZWRpY2F0ZVxuICAgICAgRlJPTSBwZ19jbGFzcyB0XG4gICAgICBKT0lOIHBnX25hbWVzcGFjZSBucyBPTiBucy5vaWQgPSB0LnJlbG5hbWVzcGFjZVxuICAgICAgSk9JTiBwZ19pbmRleCBpeCBPTiB0Lm9pZCA9IGl4LmluZHJlbGlkXG4gICAgICBKT0lOIHBnX2NsYXNzIGkgT04gaS5vaWQgPSBpeC5pbmRleHJlbGlkXG4gICAgICBKT0lOIHBnX2FtIGFtIE9OIGkucmVsYW0gPSBhbS5vaWRcbiAgICAgIEpPSU4gTEFURVJBTCB1bm5lc3QoaXguaW5ka2V5LCBpeC5pbmRvcHRpb24pXG4gICAgICAgICAgV0lUSCBPUkRJTkFMSVRZIEFTIHUoYXR0bnVtLCBvcHQsIG9yZCkgT04gdHJ1ZVxuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0cmVsaWQgPSB0Lm9pZCBcbiAgICAgICAgICBBTkQgYS5hdHRudW0gPSB1LmF0dG51bSBcbiAgICAgICAgICBBTkQgdS5hdHRudW0gPiAwXG4gICAgICBMRUZUIEpPSU4gTEFURVJBTCAoXG4gICAgICAgICAgLS0gUEdyb29uZ2Eg7ZGc7ZiE7IudIOyduOuNseyKpOuKlCDrqqjrk6Ag7ZaJ7J2YIGF0dG51beydtCAw7J206528IHUub3Jk6rCAIOqwmeuLpC5cbiAgICAgICAgICAtLSDtkZztmITsi50g67Cw7Je07J2YIOyInOuyiChleHByX29yZCnsnYQg7ZWo6ruYIOu9keyVhCDsoJXroKzsnYQg7ZmV7KCV7ZWc64ukLlxuICAgICAgICAgIFNFTEVDVCBleHByLmNvbHVtbl9leHByLCBleHByLmV4cHJfb3JkXG4gICAgICAgICAgRlJPTSB1bm5lc3QoXG4gICAgICAgICAgICAgICAgICBDQVNFXG4gICAgICAgICAgICAgICAgICAgICAgV0hFTiBwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpIH4gJ15BUlJBWVxcXFxbJyBUSEVOXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190b19hcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4cF9yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15BUlJBWVxcXFxbKC4qKVxcXFxdJCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFwxJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIEVMU0VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlbcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKV1cbiAgICAgICAgICAgICAgICAgIEVORFxuICAgICAgICAgICAgICApIFdJVEggT1JESU5BTElUWSBBUyBleHByKGNvbHVtbl9leHByLCBleHByX29yZClcbiAgICAgICkgcGdyb29uZ2FfY29sIE9OIGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMFxuICAgICAgV0hFUkUgdC5yZWxraW5kID0gJ3InXG4gICAgICAgICAgQU5EIG5zLm5zcG5hbWUgPSAncHVibGljJ1xuICAgICAgICAgICR7dGFibGVGaWx0ZXIoXCJ0LnJlbG5hbWVcIil9XG4gICAgICAgICAgQU5EICh1LmF0dG51bSA+IDAgT1IgKGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCkpXG4gICAgICBPUkRFUiBCWSB0LnJlbG5hbWUsIGkucmVsbmFtZSwgdS5vcmQsIHBncm9vbmdhX2NvbC5leHByX29yZDtcbmA7XG5cbiAgICAvLyBGb3JlaWduIEtleXMg7KGw7ZqMXG4gICAgLy9cbiAgICAvLyBpbmZvcm1hdGlvbl9zY2hlbWEodGFibGVfY29uc3RyYWludHMgw5cga2V5X2NvbHVtbl91c2FnZSDDlyBjb25zdHJhaW50X2NvbHVtbl91c2FnZVxuICAgIC8vIMOXIHJlZmVyZW50aWFsX2NvbnN0cmFpbnRzKSA07KSRIOyhsOyduCDrjIDsi6AgcGdfY29uc3RyYWludOulvCDsp4HsoJEg7J2964qU64ukLlxuICAgIC8vIGNvbnN0cmFpbnRfY29sdW1uX3VzYWdl64qUIOu3sCDslYjsnLzroZwg7YWM7J2067iUIO2VhO2EsOqwgCDrsIDroKTrk6TslrTqsIDsp4Ag7JWK7JWEIERCIOyghOyytOydmFxuICAgIC8vIOygnOyVveyhsOqxtOydhCDtm5HripTri6QuIOygnOyVveydtCDsobDquIjrp4wg66eO7JWE7KC464+EIO2FjOydtOu4lCDtlZjrgpgg7KGw7ZqM7JeQIDHstIgg7J207IOBIOqxuOumrOqzoCxcbiAgICAvLyDruYTqtZDripQg7YWM7J2067iU66eI64ukIOydtCDsv7zrpqzrpbwg64+M66as66+A66GcIOyghOyytCDshozsmpTqsIAg6riJ6rKp7Z6IIOy7pOynhOuLpC5cbiAgICAvLyBjb250eXBlPSdmJyDsnbjrjbHsiqQg7Iqk7LqU7Jy866GcIOuwlOq+uOuptCBOT1QgTlVMTCDsoJzslb0oUEcgMTcr7JeQ7IScIHBnX2NvbnN0cmFpbnTsl5BcbiAgICAvLyDquLDroZ3rkJzri6QpIOuTseydhCDslYTsmIgg6rG064SI65u064ukLlxuICAgIC8vXG4gICAgLy8gY29ua2V5L2NvbmZrZXnripQg7Lus65+8IOyInOyEnOulvCDri7TsnYAg67Cw7Je07J2066+A66GcIFdJVEggT1JESU5BTElUWeuhnCDqsJnsnYAg7Iic67KI64G866asXG4gICAgLy8g7Ked7KeA7Ja07JW8IOuzte2VqSBGS+yXkOyEnCDsu6zrn7wg64yA7J2R7J20IOyWtOq4i+uCmOyngCDslYrripTri6QuXG4gICAgY29uc3QgZm9yZWlnbnNRdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjbC5yZWxuYW1lIEFTIHRhYmxlX25hbWUsXG4gICAgICAgIGNvbi5jb25uYW1lIEFTIGNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAgYXR0LmF0dG5hbWUgQVMgY29sdW1uX25hbWUsXG4gICAgICAgIHJlZl9jbC5yZWxuYW1lIEFTIGZvcmVpZ25fdGFibGVfbmFtZSxcbiAgICAgICAgcmVmX2F0dC5hdHRuYW1lIEFTIGZvcmVpZ25fY29sdW1uX25hbWUsXG4gICAgICAgIENBU0UgY29uLmNvbmZ1cGR0eXBlXG4gICAgICAgICAgV0hFTiAnYScgVEhFTiAnTk8gQUNUSU9OJ1xuICAgICAgICAgIFdIRU4gJ3InIFRIRU4gJ1JFU1RSSUNUJ1xuICAgICAgICAgIFdIRU4gJ2MnIFRIRU4gJ0NBU0NBREUnXG4gICAgICAgICAgV0hFTiAnbicgVEhFTiAnU0VUIE5VTEwnXG4gICAgICAgICAgV0hFTiAnZCcgVEhFTiAnU0VUIERFRkFVTFQnXG4gICAgICAgIEVORCBBUyB1cGRhdGVfcnVsZSxcbiAgICAgICAgQ0FTRSBjb24uY29uZmRlbHR5cGVcbiAgICAgICAgICBXSEVOICdhJyBUSEVOICdOTyBBQ1RJT04nXG4gICAgICAgICAgV0hFTiAncicgVEhFTiAnUkVTVFJJQ1QnXG4gICAgICAgICAgV0hFTiAnYycgVEhFTiAnQ0FTQ0FERSdcbiAgICAgICAgICBXSEVOICduJyBUSEVOICdTRVQgTlVMTCdcbiAgICAgICAgICBXSEVOICdkJyBUSEVOICdTRVQgREVGQVVMVCdcbiAgICAgICAgRU5EIEFTIGRlbGV0ZV9ydWxlXG4gICAgICBGUk9NIHBnX2NvbnN0cmFpbnQgY29uXG4gICAgICBKT0lOIHBnX2NsYXNzIGNsIE9OIGNsLm9pZCA9IGNvbi5jb25yZWxpZFxuICAgICAgSk9JTiBwZ19uYW1lc3BhY2UgbnMgT04gbnMub2lkID0gY2wucmVsbmFtZXNwYWNlXG4gICAgICBKT0lOIHBnX2NsYXNzIHJlZl9jbCBPTiByZWZfY2wub2lkID0gY29uLmNvbmZyZWxpZFxuICAgICAgSk9JTiBMQVRFUkFMIHVubmVzdChjb24uY29ua2V5KSBXSVRIIE9SRElOQUxJVFkgQVMga2V5X2NvbChhdHRudW0sIG9yZCkgT04gdHJ1ZVxuICAgICAgSk9JTiBMQVRFUkFMIHVubmVzdChjb24uY29uZmtleSkgV0lUSCBPUkRJTkFMSVRZIEFTIHJlZl9rZXlfY29sKGF0dG51bSwgb3JkKVxuICAgICAgICBPTiByZWZfa2V5X2NvbC5vcmQgPSBrZXlfY29sLm9yZFxuICAgICAgSk9JTiBwZ19hdHRyaWJ1dGUgYXR0XG4gICAgICAgIE9OIGF0dC5hdHRyZWxpZCA9IGNsLm9pZCBBTkQgYXR0LmF0dG51bSA9IGtleV9jb2wuYXR0bnVtXG4gICAgICBKT0lOIHBnX2F0dHJpYnV0ZSByZWZfYXR0XG4gICAgICAgIE9OIHJlZl9hdHQuYXR0cmVsaWQgPSByZWZfY2wub2lkIEFORCByZWZfYXR0LmF0dG51bSA9IHJlZl9rZXlfY29sLmF0dG51bVxuICAgICAgV0hFUkUgY29uLmNvbnR5cGUgPSAnZidcbiAgICAgICAgQU5EIG5zLm5zcG5hbWUgPSAncHVibGljJ1xuICAgICAgICAke3RhYmxlRmlsdGVyKFwiY2wucmVsbmFtZVwiKX1cbiAgICAgIE9SREVSIEJZIGNsLnJlbG5hbWUsIGNvbi5jb25uYW1lLCBrZXlfY29sLm9yZFxuICAgIGA7XG5cbiAgICAvLyDsooXrpZjrs4TroZwg7ZWcIOuyiOyUqeunjCDsobDtmoztlZwg65KkIO2FjOydtOu4lOuqheycvOuhnCDrrLbsirXri4jri6QuXG4gICAgY29uc3QgW2NvbHVtblJvd3MsIGluZGV4Um93cywgZm9yZWlnblJvd3NdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgY29tcGFyZURCXG4gICAgICAgIC5yYXcoY29sdW1uc1F1ZXJ5LCBiaW5kaW5ncy5zbGljZSgwLCAxKSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdDogeyByb3dzOiAoUGdDb2x1bW4gJiB7IHRhYmxlX25hbWU6IHN0cmluZyB9KVtdIH0pID0+IHJlc3VsdC5yb3dzKSxcbiAgICAgIGNvbXBhcmVEQlxuICAgICAgICAucmF3KGluZGV4ZXNRdWVyeSwgYmluZGluZ3Muc2xpY2UoMSwgMikpXG4gICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcm93czogKFBnSW5kZXggJiB7IHRhYmxlX25hbWU6IHN0cmluZyB9KVtdIH0pID0+IHJlc3VsdC5yb3dzKSxcbiAgICAgIGNvbXBhcmVEQlxuICAgICAgICAucmF3KGZvcmVpZ25zUXVlcnksIGJpbmRpbmdzLnNsaWNlKDIsIDMpKVxuICAgICAgICAudGhlbigocmVzdWx0OiB7IHJvd3M6IChQZ0ZvcmVpZ24gJiB7IHRhYmxlX25hbWU6IHN0cmluZyB9KVtdIH0pID0+IHJlc3VsdC5yb3dzKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHRhYmxlcyA9IG5ldyBNYXA8c3RyaW5nLCBUYWJsZVNjaGVtYVJvd3M+KCk7XG4gICAgY29uc3QgZW5zdXJlID0gKHRhYmxlOiBzdHJpbmcpOiBUYWJsZVNjaGVtYVJvd3MgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0YWJsZXMuZ2V0KHRhYmxlKTtcbiAgICAgIGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IFRhYmxlU2NoZW1hUm93cyA9IHsgY29sdW1uczogW10sIGluZGV4ZXM6IFtdLCBmb3JlaWduczogW10gfTtcbiAgICAgIHRhYmxlcy5zZXQodGFibGUsIGNyZWF0ZWQpO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcblxuICAgIC8vIOy7rOufvOydtCDsl4bripQg7YWM7J2067iU7J2AIOyhtOyerO2VmOyngCDslYrripQg6rKD7Jy866GcIOy3qOq4ie2VmOuvgOuhnCDsu6zrn7wg6riw7KSA7Jy866GcIO2VreuqqeydhCDrp4zrk63ri4jri6QuXG4gICAgZm9yIChjb25zdCByb3cgb2YgY29sdW1uUm93cykge1xuICAgICAgZW5zdXJlKHJvdy50YWJsZV9uYW1lKS5jb2x1bW5zLnB1c2gocm93KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb3cgb2YgaW5kZXhSb3dzKSB7XG4gICAgICB0YWJsZXMuZ2V0KHJvdy50YWJsZV9uYW1lKT8uaW5kZXhlcy5wdXNoKHJvdyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgcm93IG9mIGZvcmVpZ25Sb3dzKSB7XG4gICAgICB0YWJsZXMuZ2V0KHJvdy50YWJsZV9uYW1lKT8uZm9yZWlnbnMucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZXM7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVNaWdyYXRpb25JbmRleFR5cGUoXG4gICAgaW5kZXg6IFBpY2s8UGdJbmRleCwgXCJpc191bmlxdWVcIiB8IFwiaW5kZXhfdHlwZVwiPixcbiAgICBhY2Nlc3NNZXRob2Q/OiBzdHJpbmcsXG4gICk6IE1pZ3JhdGlvbkluZGV4W1widHlwZVwiXSB7XG4gICAgY29uc3QgcmVzb2x2ZWRBY2Nlc3NNZXRob2QgPSAoYWNjZXNzTWV0aG9kID8/IGluZGV4LmluZGV4X3R5cGUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAocmVzb2x2ZWRBY2Nlc3NNZXRob2QgPT09IFwiaG5zd1wiIHx8IHJlc29sdmVkQWNjZXNzTWV0aG9kID09PSBcIml2ZmZsYXRcIikge1xuICAgICAgcmV0dXJuIHJlc29sdmVkQWNjZXNzTWV0aG9kO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleC5pc191bmlxdWUgPyBcInVuaXF1ZVwiIDogXCJpbmRleFwiO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlR2VuZXJpY1VzaW5nKFxuICAgIGFjY2Vzc01ldGhvZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBNaWdyYXRpb25JbmRleFtcInVzaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2Vzc01ldGhvZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0gYWNjZXNzTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCF0aGlzLmdlbmVyaWNJbmRleFR5cGVzLmhhcyhub3JtYWxpemVkKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gLyogU0FGRVRZOiBLbmV47JmAIFBvc3RncmVTUUwg7Iqk7YKk66eIIOyhsO2ajCDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBub3JtYWxpemVkIGFzIE1pZ3JhdGlvbkluZGV4W1widXNpbmdcIl07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmVjdG9ySW5kZXhPcHRpb25zKFxuICAgIHR5cGU6IE1pZ3JhdGlvbkluZGV4W1widHlwZVwiXSxcbiAgICB3aXRoT3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgKTogUGljazxNaWdyYXRpb25JbmRleCwgXCJtXCIgfCBcImVmQ29uc3RydWN0aW9uXCIgfCBcImxpc3RzXCI+IHtcbiAgICBpZiAodHlwZSA9PT0gXCJobnN3XCIpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IFBpY2s8TWlncmF0aW9uSW5kZXgsIFwibVwiIHwgXCJlZkNvbnN0cnVjdGlvblwiPiA9IHt9O1xuICAgICAgY29uc3QgbSA9IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLm0pO1xuICAgICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5lZl9jb25zdHJ1Y3Rpb24pO1xuICAgICAgaWYgKG0gIT09IHVuZGVmaW5lZCkgb3B0aW9ucy5tID0gbTtcbiAgICAgIGlmIChlZkNvbnN0cnVjdGlvbiAhPT0gdW5kZWZpbmVkKSBvcHRpb25zLmVmQ29uc3RydWN0aW9uID0gZWZDb25zdHJ1Y3Rpb247XG4gICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJpdmZmbGF0XCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlSW50ZWdlck9wdGlvbih3aXRoT3B0aW9ucy5saXN0cykgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgbGlzdHM6IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmxpc3RzKSB9XG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUludGVnZXJPcHRpb24odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHBhcnNlZCkgPyB1bmRlZmluZWQgOiBwYXJzZWQ7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RJbmRleENvbHVtbk9wY2xhc3MoY29sdW1uRGVmaW5pdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWNvbHVtbkRlZmluaXRpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZCA9IGNvbHVtbkRlZmluaXRpb25cbiAgICAgIC5yZXBsYWNlKC9cXHMrTlVMTFNcXHMrKEZJUlNUfExBU1QpXFxzKiQvaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9cXHMrKEFTQ3xERVNDKVxccyokL2ksIFwiXCIpXG4gICAgICAudHJpbSgpO1xuICAgIGNvbnN0IHRva2VucyA9IHRoaXMudG9rZW5pemVUb3BMZXZlbCh0cmltbWVkKTtcblxuICAgIGlmICh0b2tlbnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAyXT8udG9VcHBlckNhc2UoKSA9PT0gXCJDT0xMQVRFXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2Vucy5hdCgtMSk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5kZXhEZWZpbml0aW9uKGluZGV4RGVmaW5pdGlvbjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzTWV0aG9kID0gaW5kZXhEZWZpbml0aW9uLm1hdGNoKC9cXGJVU0lOR1xccysoW2Etel9dW1xcd10qKS9pKT8uWzFdPy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHVzaW5nTWF0Y2hJbmRleCA9IGluZGV4RGVmaW5pdGlvbi5zZWFyY2goL1xcYlVTSU5HXFxiL2kpO1xuICAgIGNvbnN0IGNvbHVtbnNTdGFydCA9IHVzaW5nTWF0Y2hJbmRleCA+PSAwID8gaW5kZXhEZWZpbml0aW9uLmluZGV4T2YoXCIoXCIsIHVzaW5nTWF0Y2hJbmRleCkgOiAtMTtcbiAgICBjb25zdCBjb2x1bW5zRW5kID1cbiAgICAgIGNvbHVtbnNTdGFydCA+PSAwID8gdGhpcy5maW5kTWF0Y2hpbmdQYXJlbnRoZXNpcyhpbmRleERlZmluaXRpb24sIGNvbHVtbnNTdGFydCkgOiAtMTtcbiAgICBjb25zdCBjb2x1bW5EZWZpbml0aW9ucyA9XG4gICAgICBjb2x1bW5zU3RhcnQgPj0gMCAmJiBjb2x1bW5zRW5kID4gY29sdW1uc1N0YXJ0XG4gICAgICAgID8gdGhpcy5zcGxpdFRvcExldmVsKGluZGV4RGVmaW5pdGlvbi5zbGljZShjb2x1bW5zU3RhcnQgKyAxLCBjb2x1bW5zRW5kKSwgXCIsXCIpXG4gICAgICAgIDogW107XG5cbiAgICBjb25zdCB3aXRoTWF0Y2ggPSAvXFxiV0lUSFxccypcXCgvaS5leGVjKGluZGV4RGVmaW5pdGlvbik7XG4gICAgY29uc3Qgd2l0aFN0YXJ0ID0gd2l0aE1hdGNoID8gaW5kZXhEZWZpbml0aW9uLmluZGV4T2YoXCIoXCIsIHdpdGhNYXRjaC5pbmRleCkgOiAtMTtcbiAgICBjb25zdCB3aXRoRW5kID0gd2l0aFN0YXJ0ID49IDAgPyB0aGlzLmZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKGluZGV4RGVmaW5pdGlvbiwgd2l0aFN0YXJ0KSA6IC0xO1xuICAgIGNvbnN0IHdpdGhPcHRpb25zID1cbiAgICAgIHdpdGhTdGFydCA+PSAwICYmIHdpdGhFbmQgPiB3aXRoU3RhcnRcbiAgICAgICAgPyB0aGlzLnBhcnNlSW5kZXhPcHRpb25FbnRyaWVzKGluZGV4RGVmaW5pdGlvbi5zbGljZSh3aXRoU3RhcnQgKyAxLCB3aXRoRW5kKSlcbiAgICAgICAgOiB7fTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY2Nlc3NNZXRob2QsXG4gICAgICBjb2x1bW5EZWZpbml0aW9ucyxcbiAgICAgIHdpdGhPcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW5kZXhPcHRpb25FbnRyaWVzKG9wdGlvblNvdXJjZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRUb3BMZXZlbChvcHRpb25Tb3VyY2UsIFwiLFwiKS5yZWR1Y2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKHJlc3VsdCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSBlbnRyeS50cmltKCkubWF0Y2goL14oW2Etel9dW1xcd10qKVxccyo9XFxzKiguKykkL2kpO1xuICAgICAgaWYgKCFtYXRjaGVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFssIGtleSwgcmF3VmFsdWVdID0gbWF0Y2hlZDtcbiAgICAgIHJlc3VsdFtrZXkudG9Mb3dlckNhc2UoKV0gPSByYXdWYWx1ZS50cmltKCkucmVwbGFjZSgvXlsnXCJdfFsnXCJdJC9nLCBcIlwiKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdFRvcExldmVsKHNvdXJjZTogc3RyaW5nLCBkZWxpbWl0ZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBpdGVtczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgYnJhY2tldERlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICBjb25zdCBuZXh0Q2hhciA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgICBpZiAoY2hhciA9PT0gXCInXCIgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluU2luZ2xlUXVvdGUgJiYgbmV4dENoYXIgPT09IFwiJ1wiKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpblNpbmdsZVF1b3RlID0gIWluU2luZ2xlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1wiJyAmJiAhaW5TaW5nbGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5Eb3VibGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gJ1wiJykge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5Eb3VibGVRdW90ZSA9ICFpbkRvdWJsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluU2luZ2xlUXVvdGUgfHwgaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgIHBhcmVuRGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCIpXCIpIHtcbiAgICAgICAgcGFyZW5EZXB0aCAtPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIltcIikge1xuICAgICAgICBicmFja2V0RGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gXCJdXCIpIHtcbiAgICAgICAgYnJhY2tldERlcHRoIC09IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gZGVsaW1pdGVyICYmIHBhcmVuRGVwdGggPT09IDAgJiYgYnJhY2tldERlcHRoID09PSAwKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goc291cmNlLnNsaWNlKHN0YXJ0LCBpbmRleCkudHJpbSgpKTtcbiAgICAgICAgc3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFpbCA9IHNvdXJjZS5zbGljZShzdGFydCkudHJpbSgpO1xuICAgIGlmICh0YWlsLmxlbmd0aCA+IDApIHtcbiAgICAgIGl0ZW1zLnB1c2godGFpbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2tlbml6ZVRvcExldmVsKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRva2Vuczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc3RhcnQgPSAtMTtcbiAgICBsZXQgcGFyZW5EZXB0aCA9IDA7XG4gICAgbGV0IGJyYWNrZXREZXB0aCA9IDA7XG4gICAgbGV0IGluU2luZ2xlUXVvdGUgPSBmYWxzZTtcbiAgICBsZXQgaW5Eb3VibGVRdW90ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgcHVzaFRva2VuID0gKGVuZEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IHNvdXJjZS5zbGljZShzdGFydCwgZW5kSW5kZXgpLnRyaW0oKTtcbiAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gLTE7XG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWluU2luZ2xlUXVvdGUgJiYgIWluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKFwiKSB7XG4gICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW5EZXB0aCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICAgIHBhcmVuRGVwdGggLT0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCJbXCIpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmFja2V0RGVwdGggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gXCJdXCIpIHtcbiAgICAgICAgICBicmFja2V0RGVwdGggLT0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXFxzLy50ZXN0KGNoYXIpICYmIHBhcmVuRGVwdGggPT09IDAgJiYgYnJhY2tldERlcHRoID09PSAwKSB7XG4gICAgICAgICAgcHVzaFRva2VuKGluZGV4KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHVzaFRva2VuKHNvdXJjZS5sZW5ndGgpO1xuICAgIHJldHVybiB0b2tlbnM7XG4gIH1cblxuICBwcml2YXRlIGZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKHNvdXJjZTogc3RyaW5nLCBvcGVuSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IG9wZW5JbmRleDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5TaW5nbGVRdW90ZSB8fCBpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgZGVwdGggKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIO2FjOydtOu4lOydmCBQS+ulvCDssLjsobDtlZjripQg64uk66W4IO2FjOydtOu4lOydmCBGSyDrqqnroZ3snYQg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBQSyDtg4DsnoUg67OA6rK9IOyLnCDqtIDroKggRksg7KCc7JW97KGw6rG07J2EIOyCreygnC/rs7XqtaztlZjquLAg7JyE7ZW0IOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdldFJlZmVyZW5jaW5nRm9yZWlnbktleXMoZGI6IEtuZXgsIHRhYmxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxSZWZlcmVuY2luZ0ZvcmVpZ25LZXlbXT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIHRjLnRhYmxlX25hbWUsXG4gICAgICAgIHRjLmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAga2N1LmNvbHVtbl9uYW1lLFxuICAgICAgICBjY3UudGFibGVfbmFtZSBBUyByZWZlcmVuY2VkX3RhYmxlX25hbWUsXG4gICAgICAgIGNjdS5jb2x1bW5fbmFtZSBBUyByZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICByYy51cGRhdGVfcnVsZSxcbiAgICAgICAgcmMuZGVsZXRlX3J1bGVcbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlX2NvbnN0cmFpbnRzIEFTIHRjXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5rZXlfY29sdW1uX3VzYWdlIEFTIGtjdVxuICAgICAgICBPTiB0Yy5jb25zdHJhaW50X25hbWUgPSBrY3UuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSBrY3UudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5jb25zdHJhaW50X2NvbHVtbl91c2FnZSBBUyBjY3VcbiAgICAgICAgT04gY2N1LmNvbnN0cmFpbnRfbmFtZSA9IHRjLmNvbnN0cmFpbnRfbmFtZVxuICAgICAgICBBTkQgY2N1LnRhYmxlX3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgSk9JTiBpbmZvcm1hdGlvbl9zY2hlbWEucmVmZXJlbnRpYWxfY29uc3RyYWludHMgQVMgcmNcbiAgICAgICAgT04gcmMuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCByYy5jb25zdHJhaW50X3NjaGVtYSA9IHRjLnRhYmxlX3NjaGVtYVxuICAgICAgV0hFUkUgdGMuY29uc3RyYWludF90eXBlID0gJ0ZPUkVJR04gS0VZJ1xuICAgICAgICBBTkQgY2N1LnRhYmxlX25hbWUgPSA/XG4gICAgICAgIEFORCB0Yy50YWJsZV9zY2hlbWEgPSAncHVibGljJ1xuICAgIGA7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5yYXcocXVlcnksIFt0YWJsZU5hbWVdKTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3MubWFwKFxuICAgICAgKHJvdzoge1xuICAgICAgICB0YWJsZV9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbnN0cmFpbnRfbmFtZTogc3RyaW5nO1xuICAgICAgICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX3RhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgcmVmZXJlbmNlZF9jb2x1bW5fbmFtZTogc3RyaW5nO1xuICAgICAgICB1cGRhdGVfcnVsZTogc3RyaW5nO1xuICAgICAgICBkZWxldGVfcnVsZTogc3RyaW5nO1xuICAgICAgfSkgPT4gKHtcbiAgICAgICAgdGFibGVOYW1lOiByb3cudGFibGVfbmFtZSxcbiAgICAgICAgY29uc3RyYWludE5hbWU6IHJvdy5jb25zdHJhaW50X25hbWUsXG4gICAgICAgIGNvbHVtbk5hbWU6IHJvdy5jb2x1bW5fbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZFRhYmxlTmFtZTogcm93LnJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWU6IHJvdy5yZWZlcmVuY2VkX2NvbHVtbl9uYW1lLFxuICAgICAgICBvblVwZGF0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKHJvdy51cGRhdGVfcnVsZSksXG4gICAgICAgIG9uRGVsZXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LmRlbGV0ZV9ydWxlKSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25z66W8IOyhsO2ajO2VqeuLiOuLpC5cbiAgICogcGdfYXR0cmlidXRl7J2YIGF0dHR5cG1vZOyXkOyEnCDssKjsm5Ag7IiY66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0VmVjdG9yRGltZW5zaW9ucyhcbiAgICBjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0VmVjdG9yRGltZW5zaW9uc0FsbChjb21wYXJlREIsIHRhYmxlTmFtZSkpLmdldCh0YWJsZU5hbWUpID8/IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9uc+ulvCDthYzsnbTruJTrs4TroZwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiB0YWJsZU5hbWXsnYQg7IOd65617ZWY66m0IHB1YmxpYyDsiqTtgqTrp4gg7KCE7LK066W8IO2VnCDrsojsl5Ag7KGw7ZqM7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWZWN0b3JEaW1lbnNpb25zQWxsKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lPzogc3RyaW5nLFxuICApOiBQcm9taXNlPE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+PiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgYy5yZWxuYW1lIGFzIHRhYmxlX25hbWUsXG4gICAgICAgIGEuYXR0bmFtZSBhcyBjb2x1bW5fbmFtZSxcbiAgICAgICAgYS5hdHR0eXBtb2QgYXMgZGltZW5zaW9uc1xuICAgICAgRlJPTSBwZ19hdHRyaWJ1dGUgYVxuICAgICAgSk9JTiBwZ19jbGFzcyBjIE9OIGEuYXR0cmVsaWQgPSBjLm9pZFxuICAgICAgSk9JTiBwZ19uYW1lc3BhY2UgbiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlXG4gICAgICBKT0lOIHBnX3R5cGUgdCBPTiBhLmF0dHR5cGlkID0gdC5vaWRcbiAgICAgIFdIRVJFIHQudHlwbmFtZSA9ICd2ZWN0b3InXG4gICAgICAgIEFORCBhLmF0dG51bSA+IDBcbiAgICAgICAgQU5EIG4ubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICR7dGFibGVOYW1lID09PSB1bmRlZmluZWQgPyBcIlwiIDogXCJBTkQgYy5yZWxuYW1lID0gP1wifVxuICAgIGA7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29tcGFyZURCLnJhdyhxdWVyeSwgdGFibGVOYW1lID09PSB1bmRlZmluZWQgPyBbXSA6IFt0YWJsZU5hbWVdKTtcblxuICAgIGNvbnN0IGRpbWVuc2lvbnNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0LnJvd3MpIHtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBkaW1lbnNpb25zQnlUYWJsZS5nZXQocm93LnRhYmxlX25hbWUpID8/IHt9O1xuICAgICAgLy8gYXR0dHlwbW9k7JeQ7IScIOyLpOygnCBkaW1lbnNpb25zIOqwkiDstpTstpxcbiAgICAgIGRpbWVuc2lvbnNbcm93LmNvbHVtbl9uYW1lXSA9IHJvdy5kaW1lbnNpb25zID4gMCA/IHJvdy5kaW1lbnNpb25zIDogMDtcbiAgICAgIGRpbWVuc2lvbnNCeVRhYmxlLnNldChyb3cudGFibGVfbmFtZSwgZGltZW5zaW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBkaW1lbnNpb25zQnlUYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoXsnYQg67aE7ISd7ZWY7JesIE1pZ3JhdGlvbkNvbHVtbiDqsJ3ssrTroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcmVzb2x2ZURCQ29sVHlwZShcbiAgICBkYkNvbHVtbjogUGdDb2x1bW4sXG4gICk6IFBpY2s8XG4gICAgTWlncmF0aW9uQ29sdW1uLFxuICAgIFwidHlwZVwiIHwgXCJsZW5ndGhcIiB8IFwicHJlY2lzaW9uXCIgfCBcInNjYWxlXCIgfCBcIm51bWJlclR5cGVcIiB8IFwiZGltZW5zaW9uc1wiXG4gID4ge1xuICAgIGNvbnN0IHsgdWR0X25hbWU6IF91ZHRfbmFtZSwgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLCBwcmVjaXNpb24sIG51bWVyaWNfc2NhbGUgfSA9IGRiQ29sdW1uO1xuXG4gICAgY29uc3QgeyB1ZHRfbmFtZSwgc2luZ2xlT3JBcnJheSB9ID0gKCgpID0+IHtcbiAgICAgIGlmIChfdWR0X25hbWUuc3RhcnRzV2l0aChcIl9cIikpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLnN1YnN0cmluZygxKSxcbiAgICAgICAgICBzaW5nbGVPckFycmF5OiBcIltdXCIgYXMgY29uc3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1ZHRfbmFtZTogX3VkdF9uYW1lLFxuICAgICAgICBzaW5nbGVPckFycmF5OiBcIlwiIGFzIGNvbnN0LFxuICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8gVVVJRFxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGB1dWlkJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBJbnRlZ2VyIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImludDRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYGludGVnZXIke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYmlnSW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gU3RyaW5nIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZhcmNoYXJcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYHN0cmluZyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4oY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoICYmIHtcbiAgICAgICAgICBsZW5ndGg6IGNoYXJhY3Rlcl9tYXhpbXVtX2xlbmd0aCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAgfTsgLy8gU3RyaW5nUHJvcCB3aXRob3V0IGxlbmd0aFxuICAgIH1cblxuICAgIC8vIE51bWJlck9yTnVtZXJpYyB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJudW1lcmljXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCxcbiAgICAgICAgbnVtYmVyVHlwZTogXCJudW1lcmljXCIsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiZcbiAgICAgICAgICBudW1lcmljX3NjYWxlICE9PSBudWxsICYmIHtcbiAgICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICAgICAgc2NhbGU6IG51bWVyaWNfc2NhbGUsXG4gICAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodWR0X25hbWUgPT09IFwiZmxvYXQ0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBudW1iZXJPck51bWVyaWMke3NpbmdsZU9yQXJyYXl9YCwgbnVtYmVyVHlwZTogXCJyZWFsXCIgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0OFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwiZG91YmxlIHByZWNpc2lvblwiIH07XG4gICAgfVxuXG4gICAgLy8gQm9vbGVhblxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJib29sXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBib29sZWFuJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBUaW1lc3RhbXB6IHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInRpbWVzdGFtcHR6XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IGBkYXRlJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihwcmVjaXNpb24gIT09IG51bGwgJiYge1xuICAgICAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgICB9KSxcbiAgICAgIH07IC8vIERhdGVQcm9wIOKGkiB0aW1lc3RhbXB0elxuICAgIH1cblxuICAgIC8vIEpTT05cbiAgICBpZiAodWR0X25hbWUgPT09IFwianNvblwiIHx8IHVkdF9uYW1lID09PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwianNvblwiIH07XG4gICAgfVxuXG4gICAgLy8gVmVjdG9yIChwZ3ZlY3RvcilcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmVjdG9yXCIpIHtcbiAgICAgIC8vIHZlY3RvciDtg4DsnoXsnZgg7LCo7JuQIOyImOuKlCBjb2x1bW5fZGVmYXVsdOuCmCDrs4Trj4Qg7L+866as66GcIO2ZleyduO2VtOyVvCDtlahcbiAgICAgIC8vIO2YhOyerOuKlCDquLDrs7jqsJIgMOycvOuhnCDshKTsoJUgKOyLpOygnCBkaW1lbnNpb25z64qUIGdldE1pZ3JhdGlvblNldEZyb21EQuyXkOyEnCDrs4Trj4Qg7L+866as66GcIO2ZleyduClcbiAgICAgIHJldHVybiB7IHR5cGU6IGB2ZWN0b3Ike3NpbmdsZU9yQXJyYXl9YCwgZGltZW5zaW9uczogMCB9O1xuICAgIH1cblxuICAgIC8vIHRzdmVjdG9yIChQb3N0Z3JlU1FMIOyghOusuCDqsoDsg4nsmqkg7YOA7J6FKVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRzdmVjdG9yXCIgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc29sdmUg67aI6rCA64ql7ZWcIFBvc3RncmVTUUwg7Lus65+8IO2DgOyehTogJHt1ZHRfbmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUG9zdGdyZVNRTFNjaGVtYVJlYWRlciA9IG5ldyBQb3N0Z3JlU1FMU2NoZW1hUmVhZGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0NBOEVNLDhCQUFOLE1BQWtDO0VBQ2hDLG9DQUFxQyxJQUFJLElBQUk7R0FBQztHQUFTO0dBQVE7R0FBTztHQUFRO0VBQVUsQ0FBQzs7Ozs7OztFQVF6RixNQUFNLHNCQUNKLFdBQ0EsT0FDOEI7R0FDOUIsSUFBSSxXQUF1QixXQUFzQjtHQUNqRCxJQUFJO0lBQ0YsQ0FBQyxXQUFXLFdBQVcsY0FBYyxNQUFNLEtBQUssVUFBVSxXQUFXLEtBQUs7R0FDNUUsU0FBUyxHQUFZO0lBQ25CLElBQUksYUFBYSxTQUFTLEVBQUUsUUFBUSxTQUFTLGlCQUFpQixHQUM1RCxPQUFPO0lBRVQsTUFBTTtHQUNSO0dBR0EsTUFBTSxtQkFBbUIsTUFBTSxLQUFLLG9CQUFvQixXQUFXLEtBQUs7R0FFeEUsT0FBTyxLQUFLLGtCQUFrQixPQUFPLFdBQVcsV0FBVyxZQUFZLGdCQUFnQjtFQUN6Rjs7Ozs7Ozs7Ozs7RUFZQSxNQUFNLHlCQUF5QixXQUErRDtHQUM1RixNQUFNLENBQUMsUUFBUSxvQkFBb0IsTUFBTSxRQUFRLElBQUksQ0FDbkQsS0FBSyxXQUFXLFNBQVMsR0FDekIsS0FBSyx1QkFBdUIsU0FBUyxDQUN2QyxDQUFDO0dBRUQsTUFBTSxnQ0FBZ0IsSUFBSSxJQUEwQjtHQUNwRCxLQUFLLE1BQU0sQ0FBQyxPQUFPLFNBQVMsUUFDMUIsY0FBYyxJQUNaLE9BQ0EsS0FBSyxrQkFDSCxPQUNBLEtBQUssU0FDTCxLQUFLLFNBQ0wsS0FBSyxVQUNMLGlCQUFpQixJQUFJLEtBQUssS0FBSyxDQUFDLENBQ2xDLENBQ0Y7R0FFRixPQUFPO0VBQ1Q7Ozs7OztFQU9BLGtCQUNFLE9BQ0EsV0FDQSxXQUNBLFlBQ0Esa0JBQ2M7R0FDZCxNQUFNLFVBQTZCLFVBQVUsS0FBSyxhQUFhO0lBQzdELE1BQU0sWUFBWSxLQUFLLGlCQUFpQixRQUFRO0lBR2hELElBQUksVUFBVSxTQUFTLFVBQ3JCLFVBQVUsYUFBYSxpQkFBaUIsU0FBUyxnQkFBZ0I7SUFHbkUsT0FBTztLQUNMLE1BQU0sU0FBUztLQUNmLFVBQVUsU0FBUyxnQkFBZ0I7S0FDbkMsR0FBRztLQUVILFVBQVU7TUFDUixJQUFJLFNBQVMsaUJBQWlCLE9BQU8sU0FBUyxpQkFBaUIsS0FDN0QsT0FBTyxFQUNMLFdBQVc7T0FDVCxNQUFNLFNBQVMsaUJBQWlCLE1BQU0sV0FBVztPQUNqRCxZQUFZLFNBQVMseUJBQXlCO01BQ2hELEVBQ0Y7TUFFRixPQUFPLENBQUM7S0FDVixFQUFBLENBQUc7S0FFSCxVQUFVO01BRVIsSUFBSSxTQUFTLGlCQUFpQixPQUFPLFNBQVMsaUJBQWlCLEtBQzdELE9BQU8sQ0FBQztNQUdWLElBQUksU0FBUyxtQkFBbUIsTUFBTTtPQUVwQyxJQUFJLGVBQWUsU0FBUztPQUc1QixJQUFJLGFBQWEsV0FBVyxVQUFVLEdBQ3BDLE9BQU8sQ0FBQztPQUlWLGVBQWUsYUFBYSxRQUFRLGVBQWUsRUFBRTtPQUdyRCxJQUFJLGFBQWEsV0FBVyxHQUFHLEtBQUssYUFBYSxTQUFTLEdBQUcsR0FDM0QsZUFBZSxhQUFhLFdBQVcsS0FBSyxJQUFHO09BR2pELE9BQU8sRUFDTCxXQUFXLGFBQ2I7TUFDRjtNQUNBLE9BQU8sQ0FBQztLQUNWLEVBQUEsQ0FBRztJQUNMO0dBQ0YsQ0FBQztHQUdELE1BQU0saUJBQWlCLE1BQ3JCLFVBQVUsUUFDUCxZQUNDLENBQUMsUUFBUSxjQUNULENBQUMsV0FBVyxNQUFNLGNBQWMsUUFBUSxXQUFXLFNBQVMsVUFBVSxlQUFlLENBQUMsQ0FDMUYsSUFDQyxZQUFZLFFBQVEsVUFDdkI7R0FHQSxNQUFNLFVBQTRCLENBQUM7R0FDbkMsS0FBSyxNQUFNLGFBQWEsT0FBTyxLQUFLLGNBQWMsR0FBRztJQUNuRCxNQUFNLGlCQUFpQixlQUFlLFVBQVUsRUFBRSxVQUMvQyxNQUFNLFVBQVUsS0FBSyxlQUFlLE1BQU0sWUFDN0M7SUFDQSxPQUFPLGNBQWM7SUFFckIsTUFBTSxhQUFhLGVBQWU7SUFDbEMsTUFBTSx3QkFBd0IsS0FBSyxxQkFBcUIsV0FBVyxnQkFBZ0I7SUFDbkYsTUFBTSxvQkFBb0IsS0FBSywwQkFDN0IsWUFDQSxzQkFBc0IsWUFDeEI7SUFDQSxNQUFNLFFBQVEsS0FBSyxvQkFDakIsc0JBQXNCLGdCQUFnQixXQUFXLFVBQ25EO0lBRUEsTUFBTSxlQUEwQyxDQUFDO0lBQ2pELEtBQUssTUFBTSxnQkFBZ0IsZ0JBQWdCO0tBQ3pDLE1BQU0sVUFBVSxLQUFLLDBCQUNuQixzQkFBc0Isa0JBQWtCLGFBQWEsZUFBZSxFQUN0RTtLQUNBLE1BQU0sU0FBNEMsRUFDaEQsTUFBTSxhQUFhLFlBQ3JCO0tBQ0EsSUFBSSxTQUNGLE9BQU8sT0FBTyxRQUFRLEVBQUUsUUFBUSxDQUFDO0tBRW5DLFFBQVEsT0FBUjtNQUNFLEtBQUs7T0FDSCxPQUFPLE9BQU8sUUFBUTtRQUNwQixXQUFXLGFBQWE7UUFDeEIsWUFBWSxhQUFhO09BQzNCLENBQUM7T0FDRDtLQUNKO0tBQ0EsYUFBYSxLQUFLLE1BQU07SUFDMUI7SUFDQSxNQUFNLFFBQXdCO0tBQzVCLE1BQU07S0FDTixNQUFNO0tBQ04sU0FBUztLQUNULGtCQUFrQixXQUFXO0tBQzdCLEdBQUcsS0FBSyx3QkFBd0IsbUJBQW1CLHNCQUFzQixXQUFXO0lBQ3RGO0lBQ0EsSUFBSSxXQUFXLFdBQ2IsTUFBTSxRQUFRLFdBQVc7SUFFM0IsSUFBSSxPQUNGLE1BQU0sUUFBUTtJQUVoQixRQUFRLEtBQUssS0FBSztHQUNwQjtHQVlBLE9BQU87SUFDTDtJQUNBO0lBQ0E7SUFDQSxVQWJtQyxXQUFXLEtBQUssY0FBYztLQUNqRSxPQUFPO01BQ0wsU0FBUyxDQUFDLFVBQVUsV0FBVztNQUMvQixJQUFJLEdBQUcsVUFBVSxtQkFBbUIsR0FBRyxVQUFVO01BQ2pELFVBQVUsS0FBSyxvQkFBb0IsVUFBVSxXQUFXO01BQ3hELFVBQVUsS0FBSyxvQkFBb0IsVUFBVSxXQUFXO0tBQzFEO0lBQ0YsQ0FNRTtHQUNGO0VBQ0Y7Ozs7RUFLQSxvQkFBNEIsUUFBNEI7R0FRdEQsd0JBQU8sSUFQZSxJQUF3QjtJQUM1QyxDQUFDLGFBQWEsV0FBVztJQUN6QixDQUFDLFlBQVksVUFBVTtJQUN2QixDQUFDLFdBQVcsU0FBUztJQUNyQixDQUFDLFlBQVksVUFBVTtJQUN2QixDQUFDLGVBQWUsYUFBYTtHQUMvQixDQUNPLEVBQUEsQ0FBVSxJQUFJLE1BQU0sS0FBSztFQUNsQzs7OztFQUtBLE1BQU0sVUFDSixXQUNBLFdBQytDO0dBRS9DLE1BQU0sUUFBTyxNQURRLEtBQUssV0FBVyxXQUFXLFNBQVMsRUFDNUMsQ0FBTyxJQUFJLFNBQVM7R0FDakMsSUFBSSxTQUFTLFFBQ1gsTUFBTSxJQUFJLE1BQU0sb0JBQW9CLFdBQVc7R0FFakQsT0FBTztJQUFDLEtBQUs7SUFBUyxLQUFLO0lBQVMsS0FBSztHQUFRO0VBQ25EOzs7Ozs7OztFQVNBLE1BQWMsV0FDWixXQUNBLFdBQ3VDO0dBQ3ZDLE1BQU0sV0FBVyxjQUFjLFNBQVksQ0FBQyxJQUFJO0lBQUM7SUFBVztJQUFXO0dBQVM7R0FDaEYsTUFBTSxlQUFlLFdBQW9CLGNBQWMsU0FBWSxLQUFLLE9BQU8sT0FBTztHQUd0RixNQUFNLGVBQWU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBMEJmLFlBQVksY0FBYyxFQUFFOzs7R0FLbEMsTUFBTSxlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUErRGIsWUFBWSxXQUFXLEVBQUU7Ozs7R0FpQmpDLE1BQU0sZ0JBQWdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBa0NoQixZQUFZLFlBQVksRUFBRTs7O0dBS2hDLE1BQU0sQ0FBQyxZQUFZLFdBQVcsZUFBZSxNQUFNLFFBQVEsSUFBSTtJQUM3RCxVQUNHLElBQUksY0FBYyxTQUFTLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUN2QyxNQUFNLFdBQTRELE9BQU8sSUFBSTtJQUNoRixVQUNHLElBQUksY0FBYyxTQUFTLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUN2QyxNQUFNLFdBQTJELE9BQU8sSUFBSTtJQUMvRSxVQUNHLElBQUksZUFBZSxTQUFTLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUN4QyxNQUFNLFdBQTZELE9BQU8sSUFBSTtHQUNuRixDQUFDO0dBRUQsTUFBTSx5QkFBUyxJQUFJLElBQTZCO0dBQ2hELE1BQU0sVUFBVSxVQUFtQztJQUNqRCxNQUFNLFdBQVcsT0FBTyxJQUFJLEtBQUs7SUFDakMsSUFBSSxhQUFhLFFBQ2YsT0FBTztJQUVULE1BQU0sVUFBMkI7S0FBRSxTQUFTLENBQUM7S0FBRyxTQUFTLENBQUM7S0FBRyxVQUFVLENBQUM7SUFBRTtJQUMxRSxPQUFPLElBQUksT0FBTyxPQUFPO0lBQ3pCLE9BQU87R0FDVDtHQUdBLEtBQUssTUFBTSxPQUFPLFlBQ2hCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUFRLEtBQUssR0FBRztHQUV6QyxLQUFLLE1BQU0sT0FBTyxXQUNoQixPQUFPLElBQUksSUFBSSxVQUFVLENBQUMsRUFBRSxRQUFRLEtBQUssR0FBRztHQUU5QyxLQUFLLE1BQU0sT0FBTyxhQUNoQixPQUFPLElBQUksSUFBSSxVQUFVLENBQUMsRUFBRSxTQUFTLEtBQUssR0FBRztHQUcvQyxPQUFPO0VBQ1Q7RUFFQSwwQkFDRSxPQUNBLGNBQ3dCO0dBQ3hCLE1BQU0sd0JBQXdCLGdCQUFnQixNQUFNLFdBQUEsQ0FBWSxZQUFZO0dBRTVFLElBQUkseUJBQXlCLFVBQVUseUJBQXlCLFdBQzlELE9BQU87R0FHVCxPQUFPLE1BQU0sWUFBWSxXQUFXO0VBQ3RDO0VBRUEsb0JBQ0UsY0FDcUM7R0FDckMsSUFBSSxDQUFDLGNBQ0g7R0FHRixNQUFNLGFBQWEsYUFBYSxZQUFZO0dBQzVDLElBQUksQ0FBQyxLQUFLLGtCQUFrQixJQUFJLFVBQVUsR0FDeEM7R0FHRixPQUFnRTtFQUNsRTtFQUVBLHdCQUNFLE1BQ0EsYUFDd0Q7R0FDeEQsSUFBSSxTQUFTLFFBQVE7SUFDbkIsTUFBTSxVQUF3RCxDQUFDO0lBQy9ELE1BQU0sSUFBSSxLQUFLLG1CQUFtQixZQUFZLENBQUM7SUFDL0MsTUFBTSxpQkFBaUIsS0FBSyxtQkFBbUIsWUFBWSxlQUFlO0lBQzFFLElBQUksTUFBTSxRQUFXLFFBQVEsSUFBSTtJQUNqQyxJQUFJLG1CQUFtQixRQUFXLFFBQVEsaUJBQWlCO0lBQzNELE9BQU87R0FDVDtHQUVBLElBQUksU0FBUyxXQUNYLE9BQU8sS0FBSyxtQkFBbUIsWUFBWSxLQUFLLE1BQU0sU0FDbEQsRUFBRSxPQUFPLEtBQUssbUJBQW1CLFlBQVksS0FBSyxFQUFFLElBQ3BELENBQUM7R0FHUCxPQUFPLENBQUM7RUFDVjtFQUVBLG1CQUEyQixPQUErQztHQUN4RSxJQUFJLENBQUMsT0FDSDtHQUdGLE1BQU0sU0FBUyxPQUFPLFNBQVMsT0FBTyxFQUFFO0dBQ3hDLE9BQU8sT0FBTyxNQUFNLE1BQU0sSUFBSSxTQUFZO0VBQzVDO0VBRUEsMEJBQWtDLGtCQUEwRDtHQUMxRixJQUFJLENBQUMsa0JBQ0g7R0FHRixNQUFNLFVBQVUsaUJBQ2IsUUFBUSxnQ0FBZ0MsRUFBRSxDQUFDLENBQzNDLFFBQVEsc0JBQXNCLEVBQUUsQ0FBQyxDQUNqQyxLQUFLO0dBQ1IsTUFBTSxTQUFTLEtBQUssaUJBQWlCLE9BQU87R0FFNUMsSUFBSSxPQUFPLFNBQVMsR0FDbEI7R0FHRixJQUFJLE9BQU8sT0FBTyxTQUFTLEVBQUUsRUFBRSxZQUFZLE1BQU0sV0FDL0M7R0FHRixPQUFPLE9BQU8sR0FBRyxFQUFFO0VBQ3JCO0VBRUEscUJBQTZCLGlCQUF5QjtHQUNwRCxNQUFNLGVBQWUsZ0JBQWdCLE1BQU0sMEJBQTBCLENBQUMsR0FBRyxFQUFFLEVBQUUsWUFBWTtHQUN6RixNQUFNLGtCQUFrQixnQkFBZ0IsT0FBTyxZQUFZO0dBQzNELE1BQU0sZUFBZSxtQkFBbUIsSUFBSSxnQkFBZ0IsUUFBUSxLQUFLLGVBQWUsSUFBSTtHQUM1RixNQUFNLGFBQ0osZ0JBQWdCLElBQUksS0FBSyx3QkFBd0IsaUJBQWlCLFlBQVksSUFBSTtHQUNwRixNQUFNLG9CQUNKLGdCQUFnQixLQUFLLGFBQWEsZUFDOUIsS0FBSyxjQUFjLGdCQUFnQixNQUFNLGVBQWUsR0FBRyxVQUFVLEdBQUcsR0FBRyxJQUMzRSxDQUFDO0dBRVAsTUFBTSxZQUFZLGVBQWUsS0FBSyxlQUFlO0dBQ3JELE1BQU0sWUFBWSxZQUFZLGdCQUFnQixRQUFRLEtBQUssVUFBVSxLQUFLLElBQUk7R0FDOUUsTUFBTSxVQUFVLGFBQWEsSUFBSSxLQUFLLHdCQUF3QixpQkFBaUIsU0FBUyxJQUFJO0dBTTVGLE9BQU87SUFDTDtJQUNBO0lBQ0EsYUFQQSxhQUFhLEtBQUssVUFBVSxZQUN4QixLQUFLLHdCQUF3QixnQkFBZ0IsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLElBQzFFLENBQUM7R0FNUDtFQUNGO0VBRUEsd0JBQWdDLGNBQThDO0dBQzVFLE9BQU8sS0FBSyxjQUFjLGNBQWMsR0FBRyxDQUFDLENBQUMsUUFBZ0MsUUFBUSxVQUFVO0lBQzdGLE1BQU0sVUFBVSxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sNkJBQTZCO0lBQ2hFLElBQUksQ0FBQyxTQUNILE9BQU87SUFHVCxNQUFNLEdBQUcsS0FBSyxZQUFZO0lBQzFCLE9BQU8sSUFBSSxZQUFZLEtBQUssU0FBUyxLQUFLLENBQUMsQ0FBQyxRQUFRLGdCQUFnQixFQUFFO0lBQ3RFLE9BQU87R0FDVCxHQUFHLENBQUMsQ0FBQztFQUNQO0VBRUEsY0FBc0IsUUFBZ0IsV0FBNkI7R0FDakUsTUFBTSxRQUFrQixDQUFDO0dBQ3pCLElBQUksUUFBUTtHQUNaLElBQUksYUFBYTtHQUNqQixJQUFJLGVBQWU7R0FDbkIsSUFBSSxnQkFBZ0I7R0FDcEIsSUFBSSxnQkFBZ0I7R0FFcEIsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLE9BQU8sUUFBUSxTQUFTLEdBQUc7SUFDckQsTUFBTSxPQUFPLE9BQU87SUFDcEIsTUFBTSxXQUFXLE9BQU8sUUFBUTtJQUVoQyxJQUFJLFNBQVMsT0FBTyxDQUFDLGVBQWU7S0FDbEMsSUFBSSxpQkFBaUIsYUFBYSxLQUFLO01BQ3JDLFNBQVM7TUFDVDtLQUNGO0tBQ0EsZ0JBQWdCLENBQUM7S0FDakI7SUFDRjtJQUVBLElBQUksU0FBUyxRQUFPLENBQUMsZUFBZTtLQUNsQyxJQUFJLGlCQUFpQixhQUFhLE1BQUs7TUFDckMsU0FBUztNQUNUO0tBQ0Y7S0FDQSxnQkFBZ0IsQ0FBQztLQUNqQjtJQUNGO0lBRUEsSUFBSSxpQkFBaUIsZUFDbkI7SUFHRixJQUFJLFNBQVMsS0FBSztLQUNoQixjQUFjO0tBQ2Q7SUFDRjtJQUNBLElBQUksU0FBUyxLQUFLO0tBQ2hCLGNBQWM7S0FDZDtJQUNGO0lBQ0EsSUFBSSxTQUFTLEtBQUs7S0FDaEIsZ0JBQWdCO0tBQ2hCO0lBQ0Y7SUFDQSxJQUFJLFNBQVMsS0FBSztLQUNoQixnQkFBZ0I7S0FDaEI7SUFDRjtJQUVBLElBQUksU0FBUyxhQUFhLGVBQWUsS0FBSyxpQkFBaUIsR0FBRztLQUNoRSxNQUFNLEtBQUssT0FBTyxNQUFNLE9BQU8sS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0tBQzVDLFFBQVEsUUFBUTtJQUNsQjtHQUNGO0dBRUEsTUFBTSxPQUFPLE9BQU8sTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO0dBQ3RDLElBQUksS0FBSyxTQUFTLEdBQ2hCLE1BQU0sS0FBSyxJQUFJO0dBR2pCLE9BQU87RUFDVDtFQUVBLGlCQUF5QixRQUEwQjtHQUNqRCxNQUFNLFNBQW1CLENBQUM7R0FDMUIsSUFBSSxRQUFRO0dBQ1osSUFBSSxhQUFhO0dBQ2pCLElBQUksZUFBZTtHQUNuQixJQUFJLGdCQUFnQjtHQUNwQixJQUFJLGdCQUFnQjtHQUVwQixNQUFNLGFBQWEsYUFBcUI7SUFDdEMsSUFBSSxRQUFRLEdBQ1Y7SUFHRixNQUFNLFFBQVEsT0FBTyxNQUFNLE9BQU8sUUFBUSxDQUFDLENBQUMsS0FBSztJQUNqRCxJQUFJLE1BQU0sU0FBUyxHQUNqQixPQUFPLEtBQUssS0FBSztJQUVuQixRQUFRO0dBQ1Y7R0FFQSxLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsT0FBTyxRQUFRLFNBQVMsR0FBRztJQUNyRCxNQUFNLE9BQU8sT0FBTztJQUNwQixNQUFNLFdBQVcsT0FBTyxRQUFRO0lBRWhDLElBQUksU0FBUyxPQUFPLENBQUMsZUFBZTtLQUNsQyxJQUFJLFFBQVEsR0FDVixRQUFRO0tBRVYsSUFBSSxpQkFBaUIsYUFBYSxLQUFLO01BQ3JDLFNBQVM7TUFDVDtLQUNGO0tBQ0EsZ0JBQWdCLENBQUM7S0FDakI7SUFDRjtJQUVBLElBQUksU0FBUyxRQUFPLENBQUMsZUFBZTtLQUNsQyxJQUFJLFFBQVEsR0FDVixRQUFRO0tBRVYsSUFBSSxpQkFBaUIsYUFBYSxNQUFLO01BQ3JDLFNBQVM7TUFDVDtLQUNGO0tBQ0EsZ0JBQWdCLENBQUM7S0FDakI7SUFDRjtJQUVBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlO0tBQ3BDLElBQUksU0FBUyxLQUFLO01BQ2hCLElBQUksUUFBUSxHQUNWLFFBQVE7TUFFVixjQUFjO01BQ2Q7S0FDRjtLQUNBLElBQUksU0FBUyxLQUFLO01BQ2hCLGNBQWM7TUFDZDtLQUNGO0tBQ0EsSUFBSSxTQUFTLEtBQUs7TUFDaEIsSUFBSSxRQUFRLEdBQ1YsUUFBUTtNQUVWLGdCQUFnQjtNQUNoQjtLQUNGO0tBQ0EsSUFBSSxTQUFTLEtBQUs7TUFDaEIsZ0JBQWdCO01BQ2hCO0tBQ0Y7S0FFQSxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssZUFBZSxLQUFLLGlCQUFpQixHQUFHO01BQzdELFVBQVUsS0FBSztNQUNmO0tBQ0Y7SUFDRjtJQUVBLElBQUksUUFBUSxHQUNWLFFBQVE7R0FFWjtHQUVBLFVBQVUsT0FBTyxNQUFNO0dBQ3ZCLE9BQU87RUFDVDtFQUVBLHdCQUFnQyxRQUFnQixXQUEyQjtHQUN6RSxJQUFJLFFBQVE7R0FDWixJQUFJLGdCQUFnQjtHQUNwQixJQUFJLGdCQUFnQjtHQUVwQixLQUFLLElBQUksUUFBUSxXQUFXLFFBQVEsT0FBTyxRQUFRLFNBQVMsR0FBRztJQUM3RCxNQUFNLE9BQU8sT0FBTztJQUNwQixNQUFNLFdBQVcsT0FBTyxRQUFRO0lBRWhDLElBQUksU0FBUyxPQUFPLENBQUMsZUFBZTtLQUNsQyxJQUFJLGlCQUFpQixhQUFhLEtBQUs7TUFDckMsU0FBUztNQUNUO0tBQ0Y7S0FDQSxnQkFBZ0IsQ0FBQztLQUNqQjtJQUNGO0lBRUEsSUFBSSxTQUFTLFFBQU8sQ0FBQyxlQUFlO0tBQ2xDLElBQUksaUJBQWlCLGFBQWEsTUFBSztNQUNyQyxTQUFTO01BQ1Q7S0FDRjtLQUNBLGdCQUFnQixDQUFDO0tBQ2pCO0lBQ0Y7SUFFQSxJQUFJLGlCQUFpQixlQUNuQjtJQUdGLElBQUksU0FBUyxLQUFLO0tBQ2hCLFNBQVM7S0FDVDtJQUNGO0lBRUEsSUFBSSxTQUFTLEtBQUs7S0FDaEIsU0FBUztLQUNULElBQUksVUFBVSxHQUNaLE9BQU87SUFFWDtHQUNGO0dBRUEsT0FBTztFQUNUOzs7OztFQU1BLE1BQU0sMEJBQTBCLElBQVUsV0FBcUQ7R0EwQjdGLFFBQU8sTUFEYyxHQUFHLElBQUk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUN2QyxDQUFPLEtBQUssS0FDaEIsU0FRTTtJQUNMLFdBQVcsSUFBSTtJQUNmLGdCQUFnQixJQUFJO0lBQ3BCLFlBQVksSUFBSTtJQUNoQixxQkFBcUIsSUFBSTtJQUN6QixzQkFBc0IsSUFBSTtJQUMxQixVQUFVLEtBQUssb0JBQW9CLElBQUksV0FBVztJQUNsRCxVQUFVLEtBQUssb0JBQW9CLElBQUksV0FBVztHQUNwRCxFQUNGO0VBQ0Y7Ozs7O0VBTUEsTUFBYyxvQkFDWixXQUNBLFdBQ2lDO0dBQ2pDLFFBQVEsTUFBTSxLQUFLLHVCQUF1QixXQUFXLFNBQVMsRUFBQSxDQUFHLElBQUksU0FBUyxLQUFLLENBQUM7RUFDdEY7Ozs7O0VBTUEsTUFBYyx1QkFDWixXQUNBLFdBQzhDO0dBQzlDLE1BQU0sUUFBUTs7Ozs7Ozs7Ozs7O1VBWVIsY0FBYyxTQUFZLEtBQUssb0JBQW9COztHQUV6RCxNQUFNLFNBQVMsTUFBTSxVQUFVLElBQUksT0FBTyxjQUFjLFNBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0dBRXBGLE1BQU0sb0NBQW9CLElBQUksSUFBb0M7R0FDbEUsS0FBSyxNQUFNLE9BQU8sT0FBTyxNQUFNO0lBQzdCLE1BQU0sYUFBYSxrQkFBa0IsSUFBSSxJQUFJLFVBQVUsS0FBSyxDQUFDO0lBRTdELFdBQVcsSUFBSSxlQUFlLElBQUksYUFBYSxJQUFJLElBQUksYUFBYTtJQUNwRSxrQkFBa0IsSUFBSSxJQUFJLFlBQVksVUFBVTtHQUNsRDtHQUNBLE9BQU87RUFDVDs7OztFQUtBLGlCQUNFLFVBSUE7R0FDQSxNQUFNLEVBQUUsVUFBVSxXQUFXLDBCQUEwQixXQUFXLGtCQUFrQjtHQUVwRixNQUFNLEVBQUUsVUFBVSx5QkFBeUI7SUFDekMsSUFBSSxVQUFVLFdBQVcsR0FBRyxHQUMxQixPQUFPO0tBQ0wsVUFBVSxVQUFVLFVBQVUsQ0FBQztLQUMvQixlQUFlO0lBQ2pCO0lBRUYsT0FBTztLQUNMLFVBQVU7S0FDVixlQUFlO0lBQ2pCO0dBQ0YsRUFBQSxDQUFHO0dBR0gsSUFBSSxhQUFhLFFBQ2YsT0FBTyxFQUFFLE1BQU0sT0FBTyxnQkFBZ0I7R0FJeEMsSUFBSSxhQUFhLFFBQ2YsT0FBTyxFQUFFLE1BQU0sVUFBVSxnQkFBZ0I7R0FFM0MsSUFBSSxhQUFhLFFBQ2YsT0FBTyxFQUFFLE1BQU0sYUFBYSxnQkFBZ0I7R0FJOUMsSUFBSSxhQUFhLFdBQ2YsT0FBTztJQUNMLE1BQU0sU0FBUztJQUNmLEdBQUksNEJBQTRCLEVBQzlCLFFBQVEseUJBQ1Y7R0FDRjtHQUVGLElBQUksYUFBYSxRQUNmLE9BQU8sRUFBRSxNQUFNLFNBQVMsZ0JBQWdCO0dBSTFDLElBQUksYUFBYSxXQUNmLE9BQU87SUFDTCxNQUFNLGtCQUFrQjtJQUN4QixZQUFZO0lBQ1osR0FBSSxjQUFjLFFBQ2hCLGtCQUFrQixRQUFRO0tBQ2I7S0FDWCxPQUFPO0lBQ1Q7R0FDSjtHQUVGLElBQUksYUFBYSxVQUNmLE9BQU87SUFBRSxNQUFNLGtCQUFrQjtJQUFpQixZQUFZO0dBQU87R0FFdkUsSUFBSSxhQUFhLFVBQ2YsT0FBTztJQUFFLE1BQU0sa0JBQWtCO0lBQWlCLFlBQVk7R0FBbUI7R0FJbkYsSUFBSSxhQUFhLFFBQ2YsT0FBTyxFQUFFLE1BQU0sVUFBVSxnQkFBZ0I7R0FJM0MsSUFBSSxhQUFhLGVBQ2YsT0FBTztJQUNMLE1BQU0sT0FBTztJQUNiLEdBQUksY0FBYyxRQUFRLEVBQ2IsVUFDYjtHQUNGO0dBSUYsSUFBSSxhQUFhLFVBQVUsYUFBYSxTQUN0QyxPQUFPLEVBQUUsTUFBTSxPQUFPO0dBSXhCLElBQUksYUFBYSxVQUdmLE9BQU87SUFBRSxNQUFNLFNBQVM7SUFBaUIsWUFBWTtHQUFFO0dBSXpELElBQUksYUFBYSxZQUNmLE9BQU8sRUFBRSxNQUFNLFdBQVc7R0FHNUIsTUFBTSxJQUFJLE1BQU0sa0NBQWtDLFVBQVU7RUFDOUQ7Q0FDRjtDQUVhLHlCQUF5QixJQUFJLDRCQUE0QiJ9
|
|
678
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vcG9zdGdyZXNxbC1zY2hlbWEtcmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuXG5pbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQge1xuICB0eXBlIE1pZ3JhdGlvbkNvbHVtbixcbiAgdHlwZSBNaWdyYXRpb25Gb3JlaWduLFxuICB0eXBlIE1pZ3JhdGlvbkluZGV4LFxuICB0eXBlIE1pZ3JhdGlvblNldCxcbiAgdHlwZSBSZWxhdGlvbk9uLFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuLyoqXG4gKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOygleuztOyeheuLiOuLpC5cbiAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7LKY66as7ZWY6riwIOychO2VtCDsgqzsmqnrkKnri4jri6QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZmVyZW5jaW5nRm9yZWlnbktleSA9IHtcbiAgLyoqIEZL6rCAIOygleydmOuQnCDthYzsnbTruJTrqoUgKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsoJzslb3sobDqsbQg7J2066aEICovXG4gIGNvbnN0cmFpbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBGSyDsu6zrn7zrqoUgKi9cbiAgY29sdW1uTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIO2FjOydtOu4lOuqhSAoUEvqsIAg7J6I64qUIO2FjOydtOu4lCkgKi9cbiAgcmVmZXJlbmNlZFRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiog7LC47KGw7ZWY64qUIOy7rOufvOuqhSAo67O07Ya1ICdpZCcpICovXG4gIHJlZmVyZW5jZWRDb2x1bW5OYW1lOiBzdHJpbmc7XG4gIC8qKiBPTiBVUERBVEUg7JWh7IWYICovXG4gIG9uVXBkYXRlOiBSZWxhdGlvbk9uO1xuICAvKiogT04gREVMRVRFIOyVoeyFmCAqL1xuICBvbkRlbGV0ZTogUmVsYXRpb25Pbjtcbn07XG5cbmV4cG9ydCB0eXBlIFBnQ29sdW1uID0ge1xuICBjb2x1bW5fbmFtZTogc3RyaW5nO1xuICBkYXRhX3R5cGU6IHN0cmluZztcbiAgdWR0X25hbWU6IHN0cmluZztcbiAgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoOiBudW1iZXIgfCBudWxsO1xuICBwcmVjaXNpb246IG51bWJlciB8IG51bGw7XG4gIG51bWVyaWNfc2NhbGU6IG51bWJlciB8IG51bGw7XG4gIGF0dHR5cG1vZD86IG51bWJlciB8IG51bGw7XG4gIGlzX251bGxhYmxlOiBzdHJpbmc7XG4gIGNvbHVtbl9kZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBpc19nZW5lcmF0ZWQ6IHN0cmluZzsgLy8gJ3MnID0gU1RPUkVELCAndicgPSBWSVJUVUFMLCAnJyA9IG5vbmVcbiAgZ2VuZXJhdGlvbl9leHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBQZ0luZGV4ID0ge1xuICBpbmRleF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGlzX3VuaXF1ZTogYm9vbGVhbjtcbiAgaXNfcHJpbWFyeTogYm9vbGVhbjtcbiAgaW5kZXhfdHlwZTogc3RyaW5nO1xuICBudWxsc19maXJzdDogYm9vbGVhbjtcbiAgc29ydF9vcmRlcjogXCJBU0NcIiB8IFwiREVTQ1wiO1xuICBudWxsc19ub3RfZGlzdGluY3Q6IGJvb2xlYW47XG4gIGNvbHVtbl9vcmRlcjogbnVtYmVyO1xuICBpbmRleF9kZWZpbml0aW9uOiBzdHJpbmc7XG4gIHByZWRpY2F0ZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFBnRm9yZWlnbiA9IHtcbiAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIGZvcmVpZ25fdGFibGVfbmFtZTogc3RyaW5nO1xuICBmb3JlaWduX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG59O1xuXG50eXBlIFRhYmxlU2NoZW1hUm93cyA9IHtcbiAgY29sdW1uczogUGdDb2x1bW5bXTtcbiAgaW5kZXhlczogUGdJbmRleFtdO1xuICBmb3JlaWduczogUGdGb3JlaWduW107XG59O1xuXG50eXBlIFJhd0NhcGFibGVLbmV4ID0gUGljazxLbmV4LCBcInJhd1wiPjtcblxuZnVuY3Rpb24gZGVjb2RlTnVtZXJpY1R5cGVNb2RpZmllcihcbiAgdHlwZU1vZGlmaWVyOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUGljazxNaWdyYXRpb25Db2x1bW4sIFwicHJlY2lzaW9uXCIgfCBcInNjYWxlXCI+IHwgbnVsbCB7XG4gIGlmICh0eXBlTW9kaWZpZXIgPT09IHVuZGVmaW5lZCB8fCB0eXBlTW9kaWZpZXIgPT09IG51bGwgfHwgdHlwZU1vZGlmaWVyIDwgNCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gaW5mb3JtYXRpb25fc2NoZW1h6rCAIOyeg+uKlCDrsLDsl7QgdHlwbW9k7JmAIOydjOyImCBzY2FsZeydhCBQb3N0Z3JlU1FMIOuCtOu2gCDtkZztmITsl5DshJwg67O17JuQ7ZWc64ukLlxuICBjb25zdCBtb2RpZmllciA9IHR5cGVNb2RpZmllciAtIDQ7XG4gIGNvbnN0IHByZWNpc2lvbiA9IG1vZGlmaWVyID4+PiAxNjtcbiAgY29uc3QgdW5zaWduZWRTY2FsZSA9IG1vZGlmaWVyICYgMHg3ZmY7XG4gIGNvbnN0IHNjYWxlID0gdW5zaWduZWRTY2FsZSA+PSAxMDI0ID8gdW5zaWduZWRTY2FsZSAtIDIwNDggOiB1bnNpZ25lZFNjYWxlO1xuICByZXR1cm4geyBwcmVjaXNpb24sIHNjYWxlIH07XG59XG5cbmNsYXNzIFBvc3RncmVTUUxTY2hlbWFSZWFkZXJDbGFzcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJpY0luZGV4VHlwZXMgPSBuZXcgU2V0KFtcImJ0cmVlXCIsIFwiaGFzaFwiLCBcImdpblwiLCBcImdpc3RcIiwgXCJwZ3Jvb25nYVwiXSk7XG5cbiAgLyoqXG4gICAqIERC7JeQ7IScIO2FjOydtOu4lCDsoJXrs7Trpbwg7J297Ja07IScIE1pZ3JhdGlvblNldOydhCDrp4zrk6TslrTsmLXri4jri6QuXG4gICAqIEBwYXJhbSBjb21wYXJlREIgS25leCDsnbjsiqTthLTsiqRcbiAgICogQHBhcmFtIHRhYmxlIO2FjOydtOu4lCDsnbTrpoRcbiAgICogQHJldHVybnMgTWlncmF0aW9uU2V0IOqwneyytFxuICAgKi9cbiAgYXN5bmMgZ2V0TWlncmF0aW9uU2V0RnJvbURCKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxNaWdyYXRpb25TZXQgfCBudWxsPiB7XG4gICAgbGV0IGRiQ29sdW1uczogUGdDb2x1bW5bXSwgZGJJbmRleGVzOiBQZ0luZGV4W10sIGRiRm9yZWlnbnM6IFBnRm9yZWlnbltdO1xuICAgIHRyeSB7XG4gICAgICBbZGJDb2x1bW5zLCBkYkluZGV4ZXMsIGRiRm9yZWlnbnNdID0gYXdhaXQgdGhpcy5yZWFkVGFibGUoY29tcGFyZURCLCB0YWJsZSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoXCJUYWJsZSBub3QgZm91bmRcIikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIC8vIHZlY3RvciDsu6zrn7zsnZggZGltZW5zaW9ucyDsobDtmoxcbiAgICBjb25zdCB2ZWN0b3JEaW1lbnNpb25zID0gYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zKGNvbXBhcmVEQiwgdGFibGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRNaWdyYXRpb25TZXQodGFibGUsIGRiQ29sdW1ucywgZGJJbmRleGVzLCBkYkZvcmVpZ25zLCB2ZWN0b3JEaW1lbnNpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdWJsaWMg7Iqk7YKk66eI7J2YIOuqqOuToCDthYzsnbTruJTsnYQg7ZWcIOuyiOyXkCDsnb3slrTshJwg7YWM7J2067iU67OEIE1pZ3JhdGlvblNldOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqXG4gICAqIGdldE1pZ3JhdGlvblNldEZyb21EQuulvCDthYzsnbTruJTrp4jri6Qg7Zi47Lac7ZWY66m0ICjsu6zrn7wv7J24642x7IqkL0ZLL+uyoe2EsOywqOybkCkgw5cg7YWM7J2067iUIOyImCDrp4ztgbxcbiAgICog7JmV67O17J20IOuwnOyDne2VnOuLpC4g67mE6rWQIOuMgOyDgeydtCDsiJjsi60g6rCc66m0IOybkOqyqSBEQuyXkOyEnCDsmZXrs7Ug67mE7Jqp7J20IOyngOuwsOyggeydtCDrkJjrr4DroZwsXG4gICAqIOyiheulmOuzhOuhnCDtlZwg67KI7JSp66eMIOyhsO2ajO2VnOuLpC4g7ZaJIO2VtOyEneydgCBnZXRNaWdyYXRpb25TZXRGcm9tRELsmYAg64+Z7J287ZWcXG4gICAqIGJ1aWxkTWlncmF0aW9uU2V07J2EIOqzteycoO2VnOuLpC5cbiAgICpcbiAgICogQHJldHVybnMg7YWM7J2067iU66qFIOKGkiBNaWdyYXRpb25TZXQuIERC7JeQIOyXhuuKlCDthYzsnbTruJTsnYAg7ZWt66qp7J20IOyXhuuLpC5cbiAgICovXG4gIGFzeW5jIGdldE1pZ3JhdGlvblNldEZyb21EQkFsbChjb21wYXJlREI6IFJhd0NhcGFibGVLbmV4KTogUHJvbWlzZTxNYXA8c3RyaW5nLCBNaWdyYXRpb25TZXQ+PiB7XG4gICAgY29uc3QgW3RhYmxlcywgdmVjdG9yRGltZW5zaW9uc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnJlYWRUYWJsZXMoY29tcGFyZURCKSxcbiAgICAgIHRoaXMuZ2V0VmVjdG9yRGltZW5zaW9uc0FsbChjb21wYXJlREIpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgbWlncmF0aW9uU2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBNaWdyYXRpb25TZXQ+KCk7XG4gICAgZm9yIChjb25zdCBbdGFibGUsIHJvd3NdIG9mIHRhYmxlcykge1xuICAgICAgbWlncmF0aW9uU2V0cy5zZXQoXG4gICAgICAgIHRhYmxlLFxuICAgICAgICB0aGlzLmJ1aWxkTWlncmF0aW9uU2V0KFxuICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgIHJvd3MuY29sdW1ucyxcbiAgICAgICAgICByb3dzLmluZGV4ZXMsXG4gICAgICAgICAgcm93cy5mb3JlaWducyxcbiAgICAgICAgICB2ZWN0b3JEaW1lbnNpb25zLmdldCh0YWJsZSkgPz8ge30sXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWlncmF0aW9uU2V0cztcbiAgfVxuXG4gIC8qKlxuICAgKiDsobDtmowg6rKw6rO8IO2WieuTpOydhCBNaWdyYXRpb25TZXTsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKiDthYzsnbTruJQg64uo7JyEIOyhsO2ajChnZXRNaWdyYXRpb25TZXRGcm9tREIp7JmAIOyghOyytCDsnbzqtIQg7KGw7ZqMKGdldE1pZ3JhdGlvblNldEZyb21EQkFsbCnqsIBcbiAgICog7J20IOuhnOyngeydhCDqs7XsnKDtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTWlncmF0aW9uU2V0KFxuICAgIHRhYmxlOiBzdHJpbmcsXG4gICAgZGJDb2x1bW5zOiBQZ0NvbHVtbltdLFxuICAgIGRiSW5kZXhlczogUGdJbmRleFtdLFxuICAgIGRiRm9yZWlnbnM6IFBnRm9yZWlnbltdLFxuICAgIHZlY3RvckRpbWVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gICk6IE1pZ3JhdGlvblNldCB7XG4gICAgY29uc3QgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBkYkNvbHVtbnMubWFwKChkYkNvbHVtbikgPT4ge1xuICAgICAgY29uc3QgZGJDb2xUeXBlID0gdGhpcy5yZXNvbHZlREJDb2xUeXBlKGRiQ29sdW1uKTtcblxuICAgICAgLy8gdmVjdG9yIO2DgOyeheyduCDqsr3smrAgZGltZW5zaW9ucyDshKTsoJVcbiAgICAgIGlmIChkYkNvbFR5cGUudHlwZSA9PT0gXCJ2ZWN0b3JcIikge1xuICAgICAgICBkYkNvbFR5cGUuZGltZW5zaW9ucyA9IHZlY3RvckRpbWVuc2lvbnNbZGJDb2x1bW4uY29sdW1uX25hbWVdID8/IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRiQ29sdW1uLmNvbHVtbl9uYW1lLFxuICAgICAgICBudWxsYWJsZTogZGJDb2x1bW4uaXNfbnVsbGFibGUgPT09IFwiWUVTXCIsXG4gICAgICAgIC4uLmRiQ29sVHlwZSxcbiAgICAgICAgLy8gR2VuZXJhdGVkIENvbHVtbiDsspjrpqxcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICBpZiAoZGJDb2x1bW4uaXNfZ2VuZXJhdGVkID09PSBcInNcIiB8fCBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwidlwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiID8gXCJTVE9SRURcIiA6IFwiVklSVFVBTFwiLFxuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGRiQ29sdW1uLmdlbmVyYXRpb25fZXhwcmVzc2lvbiA/PyBcIlwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9KSgpLFxuICAgICAgICAvLyBEZWZhdWx0IOqwkiDsspjrpqwgKEdlbmVyYXRlZCBDb2x1bW7snbQg7JWE64uMIOqyveyasOunjClcbiAgICAgICAgLi4uKCgpID0+IHtcbiAgICAgICAgICAvLyBHZW5lcmF0ZWQgQ29sdW1u7J2AIGRlZmF1bHQg6rCS7J20IOyXhuydjFxuICAgICAgICAgIGlmIChkYkNvbHVtbi5pc19nZW5lcmF0ZWQgPT09IFwic1wiIHx8IGRiQ29sdW1uLmlzX2dlbmVyYXRlZCA9PT0gXCJ2XCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFBvc3RncmVTUUwgZGVmYXVsdCDqsJIg7KCV66asIChuZXh0dmFsLCBDVVJSRU5UX1RJTUVTVEFNUCDrk7EpXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZGJDb2x1bW4uY29sdW1uX2RlZmF1bHQ7XG5cbiAgICAgICAgICAgIC8vIG5leHR2YWwg7KCc6rGwIChTRVJJQUwg7YOA7J6FKVxuICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZS5zdGFydHNXaXRoKFwibmV4dHZhbChcIikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDtg4DsnoUg7LqQ7Iqk7YyFIOygnOqxsCAo7JiIOiAnMSc6OmludGVnZXIg4oaSIDEpXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUucmVwbGFjZSgvOjpbXFx3XFxzXSskL2csIFwiXCIpO1xuXG4gICAgICAgICAgICAvLyDrlLDsmLTtkZzqsIAgc2luZ2xlIHF1b3Rl7J24IOqyveyasCBkb3VibGUgcXVvdGXroZwg67OA7ZmYXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpICYmIGRlZmF1bHRWYWx1ZS5lbmRzV2l0aChcIidcIikpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlLnJlcGxhY2VBbGwoXCInXCIsICdcIicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkZWZhdWx0VG86IGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSkoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBQUklNQVJZIEtFWeyZgCBmb3JlaWduIGtleeyaqSDsnbjrjbHsiqQg7KCc7Jm4XG4gICAgY29uc3QgZGJJbmRleGVzR3JvdXAgPSBncm91cChcbiAgICAgIGRiSW5kZXhlcy5maWx0ZXIoXG4gICAgICAgIChkYkluZGV4KSA9PlxuICAgICAgICAgICFkYkluZGV4LmlzX3ByaW1hcnkgJiZcbiAgICAgICAgICAhZGJGb3JlaWducy5maW5kKChkYkZvcmVpZ24pID0+IGRiSW5kZXguaW5kZXhfbmFtZS5pbmNsdWRlcyhkYkZvcmVpZ24uY29uc3RyYWludF9uYW1lKSksXG4gICAgICApLFxuICAgICAgKGRiSW5kZXgpID0+IGRiSW5kZXguaW5kZXhfbmFtZSxcbiAgICApO1xuXG4gICAgLy8gaW5kZXhlcyDsspjrpqxcbiAgICBjb25zdCBpbmRleGVzOiBNaWdyYXRpb25JbmRleFtdID0gW107XG4gICAgZm9yIChjb25zdCBpbmRleE5hbWUgb2YgT2JqZWN0LmtleXMoZGJJbmRleGVzR3JvdXApKSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IGRiSW5kZXhlc0dyb3VwW2luZGV4TmFtZV0/LnRvU29ydGVkKFxuICAgICAgICAobGVmdCwgcmlnaHQpID0+IGxlZnQuY29sdW1uX29yZGVyIC0gcmlnaHQuY29sdW1uX29yZGVyLFxuICAgICAgKTtcbiAgICAgIGFzc2VydChjdXJyZW50SW5kZXhlcyk7XG5cbiAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSBjdXJyZW50SW5kZXhlc1swXTtcbiAgICAgIGNvbnN0IHBhcnNlZEluZGV4RGVmaW5pdGlvbiA9IHRoaXMucGFyc2VJbmRleERlZmluaXRpb24oZmlyc3RJbmRleC5pbmRleF9kZWZpbml0aW9uKTtcbiAgICAgIGNvbnN0IHJlc3RvcmVkSW5kZXhUeXBlID0gdGhpcy5yZXN0b3JlTWlncmF0aW9uSW5kZXhUeXBlKFxuICAgICAgICBmaXJzdEluZGV4LFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHVzaW5nID0gdGhpcy5yZXN0b3JlR2VuZXJpY1VzaW5nKFxuICAgICAgICBwYXJzZWRJbmRleERlZmluaXRpb24uYWNjZXNzTWV0aG9kID8/IGZpcnN0SW5kZXguaW5kZXhfdHlwZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGluZGV4Q29sdW1uczogTWlncmF0aW9uSW5kZXhbXCJjb2x1bW5zXCJdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRJbmRleCBvZiBjdXJyZW50SW5kZXhlcykge1xuICAgICAgICBjb25zdCBvcGNsYXNzID0gdGhpcy5leHRyYWN0SW5kZXhDb2x1bW5PcGNsYXNzKFxuICAgICAgICAgIHBhcnNlZEluZGV4RGVmaW5pdGlvbi5jb2x1bW5EZWZpbml0aW9uc1tjdXJyZW50SW5kZXguY29sdW1uX29yZGVyIC0gMV0sXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbHVtbjogTWlncmF0aW9uSW5kZXhbXCJjb2x1bW5zXCJdW251bWJlcl0gPSB7XG4gICAgICAgICAgbmFtZTogY3VycmVudEluZGV4LmNvbHVtbl9uYW1lLFxuICAgICAgICB9O1xuICAgICAgICBpZiAob3BjbGFzcykge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCB7IG9wY2xhc3MgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh1c2luZykge1xuICAgICAgICAgIGNhc2UgXCJidHJlZVwiOlxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW4sIHtcbiAgICAgICAgICAgICAgc29ydE9yZGVyOiBjdXJyZW50SW5kZXguc29ydF9vcmRlcixcbiAgICAgICAgICAgICAgbnVsbHNGaXJzdDogY3VycmVudEluZGV4Lm51bGxzX2ZpcnN0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpbmRleENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXg6IE1pZ3JhdGlvbkluZGV4ID0ge1xuICAgICAgICB0eXBlOiByZXN0b3JlZEluZGV4VHlwZSxcbiAgICAgICAgbmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBjb2x1bW5zOiBpbmRleENvbHVtbnMsXG4gICAgICAgIG51bGxzTm90RGlzdGluY3Q6IGZpcnN0SW5kZXgubnVsbHNfbm90X2Rpc3RpbmN0LFxuICAgICAgICAuLi50aGlzLnBhcnNlVmVjdG9ySW5kZXhPcHRpb25zKHJlc3RvcmVkSW5kZXhUeXBlLCBwYXJzZWRJbmRleERlZmluaXRpb24ud2l0aE9wdGlvbnMpLFxuICAgICAgfTtcbiAgICAgIGlmIChmaXJzdEluZGV4LnByZWRpY2F0ZSkge1xuICAgICAgICBpbmRleC53aGVyZSA9IGZpcnN0SW5kZXgucHJlZGljYXRlO1xuICAgICAgfVxuICAgICAgaWYgKHVzaW5nKSB7XG4gICAgICAgIGluZGV4LnVzaW5nID0gdXNpbmc7XG4gICAgICB9XG4gICAgICBpbmRleGVzLnB1c2goaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIGZvcmVpZ25zIOyymOumrFxuICAgIGNvbnN0IGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10gPSBkYkZvcmVpZ25zLm1hcCgoZGJGb3JlaWduKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBbZGJGb3JlaWduLmNvbHVtbl9uYW1lXSxcbiAgICAgICAgdG86IGAke2RiRm9yZWlnbi5mb3JlaWduX3RhYmxlX25hbWV9LiR7ZGJGb3JlaWduLmZvcmVpZ25fY29sdW1uX25hbWV9YCxcbiAgICAgICAgb25VcGRhdGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihkYkZvcmVpZ24udXBkYXRlX3J1bGUpLFxuICAgICAgICBvbkRlbGV0ZTogdGhpcy5tYXBDb25zdHJhaW50QWN0aW9uKGRiRm9yZWlnbi5kZWxldGVfcnVsZSksXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYmxlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGluZGV4ZXMsXG4gICAgICBmb3JlaWducyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUzsnZggY29uc3RyYWludCBhY3Rpb27snYQgS25leCDtmJXsi53snLzroZwg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIG1hcENvbnN0cmFpbnRBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBSZWxhdGlvbk9uIHtcbiAgICBjb25zdCBhY3Rpb25NYXAgPSBuZXcgTWFwPHN0cmluZywgUmVsYXRpb25Pbj4oW1xuICAgICAgW1wiTk8gQUNUSU9OXCIsIFwiTk8gQUNUSU9OXCJdLFxuICAgICAgW1wiUkVTVFJJQ1RcIiwgXCJSRVNUUklDVFwiXSxcbiAgICAgIFtcIkNBU0NBREVcIiwgXCJDQVNDQURFXCJdLFxuICAgICAgW1wiU0VUIE5VTExcIiwgXCJTRVQgTlVMTFwiXSxcbiAgICAgIFtcIlNFVCBERUZBVUxUXCIsIFwiU0VUIERFRkFVTFRcIl0sXG4gICAgXSk7XG4gICAgcmV0dXJuIGFjdGlvbk1hcC5nZXQoYWN0aW9uKSA/PyBcIk5PIEFDVElPTlwiO1xuICB9XG5cbiAgLyoqXG4gICAqIOq4sOyhtCDthYzsnbTruJQg7J297Ja07IScIGNvbHMsIGluZGV4ZXMsIGZvcmVpZ25zIOuwmO2ZmFxuICAgKi9cbiAgYXN5bmMgcmVhZFRhYmxlKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8W1BnQ29sdW1uW10sIFBnSW5kZXhbXSwgUGdGb3JlaWduW11dPiB7XG4gICAgY29uc3QgdGFibGVzID0gYXdhaXQgdGhpcy5yZWFkVGFibGVzKGNvbXBhcmVEQiwgdGFibGVOYW1lKTtcbiAgICBjb25zdCByb3dzID0gdGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmIChyb3dzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgbm90IGZvdW5kOiAke3RhYmxlTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFtyb3dzLmNvbHVtbnMsIHJvd3MuaW5kZXhlcywgcm93cy5mb3JlaWduc107XG4gIH1cblxuICAvKipcbiAgICogcHVibGljIOyKpO2CpOuniCDthYzsnbTruJTrk6TsnZggY29scy9pbmRleGVzL2ZvcmVpZ25z66W8IO2FjOydtOu4lOuzhOuhnCDrrLbslrTshJwg67CY7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiB0YWJsZU5hbWXsnYQg7KO866m0IOq3uCDthYzsnbTruJTrp4wsIOyDneuete2VmOuptCDsoITssrTrpbwg7KGw7ZqM7ZWp64uI64ukLiDsv7zrpqzripQg65GQIOqyveuhnOqwgCDqs7XsnKDtlZjrr4DroZxcbiAgICog64uo7J28IOyhsO2ajOyZgCDsnbzqtIQg7KGw7ZqM7J2YIO2VtOyEneydtCDqsIjrnbzsp4Dsp4Ag7JWK7Iq164uI64ukLiDsoITssrQg7KGw7ZqMIOyLnOyXkOuKlCDthYzsnbTruJTrp4jri6QgNOuyiOyUqVxuICAgKiDsmZXrs7XtlZjripQg64yA7IugIOyiheulmOuzhOuhnCDtlZwg67KI7JSp66eMIOuPjOq4sCDrlYzrrLjsl5AsIOybkOqyqSBEQuyXkOyEnCDsmZXrs7Ug67mE7Jqp7J20IO2BrOqyjCDspITslrTrk63ri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRUYWJsZXMoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgVGFibGVTY2hlbWFSb3dzPj4ge1xuICAgIGNvbnN0IGJpbmRpbmdzID0gdGFibGVOYW1lID09PSB1bmRlZmluZWQgPyBbXSA6IFt0YWJsZU5hbWUsIHRhYmxlTmFtZSwgdGFibGVOYW1lXTtcbiAgICBjb25zdCB0YWJsZUZpbHRlciA9IChjb2x1bW46IHN0cmluZykgPT4gKHRhYmxlTmFtZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IGBBTkQgJHtjb2x1bW59ID0gP2ApO1xuXG4gICAgLy8gQ29sdW1ucyDsobDtmowgKEdlbmVyYXRlZCBDb2x1bW4g7KCV67O0IO2PrO2VqClcbiAgICBjb25zdCBjb2x1bW5zUXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgYy50YWJsZV9uYW1lLFxuICAgICAgICBjLmNvbHVtbl9uYW1lLFxuICAgICAgICBjLmRhdGFfdHlwZSxcbiAgICAgICAgYy51ZHRfbmFtZSxcbiAgICAgICAgQ09BTEVTQ0UoXG4gICAgICAgICAgYy5jaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsXG4gICAgICAgICAgQ0FTRSBXSEVOIGMuZGF0YV90eXBlID0gJ0FSUkFZJyBBTkQgYS5hdHR0eXBtb2QgPiAwXG4gICAgICAgICAgICBUSEVOIGEuYXR0dHlwbW9kIC0gNFxuICAgICAgICAgICAgRUxTRSBOVUxMXG4gICAgICAgICAgRU5EXG4gICAgICAgICkgQVMgY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICBDT0FMRVNDRShjLmRhdGV0aW1lX3ByZWNpc2lvbiwgYy5udW1lcmljX3ByZWNpc2lvbikgQVMgcHJlY2lzaW9uLFxuICAgICAgICBjLm51bWVyaWNfc2NhbGUsXG4gICAgICAgIGEuYXR0dHlwbW9kLFxuICAgICAgICBjLmlzX251bGxhYmxlLFxuICAgICAgICBjLmNvbHVtbl9kZWZhdWx0LFxuICAgICAgICBDT0FMRVNDRShhLmF0dGdlbmVyYXRlZCwgJycpIGFzIGlzX2dlbmVyYXRlZCxcbiAgICAgICAgYy5nZW5lcmF0aW9uX2V4cHJlc3Npb25cbiAgICAgIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLmNvbHVtbnMgY1xuICAgICAgTEVGVCBKT0lOIHBnX2F0dHJpYnV0ZSBhIE9OIGEuYXR0bmFtZSA9IGMuY29sdW1uX25hbWVcbiAgICAgICAgQU5EIGEuYXR0cmVsaWQgPSAoXG4gICAgICAgICAgU0VMRUNUIG9pZCBGUk9NIHBnX2NsYXNzIFdIRVJFIHJlbG5hbWUgPSBjLnRhYmxlX25hbWVcbiAgICAgICAgICBBTkQgcmVsbmFtZXNwYWNlID0gKFNFTEVDVCBvaWQgRlJPTSBwZ19uYW1lc3BhY2UgV0hFUkUgbnNwbmFtZSA9IGMudGFibGVfc2NoZW1hKVxuICAgICAgICApXG4gICAgICBXSEVSRSBjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgICAgICR7dGFibGVGaWx0ZXIoXCJjLnRhYmxlX25hbWVcIil9XG4gICAgICBPUkRFUiBCWSBjLnRhYmxlX25hbWUsIGMub3JkaW5hbF9wb3NpdGlvblxuICAgIGA7XG5cbiAgICAvLyBJbmRleGVzIOyhsO2ajCAoUEdyb29uZ2Eg7ZGc7ZiE7IudIOyduOuNseyKpCDtj6ztlagpXG4gICAgY29uc3QgaW5kZXhlc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgICAgdC5yZWxuYW1lIEFTIHRhYmxlX25hbWUsXG4gICAgICAgICAgaS5yZWxuYW1lIEFTIGluZGV4X25hbWUsXG4gICAgICAgICAgQ0FTRVxuICAgICAgICAgICAgICBXSEVOIGFtLmFtbmFtZSA9ICdwZ3Jvb25nYScgQU5EIHUuYXR0bnVtID0gMCBUSEVOXG4gICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICByZWdleHBfcmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJTShwZ3Jvb25nYV9jb2wuY29sdW1uX2V4cHIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnOjp0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgJ1soKV0nLFxuICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICdnJ1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBFTFNFIGEuYXR0bmFtZVxuICAgICAgICAgIEVORCBBUyBjb2x1bW5fbmFtZSxcbiAgICAgICAgICBpeC5pbmRpc3VuaXF1ZSBBUyBpc191bmlxdWUsXG4gICAgICAgICAgaXguaW5kaXNwcmltYXJ5IEFTIGlzX3ByaW1hcnksXG4gICAgICAgICAgYW0uYW1uYW1lIEFTIGluZGV4X3R5cGUsXG4gICAgICAgICAgQ09BTEVTQ0UoKHUub3B0ICYgMikgPSAyLCBGQUxTRSkgQVMgbnVsbHNfZmlyc3QsXG4gICAgICAgICAgQ0FTRSBcbiAgICAgICAgICAgICAgV0hFTiAodS5vcHQgJiAxKSA9IDEgVEhFTiAnREVTQydcbiAgICAgICAgICAgICAgRUxTRSAnQVNDJ1xuICAgICAgICAgIEVORCBBUyBzb3J0X29yZGVyLFxuICAgICAgICAgIGl4LmluZG51bGxzbm90ZGlzdGluY3QgQVMgbnVsbHNfbm90X2Rpc3RpbmN0LFxuICAgICAgICAgIHUub3JkIEFTIGNvbHVtbl9vcmRlcixcbiAgICAgICAgICBwZ19nZXRfaW5kZXhkZWYoaXguaW5kZXhyZWxpZCkgQVMgaW5kZXhfZGVmaW5pdGlvbixcbiAgICAgICAgICBwZ19nZXRfZXhwcihpeC5pbmRwcmVkLCBpeC5pbmRyZWxpZCkgQVMgcHJlZGljYXRlXG4gICAgICBGUk9NIHBnX2NsYXNzIHRcbiAgICAgIEpPSU4gcGdfbmFtZXNwYWNlIG5zIE9OIG5zLm9pZCA9IHQucmVsbmFtZXNwYWNlXG4gICAgICBKT0lOIHBnX2luZGV4IGl4IE9OIHQub2lkID0gaXguaW5kcmVsaWRcbiAgICAgIEpPSU4gcGdfY2xhc3MgaSBPTiBpLm9pZCA9IGl4LmluZGV4cmVsaWRcbiAgICAgIEpPSU4gcGdfYW0gYW0gT04gaS5yZWxhbSA9IGFtLm9pZFxuICAgICAgSk9JTiBMQVRFUkFMIHVubmVzdChpeC5pbmRrZXksIGl4LmluZG9wdGlvbilcbiAgICAgICAgICBXSVRIIE9SRElOQUxJVFkgQVMgdShhdHRudW0sIG9wdCwgb3JkKSBPTiB0cnVlXG4gICAgICBMRUZUIEpPSU4gcGdfYXR0cmlidXRlIGEgT04gYS5hdHRyZWxpZCA9IHQub2lkIFxuICAgICAgICAgIEFORCBhLmF0dG51bSA9IHUuYXR0bnVtIFxuICAgICAgICAgIEFORCB1LmF0dG51bSA+IDBcbiAgICAgIExFRlQgSk9JTiBMQVRFUkFMIChcbiAgICAgICAgICAtLSBQR3Jvb25nYSDtkZztmITsi50g7J24642x7Iqk64qUIOuqqOuToCDtlonsnZggYXR0bnVt7J20IDDsnbTrnbwgdS5vcmTqsIAg6rCZ64ukLlxuICAgICAgICAgIC0tIO2RnO2YhOyLnSDrsLDsl7TsnZgg7Iic67KIKGV4cHJfb3JkKeydhCDtlajqu5gg672R7JWEIOygleugrOydhCDtmZXsoJXtlZzri6QuXG4gICAgICAgICAgU0VMRUNUIGV4cHIuY29sdW1uX2V4cHIsIGV4cHIuZXhwcl9vcmRcbiAgICAgICAgICBGUk9NIHVubmVzdChcbiAgICAgICAgICAgICAgICAgIENBU0VcbiAgICAgICAgICAgICAgICAgICAgICBXSEVOIHBnX2dldF9leHByKGl4LmluZGV4cHJzLCBpeC5pbmRyZWxpZCkgfiAnXkFSUkFZXFxcXFsnIFRIRU5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RvX2FycmF5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhwX3JlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X2V4cHIoaXguaW5kZXhwcnMsIGl4LmluZHJlbGlkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXkFSUkFZXFxcXFsoLiopXFxcXF0kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFxcXDEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgRUxTRVxuICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWVtwZ19nZXRfZXhwcihpeC5pbmRleHBycywgaXguaW5kcmVsaWQpXVxuICAgICAgICAgICAgICAgICAgRU5EXG4gICAgICAgICAgICAgICkgV0lUSCBPUkRJTkFMSVRZIEFTIGV4cHIoY29sdW1uX2V4cHIsIGV4cHJfb3JkKVxuICAgICAgKSBwZ3Jvb25nYV9jb2wgT04gYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwXG4gICAgICBXSEVSRSB0LnJlbGtpbmQgPSAncidcbiAgICAgICAgICBBTkQgbnMubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICAgJHt0YWJsZUZpbHRlcihcInQucmVsbmFtZVwiKX1cbiAgICAgICAgICBBTkQgKHUuYXR0bnVtID4gMCBPUiAoYW0uYW1uYW1lID0gJ3Bncm9vbmdhJyBBTkQgdS5hdHRudW0gPSAwKSlcbiAgICAgIE9SREVSIEJZIHQucmVsbmFtZSwgaS5yZWxuYW1lLCB1Lm9yZCwgcGdyb29uZ2FfY29sLmV4cHJfb3JkO1xuYDtcblxuICAgIC8vIEZvcmVpZ24gS2V5cyDsobDtmoxcbiAgICAvL1xuICAgIC8vIGluZm9ybWF0aW9uX3NjaGVtYSh0YWJsZV9jb25zdHJhaW50cyDDlyBrZXlfY29sdW1uX3VzYWdlIMOXIGNvbnN0cmFpbnRfY29sdW1uX3VzYWdlXG4gICAgLy8gw5cgcmVmZXJlbnRpYWxfY29uc3RyYWludHMpIDTspJEg7KGw7J24IOuMgOyLoCBwZ19jb25zdHJhaW5066W8IOyngeygkSDsnb3ripTri6QuXG4gICAgLy8gY29uc3RyYWludF9jb2x1bW5fdXNhZ2XripQg67ewIOyViOycvOuhnCDthYzsnbTruJQg7ZWE7YSw6rCAIOuwgOugpOuTpOyWtOqwgOyngCDslYrslYQgREIg7KCE7LK07J2YXG4gICAgLy8g7KCc7JW97KGw6rG07J2EIO2bkeuKlOuLpC4g7KCc7JW97J20IOyhsOq4iOunjCDrp47slYTsoLjrj4Qg7YWM7J2067iUIO2VmOuCmCDsobDtmozsl5AgMey0iCDsnbTsg4Eg6rG466as6rOgLFxuICAgIC8vIOu5hOq1kOuKlCDthYzsnbTruJTrp4jri6Qg7J20IOy/vOumrOulvCDrj4zrpqzrr4DroZwg7KCE7LK0IOyGjOyalOqwgCDquInqsqntnogg7Luk7KeE64ukLlxuICAgIC8vIGNvbnR5cGU9J2YnIOyduOuNseyKpCDsiqTsupTsnLzroZwg67CU6r6466m0IE5PVCBOVUxMIOygnOyVvShQRyAxNyvsl5DshJwgcGdfY29uc3RyYWludOyXkFxuICAgIC8vIOq4sOuhneuQnOuLpCkg65Ox7J2EIOyVhOyYiCDqsbTrhIjrm7Tri6QuXG4gICAgLy9cbiAgICAvLyBjb25rZXkvY29uZmtleeuKlCDsu6zrn7wg7Iic7ISc66W8IOuLtOydgCDrsLDsl7TsnbTrr4DroZwgV0lUSCBPUkRJTkFMSVRZ66GcIOqwmeydgCDsiJzrsojrgbzrpqxcbiAgICAvLyDsp53sp4DslrTslbwg67O17ZWpIEZL7JeQ7IScIOy7rOufvCDrjIDsnZHsnbQg7Ja06riL64KY7KeAIOyViuuKlOuLpC5cbiAgICBjb25zdCBmb3JlaWduc1F1ZXJ5ID0gYFxuICAgICAgU0VMRUNUXG4gICAgICAgIGNsLnJlbG5hbWUgQVMgdGFibGVfbmFtZSxcbiAgICAgICAgY29uLmNvbm5hbWUgQVMgY29uc3RyYWludF9uYW1lLFxuICAgICAgICBhdHQuYXR0bmFtZSBBUyBjb2x1bW5fbmFtZSxcbiAgICAgICAgcmVmX2NsLnJlbG5hbWUgQVMgZm9yZWlnbl90YWJsZV9uYW1lLFxuICAgICAgICByZWZfYXR0LmF0dG5hbWUgQVMgZm9yZWlnbl9jb2x1bW5fbmFtZSxcbiAgICAgICAgQ0FTRSBjb24uY29uZnVwZHR5cGVcbiAgICAgICAgICBXSEVOICdhJyBUSEVOICdOTyBBQ1RJT04nXG4gICAgICAgICAgV0hFTiAncicgVEhFTiAnUkVTVFJJQ1QnXG4gICAgICAgICAgV0hFTiAnYycgVEhFTiAnQ0FTQ0FERSdcbiAgICAgICAgICBXSEVOICduJyBUSEVOICdTRVQgTlVMTCdcbiAgICAgICAgICBXSEVOICdkJyBUSEVOICdTRVQgREVGQVVMVCdcbiAgICAgICAgRU5EIEFTIHVwZGF0ZV9ydWxlLFxuICAgICAgICBDQVNFIGNvbi5jb25mZGVsdHlwZVxuICAgICAgICAgIFdIRU4gJ2EnIFRIRU4gJ05PIEFDVElPTidcbiAgICAgICAgICBXSEVOICdyJyBUSEVOICdSRVNUUklDVCdcbiAgICAgICAgICBXSEVOICdjJyBUSEVOICdDQVNDQURFJ1xuICAgICAgICAgIFdIRU4gJ24nIFRIRU4gJ1NFVCBOVUxMJ1xuICAgICAgICAgIFdIRU4gJ2QnIFRIRU4gJ1NFVCBERUZBVUxUJ1xuICAgICAgICBFTkQgQVMgZGVsZXRlX3J1bGVcbiAgICAgIEZST00gcGdfY29uc3RyYWludCBjb25cbiAgICAgIEpPSU4gcGdfY2xhc3MgY2wgT04gY2wub2lkID0gY29uLmNvbnJlbGlkXG4gICAgICBKT0lOIHBnX25hbWVzcGFjZSBucyBPTiBucy5vaWQgPSBjbC5yZWxuYW1lc3BhY2VcbiAgICAgIEpPSU4gcGdfY2xhc3MgcmVmX2NsIE9OIHJlZl9jbC5vaWQgPSBjb24uY29uZnJlbGlkXG4gICAgICBKT0lOIExBVEVSQUwgdW5uZXN0KGNvbi5jb25rZXkpIFdJVEggT1JESU5BTElUWSBBUyBrZXlfY29sKGF0dG51bSwgb3JkKSBPTiB0cnVlXG4gICAgICBKT0lOIExBVEVSQUwgdW5uZXN0KGNvbi5jb25ma2V5KSBXSVRIIE9SRElOQUxJVFkgQVMgcmVmX2tleV9jb2woYXR0bnVtLCBvcmQpXG4gICAgICAgIE9OIHJlZl9rZXlfY29sLm9yZCA9IGtleV9jb2wub3JkXG4gICAgICBKT0lOIHBnX2F0dHJpYnV0ZSBhdHRcbiAgICAgICAgT04gYXR0LmF0dHJlbGlkID0gY2wub2lkIEFORCBhdHQuYXR0bnVtID0ga2V5X2NvbC5hdHRudW1cbiAgICAgIEpPSU4gcGdfYXR0cmlidXRlIHJlZl9hdHRcbiAgICAgICAgT04gcmVmX2F0dC5hdHRyZWxpZCA9IHJlZl9jbC5vaWQgQU5EIHJlZl9hdHQuYXR0bnVtID0gcmVmX2tleV9jb2wuYXR0bnVtXG4gICAgICBXSEVSRSBjb24uY29udHlwZSA9ICdmJ1xuICAgICAgICBBTkQgbnMubnNwbmFtZSA9ICdwdWJsaWMnXG4gICAgICAgICR7dGFibGVGaWx0ZXIoXCJjbC5yZWxuYW1lXCIpfVxuICAgICAgT1JERVIgQlkgY2wucmVsbmFtZSwgY29uLmNvbm5hbWUsIGtleV9jb2wub3JkXG4gICAgYDtcblxuICAgIC8vIOyiheulmOuzhOuhnCDtlZwg67KI7JSp66eMIOyhsO2ajO2VnCDrkqQg7YWM7J2067iU66qF7Jy866GcIOustuyKteuLiOuLpC5cbiAgICBjb25zdCBbY29sdW1uUm93cywgaW5kZXhSb3dzLCBmb3JlaWduUm93c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBjb21wYXJlREJcbiAgICAgICAgLnJhdyhjb2x1bW5zUXVlcnksIGJpbmRpbmdzLnNsaWNlKDAsIDEpKVxuICAgICAgICAudGhlbigocmVzdWx0OiB7IHJvd3M6IChQZ0NvbHVtbiAmIHsgdGFibGVfbmFtZTogc3RyaW5nIH0pW10gfSkgPT4gcmVzdWx0LnJvd3MpLFxuICAgICAgY29tcGFyZURCXG4gICAgICAgIC5yYXcoaW5kZXhlc1F1ZXJ5LCBiaW5kaW5ncy5zbGljZSgxLCAyKSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdDogeyByb3dzOiAoUGdJbmRleCAmIHsgdGFibGVfbmFtZTogc3RyaW5nIH0pW10gfSkgPT4gcmVzdWx0LnJvd3MpLFxuICAgICAgY29tcGFyZURCXG4gICAgICAgIC5yYXcoZm9yZWlnbnNRdWVyeSwgYmluZGluZ3Muc2xpY2UoMiwgMykpXG4gICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcm93czogKFBnRm9yZWlnbiAmIHsgdGFibGVfbmFtZTogc3RyaW5nIH0pW10gfSkgPT4gcmVzdWx0LnJvd3MpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgdGFibGVzID0gbmV3IE1hcDxzdHJpbmcsIFRhYmxlU2NoZW1hUm93cz4oKTtcbiAgICBjb25zdCBlbnN1cmUgPSAodGFibGU6IHN0cmluZyk6IFRhYmxlU2NoZW1hUm93cyA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRhYmxlcy5nZXQodGFibGUpO1xuICAgICAgaWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgICAgY29uc3QgY3JlYXRlZDogVGFibGVTY2hlbWFSb3dzID0geyBjb2x1bW5zOiBbXSwgaW5kZXhlczogW10sIGZvcmVpZ25zOiBbXSB9O1xuICAgICAgdGFibGVzLnNldCh0YWJsZSwgY3JlYXRlZCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgLy8g7Lus65+87J20IOyXhuuKlCDthYzsnbTruJTsnYAg7KG07J6s7ZWY7KeAIOyViuuKlCDqsoPsnLzroZwg7Leo6riJ7ZWY66+A66GcIOy7rOufvCDquLDspIDsnLzroZwg7ZWt66qp7J2EIOunjOuTreuLiOuLpC5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBjb2x1bW5Sb3dzKSB7XG4gICAgICBlbnN1cmUocm93LnRhYmxlX25hbWUpLmNvbHVtbnMucHVzaChyb3cpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBpbmRleFJvd3MpIHtcbiAgICAgIHRhYmxlcy5nZXQocm93LnRhYmxlX25hbWUpPy5pbmRleGVzLnB1c2gocm93KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb3cgb2YgZm9yZWlnblJvd3MpIHtcbiAgICAgIHRhYmxlcy5nZXQocm93LnRhYmxlX25hbWUpPy5mb3JlaWducy5wdXNoKHJvdyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZU1pZ3JhdGlvbkluZGV4VHlwZShcbiAgICBpbmRleDogUGljazxQZ0luZGV4LCBcImlzX3VuaXF1ZVwiIHwgXCJpbmRleF90eXBlXCI+LFxuICAgIGFjY2Vzc01ldGhvZD86IHN0cmluZyxcbiAgKTogTWlncmF0aW9uSW5kZXhbXCJ0eXBlXCJdIHtcbiAgICBjb25zdCByZXNvbHZlZEFjY2Vzc01ldGhvZCA9IChhY2Nlc3NNZXRob2QgPz8gaW5kZXguaW5kZXhfdHlwZSkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChyZXNvbHZlZEFjY2Vzc01ldGhvZCA9PT0gXCJobnN3XCIgfHwgcmVzb2x2ZWRBY2Nlc3NNZXRob2QgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRBY2Nlc3NNZXRob2Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4LmlzX3VuaXF1ZSA/IFwidW5pcXVlXCIgOiBcImluZGV4XCI7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVHZW5lcmljVXNpbmcoXG4gICAgYWNjZXNzTWV0aG9kOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICk6IE1pZ3JhdGlvbkluZGV4W1widXNpbmdcIl0gfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXNzTWV0aG9kKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBhY2Nlc3NNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXRoaXMuZ2VuZXJpY0luZGV4VHlwZXMuaGFzKG5vcm1hbGl6ZWQpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiAvKiBTQUZFVFk6IEtuZXjsmYAgUG9zdGdyZVNRTCDsiqTtgqTrp4gg7KGw7ZqMIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIG5vcm1hbGl6ZWQgYXMgTWlncmF0aW9uSW5kZXhbXCJ1c2luZ1wiXTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VWZWN0b3JJbmRleE9wdGlvbnMoXG4gICAgdHlwZTogTWlncmF0aW9uSW5kZXhbXCJ0eXBlXCJdLFxuICAgIHdpdGhPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICApOiBQaWNrPE1pZ3JhdGlvbkluZGV4LCBcIm1cIiB8IFwiZWZDb25zdHJ1Y3Rpb25cIiB8IFwibGlzdHNcIj4ge1xuICAgIGlmICh0eXBlID09PSBcImhuc3dcIikge1xuICAgICAgY29uc3Qgb3B0aW9uczogUGljazxNaWdyYXRpb25JbmRleCwgXCJtXCIgfCBcImVmQ29uc3RydWN0aW9uXCI+ID0ge307XG4gICAgICBjb25zdCBtID0gdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubSk7XG4gICAgICBjb25zdCBlZkNvbnN0cnVjdGlvbiA9IHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmVmX2NvbnN0cnVjdGlvbik7XG4gICAgICBpZiAobSAhPT0gdW5kZWZpbmVkKSBvcHRpb25zLm0gPSBtO1xuICAgICAgaWYgKGVmQ29uc3RydWN0aW9uICE9PSB1bmRlZmluZWQpIG9wdGlvbnMuZWZDb25zdHJ1Y3Rpb24gPSBlZkNvbnN0cnVjdGlvbjtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VJbnRlZ2VyT3B0aW9uKHdpdGhPcHRpb25zLmxpc3RzKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBsaXN0czogdGhpcy5wYXJzZUludGVnZXJPcHRpb24od2l0aE9wdGlvbnMubGlzdHMpIH1cbiAgICAgICAgOiB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW50ZWdlck9wdGlvbih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdEluZGV4Q29sdW1uT3BjbGFzcyhjb2x1bW5EZWZpbml0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghY29sdW1uRGVmaW5pdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB0cmltbWVkID0gY29sdW1uRGVmaW5pdGlvblxuICAgICAgLnJlcGxhY2UoL1xccytOVUxMU1xccysoRklSU1R8TEFTVClcXHMqJC9pLCBcIlwiKVxuICAgICAgLnJlcGxhY2UoL1xccysoQVNDfERFU0MpXFxzKiQvaSwgXCJcIilcbiAgICAgIC50cmltKCk7XG4gICAgY29uc3QgdG9rZW5zID0gdGhpcy50b2tlbml6ZVRvcExldmVsKHRyaW1tZWQpO1xuXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDJdPy50b1VwcGVyQ2FzZSgpID09PSBcIkNPTExBVEVcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9rZW5zLmF0KC0xKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbmRleERlZmluaXRpb24oaW5kZXhEZWZpbml0aW9uOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY2Nlc3NNZXRob2QgPSBpbmRleERlZmluaXRpb24ubWF0Y2goL1xcYlVTSU5HXFxzKyhbYS16X11bXFx3XSopL2kpPy5bMV0/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdXNpbmdNYXRjaEluZGV4ID0gaW5kZXhEZWZpbml0aW9uLnNlYXJjaCgvXFxiVVNJTkdcXGIvaSk7XG4gICAgY29uc3QgY29sdW1uc1N0YXJ0ID0gdXNpbmdNYXRjaEluZGV4ID49IDAgPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgdXNpbmdNYXRjaEluZGV4KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbnNFbmQgPVxuICAgICAgY29sdW1uc1N0YXJ0ID49IDAgPyB0aGlzLmZpbmRNYXRjaGluZ1BhcmVudGhlc2lzKGluZGV4RGVmaW5pdGlvbiwgY29sdW1uc1N0YXJ0KSA6IC0xO1xuICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb25zID1cbiAgICAgIGNvbHVtbnNTdGFydCA+PSAwICYmIGNvbHVtbnNFbmQgPiBjb2x1bW5zU3RhcnRcbiAgICAgICAgPyB0aGlzLnNwbGl0VG9wTGV2ZWwoaW5kZXhEZWZpbml0aW9uLnNsaWNlKGNvbHVtbnNTdGFydCArIDEsIGNvbHVtbnNFbmQpLCBcIixcIilcbiAgICAgICAgOiBbXTtcblxuICAgIGNvbnN0IHdpdGhNYXRjaCA9IC9cXGJXSVRIXFxzKlxcKC9pLmV4ZWMoaW5kZXhEZWZpbml0aW9uKTtcbiAgICBjb25zdCB3aXRoU3RhcnQgPSB3aXRoTWF0Y2ggPyBpbmRleERlZmluaXRpb24uaW5kZXhPZihcIihcIiwgd2l0aE1hdGNoLmluZGV4KSA6IC0xO1xuICAgIGNvbnN0IHdpdGhFbmQgPSB3aXRoU3RhcnQgPj0gMCA/IHRoaXMuZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoaW5kZXhEZWZpbml0aW9uLCB3aXRoU3RhcnQpIDogLTE7XG4gICAgY29uc3Qgd2l0aE9wdGlvbnMgPVxuICAgICAgd2l0aFN0YXJ0ID49IDAgJiYgd2l0aEVuZCA+IHdpdGhTdGFydFxuICAgICAgICA/IHRoaXMucGFyc2VJbmRleE9wdGlvbkVudHJpZXMoaW5kZXhEZWZpbml0aW9uLnNsaWNlKHdpdGhTdGFydCArIDEsIHdpdGhFbmQpKVxuICAgICAgICA6IHt9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc01ldGhvZCxcbiAgICAgIGNvbHVtbkRlZmluaXRpb25zLFxuICAgICAgd2l0aE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VJbmRleE9wdGlvbkVudHJpZXMob3B0aW9uU291cmNlOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdFRvcExldmVsKG9wdGlvblNvdXJjZSwgXCIsXCIpLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigocmVzdWx0LCBlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IGVudHJ5LnRyaW0oKS5tYXRjaCgvXihbYS16X11bXFx3XSopXFxzKj1cXHMqKC4rKSQvaSk7XG4gICAgICBpZiAoIW1hdGNoZWQpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgWywga2V5LCByYXdWYWx1ZV0gPSBtYXRjaGVkO1xuICAgICAgcmVzdWx0W2tleS50b0xvd2VyQ2FzZSgpXSA9IHJhd1ZhbHVlLnRyaW0oKS5yZXBsYWNlKC9eWydcIl18WydcIl0kL2csIFwiXCIpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0VG9wTGV2ZWwoc291cmNlOiBzdHJpbmcsIGRlbGltaXRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGl0ZW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IHBhcmVuRGVwdGggPSAwO1xuICAgIGxldCBicmFja2V0RGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzb3VyY2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgIGNvbnN0IG5leHRDaGFyID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChjaGFyID09PSBcIidcIiAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoaW5TaW5nbGVRdW90ZSAmJiBuZXh0Q2hhciA9PT0gXCInXCIpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluU2luZ2xlUXVvdGUgPSAhaW5TaW5nbGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSAnXCInICYmICFpblNpbmdsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpbkRvdWJsZVF1b3RlICYmIG5leHRDaGFyID09PSAnXCInKSB7XG4gICAgICAgICAgaW5kZXggKz0gMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpbkRvdWJsZVF1b3RlID0gIWluRG91YmxlUXVvdGU7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5TaW5nbGVRdW90ZSB8fCBpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgcGFyZW5EZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIilcIikge1xuICAgICAgICBwYXJlbkRlcHRoIC09IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoYXIgPT09IFwiW1wiKSB7XG4gICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICBicmFja2V0RGVwdGggLT0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBkZWxpbWl0ZXIgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgaXRlbXMucHVzaChzb3VyY2Uuc2xpY2Uoc3RhcnQsIGluZGV4KS50cmltKCkpO1xuICAgICAgICBzdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0YWlsID0gc291cmNlLnNsaWNlKHN0YXJ0KS50cmltKCk7XG4gICAgaWYgKHRhaWwubGVuZ3RoID4gMCkge1xuICAgICAgaXRlbXMucHVzaCh0YWlsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwcml2YXRlIHRva2VuaXplVG9wTGV2ZWwoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGFydCA9IC0xO1xuICAgIGxldCBwYXJlbkRlcHRoID0gMDtcbiAgICBsZXQgYnJhY2tldERlcHRoID0gMDtcbiAgICBsZXQgaW5TaW5nbGVRdW90ZSA9IGZhbHNlO1xuICAgIGxldCBpbkRvdWJsZVF1b3RlID0gZmFsc2U7XG5cbiAgICBjb25zdCBwdXNoVG9rZW4gPSAoZW5kSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gc291cmNlLnNsaWNlKHN0YXJ0LCBlbmRJbmRleCkudHJpbSgpO1xuICAgICAgaWYgKHRva2VuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSAtMTtcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5TaW5nbGVRdW90ZSAmJiAhaW5Eb3VibGVRdW90ZSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gXCIoXCIpIHtcbiAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgICAgICBzdGFydCA9IGluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbkRlcHRoICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgICAgcGFyZW5EZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIltcIikge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyYWNrZXREZXB0aCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyID09PSBcIl1cIikge1xuICAgICAgICAgIGJyYWNrZXREZXB0aCAtPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9cXHMvLnRlc3QoY2hhcikgJiYgcGFyZW5EZXB0aCA9PT0gMCAmJiBicmFja2V0RGVwdGggPT09IDApIHtcbiAgICAgICAgICBwdXNoVG9rZW4oaW5kZXgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSBpbmRleDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoVG9rZW4oc291cmNlLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIHByaXZhdGUgZmluZE1hdGNoaW5nUGFyZW50aGVzaXMoc291cmNlOiBzdHJpbmcsIG9wZW5JbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBpblNpbmdsZVF1b3RlID0gZmFsc2U7XG4gICAgbGV0IGluRG91YmxlUXVvdGUgPSBmYWxzZTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gb3BlbkluZGV4OyBpbmRleCA8IHNvdXJjZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgY29uc3QgbmV4dENoYXIgPSBzb3VyY2VbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGNoYXIgPT09IFwiJ1wiICYmICFpbkRvdWJsZVF1b3RlKSB7XG4gICAgICAgIGlmIChpblNpbmdsZVF1b3RlICYmIG5leHRDaGFyID09PSBcIidcIikge1xuICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5TaW5nbGVRdW90ZSA9ICFpblNpbmdsZVF1b3RlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09ICdcIicgJiYgIWluU2luZ2xlUXVvdGUpIHtcbiAgICAgICAgaWYgKGluRG91YmxlUXVvdGUgJiYgbmV4dENoYXIgPT09ICdcIicpIHtcbiAgICAgICAgICBpbmRleCArPSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGluRG91YmxlUXVvdGUgPSAhaW5Eb3VibGVRdW90ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpblNpbmdsZVF1b3RlIHx8IGluRG91YmxlUXVvdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFyID09PSBcIihcIikge1xuICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYXIgPT09IFwiKVwiKSB7XG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7YWM7J2067iU7J2YIFBL66W8IOywuOyhsO2VmOuKlCDri6Trpbgg7YWM7J2067iU7J2YIEZLIOuqqeuhneydhCDsobDtmoztlanri4jri6QuXG4gICAqIFBLIO2DgOyehSDrs4Dqsr0g7IucIOq0gOugqCBGSyDsoJzslb3sobDqsbTsnYQg7IKt7KCcL+uzteq1rO2VmOq4sCDsnITtlbQg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2V0UmVmZXJlbmNpbmdGb3JlaWduS2V5cyhkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFJlZmVyZW5jaW5nRm9yZWlnbktleVtdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBTRUxFQ1RcbiAgICAgICAgdGMudGFibGVfbmFtZSxcbiAgICAgICAgdGMuY29uc3RyYWludF9uYW1lLFxuICAgICAgICBrY3UuY29sdW1uX25hbWUsXG4gICAgICAgIGNjdS50YWJsZV9uYW1lIEFTIHJlZmVyZW5jZWRfdGFibGVfbmFtZSxcbiAgICAgICAgY2N1LmNvbHVtbl9uYW1lIEFTIHJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIHJjLnVwZGF0ZV9ydWxlLFxuICAgICAgICByYy5kZWxldGVfcnVsZVxuICAgICAgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVfY29uc3RyYWludHMgQVMgdGNcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmtleV9jb2x1bW5fdXNhZ2UgQVMga2N1XG4gICAgICAgIE9OIHRjLmNvbnN0cmFpbnRfbmFtZSA9IGtjdS5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9IGtjdS50YWJsZV9zY2hlbWFcbiAgICAgIEpPSU4gaW5mb3JtYXRpb25fc2NoZW1hLmNvbnN0cmFpbnRfY29sdW1uX3VzYWdlIEFTIGNjdVxuICAgICAgICBPTiBjY3UuY29uc3RyYWludF9uYW1lID0gdGMuY29uc3RyYWludF9uYW1lXG4gICAgICAgIEFORCBjY3UudGFibGVfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBKT0lOIGluZm9ybWF0aW9uX3NjaGVtYS5yZWZlcmVudGlhbF9jb25zdHJhaW50cyBBUyByY1xuICAgICAgICBPTiByYy5jb25zdHJhaW50X25hbWUgPSB0Yy5jb25zdHJhaW50X25hbWVcbiAgICAgICAgQU5EIHJjLmNvbnN0cmFpbnRfc2NoZW1hID0gdGMudGFibGVfc2NoZW1hXG4gICAgICBXSEVSRSB0Yy5jb25zdHJhaW50X3R5cGUgPSAnRk9SRUlHTiBLRVknXG4gICAgICAgIEFORCBjY3UudGFibGVfbmFtZSA9ID9cbiAgICAgICAgQU5EIHRjLnRhYmxlX3NjaGVtYSA9ICdwdWJsaWMnXG4gICAgYDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLnJhdyhxdWVyeSwgW3RhYmxlTmFtZV0pO1xuICAgIHJldHVybiByZXN1bHQucm93cy5tYXAoXG4gICAgICAocm93OiB7XG4gICAgICAgIHRhYmxlX25hbWU6IHN0cmluZztcbiAgICAgICAgY29uc3RyYWludF9uYW1lOiBzdHJpbmc7XG4gICAgICAgIGNvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHJlZmVyZW5jZWRfdGFibGVfbmFtZTogc3RyaW5nO1xuICAgICAgICByZWZlcmVuY2VkX2NvbHVtbl9uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVwZGF0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICAgIGRlbGV0ZV9ydWxlOiBzdHJpbmc7XG4gICAgICB9KSA9PiAoe1xuICAgICAgICB0YWJsZU5hbWU6IHJvdy50YWJsZV9uYW1lLFxuICAgICAgICBjb25zdHJhaW50TmFtZTogcm93LmNvbnN0cmFpbnRfbmFtZSxcbiAgICAgICAgY29sdW1uTmFtZTogcm93LmNvbHVtbl9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiByb3cucmVmZXJlbmNlZF90YWJsZV9uYW1lLFxuICAgICAgICByZWZlcmVuY2VkQ29sdW1uTmFtZTogcm93LnJlZmVyZW5jZWRfY29sdW1uX25hbWUsXG4gICAgICAgIG9uVXBkYXRlOiB0aGlzLm1hcENvbnN0cmFpbnRBY3Rpb24ocm93LnVwZGF0ZV9ydWxlKSxcbiAgICAgICAgb25EZWxldGU6IHRoaXMubWFwQ29uc3RyYWludEFjdGlvbihyb3cuZGVsZXRlX3J1bGUpLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2ZWN0b3Ig7Lus65+87J2YIGRpbWVuc2lvbnPrpbwg7KGw7ZqM7ZWp64uI64ukLlxuICAgKiBwZ19hdHRyaWJ1dGXsnZggYXR0dHlwbW9k7JeQ7IScIOywqOybkCDsiJjrpbwg7LaU7Lac7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRWZWN0b3JEaW1lbnNpb25zKFxuICAgIGNvbXBhcmVEQjogUmF3Q2FwYWJsZUtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRWZWN0b3JEaW1lbnNpb25zQWxsKGNvbXBhcmVEQiwgdGFibGVOYW1lKSkuZ2V0KHRhYmxlTmFtZSkgPz8ge307XG4gIH1cblxuICAvKipcbiAgICogdmVjdG9yIOy7rOufvOydmCBkaW1lbnNpb25z66W8IO2FjOydtOu4lOuzhOuhnCDsobDtmoztlanri4jri6QuXG4gICAqIHRhYmxlTmFtZeydhCDsg53rnrXtlZjrqbQgcHVibGljIOyKpO2CpOuniCDsoITssrTrpbwg7ZWcIOuyiOyXkCDsobDtmoztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFZlY3RvckRpbWVuc2lvbnNBbGwoXG4gICAgY29tcGFyZURCOiBSYXdDYXBhYmxlS25leCxcbiAgICB0YWJsZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8TWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIFNFTEVDVFxuICAgICAgICBjLnJlbG5hbWUgYXMgdGFibGVfbmFtZSxcbiAgICAgICAgYS5hdHRuYW1lIGFzIGNvbHVtbl9uYW1lLFxuICAgICAgICBhLmF0dHR5cG1vZCBhcyBkaW1lbnNpb25zXG4gICAgICBGUk9NIHBnX2F0dHJpYnV0ZSBhXG4gICAgICBKT0lOIHBnX2NsYXNzIGMgT04gYS5hdHRyZWxpZCA9IGMub2lkXG4gICAgICBKT0lOIHBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgIEpPSU4gcGdfdHlwZSB0IE9OIGEuYXR0dHlwaWQgPSB0Lm9pZFxuICAgICAgV0hFUkUgdC50eXBuYW1lID0gJ3ZlY3RvcidcbiAgICAgICAgQU5EIGEuYXR0bnVtID4gMFxuICAgICAgICBBTkQgbi5uc3BuYW1lID0gJ3B1YmxpYydcbiAgICAgICAgJHt0YWJsZU5hbWUgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBcIkFORCBjLnJlbG5hbWUgPSA/XCJ9XG4gICAgYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb21wYXJlREIucmF3KHF1ZXJ5LCB0YWJsZU5hbWUgPT09IHVuZGVmaW5lZCA/IFtdIDogW3RhYmxlTmFtZV0pO1xuXG4gICAgY29uc3QgZGltZW5zaW9uc0J5VGFibGUgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnNCeVRhYmxlLmdldChyb3cudGFibGVfbmFtZSkgPz8ge307XG4gICAgICAvLyBhdHR0eXBtb2Tsl5DshJwg7Iuk7KCcIGRpbWVuc2lvbnMg6rCSIOy2lOy2nFxuICAgICAgZGltZW5zaW9uc1tyb3cuY29sdW1uX25hbWVdID0gcm93LmRpbWVuc2lvbnMgPiAwID8gcm93LmRpbWVuc2lvbnMgOiAwO1xuICAgICAgZGltZW5zaW9uc0J5VGFibGUuc2V0KHJvdy50YWJsZV9uYW1lLCBkaW1lbnNpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpbWVuc2lvbnNCeVRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3RncmVTUUwg7Lus65+8IO2DgOyeheydhCDrtoTshJ3tlZjsl6wgTWlncmF0aW9uQ29sdW1uIOqwneyytOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqL1xuICByZXNvbHZlREJDb2xUeXBlKFxuICAgIGRiQ29sdW1uOiBQZ0NvbHVtbixcbiAgKTogUGljazxcbiAgICBNaWdyYXRpb25Db2x1bW4sXG4gICAgXCJ0eXBlXCIgfCBcImxlbmd0aFwiIHwgXCJwcmVjaXNpb25cIiB8IFwic2NhbGVcIiB8IFwibnVtYmVyVHlwZVwiIHwgXCJkaW1lbnNpb25zXCJcbiAgPiB7XG4gICAgY29uc3QgeyB1ZHRfbmFtZTogX3VkdF9uYW1lLCBjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGgsIHByZWNpc2lvbiwgbnVtZXJpY19zY2FsZSB9ID0gZGJDb2x1bW47XG5cbiAgICBjb25zdCB7IHVkdF9uYW1lLCBzaW5nbGVPckFycmF5IH0gPSAoKCkgPT4ge1xuICAgICAgaWYgKF91ZHRfbmFtZS5zdGFydHNXaXRoKFwiX1wiKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUuc3Vic3RyaW5nKDEpLFxuICAgICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiW11cIiBhcyBjb25zdCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHVkdF9uYW1lOiBfdWR0X25hbWUsXG4gICAgICAgIHNpbmdsZU9yQXJyYXk6IFwiXCIgYXMgY29uc3QsXG4gICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyBVVUlEXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYHV1aWQke3NpbmdsZU9yQXJyYXl9YCB9O1xuICAgIH1cblxuICAgIC8vIEludGVnZXIgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwiaW50NFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgaW50ZWdlciR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJpbnQ4XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBiaWdJbnRlZ2VyJHtzaW5nbGVPckFycmF5fWAgfTtcbiAgICB9XG5cbiAgICAvLyBTdHJpbmcgdHlwZXNcbiAgICBpZiAodWR0X25hbWUgPT09IFwidmFyY2hhclwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgc3RyaW5nJHtzaW5nbGVPckFycmF5fWAsXG4gICAgICAgIC4uLihjaGFyYWN0ZXJfbWF4aW11bV9sZW5ndGggJiYge1xuICAgICAgICAgIGxlbmd0aDogY2hhcmFjdGVyX21heGltdW1fbGVuZ3RoLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0ZXh0XCIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IGBzdHJpbmcke3NpbmdsZU9yQXJyYXl9YCB9OyAvLyBTdHJpbmdQcm9wIHdpdGhvdXQgbGVuZ3RoXG4gICAgfVxuXG4gICAgLy8gTnVtYmVyT3JOdW1lcmljIHR5cGVzXG4gICAgaWYgKHVkdF9uYW1lID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY29uc3QgbnVtZXJpY01ldGFkYXRhID1cbiAgICAgICAgZGVjb2RlTnVtZXJpY1R5cGVNb2RpZmllcihkYkNvbHVtbi5hdHR0eXBtb2QpID8/XG4gICAgICAgIChwcmVjaXNpb24gIT09IG51bGwgJiYgbnVtZXJpY19zY2FsZSAhPT0gbnVsbCA/IHsgcHJlY2lzaW9uLCBzY2FsZTogbnVtZXJpY19zY2FsZSB9IDoge30pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICBudW1iZXJUeXBlOiBcIm51bWVyaWNcIixcbiAgICAgICAgLi4ubnVtZXJpY01ldGFkYXRhLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHVkdF9uYW1lID09PSBcImZsb2F0NFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgbnVtYmVyT3JOdW1lcmljJHtzaW5nbGVPckFycmF5fWAsIG51bWJlclR5cGU6IFwicmVhbFwiIH07XG4gICAgfVxuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJmbG9hdDhcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogYG51bWJlck9yTnVtZXJpYyR7c2luZ2xlT3JBcnJheX1gLCBudW1iZXJUeXBlOiBcImRvdWJsZSBwcmVjaXNpb25cIiB9O1xuICAgIH1cblxuICAgIC8vIEJvb2xlYW5cbiAgICBpZiAodWR0X25hbWUgPT09IFwiYm9vbFwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBgYm9vbGVhbiR7c2luZ2xlT3JBcnJheX1gIH07XG4gICAgfVxuXG4gICAgLy8gVGltZXN0YW1weiB0eXBlc1xuICAgIGlmICh1ZHRfbmFtZSA9PT0gXCJ0aW1lc3RhbXB0elwiKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBgZGF0ZSR7c2luZ2xlT3JBcnJheX1gLFxuICAgICAgICAuLi4ocHJlY2lzaW9uICE9PSBudWxsICYmIHtcbiAgICAgICAgICBwcmVjaXNpb246IHByZWNpc2lvbixcbiAgICAgICAgfSksXG4gICAgICB9OyAvLyBEYXRlUHJvcCDihpIgdGltZXN0YW1wdHpcbiAgICB9XG5cbiAgICAvLyBKU09OXG4gICAgaWYgKHVkdF9uYW1lID09PSBcImpzb25cIiB8fCB1ZHRfbmFtZSA9PT0gXCJqc29uYlwiKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcImpzb25cIiB9O1xuICAgIH1cblxuICAgIC8vIFZlY3RvciAocGd2ZWN0b3IpXG4gICAgaWYgKHVkdF9uYW1lID09PSBcInZlY3RvclwiKSB7XG4gICAgICAvLyB2ZWN0b3Ig7YOA7J6F7J2YIOywqOybkCDsiJjripQgY29sdW1uX2RlZmF1bHTrgpgg67OE64+EIOy/vOumrOuhnCDtmZXsnbjtlbTslbwg7ZWoXG4gICAgICAvLyDtmITsnqzripQg6riw67O46rCSIDDsnLzroZwg7ISk7KCVICjsi6TsoJwgZGltZW5zaW9uc+uKlCBnZXRNaWdyYXRpb25TZXRGcm9tRELsl5DshJwg67OE64+EIOy/vOumrOuhnCDtmZXsnbgpXG4gICAgICByZXR1cm4geyB0eXBlOiBgdmVjdG9yJHtzaW5nbGVPckFycmF5fWAsIGRpbWVuc2lvbnM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyB0c3ZlY3RvciAoUG9zdGdyZVNRTCDsoITrrLgg6rKA7IOJ7JqpIO2DgOyehSlcbiAgICBpZiAodWR0X25hbWUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0c3ZlY3RvclwiIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGByZXNvbHZlIOu2iOqwgOuKpe2VnCBQb3N0Z3JlU1FMIOy7rOufvCDtg4DsnoU6ICR7dWR0X25hbWV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxTY2hlbWFSZWFkZXIgPSBuZXcgUG9zdGdyZVNRTFNjaGVtYVJlYWRlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUErRUEsU0FBUywwQkFDUCxjQUNxRDtDQUNyRCxJQUFJLGlCQUFpQixVQUFhLGlCQUFpQixRQUFRLGVBQWUsR0FDeEUsT0FBTztDQUlULE1BQU0sV0FBVyxlQUFlO0NBQ2hDLE1BQU0sWUFBWSxhQUFhO0NBQy9CLE1BQU0sZ0JBQWdCLFdBQVc7Q0FFakMsT0FBTztFQUFFO0VBQVcsT0FETixpQkFBaUIsT0FBTyxnQkFBZ0IsT0FBTztDQUNuQztBQUM1Qjs7O0NBRU0sOEJBQU4sTUFBa0M7RUFDaEMsb0NBQXFDLElBQUksSUFBSTtHQUFDO0dBQVM7R0FBUTtHQUFPO0dBQVE7RUFBVSxDQUFDOzs7Ozs7O0VBUXpGLE1BQU0sc0JBQ0osV0FDQSxPQUM4QjtHQUM5QixJQUFJLFdBQXVCLFdBQXNCO0dBQ2pELElBQUk7SUFDRixDQUFDLFdBQVcsV0FBVyxjQUFjLE1BQU0sS0FBSyxVQUFVLFdBQVcsS0FBSztHQUM1RSxTQUFTLEdBQVk7SUFDbkIsSUFBSSxhQUFhLFNBQVMsRUFBRSxRQUFRLFNBQVMsaUJBQWlCLEdBQzVE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
|
package/package.json
CHANGED
|
@@ -32,6 +32,9 @@ type ColumnDefinitionResult = {
|
|
|
32
32
|
raw: string[];
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
+
const NUMERIC_DEFAULT_PRECISION = 8;
|
|
36
|
+
const NUMERIC_DEFAULT_SCALE = 2;
|
|
37
|
+
|
|
35
38
|
type SearchTextHelperKind = "text-array" | "jsonb-array";
|
|
36
39
|
|
|
37
40
|
type SearchTextExpressionToken =
|
|
@@ -929,7 +932,8 @@ function getPgArrayType(column: MigrationColumn, elementType: string): string {
|
|
|
929
932
|
if (elementType === "numberOrNumeric") {
|
|
930
933
|
if (column.numberType === "real") return "real[]";
|
|
931
934
|
if (column.numberType === "double precision") return "double precision[]";
|
|
932
|
-
|
|
935
|
+
if (column.precision === undefined && column.scale === undefined) return "numeric[]";
|
|
936
|
+
return `numeric(${column.precision ?? NUMERIC_DEFAULT_PRECISION}, ${column.scale ?? NUMERIC_DEFAULT_SCALE})[]`;
|
|
933
937
|
}
|
|
934
938
|
if (elementType === "string") {
|
|
935
939
|
return column.length ? `varchar(${column.length})[]` : "text[]";
|
|
@@ -1350,26 +1354,51 @@ async function generateAlterCode_ColumnAndIndexes(
|
|
|
1350
1354
|
/**
|
|
1351
1355
|
* 컬럼 비교를 위해 Generated Column의 expression을 제외한 객체를 생성
|
|
1352
1356
|
*/
|
|
1357
|
+
function normalizeJsonbEmptyDefaultForComparison<Value>(defaultTo: Value): Value | string {
|
|
1358
|
+
if (!isStringValue(defaultTo)) {
|
|
1359
|
+
return defaultTo;
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
const withoutCast = defaultTo
|
|
1363
|
+
.trim()
|
|
1364
|
+
.replace(/::\s*jsonb$/i, "")
|
|
1365
|
+
.trim();
|
|
1366
|
+
if (withoutCast === "'[]'" || withoutCast === '"[]"') {
|
|
1367
|
+
return '"[]"';
|
|
1368
|
+
}
|
|
1369
|
+
if (withoutCast === "'{}'" || withoutCast === '"{}"') {
|
|
1370
|
+
return '"{}"';
|
|
1371
|
+
}
|
|
1372
|
+
return defaultTo;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1353
1375
|
function normalizeColumnForComparison(
|
|
1354
1376
|
col: MigrationColumn,
|
|
1355
1377
|
searchTextColumnNames: Set<string>,
|
|
1356
1378
|
): MigrationColumn {
|
|
1357
|
-
|
|
1358
|
-
|
|
1379
|
+
const normalizedDefaultTo =
|
|
1380
|
+
col.type === "json" && col.defaultTo !== undefined
|
|
1381
|
+
? normalizeJsonbEmptyDefaultForComparison(col.defaultTo)
|
|
1382
|
+
: col.defaultTo;
|
|
1383
|
+
const normalizedColumn =
|
|
1384
|
+
normalizedDefaultTo === col.defaultTo ? col : { ...col, defaultTo: normalizedDefaultTo };
|
|
1385
|
+
|
|
1386
|
+
if (!normalizedColumn.generated) {
|
|
1387
|
+
return normalizedColumn;
|
|
1359
1388
|
}
|
|
1360
1389
|
|
|
1361
|
-
if (!searchTextColumnNames.has(
|
|
1390
|
+
if (!searchTextColumnNames.has(normalizedColumn.name)) {
|
|
1362
1391
|
return {
|
|
1363
|
-
...
|
|
1392
|
+
...normalizedColumn,
|
|
1364
1393
|
generated: undefined,
|
|
1365
1394
|
};
|
|
1366
1395
|
}
|
|
1367
1396
|
|
|
1368
1397
|
return {
|
|
1369
|
-
...
|
|
1398
|
+
...normalizedColumn,
|
|
1370
1399
|
generated: {
|
|
1371
|
-
...
|
|
1372
|
-
expression: canonicalizeSearchTextGeneratedExpression(
|
|
1400
|
+
...normalizedColumn.generated,
|
|
1401
|
+
expression: canonicalizeSearchTextGeneratedExpression(normalizedColumn.generated.expression),
|
|
1373
1402
|
},
|
|
1374
1403
|
};
|
|
1375
1404
|
}
|
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
isHasManyRelationProp,
|
|
8
8
|
isManyToManyRelationProp,
|
|
9
9
|
isNumberProp,
|
|
10
|
+
isNumberSingleProp,
|
|
10
11
|
isNumericProp,
|
|
12
|
+
isNumericSingleProp,
|
|
11
13
|
isOneToOneRelationProp,
|
|
12
14
|
isRelationProp,
|
|
13
15
|
isStringProp,
|
|
@@ -74,10 +76,18 @@ export function getMigrationSetFromEntity(entity: Entity): MigrationSetAndJoinTa
|
|
|
74
76
|
// 만들어지는데, DB에서는 그 값이 그대로 읽히므로 엔티티 쪽을 undefined로 두면
|
|
75
77
|
// 매번 불일치로 잡힌다. 비교 전에 같은 기본값을 채워 실제 스키마와 맞춘다.
|
|
76
78
|
if (numberType === "numeric") {
|
|
79
|
+
if (isNumberSingleProp(prop) || isNumericSingleProp(prop)) {
|
|
80
|
+
return {
|
|
81
|
+
numberType,
|
|
82
|
+
precision: prop.precision ?? NUMERIC_DEFAULT_PRECISION,
|
|
83
|
+
scale: prop.scale ?? NUMERIC_DEFAULT_SCALE,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
77
87
|
return {
|
|
78
88
|
numberType,
|
|
79
|
-
precision: prop.precision
|
|
80
|
-
scale: prop.scale
|
|
89
|
+
...(prop.precision !== undefined && { precision: prop.precision }),
|
|
90
|
+
...(prop.scale !== undefined && { scale: prop.scale }),
|
|
81
91
|
};
|
|
82
92
|
}
|
|
83
93
|
|