sonamu 0.8.13 → 0.8.14

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 (96) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +2 -3
  3. package/dist/auth/auth-generator.d.ts +8 -0
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +33 -1
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +12 -2
  8. package/dist/bin/cli.js +18 -3
  9. package/dist/cone/cone-generator.js +10 -4
  10. package/dist/database/knex.d.ts.map +1 -1
  11. package/dist/database/knex.js +64 -2
  12. package/dist/database/puri.d.ts +9 -1
  13. package/dist/database/puri.d.ts.map +1 -1
  14. package/dist/database/puri.js +42 -1
  15. package/dist/database/puri.types.d.ts +2 -0
  16. package/dist/database/puri.types.d.ts.map +1 -1
  17. package/dist/database/puri.types.js +6 -2
  18. package/dist/entity/entity-manager.d.ts +149 -1
  19. package/dist/entity/entity-manager.d.ts.map +1 -1
  20. package/dist/entity/entity-manager.js +68 -4
  21. package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
  22. package/dist/migration/code-generation.d.ts.map +1 -1
  23. package/dist/migration/code-generation.js +696 -32
  24. package/dist/migration/migration-set.js +3 -1
  25. package/dist/migration/postgresql-schema-reader.d.ts +16 -2
  26. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  27. package/dist/migration/postgresql-schema-reader.js +281 -7
  28. package/dist/stream/sse.js +5 -3
  29. package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
  30. package/dist/template/generated.template.test-d.js +24 -0
  31. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  32. package/dist/template/implementations/generated.template.js +2 -2
  33. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  34. package/dist/template/implementations/init_types.template.js +11 -3
  35. package/dist/template/zod-converter.d.ts.map +1 -1
  36. package/dist/template/zod-converter.js +6 -2
  37. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  38. package/dist/testing/dev-test-routes.js +5 -3
  39. package/dist/testing/fixture-generator.d.ts +13 -0
  40. package/dist/testing/fixture-generator.d.ts.map +1 -1
  41. package/dist/testing/fixture-generator.js +105 -8
  42. package/dist/testing/fixture-manager.d.ts.map +1 -1
  43. package/dist/testing/fixture-manager.js +19 -2
  44. package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
  45. package/dist/types/types.d.ts +494 -1
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/types.js +117 -13
  48. package/dist/ui/api.d.ts.map +1 -1
  49. package/dist/ui/api.js +14 -2
  50. package/dist/ui/cdd-service.d.ts +16 -14
  51. package/dist/ui/cdd-service.d.ts.map +1 -1
  52. package/dist/ui/cdd-service.js +145 -37
  53. package/dist/ui/cdd-types.d.ts +60 -0
  54. package/dist/ui/cdd-types.d.ts.map +1 -0
  55. package/dist/ui/cdd-types.js +3 -0
  56. package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
  57. package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
  58. package/dist/ui-web/index.html +2 -2
  59. package/package.json +7 -3
  60. package/src/api/sonamu.ts +1 -2
  61. package/src/auth/auth-generator.ts +38 -0
  62. package/src/auth/better-auth-entities.ts +18 -1
  63. package/src/bin/cli.ts +15 -1
  64. package/src/cone/cone-generator.ts +9 -3
  65. package/src/database/knex.ts +62 -4
  66. package/src/database/puri.ts +71 -0
  67. package/src/database/puri.types.ts +2 -0
  68. package/src/entity/entity-manager.ts +95 -3
  69. package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
  70. package/src/migration/code-generation.ts +848 -34
  71. package/src/migration/migration-set.ts +2 -0
  72. package/src/migration/postgresql-schema-reader.ts +366 -9
  73. package/src/skills/sonamu/auth-migration.md +80 -0
  74. package/src/skills/sonamu/cdd.md +148 -28
  75. package/src/skills/sonamu/cone.md +16 -0
  76. package/src/skills/sonamu/entity-relations.md +1 -1
  77. package/src/skills/sonamu/fixture-cli.md +4 -0
  78. package/src/skills/sonamu/frontend.md +65 -0
  79. package/src/skills/sonamu/migration.md +3 -1
  80. package/src/skills/sonamu/model.md +28 -0
  81. package/src/skills/sonamu/workflow.md +12 -5
  82. package/src/stream/sse.ts +4 -2
  83. package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
  84. package/src/template/generated.template.test-d.ts +46 -0
  85. package/src/template/implementations/generated.template.ts +4 -1
  86. package/src/template/implementations/init_types.template.ts +20 -5
  87. package/src/template/zod-converter.ts +5 -0
  88. package/src/testing/dev-test-routes.ts +4 -2
  89. package/src/testing/fixture-generator.ts +157 -9
  90. package/src/testing/fixture-manager.ts +15 -1
  91. package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
  92. package/src/types/types.ts +168 -12
  93. package/src/ui/api.ts +24 -1
  94. package/src/ui/cdd-service.ts +195 -55
  95. package/src/ui/cdd-types.ts +73 -0
  96. package/dist/ui-web/assets/index-egkMxKos.css +0 -1
package/dist/bin/cli.js CHANGED
@@ -11,7 +11,7 @@ import path from "path";
11
11
  import process from "process";
12
12
  import { tsicli } from "tsicli";
13
13
  import { Sonamu } from "../api/index.js";
14
- import { generateBetterAuthEntities } from "../auth/auth-generator.js";
14
+ import { addCompanionsToEntities, generateBetterAuthEntities } from "../auth/auth-generator.js";
15
15
  import { isValidPluginId, SUPPORTED_PLUGIN_IDS } from "../auth/plugins/entity-definitions/index.js";
16
16
  import { EntityManager } from "../entity/entity-manager.js";
17
17
  import { Migrator } from "../migration/migrator.js";
@@ -262,6 +262,10 @@ async function bootstrap() {
262
262
  [
263
263
  "auth",
264
264
  "generate"
265
+ ],
266
+ [
267
+ "auth",
268
+ "add-companions"
265
269
  ]
266
270
  ],
267
271
  runners: {
@@ -292,7 +296,8 @@ async function bootstrap() {
292
296
  skills_sync,
293
297
  skills_create,
294
298
  test: testCommand,
295
- auth_generate
299
+ auth_generate,
300
+ "auth_add-companions": auth_add_companions
296
301
  }
297
302
  });
298
303
  } finally{
@@ -1194,6 +1199,16 @@ status: draft
1194
1199
  plugins
1195
1200
  });
1196
1201
  }
