sonamu 0.7.4 → 0.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/api/config.d.ts +1 -4
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +2 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +19 -47
  7. package/dist/bin/cli.js +6 -6
  8. package/dist/database/base-model.d.ts +1 -1
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +15 -4
  11. package/dist/database/code-generator.d.ts.map +1 -1
  12. package/dist/database/code-generator.js +3 -3
  13. package/dist/database/db.d.ts.map +1 -1
  14. package/dist/database/db.js +1 -1
  15. package/dist/database/puri-wrapper.d.ts +11 -11
  16. package/dist/database/puri-wrapper.d.ts.map +1 -1
  17. package/dist/database/puri-wrapper.js +7 -11
  18. package/dist/database/puri.d.ts +36 -17
  19. package/dist/database/puri.d.ts.map +1 -1
  20. package/dist/database/puri.js +54 -7
  21. package/dist/database/puri.types.d.ts +54 -17
  22. package/dist/database/puri.types.d.ts.map +1 -1
  23. package/dist/database/puri.types.js +2 -4
  24. package/dist/database/puri.types.test-d.js +129 -0
  25. package/dist/database/upsert-builder.d.ts +16 -10
  26. package/dist/database/upsert-builder.d.ts.map +1 -1
  27. package/dist/database/upsert-builder.js +10 -19
  28. package/dist/entity/entity-manager.d.ts +113 -22
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +1 -1
  31. package/dist/entity/entity.d.ts +34 -0
  32. package/dist/entity/entity.d.ts.map +1 -1
  33. package/dist/entity/entity.js +110 -37
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8 -2
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +341 -149
  39. package/dist/migration/migration-set.d.ts.map +1 -1
  40. package/dist/migration/migration-set.js +21 -5
  41. package/dist/migration/migrator.d.ts.map +1 -1
  42. package/dist/migration/migrator.js +7 -1
  43. package/dist/migration/postgresql-schema-reader.d.ts +11 -1
  44. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  45. package/dist/migration/postgresql-schema-reader.js +111 -10
  46. package/dist/syncer/syncer.d.ts.map +1 -1
  47. package/dist/syncer/syncer.js +4 -3
  48. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  49. package/dist/template/implementations/generated.template.js +12 -2
  50. package/dist/template/implementations/generated_sso.template.d.ts +3 -3
  51. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  52. package/dist/template/implementations/generated_sso.template.js +50 -2
  53. package/dist/template/implementations/model.template.js +6 -6
  54. package/dist/template/implementations/model_test.template.js +4 -4
  55. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  56. package/dist/template/implementations/view_enums_select.template.js +2 -2
  57. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  58. package/dist/template/implementations/view_form.template.js +12 -9
  59. package/dist/template/implementations/view_id_async_select.template.js +4 -4
  60. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  61. package/dist/template/implementations/view_list.template.js +12 -9
  62. package/dist/template/implementations/view_search_input.template.js +2 -2
  63. package/dist/template/template.js +2 -2
  64. package/dist/template/zod-converter.d.ts.map +1 -1
  65. package/dist/template/zod-converter.js +17 -2
  66. package/dist/testing/fixture-manager.d.ts +2 -1
  67. package/dist/testing/fixture-manager.d.ts.map +1 -1
  68. package/dist/testing/fixture-manager.js +29 -29
  69. package/dist/types/types.d.ts +593 -68
  70. package/dist/types/types.d.ts.map +1 -1
  71. package/dist/types/types.js +113 -9
  72. package/dist/vector/chunking.d.ts +25 -0
  73. package/dist/vector/chunking.d.ts.map +1 -0
  74. package/dist/vector/chunking.js +97 -0
  75. package/dist/vector/config.d.ts +12 -0
  76. package/dist/vector/config.d.ts.map +1 -0
  77. package/dist/vector/config.js +83 -0
  78. package/dist/vector/embedding.d.ts +42 -0
  79. package/dist/vector/embedding.d.ts.map +1 -0
  80. package/dist/vector/embedding.js +147 -0
  81. package/dist/vector/types.d.ts +105 -0
  82. package/dist/vector/types.d.ts.map +1 -0
  83. package/dist/vector/types.js +5 -0
  84. package/dist/vector/vector-search.d.ts +47 -0
  85. package/dist/vector/vector-search.d.ts.map +1 -0
  86. package/dist/vector/vector-search.js +176 -0
  87. package/package.json +9 -8
  88. package/src/api/config.ts +0 -4
  89. package/src/api/sonamu.ts +21 -36
  90. package/src/bin/cli.ts +5 -5
  91. package/src/database/base-model.ts +20 -11
  92. package/src/database/code-generator.ts +6 -2
  93. package/src/database/db.ts +1 -0
  94. package/src/database/puri-wrapper.ts +22 -16
  95. package/src/database/puri.ts +150 -27
  96. package/src/database/puri.types.test-d.ts +457 -0
  97. package/src/database/puri.types.ts +231 -33
  98. package/src/database/upsert-builder.ts +43 -34
  99. package/src/entity/entity-manager.ts +2 -2
  100. package/src/entity/entity.ts +134 -44
  101. package/src/index.ts +6 -0
  102. package/src/migration/code-generation.ts +377 -174
  103. package/src/migration/migration-set.ts +22 -3
  104. package/src/migration/migrator.ts +6 -0
  105. package/src/migration/postgresql-schema-reader.ts +121 -21
  106. package/src/syncer/syncer.ts +3 -2
  107. package/src/template/implementations/generated.template.ts +51 -9
  108. package/src/template/implementations/generated_sso.template.ts +71 -2
  109. package/src/template/implementations/model.template.ts +5 -5
  110. package/src/template/implementations/model_test.template.ts +3 -3
  111. package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
  112. package/src/template/implementations/view_enums_select.template.ts +1 -1
  113. package/src/template/implementations/view_form.template.ts +11 -8
  114. package/src/template/implementations/view_id_async_select.template.ts +3 -3
  115. package/src/template/implementations/view_list.template.ts +11 -8
  116. package/src/template/implementations/view_search_input.template.ts +1 -1
  117. package/src/template/template.ts +1 -1
  118. package/src/template/zod-converter.ts +20 -0
  119. package/src/testing/fixture-manager.ts +31 -30
  120. package/src/types/types.ts +226 -48
  121. package/src/vector/chunking.ts +115 -0
  122. package/src/vector/config.ts +68 -0
  123. package/src/vector/embedding.ts +193 -0
  124. package/src/vector/types.ts +122 -0
  125. package/src/vector/vector-search.ts +261 -0
  126. package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
  127. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
  128. package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
  129. package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
  130. package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
  131. package/dist/template/implementations/view_list_columns.template.js +0 -49
  132. package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
  133. package/src/template/implementations/view_list_columns.template.ts +0 -53
