sonamu 0.13.4 → 0.13.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/entity/entity-manager.d.ts +1 -0
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity.d.ts +3 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +5 -2
- package/dist/syncer/syncer.d.ts +4 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +6 -4
- package/dist/types/types.d.ts +5 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +4 -2
- package/package.json +1 -1
- package/src/entity/__tests__/entity-custom.test.ts +50 -0
- package/src/entity/entity.ts +16 -1
- package/src/syncer/__tests__/http-validator-registry.test.ts +15 -0
- package/src/syncer/syncer.ts +12 -3
- package/src/types/entity-custom.test-d.ts +43 -0
- package/src/types/types.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-manager.d.ts","sourceRoot":"","sources":["../../src/entity/entity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAiB,CAAC,EAAE,MAAM,KAAK,CAAC;AAUvC,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GAAG,MAAM,CACpC,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,GAAG,UAAU,EAChG,MAAM,CACP,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAcF,cAAM,kBAAkB;IACtB,OAAO,CAAC,QAAQ,CAAkC;IAC3C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAa;IACpD,OAAO,CAAC,UAAU,CAAqC;IAChD,YAAY,EAAE,OAAO,CAAS;IAErC,OAAO,CAAC,mBAAmB,CAAqB;IAG1C,QAAQ,CAAC,QAAQ,GAAE,OAAe,EAAE,mBAAmB,CAAC,EAAE,MAAM,iBAiCrE;IAED,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"entity-manager.d.ts","sourceRoot":"","sources":["../../src/entity/entity-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/entity/entity.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { type Cone, type EntityIndex, type EntityJson, type EntityProp, type EntityPropNode, type EntitySubsetRow, type RelationProp, type SubsetQuery } from "../types/types";
|
|
2
|
+
import { type Cone, type EntityCustom, type EntityIndex, type EntityJson, type EntityProp, type EntityPropNode, type EntitySubsetRow, type RelationProp, type SubsetQuery } from "../types/types";
|
|
3
3
|
export declare class Entity {
|
|
4
4
|
id: string;
|
|
5
5
|
parentId?: string;
|
|
6
6
|
table: string;
|
|
7
7
|
title: string;
|
|
8
|
+
custom?: EntityCustom;
|
|
8
9
|
cone?: Cone;
|
|
9
10
|
names: {
|
|
10
11
|
parentFs: string;
|
|
@@ -42,7 +43,7 @@ export declare class Entity {
|
|
|
42
43
|
subsetCones: {
|
|
43
44
|
[subsetKey: string]: Cone;
|
|
44
45
|
};
|
|
45
|
-
constructor({ id, parentId, table, title, cone, props, indexes, subsets, enums }: EntityJson);
|
|
46
|
+
constructor({ id, parentId, table, title, custom, cone, props, indexes, subsets, enums, }: EntityJson);
|
|
46
47
|
/**
|
|
47
48
|
* 쿼리용 서브셋 필드를 반환합니다 (subsets + subsetsInternal 합침)
|
|
48
49
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,OAAO,EACL,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EAEjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,MAAM;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;KAC3B,CAAC;IACF,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,eAAe,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;KAC9B,CAAM;IACP,KAAK,EAAE;QACL,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAC/D,CAAM;IACP,UAAU,EAAE;QACV,CAAC,MAAM,EAAE,MAAM,GAAG;YAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAC;KACH,CAAM;IACP,SAAS,EAAE;QACT,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAM;IACP,WAAW,EAAE;QACX,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAM;IAEP,YAAY,
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,OAAO,EACL,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EAEjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAUxB,qBAAa,MAAM;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;KAC3B,CAAC;IACF,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,eAAe,EAAE;QACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;KAC9B,CAAM;IACP,KAAK,EAAE;QACL,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAC/D,CAAM;IACP,UAAU,EAAE;QACV,CAAC,MAAM,EAAE,MAAM,GAAG;YAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAC;KACH,CAAM;IACP,SAAS,EAAE;QACT,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,CAAM;IACP,WAAW,EAAE;QACX,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAM;IAEP,YAAY,EACV,EAAE,EACF,QAAQ,EACR,KAAK,EACL,KAAK,EACL,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,KAAK,GACN,EAAE,UAAU,EA4EZ;IAED;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;IAED;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+B5C;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IA8C/B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,2BAA2B;IA6BnC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2G5C;IAKD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAK7C;IAID,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,oBAAoB,GAAE,OAAe,GACpC,WAAW,CA2Mb;IAKD,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAa,GAAG,cAAc,EAAE,CAiFnF;IAED,aAAa,CAAC,MAAM,SAAK,EAAE,QAAQ,GAAE,MAAU,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAsB/E;IAED;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAalD;IAED;;OAEG;IACH,gBAAgB,IAAI,UAAU,EAAE,CAE/B;IAED;;;OAGG;IACH,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAM3D;IAED;;;;;;OAMG;IACH,kBAAkB,IAAI,UAAU,EAAE,CAwBjC;IAED;;;;OAIG;IACG,mBAAmB,CAAC,mBAAmB,CAAC,EAAE,MAAM,iBAwCrD;IAED,kBAAkB,IAAI,IAAI,CAWzB;IAED,MAAM,IAAI,UAAU,CAgDnB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAwB1B;IAED;;;;;;;OAOG;IACG,qBAAqB,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtE;IAED;;;;;;OAMG;IACG,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QAC5B,oCAAoC;QACpC,YAAY,CAAC,EAAE,OAAO,wBAAwB,EAAE,iBAAiB,CAAC;QAClE,sDAAsD;QACtD,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,GAAG,OAAO,CAAC,OAAO,wBAAwB,EAAE,oBAAoB,CAAC,CAejE;IAED;;;;OAIG;IACH,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAsB3C;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,OAAO,wBAAwB,EAAE,oBAAoB,GAAG,IAAI,CAe9E;IAED,aAAa,CACX,QAAQ,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,EACtC,gBAAgB,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,EAC9C,QAAQ,GAAE,MAAM,EAAO,GACtB,eAAe,EAAE,CAqEnB;IAED,wBAAwB,CACtB,UAAU,EAAE,eAAe,EAAE,EAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAe,GACxB,MAAM,EAAE,CAcV;IAEK,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D;IAED,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG;QACvC,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAwBF;IAEK,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/D;IAEK,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvC;IAED,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAkBtD;IAEK,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpD;IAED;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtC;IAED;;;OAGG;IACH,SAAS,IAAI,SAAS,GAAG,QAAQ,GAAG,MAAM,CASzC;IAED;;;OAGG;IACH,SAAS,IAAI,UAAU,CAMtB;IAED;;;OAGG;IACH,cAAc,IAAI,MAAM,CAGvB;CACF"}
|
package/dist/entity/entity.js
CHANGED
|
@@ -31,6 +31,7 @@ var init_entity = __esmMin((() => {
|
|
|
31
31
|
parentId;
|
|
32
32
|
table;
|
|
33
33
|
title;
|
|
34
|
+
custom;
|
|
34
35
|
cone;
|
|
35
36
|
names;
|
|
36
37
|
props;
|
|
@@ -44,11 +45,12 @@ var init_entity = __esmMin((() => {
|
|
|
44
45
|
enumLabels = {};
|
|
45
46
|
enumCones = {};
|
|
46
47
|
subsetCones = {};
|
|
47
|
-
constructor({ id, parentId, table, title, cone, props, indexes, subsets, enums }) {
|
|
48
|
+
constructor({ id, parentId, table, title, custom, cone, props, indexes, subsets, enums }) {
|
|
48
49
|
this.id = id;
|
|
49
50
|
this.parentId = parentId;
|
|
50
51
|
this.title = title ?? this.id;
|
|
51
52
|
this.table = table ?? inflection.underscore(inflection.pluralize(id));
|
|
53
|
+
this.custom = custom;
|
|
52
54
|
this.cone = cone;
|
|
53
55
|
if (props) {
|
|
54
56
|
this.props = props.map((prop) => {
|
|
@@ -523,6 +525,7 @@ var init_entity = __esmMin((() => {
|
|
|
523
525
|
parentId: this.parentId,
|
|
524
526
|
table: this.table,
|
|
525
527
|
title: this.title,
|
|
528
|
+
custom: this.custom,
|
|
526
529
|
cone: this.cone,
|
|
527
530
|
props: this.props,
|
|
528
531
|
indexes: this.indexes,
|
|
@@ -808,4 +811,4 @@ var init_entity = __esmMin((() => {
|
|
|
808
811
|
init_entity();
|
|
809
812
|
export { Entity, init_entity };
|
|
810
813
|
|
|
811
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxDb2RlUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgbm9ybWFsaXplU3Vic2V0RmllbGQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgUmVsYXRpb25Qcm9wLFxuICB0eXBlIFN1YnNldEZpZWxkLFxuICB0eXBlIFN1YnNldFF1ZXJ5LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR56rCAIOuFuOy2nO2VmOuKlCDtg4DsnoUg7J2066aE6rO8IOuqqOuTiCDqsr3roZzrpbwgRW50aXR5TWFuYWdlcuyXkCDrk7HroZ3tlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsaWNpdEFwaVJvb3RQYXRoIC0gU29uYW11IOy0iOq4sO2ZlCDsl4bsnbQg65Ox66Gd7ZWgIOuVjCDsgqzsmqntlaAgQVBJIOujqO2KuCDqsr3roZxcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoZXhwbGljaXRBcGlSb290UGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FRc0MsWUFBQTtDQUNTLHFCQUFBO0NBY3hCLFdBQUE7Q0FZMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUdBO0VBR0E7RUFDQTtFQUdBO0VBR0EsUUFFSSxDQUFDO0VBQ0wsUUFFSSxDQUFDO0VBQ0wsYUFJSSxDQUFDO0VBQ0wsWUFFSSxDQUFDO0VBQ0wsY0FFSSxDQUFDO0VBRUwsWUFBWSxFQUFFLElBQUksVUFBVSxPQUFPLE9BQU8sTUFBTSxPQUFPLFNBQVMsU0FBUyxTQUFxQjtHQUU1RixLQUFLLEtBQUs7R0FDVixLQUFLLFdBQVc7R0FDaEIsS0FBSyxRQUFRLFNBQVMsS0FBSztHQUMzQixLQUFLLFFBQVEsU0FBUyxXQUFXLFdBQVcsV0FBVyxVQUFVLEVBQUUsQ0FBQztHQUNwRSxLQUFLLE9BQU87R0FHWixJQUFJLE9BQU87SUFDVCxLQUFLLFFBQVEsTUFBTSxLQUFLLFNBQVM7S0FDL0IsSUFBSSxXQUFXLElBQUksR0FDakI7VUFBSSxLQUFLLEdBQUcsU0FBUyxRQUFRLEdBQzNCLEtBQUssS0FBSyxLQUFLLEdBQUcsUUFBUSxVQUFVLEVBQUU7S0FDeEM7S0FFRixPQUFPO0lBQ1QsQ0FBQztJQUNELEtBQUssWUFBWSxPQUFPLFlBQ3RCLE1BQU0sS0FBSyxTQUFTO0tBQ2xCLE9BQU8sQ0FBQyxLQUFLLE1BQU0sSUFBSTtJQUN6QixDQUFDLENBQ0g7SUFHQSxLQUFLLFlBQVksT0FBTyxZQUN0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
|
|
814
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxDb2RlUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgbm9ybWFsaXplU3Vic2V0RmllbGQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUN1c3RvbSxcbiAgdHlwZSBFbnRpdHlJbmRleCxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIFJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXRGaWVsZCxcbiAgdHlwZSBTdWJzZXRRdWVyeSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgTmVzdGVkU2VsZWN0ID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBOZXN0ZWRTZWxlY3QgfTtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9lbnRpdHktbWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN1c3RvbT86IEVudGl0eUN1c3RvbTtcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGlkLFxuICAgIHBhcmVudElkLFxuICAgIHRhYmxlLFxuICAgIHRpdGxlLFxuICAgIGN1c3RvbSxcbiAgICBjb25lLFxuICAgIHByb3BzLFxuICAgIGluZGV4ZXMsXG4gICAgc3Vic2V0cyxcbiAgICBlbnVtcyxcbiAgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jdXN0b20gPSBjdXN0b207XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgcmV0dXJuIFtrZXksIHouZW51bShPYmplY3Qua2V5cyhlbnVtTGFiZWwpKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gbmFtZXNcbiAgICB0aGlzLm5hbWVzID0ge1xuICAgICAgcGFyZW50RnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwYXJlbnRJZCA/PyBpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBmczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIG1vZHVsZTogaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsv7zrpqzsmqkg7ISc67iM7IWLIO2VhOuTnOulvCDrsJjtmZjtlanri4jri6QgKHN1YnNldHMgKyBzdWJzZXRzSW50ZXJuYWwg7ZWp7LmoKVxuICAgKi9cbiAgZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi4odGhpcy5zdWJzZXRzW3N1YnNldEtleV0gPz8gW10pLCAuLi4odGhpcy5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXSldO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsnbTrpoQoc3Vic2V0S2V5KeydmCBzdWJzZXTsnYQg7Iuk7KCc66GcIOqwgOyguOyYpOuKlCBQdXJpIOy9lOuTnCDqtaztmITssrQgc3RyaW5n7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFB1cmlTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gZnJvbVxuICAgIGxpbmVzLnB1c2goYHJldHVybiBxYldyYXBwZXJgKTtcbiAgICBsaW5lcy5wdXNoKGAuZnJvbShcIiR7dGhpcy50YWJsZX1cIilgKTtcblxuICAgIC8vIGpvaW5cbiAgICBmb3IgKGNvbnN0IGpvaW4gb2Ygc3Vic2V0UXVlcnkuam9pbnMpIHtcbiAgICAgIC8vIGpvaW4g66mU7ISc65OcIOqysOyglTogaW5uZXIg4oaSIGpvaW4sIG91dGVyIOKGkiBsZWZ0Sm9pblxuICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG5cbiAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIHJhdyDsgqzsmqlcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBxYldyYXBwZXIua25leC5yYXcoXFxgJHtqb2luLmN1c3RvbX1cXGApKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNlbGVjdCAtIOyeheyytOyggSDqtazsobDroZwg7IOd7ISxXG4gICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChzdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgIGxpbmVzLnB1c2goYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLmVudGl0eS5qc29u7J2YIHN1YnNldOyXkCDrk6TslrTsnojripQg7ZWE65OcIOuwsOyXtOydhCDrsJvslYTshJwsXG4gICAqIFB1cmnsnZggU2VsZWN0T2JqZWN0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOyYiDogW1widXNlcnMuaWRcIiwgXCJwYXJlbnQuaWRcIiwgXCJwYXJlbnQubmFtZVwiXVxuICAgKiAgIOKGkiB7IGlkOiBcInVzZXJzLmlkXCIsIHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKlxuICAgKiDslrjrjZTrsJTqsIAg7JWE64uMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWo7JeQIOycoOydmO2VmOyEuOyalC5cbiAgICog7J2066CH6rKMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWY7JesIHNlbGVjdOyXkCDrhJjqsqjso7zrqbQgUGFyc2VTZWxlY3RPYmplY3Qg7YOA7J6F7J20IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDsnpgg7J6h7JWE7KSEIOyImCDsnojsirXri4jri6QuXG4gICAqIOymiSwgZW5oYW5jZXLsl5DshJwgcm9366W8IOuwm+yVmOydhCDrlYwgaHlkcmF0ZeuQnCDqsJ3ssrQg7J6Q7LK07J2YIG51bGxpdHnsmYAg6re4IOyViOyqvSDtlYTrk5zsnZggbnVsbGl0eeqwgCBmayBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyemCDstpTroaDrkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdEl0ZW1zOiBzdHJpbmdbXSk6IE5lc3RlZFNlbGVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBOZXN0ZWRTZWxlY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc2VsZWN0SXRlbSBvZiBzZWxlY3RJdGVtcykge1xuICAgICAgLy8gXCJ1c2Vycy5pZFwiIOuYkOuKlCBcInVzZXJzLmlkIGFzIHVzZXJfX2lkXCIg7ZiV7YOcIO2MjOyLsVxuICAgICAgY29uc3QgbWF0Y2ggPSBzZWxlY3RJdGVtLm1hdGNoKC9eKC4rPykoPzogYXMgKC4rKSk/JC8pO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IFssIGNvbHVtbiwgYWxpYXNdID0gbWF0Y2g7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGBcIiR7Y29sdW1uLnRyaW0oKX1cImA7XG5cbiAgICAgIGlmICghYWxpYXMgfHwgIWFsaWFzLmluY2x1ZGVzKFwiX19cIikpIHtcbiAgICAgICAgLy8gYWxpYXPqsIAg7JeG6rGw64KYIF9f66W8IO2PrO2VqO2VmOyngCDslYrsnLzrqbQg7LWc7IOB7JyEIO2VhOuTnFxuICAgICAgICBjb25zdCBrZXkgPSBhbGlhcyA/PyBhc3NlcnREZWZpbmVkKGNvbHVtbi5zcGxpdChcIi5cIikucG9wKCkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWxpYXPqsIAgX1/rpbwg7Y+s7ZWo7ZWY66m0IOyeheyytCDqtazsobDroZwg6re466O57ZmUXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWxpYXMuc3BsaXQoXCJfX1wiKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuCDsoITquYzsp4Ag7KSR7LKpIOqwneyytCDsg53shLFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgaWYgKHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoY3VycmVudFtwYXJ0XSkpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICBvYmo6IE5lc3RlZFNlbGVjdCxcbiAgICBpbmRlbnQ6IG51bWJlciA9IDAsXG4gICAgd2l0aEJyYWNlczogYm9vbGVhbiA9IHRydWUsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGlubmVyU3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHdpdGhCcmFjZXMgPyBcInt9XCIgOiBcIlwiO1xuXG4gICAgY29uc3QgbGluZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKG5lc3RlZExvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBuZXN0ZWRMb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwZWRGaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChncm91cGVkRmllbGRzICE9PSB1bmRlZmluZWQsIFwiZmllbGRzIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAvLyDtmITsnqwg7YWM7J2067iUIO2VhOuTnOyFi+ydgCBzZWxlY3QsIHZpcnR1YWzsl5Ag7LaU6rCA7ZWY6rOgIOumrO2EtFxuICAgICAgICBpZiAoZ3JvdXBLZXkgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb25zdCByZWFsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PlxuICAgICAgICAgICAgaXNWaXJ0dWFsQ29kZVByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5nZXRGdWxsRmllbGROYW1lKGZpZWxkKSkpO1xuICAgICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdCh2aXJ0dWFsQ29kZUZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOuEmOyWtOyYqCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChcbiAgICAgICAgICAgICAgcmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtwcmVmaXh9LiR7ZmllbGR9IGFzICR7cHJlZml4fV9fJHtmaWVsZH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMucmVsYXRpb25zW2dyb3VwS2V5XTtcbiAgICAgICAgaWYgKHJlbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgcmVsYXRpb24g7LC47KGwICR7Z3JvdXBLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG5cbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb246IEpPSU4g7Jy866GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcblxuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb27sl5DshJwgaWQg7ZWE65Oc66eMIOywuOyhsO2VmOuKlCDqsr3smrAg66a066CI7J207IWYIOuEmOq4sOyngCDslYrqs6Ag66as7YS0XG4gICAgICAgICAgaWYgKHJlbEZpZWxkcy5sZW5ndGggPT09IDEgJiYgcmVsRmllbGRzWzBdID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7dGhpcy50YWJsZX0uJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3ByZWZpeH0uJHtncm91cEtleX1faWQgYXMgJHtwcmVmaXh9X18ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5uZXJPck91dGVyXG4gICAgICAgICAgY29uc3QgaW5uZXJPck91dGVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0FscmVhZHlPdXRlckpvaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4gJiYgIShyZWxhdGlvbi5udWxsYWJsZSA/PyBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgICAgICAgICAgYCR7cHJlZml4ICE9PSBcIlwiID8gYCR7cHJlZml4fS5gIDogXCJcIn0ke2dyb3VwS2V5fWAsXG4gICAgICAgICAgICByZWxGaWVsZHMsXG4gICAgICAgICAgICBpbm5lck9yT3V0ZXIgPT09IFwib3V0ZXJcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdChyZWxTdWJzZXRRdWVyeS52aXJ0dWFsKTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5BcyA9IHByZWZpeCA9PT0gXCJcIiA/IGdyb3VwS2V5IDogYCR7cHJlZml4fV9fJHtncm91cEtleX1gO1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZSA9IHByZWZpeCA9PT0gXCJcIiA/IHRoaXMudGFibGUgOiBwcmVmaXg7XG5cbiAgICAgICAgICBsZXQgam9pbkNsYXVzZTpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGZyb206IHN0cmluZztcbiAgICAgICAgICAgICAgICB0bzogc3RyaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBjdXN0b206IHN0cmluZztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSkge1xuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb206IHN0cmluZywgdG86IHN0cmluZztcbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uaWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS4ke2luZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLm5hbWVzLmZzLnJlcGxhY2UoLy0vZywgXCJfXCIpKX1faWRgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zLnB1c2goe1xuICAgICAgICAgICAgYXM6IGpvaW5BcyxcbiAgICAgICAgICAgIGpvaW46IGlubmVyT3JPdXRlcixcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAuLi5qb2luQ2xhdXNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQmVsb25nc1RvT25lIOuwkeyXkCBIYXNNYW556rCAIOu2meydgCDqsr3smrBcbiAgICAgICAgICBpZiAocmVsU3Vic2V0UXVlcnkubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMb2FkZXJzID0gcmVsU3Vic2V0UXVlcnkubG9hZGVycy5tYXAoKGxvYWRlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZXdBcyA9IFtncm91cEtleSwgbG9hZGVyLmFzXS5qb2luKFwiX19cIik7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXM6IG5ld0FzLFxuICAgICAgICAgICAgICAgIHRhYmxlOiBsb2FkZXIudGFibGUsXG4gICAgICAgICAgICAgICAgbWFueUpvaW46IGxvYWRlci5tYW55Sm9pbixcbiAgICAgICAgICAgICAgICBvbmVKb2luczogbG9hZGVyLm9uZUpvaW5zLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogbG9hZGVyLnNlbGVjdCxcbiAgICAgICAgICAgICAgICBsb2FkZXJzOiBsb2FkZXIubG9hZGVycyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByLmxvYWRlcnMgPSBbLi4uci5sb2FkZXJzLCAuLi5jb252ZXJ0ZWRMb2FkZXJzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zID0gci5qb2lucy5jb25jYXQocmVsU3Vic2V0UXVlcnkuam9pbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1NYW55IFJlbGF0aW9uOiBMb2FkZXIg66GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB7XG4gICAgICAgIHNlbGVjdDogW10sXG4gICAgICAgIHZpcnR1YWw6IFtdLFxuICAgICAgICBqb2luczogW10sXG4gICAgICAgIGxvYWRlcnM6IFtdLFxuICAgICAgfSBhcyBTdWJzZXRRdWVyeSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgIEZpZWxkRXhwcltdIOydhCBFbnRpdHlQcm9wTm9kZVtdIOuhnCDrs4DtmZhcbiAgKi9cbiAgZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnM6IHN0cmluZ1tdLCBlbnRpdHk6IEVudGl0eSA9IHRoaXMpOiBFbnRpdHlQcm9wTm9kZVtdIHtcbiAgICBjb25zdCBncm91cHMgPSBmaWVsZEV4cHJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGZpZWxkRXhwcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGVsc2VFeHByOiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGZpZWxkRXhwci5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBba2V5LCAuLi5lbHNlRXhwcl0gPSBmaWVsZEV4cHIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHZhbHVlID0gZWxzZUV4cHIuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJcIjtcbiAgICAgICAgICB2YWx1ZSA9IGZpZWxkRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IChyZXN1bHRba2V5XSA/PyBbXSkuY29uY2F0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge30gYXMge1xuICAgICAgICBbazogc3RyaW5nXTogc3RyaW5nW107XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JvdXBzKS5mbGF0TWFwPEVudGl0eVByb3BOb2RlLCBFbnRpdHlQcm9wTm9kZVtdPigoa2V5KSA9PiB7XG4gICAgICBjb25zdCBncm91cGVkRmllbGRFeHBycyA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRGaWVsZEV4cHJzLm1hcCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LmlkfSAtLSDsnpjrqrvrkJwgRmllbGRFeHByICcke3Byb3BOYW1lfScgKOyCrOyaqSDqsIDriqXtlZwgcHJvcHM6ICR7ZW50aXR5LnByb3BzLm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzRGljdFtrZXldO1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCBGaWVsZEV4cHIgJHtrZXl9LiR7Z3JvdXBlZEZpZWxkRXhwcnNbMF19YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAvLyByZWxhdGlvbiAtT25lIOyXkCBpZCDtlYTrk5wg7ZWY64KY7J24IOqyveyasFxuICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdyb3VwZWRGaWVsZEV4cHJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIChncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZFwiIHx8IGdyb3VwZWRGaWVsZEV4cHJzWzBdID09PSBcImlkP1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBpZCDtlZjrgpjrp4wg7J6I64qU7KeAIOyytO2BrO2VtOyEnCwg7ZWY64KY66eMIOyeiOycvOuptCDsg4HsnIQgcHJvcOycvOuhnCBpZOulvCDrpqzthLRcbiAgICAgICAgICBjb25zdCBpZFByb3AgPSByZWxFbnRpdHkucHJvcHNEaWN0LmlkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcDoge1xuICAgICAgICAgICAgICAuLi5pZFByb3AsXG4gICAgICAgICAgICAgIG5hbWU6IGAke2tleX1faWRgLFxuICAgICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtT25lIOq3uOyZuOydmCDqsr3smrAgb2JqZWN066GcIOumrO2EtFxuICAgICAgLy8gLU1hbnnsnZgg6rK97JqwIGFycmF566GcIOumrO2EtFxuICAgICAgLy8gUmVjdXJzaXZlIOuhnCDrjoHsiqQg7LKY66asXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZmllbGRFeHByc1RvUHJvcE5vZGVzKGdyb3VwZWRGaWVsZEV4cHJzLCByZWxFbnRpdHkpO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPVxuICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApXG4gICAgICAgICAgPyAoXCJvYmplY3RcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImFycmF5XCIgYXMgY29uc3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFeHBycyhwcmVmaXggPSBcIlwiLCBtYXhEZXB0aDogbnVtYmVyID0gMywgZnJvbXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5mbGF0TWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gW3ByZWZpeCwgcHJvcC5uYW1lXS5maWx0ZXIoKHYpID0+IHYgIT09IFwiXCIpLmpvaW4oXCIuXCIpO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09IHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChtYXhEZXB0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbXMuaW5jbHVkZXMocHJvcC53aXRoKSkge1xuICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCDsoJzsmbhcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyDsoJXrsKntlqUgcmVsYXRpb27snbgg6rK97JqwIHJlY3Vyc2l2ZSDsvZxcbiAgICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlbE1kLmdldEZpZWxkRXhwcnMocHJvcE5hbWUsIG1heERlcHRoIC0gMSwgWy4uLmZyb21zLCB0aGlzLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgIT09IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIHByb3DsnbQg7ZiE7J6sIO2FjOydtOu4lOyXkCBGSyDsu6zrn7zsnYQg7IOd7ISx7ZWY64qU7KeAIO2ZleyduFxuICAgKihCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lKGhhc0pvaW5Db2x1bW49dHJ1ZSnsnbgg6rK97JqwIEZLIOyDneyEsSlcbiAgICovXG4gIHByaXZhdGUgaGFzRm9yZWlnbktleShwcm9wOiBSZWxhdGlvblByb3ApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiQmVsb25nc1RvT25lXCIgfHxcbiAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJPbmVUb09uZVwiICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCwgdHlwZTogXCJpbnRfdW5zaWduZWRcIiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcC5uYW1lLCB0eXBlOiBwcm9wLnR5cGUgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsl5Ag7KCV7J2Y65CcIOuqqOuToCB2ZWN0b3Ig7YOA7J6FIOy7rOufvCDrsJjtmZhcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbnMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIHZlY3RvciDsu6zrn7wg67CY7ZmYXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0g7Lus65+866qFICjsg53rnrUg7IucIOyyqyDrsojsp7ggdmVjdG9yIOy7rOufvClcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbihjb2x1bW5OYW1lPzogc3RyaW5nKTogRW50aXR5UHJvcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmVjdG9yUHJvcHMgPSB0aGlzLmdldFZlY3RvckNvbHVtbnMoKTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIHZlY3RvclByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3JQcm9wc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTthLDrp4Eg6rCA64ql7ZWcIHByb3BzIOuwmO2ZmFxuICAgKlxuICAgKiAtIOydvOuwmCBwcm9wXG4gICAqIC0gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9uIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lIHdpdGggaGFzSm9pbkNvbHVtbilcbiAgICogICDihpIge25hbWV9X2lkIO2Yle2DnOydmCDqsIDsg4EgaW50ZWdlciBwcm9w7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RmlsdGVyYWJsZVByb3BzKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmxhdE1hcCgocHJvcCk6IEVudGl0eVByb3AgfCBFbnRpdHlQcm9wW10gPT4ge1xuICAgICAgLy8gVmlydHVhbCBwcm9wIOygnOyZuFxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbuunjCDtj6ztlahcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCxcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgfSBhcyBFbnRpdHlQcm9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnqsIAg64W47Lac7ZWY64qUIO2DgOyehSDsnbTrpoTqs7wg66qo65OIIOqyveuhnOulvCBFbnRpdHlNYW5hZ2Vy7JeQIOuTseuhne2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxpY2l0QXBpUm9vdFBhdGggLSBTb25hbXUg7LSI6riw7ZmUIOyXhuydtCDrk7HroZ3tlaAg65WMIOyCrOyaqe2VoCBBUEkg66Oo7Yq4IOqyveuhnFxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocyhleHBsaWNpdEFwaVJvb3RQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBgJHt0aGlzLm5hbWVzLnBhcmVudEZzfWA7XG5cbiAgICAvLyBiYXNlLXNjaGVtZVxuICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfUJhc2VTY2hlbWFgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuXG4gICAgLy8gc3Vic2V0XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0S2V5YCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldE1hcHBpbmdgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoXG4gICAgICAgICAgYCR7dGhpcy5pZH1TdWJzZXQke3N1YnNldEtleS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgYHNvbmFtdS5nZW5lcmF0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGVudW1JZCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlc1xuICAgIGNvbnN0IHR5cGVzTW9kdWxlUGF0aCA9IGAke2Jhc2VQYXRofS8ke3RoaXMubmFtZXMucGFyZW50RnN9LnR5cGVzYDtcbiAgICBjb25zdCB0eXBlc0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgZXhwbGljaXRBcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBpbXBvcnRlZE1lbWJlcnMubWFwKCh7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgobmFtZSwgdHlwZXNNb2R1bGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIHZhbHVlXTtcbiAgICAgICAgfSksXG4gICAgICApIGFzIHsgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVTcGVjcygpOiB2b2lkIHtcbiAgICAvLyDsobDsnbgg7YWM7J2067iUIOyduOuNseyKpCDsoJzsmbggKOy7rOufvCDsnbTrpoTsl5AgJy4n7J20IO2PrO2VqOuQnCDqsr3smrApXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1xuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHgudHlwZSA9PT0gXCJ1bmlxdWVcIilcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LmNvbHVtbnMuZXZlcnkoKGNvbCkgPT4gIWNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkpO1xuXG4gICAgRW50aXR5TWFuYWdlci5zZXRUYWJsZVNwZWMoe1xuICAgICAgbmFtZTogdGhpcy50YWJsZSxcbiAgICAgIHVuaXF1ZUluZGV4ZXMsXG4gICAgICBqc29uQ29sdW1uczogdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJqc29uXCIpLm1hcCgocCkgPT4gcC5uYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBFbnRpdHlKc29uIHtcbiAgICAvLyBzdWJzZXRz7JmAIHN1YnNldHNJbnRlcm5hbOydhCBTdWJzZXREZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3Qgc3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5TdWJzZXREZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9IHRoaXMuc3Vic2V0c1trZXldO1xuICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSAodGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkubWFwKChmaWVsZCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgZmllbGRzID0gWy4uLm5vcm1hbEZpZWxkcywgLi4uaW50ZXJuYWxGaWVsZHNdO1xuXG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IOuwsOyXtCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLnN1YnNldENvbmVzW2tleV0pIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0ge1xuICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICBjb25lOiB0aGlzLnN1YnNldENvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSBmaWVsZHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXPrpbwgRW51bURlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBlbnVtczogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5FbnVtRGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCBSZWNvcmQg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5lbnVtQ29uZXNba2V5XSkge1xuICAgICAgICBlbnVtc1trZXldID0ge1xuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICBjb25lOiB0aGlzLmVudW1Db25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHZhbHVlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBjdXN0b206IHRoaXMuY3VzdG9tLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FRc0MsWUFBQTtDQUNTLHFCQUFBO0NBY3hCLFdBQUE7Q0FhMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLENBQUM7RUFDTCxRQUVJLENBQUM7RUFDTCxhQUlJLENBQUM7RUFDTCxZQUVJLENBQUM7RUFDTCxjQUVJLENBQUM7RUFFTCxZQUFZLEVBQ1YsSUFDQSxVQUNBLE9BQ0EsT0FDQSxRQUNBLE1BQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDYTtHQUViLEtBQUssS0FBSztHQUNWLEtBQUssV0FBVztHQUNoQixLQUFLLFFBQVEsU0FBUyxLQUFLO0dBQzNCLEtBQUssUUFBUSxTQUFTLFdBQVcsV0FBVyxXQUFXLFVBQVUsRUFBRSxDQUFDO0dBQ3BFLEtBQUssU0FBUztHQUNkLEtBQUssT0FBTztHQUdaLElBQUksT0FBTztJQUNULEtBQUssUUFBUSxNQUFNLEtBQUssU0FBUztLQUMvQixJQUFJLFdBQVcsSUFBSSxHQUNqQjtVQUFJLEtBQUssR0FBRyxTQUFTLFFBQVEsR0FDM0IsS0FBSyxLQUFLLEtBQUssR0FBRyxRQUFRLFVBQVUsRUFBRTtLQUN4QztLQUVGLE9BQU87SUFDVCxDQUFDO0lBQ0QsS0FBSyxZQUFZLE9BQU8sWUFDdEIsTUFBTSxLQUFLLFNBQVM7S0FDbEIsT0FBTyxDQUFDLEtBQUssTUFBTSxJQUFJO0lBQ3pCLENBQUMsQ0FDSDtJQUdBLEtBQUssWUFBWSxPQUFPLFlBQ3RCLE1BQU0sUUFBUSxTQUFTLGVBQWUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE1BQU0sSUFBSSxDQUFDLENBQzlFO0dBQ0YsT0FBTztJQUNMLEtBQUssUUFBUSxDQUFDO0lBQ2QsS0FBSyxZQUFZLENBQUM7SUFDbEIsS0FBSyxZQUFZLENBQUM7R0FDcEI7R0FHQSxLQUFLLFVBQVUsV0FBVyxDQUFDO0dBRzNCLEtBQUssVUFBVSxDQUFDO0dBQ2hCLEtBQUssa0JBQWtCLENBQUM7R0FDeEIsS0FBSyxNQUFNLENBQUMsS0FBSyxjQUFjLE9BQU8sUUFBUSxXQUFXLENBQUMsQ0FBQyxHQUFHO0lBQzVELE1BQU0sU0FBUyxnQkFBZ0IsU0FBUztJQUN4QyxLQUFLLFFBQVEsT0FBTyxPQUFPLFFBQVEsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksb0JBQW9CO0lBQzVGLEtBQUssZ0JBQWdCLE9BQU8sT0FBTyxPQUFPLHFCQUFxQixDQUFDLENBQUMsSUFBSSxvQkFBb0I7SUFHekYsSUFBSSxDQUFDLE1BQU0sUUFBUSxTQUFTLEtBQUssVUFBVSxhQUFhLFVBQVUsTUFDaEUsS0FBSyxZQUFZLE9BQU8sVUFBVTtHQUV0QztHQUdBLEtBQUssYUFBYSxPQUFPLFlBQ3ZCLE9BQU8sUUFBUSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssYUFBYTtJQUVsRCxJQUFJLFlBQVksV0FBVyxVQUFVLFdBQVcsUUFBUSxNQUV0RCxLQUFLLFVBQVUsT0FBTyxRQUFRO0lBRWhDLE9BQU8sQ0FBQyxLQUFLLGlCQUFpQixPQUFPLENBQUM7R0FDeEMsQ0FBQyxDQUNIO0dBQ0EsS0FBSyxRQUFRLE9BQU8sWUFDbEIsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssZUFBZTtJQUV4RCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0dBQzdDLENBQUMsQ0FDSDtHQUdBLEtBQUssUUFBUTtJQUNYLFVBQVUsV0FBVyxVQUFVLFdBQVcsV0FBVyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWTtJQUNsRixJQUFJLFdBQVcsVUFBVSxXQUFXLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZO0lBQ2hFLFFBQVE7R0FDVjtFQUNGOzs7O0VBS0Esd0JBQXdCLFdBQTZCO0dBQ25ELE9BQU8sQ0FBQyxHQUFJLEtBQUssUUFBUSxjQUFjLENBQUMsR0FBSSxHQUFJLEtBQUssZ0JBQWdCLGNBQWMsQ0FBQyxDQUFFO0VBQ3hGOzs7O0VBS0EsbUJBQW1CLFdBQTJCO0dBQzVDLE1BQU0sU0FBUyxLQUFLLHdCQUF3QixTQUFTO0dBQ3JELE1BQU0sY0FBYyxLQUFLLG1CQUFtQixJQUFJLE1BQU07R0FFdEQsTUFBTSxRQUFrQixDQUFDO0dBR3pCLE1BQU0sS0FBSyxrQkFBa0I7R0FDN0IsTUFBTSxLQUFLLFVBQVUsS0FBSyxNQUFNLEdBQUc7R0FHbkMsS0FBSyxNQUFNLFFBQVEsWUFBWSxPQUFPO0lBR3BDLE1BQU0sYUFBYSxLQUFLLFNBQVMsVUFBVSxTQUFTO0lBRXBELElBQUksWUFBWSxNQUVkLE1BQU0sS0FDSixJQUFJLFdBQVcsS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLE1BQU0sNEJBQTRCLEtBQUssT0FBTyxLQUN0RjtTQUVBLE1BQU0sS0FBSyxJQUFJLFdBQVcsS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxLQUFLLEdBQUcsR0FBRztHQUU5RjtHQUdBLE1BQU0sWUFBWSxLQUFLLHdCQUF3QixZQUFZLE1BQU07R0FDakUsTUFBTSxLQUFLLFdBQVcsS0FBSyw0QkFBNEIsU0FBUyxFQUFFLEdBQUc7R0FFckUsT0FBTyxNQUFNLEtBQUssSUFBSTtFQUN4Qjs7Ozs7Ozs7Ozs7O0VBYUEsd0JBQWdDLGFBQXFDO0dBQ25FLE1BQU0sU0FBdUIsQ0FBQztHQUU5QixLQUFLLE1BQU0sY0FBYyxhQUFhO0lBRXBDLE1BQU0sUUFBUSxXQUFXLE1BQU0sc0JBQXNCO0lBQ3JELElBQUksQ0FBQyxPQUFPO0lBRVosTUFBTSxHQUFHLFFBQVEsU0FBUztJQUMxQixNQUFNLGNBQWMsSUFBSSxPQUFPLEtBQUssRUFBRTtJQUV0QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sU0FBUyxJQUFJLEdBQUc7S0FFbkMsTUFBTSxNQUFNLFNBQVMsY0FBYyxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0tBQzFELE9BQU8sT0FBTztJQUNoQixPQUFPO0tBRUwsTUFBTSxRQUFRLE1BQU0sTUFBTSxJQUFJO0tBQzlCLElBQUksVUFBVTtLQUdkLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLFNBQVMsR0FBRyxLQUFLO01BQ3pDLE1BQU0sT0FBTyxNQUFNO01BQ25CLElBQUksUUFBUSxTQUNWO1dBQUksY0FBYyxRQUFRLEtBQUssR0FHN0IsTUFBTSxJQUFJLE1BQ1IsbURBQW1ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsNENBQTRDLE1BQU0sWUFDeEk7TUFDRixPQUVBLFFBQVEsUUFBUSxDQUFDO01BRW5CLFVBQVUsUUFBUTtLQUNwQjtLQUdBLE1BQU0sV0FBVyxNQUFNLE1BQU0sU0FBUztLQUN0QyxRQUFRLFlBQVk7SUFDdEI7R0FDRjtHQUVBLE9BQU8sT0FBTyxZQUFZLE9BQU8sUUFBUSxNQUFNLENBQUM7RUFDbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQkEsNEJBQ0UsS0FDQSxTQUFpQixHQUNqQixhQUFzQixNQUNkO0dBQ1IsTUFBTSxTQUFTLEtBQUssT0FBTyxNQUFNO0dBQ2pDLE1BQU0sY0FBYyxLQUFLLE9BQU8sU0FBUyxDQUFDO0dBRTFDLE1BQU0sVUFBVSxPQUFPLFFBQVEsR0FBRztHQUNsQyxJQUFJLFFBQVEsV0FBVyxHQUFHLE9BQU8sYUFBYSxPQUFPO0dBRXJELE1BQU0sUUFBUSxRQUFRLEtBQUssQ0FBQyxLQUFLLFdBQVc7SUFDMUMsSUFBSSxjQUFjLEtBQUssR0FFckIsT0FBTyxHQUFHLGNBQWMsSUFBSSxJQUFJLE1BQU07U0FHdEMsT0FBTyxHQUFHLGNBQWMsSUFBSSxJQUFJLEtBQUssNEJBQTRCLE9BQU8sU0FBUyxHQUFHLElBQUksRUFBRTtHQUU5RixDQUFDO0dBRUQsSUFBSSxZQUNGLE9BQU8sTUFBTSxNQUFNLEtBQUssSUFBSSxFQUFFLElBQUksT0FBTztRQUd6QyxPQUFPLE1BQU0sS0FBSyxJQUFJO0VBRTFCO0VBRUEsbUJBQW1CLFdBQTJCO0dBQzVDLE1BQU0sU0FBUyxLQUFLLHdCQUF3QixTQUFTO0dBQ3JELE1BQU0sRUFBRSxZQUFZLEtBQUssbUJBQW1CLElBQUksTUFBTTtHQUV0RCxNQUFNLFFBQWtCLENBQUMsR0FBRztHQUc1QixNQUFNLHNCQUFzQixrQkFBb0Q7SUFDOUUsTUFBTSxjQUF3QixDQUFDO0lBRS9CLEtBQUssTUFBTSxVQUFVLGVBQWU7S0FDbEMsTUFBTSxFQUFFLFNBQVMsT0FBTyxTQUFTLGNBQWMsT0FBTztLQUl0RCxNQUFNLGNBRGEsY0FBYyxXQUFXLFNBQ3hCLENBQUEsQ0FBVyxlQUFlO0tBRTlDLFlBQVksS0FDVixLQUNBLFFBQVEsT0FBTyxHQUFHLEtBQ2xCLFdBQVcsT0FBTyxTQUFTLFFBQVEsS0FDbkMsdUZBQ0Y7S0FFQSxJQUFJLFlBQVksUUFBVztNQUV6QixZQUFZLEtBRVYsb0JBQ0EsVUFBVSxRQUFRLEdBQ3BCO01BRUEsT0FBTyxTQUFTLFNBQVMsU0FBdUM7T0FFOUQsTUFBTSxhQUFhLEtBQUssU0FBUyxVQUFVLFNBQVM7T0FDcEQsSUFBSSxZQUFZLE1BRWQsWUFBWSxLQUNWLElBQUksV0FBVyxLQUFLLEtBQUssR0FBRyxLQUFLLEtBQUssTUFBTSxnQkFDNUMsd0JBQXdCLEtBQUssT0FBTyxPQUNwQyxJQUNGO1lBRUEsWUFBWSxLQUNWLElBQUksV0FBVyxLQUFLLEtBQUssR0FBRyxLQUFLLEtBQUssTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLEtBQUssR0FBRyxHQUM5RTtNQUVKLENBQUM7TUFHRCxNQUFNLFlBQVksS0FBSyx3QkFBd0IsT0FBTyxNQUFNO01BQzVELFVBQVUsUUFBUSxJQUFJLFFBQVEsR0FBRyxNQUFNO01BQ3ZDLFlBQVksS0FDVixhQUFhLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixZQUFZLElBQzFELFdBQVcsS0FBSyw0QkFBNEIsU0FBUyxFQUFFLEdBQ3pEO0tBQ0YsT0FBTztNQUVMLFlBQVksS0FDVixvQkFDQSxVQUFVLFFBQVEsTUFBTSxLQUN4QixVQUFVLFFBQVEsTUFBTSxRQUFRLE1BQU0sR0FBRyxRQUFRLE1BQU0sTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUNoRjtNQUVBLE9BQU8sU0FBUyxTQUFTLFNBQXVDO09BRTlELE1BQU0sYUFBYSxLQUFLLFNBQVMsVUFBVSxTQUFTO09BQ3BELElBQUksWUFBWSxNQUVkLFlBQVksS0FDVixJQUFJLFdBQVcsS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLE1BQU0sZ0JBQzVDLHdCQUF3QixLQUFLLE9BQU8sT0FDcEMsSUFDRjtZQUVBLFlBQVksS0FDVixJQUFJLFdBQVcsS0FBSyxLQUFLLEdBQUcsS0FBSyxLQUFLLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxLQUFLLEdBQUcsR0FDOUU7TUFFSixDQUFDO01BR0QsTUFBTSxZQUFZLEtBQUssd0JBQXdCLE9BQU8sTUFBTTtNQUM1RCxVQUFVLFFBQVEsSUFBSSxRQUFRLE1BQU0sR0FBRyxRQUFRLFFBQVE7TUFDdkQsWUFBWSxLQUNWLGFBQWEsUUFBUSxNQUFNLEdBQUcsUUFBUSxRQUFRLGdCQUFnQixZQUFZLElBQzFFLFdBQVcsS0FBSyw0QkFBNEIsU0FBUyxFQUFFLEdBQ3pEO0tBQ0Y7S0FFQSxZQUFZLEtBQUssSUFBSTtLQUdyQixJQUFJLE9BQU8sV0FBVyxPQUFPLFFBQVEsU0FBUyxHQUM1QyxZQUFZLEtBQUssY0FBYyxHQUFHLG1CQUFtQixPQUFPLE9BQU8sR0FBRyxJQUFJO0tBRzVFLFlBQVksS0FBSyxJQUFJO0lBQ3ZCO0lBRUEsT0FBTztHQUNUO0dBRUEsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLE9BQU8sQ0FBQztHQUN6QyxNQUFNLEtBQUssR0FBRztHQUVkLE9BQU8sTUFBTSxLQUFLLElBQUk7RUFDeEI7RUFLQSxlQUFlLFdBQWdDO0dBQzdDLE1BQU0sU0FBUyxLQUFLLHdCQUF3QixTQUFTO0dBR3JELE9BRDRCLEtBQUssbUJBQW1CLElBQUksTUFDakQ7RUFDVDtFQUlBLG1CQUNFLFFBQ0EsUUFDQSx1QkFBZ0MsT0FDbkI7R0FFYixTQUFTLE9BQU8sUUFBUSxPQUFPLElBQUk7R0FHbkMsTUFBTSxjQUFjLE1BQU0sU0FBUyxVQUFVO0lBQzNDLElBQUksTUFBTSxTQUFTLEdBQUcsR0FBRztLQUN2QixNQUFNLENBQUMsT0FBTyxNQUFNLE1BQU0sR0FBRztLQUM3QixPQUFPO0lBQ1QsT0FDRSxPQUFPO0dBRVgsQ0FBQztHQThMRCxPQTVMZSxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUMsUUFDckMsR0FBRyxhQUFhO0lBQ2YsTUFBTSxnQkFBZ0IsWUFBWTtJQUNsQyxPQUFPLGtCQUFrQixRQUFXLHFCQUFxQjtJQUd6RCxJQUFJLGFBQWEsSUFBSTtLQUNuQixNQUFNLGFBQWEsY0FBYyxRQUFRLFVBQVUsQ0FBQyxjQUFjLEtBQUssVUFBVSxNQUFNLENBQUM7S0FHeEYsTUFBTSxvQkFBb0IsY0FBYyxRQUFRLFVBQzlDLGtCQUFrQixLQUFLLFVBQVUsTUFBTSxDQUN6QztLQUVBLElBQUksV0FBVyxJQUFJO01BRWpCLEVBQUUsU0FBUyxFQUFFLE9BQU8sT0FBTyxXQUFXLEtBQUssVUFBVSxLQUFLLGlCQUFpQixLQUFLLENBQUMsQ0FBQztNQUNsRixFQUFFLFVBQVUsRUFBRSxRQUFRLE9BQU8saUJBQWlCO0tBQ2hELE9BRUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxPQUNsQixXQUFXLEtBQUssVUFBVSxHQUFHLE9BQU8sR0FBRyxNQUFNLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FDdkU7S0FHRixPQUFPO0lBQ1Q7SUFFQSxNQUFNLFdBQVcsS0FBSyxVQUFVO0lBQ2hDLElBQUksYUFBYSxRQUNmLE1BQU0sSUFBSSxNQUFNLHVCQUF1QixVQUFVO0lBRW5ELE1BQU0sWUFBWSxjQUFjLElBQUksU0FBUyxJQUFJO0lBRWpELElBQUksdUJBQXVCLFFBQVEsS0FBSywyQkFBMkIsUUFBUSxHQUFHO0tBRTVFLE1BQU0sWUFBWSxjQUFjLEtBQUssVUFBVSxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQztLQUdsRixJQUFJLFVBQVUsV0FBVyxLQUFLLFVBQVUsT0FBTyxNQUFNO01BQ25ELElBQUksV0FBVyxJQUNiLEVBQUUsU0FBUyxFQUFFLE9BQU8sT0FBTyxHQUFHLEtBQUssTUFBTSxHQUFHLFNBQVMsSUFBSTtXQUV6RCxFQUFFLFNBQVMsRUFBRSxPQUFPLE9BQU8sR0FBRyxPQUFPLEdBQUcsU0FBUyxTQUFTLE9BQU8sSUFBSSxTQUFTLElBQUk7TUFFcEYsT0FBTztLQUNUO0tBR0EsTUFBTSxzQkFBc0I7TUFDMUIsSUFBSSxzQkFDRixPQUFPO01BR1QsSUFBSSx1QkFBdUIsUUFBUSxHQUFHO09BQ3BDLElBQUksU0FBUyxpQkFBaUIsRUFBRSxTQUFTLFlBQVksUUFDbkQsT0FBTztZQUVQLE9BQU87TUFFWCxPQUNFLElBQUksU0FBUyxVQUNYLE9BQU87V0FFUCxPQUFPO0tBR2IsRUFBQSxDQUFHO0tBQ0gsTUFBTSxpQkFBaUIsVUFBVSxtQkFDL0IsR0FBRyxXQUFXLEtBQUssR0FBRyxPQUFPLEtBQUssS0FBSyxZQUN2QyxXQUNBLGlCQUFpQixPQUNuQjtLQUNBLEVBQUUsU0FBUyxFQUFFLE9BQU8sT0FBTyxlQUFlLE1BQU07S0FDaEQsRUFBRSxVQUFVLEVBQUUsUUFBUSxPQUFPLGVBQWUsT0FBTztLQUVuRCxNQUFNLFNBQVMsV0FBVyxLQUFLLFdBQVcsR0FBRyxPQUFPLElBQUk7S0FDeEQsTUFBTSxZQUFZLFdBQVcsS0FBSyxLQUFLLFFBQVE7S0FFL0MsSUFBSTtLQVFKLElBQUksU0FBUyxrQkFDWCxhQUFhLEVBQ1gsUUFBUSxTQUFTLGlCQUNuQjtVQUNLO01BQ0wsSUFBSSxNQUFjO01BQ2xCLElBQUksdUJBQXVCLFFBQVEsR0FBRztPQUNwQyxJQUFJLFNBQVMsZUFBZTtRQUMxQixPQUFPLEdBQUcsVUFBVSxHQUFHLFNBQVMsS0FBSztRQUNyQyxLQUFLLEdBQUcsT0FBTztPQUNqQixPQUFPO1FBQ0wsT0FBTyxHQUFHLFVBQVU7UUFDcEIsS0FBSyxHQUFHLE9BQU8sR0FBRyxXQUFXLFdBQVcsS0FBSyxNQUFNLEdBQUcsUUFBUSxNQUFNLEdBQUcsQ0FBQyxFQUFFO09BQzVFO01BQ0YsT0FBTztPQUNMLE9BQU8sR0FBRyxVQUFVLEdBQUcsU0FBUyxLQUFLO09BQ3JDLEtBQUssR0FBRyxPQUFPO01BQ2pCO01BQ0EsYUFBYTtPQUNYO09BQ0E7TUFDRjtLQUNGO0tBRUEsRUFBRSxNQUFNLEtBQUs7TUFDWCxJQUFJO01BQ0osTUFBTTtNQUNOLE9BQU8sVUFBVTtNQUNqQixHQUFHO0tBQ0wsQ0FBQztLQUdELElBQUksZUFBZSxRQUFRLFNBQVMsR0FBRztNQUNyQyxNQUFNLG1CQUFtQixlQUFlLFFBQVEsS0FBSyxXQUFXO09BRTlELE9BQU87UUFDTCxJQUZZLENBQUMsVUFBVSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFFbkM7UUFDSixPQUFPLE9BQU87UUFDZCxVQUFVLE9BQU87UUFDakIsVUFBVSxPQUFPO1FBQ2pCLFFBQVEsT0FBTztRQUNmLFNBQVMsT0FBTztPQUNsQjtNQUNGLENBQUM7TUFFRCxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjtLQUNoRDtLQUVBLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxlQUFlLEtBQUs7SUFDL0MsT0FBTyxJQUFJLHNCQUFzQixRQUFRLEtBQUsseUJBQXlCLFFBQVEsR0FBRztLQUVoRixNQUFNLFlBQVksY0FBYyxLQUFLLFVBQVUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7S0FDbEYsTUFBTSxpQkFBaUIsVUFBVSxtQkFBbUIsSUFBSSxTQUFTO0tBRWpFLElBQUk7S0FDSixJQUFJLHNCQUFzQixRQUFRLEdBQUc7TUFDbkMsTUFBTSxVQUFVLFVBQVUsY0FBYztNQUN4QyxXQUFXO09BQ1QsV0FBVyxLQUFLO09BQ2hCO09BQ0EsU0FBUyxXQUFXLEtBQUssR0FBRyxZQUFZLEdBQUcsT0FBTyxJQUFJO09BQ3RELFNBQVMsVUFBVTtPQUNuQixPQUFPLFNBQVM7TUFDbEI7S0FDRixPQUFPLElBQUkseUJBQXlCLFFBQVEsR0FDMUMsV0FBVztNQUNULFdBQVcsS0FBSztNQUNoQixTQUFTO01BQ1QsU0FBUyxXQUFXLEtBQUssT0FBTyxHQUFHLE9BQU87TUFDMUMsU0FBUztPQUNQLE9BQU8sU0FBUztPQUNoQixTQUFTLEdBQUcsV0FBVyxZQUFZLEtBQUssS0FBSyxFQUFFO09BQy9DLE9BQU8sR0FBRyxXQUFXLFlBQVksVUFBVSxLQUFLLEVBQUU7TUFDcEQ7TUFDQSxTQUFTLFVBQVU7TUFDbkIsT0FBTztLQUNUO1VBRUEsTUFBTSxJQUFJLE1BQU07S0FHbEIsRUFBRSxRQUFRLEtBQUs7TUFDYixJQUFJO01BQ0osT0FBTyxVQUFVO01BQ2pCO01BQ0EsVUFBVSxlQUFlO01BQ3pCLFFBQVEsZUFBZTtNQUN2QixTQUFTLGVBQWU7S0FDMUIsQ0FBQztJQUNIO0lBRUEsT0FBTztHQUNULEdBRUE7SUFDRSxRQUFRLENBQUM7SUFDVCxTQUFTLENBQUM7SUFDVixPQUFPLENBQUM7SUFDUixTQUFTLENBQUM7R0FDWixDQUVLO0VBQ1Q7RUFLQSxzQkFBc0IsWUFBc0IsU0FBaUIsTUFBd0I7R0FDbkYsTUFBTSxTQUFTLFdBQVcsUUFDdkIsUUFBUSxjQUFjO0lBQ3JCLElBQUksS0FBYSxPQUFlO0lBQ2hDLElBQUksVUFBVSxTQUFTLEdBQUcsR0FBRztLQUMzQixDQUFDLEtBQUssR0FBRyxZQUFZLFVBQVUsTUFBTSxHQUFHO0tBQ3hDLFFBQVEsU0FBUyxLQUFLLEdBQUc7SUFDM0IsT0FBTztLQUNMLE1BQU07S0FDTixRQUFRO0lBQ1Y7SUFDQSxPQUFPLFFBQVEsT0FBTyxRQUFRLENBQUMsRUFBQSxDQUFHLE9BQU8sS0FBSztJQUU5QyxPQUFPO0dBQ1QsR0FFQSxDQUFDLENBR0g7R0FFQSxPQUFPLE9BQU8sS0FBSyxNQUFNLENBQUMsQ0FBQyxTQUEyQyxRQUFRO0lBQzVFLE1BQU0sb0JBQW9CLE9BQU87SUFHakMsSUFBSSxRQUFRLElBQ1YsT0FBTyxrQkFBa0IsS0FBSyxhQUFhO0tBQ3pDLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxRQUFRO0tBQ3pELElBQUksU0FBUyxRQUNYLE1BQU0sSUFBSSxNQUNSLEdBQUcsT0FBTyxHQUFHLHFCQUFxQixTQUFTLG1CQUFtQixPQUFPLE1BQU0sS0FBSyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFDM0c7S0FFRixPQUFPO01BQ0wsVUFBVTtNQUNWO0tBQ0Y7SUFDRixDQUFDO0lBSUgsTUFBTSxPQUFPLE9BQU8sVUFBVTtJQUM5QixJQUFJLENBQUMsZUFBZSxJQUFJLEdBQ3RCLE1BQU0sSUFBSSxNQUFNLGlCQUFpQixJQUFJLEdBQUcsa0JBQWtCLElBQUk7SUFFaEUsTUFBTSxZQUFZLGNBQWMsSUFBSSxLQUFLLElBQUk7SUFHN0MsSUFBSSwyQkFBMkIsSUFBSSxLQUFLLHVCQUF1QixJQUFJLEdBQ2pFO1NBQ0Usa0JBQWtCLFdBQVcsTUFDNUIsa0JBQWtCLE9BQU8sUUFBUSxrQkFBa0IsT0FBTyxRQUkzRCxPQUFPO01BQ0wsVUFBVTtNQUNWLE1BQU07T0FDSixHQUpXLFVBQVUsVUFBVTtPQUsvQixNQUFNLEdBQUcsSUFBSTtPQUNiLFVBQVUsS0FBSztNQUNqQjtLQUNGO0lBQ0Y7SUFNRixNQUFNLFdBQVcsS0FBSyxzQkFBc0IsbUJBQW1CLFNBQVM7SUFNeEUsT0FBTztLQUNMLFVBTEEsMkJBQTJCLElBQUksS0FBSyx1QkFBdUIsSUFBSSxJQUMxRCxXQUNBO0tBSUw7S0FDQTtJQUNGO0dBQ0YsQ0FBQztFQUNIO0VBRUEsY0FBYyxTQUFTLElBQUksV0FBbUIsR0FBRyxRQUFrQixDQUFDLEdBQWE7R0FDL0UsT0FBTyxLQUFLLE1BQ1QsU0FBUyxTQUFTO0lBQ2pCLE1BQU0sV0FBVyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLE1BQU0sTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUc7SUFDckUsSUFBSSxhQUFhLFFBQ2YsT0FBTztJQUVULElBQUksZUFBZSxJQUFJLEdBQUc7S0FDeEIsSUFBSSxXQUFXLEdBQ2IsT0FBTztLQUVULElBQUksTUFBTSxTQUFTLEtBQUssSUFBSSxHQUUxQixPQUFPO0tBSVQsT0FEYyxjQUFjLElBQUksS0FBSyxJQUM5QixDQUFBLENBQU0sY0FBYyxVQUFVLFdBQVcsR0FBRyxDQUFDLEdBQUcsT0FBTyxLQUFLLEVBQUUsQ0FBQztJQUN4RTtJQUNBLE9BQU87R0FDVCxDQUFDLENBQUMsQ0FDRCxRQUFRLE1BQU0sTUFBTSxJQUFJO0VBQzdCOzs7OztFQU1BLGNBQXNCLE1BQTZCO0dBQ2pELE9BQ0UsS0FBSyxpQkFBaUIsa0JBQ3JCLEtBQUssaUJBQWlCLGNBQWMsS0FBSztFQUU5QztFQUVBLGtCQUFvRDtHQUNsRCxPQUFPLEtBQUssTUFDVCxLQUFLLFNBQVM7SUFDYixJQUFJLEtBQUssU0FBUyxZQUFZO0tBQzVCLElBQUksS0FBSyxjQUFjLElBQUksR0FDekIsT0FBTztNQUFFLE1BQU0sR0FBRyxLQUFLLEtBQUs7TUFBTSxNQUFNO0tBQWU7VUFFdkQsT0FBTztJQUVYO0lBQ0EsT0FBTztLQUFFLE1BQU0sS0FBSztLQUFNLE1BQU0sS0FBSztJQUFLO0dBQzVDLENBQUMsQ0FBQyxDQUNELE9BQU8sV0FBVztFQUN2Qjs7OztFQUtBLG1CQUFpQztHQUMvQixPQUFPLEtBQUssTUFBTSxRQUFRLE1BQU0sRUFBRSxTQUFTLFFBQVE7RUFDckQ7Ozs7O0VBTUEsZ0JBQWdCLFlBQTZDO0dBQzNELE1BQU0sY0FBYyxLQUFLLGlCQUFpQjtHQUMxQyxJQUFJLFlBQ0YsT0FBTyxZQUFZLE1BQU0sTUFBTSxFQUFFLFNBQVMsVUFBVTtHQUV0RCxPQUFPLFlBQVk7RUFDckI7Ozs7Ozs7O0VBU0EscUJBQW1DO0dBQ2pDLE9BQU8sS0FBSyxNQUFNLFNBQVMsU0FBb0M7SUFFN0QsSUFBSSxjQUFjLElBQUksR0FDcEIsT0FBTyxDQUFDO0lBSVYsSUFBSSxlQUFlLElBQUksR0FBRztLQUV4QixJQUFJLEtBQUssY0FBYyxJQUFJLEdBRXpCLE9BQU87TUFDTCxNQUFNLEdBQUcsS0FBSyxLQUFLO01BQ25CLE1BQU07TUFDTixVQUFVLEtBQUs7S0FDakI7S0FFRixPQUFPLENBQUM7SUFDVjtJQUdBLE9BQU87R0FDVCxDQUFDO0VBQ0g7Ozs7OztFQU9BLE1BQU0sb0JBQW9CLHFCQUE4QjtHQUN0RCxNQUFNLFdBQVcsR0FBRyxLQUFLLE1BQU07R0FHL0IsY0FBYyxjQUFjLEdBQUcsS0FBSyxHQUFHLGFBQWEsa0JBQWtCO0dBR3RFLElBQUksT0FBTyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsU0FBUyxHQUFHO0lBQ3hDLGNBQWMsY0FBYyxHQUFHLEtBQUssR0FBRyxZQUFZLGtCQUFrQjtJQUNyRSxjQUFjLGNBQWMsR0FBRyxLQUFLLEdBQUcsZ0JBQWdCLGtCQUFrQjtJQUN6RSxLQUFLLE1BQU0sYUFBYSxPQUFPLEtBQUssS0FBSyxPQUFPLEdBQzlDLGNBQWMsY0FDWixHQUFHLEtBQUssR0FBRyxRQUFRLFVBQVUsWUFBWSxLQUN6QyxrQkFDRjtHQUVKO0dBR0EsS0FBSyxNQUFNLFVBQVUsT0FBTyxLQUFLLEtBQUssVUFBVSxHQUM5QyxjQUFjLGNBQWMsUUFBUSxrQkFBa0I7R0FJeEQsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLEdBQUcsS0FBSyxNQUFNLFNBQVM7R0FDM0QsTUFBTSxnQkFBZ0IsS0FBSyxLQUN6Qix1QkFBdUIsT0FBTyxhQUM5QixZQUFZLG9CQUFvQixnQkFBZ0IsSUFBSSxDQUN0RDtHQUVBLElBQUksTUFBTSxPQUFPLGFBQWEsR0FBRztJQUMvQixNQUFNLGtCQUFrQixNQUFNLGNBQTRCLGFBQWE7SUFFdkUsS0FBSyxRQUFRLE9BQU8sWUFDbEIsZ0JBQWdCLEtBQUssRUFBRSxNQUFNLFlBQVk7S0FDdkMsY0FBYyxjQUFjLE1BQU0sZUFBZTtLQUNqRCxPQUFPLENBQUMsTUFBTSxLQUFLO0lBQ3JCLENBQUMsQ0FDSDtHQUNGO0VBQ0Y7RUFFQSxxQkFBMkI7R0FFekIsTUFBTSxnQkFBZ0IsS0FBSyxRQUN4QixRQUFRLFFBQVEsSUFBSSxTQUFTLFFBQVEsQ0FBQyxDQUN0QyxRQUFRLFFBQVEsSUFBSSxRQUFRLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0dBRXRFLGNBQWMsYUFBYTtJQUN6QixNQUFNLEtBQUs7SUFDWDtJQUNBLGFBQWEsS0FBSyxNQUFNLFFBQVEsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsSUFBSTtHQUM1RSxDQUFDO0VBQ0g7RUFFQSxTQUFxQjtHQUVuQixNQUFNLFVBQWlFLENBQUM7R0FDeEUsS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLEtBQUssT0FBTyxHQUFHO0lBQzNDLE1BQU0sZUFBOEIsS0FBSyxRQUFRO0lBQ2pELE1BQU0sa0JBQWlDLEtBQUssZ0JBQWdCLFFBQVEsQ0FBQyxFQUFBLENBQUcsS0FBSyxXQUFXO0tBQ3RGO0tBQ0EsVUFBVTtJQUNaLEVBQUU7SUFDRixNQUFNLFNBQVMsQ0FBQyxHQUFHLGNBQWMsR0FBRyxjQUFjO0lBR2xELElBQUksS0FBSyxZQUFZLE1BQ25CLFFBQVEsT0FBTztLQUNiO0tBQ0EsTUFBTSxLQUFLLFlBQVk7SUFDekI7U0FFQSxRQUFRLE9BQU87R0FFbkI7R0FHQSxNQUFNLFFBQTZELENBQUM7R0FDcEUsS0FBSyxNQUFNLENBQUMsS0FBSyxXQUFXLE9BQU8sUUFBUSxLQUFLLFVBQVUsR0FFeEQsSUFBSSxLQUFLLFVBQVUsTUFDakIsTUFBTSxPQUFPO0lBQ1g7SUFDQSxNQUFNLEtBQUssVUFBVTtHQUN2QjtRQUVBLE1BQU0sT0FBTztHQUlqQixPQUFPO0lBQ0wsSUFBSSxLQUFLO0lBQ1QsVUFBVSxLQUFLO0lBQ2YsT0FBTyxLQUFLO0lBQ1osT0FBTyxLQUFLO0lBQ1osUUFBUSxLQUFLO0lBQ2IsTUFBTSxLQUFLO0lBQ1gsT0FBTyxLQUFLO0lBQ1osU0FBUyxLQUFLO0lBQ2Q7SUFDQTtHQUNGO0VBQ0Y7RUFFQSxNQUFNLE9BQXNCO0dBRTFCLE1BQU0sYUFBYSxLQUFLLGNBQWM7R0FDdEMsS0FBSyxVQUFVLE9BQU8sWUFDcEIsT0FBTyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWU7SUFDaEQsT0FBTyxDQUFDLFdBQVcsS0FBSyx5QkFBeUIsWUFBWSxXQUFXLEtBQUssQ0FBQztHQUNoRixDQUFDLENBQ0g7R0FDQSxLQUFLLGtCQUFrQixPQUFPLFlBQzVCLE9BQU8sUUFBUSxLQUFLLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlO0lBQ3hELE9BQU8sQ0FBQyxXQUFXLEtBQUsseUJBQXlCLFlBQVksV0FBVyxJQUFJLENBQUM7R0FDL0UsQ0FBQyxDQUNIO0dBR0EsTUFBTSxXQUFXLEtBQUssS0FDcEIsT0FBTyxhQUNQLG1CQUFtQixLQUFLLE1BQU0sU0FBUyxHQUFHLEtBQUssTUFBTSxHQUFHLGFBQzFEO0dBQ0EsTUFBTSxPQUFPLEtBQUssT0FBTztHQUN6QixNQUFNLFVBQVUsVUFBVSxNQUFNLFdBQVcsS0FBSyxVQUFVLElBQUksR0FBRyxRQUFRLENBQUM7R0FHMUUsTUFBTSxjQUFjLFNBQVMsSUFBSTtFQUNuQzs7Ozs7Ozs7O0VBVUEsTUFBTSxzQkFBc0IsUUFBNEM7R0FDdEUsTUFBTSxFQUFFLDBCQUEwQixNQUFNLE9BQU87R0FDL0MsTUFBTSxlQUFlLE9BQU8sT0FBTyxNQUFNO0dBQ3pDLE1BQU0sa0JBQ0osV0FDQyxpQkFBaUIsUUFBUSxpQkFBaUIsUUFBUSxpQkFBaUIsT0FDaEUsZUFDQTtHQUNOLE1BQU0sU0FBUyxzQkFBc0IsS0FBSyxPQUFPLEdBQUcsZUFBZTtHQUduRSxJQUFJLE9BQU8sWUFDVCxLQUFLLE9BQU8sT0FBTztHQUdyQixLQUFLLE1BQU0sQ0FBQyxVQUFVLFNBQVMsT0FBTyxRQUFRLE9BQU8sU0FBUyxHQUFHO0lBQy9ELE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxRQUFRO0lBQ3ZELElBQUksTUFFRixLQUEwQixPQUFPO0dBRXJDO0dBRUEsS0FBSyxZQUFZO0lBQUUsR0FBRyxLQUFLO0lBQVcsR0FBRyxPQUFPO0dBQVU7R0FDMUQsS0FBSyxjQUFjO0lBQUUsR0FBRyxLQUFLO0lBQWEsR0FBRyxPQUFPO0dBQVk7R0FFaEUsTUFBTSxLQUFLLEtBQUs7RUFDbEI7Ozs7Ozs7O0VBU0EsTUFBTSxjQUFjLFNBUStDO0dBQ2pFLE1BQU0sRUFBRSxrQkFBa0IsTUFBTSxPQUFPO0dBUXZDLE1BQU0sU0FBUyxNQUFNLGNBQWM7SUFOakMsUUFBUSxLQUFLLE9BQU87SUFDcEIsUUFBUSxTQUFTLFVBQVU7SUFDM0IsZUFBZSxTQUFTLHFCQUFxQixRQUFRLEtBQUsscUJBQXFCLElBQUk7SUFDbkYsV0FBVyxTQUFTLGFBQWE7R0FHQSxHQUFTLEVBQUUsY0FBYyxTQUFTLGFBQWEsQ0FBQztHQUNuRixLQUFLLFdBQVcsTUFBTTtHQUN0QixJQUFJLFNBQVMsWUFBWSxPQUN2QixNQUFNLEtBQUssS0FBSztHQUVsQixPQUFPO0VBQ1Q7Ozs7OztFQU9BLHVCQUE2QztHQUMzQyxNQUFNLGNBQWdDLENBQUM7R0FFdkMsSUFBSSxLQUFLLE1BQ1AsWUFBWSxLQUFLLENBQUMsVUFBVSxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUM7R0FHbkQsS0FBSyxNQUFNLFFBQVEsS0FBSyxPQUN0QixJQUFJLEtBQUssTUFDUCxZQUFZLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxLQUFLLElBQUksQ0FBQztHQUlyRCxLQUFLLE1BQU0sQ0FBQyxRQUFRLFNBQVMsT0FBTyxRQUFRLEtBQUssU0FBUyxHQUN4RCxZQUFZLEtBQUssQ0FBQyxRQUFRLFVBQVUsSUFBSSxDQUFDO0dBRzNDLEtBQUssTUFBTSxDQUFDLFdBQVcsU0FBUyxPQUFPLFFBQVEsS0FBSyxXQUFXLEdBQzdELFlBQVksS0FBSyxDQUFDLFVBQVUsYUFBYSxJQUFJLENBQUM7R0FHaEQsT0FBTyxPQUFPLFlBQVksV0FBVztFQUN2Qzs7Ozs7O0VBT0EsV0FBVyxRQUFxRTtHQUM5RSxJQUFJLE9BQU8sWUFDVCxLQUFLLE9BQU8sT0FBTztHQUdyQixLQUFLLE1BQU0sQ0FBQyxVQUFVLFNBQVMsT0FBTyxRQUFRLE9BQU8sU0FBUyxHQUFHO0lBQy9ELE1BQU0sT0FBTyxLQUFLLE1BQU0sTUFBTSxNQUFNLEVBQUUsU0FBUyxRQUFRO0lBQ3ZELElBQUksTUFFRixLQUEwQixPQUFPO0dBRXJDO0dBRUEsS0FBSyxZQUFZO0lBQUUsR0FBRyxLQUFLO0lBQVcsR0FBRyxPQUFPO0dBQVU7R0FDMUQsS0FBSyxjQUFjO0lBQUUsR0FBRyxLQUFLO0lBQWEsR0FBRyxPQUFPO0dBQVk7RUFDbEU7RUFFQSxjQUNFLFVBQ0Esa0JBQ0EsV0FBcUIsQ0FBQyxHQUNIO0dBQ25CLElBQUksU0FBUyxTQUFTLElBQ3BCLE9BQU8sQ0FBQztHQUdWLE1BQU0sVUFBVSxZQUFZLEtBQUs7R0FDakMsTUFBTSxrQkFBa0Isb0JBQW9CLEtBQUs7R0FDakQsTUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPO0dBQ3RDLE1BQU0sWUFBWSxPQUFPLFdBQVcsU0FBUyxRQUFRLFFBQVEsSUFBSSxDQUFDO0dBRWxFLE1BQU0sb0JBQW9CLE9BQU8sV0FBVyxTQUFTLFFBQVEsZ0JBQWdCLFFBQVEsQ0FBQyxDQUFDLENBQUM7R0FDeEYsTUFBTSxpQkFBaUIsT0FBTyxDQUFDLEdBQUcsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0dBRWxFLE9BQU8sS0FBSyxNQUFNLEtBQUssU0FBUztJQUM5QixJQUNFLEtBQUssU0FBUyxjQUNkLGVBQWUsTUFBTSxNQUFNLEVBQUUsV0FBVyxHQUFHLENBQUMsR0FBRyxVQUFVLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQ2pGO0tBRUEsTUFBTSxXQURZLGNBQWMsSUFBSSxLQUFLLElBQ3hCLENBQUEsQ0FBVSxjQUFjLFNBQVMsaUJBQWlCLENBQ2pFLEdBQUcsVUFDSCxHQUFHLEtBQUssTUFDVixDQUFDO0tBRUQsT0FBTztNQUNMLE9BQU8sS0FBSztNQUNaO01BQ0EsZ0JBQWdCLEtBQUs7TUFDckI7TUFDQSxRQUFRLFNBQVMsU0FBUztNQUMxQixLQUFLLE9BQU8sWUFDVixXQUFXLEtBQUssY0FBYztPQUM1QixPQUFPLENBQUMsV0FBVyxTQUFTLE9BQU8sVUFBVSxNQUFNLElBQUksVUFBVSxDQUFDO01BQ3BFLENBQUMsQ0FDSDtNQUNBLFlBQVksT0FBTyxZQUNqQixXQUFXLEtBQUssY0FBYztPQUM1QixPQUFPLENBQUMsV0FBVyxTQUFTLE9BQU8sVUFBVSxNQUFNLFdBQVcsVUFBVSxDQUFDO01BQzNFLENBQUMsQ0FDSDtLQUNGO0lBQ0Y7SUFFQSxNQUFNLFFBQVEsQ0FBQyxHQUFHLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUc7SUFDL0MsT0FBTztLQUNMLE9BQU8sS0FBSztLQUNaLFVBQVUsQ0FBQztLQUNYLGdCQUFnQixLQUFLLFNBQVMsYUFBYSxLQUFLLE9BQU87S0FDdkQ7S0FDQSxLQUFLLE9BQU8sWUFDVixXQUFXLEtBQUssY0FBYztNQUs1QixPQUFPLENBQUMsV0FKYSxRQUFRLFVBQ2pCLENBQWEsTUFBTSxNQUFNO09BQ25DLE9BQU8sTUFBTSxTQUFTLEVBQUUsV0FBVyxHQUFHLE1BQU0sRUFBRTtNQUNoRCxDQUNtQixDQUFHO0tBQ3hCLENBQUMsQ0FDSDtLQUNBLFlBQVksT0FBTyxZQUNqQixXQUFXLEtBQUssY0FBYztNQUs1QixPQUFPLENBQUMsWUFKZSxnQkFBZ0IsY0FBYyxDQUFDLEVBQ25DLENBQWUsTUFBTSxNQUFNO09BQzVDLE9BQU8sTUFBTSxTQUFTLEVBQUUsV0FBVyxHQUFHLE1BQU0sRUFBRTtNQUNoRCxDQUNtQixDQUFVO0tBQy9CLENBQUMsQ0FDSDtJQUNGO0dBQ0YsQ0FBQztFQUNIO0VBRUEseUJBQ0UsWUFDQSxXQUNBLFdBQW9CLE9BQ1Y7R0FDVixNQUFNLFNBQVMsV0FBVyxlQUFlO0dBQ3pDLE9BQU8sV0FDSixLQUFLLGNBQWM7SUFDbEIsSUFBSSxVQUFVLFNBQVMsU0FBUyxHQUM5QixPQUFPLEtBQUsseUJBQXlCLFVBQVUsVUFBVSxXQUFXLFFBQVE7U0FDdkUsSUFBSSxVQUFVLE9BQU8sQ0FBQyxZQUMzQixPQUFPLFVBQVUsU0FBUyxPQUFPLFVBQVUsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHO1NBRTFELE9BQU87R0FFWCxDQUFDLENBQUMsQ0FDRCxPQUFPLFdBQVcsQ0FBQyxDQUNuQixLQUFLO0VBQ1Y7RUFFQSxNQUFNLFdBQVcsTUFBa0IsSUFBNEI7R0FDN0QsSUFBSSxDQUFDLElBQ0gsS0FBSyxNQUFNLEtBQUssSUFBSTtRQUVwQixLQUFLLE1BQU0sT0FBTyxJQUFJLEdBQUcsSUFBSTtHQUUvQixNQUFNLEtBQUssS0FBSztFQUNsQjtFQUVBLG1CQUFtQixhQUdmO0dBQ0YsTUFBTSxNQUFNLFlBQVksTUFBTSxHQUFHO0dBRWpDLElBQUksV0FBVyxLQUFLO0dBQ3BCLE1BQU0sU0FHQSxDQUFDO0dBQ1AsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxLQUFLO0lBQ25DLE1BQU0sV0FBVyxJQUFJO0lBQ3JCLE9BQU8sS0FBSztLQUNWO0tBQ0E7SUFDRixDQUFDO0lBRUQsTUFBTSxPQUFPLGNBQWMsSUFBSSxRQUFRLENBQUMsQ0FBQyxNQUFNLE1BQU0sTUFBTSxFQUFFLFNBQVMsUUFBUTtJQUM5RSxJQUFJLENBQUMsTUFDSCxNQUFNLElBQUksTUFBTSxHQUFHLFNBQVMsYUFBYSxhQUFhO0lBRXhELElBQUksZUFBZSxJQUFJLEdBQ3JCLFdBQVcsS0FBSztHQUVwQjtHQUNBLE9BQU87RUFDVDtFQUVBLE1BQU0sV0FBVyxTQUFxQixJQUEyQjtHQUUvRCxNQUFNLFVBQVUsS0FBSyxNQUFNLEdBQUcsQ0FBQztHQUcvQixNQUFNLFdBQXFCLENBQUMsSUFBSTtHQUdoQyxJQUFJLFlBQVksUUFBUSxNQUFNO0lBRTVCLE1BQU0sZUFBZSxjQUFjLFVBQVU7SUFDN0MsS0FBSyxNQUFNLGVBQWUsY0FBYztLQUN0QyxNQUFNLFlBQVksY0FBYyxJQUFJLFdBQVc7S0FDL0MsTUFBTSxzQkFBc0IsT0FBTyxLQUFLLFVBQVUsT0FBTztLQUN6RCxLQUFLLE1BQU0sYUFBYSxxQkFBcUI7TUFDM0MsTUFBTSxTQUFTLFVBQVUsUUFBUTtNQUdqQyxNQUFNLHVCQUF1QixPQUFPLEtBQUssZ0JBQWdCO09BV3ZELE9BVmlCLFVBQVUsbUJBQW1CLFdBQzdCLENBQUEsQ0FBUyxLQUFLLE1BQzdCLEVBQUUsYUFBYSxXQUFXLEVBQUUsYUFBYSxLQUFLLEtBQzFDO1FBQ0UsR0FBRztRQUNILFVBQVUsUUFBUTtPQUNwQixJQUNBLENBR0MsQ0FBQSxDQUFTLEtBQUssTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssR0FBRztNQUNqRCxDQUFDO01BRUQsSUFBSSxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixLQUFLLEdBQUcsR0FBRztPQUN2RCxVQUFVLFFBQVEsYUFBYTtPQUMvQixTQUFTLEtBQUssU0FBUztNQUN6QjtLQUNGO0lBQ0Y7R0FDRjtHQUdBLEtBQUssTUFBTSxNQUFNO0dBRWpCLE1BQU0sUUFBUSxJQUFJLFNBQVMsSUFBSSxPQUFPLFdBQVcsT0FBTyxLQUFLLENBQUMsQ0FBQztFQUNqRTtFQUVBLE1BQU0sUUFBUSxJQUEyQjtHQUV2QyxNQUFNLFVBQVUsS0FBSyxNQUFNLEdBQUcsQ0FBQztHQUcvQixNQUFNLFdBQXFCLENBQUMsSUFBSTtHQUdoQyxNQUFNLGVBQWUsY0FBYyxVQUFVO0dBQzdDLEtBQUssTUFBTSxlQUFlLGNBQWM7SUFDdEMsTUFBTSxZQUFZLGNBQWMsSUFBSSxXQUFXO0lBQy9DLE1BQU0sc0JBQXNCLE9BQU8sS0FBSyxVQUFVLE9BQU87SUFDekQsS0FBSyxNQUFNLGFBQWEscUJBQXFCO0tBQzNDLE1BQU0sU0FBUyxVQUFVLFFBQVE7S0FFakMsTUFBTSx1QkFBdUIsT0FDMUIsS0FBSyxnQkFBZ0I7TUFFcEIsSUFEaUIsVUFBVSxtQkFBbUIsV0FDMUMsQ0FBQSxDQUFTLE1BQU0sTUFBTSxFQUFFLGFBQWEsV0FBVyxFQUFFLGFBQWEsS0FBSyxFQUFFLEdBQ3ZFLE9BQU87V0FFUCxPQUFPO0tBRVgsQ0FBQyxDQUFDLENBQ0QsT0FBTyxXQUFXO0tBRXJCLElBQUksT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsS0FBSyxHQUFHLEdBQUc7TUFDdkQsVUFBVSxRQUFRLGFBQWE7TUFDL0IsU0FBUyxLQUFLLFNBQVM7S0FDekI7SUFDRjtHQUNGO0dBR0EsS0FBSyxNQUFNLFNBQVMsY0FBYyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsU0FDN0MsTUFBTSxVQUFVLE1BQU0sUUFBUSxRQUFRLFFBQVEsSUFBSSxTQUFTLE9BQU87R0FJcEUsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDO0dBRXZCLE1BQU0sUUFBUSxJQUFJLFNBQVMsSUFBSSxPQUFPLFdBQVcsT0FBTyxLQUFLLENBQUMsQ0FBQztFQUNqRTtFQUVBLDJCQUEyQixhQUE2QjtHQUN0RCxJQUFJLENBQUMsWUFBWSxTQUFTLEdBQUcsR0FDM0IsT0FBTyxLQUFLO0dBSWQsTUFBTSxNQUFNLFlBQVksTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRTtHQVc5QyxPQVJxQixJQUFJLFFBQVEsVUFBVSxVQUFVO0lBQ25ELE1BQU0sVUFBVSxjQUFjLElBQUksUUFBUSxDQUFDLENBQUMsTUFBTSxNQUFNLE1BQU0sRUFBRSxTQUFTLEtBQUs7SUFDOUUsSUFBSSxDQUFDLFdBQVcsUUFBUSxTQUFTLFlBQVk7S0FDM0MsUUFBUSxNQUFNO01BQUU7TUFBSyxRQUFRLEtBQUs7TUFBSTtNQUFVO0tBQU0sQ0FBQztLQUN2RCxNQUFNLElBQUksTUFBTSxZQUFZLGFBQWE7SUFDM0M7SUFDQSxPQUFPLFFBQVE7R0FDakIsR0FBRyxLQUFLLEVBQ0Q7RUFDVDtFQUVBLE1BQU0sU0FBUyxJQUFZLElBQTJCO0dBQ3BELE1BQU0sT0FBTyxLQUFLLE1BQU07R0FDeEIsTUFBTSxXQUFXLENBQUMsR0FBRyxLQUFLLEtBQUs7R0FDL0IsU0FBUyxPQUFPLElBQUksR0FBRyxJQUFJO0dBQzNCLFNBQVMsT0FBTyxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUcsQ0FBQztHQUN4QyxLQUFLLFFBQVE7R0FFYixNQUFNLEtBQUssS0FBSztFQUNsQjs7OztFQUtBLGlCQUFpQixPQUF1QjtHQUN0QyxJQUFJLE1BQU0sU0FBUyxHQUFHLEdBQ3BCLE9BQU87R0FFVCxPQUFPLEdBQUcsS0FBSyxNQUFNLEdBQUc7RUFDMUI7Ozs7O0VBTUEsWUFBMkM7R0FDekMsTUFBTSxTQUFTLEtBQUssVUFBVTtHQUM5QixJQUFJLENBQUMsUUFDSCxNQUFNLElBQUksTUFBTSxVQUFVLEtBQUssR0FBRyxjQUFjO0dBRWxELElBQUksT0FBTyxTQUFTLFlBQVksT0FBTyxTQUFTLFFBQzlDLE9BQU8sT0FBTztHQUVoQixPQUFPO0VBQ1Q7Ozs7O0VBTUEsWUFBd0I7R0FDdEIsTUFBTSxTQUFTLEtBQUssVUFBVTtHQUM5QixJQUFJLENBQUMsUUFDSCxNQUFNLElBQUksTUFBTSxVQUFVLEtBQUssR0FBRyxjQUFjO0dBRWxELE9BQU87RUFDVDs7Ozs7RUFNQSxpQkFBeUI7R0FFdkIsT0FEZSxLQUFLLFVBQ2IsTUFBVyxZQUFZLGFBQWE7RUFDN0M7Q0FDRiJ9
|
package/dist/syncer/syncer.d.ts
CHANGED
|
@@ -59,9 +59,12 @@ export declare class Syncer {
|
|
|
59
59
|
* 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
|
|
60
60
|
*
|
|
61
61
|
* @param diffFilePaths - 변경된 파일들의 절대 경로 목록
|
|
62
|
+
* @param options.skipDriftCheck - true이면 처리되지 않은 생성물 변경을 drift로 경고하지 않습니다.
|
|
62
63
|
* @returns diffTypes - 변경된 파일의 타입 목록 (entity, types, model 등)
|
|
63
64
|
*/
|
|
64
|
-
doSyncActions(diffFilePaths: AbsolutePath[]
|
|
65
|
+
doSyncActions(diffFilePaths: AbsolutePath[], { skipDriftCheck }?: {
|
|
66
|
+
skipDriftCheck?: boolean;
|
|
67
|
+
}): Promise<{
|
|
65
68
|
diffTypes: FileType[];
|
|
66
69
|
}>;
|
|
67
70
|
calculateDiffGroups(diffFiles: AbsolutePath[]): Partial<Record<DiffGroupKey, `/${string}`[]>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAOtC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGvF,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AACzC,KAAK,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAEhE,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,YAAY,EAAE,YAAY,CAAsB;IAEhD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
|