sonamu 0.7.21 → 0.7.23

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 (200) hide show
  1. package/dist/ai/agents/agent.d.ts +6 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +20 -5
  4. package/dist/api/base-frame.d.ts +4 -0
  5. package/dist/api/base-frame.d.ts.map +1 -1
  6. package/dist/api/base-frame.js +9 -1
  7. package/dist/api/caster.d.ts.map +1 -1
  8. package/dist/api/caster.js +2 -2
  9. package/dist/api/config.d.ts +35 -3
  10. package/dist/api/config.d.ts.map +1 -1
  11. package/dist/api/config.js +1 -1
  12. package/dist/api/decorators.d.ts +4 -4
  13. package/dist/api/decorators.d.ts.map +1 -1
  14. package/dist/api/decorators.js +80 -18
  15. package/dist/api/index.d.ts +1 -0
  16. package/dist/api/index.d.ts.map +1 -1
  17. package/dist/api/index.js +2 -1
  18. package/dist/api/secret.d.ts +7 -0
  19. package/dist/api/secret.d.ts.map +1 -0
  20. package/dist/api/secret.js +17 -0
  21. package/dist/api/sonamu.d.ts +17 -8
  22. package/dist/api/sonamu.d.ts.map +1 -1
  23. package/dist/api/sonamu.js +265 -47
  24. package/dist/cache/cache-manager.d.ts +11 -0
  25. package/dist/cache/cache-manager.d.ts.map +1 -0
  26. package/dist/cache/cache-manager.js +22 -0
  27. package/dist/cache/decorator.d.ts +31 -0
  28. package/dist/cache/decorator.d.ts.map +1 -0
  29. package/dist/cache/decorator.js +86 -0
  30. package/dist/cache/drivers.d.ts +33 -0
  31. package/dist/cache/drivers.d.ts.map +1 -0
  32. package/dist/cache/drivers.js +36 -0
  33. package/dist/cache/index.d.ts +4 -0
  34. package/dist/cache/index.d.ts.map +1 -0
  35. package/dist/cache/index.js +8 -0
  36. package/dist/cache/types.d.ts +28 -0
  37. package/dist/cache/types.d.ts.map +1 -0
  38. package/dist/cache/types.js +6 -0
  39. package/dist/database/base-model.d.ts +4 -2
  40. package/dist/database/base-model.d.ts.map +1 -1
  41. package/dist/database/base-model.js +9 -4
  42. package/dist/database/code-generator.d.ts +3 -1
  43. package/dist/database/code-generator.d.ts.map +1 -1
  44. package/dist/database/code-generator.js +3 -2
  45. package/dist/database/db.d.ts +1 -1
  46. package/dist/database/db.d.ts.map +1 -1
  47. package/dist/database/db.js +5 -5
  48. package/dist/database/knex.d.ts +3 -0
  49. package/dist/database/knex.d.ts.map +1 -0
  50. package/dist/database/knex.js +29 -0
  51. package/dist/database/puri.types.d.ts.map +1 -1
  52. package/dist/database/puri.types.js +1 -1
  53. package/dist/database/upsert-builder.d.ts.map +1 -1
  54. package/dist/database/upsert-builder.js +49 -5
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +4 -1
  58. package/dist/logger/category.d.ts +4 -0
  59. package/dist/logger/category.d.ts.map +1 -0
  60. package/dist/logger/category.js +34 -0
  61. package/dist/logger/configure.d.ts +9 -0
  62. package/dist/logger/configure.d.ts.map +1 -0
  63. package/dist/logger/configure.js +115 -0
  64. package/dist/migration/code-generation.d.ts +5 -1
  65. package/dist/migration/code-generation.d.ts.map +1 -1
  66. package/dist/migration/code-generation.js +13 -7
  67. package/dist/migration/migrator.d.ts +1 -1
  68. package/dist/migration/migrator.d.ts.map +1 -1
  69. package/dist/migration/migrator.js +7 -7
  70. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  71. package/dist/migration/postgresql-schema-reader.js +5 -3
  72. package/dist/naite/naite.d.ts +0 -4
  73. package/dist/naite/naite.d.ts.map +1 -1
  74. package/dist/naite/naite.js +11 -19
  75. package/dist/ssr/index.d.ts +4 -0
  76. package/dist/ssr/index.d.ts.map +1 -0
  77. package/dist/ssr/index.js +4 -0
  78. package/dist/ssr/registry.d.ts +10 -0
  79. package/dist/ssr/registry.d.ts.map +1 -0
  80. package/dist/ssr/registry.js +43 -0
  81. package/dist/ssr/renderer.d.ts +6 -0
  82. package/dist/ssr/renderer.d.ts.map +1 -0
  83. package/dist/ssr/renderer.js +70 -0
  84. package/dist/ssr/types.d.ts +19 -0
  85. package/dist/ssr/types.d.ts.map +1 -0
  86. package/dist/ssr/types.js +4 -0
  87. package/dist/syncer/syncer.d.ts +1 -0
  88. package/dist/syncer/syncer.d.ts.map +1 -1
  89. package/dist/syncer/syncer.js +58 -1
  90. package/dist/tasks/decorator.d.ts +1 -0
  91. package/dist/tasks/decorator.d.ts.map +1 -1
  92. package/dist/tasks/decorator.js +9 -7
  93. package/dist/tasks/step-wrapper.d.ts +5 -0
  94. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  95. package/dist/tasks/step-wrapper.js +11 -6
  96. package/dist/tasks/workflow-manager.d.ts +2 -0
  97. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  98. package/dist/tasks/workflow-manager.js +5 -2
  99. package/dist/template/implementations/entry-server.template.d.ts +17 -0
  100. package/dist/template/implementations/entry-server.template.d.ts.map +1 -0
  101. package/dist/template/implementations/entry-server.template.js +78 -0
  102. package/dist/template/implementations/model.template.d.ts.map +1 -1
  103. package/dist/template/implementations/model.template.js +5 -3
  104. package/dist/template/implementations/queries.template.d.ts +17 -0
  105. package/dist/template/implementations/queries.template.d.ts.map +1 -0
  106. package/dist/template/implementations/queries.template.js +83 -0
  107. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  108. package/dist/template/implementations/view_enums_select.template.js +34 -20
  109. package/dist/template/implementations/view_form.template.d.ts +2 -1
  110. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  111. package/dist/template/implementations/view_form.template.js +301 -129
  112. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  113. package/dist/template/implementations/view_id_async_select.template.js +136 -57
  114. package/dist/template/implementations/view_list.template.d.ts +2 -0
  115. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  116. package/dist/template/implementations/view_list.template.js +392 -227
  117. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  118. package/dist/template/implementations/view_search_input.template.js +46 -30
  119. package/dist/template/zod-converter.d.ts.map +1 -1
  120. package/dist/template/zod-converter.js +2 -2
  121. package/dist/testing/bootstrap.d.ts +28 -0
  122. package/dist/testing/bootstrap.d.ts.map +1 -0
  123. package/dist/testing/bootstrap.js +120 -0
  124. package/dist/testing/fixture-loader.d.ts +21 -0
  125. package/dist/testing/fixture-loader.d.ts.map +1 -0
  126. package/dist/testing/fixture-loader.js +28 -0
  127. package/dist/testing/fixture-manager.d.ts +1 -1
  128. package/dist/testing/fixture-manager.d.ts.map +1 -1
  129. package/dist/testing/fixture-manager.js +7 -7
  130. package/dist/testing/index.d.ts +4 -0
  131. package/dist/testing/index.d.ts.map +1 -0
  132. package/dist/testing/index.js +5 -0
  133. package/dist/testing/naite-vitest-reporter.d.ts +12 -0
  134. package/dist/testing/naite-vitest-reporter.d.ts.map +1 -0
  135. package/dist/testing/naite-vitest-reporter.js +17 -0
  136. package/dist/types/types.d.ts +5 -6
  137. package/dist/types/types.d.ts.map +1 -1
  138. package/dist/types/types.js +7 -8
  139. package/dist/ui/ai-client.d.ts +3 -1
  140. package/dist/ui/ai-client.d.ts.map +1 -1
  141. package/dist/ui/ai-client.js +27 -8
  142. package/dist/ui-web/assets/index-CTYv3qL6.js +92 -0
  143. package/dist/ui-web/index.html +1 -1
  144. package/package.json +43 -20
  145. package/src/ai/agents/agent.ts +38 -19
  146. package/src/api/base-frame.ts +8 -0
  147. package/src/api/caster.ts +6 -1
  148. package/src/api/config.ts +38 -4
  149. package/src/api/decorators.ts +106 -20
  150. package/src/api/index.ts +1 -0
  151. package/src/api/secret.ts +23 -0
  152. package/src/api/sonamu.ts +334 -61
  153. package/src/cache/cache-manager.ts +23 -0
  154. package/src/cache/decorator.ts +116 -0
  155. package/src/cache/drivers.ts +42 -0
  156. package/src/cache/index.ts +16 -0
  157. package/src/cache/types.ts +32 -0
  158. package/src/database/base-model.ts +7 -3
  159. package/src/database/code-generator.ts +3 -1
  160. package/src/database/db.ts +5 -5
  161. package/src/database/knex.ts +34 -0
  162. package/src/database/puri.types.ts +2 -3
  163. package/src/database/upsert-builder.ts +58 -4
  164. package/src/index.ts +4 -0
  165. package/src/logger/category.ts +42 -0
  166. package/src/logger/configure.ts +132 -0
  167. package/src/migration/code-generation.ts +19 -6
  168. package/src/migration/migrator.ts +7 -6
  169. package/src/migration/postgresql-schema-reader.ts +7 -2
  170. package/src/naite/naite.ts +10 -18
  171. package/src/shared/web.shared.ts.txt +1 -1
  172. package/src/ssr/index.ts +13 -0
  173. package/src/ssr/registry.ts +52 -0
  174. package/src/ssr/renderer.ts +105 -0
  175. package/src/ssr/types.ts +20 -0
  176. package/src/syncer/syncer.ts +59 -0
  177. package/src/tasks/decorator.ts +20 -4
  178. package/src/tasks/step-wrapper.ts +14 -5
  179. package/src/tasks/workflow-manager.ts +9 -1
  180. package/src/template/implementations/entry-server.template.ts +81 -0
  181. package/src/template/implementations/model.template.ts +4 -2
  182. package/src/template/implementations/queries.template.ts +111 -0
  183. package/src/template/implementations/view_enums_select.template.ts +33 -19
  184. package/src/template/implementations/view_form.template.ts +324 -145
  185. package/src/template/implementations/view_id_async_select.template.ts +145 -56
  186. package/src/template/implementations/view_list.template.ts +446 -236
  187. package/src/template/implementations/view_search_input.template.ts +45 -29
  188. package/src/template/zod-converter.ts +4 -1
  189. package/src/testing/bootstrap.ts +176 -0
  190. package/src/testing/fixture-loader.ts +28 -0
  191. package/src/testing/fixture-manager.ts +7 -6
  192. package/src/testing/index.ts +3 -0
  193. package/src/testing/naite-vitest-reporter.ts +18 -0
  194. package/src/types/types.ts +4 -5
  195. package/src/ui/ai-client.ts +82 -50
  196. package/dist/template/implementations/view_enums_dropdown.template.d.ts +0 -17
  197. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +0 -1
  198. package/dist/template/implementations/view_enums_dropdown.template.js +0 -50
  199. package/dist/ui-web/assets/index-B87IyofX.js +0 -92
  200. package/src/template/implementations/view_enums_dropdown.template.ts +0 -53
@@ -611,7 +611,9 @@ function genPgroongaIndexDefinition(index, table) {
611
611
  return undefined;
612
612
  }
613
613
  if (key === "columns") {
614
- return index[key].flatMap(identity);
614
+ return index[key].map((col)=>{
615
+ return Object.keys(col).sort().map((k)=>`${k}=${col[k]}`).join("//");
616
+ });
615
617
  }
616
618
  return `${key}=${index[key]}`;
617
619
  }).join("//");
@@ -635,14 +637,18 @@ function genPgroongaIndexDefinition(index, table) {
635
637
  }