@@ -1,6 +1,4 @@
1
- /** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ // ON CONFLICT 액션 타입
2
- // - "nothing": DO NOTHING
3
- // - { update: [...] }: DO UPDATE
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ // SelectAll 모든 조인된 테이블의 컬럼 포함
4
2
  export { };
5
3
 
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyDrqZTtg4DrjbDsnbTthLAg7Lus65+8IOycoO2LuFxudHlwZSBNZXRhZGF0YUNvbHVtbnMgPSBcIl9fZnVsbHRleHRfX1wiIHwgXCJfX3ZpcnR1YWxfX1wiO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDtg4DsnoUg7LaU7LacXG50eXBlIFZpcnR1YWxLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX192aXJ0dWFsX186IHJlYWRvbmx5IChpbmZlciBWKVtdIH0gPyBWICYgc3RyaW5nIDogbmV2ZXI7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsFxudHlwZSBTdHJpcFZpcnR1YWw8VD4gPSBPbWl0PFQsIFZpcnR1YWxLZXlzPFQ+PjtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgTWV0YWRhdGFDb2x1bW5zPiAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7KCc6rGwIO2bhCBfX2Z1bGx0ZXh0X18g66mU7YOA642w7J207YSwIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFwiX192aXJ0dWFsX19cIj47XG5cbi8vIOuplO2DgOuNsOydtO2EsCDsu6zrn7wg7KCc7Jm4IO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIE9taXRNZXRhZGF0YUNvbHVtbnM8VD4gPSBPbWl0PFQsIE1ldGFkYXRhQ29sdW1ucz47XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvCDqsr3roZxcbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgfCB7XG4gICAgICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUVGFibGVzW1RBbGlhc10+fWA7XG4gICAgfVtrZXlvZiBUVGFibGVzXVxuICB8IChJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICAgID8gQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIFNlbGVjdFZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPlxuICB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPjtcblxuLy8gU2VsZWN0IOqwneyytCDtg4DsnoUgKO2YhOyerOuKlCDsu6zrn7wg6rK966Gc66eMIOyngOybkClcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU2VsZWN0VmFsdWU8VFRhYmxlcz4gLy8gQXZhaWxhYmxlQ29sdW1ucyDrjIDsi6Bcbj47XG5cbi8vIFNlbGVjdCDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuZXhwb3J0IHR5cGUgUGFyc2VTZWxlY3RPYmplY3Q8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn07XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6FIOy2lOy2nFxuZXhwb3J0IHR5cGUgRXh0cmFjdENvbHVtblR5cGU8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyXG4gIDogSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlIC8vIOy2lOqwgFxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG4vLyBXaGVyZSDsobDqsbQg6rCd7LK0IO2DgOyehVxuLy8g7JiIOiB7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfVxuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBba2V5IGluIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5dPzogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywga2V5ICYgc3RyaW5nPjtcbn07XG5cbi8vIEZ1bGx0ZXh0IGluZGV4IOy7rOufvCDstpTstpwg7YOA7J6FXG5leHBvcnQgdHlwZSBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyB7XG4gICAgX19mdWxsdGV4dF9fOiByZWFkb25seSAoaW5mZXIgQ29sKVtdO1xuICB9XG4gICAgPyBDb2wgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbH1gXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgVFRhYmxlc107XG5cbi8vIOu5hOq1kCDsl7DsgrDsnpBcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIiB8IFwiPD5cIiB8IFwiIT1cIjtcblxuLy8gU1FMIEV4cHJlc3Npb24g7YOA7J6FIOygleydmFxuZXhwb3J0IHR5cGUgU3FsRXhwcmVzc2lvbjxUIGV4dGVuZHMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPiA9IHtcbiAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIjsgLy8g65iQ64qUIFwiY29tcHV0ZWRfdmFsdWVcIlxuICBfcmV0dXJuOiBUO1xuICBfc3FsOiBzdHJpbmc7XG59O1xuXG4vLyDqsrDqs7wg7YOA7J6FIOqwgOuPheyEseydhCDsnITtlZwg7YOA7J6FIO2ZleyepVxuZXhwb3J0IHR5cGUgRXhwYW5kPFQ+ID0gVCBleHRlbmRzIGFueVtdXG4gID8geyBbSyBpbiBrZXlvZiBUWzBdXTogVFswXVtLXSB9W10gLy8g67Cw7Je07J2066m0IOyyqyDrsojsp7gg7JqU7IaM66W8IEV4cGFuZO2VmOqzoCDrsLDsl7TroZwg6rCQ7IyIXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICAgID8geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9XG4gICAgOiBUO1xuXG50eXBlIElzU2luZ2xlS2V5PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBpbmZlciBLXG4gID8gSyBleHRlbmRzIGtleW9mIFRUYWJsZXNcbiAgICA/IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBLIC8vIOyXreuwqe2WpSDssrTtgazroZwg64uo7J28IO2CpCDtmZXsnbhcbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuZXhwb3J0IHR5cGUgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICBJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWUgPyBUVGFibGVzW2tleW9mIFRUYWJsZXNdIDogbmV2ZXI7XG5cbi8vIE51bGxhYmxl7J2EIE9wdGlvbmFs66GcIOuzgO2ZmFxudHlwZSBOdWxsYWJsZVRvT3B0aW9uYWw8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgPyBLIDogbmV2ZXJdPzogRXhjbHVkZTxUW0tdLCBudWxsIHwgdW5kZWZpbmVkPjtcbn0gJiBQYXJ0aWFsPHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgbnVsbCB8IHVuZGVmaW5lZCA/IG5ldmVyIDogS106IFRbS107XG59PjtcblxuLy8gSW5zZXJ0IO2DgOyehTogaWQsIGNyZWF0ZWRfYXQg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gTnVsbGFibGVUb09wdGlvbmFsPFxuICBPbWl0PFB1cmlUYWJsZTxUPiwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBNZXRhZGF0YUNvbHVtbnM+XG4+O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRixHQWtLdEYsb0JBQW9CO0FBQ3BCLDBCQUEwQjtBQUMxQixpQ0FBaUM7QUFDakMsV0FNTSJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzLCBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g64K067aAIO2DgOyehSDtgqQgKOuplO2DgOuNsOydtO2EsClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50eXBlIEZ1bGx0ZXh0S2V5ID0gXCJfX2Z1bGx0ZXh0X19cIjtcbnR5cGUgVmlydHVhbEtleSA9IFwiX192aXJ0dWFsX19cIjtcbnR5cGUgTGVmdEpvaW5lZEtleSA9IFwiX19sZWZ0Sm9pbmVkX19cIjtcbnR5cGUgSGFzRGVmYXVsdCA9IFwiX19oYXNEZWZhdWx0X19cIjtcbnR5cGUgR2VuZXJhdGVkS2V5ID0gXCJfX2dlbmVyYXRlZF9fXCI7XG5cbnR5cGUgSW50ZXJuYWxUeXBlS2V5cyA9IEZ1bGx0ZXh0S2V5IHwgVmlydHVhbEtleSB8IExlZnRKb2luZWRLZXkgfCBIYXNEZWZhdWx0IHwgR2VuZXJhdGVkS2V5O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g7YOA7J6FIOycoO2LuOumrO2LsFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8g7YWM7J2067iU66qFIO2DgOyehVxuZXhwb3J0IHR5cGUgVGFibGVOYW1lPFRTY2hlbWE+ID0ga2V5b2YgVFNjaGVtYSAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7YOA7J6FIOy2lOy2nFxudHlwZSBWaXJ0dWFsS2V5czxUPiA9IFQgZXh0ZW5kcyB7IFtLIGluIFZpcnR1YWxLZXldOiByZWFkb25seSAoaW5mZXIgVilbXSB9ID8gViAmIHN0cmluZyA6IG5ldmVyO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDsoJzqsbBcbnR5cGUgU3RyaXBWaXJ0dWFsPFQ+ID0gT21pdDxULCBWaXJ0dWFsS2V5czxUPj47XG5cbi8vIExFRlQgSk9JTiDrp4jsu6QgLSBudWxsYWJsZSBGS+uhnCDsobDsnbjrkJwg7YWM7J2067iUXG4vLyDsnbQg66eI7Luk64qUIG51bGxhYmxlIEZLICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbi8vIGpvaW4gKyBGSyBudWxsYWJsZSAtPiDslYgg67aZ7J2MXG4vLyBqb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbnVsbGFibGUgLT4g67aZ7J2MIVxuZXhwb3J0IHR5cGUgTGVmdEpvaW5lZE1hcmtlciA9IHsgW0sgaW4gTGVmdEpvaW5lZEtleV06IHRydWUgfTtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgSW50ZXJuYWxUeXBlS2V5cz4gJiBzdHJpbmc7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsCDtm4QgX19mdWxsdGV4dF9fIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFZpcnR1YWxLZXk+O1xuXG4vLyDrgrTrtoAg7YOA7J6FIO2CpCDsoJzsmbggKOyLpOygnCDsu6zrn7zrp4wg64Ko6rmAKVxuZXhwb3J0IHR5cGUgT21pdEludGVybmFsVHlwZUtleXM8VD4gPSBPbWl0PFQsIEludGVybmFsVHlwZUtleXM+O1xuXG4vLyBUVGFibGVz7J2YIOuqqOuToCDthYzsnbTruJTsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDsu6zrn7wg6rK966GcXG5leHBvcnQgdHlwZSBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFRhYmxlc1tUQWxpYXNdPn1gO1xuICAgIH1ba2V5b2YgVFRhYmxlc11cbiAgfCAoSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IENvbHVtbktleXM8VFRhYmxlc1trZXlvZiBUVGFibGVzXT4gLy8g64uo7J28IO2FjOydtOu4lOydtOuptCDsu6zrn7zrqoXrp4zrj4Qg7ZeI7JqpXG4gICAgICA6IG5ldmVyKTtcblxuLy8g7Iir7J6QIO2DgOyehSDsu6zrn7zrp4wg7LaU7Lac7ZWY64qUIOycoO2LuOumrO2LsCDtg4DsnoVcbnR5cGUgTnVtZXJpY0NvbHVtbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50IHwgbnVsbCB8IHVuZGVmaW5lZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF0gJlxuICBzdHJpbmc7XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsiKvsnpAg7YOA7J6FIOy7rOufvOunjCDstpTstpxcbmV4cG9ydCB0eXBlIE51bWVyaWNDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke051bWVyaWNDb2x1bW5LZXlzPFRUYWJsZXNbVEFsaWFzXT59YDtcbiAgICB9W2tleW9mIFRUYWJsZXNdXG4gIHwgKElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgICAgPyBOdW1lcmljQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqUgKOuLqOydvCDsu6zrn7wg65iQ64qUIFNRTCDtkZztmITsi50pXG5leHBvcnQgdHlwZSBTZWxlY3RWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICB8IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5cbiAgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj47XG5cbi8vIOykkeyyqSBTZWxlY3Qg6rCd7LK0IO2DgOyehSAo7J6s6reA7KCBKVxuLy8g7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuZXhwb3J0IHR5cGUgTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW2tleTogc3RyaW5nXTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG59O1xuXG4vLyBTZWxlY3Qg6rCd7LK0IO2DgOyehSAoZmxhdCDrmJDripQg7KSR7LKpIO2XiOyaqSlcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG5cbi8vIOqwkuydtCDspJHssqkg6rCd7LK07J247KeAIO2MkOuzhO2VmOuKlCDtl6ztjbwg7YOA7J6FXG50eXBlIElzTmVzdGVkT2JqZWN0PFQ+ID0gVCBleHRlbmRzIHN0cmluZ1xuICA/IGZhbHNlXG4gIDogVCBleHRlbmRzIFNxbEV4cHJlc3Npb248YW55PlxuICAgID8gZmFsc2VcbiAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2U7XG5cbi8vIOy7rOufvOydtCBudWxsYWJsZeyduOyngCDtmZXsnbggKOyKpO2CpOuniOyXkOyEnCDsp4HsoJEg7LaU7LacKVxuLy8g7JiIOiBJc051bGxhYmxlQ29sdW1uPFRUYWJsZXMsIFwiZW1wbG95ZWVzLmRlcGFydG1lbnRfaWRcIj4g4oaSIGRlcGFydG1lbnRfaWTqsIAgbnVtYmVyIHwgbnVsbOydtOuptCB0cnVlXG5leHBvcnQgdHlwZSBJc051bGxhYmxlQ29sdW1uPFxuICBUVGFibGVzLFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBudWxsIGV4dGVuZHMgVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlXG4gICAgICA6IGZhbHNlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG4vLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw66W4IOuniOy7pCDtg4DsnoUg6rKw7KCVXG4vLyBudWxsYWJsZSBGS+uhnCBsZWZ0Sm9pbiDihpIgTGVmdEpvaW5lZE1hcmtlciAo6rCd7LK0IOyekOyytOqwgCBudWxs7J28IOyImCDsnojsnYwpXG4vLyBub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbiDihpIg66eI7LukIOyXhuydjCAo67aA66qo6rCAIOyeiOycvOuptCDsnpDsi53rj4Qg67CY65Oc7IucIOyeiOydjClcbmV4cG9ydCB0eXBlIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFBhdGggZXh0ZW5kcyBzdHJpbmc+ID0gSXNOdWxsYWJsZUNvbHVtbjxcbiAgVFRhYmxlcyxcbiAgUGF0aFxuPiBleHRlbmRzIHRydWVcbiAgPyBMZWZ0Sm9pbmVkTWFya2VyXG4gIDoge307XG5cbi8vIOyjvOyWtOynhCDthYzsnbTruJTsnbQgRksgbnVsbGFibGXroZwgbGVmdEpvaW4g65CcIO2FjOydtOu4lOyduOyngCDtmZXsnbjtlanri4jri6QuXG4vLyDsgqzsi6QgTGVmdEpvaW5NYXJrZXLqsIAg67aZ7JeI64qU7KeAIO2ZleyduO2VmOuKlOqyjCDri6TsnoXri4jri6QuXG4vLyDsnbQg66eI7Luk64qUIEZLIG51bGxhYmxlICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbnR5cGUgSXNOdWxsYWJsZUpvaW5lZFRhYmxlPFRUYWJsZXMsIFRhYmxlS2V5PiA9IFRhYmxlS2V5IGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICA/IFRUYWJsZXNbVGFibGVLZXldIGV4dGVuZHMgTGVmdEpvaW5lZE1hcmtlclxuICAgID8gdHJ1ZSAvLyBMZWZ0Sm9pbmVkTWFya2Vy6rCAIOyeiOycvOuptCBudWxsYWJsZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuLy8g6rK966GcIOyhsO2VqSDtl6ztjbwgKHByZWZpeOqwgCDsl4bsnLzrqbQga2V566eMLCDsnojsnLzrqbQgcHJlZml4X19rZXkpXG50eXBlIEpvaW5QYXRoPFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5IGV4dGVuZHMgc3RyaW5nPiA9IFByZWZpeCBleHRlbmRzIFwiXCJcbiAgPyBLZXlcbiAgOiBgJHtQcmVmaXh9X18ke0tleX1gO1xuXG4vLyBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlbTso7zripQg7Lmc6rWs7J6F64uI64ukLlxuLy8g7J20IO2DgOyeheydgCBQdXJp7J2YIHNlbGVjdCwgYXBwZW5kU2VsZWN07JeQ7IScIFRSZXN1bHTroZwg7IKs7Jqp65Cp64uI64ukLlxuLy9cbi8vIFNjaGVtYeulvCDsnb3slrTshJwgRkvsnZggbnVsbGFiaWxpdHnsl5Ag65Sw6528IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDstpTroaDtlbTso7zripQg6riw64ql7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOqyjCDrrLTsiqgg7IaM66as64OQPyBGS+qwgCBudWxsYWJsZeyduOuNsCBsZWZ0Sm9pbuuQmOyXiOuLpOuptCwg7ZW064u5IOqwneyytOuKlCBudWxsYWJsZSDtlbTslbwg7ZWo7J2EIO2DgOyehSDstpTroaDsnLzroZwg67CY7JiB7ZW07KSA64uk64qUIOqyg+yeheuLiOuLpC5cbi8vIOuwmOuptCBGS+qwgCBub24tbnVsbGFibGXsnbTqsbDrgpgg6re464OlIGpvaW7snLzroZwg7J207Ja07KGM64uk66m0IO2VtOuLuSDqsJ3ssrTripQgbm9uLW51bGxhYmxl7ZWgIOqygeuLiOuLpC5cbi8vIOusvOuhoCDqsJ3ssrQg64K067aA7J2YIG51bGxhYmlsaXR564qUIOuYkCDrs4TqsJzroZwg7LaU66Gg65Cp64uI64ukLiBcbi8vIFxuLy8g7JWE656Y7JeQ64+EIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGjrpbwg67mE66Gv7ZW0IEV4dHJhY3RDb2x1bW5UeXBlLCBFeHRyYWN0Q29sdW1uVHlwZVJhdyDrk7HsnZgg7YOA7J6F7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOuTpOydmCDsl63tlaDsnYAg64uk7J2M6rO8IOqwmeyKteuLiOuLpDpcbi8vIC0gUGFyc2UqOiDqsJ3ssrQg66CI67Ko7JeQ7IScIOykkeyyqSDqtazsobDrpbwg7Iic7ZqM7ZWY66mwIOqwneyytOyXkCB8IG51bGzsnYQg67aZ7J287KeAIOqysOygle2VqeuLiOuLpC5cbi8vIC0gRXh0cmFjdCo6IO2VhOuTnCDroIjrsqjsl5DshJwgXCJ0YWJsZS5jb2x1bW5cIiDqsr3roZzroZzrtoDthLAg7Iuk7KCcIO2DgOyeheydhCDstpTstpztlanri4jri6QuXG4vL1xuLy8g7JiI7IucOlxuLy8gLnNlbGVjdCh7XG4vLyAgIGlkOiBcInVzZXJzLmlkXCIsICAgICAgICAgICAvLyDihpAgRXh0cmFjdENvbHVtblR5cGXsnZgg6rKw6rO864qUIG51bWJlcuyeheuLiOuLpC5cbi8vICAgZGVwYXJ0bWVudDogeyAgICAgICAgICAgICAvLyDihpAgUGFyc2VTZWxlY3RPYmplY3RJbm5lcuyXkCDsnZjtlbQgbnVsbGFibGUg6rCd7LK066GcIOy2lOuhoOuQqeuLiOuLpC5cbi8vICAgICBpZDogXCJkZXBhcnRtZW50LmlkXCIsICAgIC8vIOKGkCBFeHRyYWN0Q29sdW1uVHlwZVJhd+ydmCDqsrDqs7zripQgbnVtYmVy7J6F64uI64ukLlxuLy8gICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCIgLy8g4oaQIEV4dHJhY3RDb2x1bW5UeXBlUmF37J2YIOqysOqzvOuKlCBzdHJpbmfsnoXri4jri6QuXG4vLyAgIH1cbi8vIH0pXG5leHBvcnQgdHlwZSBQYXJzZVNlbGVjdE9iamVjdDxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4+ID0gUGFyc2VTZWxlY3RPYmplY3RXaXRoUGF0aDxUVGFibGVzLCBUU2VsZWN0LCBcIlwiPjtcblxuLy8g6rK966Gc66W8IOy2lOygge2VmOuptOyEnCBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGg8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWUgLy8g7KO87Ja07KeEIO2FjOydtOu4lOydtCBGSyBudWxsYWJsZeyXkCBsZWZ0Sm9pbuuQmOyXiOuKlOyngCDsl6zrtoDsl5Ag65Sw6528IHNlbGVjdCDqsrDqs7wg6rCd7LK07J2YIO2DgOyeheydtCDri6zrnbzsp5Hri4jri6QuXG4gICAgICAgICAgPyBFeHBhbmQ8UGFyc2VTZWxlY3RPYmplY3RJbm5lcjxUVGFibGVzLCBUU2VsZWN0W0tdLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+Pj4gfCBudWxsIC8vIOunjOyVvSDtlbTri7ntlZzri6TrqbQg7ZW064u5IOqwneyytCDsnpDssrTripQgbnVsbGFibGUg7ZWY66mwLFxuICAgICAgICAgIDogRXhwYW5kPFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8VFRhYmxlcywgVFNlbGVjdFtLXSwgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4+IC8vIOq3uOugh+yngCDslYrri6TrqbQgbm9uLW51bGxhYmxlIO2VqeuLiOuLpC5cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn0+O1xuXG4vLyDspJHssqkg6rCd7LK0IOuCtOu2gOyaqSAtIGxlZnRKb2luIG51bGxhYmxl7J2EIOqwneyytCDroIjrsqjsl5DshJwg7J2066+4IOyymOumrO2WiOycvOuvgOuhnCDtlYTrk5zripQg7JuQ67O4IO2DgOyeheydhCDsgqzsmqntlanri4jri6QuXG4vLyBQYXJzZVNlbGVjdE9iamVjdFdpdGhQYXRo7JmAIOqxsOydmCDrj5nsnbztlZjrgpgsIOuniOyngOunieyXkCBFeHRyYWN0Q29sdW1uVHlwZSDrjIDsi6AgRXh0cmFjdENvbHVtblR5cGVSYXfrpbwg7IKs7Jqp7ZWY7JesXG4vLyDtlYTrk5wg66CI67Ko7JeQ7IScIOykkeuzteycvOuhnCB8IG51bGzsnbQg7LaU6rCA65CY64qUIOqyg+ydhCDrsKnsp4Dtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWVcbiAgICAgICAgICA/IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PiB8IG51bGxcbiAgICAgICAgICA6IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PlxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlUmF3PFRUYWJsZXMsIFRTZWxlY3RbS10gJiBzdHJpbmc+OyAvLyBsZWZ0Sm9pbiBudWxsYWJsZSDrrLTsi5xcbn0+O1xuXG4vLyDsu6zrn7wg6rK966Gc7JeQ7IScIO2DgOyeheydhCDstpTstpztlanri4jri6QuIExlZnRKb2luZWRNYXJrZXLqsIAg7J6I7Jy866m0IHwgbnVsbOydhCDstpTqsIDtlanri4jri6QuXG4vLyDstZzsg4HsnIQgc2VsZWN0IO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG5leHBvcnQgdHlwZSBFeHRyYWN0Q29sdW1uVHlwZTxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFBhdGggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gUGF0aCBleHRlbmRzIGAke2luZmVyIFRBbGlhc30uJHtpbmZlciBUQ29sdW1ufWBcbiAgPyBUQWxpYXMgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFRhYmxlc1tUQWxpYXNdXG4gICAgICA/IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gfCBudWxsIC8vIExFRlQgSk9JTiAobnVsbGFibGUgRkspIOKGkiBudWxsYWJsZVxuICAgICAgICA6IFRUYWJsZXNbVEFsaWFzXVtUQ29sdW1uXSAvLyBJTk5FUiBKT0lOIOuYkOuKlCBub24tbnVsbCBGSyBsZWZ0Sm9pbiDihpIgbm9uLW51bGxhYmxlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6F7J2EIOy2lOy2nO2VqeuLiOuLpC4gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbi8vIOykkeyyqSDqsJ3ssrQg64K067aAIO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuICjqsJ3ssrQg66CI67Ko7JeQ7IScIOydtOuvuCB8IG51bGwg7LKY66as6rCAIOyZhOujjOuQmOyXiOycvOuvgOuhnClcbnR5cGUgRXh0cmFjdENvbHVtblR5cGVSYXc8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gLy8gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6FXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIFdoZXJlIOyhsOqxtCDqsJ3ssrQg7YOA7J6FXG4vLyDsmIg6IHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9XG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbjxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtrZXkgaW4gQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPl0/OiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBrZXkgJiBzdHJpbmc+O1xufTtcblxuLy8gRnVsbHRleHQgaW5kZXgg7Lus65+8IOy2lOy2nCDtg4DsnoVcbmV4cG9ydCB0eXBlIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtUQWxpYXMgaW4ga2V5b2YgVFRhYmxlc106IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIHtcbiAgICBbSyBpbiBGdWxsdGV4dEtleV06IHJlYWRvbmx5IChpbmZlciBDb2wpW107XG4gIH1cbiAgICA/IENvbCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUVGFibGVzXTtcblxuLy8g67mE6rWQIOyXsOyCsOyekFxuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9XCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwiIHwgXCI8PlwiIHwgXCIhPVwiO1xuLy8g7KGw6rG0IOyXsOyCsOyekDog67mE6rWQIOyXsOyCsOyekCArIO2MqO2EtCDrp6Tsua0g7Jew7IKw7J6QXG5leHBvcnQgdHlwZSBXaGVyZU9wZXJhdG9yID0gQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCI7XG5cbi8vIFNRTCBFeHByZXNzaW9uIO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIFNxbEV4cHJlc3Npb248VCBleHRlbmRzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj4gPSB7XG4gIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCI7IC8vIOuYkOuKlCBcImNvbXB1dGVkX3ZhbHVlXCJcbiAgX3JldHVybjogVDtcbiAgX3NxbDogc3RyaW5nO1xufTtcblxuLy8g6rKw6rO8IO2DgOyehSDqsIDrj4XshLHsnYQg7JyE7ZWcIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIEV4cGFuZDxUPiA9IFQgZXh0ZW5kcyBhbnlbXVxuICA/IHsgW0sgaW4ga2V5b2YgVFswXV06IFRbMF1bS10gfVtdIC8vIOuwsOyXtOydtOuptCDssqsg67KI7Ke4IOyalOyGjOulvCBFeHBhbmTtlZjqs6Ag67Cw7Je066GcIOqwkOyMiFxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgICA/IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfVxuICAgIDogVDtcblxudHlwZSBJc1NpbmdsZUtleTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBrZXlvZiBUVGFibGVzIGV4dGVuZHMgaW5mZXIgS1xuICA/IEsgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBrZXlvZiBUVGFibGVzIGV4dGVuZHMgSyAvLyDsl63rsKntlqUg7LK07YGs66GcIOuLqOydvCDtgqQg7ZmV7J24XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2VcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbmV4cG9ydCB0eXBlIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXSA6IG5ldmVyO1xuXG4vLyBfX2hhc0RlZmF1bHRfX+yXkCDtj6ztlajrkJwg7YKk65Ok7J2EIFB1cmlUYWJsZTxUPuydmCDtgqTroZwg7KCc7ZWcXG50eXBlIEhhc0RlZmF1bHRLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IChpbmZlciBLKVtdIH1cbiAgPyBFeHRyYWN0PEssIGtleW9mIFB1cmlUYWJsZTxUPj5cbiAgOiBuZXZlcjtcblxuLy8gX19nZW5lcmF0ZWRfX+yXkCDtj6ztlajrkJwg7YKk65OkIChJTlNFUlQg7IucIOygnOyZuO2VtOyVvCDtlagpXG50eXBlIEdlbmVyYXRlZEtleXM8VD4gPSBUIGV4dGVuZHMgeyBfX2dlbmVyYXRlZF9fOiByZWFkb25seSAoaW5mZXIgSylbXSB9XG4gID8gRXh0cmFjdDxLLCBrZXlvZiBQdXJpVGFibGU8VD4+XG4gIDogbmV2ZXI7XG5cbi8vIEluc2VydCDtg4DsnoU6IOuplO2DgOuNsOydtO2EsCDsoJzqsbAg7ZuELCBfX2hhc0RlZmF1bHRfXyDsu6zrn7zrk6Trp4wgb3B0aW9uYWzroZwg7LKY66asLCBfX2dlbmVyYXRlZF9fIOy7rOufvOydgCDsmYTsoITtnogg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gT21pdDxcbiAgUHVyaVRhYmxlPFQ+LFxuICBJbnRlcm5hbFR5cGVLZXlzIHwgSGFzRGVmYXVsdEtleXM8VD4gfCBHZW5lcmF0ZWRLZXlzPFQ+XG4+ICYge1xuICBbSyBpbiBIYXNEZWZhdWx0S2V5czxUPl0/OiBQdXJpVGFibGU8VD5bS107XG59O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuXG4vLyBGSyDsu6zrn7zrqoUg7LaU7LacIOycoO2LuOumrO2LsCDtg4DsnoUgLSBEYXRhYmFzZUZvcmVpZ25LZXlzIO2ZnOyaqVxuZXhwb3J0IHR5cGUgRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPVxuICBUVGFibGUgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZUZvcmVpZ25LZXlzID8gRGF0YWJhc2VGb3JlaWduS2V5c1tUVGFibGVdIDogbmV2ZXI7XG5cbi8vIFVuaW9u7J2EIEludGVyc2VjdGlvbuycvOuhnCDrs4DtmZjtlZjripQg7Jyg7Yu466as7YuwXG50eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VT4gPSAoVSBleHRlbmRzIGFueSA/IChrOiBVKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKGs6IGluZmVyIEkpID0+IHZvaWRcbiAgPyBJXG4gIDogbmV2ZXI7XG5cbi8vIFNlbGVjdEFsbCDsi5wg66qo65OgIOyhsOyduOuQnCDthYzsnbTruJTsnZgg7Lus65+8IO2PrO2VqFxuZXhwb3J0IHR5cGUgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gIHtcbiAgICBbSyBpbiBrZXlvZiBUVGFibGVzXTogVFRhYmxlc1tLXSBleHRlbmRzIGluZmVyIFRcbiAgICAgID8gVCBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBQYXJ0aWFsPE9taXRJbnRlcm5hbFR5cGVLZXlzPFQ+PiAvLyBMRUZUIEpPSU7snYAgbnVsbGFibGUsIOuplO2DgOuNsOydtO2EsCDsoJzqsbBcbiAgICAgICAgOiBPbWl0SW50ZXJuYWxUeXBlS2V5czxUPiAvLyBJTk5FUiBKT0lO7J2AIG5vbi1udWxsYWJsZSwg66mU7YOA642w7J207YSwIOygnOqxsFxuICAgICAgOiBuZXZlcjtcbiAgfVtrZXlvZiBUVGFibGVzXVxuPjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRkFBc0YsR0F3V3RGLGdDQUFnQztBQUNoQyxXQVFFIn0=
@@ -0,0 +1,129 @@
1
+ import { describe, expectTypeOf, it } from "vitest";
2
+ // ============================================================================
3
+ // ExtractColumnType 테스트
4
+ // ============================================================================
5
+ describe("ExtractColumnType", ()=>{
6
+ describe("단일 테이블", ()=>{
7
+ it("기본 컬럼 타입을 추출한다", ()=>{
8
+ const result = {};
9
+ expectTypeOf(result).toEqualTypeOf();
10
+ });
11
+ it("nullable 컬럼 타입을 추출한다", ()=>{
12
+ const result = {};
13
+ expectTypeOf(result).toEqualTypeOf();
14
+ });
15
+ it("단일 테이블에서는 테이블명 없이 컬럼명만으로 추출 가능하다", ()=>{
16
+ const result = {};
17
+ expectTypeOf(result).toEqualTypeOf();
18
+ });
19
+ });
20
+ describe("innerJoin된 테이블", ()=>{
21
+ it("innerJoin 테이블의 컬럼은 non-null이다", ()=>{
22
+ const result = {};
23
+ expectTypeOf(result).toEqualTypeOf();
24
+ });
25
+ });
26
+ describe("leftJoin된 테이블", ()=>{
27
+ it("leftJoin 테이블의 컬럼은 nullable이다", ()=>{
28
+ const result = {};
29
+ expectTypeOf(result).toEqualTypeOf();
30
+ });
31
+ it("leftJoin 테이블의 원래 nullable 컬럼도 nullable이다", ()=>{
32
+ const result = {};
33
+ expectTypeOf(result).toEqualTypeOf();
34
+ });
35
+ });
36
+ describe("non-null FK로 leftJoin된 테이블", ()=>{
37
+ it("non-null FK로 leftJoin된 테이블의 컬럼은 non-null이다 (마커 없음)", ()=>{
38
+ const result = {};
39
+ expectTypeOf(result).toEqualTypeOf();
40
+ });
41
+ });
42
+ });
43
+ // ============================================================================
44
+ // ParseSelectObject 테스트
45
+ // ============================================================================
46
+ describe("ParseSelectObject", ()=>{
47
+ describe("단일 테이블 (flat select)", ()=>{
48
+ it("기본 필드를 파싱한다", ()=>{
49
+ const result = {};
50
+ expectTypeOf(result).toEqualTypeOf();
51
+ });
52
+ it("nullable 필드를 파싱한다", ()=>{
53
+ const result = {};
54
+ expectTypeOf(result).toEqualTypeOf();
55
+ });
56
+ });
57
+ describe("innerJoin + flat select", ()=>{
58
+ it("innerJoin 테이블의 필드는 non-null이다", ()=>{
59
+ const result = {};
60
+ expectTypeOf(result).toEqualTypeOf();
61
+ });
62
+ });
63
+ describe("leftJoin + flat select", ()=>{
64
+ it("leftJoin 테이블의 필드는 nullable이다", ()=>{
65
+ const result = {};
66
+ expectTypeOf(result).toEqualTypeOf();
67
+ });
68
+ });
69
+ // ============================================================================
70
+ // 핵심: 입체적 select 구조
71
+ // ============================================================================
72
+ describe("innerJoin + nested select (입체적 구조)", ()=>{
73
+ it("innerJoin 테이블의 중첩 객체는 non-null이다", ()=>{
74
+ const result = {};
75
+ expectTypeOf(result).toEqualTypeOf();
76
+ });
77
+ });
78
+ describe("leftJoin + nested select (입체적 구조)", ()=>{
79
+ it("leftJoin 테이블의 중첩 객체는 nullable이다 (필드는 non-null)", ()=>{
80
+ const result = {};
81
+ expectTypeOf(result).toEqualTypeOf();
82
+ });
83
+ it("leftJoin 테이블 내의 원래 nullable 필드도 non-null이다", ()=>{
84
+ const result = {};
85
+ // employee 객체가 null이 아닐 때만 접근하므로, salary의 원래 nullability 유지
86
+ expectTypeOf(result).toEqualTypeOf();
87
+ });
88
+ });
89
+ describe("non-null FK leftJoin + nested select (입체적 구조)", ()=>{
90
+ it("non-null FK로 leftJoin된 테이블의 중첩 객체는 non-null이다", ()=>{
91
+ const result = {};
92
+ expectTypeOf(result).toEqualTypeOf();
93
+ });
94
+ it("깊은 중첩에서도 non-null FK leftJoin은 non-null이다", ()=>{
95
+ const result = {};
96
+ expectTypeOf(result).toEqualTypeOf();
97
+ });
98
+ });
99
+ describe("복합 케이스", ()=>{
100
+ it("innerJoin + nullable FK leftJoin + non-null FK leftJoin 조합", ()=>{
101
+ const result = {};
102
+ expectTypeOf(result).toEqualTypeOf();
103
+ });
104
+ it("여러 leftJoin 관계", ()=>{
105
+ const result = {};
106
+ expectTypeOf(result).toEqualTypeOf();
107
+ });
108
+ });
109
+ });
110
+ // ============================================================================
111
+ // AvailableColumns 테스트
112
+ // ============================================================================
113
+ describe("AvailableColumns", ()=>{
114
+ it("단일 테이블에서 사용 가능한 컬럼을 추출한다", ()=>{
115
+ // "users.id" | "users.name" | "users.email" | "users.department_id" | "id" | "name" | "email" | "department_id"
116
+ const valid1 = "users.id";
117
+ const valid2 = "id"; // 단일 테이블이면 테이블명 생략 가능
118
+ expectTypeOf(valid1).toExtend();
119
+ expectTypeOf(valid2).toExtend();
120
+ });
121
+ it("여러 테이블에서 사용 가능한 컬럼을 추출한다", ()=>{
122
+ const valid1 = "users.id";
123
+ const valid2 = "department.name";
124
+ expectTypeOf(valid1).toExtend();
125
+ expectTypeOf(valid2).toExtend();
126
+ });
127
+ });
128
+
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRlc3QtZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0VHlwZU9mLCBpdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgRXh0cmFjdENvbHVtblR5cGUsXG4gIExlZnRKb2luZWRNYXJrZXIsXG4gIFBhcnNlU2VsZWN0T2JqZWN0LFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIO2FjOyKpO2KuOyaqSBNb2NrIOyKpO2CpOuniFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG50eXBlIE1vY2tTY2hlbWEgPSB7XG4gIHVzZXJzOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBkZXBhcnRtZW50X2lkOiBudW1iZXIgfCBudWxsO1xuICB9O1xuICBkZXBhcnRtZW50czoge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbXBhbnlfaWQ6IG51bWJlcjtcbiAgfTtcbiAgY29tcGFuaWVzOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH07XG4gIGVtcGxveWVlczoge1xuICAgIGlkOiBudW1iZXI7XG4gICAgZW1wbG95ZWVfbnVtYmVyOiBzdHJpbmc7XG4gICAgc2FsYXJ5OiBzdHJpbmcgfCBudWxsOyAvLyBudWxsYWJsZSDtlYTrk5xcbiAgICB1c2VyX2lkOiBudW1iZXI7XG4gICAgZGVwYXJ0bWVudF9pZDogbnVtYmVyIHwgbnVsbDtcbiAgfTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dHJhY3RDb2x1bW5UeXBlIO2FjOyKpO2KuFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5kZXNjcmliZShcIkV4dHJhY3RDb2x1bW5UeXBlXCIsICgpID0+IHtcbiAgZGVzY3JpYmUoXCLri6jsnbwg7YWM7J2067iUXCIsICgpID0+IHtcbiAgICBpdChcIuq4sOuzuCDsu6zrn7wg7YOA7J6F7J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHsgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXSB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBFeHRyYWN0Q29sdW1uVHlwZTxUYWJsZXMsIFwidXNlcnMuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJudWxsYWJsZSDsu6zrn7wg7YOA7J6F7J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHsgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXSB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBFeHRyYWN0Q29sdW1uVHlwZTxUYWJsZXMsIFwidXNlcnMuZGVwYXJ0bWVudF9pZFwiPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjxudW1iZXIgfCBudWxsPigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLri6jsnbwg7YWM7J2067iU7JeQ7ISc64qUIO2FjOydtOu4lOuqhSDsl4bsnbQg7Lus65+866qF66eM7Jy866GcIOy2lOy2nCDqsIDriqXtlZjri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7IHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImlkXCI+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPG51bWJlcj4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW7rkJwg7YWM7J2067iUXCIsICgpID0+IHtcbiAgICBpdChcImlubmVySm9pbiDthYzsnbTruJTsnZgg7Lus65+87J2AIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl07IC8vIGlubmVySm9pblxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImRlcGFydG1lbnQuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImxlZnRKb2lu65CcIO2FjOydtOu4lFwiLCAoKSA9PiB7XG4gICAgaXQoXCJsZWZ0Sm9pbiDthYzsnbTruJTsnZgg7Lus65+87J2AIG51bGxhYmxl7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyOyAvLyBsZWZ0Sm9pblxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImRlcGFydG1lbnQuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyIHwgbnVsbD4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iU7J2YIOybkOuemCBudWxsYWJsZSDsu6zrn7zrj4QgbnVsbGFibGXsnbTri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGVtcGxveWVlOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IEV4dHJhY3RDb2x1bW5UeXBlPFRhYmxlcywgXCJlbXBsb3llZS5zYWxhcnlcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8c3RyaW5nIHwgbnVsbD4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbuuQnCDthYzsnbTruJRcIiwgKCkgPT4ge1xuICAgIGl0KFwibm9uLW51bGwgRkvroZwgbGVmdEpvaW7rkJwg7YWM7J2067iU7J2YIOy7rOufvOydgCBub24tbnVsbOydtOuLpCAo66eI7LukIOyXhuydjClcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIG51bGxhYmxlIEZLXG4gICAgICAgIGNvbXBhbnk6IE1vY2tTY2hlbWFbXCJjb21wYW5pZXNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyOyAvLyBub24tbnVsbCBGSyDihpIg66eI7LukIOyXhuydjFxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImNvbXBhbnkuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJzZVNlbGVjdE9iamVjdCDthYzsiqTtirhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZGVzY3JpYmUoXCJQYXJzZVNlbGVjdE9iamVjdFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwi64uo7J28IO2FjOydtOu4lCAoZmxhdCBzZWxlY3QpXCIsICgpID0+IHtcbiAgICBpdChcIuq4sOuzuCDtlYTrk5zrpbwg7YyM7Iux7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0geyB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgbmFtZTogXCJ1c2Vycy5uYW1lXCI7XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJudWxsYWJsZSDtlYTrk5zrpbwg7YyM7Iux7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0geyB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudF9pZDogXCJ1c2Vycy5kZXBhcnRtZW50X2lkXCI7XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBkZXBhcnRtZW50X2lkOiBudW1iZXIgfCBudWxsO1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW4gKyBmbGF0IHNlbGVjdFwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4g7YWM7J2067iU7J2YIO2VhOuTnOuKlCBub24tbnVsbOydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdOyAvLyBpbm5lckpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwdF9pZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgIGRlcHRfbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcHRfaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwdF9uYW1lOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImxlZnRKb2luICsgZmxhdCBzZWxlY3RcIiwgKCkgPT4ge1xuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iU7J2YIO2VhOuTnOuKlCBudWxsYWJsZeydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwdF9pZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgIGRlcHRfbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcHRfaWQ6IG51bWJlciB8IG51bGw7XG4gICAgICAgIGRlcHRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g7ZW17IusOiDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4g7YWM7J2067iU7J2YIOykkeyyqSDqsJ3ssrTripQgbm9uLW51bGzsnbTri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTsgLy8gaW5uZXJKb2luXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcInVzZXJzLmlkXCI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgICAgbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwibGVmdEpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJsZWZ0Sm9pbiDthYzsnbTruJTsnZgg7KSR7LKpIOqwneyytOuKlCBudWxsYWJsZeydtOuLpCAo7ZWE65Oc64qUIG5vbi1udWxsKVwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBcImRlcGFydG1lbnQuaWRcIjtcbiAgICAgICAgICBuYW1lOiBcImRlcGFydG1lbnQubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB9IHwgbnVsbDsgLy8g6rCd7LK0IOuLqOychOuhnCBudWxsYWJsZVxuICAgICAgfT4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iUIOuCtOydmCDsm5DrnpggbnVsbGFibGUg7ZWE65Oc64+EIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBlbXBsb3llZTogTW9ja1NjaGVtYVtcImVtcGxveWVlc1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIGxlZnRKb2luXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcInVzZXJzLmlkXCI7XG4gICAgICAgIGVtcGxveWVlOiB7XG4gICAgICAgICAgaWQ6IFwiZW1wbG95ZWUuaWRcIjtcbiAgICAgICAgICBzYWxhcnk6IFwiZW1wbG95ZWUuc2FsYXJ5XCI7IC8vIOyKpO2CpOuniOyDgSBudWxsYWJsZeydtOyngOunjC4uLlxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICAvLyBlbXBsb3llZSDqsJ3ssrTqsIAgbnVsbOydtCDslYTri5Ag65WM66eMIOygkeq3vO2VmOuvgOuhnCwgc2FsYXJ57J2YIOybkOuemCBudWxsYWJpbGl0eSDsnKDsp4BcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBlbXBsb3llZToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgc2FsYXJ5OiBzdHJpbmcgfCBudWxsOyAvLyDsiqTtgqTrp4jsnZgg7JuQ656YIG51bGxhYmlsaXR5IOycoOyngFxuICAgICAgICB9IHwgbnVsbDtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwibm9uLW51bGwgRksgbGVmdEpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbuuQnCDthYzsnbTruJTsnZgg7KSR7LKpIOqwneyytOuKlCBub24tbnVsbOydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbnVsbGFibGUgRksg4oaSIOuniOy7pCDsnojsnYxcbiAgICAgICAgZGVwYXJ0bWVudF9fY29tcGFueTogTW9ja1NjaGVtYVtcImNvbXBhbmllc1wiXTsgLy8gbm9uLW51bGwgRksg4oaSIOuniOy7pCDsl4bsnYxcbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBcImRlcGFydG1lbnQuaWRcIjtcbiAgICAgICAgICBuYW1lOiBcImRlcGFydG1lbnQubmFtZVwiO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudF9fY29tcGFueS5uYW1lXCI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBjb21wYW55OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgfTsgLy8gbm9uLW51bGwhIChub24tbnVsbCBGS+uhnCDsobDsnbjrkJjslrQg66eI7LukIOyXhuydjClcbiAgICAgICAgfSB8IG51bGw7XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLquYrsnYAg7KSR7LKp7JeQ7ISc64+EIG5vbi1udWxsIEZLIGxlZnRKb2lu7J2AIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICBlbXBsb3llZXM6IE1vY2tTY2hlbWFbXCJlbXBsb3llZXNcIl07XG4gICAgICAgIHVzZXI6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTsgLy8gaW5uZXJKb2luIOKGkiDrp4jsu6Qg7JeG7J2MXG4gICAgICAgIHVzZXJfX2VtcGxveWVlOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbnVsbGFibGUgRktcbiAgICAgICAgdXNlcl9fZW1wbG95ZWVfX2RlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTsgLy8gbm9uLW51bGwgRksg4oaSIOuniOy7pCDsl4bsnYxcbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwiZW1wbG95ZWVzLmlkXCI7XG4gICAgICAgIHVzZXI6IHtcbiAgICAgICAgICBpZDogXCJ1c2VyLmlkXCI7XG4gICAgICAgICAgZW1wbG95ZWU6IHtcbiAgICAgICAgICAgIGlkOiBcInVzZXJfX2VtcGxveWVlLmlkXCI7XG4gICAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIGlkOiBcInVzZXJfX2VtcGxveWVlX19kZXBhcnRtZW50LmlkXCI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgLy8gdXNlcuuKlCBpbm5lckpvaW7snbTrr4DroZwg66y07KGw6rG0IOyhtOyerO2VqeuLiOuLpC5cbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGVtcGxveWVlOiB7XG4gICAgICAgICAgICAvLyB1c2Vy7J2YIGVtcGxveWVl64qUIG51bGxhYmxlIEZLIGxlZnRKb2lu7J2066+A66GcIG51bGzsnbwg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIC8vIGVtcGxveWVl6rCAIOyhtOyerO2VnOuLpOuptCBkZXBhcnRtZW5064qUIG5vbi1udWxsIEZLIGxlZnRKb2lu7J2066+A66GcIOustOyhsOqxtCDsobTsnqztlanri4jri6QuXG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICB9OyAvLyBub24tbnVsbCBGSyDihpIgbm9uLW51bGxcbiAgICAgICAgICB9IHwgbnVsbDsgLy8gbnVsbGFibGUgRksgbGVmdEpvaW4g4oaSIG51bGxhYmxlXG4gICAgICAgIH07IC8vIGlubmVySm9pbiDihpIgbm9uLW51bGxcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi67O17ZWpIOy8gOydtOyKpFwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4gKyBudWxsYWJsZSBGSyBsZWZ0Sm9pbiArIG5vbi1udWxsIEZLIGxlZnRKb2luIOyhsO2VqVwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgZW1wbG95ZWVzOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdO1xuICAgICAgICB1c2VyOiBNb2NrU2NoZW1hW1widXNlcnNcIl07IC8vIGlubmVySm9pbiAobm9uLW51bGwgRkspXG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIG51bGxhYmxlIEZLIGxlZnRKb2luXG4gICAgICAgIGRlcGFydG1lbnRfX2NvbXBhbnk6IE1vY2tTY2hlbWFbXCJjb21wYW5pZXNcIl07IC8vIG5vbi1udWxsIEZLIGxlZnRKb2luIOKGkiDrp4jsu6Qg7JeG7J2MXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcImVtcGxveWVlcy5pZFwiO1xuICAgICAgICBlbXBsb3llZV9udW1iZXI6IFwiZW1wbG95ZWVzLmVtcGxveWVlX251bWJlclwiO1xuICAgICAgICBzYWxhcnk6IFwiZW1wbG95ZWVzLnNhbGFyeVwiO1xuICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgaWQ6IFwidXNlci5pZFwiO1xuICAgICAgICAgIHVzZXJuYW1lOiBcInVzZXIubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgaWQ6IFwiZGVwYXJ0bWVudC5pZFwiO1xuICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCI7XG4gICAgICAgICAgY29tcGFueToge1xuICAgICAgICAgICAgbmFtZTogXCJkZXBhcnRtZW50X19jb21wYW55Lm5hbWVcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZW1wbG95ZWVfbnVtYmVyOiBzdHJpbmc7XG4gICAgICAgIHNhbGFyeTogc3RyaW5nIHwgbnVsbDsgLy8g7Iqk7YKk66eI7IOBIG51bGxhYmxlXG4gICAgICAgIHVzZXI6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07IC8vIGlubmVySm9pbiDihpIgbm9uLW51bGxcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB9OyAvLyBub24tbnVsbCBGSyDihpIgbm9uLW51bGxcbiAgICAgICAgfSB8IG51bGw7IC8vIG51bGxhYmxlIEZLIGxlZnRKb2luIOKGkiBudWxsYWJsZVxuICAgICAgfT4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwi7Jes65+sIGxlZnRKb2luIOq0gOqzhFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgZW1wbG95ZWVzOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyO1xuICAgICAgICBtYW5hZ2VyOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyO1xuICAgICAgfTtcbiAgICAgIHR5cGUgU2VsZWN0ID0ge1xuICAgICAgICBpZDogXCJlbXBsb3llZXMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCI7XG4gICAgICAgIH07XG4gICAgICAgIG1hbmFnZXI6IHtcbiAgICAgICAgICBuYW1lOiBcIm1hbmFnZXIubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgICAgIG1hbmFnZXI6IHsgbmFtZTogc3RyaW5nIH0gfCBudWxsO1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQXZhaWxhYmxlQ29sdW1ucyDthYzsiqTtirhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZGVzY3JpYmUoXCJBdmFpbGFibGVDb2x1bW5zXCIsICgpID0+IHtcbiAgaXQoXCLri6jsnbwg7YWM7J2067iU7JeQ7IScIOyCrOyaqSDqsIDriqXtlZwg7Lus65+87J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBUYWJsZXMgPSB7IHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gfTtcbiAgICB0eXBlIFJlc3VsdCA9IEF2YWlsYWJsZUNvbHVtbnM8VGFibGVzPjtcblxuICAgIC8vIFwidXNlcnMuaWRcIiB8IFwidXNlcnMubmFtZVwiIHwgXCJ1c2Vycy5lbWFpbFwiIHwgXCJ1c2Vycy5kZXBhcnRtZW50X2lkXCIgfCBcImlkXCIgfCBcIm5hbWVcIiB8IFwiZW1haWxcIiB8IFwiZGVwYXJ0bWVudF9pZFwiXG4gICAgY29uc3QgdmFsaWQxOiBSZXN1bHQgPSBcInVzZXJzLmlkXCI7XG4gICAgY29uc3QgdmFsaWQyOiBSZXN1bHQgPSBcImlkXCI7IC8vIOuLqOydvCDthYzsnbTruJTsnbTrqbQg7YWM7J2067iU66qFIOyDneuetSDqsIDriqVcblxuICAgIGV4cGVjdFR5cGVPZih2YWxpZDEpLnRvRXh0ZW5kPFJlc3VsdD4oKTtcbiAgICBleHBlY3RUeXBlT2YodmFsaWQyKS50b0V4dGVuZDxSZXN1bHQ+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7Jes65+sIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvOydhCDstpTstpztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTtcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gQXZhaWxhYmxlQ29sdW1uczxUYWJsZXM+O1xuXG4gICAgY29uc3QgdmFsaWQxOiBSZXN1bHQgPSBcInVzZXJzLmlkXCI7XG4gICAgY29uc3QgdmFsaWQyOiBSZXN1bHQgPSBcImRlcGFydG1lbnQubmFtZVwiO1xuXG4gICAgZXhwZWN0VHlwZU9mKHZhbGlkMSkudG9FeHRlbmQ8UmVzdWx0PigpO1xuICAgIGV4cGVjdFR5cGVPZih2YWxpZDIpLnRvRXh0ZW5kPFJlc3VsdD4oKTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImV4cGVjdFR5cGVPZiIsIml0IiwicmVzdWx0IiwidG9FcXVhbFR5cGVPZiIsInZhbGlkMSIsInZhbGlkMiIsInRvRXh0ZW5kIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFlBQVksRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFxQ3BELCtFQUErRTtBQUMvRSx3QkFBd0I7QUFDeEIsK0VBQStFO0FBRS9FRixTQUFTLHFCQUFxQjtJQUM1QkEsU0FBUyxVQUFVO1FBQ2pCRSxHQUFHLGtCQUFrQjtZQUluQixNQUFNQyxTQUFTLENB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
@@ -1,11 +1,15 @@
1
1
  import type { Knex } from "knex";
2
+ import type { DatabaseForeignKeys, DatabaseSchemaExtend, EntityIndex } from "../types/types";
3
+ import type { ForeignKeyColumns, TableName } from "./puri.types";
4
+ /**
5
+ * FK 타입 추론을 위해 DatabaseForeignKeys export
6
+ * (module augmentation 자동 로드 보장)
7
+ */
8
+ export type { DatabaseForeignKeys };
2
9
  type TableData = {
3
10
  references: Set<string>;
4
11
  rows: Record<string, unknown>[];
5
- uniqueIndexes: {
6
- name?: string;
7
- columns: string[];
8
- }[];
12
+ uniqueIndexes: EntityIndex[];
9
13
  uniquesMap: Map<string, string>;
10
14
  };