1202
+ /**
1203
+ * pnpm sonamu auth add-companions 하면 실행되는 함수입니다.
1204
+ * 기존 프로젝트의 entity.json에 fixtureCompanions를 소급 추가합니다.
1205
+ *
1206
+ * 이미 fixtureCompanions가 있는 entity는 스킵합니다 (덮어쓰기 없음).
1207
+ */ async function auth_add_companions() {
1208
+ console.log(chalk.yellow.bold("🔐 Adding fixtureCompanions to better-auth entities...\n"));
1209
+ await addCompanionsToEntities();
1210
+ console.log(chalk.bold("\n✅ Done!"));
1211
+ }
1197
1212
  /**
1198
1213
  * 워크스페이스 루트를 찾습니다.
1199
1214
  * 우선순위: pnpm-workspace.yaml > CLAUDE.md > 루트 package.json (workspaces 필드)
@@ -1226,4 +1241,4 @@ status: draft
1226
1241
  return findAppRootPath();
1227
1242
  }
1228
1243
 
1229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcbmltcG9ydCB7IHRlc3RDb21tYW5kIH0gZnJvbSBcIi4vdGVzdC1jb21tYW5kXCI7XG5cbmxldCBtaWdyYXRvcjogTWlncmF0b3I7XG5cbi8qKlxuICogQ0xJIOyYteyFmOydhCDtjIzsi7HtlZjripQg7Zes7Y28IO2VqOyImFxuICovXG5mdW5jdGlvbiBwYXJzZUNsaU9wdGlvbnMoYXJndjogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpOiB7XG4gIGZsYWdzOiBTZXQ8c3RyaW5nPjsgLy8gLS1yZWdlbmVyYXRlLCAtLWFpLCAtLW5vLWNvbmVzIOuTsVxuICBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyAvLyAtLWxvY2FsZSBrbyDrk7Fcbn0ge1xuICBjb25zdCBmbGFncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXJnID0gYXJndltpXTtcbiAgICBpZiAoIWFyZy5zdGFydHNXaXRoKFwiLS1cIikpIGNvbnRpbnVlO1xuXG4gICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7IudXG4gICAgaWYgKGFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZy5zbGljZSgyKS5zcGxpdChcIj1cIik7XG4gICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbhcbiAgICBjb25zdCBuZXh0QXJnID0gYXJndltpICsgMV07XG4gICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBvcHRpb25zW2FyZy5zbGljZSgyKV0gPSBuZXh0QXJnO1xuICAgICAgaSsrOyAvLyDri6TsnYwgYXJn64qUIOqwkuydtOuvgOuhnCDsiqTtgrVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gLS1mbGFnIO2YleyLnVxuICAgICAgZmxhZ3MuYWRkKGFyZy5zbGljZSgyKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZmxhZ3MsIG9wdGlvbnMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBjb25zdCBub3RUb0luaXQgPSBbXCJkZXZcIiwgXCJidWlsZFwiLCBcInN0YXJ0XCIsIFwic2tpbGxzXCIsIFwidGVzdFwiXS5pbmNsdWRlcyhwcm9jZXNzLmFyZ3ZbMl0gPz8gXCJcIik7XG4gIGlmICghbm90VG9Jbml0KSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gdHNpY2xp64qUIOygle2Zle2VnCDrqoXroLnslrQg66ek7Lmt66eMIOyngOybkO2VmOuvgOuhnCwgLS3roZwg7Iuc7J6R7ZWY64qUIOyYteyFmOqzvCDqt7gg6rCS7J2EIO2VhO2EsOunge2VqeuLiOuLpC5cbiAgICAvLyDsmLXshZgg7YyM7Iux7J2AIOqwgSBydW5uZXIg7ZWo7IiY7JeQ7IScIOybkOuzuCBwcm9jZXNzLmFyZ3brpbwg7IKs7Jqp7ZWY7JesIOyImO2Wie2VqeuLiOuLpC5cbiAgICAvLyBcIi0tXCIoYmFyZSBkb3VibGUgZGFzaCnripQgcGFzc3Rocm91Z2gg6rWs67aE7J6Q7J2066+A66GcLCDqt7gg65Kk7J2YIOuqqOuToCDsnbjsnpDrj4Qg7KCc7Jm47ZWp64uI64ukLlxuICAgIGNvbnN0IGZpbHRlcmVkQXJndjogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2tpcE5leHQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJEb3VibGVEYXNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFyZyA9IHByb2Nlc3MuYXJndltpXTtcbiAgICAgIGlmIChhcmcgPT09IFwiLS1cIikge1xuICAgICAgICBhZnRlckRvdWJsZURhc2ggPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhZnRlckRvdWJsZURhc2gpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNraXBOZXh0KSB7XG4gICAgICAgIHNraXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7Iud7J2AIOydtCBhcmfrp4wg7Iqk7YK1XG4gICAgICAgIGlmIChhcmcuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduDog64uk7J2MIGFyZ+qwgCAtLeuhnCDsi5zsnpHtlZjsp4Ag7JWK7Jy866m0IOqwkuydtCDsnojripQg6rKDXG4gICAgICAgIGNvbnN0IG5leHRBcmcgPSBwcm9jZXNzLmFyZ3ZbaSArIDFdO1xuICAgICAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgICBza2lwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChhcmcpO1xuICAgIH1cblxuICAgIC8vIGJ1aWxkL2RldiDrqoXroLnslrTqsIAg7ISc67iM7Luk66eo65OcIOyXhuydtCDtmLjstpzrkKAg65WMIFwiYWxsXCLsnYQg6riw67O46rCS7Jy866GcIOy2lOqwgO2VqeuLiOuLpC5cbiAgICAvLyDsmIg6IGBzb25hbXUgYnVpbGRgIOKGkiBgc29uYW11IGJ1aWxkIGFsbGAsIGBzb25hbXUgZGV2YCDihpIgYHNvbmFtdSBkZXYgYWxsYFxuICAgIGNvbnN0IGNtZCA9IGZpbHRlcmVkQXJndlsyXTtcbiAgICBpZiAoKGNtZCA9PT0gXCJidWlsZFwiIHx8IGNtZCA9PT0gXCJkZXZcIikgJiYgZmlsdGVyZWRBcmd2Lmxlbmd0aCA9PT0gMykge1xuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goXCJhbGxcIik7XG4gICAgfVxuXG4gICAgLy8gdGVzdCDsu6Trp6jrk5zripQg6rCA67OAIOyduOyekCjtjIzsnbzrqoUsIC0tcGF0dGVybiDrk7Ep66W8IOuwm+ycvOuvgOuhnCB0c2ljbGnrpbwg7Jqw7ZqM7ZWp64uI64ukLlxuICAgIGlmIChjbWQgPT09IFwidGVzdFwiKSB7XG4gICAgICByZXR1cm4gdGVzdENvbW1hbmQoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0c2ljbGkoZmlsdGVyZWRBcmd2LCB7XG4gICAgICB0eXBlczoge1xuICAgICAgICBcIiNlbnRpdHlJZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICNlbnRpdHlJZFwiLFxuICAgICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICAgIHZhbHVlOiBlbnRpdHlJZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIFwiI3JlY29yZElkc1wiOiBcIm51bWJlcltdXCIsXG4gICAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCIjdGFyZ2V0c1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICAgIG5hbWU6IFwiI3RhcmdldHNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjdGFyZ2V0c1wiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRGV2ZWxvcG1lbnRcIiwgdmFsdWU6IFwiZGV2ZWxvcG1lbnRfbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uX21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJnZW5cIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJmZXRjaFwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImV4cGxvcmVcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wiY29uZVwiLCBcImdlblwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImRldlwiLCBcIndlYlwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcImNyZWF0ZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJ0ZXN0XCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IFNvbmFtdS5kZXN0cm95KCk7XG4gIH1cbn1cblxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcbn0pO1xuXG4vKipcbiAqIHBucG0gc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDsi7Htgaztlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xufVxuXG4vKipcbiAqIEFQSSDqsJzrsJwg7ISc67KE66W8IOyLpO2Wie2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICogZGV2X2FsbOqzvCBkZXZfYXBp7JeQ7IScIOqzteycoO2VqeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHNwYXduQXBpRGV2U2VydmVyKG9wdGlvbnM/OiB7IGV4dHJhRW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBcIi0tb24ta2V5PWM6Y2xlYXI6Q2xlYXIgc2NyZWVuXCIsIC8vIGMg64iE66W066m0IO2EsOuvuOuEkCDtmZTrqbTsnYQg7KeA7JuM7KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IHNvbmFtdS5sb2NrIO2MjOydvOydhCDsp4DsmrDqs6Ag7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG5cbiAgICAgIFwiLS1vbi1rZXk9ZW50ZXI6c2hlbGwoZWNobyBoaSk6S2V5IGJpbmRpbmcgdGVzdFwiLCAvLyBlbnRlcuulvCBrZXnroZwg7JO4IOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PWN0cmwrZiBjdHJsK2Y6c2hlbGwoZ2l0IHB1bGwgJiYgcG5wbSBpbnN0YWxsICYmIHBucG0gLS1maWx0ZXIgc29uYW11IGJ1aWxkICYmIGVjaG8gJ1NvbmFtdSBpcyBub3cgdXAtdG8tZGF0ZSEnKTpyZXN0YXJ0OlB1bGwgJiBpbnN0YWxsICYgYnVpbGQgJiByZXN0YXJ0XCIsIC8vIG1vZGlmaWVy7JmA7J2YIOyhsO2VqSwg6re466as6rOgIOuRkCDqsJzsnZggY2hvcmTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBlbnRyeVBvaW50LCAvLyDrp4jsp4Drp4nsnLzroZwg7Iuk7KCcIOyLpO2Wie2VoCDsiqTtgazrpr3tirjsnZgg6rK966Gc66W8IOuEmOqyqOykjeuLiOuLpC5cbiAgICBdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTk9ERV9FTlY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICAgICAgSE9UOiBcInllc1wiLCAvLyDslpjqsIAg7J6I7Ja07JW8IEhNUuydtCDtmZzshLHtmZTrkKnri4jri6QuXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsIC8vIOydtCDqsr3roZzqsIAgaG1yLWhvb2vsnZgg66Oo7Yq4IOuUlOugie2GoOumrOqwgCDrkKnri4jri6QuXG4gICAgICAgIC4uLm9wdGlvbnM/LmV4dHJhRW52LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBTZXJ2ZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiAvIHBucG0gZGV2IGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYWxsKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTV0Mg7ISk7KCVIO2MjOydvCDqsr3roZzrpbwg6rKw7KCV7ZWp64uI64ukLiBBUEkg67mM65OcKFNXQynsl5DshJzrp4wg7IKs7Jqp65Cp64uI64ukLlxuICog7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCwg7JeG7Jy866m0IHNvbmFtdSDquLDrs7gg7ISk7KCV7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCAuc3djcmMgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgICBzd2NGaWxlUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCIuc3djcmMucHJvamVjdC1kZWZhdWx0XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgc3djIGNvbmZpZyBmaWxlIGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIHN3Y0ZpbGVQYXRoO1xufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBzd2NGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVTd2NDb25maWdQYXRoKCk7XG5cbiAgY29uc3QgYXBpU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoOiBzd2NGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuCDrmJDripQg6riA66Gc67KMIH4vLmNsYXVkZS/roZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICpcbiAqIC0tZ2xvYmFsIO2UjOuemOq3uDogfi8uY2xhdWRlL+yXkCDrj5nquLDtmZQgKO2UhOuhnOygne2KuCDsg53shLEg7KCEIOyCrOyaqSDqsIDriqUpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgaXNHbG9iYWwgPSBmbGFncy5oYXMoXCJnbG9iYWxcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpc0dsb2JhbCkge1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKHBhdGguam9pbihvcy5ob21lZGlyKCksIFwiLmNsYXVkZVwiKSwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogZmFsc2UsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogZmFsc2UsXG4gICAgICBpc0dsb2JhbDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG4gIEdsb2JhbCBzeW5jIGNvbXBsZXRlIOKGkiB+Ly5jbGF1ZGUvc2tpbGxzL3NvbmFtdS9gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFRoZXNlIHNraWxscyBhcmUgYXZhaWxhYmxlIGluIGFsbCBDbGF1ZGUgQ29kZSBzZXNzaW9ucy5gKSk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay5kaW0oXG4gICAgICAgIGAgIE9uY2UgYSBwcm9qZWN0IGlzIGNyZWF0ZWQsIHJ1biAncG5wbSBzb25hbXUgc2tpbGxzIHN5bmMnIGZvciBwcm9qZWN0LWxvY2FsIHN5bmMuYCxcbiAgICAgICksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgICBjb25zdCBjbGF1ZGVEaXIgPSBwYXRoLmpvaW4od29ya3NwYWNlUm9vdCwgXCIuY2xhdWRlXCIpO1xuICAgIGF3YWl0IHNraWxsc19zeW5jX3RvKGNsYXVkZURpciwgc291cmNlU2tpbGxzRGlyLCBzb3VyY2VDbGF1ZGVNZCwge1xuICAgICAgdXNlU3ltbGluazogdHJ1ZSxcbiAgICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiB0cnVlLFxuICAgICAgc291cmNlQmFzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIGNsYXVkZURpcuuhnCBza2lsbHPrpbwg64+Z6riw7ZmU7ZWY64qUIOqzte2GtSDroZzsp4HsnoXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jX3RvKFxuICBjbGF1ZGVEaXI6IHN0cmluZyxcbiAgc291cmNlU2tpbGxzRGlyOiBzdHJpbmcsXG4gIHNvdXJjZUNsYXVkZU1kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHtcbiAgICB1c2VTeW1saW5rOiBib29sZWFuO1xuICAgIGNvcHlQcm9qZWN0VGVtcGxhdGVzOiBib29sZWFuO1xuICAgIHNvdXJjZUJhc2U/OiBzdHJpbmc7XG4gICAgaXNHbG9iYWw/OiBib29sZWFuO1xuICB9LFxuKSB7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIOyerOyDneyEsVxuICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgdHJ5IHtcbiAgICBhd2FpdCBybSh0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7YyM7J287J20IOyXhuycvOuptCDrrLTsi5xcbiAgfVxuXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXRTa2lsbHNEaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBpZiAob3B0aW9ucy51c2VTeW1saW5rKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN5bWxpbmsoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIFwiZGlyXCIpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICAgICk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgRmFsbGluZyBiYWNrIHRvIGNvcHkuLi5gKSk7XG4gICAgICBhd2FpdCBza2lsbHNDb3B5KHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0Rpcik7XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGlmIChvcHRpb25zLmNvcHlQcm9qZWN0VGVtcGxhdGVzICYmIG9wdGlvbnMuc291cmNlQmFzZSkge1xuICAgIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4ob3B0aW9ucy5zb3VyY2VCYXNlLCBcInByb2plY3RcIik7XG4gICAgY29uc3QgdGFyZ2V0UHJvamVjdERpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwicHJvamVjdFwiKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyh0YXJnZXRQcm9qZWN0RGlyKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFByb2plY3QgdGVtcGxhdGVzIGluaXRpYWxpemVkYCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGluaXRpYWxpemUgcHJvamVjdCB0ZW1wbGF0ZXM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShg4o+tIFByb2plY3QgdGVtcGxhdGVzIGFscmVhZHkgZXhpc3QgKHByZXNlcnZlZClgKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ0xBVURFLm1kIOuzteyCrC/sl4XrjbDsnbTtirhcbiAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VDbGF1ZGVNZCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2xhdWRlTWQgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcIkNMQVVERS5tZFwiKTtcbiAgICAgIGNvbnN0IHJhd0NvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgIC8vIOq4gOuhnOuyjCDrqqjrk5zsl5DshJzripQg7IOB64yAIOqyveuhnOulvCDsoIjrjIAg6rK966Gc66GcIOuzgO2ZmO2VqeuLiOuLpFxuICAgICAgY29uc3Qgc291cmNlQ29udGVudCA9IG9wdGlvbnMuaXNHbG9iYWxcbiAgICAgICAgPyByYXdDb250ZW50LnJlcGxhY2VBbGwoXCIuY2xhdWRlL3NraWxscy9zb25hbXUvXCIsIFwifi8uY2xhdWRlL3NraWxscy9zb25hbXUvXCIpXG4gICAgICAgIDogcmF3Q29udGVudDtcblxuICAgICAgaWYgKGF3YWl0IGV4aXN0cyh0YXJnZXRDbGF1ZGVNZCkpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldENsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBzdGFydE1hcmtlciA9IFwiPCEtLSBTT05BTVU6U1RBUlQgLS0+XCI7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IFwiPCEtLSBTT05BTVU6RU5EIC0tPlwiO1xuICAgICAgICBpZiAodGFyZ2V0Q29udGVudC5pbmNsdWRlcyhzdGFydE1hcmtlcikgJiYgdGFyZ2V0Q29udGVudC5pbmNsdWRlcyhlbmRNYXJrZXIpKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2Yoc3RhcnRNYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihlbmRNYXJrZXIpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ICE9PSAtMSAmJiBlbmRJZHggIT09IC0xICYmIHN0YXJ0SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZygwLCBzdGFydElkeCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKGVuZElkeCArIGVuZE1hcmtlci5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2JlZm9yZX0ke3N0YXJ0TWFya2VyfVxcbiR7c291cmNlQ29udGVudH1cXG4ke2VuZE1hcmtlcn0ke2FmdGVyfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIG5ld0NvbnRlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAobWFya2VyIHJlZ2lvbilgKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4o+tIENMQVVERS5tZCBtYXJrZXIgcG9zaXRpb25zIGludmFsaWQsIHNraXBwZWRgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOuniOy7pOqwgCDsl4bripQg6riw7KG0IENMQVVERS5tZOyXkCBTb25hbXUg7IS57IWY7J2EIOy2lOqwgO2VqeuLiOuLpFxuICAgICAgICAgIGNvbnN0IGFwcGVuZGVkID0gYCR7dGFyZ2V0Q29udGVudC50cmltRW5kKCl9XFxuXFxuPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgYXBwZW5kZWQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKGFwcGVuZGVkIFNvbmFtdSBzZWN0aW9uKWApKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd2l0aE1hcmtlcnMgPSBgPCEtLSBTT05BTVU6U1RBUlQgLS0+XFxuJHtzb3VyY2VDb250ZW50fVxcbjwhLS0gU09OQU1VOkVORCAtLT5cXG5gO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIHdpdGhNYXJrZXJzKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgY3JlYXRlZGApKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIHVwZGF0ZSBDTEFVREUubWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBza2lsbHNDb3B5KHNyYzogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjcChzcmMsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGNvcGllZGApKTtcbiAgfSBjYXRjaCAoY29weUVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgYOKclyBGYWlsZWQgdG8gY29weSBza2lsbHM6ICR7Y29weUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjb3B5RXJyb3IubWVzc2FnZSA6IFN0cmluZyhjb3B5RXJyb3IpfWAsXG4gICAgICApLFxuICAgICk7XG4gICAgdGhyb3cgY29weUVycm9yO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIGNyZWF0ZSA8bmFtZT4g7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDroZzsu6wgc2tpbGwg7LSI7JWI7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX2NyZWF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGxvY2FsRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiLCBcInNraWxsc1wiLCBcImxvY2FsXCIpO1xuXG4gIC8vID09PSDtjIzsnbzrqoUg6rKA7KadIOuwjyBTYW5pdGl6ZSA9PT1cbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgU2tpbGwgbmFtZSBpcyByZXF1aXJlZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNhbml0aXplZCA9IG5hbWVcbiAgICAvLyDqs7XrsLHsnYQg7ZWY7J207ZSI7Jy866GcXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCItXCIpXG4gICAgLy8g6rK966GcIOq1rOu2hOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWy9cXFxcXS9nLCBcIi1cIilcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCDrsKnsp4BcbiAgICAucmVwbGFjZSgvXFwuXFwuL2csIFwiXCIpXG4gICAgLy8gV2luZG93cyDquIjsp4Ag66y47J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bPD46XCJ8PypdL2csIFwiXCIpXG4gICAgLy8g7Iuc7J6RL+uBnSDsoJAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0IOygnOqxsFxuICAgIC5yZXBsYWNlKC9eWy5cXC1fXSt8Wy5cXC1fXSskL2csIFwiXCIpXG4gICAgLy8g7Jew7IaN65CcIO2VmOydtO2UiOydhCDtlZjrgpjroZxcbiAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXG4gICAgLy8g7JWM7YyM67KzLCDsiKvsnpAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0LCDtlZzquIDrp4wg7ZeI7JqpXG4gICAgLnJlcGxhY2UoL1teYS16QS1aMC05LV/qsIAt7Z6jXS9nLCBcIlwiKTtcblxuICAvLyDquLjsnbQg7KCc7ZWcXG4gIGNvbnN0IE1BWF9MRU5HVEggPSAxMDA7XG4gIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgTUFYX0xFTkdUSCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSB0cnVuY2F0ZWQgdG8gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYCkpO1xuICB9XG5cbiAgLy8gV2luZG93cyDsmIjslb3slrQg7ZmV7J24XG4gIGNvbnN0IFJFU0VSVkVEX05BTUVTID0gW1xuICAgIFwiQ09OXCIsXG4gICAgXCJQUk5cIixcbiAgICBcIkFVWFwiLFxuICAgIFwiTlVMXCIsXG4gICAgXCJDT00xXCIsXG4gICAgXCJDT00yXCIsXG4gICAgXCJDT00zXCIsXG4gICAgXCJDT000XCIsXG4gICAgXCJDT001XCIsXG4gICAgXCJDT002XCIsXG4gICAgXCJDT003XCIsXG4gICAgXCJDT004XCIsXG4gICAgXCJDT005XCIsXG4gICAgXCJMUFQxXCIsXG4gICAgXCJMUFQyXCIsXG4gICAgXCJMUFQzXCIsXG4gICAgXCJMUFQ0XCIsXG4gICAgXCJMUFQ1XCIsXG4gICAgXCJMUFQ2XCIsXG4gICAgXCJMUFQ3XCIsXG4gICAgXCJMUFQ4XCIsXG4gICAgXCJMUFQ5XCIsXG4gIF07XG4gIGlmIChSRVNFUlZFRF9OQU1FUy5pbmNsdWRlcyhzYW5pdGl6ZWQudG9VcHBlckNhc2UoKSkpIHtcbiAgICBzYW5pdGl6ZWQgPSBgc2tpbGwtJHtzYW5pdGl6ZWR9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBSZXNlcnZlZCBuYW1lIGRldGVjdGVkLCBwcmVmaXhlZCB3aXRoIFwic2tpbGwtXCJgKSk7XG4gIH1cblxuICAvLyDruYgg66y47J6Q7Je0IOyytO2BrFxuICBpZiAoc2FuaXRpemVkID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgSW52YWxpZCBza2lsbCBuYW1lIGFmdGVyIHNhbml0aXphdGlvblwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIE9yaWdpbmFsOiBcIiR7bmFtZX1cImApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDrs4Dqsr0g7JWM66a8XG4gIGlmIChzYW5pdGl6ZWQgIT09IG5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHNhbml0aXplZDogXCIke25hbWV9XCIg4oaSIFwiJHtzYW5pdGl6ZWR9XCJgKSk7XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihsb2NhbERpciwgYCR7c2FuaXRpemVkfS5tZGApO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBTa2lsbCBcIiR7c2FuaXRpemVkfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBta2Rpcihsb2NhbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBgLS0tXG5uYW1lOiAke3Nhbml0aXplZH1cbmNhdGVnb3J5OiBvdGhlclxuY3JlYXRlZF9hdDogJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfVxuc3RhdHVzOiBkcmFmdFxuLS0tXG5cbiMgJHtzYW5pdGl6ZWR9XG5cbiMjIOyDge2ZqVxuXG5b7Ja065akIOusuOygnOyYgOuKlOyngF1cblxuIyMg7ZW06rKwIOuwqeuylVxuXG5b7Ja065a76rKMIO2VtOqysO2WiOuKlOyngF1cblxuIyMg7L2U65OcIOyYiOyLnFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDsmIjsi5wg7L2U65OcXG5cXGBcXGBcXGBcbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0ZW1wbGF0ZSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy9sb2NhbC8ke3Nhbml0aXplZH0ubWRgKSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBnZW5lcmF0ZSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJldHRlci1hdXRoIOyXlO2LsO2LsOuTpChVc2VyLCBTZXNzaW9uLCBBY2NvdW50LCBWZXJpZmljYXRpb24p7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtLXBsdWdpbnMgcGhvbmUtbnVtYmVyLDJmYSAg7ZSM65+s6re47J24IOyXlO2LsO2LsOuPhCDtlajqu5gg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfZ2VuZXJhdGUoKSB7XG4gIC8vIC0tcGx1Z2lucyDsmLXshZgg7YyM7IuxXG4gIGNvbnN0IHBsdWdpbnNBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChcIi0tcGx1Z2luc1wiKSk7XG4gIGNvbnN0IHBsdWdpbnM6IEJldHRlckF1dGhQbHVnaW5JZFtdID0gW107XG5cbiAgaWYgKHBsdWdpbnNBcmcpIHtcbiAgICBjb25zdCBwbHVnaW5WYWx1ZSA9IHBsdWdpbnNBcmcuaW5jbHVkZXMoXCI9XCIpXG4gICAgICA/IHBsdWdpbnNBcmcuc3BsaXQoXCI9XCIpWzFdXG4gICAgICA6IHByb2Nlc3MuYXJndltwcm9jZXNzLmFyZ3YuaW5kZXhPZihwbHVnaW5zQXJnKSArIDFdO1xuXG4gICAgaWYgKHBsdWdpblZhbHVlKSB7XG4gICAgICBjb25zdCBwbHVnaW5JZHMgPSBwbHVnaW5WYWx1ZS5zcGxpdChcIixcIikubWFwKChwKSA9PiBwLnRyaW0oKSk7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgcGx1Z2luSWRzKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkUGx1Z2luSWQoaWQpKSB7XG4gICAgICAgICAgcGx1Z2lucy5wdXNoKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBVbmtub3duIHBsdWdpbjogJHtpZH1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFN1cHBvcnRlZCBwbHVnaW5zOiAke1NVUFBPUlRFRF9QTFVHSU5fSURTLmpvaW4oXCIsIFwiKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgR2VuZXJhdGluZyBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbHVnaW5zOiAke3BsdWdpbnMuam9pbihcIiwgXCIpfWApKTtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuLyoqXG4gKiDsm4ztgazsiqTtjpjsnbTsiqQg66Oo7Yq466W8IOywvuyKteuLiOuLpC5cbiAqIOyasOyEoOyInOychDogcG5wbS13b3Jrc3BhY2UueWFtbCA+IENMQVVERS5tZCA+IOujqO2KuCBwYWNrYWdlLmpzb24gKHdvcmtzcGFjZXMg7ZWE65OcKVxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdCgpIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgd2hpbGUgKGRpciAhPT0gcGF0aC5kaXJuYW1lKGRpcikpIHtcbiAgICAvLyAxLiBwbnBtLXdvcmtzcGFjZS55YW1sIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZmV7Iuk7ZWcIG1vbm9yZXBvIOujqO2KuC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMi4gQ0xBVURFLm1kIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOuhnCDqsITso7ztlaguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcIkNMQVVERS5tZFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMy4gcGFja2FnZS5qc29u7JeQIHdvcmtzcGFjZXMg7ZWE65Oc6rCAIOyeiOycvOuptCDro6jtirguXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhY2thZ2VQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8g7YyM7IuxIOyLpO2MqOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gICAgZGlyID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyDssL7sp4Ag66q77ZWY66m0IGFwaSDtj7TrjZTsnZgg67aA66qoIOyCrOyaqVxuICByZXR1cm4gZmluZEFwcFJvb3RQYXRoKCk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJhc3NlcnQiLCJleGVjU3luYyIsInNwYXduIiwiY3AiLCJta2RpciIsInJlYWRkaXIiLCJyZWFkRmlsZSIsInJtIiwic3ltbGluayIsIndyaXRlRmlsZSIsImtuZXgiLCJjcmVhdGVSZXF1aXJlIiwib3MiLCJwYXRoIiwicHJvY2VzcyIsInRzaWNsaSIsIlNvbmFtdSIsImdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIiwiaXNWYWxpZFBsdWdpbklkIiwiU1VQUE9SVEVEX1BMVUdJTl9JRFMiLCJFbnRpdHlNYW5hZ2VyIiwiTWlncmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsImV4ZWNXaXRoTGluZVByZWZpeCIsInByaW50QnVpbGRTdW1tYXJ5IiwicHJpbnRUYXNrRmFpbGVkIiwicHJpbnRUYXNrSGVhZGVyIiwicHJpbnRUYXNrU3RhcnQiLCJwcmludFRhc2tTdWNjZXNzIiwiZXhpc3RzIiwiZmluZEFwaVJvb3RQYXRoIiwiZmluZEFwcFJvb3RQYXRoIiwiQVBJX0FSVElGQUNUUyIsIldFQl9BUlRJRkFDVFMiLCJmaXh0dXJlRXhwbG9yZUNvbW1hbmQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJ0ZXN0Q29tbWFuZCIsIm1pZ3JhdG9yIiwicGFyc2VDbGlPcHRpb25zIiwiYXJndiIsImZsYWdzIiwiU2V0Iiwib3B0aW9ucyIsImkiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwic3BsaXQiLCJuZXh0QXJnIiwiYWRkIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5pdCIsImZpbHRlcmVkQXJndiIsInNraXBOZXh0IiwiYWZ0ZXJEb3VibGVEYXNoIiwicHVzaCIsImNtZCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2FwcGx5IiwiZml4dHVyZV9pbml0IiwiZml4dHVyZV9pbXBvcnQiLCJmaXh0dXJlX3N5bmMiLCJmaXh0dXJlX2dlbiIsImZpeHR1cmVfZmV0Y2giLCJmaXh0dXJlX2V4cGxvcmUiLCJzdHViX3ByYWN0aWNlIiwic3R1Yl9lbnRpdHkiLCJzY2FmZm9sZF9tb2RlbCIsInNjYWZmb2xkX21vZGVsX3Rlc3QiLCJjb25lX2dlbiIsInN5bmMiLCJidWlsZF9hbGwiLCJidWlsZF9hcGkiLCJidWlsZF93ZWIiLCJkZXZfYWxsIiwiZGV2X2FwaSIsImRldl93ZWIiLCJzdGFydCIsInNraWxsc19zeW5jIiwic2tpbGxzX2NyZWF0ZSIsInRlc3QiLCJhdXRoX2dlbmVyYXRlIiwiZGVzdHJveSIsImZpbmFsbHkiLCJzeW5jZXIiLCJzcGF3bkFwaURldlNlcnZlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiaG90UnVubmVyQmluUGF0aCIsInVybCIsInJlc29sdmUiLCJzZXJ2ZXJQcm9jZXNzIiwiZXhlY1BhdGgiLCJqb2luIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJleHRyYUVudiIsImNsZWFudXAiLCJjb25zb2xlIiwibG9nIiwieWVsbG93Iiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJvbGQiLCJTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQiIsImFwcFJvb3QiLCJ3ZWJQYXRoIiwiZG91YmxlRGFzaEluZGV4IiwiaW5kZXhPZiIsInBhc3N0aHJvdWdoQXJncyIsInZpdGVBcmdzIiwidml0ZVByb2Nlc3MiLCJzaWduYWwiLCJyZXNvbHZlU3djQ29uZmlnUGF0aCIsInN3Y0ZpbGVQYXRoIiwiZGltIiwiZGlybmFtZSIsInNraXBJZk1pc3NpbmciLCJhcGlTdGFydGVkQXQiLCJEYXRlIiwibm93IiwiYXJ0aWZhY3QiLCJwcm9qZWN0UGF0aCIsImRlc2NyaXB0aW9uIiwicnVuQnVpbGRTdGVwcyIsImJ1aWxkQ29tbWFuZEFyZ3MiLCJjb25maWdGaWxlUGF0aCIsImUiLCJncmF5Iiwid2ViU3RhcnRlZEF0Iiwic3RlcHMiLCJwcmVCdWlsZENvbW1hbmQiLCJidWlsZENvbW1hbmQiLCJwb3N0QnVpbGRDb21tYW5kIiwiZmlsdGVyIiwic3RlcCIsImlzTGFzdCIsIkVycm9yIiwiY2F1c2UiLCJibHVlIiwic2V0dXBNaWdyYXRvciIsInNldHVwRml4dHVyZU1hbmFnZXIiLCJ0YXJnZXRzIiwicnVuQWN0aW9uIiwibG9jYWxIb3N0cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsInRhcmdldCIsInRhcmdldENvbmZpZyIsImhvc3QiLCJjb25uZWN0aW9uIiwidG9Mb3dlckNhc2UiLCJzdGF0dXMiLCJnZXRTdGF0dXMiLCJzcmNDb25maWciLCJkZXZlbG9wbWVudF9tYXN0ZXIiLCJsYWJlbCIsImZpeHR1cmUiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwibG9jYWxDb25uIiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwYXJzZU9wdGlvbnMiLCJfIiwiayIsInYiLCJuZXh0IiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwicmVjdXJzaXZlIiwiZmlsdGVyZWRTZXFzIiwiZmlsZU5hbWUiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsImNyZWF0ZUVudGl0eSIsInVzZUFJIiwiaGFzIiwibm9Db25lcyIsImVudGl0eSIsImdldCIsImNvbmZpZ0xvY2FsZSIsImkxOG4iLCJkZWZhdWx0TG9jYWxlIiwibG9jYWxlIiwicmVzdWx0IiwiZ2VuZXJhdGVDb25lcyIsInByZXNlcnZlRXhpc3RpbmciLCJvbmx5RW1wdHkiLCJ0b2tlbnNVc2VkIiwiZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIiwiYWxsRW50aXRpZXMiLCJnZXRBbGxFbnRpdGllcyIsInRvdGFsVG9rZW5zIiwiZXJyb3JzIiwiaWQiLCJlc3RpbWF0ZWRDb3N0IiwidG9GaXhlZCIsImVyciIsIm1vZGUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwiaXNHbG9iYWwiLCJzb3VyY2VCYXNlIiwic291cmNlU2tpbGxzRGlyIiwic291cmNlQ2xhdWRlTWQiLCJza2lsbHNfc3luY190byIsImhvbWVkaXIiLCJ1c2VTeW1saW5rIiwiY29weVByb2plY3RUZW1wbGF0ZXMiLCJjeWFuIiwid29ya3NwYWNlUm9vdCIsImZpbmRXb3Jrc3BhY2VSb290IiwiY2xhdWRlRGlyIiwidGFyZ2V0U2tpbGxzRGlyIiwiZm9yY2UiLCJncmVlbiIsIlN0cmluZyIsInNraWxsc0NvcHkiLCJzb3VyY2VQcm9qZWN0RGlyIiwidGFyZ2V0UHJvamVjdERpciIsInRhcmdldENsYXVkZU1kIiwicmF3Q29udGVudCIsInNvdXJjZUNvbnRlbnQiLCJyZXBsYWNlQWxsIiwidGFyZ2V0Q29udGVudCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJiZWZvcmUiLCJzdWJzdHJpbmciLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJhcHBlbmRlZCIsInRyaW1FbmQiLCJ3aXRoTWFya2VycyIsInNyYyIsImRlc3QiLCJjb3B5RXJyb3IiLCJsb2NhbERpciIsInRyaW0iLCJzYW5pdGl6ZWQiLCJNQVhfTEVOR1RIIiwiUkVTRVJWRURfTkFNRVMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsInBsdWdpbnNBcmciLCJmaW5kIiwicGx1Z2lucyIsInBsdWdpblZhbHVlIiwicGx1Z2luSWRzIiwicCIsImRpciIsInBhY2thZ2VQYXRoIiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJ3b3Jrc3BhY2VzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNB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
1244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBhZGRDb21wYW5pb25zVG9FbnRpdGllcywgZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMgfSBmcm9tIFwiLi4vYXV0aC9hdXRoLWdlbmVyYXRvclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBCZXR0ZXJBdXRoUGx1Z2luSWQsXG4gIGlzVmFsaWRQbHVnaW5JZCxcbiAgU1VQUE9SVEVEX1BMVUdJTl9JRFMsXG59IGZyb20gXCIuLi9hdXRoL3BsdWdpbnMvZW50aXR5LWRlZmluaXRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBBUElfQVJUSUZBQ1RTLCB0eXBlIEJ1aWxkQXJ0aWZhY3QsIFdFQl9BUlRJRkFDVFMgfSBmcm9tIFwiLi9idWlsZC1jb25maWdcIjtcbmltcG9ydCB7IGZpeHR1cmVFeHBsb3JlQ29tbWFuZCwgZml4dHVyZUZldGNoQ29tbWFuZCwgZml4dHVyZUdlbkNvbW1hbmQgfSBmcm9tIFwiLi9maXh0dXJlXCI7XG5pbXBvcnQgeyB0ZXN0Q29tbWFuZCB9IGZyb20gXCIuL3Rlc3QtY29tbWFuZFwiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG4vKipcbiAqIENMSSDsmLXshZjsnYQg7YyM7Iux7ZWY64qUIO2XrO2NvCDtlajsiJhcbiAqL1xuZnVuY3Rpb24gcGFyc2VDbGlPcHRpb25zKGFyZ3Y6IHN0cmluZ1tdID0gcHJvY2Vzcy5hcmd2KToge1xuICBmbGFnczogU2V0PHN0cmluZz47IC8vIC0tcmVnZW5lcmF0ZSwgLS1haSwgLS1uby1jb25lcyDrk7FcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgLy8gLS1sb2NhbGUga28g65OxXG59IHtcbiAgY29uc3QgZmxhZ3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG4gICAgaWYgKCFhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSBjb250aW51ZTtcblxuICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLnVxuICAgIGlmIChhcmcuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmcuc2xpY2UoMikuc3BsaXQoXCI9XCIpO1xuICAgICAgb3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyAtLW9wdGlvbiB2YWx1ZSDtmJXsi53snbjsp4Ag7ZmV7J24XG4gICAgY29uc3QgbmV4dEFyZyA9IGFyZ3ZbaSArIDFdO1xuICAgIGlmIChuZXh0QXJnICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItLVwiKSAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgb3B0aW9uc1thcmcuc2xpY2UoMildID0gbmV4dEFyZztcbiAgICAgIGkrKzsgLy8g64uk7J2MIGFyZ+uKlCDqsJLsnbTrr4DroZwg7Iqk7YK1XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIC0tZmxhZyDtmJXsi51cbiAgICAgIGZsYWdzLmFkZChhcmcuc2xpY2UoMikpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZsYWdzLCBvcHRpb25zIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAgY29uc3Qgbm90VG9Jbml0ID0gW1wiZGV2XCIsIFwiYnVpbGRcIiwgXCJzdGFydFwiLCBcInNraWxsc1wiLCBcInRlc3RcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgLy8gXCItLVwiKGJhcmUgZG91YmxlIGRhc2gp64qUIHBhc3N0aHJvdWdoIOq1rOu2hOyekOydtOuvgOuhnCwg6re4IOuSpOydmCDrqqjrk6Ag7J247J6Q64+EIOygnOyZuO2VqeuLiOuLpC5cbiAgICBjb25zdCBmaWx0ZXJlZEFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNraXBOZXh0ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRG91YmxlRGFzaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07XG4gICAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgICAgYWZ0ZXJEb3VibGVEYXNoID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJEb3VibGVEYXNoKSBjb250aW51ZTtcbiAgICAgIGlmIChza2lwTmV4dCkge1xuICAgICAgICBza2lwTmV4dCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLneydgCDsnbQgYXJn66eMIOyKpO2CtVxuICAgICAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbg6IOuLpOydjCBhcmfqsIAgLS3roZwg7Iuc7J6R7ZWY7KeAIOyViuycvOuptCDqsJLsnbQg7J6I64qUIOqyg1xuICAgICAgICBjb25zdCBuZXh0QXJnID0gcHJvY2Vzcy5hcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2tpcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZC9kZXYg66qF66C57Ja06rCAIOyEnOu4jOy7pOunqOuTnCDsl4bsnbQg7Zi47Lac65CgIOuVjCBcImFsbFwi7J2EIOq4sOuzuOqwkuycvOuhnCDstpTqsIDtlanri4jri6QuXG4gICAgLy8g7JiIOiBgc29uYW11IGJ1aWxkYCDihpIgYHNvbmFtdSBidWlsZCBhbGxgLCBgc29uYW11IGRldmAg4oaSIGBzb25hbXUgZGV2IGFsbGBcbiAgICBjb25zdCBjbWQgPSBmaWx0ZXJlZEFyZ3ZbMl07XG4gICAgaWYgKChjbWQgPT09IFwiYnVpbGRcIiB8fCBjbWQgPT09IFwiZGV2XCIpICYmIGZpbHRlcmVkQXJndi5sZW5ndGggPT09IDMpIHtcbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKFwiYWxsXCIpO1xuICAgIH1cblxuICAgIC8vIHRlc3Qg7Luk66eo65Oc64qUIOqwgOuzgCDsnbjsnpAo7YyM7J2866qFLCAtLXBhdHRlcm4g65OxKeulvCDrsJvsnLzrr4DroZwgdHNpY2xp66W8IOyasO2ajO2VqeuLiOuLpC5cbiAgICBpZiAoY21kID09PSBcInRlc3RcIikge1xuICAgICAgcmV0dXJuIHRlc3RDb21tYW5kKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdHNpY2xpKGZpbHRlcmVkQXJndiwge1xuICAgICAgdHlwZXM6IHtcbiAgICAgICAgXCIjZW50aXR5SWRcIjoge1xuICAgICAgICAgIHR5cGU6IFwiYXV0b2NvbXBsZXRlXCIsXG4gICAgICAgICAgbmFtZTogXCIjZW50aXR5SWRcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjZW50aXR5SWRcIixcbiAgICAgICAgICBjaG9pY2VzOiBFbnRpdHlNYW5hZ2VyLmdldEFsbFBhcmVudElkcygpLm1hcCgoZW50aXR5SWQpID0+ICh7XG4gICAgICAgICAgICB0aXRsZTogZW50aXR5SWQsXG4gICAgICAgICAgICB2YWx1ZTogZW50aXR5SWQsXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgICBcIiNyZWNvcmRJZHNcIjogXCJudW1iZXJbXVwiLFxuICAgICAgICBcIiNuYW1lXCI6IFwic3RyaW5nXCIsXG4gICAgICAgIFwiI3RhcmdldHNcIjoge1xuICAgICAgICAgIHR5cGU6IFwibXVsdGlzZWxlY3RcIixcbiAgICAgICAgICBuYW1lOiBcIiN0YXJnZXRzXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI3RhcmdldHNcIixcbiAgICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkRldmVsb3BtZW50XCIsIHZhbHVlOiBcImRldmVsb3BtZW50X21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlByb2R1Y3Rpb25cIiwgdmFsdWU6IFwicHJvZHVjdGlvbl9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJGaXh0dXJlXCIsIHZhbHVlOiBcImZpeHR1cmVcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJUZXN0XCIsIHZhbHVlOiBcInRlc3RcIiB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXJnczogW1xuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW5pdFwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImltcG9ydFwiLCBcIiNlbnRpdHlJZFwiLCBcIiNyZWNvcmRJZHNcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJzeW5jXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZ2VuXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZmV0Y2hcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJleHBsb3JlXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwicnVuXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwiYXBwbHlcIiwgXCIjdGFyZ2V0c1wiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInN0YXR1c1wiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcInByYWN0aWNlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJtb2RlbF90ZXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2Zvcm1cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcImNvbmVcIiwgXCJnZW5cIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInN5bmNcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwiYWxsXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwiYXBpXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJ3ZWJcIl0sXG4gICAgICAgIFtcInN0YXJ0XCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJzeW5jXCJdLFxuICAgICAgICBbXCJza2lsbHNcIiwgXCJjcmVhdGVcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1widGVzdFwiXSxcbiAgICAgICAgW1wiYXV0aFwiLCBcImdlbmVyYXRlXCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiYWRkLWNvbXBhbmlvbnNcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgZml4dHVyZV9nZW4sXG4gICAgICAgIGZpeHR1cmVfZmV0Y2gsXG4gICAgICAgIGZpeHR1cmVfZXhwbG9yZSxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgY29uZV9nZW4sXG4gICAgICAgIHN5bmMsXG4gICAgICAgIGJ1aWxkX2FsbCxcbiAgICAgICAgYnVpbGRfYXBpLFxuICAgICAgICBidWlsZF93ZWIsXG4gICAgICAgIGRldl9hbGwsXG4gICAgICAgIGRldl9hcGksXG4gICAgICAgIGRldl93ZWIsXG4gICAgICAgIHN0YXJ0LFxuICAgICAgICBza2lsbHNfc3luYyxcbiAgICAgICAgc2tpbGxzX2NyZWF0ZSxcbiAgICAgICAgdGVzdDogdGVzdENvbW1hbmQsXG4gICAgICAgIGF1dGhfZ2VuZXJhdGUsXG4gICAgICAgIFwiYXV0aF9hZGQtY29tcGFuaW9uc1wiOiBhdXRoX2FkZF9jb21wYW5pb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgXCItLW9uLWtleT1jOmNsZWFyOkNsZWFyIHNjcmVlblwiLCAvLyBjIOuIhOultOuptCDthLDrr7jrhJAg7ZmU66m07J2EIOyngOybjOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhtci1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgICAuLi5vcHRpb25zPy5leHRyYUVudixcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgLyBwbnBtIGRldiBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjsl5Ag64yA7ZW0IEhNUiDsp4Dsm5DtlZjripQg6rCc67CcIOyEnOuyhOulvCDrnYTsm4zspI3ri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FsbCgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKCk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgYXBpIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogQVBJIOyghOyaqSDqsJzrsJwg7ISc67KE66W8IOudhOybgeuLiOuLpC5cbiAqIGRldl9hbGzqs7wg6rGw7J2YIOuPmeydvO2VmOuQmCwg7Ya17ZWpIOybuSDshJzrsoTrpbwg67mE7Zmc7ISx7ZmU7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmZ1bmN0aW9uIGRldl9hcGkoKSB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgU29uYW11IEFQSS1vbmx5IGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuICBzcGF3bkFwaURldlNlcnZlcih7XG4gICAgZXh0cmFFbnY6IHsgU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUI6IFwieWVzXCIgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBkZXYgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogVml0ZSDqsJzrsJwg7ISc67KE66W8IOuLqOuPheycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKiAtLSDrkqTsnZgg7J247J6Q64qUIFZpdGXsl5Ag6re464yA66GcIOyghOuLrOuQqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXZfd2ViKCkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAtLSDrkqTsnZgg7J247J6QIOy2lOy2nFxuICBjb25zdCBkb3VibGVEYXNoSW5kZXggPSBwcm9jZXNzLmFyZ3YuaW5kZXhPZihcIi0tXCIpO1xuICBjb25zdCBwYXNzdGhyb3VnaEFyZ3MgPSBkb3VibGVEYXNoSW5kZXggIT09IC0xID8gcHJvY2Vzcy5hcmd2LnNsaWNlKGRvdWJsZURhc2hJbmRleCArIDEpIDogW107XG5cbiAgY29uc3Qgdml0ZUFyZ3MgPSBbXCJleGVjXCIsIFwidml0ZVwiLCAuLi5wYXNzdGhyb3VnaEFyZ3NdO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwiU3RhcnRpbmcgVml0ZSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcblxuICBjb25zdCB2aXRlUHJvY2VzcyA9IHNwYXduKFwicG5wbVwiLCB2aXRlQXJncywge1xuICAgIGN3ZDogd2ViUGF0aCxcbiAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gIH0pO1xuXG4gIHZpdGVQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIHByb2Nlc3MuZXhpdChjb2RlID8/IDApO1xuICB9KTtcblxuICAvLyBTSUdJTlQvU0lHVEVSTSDsi5wgVml0ZSDtlITroZzshLjsiqTrpbwgZ3JhY2VmdWxseSDsooXro4ztlanri4jri6QuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIl0gYXMgY29uc3QpIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgdml0ZVByb2Nlc3Mua2lsbChzaWduYWwpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU1dDIOyEpOyglSDtjIzsnbwg6rK966Gc66W8IOqysOygle2VqeuLiOuLpC4gQVBJIOu5jOuTnChTV0Mp7JeQ7ISc66eMIOyCrOyaqeuQqeuLiOuLpC5cbiAqIO2UhOuhnOygne2KuCDro6jtirjsl5AgLnN3Y3Jj6rCAIOyeiOycvOuptCDqt7jqsoPsnYQsIOyXhuycvOuptCBzb25hbXUg6riw67O4IOyEpOygleydhCDsgqzsmqntlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTd2NDb25maWdQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBzd2NGaWxlUGF0aCA9IFwiLnN3Y3JjXCI7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhzd2NGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIC5zd2NyYyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgLnN3Y3JjIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgICAgc3djRmlsZVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIHN3YyBjb25maWcgZmlsZSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBzd2NGaWxlUGF0aDtcbn1cblxuLyoqXG4gKiBzb25hbXUgYnVpbGQgLyBzb25hbXUgYnVpbGQgYWxsIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogYnVpbGRfYXBpICsgYnVpbGRfd2Vi7J2YIO2VqeyEseyeheuLiOuLpC4gV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrqbQgV2ViIOu5jOuTnOulvCDsiqTtgrXtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FsbCgpIHtcbiAgYXdhaXQgYnVpbGRfYXBpKCk7XG4gIGF3YWl0IGJ1aWxkX3dlYih7IHNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7ZSE66Gc7KCd7Yq466eMIOu5jOuTnO2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZF9hcGkoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgc3djRmlsZVBhdGggPSBhd2FpdCByZXNvbHZlU3djQ29uZmlnUGF0aCgpO1xuXG4gIGNvbnN0IGFwaVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aDogc3djRmlsZVBhdGggfSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIHdlYiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIFdlYiDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX3dlYih7IHNraXBJZk1pc3NpbmcgPSBmYWxzZSB9ID0ge30pIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3QsIFwid2ViXCIpO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJQYXRoKSkpIHtcbiAgICBpZiAoc2tpcElmTWlzc2luZykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIldlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866+A66GcIFdlYiDruYzrk5zrpbwg6rG064SI65yB64uI64ukLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoYHdlYiDrlJTroInthqDrpqzrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7d2ViUGF0aH1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBjb25zdCB3ZWJTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgV0VCX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHByZS1idWlsZCwgYnVpbGQsIHBvc3QtYnVpbGQg64uo6rOE66W8IOyInOywqOyggeycvOuhnCDsi6Ttlontlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHM8VD4oXG4gIGFydGlmYWN0OiBCdWlsZEFydGlmYWN0PFQ+LFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nOyBidWlsZENvbW1hbmRBcmdzOiBUIH0sXG4pIHtcbiAgY29uc3Qgc3RlcHMgPSBbXG4gICAgeyBuYW1lOiBcInByZS1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnByZUJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgICB7IG5hbWU6IFwiYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5idWlsZENvbW1hbmQob3B0aW9ucy5idWlsZENvbW1hbmRBcmdzKSB9LFxuICAgIHsgbmFtZTogXCJwb3N0LWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucG9zdEJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgXS5maWx0ZXIoKHN0ZXApID0+IHN0ZXAuY21kKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RlcCA9IHN0ZXBzW2ldO1xuICAgIGNvbnN0IGlzTGFzdCA9IGkgPT09IHN0ZXBzLmxlbmd0aCAtIDE7XG5cbiAgICB0cnkge1xuICAgICAgYXNzZXJ0KHN0ZXAuY21kKTtcbiAgICAgIHByaW50VGFza1N0YXJ0KHN0ZXAubmFtZSwgc3RlcC5jbWQsIGlzTGFzdCk7XG4gICAgICBhd2FpdCBleGVjV2l0aExpbmVQcmVmaXgoc3RlcC5jbWQsIHsgY3dkOiBvcHRpb25zLmN3ZCB9KTtcbiAgICAgIHByaW50VGFza1N1Y2Nlc3Moc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByaW50VGFza0ZhaWxlZChzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RlcC5uYW1lfSBmYWlsZWRgLCB7IGNhdXNlOiBlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc3RhcnQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDruYzrk5zrkJwg7ZSE66Gc7KCd7Yq466W8IOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDruYzrk5zrkJwg6rKw6rO866y8KGRpc3Qg65SU66CJ7Yag66as7J2YIGluZGV4LmpzIOyXlO2KuOumrO2PrOyduO2KuCnsnbQg7JeG64uk66m0IOyLpO2WieydhCDspJHri6jtlanri4jri6QuXG4gKiDshozsiqTrp7Ug7KeA7JuQ6rO8IGRvdGVudiDsp4Dsm5DsnYQg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcbiAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBlbnRyeVBvaW50ID0gXCJkaXN0L2luZGV4LmpzXCI7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGVudHJ5UG9pbnQpKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgJHtlbnRyeVBvaW50fSBub3QgZm91bmQuIFBsZWFzZSBidWlsZCB5b3VyIHByb2plY3QgZmlyc3QuYCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSdW46IHBucG0gc29uYW11IGJ1aWxkXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IHNwYXduIH0gPSBhd2FpdCBpbXBvcnQoXCJjaGlsZF9wcm9jZXNzXCIpO1xuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBbXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCBcIi1yXCIsIFwiZG90ZW52L2NvbmZpZ1wiLCBlbnRyeVBvaW50XSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgfSxcbiAgKTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsICgpID0+IHtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTWlncmF0b3IoKSB7XG4gIC8vIG1pZ3JhdG9yXG4gIG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRml4dHVyZU1hbmFnZXIoKSB7XG4gIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9hcHBseSh0YXJnZXRzOiAoa2V5b2YgU29uYW11REJDb25maWcpW10pIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9ydW4oKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcbiAgY29uc3QgbG9jYWxIb3N0cyA9IFtcImxvY2FsaG9zdFwiLCBcIjEyNy4wLjAuMVwiLCBcIjAuMC4wLjBcIiwgXCI6OjFcIl07XG4gIGNvbnN0IHRhcmdldHMgPSBPYmplY3Qua2V5cyhTb25hbXUuZGJDb25maWcpLmZpbHRlcigodGFyZ2V0KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0Q29uZmlnID0gU29uYW11LmRiQ29uZmlnW3RhcmdldCBhcyBrZXlvZiBTb25hbXVEQkNvbmZpZ107XG4gICAgY29uc3QgaG9zdCA9ICh0YXJnZXRDb25maWc/LmNvbm5lY3Rpb24gYXMgeyBob3N0Pzogc3RyaW5nIH0pPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gICAgcmV0dXJuIGxvY2FsSG9zdHMuaW5jbHVkZXMoaG9zdC50b0xvd2VyQ2FzZSgpKTtcbiAgfSk7XG5cbiAgLy8g66Gc7LusIOuNsOydtO2EsOuyoOydtOyKpOyXkCDrjIDtlbTshJzrp4wg7KCE7LK0IOuniOydtOq3uOugiOydtOyFmOyXkOyEnCDrj5nsnpFcbiAgYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKFwiYXBwbHlcIiwgdGFyZ2V0cyBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW10pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3N0YXR1cygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICAvLyBzdGF0dXM7XG4gIGNvbnNvbGUubG9nKHN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW5pdCgpIHtcbiAgY29uc3Qgc3JjQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlcjtcbiAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IFwiKExPQ0FMKSBUZXN0aW5nIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy50ZXN0LFxuICAgICAgdG9Ta2lwOiAoKCkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdGVDb25uID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICByZXR1cm4gcmVtb3RlQ29ubi5ob3N0ID09PSBsb2NhbENvbm4uaG9zdCAmJiByZW1vdGVDb25uLmRhdGFiYXNlID09PSBsb2NhbENvbm4uZGF0YWJhc2U7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gIF0gYXMge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY29uZmlnOiBLbmV4LkNvbmZpZztcbiAgICB0b1NraXA/OiBib29sZWFuO1xuICB9W107XG5cbiAgLy8gMS4g6riw7KSAREIg7Iqk7YKk66eI66W8IOuNpO2UhFxuICBjb25zb2xlLmxvZyhcIkRVTVAuLi5cIik7XG4gIGNvbnN0IGR1bXBGaWxlbmFtZSA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBjb25zdCBzcmNDb25uID0gc3JjQ29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICBjb25zdCBtaWdyYXRpb25zRHVtcCA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtbWlncmF0aW9ucy0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGV4ZWNTeW5jKFxuICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC1kIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSA+ICR7ZHVtcEZpbGVuYW1lfWAsXG4gICk7XG4gIGNvbnN0IF9kYiA9IGtuZXgoc3JjQ29uZmlnKTtcbiAgY29uc3QgW1ttaWdyYXRpb25zXV0gPSBhd2FpdCBfZGIucmF3KFxuICAgIFwiU0VMRUNUIENPVU5UKCopIGFzIGNvdW50IEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWEgPSA/IEFORCB0YWJsZV9uYW1lID0gJ2tuZXhfbWlncmF0aW9ucydcIixcbiAgICBbc3JjQ29ubi5kYXRhYmFzZV0sXG4gICk7XG4gIGlmIChtaWdyYXRpb25zLmNvdW50ID4gMCkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9IGtuZXhfbWlncmF0aW9ucyBrbmV4X21pZ3JhdGlvbnNfbG9jayA+ICR7bWlncmF0aW9uc0R1bXB9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMi4g64yA7IOBREIg6rCB6rCB7JeQIOuMgO2VmOyXrCDsobTsnqzsl6zrtoAg7ZmV7J24IO2bhCDrtpPquLBcbiAgZm9yIGF3YWl0IChjb25zdCB7IGxhYmVsLCBjb25maWcsIHRvU2tpcCB9IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBjb25uID0gY29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuXG4gICAgaWYgKHRvU2tpcCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2xhYmVsfTogU2tpcHBlZCFgKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IGtuZXgoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi4oKGNvbmZpZy5jb25uZWN0aW9uID8/IHt9KSBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLFxuICAgICAgICBkYXRhYmFzZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBbW3Jvd11dID0gYXdhaXQgZGIucmF3KGBTSE9XIERBVEFCQVNFUyBMSUtFIFwiJHtjb25uLmRhdGFiYXNlfVwiYCk7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAke2xhYmVsfTogRGF0YWJhc2UgXCIke2Nvbm4uZGF0YWJhc2V9XCIgQWxyZWFkeSBleGlzdHNgKSk7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgU1lOQyB0byAke2xhYmVsfS4uLmApO1xuICAgIGNvbnN0IG15c3FsQ21kID0gYG15c3FsIC1oJHtjb25uLmhvc3R9IC11JHtjb25uLnVzZXJ9IC1wJHtjb25uLnBhc3N3b3JkfWA7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnQ1JFQVRFIERBVEFCQVNFIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke2R1bXBGaWxlbmFtZX1gKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKG1pZ3JhdGlvbnNEdW1wKSkge1xuICAgICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke21pZ3JhdGlvbnNEdW1wfWApO1xuICAgIH1cblxuICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGF3YWl0IF9kYi5kZXN0cm95KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIHJlY29yZElkczogbnVtYmVyW10pIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmltcG9ydEZpeHR1cmUoZW50aXR5SWQsIHJlY29yZElkcyk7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9zeW5jKCkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZ2VuIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9nZW4oKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUdlbkNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICogZml4dHVyZSBmZXRjaCDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZmV0Y2goKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUZldGNoQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGV4cGxvcmUg66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2V4cGxvcmUoKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMocHJvY2Vzcy5hcmd2KTtcbiAgYXdhaXQgZml4dHVyZUV4cGxvcmVDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIOqwhOuLqO2VnCDsmLXshZgg7YyM7IScXG4gKi9cbmZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhcbiAgYXJndjogc3RyaW5nW10sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9IHtcbiAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgYm9vbGVhbiB8IHN0cmluZ1tdPiAmIHsgXzogc3RyaW5nW10gfSA9IHsgXzogW10gfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuXG4gICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFyZy5zbGljZSgyKTtcblxuICAgICAgaWYgKGtleS5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgY29uc3QgW2ssIHZdID0ga2V5LnNwbGl0KFwiPVwiKTtcbiAgICAgICAgb3B0aW9uc1trXSA9IHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG4gICAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDEpO1xuICAgICAgY29uc3QgbmV4dCA9IGFyZ3ZbaSArIDFdO1xuXG4gICAgICBpZiAobmV4dCAmJiAhbmV4dC5zdGFydHNXaXRoKFwiLVwiKSkge1xuICAgICAgICBvcHRpb25zW2tleV0gPSBuZXh0O1xuICAgICAgICBpKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zW2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zLl8ucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX3ByYWN0aWNlKG5hbWU6IHN0cmluZykge1xuICBjb25zdCBwcmFjdGljZURpciA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwicHJhY3RpY2VzXCIpO1xuICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyKHByYWN0aWNlRGlyKTtcblxuICBjb25zdCBtYXhTZXFObyA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHByYWN0aWNlRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHByYWN0aWNlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZFNlcXMgPSBmaWxlTmFtZXNcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAgIC5tYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IFssIHNlcU5vXSA9IGZpbGVOYW1lLm1hdGNoKC9ecChbMC05XSspLS8pID8/IFtcIjBcIiwgXCIwXCJdO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VxTm8pO1xuICAgICAgfSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG5cbiAgICBpZiAoZmlsdGVyZWRTZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZFNlcXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgY3VycmVudFNlcU5vID0gbWF4U2VxTm8gKyAxO1xuICBjb25zdCBmaWxlTmFtZSA9IGBwJHtjdXJyZW50U2VxTm99LSR7bmFtZX0udHNgO1xuICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHByYWN0aWNlRGlyLCBmaWxlTmFtZSk7XG5cbiAgY29uc3QgY29kZSA9IFtcbiAgICBgaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXCJcIixcbiAgICBgY29uc29sZS5jbGVhcigpO2AsXG4gICAgYGNvbnNvbGUubG9nKFwiJHtmaWxlTmFtZX1cIik7YCxcbiAgICBcIlwiLFxuICAgIGBTb25hbXUucnVuU2NyaXB0KGFzeW5jICgpID0+IHtgLFxuICAgIGAgLy8gVE9ET2AsXG4gICAgYH0pO2AsXG4gICAgXCJcIixcbiAgXS5qb2luKFwiXFxuXCIpO1xuICBhd2FpdCB3cml0ZUZpbGUoZHN0UGF0aCwgY29kZSk7XG5cbiAgZXhlY1N5bmMoYGNvZGUgJHtkc3RQYXRofWApO1xuXG4gIGNvbnN0IHJ1bkNvZGUgPSBgeWFybiBub2RlIC1yIGRvdGVudi9jb25maWcgLS1lbmFibGUtc291cmNlLW1hcHMgZGlzdC9wcmFjdGljZXMvJHtmaWxlTmFtZS5yZXBsYWNlKFxuICAgIFwiLnRzXCIsXG4gICAgXCIuanNcIixcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQsIHRpdGxlOiBlbnRpdHlJZCB9KTtcblxuICBjb25zdCB7IGZsYWdzIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcbiAgY29uc3QgdXNlQUkgPSBmbGFncy5oYXMoXCJhaVwiKTtcbiAgY29uc3Qgbm9Db25lcyA9IGZsYWdzLmhhcyhcIm5vLWNvbmVzXCIpO1xuXG4gIC8vIC0tbm8tY29uZXM6IGNvbmUg7IOd7ISxIOyKpO2CtVxuICBpZiAobm9Db25lcykge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRob3V0IGNvbmVzYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgaWYgKCFlbnRpdHkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIC0tYWk6IExMTeycvOuhnCBjb25lIOyDneyEsVxuICBpZiAodXNlQUkpIHtcbiAgICBjb25zb2xlLmxvZyhg4pyTIEVudGl0eSAnJHtlbnRpdHlJZH0nIGNyZWF0ZWRgKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMuLi5gKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6IGZhbHNlLFxuICAgICAgICBvbmx5RW1wdHk6IGZhbHNlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coYOKchSBEb25lICgke3Jlc3VsdC50b2tlbnNVc2VkfSB0b2tlbnMpYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFJlbW92ZSAtLWFpIGZsYWcgdG8gdXNlIHRlbXBsYXRlIGNvbmVzIGluc3RlYWRgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDquLDrs7g6IO2FnO2UjOumvyBjb25lIOyekOuPmSDsg53shLFcbiAgLy8gTExNIOyXhuydtCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgLy8g7J2066W8IO2Gte2VtCBBTlRIUk9QSUNfQVBJX0tFWeqwgCDsl4bslrTrj4QgU29uYW1166W8IOyCrOyaqe2VoCDsiJgg7J6I7Jy866mwLFxuICAvLyDsg53shLHrkJwg7YWc7ZSM66a/IGNvbmXsnYAg64KY7KSR7JeQICdjb25lIGdlbicg66qF66C57Ja066GcIEFJ66W8IO2Gte2VtCDsl4Xqt7jroIjsnbTrk5ztlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAgY29uc29sZS5sb2coYPCfjJ8gR2VuZXJhdGluZyB0ZW1wbGF0ZSBjb25lcy4uLmApO1xuICBhd2FpdCBlbnRpdHkuZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKCk7XG4gIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZCB3aXRoIHRlbXBsYXRlIGNvbmVzYCk7XG4gIGNvbnNvbGUubG9nKGDwn5KhIFRpcDogUnVuICdwbnBtIHNvbmFtdSBjb25lIGdlbiAke2VudGl0eUlkfScgdG8gaW1wcm92ZSB3aXRoIEFJYCk7XG59XG5cbi8qKlxuICogQUnrpbwg7IKs7Jqp7ZWY7JesIGVudGl0eeydmCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlZjqsbDrgpgg7JeF6re466CI7J2065Oc7ZWp64uI64ukLlxuICpcbiAqIOyYteyFmDpcbiAqIC0gLS1yZWdlbmVyYXRlOiDsoITssrQg7J6s7IOd7ISxICjquLDsobQgY29uZSDrja7slrTsk7DquLApXG4gKiAtIC0tbG9jYWxlIDxrb3xlbnxqYT46IOyDneyEsSDslrjslrQg7KeA7KCVXG4gKiAtIOq4sOuzuDogb25seUVtcHR5IOuqqOuTnCAo6riw7KG0IGZpeHR1cmVIaW50IOuztOyhtClcbiAqXG4gKiBBTlRIUk9QSUNfQVBJX0tFWSDtlYTsmpQgKHNvbmFtdS5zZWNyZXQudHMg65iQ64qUIO2ZmOqyveuzgOyImClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29uZV9nZW4oZW50aXR5SWQ6IHN0cmluZykge1xuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgeyBmbGFncywgb3B0aW9ucyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG5cbiAgLy8gLS1hbGwg7Ji17IWYOiDrqqjrk6AgZW50aXR5IGNvbmUg7IOd7ISxXG4gIGlmIChmbGFncy5oYXMoXCJhbGxcIikgfHwgZW50aXR5SWQgPT09IFwiYWxsXCIpIHtcbiAgICBjb25zdCBhbGxFbnRpdGllcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsRW50aXRpZXMoKTtcbiAgICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIEFJLXBvd2VyZWQgY29uZXMgZm9yICR7YWxsRW50aXRpZXMubGVuZ3RofSBlbnRpdGllcy4uLlxcbmApO1xuXG4gICAgbGV0IHRvdGFsVG9rZW5zID0gMDtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBhbGxFbnRpdGllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYFByb2Nlc3NpbmcgJHtlbnRpdHkuaWR9Li4uYCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IG9wdGlvbnMubG9jYWxlIHx8IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICAgICAgY29uc3QgbG9jYWxlID1cbiAgICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgICAgIDogXCJrb1wiO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG90YWxUb2tlbnMgKz0gcmVzdWx0LnRva2Vuc1VzZWQ7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgIOKckyAke2VudGl0eS5pZH0gKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylcXG5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFwiVW5rbm93biBlcnJvclwiO1xuICAgICAgICBlcnJvcnMucHVzaChgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAg4pyXICR7ZW50aXR5LmlkfTogJHttZXNzYWdlfVxcbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG7inIUgRG9uZSEgVG90YWw6ICR7dG90YWxUb2tlbnN9IHRva2VucyB1c2VkYCk7XG4gICAgY29uc3QgZXN0aW1hdGVkQ29zdCA9ICh0b3RhbFRva2VucyAqIDkpIC8gMV8wMDBfMDAwO1xuICAgIGNvbnNvbGUubG9nKGDwn5KwIEVzdGltYXRlZCBjb3N0OiB+JCR7ZXN0aW1hdGVkQ29zdC50b0ZpeGVkKDQpfWApO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIGVudGl0aWVzICgke2Vycm9ycy5sZW5ndGh9KTpgKTtcbiAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgIC0gJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOuLqOydvCBlbnRpdHkgY29uZSDsg53shLFcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kZSA9IGZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIikgPyBcInJlZ2VuZXJhdGluZ1wiIDogXCJnZW5lcmF0aW5nXCI7XG4gIGNvbnNvbGUubG9nKFxuICAgIGDwn4yfICR7bW9kZSA9PT0gXCJyZWdlbmVyYXRpbmdcIiA/IFwiUmVnZW5lcmF0aW5nXCIgOiBcIkdlbmVyYXRpbmdcIn0gQUktcG93ZXJlZCBjb25lcyBmb3IgJHtlbnRpdHlJZH0uLi5gLFxuICApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGxvY2FsZSA9XG4gICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIiA/IGNvbmZpZ0xvY2FsZSA6IFwia29cIjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgb25seUVtcHR5OiAhZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSxcbiAgICAgIGxvY2FsZSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinIUgRG9uZSEgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucyB1c2VkKWApO1xuXG4gICAgLy8g7Yag7YGwIOu5hOyaqSDqs4TsgrAgKOuMgOueteyggeyduCDstpTsoJUpXG4gICAgLy8gQ2xhdWRlIFNvbm5ldCA0LjU6IGlucHV0ICQzL00gdG9rZW5zLCBvdXRwdXQgJDE1L00gdG9rZW5zXG4gICAgLy8g6rCE64uo7ZWY6rKMIO2Pieq3oCAkOS9NIHRva2Vuc+uhnCDqs4TsgrBcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHJlc3VsdC50b2tlbnNVc2VkICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQU5USFJPUElDX0FQSV9LRVlcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBUbyB1c2UgQUktcG93ZXJlZCBjb25lIGdlbmVyYXRpb246YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgIDEuIEdldCBhbiBBUEkga2V5IGZyb20gaHR0cHM6Ly9jb25zb2xlLmFudGhyb3BpYy5jb20vYCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYCAgIDIuIEFkZCBpdCB0byBzb25hbXUuc2VjcmV0LnRzIG9yIHNldCBBTlRIUk9QSUNfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSYXRlIGxpbWl0XCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUGxlYXNlIHdhaXQgYSBtb21lbnQgYW5kIHRyeSBhZ2Fpbi5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgdG8gZ2VuZXJhdGUgY29uZXM6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogVW5rbm93biBlcnJvcmApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDqs7Xsi50gU2tpbGxz66W8IOuhnOy7rCDtlITroZzsoJ3tirgg65iQ64qUIOq4gOuhnOuyjCB+Ly5jbGF1ZGUv66GcIOuPmeq4sO2ZlO2VqeuLiOuLpC5cbiAqXG4gKiAtLWdsb2JhbCDtlIzrnpjqt7g6IH4vLmNsYXVkZS/sl5Ag64+Z6riw7ZmUICjtlITroZzsoJ3tirgg7IOd7ISxIOyghCDsgqzsmqkg6rCA64qlKVxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luYygpIHtcbiAgY29uc3QgeyBmbGFncyB9ID0gcGFyc2VDbGlPcHRpb25zKCk7XG4gIGNvbnN0IGlzR2xvYmFsID0gZmxhZ3MuaGFzKFwiZ2xvYmFsXCIpO1xuXG4gIC8vIOqwnOuwnCDtmZjqsr0gLSBjbGkudHM6IHNvbmFtdS9tb2R1bGVzL3NvbmFtdS9zcmMvYmluL2NsaS50c1xuICAvLyDruYzrk5wg7ZuEIC0gY2xpLmpzOiBub2RlX21vZHVsZXMvc29uYW11L2Rpc3QvYmluL2NsaS5qcyAo7Iuk7KCcIOyLpO2WiSlcbiAgLy8gc2tpbGxzIOychOy5mDogbm9kZV9tb2R1bGVzL3NvbmFtdS9zcmMvc2tpbGxzIChucG0g67Cw7Y+sIOyLnClcbiAgY29uc3Qgc291cmNlQmFzZSA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJzcmNcIiwgXCJza2lsbHNcIik7XG4gIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcInNvbmFtdVwiKTtcbiAgY29uc3Qgc291cmNlQ2xhdWRlTWQgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJDTEFVREUubWRcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHNvdXJjZVNraWxsc0RpcikpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiU2tpbGxzIHNvdXJjZSBub3QgZm91bmQgaW4gc29uYW11IHBhY2thZ2UuXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaXNHbG9iYWwpIHtcbiAgICBhd2FpdCBza2lsbHNfc3luY190byhwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCBcIi5jbGF1ZGVcIiksIHNvdXJjZVNraWxsc0Rpciwgc291cmNlQ2xhdWRlTWQsIHtcbiAgICAgIHVzZVN5bWxpbms6IGZhbHNlLFxuICAgICAgY29weVByb2plY3RUZW1wbGF0ZXM6IGZhbHNlLFxuICAgICAgaXNHbG9iYWw6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxuICBHbG9iYWwgc3luYyBjb21wbGV0ZSDihpIgfi8uY2xhdWRlL3NraWxscy9zb25hbXUvYCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBUaGVzZSBza2lsbHMgYXJlIGF2YWlsYWJsZSBpbiBhbGwgQ2xhdWRlIENvZGUgc2Vzc2lvbnMuYCkpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgY2hhbGsuZGltKFxuICAgICAgICBgICBPbmNlIGEgcHJvamVjdCBpcyBjcmVhdGVkLCBydW4gJ3BucG0gc29uYW11IHNraWxscyBzeW5jJyBmb3IgcHJvamVjdC1sb2NhbCBzeW5jLmAsXG4gICAgICApLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gICAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiKTtcbiAgICBhd2FpdCBza2lsbHNfc3luY190byhjbGF1ZGVEaXIsIHNvdXJjZVNraWxsc0Rpciwgc291cmNlQ2xhdWRlTWQsIHtcbiAgICAgIHVzZVN5bWxpbms6IHRydWUsXG4gICAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogdHJ1ZSxcbiAgICAgIHNvdXJjZUJhc2UsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBjbGF1ZGVEaXLroZwgc2tpbGxz66W8IOuPmeq4sO2ZlO2VmOuKlCDqs7XthrUg66Gc7KeB7J6F64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luY190byhcbiAgY2xhdWRlRGlyOiBzdHJpbmcsXG4gIHNvdXJjZVNraWxsc0Rpcjogc3RyaW5nLFxuICBzb3VyY2VDbGF1ZGVNZDogc3RyaW5nLFxuICBvcHRpb25zOiB7XG4gICAgdXNlU3ltbGluazogYm9vbGVhbjtcbiAgICBjb3B5UHJvamVjdFRlbXBsYXRlczogYm9vbGVhbjtcbiAgICBzb3VyY2VCYXNlPzogc3RyaW5nO1xuICAgIGlzR2xvYmFsPzogYm9vbGVhbjtcbiAgfSxcbikge1xuICBjb25zdCB0YXJnZXRTa2lsbHNEaXIgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcInNraWxsc1wiLCBcInNvbmFtdVwiKTtcblxuICAvLyDquLDsobQg65SU66CJ7Yag66asL3N5bWxpbmsg7IKt7KCcIO2bhCDsnqzsg53shLFcbiAgLy8gZXhpc3RzKCnripQgYnJva2VuIHN5bWxpbmvrpbwg6rCQ7KeA7ZWY7KeAIOuqu+2VmOuvgOuhnCBybeydhCDrrLTsobDqsbQg7Iuc64+E7ZWp64uI64ukXG4gIHRyeSB7XG4gICAgYXdhaXQgcm0odGFyZ2V0U2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIO2MjOydvOydtCDsl4bsnLzrqbQg66y07IucXG4gIH1cblxuICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUodGFyZ2V0U2tpbGxzRGlyKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgaWYgKG9wdGlvbnMudXNlU3ltbGluaykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzeW1saW5rKHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyLCBcImRpclwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGxpbmtlZCAoc3ltbGluaylgKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coYOKaoCBTeW1saW5rIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCksXG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgIEZhbGxpbmcgYmFjayB0byBjb3B5Li4uYCkpO1xuICAgICAgYXdhaXQgc2tpbGxzQ29weShzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0Rpcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGF3YWl0IHNraWxsc0NvcHkoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIpO1xuICB9XG5cbiAgLy8gcHJvamVjdCDrlJTroInthqDrpqwg7LSI6riw7ZmUICjsl4bsnLzrqbQg7IOd7ISxLCDsnojsnLzrqbQg7Jyg7KeAKVxuICBpZiAob3B0aW9ucy5jb3B5UHJvamVjdFRlbXBsYXRlcyAmJiBvcHRpb25zLnNvdXJjZUJhc2UpIHtcbiAgICBjb25zdCBzb3VyY2VQcm9qZWN0RGlyID0gcGF0aC5qb2luKG9wdGlvbnMuc291cmNlQmFzZSwgXCJwcm9qZWN0XCIpO1xuICAgIGNvbnN0IHRhcmdldFByb2plY3REaXIgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcInNraWxsc1wiLCBcInByb2plY3RcIik7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHNvdXJjZVByb2plY3REaXIpKSB7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHModGFyZ2V0UHJvamVjdERpcikpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY3Aoc291cmNlUHJvamVjdERpciwgdGFyZ2V0UHJvamVjdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBQcm9qZWN0IHRlbXBsYXRlcyBpbml0aWFsaXplZGApKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgICBg4pyXIEZhaWxlZCB0byBpbml0aWFsaXplIHByb2plY3QgdGVtcGxhdGVzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKPrSBQcm9qZWN0IHRlbXBsYXRlcyBhbHJlYWR5IGV4aXN0IChwcmVzZXJ2ZWQpYCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENMQVVERS5tZCDrs7Xsgqwv7JeF642w7J207Yq4XG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlQ2xhdWRlTWQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldENsYXVkZU1kID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJDTEFVREUubWRcIik7XG4gICAgICBjb25zdCByYXdDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc291cmNlQ2xhdWRlTWQsIFwidXRmLThcIik7XG4gICAgICAvLyDquIDroZzrsowg66qo65Oc7JeQ7ISc64qUIOyDgeuMgCDqsr3roZzrpbwg7KCI64yAIOqyveuhnOuhnCDrs4DtmZjtlanri4jri6RcbiAgICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBvcHRpb25zLmlzR2xvYmFsXG4gICAgICAgID8gcmF3Q29udGVudC5yZXBsYWNlQWxsKFwiLmNsYXVkZS9za2lsbHMvc29uYW11L1wiLCBcIn4vLmNsYXVkZS9za2lsbHMvc29uYW11L1wiKVxuICAgICAgICA6IHJhd0NvbnRlbnQ7XG5cbiAgICAgIGlmIChhd2FpdCBleGlzdHModGFyZ2V0Q2xhdWRlTWQpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0YXJnZXRDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOlNUQVJUIC0tPlwiO1xuICAgICAgICBjb25zdCBlbmRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOkVORCAtLT5cIjtcbiAgICAgICAgaWYgKHRhcmdldENvbnRlbnQuaW5jbHVkZXMoc3RhcnRNYXJrZXIpICYmIHRhcmdldENvbnRlbnQuaW5jbHVkZXMoZW5kTWFya2VyKSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKHN0YXJ0TWFya2VyKTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2YoZW5kTWFya2VyKTtcblxuICAgICAgICAgIGlmIChzdGFydElkeCAhPT0gLTEgJiYgZW5kSWR4ICE9PSAtMSAmJiBzdGFydElkeCA8IGVuZElkeCkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZyhlbmRJZHggKyBlbmRNYXJrZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtiZWZvcmV9JHtzdGFydE1hcmtlcn1cXG4ke3NvdXJjZUNvbnRlbnR9XFxuJHtlbmRNYXJrZXJ9JHthZnRlcn1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBuZXdDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKG1hcmtlciByZWdpb24pYCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKPrSBDTEFVREUubWQgbWFya2VyIHBvc2l0aW9ucyBpbnZhbGlkLCBza2lwcGVkYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDrp4jsu6TqsIAg7JeG64qUIOq4sOyhtCBDTEFVREUubWTsl5AgU29uYW11IOyEueyFmOydhCDstpTqsIDtlanri4jri6RcbiAgICAgICAgICBjb25zdCBhcHBlbmRlZCA9IGAke3RhcmdldENvbnRlbnQudHJpbUVuZCgpfVxcblxcbjwhLS0gU09OQU1VOlNUQVJUIC0tPlxcbiR7c291cmNlQ29udGVudH1cXG48IS0tIFNPTkFNVTpFTkQgLS0+XFxuYDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIGFwcGVuZGVkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCB1cGRhdGVkIChhcHBlbmRlZCBTb25hbXUgc2VjdGlvbilgKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHdpdGhNYXJrZXJzID0gYDwhLS0gU09OQU1VOlNUQVJUIC0tPlxcbiR7c291cmNlQ29udGVudH1cXG48IS0tIFNPTkFNVTpFTkQgLS0+XFxuYDtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCB3aXRoTWFya2Vycyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIGNyZWF0ZWRgKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBg4pyXIEZhaWxlZCB0byB1cGRhdGUgQ0xBVURFLm1kOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2tpbGxzQ29weShzcmM6IHN0cmluZywgZGVzdDogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgY3Aoc3JjLCBkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIFNraWxscyBjb3BpZWRgKSk7XG4gIH0gY2F0Y2ggKGNvcHlFcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBjaGFsay5yZWQoXG4gICAgICAgIGDinJcgRmFpbGVkIHRvIGNvcHkgc2tpbGxzOiAke2NvcHlFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY29weUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoY29weUVycm9yKX1gLFxuICAgICAgKSxcbiAgICApO1xuICAgIHRocm93IGNvcHlFcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBjcmVhdGUgPG5hbWU+IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog66Gc7LusIHNraWxsIOy0iOyViOydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19jcmVhdGUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBsb2NhbERpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIiwgXCJsb2NhbFwiKTtcblxuICAvLyA9PT0g7YyM7J2866qFIOqygOymnSDrsI8gU2FuaXRpemUgPT09XG4gIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIFNraWxsIG5hbWUgaXMgcmVxdWlyZWRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzYW5pdGl6ZWQgPSBuYW1lXG4gICAgLy8g6rO167Cx7J2EIO2VmOydtO2UiOycvOuhnFxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuICAgIC8vIOqyveuhnCDqtazrtoTsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1svXFxcXF0vZywgXCItXCIpXG4gICAgLy8gUGF0aCB0cmF2ZXJzYWwg67Cp7KeAXG4gICAgLnJlcGxhY2UoL1xcLlxcLi9nLCBcIlwiKVxuICAgIC8vIFdpbmRvd3Mg6riI7KeAIOusuOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWzw+OlwifD8qXS9nLCBcIlwiKVxuICAgIC8vIOyLnOyekS/rgZ0g7KCQLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCDsoJzqsbBcbiAgICAucmVwbGFjZSgvXlsuXFwtX10rfFsuXFwtX10rJC9nLCBcIlwiKVxuICAgIC8vIOyXsOyGjeuQnCDtlZjsnbTtlIjsnYQg7ZWY64KY66GcXG4gICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgIC8vIOyVjO2MjOuysywg7Iir7J6QLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCwg7ZWc6riA66eMIO2XiOyaqVxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOS1f6rCALe2eo10vZywgXCJcIik7XG5cbiAgLy8g6ri47J20IOygnO2VnFxuICBjb25zdCBNQVhfTEVOR1RIID0gMTAwO1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIE1BWF9MRU5HVEgpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgdHJ1bmNhdGVkIHRvICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2ApKTtcbiAgfVxuXG4gIC8vIFdpbmRvd3Mg7JiI7JW97Ja0IO2ZleyduFxuICBjb25zdCBSRVNFUlZFRF9OQU1FUyA9IFtcbiAgICBcIkNPTlwiLFxuICAgIFwiUFJOXCIsXG4gICAgXCJBVVhcIixcbiAgICBcIk5VTFwiLFxuICAgIFwiQ09NMVwiLFxuICAgIFwiQ09NMlwiLFxuICAgIFwiQ09NM1wiLFxuICAgIFwiQ09NNFwiLFxuICAgIFwiQ09NNVwiLFxuICAgIFwiQ09NNlwiLFxuICAgIFwiQ09NN1wiLFxuICAgIFwiQ09NOFwiLFxuICAgIFwiQ09NOVwiLFxuICAgIFwiTFBUMVwiLFxuICAgIFwiTFBUMlwiLFxuICAgIFwiTFBUM1wiLFxuICAgIFwiTFBUNFwiLFxuICAgIFwiTFBUNVwiLFxuICAgIFwiTFBUNlwiLFxuICAgIFwiTFBUN1wiLFxuICAgIFwiTFBUOFwiLFxuICAgIFwiTFBUOVwiLFxuICBdO1xuICBpZiAoUkVTRVJWRURfTkFNRVMuaW5jbHVkZXMoc2FuaXRpemVkLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgc2FuaXRpemVkID0gYHNraWxsLSR7c2FuaXRpemVkfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgUmVzZXJ2ZWQgbmFtZSBkZXRlY3RlZCwgcHJlZml4ZWQgd2l0aCBcInNraWxsLVwiYCkpO1xuICB9XG5cbiAgLy8g67mIIOusuOyekOyXtCDssrTtgaxcbiAgaWYgKHNhbml0aXplZCA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIEludmFsaWQgc2tpbGwgbmFtZSBhZnRlciBzYW5pdGl6YXRpb25cIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBPcmlnaW5hbDogXCIke25hbWV9XCJgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g67OA6rK9IOyVjOumvFxuICBpZiAoc2FuaXRpemVkICE9PSBuYW1lKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSBzYW5pdGl6ZWQ6IFwiJHtuYW1lfVwiIOKGkiBcIiR7c2FuaXRpemVkfVwiYCkpO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obG9jYWxEaXIsIGAke3Nhbml0aXplZH0ubWRgKTtcblxuICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgU2tpbGwgXCIke3Nhbml0aXplZH1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIobG9jYWxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC0tLVxubmFtZTogJHtzYW5pdGl6ZWR9XG5jYXRlZ29yeTogb3RoZXJcbmNyZWF0ZWRfYXQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX1cbnN0YXR1czogZHJhZnRcbi0tLVxuXG4jICR7c2FuaXRpemVkfVxuXG4jIyDsg4HtmalcblxuW+yWtOuWpCDrrLjsoJzsmIDripTsp4BdXG5cbiMjIO2VtOqysCDrsKnrspVcblxuW+yWtOuWu+qyjCDtlbTqsrDtlojripTsp4BdXG5cbiMjIOy9lOuTnCDsmIjsi5xcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuLy8g7JiI7IucIOy9lOuTnFxuXFxgXFxgXFxgXG5gO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgdGVtcGxhdGUpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvbG9jYWwvJHtzYW5pdGl6ZWR9Lm1kYCkpO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IGF1dGggZ2VuZXJhdGUg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBiZXR0ZXItYXV0aCDsl5Tti7Dti7Drk6QoVXNlciwgU2Vzc2lvbiwgQWNjb3VudCwgVmVyaWZpY2F0aW9uKeydhCDsg53shLHtlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLS1wbHVnaW5zIHBob25lLW51bWJlciwyZmEgIO2UjOufrOq3uOyduCDsl5Tti7Dti7Drj4Qg7ZWo6ruYIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2dlbmVyYXRlKCkge1xuICAvLyAtLXBsdWdpbnMg7Ji17IWYIO2MjOyLsVxuICBjb25zdCBwbHVnaW5zQXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoXCItLXBsdWdpbnNcIikpO1xuICBjb25zdCBwbHVnaW5zOiBCZXR0ZXJBdXRoUGx1Z2luSWRbXSA9IFtdO1xuXG4gIGlmIChwbHVnaW5zQXJnKSB7XG4gICAgY29uc3QgcGx1Z2luVmFsdWUgPSBwbHVnaW5zQXJnLmluY2x1ZGVzKFwiPVwiKVxuICAgICAgPyBwbHVnaW5zQXJnLnNwbGl0KFwiPVwiKVsxXVxuICAgICAgOiBwcm9jZXNzLmFyZ3ZbcHJvY2Vzcy5hcmd2LmluZGV4T2YocGx1Z2luc0FyZykgKyAxXTtcblxuICAgIGlmIChwbHVnaW5WYWx1ZSkge1xuICAgICAgY29uc3QgcGx1Z2luSWRzID0gcGx1Z2luVmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHBsdWdpbklkcykge1xuICAgICAgICBpZiAoaXNWYWxpZFBsdWdpbklkKGlkKSkge1xuICAgICAgICAgIHBsdWdpbnMucHVzaChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgVW5rbm93biBwbHVnaW46ICR7aWR9YCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBTdXBwb3J0ZWQgcGx1Z2luczogJHtTVVBQT1JURURfUExVR0lOX0lEUy5qb2luKFwiLCBcIil9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEdlbmVyYXRpbmcgYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGx1Z2luczogJHtwbHVnaW5zLmpvaW4oXCIsIFwiKX1gKSk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyh7IHBsdWdpbnMgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBhZGQtY29tcGFuaW9ucyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOq4sOyhtCDtlITroZzsoJ3tirjsnZggZW50aXR5Lmpzb27sl5AgZml4dHVyZUNvbXBhbmlvbnPrpbwg7IaM6riJIOy2lOqwgO2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrr7ggZml4dHVyZUNvbXBhbmlvbnPqsIAg7J6I64qUIGVudGl0eeuKlCDsiqTtgrXtlanri4jri6QgKOuNruyWtOyTsOq4sCDsl4bsnYwpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2FkZF9jb21wYW5pb25zKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgQWRkaW5nIGZpeHR1cmVDb21wYW5pb25zIHRvIGJldHRlci1hdXRoIGVudGl0aWVzLi4uXFxuXCIpKTtcbiAgYXdhaXQgYWRkQ29tcGFuaW9uc1RvRW50aXRpZXMoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZChcIlxcbuKchSBEb25lIVwiKSk7XG59XG5cbi8qKlxuICog7JuM7YGs7Iqk7Y6Y7J207IqkIOujqO2KuOulvCDssL7sirXri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IHBucG0td29ya3NwYWNlLnlhbWwgPiBDTEFVREUubWQgPiDro6jtirggcGFja2FnZS5qc29uICh3b3Jrc3BhY2VzIO2VhOuTnClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVJvb3QoKSB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIHdoaWxlIChkaXIgIT09IHBhdGguZGlybmFtZShkaXIpKSB7XG4gICAgLy8gMS4gcG5wbS13b3Jrc3BhY2UueWFtbCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2ZleyLpO2VnCBtb25vcmVwbyDro6jtirguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcInBucG0td29ya3NwYWNlLnlhbWxcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDIuIENMQVVERS5tZCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2UhOuhnOygne2KuCDro6jtirjroZwg6rCE7KO87ZWoLlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJDTEFVREUubWRcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDMuIHBhY2thZ2UuanNvbuyXkCB3b3Jrc3BhY2VzIO2VhOuTnOqwgCDsnojsnLzrqbQg66Oo7Yq4LlxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYWNrYWdlUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYWNrYWdlUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICAgIGlmIChwYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIO2MjOyLsSDsi6TtjKjsi5wg66y07IucXG4gICAgICB9XG4gICAgfVxuICAgIGRpciA9IHBhdGguZGlybmFtZShkaXIpO1xuICB9XG5cbiAgLy8g7LC+7KeAIOuqu+2VmOuptCBhcGkg7Y+0642U7J2YIOu2gOuqqCDsgqzsmqlcbiAgcmV0dXJuIGZpbmRBcHBSb290UGF0aCgpO1xufVxuIl0sIm5hbWVzIjpbImNoYWxrIiwiZG90ZW52IiwiY29uZmlnIiwiYXNzZXJ0IiwiZXhlY1N5bmMiLCJzcGF3biIsImNwIiwibWtkaXIiLCJyZWFkZGlyIiwicmVhZEZpbGUiLCJybSIsInN5bWxpbmsiLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsIm9zIiwicGF0aCIsInByb2Nlc3MiLCJ0c2ljbGkiLCJTb25hbXUiLCJhZGRDb21wYW5pb25zVG9FbnRpdGllcyIsImdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzIiwiaXNWYWxpZFBsdWdpbklkIiwiU1VQUE9SVEVEX1BMVUdJTl9JRFMiLCJFbnRpdHlNYW5hZ2VyIiwiTWlncmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsImV4ZWNXaXRoTGluZVByZWZpeCIsInByaW50QnVpbGRTdW1tYXJ5IiwicHJpbnRUYXNrRmFpbGVkIiwicHJpbnRUYXNrSGVhZGVyIiwicHJpbnRUYXNrU3RhcnQiLCJwcmludFRhc2tTdWNjZXNzIiwiZXhpc3RzIiwiZmluZEFwaVJvb3RQYXRoIiwiZmluZEFwcFJvb3RQYXRoIiwiQVBJX0FSVElGQUNUUyIsIldFQl9BUlRJRkFDVFMiLCJmaXh0dXJlRXhwbG9yZUNvbW1hbmQiLCJmaXh0dXJlRmV0Y2hDb21tYW5kIiwiZml4dHVyZUdlbkNvbW1hbmQiLCJ0ZXN0Q29tbWFuZCIsIm1pZ3JhdG9yIiwicGFyc2VDbGlPcHRpb25zIiwiYXJndiIsImZsYWdzIiwiU2V0Iiwib3B0aW9ucyIsImkiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwic3BsaXQiLCJuZXh0QXJnIiwiYWRkIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5pdCIsImZpbHRlcmVkQXJndiIsInNraXBOZXh0IiwiYWZ0ZXJEb3VibGVEYXNoIiwicHVzaCIsImNtZCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2FwcGx5IiwiZml4dHVyZV9pbml0IiwiZml4dHVyZV9pbXBvcnQiLCJmaXh0dXJlX3N5bmMiLCJmaXh0dXJlX2dlbiIsImZpeHR1cmVfZmV0Y2giLCJmaXh0dXJlX2V4cGxvcmUiLCJzdHViX3ByYWN0aWNlIiwic3R1Yl9lbnRpdHkiLCJzY2FmZm9sZF9tb2RlbCIsInNjYWZmb2xkX21vZGVsX3Rlc3QiLCJjb25lX2dlbiIsInN5bmMiLCJidWlsZF9hbGwiLCJidWlsZF9hcGkiLCJidWlsZF93ZWIiLCJkZXZfYWxsIiwiZGV2X2FwaSIsImRldl93ZWIiLCJzdGFydCIsInNraWxsc19zeW5jIiwic2tpbGxzX2NyZWF0ZSIsInRlc3QiLCJhdXRoX2dlbmVyYXRlIiwiYXV0aF9hZGRfY29tcGFuaW9ucyIsImRlc3Ryb3kiLCJmaW5hbGx5Iiwic3luY2VyIiwic3Bhd25BcGlEZXZTZXJ2ZXIiLCJhcGlSb290IiwiZW50cnlQb2ludCIsImhvdFJ1bm5lckJpblBhdGgiLCJ1cmwiLCJyZXNvbHZlIiwic2VydmVyUHJvY2VzcyIsImV4ZWNQYXRoIiwiam9pbiIsImN3ZCIsInN0ZGlvIiwiZW52IiwiTk9ERV9FTlYiLCJIT1QiLCJBUElfUk9PVF9QQVRIIiwiZXh0cmFFbnYiLCJjbGVhbnVwIiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImtpbGwiLCJleGl0Iiwib24iLCJjb2RlIiwiZXJyb3IiLCJyZWQiLCJib2xkIiwiU09OQU1VX0RJU0FCTEVfSU5URUdSQVRFRF9XRUIiLCJhcHBSb290Iiwid2ViUGF0aCIsImRvdWJsZURhc2hJbmRleCIsImluZGV4T2YiLCJwYXNzdGhyb3VnaEFyZ3MiLCJ2aXRlQXJncyIsInZpdGVQcm9jZXNzIiwic2lnbmFsIiwicmVzb2x2ZVN3Y0NvbmZpZ1BhdGgiLCJzd2NGaWxlUGF0aCIsImRpbSIsImRpcm5hbWUiLCJza2lwSWZNaXNzaW5nIiwiYXBpU3RhcnRlZEF0IiwiRGF0ZSIsIm5vdyIsImFydGlmYWN0IiwicHJvamVjdFBhdGgiLCJkZXNjcmlwdGlvbiIsInJ1bkJ1aWxkU3RlcHMiLCJidWlsZENvbW1hbmRBcmdzIiwiY29uZmlnRmlsZVBhdGgiLCJlIiwiZ3JheSIsIndlYlN0YXJ0ZWRBdCIsInN0ZXBzIiwicHJlQnVpbGRDb21tYW5kIiwiYnVpbGRDb21tYW5kIiwicG9zdEJ1aWxkQ29tbWFuZCIsImZpbHRlciIsInN0ZXAiLCJpc0xhc3QiLCJFcnJvciIsImNhdXNlIiwiYmx1ZSIsInNldHVwTWlncmF0b3IiLCJzZXR1cEZpeHR1cmVNYW5hZ2VyIiwidGFyZ2V0cyIsInJ1bkFjdGlvbiIsImxvY2FsSG9zdHMiLCJPYmplY3QiLCJrZXlzIiwiZGJDb25maWciLCJ0YXJnZXQiLCJ0YXJnZXRDb25maWciLCJob3N0IiwiY29ubmVjdGlvbiIsInRvTG93ZXJDYXNlIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwic3JjQ29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwibGFiZWwiLCJmaXh0dXJlIiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImxvY2FsQ29ubiIsImRhdGFiYXNlIiwiZHVtcEZpbGVuYW1lIiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicGFyc2VPcHRpb25zIiwiXyIsImsiLCJ2IiwibmV4dCIsInByYWN0aWNlRGlyIiwiYXBpUm9vdFBhdGgiLCJmaWxlTmFtZXMiLCJtYXhTZXFObyIsInJlY3Vyc2l2ZSIsImZpbHRlcmVkU2VxcyIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJ1c2VBSSIsImhhcyIsIm5vQ29uZXMiLCJlbnRpdHkiLCJnZXQiLCJjb25maWdMb2NhbGUiLCJpMThuIiwiZGVmYXVsdExvY2FsZSIsImxvY2FsZSIsInJlc3VsdCIsImdlbmVyYXRlQ29uZXMiLCJwcmVzZXJ2ZUV4aXN0aW5nIiwib25seUVtcHR5IiwidG9rZW5zVXNlZCIsImdlbmVyYXRlVGVtcGxhdGVDb25lcyIsImFsbEVudGl0aWVzIiwiZ2V0QWxsRW50aXRpZXMiLCJ0b3RhbFRva2VucyIsImVycm9ycyIsImlkIiwiZXN0aW1hdGVkQ29zdCIsInRvRml4ZWQiLCJlcnIiLCJtb2RlIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsImlzR2xvYmFsIiwic291cmNlQmFzZSIsInNvdXJjZVNraWxsc0RpciIsInNvdXJjZUNsYXVkZU1kIiwic2tpbGxzX3N5bmNfdG8iLCJob21lZGlyIiwidXNlU3ltbGluayIsImNvcHlQcm9qZWN0VGVtcGxhdGVzIiwiY3lhbiIsIndvcmtzcGFjZVJvb3QiLCJmaW5kV29ya3NwYWNlUm9vdCIsImNsYXVkZURpciIsInRhcmdldFNraWxsc0RpciIsImZvcmNlIiwiZ3JlZW4iLCJTdHJpbmciLCJza2lsbHNDb3B5Iiwic291cmNlUHJvamVjdERpciIsInRhcmdldFByb2plY3REaXIiLCJ0YXJnZXRDbGF1ZGVNZCIsInJhd0NvbnRlbnQiLCJzb3VyY2VDb250ZW50IiwicmVwbGFjZUFsbCIsInRhcmdldENvbnRlbnQiLCJzdGFydE1hcmtlciIsImVuZE1hcmtlciIsInN0YXJ0SWR4IiwiZW5kSWR4IiwiYmVmb3JlIiwic3Vic3RyaW5nIiwiYWZ0ZXIiLCJuZXdDb250ZW50IiwiYXBwZW5kZWQiLCJ0cmltRW5kIiwid2l0aE1hcmtlcnMiLCJzcmMiLCJkZXN0IiwiY29weUVycm9yIiwibG9jYWxEaXIiLCJ0cmltIiwic2FuaXRpemVkIiwiTUFYX0xFTkdUSCIsIlJFU0VSVkVEX05BTUVTIiwidG9VcHBlckNhc2UiLCJmaWxlUGF0aCIsInRlbXBsYXRlIiwidG9JU09TdHJpbmciLCJwbHVnaW5zQXJnIiwiZmluZCIsInBsdWdpbnMiLCJwbHVnaW5WYWx1ZSIsInBsdWdpbklkcyIsInAiLCJkaXIiLCJwYWNrYWdlUGF0aCIsInBhY2thZ2VKc29uIiwiSlNPTiIsInBhcnNlIiwid29ya3NwYWNlcyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFlBQVksU0FBUztBQUU1QkEsT0FBT0MsTUFBTTtBQUViLE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxRQUFRLEVBQUVDLEtBQUssUUFBUSxnQkFBZ0I7QUFDaEQsU0FBU0MsRUFBRSxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxFQUFFLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ25GLE9BQU9DLFVBQXlCLE9BQU87QUFDdkMsU0FBU0MsYUFBYSxRQUFRLFNBQVM7QUFDdkMsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFVBQVUsT0FBTztBQUN4QixPQUFPQyxhQUFhLFVBQVU7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