sonamu 0.7.18 → 0.7.20

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.
Files changed (67) hide show
  1. package/dist/api/config.d.ts +21 -3
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/context.d.ts +3 -3
  5. package/dist/api/context.d.ts.map +1 -1
  6. package/dist/api/context.js +1 -1
  7. package/dist/api/decorators.d.ts.map +1 -1
  8. package/dist/api/decorators.js +4 -8
  9. package/dist/api/index.d.ts +0 -2
  10. package/dist/api/index.d.ts.map +1 -1
  11. package/dist/api/index.js +1 -3
  12. package/dist/api/sonamu.d.ts +5 -3
  13. package/dist/api/sonamu.d.ts.map +1 -1
  14. package/dist/api/sonamu.js +10 -8
  15. package/dist/bin/cli.js +3 -3
  16. package/dist/database/db.d.ts +2 -2
  17. package/dist/database/db.d.ts.map +1 -1
  18. package/dist/database/db.js +23 -30
  19. package/dist/index.d.ts +0 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -2
  22. package/dist/storage/drivers.d.ts +14 -0
  23. package/dist/storage/drivers.d.ts.map +1 -0
  24. package/dist/storage/drivers.js +11 -0
  25. package/dist/storage/index.d.ts +5 -0
  26. package/dist/storage/index.d.ts.map +1 -0
  27. package/dist/storage/index.js +6 -0
  28. package/dist/storage/storage-manager.d.ts +21 -0
  29. package/dist/storage/storage-manager.d.ts.map +1 -0
  30. package/dist/storage/storage-manager.js +33 -0
  31. package/dist/storage/types.d.ts +12 -0
  32. package/dist/storage/types.d.ts.map +1 -0
  33. package/dist/storage/types.js +5 -0
  34. package/dist/storage/uploaded-file.d.ts +35 -0
  35. package/dist/storage/uploaded-file.d.ts.map +1 -0
  36. package/dist/storage/uploaded-file.js +58 -0
  37. package/dist/template/implementations/services.template.d.ts.map +1 -1
  38. package/dist/template/implementations/services.template.js +8 -5
  39. package/dist/testing/fixture-manager.d.ts.map +1 -1
  40. package/dist/testing/fixture-manager.js +4 -4
  41. package/dist/ui-web/assets/{index-DFqVuxOB.js → index-B87IyofX.js} +1 -1
  42. package/dist/ui-web/index.html +1 -1
  43. package/package.json +6 -1
  44. package/src/api/config.ts +21 -3
  45. package/src/api/context.ts +3 -3
  46. package/src/api/decorators.ts +3 -8
  47. package/src/api/index.ts +0 -2
  48. package/src/api/sonamu.ts +12 -9
  49. package/src/bin/cli.ts +2 -2
  50. package/src/database/db.ts +40 -43
  51. package/src/index.ts +0 -1
  52. package/src/storage/drivers.ts +15 -0
  53. package/src/storage/index.ts +5 -0
  54. package/src/storage/storage-manager.ts +39 -0
  55. package/src/storage/types.ts +12 -0
  56. package/src/storage/uploaded-file.ts +81 -0
  57. package/src/template/implementations/service.template.ts.txt +328 -0
  58. package/src/template/implementations/services.template.ts +7 -4
  59. package/src/testing/fixture-manager.ts +3 -4
  60. package/dist/file-storage/driver.d.ts +0 -48
  61. package/dist/file-storage/driver.d.ts.map +0 -1
  62. package/dist/file-storage/driver.js +0 -79
  63. package/dist/file-storage/file-storage.d.ts +0 -50
  64. package/dist/file-storage/file-storage.d.ts.map +0 -1
  65. package/dist/file-storage/file-storage.js +0 -75
  66. package/src/file-storage/driver.ts +0 -131
  67. package/src/file-storage/file-storage.ts +0 -100
@@ -52,7 +52,7 @@ export class FixtureManagerClass {
52
52
  }
53
53
  }
54
54
  this.tdb = knex(Sonamu.dbConfig.test);
55
- this.fdb = knex(Sonamu.dbConfig.fixture_remote);
55
+ this.fdb = knex(Sonamu.dbConfig.fixture);
56
56
  }