11
15
  export type UBRef = {
@@ -13,9 +17,12 @@ export type UBRef = {
13
17
  of: string;
14
18
  use?: string;
15
19
  };
16
- type UpsertOptions = {
20
+ export type UpsertOptions<TTable extends TableName<DatabaseSchemaExtend>> = {
21
+ chunkSize?: number;
22
+ cleanOrphans?: ForeignKeyColumns<TTable> | ForeignKeyColumns<TTable>[];
23
+ };
24
+ export type InsertOnlyOptions = {
17
25
  chunkSize?: number;
18
- cleanOrphans?: string | string[];
19
26
  };
20
27
  export declare function isRefField(field: unknown): field is UBRef;
21
28
  export declare class UpsertBuilder {
@@ -26,9 +33,9 @@ export declare class UpsertBuilder {
26
33
  register<T extends string>(tableName: string, row: {
27
34
  [key in T]?: UBRef | string | number | boolean | bigint | null | object | unknown;
28
35
  }): UBRef;
29
- upsert(wdb: Knex, tableName: string, optionsOrChunkSize?: UpsertOptions): Promise<number[]>;
30
- insertOnly(wdb: Knex, tableName: string, optionsOrChunkSize?: UpsertOptions | number): Promise<number[]>;
31
- upsertOrInsert(wdb: Knex, tableName: string, mode: "upsert" | "insert", options?: UpsertOptions): Promise<number[]>;
36
+ upsert<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, options?: UpsertOptions<TTable>): Promise<number[]>;
37
+ insertOnly<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, options?: InsertOnlyOptions): Promise<number[]>;
38
+ upsertOrInsert<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, mode: "upsert" | "insert", options?: UpsertOptions<TTable>): Promise<number[]>;
32
39
  updateBatch(wdb: Knex, tableName: string, options?: {
33
40
  chunkSize?: number;
34
41
  where?: string | string[];
@@ -40,5 +47,4 @@ export declare class UpsertBuilder {
40
47
  */
41
48
  private buildInsertLevels;
42
49
  }
43
- export {};
44
50
  //# sourceMappingURL=upsert-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAOjC,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;IACtD,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AACF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AACF,KAAK,aAAa,GAAG;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAClC,CAAC;AACF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAOzD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAwBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;KAClF,GACA,KAAK;IAqFF,MAAM,CACV,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,aAAa,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC;IASd,UAAU,CACd,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,kBAAkB,CAAC,EAAE,aAAa,GAAG,MAAM,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC;IASd,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC;IAwMd,WAAW,CACf,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;IAyChB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA8D1B"}
1
+ {"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjE;;;GAGG;AACH,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAGpC,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAGF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAGF,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,IAAI;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;CACxE,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAOzD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAwBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;KAClF,GACA,KAAK;IAqFF,MAAM,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EACzD,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,UAAU,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EAC7D,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,cAAc,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EACjE,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;IAwMd,WAAW,CACf,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;IAyChB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA8D1B"}
@@ -41,11 +41,11 @@ export class UpsertBuilder {
41
41
  // 해당 테이블의 unique 인덱스를 순회하며 키 생성
42
42
  const uniqueKeys = table.uniqueIndexes.map((unqIndex)=>{
43
43
  const uniqueKeyArray = unqIndex.columns.map((unqCol)=>{
44
- const val = row[unqCol];
44
+ const val = row[unqCol.name];
45
45
  if (isRefField(val)) {
46
46
  return val.uuid;
47
47
  } else {
48
- return row[unqCol] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
48
+ return row[unqCol.name] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
49
49
  }
50
50
  });
51
51
  // 값이 모두 null인 경우 키 생성 패스
@@ -118,17 +118,10 @@ export class UpsertBuilder {
118
118
  });
119
119
  return result;
120
120
  }
121
- async upsert(wdb, tableName, optionsOrChunkSize) {
122
- // 숫자면 { chunkSize: n } 으로 변환
123
- const options = typeof optionsOrChunkSize === "number" ? {
124
- chunkSize: optionsOrChunkSize
125
- } : optionsOrChunkSize;
121
+ async upsert(wdb, tableName, options) {
126
122
  return this.upsertOrInsert(wdb, tableName, "upsert", options);
127
123
  }
128
- async insertOnly(wdb, tableName, optionsOrChunkSize) {
129
- const options = typeof optionsOrChunkSize === "number" ? {
130
- chunkSize: optionsOrChunkSize
131
- } : optionsOrChunkSize;
124
+ async insertOnly(wdb, tableName, options) {
132
125
  return this.upsertOrInsert(wdb, tableName, "insert", options);
133
126
  }
134
127
  async upsertOrInsert(wdb, tableName, mode, options) {
@@ -162,10 +155,6 @@ export class UpsertBuilder {
162
155
  if (hasCircular) {
163
156
  throw new Error(`${tableName}에 순환 자기 참조가 있습니다.`);
164
157
  }
165
- // upsert 모드일 때 유니크 인덱스가 없으면 에러
166
- if (mode === "upsert" && table.uniqueIndexes.length === 0) {
167
- throw new Error(`${tableName}에 unique index가 정의되지 않아 upsert를 할 수 없습니다.`);
168
- }
169
158
  const uuidMap = new Map();
170
159
  const allIds = [];
171
160
  // 레벨별로 순차 처리
@@ -213,8 +202,10 @@ export class UpsertBuilder {
213
202
  // INSERT 모드 - RETURNING 사용
214
203
  resultRows = await wdb.insert(dataForDb).into(tableName).returning(selectFields);
215
204
  } else {
216
- // UPSERT 모드 - onConflict 사용
217
- const conflictColumns = table.uniqueIndexes[0].columns;
205
+ // UPSERT 모드 - onConflict 사용 (unique index 없으면 PK fallback)
206
+ const conflictColumns = table.uniqueIndexes.length > 0 ? table.uniqueIndexes[0].columns.map((c)=>c.name) : [
207
+ "id"
208
+ ];
218
209
  const updateColumns = Object.keys(dataForDb[0]).filter((col)=>!conflictColumns.includes(col));
219
210
  // updateColumns가 비어있어도 merge()를 사용하여 모든 행이 RETURNING되도록 보장
220
211
  const mergeColumns = updateColumns.length > 0 ? updateColumns : conflictColumns;
@@ -335,7 +326,7 @@ export class UpsertBuilder {
335
326
  table.uniquesMap.clear();
336
327
  }
337
328
  // ============================================================================
338
- // Private Helpers
329
+ // Private Helper Methods
339
330
  // ============================================================================
340
331
  /**
341
332
  * rows를 의존성 순서에 따라 레벨별로 그룹화
@@ -399,4 +390,4 @@ export class UpsertBuilder {
399
390
  }
400
391
  }
401
392
 
402
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG50eXBlIFVwc2VydE9wdGlvbnMgPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogc3RyaW5nIHwgc3RyaW5nW107IC8vIEZLIOy7rOufvOuqhSjrk6QpXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmRmllbGQoZmllbGQ6IHVua25vd24pOiBmaWVsZCBpcyBVQlJlZiB7XG4gIHJldHVybiAoXG4gICAgZmllbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGZpZWxkICE9PSBudWxsICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8ub2YgIT09IHVuZGVmaW5lZCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/LnV1aWQgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZXJ0QnVpbGRlciB7XG4gIHRhYmxlczogTWFwPHN0cmluZywgVGFibGVEYXRhPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWJsZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlRGF0YSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZVNwZWMgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHtcbiAgICAgIHJlZmVyZW5jZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgcm93czogW10sXG4gICAgICB1bmlxdWVJbmRleGVzOiB0YWJsZVNwZWM/LnVuaXF1ZUluZGV4ZXMgPz8gW10sXG4gICAgICB1bmlxdWVzTWFwOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIH07XG4gICAgdGhpcy50YWJsZXMuc2V0KHRhYmxlTmFtZSwgdGFibGVEYXRhKTtcbiAgICByZXR1cm4gdGFibGVEYXRhO1xuICB9XG5cbiAgaGFzVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXMuaGFzKHRhYmxlTmFtZSk7XG4gIH1cblxuICByZWdpc3RlcjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICByb3c6IHtcbiAgICAgIFtrZXkgaW4gVF0/OiBVQlJlZiB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBudWxsIHwgb2JqZWN0IHwgdW5rbm93bjtcbiAgICB9LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIHVuaXF1ZSDsnbjrjbHsiqTrpbwg7Iic7ZqM7ZWY66mwIO2CpCDsg53shLFcbiAgICBjb25zdCB1bmlxdWVLZXlzID0gdGFibGUudW5pcXVlSW5kZXhlc1xuICAgICAgLm1hcCgodW5xSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5pcXVlS2V5QXJyYXkgPSB1bnFJbmRleC5jb2x1bW5zLm1hcCgodW5xQ29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93W3VucUNvbCBhcyBrZXlvZiB0eXBlb2Ygcm93XTtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnV1aWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddID8/IHJhbmRvbVVVSUQoKTsgLy8gbnVsbGFibGXsnbgg6rK97JqwIHV1aWTroZwg656c642k6rCSIOyCveyehVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g6rCS7J20IOuqqOuRkCBudWxs7J24IOqyveyasCDtgqQg7IOd7ISxIO2MqOyKpFxuICAgICAgICBpZiAodW5pcXVlS2V5QXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuaXF1ZUtleUFycmF5LmpvaW4oXCItLS1kZWxpbWl0ZXItLVwiKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgIC8vIHV1aWQg7IOd7ISxIOuhnOyngVxuICAgIGNvbnN0IHsgdXVpZCwgaXNSZXVzZWQgfSA9ICgoKSA9PiB7XG4gICAgICAvLyDtgqTrpbwg7Iic7ZqM7ZWY7JesIOydtOuvuCDsobTsnqztlZjripQg7YKk6rCAIOyeiOuKlOyngCDtmZXsnbhcbiAgICAgIGlmICh1bmlxdWVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCB1bmlxdWVLZXkgb2YgdW5pcXVlS2V5cykge1xuICAgICAgICAgIGlmICh0YWJsZS51bmlxdWVzTWFwLmhhcyh1bmlxdWVLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB1dWlkOiBhc3NlcnREZWZpbmVkKHRhYmxlLnVuaXF1ZXNNYXAuZ2V0KHVuaXF1ZUtleSksIFwiVW5pcXVlIGtleSBub3QgZm91bmRcIiksXG4gICAgICAgICAgICAgIGlzUmV1c2VkOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7LC+7J2EIOyImCDsl4bripQg6rK97JqwIOyDneyEsVxuICAgICAgcmV0dXJuIHsgdXVpZDogcmFuZG9tVVVJRCgpLCBpc1JldXNlZDogZmFsc2UgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8g66qo65OgIOycoOuLiO2BrO2CpOyXkCDrjIDtlbQg7Jyg64uI7YGs66e17JeQIHV1aWQg7KCA7J6lXG4gICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCB1bmlxdWVLZXkgb2YgdW5pcXVlS2V5cykge1xuICAgICAgICB0YWJsZS51bmlxdWVzTWFwLnNldCh1bmlxdWVLZXksIHV1aWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOydtCDthYzsnbTruJTsl5Ag7IKs7Jqp65CcIFJlZkZpZWxk66W8IOyInO2ajO2VmOyXrCwg7ZiE7J6sIO2FjOydtOu4lCDsoJXrs7Tsl5Ag7Ja065akIO2VhOuTnOulvCDssLjsobDtlZjripTsp4Ag7LaU6rCAXG4gICAgLy8g7J20IOygleuztOulvCDrgpjspJHsl5Ag7LmY7ZmY7ZWgIOuVjCDsgqzsmqlcbiAgICByb3cgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhyb3cpLm1hcCgoW3Jvd0tleSwgcm93VmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChpc1JlZkZpZWxkKHJvd1ZhbHVlKSkge1xuICAgICAgICAgIHJvd1ZhbHVlLnVzZSA/Pz0gXCJpZFwiO1xuICAgICAgICAgIHRhYmxlLnJlZmVyZW5jZXMuYWRkKGAke3Jvd1ZhbHVlLm9mfS4ke3Jvd1ZhbHVlLnVzZX1gKTtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhKHJvd1ZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAvLyBvYmplY3Tsnbgg6rK97JqwIEpTT07snLzroZwg67OA7ZmYXG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IEpTT04uc3RyaW5naWZ5KHJvd1ZhbHVlKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKSBhcyB7IFtrZXkgaW4gVF0/OiB1bmtub3duIH07XG5cbiAgICB0YWJsZS5yb3dzLnB1c2goe1xuICAgICAgdXVpZCxcbiAgICAgIC4uLnJvdyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdDogVUJSZWYgPSB7XG4gICAgICBvZjogdGFibGVOYW1lLFxuICAgICAgdXVpZDogKHJvdyBhcyB7IHV1aWQ/OiBzdHJpbmcgfSkudXVpZCA/PyB1dWlkLFxuICAgIH07XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWdpc3RlclwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiByZXN1bHQudXVpZCxcbiAgICAgIGlzVXVpZFJldXNlZDogaXNSZXVzZWQsXG4gICAgICByb3csXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zT3JDaHVua1NpemU/OiBVcHNlcnRPcHRpb25zLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgLy8g7Iir7J6Q66m0IHsgY2h1bmtTaXplOiBuIH0g7Jy866GcIOuzgO2ZmFxuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnNPckNodW5rU2l6ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICA/IHsgY2h1bmtTaXplOiBvcHRpb25zT3JDaHVua1NpemUgfVxuICAgICAgICA6IG9wdGlvbnNPckNodW5rU2l6ZTtcblxuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyBpbnNlcnRPbmx5KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zT3JDaHVua1NpemU/OiBVcHNlcnRPcHRpb25zIHwgbnVtYmVyLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0eXBlb2Ygb3B0aW9uc09yQ2h1bmtTaXplID09PSBcIm51bWJlclwiXG4gICAgICAgID8geyBjaHVua1NpemU6IG9wdGlvbnNPckNodW5rU2l6ZSB9XG4gICAgICAgIDogb3B0aW9uc09yQ2h1bmtTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMudXBzZXJ0T3JJbnNlcnQod2RiLCB0YWJsZU5hbWUsIFwiaW5zZXJ0XCIsIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cHNlcnQg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IO2VoCDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhYmxlLnJvd3Muc29tZSgocm93KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyb3cpLnNvbWUoKFssIHZhbHVlXSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgIT09IHRhYmxlTmFtZSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfSDtlbTqsrDrkJjsp4Ag7JWK7J2AIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IO2FjOydtOu4lCDsiJztmoztlZjsl6wg7ZiE7J6sIO2FjOydtOu4lCDssLjsobDtlZjripQg66qo65OgIO2FjOydtOu4lCDstpTstpxcbiAgICBjb25zdCB7IHJlZmVyZW5jZXMsIHJlZlRhYmxlcyB9ID0gQXJyYXkuZnJvbSh0aGlzLnRhYmxlcykucmVkdWNlKFxuICAgICAgKHIsIFssIHRhYmxlXSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSBBcnJheS5mcm9tKHRhYmxlLnJlZmVyZW5jZXMudmFsdWVzKCkpLmZpbmQoKHJlZikgPT5cbiAgICAgICAgICByZWYuaW5jbHVkZXMoYCR7dGFibGVOYW1lfS5gKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICAgIHIucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgci5yZWZUYWJsZXMucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlZmVyZW5jZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByZWZUYWJsZXM6IFtdIGFzIFRhYmxlRGF0YVtdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGV4dHJhY3RGaWVsZHMgPSB1bmlxdWUocmVmZXJlbmNlcylcbiAgICAgIC5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKVsxXSlcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8g7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OEIOq3uOujue2ZlCAo7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQgTGV2ZWwgMCDtlZjrgpgpXG4gICAgY29uc3QgeyBsZXZlbHMsIGhhc0NpcmN1bGFyIH0gPSB0aGlzLmJ1aWxkSW5zZXJ0TGV2ZWxzKHRhYmxlLnJvd3MsIHRhYmxlTmFtZSk7XG5cbiAgICBpZiAoaGFzQ2lyY3VsYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIOyInO2ZmCDsnpDquLAg7LC47KGw6rCAIOyeiOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyB1cHNlcnQg66qo65Oc7J28IOuVjCDsnKDri4jtgawg7J24642x7Iqk6rCAIOyXhuycvOuptCDsl5Drn6xcbiAgICBpZiAobW9kZSA9PT0gXCJ1cHNlcnRcIiAmJiB0YWJsZS51bmlxdWVJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdW5pcXVlIGluZGV46rCAIOygleydmOuQmOyngCDslYrslYQgdXBzZXJ066W8IO2VoCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHV1aWRNYXAgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgICBjb25zdCBhbGxJZHM6IG51bWJlcltdID0gW107XG5cbiAgICAvLyDroIjrsqjrs4TroZwg7Iic7LCoIOyymOumrFxuICAgIGZvciAoY29uc3QgbGV2ZWxSb3dzIG9mIGxldmVscykge1xuICAgICAgLy8g7J207KCEIOugiOuyqOyXkOyEnCDslrvsnYAgSUTroZwg7J6Q6riwIOywuOyhsCDtlbTqsrBcbiAgICAgIGNvbnN0IHJlc29sdmVkUm93cyA9IGxldmVsUm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHsgLi4ucm93IH07XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdykpIHtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQodmFsdWUudXVpZCk7XG5cbiAgICAgICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgdXVpZCAke3ZhbHVlLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICByZXNvbHZlZFtrZXldID0gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbdmFsdWUudXNlID8/IFwiaWRcIl07XG5cbiAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiLCB7XG4gICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgZnJvbTogeyBvZjogdmFsdWUub2YsIHV1aWQ6IHZhbHVlLnV1aWQsIHVzZTogdmFsdWUudXNlID8/IFwiaWRcIiB9LFxuICAgICAgICAgICAgICB0bzogcmVzb2x2ZWRba2V5XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8g7ZiE7J6sIOugiOuyqCB1cHNlcnRcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IG9wdGlvbnM/LmNodW5rU2l6ZTtcbiAgICAgIGNvbnN0IGxldmVsQ2h1bmtzID0gY2h1bmtTaXplID8gY2h1bmsocmVzb2x2ZWRSb3dzLCBjaHVua1NpemUpIDogW3Jlc29sdmVkUm93c107XG4gICAgICBjb25zdCBzZWxlY3RGaWVsZHMgPSB1bmlxdWUoW1wiaWRcIiwgLi4uZXh0cmFjdEZpZWxkc10pO1xuXG4gICAgICBmb3IgKGNvbnN0IGRhdGFDaHVuayBvZiBsZXZlbENodW5rcykge1xuICAgICAgICBpZiAoZGF0YUNodW5rLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgLy8gdXVpZOulvCDrs4Trj4TroZwg67O06rSA7ZWY6rOgLCBEQuyXkCDsoIDsnqXtlaAg642w7J207YSw7JeQ7IScIOygnOqxsFxuICAgICAgICBjb25zdCBvcmlnaW5hbFV1aWRzID0gZGF0YUNodW5rLm1hcCgocikgPT4gci51dWlkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGRhdGFGb3JEYiA9IGRhdGFDaHVuay5tYXAoKHsgdXVpZCwgLi4ucmVzdCB9KSA9PiByZXN0KTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyBpZDogbnVtYmVyOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1bXTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgICAgIC8vIElOU0VSVCDrqqjrk5wgLSBSRVRVUk5JTkcg7IKs7JqpXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYi5pbnNlcnQoZGF0YUZvckRiKS5pbnRvKHRhYmxlTmFtZSkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAtIG9uQ29uZmxpY3Qg7IKs7JqpXG4gICAgICAgICAgY29uc3QgY29uZmxpY3RDb2x1bW5zID0gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+ICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPiAwID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpID8gY2xlYW5PcnBoYW5zIDogW2NsZWFuT3JwaGFuc107XG5cbiAgICAgIC8vIO2YhOyerCByZWdpc3RlcuuQnCDroIjsvZTrk5zrk6TsnZggRksg6rCS65OkIOy2lOy2nFxuICAgICAgY29uc3QgZmtDb25kaXRpb25zID0gZmtDb2x1bW5zLm1hcCgoZmtDb2wpID0+IHtcbiAgICAgICAgY29uc3QgZmtWYWx1ZXMgPSBbLi4ubmV3IFNldCh0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3dbZmtDb2xdKS5maWx0ZXIoKHYpID0+IHYgIT0gbnVsbCkpXTtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1uOiBma0NvbCwgdmFsdWVzOiBma1ZhbHVlcyB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOuqqOuToCBGSyDsu6zrn7zsl5Ag6rCS7J20IOyeiOuKlCDqsr3smrDsl5Drp4wg7IKt7KCcIOyLpO2WiVxuICAgICAgaWYgKGZrQ29uZGl0aW9ucy5ldmVyeSgoZmMpID0+IGZjLnZhbHVlcy5sZW5ndGggPiAwKSkge1xuICAgICAgICBsZXQgZGVsZXRlUXVlcnkgPSB3ZGIodGFibGVOYW1lKTtcblxuICAgICAgICAvLyDqsIEgRksg7Lus65+87JeQIOuMgO2VnCBXSEVSRSBJTiDsobDqsbQg7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgeyBjb2x1bW4sIHZhbHVlcyB9IG9mIGZrQ29uZGl0aW9ucykge1xuICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrsKnquIggdXBzZXJ07ZWcIElE64qUIOygnOyZuFxuICAgICAgICBkZWxldGVRdWVyeSA9IGRlbGV0ZVF1ZXJ5LndoZXJlTm90SW4oXCJpZFwiLCBhbGxJZHMpO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGF3YWl0IGRlbGV0ZVF1ZXJ5LmRlbGV0ZSgpO1xuXG4gICAgICAgIE5haXRlLnQoXCJwdXJpOnViLWNsZWFuLW9ycGhhbnNcIiwge1xuICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICBjbGVhbk9ycGhhbnM6IGZrQ29sdW1ucyxcbiAgICAgICAgICBkZWxldGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHM7XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJpc0FycmF5IiwidW5pcXVlIiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiYXNzZXJ0RGVmaW5lZCIsImNodW5rIiwibm9uTnVsbGFibGUiLCJiYXRjaFVwZGF0ZSIsImlzUmVmRmllbGQiLCJmaWVsZCIsInVuZGVmaW5lZCIsIm9mIiwidXVpZCIsIlVwc2VydEJ1aWxkZXIiLCJ0YWJsZXMiLCJNYXAiLCJnZXRUYWJsZSIsInRhYmxlTmFtZSIsInRhYmxlIiwiZ2V0IiwidGFibGVTcGVjIiwiZ2V0VGFibGVTcGVjIiwidGFibGVEYXRhIiwicmVmZXJlbmNlcyIsIlNldCIsInJvd3MiLCJ1bmlxdWVJbmRleGVzIiwidW5pcXVlc01hcCIsInNldCIsImhhc1RhYmxlIiwiaGFzIiwicmVnaXN0ZXIiLCJyb3ciLCJ1bmlxdWVLZXlzIiwibWFwIiwidW5xSW5kZXgiLCJ1bmlxdWVLZXlBcnJheSIsImNvbHVtbnMiLCJ1bnFDb2wiLCJ2YWwiLCJsZW5ndGgiLCJqb2luIiwiZmlsdGVyIiwiaXNSZXVzZWQiLCJ1bmlxdWVLZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJyb3dLZXkiLCJyb3dWYWx1ZSIsInVzZSIsImFkZCIsIkRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaCIsInJlc3VsdCIsInQiLCJpc1V1aWRSZXVzZWQiLCJ1cHNlcnQiLCJ3ZGIiLCJvcHRpb25zT3JDaHVua1NpemUiLCJvcHRpb25zIiwiY2h1bmtTaXplIiwidXBzZXJ0T3JJbnNlcnQiLCJpbnNlcnRPbmx5IiwibW9kZSIsIkVycm9yIiwic29tZSIsInZhbHVlIiwicmVmVGFibGVzIiwiQXJyYXkiLCJmcm9tIiwicmVkdWNlIiwiciIsInJlZmVyZW5jZSIsInZhbHVlcyIsImZpbmQiLCJyZWYiLCJpbmNsdWRlcyIsImV4dHJhY3RGaWVsZHMiLCJzcGxpdCIsImxldmVscyIsImhhc0NpcmN1bGFyIiwiYnVpbGRJbnNlcnRMZXZlbHMiLCJ1dWlkTWFwIiwiYWxsSWRzIiwibGV2ZWxSb3dzIiwicmVzb2x2ZWRSb3dzIiwicmVzb2x2ZWQiLCJrZXkiLCJwYXJlbnQiLCJ0byIsImxldmVsQ2h1bmtzIiwic2VsZWN0RmllbGRzIiwiZGF0YUNodW5rIiwib3JpZ2luYWxVdWlkcyIsImRhdGFGb3JEYiIsInJlc3QiLCJyZXN1bHRSb3dzIiwiaW5zZXJ0IiwiaW50byIsInJldHVybmluZyIsImNvbmZsaWN0Q29sdW1ucyIsInVwZGF0ZUNvbHVtbnMiLCJrZXlzIiwiY29sIiwibWVyZ2VDb2x1bW5zIiwib25Db25mbGljdCIsIm1lcmdlIiwiaSIsImlkIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInJlc29sdmVkVmFsdWUiLCJjbGVhbk9ycGhhbnMiLCJma0NvbHVtbnMiLCJma0NvbmRpdGlvbnMiLCJma0NvbCIsImZrVmFsdWVzIiwidiIsImNvbHVtbiIsImV2ZXJ5IiwiZmMiLCJkZWxldGVRdWVyeSIsIndoZXJlSW4iLCJ3aGVyZU5vdEluIiwiZGVsZXRlZENvdW50IiwiZGVsZXRlIiwiY2xlYXIiLCJyb3dDb3VudCIsInJldHVybmVkSWRzIiwidXBkYXRlQmF0Y2giLCJ3aGVyZSIsIndoZXJlQ29sdW1ucyIsIl9yb3ciLCJfIiwiaGFzU2VsZlJlZiIsImZsYXRNYXAiLCJyb3dCeVV1aWQiLCJwZW5kaW5nIiwiaW5zZXJ0ZWQiLCJjdXJyZW50TGV2ZWwiLCJuZXh0UGVuZGluZyIsInNlbGZSZWZzIiwiY2FuSW5zZXJ0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUVwQyxTQUFTQyxPQUFPLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBQzFDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUN2QyxTQUFTQyxhQUFhLEVBQUVDLEtBQUssRUFBRUMsV0FBVyxRQUFRLG9CQUFpQjtBQUNuRSxTQUFTQyxXQUFXLFFBQXdCLHFCQUFrQjtBQWlCOUQsT0FBTyxTQUFTQyxXQUFXQyxLQUFjO0lBQ3ZDLE9BQ0VBLFVBQVVDLGFBQ1ZELFVBQVUsUUFDVixBQUFDQSxPQUFpQkUsT0FBT0QsYUFDekIsQUFBQ0QsT0FBaUJHLFNBQVNGO0FBRS9CO0FBRUEsT0FBTyxNQUFNRztJQUNYQyxPQUErQjtJQUMvQixhQUFjO1FBQ1osSUFBSSxDQUFDQSxNQUFNLEdBQUcsSUFBSUM7SUFDcEI7SUFFQUMsU0FBU0MsU0FBaUIsRUFBYTtRQUNyQyxNQUFNQyxRQUFRLElBQUksQ0FBQ0osTUFBTSxDQUFDSyxHQUFHLENBQUNGO1FBQzlCLElBQUlDLE9BQU87WUFDVCxPQUFPQTtRQUNUO1FBRUEsTUFBTUUsWUFBWSxBQUFDLENBQUE7WUFDakIsSUFBSTtnQkFDRixPQUFPbEIsY0FBY21CLFlBQVksQ0FBQ0o7WUFDcEMsRUFBRSxPQUFNO2dCQUNOLE9BQU87WUFDVDtRQUNGLENBQUE7UUFFQSxNQUFNSyxZQUFZO1lBQ2hCQyxZQUFZLElBQUlDO1lBQ2hCQyxNQUFNLEVBQUU7WUFDUkMsZUFBZU4sV0FBV00saUJBQWlCLEVBQUU7WUFDN0NDLFlBQVksSUFBSVo7UUFDbEI7UUFDQSxJQUFJLENBQUNELE1BQU0sQ0FBQ2MsR0FBRyxDQUFDWCxXQUFXSztRQUMzQixPQUFPQTtJQUNUO0lBRUFPLFNBQVNaLFNBQWlCLEVBQVc7UUFDbkMsT0FBTyxJ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
393
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cywgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIEVudGl0eUluZGV4IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkLCBjaHVuaywgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlLCB0eXBlIFJvd1dpdGhJZCB9IGZyb20gXCIuL19iYXRjaF91cGRhdGVcIjtcbmltcG9ydCB0eXBlIHsgRm9yZWlnbktleUNvbHVtbnMsIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuLyoqXG4gKiBGSyDtg4DsnoUg7LaU66Gg7J2EIOychO2VtCBEYXRhYmFzZUZvcmVpZ25LZXlzIGV4cG9ydFxuICogKG1vZHVsZSBhdWdtZW50YXRpb24g7J6Q64+ZIOuhnOuTnCDrs7TsnqUpXG4gKi9cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cyB9O1xuXG4vLyDthYzsnbTruJQg642w7J207YSwIO2DgOyehVxudHlwZSBUYWJsZURhdGEgPSB7XG4gIHJlZmVyZW5jZXM6IFNldDxzdHJpbmc+O1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICB1bmlxdWVJbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLy8g7LC47KGwIO2VhOuTnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5cbi8vIHVwc2VydCDsmLXshZhcbmV4cG9ydCB0eXBlIFVwc2VydE9wdGlvbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlPiB8IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXTtcbn07XG5cbi8vIGluc2VydE9ubHkg7Ji17IWYXG5leHBvcnQgdHlwZSBJbnNlcnRPbmx5T3B0aW9ucyA9IHtcbiAgY2h1bmtTaXplPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmRmllbGQoZmllbGQ6IHVua25vd24pOiBmaWVsZCBpcyBVQlJlZiB7XG4gIHJldHVybiAoXG4gICAgZmllbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGZpZWxkICE9PSBudWxsICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8ub2YgIT09IHVuZGVmaW5lZCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/LnV1aWQgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZXJ0QnVpbGRlciB7XG4gIHRhYmxlczogTWFwPHN0cmluZywgVGFibGVEYXRhPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWJsZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlRGF0YSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZVNwZWMgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHtcbiAgICAgIHJlZmVyZW5jZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgcm93czogW10sXG4gICAgICB1bmlxdWVJbmRleGVzOiB0YWJsZVNwZWM/LnVuaXF1ZUluZGV4ZXMgPz8gW10sXG4gICAgICB1bmlxdWVzTWFwOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIH07XG4gICAgdGhpcy50YWJsZXMuc2V0KHRhYmxlTmFtZSwgdGFibGVEYXRhKTtcbiAgICByZXR1cm4gdGFibGVEYXRhO1xuICB9XG5cbiAgaGFzVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXMuaGFzKHRhYmxlTmFtZSk7XG4gIH1cblxuICByZWdpc3RlcjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICByb3c6IHtcbiAgICAgIFtrZXkgaW4gVF0/OiBVQlJlZiB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBudWxsIHwgb2JqZWN0IHwgdW5rbm93bjtcbiAgICB9LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIHVuaXF1ZSDsnbjrjbHsiqTrpbwg7Iic7ZqM7ZWY66mwIO2CpCDsg53shLFcbiAgICBjb25zdCB1bmlxdWVLZXlzID0gdGFibGUudW5pcXVlSW5kZXhlc1xuICAgICAgLm1hcCgodW5xSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5pcXVlS2V5QXJyYXkgPSB1bnFJbmRleC5jb2x1bW5zLm1hcCgodW5xQ29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93W3VucUNvbC5uYW1lIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XSA/PyByYW5kb21VVUlEKCk7IC8vIG51bGxhYmxl7J24IOqyveyasCB1dWlk66GcIOuenOuNpOqwkiDsgr3snoVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOqwkuydtCDrqqjrkZAgbnVsbOyduCDqsr3smrAg7YKkIOyDneyEsSDtjKjsiqRcbiAgICAgICAgaWYgKHVuaXF1ZUtleUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlxdWVLZXlBcnJheS5qb2luKFwiLS0tZGVsaW1pdGVyLS1cIik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAvLyB1dWlkIOyDneyEsSDroZzsp4FcbiAgICBjb25zdCB7IHV1aWQsIGlzUmV1c2VkIH0gPSAoKCkgPT4ge1xuICAgICAgLy8g7YKk66W8IOyInO2ajO2VmOyXrCDsnbTrr7gg7KG07J6s7ZWY64qUIO2CpOqwgCDsnojripTsp4Ag7ZmV7J24XG4gICAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgICBpZiAodGFibGUudW5pcXVlc01hcC5oYXModW5pcXVlS2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdXVpZDogYXNzZXJ0RGVmaW5lZCh0YWJsZS51bmlxdWVzTWFwLmdldCh1bmlxdWVLZXkpLCBcIlVuaXF1ZSBrZXkgbm90IGZvdW5kXCIpLFxuICAgICAgICAgICAgICBpc1JldXNlZDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOywvuydhCDsiJgg7JeG64qUIOqyveyasCDsg53shLFcbiAgICAgIHJldHVybiB7IHV1aWQ6IHJhbmRvbVVVSUQoKSwgaXNSZXVzZWQ6IGZhbHNlIH07XG4gICAgfSkoKTtcblxuICAgIC8vIOuqqOuToCDsnKDri4jtgaztgqTsl5Ag64yA7ZW0IOycoOuLiO2BrOunteyXkCB1dWlkIOyggOyepVxuICAgIGlmICh1bmlxdWVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgdGFibGUudW5pcXVlc01hcC5zZXQodW5pcXVlS2V5LCB1dWlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsnbQg7YWM7J2067iU7JeQIOyCrOyaqeuQnCBSZWZGaWVsZOulvCDsiJztmoztlZjsl6wsIO2YhOyerCDthYzsnbTruJQg7KCV67O07JeQIOyWtOuWpCDtlYTrk5zrpbwg7LC47KGw7ZWY64qU7KeAIOy2lOqwgFxuICAgIC8vIOydtCDsoJXrs7Trpbwg64KY7KSR7JeQIOy5mO2ZmO2VoCDrlYwg7IKs7JqpXG4gICAgcm93ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5tYXAoKFtyb3dLZXksIHJvd1ZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWZGaWVsZChyb3dWYWx1ZSkpIHtcbiAgICAgICAgICByb3dWYWx1ZS51c2UgPz89IFwiaWRcIjtcbiAgICAgICAgICB0YWJsZS5yZWZlcmVuY2VzLmFkZChgJHtyb3dWYWx1ZS5vZn0uJHtyb3dWYWx1ZS51c2V9YCk7XG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIShyb3dWYWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgLy8gb2JqZWN07J24IOqyveyasCBKU09O7Jy866GcIOuzgO2ZmFxuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBKU09OLnN0cmluZ2lmeShyb3dWYWx1ZSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICkgYXMgeyBba2V5IGluIFRdPzogdW5rbm93biB9O1xuXG4gICAgdGFibGUucm93cy5wdXNoKHtcbiAgICAgIHV1aWQsXG4gICAgICAuLi5yb3csXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFVCUmVmID0ge1xuICAgICAgb2Y6IHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IChyb3cgYXMgeyB1dWlkPzogc3RyaW5nIH0pLnV1aWQgPz8gdXVpZCxcbiAgICB9O1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItcmVnaXN0ZXJcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgdXVpZDogcmVzdWx0LnV1aWQsXG4gICAgICBpc1V1aWRSZXVzZWQ6IGlzUmV1c2VkLFxuICAgICAgcm93LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydE9ubHk8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPbmx5T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydE9ySW5zZXJ0PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBtb2RlOiBcInVwc2VydFwiIHwgXCJpbnNlcnRcIixcbiAgICBvcHRpb25zPzogVXBzZXJ0T3B0aW9uczxUVGFibGU+LFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cHNlcnQg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IO2VoCDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhYmxlLnJvd3Muc29tZSgocm93KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyb3cpLnNvbWUoKFssIHZhbHVlXSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgIT09IHRhYmxlTmFtZSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfSDtlbTqsrDrkJjsp4Ag7JWK7J2AIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IO2FjOydtOu4lCDsiJztmoztlZjsl6wg7ZiE7J6sIO2FjOydtOu4lCDssLjsobDtlZjripQg66qo65OgIO2FjOydtOu4lCDstpTstpxcbiAgICBjb25zdCB7IHJlZmVyZW5jZXMsIHJlZlRhYmxlcyB9ID0gQXJyYXkuZnJvbSh0aGlzLnRhYmxlcykucmVkdWNlKFxuICAgICAgKHIsIFssIHRhYmxlXSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSBBcnJheS5mcm9tKHRhYmxlLnJlZmVyZW5jZXMudmFsdWVzKCkpLmZpbmQoKHJlZikgPT5cbiAgICAgICAgICByZWYuaW5jbHVkZXMoYCR7dGFibGVOYW1lfS5gKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICAgIHIucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgci5yZWZUYWJsZXMucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlZmVyZW5jZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByZWZUYWJsZXM6IFtdIGFzIFRhYmxlRGF0YVtdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGV4dHJhY3RGaWVsZHMgPSB1bmlxdWUocmVmZXJlbmNlcylcbiAgICAgIC5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKVsxXSlcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8g7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OEIOq3uOujue2ZlCAo7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQgTGV2ZWwgMCDtlZjrgpgpXG4gICAgY29uc3QgeyBsZXZlbHMsIGhhc0NpcmN1bGFyIH0gPSB0aGlzLmJ1aWxkSW5zZXJ0TGV2ZWxzKHRhYmxlLnJvd3MsIHRhYmxlTmFtZSk7XG5cbiAgICBpZiAoaGFzQ2lyY3VsYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIOyInO2ZmCDsnpDquLAg7LC47KGw6rCAIOyeiOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBvcHRpb25zPy5jaHVua1NpemU7XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcImlkXCIsIC4uLmV4dHJhY3RGaWVsZHNdKTtcblxuICAgICAgZm9yIChjb25zdCBkYXRhQ2h1bmsgb2YgbGV2ZWxDaHVua3MpIHtcbiAgICAgICAgaWYgKGRhdGFDaHVuay5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHV1aWTrpbwg67OE64+E66GcIOuztOq0gO2VmOqzoCwgRELsl5Ag7KCA7J6l7ZWgIOuNsOydtO2EsOyXkOyEnCDsoJzqsbBcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxVdWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCBkYXRhRm9yRGIgPSBkYXRhQ2h1bmsubWFwKCh7IHV1aWQsIC4uLnJlc3QgfSkgPT4gcmVzdCk7XG5cbiAgICAgICAgbGV0IHJlc3VsdFJvd3M6IHsgaWQ6IG51bWJlcjsgW2tleTogc3RyaW5nXTogdW5rbm93biB9W107XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IFwiaW5zZXJ0XCIpIHtcbiAgICAgICAgICAvLyBJTlNFUlQg66qo65OcIC0gUkVUVVJOSU5HIOyCrOyaqVxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGIuaW5zZXJ0KGRhdGFGb3JEYikuaW50byh0YWJsZU5hbWUpLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVQU0VSVCDrqqjrk5wgLSBvbkNvbmZsaWN0IOyCrOyaqSAodW5pcXVlIGluZGV4IOyXhuycvOuptCBQSyBmYWxsYmFjaylcbiAgICAgICAgICBjb25zdCBjb25mbGljdENvbHVtbnMgPVxuICAgICAgICAgICAgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKVxuICAgICAgICAgICAgICA6IFtcImlkXCJdO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+ICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPiAwID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpXG4gICAgICAgID8gKGNsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W10pXG4gICAgICAgIDogW2NsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+XTtcblxuICAgICAgLy8g7ZiE7J6sIHJlZ2lzdGVy65CcIOugiOy9lOuTnOuTpOydmCBGSyDqsJLrk6Qg7LaU7LacXG4gICAgICBjb25zdCBma0NvbmRpdGlvbnMgPSBma0NvbHVtbnMubWFwKChma0NvbCkgPT4ge1xuICAgICAgICBjb25zdCBma1ZhbHVlcyA9IFsuLi5uZXcgU2V0KHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvd1tma0NvbF0pLmZpbHRlcigodikgPT4gdiAhPSBudWxsKSldO1xuICAgICAgICByZXR1cm4geyBjb2x1bW46IGZrQ29sLCB2YWx1ZXM6IGZrVmFsdWVzIH07XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo65OgIEZLIOy7rOufvOyXkCDqsJLsnbQg7J6I64qUIOqyveyasOyXkOunjCDsgq3soJwg7Iuk7ZaJXG4gICAgICBpZiAoZmtDb25kaXRpb25zLmV2ZXJ5KChmYykgPT4gZmMudmFsdWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGxldCBkZWxldGVRdWVyeSA9IHdkYih0YWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIOqwgSBGSyDsu6zrn7zsl5Ag64yA7ZWcIFdIRVJFIElOIOyhsOqxtCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCB7IGNvbHVtbiwgdmFsdWVzIH0gb2YgZmtDb25kaXRpb25zKSB7XG4gICAgICAgICAgZGVsZXRlUXVlcnkgPSBkZWxldGVRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuwqeq4iCB1cHNlcnTtlZwgSUTripQg7KCc7Jm4XG4gICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVOb3RJbihcImlkXCIsIGFsbElkcyk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZENvdW50ID0gYXdhaXQgZGVsZXRlUXVlcnkuZGVsZXRlKCk7XG5cbiAgICAgICAgTmFpdGUudChcInB1cmk6dWItY2xlYW4tb3JwaGFuc1wiLCB7XG4gICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgIGNsZWFuT3JwaGFuczogZmtDb2x1bW5zLFxuICAgICAgICAgIGRlbGV0ZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCDrjbDsnbTthLAg7LSI6riw7ZmUXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi11cHNlcnRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgcm93Q291bnQ6IGFsbElkcy5sZW5ndGgsXG4gICAgICByZXR1cm5lZElkczogYWxsSWRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbElkcztcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUJhdGNoKFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgY2h1bmtTaXplPzogbnVtYmVyO1xuICAgICAgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucz8uY2h1bmtTaXplID8/IDUwMCxcbiAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSA/PyBcImlkXCIsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrk7HroZ3rkJjsp4Ag7JWK7J2AIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBkYXRlQmF0Y2gg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy53aGVyZSkgPyBvcHRpb25zLndoZXJlIDogW29wdGlvbnMud2hlcmUgPz8gXCJpZFwiXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucm93cy5tYXAoKF9yb3cpID0+IHtcbiAgICAgIGNvbnN0IHsgdXVpZDogXywgLi4ucm93IH0gPSBfcm93OyAvLyB1dWlkIOygnOyZuFxuICAgICAgcmV0dXJuIHJvdyBhcyBSb3dXaXRoSWQ8c3RyaW5nPjtcbiAgICB9KTtcblxuICAgIGF3YWl0IGJhdGNoVXBkYXRlKHdkYiwgdGFibGVOYW1lLCB3aGVyZUNvbHVtbnMsIHJvd3MsIG9wdGlvbnMuY2h1bmtTaXplKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgd2hlcmVDb2x1bW5zLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlQmF0Y2gg7JmE66OMIO2bhCDsspjrpqzrkJwg642w7J207YSwIOygnOqxsFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJpc0FycmF5IiwidW5pcXVlIiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiYXNzZXJ0RGVmaW5lZCIsImNodW5rIiwibm9uTnVsbGFibGUiLCJiYXRjaFVwZGF0ZSIsImlzUmVmRmllbGQiLCJmaWVsZCIsInVuZGVmaW5lZCIsIm9mIiwidXVpZCIsIlVwc2VydEJ1aWxkZXIiLCJ0YWJsZXMiLCJNYXAiLCJnZXRUYWJsZSIsInRhYmxlTmFtZSIsInRhYmxlIiwiZ2V0IiwidGFibGVTcGVjIiwiZ2V0VGFibGVTcGVjIiwidGFibGVEYXRhIiwicmVmZXJlbmNlcyIsIlNldCIsInJvd3MiLCJ1bmlxdWVJbmRleGVzIiwidW5pcXVlc01hcCIsInNldCIsImhhc1RhYmxlIiwiaGFzIiwicmVnaXN0ZXIiLCJyb3ciLCJ1bmlxdWVLZXlzIiwibWFwIiwidW5xSW5kZXgiLCJ1bmlxdWVLZXlBcnJheSIsImNvbHVtbnMiLCJ1bnFDb2wiLCJ2YWwiLCJuYW1lIiwibGVuZ3RoIiwiam9pbiIsImZpbHRlciIsImlzUmV1c2VkIiwidW5pcXVlS2V5IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwicm93S2V5Iiwicm93VmFsdWUiLCJ1c2UiLCJhZGQiLCJEYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2giLCJyZXN1bHQiLCJ0IiwiaXNVdWlkUmV1c2VkIiwidXBzZXJ0Iiwid2RiIiwib3B0aW9ucyIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJjaHVua1NpemUiLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsIm9yaWdpbmFsVXVpZHMiLCJkYXRhRm9yRGIiLCJyZXN0IiwicmVzdWx0Um93cyIsImluc2VydCIsImludG8iLCJyZXR1cm5pbmciLCJjb25mbGljdENvbHVtbnMiLCJjIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJtZXJnZUNvbHVtbnMiLCJvbkNvbmZsaWN0IiwibWVyZ2UiLCJpIiwiaWQiLCJwcm9wIiwiY29uc29sZSIsImVycm9yIiwicmVzb2x2ZWRWYWx1ZSIsImNsZWFuT3JwaGFucyIsImZrQ29sdW1ucyIsImZrQ29uZGl0aW9ucyIsImZrQ29sIiwiZmtWYWx1ZXMiLCJ2IiwiY29sdW1uIiwiZXZlcnkiLCJmYyIsImRlbGV0ZVF1ZXJ5Iiwid2hlcmVJbiIsIndoZXJlTm90SW4iLCJkZWxldGVkQ291bnQiLCJkZWxldGUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIndoZXJlIiwid2hlcmVDb2x1bW5zIiwiX3JvdyIsIl8iLCJoYXNTZWxmUmVmIiwiZmxhdE1hcCIsInJvd0J5VXVpZCIsInBlbmRpbmciLCJpbnNlcnRlZCIsImN1cnJlbnRMZXZlbCIsIm5leHRQZW5kaW5nIiwic2VsZlJlZnMiLCJjYW5JbnNlcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBRXBDLFNBQVNDLE9BQU8sRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBRXZDLFNBQVNDLGFBQWEsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLFFBQVEsb0JBQWlCO0FBQ25FLFNBQVNDLFdBQVcsUUFBd0IscUJBQWtCO0FBbUM5RCxPQUFPLFNBQVNDLFdBQVdDLEtBQWM7SUFDdkMsT0FDRUEsVUFBVUMsYUFDVkQsVUFBVSxRQUNWLEFBQUNBLE9BQWlCRSxPQUFPRCxhQUN6QixBQUFDRCxPQUFpQkcsU0FBU0Y7QUFFL0I7QUFFQSxPQUFPLE1BQU1HO0lBQ1hDLE9BQStCO0lBQy9CLGFBQWM7UUFDWixJQUFJLENBQUNBLE1BQU0sR0FBRyxJQUFJQztJQUNwQjtJQUVBQyxTQUFTQyxTQUFpQixFQUFhO1FBQ3JDLE1BQU1DLFFBQVEsSUFBSSxDQUFDSixNQUFNLENBQUNLLEdBQUcsQ0FBQ0Y7UUFDOUIsSUFBSUMsT0FBTztZQUNULE9BQU9BO1FBQ1Q7UUFFQSxNQUFNRSxZ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