velocious 1.0.263 → 1.0.265

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 (389) hide show
  1. package/README.md +14 -0
  2. package/build/bin/velocious.js +7 -2
  3. package/build/src/application.d.ts +6 -6
  4. package/build/src/application.d.ts.map +1 -1
  5. package/build/src/authorization/ability.d.ts +4 -4
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/base-resource.d.ts +4 -4
  8. package/build/src/authorization/base-resource.d.ts.map +1 -1
  9. package/build/src/background-jobs/client.d.ts +2 -2
  10. package/build/src/background-jobs/client.d.ts.map +1 -1
  11. package/build/src/background-jobs/job-runner.d.ts +2 -2
  12. package/build/src/background-jobs/job-runner.d.ts.map +1 -1
  13. package/build/src/background-jobs/job-runner.js +5 -3
  14. package/build/src/background-jobs/job.d.ts +1 -1
  15. package/build/src/background-jobs/job.d.ts.map +1 -1
  16. package/build/src/background-jobs/json-socket.d.ts +1 -1
  17. package/build/src/background-jobs/json-socket.d.ts.map +1 -1
  18. package/build/src/background-jobs/main.d.ts +34 -12
  19. package/build/src/background-jobs/main.d.ts.map +1 -1
  20. package/build/src/background-jobs/main.js +36 -6
  21. package/build/src/background-jobs/scheduler.d.ts +21 -0
  22. package/build/src/background-jobs/scheduler.d.ts.map +1 -1
  23. package/build/src/background-jobs/scheduler.js +3 -2
  24. package/build/src/background-jobs/status-reporter.d.ts +14 -10
  25. package/build/src/background-jobs/status-reporter.d.ts.map +1 -1
  26. package/build/src/background-jobs/status-reporter.js +11 -6
  27. package/build/src/background-jobs/store.d.ts +73 -117
  28. package/build/src/background-jobs/store.d.ts.map +1 -1
  29. package/build/src/background-jobs/store.js +62 -24
  30. package/build/src/background-jobs/types.d.ts +175 -2
  31. package/build/src/background-jobs/types.d.ts.map +1 -1
  32. package/build/src/background-jobs/types.js +44 -1
  33. package/build/src/background-jobs/worker.d.ts +21 -17
  34. package/build/src/background-jobs/worker.d.ts.map +1 -1
  35. package/build/src/background-jobs/worker.js +30 -9
  36. package/build/src/cli/base-command.d.ts +5 -5
  37. package/build/src/cli/base-command.d.ts.map +1 -1
  38. package/build/src/cli/commands/db/create.d.ts.map +1 -1
  39. package/build/src/cli/commands/db/create.js +11 -3
  40. package/build/src/cli/commands/db/schema/load.d.ts +7 -0
  41. package/build/src/cli/commands/db/schema/load.d.ts.map +1 -0
  42. package/build/src/cli/commands/db/schema/load.js +9 -0
  43. package/build/src/cli/index.d.ts +25 -13
  44. package/build/src/cli/index.d.ts.map +1 -1
  45. package/build/src/cli/index.js +62 -4
  46. package/build/src/cli/use-browser-cli.d.ts +2 -2
  47. package/build/src/cli/use-browser-cli.d.ts.map +1 -1
  48. package/build/src/cli/use-browser-cli.js +4 -4
  49. package/build/src/configuration-types.d.ts +160 -136
  50. package/build/src/configuration-types.d.ts.map +1 -1
  51. package/build/src/configuration.d.ts +32 -31
  52. package/build/src/configuration.d.ts.map +1 -1
  53. package/build/src/configuration.js +6 -5
  54. package/build/src/controller.d.ts +14 -14
  55. package/build/src/controller.d.ts.map +1 -1
  56. package/build/src/controller.js +19 -8
  57. package/build/src/database/drivers/base-columns-index.d.ts +1 -1
  58. package/build/src/database/drivers/base-columns-index.d.ts.map +1 -1
  59. package/build/src/database/drivers/base.d.ts +15 -14
  60. package/build/src/database/drivers/base.d.ts.map +1 -1
  61. package/build/src/database/drivers/base.js +6 -3
  62. package/build/src/database/drivers/mssql/column.d.ts +1 -0
  63. package/build/src/database/drivers/mssql/column.d.ts.map +1 -1
  64. package/build/src/database/drivers/mssql/connect-connection.d.ts +1 -1
  65. package/build/src/database/drivers/mssql/connect-connection.d.ts.map +1 -1
  66. package/build/src/database/drivers/mssql/index.d.ts +4 -3
  67. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  68. package/build/src/database/drivers/mssql/index.js +8 -12
  69. package/build/src/database/drivers/mssql/table.d.ts +1 -0
  70. package/build/src/database/drivers/mssql/table.d.ts.map +1 -1
  71. package/build/src/database/drivers/mysql/column.d.ts +1 -0
  72. package/build/src/database/drivers/mysql/column.d.ts.map +1 -1
  73. package/build/src/database/drivers/mysql/index.d.ts +3 -2
  74. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  75. package/build/src/database/drivers/mysql/index.js +3 -1
  76. package/build/src/database/drivers/mysql/query.d.ts +1 -1
  77. package/build/src/database/drivers/mysql/query.d.ts.map +1 -1
  78. package/build/src/database/drivers/mysql/query.js +7 -5
  79. package/build/src/database/drivers/mysql/table.d.ts +1 -0
  80. package/build/src/database/drivers/mysql/table.d.ts.map +1 -1
  81. package/build/src/database/drivers/pgsql/column.d.ts +1 -0
  82. package/build/src/database/drivers/pgsql/column.d.ts.map +1 -1
  83. package/build/src/database/drivers/pgsql/index.d.ts +3 -2
  84. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  85. package/build/src/database/drivers/pgsql/index.js +3 -1
  86. package/build/src/database/drivers/pgsql/table.d.ts +1 -0
  87. package/build/src/database/drivers/pgsql/table.d.ts.map +1 -1
  88. package/build/src/database/drivers/sqlite/base.d.ts +9 -6
  89. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  90. package/build/src/database/drivers/sqlite/base.js +22 -6
  91. package/build/src/database/drivers/sqlite/column.d.ts +1 -0
  92. package/build/src/database/drivers/sqlite/column.d.ts.map +1 -1
  93. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts +2 -2
  94. package/build/src/database/drivers/sqlite/connection-sql-js.d.ts.map +1 -1
  95. package/build/src/database/drivers/sqlite/index.native.d.ts +1 -2
  96. package/build/src/database/drivers/sqlite/index.native.d.ts.map +1 -1
  97. package/build/src/database/drivers/sqlite/index.native.js +8 -3
  98. package/build/src/database/drivers/sqlite/index.web.d.ts +3 -2
  99. package/build/src/database/drivers/sqlite/index.web.d.ts.map +1 -1
  100. package/build/src/database/drivers/sqlite/index.web.js +5 -1
  101. package/build/src/database/drivers/sqlite/query.web.d.ts +1 -1
  102. package/build/src/database/drivers/sqlite/query.web.d.ts.map +1 -1
  103. package/build/src/database/drivers/sqlite/table.d.ts +2 -1
  104. package/build/src/database/drivers/sqlite/table.d.ts.map +1 -1
  105. package/build/src/database/drivers/sqlite/table.js +3 -2
  106. package/build/src/database/migration/index.d.ts +10 -10
  107. package/build/src/database/migration/index.d.ts.map +1 -1
  108. package/build/src/database/migrator/types.d.ts +1 -1
  109. package/build/src/database/migrator/types.d.ts.map +1 -1
  110. package/build/src/database/migrator.d.ts +1 -1
  111. package/build/src/database/migrator.d.ts.map +1 -1
  112. package/build/src/database/pool/async-tracked-multi-connection.d.ts +1 -0
  113. package/build/src/database/pool/async-tracked-multi-connection.d.ts.map +1 -1
  114. package/build/src/database/pool/async-tracked-multi-connection.js +12 -8
  115. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  116. package/build/src/database/pool/base-methods-forward.js +6 -4
  117. package/build/src/database/pool/base.d.ts +2 -1
  118. package/build/src/database/pool/base.d.ts.map +1 -1
  119. package/build/src/database/pool/base.js +6 -4
  120. package/build/src/database/pool/single-multi-use.d.ts +1 -1
  121. package/build/src/database/pool/single-multi-use.d.ts.map +1 -1
  122. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  123. package/build/src/database/query/alter-table-base.js +8 -4
  124. package/build/src/database/query/base.d.ts +1 -1
  125. package/build/src/database/query/base.d.ts.map +1 -1
  126. package/build/src/database/query/create-database-base.d.ts +2 -2
  127. package/build/src/database/query/create-database-base.d.ts.map +1 -1
  128. package/build/src/database/query/create-index-base.d.ts +6 -6
  129. package/build/src/database/query/create-index-base.d.ts.map +1 -1
  130. package/build/src/database/query/create-table-base.d.ts +3 -3
  131. package/build/src/database/query/create-table-base.d.ts.map +1 -1
  132. package/build/src/database/query/create-table-base.js +8 -4
  133. package/build/src/database/query/drop-table-base.d.ts +4 -4
  134. package/build/src/database/query/drop-table-base.d.ts.map +1 -1
  135. package/build/src/database/query/index.d.ts +16 -16
  136. package/build/src/database/query/index.d.ts.map +1 -1
  137. package/build/src/database/query/index.js +4 -4
  138. package/build/src/database/query/insert-base.d.ts +10 -10
  139. package/build/src/database/query/insert-base.d.ts.map +1 -1
  140. package/build/src/database/query/join-base.d.ts +1 -1
  141. package/build/src/database/query/join-base.d.ts.map +1 -1
  142. package/build/src/database/query/join-object.d.ts +1 -1
  143. package/build/src/database/query/join-object.d.ts.map +1 -1
  144. package/build/src/database/query/join-object.js +4 -1
  145. package/build/src/database/query/model-class-query.d.ts +11 -11
  146. package/build/src/database/query/model-class-query.d.ts.map +1 -1
  147. package/build/src/database/query/model-class-query.js +29 -18
  148. package/build/src/database/query/select-base.d.ts +1 -1
  149. package/build/src/database/query/select-base.d.ts.map +1 -1
  150. package/build/src/database/query/where-base.d.ts +1 -1
  151. package/build/src/database/query/where-base.d.ts.map +1 -1
  152. package/build/src/database/query/where-hash.d.ts +1 -0
  153. package/build/src/database/query/where-hash.d.ts.map +1 -1
  154. package/build/src/database/query/where-model-class-hash.d.ts +2 -1
  155. package/build/src/database/query/where-model-class-hash.d.ts.map +1 -1
  156. package/build/src/database/query/where-model-class-hash.js +15 -7
  157. package/build/src/database/query/where-not.d.ts +1 -0
  158. package/build/src/database/query/where-not.d.ts.map +1 -1
  159. package/build/src/database/query/where-plain.d.ts +1 -0
  160. package/build/src/database/query/where-plain.d.ts.map +1 -1
  161. package/build/src/database/query-parser/base-query-parser.d.ts +1 -1
  162. package/build/src/database/query-parser/base-query-parser.d.ts.map +1 -1
  163. package/build/src/database/record/attachments/download.d.ts +3 -3
  164. package/build/src/database/record/attachments/download.d.ts.map +1 -1
  165. package/build/src/database/record/attachments/handle.d.ts +2 -1
  166. package/build/src/database/record/attachments/handle.d.ts.map +1 -1
  167. package/build/src/database/record/attachments/handle.js +3 -2
  168. package/build/src/database/record/attachments/normalize-input.d.ts +4 -4
  169. package/build/src/database/record/attachments/normalize-input.d.ts.map +1 -1
  170. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts +1 -1
  171. package/build/src/database/record/attachments/storage-drivers/filesystem.d.ts.map +1 -1
  172. package/build/src/database/record/attachments/storage-drivers/native.d.ts +3 -3
  173. package/build/src/database/record/attachments/storage-drivers/native.d.ts.map +1 -1
  174. package/build/src/database/record/attachments/storage-drivers/s3.d.ts +2 -2
  175. package/build/src/database/record/attachments/storage-drivers/s3.d.ts.map +1 -1
  176. package/build/src/database/record/attachments/storage-drivers/s3.js +11 -3
  177. package/build/src/database/record/attachments/store.d.ts +3 -3
  178. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  179. package/build/src/database/record/attachments/store.js +3 -2
  180. package/build/src/database/record/index.d.ts +19 -19
  181. package/build/src/database/record/index.d.ts.map +1 -1
  182. package/build/src/database/record/index.js +53 -35
  183. package/build/src/database/record/instance-relationships/base.d.ts +10 -8
  184. package/build/src/database/record/instance-relationships/base.d.ts.map +1 -1
  185. package/build/src/database/record/instance-relationships/base.js +9 -5
  186. package/build/src/database/record/instance-relationships/belongs-to.d.ts +4 -4
  187. package/build/src/database/record/instance-relationships/belongs-to.d.ts.map +1 -1
  188. package/build/src/database/record/instance-relationships/belongs-to.js +9 -2
  189. package/build/src/database/record/instance-relationships/has-many.d.ts +4 -9
  190. package/build/src/database/record/instance-relationships/has-many.d.ts.map +1 -1
  191. package/build/src/database/record/instance-relationships/has-many.js +12 -8
  192. package/build/src/database/record/instance-relationships/has-one.d.ts +7 -14
  193. package/build/src/database/record/instance-relationships/has-one.d.ts.map +1 -1
  194. package/build/src/database/record/instance-relationships/has-one.js +11 -5
  195. package/build/src/database/record/relationships/base.d.ts +18 -18
  196. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  197. package/build/src/database/record/relationships/base.js +3 -3
  198. package/build/src/database/record/relationships/belongs-to.d.ts +1 -1
  199. package/build/src/database/record/relationships/belongs-to.d.ts.map +1 -1
  200. package/build/src/database/record/relationships/has-many.d.ts +1 -1
  201. package/build/src/database/record/relationships/has-many.d.ts.map +1 -1
  202. package/build/src/database/record/relationships/has-one.d.ts +1 -1
  203. package/build/src/database/record/relationships/has-one.d.ts.map +1 -1
  204. package/build/src/database/table-data/index.d.ts +1 -1
  205. package/build/src/database/table-data/index.d.ts.map +1 -1
  206. package/build/src/database/table-data/table-column.d.ts +12 -12
  207. package/build/src/database/table-data/table-column.d.ts.map +1 -1
  208. package/build/src/database/table-data/table-foreign-key.d.ts +4 -4
  209. package/build/src/database/table-data/table-foreign-key.d.ts.map +1 -1
  210. package/build/src/database/table-data/table-foreign-key.js +2 -2
  211. package/build/src/database/table-data/table-index.d.ts +3 -3
  212. package/build/src/database/table-data/table-index.d.ts.map +1 -1
  213. package/build/src/database/table-data/table-reference.d.ts +1 -1
  214. package/build/src/database/table-data/table-reference.d.ts.map +1 -1
  215. package/build/src/environment-handlers/base.d.ts +10 -5
  216. package/build/src/environment-handlers/base.d.ts.map +1 -1
  217. package/build/src/environment-handlers/base.js +10 -2
  218. package/build/src/environment-handlers/browser.d.ts +5 -26
  219. package/build/src/environment-handlers/browser.d.ts.map +1 -1
  220. package/build/src/environment-handlers/browser.js +14 -4
  221. package/build/src/environment-handlers/node/cli/commands/console.js +3 -3
  222. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts +24 -0
  223. package/build/src/environment-handlers/node/cli/commands/db/schema/load.d.ts.map +1 -0
  224. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -0
  225. package/build/src/environment-handlers/node/cli/commands/db/seed.d.ts.map +1 -1
  226. package/build/src/environment-handlers/node/cli/commands/db/seed.js +4 -2
  227. package/build/src/environment-handlers/node/cli/commands/destroy/migration.d.ts.map +1 -1
  228. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +4 -2
  229. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  230. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +9 -4
  231. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +1 -1
  232. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  233. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +9 -4
  234. package/build/src/environment-handlers/node/cli/commands/generate/migration.d.ts.map +1 -1
  235. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +4 -2
  236. package/build/src/environment-handlers/node/cli/commands/generate/model.d.ts.map +1 -1
  237. package/build/src/environment-handlers/node/cli/commands/generate/model.js +4 -2
  238. package/build/src/environment-handlers/node/cli/commands/routes.d.ts.map +1 -1
  239. package/build/src/environment-handlers/node/cli/commands/routes.js +3 -1
  240. package/build/src/environment-handlers/node/cli/commands/run-script.d.ts.map +1 -1
  241. package/build/src/environment-handlers/node/cli/commands/run-script.js +5 -3
  242. package/build/src/environment-handlers/node/cli/commands/runner.d.ts.map +1 -1
  243. package/build/src/environment-handlers/node/cli/commands/runner.js +5 -3
  244. package/build/src/environment-handlers/node/cli/commands/server.d.ts +3 -3
  245. package/build/src/environment-handlers/node/cli/commands/server.d.ts.map +1 -1
  246. package/build/src/environment-handlers/node/cli/commands/server.js +2 -2
  247. package/build/src/environment-handlers/node/cli/commands/test.js +2 -2
  248. package/build/src/environment-handlers/node.d.ts +9 -1
  249. package/build/src/environment-handlers/node.d.ts.map +1 -1
  250. package/build/src/environment-handlers/node.js +10 -2
  251. package/build/src/error-logger.d.ts.map +1 -1
  252. package/build/src/error-logger.js +1 -5
  253. package/build/src/frontend-model-controller.d.ts +17 -17
  254. package/build/src/frontend-model-controller.d.ts.map +1 -1
  255. package/build/src/frontend-model-controller.js +31 -12
  256. package/build/src/frontend-model-resource/base-resource.d.ts +14 -12
  257. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  258. package/build/src/frontend-model-resource/base-resource.js +16 -4
  259. package/build/src/frontend-models/base.d.ts +27 -20
  260. package/build/src/frontend-models/base.d.ts.map +1 -1
  261. package/build/src/frontend-models/base.js +31 -12
  262. package/build/src/frontend-models/query.d.ts +29 -8
  263. package/build/src/frontend-models/query.d.ts.map +1 -1
  264. package/build/src/frontend-models/query.js +18 -4
  265. package/build/src/http-client/index.d.ts +11 -11
  266. package/build/src/http-client/index.d.ts.map +1 -1
  267. package/build/src/http-client/request.d.ts +2 -2
  268. package/build/src/http-client/request.d.ts.map +1 -1
  269. package/build/src/http-client/response.d.ts +1 -1
  270. package/build/src/http-client/response.d.ts.map +1 -1
  271. package/build/src/http-client/websocket-client.d.ts +26 -12
  272. package/build/src/http-client/websocket-client.d.ts.map +1 -1
  273. package/build/src/http-client/websocket-client.js +26 -12
  274. package/build/src/http-server/client/index.d.ts +4 -4
  275. package/build/src/http-server/client/index.d.ts.map +1 -1
  276. package/build/src/http-server/client/index.js +17 -11
  277. package/build/src/http-server/client/params-to-object.d.ts.map +1 -1
  278. package/build/src/http-server/client/params-to-object.js +14 -11
  279. package/build/src/http-server/client/request-buffer/form-data-part.d.ts +15 -7
  280. package/build/src/http-server/client/request-buffer/form-data-part.d.ts.map +1 -1
  281. package/build/src/http-server/client/request-buffer/form-data-part.js +9 -1
  282. package/build/src/http-server/client/request-buffer/index.d.ts +15 -14
  283. package/build/src/http-server/client/request-buffer/index.d.ts.map +1 -1
  284. package/build/src/http-server/client/request-buffer/index.js +19 -7
  285. package/build/src/http-server/client/request-parser.d.ts +1 -1
  286. package/build/src/http-server/client/request-parser.d.ts.map +1 -1
  287. package/build/src/http-server/client/request-parser.js +2 -2
  288. package/build/src/http-server/client/request-runner.d.ts.map +1 -1
  289. package/build/src/http-server/client/request-runner.js +4 -2
  290. package/build/src/http-server/client/request.d.ts +3 -3
  291. package/build/src/http-server/client/request.d.ts.map +1 -1
  292. package/build/src/http-server/client/response.d.ts +4 -4
  293. package/build/src/http-server/client/response.d.ts.map +1 -1
  294. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts +2 -2
  295. package/build/src/http-server/client/uploaded-file/uploaded-file.d.ts.map +1 -1
  296. package/build/src/http-server/client/websocket-request.d.ts +22 -16
  297. package/build/src/http-server/client/websocket-request.d.ts.map +1 -1
  298. package/build/src/http-server/client/websocket-request.js +13 -5
  299. package/build/src/http-server/client/websocket-session.d.ts +52 -17
  300. package/build/src/http-server/client/websocket-session.d.ts.map +1 -1
  301. package/build/src/http-server/client/websocket-session.js +59 -10
  302. package/build/src/http-server/cookie.d.ts +17 -17
  303. package/build/src/http-server/cookie.d.ts.map +1 -1
  304. package/build/src/http-server/index.d.ts +4 -4
  305. package/build/src/http-server/index.d.ts.map +1 -1
  306. package/build/src/http-server/index.js +4 -4
  307. package/build/src/http-server/server-client.d.ts +3 -3
  308. package/build/src/http-server/server-client.d.ts.map +1 -1
  309. package/build/src/http-server/server-client.js +4 -4
  310. package/build/src/http-server/websocket-channel.d.ts +3 -3
  311. package/build/src/http-server/websocket-channel.d.ts.map +1 -1
  312. package/build/src/http-server/websocket-events-host.d.ts.map +1 -1
  313. package/build/src/http-server/websocket-events-host.js +6 -3
  314. package/build/src/http-server/websocket-events.d.ts +2 -2
  315. package/build/src/http-server/websocket-events.d.ts.map +1 -1
  316. package/build/src/http-server/websocket-events.js +3 -1
  317. package/build/src/http-server/worker-handler/index.d.ts +7 -7
  318. package/build/src/http-server/worker-handler/index.d.ts.map +1 -1
  319. package/build/src/http-server/worker-handler/index.js +16 -7
  320. package/build/src/http-server/worker-handler/worker-thread.d.ts +9 -9
  321. package/build/src/http-server/worker-handler/worker-thread.d.ts.map +1 -1
  322. package/build/src/http-server/worker-handler/worker-thread.js +23 -13
  323. package/build/src/logger/console-logger.d.ts +2 -2
  324. package/build/src/logger/console-logger.d.ts.map +1 -1
  325. package/build/src/logger/file-logger.d.ts +2 -2
  326. package/build/src/logger/file-logger.d.ts.map +1 -1
  327. package/build/src/logger/outputs/array-output.d.ts +1 -1
  328. package/build/src/logger/outputs/array-output.d.ts.map +1 -1
  329. package/build/src/logger/outputs/file-output.d.ts +8 -5
  330. package/build/src/logger/outputs/file-output.d.ts.map +1 -1
  331. package/build/src/logger/outputs/file-output.js +4 -1
  332. package/build/src/logger.d.ts +7 -7
  333. package/build/src/logger.d.ts.map +1 -1
  334. package/build/src/mailer/backends/smtp.d.ts +3 -3
  335. package/build/src/mailer/backends/smtp.d.ts.map +1 -1
  336. package/build/src/mailer/backends/smtp.js +3 -3
  337. package/build/src/mailer/base.d.ts +7 -7
  338. package/build/src/mailer/base.d.ts.map +1 -1
  339. package/build/src/mailer/base.js +3 -3
  340. package/build/src/plugins/sqljs-wasm-route.d.ts +2 -2
  341. package/build/src/plugins/sqljs-wasm-route.d.ts.map +1 -1
  342. package/build/src/routes/base-route.d.ts +2 -2
  343. package/build/src/routes/base-route.d.ts.map +1 -1
  344. package/build/src/routes/base-route.js +2 -2
  345. package/build/src/routes/get-route.d.ts +5 -0
  346. package/build/src/routes/get-route.d.ts.map +1 -1
  347. package/build/src/routes/namespace-route.d.ts +1 -1
  348. package/build/src/routes/plugin-routes.d.ts +2 -2
  349. package/build/src/routes/plugin-routes.d.ts.map +1 -1
  350. package/build/src/routes/post-route.d.ts +5 -0
  351. package/build/src/routes/post-route.d.ts.map +1 -1
  352. package/build/src/routes/resolver.d.ts +4 -2
  353. package/build/src/routes/resolver.d.ts.map +1 -1
  354. package/build/src/routes/resolver.js +7 -3
  355. package/build/src/routes/resource-route.d.ts +5 -0
  356. package/build/src/routes/resource-route.d.ts.map +1 -1
  357. package/build/src/routes/root-route.d.ts +5 -0
  358. package/build/src/routes/root-route.d.ts.map +1 -1
  359. package/build/src/testing/expect-to-change.d.ts +3 -3
  360. package/build/src/testing/expect-to-change.d.ts.map +1 -1
  361. package/build/src/testing/expect-utils.d.ts.map +1 -1
  362. package/build/src/testing/expect-utils.js +7 -5
  363. package/build/src/testing/expect.d.ts +1 -1
  364. package/build/src/testing/expect.d.ts.map +1 -1
  365. package/build/src/testing/request-client.d.ts +1 -1
  366. package/build/src/testing/request-client.d.ts.map +1 -1
  367. package/build/src/testing/test-files-finder.d.ts +1 -1
  368. package/build/src/testing/test-files-finder.d.ts.map +1 -1
  369. package/build/src/testing/test-runner.d.ts +57 -37
  370. package/build/src/testing/test-runner.d.ts.map +1 -1
  371. package/build/src/testing/test-runner.js +14 -3
  372. package/build/src/testing/test-suite-splitter.d.ts +1 -1
  373. package/build/src/testing/test-suite-splitter.d.ts.map +1 -1
  374. package/build/src/testing/test.d.ts +14 -6
  375. package/build/src/testing/test.d.ts.map +1 -1
  376. package/build/src/testing/test.js +14 -5
  377. package/build/src/utils/backtrace-cleaner.d.ts +2 -2
  378. package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
  379. package/build/src/utils/split-sql-statements.d.ts +7 -0
  380. package/build/src/utils/split-sql-statements.d.ts.map +1 -0
  381. package/build/src/utils/split-sql-statements.js +77 -0
  382. package/build/src/utils/with-tracked-stack-async-hooks.d.ts.map +1 -1
  383. package/build/src/utils/with-tracked-stack-async-hooks.js +5 -3
  384. package/build/src/utils/with-tracked-stack.d.ts.map +1 -1
  385. package/build/src/utils/with-tracked-stack.js +5 -3
  386. package/build/src/velocious-error.d.ts +4 -4
  387. package/build/src/velocious-error.d.ts.map +1 -1
  388. package/build/tsconfig.tsbuildinfo +1 -1
  389. package/package.json +10 -2