636
638
  /**
637
639
  * DB 조회 결과와 비교하기 위한 인덱스 기본값 설정
638
- */ function setMigrationIndexDefaults(index) {
640
+ */ export function setMigrationIndexDefaults(index) {
641
+ const supportsOrdering = index.type !== "hnsw" && // type이 hnsw면 벡터 인덱스
642
+ index.type !== "ivfflat" && // type이 ivfflat면 벡터 인덱스
643
+ (!index.using || index.using === "btree"); // using 체크
639
644
  return {
640
645
  ...index,
641
646
  columns: index.columns.map((col)=>({
642
- ...col,
643
- sortOrder: col.sortOrder ?? "ASC",
644
- // sortOrder 따라 nullsFirst의 default 값 설정
645
- nullsFirst: col.nullsFirst ?? col.sortOrder === "DESC"
647
+ name: col.name,
648
+ ...supportsOrdering ? {
649
+ sortOrder: col.sortOrder ?? "ASC",
650
+ nullsFirst: col.nullsFirst ?? col.sortOrder === "DESC"
651
+ } : {}
646
652
  })),
647
653
  nullsNotDistinct: index.nullsNotDistinct ?? false,
648
654
  using: index.using ?? "btree"
@@ -838,4 +844,4 @@ function genPgroongaIndexDefinition(index, table) {
838
844
  return alterCodes.filter((alterCode)=>alterCode !== null).flat();
839
845
  }
840
846
 
841
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBhbHBoYWJldGljYWwsIGRpZmYgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgTmFpdGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHtcbiAgRW50aXR5UHJvcCxcbiAgR2VuTWlncmF0aW9uQ29kZSxcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlV2l0aCwgaW50ZXJzZWN0aW9uQnkgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiDsu6zrn7wg7KCV7J2YIOqysOqzvCDtg4DsnoVcbiAqIC0gYnVpbGRlcjogS25leCB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg6rWs66y4ICh0YWJsZS54eHgoKSlcbiAqIC0gcmF3OiBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDqtazrrLhcbiAqL1xudHlwZSBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICBidWlsZGVyOiBzdHJpbmdbXTtcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW5bXSDsnb3slrTshJwg7Lus65+8IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKiBAcmV0dXJucyBidWlsZGVyOiB0YWJsZSBidWlsZGVyIOuplOyEnOuTnCwgcmF3OiBrbmV4LnJhdygpIOq1rOusuFxuICovXG5mdW5jdGlvbiBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IENvbHVtbkRlZmluaXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gICAgYnVpbGRlcjogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCByYXfroZwg7LKY66asXG4gICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICAgIHJlc3VsdC5yYXcucHVzaChnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBjb2x1bW4pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOydvOuwmCDsu6zrn7zsnYAgYnVpbGRlcuuhnCDsspjrpqxcbiAgICByZXN1bHQuYnVpbGRlci5wdXNoKGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBDb2x1bW4g7KCV7J2YIOyDneyEsSAoQUxURVIgVEFCTEUgQUREIENPTFVNTiDsgqzsmqkpXG4gKi9cbmZ1bmN0aW9uIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGU6IHN0cmluZywgY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoIWNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gcmVxdWlyZWRcIik7XG4gIH1cbiAgY29uc3QgcGdUeXBlID0gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbik7XG4gIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sdW1uLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIiA/IFwiIFZJUlRVQUxcIiA6IFwiIFNUT1JFRFwiO1xuICBjb25zdCBudWxsYWJsZUNsYXVzZSA9IGNvbHVtbi5udWxsYWJsZSA/IFwiXCIgOiBcIiBOT1QgTlVMTFwiO1xuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYEFMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09MVU1OIFwiJHtjb2x1bW4ubmFtZX1cIiAke3BnVHlwZX0gR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2x1bW4uZ2VuZXJhdGVkLmV4cHJlc3Npb259KSR7c3RvcmFnZVR5cGV9JHtudWxsYWJsZUNsYXVzZX1cXGApO2A7XG59XG5cbi8qKlxuICog7J2867CYIOy7rOufvCDsoJXsnZgg7IOd7ISxICh0YWJsZS54eHgoKSDssrTsnbgpXG4gKi9cbmZ1bmN0aW9uIGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBjb25zdCBjaGFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbHVtbi5uYW1lID09PSBcImlkXCIpIHtcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSB9KWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIC8vIGpzb25cbiAgICBjaGFpbnMucHVzaChganNvbmIoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlLCBsZW5ndGhcbiAgICBsZXQgZXh0cmFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY2hhaW5zLnB1c2goXG4gICAgICBgJHtjb2x1bW4udHlwZX0oJyR7Y29sdW1uLm5hbWV9JyR7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJcbiAgICAgIH0ke2V4dHJhVHlwZSA/IGAsICcke2V4dHJhVHlwZX0nYCA6IFwiXCJ9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKGtuZXgucmF3KCcke2NvbHVtbi5kZWZhdWx0VG99JykpYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGB0YWJsZS4ke2NoYWlucy5qb2luKFwiLlwiKX07YDtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW7snZgg7YOA7J6F7J2EIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAqL1xuZnVuY3Rpb24gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTtcbiAgICByZXR1cm4gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sdW1uLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICBjYXNlIFwibnVtYmVyT3JOdW1lcmljXCI6XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSByZXR1cm4gXCJyZWFsXCI7XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSByZXR1cm4gXCJkb3VibGUgcHJlY2lzaW9uXCI7XG4gICAgICByZXR1cm4gYG51bWVyaWMoJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWA7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInRpbWVzdGFtcHR6XCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25iXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbi50eXBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBnQXJyYXlUeXBlKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uLCBlbGVtZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFtdXCI7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvbltdXCI7XG4gICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlbXWA7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KVtdYCA6IFwidGV4dFtdXCI7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImRhdGVcIikgcmV0dXJuIFwidGltZXN0YW1wdHpbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJpZ0ludGVnZXJcIikgcmV0dXJuIFwiYmlnaW50W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ1dWlkXCIpIHJldHVybiBcInV1aWRbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiZW51bVwiKSByZXR1cm4gXCJ0ZXh0W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInZlY3RvclwiKSByZXR1cm4gYHZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSlbXWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFycmF5IGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbn1cblxuLyoqXG4gKiDqsJzrs4Qg7J24642x7IqkIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIHJldHVybiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKTtcbiAgfVxuXG4gIGlmIChpbmRleC51c2luZyA9PT0gXCJwZ3Jvb25nYVwiKSB7XG4gICAgcmV0dXJuIGdlblBncm9vbmdhSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgaW5kZXg6IFwiSU5ERVhcIixcbiAgICB1bmlxdWU6IFwiVU5JUVVFIElOREVYXCIsXG4gIH07XG5cbiAgY29uc3QgbnVsbHNOb3REaXN0aW5jdENsYXVzZSA9XG4gICAgaW5kZXgudHlwZSA9PT0gXCJ1bmlxdWVcIiAmJiBpbmRleC5udWxsc05vdERpc3RpbmN0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCBOVUxMUyAke2luZGV4Lm51bGxzTm90RGlzdGluY3QgPyBcIk5PVCBESVNUSU5DVFwiIDogXCJESVNUSU5DVFwifWBcbiAgICAgIDogXCJcIjtcblxuICBjb25zdCB1c2luZ0NsYXVzZSA9IGluZGV4LnVzaW5nID09PSB1bmRlZmluZWQgPyBcIlwiIDogYFVTSU5HICR7aW5kZXgudXNpbmd9YDtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgJHttZXRob2RNYXBbaW5kZXgudHlwZV19ICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gJHt1c2luZ0NsYXVzZX0oJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAvLyDsoJXroKwg7Ji17IWY7J2AIGJ0cmVl66eMIOyCrOyaqSDqsIDriqVcbiAgICAgIGlmIChpbmRleC51c2luZyAhPT0gXCJidHJlZVwiICYmIGluZGV4LnVzaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGAke2NvbC5uYW1lfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke3NvcnRPcmRlckNsYXVzZX0ke251bGxzRmlyc3RDbGF1c2V9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9KSR7bnVsbHNOb3REaXN0aW5jdENsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKTtcXGBcbiAgKWA7XG59XG5cbi8qKlxuICogUEdyb29uZ2Eg7Lus65+8IOyYteyFmCDstpTstpxcbiAqXG4gKiBGdWxsVGV4dCDsmKTtjbzroIjsnbTthLDrpbwg7KeA7JuQ7ZWY64qUIOqyveyasCDsmrDshKAg7ISk7KCVLCDrgpjrqLjsp4DripQg65SU7Y+07Yq4IOydtOyaqVxuICogQGxpbmsgaHR0cHM6Ly9wZ3Jvb25nYS5naXRodWIuaW8vcmVmZXJlbmNlXG4gKi9cbmZ1bmN0aW9uIGdldFBncm9vbmdhQ29sdW1uT3B0aW9uKGNvbHVtbjogRW50aXR5UHJvcCkge1xuICBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfdmFyY2hhcl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBcInBncm9vbmdhX2pzb25iX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiAtIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpOiDripDrprAg67mM65OcLCDruaDrpbgg6rKA7IOJIOyGjeuPhCwg64aS7J2AIOuplOuqqOumrCDrsI8g7KCV7ZmV64+EXG4gKiAtIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKTog67mg66W4IOu5jOuTnCwg7KSR6rCEIOqygOyDiSDsho3rj4QsIOuCruydgCDrqZTrqqjrpqxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSE5TVyDsnbjrjbHsiqQgKOq2jOyepSAtIOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4QpXG4gKiBDUkVBVEUgSU5ERVggaWR4X2VtYmVkZGluZyBPTiBpdGVtcyBVU0lORyBobnN3IChlbWJlZGRpbmcgdmVjdG9yX2Nvc2luZV9vcHMpIFdJVEggKG0gPSAxNiwgZWZfY29uc3RydWN0aW9uID0gNjQpO1xuICpcbiAqIC8vIElWRkZsYXQg7J24642x7IqkICjrjIDsmqnrn4kg642w7J207YSwLCDruYTsmqkg7KSR7JqUIOyLnClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGl2ZmZsYXQgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobGlzdHMgPSAxMDApO1xuICovXG5mdW5jdGlvbiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29sdW1uID0gaW5kZXguY29sdW1uc1swXTtcbiAgY29uc3QgdmVjdG9yT3BzID0gY29sdW1uLnZlY3Rvck9wcyA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KVxcYCk7YDtcbiAgfVxuXG4gIC8vIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKSAtIOuMgOyaqeufiSwg67mE7JqpIOykkeyalCDsi5xcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgY29uc3QgbGlzdHMgPSBpbmRleC5saXN0cyA/PyAxMDA7XG4gICAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBpdmZmbGF0ICgke2NvbHVtbi5uYW1lfSAke3ZlY3Rvck9wc30pIFdJVEggKGxpc3RzID0gJHtsaXN0c30pXFxgKTtgO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhdyBTUUwgaW5kZXggdHlwZTogJHtpbmRleC50eXBlfWApO1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDsg53shLHtlZjripQg7LyA7J207IqkIC0gRksg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgaWYgKGZvcmVpZ25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgdXAsIGRvd24gfSA9IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZm9yZWlnbnMpO1xuICBpZiAodXAubGVuZ3RoID09PSAwICYmIGRvd24ubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coXCJmayDqsIAg662U6rCAIOuLpOumheuLiOuLpFwiKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGNyZWF0ZSBma1wiLFxuICAgIC4uLnVwLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gZHJvcCBma1wiLFxuICAgIC4uLmRvd24sXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JlaWduS2V5c1N0cmluZyA9IGZvcmVpZ25zLm1hcCgoZm9yZWlnbikgPT4gZm9yZWlnbi5jb2x1bW5zLmpvaW4oXCJfXCIpKS5qb2luKFwiX1wiKTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHR5cGU6IFwiZm9yZWlnblwiLFxuICAgICAgdGl0bGU6IGBmb3JlaWduX18ke3RhYmxlfV9fJHtmb3JlaWduS2V5c1N0cmluZ31gLFxuICAgICAgZm9ybWF0dGVkOiBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIFwidHlwZXNjcmlwdFwiLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogTWlncmF0aW9uRm9yZWlnbltdIOydveyWtOyEnCDsmbjrtoDtgqQgY29uc3RyYWludCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5Gb3JlaWduRGVmaW5pdGlvbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiB7IHVwOiBzdHJpbmdbXTsgZG93bjogc3RyaW5nW10gfSB7XG4gIHJldHVybiBmb3JlaWducy5yZWR1Y2UoXG4gICAgKHIsIGZvcmVpZ24pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZvcmVpZ24uY29sdW1uc1xuICAgICAgICAubWFwKChjb2wpID0+IGAnJHtjb2wucmVwbGFjZShgJHt0YWJsZX0uYCwgXCJcIil9J2ApXG4gICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgIHIudXAucHVzaChcbiAgICAgICAgYHRhYmxlLmZvcmVpZ24oJyR7Zm9yZWlnbi5jb2x1bW5zLmpvaW4oXCIsXCIpfScpXG4gICAgICAgICAgICAucmVmZXJlbmNlcygnJHtmb3JlaWduLnRvfScpXG4gICAgICAgICAgICAub25VcGRhdGUoJyR7Zm9yZWlnbi5vblVwZGF0ZX0nKVxuICAgICAgICAgICAgLm9uRGVsZXRlKCcke2ZvcmVpZ24ub25EZWxldGV9JylgLFxuICAgICAgKTtcbiAgICAgIHIuZG93bi5wdXNoKGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgZG93bjogW10gYXMgc3RyaW5nW10sXG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIOy7rOufvC/snbjrjbHsiqQg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8qXG4gICAg7IS467aAIOu5hOq1kCDtm4Qg64uk66W47KCQIOywvuyVhOyEnCDsvZTrk5wg7IOd7ISxXG5cbiAgICAxLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsnojsnLzrgpgsIERC7JeQIOyXhuuLpOuptCDstpTqsIBcbiAgICAyLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsl4bsnLzrgpgsIERC7JeQIOyeiOuLpOuptCDsgq3soJxcbiAgICAzLiDqt7jsmbgg7Lus65+8KOy7rOufvCDqsK/siJjqsIAg64+Z7J287ZWY6rGw64KYLCDri6Trpbgg6rK97JqwIOuPmeydvO2VnCDsu6zrn7zrgbzrpqwpID0+IGFsdGVyXG4gICAgNC4g64uk66W46rGwIOuLpCDrj5nsnbztlZjqs6AgaW5kZXjrp4wg67OA6rK965CY64qUIOqyveyasFxuXG4gICAgKiog7Lus65+866qF7J2EIOuzgOqyve2VmOuKlCDqsr3smrDripQg65Sw66GcIO2VuOuTpOunge2VmOyngCDslYrsnYxcbiAgICA9PiBkcm9wL2FkZCDtmJXtg5zsnZgg66eI7J206re466CI7J207IWYIOy9lOuTnOqwgCDsg53shLHrkJjripTrjbAsIOyImOuPmeycvOuhnCByZW5hbWUg7L2U65Oc66GcIOyImOygle2VmOyXrCDsspjrpqxcbiAgKi9cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8oZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zKTtcblxuICAvLyDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICBjb25zdCBhbHRlckNvbHVtbkxpbmVzVG8gPSBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gICAgYWx0ZXJDb2x1bW5zVG8sXG4gICAgZW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG5cbiAgLy8g7J24642x7Iqk6rCAIOyCreygnOuQmOuKlCDqsr3smrAsIOy7rOufvOqzvCDqsJnsnbQg7IKt7KCc65CcIOy8gOydtOyKpOyXkOuKlCBkcm9w7JeQ7IScIOygnOyZuO2VtOyVvO2VqCFcbiAgY29uc3QgaW5kZXhOZWVkc1RvRHJvcCA9IGFsdGVySW5kZXhlc1RvLmRyb3AuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PlxuICAgICAgICBhbHRlckNvbHVtbnNUby5kcm9wLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMobmFtZSksXG4gICAgICApID09PSBmYWxzZSxcbiAgKTtcblxuICAvLyDruYgg7L2U65OcIOyDneyEsSDrsKnsp4BcbiAgY29uc3QgaGFzVXBDaGFuZ2VzID1cbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCA+IDAgfHxcbiAgICBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzVXBDaGFuZ2VzKSB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZW1wdHlDb2RlR2VuZXJhdGlvbkVycm9yXCIsIHtcbiAgICAgIGVudGl0eUNvbHVtbnMsXG4gICAgICBkYkNvbHVtbnMsXG4gICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgZGJJbmRleGVzLFxuICAgIH0pO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihcIuy7rOufvC/snbjrjbHsiqQg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG4gIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmRlYnVnXCIsIHtcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGhcIjogaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGgsXG4gIH0pO1xuICAvLyBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczphbHRlckNvbHVtbnNUb1wiLCBhbHRlckNvbHVtbnNUbyk7XG5cbiAgLy8gVE9ETzog7J24642x7Iqk66qFIOuzgOqyveuQnCDqsr3smrAg7LKY66asXG5cbiAgLy8gdGFibGUgYnVpbGRlciDrqZTshJzrk5zroZwg7Iuk7ZaJ7ZWgIOy9lOuTnCAoZHJvcCDihpIgYWRkIOKGkiBhbHRlciDsiJzshJwpXG4gIGNvbnN0IHVwQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIC8vIGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOy9lOuTnFxuICBjb25zdCB1cFJhd0xpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcgOiBbXSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24uYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZFxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGluZGV4KSA9PlxuICAgICAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGluZGV4Q29sKSA9PlxuICAgICAgICAgICAgYWx0ZXJDb2x1bW5zVG8uYWRkLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMoaW5kZXhDb2wubmFtZSksXG4gICAgICAgICAgKSA9PT0gZmFsc2UsXG4gICAgICApXG4gICAgICAubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIGNvbnN0IGRvd25SYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3IDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIC4uLihbXCJhZGRcIiwgXCJkcm9wXCIsIFwiYWx0ZXJcIl0gYXMgY29uc3QpXG4gICAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbGVuID0gYWx0ZXJDb2x1bW5zVG9bYWN0aW9uXS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbiArIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBudWxsKSxcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7Lus65+8IOu5hOq1kOulvCDsnITtlbQgR2VuZXJhdGVkIENvbHVtbuydmCBleHByZXNzaW9u7J2EIOygnOyZuO2VnCDqsJ3ssrTrpbwg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sOiBNaWdyYXRpb25Db2x1bW4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoY29sLmdlbmVyYXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogY29sLmdlbmVyYXRlZC50eXBlLFxuICAgICAgICBleHByZXNzaW9uOiBcIlwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb2w7XG59XG5cbi8qKlxuICog6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbnNUbyhlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSwgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSkge1xuICBjb25zdCBjb2x1bW5zVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBhbHRlcjogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gIH07XG5cbiAgLy8g7Lus65+866qFIOq4sOykgCDruYTqtZBcbiAgY29uc3QgZXh0cmFDb2x1bW5zID0ge1xuICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gW2NvbC5uYW1lLCBjb2wuZ2VuZXJhdGVkPy50eXBlXS5qb2luKFwiLy8vXCIpKSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICB9O1xuICBpZiAoZXh0cmFDb2x1bW5zLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUNvbHVtbnMuZGIubGVuZ3RoID4gMCkge1xuICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gIH1cblxuICAvLyDrj5nsnbwg7Lus65+866qF7J2YIOyEuOu2gCDtlYTrk5wg67mE6rWQIChHZW5lcmF0ZWQgQ29sdW1uIGV4cHJlc3Npb24g7KCc7Jm4KVxuICBjb25zdCBzYW1lRGJDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbnN0IHNhbWVNZENvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoXG4gICAgc2FtZURiQ29sdW1ucyxcbiAgICBzYW1lTWRDb2x1bW5zLFxuICAgIChhLCBiKSA9PiBlcXVhbCh7IC4uLmEsIGdlbmVyYXRlZDogdW5kZWZpbmVkIH0sIHsgLi4uYiwgZ2VuZXJhdGVkOiB1bmRlZmluZWQgfSksIC8vIGdlbmVyYXRlZCDsu6zrn7zsnYAgYWx0ZXLroZwg7LKY66as7ZWY7KeAIOyViuydjFxuICApO1xuXG4gIHJldHVybiBjb2x1bW5zVG87XG59XG5cbi8qKlxuICog7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICBjb2x1bW5zVG86IFJldHVyblR5cGU8dHlwZW9mIGdldEFsdGVyQ29sdW1uc1RvPixcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbikge1xuICBjb25zdCBsaW5lc1RvID0ge1xuICAgIGFkZDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGRyb3A6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgICBhbHRlcjoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFkZCBjb2x1bW5zXG4gIGNvbnN0IGFkZENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmFkZCk7XG4gIGxpbmVzVG8uYWRkLnVwID0ge1xuICAgIGJ1aWxkZXI6IGFkZENvbHVtbkRlZnMuYnVpbGRlci5sZW5ndGggPiAwID8gW1wiLy8gYWRkXCIsIC4uLmFkZENvbHVtbkRlZnMuYnVpbGRlcl0gOiBbXSxcbiAgICByYXc6IGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDAgPyBbXCIvLyBhZGQgKGdlbmVyYXRlZClcIiwgLi4uYWRkQ29sdW1uRGVmcy5yYXddIDogW10sXG4gIH07XG4gIGxpbmVzVG8uYWRkLmRvd24gPSB7XG4gICAgYnVpbGRlcjpcbiAgICAgIGNvbHVtbnNUby5hZGQubGVuZ3RoID4gMFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhZGRcIixcbiAgICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygke2NvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIC8vIGRyb3DtlaAg7Lus65+87JeQIOqxuOumsCBGSyDssL7quLBcbiAgY29uc3QgZHJvcENvbHVtbk5hbWVzID0gY29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29uc3QgZmtUb0Ryb3BCZWZvcmVDb2x1bW4gPSBkYkZvcmVpZ25zLmZpbHRlcigoZmspID0+XG4gICAgZmsuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKSxcbiAgKTtcblxuICBjb25zdCBkcm9wRmtMaW5lcyA9IGZrVG9Ecm9wQmVmb3JlQ29sdW1uLm1hcCgoZmspID0+IHtcbiAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmay5jb2x1bW5zLm1hcCgoY29sKSA9PiBgJyR7Y29sfSdgKS5qb2luKFwiLFwiKTtcbiAgICByZXR1cm4gYHRhYmxlLmRyb3BGb3JlaWduKFske2NvbHVtbnNTdHJpbmdRdW90ZX1dKWA7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3RvcmVGa0xpbmVzID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvRHJvcEJlZm9yZUNvbHVtbikudXA7XG5cbiAgLy8gZHJvcOydmCByb2xsYmFja+yLnOyXkOuKlCBnZW5lcmF0ZWQgY29sdW1u64+EIOuzteybkO2VtOyVvCDtlahcbiAgY29uc3QgZHJvcENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmRyb3ApO1xuICBsaW5lc1RvLmRyb3AgPSB7XG4gICAgdXA6IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BGa0xpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIGRyb3AgZm9yZWlnbiBrZXlzIG9uIGNvbHVtbnMgdG8gYmUgZHJvcHBlZFwiLCAuLi5kcm9wRmtMaW5lc11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKGNvbHVtbnNUby5kcm9wLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgXCIvLyBkcm9wIGNvbHVtbnNcIixcbiAgICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzogW10sXG4gICAgfSxcbiAgICBkb3duOiB7XG4gICAgICBidWlsZGVyOiBbXG4gICAgICAgIC4uLihkcm9wQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zXCIsIC4uLmRyb3BDb2x1bW5EZWZzLmJ1aWxkZXJdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihyZXN0b3JlRmtMaW5lcy5sZW5ndGggPiAwID8gW1wiLy8gcmVzdG9yZSBmb3JlaWduIGtleXNcIiwgLi4ucmVzdG9yZUZrTGluZXNdIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzpcbiAgICAgICAgZHJvcENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zIChnZW5lcmF0ZWQpXCIsIC4uLmRyb3BDb2x1bW5EZWZzLnJhd11cbiAgICAgICAgICA6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWx0ZXIgY29sdW1ucyAoR2VuZXJhdGVkIENvbHVtbuydgCBBTFRFUiDrtojqsIDtlZjrr4DroZwgZHJvcCDtm4Qg7J6s7IOd7ISxKVxuICBsaW5lc1RvLmFsdGVyID0gY29sdW1uc1RvLmFsdGVyLnJlZHVjZShcbiAgICAociwgZGJDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gZGJDb2x1bW4ubmFtZSk7XG4gICAgICBpZiAoZW50aXR5Q29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmZ1bmN0aW9uIGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sIGRiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSkge1xuICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gIGNvbnN0IGluZGV4ZXNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgfTtcblxuICAvLyDsnbjrjbHsiqQg6rOg7JygIOyLneuzhOyekCDsg53shLEgKG5hbWXsnYQg7KCc7Jm47ZWcIOuqqOuToCDtlYTrk5zrpbwg66y47J6Q7Je066GcIOuzgO2ZmO2VmOyXrCDsobDtlakpXG4gIGNvbnN0IGlkZW50aXR5ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oaW5kZXg6IFQpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRleClcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcIm5hbWVcIilcbiAgICAgIC5zb3J0KCk7XG5cbiAgICByZXR1cm4ga2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBcImNvbHVtbnNcIikge1xuICAgICAgICAgIHJldHVybiAoaW5kZXhba2V5XSBhcyBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0pLmZsYXRNYXAoaWRlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtrZXl9PSR7aW5kZXhba2V5IGFzIGtleW9mIE1pZ3JhdGlvbkluZGV4XX1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiLy9cIik7XG4gIH07XG5cbiAgY29uc3QgZXh0cmFJbmRleGVzID0ge1xuICAgIGRiOiBkaWZmKGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksIGlkZW50aXR5KSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5SW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksIGRiSW5kZXhlcywgaWRlbnRpdHkpLFxuICB9O1xuICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgaW5kZXhlc1RvLmFkZCA9IGluZGV4ZXNUby5hZGQuY29uY2F0KGV4dHJhSW5kZXhlcy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgIGluZGV4ZXNUby5kcm9wID0gaW5kZXhlc1RvLmRyb3AuY29uY2F0KGV4dHJhSW5kZXhlcy5kYik7XG4gIH1cblxuICByZXR1cm4gaW5kZXhlc1RvO1xufVxuXG4vKipcbiAqIOyduOuNseyKpCDsgq3soJwg7KCV7J2YIOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5JbmRleERyb3BEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCkge1xuICByZXR1cm4gYHRhYmxlLmRyb3BJbmRleChbJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sdW1uKSA9PiBgJyR7Y29sdW1uLm5hbWV9J2ApXG4gICAgLmpvaW4oXCIsXCIpfV0sICcke2luZGV4Lm5hbWV9JylgO1xufVxuXG4vKipcbiAqIERCIOyhsO2ajCDqsrDqs7zsmYAg67mE6rWQ7ZWY6riwIOychO2VnCDsnbjrjbHsiqQg6riw67O46rCSIOyEpOyglVxuICovXG5mdW5jdGlvbiBzZXRNaWdyYXRpb25JbmRleERlZmF1bHRzKGluZGV4OiBNaWdyYXRpb25JbmRleCk6IE1pZ3JhdGlvbkluZGV4IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgLi4uY29sLFxuICAgICAgc29ydE9yZGVyOiBjb2wuc29ydE9yZGVyID8/IFwiQVNDXCIsXG4gICAgICAvLyBzb3J0T3JkZXLsl5Ag65Sw6528IG51bGxzRmlyc3TsnZggZGVmYXVsdCDqsJIg7ISk7KCVXG4gICAgICBudWxsc0ZpcnN0OiBjb2wubnVsbHNGaXJzdCA/PyBjb2wuc29ydE9yZGVyID09PSBcIkRFU0NcIixcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICB1c2luZzogaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcXVhbChlbnRpdHlGLCBtYXRjaGluZ0RiRikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIFwiZm9yZWlnbnNcIixcbiAgICAvLyBUT0RPIOuwlOuAjOuKlCDrtoDrtoRcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIEVudGl0eVNldOydhCDquLDrsJjsnLzroZwg7YWM7J2067iUIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXRcbiAqIEByZXR1cm5zIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0OiBNaWdyYXRpb25TZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICByZXR1cm4gW1xuICAgIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgZW50aXR5U2V0LmNvbHVtbnMsXG4gICAgICBlbnRpdHlTZXQuaW5kZXhlcyxcbiAgICApLFxuICAgIC4uLihhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfRm9yZWlnbihlbnRpdHlTZXQudGFibGUsIGVudGl0eVNldC5mb3JlaWducykpLFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBlbnRpdHlTZXTsnYQg66qp7ZGc66GcLCBkYlNldOydhCDtmIQg7IOB7Zmp7Jy866GcIO2VmOyXrCDthYzsnbTruJQgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0IO2YhCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gZGJTZXQg66qp7ZGcIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEByZXR1cm5zIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlKFxuICBlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCxcbiAgZGJTZXQ6IE1pZ3JhdGlvblNldCxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGNvbnN0IHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8gPSAoY29sOiBNaWdyYXRpb25Db2x1bW4pID0+IHtcbiAgICAvLyBmbG9hdOyduCDqsr3smrAg6riw67O46rCS7J2EIDDsnLzroZwg7KeA7KCV7ZWY64qUIOqyveyasCBcIjAuMDBcIuycvOuhnCDrs4DtmZjrkJjripQg7LyA7J207IqkIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJmbG9hdFwiICYmIGNvbC5kZWZhdWx0VG8gJiYgU3RyaW5nKGNvbC5kZWZhdWx0VG8pLmluY2x1ZGVzKCdcIicpID09PSBmYWxzZSkge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9IGBcIiR7TnVtYmVyKGNvbC5kZWZhdWx0VG8pLnRvRml4ZWQoY29sLnNjYWxlID8/IDIpfVwiYDtcbiAgICAvLyB9XG4gICAgLy8gLy8gc3RyaW5n7J24IOqyveyasCDquLDrs7jqsJLsnbQg67mIIOyKpO2KuOungeyduCDqsr3smrAg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcInN0cmluZ1wiICYmIGNvbC5kZWZhdWx0VG8gPT09IFwiXCIpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSAnXCJcIic7XG4gICAgLy8gfVxuICAgIC8vIC8vIGJvb2xlYW7snbgg6rK97JqwIOq4sOuzuOqwkiDsoJXqt5ztmZQgKE15U1FM7JeQ7ISc64qUIFRJTllJTlQoMSnroZwg7KCA7J6l65CY66+A66GcIDAg65iQ64qUIDHroZwg7KCV6rec7ZmUKVxuICAgIC8vIC8vIFRPRE86IGRiLnRz7JeQIHR5cGVDYXNlIOyEpOyglSDtmZXsnbjtlZjsl6wg7LKY66as7ZWY64+E66GdIOyImOyglSDtlYTsmpRcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIGNvbC5kZWZhdWx0VG8gIT09IHVuZGVmaW5lZCkge1xuICAgIC8vICAgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMFwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjBcIjtcbiAgICAvLyAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIxXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIxXCI7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gRklYTUU6IOydvOuLqCBNeVNRTCDsg4Htmansl5DshJwg67Cc7IOd7ZaI642YIOydtOyKiOydmCB3b3JrYXJvdW5kIOydtOuvgOuhnCBQZ+yXkOyEnCDsnqztmZXsnbgg7ZuEIOuMgOydkSDstpTqsIBcbiAgICByZXR1cm4gY29sO1xuICB9O1xuICBjb25zdCBlbnRpdHlDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG4gIGNvbnN0IGRiQ29sdW1ucyA9IGFscGhhYmV0aWNhbChkYlNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG5cbiAgLyog65SU67KE6rmF7JqpIOy9lOuTnCwg7Yq57KCVIOy7rOufvOyXkOyEnCDrtojsnbzsuZgg67Cc7IOd7ZWgIOuVjCDtmZXsnbhcbiAgICAgICAgY29uc3QgZW50aXR5Q29sdW1uID0gZW50aXR5U2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYkNvbHVtbiA9IGRiU2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgZW50aXR5Q29sdW1uLCBkYkNvbHVtbiB9KTtcbiAgICAgICAgICovXG5cbiAgLy8gP1xuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG4gIGNvbnN0IGRiSW5kZXhlcyA9IGFscGhhYmV0aWNhbChkYlNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG5cbiAgY29uc3QgcmVwbGFjZU5vQWN0aW9uT25NeVNRTCA9IChmOiBNaWdyYXRpb25Gb3JlaWduKSA9PiB7XG4gICAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICAgIGNvbnN0IHsgb25EZWxldGUsIG9uVXBkYXRlIH0gPSBmO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgb25VcGRhdGU6IG9uVXBkYXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25VcGRhdGUsXG4gICAgICBvbkRlbGV0ZTogb25EZWxldGUgPT09IFwiUkVTVFJJQ1RcIiA/IFwiTk8gQUNUSU9OXCIgOiBvbkRlbGV0ZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3QgaXNFcXVhbENvbHVtbnMgPSBlcXVhbChcbiAgICBlbnRpdHlDb2x1bW5zLm1hcChub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKSxcbiAgICBkYkNvbHVtbnMubWFwKG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24pLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKGVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSA9PT0gZmFsc2UpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cbiJdLCJuYW1lcyI6WyJlcXVhbCIsImFscGhhYmV0aWNhbCIsImRpZmYiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJmb3JtYXRDb2RlIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsImdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzIiwidGFibGUiLCJjb2x1bW5zIiwiaW5kZXhlcyIsImNvbHVtbkRlZnMiLCJnZW5Db2x1bW5EZWZpbml0aW9ucyIsImxpbmVzIiwiYnVpbGRlciIsInJhdyIsIm1hcCIsImluZGV4IiwiZ2VuSW5kZXhEZWZpbml0aW9uIiwidHlwZSIsInRpdGxlIiwiZm9ybWF0dGVkIiwiam9pbiIsInJlc3VsdCIsImNvbHVtbiIsImdlbmVyYXRlZCIsInB1c2giLCJnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uIiwiZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbiIsIkVycm9yIiwicGdUeXBlIiwiZ2V0UGdUeXBlRm9yQ29sdW1uIiwic3RvcmFnZVR5cGUiLCJudWxsYWJsZUNsYXVzZSIsIm51bGxhYmxlIiwibmFtZSIsImV4cHJlc3Npb24iLCJjaGFpbnMiLCJlbmRzV2l0aCIsImVsZW1lbnRUeXBlIiwic2xpY2UiLCJnZXRQZ0FycmF5VHlwZSIsImRpbWVuc2lvbnMiLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJleHRyYVR5cGUiLCJkZWZhdWx0VG8iLCJzdGFydHNXaXRoIiwiZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uIiwidXNpbmciLCJnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbiIsIm1ldGhvZE1hcCIsInVuaXF1ZSIsIm51bGxzTm90RGlzdGluY3RDbGF1c2UiLCJudWxsc05vdERpc3RpbmN0IiwidXNpbmdDbGF1c2UiLCJjb2wiLCJzb3J0T3JkZXJDbGF1c2UiLCJzb3J0T3JkZXIiLCJudWxsc0ZpcnN0Q2xhdXNlIiwibnVsbHNGaXJzdCIsImVudGl0eSIsImdldEJ5VGFibGUiLCJjb2x1bW5DbGF1c2UiLCJwcm9wc0RpY3QiLCJvcHRpb24iLCJnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbiIsInZlY3Rvck9wcyIsIm0iLCJlZkNvbnN0cnVjdGlvbiIsImxpc3RzIiwiZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24iLCJmb3JlaWducyIsInVwIiwiZG93biIsImdlbkZvcmVpZ25EZWZpbml0aW9ucyIsImNvbnNvbGUiLCJsb2ciLCJmb3JlaWduS2V5c1N0cmluZyIsImZvcmVpZ24iLCJyZWR1Y2UiLCJyIiwiY29sdW1uc1N0cmluZ1F1b3RlIiwicmVwbGFjZSIsInRvIiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMiLCJlbnRpdHlDb2x1bW5zIiwiZW50aXR5SW5kZXhlcyIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJhbHRlckNvbHVtbnNUbyIsImdldEFsdGVyQ29sdW1uc1RvIiwiYWx0ZXJDb2x1bW5MaW5lc1RvIiwiZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvIiwiYWx0ZXJJbmRleGVzVG8iLCJnZXRBbHRlckluZGV4ZXNUbyIsImluZGV4TmVlZHNUb0Ryb3AiLCJkcm9wIiwiZmlsdGVyIiwiZXZlcnkiLCJpbmNsdWRlcyIsImhhc1VwQ2hhbmdlcyIsImFkZCIsImFsdGVyIiwidCIsInVwQnVpbGRlckxpbmVzIiwiZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiIsInVwUmF3TGluZXMiLCJkb3duQnVpbGRlckxpbmVzIiwiaW5kZXhDb2wiLCJkb3duUmF3TGluZXMiLCJhY3Rpb24iLCJsZW4iLCJwYXJ0Iiwibm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbiIsImNvbHVtbnNUbyIsImV4dHJhQ29sdW1ucyIsImRiIiwiY29uY2F0Iiwic2FtZURiQ29sdW1ucyIsInNhbWVNZENvbHVtbnMiLCJhIiwiYiIsImxpbmVzVG8iLCJhZGRDb2x1bW5EZWZzIiwiZHJvcENvbHVtbk5hbWVzIiwiZmtUb0Ryb3BCZWZvcmVDb2x1bW4iLCJmayIsInNvbWUiLCJkcm9wRmtMaW5lcyIsInJlc3RvcmVGa0xpbmVzIiwiZHJvcENvbHVtbkRlZnMiLCJkYkNvbHVtbiIsImVudGl0eUNvbHVtbiIsImZpbmQiLCJjb2x1bW5EaWZmVXAiLCJjb2x1bW5EaWZmRG93biIsImwiLCJpbmRleGVzVG8iLCJpZGVudGl0eSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJzb3J0IiwiZmxhdE1hcCIsImV4dHJhSW5kZXhlcyIsInNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMiLCJnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyIsImVudGl0eUZvcmVpZ25zIiwiZHJvcHBpbmdDb2x1bW5zIiwiZ2V0S2V5IiwibWYiLCJkcm9wcGluZ0NvbHVtbk5hbWVzIiwiZmtUbyIsImVudGl0eUYiLCJtYXRjaGluZ0RiRiIsImRiRiIsImFsdGVyU3JjIiwiYWx0ZXJEc3QiLCJmb3JFYWNoIiwibWF0Y2hpbmdFbnRpdHlGIiwiaXNDb2x1bW5Ecm9wcGluZyIsImhhc0xpbmVzIiwidmFsdWVzIiwiZ2VuZXJhdGVDcmVhdGVDb2RlIiwiZW50aXR5U2V0IiwiZ2VuZXJhdGVBbHRlckNvZGUiLCJkYlNldCIsInJlcGxhY2VDb2x1bW5EZWZhdWx0VG8iLCJyZXBsYWNlTm9BY3Rpb25Pbk15U1FMIiwiZiIsImFsdGVyQ29kZXMiLCJpc0VxdWFsQ29sdW1ucyIsImlzRXF1YWxJbmRleGVzIiwiYWx0ZXJDb2RlIiwiZmxhdCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxrQkFBa0I7QUFDcEMsU0FBU0MsWUFBWSxFQUFFQyxJQUFJLFFBQVEsVUFBVTtBQUM3QyxTQUFTQyxhQUFhLEVBQUVDLEtBQUssUUFBUSxjQUFLO0FBUzFDLFNBQVNDLFVBQVUsUUFBUSx3QkFBcUI7QUFDaEQsU0FBU0MsY0FBYyxFQUFFQyxjQUFjLFFBQVEsb0JBQWlCO0FBWWhFOztDQUVDLEdBQ0QsZUFBZUMsb0NBQ2JDLEtBQWEsRUFDYkMsT0FBMEIsRUFDMUJDLE9BQXlCO0lBRXpCLE1BQU1DLGFBQWFDLHFCQUFxQkosT0FBT0M7SUFFL0MsYUFBYTtJQUNiLE1BQU1JLFFBQWtCO1FBQ3RCO1FBQ0E7UUFDQTtRQUNBLENBQUMsK0JBQStCLEVBQUVMLE1BQU0sZUFBZSxDQUFDO1dBQ3JERyxXQUFXRyxPQUFPO1FBQ3JCO1FBQ0EsOEJBQThCO1dBQzNCSCxXQUFXSSxHQUFHO1FBQ2pCLDRDQUE0QztXQUN6Q0wsUUFBUU0sR0FBRyxDQUFDLENBQUNDLFFBQVVDLG1CQUFtQkQsT0FBT1Q7UUFDcEQ7UUFDQTtRQUNBO1FBQ0EsQ0FBQywrQkFBK0IsRUFBRUEsTUFBTSxHQUFHLENBQUM7UUFDNUM7S0FDRDtJQUNELE9BQU87UUFDTEE7UUFDQVcsTUFBTTtRQUNOQyxPQUFPLENBQUMsUUFBUSxFQUFFWixPQUFPO1FBQ3pCYSxXQUFXakIsV0FBV1MsTUFBTVMsSUFBSSxDQUFDLE9BQU8sY0FBYyxDQUFDLGNBQWMsRUFBRWQsTUFBTSxHQUFHLENBQUM7SUFDbkY7QUFDRjtBQUVBOzs7Q0FHQyxHQUNELFNBQVNJLHFCQUFxQkosS0FBYSxFQUFF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
847
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vY29kZS1nZW5lcmF0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBhbHBoYWJldGljYWwsIGRpZmYgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgTmFpdGUgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB0eXBlIHtcbiAgRW50aXR5UHJvcCxcbiAgR2VuTWlncmF0aW9uQ29kZSxcbiAgTWlncmF0aW9uQ29sdW1uLFxuICBNaWdyYXRpb25Gb3JlaWduLFxuICBNaWdyYXRpb25JbmRleCxcbiAgTWlncmF0aW9uU2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBkaWZmZXJlbmNlV2l0aCwgaW50ZXJzZWN0aW9uQnkgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxuLyoqXG4gKiDsu6zrn7wg7KCV7J2YIOqysOqzvCDtg4DsnoVcbiAqIC0gYnVpbGRlcjogS25leCB0YWJsZSBidWlsZGVyIOuplOyEnOuTnOuhnCDsi6TtlontlaAg6rWs66y4ICh0YWJsZS54eHgoKSlcbiAqIC0gcmF3OiBrbmV4LnJhdygp66GcIOyLpO2Wie2VoCDqtazrrLhcbiAqL1xudHlwZSBDb2x1bW5EZWZpbml0aW9uUmVzdWx0ID0ge1xuICBidWlsZGVyOiBzdHJpbmdbXTtcbiAgcmF3OiBzdHJpbmdbXTtcbn07XG5cbi8qKlxuICog7YWM7J2067iUIOyDneyEse2VmOuKlCDsvIDsnbTsiqQgLSDsu6zrn7wv7J24642x7IqkIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgdGFibGU6IHN0cmluZyxcbiAgY29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIGluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4pOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGU+IHtcbiAgY29uc3QgY29sdW1uRGVmcyA9IGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBjb2x1bW5zKTtcblxuICAvLyDsu6zrn7wsIOyduOuNseyKpCDsspjrpqxcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGBhd2FpdCBrbmV4LnNjaGVtYS5jcmVhdGVUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4uY29sdW1uRGVmcy5idWlsZGVyLFxuICAgIFwifSk7XCIsXG4gICAgLy8gcmF3IOq1rOusuCAoR2VuZXJhdGVkIENvbHVtbiDrk7EpXG4gICAgLi4uY29sdW1uRGVmcy5yYXcsXG4gICAgLy8gaW5kZXjripQga25leC5yYXfroZwg7LKY66as7ZWY66+A66GcIGNyZWF0ZVRhYmxlIOuwluyXkOyEnCDsi6TtlolcbiAgICAuLi5pbmRleGVzLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgICBcIn1cIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGAgcmV0dXJuIGtuZXguc2NoZW1hLmRyb3BUYWJsZShcIiR7dGFibGV9XCIpO2AsXG4gICAgXCJ9XCIsXG4gIF07XG4gIHJldHVybiB7XG4gICAgdGFibGUsXG4gICAgdHlwZTogXCJub3JtYWxcIixcbiAgICB0aXRsZTogYGNyZWF0ZV9fJHt0YWJsZX1gLFxuICAgIGZvcm1hdHRlZDogZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW5bXSDsnb3slrTshJwg7Lus65+8IOygleydmO2VmOuKlCDqtazrrLgg7IOd7ISxXG4gKiBAcmV0dXJucyBidWlsZGVyOiB0YWJsZSBidWlsZGVyIOuplOyEnOuTnCwgcmF3OiBrbmV4LnJhdygpIOq1rOusuFxuICovXG5mdW5jdGlvbiBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZTogc3RyaW5nLCBjb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSk6IENvbHVtbkRlZmluaXRpb25SZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IENvbHVtbkRlZmluaXRpb25SZXN1bHQgPSB7XG4gICAgYnVpbGRlcjogW10sXG4gICAgcmF3OiBbXSxcbiAgfTtcblxuICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgLy8gR2VuZXJhdGVkIENvbHVtbuydgCByYXfroZwg7LKY66asXG4gICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICAgIHJlc3VsdC5yYXcucHVzaChnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uKHRhYmxlLCBjb2x1bW4pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIOydvOuwmCDsu6zrn7zsnYAgYnVpbGRlcuuhnCDsspjrpqxcbiAgICByZXN1bHQuYnVpbGRlci5wdXNoKGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uKSk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBDb2x1bW4g7KCV7J2YIOyDneyEsSAoQUxURVIgVEFCTEUgQUREIENPTFVNTiDsgqzsmqkpXG4gKi9cbmZ1bmN0aW9uIGdlbkdlbmVyYXRlZENvbHVtbkRlZmluaXRpb24odGFibGU6IHN0cmluZywgY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBpZiAoIWNvbHVtbi5nZW5lcmF0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0ZWQgY29sdW1uIGRlZmluaXRpb24gcmVxdWlyZWRcIik7XG4gIH1cbiAgY29uc3QgcGdUeXBlID0gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbik7XG4gIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sdW1uLmdlbmVyYXRlZC50eXBlID09PSBcIlZJUlRVQUxcIiA/IFwiIFZJUlRVQUxcIiA6IFwiIFNUT1JFRFwiO1xuICBjb25zdCBudWxsYWJsZUNsYXVzZSA9IGNvbHVtbi5udWxsYWJsZSA/IFwiXCIgOiBcIiBOT1QgTlVMTFwiO1xuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYEFMVEVSIFRBQkxFIFwiJHt0YWJsZX1cIiBBREQgQ09MVU1OIFwiJHtjb2x1bW4ubmFtZX1cIiAke3BnVHlwZX0gR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2x1bW4uZ2VuZXJhdGVkLmV4cHJlc3Npb259KSR7c3RvcmFnZVR5cGV9JHtudWxsYWJsZUNsYXVzZX1cXGApO2A7XG59XG5cbi8qKlxuICog7J2867CYIOy7rOufvCDsoJXsnZgg7IOd7ISxICh0YWJsZS54eHgoKSDssrTsnbgpXG4gKi9cbmZ1bmN0aW9uIGdlbk5vcm1hbENvbHVtbkRlZmluaXRpb24oY29sdW1uOiBNaWdyYXRpb25Db2x1bW4pOiBzdHJpbmcge1xuICBjb25zdCBjaGFpbnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbHVtbi5uYW1lID09PSBcImlkXCIpIHtcbiAgICByZXR1cm4gYHRhYmxlLmluY3JlbWVudHMoKS5wcmltYXJ5KCk7YDtcbiAgfVxuXG4gIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gIGlmIChjb2x1bW4udHlwZS5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb2x1bW4udHlwZS5zbGljZSgwLCAtMik7IC8vIFwiaW50ZWdlcltdXCIgLT4gXCJpbnRlZ2VyXCJcbiAgICBjb25zdCBwZ1R5cGUgPSBnZXRQZ0FycmF5VHlwZShjb2x1bW4sIGVsZW1lbnRUeXBlKTtcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICcke3BnVHlwZX0nKWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcInZlY3RvclwiKSB7XG4gICAgLy8gS25leOuKlCB2ZWN0b3Ig7YOA7J6F7J2EIOyngeygkSDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIHNwZWNpZmljVHlwZSDsgqzsmqlcbiAgICBjaGFpbnMucHVzaChgc3BlY2lmaWNUeXBlKCcke2NvbHVtbi5uYW1lfScsICd2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pJylgKTtcbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJudW1iZXJPck51bWVyaWNcIikge1xuICAgIC8vIG51bWJlclxuICAgIGlmIChjb2x1bW4ubnVtYmVyVHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBmbG9hdCgnJHtjb2x1bW4ubmFtZX0nKWApO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSB7XG4gICAgICBjaGFpbnMucHVzaChgZG91YmxlKCcke2NvbHVtbi5uYW1lfScpYCk7XG4gICAgfSBlbHNlIGlmICgoY29sdW1uLm51bWJlclR5cGUgPz8gXCJudW1lcmljXCIpID09PSBcIm51bWVyaWNcIikge1xuICAgICAgY2hhaW5zLnB1c2goYGRlY2ltYWwoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIC8vIHN0cmluZ1xuICAgIGlmIChjb2x1bW4ubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNoYWlucy5wdXNoKGBzdHJpbmcoJyR7Y29sdW1uLm5hbWV9JywgJHtjb2x1bW4ubGVuZ3RofSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhaW5zLnB1c2goYHRleHQoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29sdW1uLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgLy8gZGF0ZVxuICAgIGNoYWlucy5wdXNoKGB0aW1lc3RhbXAoJyR7Y29sdW1uLm5hbWV9JywgeyB1c2VUejogdHJ1ZSB9KWApO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIC8vIGpzb25cbiAgICBjaGFpbnMucHVzaChganNvbmIoJyR7Y29sdW1uLm5hbWV9JylgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyB0eXBlLCBsZW5ndGhcbiAgICBsZXQgZXh0cmFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY2hhaW5zLnB1c2goXG4gICAgICBgJHtjb2x1bW4udHlwZX0oJyR7Y29sdW1uLm5hbWV9JyR7XG4gICAgICAgIGNvbHVtbi5sZW5ndGggPyBgLCAke2NvbHVtbi5sZW5ndGh9YCA6IFwiXCJcbiAgICAgIH0ke2V4dHJhVHlwZSA/IGAsICcke2V4dHJhVHlwZX0nYCA6IFwiXCJ9KWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIG51bGxhYmxlXG4gIGNoYWlucy5wdXNoKGNvbHVtbi5udWxsYWJsZSA/IFwibnVsbGFibGUoKVwiIDogXCJub3ROdWxsYWJsZSgpXCIpO1xuXG4gIC8vIGRlZmF1bHRUb1xuICBpZiAoY29sdW1uLmRlZmF1bHRUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uZGVmYXVsdFRvID09PSBcInN0cmluZ1wiICYmIGNvbHVtbi5kZWZhdWx0VG8uc3RhcnRzV2l0aChgXCJgKSkge1xuICAgICAgY2hhaW5zLnB1c2goYGRlZmF1bHRUbygke2NvbHVtbi5kZWZhdWx0VG99KWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFpbnMucHVzaChgZGVmYXVsdFRvKGtuZXgucmF3KCcke2NvbHVtbi5kZWZhdWx0VG99JykpYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGB0YWJsZS4ke2NoYWlucy5qb2luKFwiLlwiKX07YDtcbn1cblxuLyoqXG4gKiBNaWdyYXRpb25Db2x1bW7snZgg7YOA7J6F7J2EIFBvc3RncmVTUUwg7YOA7J6FIOusuOyekOyXtOuhnCDrs4DtmZhcbiAqL1xuZnVuY3Rpb24gZ2V0UGdUeXBlRm9yQ29sdW1uKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uKTogc3RyaW5nIHtcbiAgaWYgKGNvbHVtbi50eXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICBjb25zdCBlbGVtZW50VHlwZSA9IGNvbHVtbi50eXBlLnNsaWNlKDAsIC0yKTtcbiAgICByZXR1cm4gZ2V0UGdBcnJheVR5cGUoY29sdW1uLCBlbGVtZW50VHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggIT09IHVuZGVmaW5lZCA/IGB2YXJjaGFyKCR7Y29sdW1uLmxlbmd0aH0pYCA6IFwidGV4dFwiO1xuICAgIGNhc2UgXCJiaWdJbnRlZ2VyXCI6XG4gICAgICByZXR1cm4gXCJiaWdpbnRcIjtcbiAgICBjYXNlIFwibnVtYmVyT3JOdW1lcmljXCI6XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwicmVhbFwiKSByZXR1cm4gXCJyZWFsXCI7XG4gICAgICBpZiAoY29sdW1uLm51bWJlclR5cGUgPT09IFwiZG91YmxlIHByZWNpc2lvblwiKSByZXR1cm4gXCJkb3VibGUgcHJlY2lzaW9uXCI7XG4gICAgICByZXR1cm4gYG51bWVyaWMoJHtjb2x1bW4ucHJlY2lzaW9ufSwgJHtjb2x1bW4uc2NhbGV9KWA7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInRpbWVzdGFtcHR6XCI7XG4gICAgY2FzZSBcImpzb25cIjpcbiAgICAgIHJldHVybiBcImpzb25iXCI7XG4gICAgY2FzZSBcInZlY3RvclwiOlxuICAgICAgcmV0dXJuIGB2ZWN0b3IoJHtjb2x1bW4uZGltZW5zaW9uc30pYDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbHVtbi50eXBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBnQXJyYXlUeXBlKGNvbHVtbjogTWlncmF0aW9uQ29sdW1uLCBlbGVtZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcIm51bWJlck9yTnVtZXJpY1wiKSB7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcInJlYWxcIikgcmV0dXJuIFwicmVhbFtdXCI7XG4gICAgaWYgKGNvbHVtbi5udW1iZXJUeXBlID09PSBcImRvdWJsZSBwcmVjaXNpb25cIikgcmV0dXJuIFwiZG91YmxlIHByZWNpc2lvbltdXCI7XG4gICAgcmV0dXJuIGBudW1lcmljKCR7Y29sdW1uLnByZWNpc2lvbn0sICR7Y29sdW1uLnNjYWxlfSlbXWA7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbHVtbi5sZW5ndGggPyBgdmFyY2hhcigke2NvbHVtbi5sZW5ndGh9KVtdYCA6IFwidGV4dFtdXCI7XG4gIH1cbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImRhdGVcIikgcmV0dXJuIFwidGltZXN0YW1wdHpbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJpbnRlZ2VyW11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJpZ0ludGVnZXJcIikgcmV0dXJuIFwiYmlnaW50W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcImJvb2xlYW5cIikgcmV0dXJuIFwiYm9vbGVhbltdXCI7XG4gIGlmIChlbGVtZW50VHlwZSA9PT0gXCJ1dWlkXCIpIHJldHVybiBcInV1aWRbXVwiO1xuICBpZiAoZWxlbWVudFR5cGUgPT09IFwiZW51bVwiKSByZXR1cm4gXCJ0ZXh0W11cIjtcbiAgaWYgKGVsZW1lbnRUeXBlID09PSBcInZlY3RvclwiKSByZXR1cm4gYHZlY3Rvcigke2NvbHVtbi5kaW1lbnNpb25zfSlbXWA7XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFycmF5IGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gKTtcbn1cblxuLyoqXG4gKiDqsJzrs4Qg7J24642x7IqkIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4OiBNaWdyYXRpb25JbmRleCwgdGFibGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpbmRleC50eXBlID09PSBcImhuc3dcIiB8fCBpbmRleC50eXBlID09PSBcIml2ZmZsYXRcIikge1xuICAgIHJldHVybiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXgsIHRhYmxlKTtcbiAgfVxuXG4gIGlmIChpbmRleC51c2luZyA9PT0gXCJwZ3Jvb25nYVwiKSB7XG4gICAgcmV0dXJuIGdlblBncm9vbmdhSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSk7XG4gIH1cblxuICBjb25zdCBtZXRob2RNYXAgPSB7XG4gICAgaW5kZXg6IFwiSU5ERVhcIixcbiAgICB1bmlxdWU6IFwiVU5JUVVFIElOREVYXCIsXG4gIH07XG5cbiAgY29uc3QgbnVsbHNOb3REaXN0aW5jdENsYXVzZSA9XG4gICAgaW5kZXgudHlwZSA9PT0gXCJ1bmlxdWVcIiAmJiBpbmRleC5udWxsc05vdERpc3RpbmN0ICE9PSB1bmRlZmluZWRcbiAgICAgID8gYCBOVUxMUyAke2luZGV4Lm51bGxzTm90RGlzdGluY3QgPyBcIk5PVCBESVNUSU5DVFwiIDogXCJESVNUSU5DVFwifWBcbiAgICAgIDogXCJcIjtcblxuICBjb25zdCB1c2luZ0NsYXVzZSA9IGluZGV4LnVzaW5nID09PSB1bmRlZmluZWQgPyBcIlwiIDogYFVTSU5HICR7aW5kZXgudXNpbmd9YDtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgJHttZXRob2RNYXBbaW5kZXgudHlwZV19ICR7aW5kZXgubmFtZX0gT04gJHt0YWJsZX0gJHt1c2luZ0NsYXVzZX0oJHtpbmRleC5jb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICAvLyDsoJXroKwg7Ji17IWY7J2AIGJ0cmVl66eMIOyCrOyaqSDqsIDriqVcbiAgICAgIGlmIChpbmRleC51c2luZyAhPT0gXCJidHJlZVwiICYmIGluZGV4LnVzaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGAke2NvbC5uYW1lfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvcnRPcmRlckNsYXVzZSA9IGNvbC5zb3J0T3JkZXIgPT09IHVuZGVmaW5lZCA/IFwiXCIgOiBgICR7Y29sLnNvcnRPcmRlcn1gO1xuICAgICAgY29uc3QgbnVsbHNGaXJzdENsYXVzZSA9XG4gICAgICAgIGNvbC5udWxsc0ZpcnN0ID09PSB1bmRlZmluZWQgPyBcIlwiIDogYCBOVUxMUyAke2NvbC5udWxsc0ZpcnN0ID8gXCJGSVJTVFwiIDogXCJMQVNUXCJ9YDtcbiAgICAgIHJldHVybiBgJHtjb2wubmFtZX0ke3NvcnRPcmRlckNsYXVzZX0ke251bGxzRmlyc3RDbGF1c2V9YDtcbiAgICB9KVxuICAgIC5qb2luKFwiLCBcIil9KSR7bnVsbHNOb3REaXN0aW5jdENsYXVzZX07XFxgXG4gICk7YDtcbn1cblxuZnVuY3Rpb24gZ2VuUGdyb29uZ2FJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKSB7XG4gIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZSh0YWJsZSk7XG5cbiAgLy8g67O17ZWpIOyduOuNseyKpOyduCDqsr3smrAgQVJSQVkg7IKs7JqpXG4gIGNvbnN0IGNvbHVtbkNsYXVzZSA9ICgoKSA9PiB7XG4gICAgaWYgKGluZGV4LmNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSBlbnRpdHkucHJvcHNEaWN0W2luZGV4LmNvbHVtbnNbMF0ubmFtZV07XG4gICAgICBjb25zdCBvcHRpb24gPSBnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbihjb2x1bW4pO1xuICAgICAgcmV0dXJuIGAke2luZGV4LmNvbHVtbnNbMF0ubmFtZX0ke29wdGlvbiA/IGAgJHtvcHRpb259YCA6IFwiXCJ9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYChBUlJBWVske2luZGV4LmNvbHVtbnMubWFwKChjb2wpID0+IGAke2NvbC5uYW1lfTo6dGV4dGApLmpvaW4oXCIsXCIpfV0pYDtcbiAgfSkoKTtcblxuICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxuICBcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBwZ3Jvb25nYSAoJHtjb2x1bW5DbGF1c2V9KSBXSVRIICh0b2tlbml6ZXI9J1Rva2VuTWVjYWInKTtcXGBcbiAgKWA7XG59XG5cbi8qKlxuICogUEdyb29uZ2Eg7Lus65+8IOyYteyFmCDstpTstpxcbiAqXG4gKiBGdWxsVGV4dCDsmKTtjbzroIjsnbTthLDrpbwg7KeA7JuQ7ZWY64qUIOqyveyasCDsmrDshKAg7ISk7KCVLCDrgpjrqLjsp4DripQg65SU7Y+07Yq4IOydtOyaqVxuICogQGxpbmsgaHR0cHM6Ly9wZ3Jvb25nYS5naXRodWIuaW8vcmVmZXJlbmNlXG4gKi9cbmZ1bmN0aW9uIGdldFBncm9vbmdhQ29sdW1uT3B0aW9uKGNvbHVtbjogRW50aXR5UHJvcCkge1xuICBpZiAoY29sdW1uLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgY29sdW1uLmxlbmd0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwicGdyb29uZ2FfdmFyY2hhcl9mdWxsX3RleHRfc2VhcmNoX29wc192MlwiO1xuICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSBcImpzb25cIikge1xuICAgIHJldHVybiBcInBncm9vbmdhX2pzb25iX2Z1bGxfdGV4dF9zZWFyY2hfb3BzX3YyXCI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiAtIEhOU1cgKEhpZXJhcmNoaWNhbCBOYXZpZ2FibGUgU21hbGwgV29ybGQpOiDripDrprAg67mM65OcLCDruaDrpbgg6rKA7IOJIOyGjeuPhCwg64aS7J2AIOuplOuqqOumrCDrsI8g7KCV7ZmV64+EXG4gKiAtIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKTog67mg66W4IOu5jOuTnCwg7KSR6rCEIOqygOyDiSDsho3rj4QsIOuCruydgCDrqZTrqqjrpqxcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSE5TVyDsnbjrjbHsiqQgKOq2jOyepSAtIOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4QpXG4gKiBDUkVBVEUgSU5ERVggaWR4X2VtYmVkZGluZyBPTiBpdGVtcyBVU0lORyBobnN3IChlbWJlZGRpbmcgdmVjdG9yX2Nvc2luZV9vcHMpIFdJVEggKG0gPSAxNiwgZWZfY29uc3RydWN0aW9uID0gNjQpO1xuICpcbiAqIC8vIElWRkZsYXQg7J24642x7IqkICjrjIDsmqnrn4kg642w7J207YSwLCDruYTsmqkg7KSR7JqUIOyLnClcbiAqIENSRUFURSBJTkRFWCBpZHhfZW1iZWRkaW5nIE9OIGl0ZW1zIFVTSU5HIGl2ZmZsYXQgKGVtYmVkZGluZyB2ZWN0b3JfY29zaW5lX29wcykgV0lUSCAobGlzdHMgPSAxMDApO1xuICovXG5mdW5jdGlvbiBnZW5WZWN0b3JJbmRleERlZmluaXRpb24oaW5kZXg6IE1pZ3JhdGlvbkluZGV4LCB0YWJsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29sdW1uID0gaW5kZXguY29sdW1uc1swXTtcbiAgY29uc3QgdmVjdG9yT3BzID0gY29sdW1uLnZlY3Rvck9wcyA/PyBcInZlY3Rvcl9jb3NpbmVfb3BzXCI7XG5cbiAgLy8gSE5TVyAoSGllcmFyY2hpY2FsIE5hdmlnYWJsZSBTbWFsbCBXb3JsZCkgLSDqtozsnqU6IOu5oOuluCDqsoDsg4ksIOuGkuydgCDsoJXtmZXrj4RcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaG5zd1wiKSB7XG4gICAgY29uc3QgbSA9IGluZGV4Lm0gPz8gMTY7XG4gICAgY29uc3QgZWZDb25zdHJ1Y3Rpb24gPSBpbmRleC5lZkNvbnN0cnVjdGlvbiA/PyA2NDtcbiAgICByZXR1cm4gYGF3YWl0IGtuZXgucmF3KFxcYENSRUFURSBJTkRFWCAke2luZGV4Lm5hbWV9IE9OICR7dGFibGV9IFVTSU5HIGhuc3cgKCR7Y29sdW1uLm5hbWV9ICR7dmVjdG9yT3BzfSkgV0lUSCAobSA9ICR7bX0sIGVmX2NvbnN0cnVjdGlvbiA9ICR7ZWZDb25zdHJ1Y3Rpb259KVxcYCk7YDtcbiAgfVxuXG4gIC8vIElWRkZsYXQgKEludmVydGVkIEZpbGUgd2l0aCBGbGF0IENvbXByZXNzaW9uKSAtIOuMgOyaqeufiSwg67mE7JqpIOykkeyalCDsi5xcbiAgaWYgKGluZGV4LnR5cGUgPT09IFwiaXZmZmxhdFwiKSB7XG4gICAgY29uc3QgbGlzdHMgPSBpbmRleC5saXN0cyA/PyAxMDA7XG4gICAgcmV0dXJuIGBhd2FpdCBrbmV4LnJhdyhcXGBDUkVBVEUgSU5ERVggJHtpbmRleC5uYW1lfSBPTiAke3RhYmxlfSBVU0lORyBpdmZmbGF0ICgke2NvbHVtbi5uYW1lfSAke3ZlY3Rvck9wc30pIFdJVEggKGxpc3RzID0gJHtsaXN0c30pXFxgKTtgO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHJhdyBTUUwgaW5kZXggdHlwZTogJHtpbmRleC50eXBlfWApO1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDsg53shLHtlZjripQg7LyA7J207IqkIC0gRksg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ3JlYXRlQ29kZV9Gb3JlaWduKFxuICB0YWJsZTogc3RyaW5nLFxuICBmb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuKTogUHJvbWlzZTxHZW5NaWdyYXRpb25Db2RlW10+IHtcbiAgaWYgKGZvcmVpZ25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHsgdXAsIGRvd24gfSA9IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZm9yZWlnbnMpO1xuICBpZiAodXAubGVuZ3RoID09PSAwICYmIGRvd24ubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coXCJmayDqsIAg662U6rCAIOuLpOumheuLiOuLpFwiKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgJ2ltcG9ydCB7IEtuZXggfSBmcm9tIFwia25leFwiOycsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICBcIi8vIGNyZWF0ZSBma1wiLFxuICAgIC4uLnVwLFxuICAgIFwifSk7XCIsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICBgcmV0dXJuIGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLFxuICAgIFwiLy8gZHJvcCBma1wiLFxuICAgIC4uLmRvd24sXG4gICAgXCJ9KTtcIixcbiAgICBcIn1cIixcbiAgXTtcblxuICBjb25zdCBmb3JlaWduS2V5c1N0cmluZyA9IGZvcmVpZ25zLm1hcCgoZm9yZWlnbikgPT4gZm9yZWlnbi5jb2x1bW5zLmpvaW4oXCJfXCIpKS5qb2luKFwiX1wiKTtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICB0YWJsZSxcbiAgICAgIHR5cGU6IFwiZm9yZWlnblwiLFxuICAgICAgdGl0bGU6IGBmb3JlaWduX18ke3RhYmxlfV9fJHtmb3JlaWduS2V5c1N0cmluZ31gLFxuICAgICAgZm9ybWF0dGVkOiBmb3JtYXRDb2RlKGxpbmVzLmpvaW4oXCJcXG5cIiksIFwidHlwZXNjcmlwdFwiLCBgc3JjL21pZ3JhdGlvbi8ke3RhYmxlfS50c2ApLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogTWlncmF0aW9uRm9yZWlnbltdIOydveyWtOyEnCDsmbjrtoDtgqQgY29uc3RyYWludCDsoJXsnZjtlZjripQg6rWs66y4IOyDneyEsVxuICovXG5mdW5jdGlvbiBnZW5Gb3JlaWduRGVmaW5pdGlvbnMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4pOiB7IHVwOiBzdHJpbmdbXTsgZG93bjogc3RyaW5nW10gfSB7XG4gIHJldHVybiBmb3JlaWducy5yZWR1Y2UoXG4gICAgKHIsIGZvcmVpZ24pID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtbnNTdHJpbmdRdW90ZSA9IGZvcmVpZ24uY29sdW1uc1xuICAgICAgICAubWFwKChjb2wpID0+IGAnJHtjb2wucmVwbGFjZShgJHt0YWJsZX0uYCwgXCJcIil9J2ApXG4gICAgICAgIC5qb2luKFwiLFwiKTtcbiAgICAgIHIudXAucHVzaChcbiAgICAgICAgYHRhYmxlLmZvcmVpZ24oJyR7Zm9yZWlnbi5jb2x1bW5zLmpvaW4oXCIsXCIpfScpXG4gICAgICAgICAgICAucmVmZXJlbmNlcygnJHtmb3JlaWduLnRvfScpXG4gICAgICAgICAgICAub25VcGRhdGUoJyR7Zm9yZWlnbi5vblVwZGF0ZX0nKVxuICAgICAgICAgICAgLm9uRGVsZXRlKCcke2ZvcmVpZ24ub25EZWxldGV9JylgLFxuICAgICAgKTtcbiAgICAgIHIuZG93bi5wdXNoKGB0YWJsZS5kcm9wRm9yZWlnbihbJHtjb2x1bW5zU3RyaW5nUXVvdGV9XSlgKTtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAge1xuICAgICAgdXA6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgZG93bjogW10gYXMgc3RyaW5nW10sXG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiDthYzsnbTruJQg67OA6rK9IOy8gOydtOyKpCAtIOy7rOufvC/snbjrjbHsiqQg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMoXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLFxuICBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLFxuICBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8qXG4gICAg7IS467aAIOu5hOq1kCDtm4Qg64uk66W47KCQIOywvuyVhOyEnCDsvZTrk5wg7IOd7ISxXG5cbiAgICAxLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsnojsnLzrgpgsIERC7JeQIOyXhuuLpOuptCDstpTqsIBcbiAgICAyLiDsu6zrn7zqsK/siJgg64uk66aEOiBNROyXkCDsl4bsnLzrgpgsIERC7JeQIOyeiOuLpOuptCDsgq3soJxcbiAgICAzLiDqt7jsmbgg7Lus65+8KOy7rOufvCDqsK/siJjqsIAg64+Z7J287ZWY6rGw64KYLCDri6Trpbgg6rK97JqwIOuPmeydvO2VnCDsu6zrn7zrgbzrpqwpID0+IGFsdGVyXG4gICAgNC4g64uk66W46rGwIOuLpCDrj5nsnbztlZjqs6AgaW5kZXjrp4wg67OA6rK965CY64qUIOqyveyasFxuXG4gICAgKiog7Lus65+866qF7J2EIOuzgOqyve2VmOuKlCDqsr3smrDripQg65Sw66GcIO2VuOuTpOunge2VmOyngCDslYrsnYxcbiAgICA9PiBkcm9wL2FkZCDtmJXtg5zsnZgg66eI7J206re466CI7J207IWYIOy9lOuTnOqwgCDsg53shLHrkJjripTrjbAsIOyImOuPmeycvOuhnCByZW5hbWUg7L2U65Oc66GcIOyImOygle2VmOyXrCDsspjrpqxcbiAgKi9cblxuICAvLyDqsIEg7Lus65+8IOydtOumhCDquLDspIDsnLzroZwgYWRkLCBkcm9wLCBhbHRlciDsl6zrtoAg7ZmV7J24XG4gIGNvbnN0IGFsdGVyQ29sdW1uc1RvID0gZ2V0QWx0ZXJDb2x1bW5zVG8oZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zKTtcblxuICAvLyDstpTstpzrkJwg7Lus65+865Ok7J2EIOq4sOykgOycvOuhnCDqsIHqsIEg65287J24IOyDneyEsVxuICBjb25zdCBhbHRlckNvbHVtbkxpbmVzVG8gPSBnZXRBbHRlckNvbHVtbkxpbmVzVG8oXG4gICAgYWx0ZXJDb2x1bW5zVG8sXG4gICAgZW50aXR5Q29sdW1ucyxcbiAgICB0YWJsZSxcbiAgICBkYkZvcmVpZ25zLFxuICApO1xuXG4gIC8vIOyduOuNseyKpOydmCBhZGQsIGRyb3Ag7Jes67aAIO2ZleyduFxuICBjb25zdCBhbHRlckluZGV4ZXNUbyA9IGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXMsIGRiSW5kZXhlcyk7XG5cbiAgLy8g7J24642x7Iqk6rCAIOyCreygnOuQmOuKlCDqsr3smrAsIOy7rOufvOqzvCDqsJnsnbQg7IKt7KCc65CcIOy8gOydtOyKpOyXkOuKlCBkcm9w7JeQ7IScIOygnOyZuO2VtOyVvO2VqCFcbiAgY29uc3QgaW5kZXhOZWVkc1RvRHJvcCA9IGFsdGVySW5kZXhlc1RvLmRyb3AuZmlsdGVyKFxuICAgIChpbmRleCkgPT5cbiAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKHsgbmFtZSB9KSA9PlxuICAgICAgICBhbHRlckNvbHVtbnNUby5kcm9wLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMobmFtZSksXG4gICAgICApID09PSBmYWxzZSxcbiAgKTtcblxuICAvLyDruYgg7L2U65OcIOyDneyEsSDrsKnsp4BcbiAgY29uc3QgaGFzVXBDaGFuZ2VzID1cbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCB8fFxuICAgIGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAucmF3Lmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgfHxcbiAgICBhbHRlckNvbHVtbkxpbmVzVG8uYWx0ZXIudXAuYnVpbGRlci5sZW5ndGggPiAwIHx8XG4gICAgYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCA+IDAgfHxcbiAgICBpbmRleE5lZWRzVG9Ecm9wLmxlbmd0aCA+IDA7XG4gIGlmICghaGFzVXBDaGFuZ2VzKSB7XG4gICAgTmFpdGUudChcIm1pZ3JhdG9yOmdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXM6ZW1wdHlDb2RlR2VuZXJhdGlvbkVycm9yXCIsIHtcbiAgICAgIGVudGl0eUNvbHVtbnMsXG4gICAgICBkYkNvbHVtbnMsXG4gICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgZGJJbmRleGVzLFxuICAgIH0pO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihcIuy7rOufvC/snbjrjbHsiqQg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG4gIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Db2x1bW5BbmRJbmRleGVzOmRlYnVnXCIsIHtcbiAgICBcImFsdGVyQ29sdW1uc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJDb2x1bW5zVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiYWx0ZXJDb2x1bW5zVG8uYWx0ZXIubGVuZ3RoXCI6IGFsdGVyQ29sdW1uc1RvLmFsdGVyLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmFkZC5sZW5ndGhcIjogYWx0ZXJJbmRleGVzVG8uYWRkLmxlbmd0aCxcbiAgICBcImFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoXCI6IGFsdGVySW5kZXhlc1RvLmRyb3AubGVuZ3RoLFxuICAgIFwiaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGhcIjogaW5kZXhOZWVkc1RvRHJvcC5sZW5ndGgsXG4gIH0pO1xuICAvLyBOYWl0ZS50KFwibWlncmF0b3I6Z2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlczphbHRlckNvbHVtbnNUb1wiLCBhbHRlckNvbHVtbnNUbyk7XG5cbiAgLy8gVE9ETzog7J24642x7Iqk66qFIOuzgOqyveuQnCDqsr3smrAg7LKY66asXG5cbiAgLy8gdGFibGUgYnVpbGRlciDrqZTshJzrk5zroZwg7Iuk7ZaJ7ZWgIOy9lOuTnCAoZHJvcCDihpIgYWRkIOKGkiBhbHRlciDsiJzshJwpXG4gIGNvbnN0IHVwQnVpbGRlckxpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hZGQudXAuYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLnVwLmJ1aWxkZXIubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci51cC5idWlsZGVyIDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIC8vIGtuZXgucmF3KCnroZwg7Iuk7ZaJ7ZWgIOy9lOuTnFxuICBjb25zdCB1cFJhd0xpbmVzID0gW1xuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uYWRkLnVwLnJhdy5sZW5ndGggPiAwID8gYWx0ZXJDb2x1bW5MaW5lc1RvLmFkZC51cC5yYXcgOiBbXSksXG4gICAgLi4uYWx0ZXJJbmRleGVzVG8uYWRkLm1hcCgoaW5kZXgpID0+IGdlbkluZGV4RGVmaW5pdGlvbihpbmRleCwgdGFibGUpKSxcbiAgXTtcblxuICAvLyBkb3du7J2AIHVw7J2YIOyXreyInCAoYWRkLmRvd24gPSBkcm9wIHJvbGxiYWNrLCBkcm9wLmRvd24gPSBhZGQgcm9sbGJhY2spXG4gIGNvbnN0IGRvd25CdWlsZGVyTGluZXMgPSBbXG4gICAgLi4uKGFsdGVyQ29sdW1uTGluZXNUby5hZGQuZG93bi5idWlsZGVyLmxlbmd0aCA+IDAgPyBhbHRlckNvbHVtbkxpbmVzVG8uYWRkLmRvd24uYnVpbGRlciA6IFtdKSxcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmFsdGVyLmRvd24uYnVpbGRlci5sZW5ndGggPiAwXG4gICAgICA/IGFsdGVyQ29sdW1uTGluZXNUby5hbHRlci5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLihhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXIubGVuZ3RoID4gMFxuICAgICAgPyBhbHRlckNvbHVtbkxpbmVzVG8uZHJvcC5kb3duLmJ1aWxkZXJcbiAgICAgIDogW10pLFxuICAgIC4uLmFsdGVySW5kZXhlc1RvLmFkZFxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGluZGV4KSA9PlxuICAgICAgICAgIGluZGV4LmNvbHVtbnMuZXZlcnkoKGluZGV4Q29sKSA9PlxuICAgICAgICAgICAgYWx0ZXJDb2x1bW5zVG8uYWRkLm1hcCgoY29sKSA9PiBjb2wubmFtZSkuaW5jbHVkZXMoaW5kZXhDb2wubmFtZSksXG4gICAgICAgICAgKSA9PT0gZmFsc2UsXG4gICAgICApXG4gICAgICAubWFwKGdlbkluZGV4RHJvcERlZmluaXRpb24pLFxuICBdO1xuXG4gIGNvbnN0IGRvd25SYXdMaW5lcyA9IFtcbiAgICAuLi4oYWx0ZXJDb2x1bW5MaW5lc1RvLmRyb3AuZG93bi5yYXcubGVuZ3RoID4gMCA/IGFsdGVyQ29sdW1uTGluZXNUby5kcm9wLmRvd24ucmF3IDogW10pLFxuICAgIC4uLmluZGV4TmVlZHNUb0Ryb3AubWFwKChpbmRleCkgPT4gZ2VuSW5kZXhEZWZpbml0aW9uKGluZGV4LCB0YWJsZSkpLFxuICBdO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAnaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7JyxcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4odXBCdWlsZGVyTGluZXMubGVuZ3RoID4gMFxuICAgICAgPyBbYGF3YWl0IGtuZXguc2NoZW1hLmFsdGVyVGFibGUoXCIke3RhYmxlfVwiLCAodGFibGUpID0+IHtgLCAuLi51cEJ1aWxkZXJMaW5lcywgXCJ9KTtcIl1cbiAgICAgIDogW10pLFxuICAgIC4uLnVwUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gICAgXCJcIixcbiAgICBcImV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcIixcbiAgICAuLi4oZG93bkJ1aWxkZXJMaW5lcy5sZW5ndGggPiAwXG4gICAgICA/IFtgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsIC4uLmRvd25CdWlsZGVyTGluZXMsIFwifSk7XCJdXG4gICAgICA6IFtdKSxcbiAgICAuLi5kb3duUmF3TGluZXMsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIC4uLihbXCJhZGRcIiwgXCJkcm9wXCIsIFwiYWx0ZXJcIl0gYXMgY29uc3QpXG4gICAgICAubWFwKChhY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3QgbGVuID0gYWx0ZXJDb2x1bW5zVG9bYWN0aW9uXS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbiArIGxlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBudWxsKSxcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7Lus65+8IOu5hOq1kOulvCDsnITtlbQgR2VuZXJhdGVkIENvbHVtbuydmCBleHByZXNzaW9u7J2EIOygnOyZuO2VnCDqsJ3ssrTrpbwg7IOd7ISxXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24oY29sOiBNaWdyYXRpb25Db2x1bW4pOiBNaWdyYXRpb25Db2x1bW4ge1xuICBpZiAoY29sLmdlbmVyYXRlZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb2wsXG4gICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgdHlwZTogY29sLmdlbmVyYXRlZC50eXBlLFxuICAgICAgICBleHByZXNzaW9uOiBcIlwiLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb2w7XG59XG5cbi8qKlxuICog6rCBIOy7rOufvCDsnbTrpoQg6riw7KSA7Jy866GcIGFkZCwgZHJvcCwgYWx0ZXIg7Jes67aAIO2ZleyduFxuICovXG5mdW5jdGlvbiBnZXRBbHRlckNvbHVtbnNUbyhlbnRpdHlDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSwgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXSkge1xuICBjb25zdCBjb2x1bW5zVG8gPSB7XG4gICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICBhbHRlcjogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gIH07XG5cbiAgLy8g7Lus65+866qFIOq4sOykgCDruYTqtZBcbiAgY29uc3QgZXh0cmFDb2x1bW5zID0ge1xuICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gW2NvbC5uYW1lLCBjb2wuZ2VuZXJhdGVkPy50eXBlXS5qb2luKFwiLy8vXCIpKSxcbiAgICBlbnRpdHk6IGRpZmYoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBbY29sLm5hbWUsIGNvbC5nZW5lcmF0ZWQ/LnR5cGVdLmpvaW4oXCIvLy9cIikpLFxuICB9O1xuICBpZiAoZXh0cmFDb2x1bW5zLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICB9XG4gIGlmIChleHRyYUNvbHVtbnMuZGIubGVuZ3RoID4gMCkge1xuICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gIH1cblxuICAvLyDrj5nsnbwg7Lus65+866qF7J2YIOyEuOu2gCDtlYTrk5wg67mE6rWQIChHZW5lcmF0ZWQgQ29sdW1uIGV4cHJlc3Npb24g7KCc7Jm4KVxuICBjb25zdCBzYW1lRGJDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZGJDb2x1bW5zLCBlbnRpdHlDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gIGNvbnN0IHNhbWVNZENvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoXG4gICAgc2FtZURiQ29sdW1ucyxcbiAgICBzYW1lTWRDb2x1bW5zLFxuICAgIChhLCBiKSA9PiBlcXVhbCh7IC4uLmEsIGdlbmVyYXRlZDogdW5kZWZpbmVkIH0sIHsgLi4uYiwgZ2VuZXJhdGVkOiB1bmRlZmluZWQgfSksIC8vIGdlbmVyYXRlZCDsu6zrn7zsnYAgYWx0ZXLroZwg7LKY66as7ZWY7KeAIOyViuydjFxuICApO1xuXG4gIHJldHVybiBjb2x1bW5zVG87XG59XG5cbi8qKlxuICog7LaU7Lac65CcIOy7rOufvOuTpOydhCDquLDspIDsnLzroZwg6rCB6rCBIOudvOyduCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvKFxuICBjb2x1bW5zVG86IFJldHVyblR5cGU8dHlwZW9mIGdldEFsdGVyQ29sdW1uc1RvPixcbiAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gIHRhYmxlOiBzdHJpbmcsXG4gIGRiRm9yZWlnbnM6IE1pZ3JhdGlvbkZvcmVpZ25bXSxcbikge1xuICBjb25zdCBsaW5lc1RvID0ge1xuICAgIGFkZDoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICAgIGRyb3A6IHtcbiAgICAgIHVwOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICBkb3duOiB7IGJ1aWxkZXI6IFtdIGFzIHN0cmluZ1tdLCByYXc6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgfSxcbiAgICBhbHRlcjoge1xuICAgICAgdXA6IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICAgIGRvd246IHsgYnVpbGRlcjogW10gYXMgc3RyaW5nW10sIHJhdzogW10gYXMgc3RyaW5nW10gfSxcbiAgICB9LFxuICB9O1xuXG4gIC8vIGFkZCBjb2x1bW5zXG4gIGNvbnN0IGFkZENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmFkZCk7XG4gIGxpbmVzVG8uYWRkLnVwID0ge1xuICAgIGJ1aWxkZXI6IGFkZENvbHVtbkRlZnMuYnVpbGRlci5sZW5ndGggPiAwID8gW1wiLy8gYWRkXCIsIC4uLmFkZENvbHVtbkRlZnMuYnVpbGRlcl0gOiBbXSxcbiAgICByYXc6IGFkZENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDAgPyBbXCIvLyBhZGQgKGdlbmVyYXRlZClcIiwgLi4uYWRkQ29sdW1uRGVmcy5yYXddIDogW10sXG4gIH07XG4gIGxpbmVzVG8uYWRkLmRvd24gPSB7XG4gICAgYnVpbGRlcjpcbiAgICAgIGNvbHVtbnNUby5hZGQubGVuZ3RoID4gMFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIFwiLy8gcm9sbGJhY2sgLSBhZGRcIixcbiAgICAgICAgICAgIGB0YWJsZS5kcm9wQ29sdW1ucygke2NvbHVtbnNUby5hZGQubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSxcbiAgICByYXc6IFtdLFxuICB9O1xuXG4gIC8vIGRyb3DtlaAg7Lus65+87JeQIOqxuOumsCBGSyDssL7quLBcbiAgY29uc3QgZHJvcENvbHVtbk5hbWVzID0gY29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcbiAgY29uc3QgZmtUb0Ryb3BCZWZvcmVDb2x1bW4gPSBkYkZvcmVpZ25zLmZpbHRlcigoZmspID0+XG4gICAgZmsuY29sdW1ucy5zb21lKChjb2wpID0+IGRyb3BDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKSxcbiAgKTtcblxuICBjb25zdCBkcm9wRmtMaW5lcyA9IGZrVG9Ecm9wQmVmb3JlQ29sdW1uLm1hcCgoZmspID0+IHtcbiAgICBjb25zdCBjb2x1bW5zU3RyaW5nUXVvdGUgPSBmay5jb2x1bW5zLm1hcCgoY29sKSA9PiBgJyR7Y29sfSdgKS5qb2luKFwiLFwiKTtcbiAgICByZXR1cm4gYHRhYmxlLmRyb3BGb3JlaWduKFske2NvbHVtbnNTdHJpbmdRdW90ZX1dKWA7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3RvcmVGa0xpbmVzID0gZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvRHJvcEJlZm9yZUNvbHVtbikudXA7XG5cbiAgLy8gZHJvcOydmCByb2xsYmFja+yLnOyXkOuKlCBnZW5lcmF0ZWQgY29sdW1u64+EIOuzteybkO2VtOyVvCDtlahcbiAgY29uc3QgZHJvcENvbHVtbkRlZnMgPSBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgY29sdW1uc1RvLmRyb3ApO1xuICBsaW5lc1RvLmRyb3AgPSB7XG4gICAgdXA6IHtcbiAgICAgIGJ1aWxkZXI6IFtcbiAgICAgICAgLi4uKGRyb3BGa0xpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIGRyb3AgZm9yZWlnbiBrZXlzIG9uIGNvbHVtbnMgdG8gYmUgZHJvcHBlZFwiLCAuLi5kcm9wRmtMaW5lc11cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKGNvbHVtbnNUby5kcm9wLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgXCIvLyBkcm9wIGNvbHVtbnNcIixcbiAgICAgICAgICAgICAgYHRhYmxlLmRyb3BDb2x1bW5zKCR7Y29sdW1uc1RvLmRyb3AubWFwKChjb2wpID0+IGAnJHtjb2wubmFtZX0nYCkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzogW10sXG4gICAgfSxcbiAgICBkb3duOiB7XG4gICAgICBidWlsZGVyOiBbXG4gICAgICAgIC4uLihkcm9wQ29sdW1uRGVmcy5idWlsZGVyLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zXCIsIC4uLmRyb3BDb2x1bW5EZWZzLmJ1aWxkZXJdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLihyZXN0b3JlRmtMaW5lcy5sZW5ndGggPiAwID8gW1wiLy8gcmVzdG9yZSBmb3JlaWduIGtleXNcIiwgLi4ucmVzdG9yZUZrTGluZXNdIDogW10pLFxuICAgICAgXSxcbiAgICAgIHJhdzpcbiAgICAgICAgZHJvcENvbHVtbkRlZnMucmF3Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtcIi8vIHJvbGxiYWNrIC0gZHJvcCBjb2x1bW5zIChnZW5lcmF0ZWQpXCIsIC4uLmRyb3BDb2x1bW5EZWZzLnJhd11cbiAgICAgICAgICA6IFtdLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gYWx0ZXIgY29sdW1ucyAoR2VuZXJhdGVkIENvbHVtbuydgCBBTFRFUiDrtojqsIDtlZjrr4DroZwgZHJvcCDtm4Qg7J6s7IOd7ISxKVxuICBsaW5lc1RvLmFsdGVyID0gY29sdW1uc1RvLmFsdGVyLnJlZHVjZShcbiAgICAociwgZGJDb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eUNvbHVtbiA9IGVudGl0eUNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gZGJDb2x1bW4ubmFtZSk7XG4gICAgICBpZiAoZW50aXR5Q29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG5cbiAgICAgIC8vIOy7rOufvCDrs4Dqsr3sgqztla1cbiAgICAgIGNvbnN0IGNvbHVtbkRpZmZVcCA9IGRpZmYoXG4gICAgICAgIGdlbkNvbHVtbkRlZmluaXRpb25zKHRhYmxlLCBbZW50aXR5Q29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtkYkNvbHVtbl0pLmJ1aWxkZXIsXG4gICAgICApO1xuICAgICAgY29uc3QgY29sdW1uRGlmZkRvd24gPSBkaWZmKFxuICAgICAgICBnZW5Db2x1bW5EZWZpbml0aW9ucyh0YWJsZSwgW2RiQ29sdW1uXSkuYnVpbGRlcixcbiAgICAgICAgZ2VuQ29sdW1uRGVmaW5pdGlvbnModGFibGUsIFtlbnRpdHlDb2x1bW5dKS5idWlsZGVyLFxuICAgICAgKTtcbiAgICAgIGlmIChjb2x1bW5EaWZmVXAubGVuZ3RoID4gMCkge1xuICAgICAgICByLnVwLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci51cC5idWlsZGVyLFxuICAgICAgICAgIFwiLy8gYWx0ZXIgY29sdW1uXCIsXG4gICAgICAgICAgLi4uY29sdW1uRGlmZlVwLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgICAgci5kb3duLmJ1aWxkZXIgPSBbXG4gICAgICAgICAgLi4uci5kb3duLmJ1aWxkZXIsXG4gICAgICAgICAgXCIvLyByb2xsYmFjayAtIGFsdGVyIGNvbHVtblwiLFxuICAgICAgICAgIC4uLmNvbHVtbkRpZmZEb3duLm1hcCgobCkgPT4gYCR7bC5yZXBsYWNlKFwiO1wiLCBcIlwiKX0uYWx0ZXIoKTtgKSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHI7XG4gICAgfSxcbiAgICB7XG4gICAgICB1cDogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgICAgZG93bjogeyBidWlsZGVyOiBbXSBhcyBzdHJpbmdbXSwgcmF3OiBbXSBhcyBzdHJpbmdbXSB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzVG87XG59XG5cbi8qKlxuICog7J24642x7Iqk7J2YIGFkZCwgZHJvcCDsl6zrtoAg7ZmV7J24XG4gKi9cbmZ1bmN0aW9uIGdldEFsdGVySW5kZXhlc1RvKGVudGl0eUluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10sIGRiSW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSkge1xuICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gIGNvbnN0IGluZGV4ZXNUbyA9IHtcbiAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgfTtcblxuICAvLyDsnbjrjbHsiqQg6rOg7JygIOyLneuzhOyekCDsg53shLEgKG5hbWXsnYQg7KCc7Jm47ZWcIOuqqOuToCDtlYTrk5zrpbwg66y47J6Q7Je066GcIOuzgO2ZmO2VmOyXrCDsobDtlakpXG4gIGNvbnN0IGlkZW50aXR5ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oaW5kZXg6IFQpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRleClcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcIm5hbWVcIilcbiAgICAgIC5zb3J0KCk7XG5cbiAgICByZXR1cm4ga2V5c1xuICAgICAgLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFwibmFtZVwiKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBcImNvbHVtbnNcIikge1xuICAgICAgICAgIHJldHVybiAoaW5kZXhba2V5XSBhcyBNaWdyYXRpb25JbmRleFtcImNvbHVtbnNcIl0pLm1hcCgoY29sKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoY29sKVxuICAgICAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7Y29sW2sgYXMga2V5b2YgdHlwZW9mIGNvbF19YClcbiAgICAgICAgICAgICAgLmpvaW4oXCIvL1wiKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7a2V5fT0ke2luZGV4W2tleSBhcyBrZXlvZiBNaWdyYXRpb25JbmRleF19YDtcbiAgICAgIH0pXG4gICAgICAuam9pbihcIi8vXCIpO1xuICB9O1xuXG4gIGNvbnN0IGV4dHJhSW5kZXhlcyA9IHtcbiAgICBkYjogZGlmZihkYkluZGV4ZXMsIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLCBpZGVudGl0eSksXG4gICAgZW50aXR5OiBkaWZmKGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLCBkYkluZGV4ZXMsIGlkZW50aXR5KSxcbiAgfTtcbiAgaWYgKGV4dHJhSW5kZXhlcy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChleHRyYUluZGV4ZXMuZW50aXR5KTtcbiAgfVxuICBpZiAoZXh0cmFJbmRleGVzLmRiLmxlbmd0aCA+IDApIHtcbiAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChleHRyYUluZGV4ZXMuZGIpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4ZXNUbztcbn1cblxuLyoqXG4gKiDsnbjrjbHsiqQg7IKt7KCcIOygleydmCDsg53shLFcbiAqL1xuZnVuY3Rpb24gZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbihpbmRleDogTWlncmF0aW9uSW5kZXgpIHtcbiAgcmV0dXJuIGB0YWJsZS5kcm9wSW5kZXgoWyR7aW5kZXguY29sdW1uc1xuICAgIC5tYXAoKGNvbHVtbikgPT4gYCcke2NvbHVtbi5uYW1lfSdgKVxuICAgIC5qb2luKFwiLFwiKX1dLCAnJHtpbmRleC5uYW1lfScpYDtcbn1cblxuLyoqXG4gKiBEQiDsobDtmowg6rKw6rO87JmAIOu5hOq1kO2VmOq4sCDsnITtlZwg7J24642x7IqkIOq4sOuzuOqwkiDshKTsoJVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMoaW5kZXg6IE1pZ3JhdGlvbkluZGV4KTogTWlncmF0aW9uSW5kZXgge1xuICBjb25zdCBzdXBwb3J0c09yZGVyaW5nID1cbiAgICBpbmRleC50eXBlICE9PSBcImhuc3dcIiAmJiAvLyB0eXBl7J20IGhuc3frqbQg67Kh7YSwIOyduOuNseyKpFxuICAgIGluZGV4LnR5cGUgIT09IFwiaXZmZmxhdFwiICYmIC8vIHR5cGXsnbQgaXZmZmxhdOuptCDrsqHthLAg7J24642x7IqkXG4gICAgKCFpbmRleC51c2luZyB8fCBpbmRleC51c2luZyA9PT0gXCJidHJlZVwiKTsgLy8gdXNpbmcg7LK07YGsXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbmRleCxcbiAgICBjb2x1bW5zOiBpbmRleC5jb2x1bW5zLm1hcCgoY29sKSA9PiAoe1xuICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAuLi4oc3VwcG9ydHNPcmRlcmluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHNvcnRPcmRlcjogY29sLnNvcnRPcmRlciA/PyBcIkFTQ1wiLFxuICAgICAgICAgICAgbnVsbHNGaXJzdDogY29sLm51bGxzRmlyc3QgPz8gY29sLnNvcnRPcmRlciA9PT0gXCJERVNDXCIsXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9KSksXG4gICAgbnVsbHNOb3REaXN0aW5jdDogaW5kZXgubnVsbHNOb3REaXN0aW5jdCA/PyBmYWxzZSxcbiAgICB1c2luZzogaW5kZXgudXNpbmcgPz8gXCJidHJlZVwiLFxuICB9O1xufVxuXG4vKipcbiAqIO2FjOydtOu4lCDrs4Dqsr0g7LyA7J207IqkIC0gRm9yZWlnbiBLZXkg67OA6rK9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlX0ZvcmVpZ25zKFxuICB0YWJsZTogc3RyaW5nLFxuICBlbnRpdHlGb3JlaWduczogTWlncmF0aW9uRm9yZWlnbltdLFxuICBkYkZvcmVpZ25zOiBNaWdyYXRpb25Gb3JlaWduW10sXG4gIGRyb3BwaW5nQ29sdW1uczogTWlncmF0aW9uQ29sdW1uW10gPSBbXSxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIC8vIGNvbnNvbGUubG9nKHsgZW50aXR5Rm9yZWlnbnMsIGRiRm9yZWlnbnMgfSk7XG5cbiAgY29uc3QgZ2V0S2V5ID0gKG1mOiBNaWdyYXRpb25Gb3JlaWduKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gW21mLmNvbHVtbnMuam9pbihcIi1cIiksIG1mLnRvXS5qb2luKFwiLy8vXCIpO1xuICB9O1xuXG4gIC8vIOyCreygnOuQoCDsu6zrn7zrqoUg66qp66GdXG4gIGNvbnN0IGRyb3BwaW5nQ29sdW1uTmFtZXMgPSBkcm9wcGluZ0NvbHVtbnMubWFwKChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBma1RvID0gZW50aXR5Rm9yZWlnbnMucmVkdWNlKFxuICAgIChyZXN1bHQsIGVudGl0eUYpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRGJGID0gZGJGb3JlaWducy5maW5kKChkYkYpID0+IGdldEtleShlbnRpdHlGKSA9PT0gZ2V0S2V5KGRiRikpO1xuICAgICAgaWYgKCFtYXRjaGluZ0RiRikge1xuICAgICAgICByZXN1bHQuYWRkLnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcXVhbChlbnRpdHlGLCBtYXRjaGluZ0RiRikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJlc3VsdC5hbHRlclNyYy5wdXNoKG1hdGNoaW5nRGJGKTtcbiAgICAgICAgcmVzdWx0LmFsdGVyRHN0LnB1c2goZW50aXR5Rik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25Gb3JlaWduW10sXG4gICAgICBhbHRlclNyYzogW10gYXMgTWlncmF0aW9uRm9yZWlnbltdLFxuICAgICAgYWx0ZXJEc3Q6IFtdIGFzIE1pZ3JhdGlvbkZvcmVpZ25bXSxcbiAgICB9LFxuICApO1xuXG4gIC8vIGRiRm9yZWlnbnPsl5DripQg7J6I7KeA66eMIGVudGl0eUZvcmVpZ25z7JeQ64qUIOyXhuuKlCDqsr3smrAgKOyCreygnOuQnCBGSylcbiAgLy8g64uoLCDsgq3soJzrkKAg7Lus65+87J2YIEZL64qUIOygnOyZuCAoZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlc+yXkOyEnCDsspjrpqwpXG4gIGRiRm9yZWlnbnMuZm9yRWFjaCgoZGJGKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hpbmdFbnRpdHlGID0gZW50aXR5Rm9yZWlnbnMuZmluZCgoZW50aXR5RikgPT4gZ2V0S2V5KGVudGl0eUYpID09PSBnZXRLZXkoZGJGKSk7XG4gICAgaWYgKCFtYXRjaGluZ0VudGl0eUYpIHtcbiAgICAgIC8vIOydtCBGS+ydmCDsu6zrn7zsnbQg7IKt7KCc65CgIOy7rOufvCDrqqnroZ3sl5Ag7J6I64qU7KeAIO2ZleyduFxuICAgICAgY29uc3QgaXNDb2x1bW5Ecm9wcGluZyA9IGRiRi5jb2x1bW5zLnNvbWUoKGNvbCkgPT4gZHJvcHBpbmdDb2x1bW5OYW1lcy5pbmNsdWRlcyhjb2wpKTtcbiAgICAgIC8vIOy7rOufvOydtCDsgq3soJzrkJjsp4Ag7JWK64qUIOqyveyasOyXkOunjCBGSyBkcm9wIOuqqeuhneyXkCDstpTqsIBcbiAgICAgIGlmICghaXNDb2x1bW5Ecm9wcGluZykge1xuICAgICAgICBma1RvLmRyb3AucHVzaChkYkYpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbGluZXNUbyA9IHtcbiAgICBhZGQ6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5hZGQpLFxuICAgIGRyb3A6IGdlbkZvcmVpZ25EZWZpbml0aW9ucyh0YWJsZSwgZmtUby5kcm9wKSxcbiAgICBhbHRlclNyYzogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyU3JjKSxcbiAgICBhbHRlckRzdDogZ2VuRm9yZWlnbkRlZmluaXRpb25zKHRhYmxlLCBma1RvLmFsdGVyRHN0KSxcbiAgfTtcblxuICAvLyBkcm9wIGZrIGNvbHVtbnPsnbgg6rK97JqwKOyDneyEseuQoCDsvZTrk5wg7JeG64qUIOqyveyasCkg7Yyo7IqkXG4gIGNvbnN0IGhhc0xpbmVzID0gT2JqZWN0LnZhbHVlcyhsaW5lc1RvKS5zb21lKChsKSA9PiBsLnVwLmxlbmd0aCA+IDAgfHwgbC5kb3duLmxlbmd0aCA+IDApO1xuICBpZiAoIWhhc0xpbmVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKFxuICAgIGxpbmVzVG8uYWRkLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uZHJvcC51cC5sZW5ndGggPT09IDAgJiZcbiAgICBsaW5lc1RvLmFsdGVyU3JjLnVwLmxlbmd0aCA9PT0gMCAmJlxuICAgIGxpbmVzVG8uYWx0ZXJEc3QudXAubGVuZ3RoID09PSAwXG4gICkge1xuICAgIE5haXRlLnQoXCJtaWdyYXRvcjpnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWduczpma0NoYW5nZUNvZGVHZW5lcmF0aW9uRXJyb3JcIiwge1xuICAgICAgdGFibGUsXG4gICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgIGRiRm9yZWlnbnMsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRksg67OA6rK9IOy9lOuTnCDsg53shLEg7Jik66WYXCIpO1xuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICdpbXBvcnQgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjsnLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1wiLFxuICAgIGByZXR1cm4ga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcIiR7dGFibGV9XCIsICh0YWJsZSkgPT4ge2AsXG4gICAgLi4ubGluZXNUby5kcm9wLmRvd24sXG4gICAgLi4ubGluZXNUby5hZGQudXAsXG4gICAgLi4ubGluZXNUby5hbHRlclNyYy5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QudXAsXG4gICAgXCJ9KVwiLFxuICAgIFwifVwiLFxuICAgIFwiXCIsXG4gICAgXCJleHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XCIsXG4gICAgYHJldHVybiBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwiJHt0YWJsZX1cIiwgKHRhYmxlKSA9PiB7YCxcbiAgICAuLi5saW5lc1RvLmFkZC5kb3duLFxuICAgIC4uLmxpbmVzVG8uYWx0ZXJEc3QuZG93bixcbiAgICAuLi5saW5lc1RvLmFsdGVyU3JjLnVwLFxuICAgIC4uLmxpbmVzVG8uZHJvcC51cCxcbiAgICBcIn0pXCIsXG4gICAgXCJ9XCIsXG4gIF07XG5cbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q29kZShsaW5lcy5qb2luKFwiXFxuXCIpLCBcInR5cGVzY3JpcHRcIiwgYHNyYy9taWdyYXRpb24vJHt0YWJsZX0udHNgKTtcbiAgY29uc3QgdGl0bGUgPSBbXG4gICAgXCJhbHRlclwiLFxuICAgIHRhYmxlLFxuICAgIFwiZm9yZWlnbnNcIixcbiAgICAvLyBUT0RPIOuwlOuAjOuKlCDrtoDrtoRcbiAgXS5qb2luKFwiX1wiKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIHRhYmxlLFxuICAgICAgdGl0bGUsXG4gICAgICBmb3JtYXR0ZWQsXG4gICAgICB0eXBlOiBcIm5vcm1hbFwiLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICog7KO87Ja07KeEIEVudGl0eVNldOydhCDquLDrsJjsnLzroZwg7YWM7J2067iUIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65Oc66W8IOyDneyEse2VqeuLiOuLpC5cbiAqIEBwYXJhbSBlbnRpdHlTZXRcbiAqIEByZXR1cm5zIENSRUFURSDrp4jsnbTqt7jroIjsnbTshZgg7L2U65OcXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNyZWF0ZUNvZGUoZW50aXR5U2V0OiBNaWdyYXRpb25TZXQpOiBQcm9taXNlPEdlbk1pZ3JhdGlvbkNvZGVbXT4ge1xuICByZXR1cm4gW1xuICAgIGF3YWl0IGdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzKFxuICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgZW50aXR5U2V0LmNvbHVtbnMsXG4gICAgICBlbnRpdHlTZXQuaW5kZXhlcyxcbiAgICApLFxuICAgIC4uLihhd2FpdCBnZW5lcmF0ZUNyZWF0ZUNvZGVfRm9yZWlnbihlbnRpdHlTZXQudGFibGUsIGVudGl0eVNldC5mb3JlaWducykpLFxuICBdO1xufVxuXG4vKipcbiAqIOyjvOyWtOynhCBlbnRpdHlTZXTsnYQg66qp7ZGc66GcLCBkYlNldOydhCDtmIQg7IOB7Zmp7Jy866GcIO2VmOyXrCDthYzsnbTruJQgQUxURVIg66eI7J206re466CI7J207IWYIOy9lOuTnOulvCDsg53shLHtlanri4jri6QuXG4gKiBAcGFyYW0gZW50aXR5U2V0IO2YhCDsg4HtmansnZggTWlncmF0aW9uU2V0XG4gKiBAcGFyYW0gZGJTZXQg66qp7ZGcIOyDge2ZqeydmCBNaWdyYXRpb25TZXRcbiAqIEByZXR1cm5zIEFMVEVSIOuniOydtOq3uOugiOydtOyFmCDsvZTrk5xcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQWx0ZXJDb2RlKFxuICBlbnRpdHlTZXQ6IE1pZ3JhdGlvblNldCxcbiAgZGJTZXQ6IE1pZ3JhdGlvblNldCxcbik6IFByb21pc2U8R2VuTWlncmF0aW9uQ29kZVtdPiB7XG4gIGNvbnN0IHJlcGxhY2VDb2x1bW5EZWZhdWx0VG8gPSAoY29sOiBNaWdyYXRpb25Db2x1bW4pID0+IHtcbiAgICAvLyBmbG9hdOyduCDqsr3smrAg6riw67O46rCS7J2EIDDsnLzroZwg7KeA7KCV7ZWY64qUIOqyveyasCBcIjAuMDBcIuycvOuhnCDrs4DtmZjrkJjripQg7LyA7J207IqkIOuMgOydkVxuICAgIC8vIGlmIChjb2wudHlwZSA9PT0gXCJmbG9hdFwiICYmIGNvbC5kZWZhdWx0VG8gJiYgU3RyaW5nKGNvbC5kZWZhdWx0VG8pLmluY2x1ZGVzKCdcIicpID09PSBmYWxzZSkge1xuICAgIC8vICAgY29sLmRlZmF1bHRUbyA9IGBcIiR7TnVtYmVyKGNvbC5kZWZhdWx0VG8pLnRvRml4ZWQoY29sLnNjYWxlID8/IDIpfVwiYDtcbiAgICAvLyB9XG4gICAgLy8gLy8gc3RyaW5n7J24IOqyveyasCDquLDrs7jqsJLsnbQg67mIIOyKpO2KuOungeyduCDqsr3smrAg64yA7J2RXG4gICAgLy8gaWYgKGNvbC50eXBlID09PSBcInN0cmluZ1wiICYmIGNvbC5kZWZhdWx0VG8gPT09IFwiXCIpIHtcbiAgICAvLyAgIGNvbC5kZWZhdWx0VG8gPSAnXCJcIic7XG4gICAgLy8gfVxuICAgIC8vIC8vIGJvb2xlYW7snbgg6rK97JqwIOq4sOuzuOqwkiDsoJXqt5ztmZQgKE15U1FM7JeQ7ISc64qUIFRJTllJTlQoMSnroZwg7KCA7J6l65CY66+A66GcIDAg65iQ64qUIDHroZwg7KCV6rec7ZmUKVxuICAgIC8vIC8vIFRPRE86IGRiLnRz7JeQIHR5cGVDYXNlIOyEpOyglSDtmZXsnbjtlZjsl6wg7LKY66as7ZWY64+E66GdIOyImOyglSDtlYTsmpRcbiAgICAvLyBpZiAoY29sLnR5cGUgPT09IFwiYm9vbGVhblwiICYmIGNvbC5kZWZhdWx0VG8gIT09IHVuZGVmaW5lZCkge1xuICAgIC8vICAgaWYgKGNvbC5kZWZhdWx0VG8gPT09IFwiMFwiIHx8IGNvbC5kZWZhdWx0VG8udG9Mb3dlckNhc2UoKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgLy8gICAgIGNvbC5kZWZhdWx0VG8gPSBcIjBcIjtcbiAgICAvLyAgIH0gZWxzZSBpZiAoY29sLmRlZmF1bHRUbyA9PT0gXCIxXCIgfHwgY29sLmRlZmF1bHRUby50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgIC8vICAgICBjb2wuZGVmYXVsdFRvID0gXCIxXCI7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgLy8gRklYTUU6IOydvOuLqCBNeVNRTCDsg4Htmansl5DshJwg67Cc7IOd7ZaI642YIOydtOyKiOydmCB3b3JrYXJvdW5kIOydtOuvgOuhnCBQZ+yXkOyEnCDsnqztmZXsnbgg7ZuEIOuMgOydkSDstpTqsIBcbiAgICByZXR1cm4gY29sO1xuICB9O1xuICBjb25zdCBlbnRpdHlDb2x1bW5zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG4gIGNvbnN0IGRiQ29sdW1ucyA9IGFscGhhYmV0aWNhbChkYlNldC5jb2x1bW5zLCAoYSkgPT4gYS5uYW1lKS5tYXAocmVwbGFjZUNvbHVtbkRlZmF1bHRUbyk7XG5cbiAgLyog65SU67KE6rmF7JqpIOy9lOuTnCwg7Yq57KCVIOy7rOufvOyXkOyEnCDrtojsnbzsuZgg67Cc7IOd7ZWgIOuVjCDtmZXsnbhcbiAgICAgICAgY29uc3QgZW50aXR5Q29sdW1uID0gZW50aXR5U2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkYkNvbHVtbiA9IGRiU2V0LmNvbHVtbnMuZmluZChcbiAgICAgICAgICAoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJwcmljZV9rcndcIlxuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgZW50aXR5Q29sdW1uLCBkYkNvbHVtbiB9KTtcbiAgICAgICAgICovXG5cbiAgLy8gP1xuICBjb25zdCBlbnRpdHlJbmRleGVzID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG4gIGNvbnN0IGRiSW5kZXhlcyA9IGFscGhhYmV0aWNhbChkYlNldC5pbmRleGVzLCAoYSkgPT4gW2EudHlwZSwgLi4uYS5jb2x1bW5zXS5qb2luKFwiLVwiKSk7XG5cbiAgY29uc3QgcmVwbGFjZU5vQWN0aW9uT25NeVNRTCA9IChmOiBNaWdyYXRpb25Gb3JlaWduKSA9PiB7XG4gICAgLy8gTXlTUUzsl5DshJwgUkVTVFJJQ1TsmYAgTk8gQUNUSU9O7J2AIOuPmeydvO2VqFxuICAgIGNvbnN0IHsgb25EZWxldGUsIG9uVXBkYXRlIH0gPSBmO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgb25VcGRhdGU6IG9uVXBkYXRlID09PSBcIlJFU1RSSUNUXCIgPyBcIk5PIEFDVElPTlwiIDogb25VcGRhdGUsXG4gICAgICBvbkRlbGV0ZTogb25EZWxldGUgPT09IFwiUkVTVFJJQ1RcIiA/IFwiTk8gQUNUSU9OXCIgOiBvbkRlbGV0ZSxcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVudGl0eUZvcmVpZ25zID0gYWxwaGFiZXRpY2FsKGVudGl0eVNldC5mb3JlaWducywgKGEpID0+XG4gICAgW2EudG8sIC4uLmEuY29sdW1uc10uam9pbihcIi1cIiksXG4gICkubWFwKChmKSA9PiByZXBsYWNlTm9BY3Rpb25Pbk15U1FMKGYpKTtcbiAgY29uc3QgZGJGb3JlaWducyA9IGFscGhhYmV0aWNhbChkYlNldC5mb3JlaWducywgKGEpID0+IFthLnRvLCAuLi5hLmNvbHVtbnNdLmpvaW4oXCItXCIpKS5tYXAoKGYpID0+XG4gICAgcmVwbGFjZU5vQWN0aW9uT25NeVNRTChmKSxcbiAgKTtcblxuICAvLyDsgq3soJzrkKAg7Lus65+8IOuqqeuhnSDqs4TsgrBcbiAgY29uc3QgZHJvcHBpbmdDb2x1bW5zID0gZGlmZihkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcblxuICBjb25zdCBhbHRlckNvZGVzOiAoR2VuTWlncmF0aW9uQ29kZSB8IEdlbk1pZ3JhdGlvbkNvZGVbXSB8IG51bGwpW10gPSBbXTtcblxuICAvLyAxLiBjb2x1bW5zQW5kSW5kZXhlcyDsspjrpqxcbiAgY29uc3QgaXNFcXVhbENvbHVtbnMgPSBlcXVhbChcbiAgICBlbnRpdHlDb2x1bW5zLm1hcChub3JtYWxpemVDb2x1bW5Gb3JDb21wYXJpc29uKSxcbiAgICBkYkNvbHVtbnMubWFwKG5vcm1hbGl6ZUNvbHVtbkZvckNvbXBhcmlzb24pLFxuICApO1xuICBjb25zdCBpc0VxdWFsSW5kZXhlcyA9IGVxdWFsKFxuICAgIGVudGl0eUluZGV4ZXMubWFwKHNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMpLFxuICAgIGRiSW5kZXhlcy5tYXAoc2V0TWlncmF0aW9uSW5kZXhEZWZhdWx0cyksXG4gICk7XG4gIGlmICghaXNFcXVhbENvbHVtbnMgfHwgIWlzRXF1YWxJbmRleGVzKSB7XG4gICAgYWx0ZXJDb2Rlcy5wdXNoKFxuICAgICAgYXdhaXQgZ2VuZXJhdGVBbHRlckNvZGVfQ29sdW1uQW5kSW5kZXhlcyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgICBlbnRpdHlJbmRleGVzLFxuICAgICAgICBkYkNvbHVtbnMsXG4gICAgICAgIGRiSW5kZXhlcyxcbiAgICAgICAgZGJTZXQuZm9yZWlnbnMsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiBmb3JlaWducyDsspjrpqwgKOyCreygnOuQoCDsu6zrn7wg7KCV67O0IOyghOuLrClcbiAgaWYgKGVxdWFsKGVudGl0eUZvcmVpZ25zLCBkYkZvcmVpZ25zKSA9PT0gZmFsc2UpIHtcbiAgICBhbHRlckNvZGVzLnB1c2goXG4gICAgICBhd2FpdCBnZW5lcmF0ZUFsdGVyQ29kZV9Gb3JlaWducyhcbiAgICAgICAgZW50aXR5U2V0LnRhYmxlLFxuICAgICAgICBlbnRpdHlGb3JlaWducyxcbiAgICAgICAgZGJGb3JlaWducyxcbiAgICAgICAgZHJvcHBpbmdDb2x1bW5zLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgaWYgKGFsdGVyQ29kZXMuZXZlcnkoKGFsdGVyQ29kZSkgPT4gYWx0ZXJDb2RlID09PSBudWxsKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBhbHRlckNvZGVzLmZpbHRlcigoYWx0ZXJDb2RlKSA9PiBhbHRlckNvZGUgIT09IG51bGwpLmZsYXQoKTtcbn1cbiJdLCJuYW1lcyI6WyJlcXVhbCIsImFscGhhYmV0aWNhbCIsImRpZmYiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJmb3JtYXRDb2RlIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsImdlbmVyYXRlQ3JlYXRlQ29kZV9Db2x1bW5BbmRJbmRleGVzIiwidGFibGUiLCJjb2x1bW5zIiwiaW5kZXhlcyIsImNvbHVtbkRlZnMiLCJnZW5Db2x1bW5EZWZpbml0aW9ucyIsImxpbmVzIiwiYnVpbGRlciIsInJhdyIsIm1hcCIsImluZGV4IiwiZ2VuSW5kZXhEZWZpbml0aW9uIiwidHlwZSIsInRpdGxlIiwiZm9ybWF0dGVkIiwiam9pbiIsInJlc3VsdCIsImNvbHVtbiIsImdlbmVyYXRlZCIsInB1c2giLCJnZW5HZW5lcmF0ZWRDb2x1bW5EZWZpbml0aW9uIiwiZ2VuTm9ybWFsQ29sdW1uRGVmaW5pdGlvbiIsIkVycm9yIiwicGdUeXBlIiwiZ2V0UGdUeXBlRm9yQ29sdW1uIiwic3RvcmFnZVR5cGUiLCJudWxsYWJsZUNsYXVzZSIsIm51bGxhYmxlIiwibmFtZSIsImV4cHJlc3Npb24iLCJjaGFpbnMiLCJlbmRzV2l0aCIsImVsZW1lbnRUeXBlIiwic2xpY2UiLCJnZXRQZ0FycmF5VHlwZSIsImRpbWVuc2lvbnMiLCJudW1iZXJUeXBlIiwicHJlY2lzaW9uIiwic2NhbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJleHRyYVR5cGUiLCJkZWZhdWx0VG8iLCJzdGFydHNXaXRoIiwiZ2VuVmVjdG9ySW5kZXhEZWZpbml0aW9uIiwidXNpbmciLCJnZW5QZ3Jvb25nYUluZGV4RGVmaW5pdGlvbiIsIm1ldGhvZE1hcCIsInVuaXF1ZSIsIm51bGxzTm90RGlzdGluY3RDbGF1c2UiLCJudWxsc05vdERpc3RpbmN0IiwidXNpbmdDbGF1c2UiLCJjb2wiLCJzb3J0T3JkZXJDbGF1c2UiLCJzb3J0T3JkZXIiLCJudWxsc0ZpcnN0Q2xhdXNlIiwibnVsbHNGaXJzdCIsImVudGl0eSIsImdldEJ5VGFibGUiLCJjb2x1bW5DbGF1c2UiLCJwcm9wc0RpY3QiLCJvcHRpb24iLCJnZXRQZ3Jvb25nYUNvbHVtbk9wdGlvbiIsInZlY3Rvck9wcyIsIm0iLCJlZkNvbnN0cnVjdGlvbiIsImxpc3RzIiwiZ2VuZXJhdGVDcmVhdGVDb2RlX0ZvcmVpZ24iLCJmb3JlaWducyIsInVwIiwiZG93biIsImdlbkZvcmVpZ25EZWZpbml0aW9ucyIsImNvbnNvbGUiLCJsb2ciLCJmb3JlaWduS2V5c1N0cmluZyIsImZvcmVpZ24iLCJyZWR1Y2UiLCJyIiwiY29sdW1uc1N0cmluZ1F1b3RlIiwicmVwbGFjZSIsInRvIiwib25VcGRhdGUiLCJvbkRlbGV0ZSIsImdlbmVyYXRlQWx0ZXJDb2RlX0NvbHVtbkFuZEluZGV4ZXMiLCJlbnRpdHlDb2x1bW5zIiwiZW50aXR5SW5kZXhlcyIsImRiQ29sdW1ucyIsImRiSW5kZXhlcyIsImRiRm9yZWlnbnMiLCJhbHRlckNvbHVtbnNUbyIsImdldEFsdGVyQ29sdW1uc1RvIiwiYWx0ZXJDb2x1bW5MaW5lc1RvIiwiZ2V0QWx0ZXJDb2x1bW5MaW5lc1RvIiwiYWx0ZXJJbmRleGVzVG8iLCJnZXRBbHRlckluZGV4ZXNUbyIsImluZGV4TmVlZHNUb0Ryb3AiLCJkcm9wIiwiZmlsdGVyIiwiZXZlcnkiLCJpbmNsdWRlcyIsImhhc1VwQ2hhbmdlcyIsImFkZCIsImFsdGVyIiwidCIsInVwQnVpbGRlckxpbmVzIiwiZ2VuSW5kZXhEcm9wRGVmaW5pdGlvbiIsInVwUmF3TGluZXMiLCJkb3duQnVpbGRlckxpbmVzIiwiaW5kZXhDb2wiLCJkb3duUmF3TGluZXMiLCJhY3Rpb24iLCJsZW4iLCJwYXJ0Iiwibm9ybWFsaXplQ29sdW1uRm9yQ29tcGFyaXNvbiIsImNvbHVtbnNUbyIsImV4dHJhQ29sdW1ucyIsImRiIiwiY29uY2F0Iiwic2FtZURiQ29sdW1ucyIsInNhbWVNZENvbHVtbnMiLCJhIiwiYiIsImxpbmVzVG8iLCJhZGRDb2x1bW5EZWZzIiwiZHJvcENvbHVtbk5hbWVzIiwiZmtUb0Ryb3BCZWZvcmVDb2x1bW4iLCJmayIsInNvbWUiLCJkcm9wRmtMaW5lcyIsInJlc3RvcmVGa0xpbmVzIiwiZHJvcENvbHVtbkRlZnMiLCJkYkNvbHVtbiIsImVudGl0eUNvbHVtbiIsImZpbmQiLCJjb2x1bW5EaWZmVXAiLCJjb2x1bW5EaWZmRG93biIsImwiLCJpbmRleGVzVG8iLCJpZGVudGl0eSIsImtleXMiLCJPYmplY3QiLCJrZXkiLCJzb3J0IiwiayIsImV4dHJhSW5kZXhlcyIsInNldE1pZ3JhdGlvbkluZGV4RGVmYXVsdHMiLCJzdXBwb3J0c09yZGVyaW5nIiwiZ2VuZXJhdGVBbHRlckNvZGVfRm9yZWlnbnMiLCJlbnRpdHlGb3JlaWducyIsImRyb3BwaW5nQ29sdW1ucyIsImdldEtleSIsIm1mIiwiZHJvcHBpbmdDb2x1bW5OYW1lcyIsImZrVG8iLCJlbnRpdHlGIiwibWF0Y2hpbmdEYkYiLCJkYkYiLCJhbHRlclNyYyIsImFsdGVyRHN0IiwiZm9yRWFjaCIsIm1hdGNoaW5nRW50aXR5RiIsImlzQ29sdW1uRHJvcHBpbmciLCJoYXNMaW5lcyIsInZhbHVlcyIsImdlbmVyYXRlQ3JlYXRlQ29kZSIsImVudGl0eVNldCIsImdlbmVyYXRlQWx0ZXJDb2RlIiwiZGJTZXQiLCJyZXBsYWNlQ29sdW1uRGVmYXVsdFRvIiwicmVwbGFjZU5vQWN0aW9uT25NeVNRTCIsImYiLCJhbHRlckNvZGVzIiwiaXNFcXVhbENvbHVtbnMiLCJpc0VxdWFsSW5kZXhlcyIsImFsdGVyQ29kZSIsImZsYXQiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsa0JBQWtCO0FBQ3BDLFNBQVNDLFlBQVksRUFBRUMsSUFBSSxRQUFRLFVBQVU7QUFDN0MsU0FBU0MsYUFBYSxFQUFFQyxLQUFLLFFBQVEsY0FBSztBQVMxQyxTQUFTQyxVQUFVLFFBQVEsd0JBQXFCO0FBQ2hELFNBQVNDLGNBQWMsRUFBRUMsY0FBYyxRQUFRLG9CQUFpQjtBQVloRTs7Q0FFQyxHQUNELGVBQWVDLG9DQUNiQyxLQUFhLEVBQ2JDLE9BQTBCLEVBQzFCQyxPQUF5QjtJQUV6QixNQUFNQyxhQUFhQyxxQkFBcUJKLE9BQU9D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
@@ -1,4 +1,4 @@
1
- import { type Knex } from "knex";
1
+ import type { Knex } from "knex";
2
2
  import { type SonamuDBConfig } from "../database/db";
3
3
  import type { GenMigrationCode } from "../types/types";
4
4
  import type { MigrationStatus } from "./types";
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAIvC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA+F3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAkE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CA+DhD"}
1
+ {"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/migration/migrator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAM,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKzD,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,gBAAgB,CAAC;AAMrE,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,EAAE,CAAC;AAEJ,qBAAa,QAAQ;YACL,iBAAiB;IAqB/B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IA+F3C;;;;;;;;;OASG;IACG,SAAS,CACb,MAAM,EAAE,OAAO,GAAG,UAAU,EAC5B,OAAO,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,GAChC,OAAO,CAAC,eAAe,CAAC;IAkE3B;;;;;;OAMG;IACH,iBAAiB,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;;;;IAWtE;;;;;;;OAOG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAuBpD,OAAO,CAAC,UAAU;IAalB;;;;;;OAMG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAuBxC,iBAAiB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAgErE;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;CA+DhD"}