sonamu 0.7.15 → 0.7.17
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/ai/providers/rtzr/error.d.ts +1 -1
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/api/config.d.ts +1 -0
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/decorators.d.ts +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +1 -1
- package/dist/api/sonamu.d.ts +3 -1
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +51 -40
- package/dist/database/base-model.d.ts +16 -6
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +44 -3
- package/dist/database/base-model.types.d.ts +29 -48
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +12 -2
- package/dist/database/puri.d.ts +2 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +2 -1
- package/dist/database/puri.types.d.ts +3 -3
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/entity/entity-manager.d.ts +8 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity.d.ts +10 -1
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +84 -39
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/syncer/checksum.d.ts +8 -3
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +17 -9
- package/dist/syncer/code-generator.js +7 -2
- package/dist/syncer/syncer.d.ts +6 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +27 -13
- package/dist/tasks/workflow-manager.d.ts +3 -3
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +15 -11
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +8 -6
- package/dist/template/implementations/model.template.js +5 -5
- package/dist/template/implementations/services.template.d.ts +17 -0
- package/dist/template/implementations/services.template.d.ts.map +1 -0
- package/dist/template/implementations/services.template.js +159 -0
- package/dist/template/implementations/view_form.template.js +2 -2
- package/dist/template/implementations/view_id_async_select.template.js +2 -2
- package/dist/template/implementations/view_list.template.js +5 -5
- package/dist/types/types.d.ts +43 -25
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +29 -17
- package/dist/ui/ai-api.d.ts +2 -0
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +43 -49
- package/dist/ui/ai-client.d.ts +10 -0
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +457 -437
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +14 -3
- package/dist/ui-web/assets/{index-J9MCfjCd.js → index-DzqUrTB-.js} +56 -59
- package/dist/ui-web/index.html +1 -1
- package/package.json +12 -8
- package/src/api/config.ts +3 -0
- package/src/api/decorators.ts +6 -1
- package/src/api/sonamu.ts +71 -52
- package/src/database/base-model.ts +66 -11
- package/src/database/base-model.types.ts +79 -76
- package/src/database/puri.ts +5 -1
- package/src/database/puri.types.ts +3 -6
- package/src/entity/entity.ts +83 -34
- package/src/index.ts +1 -0
- package/src/shared/app.shared.ts.txt +1 -1
- package/src/shared/web.shared.ts.txt +0 -43
- package/src/syncer/checksum.ts +31 -9
- package/src/syncer/code-generator.ts +8 -1
- package/src/syncer/syncer.ts +38 -26
- package/src/tasks/workflow-manager.ts +16 -12
- package/src/template/implementations/generated.template.ts +17 -3
- package/src/template/implementations/model.template.ts +4 -4
- package/src/template/implementations/services.template.ts +226 -0
- package/src/template/implementations/view_form.template.ts +1 -1
- package/src/template/implementations/view_id_async_select.template.ts +1 -1
- package/src/template/implementations/view_list.template.ts +4 -4
- package/src/types/types.ts +33 -16
- package/src/ui/ai-api.ts +61 -60
- package/src/ui/ai-client.ts +535 -499
- package/src/ui/api.ts +14 -2
- package/src/ui/entity.instructions.md +536 -0
- package/dist/template/implementations/service.template.d.ts +0 -29
- package/dist/template/implementations/service.template.d.ts.map +0 -1
- package/dist/template/implementations/service.template.js +0 -202
- package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +0 -1
- package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +0 -1
- package/src/template/implementations/service.template.ts +0 -328
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export type * from "./api/context";
|
|
|
4
4
|
export * from "./api/decorators";
|
|
5
5
|
export * from "./api/sonamu";
|
|
6
6
|
export * from "./database/base-model";
|
|
7
|
+
export * from "./database/base-model.types";
|
|
7
8
|
export * from "./database/db";
|
|
8
9
|
export * from "./database/puri";
|
|
9
10
|
export * from "./database/puri.types";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,mBAAmB,eAAe,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./api/config.js";
|
|
|
3
3
|
export * from "./api/decorators.js";
|
|
4
4
|
export * from "./api/sonamu.js";
|
|
5
5
|
export * from "./database/base-model.js";
|
|
6
|
+
export * from "./database/base-model.types.js";
|
|
6
7
|
export * from "./database/db.js";
|
|
7
8
|
export * from "./database/puri.js";
|
|
8
9
|
export * from "./database/puri.types.js";
|
|
@@ -32,4 +33,4 @@ export * from "./utils/type-utils.js";
|
|
|
32
33
|
export * from "./utils/utils.js"; // export * from "./api/code-converters";
|
|
33
34
|
// export * from "./syncer/syncer";
|
|
34
35
|
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9hcGkvYmFzZS1mcmFtZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXBpL2NvbmZpZ1wiO1xuZXhwb3J0IHR5cGUgKiBmcm9tIFwiLi9hcGkvY29udGV4dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXBpL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2FwaS9zb25hbXVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RhdGFiYXNlL2RiXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLnR5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS9wdXJpLXN1YnNldC50eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YWJhc2UvcHVyaS13cmFwcGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGNlcHRpb25zL2Vycm9yLWhhbmRsZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmlsZS1zdG9yYWdlL2RyaXZlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL21pZ3JhdGlvbi1zZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21pZ3JhdGlvbi9taWdyYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3Bvc3RncmVzcWwtc2NoZW1hLXJlYWRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbWlncmF0aW9uL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYWl0ZS9uYWl0ZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbmFpdGUvbmFpdGUtcmVwb3J0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N0cmVhbS9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rhc2tzL2RlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVtcGxhdGUvdGVtcGxhdGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvY29udHJvbGxlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHMvbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3R5cGUtdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzL3V0aWxzXCI7XG5cbi8vIGV4cG9ydCAqIGZyb20gXCIuL2FwaS9jb2RlLWNvbnZlcnRlcnNcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3N5bmNlci9zeW5jZXJcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHNCQUFtQjtBQUNqQyxjQUFjLGtCQUFlO0FBRTdCLGNBQWMsc0JBQW1CO0FBQ2pDLGNBQWMsa0JBQWU7QUFDN0IsY0FBYywyQkFBd0I7QUFDdEMsY0FBYyxpQ0FBOEI7QUFDNUMsY0FBYyxtQkFBZ0I7QUFDOUIsY0FBYyxxQkFBa0I7QUFDaEMsY0FBYywyQkFBd0I7QUFDdEMsY0FBYyxrQ0FBK0I7QUFDN0MsY0FBYyw2QkFBMEI7QUFDeEMsY0FBYywrQkFBNEI7QUFDMUMsY0FBYyxxQkFBa0I7QUFDaEMsY0FBYyw2QkFBMEI7QUFDeEMsY0FBYyxnQ0FBNkI7QUFDM0MsY0FBYyxnQ0FBNkI7QUFDM0MsY0FBYywyQkFBd0I7QUFDdEMsY0FBYywrQkFBNEI7QUFDMUMsY0FBYywwQkFBdUI7QUFDckMsY0FBYywwQ0FBdUM7QUFDckQsY0FBYyx1QkFBb0I7QUFDbEMsY0FBYyxtQkFBZ0I7QUFDOUIsY0FBYyw0QkFBeUI7QUFDdkMsY0FBYyxrQkFBZTtBQUM3QixjQUFjLHVCQUFvQjtBQUNsQyxjQUFjLHlCQUFzQjtBQUNwQyxjQUFjLGlDQUE4QjtBQUM1QyxjQUFjLCtCQUE0QjtBQUMxQyxjQUFjLG1CQUFnQjtBQUM5QixjQUFjLHdCQUFxQjtBQUNuQyxjQUFjLG1CQUFnQjtBQUM5QixjQUFjLHdCQUFxQjtBQUNuQyxjQUFjLG1CQUFnQixDQUU5Qix5Q0FBeUM7Q0FDekMsbUNBQW1DIn0=
|
|
@@ -10,12 +10,17 @@ export declare function findChangedFilesUsingChecksums(): Promise<AbsolutePath[]
|
|
|
10
10
|
* 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
|
|
11
11
|
*/
|
|
12
12
|
export declare function renewChecksums(): Promise<void>;
|
|
13
|
+
export type FileOrData = {
|
|
14
|
+
path: PathLike;
|
|
15
|
+
} | {
|
|
16
|
+
data: string;
|
|
17
|
+
};
|
|
13
18
|
/**
|
|
14
19
|
* 두 파일의 내용이 같은지 체크섬으로 비교합니다.
|
|
15
20
|
* 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
|
|
16
|
-
* @param one 파일 경로
|
|
17
|
-
* @param two 파일 경로
|
|
21
|
+
* @param one 파일 경로 혹은 데이터
|
|
22
|
+
* @param two 파일 경로 혹은 데이터
|
|
18
23
|
* @returns boolean
|
|
19
24
|
*/
|
|
20
|
-
export declare function areFilesSame(
|
|
25
|
+
export declare function areFilesSame(...files: FileOrData[]): Promise<boolean>;
|
|
21
26
|
//# sourceMappingURL=checksum.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAOrD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AASzE;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,IAAI,CAAC;AAOrD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AASzE;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAU9E;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,QAAQ,CAAC;CAChB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB3E"}
|
package/dist/syncer/checksum.js
CHANGED
|
@@ -36,16 +36,19 @@ import { getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
|
|
|
36
36
|
/**
|
|
37
37
|
* 두 파일의 내용이 같은지 체크섬으로 비교합니다.
|
|
38
38
|
* 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
|
|
39
|
-
* @param one 파일 경로
|
|
40
|
-
* @param two 파일 경로
|
|
39
|
+
* @param one 파일 경로 혹은 데이터
|
|
40
|
+
* @param two 파일 경로 혹은 데이터
|
|
41
41
|
* @returns boolean
|
|
42
|
-
*/ export async function areFilesSame(
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
*/ export async function areFilesSame(...files) {
|
|
43
|
+
const checksums = [];
|
|
44
|
+
for (const file of files){
|
|
45
|
+
if ("path" in file && !await exists(file.path)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
checksums.push("path" in file ? await getChecksumOfFile(file.path) : getChecksumOfData(file.data));
|
|
45
49
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return oneChecksum === twoChecksum;
|
|
50
|
+
return checksums.every(// 다음 체크섬과 비교, 만약 마지막 체크섬일 때는 첫 번째 체크섬과 비교
|
|
51
|
+
(checksum, index)=>checksum === checksums[index === checksums.length - 1 ? 0 : index + 1]);
|
|
49
52
|
}
|
|
50
53
|
async function getCurrentChecksums() {
|
|
51
54
|
const filePaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(async ([_fileType, pattern])=>{
|
|
@@ -81,6 +84,11 @@ async function saveChecksums(checksums) {
|
|
|
81
84
|
})), null, 2), "utf-8");
|
|
82
85
|
console.log("checksum saved", checksumFilePath);
|
|
83
86
|
}
|
|
87
|
+
function getChecksumOfData(data) {
|
|
88
|
+
const hash = crypto.createHash("sha1");
|
|
89
|
+
hash.update(data);
|
|
90
|
+
return hash.digest("hex");
|
|
91
|
+
}
|
|
84
92
|
async function getChecksumOfFile(filePath) {
|
|
85
93
|
return new Promise((resolve, reject)=>{
|
|
86
94
|
const hash = crypto.createHash("sha1");
|
|
@@ -95,4 +103,4 @@ async function getChecksumOfFile(filePath) {
|
|
|
95
103
|
});
|
|
96
104
|
}
|
|
97
105
|
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0bywgeyB0eXBlIEJpbmFyeUxpa2UgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuXG50eXBlIFBhdGhBbmRDaGVja3N1bSA9IHtcbiAgcGF0aDogQWJzb2x1dGVQYXRoO1xuICBjaGVja3N1bTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDssrTtgazshKwg7YyM7J287JeQIOyggOyepeuQnCDrgrTsmqnqs7wg7ZiE7J6sIOyLpOygnCDtjIzsnbzsnZgg7LK07YGs7ISs7J2EIOu5hOq1kO2VmOyXrCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyKteuLiOuLpC5cbiAqIEByZXR1cm5zIOuzgOqyveuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCDsiqzrnpjsi5zroZwg7Iuc7J6R7ZWp64uI64ukLiDsmIjsi5w6IFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBkaWZmZXJlbmNlV2l0aChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3VtcywgaXNFcXVhbCkubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuLyoqXG4gKiDrkZAg7YyM7J287J2YIOuCtOyaqeydtCDqsJnsnYDsp4Ag7LK07YGs7ISs7Jy866GcIOu5hOq1kO2VqeuLiOuLpC5cbiAqIOunjOyVvSDtjIzsnbzsnbQg65GYIOykkSDtlZjrgpjrnbzrj4Qg7JeG64uk66m0IOu5hOq1kCDrtojqsIDroZwgZmFsc2Ug67CY7ZmY7ZWp64uI64ukLlxuICogQHBhcmFtIG9uZSDtjIzsnbwg6rK966GcXG4gKiBAcGFyYW0gdHdvIO2MjOydvCDqsr3roZxcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZShvbmU6IFBhdGhMaWtlLCB0d286IFBhdGhMaWtlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhvbmUpKSB8fCAhKGF3YWl0IGV4aXN0cyh0d28pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG9uZUNoZWNrc3VtID0gYXdhaXQgZ2V0Q2hlY2tzdW1PZkZpbGUob25lKTtcbiAgY29uc3QgdHdvQ2hlY2tzdW0gPSBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZSh0d28pO1xuXG4gIHJldHVybiBvbmVDaGVja3N1bSA9PT0gdHdvQ2hlY2tzdW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLm1hcChhc3luYyAoW19maWxlVHlwZSwgcGF0dGVybl0pID0+IHtcbiAgICAgICAgcmV0dXJuIGdsb2JBc3luYyhwYXR0ZXJuKSBhcyBQcm9taXNlPEFic29sdXRlUGF0aFtdPjtcbiAgICAgIH0pLFxuICAgIClcbiAgKVxuICAgIC5mbGF0KClcbiAgICAuc29ydCgpO1xuXG4gIGNvbnN0IGZpbGVDaGVja3N1bXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIHJldHVybiBmaWxlQ2hlY2tzdW1zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQcmV2aW91c0NoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhjaGVja3N1bUZpbGVQYXRoKSkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwcmV2aW91c0NoZWNrc3VtcyA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoY2hlY2tzdW1GaWxlUGF0aCwgXCJ1dGYtOFwiKSkubWFwKFxuICAgIChyOiB7IHBhdGg6IEFwaVJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgICAgcGF0aDogcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkOyEnCDsnb3snYQg65WMOiBBUEkg7IOB64yAIOqyveuhnCDihpIg7KCI64yAIOqyveuhnFxuICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgfSksXG4gICkgYXMgUGF0aEFuZENoZWNrc3VtW107XG4gIHJldHVybiBwcmV2aW91c0NoZWNrc3Vtcztcbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzb25hbXUubG9ja1wiKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDaGVja3N1bXMoY2hlY2tzdW1zOiBQYXRoQW5kQ2hlY2tzdW1bXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjaGVja3N1bUZpbGVQYXRoID0gZ2V0Q2hlY2tzdW1GaWxlUGF0aCgpO1xuICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgY2hlY2tzdW1GaWxlUGF0aCxcbiAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgIGNoZWNrc3Vtcy5tYXAoKHIpID0+ICh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQIOyggOyepe2VoCDrlYw6IOygiOuMgCDqsr3roZwg4oaSIEFQSSDsg4HrjIAg6rK966GcXG4gICAgICAgIGNoZWNrc3VtOiByLmNoZWNrc3VtLFxuICAgICAgfSkpLFxuICAgICAgbnVsbCxcbiAgICAgIDIsXG4gICAgKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGNvbnNvbGUubG9nKFwiY2hlY2tzdW0gc2F2ZWRcIiwgY2hlY2tzdW1GaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoOiBQYXRoTGlrZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGExXCIpO1xuICAgIGNvbnN0IGlucHV0ID0gY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCk7XG4gICAgaW5wdXQub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIGlucHV0Lm9uKFwiZGF0YVwiLCAoY2h1bms6IEJpbmFyeUxpa2UpID0+IHtcbiAgICAgIGhhc2gudXBkYXRlKGNodW5rKTtcbiAgICB9KTtcbiAgICBpbnB1dC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIHJlc29sdmUoaGFzaC5kaWdlc3QoXCJoZXhcIikpO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjcnlwdG8iLCJlcXVhbCIsImNyZWF0ZVJlYWRTdHJlYW0iLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsInBhdGgiLCJpc0VxdWFsIiwiU29uYW11IiwiZ2xvYkFzeW5jIiwiZXhpc3RzIiwiZGlmZmVyZW5jZVdpdGgiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwiY2FsY3VsYXRlZENoZWNrc3VtcyIsImdldEN1cnJlbnRDaGVja3N1bXMiLCJzYXZlZENoZWNrc3VtcyIsImdldFByZXZpb3VzQ2hlY2tzdW1zIiwiaXNTYW1lIiwibWFwIiwiciIsInJlbmV3Q2hlY2tzdW1zIiwic2F2ZUNoZWNrc3VtcyIsImFyZUZpbGVzU2FtZSIsIm9uZSIsInR3byIsIm9uZUNoZWNrc3VtIiwiZ2V0Q2hlY2tzdW1PZkZpbGUiLCJ0d29DaGVja3N1bSIsImZpbGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJPYmplY3QiLCJlbnRyaWVzIiwiX2ZpbGVUeXBlIiwicGF0dGVybiIsImZsYXQiLCJzb3J0IiwiZmlsZUNoZWNrc3VtcyIsImZpbGVQYXRoIiwiY2hlY2tzdW0iLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiY2hlY2tzdW1zIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwicmVzb2x2ZSIsInJlamVjdCIsImhhc2giLCJjcmVhdGVIYXNoIiwiaW5wdXQiLCJvbiIsImNodW5rIiwidXBkYXRlIiwiZGlnZXN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFpQyxTQUFTO0FBQ2pELE9BQU9DLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLGdCQUFnQixRQUF1QixLQUFLO0FBQ3JELFNBQVNDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2xELE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxPQUFPLFFBQVEsVUFBVTtBQUNsQyxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLFNBQVMsUUFBUSwwQkFBdUI7QUFDakQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUUzQyxTQUFTQyxjQUFjLFFBQVEsb0JBQWlCO0FBQ2hELFNBQVNDLHFDQUFxQyxRQUFRLHFCQUFrQjtBQU94RTs7O0NBR0MsR0FDRCxPQUFPLGVBQWVDO0lBQ3BCLE1BQU1DLHNCQUFzQixNQUFNQztJQUNsQyxNQUFNQyxpQkFBaUIsTUFBTUM7SUFFN0IsTUFBTUMsU0FBU2hCLE1BQU1ZLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWLE9BQU8sRUFBRTtJQUNYO0lBRUEsT0FBT1AsZUFBZUcscUJBQXFCRSxnQkFBZ0JULFNBQVNZLEdBQUcsQ0FBQyxDQUFDQyxJQUFNQSxFQUFFZCxJQUFJO0FBQ3ZGO0FBRUE7OztDQUdDLEdBQ0QsT0FBTyxlQUFlZTtJQUNwQixNQUFNUCxzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNoQixNQUFNWSxxQkFBcUJFO0lBQzFDLElBQUlFLFFBQVE7UUFDVjtJQUNGO0lBRUEsTUFBTUksY0FBY1I7QUFDdEI7QUFFQTs7Ozs7O0NBTUMsR0FDRCxPQUFPLGVBQWVTLGFBQWFDLEdBQWEsRUFBRUMsR0FBYTtJQUM3RCxJQUFJLENBQUUsTUFBTWYsT0FBT2MsUUFBUyxDQUFFLE1BQU1kLE9BQU9lLE1BQU87UUFDaEQsT0FBTztJQUNUO0lBRUEsTUFBTUMsY0FBYyxNQUFNQyxrQkFBa0JIO0lBQzVDLE1BQU1JLGNBQWMsTUFBTUQsa0JBQWtCRjtJQUU1QyxPQUFPQyxnQkFBZ0JFO0FBQ3pCO0FBRUEsZUFBZWI7SUFDYixNQUFNYyxZQUFZLEFBQ2hCLENBQUEsTUFBTUMsUUFBUUMsR0FBRyxDQUNmQyxPQUFPQyxPQUFPLENBQUNyQix5Q0FBeUNPLEdBQUcsQ0FBQyxPQUFPLENBQUNlLFdBQVdDLFFBQVE7UUFDckYsT0FBTzFCLFVBQVUwQjtJQUNuQixHQUNGLEVBRUNDLElBQUksR0FDSkMsSUFBSTtJQUVQLE1BQU1DLGdCQUFnQixNQUFNUixRQUFRQyxHQUFHLENBQ3JDRixVQUFVVixHQUFHLENBQUMsT0FBT29CO1FBQ25CLE9BQU87WUFDTGpDLE1BQU1pQztZQUNOQyxVQUFVLE1BQU1iLGtCQUFrQlk7UUFDcEM7SUFDRjtJQUdGLE9BQU9EO0FBQ1Q7QUFFQSxlQUFlckI7SUFDYixNQUFNd0IsbUJBQW1CQztJQUN6QixJQUFJLENBQUUsTUFBTWhDLE9BQU8rQixtQkFBb0I7UUFDckMsT0FBTyxFQUFFO0lBQ1g7SUFFQSxNQUFNRSxvQkFBb0JDLEtBQUtDLEtBQUssQ0FBQyxNQUFNekMsU0FBU3FDLGtCQUFrQixVQUFVdEIsR0FBRyxDQUNqRixDQUFDQyxJQUFvRCxDQUFBO1lBQ25EZCxNQUFNQSxLQUFLd0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTNCLEVBQUVkLElBQUk7WUFDMUNrQyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQTtJQUVGLE9BQU9HO0FBQ1Q7QUFFQSxTQUFTRDtJQUNQLE9BQU9wQyxLQUFLd0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTtBQUN2QztBQUVBLGVBQWV6QixjQUFjMEIsU0FBNEI7SUFDdkQsTUFBTVAsbUJBQW1CQztJQUN6QixNQUFNckMsVUFDSm9DLGtCQUNBRyxLQUFLSyxTQUFTLENBQ1pELFVBQVU3QixHQUFHLENBQUMsQ0FBQ0MsSUFBTyxDQUFBO1lBQ3BCZCxNQUFNQSxLQUFLNEMsUUFBUSxDQUFDMUMsT0FBT3VDLFdBQVcsRUFBRTNCLEVBQUVkLElBQUk7WUFDOUNrQyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQSxJQUNBLE1BQ0EsSUFFRjtJQUVGVyxRQUFRQyxHQUFHLENBQUMsa0JBQWtCWDtBQUNoQztBQUVBLGVBQWVkLGtCQUFrQlksUUFBa0I7SUFDakQsT0FBTyxJQUFJVCxRQUFnQixDQUFDdUIsU0FBU0M7UUFDbkMsTUFBTUMsT0FBT3RELE9BQU91RCxVQUFVLENBQUM7UUFDL0IsTUFBTUMsUUFBUXRELGlCQUFpQm9DO1FBQy9Ca0IsTUFBTUMsRUFBRSxDQUFDLFNBQVNKO1FBQ2xCRyxNQUFNQyxFQUFFLENBQUMsUUFBUSxDQUFDQztZQUNoQkosS0FBS0ssTUFBTSxDQUFDRDtRQUNkO1FBQ0FGLE1BQU1DLEVBQUUsQ0FBQyxTQUFTO1lBQ2hCTCxRQUFRRSxLQUFLTSxNQUFNLENBQUM7UUFDdEI7SUFDRjtBQUNGIn0=
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0bywgeyB0eXBlIEJpbmFyeUxpa2UgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgdHlwZSBQYXRoTGlrZSB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCwgQXBpUmVsYXRpdmVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuXG50eXBlIFBhdGhBbmRDaGVja3N1bSA9IHtcbiAgcGF0aDogQWJzb2x1dGVQYXRoO1xuICBjaGVja3N1bTogc3RyaW5nO1xufTtcblxuLyoqXG4gKiDssrTtgazshKwg7YyM7J287JeQIOyggOyepeuQnCDrgrTsmqnqs7wg7ZiE7J6sIOyLpOygnCDtjIzsnbzsnZgg7LK07YGs7ISs7J2EIOu5hOq1kO2VmOyXrCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyKteuLiOuLpC5cbiAqIEByZXR1cm5zIOuzgOqyveuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCDsiqzrnpjsi5zroZwg7Iuc7J6R7ZWp64uI64ukLiDsmIjsi5w6IFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgY29uc3QgY2FsY3VsYXRlZENoZWNrc3VtcyA9IGF3YWl0IGdldEN1cnJlbnRDaGVja3N1bXMoKTtcbiAgY29uc3Qgc2F2ZWRDaGVja3N1bXMgPSBhd2FpdCBnZXRQcmV2aW91c0NoZWNrc3VtcygpO1xuXG4gIGNvbnN0IGlzU2FtZSA9IGVxdWFsKGNhbGN1bGF0ZWRDaGVja3N1bXMsIHNhdmVkQ2hlY2tzdW1zKTtcbiAgaWYgKGlzU2FtZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBkaWZmZXJlbmNlV2l0aChjYWxjdWxhdGVkQ2hlY2tzdW1zLCBzYXZlZENoZWNrc3VtcywgaXNFcXVhbCkubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuZXhwb3J0IHR5cGUgRmlsZU9yRGF0YSA9XG4gIHwge1xuICAgICAgcGF0aDogUGF0aExpa2U7XG4gICAgfVxuICB8IHtcbiAgICAgIGRhdGE6IHN0cmluZztcbiAgICB9O1xuXG4vKipcbiAqIOuRkCDtjIzsnbzsnZgg64K07Jqp7J20IOqwmeydgOyngCDssrTtgazshKzsnLzroZwg67mE6rWQ7ZWp64uI64ukLlxuICog66eM7JW9IO2MjOydvOydtCDrkZgg7KSRIO2VmOuCmOudvOuPhCDsl4bri6TrqbQg67mE6rWQIOu2iOqwgOuhnCBmYWxzZSDrsJjtmZjtlanri4jri6QuXG4gKiBAcGFyYW0gb25lIO2MjOydvCDqsr3roZwg7Zi57J2AIOuNsOydtO2EsFxuICogQHBhcmFtIHR3byDtjIzsnbwg6rK966GcIO2YueydgCDrjbDsnbTthLBcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZSguLi5maWxlczogRmlsZU9yRGF0YVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNoZWNrc3Vtczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBpZiAoXCJwYXRoXCIgaW4gZmlsZSAmJiAhKGF3YWl0IGV4aXN0cyhmaWxlLnBhdGgpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNoZWNrc3Vtcy5wdXNoKFxuICAgICAgXCJwYXRoXCIgaW4gZmlsZSA/IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGUucGF0aCkgOiBnZXRDaGVja3N1bU9mRGF0YShmaWxlLmRhdGEpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY2hlY2tzdW1zLmV2ZXJ5KFxuICAgIC8vIOuLpOydjCDssrTtgazshKzqs7wg67mE6rWQLCDrp4zslb0g66eI7KeA66eJIOyytO2BrOyErOydvCDrlYzripQg7LKrIOuyiOynuCDssrTtgazshKzqs7wg67mE6rWQXG4gICAgKGNoZWNrc3VtLCBpbmRleCkgPT4gY2hlY2tzdW0gPT09IGNoZWNrc3Vtc1tpbmRleCA9PT0gY2hlY2tzdW1zLmxlbmd0aCAtIDEgPyAwIDogaW5kZXggKyAxXSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENoZWNrc3VtcygpOiBQcm9taXNlPFBhdGhBbmRDaGVja3N1bVtdPiB7XG4gIGNvbnN0IGZpbGVQYXRocyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIE9iamVjdC5lbnRyaWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkubWFwKGFzeW5jIChbX2ZpbGVUeXBlLCBwYXR0ZXJuXSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2xvYkFzeW5jKHBhdHRlcm4pIGFzIFByb21pc2U8QWJzb2x1dGVQYXRoW10+O1xuICAgICAgfSksXG4gICAgKVxuICApXG4gICAgLmZsYXQoKVxuICAgIC5zb3J0KCk7XG5cbiAgY29uc3QgZmlsZUNoZWNrc3VtcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGZpbGVQYXRocy5tYXAoYXN5bmMgKGZpbGVQYXRoKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgY2hlY2tzdW06IGF3YWl0IGdldENoZWNrc3VtT2ZGaWxlKGZpbGVQYXRoKSxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVDaGVja3N1bXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzQ2hlY2tzdW1zID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjaGVja3N1bUZpbGVQYXRoLCBcInV0Zi04XCIpKS5tYXAoXG4gICAgKHI6IHsgcGF0aDogQXBpUmVsYXRpdmVQYXRoOyBjaGVja3N1bTogc3RyaW5nIH0pID0+ICh7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCByLnBhdGgpLCAvLyDssrTtgazshKwg7YyM7J287JeQ7IScIOydveydhCDrlYw6IEFQSSDsg4HrjIAg6rK966GcIOKGkiDsoIjrjIAg6rK966GcXG4gICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICB9KSxcbiAgKSBhcyBQYXRoQW5kQ2hlY2tzdW1bXTtcbiAgcmV0dXJuIHByZXZpb3VzQ2hlY2tzdW1zO1xufVxuXG5mdW5jdGlvbiBnZXRDaGVja3N1bUZpbGVQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNvbmFtdS5sb2NrXCIpIGFzIEFic29sdXRlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2F2ZUNoZWNrc3VtcyhjaGVja3N1bXM6IFBhdGhBbmRDaGVja3N1bVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNoZWNrc3VtRmlsZVBhdGggPSBnZXRDaGVja3N1bUZpbGVQYXRoKCk7XG4gIGF3YWl0IHdyaXRlRmlsZShcbiAgICBjaGVja3N1bUZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KFxuICAgICAgY2hlY2tzdW1zLm1hcCgocikgPT4gKHtcbiAgICAgICAgcGF0aDogcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHIucGF0aCksIC8vIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l7ZWgIOuVjDog7KCI64yAIOqyveuhnCDihpIgQVBJIOyDgeuMgCDqsr3roZxcbiAgICAgICAgY2hlY2tzdW06IHIuY2hlY2tzdW0sXG4gICAgICB9KSksXG4gICAgICBudWxsLFxuICAgICAgMixcbiAgICApLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgY29uc29sZS5sb2coXCJjaGVja3N1bSBzYXZlZFwiLCBjaGVja3N1bUZpbGVQYXRoKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkRhdGEoZGF0YTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMVwiKTtcbiAgaGFzaC51cGRhdGUoZGF0YSk7XG4gIHJldHVybiBoYXNoLmRpZ2VzdChcImhleFwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkZpbGUoZmlsZVBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgY29uc3QgaW5wdXQgPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBpbnB1dC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgaW5wdXQub24oXCJkYXRhXCIsIChjaHVuazogQmluYXJ5TGlrZSkgPT4ge1xuICAgICAgaGFzaC51cGRhdGUoY2h1bmspO1xuICAgIH0pO1xuICAgIGlucHV0Lm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgcmVzb2x2ZShoYXNoLmRpZ2VzdChcImhleFwiKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbImNyeXB0byIsImVxdWFsIiwiY3JlYXRlUmVhZFN0cmVhbSIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwicGF0aCIsImlzRXF1YWwiLCJTb25hbXUiLCJnbG9iQXN5bmMiLCJleGlzdHMiLCJkaWZmZXJlbmNlV2l0aCIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJjYWxjdWxhdGVkQ2hlY2tzdW1zIiwiZ2V0Q3VycmVudENoZWNrc3VtcyIsInNhdmVkQ2hlY2tzdW1zIiwiZ2V0UHJldmlvdXNDaGVja3N1bXMiLCJpc1NhbWUiLCJtYXAiLCJyIiwicmVuZXdDaGVja3N1bXMiLCJzYXZlQ2hlY2tzdW1zIiwiYXJlRmlsZXNTYW1lIiwiZmlsZXMiLCJjaGVja3N1bXMiLCJmaWxlIiwicHVzaCIsImdldENoZWNrc3VtT2ZGaWxlIiwiZ2V0Q2hlY2tzdW1PZkRhdGEiLCJkYXRhIiwiZXZlcnkiLCJjaGVja3N1bSIsImluZGV4IiwibGVuZ3RoIiwiZmlsZVBhdGhzIiwiUHJvbWlzZSIsImFsbCIsIk9iamVjdCIsImVudHJpZXMiLCJfZmlsZVR5cGUiLCJwYXR0ZXJuIiwiZmxhdCIsInNvcnQiLCJmaWxlQ2hlY2tzdW1zIiwiZmlsZVBhdGgiLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJkaWdlc3QiLCJyZXNvbHZlIiwicmVqZWN0IiwiaW5wdXQiLCJvbiIsImNodW5rIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFpQyxTQUFTO0FBQ2pELE9BQU9DLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLGdCQUFnQixRQUF1QixLQUFLO0FBQ3JELFNBQVNDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ2xELE9BQU9DLFVBQVUsT0FBTztBQUN4QixTQUFTQyxPQUFPLFFBQVEsVUFBVTtB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
|
|
@@ -87,7 +87,12 @@ async function resolveRenderedTemplate(key, result) {
|
|
|
87
87
|
const { target, path: filePath, body, importKeys, customHeaders } = result;
|
|
88
88
|
// import 할 대상의 대상 path 추출
|
|
89
89
|
const importDefs = importKeys.reduce((r, importKey)=>{
|
|
90
|
-
|
|
90
|
+
let modulePath = importKey;
|
|
91
|
+
try {
|
|
92
|
+
modulePath = EntityManager.getModulePath(importKey);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
throw new Error(`[resolveRenderedTemplate:${key}] ${importKey} 모듈 경로 찾기 실패: ${error}`);
|
|
95
|
+
}
|
|
91
96
|
let importPath = modulePath;
|
|
92
97
|
if (modulePath.includes("/") || modulePath.includes(".")) {
|
|
93
98
|
importPath = wrapIf(path.relative(path.dirname(filePath), modulePath), (p)=>[
|
|
@@ -158,4 +163,4 @@ async function writeCodeToPathEachTarget(pathAndCode) {
|
|
|
158
163
|
}));
|
|
159
164
|
}
|
|
160
165
|
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlLCBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRQYXRoQW5kQ29kZXMubWFwKChwYXRoQW5kQ29kZSkgPT4gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZSkpLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbik6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICBOYWl0ZS50KFwicmVuZGVyVGVtcGxhdGVcIiwgeyBrZXksIG9wdGlvbnMgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG5cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucyk7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoa2V5LCByZW5kZXJlZCk7XG5cbiAgbGV0IHByZVRlbXBsYXRlUmVzb2x2ZWQ6IFBhdGhBbmRDb2RlW10gPSBbXTtcbiAgaWYgKHJlbmRlcmVkLnByZVRlbXBsYXRlcykge1xuICAgIHByZVRlbXBsYXRlUmVzb2x2ZWQgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVuZGVyZWQucHJlVGVtcGxhdGVzLm1hcCgoeyBrZXksIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZW5kZXJUZW1wbGF0ZShrZXksIG9wdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlLFxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZT4ge1xuICBOYWl0ZS50KGByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSR7a2V5fWAsIHsga2V5LCByZXN1bHQgfSk7XG5cbiAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGZpbGVQYXRoLCBib2R5LCBpbXBvcnRLZXlzLCBjdXN0b21IZWFkZXJzIH0gPSByZXN1bHQ7XG5cbiAgLy8gaW1wb3J0IO2VoCDrjIDsg4HsnZgg64yA7IOBIHBhdGgg7LaU7LacXG4gIGNvbnN0IGltcG9ydERlZnMgPSBpbXBvcnRLZXlzXG4gICAgLnJlZHVjZShcbiAgICAgIChyLCBpbXBvcnRLZXkpID0+IHtcbiAgICAgICAgY29uc3QgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChpbXBvcnRLZXkpO1xuICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IG1vZHVsZVBhdGg7XG4gICAgICAgIGlmIChtb2R1bGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBtb2R1bGVQYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIGltcG9ydFBhdGggPSB3cmFwSWYocGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSwgKHApID0+IFtcbiAgICAgICAgICAgIHAuc3RhcnRzV2l0aChcIi5cIikgPT09IGZhbHNlLFxuICAgICAgICAgICAgYC4vJHtwfWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsJnsnYAg7YyM7J287JeQ7IScIGltcG9ydCDtlZjripQg6rK97JqwIGtleXMg66GcIOuCmOyXtCDsspjrpqxcbiAgICAgICAgY29uc3QgZXhpc3RzT25lID0gci5maW5kKChpbXBvcnREZWYpID0+IGltcG9ydERlZi5mcm9tID09PSBpbXBvcnRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0c09uZSkge1xuICAgICAgICAgIGV4aXN0c09uZS5rZXlzID0gdW5pcXVlKGV4aXN0c09uZS5rZXlzLmNvbmNhdChpbXBvcnRLZXkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAga2V5czogW2ltcG9ydEtleV0sXG4gICAgICAgICAgICBmcm9tOiBpbXBvcnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIHtcbiAgICAgICAga2V5czogc3RyaW5nW107XG4gICAgICAgIGZyb206IHN0cmluZztcbiAgICAgIH1bXSxcbiAgICApXG4gICAgLy8g7IWA7ZSEIOywuOyhsCDrsKnsp4BcbiAgICAuZmlsdGVyKChpbXBvcnREZWYpID0+IGZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSA9PT0gZmFsc2UpO1xuXG4gIC8vIOy7pOyKpO2FgCDtl6TrjZQg7Y+s7ZWo7ZWY7JesIO2XpOuNlCDsg53shLFcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIC4uLihjdXN0b21IZWFkZXJzID8/IFtdKSxcbiAgICAuLi5pbXBvcnREZWZzLm1hcChcbiAgICAgIChpbXBvcnREZWYpID0+IGBpbXBvcnQgeyAke2ltcG9ydERlZi5rZXlzLmpvaW4oXCIsIFwiKX0gfSBmcm9tICcke2ltcG9ydERlZi5mcm9tfSdgLFxuICAgICksXG4gIF0uam9pbihcIlxcblwiKTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiZ2VuZXJhdGVkX2h0dHBcIikge1xuICAgICAgcmV0dXJuIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5haXRlLnQoXCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZTpiZWZvcmVGb3JtYXRcIiwgeyBrZXksIGhlYWRlciwgYm9keSB9KTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUoXG4gICAgICAgIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAgIGtleSA9PT0gXCJlbnRpdHlcIiA/IFwianNvblwiIDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtmaWxlUGF0aH1gLFxuICAgICAgKTtcbiAgICAgIE5haXRlLnQoYHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmZvcm1hdHRlZDoke2tleX1gLCBmb3JtYXR0ZWQpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgJHt0YXJnZXR9LyR7ZmlsZVBhdGh9YCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGU6IFBhdGhBbmRDb2RlKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IHVuaXF1ZShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBmaWxlUGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIGAvJHt0YXJnZXR9L2ApKSBhcyBBYnNvbHV0ZVBhdGhbXSxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArIGNoYWxrLmJsdWUoYCR7ZHN0RmlsZVBhdGgucmVwbGFjZShgJHthcHBSb290UGF0aH0vYCwgXCJcIil9YCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZHN0RmlsZVBhdGg7XG4gICAgfSksXG4gICk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJta2RpciIsIndyaXRlRmlsZSIsInBhdGgiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZXZlcnlBc3luYyIsImZpbHRlckFzeW5jIiwiaXNUZXN0IiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsIndyYXBJZiIsImdlbmVyYXRlVGVtcGxhdGUiLCJrZXkiLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiZ2VuZXJhdGVPcHRpb25zIiwib3ZlcndyaXRlIiwidCIsImtleXMiLCJwYXRoQW5kQ29kZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVuZGVyVGVtcGxhdGUiLCJmbGF0IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXMiLCJwYXRoQW5kQ29kZSIsInRhcmdldHMiLCJjb25maWciLCJzeW5jIiwiZmlsZVBhdGgiLCJhcHBSb290UGF0aCIsImRzdEZpbGVQYXRocyIsInRhcmdldCIsInJlcGxhY2UiLCJkc3RQYXRoIiwibGVuZ3RoIiwid3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldCIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZSIsImdldCIsInJlbmRlcmVkIiwicmVuZGVyIiwicmVzb2x2ZWQiLCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSIsInByZVRlbXBsYXRlUmVzb2x2ZWQiLCJwcmVUZW1wbGF0ZXMiLCJyZXN1bHQiLCJib2R5IiwiaW1wb3J0S2V5cyIsImN1c3RvbUhlYWRlcnMiLCJpbXBvcnREZWZzIiwicmVkdWNlIiwiciIsImltcG9ydEtleSIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwiaW1wb3J0UGF0aCIsImluY2x1ZGVzIiwicmVsYXRpdmUiLCJkaXJuYW1lIiwicCIsInN0YXJ0c1dpdGgiLCJleGlzdHNPbmUiLCJmaW5kIiwiaW1wb3J0RGVmIiwiZnJvbSIsImNvbmNhdCIsInB1c2giLCJmaWx0ZXIiLCJlbmRzV2l0aCIsImhlYWRlciIsImpvaW4iLCJmb3JtYXR0ZWQiLCJjb2RlIiwiZHN0RmlsZVBhdGgiLCJkaXIiLCJyZWN1cnNpdmUiLCJjb25zb2xlIiwibG9nIiwiYm9sZCIsImJsdWUiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUMvQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsTUFBTSxRQUFRLFVBQVU7QUFDakMsU0FB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
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY29kZS1nZW5lcmF0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlLCBUZW1wbGF0ZUtleSwgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBldmVyeUFzeW5jLCBmaWx0ZXJBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHdyYXBJZiB9IGZyb20gXCIuLi91dGlscy9sb2Rhc2gtYWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuXG4vKipcbiAqIO2FnO2UjOumv+ydhCDroIzrjZTrp4HtlZjqs6Ag7YyM7J2866GcIOyDneyEse2VqeuLiOuLpC5cbiAqIG92ZXJ3cml0ZSDsmLXshZjsnbQgZmFsc2Xsnbgg6rK97JqwLCDsnbTrr7gg7KG07J6s7ZWY64qUIO2MjOydvOydgCDqsbTrhIjrnIHri4jri6QuXG4gKiBAcGFyYW0ga2V5IC0g7YWc7ZSM66a/IO2CpCAo7JiIOiBcImVudGl0eVwiLCBcIm1vZGVsXCIsIFwic2VydmljZVwiIOuTsSlcbiAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnMgLSDthZztlIzrpr8g66CM642U66eB7JeQIO2VhOyalO2VnCDsmLXshZhcbiAqIEBwYXJhbSBfZ2VuZXJhdGVPcHRpb25zIC0g7IOd7ISxIOyYteyFmCAob3ZlcndyaXRlIOyXrOu2gClcbiAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICBrZXk6IFQsXG4gIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCBnZW5lcmF0ZU9wdGlvbnMgPSB7XG4gICAgb3ZlcndyaXRlOiBmYWxzZSxcbiAgICAuLi5fZ2VuZXJhdGVPcHRpb25zLFxuICB9O1xuICBOYWl0ZS50KFwiZ2VuZXJhdGVUZW1wbGF0ZVwiLCB7IGtleSwgdGVtcGxhdGVPcHRpb25zLCBnZW5lcmF0ZU9wdGlvbnMgfSk7XG5cbiAgLy8g7YKkIGNoaWxkcmVuXG4gIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBba2V5XTtcblxuICAvLyDthZztlIzrpr8g66CM642UXG4gIGNvbnN0IHBhdGhBbmRDb2RlcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGtleXMubWFwKGFzeW5jIChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgY29uc3QgZmlsdGVyZWRQYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChnZW5lcmF0ZU9wdGlvbnMub3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGF0aEFuZENvZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgZmlsdGVyQXN5bmMocGF0aEFuZENvZGVzLCBhc3luYyAocGF0aEFuZENvZGUpID0+IHtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gYCR7U29uYW11LmFwcFJvb3RQYXRofS8ke3BhdGhBbmRDb2RlLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZHN0RmlsZVBhdGhzID0gdGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4gZmlsZVBhdGgucmVwbGFjZShcIi86dGFyZ2V0L1wiLCBgLyR7dGFyZ2V0fS9gKSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBldmVyeUFzeW5jKGRzdEZpbGVQYXRocywgYXN5bmMgKGRzdFBhdGgpID0+ICEoYXdhaXQgZXhpc3RzKGRzdFBhdGgpKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKCk7XG5cbiAgaWYgKGZpbHRlcmVkUGF0aEFuZENvZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKFwi7J2066+4IOqyveuhnOyXkCDrqqjrk6Ag7YyM7J287J20IOyhtOyerO2VqeuLiOuLpC5cIik7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZmlsdGVyZWRQYXRoQW5kQ29kZXMubWFwKChwYXRoQW5kQ29kZSkgPT4gd3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldChwYXRoQW5kQ29kZSkpLFxuICAgIClcbiAgKS5mbGF0KCk7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J2EIOugjOuNlOunge2VmOyXrCBQYXRoQW5kQ29kZSDqsJ3ssrTrpbwg67CY7ZmY7ZWp64uI64ukLlxuICog7YyM7J2866GcIOyTsOyngCDslYrqs6Ag66mU66qo66as7IOB7JeQ7ISc66eMIOugjOuNlOunge2VqeuLiOuLpC5cbiAqIEBwYXJhbSBrZXkgLSDthZztlIzrpr8g7YKkXG4gKiBAcGFyYW0gb3B0aW9ucyAtIO2FnO2UjOumvyDroIzrjZTrp4Eg7Ji17IWYXG4gKiBAcmV0dXJucyDqsr3roZzsmYAg7L2U65OcIOyMjeydmCDrsLDsl7RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICBrZXk6IFQsXG4gIG9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbik6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICBOYWl0ZS50KFwicmVuZGVyVGVtcGxhdGVcIiwgeyBrZXksIG9wdGlvbnMgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG5cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCB0ZW1wbGF0ZS5yZW5kZXIob3B0aW9ucyk7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGUoa2V5LCByZW5kZXJlZCk7XG5cbiAgbGV0IHByZVRlbXBsYXRlUmVzb2x2ZWQ6IFBhdGhBbmRDb2RlW10gPSBbXTtcbiAgaWYgKHJlbmRlcmVkLnByZVRlbXBsYXRlcykge1xuICAgIHByZVRlbXBsYXRlUmVzb2x2ZWQgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcmVuZGVyZWQucHJlVGVtcGxhdGVzLm1hcCgoeyBrZXksIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiByZW5kZXJUZW1wbGF0ZShrZXksIG9wdGlvbnMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHJldHVybiBbcmVzb2x2ZWQsIC4uLnByZVRlbXBsYXRlUmVzb2x2ZWRdO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZShcbiAga2V5OiBUZW1wbGF0ZUtleSxcbiAgcmVzdWx0OiBSZW5kZXJlZFRlbXBsYXRlLFxuKTogUHJvbWlzZTxQYXRoQW5kQ29kZT4ge1xuICBOYWl0ZS50KGByZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSR7a2V5fWAsIHsga2V5LCByZXN1bHQgfSk7XG5cbiAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGZpbGVQYXRoLCBib2R5LCBpbXBvcnRLZXlzLCBjdXN0b21IZWFkZXJzIH0gPSByZXN1bHQ7XG5cbiAgLy8gaW1wb3J0IO2VoCDrjIDsg4HsnZgg64yA7IOBIHBhdGgg7LaU7LacXG4gIGNvbnN0IGltcG9ydERlZnMgPSBpbXBvcnRLZXlzXG4gICAgLnJlZHVjZShcbiAgICAgIChyLCBpbXBvcnRLZXkpID0+IHtcbiAgICAgICAgbGV0IG1vZHVsZVBhdGggPSBpbXBvcnRLZXk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9kdWxlUGF0aCA9IEVudGl0eU1hbmFnZXIuZ2V0TW9kdWxlUGF0aChpbXBvcnRLZXkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBbcmVzb2x2ZVJlbmRlcmVkVGVtcGxhdGU6JHtrZXl9XSAke2ltcG9ydEtleX0g66qo65OIIOqyveuhnCDssL7quLAg7Iuk7YyoOiAke2Vycm9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IG1vZHVsZVBhdGg7XG4gICAgICAgIGlmIChtb2R1bGVQYXRoLmluY2x1ZGVzKFwiL1wiKSB8fCBtb2R1bGVQYXRoLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIGltcG9ydFBhdGggPSB3cmFwSWYocGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoZmlsZVBhdGgpLCBtb2R1bGVQYXRoKSwgKHApID0+IFtcbiAgICAgICAgICAgIHAuc3RhcnRzV2l0aChcIi5cIikgPT09IGZhbHNlLFxuICAgICAgICAgICAgYC4vJHtwfWAsXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDqsJnsnYAg7YyM7J287JeQ7IScIGltcG9ydCDtlZjripQg6rK97JqwIGtleXMg66GcIOuCmOyXtCDsspjrpqxcbiAgICAgICAgY29uc3QgZXhpc3RzT25lID0gci5maW5kKChpbXBvcnREZWYpID0+IGltcG9ydERlZi5mcm9tID09PSBpbXBvcnRQYXRoKTtcbiAgICAgICAgaWYgKGV4aXN0c09uZSkge1xuICAgICAgICAgIGV4aXN0c09uZS5rZXlzID0gdW5pcXVlKGV4aXN0c09uZS5rZXlzLmNvbmNhdChpbXBvcnRLZXkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByLnB1c2goe1xuICAgICAgICAgICAga2V5czogW2ltcG9ydEtleV0sXG4gICAgICAgICAgICBmcm9tOiBpbXBvcnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIHtcbiAgICAgICAga2V5czogc3RyaW5nW107XG4gICAgICAgIGZyb206IHN0cmluZztcbiAgICAgIH1bXSxcbiAgICApXG4gICAgLy8g7IWA7ZSEIOywuOyhsCDrsKnsp4BcbiAgICAuZmlsdGVyKChpbXBvcnREZWYpID0+IGZpbGVQYXRoLmVuZHNXaXRoKGAke2ltcG9ydERlZi5mcm9tLnJlcGxhY2UoXCIuL1wiLCBcIlwiKX0udHNgKSA9PT0gZmFsc2UpO1xuXG4gIC8vIOy7pOyKpO2FgCDtl6TrjZQg7Y+s7ZWo7ZWY7JesIO2XpOuNlCDsg53shLFcbiAgY29uc3QgaGVhZGVyID0gW1xuICAgIC4uLihjdXN0b21IZWFkZXJzID8/IFtdKSxcbiAgICAuLi5pbXBvcnREZWZzLm1hcChcbiAgICAgIChpbXBvcnREZWYpID0+IGBpbXBvcnQgeyAke2ltcG9ydERlZi5rZXlzLmpvaW4oXCIsIFwiKX0gfSBmcm9tICcke2ltcG9ydERlZi5mcm9tfSdgLFxuICAgICksXG4gIF0uam9pbihcIlxcblwiKTtcblxuICBjb25zdCBmb3JtYXR0ZWQgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiZ2VuZXJhdGVkX2h0dHBcIikge1xuICAgICAgcmV0dXJuIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIE5haXRlLnQoXCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZTpiZWZvcmVGb3JtYXRcIiwgeyBrZXksIGhlYWRlciwgYm9keSB9KTtcbiAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IGZvcm1hdENvZGUoXG4gICAgICAgIFtoZWFkZXIsIGJvZHldLmpvaW4oXCJcXG5cXG5cIiksXG4gICAgICAgIGtleSA9PT0gXCJlbnRpdHlcIiA/IFwianNvblwiIDogXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtmaWxlUGF0aH1gLFxuICAgICAgKTtcbiAgICAgIE5haXRlLnQoYHJlc29sdmVSZW5kZXJlZFRlbXBsYXRlOmZvcm1hdHRlZDoke2tleX1gLCBmb3JtYXR0ZWQpO1xuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBgJHt0YXJnZXR9LyR7ZmlsZVBhdGh9YCxcbiAgICBjb2RlOiBmb3JtYXR0ZWQsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQ29kZVRvUGF0aEVhY2hUYXJnZXQocGF0aEFuZENvZGU6IFBhdGhBbmRDb2RlKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgY29uc3QgeyBhcHBSb290UGF0aCB9ID0gU29uYW11O1xuICBjb25zdCBmaWxlUGF0aCA9IGAke1NvbmFtdS5hcHBSb290UGF0aH0vJHtwYXRoQW5kQ29kZS5wYXRofWAgYXMgQWJzb2x1dGVQYXRoO1xuXG4gIGNvbnN0IGRzdEZpbGVQYXRocyA9IHVuaXF1ZShcbiAgICB0YXJnZXRzLm1hcCgodGFyZ2V0KSA9PiBmaWxlUGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIGAvJHt0YXJnZXR9L2ApKSBhcyBBYnNvbHV0ZVBhdGhbXSxcbiAgKTtcbiAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIGRzdEZpbGVQYXRocy5tYXAoYXN5bmMgKGRzdEZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBkaXIgPSBwYXRoLmRpcm5hbWUoZHN0RmlsZVBhdGgpO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZHN0RmlsZVBhdGgsIHBhdGhBbmRDb2RlLmNvZGUpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJHZW5lcmF0ZWQ6IFwiKSArIGNoYWxrLmJsdWUoYCR7ZHN0RmlsZVBhdGgucmVwbGFjZShgJHthcHBSb290UGF0aH0vYCwgXCJcIil9YCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gZHN0RmlsZVBhdGg7XG4gICAgfSksXG4gICk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJta2RpciIsIndyaXRlRmlsZSIsInBhdGgiLCJ1bmlxdWUiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiQWxyZWFkeVByb2Nlc3NlZEV4Y2VwdGlvbiIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiZXZlcnlBc3luYyIsImZpbHRlckFzeW5jIiwiaXNUZXN0IiwiZm9ybWF0Q29kZSIsImV4aXN0cyIsIndyYXBJZiIsImdlbmVyYXRlVGVtcGxhdGUiLCJrZXkiLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIiwiZ2VuZXJhdGVPcHRpb25zIiwib3ZlcndyaXRlIiwidCIsImtleXMiLCJwYXRoQW5kQ29kZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicmVuZGVyVGVtcGxhdGUiLCJmbGF0IiwiZmlsdGVyZWRQYXRoQW5kQ29kZXMiLCJwYXRoQW5kQ29kZSIsInRhcmdldHMiLCJjb25maWciLCJzeW5jIiwiZmlsZVBhdGgiLCJhcHBSb290UGF0aCIsImRzdEZpbGVQYXRocyIsInRhcmdldCIsInJlcGxhY2UiLCJkc3RQYXRoIiwibGVuZ3RoIiwid3JpdGVDb2RlVG9QYXRoRWFjaFRhcmdldCIsIm9wdGlvbnMiLCJ0ZW1wbGF0ZSIsImdldCIsInJlbmRlcmVkIiwicmVuZGVyIiwicmVzb2x2ZWQiLCJyZXNvbHZlUmVuZGVyZWRUZW1wbGF0ZSIsInByZVRlbXBsYXRlUmVzb2x2ZWQiLCJwcmVUZW1wbGF0ZXMiLCJyZXN1bHQiLCJib2R5IiwiaW1wb3J0S2V5cyIsImN1c3RvbUhlYWRlcnMiLCJpbXBvcnREZWZzIiwicmVkdWNlIiwiciIsImltcG9ydEtleSIsIm1vZHVsZVBhdGgiLCJnZXRNb2R1bGVQYXRoIiwiZXJyb3IiLCJFcnJvciIsImltcG9ydFBhdGgiLCJpbmNsdWRlcyIsInJlbGF0aXZlIiwiZGlybmFtZSIsInAiLCJzdGFydHNXaXRoIiwiZXhpc3RzT25lIiwiZmluZCIsImltcG9ydERlZiIsImZyb20iLCJjb25jYXQiLCJwdXNoIiwiZmlsdGVyIiwiZW5kc1dpdGgiLCJoZWFkZXIiLCJqb2luIiwiZm9ybWF0dGVkIiwiY29kZSIsImRzdEZpbGVQYXRoIiwiZGlyIiwicmVjdXJzaXZlIiwiY29uc29sZSIsImxvZyIsImJvbGQiLCJibHVlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDL0MsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyx5QkFBeUIsUUFBUSxpQ0FBOEI7QUFDeEUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUV2QyxTQUFTQyxlQUFlLFFBQVEsa0NBQStCO0FBRS9ELFNBQVNDLFVBQVUsRUFBRUMsV0FBVyxRQUFRLDBCQUF1QjtBQUMvRCxTQUFTQyxNQUFNLFFBQVEseUJBQXNCO0FBQzdDLFNBQVNDLFVBQVUsUUFBUSx3QkFBcUI7QUFDaEQsU0FBU0MsTUFBTSxRQUFRLHVCQUFvQjtBQUMzQyxTQUFTQyxNQUFNLFFBQVEsMEJBQXVCO0FBRzlDOzs7Ozs7O0NBT0MsR0FDRCxPQUFPLGVBQWVDLGlCQUNwQkMsR0FBTSxFQUNOQyxlQUFtQyxFQUNuQ0MsZ0JBQWtDO0lBRWxDLE1BQU1DLGtCQUFrQjtRQUN0QkMsV0FBVztRQUNYLEdBQUdGLGdCQUFnQjtJQUNyQjtJQUNBWCxNQUFNYyxDQUFDLENBQUMsb0JBQW9CO1FBQUVMO1FBQUtDO1FBQWlCRTtJQUFnQjtJQUVwRSxhQUFhO0lBQ2IsTUFBTUcsT0FBc0I7UUFBQ047S0FBSTtJQUVqQyxTQUFTO0lBQ1QsTUFBTU8sZUFBZSxBQUNuQixDQUFBLE1BQU1DLFFBQVFDLEdBQUcsQ0FDZkgsS0FBS0ksR0FBRyxDQUFDLE9BQU9WO1FBQ2QsT0FBTyxNQUFNVyxlQUFlWCxLQUFLQztJQUNuQyxHQUNGLEVBQ0FXLElBQUk7SUFFTixNQUFN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
|
package/dist/syncer/syncer.d.ts
CHANGED
|
@@ -52,18 +52,18 @@ export declare class Syncer {
|
|
|
52
52
|
handleModelOrFrameChange(diffGroups: DiffGroups): Promise<void>;
|
|
53
53
|
actionSyncConfig(): Promise<void>;
|
|
54
54
|
/**
|
|
55
|
-
*
|
|
56
|
-
* @returns 생성된 파일 경로 배열.
|
|
57
|
-
*/
|
|
58
|
-
actionGenerateSchemas(): Promise<AbsolutePath[]>;
|
|
59
|
-
/**
|
|
60
|
-
* *.service.ts를 생성합니다.
|
|
55
|
+
* services.generated.ts를 생성합니다.
|
|
61
56
|
* @param paramsArray
|
|
62
57
|
* @returns 생성된 파일 경로 배열.
|
|
63
58
|
*/
|
|
64
59
|
actionGenerateServices(paramsArray: {
|
|
65
60
|
namesRecord: EntityNamesRecord;
|
|
66
61
|
}[]): Promise<string[]>;
|
|
62
|
+
/**
|
|
63
|
+
* sonamu.generated.ts와 sonamu.generated.sso.ts를 생성합니다.
|
|
64
|
+
* @returns 생성된 파일 경로 배열.
|
|
65
|
+
*/
|
|
66
|
+
actionGenerateSchemas(): Promise<AbsolutePath[]>;
|
|
67
67
|
/**
|
|
68
68
|
* sonamu.generated.http를 생성합니다.
|
|
69
69
|
* @returns 생성된 파일 경로.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGjF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxD,OAAO,EAAE,KAAK,QAAQ,EAAyC,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAKjB,MAAM,iBAAiB,CAAC;AAEzB,KAAK,UAAU,GAAG;KACf,GAAG,IAAI,QAAQ,GAAG,YAAY,EAAE;CAClC,CAAC;AAEF,qBAAa,MAAM;IACjB,IAAI,EAAE,UAAU,CAAM;IACtB,KAAK,EAAE,WAAW,CAAM;IACxB,MAAM,EAAE,YAAY,CAAM;IAC1B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAa;IACvD,SAAS,EAAE,OAAO,CAAS;IAC3B,YAAY,EAAE,YAAY,CAAsB;IAEhD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B;;;;;OAKG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D/E,+BAA+B,CAC7B,eAAe,EAAE,YAAY,GAC5B,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE;IAc9B,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
|
package/dist/syncer/syncer.js
CHANGED
|
@@ -118,6 +118,10 @@ export class Syncer {
|
|
|
118
118
|
return toRemove;
|
|
119
119
|
}
|
|
120
120
|
async copySharedToTargets(targets) {
|
|
121
|
+
// 특정 변수 치환을 위해서 사용합니다.
|
|
122
|
+
const convertMap = {
|
|
123
|
+
baseUrl: Sonamu.config.server.baseUrl ?? `http://${Sonamu.config.server.listen?.host ?? "localhost"}:${Sonamu.config.server.listen?.port ?? 3000}`
|
|
124
|
+
};
|
|
121
125
|
for (const target of targets){
|
|
122
126
|
// 지금 가져가려는 이 파일은 Sonamu 코드베이스의 일부입니다.
|
|
123
127
|
// 그런데 dist 속 빌드된 소스 코드 파일이 필요한 것이 아니고, src에만 있는 텍스트 파일이 필요합니다.
|
|
@@ -129,6 +133,8 @@ export class Syncer {
|
|
|
129
133
|
if (!await exists(path.join(Sonamu.appRootPath, target))) {
|
|
130
134
|
throw new Error(`Tried to copy sonamu.shared.ts to target '${target}' but the target directory does not exist. Please check your project directory structure.`);
|
|
131
135
|
}
|
|
136
|
+
const fullText = await readFile(srcPath, "utf-8");
|
|
137
|
+
const convertedText = Object.entries(convertMap).reduce((acc, [key, value])=>acc.replace(`$[[${key}]]`, value), fullText);
|
|
132
138
|
// 이건 프로젝트에 .ts 소스 코드 파일을 생성하는 것이므로 src의 .ts 경로로 갑니다.
|
|
133
139
|
const destPath = path.join(Sonamu.appRootPath, target, "src/services/sonamu.shared.ts");
|
|
134
140
|
// 정말 혹시나지만 target 디렉토리는 있어도 src/services 디렉토리는 없을 수 있으므로 미리 생성해줍니다.
|
|
@@ -138,10 +144,14 @@ export class Syncer {
|
|
|
138
144
|
});
|
|
139
145
|
console.warn(`Created directory '${path.dirname(destPath)}' because it did not exist.`);
|
|
140
146
|
}
|
|
141
|
-
if (await areFilesSame(
|
|
147
|
+
if (await areFilesSame({
|
|
148
|
+
data: convertedText
|
|
149
|
+
}, {
|
|
150
|
+
path: destPath
|
|
151
|
+
})) {
|
|
142
152
|
continue;
|
|
143
153
|
}
|
|
144
|
-
await writeFile(destPath,
|
|
154
|
+
await writeFile(destPath, convertedText);
|
|
145
155
|
!isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(path.relative(Sonamu.appRootPath, destPath)));
|
|
146
156
|
}
|
|
147
157
|
}
|
|
@@ -293,6 +303,20 @@ export class Syncer {
|
|
|
293
303
|
}));
|
|
294
304
|
}
|
|
295
305
|
/**
|
|
306
|
+
* services.generated.ts를 생성합니다.
|
|
307
|
+
* @param paramsArray
|
|
308
|
+
* @returns 생성된 파일 경로 배열.
|
|
309
|
+
*/ async actionGenerateServices(paramsArray) {
|
|
310
|
+
Naite.t("actionGenerateServices", paramsArray);
|
|
311
|
+
// services.generated.ts 통합 파일 생성
|
|
312
|
+
const servicesFile = await generateTemplate("services", {}, {
|
|
313
|
+
overwrite: true
|
|
314
|
+
});
|
|
315
|
+
return [
|
|
316
|
+
...servicesFile
|
|
317
|
+
];
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
296
320
|
* sonamu.generated.ts와 sonamu.generated.sso.ts를 생성합니다.
|
|
297
321
|
* @returns 생성된 파일 경로 배열.
|
|
298
322
|
*/ async actionGenerateSchemas() {
|
|
@@ -306,16 +330,6 @@ export class Syncer {
|
|
|
306
330
|
])).flat().flat();
|
|
307
331
|
}
|
|
308
332
|
/**
|
|
309
|
-
* *.service.ts를 생성합니다.
|
|
310
|
-
* @param paramsArray
|
|
311
|
-
* @returns 생성된 파일 경로 배열.
|
|
312
|
-
*/ async actionGenerateServices(paramsArray) {
|
|
313
|
-
Naite.t("actionGenerateServices", paramsArray);
|
|
314
|
-
return (await Promise.all(paramsArray.map(async (params)=>generateTemplate("service", params, {
|
|
315
|
-
overwrite: true
|
|
316
|
-
})))).flat().flat();
|
|
317
|
-
}
|
|
318
|
-
/**
|
|
319
333
|
* sonamu.generated.http를 생성합니다.
|
|
320
334
|
* @returns 생성된 파일 경로.
|
|
321
335
|
*/ async actionGenerateHttps() {
|
|
@@ -441,4 +455,4 @@ export class Syncer {
|
|
|
441
455
|
}
|
|
442
456
|
}
|
|
443
457
|
|
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIGlmICghaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIgLyrshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuKi8pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBgJHtlbnRpdHlJZH1Nb2RlbGApO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UocmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBjb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgICAgLy8g6re465+w642wIGRpc3Qg7IaNIOu5jOuTnOuQnCDshozsiqQg7L2U65OcIO2MjOydvOydtCDtlYTsmpTtlZwg6rKD7J20IOyVhOuLiOqzoCwgc3Jj7JeQ66eMIOyeiOuKlCDthY3siqTtirgg7YyM7J287J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCAvc3JjL+yXkOyEnCDssL7sirXri4jri6QuXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgICAgYC4uL3NoYXJlZC8ke3RhcmdldH0uc2hhcmVkLnRzLnR4dGAsXG4gICAgICApO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGRlc3RQYXRoLCBhd2FpdCByZWFkRmlsZShzcmNQYXRoKSk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBkZXN0UGF0aCkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB3b3JrZmxvd1xuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJ3b3JrZmxvd1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWZmVHlwZXMsXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURpZmZHcm91cHMoZGlmZkZpbGVzOiBBYnNvbHV0ZVBhdGhbXSk6IERpZmZHcm91cHMge1xuICAgIHJldHVybiBncm91cChkaWZmRmlsZXMsIChyKSA9PiB7XG4gICAgICBjb25zdCBtYXRjaGVkID0gci5tYXRjaCgvXFwuKG1vZGVsfHR5cGVzfGZ1bmN0aW9uc3xlbnRpdHl8Z2VuZXJhdGVkfGZyYW1lfGNvbmZpZylcXC5bdGpdcy8pO1xuICAgICAgcmV0dXJuIG1hdGNoZWQ/LlsxXSA/PyBcInVua25vd25cIjtcbiAgICB9KSBhcyB1bmtub3duIGFzIERpZmZHcm91cHM7XG4gIH1cblxuICBhc3luYyBoYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3VwcywgZGlmZlR5cGVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVFbnRpdHlDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzLCBkaWZmVHlwZXMgfSk7XG5cbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlbG9hZCgpO1xuXG4gICAgLy8gdHlwZXMg7IOd7ISxKGVudGl0eSDsg4jroZwg7LaU6rCA65CcIOqyveyasClcbiAgICAvLyBwYXJlbnRJZOqwgCDsl4bqs6AsIHR5cGVz6rCAIOyXhuuKlCDqsr3smrDsl5Drp4wg7IOd7ISxXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoZGlmZkdyb3Vwcy5lbnRpdHk/LlswXSk7XG5cbiAgICBpZiAoZW50aXR5SWQpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIC8vIO2UhOuhnOygne2KuOyXkCDsg53shLHrkJjslrTslbwg7ZWY64qUIC50cyDtjIzsnbzsnZgg6rK966Gc7J6F64uI64ukLlxuICAgICAgY29uc3QgdHlwZUZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICAgIGBzcmMvYXBwbGljYXRpb24vJHtlbnRpdHkubmFtZXMuZnN9LyR7ZW50aXR5Lm5hbWVzLmZzfS50eXBlcy50c2AsXG4gICAgICApO1xuICAgICAgaWYgKGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmICEoYXdhaXQgZXhpc3RzKHR5cGVGaWxlUGF0aCkpKSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJpbml0X3R5cGVzXCIsIHsgZW50aXR5SWQgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTtcblxuICAgIGRpZmZHcm91cHMuZ2VuZXJhdGVkID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgICBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUuZ2VuZXJhdGVkLnRzXCIpIGFzIEFic29sdXRlUGF0aCxcbiAgICBdKTtcbiAgICBkaWZmVHlwZXMucHVzaChcImdlbmVyYXRlZFwiKTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTxGaWxlVHlwZVtdPiB7XG4gICAgY29uc3QgdHNQYXRocyA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy50eXBlcyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5mdW5jdGlvbnMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICBdKTtcbiAgICBOYWl0ZS50KFwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyB0eXBlcy9mdW5jdGlvbnMvZ2VuZXJhdGVkIGNoYW5nZXM6ICR7dHNQYXRocy5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRocyk7XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBhc3luYyBoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIE5haXRlLnQoXCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuICAgIGNvbnN0IG1lcmdlZEdyb3VwID0gWy4uLihkaWZmR3JvdXBzLm1vZGVsID8/IFtdKSwgLi4uKGRpZmZHcm91cHMuZnJhbWUgPz8gW10pXTtcblxuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgY2hhbGsuZ3JheShcbiAgICAvLyAgICAgYFtQcm9jZXNzaW5nXSBIYW5kbGluZyBtb2RlbC9mcmFtZSBjaGFuZ2VzOiAke21lcmdlZEdyb3VwLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICAvLyBnZW5lcmF0ZWRfaHR0cC50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIudHlwZXPrpbwg7JSB64uI64ukLlxuICAgIC8vIHNlcnZpY2UudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLmFwaXPrpbwg7JSB64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgY29uc3QgcGFyYW1zOiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdID0gbWVyZ2VkR3JvdXAubWFwKChtb2RlbFBhdGgpID0+IHtcbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIikpIHtcbiAgICAgICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgobW9kZWxQYXRoKTtcbiAgICAgICAgYXNzZXJ0KGVudGl0eUlkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwudHMkLykgPz8gW107XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICAvLyBmcmFtZU5hbWXsnYQgUGFzY2FsQ2FzZeuhnCDrs4DtmZggKGRhc2hib2FyZCAtPiBEYXNoYm9hcmQpXG4gICAgICAgIGNvbnN0IGZyYW1lSWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGZyYW1lTmFtZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZnJhbWVJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZFwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBdKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogKi5zZXJ2aWNlLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwYXJhbXNBcnJheS5tYXAoYXN5bmMgKHBhcmFtcykgPT5cbiAgICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwic2VydmljZVwiLCBwYXJhbXMgYXMgVGVtcGxhdGVPcHRpb25zW1wic2VydmljZVwiXSwge1xuICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC5odHRw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICAgICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgYXNzZXJ0KHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnR5cGVzLnRzLCAqLmZ1bmN0aW9ucy50cywgKi5nZW5lcmF0ZWQudHPrpbwg7YOA6rKfIOuUlOugie2GoOumrOyXkCDrs7Xsgqztlanri4jri6QuXG4gICAqIEBwYXJhbSB0c1BhdGhzXG4gICAqIEByZXR1cm5zIOuzteyCrOuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCB7IGRpcjogYXBpRGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRzdCA9IHJlYWxTcmNcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoZHN0KTtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUoZHN0LnJlcGxhY2UoYCR7U29uYW11LmFwcFJvb3RQYXRofS9gLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCk7XG4gICAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKGZyb21QYXRoOiBzdHJpbmcsIHRvUGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKGZyb21QYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRGaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShmcm9tUGF0aCkpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgICAvLyB3ZWLsnbTrgpggYXBwIOuTseyXkOuKlCBzb25hbXXqsIAg7JeG7Iq164uI64ukLlxuICAgICAgLy8g65Sw65287IScIHNvbmFtdeyXkCDrjIDtlZwgaW1wb3J064qUIO2VqOq7mCDrs7XsgqzrkJjripQgc29uYW11LnNoYXJlZC50c+yXkCDrjIDtlZwgaW1wb3J066GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDrrLjsoJzripQg66as7IaM7IqkIOyiheulmOyXkCDrlLDrnbwgc29uYW11LnNoYXJlZC50c+uhnCDqsIDripQg6rK966Gc6rCAIOuLpOultOuLpOuKlCDsoJDsnoXri4jri6QuXG4gICAgICAvLyDsmIjrpbwg65Ok7Ja0IHNvbmFtdS5nZW5lcmF0ZWQudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg6rCZ7J2AIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VmOuptCDrkJjsp4Drp4wsXG4gICAgICAvLyB1c2VyLnR5cGVzLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOyDgeychCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4uL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY6riwIOychO2VtCDrs7XsgqztlZjqs6DsnpAg7ZWY64qUIOumrOyGjOyKpOydmCDqsr3roZwodG9QYXRoKeulvCDquLDspIDsnLzroZwgc29uYW11LnNoYXJlZC50c+qwgCDsnojripQg65SU66CJ7Yag66as66W8IOywvuyVhOyEnCDsg4HrjIAg6rK966Gc66W8IOqzhOyCsO2VmOuPhOuhnSDtlZjsmIDsirXri4jri6QuXG4gICAgICBjb25zdCBzZXJ2aWNlc0RpciA9IHRvUGF0aC5yZXBsYWNlKC9cXC9zZXJ2aWNlc1xcLy4qJC8sIFwiL3NlcnZpY2VzXCIpO1xuICAgICAgY29uc3QgZmlsZURpciA9IGRpcm5hbWUodG9QYXRoKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUoZmlsZURpciwgc2VydmljZXNEaXIpO1xuICAgICAgY29uc3Qgc2hhcmVkUGF0aCA9IHJlbGF0aXZlUGF0aCA9PT0gXCJcIiA/IFwiLi9zb25hbXUuc2hhcmVkXCIgOiBgJHtyZWxhdGl2ZVBhdGh9L3NvbmFtdS5zaGFyZWRgO1xuXG4gICAgICBjb25zdCBuZmMgPSBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11XCIvZywgYGZyb20gXCIke3NoYXJlZFBhdGh9XCJgKTtcbiAgICAgIHJldHVybiBuZmM7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW08UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4+O1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoXCI6dGFyZ2V0XCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmModGFyZ2V0cywgYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke3R9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldC5yZXBsYWNlKFwiOnRhcmdldFwiLCB0KSwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVudGl0eShmb3JtOiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pIHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlRW50aXR5KGZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZGVsRW50aXR5KGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsUGF0aHM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGU8VCBleHRlbmRzIFRlbXBsYXRlS2V5PihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICAgX2dlbmVyYXRlT3B0aW9ucz86IEdlbmVyYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zLCBfZ2VuZXJhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaG90IiwiYXNzZXJ0IiwiY2hhbGsiLCJFdmVudEVtaXR0ZXIiLCJta2RpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwiaW5mbGVjdGlvbiIsIm1pbmltYXRjaCIsInBhdGgiLCJkaXJuYW1lIiwiZ3JvdXAiLCJ1bmlxdWUiLCJyZWdpc3RlcmVkQXBpcyIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJleGlzdHMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImFyZUZpbGVzU2FtZSIsImZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcyIsInJlbmV3Q2hlY2tzdW1zIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsInJlbmRlclRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsImxvYWRXb3JrZmxvd3MiLCJTeW5jZXIiLCJhcGlzIiwidHlwZXMiLCJtb2RlbHMiLCJ3b3JrZmxvd3MiLCJNYXAiLCJpc1N5bmNpbmciLCJldmVudEVtaXR0ZXIiLCJzeW5jIiwidGFyZ2V0cyIsImNvbmZpZyIsImNvcHlTaGFyZWRUb1RhcmdldHMiLCJjaGFuZ2VkRmlsZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYmxhY2siLCJiZ0dyZWVuIiwiZG9TeW5jQWN0aW9ucyIsIndoZW5UaGlzSGFwcGVucyIsIndhaXRGb3JVcFRvIiwic3luY0Zyb21XYXRjaGVyIiwiZXZlbnQiLCJkaWZmRmlsZVBhdGgiLCJpbnZhbGlkYXRlZFBhdGhzIiwiaW52YWxpZGF0ZUZpbGUiLCJib2xkIiwiaW52YWxpZGF0ZWRQYXRoIiwicmVtb3ZlZEFwaXMiLCJyZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzIiwiYmx1ZSIsInJlbGF0aXZlIiwiYXBpUm9vdFBhdGgiLCJncmF5IiwiZSIsImVycm9yIiwicmVkIiwiaXNJbkNoZWNrUGF0dGVybkdyb3VwIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInBhdHRlcm4iLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsImVtaXQiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsInRhcmdldCIsInNyY1BhdGgiLCJqb2luIiwicmVwbGFjZSIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiaG9zdCIsInBvcnQiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJjb250ZW50IiwiUHJvbWlzZSIsImFsbCIsIm92ZXJ3cml0ZSIsImZsYXQiLCJwYXJhbXNBcnJheSIsInJlcyIsImRpciIsImFwaURpciIsInJlYWxTcmMiLCJkc3QiLCJjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkIiwiZnJvbVBhdGgiLCJ0b1BhdGgiLCJvbGRGaWxlQ29udGVudCIsInRvU3RyaW5nIiwibmV3RmlsZUNvbnRlbnQiLCJzZXJ2aWNlc0RpciIsImZpbGVEaXIiLCJyZWxhdGl2ZVBhdGgiLCJzaGFyZWRQYXRoIiwibmZjIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJrZXkiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxZQUFZLFFBQVEsU0FBUztBQUN0QyxTQUFTQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3pELE9BQU9DLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFD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
|
|
458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIGlmICghaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIgLyrshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuKi8pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBgJHtlbnRpdHlJZH1Nb2RlbGApO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UocmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBjb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7Yq57KCVIOuzgOyImCDsuZjtmZjsnYQg7JyE7ZW07IScIOyCrOyaqe2VqeuLiOuLpC5cbiAgICBjb25zdCBjb252ZXJ0TWFwID0ge1xuICAgICAgYmFzZVVybDpcbiAgICAgICAgU29uYW11LmNvbmZpZy5zZXJ2ZXIuYmFzZVVybCA/P1xuICAgICAgICBgaHR0cDovLyR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDB9YCxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgICAgLy8g6re465+w642wIGRpc3Qg7IaNIOu5jOuTnOuQnCDshozsiqQg7L2U65OcIO2MjOydvOydtCDtlYTsmpTtlZwg6rKD7J20IOyVhOuLiOqzoCwgc3Jj7JeQ66eMIOyeiOuKlCDthY3siqTtirgg7YyM7J287J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCAvc3JjL+yXkOyEnCDssL7sirXri4jri6QuXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgICAgYC4uL3NoYXJlZC8ke3RhcmdldH0uc2hhcmVkLnRzLnR4dGAsXG4gICAgICApO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFRleHQgPSBPYmplY3QuZW50cmllcyhjb252ZXJ0TWFwKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gYWNjLnJlcGxhY2UoYCRbWyR7a2V5fV1dYCwgdmFsdWUpLFxuICAgICAgICBmdWxsVGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHsgZGF0YTogY29udmVydGVkVGV4dCB9LCB7IHBhdGg6IGRlc3RQYXRoIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGNvbnZlcnRlZFRleHQpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8g7Yq466as6rGwOiBlbnRpdHksIHR5cGVzXG4gICAgLy8g7JWh7IWYOiDsiqTtgqTrp4gg7IOd7ISxXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkIOuzgOqyveyLnFxuICAgIC8vIOyVoeyFmDog7YyM7J28IOyLse2BrCB0eXBlcywgZW51bXMsIGdlbmVyYXRlZFxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcInR5cGVzXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmdW5jdGlvbnNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImdlbmVyYXRlZFwiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBtb2RlbFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBjb25maWdcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHdvcmtmbG93XG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgfVxuXG4gIC8vIHdlYi8uc29uYW11LmVudiDsl5Ag7ZiE7J6sIOyEpOygleqwkiDsoIDsnqVcbiAgYXN5bmMgYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IFNvbmFtdS5jb25maWcuc2VydmVyLmxpc3RlbiA/PyB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBTb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLCBjb250ZW50KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogc2VydmljZXMuZ2VuZXJhdGVkLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG5cbiAgICAvLyBzZXJ2aWNlcy5nZW5lcmF0ZWQudHMg7Ya17ZWpIO2MjOydvCDsg53shLFcbiAgICBjb25zdCBzZXJ2aWNlc0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJzZXJ2aWNlc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBbLi4uc2VydmljZXNGaWxlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgLy8gd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW116rCAIOyXhuyKteuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCBzb25hbXXsl5Ag64yA7ZWcIGltcG9ydOuKlCDtlajqu5gg67O17IKs65CY64qUIHNvbmFtdS5zaGFyZWQudHPsl5Ag64yA7ZWcIGltcG9ydOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g66y47KCc64qUIOumrOyGjOyKpCDsooXrpZjsl5Ag65Sw6528IHNvbmFtdS5zaGFyZWQudHProZwg6rCA64qUIOqyveuhnOqwgCDri6TrpbTri6TripQg7KCQ7J6F64uI64ukLlxuICAgICAgLy8g7JiI66W8IOuTpOyWtCBzb25hbXUuZ2VuZXJhdGVkLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOqwmeydgCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlZjrqbQg65CY7KeA66eMLFxuICAgICAgLy8gdXNlci50eXBlcy50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDsg4HsnIQg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbQg67O17IKs7ZWY6rOg7J6QIO2VmOuKlCDrpqzshozsiqTsnZgg6rK966GcKHRvUGF0aCnrpbwg6riw7KSA7Jy866GcIHNvbmFtdS5zaGFyZWQudHPqsIAg7J6I64qUIOuUlOugie2GoOumrOulvCDssL7slYTshJwg7IOB64yAIOqyveuhnOulvCDqs4TsgrDtlZjrj4TroZ0g7ZWY7JiA7Iq164uI64ukLlxuICAgICAgY29uc3Qgc2VydmljZXNEaXIgPSB0b1BhdGgucmVwbGFjZSgvXFwvc2VydmljZXNcXC8uKiQvLCBcIi9zZXJ2aWNlc1wiKTtcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBkaXJuYW1lKHRvUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZpbGVEaXIsIHNlcnZpY2VzRGlyKTtcbiAgICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gICAgICByZXR1cm4gbmZjO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwiRXZlbnRFbWl0dGVyIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImluZmxlY3Rpb24iLCJtaW5pbWF0Y2giLCJwYXRoIiwiZGlybmFtZSIsImdyb3VwIiwidW5pcXVlIiwicmVnaXN0ZXJlZEFwaXMiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJsb2FkV29ya2Zsb3dzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwid29ya2Zsb3dzIiwiTWFwIiwiaXNTeW5jaW5nIiwiZXZlbnRFbWl0dGVyIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImUiLCJlcnJvciIsInJlZCIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJlbWl0IiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJjb252ZXJ0TWFwIiwiYmFzZVVybCIsInNlcnZlciIsImxpc3RlbiIsImhvc3QiLCJwb3J0IiwidGFyZ2V0Iiwic3JjUGF0aCIsImpvaW4iLCJyZXBsYWNlIiwiYXBwUm9vdFBhdGgiLCJFcnJvciIsImZ1bGxUZXh0IiwiY29udmVydGVkVGV4dCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJrZXkiLCJ2YWx1ZSIsImRlc3RQYXRoIiwicmVjdXJzaXZlIiwid2FybiIsImRhdGEiLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiY29udGVudCIsIlByb21pc2UiLCJhbGwiLCJwYXJhbXNBcnJheSIsInNlcnZpY2VzRmlsZSIsIm92ZXJ3cml0ZSIsImZsYXQiLCJyZXMiLCJkaXIiLCJhcGlEaXIiLCJyZWFsU3JjIiwiZHN0IiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImZyb21QYXRoIiwidG9QYXRoIiwib2xkRmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsIm5ld0ZpbGVDb250ZW50Iiwic2VydmljZXNEaXIiLCJmaWxlRGlyIiwicmVsYXRpdmVQYXRoIiwic2hhcmVkUGF0aCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsWUFBWSxRQUFRLFNBQVM7QUFDdEMsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBR3hDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLGVBQWUsUUFBUSxrQ0FBK0I7QUFFL0QsU0FBU0MsV0FBVyxRQUE4QixvQkFBaUI7QUFDbkUsU0FBU0MsUUFBUSxFQUFFQyxXQUFXLFFBQVEsMEJBQXVCO0FBQzdELFNBQVNDLFVBQVUsUUFBUSwyQkFBd0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtB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
|