@@ -61,6 +61,8 @@ export default class DbGenerateModel extends BaseCommand {
61
61
  fileContent += ` getModelClass() { return /** @type {typeof ${modelNameCamelized}Base} */ (this.constructor) }\n\n`;
62
62
  }
63
63
  const table = await modelClass.connection().getTableByName(modelClass.tableName());
64
+ if (!table)
65
+ throw new Error(`Could not find table for model '${modelClass.name}'`);
64
66
  const columns = await table.getColumns();
65
67
  let methodsCount = 0;
66
68
  for (const column of columns) {
@@ -100,7 +102,7 @@ export default class DbGenerateModel extends BaseCommand {
100
102
  if (column) {
101
103
  translationJsdocType = this.jsDocTypeFromColumn(column);
102
104
  }
103
- if (translationJsdocType) {
105
+ if (translationJsdocType && column) {
104
106
  fileContent += `\n`;
105
107
  fileContent += " /**\n";
106
108
  fileContent += ` * @returns {${translationJsdocType}${column.getNull() ? " | null" : ""}}\n`;
@@ -118,7 +120,7 @@ export default class DbGenerateModel extends BaseCommand {
118
120
  methodsCount++;
119
121
  for (const locale of this.getConfiguration().getLocales()) {
120
122
  const localeMethodName = `${name}${inflection.camelize(locale)}`;
121
- if (translationJsdocType) {
123
+ if (translationJsdocType && column) {
122
124
  fileContent += `\n`;
123
125
  fileContent += " /**\n";
124
126
  fileContent += ` * @returns {${translationJsdocType}${column.getNull() ? " | null" : ""}}\n`;
@@ -143,7 +145,10 @@ export default class DbGenerateModel extends BaseCommand {
143
145
  fileName = "velocious/build/src/database/record/index.js";
144
146
  }
145
147
  else {
146
- fileName = inflection.dasherize(inflection.underscore(relationship.getTargetModelClass().name));
148
+ const targetModelClass = relationship.getTargetModelClass();
149
+ if (!targetModelClass)
150
+ throw new Error(`Relationship '${relationship.getRelationshipName()}' on '${modelClass.name}' has no target model class`);
151
+ fileName = inflection.dasherize(inflection.underscore(targetModelClass.name));
147
152
  fullFilePath = `src/models/${fileName}.js`;
148
153
  baseFilePath = `../model-bases/${fileName}.js`;
149
154
  baseFullFilePath = `src/model-bases/${fileName}.js`;
@@ -268,4 +273,4 @@ export default class DbGenerateModel extends BaseCommand {
268
273
  return this.jsDocTypeFromColumn(column);
269
274
  }
270
275
  }
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxVQUFVLE1BQU0scUNBQXFDLENBQUE7QUFDNUQsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBRXhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQ3RELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRWhELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUN0QyxNQUFNLFNBQVMsR0FBRyxHQUFHLGFBQWEsYUFBYSxDQUFBO1FBQy9DLE1BQU0sYUFBYSxHQUFHLEdBQUcsYUFBYSxrQkFBa0IsQ0FBQTtRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUM5RCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFFbkIsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGdC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Y2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZmlsZUV4aXN0cyBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vdXRpbHMvZmlsZS1leGlzdHMuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZU1vZGVsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmluaXRpYWxpemVNb2RlbHMoKVxuXG4gICAgY29uc3Qgcm9vdERpcmVjdG9yeSA9IHRoaXMuZGlyZWN0b3J5KClcbiAgICBjb25zdCBtb2RlbHNEaXIgPSBgJHtyb290RGlyZWN0b3J5fS9zcmMvbW9kZWxzYFxuICAgIGNvbnN0IGJhc2VNb2RlbHNEaXIgPSBgJHtyb290RGlyZWN0b3J5fS9zcmMvbW9kZWwtYmFzZXNgXG4gICAgY29uc3QgbW9kZWxDbGFzc2VzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TW9kZWxDbGFzc2VzKClcbiAgICBsZXQgZGV2TW9kZSA9IGZhbHNlXG5cbiAgICBpZiAoYmFzZU1vZGVsc0Rpci5pbmNsdWRlcyhcIi9zcGVjL2R1bW15L3NyYy9tb2RlbC1iYXNlc1wiKSkge1xuICAgICAgZGV2TW9kZSA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IGZpbGVFeGlzdHMoYmFzZU1vZGVsc0RpcikpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlyKGJhc2VNb2RlbHNEaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmVuc3VyZUNvbm5lY3Rpb25zKGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbW9kZWxDbGFzc05hbWUgaW4gbW9kZWxDbGFzc2VzKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSBtb2RlbENsYXNzZXNbbW9kZWxDbGFzc05hbWVdXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKG1vZGVsQ2xhc3NOYW1lKVxuICAgICAgICBjb25zdCBtb2RlbE5hbWVDYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpXG4gICAgICAgIGNvbnN0IG1vZGVsQmFzZUZpbGVOYW1lID0gYCR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1vZGVsTmFtZSkpfS5qc2BcbiAgICAgICAgY29uc3QgbW9kZWxQYXRoID0gYCR7YmFzZU1vZGVsc0Rpcn0vJHttb2RlbEJhc2VGaWxlTmFtZX1gXG5cbiAgICAgICAgY29uc29sZS5sb2coYGNyZWF0ZSBzcmMvbW9kZWwtYmFzZXMvJHttb2RlbEJhc2VGaWxlTmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoID0gYCR7bW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgbGV0IHNvdXJjZU1vZGVsRmlsZVBhdGhcblxuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhzb3VyY2VNb2RlbEZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gYC4uL21vZGVscy8ke21vZGVsQmFzZUZpbGVOYW1lfWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2VNb2RlbEZpbGVQYXRoID0gXCJ2ZWxvY2lvdXMvYnVpbGQvc3JjL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG4gICAgICAgIGxldCB2ZWxvY2lvdXNQYXRoXG5cbiAgICAgICAgaWYgKGRldk1vZGUpIHtcbiAgICAgICAgICB2ZWxvY2lvdXNQYXRoID0gXCIuLi8uLi8uLi8uLi9zcmNcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmNcIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYGltcG9ydCBEYXRhYmFzZVJlY29yZCBmcm9tIFwiJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxcblxcbmBcblxuICAgICAgICBjb25zdCBoYXNNYW55UmVsYXRpb25GaWxlUGF0aCA9IGAke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbnN0YW5jZS1yZWxhdGlvbnNoaXBzL2hhcy1tYW55LmpzYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGBleHBvcnQgZGVmYXVsdCBjbGFzcyAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlIGV4dGVuZHMgRGF0YWJhc2VSZWNvcmQge1xcbmBcblxuICAgICAgLy8gLS0tIGdldE1vZGVsQ2xhc3MoKSBvdmVycmlkZSAoZml4ZXMgcG9seW1vcnBoaWMgdHlwaW5nIGluIEpTL0pTRG9jKSAtLS1cbiAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAvLyBNb2RlbCBmaWxlIGV4aXN0cyAoZS5nLiBzcmMvbW9kZWxzL3RpY2tldC5qcykg4oaSIHJldHVybiB0eXBlb2YgVGlja2V0XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH1cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLy8gQHRzLWlnbm9yZSAtIG92ZXJyaWRlIG5hcnJvd3MgcmV0dXJuIHR5cGUgZm9yIGJldHRlciBJbnRlbGxpU2Vuc2UgaW4gZ2VuZXJhdGVkIG1vZGVsIGJhc2VzXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgZ2V0TW9kZWxDbGFzcygpIHsgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gKi8gKHRoaXMuY29uc3RydWN0b3IpIH1cXG5cXG5gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBtb2RlbCBmaWxlIHlldCDihpIgZmFsbCBiYWNrIHRvIHR5cGVvZiBUaWNrZXRCYXNlXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dHlwZW9mICR7bW9kZWxOYW1lQ2FtZWxpemVkfUJhc2V9XFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8vIEB0cy1pZ25vcmUgLSBvdmVycmlkZSBuYXJyb3dzIHJldHVybiB0eXBlIGZvciBiZXR0ZXIgSW50ZWxsaVNlbnNlIGluIGdlbmVyYXRlZCBtb2RlbCBiYXNlc1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGdldE1vZGVsQ2xhc3MoKSB7IHJldHVybiAvKiogQHR5cGUge3R5cGVvZiAke21vZGVsTmFtZUNhbWVsaXplZH1CYXNlfSAqLyAodGhpcy5jb25zdHJ1Y3RvcikgfVxcblxcbmBcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFibGUgPSBhd2FpdCBtb2RlbENsYXNzLmNvbm5lY3Rpb24oKS5nZXRUYWJsZUJ5TmFtZShtb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKVxuICAgICAgbGV0IG1ldGhvZHNDb3VudCA9IDBcblxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShjb2x1bW4uZ2V0TmFtZSgpLCB0cnVlKVxuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3QgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCkpXG4gICAgICAgIGNvbnN0IGpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pXG5cbiAgICAgICAgaWYgKG1ldGhvZHNDb3VudCA+IDApIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7anNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZShcIiR7Y2FtZWxpemVkQ29sdW1uTmFtZX1cIikgfVxcblxcbmBcblxuICAgICAgICBjb25zdCBzZXR0ZXJKc2RvY1R5cGUgPSB0aGlzLmpzRG9jU2V0dGVyVHlwZUZyb21Db2x1bW4oY29sdW1uKVxuXG4gICAgICAgIGlmIChzZXR0ZXJKc2RvY1R5cGUpIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVySnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3R9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRDb2x1bW5BdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIsIG5ld1ZhbHVlKSB9XFxuXFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge2Jvb2xlYW59XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGhhcyR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fSgpIHsgcmV0dXJuIHRoaXMuX2hhc0F0dHJpYnV0ZSh0aGlzLiR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSkgfVxcbmBcblxuICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IFRyYW5zbGF0aW9uQ2xhc3MgPSBtb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uQ2xhc3MoKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbkNvbHVtbnMgPSBUcmFuc2xhdGlvbkNsYXNzLmdldENvbHVtbnMoKVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShuYW1lKVxuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRyYW5zbGF0aW9uQ29sdW1ucy5maW5kKCh0cmFuc2xhdGlvbkNvbHVtbikgPT4gdHJhbnNsYXRpb25Db2x1bW4uZ2V0TmFtZSgpID09PSBuYW1lVW5kZXJzY29yZSlcbiAgICAgICAgICBsZXQgdHJhbnNsYXRpb25Kc2RvY1R5cGVcblxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uSnNkb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJhbnNsYXRpb25Kc2RvY1R5cGUpIHtcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske3RyYW5zbGF0aW9uSnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtuYW1lfSgpIHsgcmV0dXJuIHRoaXMuX2dldFRyYW5zbGF0ZWRBdHRyaWJ1dGVXaXRoRmFsbGJhY2soXCIke25hbWV9XCIsIHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKS5nZXRMb2NhbGUoKSkgPz8gbnVsbCB9XFxuYFxuICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG5cbiAgICAgICAgICBjb25zdCBoYXNOYW1lID0gYGhhcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShuYW1lKX1gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBhYnN0cmFjdFxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtoYXNOYW1lfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiJHtoYXNOYW1lfSBub3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcbiAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgZm9yIChjb25zdCBsb2NhbGUgb2YgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbGVNZXRob2ROYW1lID0gYCR7bmFtZX0ke2luZmxlY3Rpb24uY2FtZWxpemUobG9jYWxlKX1gXG5cbiAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbkpzZG9jVHlwZSkge1xuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7dHJhbnNsYXRpb25Kc2RvY1R5cGV9JHtjb2x1bW4uZ2V0TnVsbCgpID8gXCIgfCBudWxsXCIgOiBcIlwifX1cXG5gXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke2xvY2FsZU1ldGhvZE5hbWV9KCkgeyByZXR1cm4gdGhpcy5fZ2V0VHJhbnNsYXRlZEF0dHJpYnV0ZVdpdGhGYWxsYmFjayhcIiR7bmFtZX1cIiwgXCIke2xvY2FsZX1cIikgPz8gbnVsbCB9XFxuYFxuICAgICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgICAgY29uc3QgbG9jYWxlSGFzTmFtZSA9IGBoYXMke2luZmxlY3Rpb24uY2FtZWxpemUobG9jYWxlTWV0aG9kTmFtZSl9YFxuXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAYWJzdHJhY3RcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bG9jYWxlSGFzTmFtZX0oKSB7IHRocm93IG5ldyBFcnJvcihcIiR7bG9jYWxlSGFzTmFtZX0gbm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG4gICAgICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcHMoKSkge1xuICAgICAgICBsZXQgYmFzZUZpbGVQYXRoLCBiYXNlRnVsbEZpbGVQYXRoLCBmaWxlTmFtZSwgZnVsbEZpbGVQYXRoXG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRQb2x5bW9ycGhpYygpKSB7XG4gICAgICAgICAgZmlsZU5hbWUgPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShyZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpLm5hbWUpKVxuICAgICAgICAgIGZ1bGxGaWxlUGF0aCA9IGBzcmMvbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIGJhc2VGaWxlUGF0aCA9IGAuLi9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICBiYXNlRnVsbEZpbGVQYXRoID0gYHNyYy9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2RzQ291bnQgPiAwKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJiZWxvbmdzVG9cIiB8fCByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzT25lXCIpIHtcbiAgICAgICAgICBsZXQgbW9kZWxGaWxlUGF0aFxuXG4gICAgICAgICAgaWYgKGZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBgLi4vbW9kZWxzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSBpZiAoYmFzZUZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGJhc2VGdWxsRmlsZVBhdGgpKSB7XG4gICAgICAgICAgICBtb2RlbEZpbGVQYXRoID0gYmFzZUZpbGVQYXRoXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBidWlsZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oYXR0cmlidXRlcykgeyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGxvYWQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0ge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gbmV3TW9kZWxcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge3ZvaWR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0obmV3TW9kZWwpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xcbmBcbiAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpID09IFwiaGFzTWFueVwiKSB7XG4gICAgICAgICAgbGV0IHJlY29yZEltcG9ydFxuXG4gICAgICAgICAgaWYgKGZ1bGxGaWxlUGF0aCAmJiBhd2FpdCBmaWxlRXhpc3RzKGZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJlY29yZEltcG9ydCA9IGAuLi9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgfSBlbHNlIGlmIChiYXNlRnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoYmFzZUZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIHJlY29yZEltcG9ydCA9IGAuLi9tb2RlbC1iYXNlcy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYCR7dmVsb2Npb3VzUGF0aH0vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzYFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke2hhc01hbnlSZWxhdGlvbkZpbGVQYXRofVwiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIke3NvdXJjZU1vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHQsIHR5cGVvZiBpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fVxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9TG9hZGVkKCkgeyByZXR1cm4gLyoqIEB0eXBlIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShcIiR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1cIikubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgbG9hZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSBuZXdNb2RlbHNcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHt2b2lkfVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfShuZXdNb2RlbHMpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xcbmBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcmVsYXRpb25zaGlwIHR5cGU6ICR7cmVsYXRpb25zaGlwLmdldFR5cGUoKX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgbWV0aG9kc0NvdW50KytcbiAgICAgIH1cblxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCJ9XFxuXCJcblxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUobW9kZWxQYXRoLCBmaWxlQ29udGVudClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGpzIGRvYyB0eXBlIGZyb20gY29sdW1uLlxuICAgKi9cbiAganNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pIHtcbiAgICBjb25zdCB0eXBlID0gY29sdW1uLmdldFR5cGUoKVxuXG4gICAgaWYgKHR5cGUgPT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIlxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImpzb25cIikge1xuICAgICAgcmV0dXJuIFwiUmVjb3JkPHN0cmluZywgYW55PlwiXG4gICAgfSBlbHNlIGlmIChbXCJibG9iXCIsIFwiY2hhclwiLCBcIm52YXJjaGFyXCIsIFwidmFyY2hhclwiLCBcInRleHRcIiwgXCJsb25ndGV4dFwiLCBcInV1aWRcIiwgXCJjaGFyYWN0ZXIgdmFyeWluZ1wiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICB9IGVsc2UgaWYgKFtcImJpdFwiLCBcImJpZ2ludFwiLCBcImZsb2F0XCIsIFwiaW50XCIsIFwiaW50ZWdlclwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCJcbiAgICB9IGVsc2UgaWYgKFtcImRhdGVcIiwgXCJkYXRldGltZVwiLCBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwiRGF0ZVwiXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gY29sdW1uIHR5cGU6ICR7dHlwZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdH0gY29sdW1uIC0gQ29sdW1uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBqcyBkb2Mgc2V0dGVyIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqL1xuICBqc0RvY1NldHRlclR5cGVGcm9tQ29sdW1uKGNvbHVtbikge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAoW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJEYXRlIHwgc3RyaW5nXCJcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5qc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbilcbiAgfVxufVxuIl19
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvZW52aXJvbm1lbnQtaGFuZGxlcnMvbm9kZS9jbGkvY29tbWFuZHMvZ2VuZXJhdGUvYmFzZS1tb2RlbHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sb0NBQW9DLENBQUE7QUFDNUQsT0FBTyxVQUFVLE1BQU0scUNBQXFDLENBQUE7QUFDNUQsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBRXhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQ3RELEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRWhELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUN0QyxNQUFNLFNBQVMsR0FBRyxHQUFHLGFBQWEsYUFBYSxDQUFBO1FBQy9DLE1BQU0sYUFBYSxHQUFHLEdBQUcsYUFBYSxrQkFBa0IsQ0FBQTtRQUN4RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUM5RCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFFbkIsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7UUFDbEQsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGdC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QUMsT0FBTyxFQUFFLENBQUE7UUFFN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2RSxPQUFPLGVBQWUsQ0FBQTtRQUN4QixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDekMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2VDb21tYW5kIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jbGkvYmFzZS1jb21tYW5kLmpzXCJcbmltcG9ydCBmaWxlRXhpc3RzIGZyb20gXCIuLi8uLi8uLi8uLi8uLi91dGlscy9maWxlLWV4aXN0cy5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYkdlbmVyYXRlTW9kZWwgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuaW5pdGlhbGl6ZU1vZGVscygpXG5cbiAgICBjb25zdCByb290RGlyZWN0b3J5ID0gdGhpcy5kaXJlY3RvcnkoKVxuICAgIGNvbnN0IG1vZGVsc0RpciA9IGAke3Jvb3REaXJlY3Rvcnl9L3NyYy9tb2RlbHNgXG4gICAgY29uc3QgYmFzZU1vZGVsc0RpciA9IGAke3Jvb3REaXJlY3Rvcnl9L3NyYy9tb2RlbC1iYXNlc2BcbiAgICBjb25zdCBtb2RlbENsYXNzZXMgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzZXMoKVxuICAgIGxldCBkZXZNb2RlID0gZmFsc2VcblxuICAgIGlmIChiYXNlTW9kZWxzRGlyLmluY2x1ZGVzKFwiL3NwZWMvZHVtbXkvc3JjL21vZGVsLWJhc2VzXCIpKSB7XG4gICAgICBkZXZNb2RlID0gdHJ1ZVxuICAgIH1cblxuICAgIGlmICghYXdhaXQgZmlsZUV4aXN0cyhiYXNlTW9kZWxzRGlyKSkge1xuICAgICAgYXdhaXQgZnMubWtkaXIoYmFzZU1vZGVsc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZW5zdXJlQ29ubmVjdGlvbnMoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtb2RlbENsYXNzTmFtZSBpbiBtb2RlbENsYXNzZXMpIHtcbiAgICAgICAgY29uc3QgbW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3Nlc1ttb2RlbENsYXNzTmFtZV1cbiAgICAgICAgY29uc3QgbW9kZWxOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUobW9kZWxDbGFzc05hbWUpXG4gICAgICAgIGNvbnN0IG1vZGVsTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUobW9kZWxOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgbW9kZWxCYXNlRmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUobW9kZWxOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBtb2RlbFBhdGggPSBgJHtiYXNlTW9kZWxzRGlyfS8ke21vZGVsQmFzZUZpbGVOYW1lfWBcblxuICAgICAgICBjb25zb2xlLmxvZyhgY3JlYXRlIHNyYy9tb2RlbC1iYXNlcy8ke21vZGVsQmFzZUZpbGVOYW1lfWApXG5cbiAgICAgICAgY29uc3Qgc291cmNlTW9kZWxGdWxsRmlsZVBhdGggPSBgJHttb2RlbHNEaXJ9LyR7bW9kZWxCYXNlRmlsZU5hbWV9YFxuICAgICAgICBsZXQgc291cmNlTW9kZWxGaWxlUGF0aFxuXG4gICAgICAgIGlmIChhd2FpdCBmaWxlRXhpc3RzKHNvdXJjZU1vZGVsRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgIHNvdXJjZU1vZGVsRmlsZVBhdGggPSBgLi4vbW9kZWxzLyR7bW9kZWxCYXNlRmlsZU5hbWV9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZU1vZGVsRmlsZVBhdGggPSBcInZlbG9jaW91cy9idWlsZC9zcmMvZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmaWxlQ29udGVudCA9IFwiXCJcbiAgICAgICAgbGV0IHZlbG9jaW91c1BhdGhcblxuICAgICAgICBpZiAoZGV2TW9kZSkge1xuICAgICAgICAgIHZlbG9jaW91c1BhdGggPSBcIi4uLy4uLy4uLy4uL3NyY1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmVsb2Npb3VzUGF0aCA9IFwidmVsb2Npb3VzL2J1aWxkL3NyY1wiXG4gICAgICAgIH1cblxuICAgICAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IERhdGFiYXNlUmVjb3JkIGZyb20gXCIke3ZlbG9jaW91c1BhdGh9L2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiXFxuXFxuYFxuXG4gICAgICAgIGNvbnN0IGhhc01hbnlSZWxhdGlvbkZpbGVQYXRoID0gYCR7dmVsb2Npb3VzUGF0aH0vZGF0YWJhc2UvcmVjb3JkL2luc3RhbmNlLXJlbGF0aW9uc2hpcHMvaGFzLW1hbnkuanNgXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYGV4cG9ydCBkZWZhdWx0IGNsYXNzICR7bW9kZWxOYW1lQ2FtZWxpemVkfUJhc2UgZXh0ZW5kcyBEYXRhYmFzZVJlY29yZCB7XFxuYFxuXG4gICAgICAvLyAtLS0gZ2V0TW9kZWxDbGFzcygpIG92ZXJyaWRlIChmaXhlcyBwb2x5bW9ycGhpYyB0eXBpbmcgaW4gSlMvSlNEb2MpIC0tLVxuICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoc291cmNlTW9kZWxGdWxsRmlsZVBhdGgpKSB7XG4gICAgICAgIC8vIE1vZGVsIGZpbGUgZXhpc3RzIChlLmcuIHNyYy9tb2RlbHMvdGlja2V0LmpzKSDihpIgcmV0dXJuIHR5cGVvZiBUaWNrZXRcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fVxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvLyBAdHMtaWdub3JlIC0gb3ZlcnJpZGUgbmFycm93cyByZXR1cm4gdHlwZSBmb3IgYmV0dGVyIEludGVsbGlTZW5zZSBpbiBnZW5lcmF0ZWQgbW9kZWwgYmFzZXNcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBnZXRNb2RlbENsYXNzKCkgeyByZXR1cm4gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fSAqLyAodGhpcy5jb25zdHJ1Y3RvcikgfVxcblxcbmBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIG1vZGVsIGZpbGUgeWV0IOKGkiBmYWxsIGJhY2sgdG8gdHlwZW9mIFRpY2tldEJhc2VcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHt0eXBlb2YgJHttb2RlbE5hbWVDYW1lbGl6ZWR9QmFzZX1cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLy8gQHRzLWlnbm9yZSAtIG92ZXJyaWRlIG5hcnJvd3MgcmV0dXJuIHR5cGUgZm9yIGJldHRlciBJbnRlbGxpU2Vuc2UgaW4gZ2VuZXJhdGVkIG1vZGVsIGJhc2VzXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgZ2V0TW9kZWxDbGFzcygpIHsgcmV0dXJuIC8qKiBAdHlwZSB7dHlwZW9mICR7bW9kZWxOYW1lQ2FtZWxpemVkfUJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKSB9XFxuXFxuYFxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YWJsZSA9IGF3YWl0IG1vZGVsQ2xhc3MuY29ubmVjdGlvbigpLmdldFRhYmxlQnlOYW1lKG1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG5cbiAgICAgIGlmICghdGFibGUpIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgdGFibGUgZm9yIG1vZGVsICcke21vZGVsQ2xhc3MubmFtZX0nYClcblxuICAgICAgY29uc3QgY29sdW1ucyA9IGF3YWl0IHRhYmxlLmdldENvbHVtbnMoKVxuICAgICAgbGV0IG1ldGhvZHNDb3VudCA9IDBcblxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShjb2x1bW4uZ2V0TmFtZSgpLCB0cnVlKVxuICAgICAgICBjb25zdCBjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3QgPSBpbmZsZWN0aW9uLmNhbWVsaXplKGNvbHVtbi5nZXROYW1lKCkpXG4gICAgICAgIGNvbnN0IGpzZG9jVHlwZSA9IHRoaXMuanNEb2NUeXBlRnJvbUNvbHVtbihjb2x1bW4pXG5cbiAgICAgICAgaWYgKG1ldGhvZHNDb3VudCA+IDApIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoanNkb2NUeXBlKSB7XG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMgeyR7anNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtjYW1lbGl6ZWRDb2x1bW5OYW1lfSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZShcIiR7Y2FtZWxpemVkQ29sdW1uTmFtZX1cIikgfVxcblxcbmBcblxuICAgICAgICBjb25zdCBzZXR0ZXJKc2RvY1R5cGUgPSB0aGlzLmpzRG9jU2V0dGVyVHlwZUZyb21Db2x1bW4oY29sdW1uKVxuXG4gICAgICAgIGlmIChzZXR0ZXJKc2RvY1R5cGUpIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcGFyYW0geyR7c2V0dGVySnNkb2NUeXBlfSR7Y29sdW1uLmdldE51bGwoKSA/IFwiIHwgbnVsbFwiIDogXCJcIn19IG5ld1ZhbHVlXFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcmV0dXJucyB7dm9pZH1cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICB9XG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtjYW1lbGl6ZWRDb2x1bW5OYW1lQmlnRmlyc3R9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLl9zZXRDb2x1bW5BdHRyaWJ1dGUoXCIke2NhbWVsaXplZENvbHVtbk5hbWV9XCIsIG5ld1ZhbHVlKSB9XFxuXFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge2Jvb2xlYW59XFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGhhcyR7Y2FtZWxpemVkQ29sdW1uTmFtZUJpZ0ZpcnN0fSgpIHsgcmV0dXJuIHRoaXMuX2hhc0F0dHJpYnV0ZSh0aGlzLiR7Y2FtZWxpemVkQ29sdW1uTmFtZX0oKSkgfVxcbmBcblxuICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZWxDbGFzcy5fdHJhbnNsYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IFRyYW5zbGF0aW9uQ2xhc3MgPSBtb2RlbENsYXNzLmdldFRyYW5zbGF0aW9uQ2xhc3MoKVxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbkNvbHVtbnMgPSBUcmFuc2xhdGlvbkNsYXNzLmdldENvbHVtbnMoKVxuXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBtb2RlbENsYXNzLl90cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBuYW1lVW5kZXJzY29yZSA9IGluZmxlY3Rpb24udW5kZXJzY29yZShuYW1lKVxuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRyYW5zbGF0aW9uQ29sdW1ucy5maW5kKCh0cmFuc2xhdGlvbkNvbHVtbikgPT4gdHJhbnNsYXRpb25Db2x1bW4uZ2V0TmFtZSgpID09PSBuYW1lVW5kZXJzY29yZSlcbiAgICAgICAgICBsZXQgdHJhbnNsYXRpb25Kc2RvY1R5cGVcblxuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uSnNkb2NUeXBlID0gdGhpcy5qc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbilcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJhbnNsYXRpb25Kc2RvY1R5cGUgJiYgY29sdW1uKSB7XG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgXFxuYFxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0cmFuc2xhdGlvbkpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bmFtZX0oKSB7IHJldHVybiB0aGlzLl9nZXRUcmFuc2xhdGVkQXR0cmlidXRlV2l0aEZhbGxiYWNrKFwiJHtuYW1lfVwiLCB0aGlzLl9nZXRDb25maWd1cmF0aW9uKCkuZ2V0TG9jYWxlKCkpID8/IG51bGwgfVxcbmBcbiAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgY29uc3QgaGFzTmFtZSA9IGBoYXMke2luZmxlY3Rpb24uY2FtZWxpemUobmFtZSl9YFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYFxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAYWJzdHJhY3RcXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2Jvb2xlYW59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7aGFzTmFtZX0oKSB7IHRocm93IG5ldyBFcnJvcihcIiR7aGFzTmFtZX0gbm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG4gICAgICAgICAgbWV0aG9kc0NvdW50KytcblxuICAgICAgICAgIGZvciAoY29uc3QgbG9jYWxlIG9mIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmdldExvY2FsZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxlTWV0aG9kTmFtZSA9IGAke25hbWV9JHtpbmZsZWN0aW9uLmNhbWVsaXplKGxvY2FsZSl9YFxuXG4gICAgICAgICAgICBpZiAodHJhbnNsYXRpb25Kc2RvY1R5cGUgJiYgY29sdW1uKSB7XG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7JHt0cmFuc2xhdGlvbkpzZG9jVHlwZX0ke2NvbHVtbi5nZXROdWxsKCkgPyBcIiB8IG51bGxcIiA6IFwiXCJ9fVxcbmBcbiAgICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7bG9jYWxlTWV0aG9kTmFtZX0oKSB7IHJldHVybiB0aGlzLl9nZXRUcmFuc2xhdGVkQXR0cmlidXRlV2l0aEZhbGxiYWNrKFwiJHtuYW1lfVwiLCBcIiR7bG9jYWxlfVwiKSA/PyBudWxsIH1cXG5gXG4gICAgICAgICAgICBtZXRob2RzQ291bnQrK1xuXG4gICAgICAgICAgICBjb25zdCBsb2NhbGVIYXNOYW1lID0gYGhhcyR7aW5mbGVjdGlvbi5jYW1lbGl6ZShsb2NhbGVNZXRob2ROYW1lKX1gXG5cbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGBcXG5gXG4gICAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBhYnN0cmFjdFxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtib29sZWFufVxcbmBcbiAgICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtsb2NhbGVIYXNOYW1lfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiJHtsb2NhbGVIYXNOYW1lfSBub3QgaW1wbGVtZW50ZWRcIikgfVxcbmBcbiAgICAgICAgICAgIG1ldGhvZHNDb3VudCsrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgcmVsYXRpb25zaGlwIG9mIG1vZGVsQ2xhc3MuZ2V0UmVsYXRpb25zaGlwcygpKSB7XG4gICAgICAgIGxldCBiYXNlRmlsZVBhdGgsIGJhc2VGdWxsRmlsZVBhdGgsIGZpbGVOYW1lLCBmdWxsRmlsZVBhdGhcblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmdldFBvbHltb3JwaGljKCkpIHtcbiAgICAgICAgICBmaWxlTmFtZSA9IFwidmVsb2Npb3VzL2J1aWxkL3NyYy9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG5cbiAgICAgICAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHRocm93IG5ldyBFcnJvcihgUmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9JyBvbiAnJHttb2RlbENsYXNzLm5hbWV9JyBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcblxuICAgICAgICAgIGZpbGVOYW1lID0gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldE1vZGVsQ2xhc3MubmFtZSkpXG4gICAgICAgICAgZnVsbEZpbGVQYXRoID0gYHNyYy9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgYmFzZUZpbGVQYXRoID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIGJhc2VGdWxsRmlsZVBhdGggPSBgc3JjL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZHNDb3VudCA+IDApIHtcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpb25zaGlwLmdldFR5cGUoKSA9PSBcImJlbG9uZ3NUb1wiIHx8IHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNPbmVcIikge1xuICAgICAgICAgIGxldCBtb2RlbEZpbGVQYXRoXG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgbW9kZWxGaWxlUGF0aCA9IGAuLi9tb2RlbHMvJHtmaWxlTmFtZX0uanNgXG4gICAgICAgICAgfSBlbHNlIGlmIChiYXNlRnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoYmFzZUZ1bGxGaWxlUGF0aCkpIHtcbiAgICAgICAgICAgIG1vZGVsRmlsZVBhdGggPSBiYXNlRmlsZVBhdGhcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9kZWxGaWxlUGF0aCA9IFwidmVsb2Npb3VzL2J1aWxkL3NyYy9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydChcIiR7bW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdH0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXR0cmlidXRlc11cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtpbXBvcnQoXCIke21vZGVsRmlsZVBhdGh9XCIpLmRlZmF1bHR9XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGJ1aWxkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfShhdHRyaWJ1dGVzKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgbG9hZCR7aW5mbGVjdGlvbi5jYW1lbGl6ZShyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpKX0oKSB7IHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAYWJzdHJhY3RcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7aW1wb3J0KFwiJHttb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0fSBuZXdNb2RlbFxcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICAgKiBAcmV0dXJucyB7dm9pZH1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfShuZXdNb2RlbCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXFxuYFxuICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uc2hpcC5nZXRUeXBlKCkgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgICBsZXQgcmVjb3JkSW1wb3J0XG5cbiAgICAgICAgICBpZiAoZnVsbEZpbGVQYXRoICYmIGF3YWl0IGZpbGVFeGlzdHMoZnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVscy8ke2ZpbGVOYW1lfS5qc2BcbiAgICAgICAgICB9IGVsc2UgaWYgKGJhc2VGdWxsRmlsZVBhdGggJiYgYXdhaXQgZmlsZUV4aXN0cyhiYXNlRnVsbEZpbGVQYXRoKSkge1xuICAgICAgICAgICAgcmVjb3JkSW1wb3J0ID0gYC4uL21vZGVsLWJhc2VzLyR7ZmlsZU5hbWV9LmpzYFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWNvcmRJbXBvcnQgPSBgJHt2ZWxvY2lvdXNQYXRofS9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNgXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydChcIiR7aGFzTWFueVJlbGF0aW9uRmlsZVBhdGh9XCIpLmRlZmF1bHQ8dHlwZW9mIGltcG9ydChcIiR7c291cmNlTW9kZWxGaWxlUGF0aH1cIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn1cXG5gXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfSgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiJHtoYXNNYW55UmVsYXRpb25GaWxlUGF0aH1cIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiJHtzb3VyY2VNb2RlbEZpbGVQYXRofVwiKS5kZWZhdWx0LCB0eXBlb2YgaW1wb3J0KFwiJHtyZWNvcmRJbXBvcnR9XCIpLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoXCIke3JlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCl9XCIpKSB9XFxuYFxuXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59XFxuYFxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKX1Mb2FkZWQoKSB7IHJldHVybiAvKiogQHR5cGUge0FycmF5PGltcG9ydChcIiR7cmVjb3JkSW1wb3J0fVwiKS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKFwiJHtyZWxhdGlvbnNoaXAuZ2V0UmVsYXRpb25zaGlwTmFtZSgpfVwiKS5sb2FkZWQoKSkgfVxcbmBcblxuICAgICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQGFic3RyYWN0XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBsb2FkJHtpbmZsZWN0aW9uLmNhbWVsaXplKHJlbGF0aW9uc2hpcC5nZXRSZWxhdGlvbnNoaXBOYW1lKCkpfSgpIHsgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpIH1cXG5gXG5cbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBhYnN0cmFjdFxcblwiXG4gICAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIke3JlY29yZEltcG9ydH1cIikuZGVmYXVsdD59IG5ld01vZGVsc1xcbmBcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge3ZvaWR9XFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke2luZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLmdldFJlbGF0aW9uc2hpcE5hbWUoKSl9KG5ld01vZGVscykgeyB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIikgfSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXFxuYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biByZWxhdGlvbnNoaXAgdHlwZTogJHtyZWxhdGlvbnNoaXAuZ2V0VHlwZSgpfWApXG4gICAgICAgIH1cblxuICAgICAgICBtZXRob2RzQ291bnQrK1xuICAgICAgfVxuXG4gICAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShtb2RlbFBhdGgsIGZpbGVDb250ZW50KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UtY29sdW1uLmpzXCIpLmRlZmF1bHR9IGNvbHVtbiAtIENvbHVtbi5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUganMgZG9jIHR5cGUgZnJvbSBjb2x1bW4uXG4gICAqL1xuICBqc0RvY1R5cGVGcm9tQ29sdW1uKGNvbHVtbikge1xuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4uZ2V0VHlwZSgpXG5cbiAgICBpZiAodHlwZSA9PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIFwiYm9vbGVhblwiXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwianNvblwiKSB7XG4gICAgICByZXR1cm4gXCJSZWNvcmQ8c3RyaW5nLCBhbnk+XCJcbiAgICB9IGVsc2UgaWYgKFtcImJsb2JcIiwgXCJjaGFyXCIsIFwibnZhcmNoYXJcIiwgXCJ2YXJjaGFyXCIsIFwidGV4dFwiLCBcImxvbmd0ZXh0XCIsIFwidXVpZFwiLCBcImNoYXJhY3RlciB2YXJ5aW5nXCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIlxuICAgIH0gZWxzZSBpZiAoW1wiYml0XCIsIFwiYmlnaW50XCIsIFwiZmxvYXRcIiwgXCJpbnRcIiwgXCJpbnRlZ2VyXCIsIFwic21hbGxpbnRcIiwgXCJ0aW55aW50XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIlxuICAgIH0gZWxzZSBpZiAoW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJEYXRlXCJcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBjb2x1bW4gdHlwZTogJHt0eXBlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0fSBjb2x1bW4gLSBDb2x1bW4uXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGpzIGRvYyBzZXR0ZXIgdHlwZSBmcm9tIGNvbHVtbi5cbiAgICovXG4gIGpzRG9jU2V0dGVyVHlwZUZyb21Db2x1bW4oY29sdW1uKSB7XG4gICAgY29uc3QgdHlwZSA9IGNvbHVtbi5nZXRUeXBlKClcblxuICAgIGlmIChbXCJkYXRlXCIsIFwiZGF0ZXRpbWVcIiwgXCJ0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIkRhdGUgfCBzdHJpbmdcIlxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmpzRG9jVHlwZUZyb21Db2x1bW4oY29sdW1uKVxuICB9XG59XG4iXX0=
@@ -82,7 +82,7 @@ export default class DbGenerateFrontendModels extends BaseCommand {
82
82
  indent: string;
83
83
  propertyName: string;
84
84
  values: Record<string, string>;
85
- filterDefaultValues?: Record<string, string>;
85
+ filterDefaultValues?: Record<string, string> | undefined;
86
86
  }): string;
87
87
  /**
88
88
  * @param {object} args - Arguments.
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-models.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/frontend-models.js"],"names":[],"mappings":"AAKA,mGAAmG;AACnG;IACE,oEAAoE;IACpE,WADc,OAAO,CAAC,IAAI,CAAC,CA0E1B;IAED;;;;;;OAMG;IACH,kFALG;QAA0B,gCAAgC,EAAlD,GAAG,CAAC,MAAM,CAAC;QACE,SAAS,EAAtB,MAAM;QACoB,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,IAAI,CA8BhB;IAED;;;OAGG;IACH,2CAHW,OAAO,uCAAuC,EAAE,2BAA2B,GACzE,MAAM,CAAC,MAAM,EAAE,OAAO,uCAAuC,EAAE,+BAA+B,CAAC,CAI3G;IAED;;;OAGG;IACH,4CAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,GAAG,CAAC,MAAM,CAAC,CAWvB;IAED;;;OAGG;IACH,yDAHW;QAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;KAAC,GACjC,MAAM,CAMlB;IAED;;;OAGG;IACH,wDAHW,MAAM,GACJ,MAAM,CAUlB;IAED;;;;;;;OAOG;IACH,0EANG;QAAqB,SAAS,EAAtB,MAAM;QACO,UAAU,EAAvB,MAAM;QAC6E,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;QAClD,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,MAAM,CA6NlB;IAED;;;OAGG;IACH,sCAHW,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAAC,GAC1C,MAAM,CAUlB;IAED;;;;;;OAMG;IACH,yDALG;QAAqB,MAAM,EAAnB,MAAM;QACO,YAAY,EAAzB,MAAM;QACS,MAAM,EAArB,MAAM,EAAE;KAChB,GAAU,MAAM,CAYlB;IAED;;;;;;;OAOG;IACH,+EANG;QAAqB,MAAM,EAAnB,MAAM;QACO,YAAY,EAAzB,MAAM;QACuB,MAAM,EAAnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QACQ,mBAAmB,GAAjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;KAC9B,GAAU,MAAM,CAclB;IAED;;;;;OAKG;IACH,0DAJG;QAA2F,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;QAClD,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CA0BpD;IAED;;;;OAIG;IACH,mDAHG;QAAkB,eAAe,EAAzB,GAAG;KACX,GAAU,MAAM,CAUlB;IAED;;;OAGG;IACH,uDAHW,GAAG,GACD,MAAM,CAsBlB;IAED;;;OAGG;IACH,4CAHW,GAAG,GACD,OAAO,CAYnB;IAED;;;OAGG;IACH,4CAHW,GAAG,GACD,MAAM,GAAG,IAAI,CAkBzB;IAED;;;;;OAKG;IACH,wEAJG;QAAqB,aAAa,EAA1B,MAAM;QAC6E,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;KACpF,GAAU,GAAG,CAcf;IAED;;;;;OAKG;IACH,kDAJG;QAAqB,SAAS,EAAtB,MAAM;QACoB,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,KAAK,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAC,CAAC,CAyDxI;IAED;;;;;OAKG;IACH,gEAJG;QAAqB,SAAS,EAAtB,MAAM;QACO,gBAAgB,EAA7B,MAAM;KACd,GAAU;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAC,CA6BjI;CACF;wBAvqBuB,oCAAoC"}
1
+ {"version":3,"file":"frontend-models.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/frontend-models.js"],"names":[],"mappings":"AAKA,mGAAmG;AACnG;IACE,oEAAoE;IACpE,WADc,OAAO,CAAC,IAAI,CAAC,CA4E1B;IAED;;;;;;OAMG;IACH,kFALG;QAA0B,gCAAgC,EAAlD,GAAG,CAAC,MAAM,CAAC;QACE,SAAS,EAAtB,MAAM;QACoB,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,IAAI,CA8BhB;IAED;;;OAGG;IACH,2CAHW,OAAO,uCAAuC,EAAE,2BAA2B,GACzE,MAAM,CAAC,MAAM,EAAE,OAAO,uCAAuC,EAAE,+BAA+B,CAAC,CAI3G;IAED;;;OAGG;IACH,4CAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,GAAG,CAAC,MAAM,CAAC,CAWvB;IAED;;;OAGG;IACH,yDAHW;QAAC,wBAAwB,CAAC,EAAE,MAAM,CAAA;KAAC,GACjC,MAAM,CAMlB;IAED;;;OAGG;IACH,wDAHW,MAAM,GACJ,MAAM,CAUlB;IAED;;;;;;;OAOG;IACH,0EANG;QAAqB,SAAS,EAAtB,MAAM;QACO,UAAU,EAAvB,MAAM;QAC6E,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;QAClD,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,MAAM,CA6NlB;IAED;;;OAGG;IACH,sCAHW,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,CAAC,GAC1C,MAAM,CAUlB;IAED;;;;;;OAMG;IACH,yDALG;QAAqB,MAAM,EAAnB,MAAM;QACO,YAAY,EAAzB,MAAM;QACS,MAAM,EAArB,MAAM,EAAE;KAChB,GAAU,MAAM,CAYlB;IAED;;;;;;;OAOG;IACH,+EANG;QAAqB,MAAM,EAAnB,MAAM;QACO,YAAY,EAAzB,MAAM;QACuB,MAAM,EAAnC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;QACQ,mBAAmB;KACzD,GAAU,MAAM,CAclB;IAED;;;;;OAKG;IACH,0DAJG;QAA2F,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;QAClD,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,KAAK,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC,CA0BpD;IAED;;;;OAIG;IACH,mDAHG;QAAkB,eAAe,EAAzB,GAAG;KACX,GAAU,MAAM,CAUlB;IAED;;;OAGG;IACH,uDAHW,GAAG,GACD,MAAM,CAsBlB;IAED;;;OAGG;IACH,4CAHW,GAAG,GACD,OAAO,CAYnB;IAED;;;OAGG;IACH,4CAHW,GAAG,GACD,MAAM,GAAG,IAAI,CAkBzB;IAED;;;;;OAKG;IACH,wEAJG;QAAqB,aAAa,EAA1B,MAAM;QAC6E,UAAU,EAA7F,cAAc,yCAAyC,EAAE,OAAO,GAAG,SAAS;KACpF,GAAU,GAAG,CAcf;IAED;;;;;OAKG;IACH,kDAJG;QAAqB,SAAS,EAAtB,MAAM;QACoB,WAAW,EAArC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;KAC3B,GAAU,KAAK,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAC,CAAC,CA6DxI;IAED;;;;;OAKG;IACH,gEAJG;QAAqB,SAAS,EAAtB,MAAM;QACO,gBAAgB,EAA7B,MAAM;KACd,GAAU;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAC,CA6BjI;CACF;wBA7qBuB,oCAAoC"}
@@ -29,6 +29,8 @@ export default class DbGenerateFrontendModels extends BaseCommand {
29
29
  generatedFilesByDirectory.set(frontendModelsDir, []);
30
30
  }
31
31
  const generatedFiles = generatedFilesByDirectory.get(frontendModelsDir);
32
+ if (!generatedFiles)
33
+ throw new Error(`Generated files list missing for ${frontendModelsDir}`);
32
34
  const resources = this.resourcesForBackendProject(backendProject);
33
35
  const availableFrontendModelClassNames = this.availableFrontendModelClassNames(resources);
34
36
  for (const modelClassName in resources) {
@@ -435,13 +437,13 @@ export default class DbGenerateFrontendModels extends BaseCommand {
435
437
  else if (type == "json" || type == "jsonb") {
436
438
  return "Record<string, any>";
437
439
  }
438
- else if (["blob", "char", "nvarchar", "varchar", "text", "longtext", "uuid", "character varying"].includes(type)) {
440
+ else if (type && ["blob", "char", "nvarchar", "varchar", "text", "longtext", "uuid", "character varying"].includes(type)) {
439
441
  return "string";
440
442
  }
441
- else if (["bit", "bigint", "decimal", "double", "double precision", "float", "int", "integer", "numeric", "real", "smallint", "tinyint"].includes(type)) {
443
+ else if (type && ["bit", "bigint", "decimal", "double", "double precision", "float", "int", "integer", "numeric", "real", "smallint", "tinyint"].includes(type)) {
442
444
  return "number";
443
445
  }
444
- else if (["date", "datetime", "timestamp", "timestamp without time zone", "timestamptz"].includes(type)) {
446
+ else if (type && ["date", "datetime", "timestamp", "timestamp without time zone", "timestamptz"].includes(type)) {
445
447
  return "Date";
446
448
  }
447
449
  else {
@@ -535,6 +537,9 @@ export default class DbGenerateFrontendModels extends BaseCommand {
535
537
  const targetClassName = hasExplicitModel
536
538
  ? inflection.camelize(String(relationshipModelName).replaceAll("-", "_"))
537
539
  : inferredRelationship?.targetClassName;
540
+ if (!targetClassName) {
541
+ throw new Error(`Model '${className}' relationship '${relationshipName}' has no target model class`);
542
+ }
538
543
  normalized.push({
539
544
  relationshipName,
540
545
  targetClassName,
@@ -573,4 +578,4 @@ export default class DbGenerateFrontendModels extends BaseCommand {
573
578
  };
574
579
  }
575
580
  }
576
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFDLGdEQUFnRCxFQUFFLHVDQUF1QyxFQUFDLE1BQU0sdURBQXVELENBQUE7QUFFL0osbUdBQW1HO0FBQ25HLE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsV0FBVztJQUMvRCxvRUFBb0U7SUFDcEUsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM3QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RkFBeUYsQ0FBQyxDQUFBO1FBQzVHLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3JDLDBCQUEwQjtRQUMxQixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDcEMsd0VBQXdFO1FBQ3hFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUUzQyxLQUFLLE1BQU0sY0FBYyxJQUFJLGVB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QUFDLENBQUE7UUFDN0csQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZFLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUE7UUFDM0QsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUE7UUFFL0MsSUFBSSxnQkFBZ0IsS0FBSyxXQUFXLElBQUksZ0JBQWdCLEtBQUssUUFBUSxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hHLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxTQUFTLG1CQUFtQixnQkFBZ0IsMkJBQTJCLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtRQUN2SCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLFNBQVMsbUJBQW1CLGdCQUFnQiw2QkFBNkIsQ0FBQyxDQUFBO1FBQ3RHLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUE7UUFFN0MsT0FBTztZQUNMLGdCQUFnQjtZQUNoQixlQUFlO1lBQ2YsY0FBYyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1RSxJQUFJLEVBQUUsZ0JBQWdCO1NBQ3ZCLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmFzZUNvbW1hbmQgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NsaS9iYXNlLWNvbW1hbmQuanNcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbkZyb21EZWZpbml0aW9uLCBmcm9udGVuZE1vZGVsUmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbi8qKiBOb2RlIENMSSBjb21tYW5kIHRoYXQgZ2VuZXJhdGVzIGZyb250ZW5kIG1vZGVsIGNsYXNzZXMgZnJvbSBiYWNrZW5kIHByb2plY3QgcmVzb3VyY2UgY29uZmlnLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGJHZW5lcmF0ZUZyb250ZW5kTW9kZWxzIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBmaWxlcyBhcmUgZ2VuZXJhdGVkLiAqL1xuICBhc3luYyBleGVjdXRlKCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcblxuICAgIGF3YWl0IGNvbmZpZ3VyYXRpb24uaW5pdGlhbGl6ZU1vZGVscygpXG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmFja2VuZFByb2plY3RzKSB8fCBiYWNrZW5kUHJvamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBiYWNrZW5kIHByb2plY3RzIGNvbmZpZ3VyZWQuIENvbmZpZ3VyZSAnYmFja2VuZFByb2plY3RzJyBpbiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlyc3RcIilcbiAgICB9XG5cbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZE1vZGVsTmFtZXMgPSBuZXcgU2V0KClcbiAgICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICAgIGNvbnN0IGVuc3VyZWREaXJlY3RvcmllcyA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgQXJyYXk8e2NsYXNzTmFtZTogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nfT4+fSAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgYmFja2VuZFByb2plY3Qgb2YgYmFja2VuZFByb2plY3RzKSB7XG4gICAgICBjb25zdCBmcm9udGVuZE1vZGVsc0RpciA9IHRoaXMuZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcbiAgICAgIGNvbnN0IGltcG9ydFBhdGggPSB0aGlzLmltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0RpcilcblxuICAgICAgaWYgKCFlbnN1cmVkRGlyZWN0b3JpZXMuaGFzKGZyb250ZW5kTW9kZWxzRGlyKSkge1xuICAgICAgICBhd2FpdCBmcy5ta2Rpcihmcm9udGVuZE1vZGVsc0Rpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG4gICAgICAgIGVuc3VyZWREaXJlY3Rvcmllcy5hZGQoZnJvbnRlbmRNb2RlbHNEaXIpXG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGdlbmVyYXRlZEZpbGVzQnlEaXJlY3Rvcnkuc2V0KGZyb250ZW5kTW9kZWxzRGlyLCBbXSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2VuZXJhdGVkRmlsZXMgPSBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5LmdldChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyA9IHRoaXMuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3NOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCBtb2RlbENvbmZpZyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsQ2xhc3NOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke2Zyb250ZW5kTW9kZWxzRGlyfS8ke2ZpbGVOYW1lfWBcblxuICAgICAgICBpZiAoIW1vZGVsQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuXG4gICAgICAgIGlmIChnZW5lcmF0ZWRNb2RlbE5hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lcy5hZGQoY2xhc3NOYW1lKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gdGhpcy5idWlsZE1vZGVsRmlsZUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBpbXBvcnRQYXRoLFxuICAgICAgICAgIG1vZGVsQ2xhc3M6IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClbY2xhc3NOYW1lXSxcbiAgICAgICAgICBtb2RlbENvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICAgIGdlbmVyYXRlZEZpbGVzLnB1c2goe2NsYXNzTmFtZSwgZmlsZU5hbWV9KVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy8ke2ZpbGVOYW1lfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZnJvbnRlbmRNb2RlbHNEaXIsIGdlbmVyYXRlZEZpbGVzXSBvZiBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBpbmRleENvbnRlbnQgPSB0aGlzLmJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9pbmRleC5qc2AsIGluZGV4Q29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9pbmRleC5qc1wiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYXJncy5hdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcyBpbiBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnfSkge1xuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsQ29uZmlnLmFiaWxpdGllc1xuXG4gICAgaWYgKCFhYmlsaXRpZXMgfHwgdHlwZW9mIGFiaWxpdGllcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkICdhYmlsaXRpZXMnIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZEFjdGlvbnMgPSBbXCJpbmRleFwiLCBcImZpbmRcIl1cblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHJlYWRBY3Rpb25zKSB7XG4gICAgICBjb25zdCBhYmlsaXR5QWN0aW9uID0gYWJpbGl0aWVzW2FjdGlvbl1cblxuICAgICAgaWYgKHR5cGVvZiBhYmlsaXR5QWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHlBY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgYWJpbGl0aWVzLiR7YWN0aW9ufSBjb25maWdgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2Ygbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmICghYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMuaGFzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfScgcmVmZXJlbmNlcyAnJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfScsIGJ1dCBubyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBleGlzdHMgZm9yIHRoYXQgdGFyZ2V0IGluIHRoaXMgYmFja2VuZCBwcm9qZWN0YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbiBrZXllZCBieSBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKi9cbiAgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKSB7XG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY2xhc3NOYW1lcy5hZGQoaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoPzogc3RyaW5nfX0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFic29sdXRlIGZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc091dHB1dFBhdGggfHwgdGhpcy5kaXJlY3RvcnkoKVxuXG4gICAgcmV0dXJuIGAke291dHB1dFBhdGh9L3NyYy9mcm9udGVuZC1tb2RlbHNgXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZyb250ZW5kTW9kZWxzRGlyIC0gRnJvbnRlbmQgbW9kZWxzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICovXG4gIGltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0Rpcikge1xuICAgIGNvbnN0IGRldk1vZGUgPSBmcm9udGVuZE1vZGVsc0Rpci5pbmNsdWRlcyhcIi9zcGVjL2R1bW15L3NyYy9mcm9udGVuZC1tb2RlbHNcIilcblxuICAgIGlmIChkZXZNb2RlKSB7XG4gICAgICByZXR1cm4gXCIuLi8uLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICAgIH1cblxuICAgIHJldHVybiBcInZlbG9jaW91cy9idWlsZC9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWV0aG9kIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmltcG9ydFBhdGggLSBCYXNlIGNsYXNzIGltcG9ydCBwYXRoLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBHZW5lcmF0ZWQgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgYnVpbGRNb2RlbEZpbGVDb250ZW50KHtjbGFzc05hbWUsIGltcG9ydFBhdGgsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe21vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSlcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbW9kZWxDb25maWcuYXR0YWNobWVudHMgJiYgdHlwZW9mIG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzID09PSBcIm9iamVjdFwiXG4gICAgICA/IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzXG4gICAgICA6IHt9XG4gICAgY29uc3QgYXR0cmlidXRlc1R5cGVOYW1lID0gYCR7Y2xhc3NOYW1lfUF0dHJpYnV0ZXNgXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0ge1xuICAgICAgY3JlYXRlOiBtb2RlbENvbmZpZy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSB8fCBcImNyZWF0ZVwiLFxuICAgICAgaW5kZXg6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggfHwgXCJpbmRleFwiXG4gICAgfVxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHtcbiAgICAgIGF0dGFjaDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCB8fCBcImF0dGFjaFwiLFxuICAgICAgZGVzdHJveTogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgfHwgXCJkZXN0cm95XCIsXG4gICAgICBkb3dubG9hZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRvd25sb2FkIHx8IFwiZG93bmxvYWRcIixcbiAgICAgIGZpbmQ6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5maW5kIHx8IFwiZmluZFwiLFxuICAgICAgdXBkYXRlOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlIHx8IFwidXBkYXRlXCIsXG4gICAgICB1cmw6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgfHwgXCJ1cmxcIlxuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0aW9uQ29tbWFuZHMgPSBtb2RlbENvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHNcbiAgICBjb25zdCBtZW1iZXJDb21tYW5kcyA9IG1vZGVsQ29uZmlnLm1lbWJlckNvbW1hbmRzXG4gICAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSA9PT0gXCJjcmVhdGVcIiAmJiBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmluZGV4ID09PSBcImluZGV4XCJcbiAgICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHNBcmVEZWZhdWx0ID0gYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCA9PT0gXCJhdHRhY2hcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgPT09IFwiZGVzdHJveVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgPT09IFwiZG93bmxvYWRcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgPT09IFwiZmluZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlID09PSBcInVwZGF0ZVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXJsID09PSBcInVybFwiXG5cbiAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG5cbiAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlIGZyb20gXCIke2ltcG9ydFBhdGh9XCJcXG5gXG5cbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke2F0dHJpYnV0ZXNUeXBlTmFtZX1cXG5gXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEBwcm9wZXJ0eSB7JHthdHRyaWJ1dGUuanNEb2NUeXBlfX0gJHthdHRyaWJ1dGUubmFtZX0gLSBBdHRyaWJ1dGUgdmFsdWUuXFxuYFxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYC8qKiBGcm9udGVuZCBtb2RlbCBmb3IgJHtjbGFzc05hbWV9LiAqL1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2Uge1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHt7YXR0YWNobWVudHM/OiBSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImhhc09uZVxcXCIgfCBcXFwiaGFzTWFueVxcXCJ9PiwgYXR0cmlidXRlczogc3RyaW5nW10sIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBidWlsdEluTWVtYmVyQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb2xsZWN0aW9uQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHByaW1hcnlLZXk/OiBzdHJpbmd9fSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwibWVtYmVyQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBtZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKG1vZGVsQ2xhc3MgJiYgbW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkgIT09IFwiaWRcIikge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHByaW1hcnlLZXk6ICR7SlNPTi5zdHJpbmdpZnkobW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpfSxcXG5gXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBcXFwiYmVsb25nc1RvXFxcIiB8IFxcXCJoYXNPbmVcXFwiIHwgXFxcImhhc01hbnlcXFwifT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfToge3R5cGU6ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnR5cGUpfX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gUmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzIG5hbWVzLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSl9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUsIHRydWUpXG4gICAgICBjb25zdCBjYW1lbGl6ZWRBdHRyaWJ1dGVVcHBlciA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUpXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7JHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV19IC0gQXR0cmlidXRlIHZhbHVlLiAqL1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQXR0cmlidXRlfSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0pIH1cXG5gXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XX0gbmV3VmFsdWUgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSB9XFxuYFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uQ29tbWFuZHMpKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwYXlsb2FkPXt9XSAtIENvbW1hbmQgcGF5bG9hZC5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIENvbW1hbmQgcmVzcG9uc2UuXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc3RhdGljIGFzeW5jICR7bWV0aG9kTmFtZX0ocGF5bG9hZCA9IHt9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZE5hbWU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25Db21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgcGF5bG9hZCxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICByZXNvdXJjZVBhdGg6IHRoaXMucmVzb3VyY2VQYXRoKClcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSlcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhtZW1iZXJDb21tYW5kcykpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3BheWxvYWQ9e31dIC0gQ29tbWFuZCBwYXlsb2FkLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyAke21ldGhvZE5hbWV9KHBheWxvYWQgPSB7fSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIGF3YWl0ICR7Y2xhc3NOYW1lfS5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBtZW1iZXJJZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBwYXlsb2FkLFxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcmVzb3VyY2VQYXRoOiAke2NsYXNzTmFtZX0ucmVzb3VyY2VQYXRoKClcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9KVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLnR5cGUgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8dHlwZW9mIGltcG9ydCgke0pTT04uc3RyaW5naWZ5KGAuLyR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNsYXNzTmFtZSkpfS5qc2ApfSkuZGVmYXVsdCwgdHlwZW9mIGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdD59IC0gUmVsYXRpb25zaGlwIGhlbHBlci4gKi9cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPHR5cGVvZiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShgLi8ke2luZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShjbGFzc05hbWUpKX0uanNgKX0pLmRlZmF1bHQsIHR5cGVvZiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfUxvYWRlZCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pj59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLiAqL1xcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pj59ICovICh0aGlzLmxvYWRSZWxhdGlvbnNoaXAoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSAtIExvYWRlZCByZWxhdGVkIG1vZGVsLiAqL1xcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGx9ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0pLmxvYWRlZCgpKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyBmb3IgdGhlIG5ldyByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdH0gLSBCdWlsdCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGJ1aWxkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfShhdHRyaWJ1dGVzID0ge30pIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KS5idWlsZChhdHRyaWJ1dGVzKSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC4gKi9cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jIGxvYWQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGw+fSAqLyAodGhpcy5sb2FkUmVsYXRpb25zaGlwKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHBhcmFtIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSAtIEFzc2lnbmVkIHJlbGF0ZWQgbW9kZWwuICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KG1vZGVsKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGx9ICovICh0aGlzLnNldFJlbGF0aW9uc2hpcCgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0sIG1vZGVsKSkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSW5kZXggZmlsZSBjb250ZW50IHRoYXQgaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyBhbGwgbW9kZWxzLlxuICAgKi9cbiAgYnVpbGRJbmRleEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIlwiXG5cbiAgICBmb3IgKGNvbnN0IHtjbGFzc05hbWUsIGZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgZXhwb3J0IHtkZWZhdWx0IGFzICR7Y2xhc3NOYW1lfX0gZnJvbSBcIi4vJHtmaWxlTmFtZX1cIlxcbmBcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy52YWx1ZXMgLSBTdHJpbmcgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiBbXFxuYFxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9XSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MudmFsdWVzIC0gT2JqZWN0IGtleS12YWx1ZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuZmlsdGVyRGVmYXVsdFZhbHVlc10gLSBEZWZhdWx0IHZhbHVlcyB0byBvbWl0IGZyb20gb3V0cHV0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgb2JqZWN0IHByb3BlcnR5LlxuICAgKi9cbiAgZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe2ZpbHRlckRlZmF1bHRWYWx1ZXMsIGluZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgbGV0IG91dHB1dCA9IGAke2luZGVudH0ke3Byb3BlcnR5TmFtZX06IHtcXG5gXG5cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICBpZiAoZmlsdGVyRGVmYXVsdFZhbHVlcyAmJiBmaWx0ZXJEZWZhdWx0VmFsdWVzW29iamVjdEtleV0gPT09IHZhbHVlc1tvYmplY3RLZXldKSBjb250aW51ZVxuXG4gICAgICBvdXRwdXQgKz0gYCR7aW5kZW50fSAgJHtvYmplY3RLZXl9OiAke0pTT04uc3RyaW5naWZ5KHZhbHVlc1tvYmplY3RLZXldKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9fSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9Pn0gLSBBdHRyaWJ1dGUgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBhdHRyaWJ1dGVEZWZpbml0aW9uc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWxDb25maWcuYXR0cmlidXRlc1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlTmFtZSkgPT4gKHtcbiAgICAgICAganNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHtcbiAgICAgICAgICBhdHRyaWJ1dGVDb25maWc6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgICAgIH0pLFxuICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgdHlwZW9mIGF0dHJpYnV0ZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ2F0dHJpYnV0ZXMnIGFzIGFycmF5IG9yIG9iamVjdCBidXQgZ290OiAke2F0dHJpYnV0ZXN9YClcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykubWFwKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSksXG4gICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5hdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIHtcbiAgICBjb25zdCBqc0RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlQmFzZVR5cGUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlQ2FuQmVOdWxsKGF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7anNEb2NUeXBlfSB8IG51bGxgXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vbi1udWxsYWJsZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gXCJhbnlcIlxuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJib29sZWFuXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJqc29uXCIgfHwgdHlwZSA9PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIGFueT5cIlxuICAgIH0gZWxzZSBpZiAoW1wiYmxvYlwiLCBcImNoYXJcIiwgXCJudmFyY2hhclwiLCBcInZhcmNoYXJcIiwgXCJ0ZXh0XCIsIFwibG9uZ3RleHRcIiwgXCJ1dWlkXCIsIFwiY2hhcmFjdGVyIHZhcnlpbmdcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiXG4gICAgfSBlbHNlIGlmIChbXCJiaXRcIiwgXCJiaWdpbnRcIiwgXCJkZWNpbWFsXCIsIFwiZG91YmxlXCIsIFwiZG91YmxlIHByZWNpc2lvblwiLCBcImZsb2F0XCIsIFwiaW50XCIsIFwiaW50ZWdlclwiLCBcIm51bWVyaWNcIiwgXCJyZWFsXCIsIFwic21hbGxpbnRcIiwgXCJ0aW55aW50XCJdLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXJcIlxuICAgIH0gZWxzZSBpZiAoW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCIsIFwidGltZXN0YW1wdHpcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIkRhdGVcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJhbnlcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBhbGxvd3MgbnVsbCB2YWx1ZXMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsKCkgPT09IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLm51bGwgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIE5vcm1hbGl6ZWQgY29sdW1uIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldFR5cGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlKCkpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZVZhbHVlID0gYXR0cmlidXRlQ29uZmlnLnR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmNvbHVtblR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLnNxbFR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmRhdGFUeXBlXG5cbiAgICBpZiAodHlwZW9mIHR5cGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheTx7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSAtIFJlbGF0aW9uc2hpcHMuXG4gICAqL1xuICByZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ29uZmlnLnJlbGF0aW9uc2hpcHNcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzID09PSB1bmRlZmluZWQgfHwgcmVsYXRpb25zaGlwcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwcykpIHtcbiAgICAgIHJldHVybiByZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwTmFtZSkgPT4gdGhpcy5pbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZX0pKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVsYXRpb25zaGlwcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcCA9PT0gdHJ1ZSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2godGhpcy5pbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZX0pKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcCB8fCB0eXBlb2YgcmVsYXRpb25zaGlwICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdHJ1ZWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsTmFtZSA9IHJlbGF0aW9uc2hpcC5tb2RlbENsYXNzTmFtZSB8fCByZWxhdGlvbnNoaXAuY2xhc3NOYW1lIHx8IHJlbGF0aW9uc2hpcC5tb2RlbFxuICAgICAgY29uc3QgaGFzRXhwbGljaXRUeXBlID0gdHlwZW9mIHJlbGF0aW9uc2hpcC50eXBlID09PSBcInN0cmluZ1wiICYmIHJlbGF0aW9uc2hpcC50eXBlLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0TW9kZWwgPSB0eXBlb2YgcmVsYXRpb25zaGlwTW9kZWxOYW1lID09PSBcInN0cmluZ1wiICYmIHJlbGF0aW9uc2hpcE1vZGVsTmFtZS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBpbmZlcnJlZFJlbGF0aW9uc2hpcCA9IGhhc0V4cGxpY2l0VHlwZSAmJiBoYXNFeHBsaWNpdE1vZGVsXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuaW5mZXJyZWRSZWxhdGlvbnNoaXBEZWZpbml0aW9uKHtjbGFzc05hbWUsIHJlbGF0aW9uc2hpcE5hbWV9KVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC50eXBlIHx8IGluZmVycmVkUmVsYXRpb25zaGlwPy50eXBlXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyBpbnZhbGlkIHR5cGUgJyR7cmVsYXRpb25zaGlwVHlwZX0nYClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0Q2xhc3NOYW1lID0gaGFzRXhwbGljaXRNb2RlbFxuICAgICAgICA/IGluZmxlY3Rpb24uY2FtZWxpemUoU3RyaW5nKHJlbGF0aW9uc2hpcE1vZGVsTmFtZSkucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKVxuICAgICAgICA6IGluZmVycmVkUmVsYXRpb25zaGlwPy50YXJnZXRDbGFzc05hbWVcblxuICAgICAgbm9ybWFsaXplZC5wdXNoKHtcbiAgICAgICAgcmVsYXRpb25zaGlwTmFtZSxcbiAgICAgICAgdGFyZ2V0Q2xhc3NOYW1lLFxuICAgICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgICB0eXBlOiByZWxhdGlvbnNoaXBUeXBlXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlbGF0aW9uc2hpcE5hbWUgLSBSZWxhdGlvbnNoaXAgbmFtZS5cbiAgICogQHJldHVybnMge3tyZWxhdGlvbnNoaXBOYW1lOiBzdHJpbmcsIHRhcmdldENsYXNzTmFtZTogc3RyaW5nLCB0YXJnZXRGaWxlTmFtZTogc3RyaW5nLCB0eXBlOiBcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifX0gSW5mZXJyZWQgcmVsYXRpb25zaGlwIGRlZmluaXRpb24uXG4gICAqL1xuICBpbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZX0pIHtcbiAgICBjb25zdCBtb2RlbENsYXNzID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0TW9kZWxDbGFzcyhjbGFzc05hbWUpXG5cbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYmFja2VuZCBtb2RlbCBjbGFzcyAnJHtjbGFzc05hbWV9JyBmb3IgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9J2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25zaGlwID0gbW9kZWxDbGFzcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUocmVsYXRpb25zaGlwTmFtZSlcbiAgICBjb25zdCB0YXJnZXRNb2RlbENsYXNzID0gcmVsYXRpb25zaGlwLmdldFRhcmdldE1vZGVsQ2xhc3MoKVxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcFR5cGUgPSByZWxhdGlvbnNoaXAuZ2V0VHlwZSgpXG5cbiAgICBpZiAocmVsYXRpb25zaGlwVHlwZSAhPT0gXCJiZWxvbmdzVG9cIiAmJiByZWxhdGlvbnNoaXBUeXBlICE9PSBcImhhc09uZVwiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzTWFueVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgaGFzIHVuc3VwcG9ydGVkIHR5cGUgJyR7cmVsYXRpb25zaGlwVHlwZX0nYClcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldE1vZGVsQ2xhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgbm8gdGFyZ2V0IG1vZGVsIGNsYXNzYClcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRDbGFzc05hbWUgPSB0YXJnZXRNb2RlbENsYXNzLm5hbWVcblxuICAgIHJldHVybiB7XG4gICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgdGFyZ2V0Q2xhc3NOYW1lLFxuICAgICAgdGFyZ2V0RmlsZU5hbWU6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZSh0YXJnZXRDbGFzc05hbWUpKSxcbiAgICAgIHR5cGU6IHJlbGF0aW9uc2hpcFR5cGVcbiAgICB9XG4gIH1cbn1cbiJdfQ==
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2Vudmlyb25tZW50LWhhbmRsZXJzL25vZGUvY2xpL2NvbW1hbmRzL2dlbmVyYXRlL2Zyb250ZW5kLW1vZGVscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFdBQVcsTUFBTSxvQ0FBb0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDNUIsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFDLGdEQUFnRCxFQUFFLHVDQUF1QyxFQUFDLE1BQU0sdURBQXVELENBQUE7QUFFL0osbUdBQW1HO0FBQ25HLE1BQU0sQ0FBQyxPQUFPLE9BQU8sd0JBQXlCLFNBQVEsV0FBVztJQUMvRCxvRUFBb0U7SUFDcEUsS0FBSyxDQUFDLE9BQU87UUFDWCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtRQUM3QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtRQUUxRCxNQUFNLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RkFBeUYsQ0FBQyxDQUFBO1FBQzVHLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ3JDLDBCQUEwQjtRQUMxQixNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDcEMsd0VBQXdFO1FBQ3hFLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUUzQyxLQUFLLE1BQU0sY0FBYyxJQUFJLGVB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Q29tbWFuZCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY2xpL2Jhc2UtY29tbWFuZC5qc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uRnJvbURlZmluaXRpb24sIGZyb250ZW5kTW9kZWxSZXNvdXJjZXNGb3JCYWNrZW5kUHJvamVjdH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuLyoqIE5vZGUgQ0xJIGNvbW1hbmQgdGhhdCBnZW5lcmF0ZXMgZnJvbnRlbmQgbW9kZWwgY2xhc3NlcyBmcm9tIGJhY2tlbmQgcHJvamVjdCByZXNvdXJjZSBjb25maWcuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYkdlbmVyYXRlRnJvbnRlbmRNb2RlbHMgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7XG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGZpbGVzIGFyZSBnZW5lcmF0ZWQuICovXG4gIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgYmFja2VuZFByb2plY3RzID0gY29uZmlndXJhdGlvbi5nZXRCYWNrZW5kUHJvamVjdHMoKVxuXG4gICAgYXdhaXQgY29uZmlndXJhdGlvbi5pbml0aWFsaXplTW9kZWxzKClcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShiYWNrZW5kUHJvamVjdHMpIHx8IGJhY2tlbmRQcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJhY2tlbmQgcHJvamVjdHMgY29uZmlndXJlZC4gQ29uZmlndXJlICdiYWNrZW5kUHJvamVjdHMnIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaXJzdFwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZ2VuZXJhdGVkTW9kZWxOYW1lcyA9IG5ldyBTZXQoKVxuICAgIC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovXG4gICAgY29uc3QgZW5zdXJlZERpcmVjdG9yaWVzID0gbmV3IFNldCgpXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pj59ICovXG4gICAgY29uc3QgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeSA9IG5ldyBNYXAoKVxuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICAgIGNvbnN0IGZyb250ZW5kTW9kZWxzRGlyID0gdGhpcy5mcm9udGVuZE1vZGVsc0RpcmVjdG9yeUZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IHRoaXMuaW1wb3J0UGF0aEZvckZyb250ZW5kTW9kZWxzRGlyZWN0b3J5KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWVuc3VyZWREaXJlY3Rvcmllcy5oYXMoZnJvbnRlbmRNb2RlbHNEaXIpKSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKGZyb250ZW5kTW9kZWxzRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSlcbiAgICAgICAgZW5zdXJlZERpcmVjdG9yaWVzLmFkZChmcm9udGVuZE1vZGVsc0RpcilcbiAgICAgIH1cblxuICAgICAgaWYgKCFnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5Lmhhcyhmcm9udGVuZE1vZGVsc0RpcikpIHtcbiAgICAgICAgZ2VuZXJhdGVkRmlsZXNCeURpcmVjdG9yeS5zZXQoZnJvbnRlbmRNb2RlbHNEaXIsIFtdKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRGaWxlcyA9IGdlbmVyYXRlZEZpbGVzQnlEaXJlY3RvcnkuZ2V0KGZyb250ZW5kTW9kZWxzRGlyKVxuXG4gICAgICBpZiAoIWdlbmVyYXRlZEZpbGVzKSB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBmaWxlcyBsaXN0IG1pc3NpbmcgZm9yICR7ZnJvbnRlbmRNb2RlbHNEaXJ9YClcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMucmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG4gICAgICBjb25zdCBhdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyA9IHRoaXMuYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKVxuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsQ2xhc3NOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgICBjb25zdCBtb2RlbENvbmZpZyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25Gcm9tRGVmaW5pdGlvbihyZXNvdXJjZXNbbW9kZWxDbGFzc05hbWVdKVxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1vZGVsQ2xhc3NOYW1lLnJlcGxhY2VBbGwoXCItXCIsIFwiX1wiKSlcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHtpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoY2xhc3NOYW1lKSl9LmpzYFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGAke2Zyb250ZW5kTW9kZWxzRGlyfS8ke2ZpbGVOYW1lfWBcblxuICAgICAgICBpZiAoIW1vZGVsQ29uZmlnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZyb250ZW5kIG1vZGVsIHJlc291cmNlIGRlZmluaXRpb24gZm9yICcke2NsYXNzTmFtZX0nYClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsaWRhdGVNb2RlbENvbmZpZyh7YXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMsIGNsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuXG4gICAgICAgIGlmIChnZW5lcmF0ZWRNb2RlbE5hbWVzLmhhcyhjbGFzc05hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbiBmb3IgJyR7Y2xhc3NOYW1lfSdgKVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTW9kZWxOYW1lcy5hZGQoY2xhc3NOYW1lKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gdGhpcy5idWlsZE1vZGVsRmlsZUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBpbXBvcnRQYXRoLFxuICAgICAgICAgIG1vZGVsQ2xhc3M6IGNvbmZpZ3VyYXRpb24uZ2V0TW9kZWxDbGFzc2VzKClbY2xhc3NOYW1lXSxcbiAgICAgICAgICBtb2RlbENvbmZpZ1xuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZUNvbnRlbnQpXG4gICAgICAgIGdlbmVyYXRlZEZpbGVzLnB1c2goe2NsYXNzTmFtZSwgZmlsZU5hbWV9KVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy8ke2ZpbGVOYW1lfWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZnJvbnRlbmRNb2RlbHNEaXIsIGdlbmVyYXRlZEZpbGVzXSBvZiBnZW5lcmF0ZWRGaWxlc0J5RGlyZWN0b3J5KSB7XG4gICAgICBjb25zdCBpbmRleENvbnRlbnQgPSB0aGlzLmJ1aWxkSW5kZXhGaWxlQ29udGVudChnZW5lcmF0ZWRGaWxlcylcblxuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2Zyb250ZW5kTW9kZWxzRGlyfS9pbmRleC5qc2AsIGluZGV4Q29udGVudClcblxuICAgICAgY29uc29sZS5sb2coXCJjcmVhdGUgc3JjL2Zyb250ZW5kLW1vZGVscy9pbmRleC5qc1wiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYXJncy5hdmFpbGFibGVGcm9udGVuZE1vZGVsQ2xhc3NOYW1lcyAtIEF2YWlsYWJsZSBmcm9udGVuZCBtb2RlbCBjbGFzcyBuYW1lcyBpbiBiYWNrZW5kIHByb2plY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIHZhbGlkYXRlTW9kZWxDb25maWcoe2F2YWlsYWJsZUZyb250ZW5kTW9kZWxDbGFzc05hbWVzLCBjbGFzc05hbWUsIG1vZGVsQ29uZmlnfSkge1xuICAgIGNvbnN0IGFiaWxpdGllcyA9IG1vZGVsQ29uZmlnLmFiaWxpdGllc1xuXG4gICAgaWYgKCFhYmlsaXRpZXMgfHwgdHlwZW9mIGFiaWxpdGllcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBpcyBtaXNzaW5nIHJlcXVpcmVkICdhYmlsaXRpZXMnIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgY29uc3QgcmVhZEFjdGlvbnMgPSBbXCJpbmRleFwiLCBcImZpbmRcIl1cblxuICAgIGZvciAoY29uc3QgYWN0aW9uIG9mIHJlYWRBY3Rpb25zKSB7XG4gICAgICBjb25zdCBhYmlsaXR5QWN0aW9uID0gYWJpbGl0aWVzW2FjdGlvbl1cblxuICAgICAgaWYgKHR5cGVvZiBhYmlsaXR5QWN0aW9uICE9PSBcInN0cmluZ1wiIHx8IGFiaWxpdHlBY3Rpb24ubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIGlzIG1pc3NpbmcgcmVxdWlyZWQgYWJpbGl0aWVzLiR7YWN0aW9ufSBjb25maWdgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uc2hpcHMgPSBtb2RlbENvbmZpZy5yZWxhdGlvbnNoaXBzXG5cbiAgICBpZiAocmVsYXRpb25zaGlwcyA9PT0gdW5kZWZpbmVkKSByZXR1cm5cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRSZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2Ygbm9ybWFsaXplZFJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGlmICghYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMuaGFzKHJlbGF0aW9uc2hpcC50YXJnZXRDbGFzc05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfScgcmVmZXJlbmNlcyAnJHtyZWxhdGlvbnNoaXAudGFyZ2V0Q2xhc3NOYW1lfScsIGJ1dCBubyBmcm9udGVuZCBtb2RlbCByZXNvdXJjZSBleGlzdHMgZm9yIHRoYXQgdGFyZ2V0IGluIHRoaXMgYmFja2VuZCBwcm9qZWN0YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbn0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gLSBSZXNvdXJjZSBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVzb3VyY2VzRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpIHtcbiAgICByZXR1cm4gZnJvbnRlbmRNb2RlbFJlc291cmNlc0ZvckJhY2tlbmRQcm9qZWN0KGJhY2tlbmRQcm9qZWN0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgY29uZmlndXJhdGlvbiBrZXllZCBieSBtb2RlbCBuYW1lLlxuICAgKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IC0gQXZhaWxhYmxlIGZyb250ZW5kIG1vZGVsIGNsYXNzIG5hbWVzLlxuICAgKi9cbiAgYXZhaWxhYmxlRnJvbnRlbmRNb2RlbENsYXNzTmFtZXMocmVzb3VyY2VzKSB7XG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICBjb25zdCBjbGFzc05hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlc291cmNlTW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY2xhc3NOYW1lcy5hZGQoaW5mbGVjdGlvbi5jYW1lbGl6ZShyZXNvdXJjZU1vZGVsTmFtZS5yZXBsYWNlQWxsKFwiLVwiLCBcIl9cIikpKVxuICAgIH1cblxuICAgIHJldHVybiBjbGFzc05hbWVzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHt7ZnJvbnRlbmRNb2RlbHNPdXRwdXRQYXRoPzogc3RyaW5nfX0gYmFja2VuZFByb2plY3QgLSBCYWNrZW5kIHByb2plY3QgY29uZmlnLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEFic29sdXRlIGZyb250ZW5kIG1vZGVscyBvdXRwdXQgZGlyZWN0b3J5LlxuICAgKi9cbiAgZnJvbnRlbmRNb2RlbHNEaXJlY3RvcnlGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdCkge1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBiYWNrZW5kUHJvamVjdC5mcm9udGVuZE1vZGVsc091dHB1dFBhdGggfHwgdGhpcy5kaXJlY3RvcnkoKVxuXG4gICAgcmV0dXJuIGAke291dHB1dFBhdGh9L3NyYy9mcm9udGVuZC1tb2RlbHNgXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZyb250ZW5kTW9kZWxzRGlyIC0gRnJvbnRlbmQgbW9kZWxzIG91dHB1dCBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQmFzZSBjbGFzcyBpbXBvcnQgcGF0aC5cbiAgICovXG4gIGltcG9ydFBhdGhGb3JGcm9udGVuZE1vZGVsc0RpcmVjdG9yeShmcm9udGVuZE1vZGVsc0Rpcikge1xuICAgIGNvbnN0IGRldk1vZGUgPSBmcm9udGVuZE1vZGVsc0Rpci5pbmNsdWRlcyhcIi9zcGVjL2R1bW15L3NyYy9mcm9udGVuZC1tb2RlbHNcIilcblxuICAgIGlmIChkZXZNb2RlKSB7XG4gICAgICByZXR1cm4gXCIuLi8uLi8uLi8uLi9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICAgIH1cblxuICAgIHJldHVybiBcInZlbG9jaW91cy9idWlsZC9zcmMvZnJvbnRlbmQtbW9kZWxzL2Jhc2UuanNcIlxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWV0aG9kIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmltcG9ydFBhdGggLSBCYXNlIGNsYXNzIGltcG9ydCBwYXRoLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi8uLi8uLi8uLi8uLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gYXJncy5tb2RlbENsYXNzIC0gQmFja2VuZCBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBhcmdzLm1vZGVsQ29uZmlnIC0gTW9kZWwgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBHZW5lcmF0ZWQgZmlsZSBjb250ZW50LlxuICAgKi9cbiAgYnVpbGRNb2RlbEZpbGVDb250ZW50KHtjbGFzc05hbWUsIGltcG9ydFBhdGgsIG1vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZURlZmluaXRpb25zRm9yTW9kZWwoe21vZGVsQ2xhc3MsIG1vZGVsQ29uZmlnfSlcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gdGhpcy5yZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KVxuICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbW9kZWxDb25maWcuYXR0YWNobWVudHMgJiYgdHlwZW9mIG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzID09PSBcIm9iamVjdFwiXG4gICAgICA/IG1vZGVsQ29uZmlnLmF0dGFjaG1lbnRzXG4gICAgICA6IHt9XG4gICAgY29uc3QgYXR0cmlidXRlc1R5cGVOYW1lID0gYCR7Y2xhc3NOYW1lfUF0dHJpYnV0ZXNgXG4gICAgY29uc3QgYXR0cmlidXRlTmFtZXMgPSBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSlcbiAgICBjb25zdCBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzID0ge1xuICAgICAgY3JlYXRlOiBtb2RlbENvbmZpZy5idWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSB8fCBcImNyZWF0ZVwiLFxuICAgICAgaW5kZXg6IG1vZGVsQ29uZmlnLmJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHMuaW5kZXggfHwgXCJpbmRleFwiXG4gICAgfVxuICAgIGNvbnN0IGJ1aWx0SW5NZW1iZXJDb21tYW5kcyA9IHtcbiAgICAgIGF0dGFjaDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCB8fCBcImF0dGFjaFwiLFxuICAgICAgZGVzdHJveTogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgfHwgXCJkZXN0cm95XCIsXG4gICAgICBkb3dubG9hZDogbW9kZWxDb25maWcuYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRvd25sb2FkIHx8IFwiZG93bmxvYWRcIixcbiAgICAgIGZpbmQ6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy5maW5kIHx8IFwiZmluZFwiLFxuICAgICAgdXBkYXRlOiBtb2RlbENvbmZpZy5idWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlIHx8IFwidXBkYXRlXCIsXG4gICAgICB1cmw6IG1vZGVsQ29uZmlnLmJ1aWx0SW5NZW1iZXJDb21tYW5kcy51cmwgfHwgXCJ1cmxcIlxuICAgIH1cbiAgICBjb25zdCBjb2xsZWN0aW9uQ29tbWFuZHMgPSBtb2RlbENvbmZpZy5jb2xsZWN0aW9uQ29tbWFuZHNcbiAgICBjb25zdCBtZW1iZXJDb21tYW5kcyA9IG1vZGVsQ29uZmlnLm1lbWJlckNvbW1hbmRzXG4gICAgY29uc3QgYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQgPSBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmNyZWF0ZSA9PT0gXCJjcmVhdGVcIiAmJiBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzLmluZGV4ID09PSBcImluZGV4XCJcbiAgICBjb25zdCBidWlsdEluTWVtYmVyQ29tbWFuZHNBcmVEZWZhdWx0ID0gYnVpbHRJbk1lbWJlckNvbW1hbmRzLmF0dGFjaCA9PT0gXCJhdHRhY2hcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmRlc3Ryb3kgPT09IFwiZGVzdHJveVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMuZG93bmxvYWQgPT09IFwiZG93bmxvYWRcIlxuICAgICAgJiYgYnVpbHRJbk1lbWJlckNvbW1hbmRzLmZpbmQgPT09IFwiZmluZFwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXBkYXRlID09PSBcInVwZGF0ZVwiXG4gICAgICAmJiBidWlsdEluTWVtYmVyQ29tbWFuZHMudXJsID09PSBcInVybFwiXG5cbiAgICBsZXQgZmlsZUNvbnRlbnQgPSBcIlwiXG5cbiAgICBmaWxlQ29udGVudCArPSBgaW1wb3J0IEZyb250ZW5kTW9kZWxCYXNlIGZyb20gXCIke2ltcG9ydFBhdGh9XCJcXG5gXG5cbiAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gXCIvKipcXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IGAgKiBAdHlwZWRlZiB7b2JqZWN0fSAke2F0dHJpYnV0ZXNUeXBlTmFtZX1cXG5gXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAqIEBwcm9wZXJ0eSB7JHthdHRyaWJ1dGUuanNEb2NUeXBlfX0gJHthdHRyaWJ1dGUubmFtZX0gLSBBdHRyaWJ1dGUgdmFsdWUuXFxuYFxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSBcIiAqL1xcblwiXG4gICAgZmlsZUNvbnRlbnQgKz0gYC8qKiBGcm9udGVuZCBtb2RlbCBmb3IgJHtjbGFzc05hbWV9LiAqL1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBgZXhwb3J0IGRlZmF1bHQgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgRnJvbnRlbmRNb2RlbEJhc2Uge1xcbmBcbiAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqIEByZXR1cm5zIHt7YXR0YWNobWVudHM/OiBSZWNvcmQ8c3RyaW5nLCB7dHlwZTogXFxcImhhc09uZVxcXCIgfCBcXFwiaGFzTWFueVxcXCJ9PiwgYXR0cmlidXRlczogc3RyaW5nW10sIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBidWlsdEluTWVtYmVyQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBjb2xsZWN0aW9uQ29tbWFuZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBtZW1iZXJDb21tYW5kcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHByaW1hcnlLZXk/OiBzdHJpbmd9fSAtIFJlc291cmNlIGNvbmZpZy4gKi9cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICBzdGF0aWMgcmVzb3VyY2VDb25maWcoKSB7XFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgaWYgKE9iamVjdC5rZXlzKGF0dGFjaG1lbnRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICAgIGF0dGFjaG1lbnRzOiB7XFxuXCJcbiAgICAgIGZvciAoY29uc3QgW2F0dGFjaG1lbnROYW1lLCBhdHRhY2htZW50Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhhdHRhY2htZW50cykpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudFR5cGUgPSBhdHRhY2htZW50Q29uZmlnICYmIHR5cGVvZiBhdHRhY2htZW50Q29uZmlnID09PSBcIm9iamVjdFwiICYmIGF0dGFjaG1lbnRDb25maWcudHlwZSA9PT0gXCJoYXNNYW55XCJcbiAgICAgICAgICA/IFwiaGFzTWFueVwiXG4gICAgICAgICAgOiBcImhhc09uZVwiXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgICAgJHthdHRhY2htZW50TmFtZX06IHt0eXBlOiAke0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnRUeXBlKX19LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgfSxcXG5cIlxuICAgIH1cbiAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZEFycmF5UHJvcGVydHkoe1xuICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgcHJvcGVydHlOYW1lOiBcImF0dHJpYnV0ZXNcIixcbiAgICAgIHZhbHVlczogYXR0cmlidXRlTmFtZXNcbiAgICB9KVxuICAgIGlmICghYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc0FyZURlZmF1bHQpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IHRoaXMuZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe1xuICAgICAgICBmaWx0ZXJEZWZhdWx0VmFsdWVzOiB7Y3JlYXRlOiBcImNyZWF0ZVwiLCBpbmRleDogXCJpbmRleFwifSxcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmICghYnVpbHRJbk1lbWJlckNvbW1hbmRzQXJlRGVmYXVsdCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGZpbHRlckRlZmF1bHRWYWx1ZXM6IHtcbiAgICAgICAgICBhdHRhY2g6IFwiYXR0YWNoXCIsXG4gICAgICAgICAgZGVzdHJveTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgZG93bmxvYWQ6IFwiZG93bmxvYWRcIixcbiAgICAgICAgICBmaW5kOiBcImZpbmRcIixcbiAgICAgICAgICB1cGRhdGU6IFwidXBkYXRlXCIsXG4gICAgICAgICAgdXJsOiBcInVybFwiXG4gICAgICAgIH0sXG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGJ1aWx0SW5NZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3Rpb25Db21tYW5kcykubGVuZ3RoID4gMCkge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gdGhpcy5mb3JtYXR0ZWRPYmplY3RQcm9wZXJ0eSh7XG4gICAgICAgIGluZGVudDogXCIgICAgICBcIixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBcImNvbGxlY3Rpb25Db21tYW5kc1wiLFxuICAgICAgICB2YWx1ZXM6IGNvbGxlY3Rpb25Db21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKG1lbWJlckNvbW1hbmRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBmaWxlQ29udGVudCArPSB0aGlzLmZvcm1hdHRlZE9iamVjdFByb3BlcnR5KHtcbiAgICAgICAgaW5kZW50OiBcIiAgICAgIFwiLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IFwibWVtYmVyQ29tbWFuZHNcIixcbiAgICAgICAgdmFsdWVzOiBtZW1iZXJDb21tYW5kc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKG1vZGVsQ2xhc3MgJiYgbW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkgIT09IFwiaWRcIikge1xuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIHByaW1hcnlLZXk6ICR7SlNPTi5zdHJpbmdpZnkobW9kZWxDbGFzcy5wcmltYXJ5S2V5KCkpfSxcXG5gXG4gICAgfVxuICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiICB9XFxuXCJcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHt0eXBlOiBcXFwiYmVsb25nc1RvXFxcIiB8IFxcXCJoYXNPbmVcXFwiIHwgXFxcImhhc01hbnlcXFwifT59IC0gUmVsYXRpb25zaGlwIGRlZmluaXRpb25zLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcERlZmluaXRpb25zKCkge1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICByZXR1cm4ge1xcblwiXG4gICAgICBmb3IgKGNvbnN0IHJlbGF0aW9uc2hpcCBvZiByZWxhdGlvbnNoaXBzKSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfToge3R5cGU6ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnR5cGUpfX0sXFxuYFxuICAgICAgfVxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKiogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IC0gUmVsYXRpb25zaGlwIG1vZGVsIGNsYXNzIG5hbWVzLiAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgc3RhdGljIHJlbGF0aW9uc2hpcE1vZGVsQ2xhc3NlcygpIHtcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIHtcXG5cIlxuICAgICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgICBmaWxlQ29udGVudCArPSBgICAgICAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX06ICR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnRhcmdldENsYXNzTmFtZSl9LFxcbmBcbiAgICAgIH1cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgIH1cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNvbnN0IGNhbWVsaXplZEF0dHJpYnV0ZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUsIHRydWUpXG4gICAgICBjb25zdCBjYW1lbGl6ZWRBdHRyaWJ1dGVVcHBlciA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXR0cmlidXRlLm5hbWUpXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7JHthdHRyaWJ1dGVzVHlwZU5hbWV9WyR7SlNPTi5zdHJpbmdpZnkoYXR0cmlidXRlLm5hbWUpfV19IC0gQXR0cmlidXRlIHZhbHVlLiAqL1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7Y2FtZWxpemVkQXR0cmlidXRlfSgpIHsgcmV0dXJuIHRoaXMucmVhZEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0pIH1cXG5gXG5cbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHBhcmFtIHske2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XX0gbmV3VmFsdWUgLSBOZXcgYXR0cmlidXRlIHZhbHVlLlxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEByZXR1cm5zIHske2F0dHJpYnV0ZXNUeXBlTmFtZX1bJHtKU09OLnN0cmluZ2lmeShhdHRyaWJ1dGUubmFtZSl9XX0gLSBBc3NpZ25lZCB2YWx1ZS5cXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICovXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgIHNldCR7Y2FtZWxpemVkQXR0cmlidXRlVXBwZXJ9KG5ld1ZhbHVlKSB7IHJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgke0pTT04uc3RyaW5naWZ5KGF0dHJpYnV0ZS5uYW1lKX0sIG5ld1ZhbHVlKSB9XFxuYFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uQ29tbWFuZHMpKSB7XG4gICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgLyoqXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwYXlsb2FkPXt9XSAtIENvbW1hbmQgcGF5bG9hZC5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSAtIENvbW1hbmQgcmVzcG9uc2UuXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgKi9cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgc3RhdGljIGFzeW5jICR7bWV0aG9kTmFtZX0ocGF5bG9hZCA9IHt9KSB7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUN1c3RvbUNvbW1hbmQoe1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgY29tbWFuZE5hbWU6ICR7SlNPTi5zdHJpbmdpZnkoY29sbGVjdGlvbkNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb25Db21tYW5kc1ttZXRob2ROYW1lXSl9LFxcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAgICAgcGF5bG9hZCxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICByZXNvdXJjZVBhdGg6IHRoaXMucmVzb3VyY2VQYXRoKClcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgfSlcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIH1cXG5cIlxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhtZW1iZXJDb21tYW5kcykpIHtcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgIGZpbGVDb250ZW50ICs9IFwiICAvKipcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3BheWxvYWQ9e31dIC0gQ29tbWFuZCBwYXlsb2FkLlxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IC0gQ29tbWFuZCByZXNwb25zZS5cXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICBhc3luYyAke21ldGhvZE5hbWV9KHBheWxvYWQgPSB7fSkge1xcbmBcbiAgICAgIGZpbGVDb250ZW50ICs9IGAgICAgcmV0dXJuIGF3YWl0ICR7Y2xhc3NOYW1lfS5leGVjdXRlQ3VzdG9tQ29tbWFuZCh7XFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmROYW1lOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICAgIGNvbW1hbmRUeXBlOiAke0pTT04uc3RyaW5naWZ5KG1lbWJlckNvbW1hbmRzW21ldGhvZE5hbWVdKX0sXFxuYFxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBtZW1iZXJJZDogdGhpcy5wcmltYXJ5S2V5VmFsdWUoKSxcXG5cIlxuICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAgICBwYXlsb2FkLFxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBgICAgICAgcmVzb3VyY2VQYXRoOiAke2NsYXNzTmFtZX0ucmVzb3VyY2VQYXRoKClcXG5gXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgICB9KVxcblwiXG4gICAgICBmaWxlQ29udGVudCArPSBcIiAgfVxcblwiXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXAgb2YgcmVsYXRpb25zaGlwcykge1xuICAgICAgY29uc3QgcmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZCA9IGluZmxlY3Rpb24uY2FtZWxpemUocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpXG4gICAgICBjb25zdCB0YXJnZXRJbXBvcnRQYXRoID0gYC4vJHtyZWxhdGlvbnNoaXAudGFyZ2V0RmlsZU5hbWV9LmpzYFxuXG4gICAgICBpZiAocmVsYXRpb25zaGlwLnR5cGUgPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KGltcG9ydFBhdGgpfSkuRnJvbnRlbmRNb2RlbEhhc01hbnlSZWxhdGlvbnNoaXA8dHlwZW9mIGltcG9ydCgke0pTT04uc3RyaW5naWZ5KGAuLyR7aW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGNsYXNzTmFtZSkpfS5qc2ApfSkuZGVmYXVsdCwgdHlwZW9mIGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdD59IC0gUmVsYXRpb25zaGlwIGhlbHBlci4gKi9cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICR7cmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWV9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShpbXBvcnRQYXRoKX0pLkZyb250ZW5kTW9kZWxIYXNNYW55UmVsYXRpb25zaGlwPHR5cGVvZiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeShgLi8ke2luZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShjbGFzc05hbWUpKX0uanNgKX0pLmRlZmF1bHQsIHR5cGVvZiBpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQ+fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbHMuICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAke3JlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lfUxvYWRlZCgpIHsgcmV0dXJuIC8qKiBAdHlwZSB7QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pn0gKi8gKHRoaXMuZ2V0UmVsYXRpb25zaGlwQnlOYW1lKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkubG9hZGVkKCkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHJldHVybnMge1Byb21pc2U8QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pj59IC0gTG9hZGVkIHJlbGF0ZWQgbW9kZWxzLiAqL1xcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgYXN5bmMgbG9hZCR7cmVsYXRpb25zaGlwTmFtZUNhbWVsaXplZH0oKSB7IHJldHVybiAvKiogQHR5cGUge1Byb21pc2U8QXJyYXk8aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0Pj59ICovICh0aGlzLmxvYWRSZWxhdGlvbnNoaXAoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KSkgfVxcbmBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgLyoqIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSAtIExvYWRlZCByZWxhdGVkIG1vZGVsLiAqL1xcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgJHtyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZX0oKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGx9ICovICh0aGlzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZSgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0pLmxvYWRlZCgpKSB9XFxuYFxuXG4gICAgICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgIC8qKlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2F0dHJpYnV0ZXNdIC0gQXR0cmlidXRlcyBmb3IgdGhlIG5ldyByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gYCAgICogQHJldHVybnMge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdH0gLSBCdWlsdCByZWxhdGVkIG1vZGVsLlxcbmBcbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCIgICAqL1xcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGJ1aWxkJHtyZWxhdGlvbnNoaXBOYW1lQ2FtZWxpemVkfShhdHRyaWJ1dGVzID0ge30pIHsgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KCR7SlNPTi5zdHJpbmdpZnkodGFyZ2V0SW1wb3J0UGF0aCl9KS5kZWZhdWx0fSAqLyAodGhpcy5nZXRSZWxhdGlvbnNoaXBCeU5hbWUoJHtKU09OLnN0cmluZ2lmeShyZWxhdGlvbnNoaXAucmVsYXRpb25zaGlwTmFtZSl9KS5idWlsZChhdHRyaWJ1dGVzKSkgfVxcbmBcblxuICAgICAgICBmaWxlQ29udGVudCArPSBcIlxcblwiXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsPn0gLSBMb2FkZWQgcmVsYXRlZCBtb2RlbC4gKi9cXG5gXG4gICAgICAgIGZpbGVDb250ZW50ICs9IGAgIGFzeW5jIGxvYWQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KCkgeyByZXR1cm4gLyoqIEB0eXBlIHtQcm9taXNlPGltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGw+fSAqLyAodGhpcy5sb2FkUmVsYXRpb25zaGlwKCR7SlNPTi5zdHJpbmdpZnkocmVsYXRpb25zaGlwLnJlbGF0aW9uc2hpcE5hbWUpfSkpIH1cXG5gXG5cbiAgICAgICAgZmlsZUNvbnRlbnQgKz0gXCJcXG5cIlxuICAgICAgICBmaWxlQ29udGVudCArPSBgICAvKiogQHBhcmFtIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSBtb2RlbCAtIFJlbGF0ZWQgbW9kZWwuIEByZXR1cm5zIHtpbXBvcnQoJHtKU09OLnN0cmluZ2lmeSh0YXJnZXRJbXBvcnRQYXRoKX0pLmRlZmF1bHQgfCBudWxsfSAtIEFzc2lnbmVkIHJlbGF0ZWQgbW9kZWwuICovXFxuYFxuICAgICAgICBmaWxlQ29udGVudCArPSBgICBzZXQke3JlbGF0aW9uc2hpcE5hbWVDYW1lbGl6ZWR9KG1vZGVsKSB7IHJldHVybiAvKiogQHR5cGUge2ltcG9ydCgke0pTT04uc3RyaW5naWZ5KHRhcmdldEltcG9ydFBhdGgpfSkuZGVmYXVsdCB8IG51bGx9ICovICh0aGlzLnNldFJlbGF0aW9uc2hpcCgke0pTT04uc3RyaW5naWZ5KHJlbGF0aW9uc2hpcC5yZWxhdGlvbnNoaXBOYW1lKX0sIG1vZGVsKSkgfVxcbmBcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWxlQ29udGVudCArPSBcIn1cXG5cIlxuICAgIGZpbGVDb250ZW50ICs9IFwiXFxuXCJcbiAgICBmaWxlQ29udGVudCArPSBgRnJvbnRlbmRNb2RlbEJhc2UucmVnaXN0ZXJNb2RlbCgke2NsYXNzTmFtZX0pXFxuYFxuXG4gICAgcmV0dXJuIGZpbGVDb250ZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtBcnJheTx7Y2xhc3NOYW1lOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmd9Pn0gZ2VuZXJhdGVkRmlsZXMgLSBHZW5lcmF0ZWQgbW9kZWwgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gSW5kZXggZmlsZSBjb250ZW50IHRoYXQgaW1wb3J0cyBhbmQgcmUtZXhwb3J0cyBhbGwgbW9kZWxzLlxuICAgKi9cbiAgYnVpbGRJbmRleEZpbGVDb250ZW50KGdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGV0IGNvbnRlbnQgPSBcIlwiXG5cbiAgICBmb3IgKGNvbnN0IHtjbGFzc05hbWUsIGZpbGVOYW1lfSBvZiBnZW5lcmF0ZWRGaWxlcykge1xuICAgICAgY29udGVudCArPSBgZXhwb3J0IHtkZWZhdWx0IGFzICR7Y2xhc3NOYW1lfX0gZnJvbSBcIi4vJHtmaWxlTmFtZX1cIlxcbmBcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRm9ybWF0dGluZyBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5pbmRlbnQgLSBCYXNlIGluZGVudGF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5wcm9wZXJ0eU5hbWUgLSBPYmplY3QgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncy52YWx1ZXMgLSBTdHJpbmcgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgYXJyYXkgcHJvcGVydHkuXG4gICAqL1xuICBmb3JtYXR0ZWRBcnJheVByb3BlcnR5KHtpbmRlbnQsIHByb3BlcnR5TmFtZSwgdmFsdWVzfSkge1xuICAgIGxldCBvdXRwdXQgPSBgJHtpbmRlbnR9JHtwcm9wZXJ0eU5hbWV9OiBbXFxuYFxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIG91dHB1dCArPSBgJHtpbmRlbnR9ICAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9XSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBGb3JtYXR0aW5nIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmluZGVudCAtIEJhc2UgaW5kZW50YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnByb3BlcnR5TmFtZSAtIE9iamVjdCBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGFyZ3MudmFsdWVzIC0gT2JqZWN0IGtleS12YWx1ZXMuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuZmlsdGVyRGVmYXVsdFZhbHVlc10gLSBEZWZhdWx0IHZhbHVlcyB0byBvbWl0IGZyb20gb3V0cHV0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIEZvcm1hdHRlZCBtdWx0aWxpbmUgb2JqZWN0IHByb3BlcnR5LlxuICAgKi9cbiAgZm9ybWF0dGVkT2JqZWN0UHJvcGVydHkoe2ZpbHRlckRlZmF1bHRWYWx1ZXMsIGluZGVudCwgcHJvcGVydHlOYW1lLCB2YWx1ZXN9KSB7XG4gICAgbGV0IG91dHB1dCA9IGAke2luZGVudH0ke3Byb3BlcnR5TmFtZX06IHtcXG5gXG5cbiAgICBmb3IgKGNvbnN0IG9iamVjdEtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZXMpKSB7XG4gICAgICBpZiAoZmlsdGVyRGVmYXVsdFZhbHVlcyAmJiBmaWx0ZXJEZWZhdWx0VmFsdWVzW29iamVjdEtleV0gPT09IHZhbHVlc1tvYmplY3RLZXldKSBjb250aW51ZVxuXG4gICAgICBvdXRwdXQgKz0gYCR7aW5kZW50fSAgJHtvYmplY3RLZXl9OiAke0pTT04uc3RyaW5naWZ5KHZhbHVlc1tvYmplY3RLZXldKX0sXFxuYFxuICAgIH1cblxuICAgIG91dHB1dCArPSBgJHtpbmRlbnR9fSxcXG5gXG5cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uLy4uLy4uLy4uLy4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLm1vZGVsQ2xhc3MgLSBCYWNrZW5kIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MubW9kZWxDb25maWcgLSBNb2RlbCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8e2pzRG9jVHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9Pn0gLSBBdHRyaWJ1dGUgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBhdHRyaWJ1dGVEZWZpbml0aW9uc0Zvck1vZGVsKHttb2RlbENsYXNzLCBtb2RlbENvbmZpZ30pIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWxDb25maWcuYXR0cmlidXRlc1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXR0cmlidXRlcykpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlTmFtZSkgPT4gKHtcbiAgICAgICAganNEb2NUeXBlOiB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlKHtcbiAgICAgICAgICBhdHRyaWJ1dGVDb25maWc6IHRoaXMuZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pXG4gICAgICAgIH0pLFxuICAgICAgICBuYW1lOiBhdHRyaWJ1dGVOYW1lXG4gICAgICB9KSlcbiAgICB9XG5cbiAgICBpZiAoIWF0dHJpYnV0ZXMgfHwgdHlwZW9mIGF0dHJpYnV0ZXMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ2F0dHJpYnV0ZXMnIGFzIGFycmF5IG9yIG9iamVjdCBidXQgZ290OiAke2F0dHJpYnV0ZXN9YClcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXR0cmlidXRlcykubWFwKChhdHRyaWJ1dGVOYW1lKSA9PiB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVDb25maWcgPSBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpzRG9jVHlwZTogdGhpcy5qc0RvY1R5cGVGb3JGcm9udGVuZEF0dHJpYnV0ZSh7YXR0cmlidXRlQ29uZmlnfSksXG4gICAgICAgIG5hbWU6IGF0dHJpYnV0ZU5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gYXJncy5hdHRyaWJ1dGVDb25maWcgLSBBdHRyaWJ1dGUgY29uZmlndXJhdGlvbiB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGUoe2F0dHJpYnV0ZUNvbmZpZ30pIHtcbiAgICBjb25zdCBqc0RvY1R5cGUgPSB0aGlzLmpzRG9jVHlwZUZvckZyb250ZW5kQXR0cmlidXRlQmFzZVR5cGUoYXR0cmlidXRlQ29uZmlnKVxuXG4gICAgaWYgKCF0aGlzLmZyb250ZW5kQXR0cmlidXRlQ2FuQmVOdWxsKGF0dHJpYnV0ZUNvbmZpZykpIHtcbiAgICAgIHJldHVybiBqc0RvY1R5cGVcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7anNEb2NUeXBlfSB8IG51bGxgXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGF0dHJpYnV0ZUNvbmZpZyAtIEF0dHJpYnV0ZSBjb25maWd1cmF0aW9uIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vbi1udWxsYWJsZSBKU0RvYyB0eXBlLlxuICAgKi9cbiAganNEb2NUeXBlRm9yRnJvbnRlbmRBdHRyaWJ1dGVCYXNlVHlwZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gXCJhbnlcIlxuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZyb250ZW5kQXR0cmlidXRlVHlwZVZhbHVlKGF0dHJpYnV0ZUNvbmZpZylcblxuICAgIGlmICh0eXBlID09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gXCJib29sZWFuXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJqc29uXCIgfHwgdHlwZSA9PSBcImpzb25iXCIpIHtcbiAgICAgIHJldHVybiBcIlJlY29yZDxzdHJpbmcsIGFueT5cIlxuICAgIH0gZWxzZSBpZiAodHlwZSAmJiBbXCJibG9iXCIsIFwiY2hhclwiLCBcIm52YXJjaGFyXCIsIFwidmFyY2hhclwiLCBcInRleHRcIiwgXCJsb25ndGV4dFwiLCBcInV1aWRcIiwgXCJjaGFyYWN0ZXIgdmFyeWluZ1wiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiYml0XCIsIFwiYmlnaW50XCIsIFwiZGVjaW1hbFwiLCBcImRvdWJsZVwiLCBcImRvdWJsZSBwcmVjaXNpb25cIiwgXCJmbG9hdFwiLCBcImludFwiLCBcImludGVnZXJcIiwgXCJudW1lcmljXCIsIFwicmVhbFwiLCBcInNtYWxsaW50XCIsIFwidGlueWludFwiXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCJcbiAgICB9IGVsc2UgaWYgKHR5cGUgJiYgW1wiZGF0ZVwiLCBcImRhdGV0aW1lXCIsIFwidGltZXN0YW1wXCIsIFwidGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lXCIsIFwidGltZXN0YW1wdHpcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIHJldHVybiBcIkRhdGVcIlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJhbnlcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBhbGxvd3MgbnVsbCB2YWx1ZXMuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZUNhbkJlTnVsbChhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZUNvbmZpZy5nZXROdWxsKCkgPT09IHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmlidXRlQ29uZmlnLm51bGwgPT09IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gYXR0cmlidXRlQ29uZmlnIC0gQXR0cmlidXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIE5vcm1hbGl6ZWQgY29sdW1uIHR5cGUuXG4gICAqL1xuICBmcm9udGVuZEF0dHJpYnV0ZVR5cGVWYWx1ZShhdHRyaWJ1dGVDb25maWcpIHtcbiAgICBpZiAoIWF0dHJpYnV0ZUNvbmZpZyB8fCB0eXBlb2YgYXR0cmlidXRlQ29uZmlnICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXR0cmlidXRlQ29uZmlnLmdldFR5cGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGF0dHJpYnV0ZUNvbmZpZy5nZXRUeXBlKCkpXG4gICAgfVxuXG4gICAgY29uc3QgdHlwZVZhbHVlID0gYXR0cmlidXRlQ29uZmlnLnR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmNvbHVtblR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLnNxbFR5cGUgfHwgYXR0cmlidXRlQ29uZmlnLmRhdGFUeXBlXG5cbiAgICBpZiAodHlwZW9mIHR5cGVWYWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF0dHJpYnV0ZU5hbWUgLSBGcm9udGVuZCBtb2RlbCBhdHRyaWJ1dGUgbmFtZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MubW9kZWxDbGFzcyAtIEJhY2tlbmQgbW9kZWwgY2xhc3MuXG4gICAqIEByZXR1cm5zIHthbnl9IC0gQXR0cmlidXRlIGNvbmZpZyBpbmZlcnJlZCBmcm9tIHRoZSBiYWNrZW5kIG1vZGVsIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgZnJvbnRlbmRBdHRyaWJ1dGVDb25maWdGb3JNb2RlbEF0dHJpYnV0ZSh7YXR0cmlidXRlTmFtZSwgbW9kZWxDbGFzc30pIHtcbiAgICBpZiAoIW1vZGVsQ2xhc3MpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uTmFtZSA9IG1vZGVsQ2xhc3MuZ2V0QXR0cmlidXRlTmFtZVRvQ29sdW1uTmFtZU1hcCgpW2F0dHJpYnV0ZU5hbWVdXG5cbiAgICBpZiAoIWNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGVsQ2xhc3MuZ2V0Q29sdW1uc0hhc2goKVtjb2x1bW5OYW1lXSB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNsYXNzTmFtZSAtIE1vZGVsIGNsYXNzIG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5tb2RlbENvbmZpZyAtIE1vZGVsIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheTx7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSAtIFJlbGF0aW9uc2hpcHMuXG4gICAqL1xuICByZWxhdGlvbnNoaXBzRm9yTW9kZWwoe2NsYXNzTmFtZSwgbW9kZWxDb25maWd9KSB7XG4gICAgY29uc3QgcmVsYXRpb25zaGlwcyA9IG1vZGVsQ29uZmlnLnJlbGF0aW9uc2hpcHNcblxuICAgIGlmIChyZWxhdGlvbnNoaXBzID09PSB1bmRlZmluZWQgfHwgcmVsYXRpb25zaGlwcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwcykpIHtcbiAgICAgIHJldHVybiByZWxhdGlvbnNoaXBzLm1hcCgocmVsYXRpb25zaGlwTmFtZSkgPT4gdGhpcy5pbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZX0pKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVsYXRpb25zaGlwcyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyBoYXMgaW52YWxpZCByZWxhdGlvbnNoaXBzIGNvbmZpZ2ApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtBcnJheTx7cmVsYXRpb25zaGlwTmFtZTogc3RyaW5nLCB0YXJnZXRDbGFzc05hbWU6IHN0cmluZywgdGFyZ2V0RmlsZU5hbWU6IHN0cmluZywgdHlwZTogXCJiZWxvbmdzVG9cIiB8IFwiaGFzT25lXCIgfCBcImhhc01hbnlcIn0+fSAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBbXVxuXG4gICAgZm9yIChjb25zdCByZWxhdGlvbnNoaXBOYW1lIGluIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcCA9IHJlbGF0aW9uc2hpcHNbcmVsYXRpb25zaGlwTmFtZV1cblxuICAgICAgaWYgKHJlbGF0aW9uc2hpcCA9PT0gdHJ1ZSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2godGhpcy5pbmZlcnJlZFJlbGF0aW9uc2hpcERlZmluaXRpb24oe2NsYXNzTmFtZSwgcmVsYXRpb25zaGlwTmFtZX0pKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIXJlbGF0aW9uc2hpcCB8fCB0eXBlb2YgcmVsYXRpb25zaGlwICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocmVsYXRpb25zaGlwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsICcke2NsYXNzTmFtZX0nIHJlbGF0aW9uc2hpcCAnJHtyZWxhdGlvbnNoaXBOYW1lfScgbXVzdCBiZSBhbiBvYmplY3Qgb3IgdHJ1ZWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcE1vZGVsTmFtZSA9IHJlbGF0aW9uc2hpcC5tb2RlbENsYXNzTmFtZSB8fCByZWxhdGlvbnNoaXAuY2xhc3NOYW1lIHx8IHJlbGF0aW9uc2hpcC5tb2RlbFxuICAgICAgY29uc3QgaGFzRXhwbGljaXRUeXBlID0gdHlwZW9mIHJlbGF0aW9uc2hpcC50eXBlID09PSBcInN0cmluZ1wiICYmIHJlbGF0aW9uc2hpcC50eXBlLmxlbmd0aCA+IDBcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0TW9kZWwgPSB0eXBlb2YgcmVsYXRpb25zaGlwTW9kZWxOYW1lID09PSBcInN0cmluZ1wiICYmIHJlbGF0aW9uc2hpcE1vZGVsTmFtZS5sZW5ndGggPiAwXG4gICAgICBjb25zdCBpbmZlcnJlZFJlbGF0aW9uc2hpcCA9IGhhc0V4cGxpY2l0VHlwZSAmJiBoYXNFeHBsaWNpdE1vZGVsXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHRoaXMuaW5mZXJyZWRSZWxhdGlvbnNoaXBEZWZpbml0aW9uKHtjbGFzc05hbWUsIHJlbGF0aW9uc2hpcE5hbWV9KVxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC50eXBlIHx8IGluZmVycmVkUmVsYXRpb25zaGlwPy50eXBlXG5cbiAgICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyBpbnZhbGlkIHR5cGUgJyR7cmVsYXRpb25zaGlwVHlwZX0nYClcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0Q2xhc3NOYW1lID0gaGFzRXhwbGljaXRNb2RlbFxuICAgICAgICA/IGluZmxlY3Rpb24uY2FtZWxpemUoU3RyaW5nKHJlbGF0aW9uc2hpcE1vZGVsTmFtZSkucmVwbGFjZUFsbChcIi1cIiwgXCJfXCIpKVxuICAgICAgICA6IGluZmVycmVkUmVsYXRpb25zaGlwPy50YXJnZXRDbGFzc05hbWVcblxuICAgICAgaWYgKCF0YXJnZXRDbGFzc05hbWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuICAgICAgfVxuXG4gICAgICBub3JtYWxpemVkLnB1c2goe1xuICAgICAgICByZWxhdGlvbnNoaXBOYW1lLFxuICAgICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICAgIHRhcmdldEZpbGVOYW1lOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGFyZ2V0Q2xhc3NOYW1lKSksXG4gICAgICAgIHR5cGU6IHJlbGF0aW9uc2hpcFR5cGVcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIEFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY2xhc3NOYW1lIC0gTW9kZWwgY2xhc3MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVsYXRpb25zaGlwTmFtZSAtIFJlbGF0aW9uc2hpcCBuYW1lLlxuICAgKiBAcmV0dXJucyB7e3JlbGF0aW9uc2hpcE5hbWU6IHN0cmluZywgdGFyZ2V0Q2xhc3NOYW1lOiBzdHJpbmcsIHRhcmdldEZpbGVOYW1lOiBzdHJpbmcsIHR5cGU6IFwiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9fSBJbmZlcnJlZCByZWxhdGlvbnNoaXAgZGVmaW5pdGlvbi5cbiAgICovXG4gIGluZmVycmVkUmVsYXRpb25zaGlwRGVmaW5pdGlvbih7Y2xhc3NOYW1lLCByZWxhdGlvbnNoaXBOYW1lfSkge1xuICAgIGNvbnN0IG1vZGVsQ2xhc3MgPSB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5nZXRNb2RlbENsYXNzKGNsYXNzTmFtZSlcblxuICAgIGlmICghbW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBiYWNrZW5kIG1vZGVsIGNsYXNzICcke2NsYXNzTmFtZX0nIGZvciByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nYClcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGlvbnNoaXAgPSBtb2RlbENsYXNzLmdldFJlbGF0aW9uc2hpcEJ5TmFtZShyZWxhdGlvbnNoaXBOYW1lKVxuICAgIGNvbnN0IHRhcmdldE1vZGVsQ2xhc3MgPSByZWxhdGlvbnNoaXAuZ2V0VGFyZ2V0TW9kZWxDbGFzcygpXG4gICAgY29uc3QgcmVsYXRpb25zaGlwVHlwZSA9IHJlbGF0aW9uc2hpcC5nZXRUeXBlKClcblxuICAgIGlmIChyZWxhdGlvbnNoaXBUeXBlICE9PSBcImJlbG9uZ3NUb1wiICYmIHJlbGF0aW9uc2hpcFR5cGUgIT09IFwiaGFzT25lXCIgJiYgcmVsYXRpb25zaGlwVHlwZSAhPT0gXCJoYXNNYW55XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgJyR7Y2xhc3NOYW1lfScgcmVsYXRpb25zaGlwICcke3JlbGF0aW9uc2hpcE5hbWV9JyBoYXMgdW5zdXBwb3J0ZWQgdHlwZSAnJHtyZWxhdGlvbnNoaXBUeXBlfSdgKVxuICAgIH1cblxuICAgIGlmICghdGFyZ2V0TW9kZWxDbGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCAnJHtjbGFzc05hbWV9JyByZWxhdGlvbnNoaXAgJyR7cmVsYXRpb25zaGlwTmFtZX0nIGhhcyBubyB0YXJnZXQgbW9kZWwgY2xhc3NgKVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldENsYXNzTmFtZSA9IHRhcmdldE1vZGVsQ2xhc3MubmFtZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbGF0aW9uc2hpcE5hbWUsXG4gICAgICB0YXJnZXRDbGFzc05hbWUsXG4gICAgICB0YXJnZXRGaWxlTmFtZTogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHRhcmdldENsYXNzTmFtZSkpLFxuICAgICAgdHlwZTogcmVsYXRpb25zaGlwVHlwZVxuICAgIH1cbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/migration.js"],"names":[],"mappings":"AAMA;;GAEG;AAEH;IACE;;OAEG;IACH,WAFa,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC,CA0BzD;CACF;4CAhCY;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC;wBAPlI,oCAAoC"}
1
+ {"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../../../../../../../src/environment-handlers/node/cli/commands/generate/migration.js"],"names":[],"mappings":"AAMA;;GAEG;AAEH;IACE;;OAEG;IACH,WAFa,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC,CA6BzD;CACF;4CAnCY;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC;wBAPlI,oCAAoC"}