57
57
  async getChecksum(db, tableName) {
58
58
  const [[checksumRow]] = await db.raw(`CHECKSUM TABLE ${tableName}`);
@@ -62,7 +62,7 @@ export class FixtureManagerClass {
62
62
  원격 fixture DB를 로컬 test DB로 복사합니다.
63
63
  pg_dump로 원격 DB를 덤프하고, pg_restore로 로컬에 복원합니다.
64
64
  */ async sync() {
65
- const fixtureConn = Sonamu.dbConfig.fixture_remote.connection;
65
+ const fixtureConn = Sonamu.dbConfig.fixture.connection;
66
66
  const testConn = Sonamu.dbConfig.test.connection;
67
67
  // 1. 로컬 test DB 연결 종료 및 재생성
68
68
  const testPgEnv = {
@@ -145,7 +145,7 @@ export class FixtureManagerClass {
145
145
  throw new Error(`${entityId}#${id} row를 찾을 수 없습니다.`);
146
146
  }
147
147
  // 픽스쳐DB, 실DB
148
- const fixtureDatabase = Sonamu.dbConfig.fixture_remote.connection.database;
148
+ const fixtureDatabase = Sonamu.dbConfig.fixture.connection.database;
149
149
  const realDatabase = Sonamu.dbConfig.production_master.connection.database;
150
150
  const selfQuery = `INSERT IGNORE INTO \`${fixtureDatabase}\`.\`${entity.table}\` (SELECT * FROM \`${realDatabase}\`.\`${entity.table}\` WHERE \`id\` = ${id})`;
151
151
  const args = Object.entries(entity.relations).filter(([, relation])=>isBelongsToOneRelationProp(relation) || isOneToOneRelationProp(relation) && relation.customJoinClause === undefined).map(([, relation])=>{
@@ -620,4 +620,4 @@ export class FixtureManagerClass {
620
620
  }
621
621
  export const FixtureManager = new FixtureManagerClass();
622
622
 
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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
623
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgaW5zcGVjdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiLi4vZGF0YWJhc2UvYmFzZS1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVEQkNvbmZpZyB9IGZyb20gXCIuLi9kYXRhYmFzZS9kYlwiO1xuaW1wb3J0IHsgdHlwZSBVQlJlZiwgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuLi9kYXRhYmFzZS91cHNlcnQtYnVpbGRlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBGaXh0dXJlSW1wb3J0UmVzdWx0LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0hhc01hbnlSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbFByb3AsXG4gIHR5cGUgTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbkdyYXBoIH0gZnJvbSBcIi4vX3JlbGF0aW9uLWdyYXBoXCI7XG5cbi8qKiDsgqzsmqnsnpAg7KeA7KCVIOykkeuztSDtmZXsnbgg7Lus65+8IChlbnRpdHlJZOuzhOuhnCDsp4DsoJUpICovXG5leHBvcnQgaW50ZXJmYWNlIER1cGxpY2F0ZUNoZWNrT3B0aW9ucyB7XG4gIGNvbHVtbnM/OiB7XG4gICAgW2VudGl0eUlkOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEZpeHR1cmVNYW5hZ2VyQ2xhc3Mge1xuICBwcml2YXRlIF90ZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IHRkYih0ZGI6IEtuZXgpIHtcbiAgICB0aGlzLl90ZGIgPSB0ZGI7XG4gIH1cbiAgZ2V0IHRkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fdGRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90ZGI7XG4gIH1cblxuICBwcml2YXRlIF9mZGI6IEtuZXggfCBudWxsID0gbnVsbDtcbiAgc2V0IGZkYihmZGI6IEtuZXgpIHtcbiAgICB0aGlzLl9mZGIgPSBmZGI7XG4gIH1cbiAgZ2V0IGZkYigpOiBLbmV4IHtcbiAgICBpZiAodGhpcy5fZmRiID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaXh0dXJlTWFuYWdlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mZGI7XG4gIH1cbiAgY2FjaGVkVGFibGVOYW1lczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlbGF0aW9uR3JhcGggPSBuZXcgUmVsYXRpb25HcmFwaCgpO1xuXG4gIC8vIFVwc2VydEJ1aWxkZXIg6riw67CYIGltcG9ydOulvCDsnITtlZwg7IOB7YOcXG4gIHByaXZhdGUgYnVpbGRlcjogVXBzZXJ0QnVpbGRlciA9IG5ldyBVcHNlcnRCdWlsZGVyKCk7XG4gIHByaXZhdGUgZml4dHVyZVJlZk1hcDogTWFwPHN0cmluZywgVUJSZWY+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHV1aWRUb0ZpeHR1cmVJZDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBza2lwcGVkRml4dHVyZXM6IE1hcDxzdHJpbmcsIHsgZW50aXR5SWQ6IHN0cmluZzsgZXhpc3RpbmdJZDogbnVtYmVyIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuX3RkYiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoU29uYW11LmRiQ29uZmlnLnRlc3QgJiYgU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKSB7XG4gICAgICBjb25zdCB0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBDb25uID0gU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnICYge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIGlmIChcbiAgICAgICAgYCR7dENvbm4uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke3RDb25uLnBvcnQgPz8gNTQzMn0vJHt0Q29ubi5kYXRhYmFzZX1gID09PVxuICAgICAgICBgJHtwQ29ubi5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7cENvbm4ucG9ydCA/PyA1NDMyfS8ke3BDb25uLmRhdGFiYXNlfWBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2FjOyKpO2KuERC7JmAIO2UhOuhnOuNleyFmERC7JeQIOuPmeydvO2VnCDrjbDsnbTthLDrsqDsnbTsiqTqsIAg7IKs7Jqp65CY7JeI7Iq164uI64ukLmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGRiID0ga25leChTb25hbXUuZGJDb25maWcudGVzdCk7XG4gICAgdGhpcy5mZGIgPSBrbmV4KFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlKTtcbiAgfVxuXG4gIGFzeW5jIGdldENoZWNrc3VtKGRiOiBLbmV4LCB0YWJsZU5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IFtbY2hlY2tzdW1Sb3ddXSA9IGF3YWl0IGRiLnJhdyhgQ0hFQ0tTVU0gVEFCTEUgJHt0YWJsZU5hbWV9YCk7XG4gICAgcmV0dXJuIGNoZWNrc3VtUm93LkNoZWNrc3VtO1xuICB9XG5cbiAgLyoqXG4gICAg7JuQ6rKpIGZpeHR1cmUgRELrpbwg66Gc7LusIHRlc3QgRELroZwg67O17IKs7ZWp64uI64ukLlxuICAgIHBnX2R1bXDroZwg7JuQ6rKpIERC66W8IOuNpO2UhO2VmOqzoCwgcGdfcmVzdG9yZeuhnCDroZzsu6zsl5Ag67O17JuQ7ZWp64uI64ukLlxuICAqL1xuICBhc3luYyBzeW5jKCkge1xuICAgIGNvbnN0IGZpeHR1cmVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgICBjb25zdCB0ZXN0Q29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWc7XG5cbiAgICAvLyAxLiDroZzsu6wgdGVzdCBEQiDsl7DqsrAg7KKF66OMIOuwjyDsnqzsg53shLFcbiAgICBjb25zdCB0ZXN0UGdFbnYgPSB7IFBHUEFTU1dPUkQ6IHRlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCIgfTtcbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJcbiAgICAgICAgU0VMRUNUIHBnX3Rlcm1pbmF0ZV9iYWNrZW5kKHBnX3N0YXRfYWN0aXZpdHkucGlkKVxuICAgICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgICAgV0hFUkUgZGF0bmFtZSA9ICcke3Rlc3RDb25uLmRhdGFiYXNlfSdcbiAgICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKCk7XG4gICAgICBcImAsXG4gICAgICB7IHN0ZGlvOiBcImluaGVyaXRcIiwgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi50ZXN0UGdFbnYgfSBhcyBOb2RlSlMuUHJvY2Vzc0VudiB9LFxuICAgICk7XG5cbiAgICBleGVjU3luYyhcbiAgICAgIGBwc3FsIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgcG9zdGdyZXMgLWMgXCJEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIGV4ZWNTeW5jKFxuICAgICAgYHBzcWwgLWggJHt0ZXN0Q29ubi5ob3N0fSAtcCAke3Rlc3RDb25uLnBvcnQgPz8gNTQzMn0gLVUgJHt0ZXN0Q29ubi51c2VyfSAtZCBwb3N0Z3JlcyAtYyBcIkNSRUFURSBEQVRBQkFTRSBcXFxcXCIke3Rlc3RDb25uLmRhdGFiYXNlfVxcXFxcIlwiYCxcbiAgICAgIHsgc3RkaW86IFwiaW5oZXJpdFwiLCBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRlc3RQZ0VudiB9IGFzIE5vZGVKUy5Qcm9jZXNzRW52IH0sXG4gICAgKTtcblxuICAgIC8vIDIuIOybkOqyqSBmaXh0dXJlIERCIOKGkiDroZzsu6wgdGVzdCBEQuuhnCDrs7XsgqwgKHBnX2R1bXAgfCBwZ19yZXN0b3JlKVxuICAgIGNvbnN0IGZpeHR1cmVQZ0VudiA9IHsgUEdQQVNTV09SRDogZml4dHVyZUNvbm4ucGFzc3dvcmQgfHwgXCJcIiB9O1xuICAgIGNvbnN0IGR1bXBDbWQgPSBgcGdfZHVtcCAtaCAke2ZpeHR1cmVDb25uLmhvc3R9IC1wICR7Zml4dHVyZUNvbm4ucG9ydCA/PyA1NDMyfSAtVSAke2ZpeHR1cmVDb25uLnVzZXJ9IC1kICR7Zml4dHVyZUNvbm4uZGF0YWJhc2V9IC1GY2A7XG4gICAgY29uc3QgcmVzdG9yZUNtZCA9IGBwZ19yZXN0b3JlIC1oICR7dGVzdENvbm4uaG9zdH0gLXAgJHt0ZXN0Q29ubi5wb3J0ID8/IDU0MzJ9IC1VICR7dGVzdENvbm4udXNlcn0gLWQgJHt0ZXN0Q29ubi5kYXRhYmFzZX0gLS1uby1vd25lciAtLW5vLWFjbGA7XG5cbiAgICBleGVjU3luYyhgJHtkdW1wQ21kfSB8IFBHUEFTU1dPUkQ9XCIke3Rlc3RDb25uLnBhc3N3b3JkIHx8IFwiXCJ9XCIgJHtyZXN0b3JlQ21kfWAsIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZml4dHVyZVBnRW52IH0gYXMgTm9kZUpTLlByb2Nlc3NFbnYsXG4gICAgICBzaGVsbDogXCIvYmluL2Jhc2hcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzaXRlZFJlY29yZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgYXN5bmMgaW1wb3J0Rml4dHVyZShlbnRpdHlJZDogc3RyaW5nLCBpZHM6IG51bWJlcltdKSB7XG4gICAgLy8g67Cp66y4IOq4sOuhnSDstIjquLDtmZQgKOyDiOuhnOyatCBpbXBvcnQg7J6R7JeFIOyLnOyekSlcbiAgICB0aGlzLnZpc2l0ZWRSZWNvcmRzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBxdWVyaWVzID0gdW5pcXVlKFxuICAgICAgKFxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBpZHMubWFwKGFzeW5jIChpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZCwgXCJpZFwiLCBpZCk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpLFxuICAgICk7XG5cbiAgICBjb25zdCB3ZGIgPSBCYXNlTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGZvciAoY29uc3QgcXVlcnkgb2YgcXVlcmllcykge1xuICAgICAgY29uc3QgW3JzaF0gPSBhd2FpdCB3ZGIucmF3KHF1ZXJ5KTtcbiAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGluZm86IHJzaC5pbmZvLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0SW1wb3J0UXVlcmllcyhlbnRpdHlJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCBpZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2VudGl0eUlkfSMke2ZpZWxkfSMke2lkfWA7XG5cbiAgICAvLyDsiJztmZgg7LC47KGwIOuwqeyngDog7J2066+4IOuwqeusuO2VnCDroIjsvZTrk5zripQg7Iqk7YK1XG4gICAgaWYgKHRoaXMudmlzaXRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhpcy52aXNpdGVkUmVjb3Jkcy5hZGQocmVjb3JkS2V5KTtcblxuICAgIGNvbnNvbGUubG9nKHsgZW50aXR5SWQsIGZpZWxkLCBpZCB9KTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3Qgd2RiID0gQmFzZU1vZGVsLmdldERCKFwid1wiKTtcblxuICAgIC8vIOyXrOq4sOyEnCDsi6REQuydmCByb3cg6rCA7KC47Ji0XG4gICAgY29uc3QgW3Jvd10gPSBhd2FpdCB3ZGIoZW50aXR5LnRhYmxlKS53aGVyZShmaWVsZCwgaWQpLmxpbWl0KDEpO1xuICAgIGlmIChyb3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfSMke2lkfSByb3frpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7ZS97Iqk7LOQREIsIOyLpERCXG4gICAgY29uc3QgZml4dHVyZURhdGFiYXNlID0gKFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKS5kYXRhYmFzZTtcbiAgICBjb25zdCByZWFsRGF0YWJhc2UgPSAoU29uYW11LmRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKVxuICAgICAgLmRhdGFiYXNlO1xuXG4gICAgY29uc3Qgc2VsZlF1ZXJ5ID0gYElOU0VSVCBJR05PUkUgSU5UTyBcXGAke2ZpeHR1cmVEYXRhYmFzZX1cXGAuXFxgJHtlbnRpdHkudGFibGV9XFxgIChTRUxFQ1QgKiBGUk9NIFxcYCR7cmVhbERhdGFiYXNlfVxcYC5cXGAke2VudGl0eS50YWJsZX1cXGAgV0hFUkUgXFxgaWRcXGAgPSAke2lkfSlgO1xuXG4gICAgY29uc3QgYXJncyA9IE9iamVjdC5lbnRyaWVzKGVudGl0eS5yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoWywgcmVsYXRpb25dKSA9PlxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSAmJiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlID09PSB1bmRlZmluZWQpLFxuICAgICAgKVxuICAgICAgLm1hcCgoWywgcmVsYXRpb25dKSA9PiB7XG4gICAgICAgIC8qXG4gICAgICAgIEJlbG9uZ3NUb09uZeyduCDqsr3smrBcbiAgICAgICAgICBDYXRlZ29yeSAvICdpZCcgLyByb3dbY2F0ZWdvcnlfaWRdIO2YuOy2nFxuICAgICAgICBPbmVUb09uZeyXkCBqb2luQ29sdW1uID09PSB0cnVlIOyduCDqsr3smrBcbiAgICAgICAgICBQcm9maWxlIC8gJ2lkJyAvIHJvd1twcm9maWxlX2lkXSDtmLjstpxcbiAgICAgICAgT25lVG9PbmXsl5Agam9pbkNvbHVtbiA9PT0gZmFsc2Ug7J24IOqyveyasFxuICAgICAgICAgIFByb2ZpbGUgLyAncHJvZmlsZV9pZCcgLyByb3dbJ2lkJ10g7Zi47LacXG4gICAgICAgICovXG4gICAgICAgIGxldCBmaWVsZDogc3RyaW5nO1xuICAgICAgICBsZXQgaWQ6IG51bWJlcjtcbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pICYmICFyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZENvbHVtbk5hbWUgPSByZWxhdGVkRW50aXR5LnByb3BzLmZpbmQoXG4gICAgICAgICAgICAocCkgPT4gaXNSZWxhdGlvblByb3AocCkgJiYgcC53aXRoID09PSBlbnRpdHkuaWQsXG4gICAgICAgICAgKT8ubmFtZTtcbiAgICAgICAgICBpZiAoIXJlbGF0ZWRJZENvbHVtbk5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxhdGVkRW50aXR5LmlkfeydmCAke2VudGl0eS5pZH0g6rSA6rOEIO2UhOuhreydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmllbGQgPSBgJHtyZWxhdGVkSWRDb2x1bW5OYW1lfV9pZGA7XG4gICAgICAgICAgaWQgPSByb3cuaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGQgPSBcImlkXCI7XG4gICAgICAgICAgaWQgPSByb3dbYCR7cmVsYXRpb24ubmFtZX1faWRgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVudGl0eUlkOiByZWxhdGlvbi53aXRoLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGlkLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGFyZykgPT4gYXJnLmlkICE9PSBudWxsKTtcblxuICAgIGNvbnN0IHJlbFF1ZXJpZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGFyZ3MubWFwKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEltcG9ydFF1ZXJpZXMoYXJncy5lbnRpdHlJZCwgYXJncy5maWVsZCwgYXJncy5pZCk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFsuLi51bmlxdWUocmVsUXVlcmllcy5yZXZlcnNlKCkuZmxhdCgpKSwgc2VsZlF1ZXJ5XTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuX3RkYikge1xuICAgICAgYXdhaXQgdGhpcy5fdGRiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX3RkYiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZGIpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2ZkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9mZGIgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Rml4dHVyZXMoXG4gICAgc291cmNlREJOYW1lOiBrZXlvZiBTb25hbXVEQkNvbmZpZyxcbiAgICB0YXJnZXREQk5hbWU6IGtleW9mIFNvbmFtdURCQ29uZmlnLFxuICAgIHNlYXJjaE9wdGlvbnM6IEZpeHR1cmVTZWFyY2hPcHRpb25zLFxuICAgIGR1cGxpY2F0ZUNoZWNrPzogRHVwbGljYXRlQ2hlY2tPcHRpb25zLFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VEQiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW3NvdXJjZURCTmFtZV0pO1xuICAgIGNvbnN0IHRhcmdldERCID0ga25leChTb25hbXUuZGJDb25maWdbdGFyZ2V0REJOYW1lXSk7XG5cbiAgICBjb25zdCB7IGVudGl0eUlkLCBmaWVsZCwgdmFsdWUsIHNlYXJjaFR5cGUgfSA9IHNlYXJjaE9wdGlvbnM7XG5cbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgY29uc3QgY29sdW1uID1cbiAgICAgIGVudGl0eS5wcm9wcy5maW5kKChwcm9wKSA9PiBwcm9wLm5hbWUgPT09IGZpZWxkKT8udHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7ZmllbGR9X2lkYCA6IGZpZWxkO1xuXG4gICAgbGV0IHF1ZXJ5ID0gc291cmNlREIoZW50aXR5LnRhYmxlKTtcbiAgICBpZiAoc2VhcmNoVHlwZSA9PT0gXCJlcXVhbHNcIikge1xuICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZShjb2x1bW4sIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHNlYXJjaFR5cGUgPT09IFwibGlrZVwiKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKGNvbHVtbiwgXCJsaWtlXCIsIGAlJHt2YWx1ZX0lYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5O1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjb3JkcyBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXh0dXJlczogRml4dHVyZVJlY29yZFtdID0gW107XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgY29uc3QgaW5pdGlhbFJlY29yZHNMZW5ndGggPSBmaXh0dXJlcy5sZW5ndGg7XG4gICAgICBjb25zdCBuZXdSZWNvcmRzID0gYXdhaXQgdGhpcy5jcmVhdGVGaXh0dXJlUmVjb3JkKGVudGl0eSwgcm93LCB7XG4gICAgICAgIF9kYjogc291cmNlREIsXG4gICAgICB9KTtcbiAgICAgIGZpeHR1cmVzLnB1c2goLi4ubmV3UmVjb3Jkcyk7XG4gICAgICBjb25zdCBjdXJyZW50Rml4dHVyZVJlY29yZCA9IGZpeHR1cmVzLmZpbmQoKHIpID0+IHIuZml4dHVyZUlkID09PSBgJHtlbnRpdHlJZH0jJHtyb3cuaWR9YCk7XG5cbiAgICAgIGlmIChjdXJyZW50Rml4dHVyZVJlY29yZCkge1xuICAgICAgICAvLyDtmITsnqwgZml4dHVyZeuhnOu2gO2EsCDsg53shLHrkJwgZmV0Y2hlZFJlY29yZHMg7ISk7KCVXG4gICAgICAgIGN1cnJlbnRGaXh0dXJlUmVjb3JkLmZldGNoZWRSZWNvcmRzID0gZml4dHVyZXNcbiAgICAgICAgICAuZmlsdGVyKChyKSA9PiByLmZpeHR1cmVJZCAhPT0gY3VycmVudEZpeHR1cmVSZWNvcmQuZml4dHVyZUlkKVxuICAgICAgICAgIC5zbGljZShpbml0aWFsUmVjb3Jkc0xlbmd0aClcbiAgICAgICAgICAubWFwKChyKSA9PiByLmZpeHR1cmVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgLy8g7IKs7Jqp7J6QIOyngOyglSDsu6zrn7wg6riw7KSAIOykkeuztSDtmZXsnbgg4oaSIHRhcmdldFxuICAgICAgY29uc3QgY3VzdG9tQ29sdW1ucyA9IGR1cGxpY2F0ZUNoZWNrPy5jb2x1bW5zPy5bZml4dHVyZS5lbnRpdHlJZF07XG4gICAgICBpZiAoY3VzdG9tQ29sdW1ucyAmJiBjdXN0b21Db2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRHVwbGljYXRlUm93ID0gYXdhaXQgdGhpcy5jaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyhcbiAgICAgICAgICB0YXJnZXREQixcbiAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgZml4dHVyZSxcbiAgICAgICAgICBjdXN0b21Db2x1bW5zLFxuICAgICAgICApO1xuICAgICAgICBpZiAoY3VzdG9tRHVwbGljYXRlUm93KSB7XG4gICAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCBjdXN0b21EdXBsaWNhdGVSb3csIHtcbiAgICAgICAgICAgIHNpbmdsZVJlY29yZDogdHJ1ZSxcbiAgICAgICAgICAgIF9kYjogdGFyZ2V0REIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZml4dHVyZS50YXJnZXQgPSByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVW5pcXVlIGluZGV4IOq4sOykgCDspJHrs7Ug7ZmV7J24IOKGkiBmaXh0dXJlLnVuaXF1ZVxuICAgICAgY29uc3QgdW5pcXVlUm93ID0gYXdhaXQgdGhpcy5jaGVja1VuaXF1ZVZpb2xhdGlvbih0YXJnZXREQiwgZW50aXR5LCBmaXh0dXJlKTtcbiAgICAgIGlmICh1bmlxdWVSb3cpIHtcbiAgICAgICAgY29uc3QgW3JlY29yZF0gPSBhd2FpdCB0aGlzLmNyZWF0ZUZpeHR1cmVSZWNvcmQoZW50aXR5LCB1bmlxdWVSb3csIHtcbiAgICAgICAgICBzaW5nbGVSZWNvcmQ6IHRydWUsXG4gICAgICAgICAgX2RiOiB0YXJnZXREQixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpeHR1cmUudW5pcXVlID0gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRhcmdldERCLmRlc3Ryb3koKTtcbiAgICBhd2FpdCBzb3VyY2VEQi5kZXN0cm95KCk7XG5cbiAgICByZXR1cm4gdW5pcXVlKGZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICByb3c6IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9LFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzaW5nbGVSZWNvcmQ/OiBib29sZWFuO1xuICAgICAgX2RiPzogS25leDtcbiAgICB9LFxuICApOiBQcm9taXNlPEZpeHR1cmVSZWNvcmRbXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGNvbnN0IHZpc2l0ZWRFbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgY3JlYXRlID0gYXN5bmMgKFxuICAgICAgZW50aXR5OiBFbnRpdHksXG4gICAgICByb3c6IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICB9LFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgZml4dHVyZUlkID0gYCR7ZW50aXR5LmlkfSMke3Jvdy5pZH1gO1xuICAgICAgaWYgKHZpc2l0ZWRFbnRpdGllcy5oYXMoZml4dHVyZUlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aXNpdGVkRW50aXRpZXMuYWRkKGZpeHR1cmVJZCk7XG5cbiAgICAgIGNvbnN0IHJlY29yZDogRml4dHVyZVJlY29yZCA9IHtcbiAgICAgICAgZml4dHVyZUlkLFxuICAgICAgICBlbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICBjb2x1bW5zOiB7fSxcbiAgICAgICAgZmV0Y2hlZFJlY29yZHM6IFtdLFxuICAgICAgICBiZWxvbmdzUmVjb3JkczogW10sXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdID0ge1xuICAgICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgICAgdmFsdWU6IHJvd1twcm9wLm5hbWVdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRiID0gb3B0aW9ucz8uX2RiID8/IEJhc2VNb2RlbC5nZXREQihcIndcIik7XG4gICAgICAgIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0aHJvdWdoVGFibGUgPSBwcm9wLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCBmcm9tQ29sdW1uID0gYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpfV9pZGA7XG4gICAgICAgICAgY29uc3QgdG9Db2x1bW4gPSBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbGF0ZWRFbnRpdHkudGFibGUpfV9pZGA7XG5cbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIodGhyb3VnaFRhYmxlKS53aGVyZShmcm9tQ29sdW1uLCByb3cuaWQpLnBsdWNrKHRvQ29sdW1uKTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkcztcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkSWRzID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSlcbiAgICAgICAgICAgIC53aGVyZShwcm9wLmpvaW5Db2x1bW4sIHJvdy5pZClcbiAgICAgICAgICAgIC5wbHVjayhcImlkXCIpO1xuICAgICAgICAgIHJlY29yZC5jb2x1bW5zW3Byb3AubmFtZV0udmFsdWUgPSByZWxhdGVkSWRzO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgIXByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRQcm9wID0gcmVsYXRlZEVudGl0eS5wcm9wcy5maW5kKFxuICAgICAgICAgICAgKHApID0+IGlzUmVsYXRpb25Qcm9wKHApICYmIHAud2l0aCA9PT0gZW50aXR5LmlkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlbGF0ZWRQcm9wKSB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByb3cuaWQpLmZpcnN0KCk7XG4gICAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZFJvdz8uaWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZElkID0gcm93W2Ake3Byb3AubmFtZX1faWRgXTtcbiAgICAgICAgICByZWNvcmQuY29sdW1uc1twcm9wLm5hbWVdLnZhbHVlID0gcmVsYXRlZElkO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQpIHtcbiAgICAgICAgICAgIHJlY29yZC5iZWxvbmdzUmVjb3Jkcy5wdXNoKGAke3Byb3Aud2l0aH0jJHtyZWxhdGVkSWR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghb3B0aW9ucz8uc2luZ2xlUmVjb3JkICYmIHJlbGF0ZWRJZCkge1xuICAgICAgICAgICAgY29uc3QgcmVsYXRlZEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUm93ID0gYXdhaXQgZGIocmVsYXRlZEVudGl0eS50YWJsZSkud2hlcmUoXCJpZFwiLCByZWxhdGVkSWQpLmZpcnN0KCk7XG4gICAgICAgICAgICBpZiAocmVsYXRlZFJvdykge1xuICAgICAgICAgICAgICBhd2FpdCBjcmVhdGUocmVsYXRlZEVudGl0eSwgcmVsYXRlZFJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICAgIH07XG5cbiAgICBhd2FpdCBjcmVhdGUoZW50aXR5LCByb3cpO1xuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICAvKipcbiAgICogMS4gUmVsYXRpb25HcmFwaOuhnCBmaXh0dXJlIOuLqOychCDsgr3snoUg7Iic7IScIOqzhOyCsCAoc2VsZi1yZWZlcmVuY2Ug7Y+s7ZWoKVxuICAgKiAyLiDsiJzshJzrjIDroZwgVXBzZXJ0QnVpbGRlcuyXkCDrk7HroZ0gKFVCUmVm66GcIOywuOyhsCDqtIDqs4Qg7ZGc7ZiEKVxuICAgKiAzLiDthYzsnbTruJTrs4QgdXBzZXJ0IOyLpO2WiSAoSUTripQgRELqsIAg7J6Q64+ZIO2VoOuLuSlcbiAgICovXG4gIGFzeW5jIGluc2VydEZpeHR1cmVzKFxuICAgIGRiTmFtZToga2V5b2YgU29uYW11REJDb25maWcsXG4gICAgX2ZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgY29uc3QgZml4dHVyZXMgPSB1bmlxdWUoX2ZpeHR1cmVzLCAoZikgPT4gZi5maXh0dXJlSWQpO1xuXG4gICAgLy8g7LSI6riw7ZmUXG4gICAgdGhpcy5idWlsZGVyID0gbmV3IFVwc2VydEJ1aWxkZXIoKTtcbiAgICB0aGlzLmZpeHR1cmVSZWZNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy51dWlkVG9GaXh0dXJlSWQgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5za2lwcGVkRml4dHVyZXMgPSBuZXcgTWFwKCk7XG5cbiAgICBjb25zdCBkYiA9IGtuZXgoU29uYW11LmRiQ29uZmlnW2RiTmFtZV0pO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZpeHR1cmVJbXBvcnRSZXN1bHRbXSA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIFJlbGF0aW9uR3JhcGjroZwgZml4dHVyZSDri6jsnIQg7IK97J6FIOyInOyEnCDqs4TsgrBcbiAgICAgIHRoaXMucmVsYXRpb25HcmFwaC5idWlsZEdyYXBoKGZpeHR1cmVzKTtcbiAgICAgIGNvbnN0IGluc2VydGlvbk9yZGVyID0gdGhpcy5yZWxhdGlvbkdyYXBoLmdldEluc2VydGlvbk9yZGVyKCk7XG5cbiAgICAgIC8vIDIuIOyInOyEnOuMgOuhnCBVcHNlcnRCdWlsZGVy7JeQIOuTseuhnSAob3ZlcnJpZGUg7LK07YGsKVxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSWQgb2YgaW5zZXJ0aW9uT3JkZXIpIHtcbiAgICAgICAgY29uc3QgZml4dHVyZSA9IGZpeHR1cmVzLmZpbmQoKGYpID0+IGYuZml4dHVyZUlkID09PSBmaXh0dXJlSWQpO1xuICAgICAgICBpZiAoIWZpeHR1cmUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IGhhc1RhcmdldCA9ICEhZml4dHVyZS50YXJnZXQ7XG4gICAgICAgIGNvbnN0IGhhc1VuaXF1ZSA9ICEhZml4dHVyZS51bmlxdWU7XG4gICAgICAgIGNvbnN0IGhhc0R1cGxpY2F0ZSA9IGhhc1RhcmdldCB8fCBoYXNVbmlxdWU7XG5cbiAgICAgICAgLy8g7KSR67O17J20IOyeiOqzoCBvdmVycmlkZT1mYWxzZeyduCDqsr3smrA6IOyKpO2CtVxuICAgICAgICBpZiAoaGFzRHVwbGljYXRlICYmICFmaXh0dXJlLm92ZXJyaWRlKSB7XG4gICAgICAgICAgLy8g6riw7KG0IOugiOy9lOuTnCBJRCDsoIDsnqUgKHVuaXF1ZSDsmrDshKAsIOyXhuycvOuptCB0YXJnZXQpXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGZpeHR1cmUudW5pcXVlPy5pZCA/PyBmaXh0dXJlLnRhcmdldD8uaWQ7XG4gICAgICAgICAgYXNzZXJ0KGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuc2tpcHBlZEZpeHR1cmVzLnNldChmaXh0dXJlSWQsIHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgZXhpc3RpbmdJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgU2tpcHBlZCAke2ZpeHR1cmUuZW50aXR5SWR9IyR7Zml4dHVyZS5pZH0gKGV4aXN0aW5nOiAjJHtleGlzdGluZ0lkfSwgb3ZlcnJpZGU6IGZhbHNlKWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRml4dHVyZShmaXh0dXJlKTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICAgIGBSZWdpc3RlcmVkICR7Zml4dHVyZS5lbnRpdHlJZH0jJHtmaXh0dXJlLmlkfSR7Zml4dHVyZS5vdmVycmlkZSA/IGAgKG92ZXJyaWRlIGV4aXN0aW5nOiAjJHtmaXh0dXJlLnRhcmdldD8uaWR9KWAgOiBcIlwifWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4g7YWM7J2067iU67OEIHVwc2VydCDsi6TtlolcbiAgICAgIGNvbnN0IHRhYmxlT3JkZXIgPSB0aGlzLmdldFRhYmxlT3JkZXIoZml4dHVyZXMpO1xuXG4gICAgICBhd2FpdCBkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydGVkSWRzQnlUYWJsZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFibGVOYW1lIG9mIHRhYmxlT3JkZXIpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YWJsZU5hbWUpKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIHVwc2VydCDsi6Ttlokg7KCEIHV1aWQg66qp66GdIOyggOyepVxuICAgICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5idWlsZGVyLmdldFRhYmxlKHRhYmxlTmFtZSk7XG4gICAgICAgICAgY29uc3QgdXVpZHMgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3cudXVpZCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShgVXBzZXJ0aW5nICR7dGFibGVOYW1lfSB3aXRoICR7dXVpZHMubGVuZ3RofSByb3dzYCkpO1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRlci51cHNlcnQodHJ4LCB0YWJsZU5hbWUpO1xuXG4gICAgICAgICAgLy8gdXBzZXJ065CcIHJvd+uTpOydmCB1dWlkIC0+IGlkIOunpO2VkSDqtazstpVcbiAgICAgICAgICBpZiAodXVpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdXVpZFRvSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRyeCh0YWJsZU5hbWUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAuc2VsZWN0KFwidXVpZFwiLCBcImlkXCIpXG4gICAgICAgICAgICAgIC53aGVyZUluKFwidXVpZFwiLCB1dWlkcyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgICAgICAgdXVpZFRvSWQuc2V0KHJvdy51dWlkLCByb3cuaWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnNlcnRlZElkc0J5VGFibGUuc2V0KHRhYmxlTmFtZSwgdXVpZFRvSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDQuIE1hbnlUb01hbnkg6rSA6rOEIOyymOumrFxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NNYW55VG9NYW55UmVsYXRpb25zKHRyeCwgZml4dHVyZXMsIGluc2VydGVkSWRzQnlUYWJsZSk7XG5cbiAgICAgICAgLy8gNS4g6rKw6rO8IOyImOynkVxuICAgICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZXMpIHtcbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcblxuICAgICAgICAgIC8vIOyKpO2CteuQnCBmaXh0dXJl64qUIOq4sOyhtCDroIjsvZTrk5wg7KCV67O066GcIOqysOqzvCDstpTqsIBcbiAgICAgICAgICBjb25zdCBza2lwcGVkID0gdGhpcy5za2lwcGVkRml4dHVyZXMuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAoc2tpcHBlZCkge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgZW50aXR5SWQ6IGZpeHR1cmUuZW50aXR5SWQsXG4gICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgc2tpcHBlZC5leGlzdGluZ0lkKS5maXJzdCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZWYgPSB0aGlzLmZpeHR1cmVSZWZNYXAuZ2V0KGZpeHR1cmUuZml4dHVyZUlkKTtcbiAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICBjb25zdCB1dWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydGVkSWQgPSB1dWlkVG9JZD8uZ2V0KHJlZi51dWlkKTtcblxuICAgICAgICAgICAgaWYgKGluc2VydGVkSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGVudGl0eUlkOiBmaXh0dXJlLmVudGl0eUlkLFxuICAgICAgICAgICAgICAgIGRhdGE6IGF3YWl0IHRyeChlbnRpdHkudGFibGUpLndoZXJlKFwiaWRcIiwgaW5zZXJ0ZWRJZCkuZmlyc3QoKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oYEluc2VydGVkIGludG8gJHtlbnRpdHkudGFibGV9OiAjJHtmaXh0dXJlLmlkfSAtPiAjJHtpbnNlcnRlZElkfWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5pcXVlKHJlc3VsdHMsIChyKSA9PiBgJHtyLmVudGl0eUlkfSMke3IuZGF0YS5pZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlUmVjb3Jk66W8IFVwc2VydEJ1aWxkZXLsl5Ag65Ox66GdXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyRml4dHVyZShmaXh0dXJlOiBGaXh0dXJlUmVjb3JkKTogVUJSZWYge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGZpeHR1cmUuZW50aXR5SWQpO1xuICAgIGNvbnN0IHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIE92ZXJyaWRlIOuqqOuTnCDtjJDri6g6IHRhcmdldCDrmJDripQgdW5pcXVl6rCAIOyeiOqzoCBvdmVycmlkZT10cnVl7J24IOqyveyasFxuICAgIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gZml4dHVyZS50YXJnZXQgPz8gZml4dHVyZS51bmlxdWU7XG4gICAgY29uc3QgaXNPdmVycmlkZU1vZGUgPSBmaXh0dXJlLm92ZXJyaWRlICYmIGV4aXN0aW5nUmVjb3JkO1xuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgY29uc3QgcHJvcCA9IGNvbHVtbi5wcm9wO1xuXG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWQvdXVpZCDsspjrpqw6IE92ZXJyaWRlIOuqqOuTnOydvCDrlYzrp4wg6riw7KG0IOqwkiDsgqzsmqlcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gXCJpZFwiIHx8IHByb3BOYW1lID09PSBcInV1aWRcIikge1xuICAgICAgICBpZiAoaXNPdmVycmlkZU1vZGUgJiYgZXhpc3RpbmdSZWNvcmQpIHtcbiAgICAgICAgICAvLyBPdmVycmlkZTog6riw7KG0IOugiOy9lOuTnOydmCDqsJIg7IKs7JqpIOKGkiBVUERBVEVcbiAgICAgICAgICByb3dbcHJvcE5hbWVdID0gZXhpc3RpbmdSZWNvcmQuY29sdW1uc1twcm9wTmFtZV0/LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIOyDiCDroIjsvZTrk5w6IOygnOyZuCDihpIgSU5TRVJUIChEQi9VcHNlcnRCdWlsZGVy6rCAIOyDneyEsSlcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHxcbiAgICAgICAgICAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZCA9IGNvbHVtbi52YWx1ZSBhcyBudW1iZXIgfCBudWxsO1xuICAgICAgICAgIGlmIChyZWxhdGVkSWQgIT09IG51bGwgJiYgcmVsYXRlZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG5cbiAgICAgICAgICAgIC8vIOuovOyggCBza2lw65CcIGZpeHR1cmXsnbjsp4Ag7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBza2lwcGVkRXhpc3RpbmdJZCA9IHRoaXMuc2tpcHBlZEZpeHR1cmVzLmdldChyZWxhdGVkRml4dHVyZUlkKT8uZXhpc3RpbmdJZDtcbiAgICAgICAgICAgIGlmIChza2lwcGVkRXhpc3RpbmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIHNraXDrkJwgZml4dHVyZSDihpIgdGFyZ2V0IERC7J2YIOq4sOyhtCDroIjsvZTrk5wgaWQg7IKs7JqpXG4gICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHNraXBwZWRFeGlzdGluZ0lkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVsYXRlZFJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQocmVsYXRlZEZpeHR1cmVJZCk7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgICAgLy8g7J2066+4IOuTseuhneuQnCBmaXh0dXJlIOywuOyhsCDihpIgVUJSZWYg7IKs7JqpXG4gICAgICAgICAgICAgICAgcm93W2Ake3Byb3BOYW1lfV9pZGBdID0gcmVsYXRlZFJlZjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBmaXh0dXJlc+yXkCDtj6ztlajrkJjsp4Ag7JWK7J2AIOugiOy9lOuTnCDihpIgSUQg6re464yA66GcIOyCrOyaqVxuICAgICAgICAgICAgICAgIHJvd1tgJHtwcm9wTmFtZX1faWRgXSA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dbYCR7cHJvcE5hbWV9X2lkYF0gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXNNYW55LCBNYW55VG9NYW5564qUIOuzhOuPhCDsspjrpqxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOydvOuwmCDsu6zrn7xcbiAgICAgICAgcm93W3Byb3BOYW1lXSA9IHRoaXMuY29udmVydENvbHVtblZhbHVlKHByb3AgYXMgRW50aXR5UHJvcCwgY29sdW1uLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBSZWdpc3RlcmluZyAke2VudGl0eS50YWJsZX0gLSAke2luc3BlY3Qocm93LCBmYWxzZSwgbnVsbCwgdHJ1ZSl9YCkpO1xuICAgIGNvbnN0IHJlZiA9IHRoaXMuYnVpbGRlci5yZWdpc3RlcihlbnRpdHkudGFibGUsIHJvdyk7XG4gICAgdGhpcy5maXh0dXJlUmVmTWFwLnNldChmaXh0dXJlLmZpeHR1cmVJZCwgcmVmKTtcbiAgICB0aGlzLnV1aWRUb0ZpeHR1cmVJZC5zZXQocmVmLnV1aWQsIGZpeHR1cmUuZml4dHVyZUlkKTtcblxuICAgIHJldHVybiByZWY7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgY29udmVydENvbHVtblZhbHVlKHByb3A6IEVudGl0eVByb3AsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICAvLyBVcHNlcnRCdWlsZGVyLnJlZ2lzdGVy7JeQ7IScIEpTT04uc3RyaW5naWZ5IOyymOumrO2VmOuvgOuhnCBvYmplY3Qg6re464yA66GcIOyghOuLrFxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7YWM7J2067iUIOyInOyEnCDstpTstpwgKGZpeHR1cmVz7JeQIO2PrO2VqOuQnCDthYzsnbTruJTrp4wpXG4gICAqL1xuICBwcml2YXRlIGdldFRhYmxlT3JkZXIoZml4dHVyZXM6IEZpeHR1cmVSZWNvcmRbXSk6IChrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZClbXSB7XG4gICAgY29uc3QgdGFibGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiBmaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZml4dHVyZS5lbnRpdHlJZCk7XG4gICAgICBpZiAoIXNlZW4uaGFzKGVudGl0eS50YWJsZSkpIHtcbiAgICAgICAgc2Vlbi5hZGQoZW50aXR5LnRhYmxlKTtcbiAgICAgICAgdGFibGVzLnB1c2goZW50aXR5LnRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVzIGFzIChrZXlvZiBEYXRhYmFzZVNjaGVtYUV4dGVuZClbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMoXG4gICAgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW10sXG4gICAgaW5zZXJ0ZWRJZHNCeVRhYmxlOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIGZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChmaXh0dXJlLmVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHNvdXJjZVJlZiA9IHRoaXMuZml4dHVyZVJlZk1hcC5nZXQoZml4dHVyZS5maXh0dXJlSWQpO1xuXG4gICAgICBpZiAoIXNvdXJjZVJlZikgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHNvdXJjZVV1aWRUb0lkID0gaW5zZXJ0ZWRJZHNCeVRhYmxlLmdldChlbnRpdHkudGFibGUpO1xuICAgICAgY29uc3Qgc291cmNlSWQgPSBzb3VyY2VVdWlkVG9JZD8uZ2V0KHNvdXJjZVJlZi51dWlkKTtcblxuICAgICAgaWYgKHNvdXJjZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBmb3IgKGNvbnN0IFssIGNvbHVtbl0gb2YgT2JqZWN0LmVudHJpZXMoZml4dHVyZS5jb2x1bW5zKSkge1xuICAgICAgICBjb25zdCBwcm9wID0gY29sdW1uLnByb3A7XG5cbiAgICAgICAgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChwcm9wKSAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi52YWx1ZSkpIHtcbiAgICAgICAgICAvLyDshKDtg53rkJjsp4Ag7JWK7J2AIE1hbnlUb01hbnkg6rSA6rOE64qUIOyggOyepe2VmOyngCDslYrsnYxcbiAgICAgICAgICBjb25zdCB0YXJnZXRUYWJsZSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNUYWJsZSh0YXJnZXRUYWJsZS50YWJsZSkgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHJlbGF0ZWRJZHMgPSBjb2x1bW4udmFsdWUgYXMgbnVtYmVyW107XG4gICAgICAgICAgaWYgKHJlbGF0ZWRJZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5UYWJsZSA9IChwcm9wIGFzIE1hbnlUb01hbnlSZWxhdGlvblByb3ApLmpvaW5UYWJsZTtcbiAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUoZW50aXR5LnRhYmxlKX1faWRgO1xuICAgICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsYXRlZEVudGl0eS50YWJsZSl9X2lkYDtcblxuICAgICAgICAgIGZvciAoY29uc3QgcmVsYXRlZElkIG9mIHJlbGF0ZWRJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRGaXh0dXJlSWQgPSBgJHtwcm9wLndpdGh9IyR7cmVsYXRlZElkfWA7XG4gICAgICAgICAgICBjb25zdCByZWxhdGVkUmVmID0gdGhpcy5maXh0dXJlUmVmTWFwLmdldChyZWxhdGVkRml4dHVyZUlkKTtcblxuICAgICAgICAgICAgbGV0IHRhcmdldElkOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChyZWxhdGVkUmVmKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRVdWlkVG9JZCA9IGluc2VydGVkSWRzQnlUYWJsZS5nZXQocmVsYXRlZEVudGl0eS50YWJsZSk7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkSWQgPSByZWxhdGVkVXVpZFRvSWQ/LmdldChyZWxhdGVkUmVmLnV1aWQpO1xuXG4gICAgICAgICAgICAgIGlmIChyZXNvbHZlZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgUmVsYXRlZCBmaXh0dXJlICR7cmVsYXRlZEZpeHR1cmVJZH0gbm90IGZvdW5kIGluIGluc2VydGVkSWRzLCBza2lwcGluZ2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlc29sdmVkSWQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YXJnZXRJZCA9IHJlbGF0ZWRJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSm9pblRhYmxl7JeQIOyCveyehVxuICAgICAgICAgICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IHRyeChqb2luVGFibGUpXG4gICAgICAgICAgICAgIC53aGVyZSh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmxpbWl0KDEpO1xuXG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRyeChqb2luVGFibGUpLmluc2VydCh7XG4gICAgICAgICAgICAgICAgW3NvdXJjZUNvbHVtbl06IHNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIFt0YXJnZXRDb2x1bW5dOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICAgICAgICBgSW5zZXJ0ZWQgaW50byAke2pvaW5UYWJsZX06ICR7ZW50aXR5LnRhYmxlfSgke3NvdXJjZUlkfSkgLSAke3JlbGF0ZWRFbnRpdHkudGFibGV9KCR7dGFyZ2V0SWR9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrVW5pcXVlVmlvbGF0aW9uKGRiOiBLbmV4LCBlbnRpdHk6IEVudGl0eSwgZml4dHVyZTogRml4dHVyZVJlY29yZCkge1xuICAgIGNvbnN0IF91bmlxdWVJbmRleGVzID0gZW50aXR5LmluZGV4ZXM/LmZpbHRlcigoaSkgPT4gaS50eXBlID09PSBcInVuaXF1ZVwiKSA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSBfdW5pcXVlSW5kZXhlcy5maWx0ZXIoKGluZGV4KSA9PlxuICAgICAgaW5kZXguY29sdW1ucy5ldmVyeSgoY29sdW1uKSA9PiAhY29sdW1uLm5hbWUuc3RhcnRzV2l0aChgJHtlbnRpdHkudGFibGV9X19gKSksXG4gICAgKTtcbiAgICBpZiAodW5pcXVlSW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCB1bmlxdWVRdWVyeSA9IGRiKGVudGl0eS50YWJsZSk7XG4gICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiB1bmlxdWVJbmRleGVzKSB7XG4gICAgICAvLyDsu6zrn7wg7KSRIO2VmOuCmOudvOuPhCBudWxs7J2066m0IOycoOuLiO2BrCDsoJzslb3snYQg7JyE67CY7ZWY7KeAIOyViuq4sCDrlYzrrLjsl5Ag7ZW064u5IOyduOuNseyKpOuKlCDrrLTsi5xcbiAgICAgIGNvbnN0IGNvbnRhaW5zTnVsbCA9IGluZGV4LmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuICAgICAgICByZXR1cm4gZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUgPT09IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluc051bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHVuaXF1ZVF1ZXJ5ID0gdW5pcXVlUXVlcnkub3JXaGVyZSgocWIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgaW5kZXguY29sdW1ucykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLm5hbWUucmVwbGFjZSgvX2lkJC8sIFwiXCIpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZml4dHVyZS5jb2x1bW5zW2ZpZWxkXT8udmFsdWUpKSB7XG4gICAgICAgICAgICBxYi53aGVyZUluKGNvbHVtbi5uYW1lLCBmaXh0dXJlLmNvbHVtbnNbZmllbGRdLnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcWIuYW5kV2hlcmUoY29sdW1uLm5hbWUsIGZpeHR1cmUuY29sdW1uc1tmaWVsZF0/LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaGFzQ29uZGl0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW3VuaXF1ZUZvdW5kXSA9IGF3YWl0IHVuaXF1ZVF1ZXJ5O1xuICAgIHJldHVybiB1bmlxdWVGb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEdXBsaWNhdGVCeUNvbHVtbnMoXG4gICAgZGI6IEtuZXgsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICAgZml4dHVyZTogRml4dHVyZVJlY29yZCxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNsYXVzZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgIC8vIHJlbGF0aW9uIO2VhOuTnOyduCDqsr3smrAgX2lkIOu2meydtOq4sFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbik7XG4gICAgICBjb25zdCBkYkNvbHVtbiA9IHByb3AgJiYgaXNSZWxhdGlvblByb3AocHJvcCkgPyBgJHtjb2x1bW59X2lkYCA6IGNvbHVtbjtcbiAgICAgIGNvbnN0IHZhbHVlID0gZml4dHVyZS5jb2x1bW5zW2NvbHVtbl0/LnZhbHVlO1xuXG4gICAgICAvLyBudWxsIOqwkuydtCDtj6ztlajrkJwg6rK97JqwIOykkeuztSDtmZXsnbgg7Iqk7YK1XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgd2hlcmVDbGF1c2VbZGJDb2x1bW5dID0gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZvdW5kXSA9IGF3YWl0IGRiKGVudGl0eS50YWJsZSkud2hlcmUod2hlcmVDbGF1c2UpLmxpbWl0KDEpO1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGFkZEZpeHR1cmVMb2FkZXIoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0aCA9IGAke1NvbmFtdS5hcGlSb290UGF0aH0vc3JjL3Rlc3RpbmcvZml4dHVyZS50c2A7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgZml4dHVyZUxvYWRlclN0YXJ0ID0gY29udGVudC5pbmRleE9mKFwiY29uc3QgZml4dHVyZUxvYWRlciA9IHtcIik7XG4gICAgY29uc3QgZml4dHVyZUxvYWRlckVuZCA9IGNvbnRlbnQuaW5kZXhPZihcIn07XCIsIGZpeHR1cmVMb2FkZXJTdGFydCk7XG5cbiAgICBpZiAoZml4dHVyZUxvYWRlclN0YXJ0ICE9PSAtMSAmJiBmaXh0dXJlTG9hZGVyRW5kICE9PSAtMSkge1xuICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2NvbnRlbnQuc2xpY2UoMCwgZml4dHVyZUxvYWRlckVuZCl9ICAke2NvZGV9XFxuJHtjb250ZW50LnNsaWNlKGZpeHR1cmVMb2FkZXJFbmQpfWA7XG5cbiAgICAgIHdyaXRlRmlsZVN5bmMocGF0aCwgbmV3Q29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kIGZpeHR1cmVMb2FkZXIgaW4gZml4dHVyZS50c1wiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEZpeHR1cmVNYW5hZ2VyID0gbmV3IEZpeHR1cmVNYW5hZ2VyQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJjaGFsayIsImV4ZWNTeW5jIiwicmVhZEZpbGVTeW5jIiwid3JpdGVGaWxlU3luYyIsImluZmxlY3Rpb24iLCJrbmV4IiwidW5pcXVlIiwiaW5zcGVjdCIsIlNvbmFtdSIsIkJhc2VNb2RlbCIsIlVwc2VydEJ1aWxkZXIiLCJFbnRpdHlNYW5hZ2VyIiwiaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AiLCJpc0hhc01hbnlSZWxhdGlvblByb3AiLCJpc01hbnlUb01hbnlSZWxhdGlvblByb3AiLCJpc09uZVRvT25lUmVsYXRpb25Qcm9wIiwiaXNSZWxhdGlvblByb3AiLCJpc1ZpcnR1YWxQcm9wIiwiUmVsYXRpb25HcmFwaCIsIkZpeHR1cmVNYW5hZ2VyQ2xhc3MiLCJfdGRiIiwidGRiIiwiRXJyb3IiLCJfZmRiIiwiZmRiIiwiY2FjaGVkVGFibGVOYW1lcyIsInJlbGF0aW9uR3JhcGgiLCJidWlsZGVyIiwiZml4dHVyZVJlZk1hcCIsIk1hcCIsInV1aWRUb0ZpeHR1cmVJZCIsInNraXBwZWRGaXh0dXJlcyIsImluaXQiLCJkYkNvbmZpZyIsInRlc3QiLCJwcm9kdWN0aW9uX21hc3RlciIsInRDb25uIiwiY29ubmVjdGlvbiIsInBDb25uIiwiaG9zdCIsInBvcnQiLCJkYXRhYmFzZSIsImZpeHR1cmUiLCJnZXRDaGVja3N1bSIsImRiIiwidGFibGVOYW1lIiwiY2hlY2tzdW1Sb3ciLCJyYXciLCJDaGVja3N1bSIsInN5bmMiLCJmaXh0dXJlQ29ubiIsInRlc3RDb25uIiwidGVzdFBnRW52IiwiUEdQQVNTV09SRCIsInBhc3N3b3JkIiwidXNlciIsInN0ZGlvIiwiZW52IiwicHJvY2VzcyIsImZpeHR1cmVQZ0VudiIsImR1bXBDbWQiLCJyZXN0b3JlQ21kIiwic2hlbGwiLCJ2aXNpdGVkUmVjb3JkcyIsIlNldCIsImltcG9ydEZpeHR1cmUiLCJlbnRpdHlJZCIsImlkcyIsImNsZWFyIiwicXVlcmllcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJpZCIsImdldEltcG9ydFF1ZXJpZXMiLCJmbGF0Iiwid2RiIiwiZ2V0REIiLCJxdWVyeSIsInJzaCIsImNvbnNvbGUiLCJsb2ciLCJpbmZvIiwiZmllbGQiLCJyZWNvcmRLZXkiLCJoYXMiLCJhZGQiLCJlbnRpdHkiLCJnZXQiLCJyb3ciLCJ0YWJsZSIsIndoZXJlIiwibGltaXQiLCJ1bmRlZmluZWQiLCJmaXh0dXJlRGF0YWJhc2UiLCJyZWFsRGF0YWJhc2UiLCJzZWxmUXVlcnkiLCJhcmdzIiwiT2JqZWN0IiwiZW50cmllcyIsInJlbGF0aW9ucyIsImZpbHRlciIsInJlbGF0aW9uIiwiY3VzdG9tSm9pbkNsYXVzZSIsImhhc0pvaW5Db2x1bW4iLCJyZWxhdGVkRW50aXR5Iiwid2l0aCIsInJlbGF0ZWRJZENvbHVtbk5hbWUiLCJwcm9wcyIsImZpbmQiLCJwIiwibmFtZSIsImFyZyIsInJlbFF1ZXJpZXMiLCJyZXZlcnNlIiwiZGVzdHJveSIsImdldEZpeHR1cmVzIiwic291cmNlREJOYW1lIiwidGFyZ2V0REJOYW1lIiwic2VhcmNoT3B0aW9ucyIsImR1cGxpY2F0ZUNoZWNrIiwic291cmNlREIiLCJ0YXJnZXREQiIsInZhbHVlIiwic2VhcmNoVHlwZSIsImNvbHVtbiIsInByb3AiLCJ0eXBlIiwicm93cyIsImxlbmd0aCIsImZpeHR1cmVzIiwiaW5pdGlhbFJlY29yZHNMZW5ndGgiLCJuZXdSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInB1c2giLCJjdXJyZW50Rml4dHVyZVJlY29yZCIsInIiLCJmaXh0dXJlSWQiLCJmZXRjaGVkUmVjb3JkcyIsInNsaWNlIiwiY3VzdG9tQ29sdW1ucyIsImNvbHVtbnMiLCJjdXN0b21EdXBsaWNhdGVSb3ciLCJjaGVja0R1cGxpY2F0ZUJ5Q29sdW1ucyIsInJlY29yZCIsInNpbmdsZVJlY29yZCIsInRhcmdldCIsInVuaXF1ZVJvdyIsImNoZWNrVW5pcXVlVmlvbGF0aW9uIiwiZiIsIm9wdGlvbnMiLCJyZWNvcmRzIiwidmlzaXRlZEVudGl0aWVzIiwiY3JlYXRlIiwiYmVsb25nc1JlY29yZHMiLCJ0aHJvdWdoVGFibGUiLCJqb2luVGFibGUiLCJmcm9tQ29sdW1uIiwic2luZ3VsYXJpemUiLCJ0b0NvbHVtbiIsInJlbGF0ZWRJZHMiLCJwbHVjayIsImpvaW5Db2x1bW4iLCJyZWxhdGVkUHJvcCIsInJlbGF0ZWRSb3ciLCJmaXJzdCIsInJlbGF0ZWRJZCIsImluc2VydEZpeHR1cmVzIiwiZGJOYW1lIiwiX2ZpeHR1cmVzIiwicmVzdWx0cyIsImJ1aWxkR3JhcGgiLCJpbnNlcnRpb25PcmRlciIsImdldEluc2VydGlvbk9yZGVyIiwiaGFzVGFyZ2V0IiwiaGFzVW5pcXVlIiwiaGFzRHVwbGljYXRlIiwib3ZlcnJpZGUiLCJleGlzdGluZ0lkIiwic2V0IiwieWVsbG93IiwicmVnaXN0ZXJGaXh0dXJlIiwiYmx1ZSIsInRhYmxlT3JkZXIiLCJnZXRUYWJsZU9yZGVyIiwidHJhbnNhY3Rpb24iLCJ0cngiLCJpbnNlcnRlZElkc0J5VGFibGUiLCJoYXNUYWJsZSIsImdldFRhYmxlIiwidXVpZHMiLCJ1dWlkIiwidXBzZXJ0IiwidXVpZFRvSWQiLCJzZWxlY3QiLCJ3aGVyZUluIiwicHJvY2Vzc01hbnlUb01hbnlSZWxhdGlvbnMiLCJza2lwcGVkIiwiZGF0YSIsInJlZiIsImluc2VydGVkSWQiLCJncmVlbiIsImV4aXN0aW5nUmVjb3JkIiwiaXNPdmVycmlkZU1vZGUiLCJwcm9wTmFtZSIsInJlbGF0ZWRGaXh0dXJlSWQiLCJza2lwcGVkRXhpc3RpbmdJZCIsInJlbGF0ZWRSZWYiLCJjb252ZXJ0Q29sdW1uVmFsdWUiLCJyZWdpc3RlciIsIkRhdGUiLCJ0YWJsZXMiLCJzZWVuIiwic291cmNlUmVmIiwic291cmNlVXVpZFRvSWQiLCJzb3VyY2VJZCIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldFRhYmxlIiwic291cmNlQ29sdW1uIiwidGFyZ2V0Q29sdW1uIiwidGFyZ2V0SWQiLCJyZWxhdGVkVXVpZFRvSWQiLCJyZXNvbHZlZElkIiwid2FybiIsImZvdW5kIiwiaW5zZXJ0IiwiX3VuaXF1ZUluZGV4ZXMiLCJpbmRleGVzIiwiaSIsInVuaXF1ZUluZGV4ZXMiLCJpbmRleCIsImV2ZXJ5Iiwic3RhcnRzV2l0aCIsInVuaXF1ZVF1ZXJ5IiwiaGFzQ29uZGl0aW9uIiwiY29udGFpbnNOdWxsIiwic29tZSIsInJlcGxhY2UiLCJvcldoZXJlIiwicWIiLCJhbmRXaGVyZSIsInVuaXF1ZUZvdW5kIiwid2hlcmVDbGF1c2UiLCJkYkNvbHVtbiIsImFkZEZpeHR1cmVMb2FkZXIiLCJjb2RlIiwicGF0aCIsImFwaVJvb3RQYXRoIiwiY29udGVudCIsInRvU3RyaW5nIiwiZml4dHVyZUxvYWRlclN0YXJ0IiwiaW5kZXhPZiIsImZpeHR1cmVMb2FkZXJFbmQiLCJu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
@@ -89,4 +89,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
89
89
  `):String(m);try{const v=document.createElement("textarea");v.value=y,document.body.appendChild(v),v.select(),document.execCommand("copy"),document.body.removeChild(v),d(!0),setTimeout(()=>d(!1),1500)}catch(v){console.error("Failed to copy text: ",v)}};return j.useEffect(()=>{i(new Array(e.split(`
90
90
  `).length).fill(!1))},[e]),x.jsx(eGe,{children:`\`\`\`${t} ${n?`title="${n}"`:""}
91
91
  ${e}
92
- \`\`\``,components:{code({children:m,className:b,node:y,ref:v,...k}){const _=String(m).trimEnd();return x.jsxs("div",{className:"code",children:[x.jsxs("div",{className:"code-header",children:[x.jsx("span",{children:n??t}),x.jsxs("div",{children:[o&&x.jsx(ar,{label:a.every(S=>S)?"전체 해제":"전체 선택",checked:a.every(S=>S),onChange:()=>{const S=a.every(T=>T);i(a.map(()=>!S))}}),x.jsxs(Le,{icon:!0,onClick:()=>h(_),size:"tiny",children:[x.jsx(mt,{name:u?"check circle outline":"clipboard outline"}),u?"복사 완료":"복사"]})]})]}),x.jsx(AQe,{...k,children:_,language:t,style:Bne[r??"materialDark"],renderer:({rows:S,stylesheet:T})=>x.jsx("div",{style:{position:"relative"},children:S.map((C,w)=>{const A=a[w]??!1,O=s===w;return x.jsxs("div",{className:`code-line ${O?"hovered":""}`,style:A?{backgroundColor:"rgba(0, 123, 255, 0.1)"}:{},onMouseEnter:()=>l(w),onMouseLeave:()=>l(null),onClick:()=>o&&p(w),children:[o&&x.jsx(ar,{checked:A,onClick:R=>R.stopPropagation(),onChange:()=>p(w)}),x.jsx("span",{children:C.children?.map((R,$)=>R.type==="element"?x.jsx("span",{className:R.properties.className.join(" "),style:{...R.properties.className.reduce((N,M)=>T[M]?{...N,...T[M]}:N,{}),fontWeight:"normal"},children:R.children.map((N,M)=>x.jsx("span",{children:N.value},M))},$):x.jsx("span",{children:R.value},$))})]},w)})})})]})}}})};function IQe({fixtureRecords:e,onRelationToggle:t,selectedIds:n,setFixtureRecords:r}){const o=Qv(e,a=>a.entityId);return x.jsx("div",{className:"fixture-record-viewer",children:Object.entries(o).map(([a,i])=>x.jsx(jte,{fixtures:i??[],selectedIds:n,onRelationToggle:t,setFixtureRecords:r},a))})}const sG=["development_master","production_master","fixture_remote","test"];function RQe(){const{data:e,isLoading:t}=Xe.useEntities(),[n,r]=j.useState("development_master"),[o,a]=j.useState("test"),[i,s]=j.useState([]),[l,u]=j.useState([]),[d,p]=j.useState(new Set),[h,m]=j.useState(0),[b,y]=j.useState("table"),[v,k]=j.useState({}),[_,S]=j.useState(""),[T,C]=j.useState([]),[w,A]=j.useState(!1),[O,R]=j.useState("chat"),{form:$,register:N}=em(Ve({entityId:ie(),field:ie(),value:ie(),searchType:Br(["equals","like"])}),{entityId:"",field:"id",value:"",searchType:"equals"}),[M,V]=j.useState(null),z=e?.entities?.find(U=>U.id===_)??null,H=()=>{if(!$.entityId||!$.field||!$.value)return;m(0),s([]),u([]),p(new Set);const U=Object.keys(v).length>0?{columns:v}:void 0;Xe.getFixtures(n,o,$,U).then(K=>{s(K),p(new Set(K.map(P=>P.fixtureId)))}).catch(Ht)},W=()=>{i.length!==0&&(m(1),Xe.importFixtures(o,i).then(U=>{u(U)}).catch(Ht))},G=async(U,K,P,Z)=>{const L=`${K}#${P}`,X=Object.keys(v).length>0?{columns:v}:void 0;if(Z)Xe.getFixtures(n,o,{entityId:K,field:"id",value:String(P),searchType:"equals"},X).then(ne=>{const te=i.find(pe=>pe.fixtureId===U);te&&te.fetchedRecords.push(L);const ae=ne.filter(pe=>!i.some(be=>be.fixtureId===pe.fixtureId));s(pe=>Array.from([...pe,...ae])),p(pe=>{const be=new Set(pe);return ae.forEach(xe=>{be.add(xe.fixtureId)}),be})}).catch(Ht);else{const ne=i.find(pe=>pe.fixtureId===U);if(!ne)return;ne.fetchedRecords=ne.fetchedRecords.filter(pe=>pe!==L);const te=new Set([L]),ae=i.find(pe=>pe.fixtureId===L);if(ae?.fetchedRecords.length){const pe=new Set([U]);i.forEach(be=>{be.fixtureId!==L&&be.fetchedRecords.forEach(xe=>{pe.add(xe)})}),ae?.fetchedRecords.forEach(be=>{pe.has(be)||te.add(be)})}else{const pe=new Set,be=xe=>{pe.has(xe)||(pe.add(xe),i.forEach(Ie=>{Ie.belongsRecords.includes(xe)&&be(Ie.fixtureId)}))};be(L)}p(pe=>{const be=new Set(pe);return te.forEach(xe=>{be.delete(xe)}),be}),s(pe=>pe.filter(be=>!te.has(be.fixtureId)))}},q=()=>{!_||T.length===0||(k(U=>({...U,[_]:T})),S(""),C([]))},Q=U=>{k(K=>{const{[U]:P,...Z}=K;return Z})};j.useEffect(()=>{if($.entityId&&e?.entities){const U=e.entities.find(K=>K.id===$.entityId);U&&V(U)}},[$.entityId,e]),j.useEffect(()=>{C([])},[]);const F=[{menuItem:"Fixture Record Viewer",render:()=>x.jsx(ps.Pane,{children:b==="table"?x.jsx(IQe,{fixtureRecords:i,onRelationToggle:G,selectedIds:d,setFixtureRecords:s}):x.jsx(z5e,{fixtures:i,selectedIds:d,onRelationToggle:G,setFixtureRecords:s})})},{menuItem:"Fixture Code Viewer",render:()=>x.jsx(ps.Pane,{children:e?.entities&&l.length>0&&x.jsx(CQe,{entities:e.entities,fixtureResults:l,targetDB:o})})}];return x.jsxs("div",{className:"fixture-index",children:[x.jsx("div",{className:"fixture-sidebar",children:x.jsxs(un,{className:"fixture-header",children:[x.jsxs("div",{className:"search-section",children:[x.jsxs("div",{className:"search-title",children:[x.jsx(mt,{name:"search",style:{marginRight:"5px"}}),"검색 대상 설정"]}),x.jsx("div",{className:"db-dropdown-wrapper",children:x.jsx(Ct,{fluid:!0,placeholder:"검색할 DB 선택",selection:!0,options:sG.map(U=>({key:U,value:U,text:U.replace("_master","")})),value:n,onChange:(U,{value:K})=>r(K)})}),x.jsx("div",{style:{flexGrow:1,minWidth:"200px"},children:x.jsx(Ct,{fluid:!0,placeholder:"엔티티 선택",search:!0,selection:!0,loading:t,options:e?.entities?.map(U=>({key:U.id,value:U.id,text:U.id}))||[],...N("entityId")})}),M&&x.jsxs(x.Fragment,{children:[x.jsx(Ct,{placeholder:"컬럼 선택",selection:!0,options:M.props.filter(U=>U.type==="virtual"?!1:U.type==="relation"?!!(U.relationType==="BelongsToOne"||U.relationType==="OneToOne"&&U.hasJoinColumn):!0).map(U=>({key:U.name,value:U.name,text:U.name})),...N("field")}),x.jsx(vr,{placeholder:"검색 값 입력",...N("value"),style:{flexGrow:1}}),x.jsx(Ct,{selection:!0,options:[{key:"equals",text:"Equals",value:"equals"},{key:"like",text:"Like",value:"like"}],...N("searchType")})]}),x.jsx(Le,{onClick:H,disabled:!$.entityId||!$.field||!$.value||t,loading:t,primary:!0,content:"검색"})]}),x.jsxs("div",{className:"save-section",children:[x.jsxs("button",{type:"button",className:"save-title",style:{cursor:"pointer",background:"none",border:"none",padding:0,display:"flex",alignItems:"center",width:"100%",textAlign:"left"},onClick:()=>A(!w),children:[x.jsx(mt,{name:w?"chevron down":"chevron right"}),x.jsx(mt,{name:"database",style:{marginRight:"5px"}}),"저장 DB 설정",i.length>0&&(()=>{const U=i.filter(K=>{const P=!!K.target,Z=!!K.unique;return!!(!P&&!Z||K.override&&(P||Z))});return x.jsxs(Yt,{color:"green",size:"small",style:{marginLeft:"auto"},children:[U.length,"개 저장 예정"]})})()]}),x.jsx("div",{className:"db-dropdown-wrapper",children:x.jsx(Ct,{fluid:!0,placeholder:"저장할 대상 DB 선택",header:"Fixture Target DB",selection:!0,options:sG.map(U=>({key:U,value:U,text:U})),value:o,onChange:(U,{value:K})=>a(K)})}),x.jsx(Le,{onClick:W,color:"blue",content:"저장",disabled:i.length===0}),w&&i.length>0&&(()=>{const K=i.filter(P=>{const Z=!!P.target,L=!!P.unique;return!!(!Z&&!L||P.override&&(Z||L))}).reduce((P,Z)=>(P[Z.entityId]||(P[Z.entityId]=[]),P[Z.entityId].push(Z),P),{});return x.jsxs("div",{style:{marginTop:"10px",marginBottom:"10px"},children:[x.jsx("p",{style:{color:"#666",fontSize:"12px",marginBottom:"10px"},children:"저장될 픽스쳐 목록"}),x.jsx("div",{className:"fixture-record-group",children:Object.entries(K).map(([P,Z])=>x.jsxs("div",{style:{padding:"8px",backgroundColor:"#f9f9f9",borderRadius:"4px"},children:[x.jsxs("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:[P," (",Z.length,"개)"]}),x.jsx("div",{style:{fontSize:"12px",color:"#555"},children:Z.map(L=>{const X=!!L.target,ne=!!L.unique;let te="신규";return L.override&&(X||ne)&&(te="덮어쓰기"),x.jsxs(Yt,{size:"tiny",style:{margin:"2px"},children:["#",L.id,x.jsx(Yt.Detail,{children:te})]},L.fixtureId)})})]},P))})]})})()]}),O==="chat"?x.jsx(Gze,{fixtureRecords:i,onUpdateFixtures:U=>{s(U);const K=new Set(i.map(Z=>Z.fixtureId)),P=U.filter(Z=>!K.has(Z.fixtureId)).map(Z=>Z.fixtureId);P.length>0&&p(Z=>new Set([...Z,...P]))}}):x.jsxs("div",{className:"duplicate-check-section",children:[x.jsxs("p",{style:{color:"#666",fontSize:"11px"},children:["엔티티별로 중복 확인에 사용할 컬럼을 지정합니다. ",x.jsx("br",{}),"지정하지 않으면 unique index만 사용합니다."]}),x.jsx(Ct,{placeholder:"엔티티 선택",search:!0,selection:!0,clearable:!0,loading:t,options:e?.entities?.filter(U=>!v[U.id]).map(U=>({key:U.id,value:U.id,text:U.id}))||[],value:_,onChange:(U,{value:K})=>S(K)}),x.jsx(Ct,{placeholder:"중복 확인 컬럼 선택",multiple:!0,selection:!0,disabled:!z,options:z?.props.filter(U=>U.type==="virtual"?!1:U.type==="relation"?!!(U.relationType==="BelongsToOne"||U.relationType==="OneToOne"&&U.hasJoinColumn):!0).map(U=>({key:U.name,value:U.name,text:U.name}))||[],value:T,onChange:(U,{value:K})=>C(K)}),x.jsx(Le,{icon:"plus",color:"blue",size:"small",disabled:!_||T.length===0,onClick:q}),Object.keys(v).length>0&&x.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"},children:Object.entries(v).map(([U,K])=>x.jsxs(Yt,{size:"medium",style:{display:"flex",alignItems:"center",gap:"6px",padding:"8px 12px"},children:[x.jsx("span",{style:{fontWeight:"bold"},children:U}),x.jsxs("span",{style:{color:"#666"},children:["(",K.join(", "),")"]}),x.jsx(mt,{name:"delete",style:{cursor:"pointer",marginLeft:"4px"},onClick:()=>Q(U)})]},U))})]})]})}),x.jsx("div",{className:"fixture-main",children:x.jsxs("div",{className:"fixture-viewer",children:[x.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:"15px"},children:x.jsx(Le,{onClick:()=>y(b==="table"?"graph":"table"),content:b==="table"?"그래프 보기":"테이블 보기",icon:b==="table"?"sitemap":"table",basic:!0,color:"grey"})}),x.jsx(ps,{panes:F,activeIndex:h,onTabChange:(U,{activeIndex:K})=>{typeof K=="number"&&m(K)},style:{boxShadow:"0 5px 15px rgba(0, 0, 0, 0.08)",borderRadius:"12px",overflow:"hidden"}})]})})]})}function NQe({action:e,targets:t,conns:n}){const[r,o]=j.useState(!1),{doneModal:a}=Ls(),{form:i,register:s}=em(Ve({doShadowDbTesting:ct()}),{doShadowDbTesting:e==="apply"}),l=async()=>{o(!0);try{i.doShadowDbTesting&&await Xe.migrationsRunAction("shadow",t),await Xe.migrationsRunAction(e,t),a()}catch(u){Ht(u)}finally{o(!1)}};return x.jsx("div",{className:"form migration-commit-form",children:x.jsx(un,{padded:!0,basic:!0,loading:r,children:x.jsxs(un,{padded:!0,color:"green",children:[x.jsx("div",{className:"header-row",children:x.jsx(Or,{children:"Migrations Action Form"})}),x.jsxs(un,{basic:!0,children:[x.jsxs("div",{children:[x.jsxs("h4",{children:["Action: ",e.toUpperCase()]}),x.jsx("p",{children:" "})]}),x.jsxs("div",{className:"targets",children:[x.jsx("h4",{children:"Targets"}),x.jsx("div",{className:"conns",children:n.map(u=>x.jsxs("div",{className:gi("conn",{"is-targeted":t.includes(u.connKey)}),children:[t.includes(u.connKey)&&x.jsx(mt,{name:"check"}),u.name]},u.name))})]}),e==="apply"&&x.jsxs("div",{className:"shadow-db-testing",children:[x.jsx("h4",{children:"Shadow DB Testing"}),x.jsx(Kf,{...s("doShadowDbTesting")})]}),x.jsx("div",{className:"text-center",style:{marginTop:"2em"},children:x.jsx(Le,{color:"green",onClick:()=>l(),icon:"play",content:"Commit"})})]})]})})})}function DQe(e){const{data:t,error:n,refetch:r}=Xe.useMigrationStatus(),{status:o}=t??{},{preparedCodes:a,conns:i,codes:s}=o??{},l=o?.error,{openModal:u}=Ls(),d=!n&&!t,[p,h]=j.useState(!1),[m,b]=j.useState([]),[y,v]=j.useState([]),[k,_]=j.useState(!1),S=O=>{const R=(()=>{switch(O){case"ALL":return["test","fixture_remote","development_master","production_master"];case"LOCAL":return["test"];case"REMOTE":return["fixture_remote","development_master","production_master"];case"TESTING":return["test","fixture_remote"];case"FIXTURE":return["fixture_remote"]}})();R.filter($=>m.includes($)).length===R.length?b(m.filter($=>!R.includes($))):Qpe(R,m).length>0?b(R):b(ap([...m,...R]))},T=()=>{y.length===0||!confirm(`Are you sure to delete the selected ${y.length} migration codes?`)||(h(!0),Xe.migrationsDelCodes(y).then(()=>{r()}).catch(Ht).finally(()=>{h(!1)}))},C=()=>{h(!0),Xe.migrationsGeneratePreparedCodes().then(()=>{setTimeout(()=>{r()},500)}).catch(Ht).finally(()=>{h(!1)})},w=(O,R)=>{if(!i)return;const $=m;u(x.jsx(NQe,{action:O,targets:$,conns:i}),{onCompleted:()=>{r()}})},A=()=>{s&&(y.length===0?v(s.map(O=>O.name)):v([]))};return n?x.jsx("div",{className:"migrations-index",children:x.jsx("div",{className:"message-box error",children:n.message})}):x.jsx("div",{className:"migrations-index",children:x.jsxs(un,{className:"migrations-index",loading:p||d,children:[a&&x.jsxs("div",{className:"prepared",children:[x.jsxs("h3",{children:["Prepared Migration Codes"," ",x.jsxs("div",{className:"buttons",children:[x.jsx(Le,{icon:`toggle ${k?"on":"off"}`,size:"mini",color:"olive",content:"Toggle codes",onClick:()=>_(!k)}),x.jsx(Fl,{vertical:!0}),x.jsx(Le,{size:"mini",color:"green",icon:"play",content:"Generate",onClick:()=>C()})]})]}),x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsx(me.HeaderCell,{children:"Type"}),x.jsx(me.HeaderCell,{children:"Table"}),x.jsx(me.HeaderCell,{children:"Name"}),x.jsx(me.HeaderCell,{children:"Code"})]})}),x.jsxs(me.Body,{children:[l&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:l})}),!l&&a.length===0&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:"No prepared migration codes."})}),a.map((O,R)=>x.jsxs(me.Row,{className:"prepared-code",children:[x.jsx(me.Cell,{collapsing:!0,children:O.type}),x.jsx(me.Cell,{collapsing:!0,children:O.table}),x.jsx(me.Cell,{collapsing:!0,children:O.title}),x.jsx(me.Cell,{style:{padding:0,width:700,textAlign:"center"},children:x.jsx(PQe,{code:O.formatted??"",open:k})})]},R))]})]}),x.jsx(Fl,{})]}),x.jsxs("div",{className:"codes",children:[x.jsx("h3",{children:"Migration Code Files"}),x.jsxs("div",{className:"tools",children:[x.jsx("div",{className:"code-buttons",children:x.jsx(Le,{size:"tiny",color:"red",icon:"trash",content:"Delete codes",disabled:y.length===0,onClick:()=>T()})}),x.jsx("div",{className:"conn-preset-buttons",children:["ALL","LOCAL","REMOTE","TESTING","FIXTURE"].map(O=>x.jsx(Le,{color:"black",size:"tiny",content:O,onClick:()=>S(O)},O))}),x.jsxs("div",{className:"conn-action-buttons",children:[x.jsx(Le,{size:"tiny",color:"green",icon:"play",content:"Apply to Latest",disabled:m.length===0||!!l,onClick:()=>w("apply")}),x.jsx(Le,{size:"tiny",color:"red",icon:"refresh",content:"Rollback!!",disabled:m.length===0||!!l,onClick:()=>w("rollback")})]})]}),i&&s&&x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsxs(me.HeaderCell,{children:["Name"," ",x.jsx(Le,{icon:"check",size:"mini",color:"blue",onClick:()=>A()})]}),i.map((O,R)=>x.jsx(me.HeaderCell,{width:"2",className:gi({"conn-selected":m.includes(O.connKey)}),children:x.jsx(ar,{label:`${O.name} / ${O.status}`,disabled:O.status==="error"||!!l,checked:m.includes(O.connKey),onChange:($,N)=>{N.checked?b(ap([...m,O.connKey])):b(m.filter(M=>M!==O.connKey))}})},R))]})}),x.jsxs(me.Body,{children:[i.some(O=>O.status==="error"||!!l)&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:x.jsx("b",{children:"Some connections are in error state. Please check the connection settings and try again."})})}),s.length===0&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:"No migration code files"})}),s.map((O,R)=>x.jsxs(me.Row,{children:[x.jsxs(me.Cell,{children:[x.jsx(ar,{label:O.name,checked:y.includes(O.name),onChange:($,N)=>{N.checked?v(ap([...y,O.name])):v(y.filter(M=>M!==O.name))}})," "," ",x.jsx(Le,{size:"mini",icon:"code",onClick:()=>{Xe.openVscode({absPath:O.path})}})]}),i.map(($,N)=>x.jsx(me.Cell,{className:gi("conn-status",{"conn-selected":m.includes($.connKey)}),children:$.pending.includes(O.name)?x.jsx(Yt,{size:"mini",color:"yellow",icon:"minus",content:"PENDING"}):$.status==="error"||l?x.jsx(Yt,{size:"mini",color:"red",icon:"times",content:"ERROR"}):x.jsx(Yt,{size:"mini",color:"green",icon:"check",content:"APPLIED"})},N))]},R))]})]})]})]})})}function PQe({code:e,open:t}){return x.jsx("div",{className:"code-viewer",children:t?x.jsx("code",{children:e}):x.jsx("div",{children:"Code is collapsed"})})}function $Qe({}){const{data:e}=Xe.useEntities(),{entities:t}=e??{},[n,r]=j.useState({templateGroupName:"Entity",entityIds:[],templateKeys:[],enumIds:[]}),[o,a]=j.useState({open:!1,pathAndCodes:null}),[i,s]=j.useState({}),l=(t??[]).filter(w=>!w.parentId),u=[{name:"Entity",templateKeys:["model","model_test","view_list","view_search_input","view_form","view_id_async_select"]},{name:"Enums",templateKeys:["view_enums_select","view_enums_dropdown"]}],d=(t??[]).filter(w=>n.entityIds.includes(w.id)||n.entityIds.includes(w.parentId??"")).flatMap(w=>Object.keys(w.enumLabels)),p=w=>{r({...n,entityIds:w,enumIds:d.filter(A=>n.enumIds.includes(A))})},h=(w,A)=>{const O=u.find(R=>R.name===w);O&&r({...n,templateGroupName:w,templateKeys:O.templateKeys.filter(R=>A.includes(R)),enumIds:w==="Entity"?[]:n.enumIds})},m=w=>{r({...n,enumIds:d.filter(A=>w.includes(A))})},{data:b,isLoading:y,refetch:v}=Xe.useScaffoldingStatus(n),{statuses:k}=b??{},_=w=>[w.entityId,w.templateKey,w.enumId].join("///"),S=()=>{if(!k)return;const w=k.filter(O=>O.isExists),A=w.every(O=>i[_(O)]?.overwrite??!1);s(A?{}:w.reduce((O,R)=>(O[_(R)]={overwrite:!0},O),{}))},T=()=>{if(!k)return;const w=k.map(A=>({entityId:A.entityId,templateKey:A.templateKey,enumId:A.enumId,overwrite:i[_(A)]?.overwrite??!1}));Xe.scaffoldingGenerate(w).then(()=>{v()}).catch(Ht)},C=w=>{Xe.scaffoldingPreview(w).then(({pathAndCodes:A})=>{a({open:!0,pathAndCodes:A})}).catch(Ht)};return x.jsxs("div",{className:"scaffolding-index",children:[x.jsxs("div",{className:"entities",children:[x.jsx("h3",{children:"Entities"}),x.jsx("div",{className:"button-set",children:n.entityIds.length!==l.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all entities",onClick:()=>p(l.map(w=>w.id))}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all entities",onClick:()=>p([])})}),l.map(w=>x.jsx("div",{className:"entity",id:w.id,children:x.jsx(ar,{label:w.id,checked:n.entityIds.includes(w.id),onChange:(A,{checked:O})=>{p(O?[...n.entityIds,w.id]:n.entityIds.filter(R=>R!==w.id))}})},w.id))]}),x.jsx("div",{className:"template-groups",children:u.map(w=>x.jsxs("div",{className:"template-group",children:[x.jsxs("h4",{children:["Template: ",w.name]}),x.jsx("div",{className:"button-set",children:n.templateGroupName!==w.name||n.templateKeys.length!==w.templateKeys.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all",onClick:()=>h(w.name,w.templateKeys)}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all",onClick:()=>h(w.name,[])})}),w.templateKeys.map(A=>x.jsx("div",{className:"template-key",children:x.jsx(ar,{label:A,checked:n.templateGroupName===w.name&&n.templateKeys.includes(A),onChange:(O,{checked:R})=>{R?h(w.name,[...n.templateKeys,A]):h(w.name,n.templateKeys.filter($=>$!==A))}})},A))]},w.name))}),n.templateGroupName==="Enums"&&x.jsxs("div",{className:"enums-list",children:[x.jsx("h4",{children:"Enums"}),x.jsx("div",{className:"button-set",children:n.enumIds.length!==d.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all enums",onClick:()=>m(d)}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all enums",onClick:()=>m([])})}),d.map(w=>x.jsx("div",{className:"enums",children:x.jsx(ar,{label:w,checked:n.enumIds.includes(w),onChange:(A,{checked:O})=>{m(O?[...n.enumIds,w]:n.enumIds.filter(R=>R!==w))}})},w))]}),x.jsx("div",{className:"content",children:x.jsxs(Ce,{children:[!k&&!y&&x.jsxs("div",{className:"message-box warning",children:["Please select EntityIDs / TemplateKeys",n.templateGroupName==="Enums"?" / EnumIDs":""," to generate"]}),k&&x.jsxs("div",{className:"statuses",children:[k.length>0&&x.jsx(Le,{size:"small",color:"green",icon:"play",content:`Generate ${k.length} template(s) — ${Object.keys(i).length} overwrite`,onClick:()=>T()}),x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsx(me.HeaderCell,{children:"Entity"}),x.jsx(me.HeaderCell,{children:"TemplateKey"}),n.templateGroupName==="Enums"&&x.jsx(me.HeaderCell,{children:"EnumId"}),x.jsx(me.HeaderCell,{children:"Path"}),x.jsx(me.HeaderCell,{children:"IsExists"}),x.jsx(me.HeaderCell,{collapsing:!0,children:x.jsx(Le,{size:"mini",icon:"check",content:"Overwrite",onClick:()=>S()})}),x.jsx(me.HeaderCell,{children:"Preview"})]})}),x.jsx(me.Body,{children:k.map((w,A)=>x.jsxs(me.Row,{positive:!w.isExists,negative:w.isExists,children:[x.jsx(me.Cell,{collapsing:!0,children:w.entityId}),x.jsx(me.Cell,{collapsing:!0,children:w.templateKey}),n.templateGroupName==="Enums"&&x.jsx(me.Cell,{collapsing:!0,children:w.enumId}),x.jsx(me.Cell,{children:w.subPath}),x.jsx(me.Cell,{children:w.isExists?x.jsx(Le,{icon:"code",size:"mini",color:"blue",onClick:()=>{Xe.openVscode({absPath:w.fullPath})}}):x.jsx(mt,{name:"x"})}),x.jsx(me.Cell,{children:w.isExists&&x.jsx(Ce.Group,{children:x.jsx(Ce.Field,{children:x.jsx(ar,{checked:i[_(w)]?.overwrite??!1,onChange:(O,{checked:R})=>{s({...i,[_(w)]:{overwrite:R??!1}})}})})})}),x.jsx(me.Cell,{collapsing:!0,children:x.jsx(Le,{size:"mini",content:"Preview",color:"purple",onClick:()=>C(w)})})]},A))})]})]})]})}),x.jsxs(Yn,{open:o.open,onClose:()=>{a({open:!1,pathAndCodes:null})},children:[x.jsx(Yn.Header,{children:"Preview"}),x.jsx(Yn.Content,{children:x.jsx(Yn.Description,{children:o.pathAndCodes?.map(w=>x.jsxs("div",{className:"preview-item",children:[x.jsx("h4",{children:w.path}),x.jsx("code",{children:w.code})]},w.path))})})]})]})}const MQe=new Ehe({defaultOptions:{queries:{refetchOnWindowFocus:!0,retry:3,retryDelay:3e3}}});Roe.createRoot(document.getElementById("root")).render(x.jsx(_he,{client:MQe,children:x.jsx(lae,{basename:"/sonamu-ui/",children:x.jsxs(aae,{children:[x.jsxs(ss,{path:"/",element:x.jsx(mge,{}),children:[x.jsx(ss,{path:"/entities",element:x.jsx(Lze,{}),children:x.jsx(ss,{path:":entityId",element:x.jsx(qze,{})})}),x.jsx(ss,{path:"/migrations",element:x.jsx(DQe,{})}),x.jsx(ss,{path:"/scaffolding",element:x.jsx($Qe,{})}),x.jsx(ss,{path:"/fixture",element:x.jsx(RQe,{})})]}),x.jsx(ss,{path:"*",element:x.jsx("div",{children:"Page Not Found"})})]})})}))});export default LQe();
92
+ \`\`\``,components:{code({children:m,className:b,node:y,ref:v,...k}){const _=String(m).trimEnd();return x.jsxs("div",{className:"code",children:[x.jsxs("div",{className:"code-header",children:[x.jsx("span",{children:n??t}),x.jsxs("div",{children:[o&&x.jsx(ar,{label:a.every(S=>S)?"전체 해제":"전체 선택",checked:a.every(S=>S),onChange:()=>{const S=a.every(T=>T);i(a.map(()=>!S))}}),x.jsxs(Le,{icon:!0,onClick:()=>h(_),size:"tiny",children:[x.jsx(mt,{name:u?"check circle outline":"clipboard outline"}),u?"복사 완료":"복사"]})]})]}),x.jsx(AQe,{...k,children:_,language:t,style:Bne[r??"materialDark"],renderer:({rows:S,stylesheet:T})=>x.jsx("div",{style:{position:"relative"},children:S.map((C,w)=>{const A=a[w]??!1,O=s===w;return x.jsxs("div",{className:`code-line ${O?"hovered":""}`,style:A?{backgroundColor:"rgba(0, 123, 255, 0.1)"}:{},onMouseEnter:()=>l(w),onMouseLeave:()=>l(null),onClick:()=>o&&p(w),children:[o&&x.jsx(ar,{checked:A,onClick:R=>R.stopPropagation(),onChange:()=>p(w)}),x.jsx("span",{children:C.children?.map((R,$)=>R.type==="element"?x.jsx("span",{className:R.properties.className.join(" "),style:{...R.properties.className.reduce((N,M)=>T[M]?{...N,...T[M]}:N,{}),fontWeight:"normal"},children:R.children.map((N,M)=>x.jsx("span",{children:N.value},M))},$):x.jsx("span",{children:R.value},$))})]},w)})})})]})}}})};function IQe({fixtureRecords:e,onRelationToggle:t,selectedIds:n,setFixtureRecords:r}){const o=Qv(e,a=>a.entityId);return x.jsx("div",{className:"fixture-record-viewer",children:Object.entries(o).map(([a,i])=>x.jsx(jte,{fixtures:i??[],selectedIds:n,onRelationToggle:t,setFixtureRecords:r},a))})}const sG=["development_master","production_master","fixture_remote","test"];function RQe(){const{data:e,isLoading:t}=Xe.useEntities(),[n,r]=j.useState("development_master"),[o,a]=j.useState("test"),[i,s]=j.useState([]),[l,u]=j.useState([]),[d,p]=j.useState(new Set),[h,m]=j.useState(0),[b,y]=j.useState("table"),[v,k]=j.useState({}),[_,S]=j.useState(""),[T,C]=j.useState([]),[w,A]=j.useState(!1),[O,R]=j.useState("chat"),{form:$,register:N}=em(Ve({entityId:ie(),field:ie(),value:ie(),searchType:Br(["equals","like"])}),{entityId:"",field:"id",value:"",searchType:"equals"}),[M,V]=j.useState(null),z=e?.entities?.find(U=>U.id===_)??null,H=()=>{if(!$.entityId||!$.field||!$.value)return;m(0),s([]),u([]),p(new Set);const U=Object.keys(v).length>0?{columns:v}:void 0;Xe.getFixtures(n,o,$,U).then(K=>{s(K),p(new Set(K.map(P=>P.fixtureId)))}).catch(Ht)},W=()=>{i.length!==0&&(m(1),Xe.importFixtures(o,i).then(U=>{u(U)}).catch(Ht))},G=async(U,K,P,Z)=>{const L=`${K}#${P}`,X=Object.keys(v).length>0?{columns:v}:void 0;if(Z)Xe.getFixtures(n,o,{entityId:K,field:"id",value:String(P),searchType:"equals"},X).then(ne=>{const te=i.find(pe=>pe.fixtureId===U);te&&te.fetchedRecords.push(L);const ae=ne.filter(pe=>!i.some(be=>be.fixtureId===pe.fixtureId));s(pe=>Array.from([...pe,...ae])),p(pe=>{const be=new Set(pe);return ae.forEach(xe=>{be.add(xe.fixtureId)}),be})}).catch(Ht);else{const ne=i.find(pe=>pe.fixtureId===U);if(!ne)return;ne.fetchedRecords=ne.fetchedRecords.filter(pe=>pe!==L);const te=new Set([L]),ae=i.find(pe=>pe.fixtureId===L);if(ae?.fetchedRecords.length){const pe=new Set([U]);i.forEach(be=>{be.fixtureId!==L&&be.fetchedRecords.forEach(xe=>{pe.add(xe)})}),ae?.fetchedRecords.forEach(be=>{pe.has(be)||te.add(be)})}else{const pe=new Set,be=xe=>{pe.has(xe)||(pe.add(xe),i.forEach(Ie=>{Ie.belongsRecords.includes(xe)&&be(Ie.fixtureId)}))};be(L)}p(pe=>{const be=new Set(pe);return te.forEach(xe=>{be.delete(xe)}),be}),s(pe=>pe.filter(be=>!te.has(be.fixtureId)))}},q=()=>{!_||T.length===0||(k(U=>({...U,[_]:T})),S(""),C([]))},Q=U=>{k(K=>{const{[U]:P,...Z}=K;return Z})};j.useEffect(()=>{if($.entityId&&e?.entities){const U=e.entities.find(K=>K.id===$.entityId);U&&V(U)}},[$.entityId,e]),j.useEffect(()=>{C([])},[]);const F=[{menuItem:"Fixture Record Viewer",render:()=>x.jsx(ps.Pane,{children:b==="table"?x.jsx(IQe,{fixtureRecords:i,onRelationToggle:G,selectedIds:d,setFixtureRecords:s}):x.jsx(z5e,{fixtures:i,selectedIds:d,onRelationToggle:G,setFixtureRecords:s})})},{menuItem:"Fixture Code Viewer",render:()=>x.jsx(ps.Pane,{children:e?.entities&&l.length>0&&x.jsx(CQe,{entities:e.entities,fixtureResults:l,targetDB:o})})}];return x.jsxs("div",{className:"fixture-index",children:[x.jsx("div",{className:"fixture-sidebar",children:x.jsxs(un,{className:"fixture-header",children:[x.jsxs("div",{className:"search-section",children:[x.jsxs("div",{className:"search-title",children:[x.jsx(mt,{name:"search",style:{marginRight:"5px"}}),"검색 대상 설정"]}),x.jsx("div",{className:"db-dropdown-wrapper",children:x.jsx(Ct,{fluid:!0,placeholder:"검색할 DB 선택",selection:!0,options:sG.map(U=>({key:U,value:U,text:U.replace("_master","")})),value:n,onChange:(U,{value:K})=>r(K)})}),x.jsx("div",{style:{flexGrow:1,minWidth:"200px"},children:x.jsx(Ct,{fluid:!0,placeholder:"엔티티 선택",search:!0,selection:!0,loading:t,options:e?.entities?.map(U=>({key:U.id,value:U.id,text:U.id}))||[],...N("entityId")})}),M&&x.jsxs(x.Fragment,{children:[x.jsx(Ct,{placeholder:"컬럼 선택",selection:!0,options:M.props.filter(U=>U.type==="virtual"?!1:U.type==="relation"?!!(U.relationType==="BelongsToOne"||U.relationType==="OneToOne"&&U.hasJoinColumn):!0).map(U=>({key:U.name,value:U.name,text:U.name})),...N("field")}),x.jsx(vr,{placeholder:"검색 값 입력",...N("value"),style:{flexGrow:1}}),x.jsx(Ct,{selection:!0,options:[{key:"equals",text:"Equals",value:"equals"},{key:"like",text:"Like",value:"like"}],...N("searchType")})]}),x.jsx(Le,{onClick:H,disabled:!$.entityId||!$.field||!$.value||t,loading:t,primary:!0,content:"검색"})]}),x.jsxs("div",{className:"save-section",children:[x.jsxs("button",{type:"button",className:"save-title",style:{cursor:"pointer",background:"none",border:"none",padding:0,display:"flex",alignItems:"center",width:"100%",textAlign:"left"},onClick:()=>A(!w),children:[x.jsx(mt,{name:w?"chevron down":"chevron right"}),x.jsx(mt,{name:"database",style:{marginRight:"5px"}}),"저장 DB 설정",i.length>0&&(()=>{const U=i.filter(K=>{const P=!!K.target,Z=!!K.unique;return!!(!P&&!Z||K.override&&(P||Z))});return x.jsxs(Yt,{color:"green",size:"small",style:{marginLeft:"auto"},children:[U.length,"개 저장 예정"]})})()]}),x.jsx("div",{className:"db-dropdown-wrapper",children:x.jsx(Ct,{fluid:!0,placeholder:"저장할 대상 DB 선택",header:"Fixture Target DB",selection:!0,options:sG.map(U=>({key:U,value:U,text:U})),value:o,onChange:(U,{value:K})=>a(K)})}),x.jsx(Le,{onClick:W,color:"blue",content:"저장",disabled:i.length===0}),w&&i.length>0&&(()=>{const K=i.filter(P=>{const Z=!!P.target,L=!!P.unique;return!!(!Z&&!L||P.override&&(Z||L))}).reduce((P,Z)=>(P[Z.entityId]||(P[Z.entityId]=[]),P[Z.entityId].push(Z),P),{});return x.jsxs("div",{style:{marginTop:"10px",marginBottom:"10px"},children:[x.jsx("p",{style:{color:"#666",fontSize:"12px",marginBottom:"10px"},children:"저장될 픽스쳐 목록"}),x.jsx("div",{className:"fixture-record-group",children:Object.entries(K).map(([P,Z])=>x.jsxs("div",{style:{padding:"8px",backgroundColor:"#f9f9f9",borderRadius:"4px"},children:[x.jsxs("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:[P," (",Z.length,"개)"]}),x.jsx("div",{style:{fontSize:"12px",color:"#555"},children:Z.map(L=>{const X=!!L.target,ne=!!L.unique;let te="신규";return L.override&&(X||ne)&&(te="덮어쓰기"),x.jsxs(Yt,{size:"tiny",style:{margin:"2px"},children:["#",L.id,x.jsx(Yt.Detail,{children:te})]},L.fixtureId)})})]},P))})]})})()]}),O==="chat"?x.jsx(Gze,{fixtureRecords:i,onUpdateFixtures:U=>{s(U);const K=new Set(i.map(Z=>Z.fixtureId)),P=U.filter(Z=>!K.has(Z.fixtureId)).map(Z=>Z.fixtureId);P.length>0&&p(Z=>new Set([...Z,...P]))}}):x.jsxs("div",{className:"duplicate-check-section",children:[x.jsxs("p",{style:{color:"#666",fontSize:"11px"},children:["엔티티별로 중복 확인에 사용할 컬럼을 지정합니다. ",x.jsx("br",{}),"지정하지 않으면 unique index만 사용합니다."]}),x.jsx(Ct,{placeholder:"엔티티 선택",search:!0,selection:!0,clearable:!0,loading:t,options:e?.entities?.filter(U=>!v[U.id]).map(U=>({key:U.id,value:U.id,text:U.id}))||[],value:_,onChange:(U,{value:K})=>S(K)}),x.jsx(Ct,{placeholder:"중복 확인 컬럼 선택",multiple:!0,selection:!0,disabled:!z,options:z?.props.filter(U=>U.type==="virtual"?!1:U.type==="relation"?!!(U.relationType==="BelongsToOne"||U.relationType==="OneToOne"&&U.hasJoinColumn):!0).map(U=>({key:U.name,value:U.name,text:U.name}))||[],value:T,onChange:(U,{value:K})=>C(K)}),x.jsx(Le,{icon:"plus",color:"blue",size:"small",disabled:!_||T.length===0,onClick:q}),Object.keys(v).length>0&&x.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"8px"},children:Object.entries(v).map(([U,K])=>x.jsxs(Yt,{size:"medium",style:{display:"flex",alignItems:"center",gap:"6px",padding:"8px 12px"},children:[x.jsx("span",{style:{fontWeight:"bold"},children:U}),x.jsxs("span",{style:{color:"#666"},children:["(",K.join(", "),")"]}),x.jsx(mt,{name:"delete",style:{cursor:"pointer",marginLeft:"4px"},onClick:()=>Q(U)})]},U))})]})]})}),x.jsx("div",{className:"fixture-main",children:x.jsxs("div",{className:"fixture-viewer",children:[x.jsx("div",{style:{display:"flex",justifyContent:"flex-end",marginBottom:"15px"},children:x.jsx(Le,{onClick:()=>y(b==="table"?"graph":"table"),content:b==="table"?"그래프 보기":"테이블 보기",icon:b==="table"?"sitemap":"table",basic:!0,color:"grey"})}),x.jsx(ps,{panes:F,activeIndex:h,onTabChange:(U,{activeIndex:K})=>{typeof K=="number"&&m(K)},style:{boxShadow:"0 5px 15px rgba(0, 0, 0, 0.08)",borderRadius:"12px",overflow:"hidden"}})]})})]})}function NQe({action:e,targets:t,conns:n}){const[r,o]=j.useState(!1),{doneModal:a}=Ls(),{form:i,register:s}=em(Ve({doShadowDbTesting:ct()}),{doShadowDbTesting:e==="apply"}),l=async()=>{o(!0);try{i.doShadowDbTesting&&await Xe.migrationsRunAction("shadow",t),await Xe.migrationsRunAction(e,t),a()}catch(u){Ht(u)}finally{o(!1)}};return x.jsx("div",{className:"form migration-commit-form",children:x.jsx(un,{padded:!0,basic:!0,loading:r,children:x.jsxs(un,{padded:!0,color:"green",children:[x.jsx("div",{className:"header-row",children:x.jsx(Or,{children:"Migrations Action Form"})}),x.jsxs(un,{basic:!0,children:[x.jsxs("div",{children:[x.jsxs("h4",{children:["Action: ",e.toUpperCase()]}),x.jsx("p",{children:" "})]}),x.jsxs("div",{className:"targets",children:[x.jsx("h4",{children:"Targets"}),x.jsx("div",{className:"conns",children:n.map(u=>x.jsxs("div",{className:gi("conn",{"is-targeted":t.includes(u.connKey)}),children:[t.includes(u.connKey)&&x.jsx(mt,{name:"check"}),u.name]},u.name))})]}),e==="apply"&&x.jsxs("div",{className:"shadow-db-testing",children:[x.jsx("h4",{children:"Shadow DB Testing"}),x.jsx(Kf,{...s("doShadowDbTesting")})]}),x.jsx("div",{className:"text-center",style:{marginTop:"2em"},children:x.jsx(Le,{color:"green",onClick:()=>l(),icon:"play",content:"Commit"})})]})]})})})}function DQe(e){const{data:t,error:n,refetch:r}=Xe.useMigrationStatus(),{status:o}=t??{},{preparedCodes:a,conns:i,codes:s}=o??{},l=o?.error,{openModal:u}=Ls(),d=!n&&!t,[p,h]=j.useState(!1),[m,b]=j.useState([]),[y,v]=j.useState([]),[k,_]=j.useState(!1),S=O=>{const R=(()=>{switch(O){case"ALL":return["test","fixture","development_master","production_master"];case"LOCAL":return["test"];case"REMOTE":return["fixture","development_master","production_master"];case"TESTING":return["test","fixture"];case"FIXTURE":return["fixture"]}})();R.filter($=>m.includes($)).length===R.length?b(m.filter($=>!R.includes($))):Qpe(R,m).length>0?b(R):b(ap([...m,...R]))},T=()=>{y.length===0||!confirm(`Are you sure to delete the selected ${y.length} migration codes?`)||(h(!0),Xe.migrationsDelCodes(y).then(()=>{r()}).catch(Ht).finally(()=>{h(!1)}))},C=()=>{h(!0),Xe.migrationsGeneratePreparedCodes().then(()=>{setTimeout(()=>{r()},500)}).catch(Ht).finally(()=>{h(!1)})},w=(O,R)=>{if(!i)return;const $=m;u(x.jsx(NQe,{action:O,targets:$,conns:i}),{onCompleted:()=>{r()}})},A=()=>{s&&(y.length===0?v(s.map(O=>O.name)):v([]))};return n?x.jsx("div",{className:"migrations-index",children:x.jsx("div",{className:"message-box error",children:n.message})}):x.jsx("div",{className:"migrations-index",children:x.jsxs(un,{className:"migrations-index",loading:p||d,children:[a&&x.jsxs("div",{className:"prepared",children:[x.jsxs("h3",{children:["Prepared Migration Codes"," ",x.jsxs("div",{className:"buttons",children:[x.jsx(Le,{icon:`toggle ${k?"on":"off"}`,size:"mini",color:"olive",content:"Toggle codes",onClick:()=>_(!k)}),x.jsx(Fl,{vertical:!0}),x.jsx(Le,{size:"mini",color:"green",icon:"play",content:"Generate",onClick:()=>C()})]})]}),x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsx(me.HeaderCell,{children:"Type"}),x.jsx(me.HeaderCell,{children:"Table"}),x.jsx(me.HeaderCell,{children:"Name"}),x.jsx(me.HeaderCell,{children:"Code"})]})}),x.jsxs(me.Body,{children:[l&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:l})}),!l&&a.length===0&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:"No prepared migration codes."})}),a.map((O,R)=>x.jsxs(me.Row,{className:"prepared-code",children:[x.jsx(me.Cell,{collapsing:!0,children:O.type}),x.jsx(me.Cell,{collapsing:!0,children:O.table}),x.jsx(me.Cell,{collapsing:!0,children:O.title}),x.jsx(me.Cell,{style:{padding:0,width:700,textAlign:"center"},children:x.jsx(PQe,{code:O.formatted??"",open:k})})]},R))]})]}),x.jsx(Fl,{})]}),x.jsxs("div",{className:"codes",children:[x.jsx("h3",{children:"Migration Code Files"}),x.jsxs("div",{className:"tools",children:[x.jsx("div",{className:"code-buttons",children:x.jsx(Le,{size:"tiny",color:"red",icon:"trash",content:"Delete codes",disabled:y.length===0,onClick:()=>T()})}),x.jsx("div",{className:"conn-preset-buttons",children:["ALL","LOCAL","REMOTE","TESTING","FIXTURE"].map(O=>x.jsx(Le,{color:"black",size:"tiny",content:O,onClick:()=>S(O)},O))}),x.jsxs("div",{className:"conn-action-buttons",children:[x.jsx(Le,{size:"tiny",color:"green",icon:"play",content:"Apply to Latest",disabled:m.length===0||!!l,onClick:()=>w("apply")}),x.jsx(Le,{size:"tiny",color:"red",icon:"refresh",content:"Rollback!!",disabled:m.length===0||!!l,onClick:()=>w("rollback")})]})]}),i&&s&&x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsxs(me.HeaderCell,{children:["Name"," ",x.jsx(Le,{icon:"check",size:"mini",color:"blue",onClick:()=>A()})]}),i.map((O,R)=>x.jsx(me.HeaderCell,{width:"2",className:gi({"conn-selected":m.includes(O.connKey)}),children:x.jsx(ar,{label:`${O.name} / ${O.status}`,disabled:O.status==="error"||!!l,checked:m.includes(O.connKey),onChange:($,N)=>{N.checked?b(ap([...m,O.connKey])):b(m.filter(M=>M!==O.connKey))}})},R))]})}),x.jsxs(me.Body,{children:[i.some(O=>O.status==="error"||!!l)&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:x.jsx("b",{children:"Some connections are in error state. Please check the connection settings and try again."})})}),s.length===0&&x.jsx(me.Row,{className:"table-empty",children:x.jsx(me.Cell,{colSpan:6,children:"No migration code files"})}),s.map((O,R)=>x.jsxs(me.Row,{children:[x.jsxs(me.Cell,{children:[x.jsx(ar,{label:O.name,checked:y.includes(O.name),onChange:($,N)=>{N.checked?v(ap([...y,O.name])):v(y.filter(M=>M!==O.name))}})," "," ",x.jsx(Le,{size:"mini",icon:"code",onClick:()=>{Xe.openVscode({absPath:O.path})}})]}),i.map(($,N)=>x.jsx(me.Cell,{className:gi("conn-status",{"conn-selected":m.includes($.connKey)}),children:$.pending.includes(O.name)?x.jsx(Yt,{size:"mini",color:"yellow",icon:"minus",content:"PENDING"}):$.status==="error"||l?x.jsx(Yt,{size:"mini",color:"red",icon:"times",content:"ERROR"}):x.jsx(Yt,{size:"mini",color:"green",icon:"check",content:"APPLIED"})},N))]},R))]})]})]})]})})}function PQe({code:e,open:t}){return x.jsx("div",{className:"code-viewer",children:t?x.jsx("code",{children:e}):x.jsx("div",{children:"Code is collapsed"})})}function $Qe({}){const{data:e}=Xe.useEntities(),{entities:t}=e??{},[n,r]=j.useState({templateGroupName:"Entity",entityIds:[],templateKeys:[],enumIds:[]}),[o,a]=j.useState({open:!1,pathAndCodes:null}),[i,s]=j.useState({}),l=(t??[]).filter(w=>!w.parentId),u=[{name:"Entity",templateKeys:["model","model_test","view_list","view_search_input","view_form","view_id_async_select"]},{name:"Enums",templateKeys:["view_enums_select","view_enums_dropdown"]}],d=(t??[]).filter(w=>n.entityIds.includes(w.id)||n.entityIds.includes(w.parentId??"")).flatMap(w=>Object.keys(w.enumLabels)),p=w=>{r({...n,entityIds:w,enumIds:d.filter(A=>n.enumIds.includes(A))})},h=(w,A)=>{const O=u.find(R=>R.name===w);O&&r({...n,templateGroupName:w,templateKeys:O.templateKeys.filter(R=>A.includes(R)),enumIds:w==="Entity"?[]:n.enumIds})},m=w=>{r({...n,enumIds:d.filter(A=>w.includes(A))})},{data:b,isLoading:y,refetch:v}=Xe.useScaffoldingStatus(n),{statuses:k}=b??{},_=w=>[w.entityId,w.templateKey,w.enumId].join("///"),S=()=>{if(!k)return;const w=k.filter(O=>O.isExists),A=w.every(O=>i[_(O)]?.overwrite??!1);s(A?{}:w.reduce((O,R)=>(O[_(R)]={overwrite:!0},O),{}))},T=()=>{if(!k)return;const w=k.map(A=>({entityId:A.entityId,templateKey:A.templateKey,enumId:A.enumId,overwrite:i[_(A)]?.overwrite??!1}));Xe.scaffoldingGenerate(w).then(()=>{v()}).catch(Ht)},C=w=>{Xe.scaffoldingPreview(w).then(({pathAndCodes:A})=>{a({open:!0,pathAndCodes:A})}).catch(Ht)};return x.jsxs("div",{className:"scaffolding-index",children:[x.jsxs("div",{className:"entities",children:[x.jsx("h3",{children:"Entities"}),x.jsx("div",{className:"button-set",children:n.entityIds.length!==l.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all entities",onClick:()=>p(l.map(w=>w.id))}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all entities",onClick:()=>p([])})}),l.map(w=>x.jsx("div",{className:"entity",id:w.id,children:x.jsx(ar,{label:w.id,checked:n.entityIds.includes(w.id),onChange:(A,{checked:O})=>{p(O?[...n.entityIds,w.id]:n.entityIds.filter(R=>R!==w.id))}})},w.id))]}),x.jsx("div",{className:"template-groups",children:u.map(w=>x.jsxs("div",{className:"template-group",children:[x.jsxs("h4",{children:["Template: ",w.name]}),x.jsx("div",{className:"button-set",children:n.templateGroupName!==w.name||n.templateKeys.length!==w.templateKeys.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all",onClick:()=>h(w.name,w.templateKeys)}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all",onClick:()=>h(w.name,[])})}),w.templateKeys.map(A=>x.jsx("div",{className:"template-key",children:x.jsx(ar,{label:A,checked:n.templateGroupName===w.name&&n.templateKeys.includes(A),onChange:(O,{checked:R})=>{R?h(w.name,[...n.templateKeys,A]):h(w.name,n.templateKeys.filter($=>$!==A))}})},A))]},w.name))}),n.templateGroupName==="Enums"&&x.jsxs("div",{className:"enums-list",children:[x.jsx("h4",{children:"Enums"}),x.jsx("div",{className:"button-set",children:n.enumIds.length!==d.length?x.jsx(Le,{size:"mini",icon:"check",content:"Check all enums",onClick:()=>m(d)}):x.jsx(Le,{size:"mini",icon:"check",content:"Uncheck all enums",onClick:()=>m([])})}),d.map(w=>x.jsx("div",{className:"enums",children:x.jsx(ar,{label:w,checked:n.enumIds.includes(w),onChange:(A,{checked:O})=>{m(O?[...n.enumIds,w]:n.enumIds.filter(R=>R!==w))}})},w))]}),x.jsx("div",{className:"content",children:x.jsxs(Ce,{children:[!k&&!y&&x.jsxs("div",{className:"message-box warning",children:["Please select EntityIDs / TemplateKeys",n.templateGroupName==="Enums"?" / EnumIDs":""," to generate"]}),k&&x.jsxs("div",{className:"statuses",children:[k.length>0&&x.jsx(Le,{size:"small",color:"green",icon:"play",content:`Generate ${k.length} template(s) — ${Object.keys(i).length} overwrite`,onClick:()=>T()}),x.jsxs(me,{celled:!0,selectable:!0,children:[x.jsx(me.Header,{children:x.jsxs(me.Row,{children:[x.jsx(me.HeaderCell,{children:"Entity"}),x.jsx(me.HeaderCell,{children:"TemplateKey"}),n.templateGroupName==="Enums"&&x.jsx(me.HeaderCell,{children:"EnumId"}),x.jsx(me.HeaderCell,{children:"Path"}),x.jsx(me.HeaderCell,{children:"IsExists"}),x.jsx(me.HeaderCell,{collapsing:!0,children:x.jsx(Le,{size:"mini",icon:"check",content:"Overwrite",onClick:()=>S()})}),x.jsx(me.HeaderCell,{children:"Preview"})]})}),x.jsx(me.Body,{children:k.map((w,A)=>x.jsxs(me.Row,{positive:!w.isExists,negative:w.isExists,children:[x.jsx(me.Cell,{collapsing:!0,children:w.entityId}),x.jsx(me.Cell,{collapsing:!0,children:w.templateKey}),n.templateGroupName==="Enums"&&x.jsx(me.Cell,{collapsing:!0,children:w.enumId}),x.jsx(me.Cell,{children:w.subPath}),x.jsx(me.Cell,{children:w.isExists?x.jsx(Le,{icon:"code",size:"mini",color:"blue",onClick:()=>{Xe.openVscode({absPath:w.fullPath})}}):x.jsx(mt,{name:"x"})}),x.jsx(me.Cell,{children:w.isExists&&x.jsx(Ce.Group,{children:x.jsx(Ce.Field,{children:x.jsx(ar,{checked:i[_(w)]?.overwrite??!1,onChange:(O,{checked:R})=>{s({...i,[_(w)]:{overwrite:R??!1}})}})})})}),x.jsx(me.Cell,{collapsing:!0,children:x.jsx(Le,{size:"mini",content:"Preview",color:"purple",onClick:()=>C(w)})})]},A))})]})]})]})}),x.jsxs(Yn,{open:o.open,onClose:()=>{a({open:!1,pathAndCodes:null})},children:[x.jsx(Yn.Header,{children:"Preview"}),x.jsx(Yn.Content,{children:x.jsx(Yn.Description,{children:o.pathAndCodes?.map(w=>x.jsxs("div",{className:"preview-item",children:[x.jsx("h4",{children:w.path}),x.jsx("code",{children:w.code})]},w.path))})})]})]})}const MQe=new Ehe({defaultOptions:{queries:{refetchOnWindowFocus:!0,retry:3,retryDelay:3e3}}});Roe.createRoot(document.getElementById("root")).render(x.jsx(_he,{client:MQe,children:x.jsx(lae,{basename:"/sonamu-ui/",children:x.jsxs(aae,{children:[x.jsxs(ss,{path:"/",element:x.jsx(mge,{}),children:[x.jsx(ss,{path:"/entities",element:x.jsx(Lze,{}),children:x.jsx(ss,{path:":entityId",element:x.jsx(qze,{})})}),x.jsx(ss,{path:"/migrations",element:x.jsx(DQe,{})}),x.jsx(ss,{path:"/scaffolding",element:x.jsx($Qe,{})}),x.jsx(ss,{path:"/fixture",element:x.jsx(RQe,{})})]}),x.jsx(ss,{path:"*",element:x.jsx("div",{children:"Page Not Found"})})]})})}))});export default LQe();
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>{{projectName}}: Sonamu UI</title>
7
- <script type="module" crossorigin src="/sonamu-ui/assets/index-DFqVuxOB.js"></script>
7
+ <script type="module" crossorigin src="/sonamu-ui/assets/index-B87IyofX.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/sonamu-ui/assets/index-CpaB9P6g.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.18",
3
+ "version": "0.7.20",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -21,6 +21,10 @@
21
21
  "import": "./dist/vector/index.js",
22
22
  "types": "./dist/vector/index.d.ts"
23
23
  },
24
+ "./storage": {
25
+ "import": "./dist/storage/index.js",
26
+ "types": "./dist/storage/index.d.ts"
27
+ },
24
28
  "./ai/providers/rtzr": {
25
29
  "import": "./dist/ai/providers/rtzr/index.js",
26
30
  "types": "./dist/ai/providers/rtzr/index.d.ts"
@@ -68,6 +72,7 @@
68
72
  "fastify": "^4.23.2",
69
73
  "fastify-qs": "^4.0.0",
70
74
  "fastify-sse-v2": "^4.2.1",
75
+ "flydrive": "^1.3.0",
71
76
  "inflection": "^1.13.2",
72
77
  "knex": "^3.1.0",
73
78
  "mime-types": "^3.0.1",
package/src/api/config.ts CHANGED
@@ -8,7 +8,7 @@ import type { FastifyInstance, FastifyReply, FastifyRequest, FastifyServerOption
8
8
  import type { QsPluginOptions } from "fastify-qs";
9
9
  import type { SsePluginOptions } from "fastify-sse-v2/lib/types";
10
10
  import type { Knex } from "knex";
11
- import type { Driver } from "../file-storage/driver";
11
+ import type { StorageConfig } from "../storage/types";
12
12
  import type { WorkflowOptions } from "../tasks/workflow-manager";
13
13
  import type { Executable, SonamuFastifyConfig } from "../types/types";
14
14
  import type { AuthContext, Context } from "./context";
@@ -44,7 +44,8 @@ export type SonamuConfig = {
44
44
  development_slave?: DatabaseConfig;
45
45
  production?: DatabaseConfig;
46
46
  production_slave?: DatabaseConfig;
47
- remote_fixture?: DatabaseConfig;
47
+ fixture?: DatabaseConfig;
48
+ test?: DatabaseConfig;
48
49
  };
49
50
  };
50
51
 
@@ -84,7 +85,24 @@ export type SonamuServerOptions = {
84
85
 
85
86
  apiConfig: SonamuFastifyConfig;
86
87
 
87
- storage?: Driver;
88
+ /**
89
+ * Storage 드라이버 설정.
90
+ * DRIVE_DISK 환경변수로 사용할 드라이버를 선택합니다. (기본값: default 키)
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * import { drivers } from "sonamu/storage";
95
+ *
96
+ * storage: {
97
+ * default: process.env.DRIVE_DISK ?? "fs",
98
+ * drivers: {
99
+ * fs: drivers.fs({ location: "./uploads", urlBuilder: { ... } }),
100
+ * s3: drivers.s3({ bucket: "my-bucket", region: "ap-northeast-2", ... }),
101
+ * }
102
+ * }
103
+ * ```
104
+ */
105
+ storage?: StorageConfig;
88
106
 
89
107
  lifecycle?: {
90
108
  onStart?: (server: FastifyInstance) => Promise<void> | void;
@@ -2,8 +2,8 @@ import type { FastifyReply, FastifyRequest, PassportUser } from "fastify";
2
2
  import type { RouteGenericInterface } from "fastify/types/route";
3
3
  import type { IncomingHttpHeaders, IncomingMessage, Server, ServerResponse } from "http";
4
4
  import type { ZodObject } from "zod";
5
- import type { FileStorage } from "../file-storage/file-storage";
6
5
  import type { NaiteStore } from "../naite/naite";
6
+ import type { UploadedFile } from "../storage/uploaded-file";
7
7
  import type { createSSEFactory } from "../stream/sse";
8
8
 
9
9
  // biome-ignore lint/suspicious/noEmptyInterface: Context 확장 타입
@@ -26,6 +26,6 @@ export type AuthContext = {
26
26
  };
27
27
 
28
28
  export type UploadContext = {
29
- file?: FileStorage;
30
- files: FileStorage[];
29
+ file?: UploadedFile;
30
+ files: UploadedFile[];
31
31
  };