sonamu 0.7.4 → 0.7.5
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/api/config.d.ts +1 -4
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +2 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -47
- package/dist/bin/cli.js +6 -6
- package/dist/database/base-model.d.ts +1 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +15 -4
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +3 -3
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +1 -1
- package/dist/database/puri-wrapper.d.ts +11 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +7 -11
- package/dist/database/puri.d.ts +36 -17
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +54 -7
- package/dist/database/puri.types.d.ts +54 -17
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -4
- package/dist/database/puri.types.test-d.js +129 -0
- package/dist/database/upsert-builder.d.ts +16 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +10 -19
- package/dist/entity/entity-manager.d.ts +113 -22
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.d.ts +34 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +110 -37
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +341 -149
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +21 -5
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -1
- package/dist/migration/postgresql-schema-reader.d.ts +11 -1
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +111 -10
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +4 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +12 -2
- package/dist/template/implementations/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +50 -2
- package/dist/template/implementations/model.template.js +6 -6
- package/dist/template/implementations/model_test.template.js +4 -4
- package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
- package/dist/template/implementations/view_enums_select.template.js +2 -2
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_async_select.template.js +4 -4
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +12 -9
- package/dist/template/implementations/view_search_input.template.js +2 -2
- package/dist/template/template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +17 -2
- package/dist/testing/fixture-manager.d.ts +2 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +29 -29
- package/dist/types/types.d.ts +593 -68
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +113 -9
- package/dist/vector/chunking.d.ts +25 -0
- package/dist/vector/chunking.d.ts.map +1 -0
- package/dist/vector/chunking.js +97 -0
- package/dist/vector/config.d.ts +12 -0
- package/dist/vector/config.d.ts.map +1 -0
- package/dist/vector/config.js +83 -0
- package/dist/vector/embedding.d.ts +42 -0
- package/dist/vector/embedding.d.ts.map +1 -0
- package/dist/vector/embedding.js +147 -0
- package/dist/vector/types.d.ts +105 -0
- package/dist/vector/types.d.ts.map +1 -0
- package/dist/vector/types.js +5 -0
- package/dist/vector/vector-search.d.ts +47 -0
- package/dist/vector/vector-search.d.ts.map +1 -0
- package/dist/vector/vector-search.js +176 -0
- package/package.json +9 -8
- package/src/api/config.ts +0 -4
- package/src/api/sonamu.ts +21 -36
- package/src/bin/cli.ts +5 -5
- package/src/database/base-model.ts +20 -11
- package/src/database/code-generator.ts +6 -2
- package/src/database/db.ts +1 -0
- package/src/database/puri-wrapper.ts +22 -16
- package/src/database/puri.ts +150 -27
- package/src/database/puri.types.test-d.ts +457 -0
- package/src/database/puri.types.ts +231 -33
- package/src/database/upsert-builder.ts +43 -34
- package/src/entity/entity-manager.ts +2 -2
- package/src/entity/entity.ts +134 -44
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +377 -174
- package/src/migration/migration-set.ts +22 -3
- package/src/migration/migrator.ts +6 -0
- package/src/migration/postgresql-schema-reader.ts +121 -21
- package/src/syncer/syncer.ts +3 -2
- package/src/template/implementations/generated.template.ts +51 -9
- package/src/template/implementations/generated_sso.template.ts +71 -2
- package/src/template/implementations/model.template.ts +5 -5
- package/src/template/implementations/model_test.template.ts +3 -3
- package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
- package/src/template/implementations/view_enums_select.template.ts +1 -1
- package/src/template/implementations/view_form.template.ts +11 -8
- package/src/template/implementations/view_id_async_select.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +11 -8
- package/src/template/implementations/view_search_input.template.ts +1 -1
- package/src/template/template.ts +1 -1
- package/src/template/zod-converter.ts +20 -0
- package/src/testing/fixture-manager.ts +31 -30
- package/src/types/types.ts +226 -48
- package/src/vector/chunking.ts +115 -0
- package/src/vector/config.ts +68 -0
- package/src/vector/embedding.ts +193 -0
- package/src/vector/types.ts +122 -0
- package/src/vector/vector-search.ts +261 -0
- package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
- package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
- package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
- package/dist/template/implementations/view_list_columns.template.js +0 -49
- package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
- package/src/template/implementations/view_list_columns.template.ts +0 -53
|
@@ -59,55 +59,55 @@ export class FixtureManagerClass {
|
|
|
59
59
|
return checksumRow.Checksum;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
|
|
62
|
+
원격 fixture DB를 로컬 test DB로 복사합니다.
|
|
63
|
+
pg_dump로 원격 DB를 덤프하고, pg_restore로 로컬에 복원합니다.
|
|
63
64
|
*/ async sync() {
|
|
64
65
|
const fixtureConn = Sonamu.dbConfig.fixture_remote.connection;
|
|
65
66
|
const testConn = Sonamu.dbConfig.test.connection;
|
|
66
|
-
//
|
|
67
|
-
const
|
|
67
|
+
// 1. 로컬 test DB 연결 종료 및 재생성
|
|
68
|
+
const testPgEnv = {
|
|
68
69
|
PGPASSWORD: testConn.password || ""
|
|
69
70
|
};
|
|
70
|
-
// 1. 연결 강제 종료
|
|
71
71
|
execSync(`psql -h ${testConn.host} -p ${testConn.port ?? 5432} -U ${testConn.user} -d postgres -c "
|
|
72
|
-
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
73
|
-
FROM pg_stat_activity
|
|
74
|
-
WHERE datname = '${testConn.database}'
|
|
75
|
-
AND pid <> pg_backend_pid();
|
|
76
|
-
"`, {
|
|
77
|
-
stdio: "inherit",
|
|
78
|
-
env: {
|
|
79
|
-
...process.env,
|
|
80
|
-
...pgEnv
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
execSync(`psql -h ${fixtureConn.host} -p ${fixtureConn.port ?? 5432} -U ${fixtureConn.user} -d postgres -c "
|
|
84
72
|
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
85
73
|
FROM pg_stat_activity
|
|
86
|
-
WHERE datname = '${
|
|
74
|
+
WHERE datname = '${testConn.database}'
|
|
87
75
|
AND pid <> pg_backend_pid();
|
|
88
76
|
"`, {
|
|
89
77
|
stdio: "inherit",
|
|
90
78
|
env: {
|
|
91
79
|
...process.env,
|
|
92
|
-
...
|
|
80
|
+
...testPgEnv
|
|
93
81
|
}
|
|
94
82
|
});
|
|
95
|
-
// 2. DROP DATABASE (별도 실행!)
|
|
96
83
|
execSync(`psql -h ${testConn.host} -p ${testConn.port ?? 5432} -U ${testConn.user} -d postgres -c "DROP DATABASE IF EXISTS \\"${testConn.database}\\""`, {
|
|
97
84
|
stdio: "inherit",
|
|
98
85
|
env: {
|
|
99
86
|
...process.env,
|
|
100
|
-
...
|
|
87
|
+
...testPgEnv
|
|
101
88
|
}
|
|
102
89
|
});
|
|
103
|
-
|
|
104
|
-
execSync(`psql -h ${testConn.host} -p ${testConn.port ?? 5432} -U ${testConn.user} -d postgres -c "CREATE DATABASE \\"${testConn.database}\\" TEMPLATE \\"${fixtureConn.database}\\""`, {
|
|
90
|
+
execSync(`psql -h ${testConn.host} -p ${testConn.port ?? 5432} -U ${testConn.user} -d postgres -c "CREATE DATABASE \\"${testConn.database}\\""`, {
|
|
105
91
|
stdio: "inherit",
|
|
106
92
|
env: {
|
|
107
93
|
...process.env,
|
|
108
|
-
...
|
|
94
|
+
...testPgEnv
|
|
109
95
|
}
|
|
110
96
|
});
|
|
97
|
+
// 2. 원격 fixture DB → 로컬 test DB로 복사 (pg_dump | pg_restore)
|
|
98
|
+
const fixturePgEnv = {
|
|
99
|
+
PGPASSWORD: fixtureConn.password || ""
|
|
100
|
+
};
|
|
101
|
+
const dumpCmd = `pg_dump -h ${fixtureConn.host} -p ${fixtureConn.port ?? 5432} -U ${fixtureConn.user} -d ${fixtureConn.database} -Fc`;
|
|
102
|
+
const restoreCmd = `pg_restore -h ${testConn.host} -p ${testConn.port ?? 5432} -U ${testConn.user} -d ${testConn.database} --no-owner --no-acl`;
|
|
103
|
+
execSync(`${dumpCmd} | PGPASSWORD="${testConn.password || ""}" ${restoreCmd}`, {
|
|
104
|
+
stdio: "inherit",
|
|
105
|
+
env: {
|
|
106
|
+
...process.env,
|
|
107
|
+
...fixturePgEnv
|
|
108
|
+
},
|
|
109
|
+
shell: "/bin/bash"
|
|
110
|
+
});
|
|
111
111
|
}
|
|
112
112
|
visitedRecords = new Set();
|
|
113
113
|
async importFixture(entityId, ids) {
|
|
@@ -553,7 +553,7 @@ export class FixtureManagerClass {
|
|
|
553
553
|
}
|
|
554
554
|
async checkUniqueViolation(db, entity, fixture) {
|
|
555
555
|
const _uniqueIndexes = entity.indexes?.filter((i)=>i.type === "unique") ?? [];
|
|
556
|
-
const uniqueIndexes = _uniqueIndexes.filter((index)=>index.columns.every((column)=>!column.startsWith(`${entity.table}__`)));
|
|
556
|
+
const uniqueIndexes = _uniqueIndexes.filter((index)=>index.columns.every((column)=>!column.name.startsWith(`${entity.table}__`)));
|
|
557
557
|
if (uniqueIndexes.length === 0) {
|
|
558
558
|
return null;
|
|
559
559
|
}
|
|
@@ -562,7 +562,7 @@ export class FixtureManagerClass {
|
|
|
562
562
|
for (const index of uniqueIndexes){
|
|
563
563
|
// 컬럼 중 하나라도 null이면 유니크 제약을 위반하지 않기 때문에 해당 인덱스는 무시
|
|
564
564
|
const containsNull = index.columns.some((column)=>{
|
|
565
|
-
const field = column.replace(/_id$/, "");
|
|
565
|
+
const field = column.name.replace(/_id$/, "");
|
|
566
566
|
return fixture.columns[field]?.value === null;
|
|
567
567
|
});
|
|
568
568
|
if (containsNull) {
|
|
@@ -570,11 +570,11 @@ export class FixtureManagerClass {
|
|
|
570
570
|
}
|
|
571
571
|
uniqueQuery = uniqueQuery.orWhere((qb)=>{
|
|
572
572
|
for (const column of index.columns){
|
|
573
|
-
const field = column.replace(/_id$/, "");
|
|
573
|
+
const field = column.name.replace(/_id$/, "");
|
|
574
574
|
if (Array.isArray(fixture.columns[field]?.value)) {
|
|
575
|
-
qb.whereIn(column, fixture.columns[field].value);
|
|
575
|
+
qb.whereIn(column.name, fixture.columns[field].value);
|
|
576
576
|
} else {
|
|
577
|
-
qb.andWhere(column, fixture.columns[field]?.value);
|
|
577
|
+
qb.andWhere(column.name, fixture.columns[field]?.value);
|
|
578
578
|
}
|
|
579
579
|
}
|
|
580
580
|
});
|
|
@@ -620,4 +620,4 @@ export class FixtureManagerClass {
|
|
|
620
620
|
}
|
|
621
621
|
export const FixtureManager = new FixtureManagerClass();
|
|
622
622
|
|
|
623
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiwgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHV1aWRUb0ZpeHR1cmVJZDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBza2lwcGVkRml4dHVyZXM6IE1hcDxzdHJpbmcsIHsgZW50aXR5SWQ6IHN0cmluZzsgZXhpc3RpbmdJZDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuX3RkYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKSB7XG4gICAgICBjb25zdCB0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBDb25uID0gU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0ga25leChTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZSk7XG4gIH1cblxuICBhc3luYyBnZXRDaGVja3N1bShkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBbW2NoZWNrc3VtUm93XV0gPSBhd2FpdCBkYi5yYXcoYENIRUNLU1VNIFRBQkxFICR7dGFibGVOYW1lfWApO1xuICAgIHJldHVybiBjaGVja3N1bVJvdy5DaGVja3N1bTtcbiAgfVxuXG4gIC8qKlxuICAgIOydtOygnCBGaXh0dXJlTWFuYWdlci5zeW5jKCkg64qUIGNoZWNrc3VtIOu5hOq1kCDsl4bsnbQgY3JlYXRlIGRhdGFiYXNlIHRlbXBsYXRlIOycvOuhnCDsiJjtlontlanri4jri6QuXG4gICovXG4gIGFzeW5jIHN5bmMoKSB7XG4gICAgY29uc3QgZml4dHVyZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyBQb3N0Z3JlU1FMIO2MqOyKpOybjOuTnCDtmZjqsr3rs4DsiJgg7ISk7KCVXG4gICAgY29uc3QgcGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcblxuICAgIC8vIDEuIOyXsOqysCDqsJXsoJwg7KKF66OMXG4gICAgZXhlY1N5bmMoXG4gICAgICBgcHNxbCAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kIHBvc3RncmVzIC1jIFwiXG4gICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgIFdIRVJFIGRhdG5hbWUgPSAnJHt0ZXN0Q29ubi5kYXRhYmFzZX0nXG4gICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5wZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHtmaXh0dXJlQ29ubi5ob3N0fSAtcCAke2ZpeHR1cmVDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHtmaXh0dXJlQ29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIlxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9J1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIFwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgLy8gMi4gRFJPUCBEQVRBQkFTRSAo67OE64+EIOyLpO2WiSEpXG4gICAgZXhlY1N5bmMoXG4gICAgICBgcHNxbCAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kIHBvc3RncmVzIC1jIFwiRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgXFxcXFwiJHt0ZXN0Q29ubi5kYXRhYmFzZX1cXFxcXCJcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5wZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDMuIENSRUFURSBEQVRBQkFTRVxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIiBURU1QTEFURSBcXFxcXCIke2ZpeHR1cmVDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdGVkUmVjb3JkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBhc3luYyBpbXBvcnRGaXh0dXJlKGVudGl0eUlkOiBzdHJpbmcsIGlkczogbnVtYmVyW10pIHtcbiAgICAvLyDrsKnrrLgg6riw66GdIOy0iOq4sO2ZlCAo7IOI66Gc7Jq0IGltcG9ydCDsnpHsl4Ug7Iuc7J6RKVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHF1ZXJpZXMgPSB1bmlxdWUoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGlkcy5tYXAoYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkLCBcImlkXCIsIGlkKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKS5mbGF0KCksXG4gICAgKTtcblxuICAgIGNvbnN0IHdkYiA9IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgICBjb25zdCBbcnNoXSA9IGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgaW5mbzogcnNoLmluZm8sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7ZmllbGR9IyR7aWR9YDtcblxuICAgIC8vIOyInO2ZmCDssLjsobAg67Cp7KeAOiDsnbTrr7gg67Cp66y47ZWcIOugiOy9lOuTnOuKlCDsiqTtgrVcbiAgICBpZiAodGhpcy52aXNpdGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuXG4gICAgY29uc29sZS5sb2coeyBlbnRpdHlJZCwgZmllbGQsIGlkIH0pO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmVfcmVtb3RlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKVxuICAgICAgLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0ga25leChTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXREQk5hbWVdKTtcblxuICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCIgPyBgJHtmaWVsZH1faWRgIDogZmllbGQ7XG5cbiAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgIGlmIChzZWFyY2hUeXBlID09PSBcImVxdWFsc1wiKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoY29sdW1uLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IG5ld1JlY29yZHMgPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCByb3csIHtcbiAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgIH0pO1xuICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgaWYgKGN1cnJlbnRGaXh0dXJlUmVjb3JkKSB7XG4gICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgIC5maWx0ZXIoKHIpID0+IHIuZml4dHVyZUlkICE9PSBjdXJyZW50Rml4dHVyZVJlY29yZC5maXh0dXJlSWQpXG4gICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAvLyDsgqzsmqnsnpAg7KeA7KCVIOy7rOufvCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgdGFyZ2V0XG4gICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgIGlmIChjdXN0b21Db2x1bW5zICYmIGN1c3RvbUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXN0b21EdXBsaWNhdGVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBmaXh0dXJlLFxuICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXN0b21EdXBsaWNhdGVSb3cpIHtcbiAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgc2luZ2xlUmVjb3JkOiB0cnVlLFxuICAgICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICBjb25zdCB1bmlxdWVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrVW5pcXVlVmlvbGF0aW9uKHRhcmdldERCLCBlbnRpdHksIGZpeHR1cmUpO1xuICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHVuaXF1ZVJvdywge1xuICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGFyZ2V0REIuZGVzdHJveSgpO1xuICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcblxuICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIOyInOyEnOuMgOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSAoVUJSZWbroZwg7LC47KGwIOq0gOqzhCDtkZztmIQpXG4gICAqIDMuIO2FjOydtOu4lOuzhCB1cHNlcnQg7Iuk7ZaJIChJROuKlCBEQuqwgCDsnpDrj5kg7ZWg64u5KVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnV1aWRUb0ZpeHR1cmVJZCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0ga25leChTb25hbXUuZGJDb25maWdbZGJOYW1lXSk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iic7ISc64yA66GcIFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUgZXhpc3Rpbmc6ICMke2ZpeHR1cmUudGFyZ2V0Py5pZH0pYCA6IFwiXCJ9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiVxuICAgICAgY29uc3QgdGFibGVPcmRlciA9IHRoaXMuZ2V0VGFibGVPcmRlcihmaXh0dXJlcyk7XG5cbiAgICAgIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZHNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIGlmICghdGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhYmxlTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3NgKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydCh0cngsIHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICAvLyB1cHNlcnTrkJwgcm9365Ok7J2YIHV1aWQgLT4gaWQg66ek7ZWRIOq1rOy2lVxuICAgICAgICAgIGlmICh1dWlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHJ4KHRhYmxlTmFtZSkuc2VsZWN0KFwidXVpZFwiLCBcImlkXCIpLndoZXJlSW4oXCJ1dWlkXCIsIHV1aWRzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICAgICAgICB1dWlkVG9JZC5zZXQocm93LnV1aWQsIHJvdy5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCB1dWlkVG9JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA1LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZC91dWlkIOyymOumrDogT3ZlcnJpZGUg66qo65Oc7J28IOuVjOunjCDquLDsobQg6rCSIOyCrOyaqVxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIgfHwgcHJvcE5hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7gg65Ox66Gd65CcIGZpeHR1cmUg7LC47KGwIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkUmVmO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuICAgIHRoaXMudXVpZFRvRml4dHVyZUlkLnNldChyZWYudXVpZCwgZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDthYzsnbTruJQg7Iic7IScIOy2lOy2nCAoZml4dHVyZXPsl5Ag7Y+s7ZWo65CcIO2FjOydtOu4lOunjClcbiAgICovXG4gIHByaXZhdGUgZ2V0VGFibGVPcmRlcihmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHRhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgaWYgKCFzZWVuLmhhcyhlbnRpdHkudGFibGUpKSB7XG4gICAgICAgIHNlZW4uYWRkKGVudGl0eS50YWJsZSk7XG4gICAgICAgIHRhYmxlcy5wdXNoKGVudGl0eS50YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IChwcm9wIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgbGV0IHRhcmdldElkOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSByZWxhdGVkVXVpZFRvSWQ/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgUmVsYXRlZCBmaXh0dXJlICR7cmVsYXRlZEZpeHR1cmVJZH0gbm90IGZvdW5kIGluIGluc2VydGVkSWRzLCBza2lwcGluZ2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlc29sdmVkSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSm9pblRhYmxl7JeQIOyCveyehVxuICAgICAgICAgICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IHRyeChqb2luVGFibGUpXG4gICAgICAgICAgICAgIC53aGVyZSh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmxpbWl0KDEpO1xuXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRyeChqb2luVGFibGUpLmluc2VydCh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLnN0YXJ0c1dpdGgoYCR7ZW50aXR5LnRhYmxlfV9fYCkpLFxuICAgICk7XG4gICAgaWYgKHVuaXF1ZUluZGV4ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgdW5pcXVlUXVlcnkgPSBkYihlbnRpdHkudGFibGUpO1xuICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdW5pcXVlSW5kZXhlcykge1xuICAgICAgLy8g7Lus65+8IOykkSDtlZjrgpjrnbzrj4QgbnVsbOydtOuptCDsnKDri4jtgawg7KCc7JW97J2EIOychOuwmO2VmOyngCDslYrquLAg65WM66y47JeQIO2VtOuLuSDsnbjrjbHsiqTripQg66y07IucXG4gICAgICBjb25zdCBjb250YWluc051bGwgPSBpbmRleC5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbHVtbi5yZXBsYWNlKC9faWQkLywgXCJcIik7XG4gICAgICAgIHJldHVybiBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSA9PT0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbnRhaW5zTnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdW5pcXVlUXVlcnkgPSB1bmlxdWVRdWVyeS5vcldoZXJlKChxYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBpbmRleC5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbiwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHFiLmFuZFdoZXJlKGNvbHVtbiwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBoYXNDb25kaXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaGFzQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBbdW5pcXVlRm91bmRdID0gYXdhaXQgdW5pcXVlUXVlcnk7XG4gICAgcmV0dXJuIHVuaXF1ZUZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICBkYjogS25leCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgLy8gcmVsYXRpb24g7ZWE65Oc7J24IOqyveyasCBfaWQg67aZ7J206riwXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uKTtcbiAgICAgIGNvbnN0IGRiQ29sdW1uID0gcHJvcCAmJiBpc1JlbGF0aW9uUHJvcChwcm9wKSA/IGAke2NvbHVtbn1faWRgIDogY29sdW1uO1xuICAgICAgY29uc3QgdmFsdWUgPSBmaXh0dXJlLmNvbHVtbnNbY29sdW1uXT8udmFsdWU7XG5cbiAgICAgIC8vIG51bGwg6rCS7J20IO2PrO2VqOuQnCDqsr3smrAg7KSR67O1IO2ZleyduCDsiqTtgrVcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB3aGVyZUNsYXVzZVtkYkNvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgZGIoZW50aXR5LnRhYmxlKS53aGVyZSh3aGVyZUNsYXVzZSkubGltaXQoMSk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgYXN5bmMgYWRkRml4dHVyZUxvYWRlcihjb2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvdGVzdGluZy9maXh0dXJlLnRzYDtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGgpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBuZXdDb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgZml4dHVyZUxvYWRlciBpbiBmaXh0dXJlLnRzXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRml4dHVyZU1hbmFnZXIgPSBuZXcgRml4dHVyZU1hbmFnZXJDbGFzcygpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiZXhlY1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiaW5mbGVjdGlvbiIsImtuZXgiLCJ1bmlxdWUiLCJpbnNwZWN0IiwiU29uYW11IiwiQmFzZU1vZGVsIiwiVXBzZXJ0QnVpbGRlciIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJSZWxhdGlvbkdyYXBoIiwiRml4dHVyZU1hbmFnZXJDbGFzcyIsIl90ZGIiLCJ0ZGIiLCJFcnJvciIsIl9mZGIiLCJmZGIiLCJjYWNoZWRUYWJsZU5hbWVzIiwicmVsYXRpb25HcmFwaCIsImJ1aWxkZXIiLCJmaXh0dXJlUmVmTWFwIiwiTWFwIiwidXVpZFRvRml4dHVyZUlkIiwic2tpcHBlZEZpeHR1cmVzIiwiaW5pdCIsImRiQ29uZmlnIiwidGVzdCIsInByb2R1Y3Rpb25fbWFzdGVyIiwidENvbm4iLCJjb25uZWN0aW9uIiwicENvbm4iLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZml4dHVyZV9yZW1vdGUiLCJnZXRDaGVja3N1bSIsImRiIiwidGFibGVOYW1lIiwiY2hlY2tzdW1Sb3ciLCJyYXciLCJDaGVja3N1bSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwicGdFbnYiLCJQR1BBU1NXT1JEIiwicGFzc3dvcmQiLCJ1c2VyIiwic3RkaW8iLCJlbnYiLCJwcm9jZXNzIiwidmlzaXRlZFJlY29yZHMiLCJTZXQiLCJpbXBvcnRGaXh0dXJlIiwiZW50aXR5SWQiLCJpZHMiLCJjbGVhciIsInF1ZXJpZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiaWQiLCJnZXRJbXBvcnRRdWVyaWVzIiwiZmxhdCIsIndkYiIsImdldERCIiwicXVlcnkiLCJyc2giLCJjb25zb2xlIiwibG9nIiwiaW5mbyIsImZpZWxkIiwicmVjb3JkS2V5IiwiaGFzIiwiYWRkIiwiZW50aXR5IiwiZ2V0Iiwicm93IiwidGFibGUiLCJ3aGVyZSIsImxpbWl0IiwidW5kZWZpbmVkIiwiZml4dHVyZURhdGFiYXNlIiwicmVhbERhdGFiYXNlIiwic2VsZlF1ZXJ5IiwiYXJncyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWxhdGlvbnMiLCJmaWx0ZXIiLCJyZWxhdGlvbiIsImN1c3RvbUpvaW5DbGF1c2UiLCJoYXNKb2luQ29sdW1uIiwicmVsYXRlZEVudGl0eSIsIndpdGgiLCJyZWxhdGVkSWRDb2x1bW5OYW1lIiwicHJvcHMiLCJmaW5kIiwicCIsIm5hbWUiLCJhcmciLCJyZWxRdWVyaWVzIiwicmV2ZXJzZSIsImRlc3Ryb3kiLCJnZXRGaXh0dXJlcyIsInNvdXJjZURCTmFtZSIsInRhcmdldERCTmFtZSIsInNlYXJjaE9wdGlvbnMiLCJkdXBsaWNhdGVDaGVjayIsInNvdXJjZURCIiwidGFyZ2V0REIiLCJ2YWx1ZSIsInNlYXJjaFR5cGUiLCJjb2x1bW4iLCJwcm9wIiwidHlwZSIsInJvd3MiLCJsZW5ndGgiLCJmaXh0dXJlcyIsImluaXRpYWxSZWNvcmRzTGVuZ3RoIiwibmV3UmVjb3JkcyIsImNyZWF0ZUZpeHR1cmVSZWNvcmQiLCJfZGIiLCJwdXNoIiwiY3VycmVudEZpeHR1cmVSZWNvcmQiLCJyIiwiZml4dHVyZUlkIiwiZmV0Y2hlZFJlY29yZHMiLCJzbGljZSIsImZpeHR1cmUiLCJjdXN0b21Db2x1bW5zIiwiY29sdW1ucyIsImN1c3RvbUR1cGxpY2F0ZVJvdyIsImNoZWNrRHVwbGljYXRlQnlDb2x1bW5zIiwicmVjb3JkIiwic2luZ2xlUmVjb3JkIiwidGFyZ2V0IiwidW5pcXVlUm93IiwiY2hlY2tVbmlxdWVWaW9sYXRpb24iLCJmIiwib3B0aW9ucyIsInJlY29yZHMiLCJ2aXNpdGVkRW50aXRpZXMiLCJjcmVhdGUiLCJiZWxvbmdzUmVjb3JkcyIsInRocm91Z2hUYWJsZSIsImpvaW5UYWJsZSIsImZyb21Db2x1bW4iLCJzaW5ndWxhcml6ZSIsInRvQ29sdW1uIiwicmVsYXRlZElkcyIsInBsdWNrIiwiam9pbkNvbHVtbiIsInJlbGF0ZWRQcm9wIiwicmVsYXRlZFJvdyIsImZpcnN0IiwicmVsYXRlZElkIiwiaW5zZXJ0Rml4dHVyZXMiLCJkYk5hbWUiLCJfZml4dHVyZXMiLCJyZXN1bHRzIiwiYnVpbGRHcmFwaCIsImluc2VydGlvbk9yZGVyIiwiZ2V0SW5zZXJ0aW9uT3JkZXIiLCJoYXNUYXJnZXQiLCJoYXNVbmlxdWUiLCJoYXNEdXBsaWNhdGUiLCJvdmVycmlkZSIsImV4aXN0aW5nSWQiLCJzZXQiLCJ5ZWxsb3ciLCJyZWdpc3RlckZpeHR1cmUiLCJibHVlIiwidGFibGVPcmRlciIsImdldFRhYmxlT3JkZXIiLCJ0cmFuc2FjdGlvbiIsInRyeCIsImluc2VydGVkSWRzQnlUYWJsZSIsImhhc1RhYmxlIiwiZ2V0VGFibGUiLCJ1dWlkcyIsInV1aWQiLCJ1cHNlcnQiLCJ1dWlkVG9JZCIsInNlbGVjdCIsIndoZXJlSW4iLCJwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyIsInNraXBwZWQiLCJkYXRhIiwicmVmIiwiaW5zZXJ0ZWRJZCIsImdyZWVuIiwiZXhpc3RpbmdSZWNvcmQiLCJpc092ZXJyaWRlTW9kZSIsInByb3BOYW1lIiwicmVsYXRlZEZpeHR1cmVJZCIsInNraXBwZWRFeGlzdGluZ0lkIiwicmVsYXRlZFJlZiIsImNvbnZlcnRDb2x1bW5WYWx1ZSIsInJlZ2lzdGVyIiwiRGF0ZSIsInRhYmxlcyIsInNlZW4iLCJzb3VyY2VSZWYiLCJzb3VyY2VVdWlkVG9JZCIsInNvdXJjZUlkIiwiQXJyYXkiLCJpc0FycmF5IiwidGFyZ2V0VGFibGUiLCJzb3VyY2VDb2x1bW4iLCJ0YXJnZXRDb2x1bW4iLCJ0YXJnZXRJZCIsInJlbGF0ZWRVdWlkVG9JZCIsInJlc29sdmVkSWQiLCJ3YXJuIiwiZm91bmQiLCJpbnNlcnQiLCJfdW5pcXVlSW5kZXhlcyIsImluZGV4ZXMiLCJpIiwidW5pcXVlSW5kZXhlcyIsImluZGV4IiwiZXZlcnkiLCJzdGFydHNXaXRoIiwidW5pcXVlUXVlcnkiLCJoYXNDb25kaXRpb24iLCJjb250YWluc051bGwiLCJzb21lIiwicmVwbGFjZSIsIm9yV2hlcmUiLCJxYiIsImFuZFdoZXJlIiwidW5pcXVlRm91bmQiLCJ3aGVyZUNsYXVzZSIsImRiQ29sdW1uIiwiYWRkRml4dHVyZUxvYWRlciIsImNvZGUiLCJwYXRoIiwiYXBpUm9vdFBhdGgiLCJjb250ZW50IiwidG9TdHJpbmciLCJmaXh0dXJlTG9hZGVyU3RhcnQiLCJpbmRleE9mIiwiZml4dHVyZUxvYWRlckVuZCIsIm5ld0NvbnRlbnQiLCJGaXh0dXJlTWFuYWdlciJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxRQUFRLFFBQVEsZ0JBQWdCO0FBQ3pDLFNBQVNDLFlBQVksRUFBRUMsYUFBYSxRQUFRLEtBQUs7QUFDakQsT0FBT0MsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBeUIsT0FBTztBQUN2QyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxPQUFPLFFBQVEsT0FBTztBQUMvQixTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFDaEMsU0FBU0MsU0FBUyxRQUFRLDRCQUF5QjtBQUVuRCxTQUFxQkMsYUFBYSxRQUFR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
|
|
623
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiwgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHV1aWRUb0ZpeHR1cmVJZDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBza2lwcGVkRml4dHVyZXM6IE1hcDxzdHJpbmcsIHsgZW50aXR5SWQ6IHN0cmluZzsgZXhpc3RpbmdJZDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuX3RkYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKSB7XG4gICAgICBjb25zdCB0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBDb25uID0gU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0ga25leChTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZSk7XG4gIH1cblxuICBhc3luYyBnZXRDaGVja3N1bShkYjogS25leCwgdGFibGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBbW2NoZWNrc3VtUm93XV0gPSBhd2FpdCBkYi5yYXcoYENIRUNLU1VNIFRBQkxFICR7dGFibGVOYW1lfWApO1xuICAgIHJldHVybiBjaGVja3N1bVJvdy5DaGVja3N1bTtcbiAgfVxuXG4gIC8qKlxuICAgIOybkOqyqSBmaXh0dXJlIERC66W8IOuhnOy7rCB0ZXN0IERC66GcIOuzteyCrO2VqeuLiOuLpC5cbiAgICBwZ19kdW1w66GcIOybkOqyqSBEQuulvCDrjaTtlITtlZjqs6AsIHBnX3Jlc3RvcmXroZwg66Gc7Lus7JeQIOuzteybkO2VqeuLiOuLpC5cbiAgKi9cbiAgYXN5bmMgc3luYygpIHtcbiAgICBjb25zdCBmaXh0dXJlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZS5jb25uZWN0aW9uIGFzIEtuZXguUGdDb25uZWN0aW9uQ29uZmlnO1xuICAgIGNvbnN0IHRlc3RDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIC8vIDEuIOuhnOy7rCB0ZXN0IERCIOyXsOqysCDsooXro4wg67CPIOyerOyDneyEsVxuICAgIGNvbnN0IHRlc3RQZ0VudiA9IHsgUEdQQVNTV09SRDogdGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIlxuICAgICAgICBTRUxFQ1QgcGdfdGVybWluYXRlX2JhY2tlbmQocGdfc3RhdF9hY3Rpdml0eS5waWQpXG4gICAgICAgIEZST00gcGdfc3RhdF9hY3Rpdml0eVxuICAgICAgICBXSEVSRSBkYXRuYW1lID0gJyR7dGVzdENvbm4uZGF0YWJhc2V9J1xuICAgICAgICAgIEFORCBwaWQgPD4gcGdfYmFja2VuZF9waWQoKTtcbiAgICAgIFwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkRST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgZXhlY1N5bmMoXG4gICAgICBgcHNxbCAtaCAke3Rlc3RDb25uLmhvc3R9IC1wICR7dGVzdENvbm4ucG9ydCA/PyA1NDMyfSAtVSAke3Rlc3RDb25uLnVzZXJ9IC1kIHBvc3RncmVzIC1jIFwiQ1JFQVRFIERBVEFCQVNFIFxcXFxcIiR7dGVzdENvbm4uZGF0YWJhc2V9XFxcXFwiXCJgLFxuICAgICAgeyBzdGRpbzogXCJpbmhlcml0XCIsIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4udGVzdFBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYgfSxcbiAgICApO1xuXG4gICAgLy8gMi4g7JuQ6rKpIGZpeHR1cmUgREIg4oaSIOuhnOy7rCB0ZXN0IERC66GcIOuzteyCrCAocGdfZHVtcCB8IHBnX3Jlc3RvcmUpXG4gICAgY29uc3QgZml4dHVyZVBnRW52ID0geyBQR1BBU1NXT1JEOiBmaXh0dXJlQ29ubi5wYXNzd29yZCB8fCBcIlwiIH07XG4gICAgY29uc3QgZHVtcENtZCA9IGBwZ19kdW1wIC1oICR7Zml4dHVyZUNvbm4uaG9zdH0gLXAgJHtmaXh0dXJlQ29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7Zml4dHVyZUNvbm4udXNlcn0gLWQgJHtmaXh0dXJlQ29ubi5kYXRhYmFzZX0gLUZjYDtcbiAgICBjb25zdCByZXN0b3JlQ21kID0gYHBnX3Jlc3RvcmUgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCAke3Rlc3RDb25uLmRhdGFiYXNlfSAtLW5vLW93bmVyIC0tbm8tYWNsYDtcblxuICAgIGV4ZWNTeW5jKGAke2R1bXBDbWR9IHwgUEdQQVNTV09SRD1cIiR7dGVzdENvbm4ucGFzc3dvcmQgfHwgXCJcIn1cIiAke3Jlc3RvcmVDbWR9YCwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5maXh0dXJlUGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudixcbiAgICAgIHNoZWxsOiBcIi9iaW4vYmFzaFwiLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB2aXNpdGVkUmVjb3JkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBhc3luYyBpbXBvcnRGaXh0dXJlKGVudGl0eUlkOiBzdHJpbmcsIGlkczogbnVtYmVyW10pIHtcbiAgICAvLyDrsKnrrLgg6riw66GdIOy0iOq4sO2ZlCAo7IOI66Gc7Jq0IGltcG9ydCDsnpHsl4Ug7Iuc7J6RKVxuICAgIHRoaXMudmlzaXRlZFJlY29yZHMuY2xlYXIoKTtcblxuICAgIGNvbnN0IHF1ZXJpZXMgPSB1bmlxdWUoXG4gICAgICAoXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGlkcy5tYXAoYXN5bmMgKGlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkLCBcImlkXCIsIGlkKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgKS5mbGF0KCksXG4gICAgKTtcblxuICAgIGNvbnN0IHdkYiA9IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgZm9yIChjb25zdCBxdWVyeSBvZiBxdWVyaWVzKSB7XG4gICAgICBjb25zdCBbcnNoXSA9IGF3YWl0IHdkYi5yYXcocXVlcnkpO1xuICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgaW5mbzogcnNoLmluZm8sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRJbXBvcnRRdWVyaWVzKGVudGl0eUlkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIGlkOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7ZmllbGR9IyR7aWR9YDtcblxuICAgIC8vIOyInO2ZmCDssLjsobAg67Cp7KeAOiDsnbTrr7gg67Cp66y47ZWcIOugiOy9lOuTnOuKlCDsiqTtgrVcbiAgICBpZiAodGhpcy52aXNpdGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuXG4gICAgY29uc29sZS5sb2coeyBlbnRpdHlJZCwgZmllbGQsIGlkIH0pO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuXG4gICAgLy8g7Jes6riw7IScIOyLpERC7J2YIHJvdyDqsIDsoLjsmLRcbiAgICBjb25zdCBbcm93XSA9IGF3YWl0IHdkYihlbnRpdHkudGFibGUpLndoZXJlKGZpZWxkLCBpZCkubGltaXQoMSk7XG4gICAgaWYgKHJvdyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50aXR5SWR9IyR7aWR9IHJvd+ulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyDtlL3siqTss5BEQiwg7IukREJcbiAgICBjb25zdCBmaXh0dXJlRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLmZpeHR1cmVfcmVtb3RlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKVxuICAgICAgLmRhdGFiYXNlO1xuICAgIGNvbnN0IHJlYWxEYXRhYmFzZSA9IChTb25hbXUuZGJDb25maWcucHJvZHVjdGlvbl9tYXN0ZXIuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpXG4gICAgICAuZGF0YWJhc2U7XG5cbiAgICBjb25zdCBzZWxmUXVlcnkgPSBgSU5TRVJUIElHTk9SRSBJTlRPIFxcYCR7Zml4dHVyZURhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgKFNFTEVDVCAqIEZST00gXFxgJHtyZWFsRGF0YWJhc2V9XFxgLlxcYCR7ZW50aXR5LnRhYmxlfVxcYCBXSEVSRSBcXGBpZFxcYCA9ICR7aWR9KWA7XG5cbiAgICBjb25zdCBhcmdzID0gT2JqZWN0LmVudHJpZXMoZW50aXR5LnJlbGF0aW9ucylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCByZWxhdGlvbl0pID0+XG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmIHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UgPT09IHVuZGVmaW5lZCksXG4gICAgICApXG4gICAgICAubWFwKChbLCByZWxhdGlvbl0pID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgQmVsb25nc1RvT25l7J24IOqyveyasFxuICAgICAgICAgIENhdGVnb3J5IC8gJ2lkJyAvIHJvd1tjYXRlZ29yeV9pZF0g7Zi47LacXG4gICAgICAgIE9uZVRvT25l7JeQIGpvaW5Db2x1bW4gPT09IHRydWUg7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAnaWQnIC8gcm93W3Byb2ZpbGVfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSBmYWxzZSDsnbgg6rK97JqwXG4gICAgICAgICAgUHJvZmlsZSAvICdwcm9maWxlX2lkJyAvIHJvd1snaWQnXSDtmLjstpxcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IGZpZWxkOiBzdHJpbmc7XG4gICAgICAgIGxldCBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgJiYgIXJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkQ29sdW1uTmFtZSA9IHJlbGF0ZWRFbnRpdHkucHJvcHMuZmluZChcbiAgICAgICAgICAgIChwKSA9PiBpc1JlbGF0aW9uUHJvcChwKSAmJiBwLndpdGggPT09IGVudGl0eS5pZCxcbiAgICAgICAgICApPy5uYW1lO1xuICAgICAgICAgIGlmICghcmVsYXRlZElkQ29sdW1uTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3JlbGF0ZWRFbnRpdHkuaWR97J2YICR7ZW50aXR5LmlkfSDqtIDqs4Qg7ZSE66Gt7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZCA9IGAke3JlbGF0ZWRJZENvbHVtbk5hbWV9X2lkYDtcbiAgICAgICAgICBpZCA9IHJvdy5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWVsZCA9IFwiaWRcIjtcbiAgICAgICAgICBpZCA9IHJvd1tgJHtyZWxhdGlvbi5uYW1lfV9pZGBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHJlbGF0aW9uLndpdGgsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgaWQsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoYXJnKSA9PiBhcmcuaWQgIT09IG51bGwpO1xuXG4gICAgY29uc3QgcmVsUXVlcmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgYXJncy5tYXAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhhcmdzLmVudGl0eUlkLCBhcmdzLmZpZWxkLCBhcmdzLmlkKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnVuaXF1ZShyZWxRdWVyaWVzLnJldmVyc2UoKS5mbGF0KCkpLCBzZWxmUXVlcnldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdGRiKSB7XG4gICAgICBhd2FpdCB0aGlzLl90ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fdGRiID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZkYikge1xuICAgICAgYXdhaXQgdGhpcy5fZmRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZkYiA9IG51bGw7XG4gICAgfVxuICAgIGF3YWl0IEJhc2VNb2RlbC5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRGaXh0dXJlcyhcbiAgICBzb3VyY2VEQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHRhcmdldERCTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgc2VhcmNoT3B0aW9uczogRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gICAgZHVwbGljYXRlQ2hlY2s/OiBEdXBsaWNhdGVDaGVja09wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHNvdXJjZURCID0ga25leChTb25hbXUuZGJDb25maWdbc291cmNlREJOYW1lXSk7XG4gICAgY29uc3QgdGFyZ2V0REIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXREQk5hbWVdKTtcblxuICAgIGNvbnN0IHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZSB9ID0gc2VhcmNoT3B0aW9ucztcblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgZW50aXR5LnByb3BzLmZpbmQoKHByb3ApID0+IHByb3AubmFtZSA9PT0gZmllbGQpPy50eXBlID09PSBcInJlbGF0aW9uXCIgPyBgJHtmaWVsZH1faWRgIDogZmllbGQ7XG5cbiAgICBsZXQgcXVlcnkgPSBzb3VyY2VEQihlbnRpdHkudGFibGUpO1xuICAgIGlmIChzZWFyY2hUeXBlID09PSBcImVxdWFsc1wiKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgdmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoc2VhcmNoVHlwZSA9PT0gXCJsaWtlXCIpIHtcbiAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoY29sdW1uLCBcImxpa2VcIiwgYCUke3ZhbHVlfSVgKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWNvcmRzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCBpbml0aWFsUmVjb3Jkc0xlbmd0aCA9IGZpeHR1cmVzLmxlbmd0aDtcbiAgICAgIGNvbnN0IG5ld1JlY29yZHMgPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCByb3csIHtcbiAgICAgICAgX2RiOiBzb3VyY2VEQixcbiAgICAgIH0pO1xuICAgICAgZml4dHVyZXMucHVzaCguLi5uZXdSZWNvcmRzKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRGaXh0dXJlUmVjb3JkID0gZml4dHVyZXMuZmluZCgocikgPT4gci5maXh0dXJlSWQgPT09IGAke2VudGl0eUlkfSMke3Jvdy5pZH1gKTtcblxuICAgICAgaWYgKGN1cnJlbnRGaXh0dXJlUmVjb3JkKSB7XG4gICAgICAgIC8vIO2YhOyerCBmaXh0dXJl66Gc67aA7YSwIOyDneyEseuQnCBmZXRjaGVkUmVjb3JkcyDshKTsoJVcbiAgICAgICAgY3VycmVudEZpeHR1cmVSZWNvcmQuZmV0Y2hlZFJlY29yZHMgPSBmaXh0dXJlc1xuICAgICAgICAgIC5maWx0ZXIoKHIpID0+IHIuZml4dHVyZUlkICE9PSBjdXJyZW50Rml4dHVyZVJlY29yZC5maXh0dXJlSWQpXG4gICAgICAgICAgLnNsaWNlKGluaXRpYWxSZWNvcmRzTGVuZ3RoKVxuICAgICAgICAgIC5tYXAoKHIpID0+IHIuZml4dHVyZUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAvLyDsgqzsmqnsnpAg7KeA7KCVIOy7rOufvCDquLDspIAg7KSR67O1IO2ZleyduCDihpIgdGFyZ2V0XG4gICAgICBjb25zdCBjdXN0b21Db2x1bW5zID0gZHVwbGljYXRlQ2hlY2s/LmNvbHVtbnM/LltmaXh0dXJlLmVudGl0eUlkXTtcbiAgICAgIGlmIChjdXN0b21Db2x1bW5zICYmIGN1c3RvbUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXN0b21EdXBsaWNhdGVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrRHVwbGljYXRlQnlDb2x1bW5zKFxuICAgICAgICAgIHRhcmdldERCLFxuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBmaXh0dXJlLFxuICAgICAgICAgIGN1c3RvbUNvbHVtbnMsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjdXN0b21EdXBsaWNhdGVSb3cpIHtcbiAgICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIGN1c3RvbUR1cGxpY2F0ZVJvdywge1xuICAgICAgICAgICAgc2luZ2xlUmVjb3JkOiB0cnVlLFxuICAgICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmaXh0dXJlLnRhcmdldCA9IHJlY29yZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVbmlxdWUgaW5kZXgg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIGZpeHR1cmUudW5pcXVlXG4gICAgICBjb25zdCB1bmlxdWVSb3cgPSBhd2FpdCB0aGlzLmNoZWNrVW5pcXVlVmlvbGF0aW9uKHRhcmdldERCLCBlbnRpdHksIGZpeHR1cmUpO1xuICAgICAgaWYgKHVuaXF1ZVJvdykge1xuICAgICAgICBjb25zdCBbcmVjb3JkXSA9IGF3YWl0IHRoaXMuY3JlYXRlRml4dHVyZVJlY29yZChlbnRpdHksIHVuaXF1ZVJvdywge1xuICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICBfZGI6IHRhcmdldERCLFxuICAgICAgICB9KTtcbiAgICAgICAgZml4dHVyZS51bmlxdWUgPSByZWNvcmQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGFyZ2V0REIuZGVzdHJveSgpO1xuICAgIGF3YWl0IHNvdXJjZURCLmRlc3Ryb3koKTtcblxuICAgIHJldHVybiB1bmlxdWUoZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvdzoge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH0sXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHNpbmdsZVJlY29yZD86IGJvb2xlYW47XG4gICAgICBfZGI/OiBLbmV4O1xuICAgIH0sXG4gICk6IFByb21pc2U8Rml4dHVyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVjb3JkczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgY29uc3QgdmlzaXRlZEVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdCBjcmVhdGUgPSBhc3luYyAoXG4gICAgICBlbnRpdHk6IEVudGl0eSxcbiAgICAgIHJvdzoge1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgIH0sXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBmaXh0dXJlSWQgPSBgJHtlbnRpdHkuaWR9IyR7cm93LmlkfWA7XG4gICAgICBpZiAodmlzaXRlZEVudGl0aWVzLmhhcyhmaXh0dXJlSWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZpc2l0ZWRFbnRpdGllcy5hZGQoZml4dHVyZUlkKTtcblxuICAgICAgY29uc3QgcmVjb3JkOiBGaXh0dXJlUmVjb3JkID0ge1xuICAgICAgICBmaXh0dXJlSWQsXG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIGNvbHVtbnM6IHt9LFxuICAgICAgICBmZXRjaGVkUmVjb3JkczogW10sXG4gICAgICAgIGJlbG9uZ3NSZWNvcmRzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0gPSB7XG4gICAgICAgICAgcHJvcDogcHJvcCxcbiAgICAgICAgICB2YWx1ZTogcm93W3Byb3AubmFtZV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGIgPSBvcHRpb25zPy5fZGIgPz8gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRocm91Z2hUYWJsZSA9IHByb3Auam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IGZyb21Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSl9X2lkYDtcbiAgICAgICAgICBjb25zdCB0b0NvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYih0aHJvdWdoVGFibGUpLndoZXJlKGZyb21Db2x1bW4sIHJvdy5pZCkucGx1Y2sodG9Db2x1bW4pO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKVxuICAgICAgICAgICAgLndoZXJlKHByb3Auam9pbkNvbHVtbiwgcm93LmlkKVxuICAgICAgICAgICAgLnBsdWNrKFwiaWRcIik7XG4gICAgICAgICAgcmVjb3JkLmNvbHVtbnNbcHJvcC5uYW1lXS52YWx1ZSA9IHJlbGF0ZWRJZHM7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiAhcHJvcC5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZFByb3AgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVsYXRlZFByb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJvdy5pZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkUm93Py5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWQgPSByb3dbYCR7cHJvcC5uYW1lfV9pZGBdO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWQ7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgcmVjb3JkLmJlbG9uZ3NSZWNvcmRzLnB1c2goYCR7cHJvcC53aXRofSMke3JlbGF0ZWRJZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFvcHRpb25zPy5zaW5nbGVSZWNvcmQgJiYgcmVsYXRlZElkKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSb3cgPSBhd2FpdCBkYihyZWxhdGVkRW50aXR5LnRhYmxlKS53aGVyZShcImlkXCIsIHJlbGF0ZWRJZCkuZmlyc3QoKTtcbiAgICAgICAgICAgIGlmIChyZWxhdGVkUm93KSB7XG4gICAgICAgICAgICAgIGF3YWl0IGNyZWF0ZShyZWxhdGVkRW50aXR5LCByZWxhdGVkUm93KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgfTtcblxuICAgIGF3YWl0IGNyZWF0ZShlbnRpdHksIHJvdyk7XG5cbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiAxLiBSZWxhdGlvbkdyYXBo66GcIGZpeHR1cmUg64uo7JyEIOyCveyehSDsiJzshJwg6rOE7IKwIChzZWxmLXJlZmVyZW5jZSDtj6ztlagpXG4gICAqIDIuIOyInOyEnOuMgOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSAoVUJSZWbroZwg7LC47KGwIOq0gOqzhCDtkZztmIQpXG4gICAqIDMuIO2FjOydtOu4lOuzhCB1cHNlcnQg7Iuk7ZaJIChJROuKlCBEQuqwgCDsnpDrj5kg7ZWg64u5KVxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Rml4dHVyZXMoXG4gICAgZGJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICBfZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgKTogUHJvbWlzZTxGaXh0dXJlSW1wb3J0UmVzdWx0W10+IHtcbiAgICBjb25zdCBmaXh0dXJlcyA9IHVuaXF1ZShfZml4dHVyZXMsIChmKSA9PiBmLmZpeHR1cmVJZCk7XG5cbiAgICAvLyDstIjquLDtmZRcbiAgICB0aGlzLmJ1aWxkZXIgPSBuZXcgVXBzZXJ0QnVpbGRlcigpO1xuICAgIHRoaXMuZml4dHVyZVJlZk1hcCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnV1aWRUb0ZpeHR1cmVJZCA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLnNraXBwZWRGaXh0dXJlcyA9IG5ldyBNYXAoKTtcblxuICAgIGNvbnN0IGRiID0ga25leChTb25hbXUuZGJDb25maWdbZGJOYW1lXSk7XG4gICAgY29uc3QgcmVzdWx0czogRml4dHVyZUltcG9ydFJlc3VsdFtdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsFxuICAgICAgdGhpcy5yZWxhdGlvbkdyYXBoLmJ1aWxkR3JhcGgoZml4dHVyZXMpO1xuICAgICAgY29uc3QgaW5zZXJ0aW9uT3JkZXIgPSB0aGlzLnJlbGF0aW9uR3JhcGguZ2V0SW5zZXJ0aW9uT3JkZXIoKTtcblxuICAgICAgLy8gMi4g7Iic7ISc64yA66GcIFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdIChvdmVycmlkZSDssrTtgawpXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmVJZCBvZiBpbnNlcnRpb25PcmRlcikge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gZml4dHVyZXMuZmluZCgoZikgPT4gZi5maXh0dXJlSWQgPT09IGZpeHR1cmVJZCk7XG4gICAgICAgIGlmICghZml4dHVyZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgaGFzVGFyZ2V0ID0gISFmaXh0dXJlLnRhcmdldDtcbiAgICAgICAgY29uc3QgaGFzVW5pcXVlID0gISFmaXh0dXJlLnVuaXF1ZTtcbiAgICAgICAgY29uc3QgaGFzRHVwbGljYXRlID0gaGFzVGFyZ2V0IHx8IGhhc1VuaXF1ZTtcblxuICAgICAgICAvLyDspJHrs7XsnbQg7J6I6rOgIG92ZXJyaWRlPWZhbHNl7J24IOqyveyasDog7Iqk7YK1XG4gICAgICAgIGlmIChoYXNEdXBsaWNhdGUgJiYgIWZpeHR1cmUub3ZlcnJpZGUpIHtcbiAgICAgICAgICAvLyDquLDsobQg66CI7L2U65OcIElEIOyggOyepSAodW5pcXVlIOyasOyEoCwg7JeG7Jy866m0IHRhcmdldClcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gZml4dHVyZS51bmlxdWU/LmlkID8/IGZpeHR1cmUudGFyZ2V0Py5pZDtcbiAgICAgICAgICBhc3NlcnQoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5za2lwcGVkRml4dHVyZXMuc2V0KGZpeHR1cmVJZCwge1xuICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICBleGlzdGluZ0lkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgIGBTa2lwcGVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSAoZXhpc3Rpbmc6ICMke2V4aXN0aW5nSWR9LCBvdmVycmlkZTogZmFsc2UpYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmUpO1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ibHVlKFxuICAgICAgICAgICAgYFJlZ2lzdGVyZWQgJHtmaXh0dXJlLmVudGl0eUlkfSMke2ZpeHR1cmUuaWR9JHtmaXh0dXJlLm92ZXJyaWRlID8gYCAob3ZlcnJpZGUgZXhpc3Rpbmc6ICMke2ZpeHR1cmUudGFyZ2V0Py5pZH0pYCA6IFwiXCJ9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiVxuICAgICAgY29uc3QgdGFibGVPcmRlciA9IHRoaXMuZ2V0VGFibGVPcmRlcihmaXh0dXJlcyk7XG5cbiAgICAgIGF3YWl0IGRiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZHNCeVRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCB0YWJsZU5hbWUgb2YgdGFibGVPcmRlcikge1xuICAgICAgICAgIGlmICghdGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhYmxlTmFtZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgLy8gdXBzZXJ0IOyLpO2WiSDsoIQgdXVpZCDrqqnroZ0g7KCA7J6lXG4gICAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmJ1aWxkZXIuZ2V0VGFibGUodGFibGVOYW1lKTtcbiAgICAgICAgICBjb25zdCB1dWlkcyA9IHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvdy51dWlkIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBVcHNlcnRpbmcgJHt0YWJsZU5hbWV9IHdpdGggJHt1dWlkcy5sZW5ndGh9IHJvd3NgKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5idWlsZGVyLnVwc2VydCh0cngsIHRhYmxlTmFtZSk7XG5cbiAgICAgICAgICAvLyB1cHNlcnTrkJwgcm9365Ok7J2YIHV1aWQgLT4gaWQg66ek7ZWRIOq1rOy2lVxuICAgICAgICAgIGlmICh1dWlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdHJ4KHRhYmxlTmFtZSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgIC5zZWxlY3QoXCJ1dWlkXCIsIFwiaWRcIilcbiAgICAgICAgICAgICAgLndoZXJlSW4oXCJ1dWlkXCIsIHV1aWRzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICAgICAgICB1dWlkVG9JZC5zZXQocm93LnV1aWQsIHJvdy5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc2VydGVkSWRzQnlUYWJsZS5zZXQodGFibGVOYW1lLCB1dWlkVG9JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gTWFueVRvTWFueSDqtIDqs4Qg7LKY66asXG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnModHJ4LCBmaXh0dXJlcywgaW5zZXJ0ZWRJZHNCeVRhYmxlKTtcblxuICAgICAgICAvLyA1LiDqsrDqs7wg7IiY7KeRXG4gICAgICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuXG4gICAgICAgICAgLy8g7Iqk7YK165CcIGZpeHR1cmXripQg6riw7KG0IOugiOy9lOuTnCDsoJXrs7TroZwg6rKw6rO8IOy2lOqwgFxuICAgICAgICAgIGNvbnN0IHNraXBwZWQgPSB0aGlzLnNraXBwZWRGaXh0dXJlcy5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChza2lwcGVkKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICBlbnRpdHlJZDogZml4dHVyZS5lbnRpdHlJZCxcbiAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBza2lwcGVkLmV4aXN0aW5nSWQpLmZpcnN0KCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgICAgICAgY29uc3QgaW5zZXJ0ZWRJZCA9IHV1aWRUb0lkPy5nZXQocmVmLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgdHJ4KGVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCBpbnNlcnRlZElkKS5maXJzdCgpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihgSW5zZXJ0ZWQgaW50byAke2VudGl0eS50YWJsZX06ICMke2ZpeHR1cmUuaWR9IC0+ICMke2luc2VydGVkSWR9YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmlxdWUocmVzdWx0cywgKHIpID0+IGAke3IuZW50aXR5SWR9IyR7ci5kYXRhLmlkfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpeHR1cmVSZWNvcmTrpbwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ1cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJGaXh0dXJlKGZpeHR1cmU6IEZpeHR1cmVSZWNvcmQpOiBVQlJlZiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gT3ZlcnJpZGUg66qo65OcIO2MkOuLqDogdGFyZ2V0IOuYkOuKlCB1bmlxdWXqsIAg7J6I6rOgIG92ZXJyaWRlPXRydWXsnbgg6rK97JqwXG4gICAgY29uc3QgZXhpc3RpbmdSZWNvcmQgPSBmaXh0dXJlLnRhcmdldCA/PyBmaXh0dXJlLnVuaXF1ZTtcbiAgICBjb25zdCBpc092ZXJyaWRlTW9kZSA9IGZpeHR1cmUub3ZlcnJpZGUgJiYgZXhpc3RpbmdSZWNvcmQ7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZC91dWlkIOyymOumrDogT3ZlcnJpZGUg66qo65Oc7J28IOuVjOunjCDquLDsobQg6rCSIOyCrOyaqVxuICAgICAgaWYgKHByb3BOYW1lID09PSBcImlkXCIgfHwgcHJvcE5hbWUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIGlmIChpc092ZXJyaWRlTW9kZSAmJiBleGlzdGluZ1JlY29yZCkge1xuICAgICAgICAgIC8vIE92ZXJyaWRlOiDquLDsobQg66CI7L2U65Oc7J2YIOqwkiDsgqzsmqkg4oaSIFVQREFURVxuICAgICAgICAgIHJvd1twcm9wTmFtZV0gPSBleGlzdGluZ1JlY29yZC5jb2x1bW5zW3Byb3BOYW1lXT8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8g7IOIIOugiOy9lOuTnDog7KCc7Jm4IOKGkiBJTlNFUlQgKERCL1Vwc2VydEJ1aWxkZXLqsIAg7IOd7ISxKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gY29sdW1uLnZhbHVlIGFzIG51bWJlciB8IG51bGw7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZCAhPT0gbnVsbCAmJiByZWxhdGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcblxuICAgICAgICAgICAgLy8g66i87KCAIHNraXDrkJwgZml4dHVyZeyduOyngCDtmZXsnbhcbiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRFeGlzdGluZ0lkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpPy5leGlzdGluZ0lkO1xuICAgICAgICAgICAgaWYgKHNraXBwZWRFeGlzdGluZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gc2tpcOuQnCBmaXh0dXJlIOKGkiB0YXJnZXQgRELsnZgg6riw7KG0IOugiOy9lOuTnCBpZCDsgqzsmqlcbiAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gc2tpcHBlZEV4aXN0aW5nSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgICAvLyDsnbTrr7gg65Ox66Gd65CcIGZpeHR1cmUg7LC47KGwIOKGkiBVQlJlZiDsgqzsmqlcbiAgICAgICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSByZWxhdGVkUmVmO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGZpeHR1cmVz7JeQIO2PrO2VqOuQmOyngCDslYrsnYAg66CI7L2U65OcIOKGkiBJRCDqt7jrjIDroZwg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEhhc01hbnksIE1hbnlUb01hbnnripQg67OE64+EIOyymOumrFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7J2867CYIOy7rOufvFxuICAgICAgICByb3dbcHJvcE5hbWVdID0gdGhpcy5jb252ZXJ0Q29sdW1uVmFsdWUocHJvcCBhcyBFbnRpdHlQcm9wLCBjb2x1bW4udmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFJlZ2lzdGVyaW5nICR7ZW50aXR5LnRhYmxlfSAtICR7aW5zcGVjdChyb3csIGZhbHNlLCBudWxsLCB0cnVlKX1gKSk7XG4gICAgY29uc3QgcmVmID0gdGhpcy5idWlsZGVyLnJlZ2lzdGVyKGVudGl0eS50YWJsZSwgcm93KTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAuc2V0KGZpeHR1cmUuZml4dHVyZUlkLCByZWYpO1xuICAgIHRoaXMudXVpZFRvRml4dHVyZUlkLnNldChyZWYudXVpZCwgZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6zrn7wg6rCSIOuzgO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0Q29sdW1uVmFsdWUocHJvcDogRW50aXR5UHJvcCwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIC8vIFVwc2VydEJ1aWxkZXIucmVnaXN0ZXLsl5DshJwgSlNPTi5zdHJpbmdpZnkg7LKY66as7ZWY66+A66GcIG9iamVjdCDqt7jrjIDroZwg7KCE64usXG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDthYzsnbTruJQg7Iic7IScIOy2lOy2nCAoZml4dHVyZXPsl5Ag7Y+s7ZWo65CcIO2FjOydtOu4lOunjClcbiAgICovXG4gIHByaXZhdGUgZ2V0VGFibGVPcmRlcihmaXh0dXJlczogRml4dHVyZVJlY29yZFtdKTogKGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kKVtdIHtcbiAgICBjb25zdCB0YWJsZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGlmICghc2Vlbi5oYXMoZW50aXR5LnRhYmxlKSkge1xuICAgICAgICBzZWVuLmFkZChlbnRpdHkudGFibGUpO1xuICAgICAgICB0YWJsZXMucHVzaChlbnRpdHkudGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YWJsZXMgYXMgKGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kKVtdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWFueVRvTWFueVJlbGF0aW9ucyhcbiAgICB0cng6IEtuZXguVHJhbnNhY3Rpb24sXG4gICAgZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSxcbiAgICBpbnNlcnRlZElkc0J5VGFibGU6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIG51bWJlcj4+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgICAgY29uc3Qgc291cmNlUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChmaXh0dXJlLmZpeHR1cmVJZCk7XG5cbiAgICAgIGlmICghc291cmNlUmVmKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qgc291cmNlVXVpZFRvSWQgPSBpbnNlcnRlZElkc0J5VGFibGUuZ2V0KGVudGl0eS50YWJsZSk7XG4gICAgICBjb25zdCBzb3VyY2VJZCA9IHNvdXJjZVV1aWRUb0lkPy5nZXQoc291cmNlUmVmLnV1aWQpO1xuXG4gICAgICBpZiAoc291cmNlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgWywgY29sdW1uXSBvZiBPYmplY3QuZW50cmllcyhmaXh0dXJlLmNvbHVtbnMpKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBjb2x1bW4ucHJvcDtcblxuICAgICAgICBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHByb3ApICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnZhbHVlKSkge1xuICAgICAgICAgIC8vIOyEoO2DneuQmOyngCDslYrsnYAgTWFueVRvTWFueSDqtIDqs4TripQg7KCA7J6l7ZWY7KeAIOyViuydjFxuICAgICAgICAgIGNvbnN0IHRhcmdldFRhYmxlID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBpZiAodGhpcy5idWlsZGVyLmhhc1RhYmxlKHRhcmdldFRhYmxlLnRhYmxlKSA9PT0gZmFsc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkcyA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBpZiAocmVsYXRlZElkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3Qgam9pblRhYmxlID0gKHByb3AgYXMgTWFueVRvTWFueVJlbGF0aW9uUHJvcCkuam9pblRhYmxlO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxhdGVkRW50aXR5LnRhYmxlKX1faWRgO1xuXG4gICAgICAgICAgZm9yIChjb25zdCByZWxhdGVkSWQgb2YgcmVsYXRlZElkcykge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEZpeHR1cmVJZCA9IGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRSZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KHJlbGF0ZWRGaXh0dXJlSWQpO1xuXG4gICAgICAgICAgICBsZXQgdGFyZ2V0SWQ6IG51bWJlcjtcblxuICAgICAgICAgICAgaWYgKHJlbGF0ZWRSZWYpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChyZWxhdGVkRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IHJlbGF0ZWRVdWlkVG9JZD8uZ2V0KHJlbGF0ZWRSZWYudXVpZCk7XG5cbiAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgIGBSZWxhdGVkIGZpeHR1cmUgJHtyZWxhdGVkRml4dHVyZUlkfSBub3QgZm91bmQgaW4gaW5zZXJ0ZWRJZHMsIHNraXBwaW5nYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVzb2x2ZWRJZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldElkID0gcmVsYXRlZElkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBKb2luVGFibGXsl5Ag7IK97J6FXG4gICAgICAgICAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgdHJ4KGpvaW5UYWJsZSlcbiAgICAgICAgICAgICAgLndoZXJlKHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubGltaXQoMSk7XG5cbiAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgYXdhaXQgdHJ4KGpvaW5UYWJsZSkuaW5zZXJ0KHtcbiAgICAgICAgICAgICAgICBbc291cmNlQ29sdW1uXTogc291cmNlSWQsXG4gICAgICAgICAgICAgICAgW3RhcmdldENvbHVtbl06IHRhcmdldElkLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgICAgICAgIGBJbnNlcnRlZCBpbnRvICR7am9pblRhYmxlfTogJHtlbnRpdHkudGFibGV9KCR7c291cmNlSWR9KSAtICR7cmVsYXRlZEVudGl0eS50YWJsZX0oJHt0YXJnZXRJZH0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tVbmlxdWVWaW9sYXRpb24oZGI6IEtuZXgsIGVudGl0eTogRW50aXR5LCBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKSB7XG4gICAgY29uc3QgX3VuaXF1ZUluZGV4ZXMgPSBlbnRpdHkuaW5kZXhlcz8uZmlsdGVyKChpKSA9PiBpLnR5cGUgPT09IFwidW5pcXVlXCIpID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IF91bmlxdWVJbmRleGVzLmZpbHRlcigoaW5kZXgpID0+XG4gICAgICBpbmRleC5jb2x1bW5zLmV2ZXJ5KChjb2x1bW4pID0+ICFjb2x1bW4ubmFtZS5zdGFydHNXaXRoKGAke2VudGl0eS50YWJsZX1fX2ApKSxcbiAgICApO1xuICAgIGlmICh1bmlxdWVJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHVuaXF1ZVF1ZXJ5ID0gZGIoZW50aXR5LnRhYmxlKTtcbiAgICBsZXQgaGFzQ29uZGl0aW9uID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHVuaXF1ZUluZGV4ZXMpIHtcbiAgICAgIC8vIOy7rOufvCDspJEg7ZWY64KY652864+EIG51bGzsnbTrqbQg7Jyg64uI7YGsIOygnOyVveydhCDsnITrsJjtlZjsp4Ag7JWK6riwIOuVjOusuOyXkCDtlbTri7kg7J24642x7Iqk64qUIOustOyLnFxuICAgICAgY29uc3QgY29udGFpbnNOdWxsID0gaW5kZXguY29sdW1ucy5zb21lKChjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG4gICAgICAgIHJldHVybiBmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSA9PT0gbnVsbDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbnRhaW5zTnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdW5pcXVlUXVlcnkgPSB1bmlxdWVRdWVyeS5vcldoZXJlKChxYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBpbmRleC5jb2x1bW5zKSB7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4ubmFtZS5yZXBsYWNlKC9faWQkLywgXCJcIik7XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaXh0dXJlLmNvbHVtbnNbZmllbGRdPy52YWx1ZSkpIHtcbiAgICAgICAgICAgIHFiLndoZXJlSW4oY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0udmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBxYi5hbmRXaGVyZShjb2x1bW4ubmFtZSwgZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBoYXNDb25kaXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICghaGFzQ29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBbdW5pcXVlRm91bmRdID0gYXdhaXQgdW5pcXVlUXVlcnk7XG4gICAgcmV0dXJuIHVuaXF1ZUZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICBkYjogS25leCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBmaXh0dXJlOiBGaXh0dXJlUmVjb3JkLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ2xhdXNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgLy8gcmVsYXRpb24g7ZWE65Oc7J24IOqyveyasCBfaWQg67aZ7J206riwXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uKTtcbiAgICAgIGNvbnN0IGRiQ29sdW1uID0gcHJvcCAmJiBpc1JlbGF0aW9uUHJvcChwcm9wKSA/IGAke2NvbHVtbn1faWRgIDogY29sdW1uO1xuICAgICAgY29uc3QgdmFsdWUgPSBmaXh0dXJlLmNvbHVtbnNbY29sdW1uXT8udmFsdWU7XG5cbiAgICAgIC8vIG51bGwg6rCS7J20IO2PrO2VqOuQnCDqsr3smrAg7KSR67O1IO2ZleyduCDsiqTtgrVcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB3aGVyZUNsYXVzZVtkYkNvbHVtbl0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBbZm91bmRdID0gYXdhaXQgZGIoZW50aXR5LnRhYmxlKS53aGVyZSh3aGVyZUNsYXVzZSkubGltaXQoMSk7XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgYXN5bmMgYWRkRml4dHVyZUxvYWRlcihjb2RlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gYCR7U29uYW11LmFwaVJvb3RQYXRofS9zcmMvdGVzdGluZy9maXh0dXJlLnRzYDtcbiAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGVTeW5jKHBhdGgpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyU3RhcnQgPSBjb250ZW50LmluZGV4T2YoXCJjb25zdCBmaXh0dXJlTG9hZGVyID0ge1wiKTtcbiAgICBjb25zdCBmaXh0dXJlTG9hZGVyRW5kID0gY29udGVudC5pbmRleE9mKFwifTtcIiwgZml4dHVyZUxvYWRlclN0YXJ0KTtcblxuICAgIGlmIChmaXh0dXJlTG9hZGVyU3RhcnQgIT09IC0xICYmIGZpeHR1cmVMb2FkZXJFbmQgIT09IC0xKSB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gYCR7Y29udGVudC5zbGljZSgwLCBmaXh0dXJlTG9hZGVyRW5kKX0gICR7Y29kZX1cXG4ke2NvbnRlbnQuc2xpY2UoZml4dHVyZUxvYWRlckVuZCl9YDtcblxuICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBuZXdDb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgZml4dHVyZUxvYWRlciBpbiBmaXh0dXJlLnRzXCIpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRml4dHVyZU1hbmFnZXIgPSBuZXcgRml4dHVyZU1hbmFnZXJDbGFzcygpO1xuIl0sIm5hbWVzIjpbImFzc2VydCIsImNoYWxrIiwiZXhlY1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiaW5mbGVjdGlvbiIsImtuZXgiLCJ1bmlxdWUiLCJpbnNwZWN0IiwiU29uYW11IiwiQmFzZU1vZGVsIiwiVXBzZXJ0QnVpbGRlciIsIkVudGl0eU1hbmFnZXIiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzSGFzTWFueVJlbGF0aW9uUHJvcCIsImlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVmlydHVhbFByb3AiLCJSZWxhdGlvbkdyYXBoIiwiRml4dHVyZU1hbmFnZXJDbGFzcyIsIl90ZGIiLCJ0ZGIiLCJFcnJvciIsIl9mZGIiLCJmZGIiLCJjYWNoZWRUYWJsZU5hbWVzIiwicmVsYXRpb25HcmFwaCIsImJ1aWxkZXIiLCJmaXh0dXJlUmVmTWFwIiwiTWFwIiwidXVpZFRvRml4dHVyZUlkIiwic2tpcHBlZEZpeHR1cmVzIiwiaW5pdCIsImRiQ29uZmlnIiwidGVzdCIsInByb2R1Y3Rpb25fbWFzdGVyIiwidENvbm4iLCJjb25uZWN0aW9uIiwicENvbm4iLCJob3N0IiwicG9ydCIsImRhdGFiYXNlIiwiZml4dHVyZV9yZW1vdGUiLCJnZXRDaGVja3N1bSIsImRiIiwidGFibGVOYW1lIiwiY2hlY2tzdW1Sb3ciLCJyYXciLCJDaGVja3N1bSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJ2aXNpdGVkUmVjb3JkcyIsIlNldCIsImltcG9ydEZpeHR1cmUiLCJlbnRpdHlJZCIsImlkcyIsImNsZWFyIiwicXVlcmllcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJpZCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsInJzaCIsImNvbnNvbGUiLCJsb2ciLCJpbmZvIiwiZmllbGQiLCJyZWNvcmRLZXkiLCJoYXMiLCJhZGQiLCJlbnRpdHkiLCJnZXQiLCJyb3ciLCJ0YWJsZSIsIndoZXJlIiwibGltaXQiLCJ1bmRlZmluZWQiLCJmaXh0dXJlRGF0YWJhc2UiLCJyZWFsRGF0YWJhc2UiLCJzZWxmUXVlcnkiLCJhcmdzIiwiT2JqZWN0IiwiZW50cmllcyIsInJlbGF0aW9ucyIsImZpbHRlciIsInJlbGF0aW9uIiwiY3VzdG9tSm9pbkNsYXVzZSIsImhhc0pvaW5Db2x1bW4iLCJyZWxhdGVkRW50aXR5Iiwid2l0aCIsInJlbGF0ZWRJZENvbHVtbk5hbWUiLCJwcm9wcyIsImZpbmQiLCJwIiwibmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZGVzdHJveSIsImdldEZpeHR1cmVzIiwic291cmNlREJOYW1lIiwidGFyZ2V0REJOYW1lIiwic2VhcmNoT3B0aW9ucyIsImR1cGxpY2F0ZUNoZWNrIiwic291cmNlREIiLCJ0YXJnZXREQiIsInZhbHVlIiwic2VhcmNoVHlwZSIsImNvbHVtbiIsInByb3AiLCJ0eXBlIiwicm93cyIsImxlbmd0aCIsImZpeHR1cmVzIiwiaW5pdGlhbFJlY29yZHNMZW5ndGgiLCJuZXdSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInB1c2giLCJjdXJyZW50Rml4dHVyZVJlY29yZCIsInIiLCJmaXh0dXJlSWQiLCJmZXRjaGVkUmVjb3JkcyIsInNsaWNlIiwiZml4dHVyZSIsImN1c3RvbUNvbHVtbnMiLCJjb2x1bW5zIiwiY3VzdG9tRHVwbGljYXRlUm93IiwiY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMiLCJyZWNvcmQiLCJzaW5nbGVSZWNvcmQiLCJ0YXJnZXQiLCJ1bmlxdWVSb3ciLCJjaGVja1VuaXF1ZVZpb2xhdGlvbiIsImYiLCJvcHRpb25zIiwicmVjb3JkcyIsInZpc2l0ZWRFbnRpdGllcyIsImNyZWF0ZSIsImJlbG9uZ3NSZWNvcmRzIiwidGhyb3VnaFRhYmxlIiwiam9pblRhYmxlIiwiZnJvbUNvbHVtbiIsInNpbmd1bGFyaXplIiwidG9Db2x1bW4iLCJyZWxhdGVkSWRzIiwicGx1Y2siLCJqb2luQ29sdW1uIiwicmVsYXRlZFByb3AiLCJyZWxhdGVkUm93IiwiZmlyc3QiLCJyZWxhdGVkSWQiLCJpbnNlcnRGaXh0dXJlcyIsImRiTmFtZSIsIl9maXh0dXJlcyIsInJlc3VsdHMiLCJidWlsZEdyYXBoIiwiaW5zZXJ0aW9uT3JkZXIiLCJnZXRJbnNlcnRpb25PcmRlciIsImhhc1RhcmdldCIsImhhc1VuaXF1ZSIsImhhc0R1cGxpY2F0ZSIsIm92ZXJyaWRlIiwiZXhpc3RpbmdJZCIsInNldCIsInllbGxvdyIsInJlZ2lzdGVyRml4dHVyZSIsImJsdWUiLCJ0YWJsZU9yZGVyIiwiZ2V0VGFibGVPcmRlciIsInRyYW5zYWN0aW9uIiwidHJ4IiwiaW5zZXJ0ZWRJZHNCeVRhYmxlIiwiaGFzVGFibGUiLCJnZXRUYWJsZSIsInV1aWRzIiwidXVpZCIsInVwc2VydCIsInV1aWRUb0lkIiwic2VsZWN0Iiwid2hlcmVJbiIsInByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zIiwic2tpcHBlZCIsImRhdGEiLCJyZWYiLCJpbnNlcnRlZElkIiwiZ3JlZW4iLCJleGlzdGluZ1JlY29yZCIsImlzT3ZlcnJpZGVNb2RlIiwicHJvcE5hbWUiLCJyZWxhdGVkRml4dHVyZUlkIiwic2tpcHBlZEV4aXN0aW5nSWQiLCJyZWxhdGVkUmVmIiwiY29udmVydENvbHVtblZhbHVlIiwicmVnaXN0ZXIiLCJEYXRlIiwidGFibGVzIiwic2VlbiIsInNvdXJjZVJlZiIsInNvdXJjZVV1aWRUb0lkIiwic291cmNlSWQiLCJBcnJheSIsImlzQXJyYXkiLCJ0YXJnZXRUYWJsZSIsInNvdXJjZUNvbHVtbiIsInRhcmdldENvbHVtbiIsInRhcmdldElkIiwicmVsYXRlZFV1aWRUb0lkIiwicmVzb2x2ZWRJZCIsIndhcm4iLCJmb3VuZCIsImluc2VydCIsIl91bmlxdWVJbmRleGVzIiwiaW5kZXhlcyIsImkiLCJ1bmlxdWVJbmRleGVzIiwiaW5kZXgiLCJldmVyeSIsInN0YXJ0c1dpdGgiLCJ1bmlxdWVRdWVyeSIsImhhc0NvbmRpdGlvbiIsImNvbnRhaW5zTnVsbCIsInNvbWUiLCJyZXBsYWNlIiwib3JXaGVyZSIsInFiIiwiYW5kV2hlcmUiLCJ1bmlxdWVGb3VuZCIsIndoZXJlQ2xhdXNlIiwiZGJDb2x1bW4iLCJhZGRGaXh0dXJlTG9hZGVyIiwiY29kZSIsInBhdGgiLCJhcGlSb290UGF0aCIsImNvbnRlbnQiLCJ0b1N0cmluZyIsImZpeHR1cmVMb2FkZXJTdGFydCIsImluZGV4T2YiLCJmaXh0dXJlTG9hZGVyRW5kIiwibmV3Q29udGVudCIsIkZpeHR1cmVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFDekMsU0FBU0MsWUFBWSxFQUFFQyxhQUFhLFFBQVEsS0FBSztBQUNqRCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxPQUFPQyxVQUF5QixPQUFPO0FBQ3ZDLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLE9BQU8sUUFBUSxPQUFPO0FBQy9CLFNBQVNDLE1BQU0sUUFBUSxrQkFBUztBQUNoQyxTQUFTQyxTQUFTLFFBQVEsNEJBQXlCO0FBRW5ELFNBQXFCQyxhQUFhLFFBQVEsZ0NBQTZCO0FBRXZFLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FNRUMsMEJBQTBCLEVBQzFCQyxxQkFBcUIsRUFDckJDLHdCQUF3QixFQUN4QkMsc0JBQXNCLEVBQ3RCQyxjQUFjLEVBQ2RDLGFBQWEsUUFFUixvQkFBaUI7QUFDeEIsU0FBU0MsYUFBYSxRQUFRLHVCQUFvQjtBQVNsRCxPQUFPLE1BQU1DO0lBQ0hDLE9BQW9CLEtBQUs7SUFDakMsSUFBSUMsSUFBSUEsR0FBUyxFQUFFO1FBQ2pCLElBQUksQ0FBQ0QsSUFBSSxHQUFHQztJQUNkO0lBQ0EsSUFBSUEsTUFBWTtRQUNkLElBQUksSUFBSSxDQUFDRCxJQUFJLEtBQUssTUFBTTtZQUN0QixNQUFNLElBQUlFLE1BQU07UUFDbEI7UUFDQSxPQUFPLElBQUksQ0FBQ0YsSUFBSTtJQUNsQjtJQUVRRyxPQUFvQixLQUFLO0lBQ2pDLElBQUlDLElBQUlBLEdBQVMsRUFBRTtRQUNqQixJQUFJLENBQUNELElBQUksR0FBR0M7SUFDZDtJQUNBLElBQUlBLE1BQVk7UUFDZCxJQUFJLElBQUksQ0FBQ0QsSUFBSSxLQUFLLE1BQU07WUFDdEIsTUFBTSxJQUFJRCxNQUFNO1FB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
|