@bizdoc/core 2.4.16 → 2.5.0

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 (405) hide show
  1. package/assets/bizdoc-schema.json +1 -1
  2. package/assets/system/ping-identity.svg +60 -0
  3. package/assets/themes/brown.min.css +1 -1
  4. package/assets/themes/dark.min.css +1 -1
  5. package/assets/themes/deep-purple-light-blue.min.css +5 -5
  6. package/assets/themes/deep-purple-teal.min.css +1 -1
  7. package/assets/themes/default.min.css +5 -5
  8. package/assets/themes/green.min.css +1 -1
  9. package/assets/themes/indigo.min.css +1 -1
  10. package/esm2022/lib/admin/admin-dismiss.service.mjs +3 -3
  11. package/esm2022/lib/admin/admin-menu.component.mjs +3 -3
  12. package/esm2022/lib/admin/architecture/cube-axes-filter.component.mjs +3 -3
  13. package/esm2022/lib/admin/architecture/declarations.mjs +3 -2
  14. package/esm2022/lib/admin/architecture/designer-element.component.mjs +15 -15
  15. package/esm2022/lib/admin/architecture/designer-privileges.component.mjs +3 -3
  16. package/esm2022/lib/admin/architecture/designer.base.mjs +9 -9
  17. package/esm2022/lib/admin/architecture/designer.component.mjs +6 -6
  18. package/esm2022/lib/admin/architecture/elements/action.component.mjs +3 -3
  19. package/esm2022/lib/admin/architecture/elements/analysis-view.component.mjs +3 -3
  20. package/esm2022/lib/admin/architecture/elements/analysis-widget.component.mjs +3 -3
  21. package/esm2022/lib/admin/architecture/elements/anomaly-rule.component.mjs +3 -3
  22. package/esm2022/lib/admin/architecture/elements/attribute.component.mjs +3 -3
  23. package/esm2022/lib/admin/architecture/elements/box-form.component.mjs +3 -3
  24. package/esm2022/lib/admin/architecture/elements/configuration-datasource.component.mjs +3 -3
  25. package/esm2022/lib/admin/architecture/elements/control.component.mjs +3 -3
  26. package/esm2022/lib/admin/architecture/elements/cube-index-utility.component.mjs +3 -3
  27. package/esm2022/lib/admin/architecture/elements/cube-view.component.mjs +3 -3
  28. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +3 -3
  29. package/esm2022/lib/admin/architecture/elements/document-state-widget.component.mjs +3 -3
  30. package/esm2022/lib/admin/architecture/elements/documents-report.component.mjs +3 -3
  31. package/esm2022/lib/admin/architecture/elements/documents-widget.component.mjs +3 -3
  32. package/esm2022/lib/admin/architecture/elements/explore-view.component.mjs +3 -3
  33. package/esm2022/lib/admin/architecture/elements/folder.component.mjs +3 -3
  34. package/esm2022/lib/admin/architecture/elements/form-invite.dialog.mjs +3 -3
  35. package/esm2022/lib/admin/architecture/elements/form.component.mjs +3 -3
  36. package/esm2022/lib/admin/architecture/elements/guide.component.mjs +3 -3
  37. package/esm2022/lib/admin/architecture/elements/job.component.mjs +3 -3
  38. package/esm2022/lib/admin/architecture/elements/matrix-view.component.mjs +3 -3
  39. package/esm2022/lib/admin/architecture/elements/node.component.mjs +3 -3
  40. package/esm2022/lib/admin/architecture/elements/parallel-view.component.mjs +3 -3
  41. package/esm2022/lib/admin/architecture/elements/performance-report.component.mjs +3 -3
  42. package/esm2022/lib/admin/architecture/elements/performance-widget.component.mjs +3 -3
  43. package/esm2022/lib/admin/architecture/elements/pivot-view.component.mjs +3 -3
  44. package/esm2022/lib/admin/architecture/elements/policy.component.mjs +3 -3
  45. package/esm2022/lib/admin/architecture/elements/report.component.mjs +3 -3
  46. package/esm2022/lib/admin/architecture/elements/return-to-role-action.component.mjs +3 -3
  47. package/esm2022/lib/admin/architecture/elements/role.component.mjs +11 -8
  48. package/esm2022/lib/admin/architecture/elements/rule.component.mjs +3 -3
  49. package/esm2022/lib/admin/architecture/elements/source.component.mjs +3 -3
  50. package/esm2022/lib/admin/architecture/elements/state.component.mjs +3 -3
  51. package/esm2022/lib/admin/architecture/elements/sum-view.component.mjs +3 -3
  52. package/esm2022/lib/admin/architecture/elements/tasks-report.component.mjs +3 -3
  53. package/esm2022/lib/admin/architecture/elements/type.component.mjs +3 -3
  54. package/esm2022/lib/admin/architecture/elements/usage-report.component.mjs +3 -3
  55. package/esm2022/lib/admin/architecture/elements/utility.component.mjs +3 -3
  56. package/esm2022/lib/admin/architecture/elements/view.component.mjs +3 -3
  57. package/esm2022/lib/admin/architecture/elements/widget.component.mjs +3 -3
  58. package/esm2022/lib/admin/architecture/icon-picker.component.mjs +3 -3
  59. package/esm2022/lib/admin/core/ace.input.mjs +3 -3
  60. package/esm2022/lib/admin/core/color-picker.input.mjs +3 -3
  61. package/esm2022/lib/admin/core/localized-string.component.mjs +3 -3
  62. package/esm2022/lib/admin/core/search.input.mjs +3 -3
  63. package/esm2022/lib/admin/diff/configuration-diff.component.mjs +3 -3
  64. package/esm2022/lib/admin/document-trace/document-trace.component.mjs +3 -3
  65. package/esm2022/lib/admin/document-trace/reassign.dialog.mjs +3 -3
  66. package/esm2022/lib/admin/document-trace/trace-element.component.mjs +3 -3
  67. package/esm2022/lib/admin/form/designer/box-designer.component.mjs +3 -3
  68. package/esm2022/lib/admin/form/designer/design-control.component.mjs +3 -3
  69. package/esm2022/lib/admin/form/designer/properties.component.mjs +3 -3
  70. package/esm2022/lib/admin/form/designer/section.component.mjs +3 -3
  71. package/esm2022/lib/admin/form/designer/settings.component.mjs +3 -3
  72. package/esm2022/lib/admin/form/form.resolve.service.mjs +3 -3
  73. package/esm2022/lib/admin/form/workflow/node.component.mjs +3 -3
  74. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +5 -5
  75. package/esm2022/lib/admin/form/workflow/workflow.component.mjs +3 -3
  76. package/esm2022/lib/admin/indices/manage-cube-index.component.mjs +3 -3
  77. package/esm2022/lib/admin/patterns/patterns.component.mjs +3 -3
  78. package/esm2022/lib/admin/permissions/permissions.component.mjs +3 -3
  79. package/esm2022/lib/admin/positions/positions-popup.component.mjs +3 -3
  80. package/esm2022/lib/admin/positions/positions.component.mjs +3 -3
  81. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +3 -3
  82. package/esm2022/lib/admin/profiler/profiler.component.mjs +3 -3
  83. package/esm2022/lib/admin/system.service.mjs +3 -3
  84. package/esm2022/lib/admin/utility-wrapper.component.mjs +3 -3
  85. package/esm2022/lib/admin/utility.pane.component.mjs +3 -3
  86. package/esm2022/lib/app.component.mjs +6 -6
  87. package/esm2022/lib/bizdoc.module.mjs +4 -4
  88. package/esm2022/lib/browse/browse-items.component.mjs +3 -3
  89. package/esm2022/lib/browse/browse.mobile.component.mjs +3 -3
  90. package/esm2022/lib/browse/browse.pane.component.mjs +3 -3
  91. package/esm2022/lib/browse/expanded-item/expanded-item.component.mjs +3 -3
  92. package/esm2022/lib/browse/filter/filter.component.mjs +3 -3
  93. package/esm2022/lib/browse/folders-menu.component.mjs +3 -3
  94. package/esm2022/lib/chat/chat-info.mjs +3 -3
  95. package/esm2022/lib/chat/chat.mobile.component.mjs +3 -3
  96. package/esm2022/lib/chat/chat.service.mjs +3 -3
  97. package/esm2022/lib/chat/contacts.component.mjs +6 -6
  98. package/esm2022/lib/chat/contacts.pane.component.mjs +3 -3
  99. package/esm2022/lib/chat/conversation.component.mjs +3 -3
  100. package/esm2022/lib/chat/conversation.pane.component.mjs +3 -3
  101. package/esm2022/lib/compose/action/action-picker.component.mjs +3 -3
  102. package/esm2022/lib/compose/action/action.dialog.mjs +3 -3
  103. package/esm2022/lib/compose/action/action.pane.dialog.exp.mjs +3 -3
  104. package/esm2022/lib/compose/action/assign-action.component.mjs +3 -3
  105. package/esm2022/lib/compose/action/moveto-action.component.mjs +3 -3
  106. package/esm2022/lib/compose/action/return-action.component.mjs +3 -3
  107. package/esm2022/lib/compose/attachments/attachments.component.mjs +3 -3
  108. package/esm2022/lib/compose/attachments/preview/attachment-preview.component.mjs +3 -3
  109. package/esm2022/lib/compose/attachments/progress-button.directive.mjs +3 -3
  110. package/esm2022/lib/compose/box/box.component.mjs +3 -3
  111. package/esm2022/lib/compose/box/control.component.mjs +3 -3
  112. package/esm2022/lib/compose/box/row.component.mjs +3 -3
  113. package/esm2022/lib/compose/can-deactivate-changes.service.mjs +3 -3
  114. package/esm2022/lib/compose/comments/comment.component.mjs +3 -3
  115. package/esm2022/lib/compose/comments/comments.component.mjs +3 -3
  116. package/esm2022/lib/compose/comments/comments.pane.component.mjs +3 -3
  117. package/esm2022/lib/compose/comments/edit-comment.component.mjs +3 -3
  118. package/esm2022/lib/compose/comments/edits.component.mjs +3 -3
  119. package/esm2022/lib/compose/comments/quick-comment.component.exp.mjs +3 -3
  120. package/esm2022/lib/compose/comments/votes.component.mjs +3 -3
  121. package/esm2022/lib/compose/compose-resolve.service.mjs +3 -3
  122. package/esm2022/lib/compose/compose.mobile.component.mjs +3 -3
  123. package/esm2022/lib/compose/compose.pane.component.mjs +3 -3
  124. package/esm2022/lib/compose/copy/copy.dialog.mjs +3 -3
  125. package/esm2022/lib/compose/dismiss.service.mjs +3 -3
  126. package/esm2022/lib/compose/document-resolve.service.mjs +3 -3
  127. package/esm2022/lib/compose/document-resolver.service.mjs +3 -3
  128. package/esm2022/lib/compose/document.component.mjs +3 -3
  129. package/esm2022/lib/compose/document.mobile.component.mjs +3 -3
  130. package/esm2022/lib/compose/document.pane.component.mjs +3 -3
  131. package/esm2022/lib/compose/events/events.component.mjs +3 -3
  132. package/esm2022/lib/compose/form-selector/form-selector.sheet.mjs +3 -3
  133. package/esm2022/lib/compose/form.component.mjs +3 -3
  134. package/esm2022/lib/compose/new-menu.component.mjs +3 -3
  135. package/esm2022/lib/compose/overlay.component.exp.mjs +3 -3
  136. package/esm2022/lib/compose/privilage.directive.mjs +6 -6
  137. package/esm2022/lib/compose/recipient-resolver.service.mjs +3 -3
  138. package/esm2022/lib/compose/state.component.mjs +3 -3
  139. package/esm2022/lib/compose/tag/tags.component.mjs +3 -3
  140. package/esm2022/lib/compose/trace/flow.component.mjs +3 -3
  141. package/esm2022/lib/compose/trace/people.component.mjs +3 -3
  142. package/esm2022/lib/compose/trace/trace.base.mjs +3 -3
  143. package/esm2022/lib/compose/trace/trace.component.mjs +3 -3
  144. package/esm2022/lib/compose/trace/trace.pane.component.mjs +3 -3
  145. package/esm2022/lib/compose/version-compare/version-compare.component.mjs +3 -3
  146. package/esm2022/lib/compose/version-compare/version-compare.directive.mjs +9 -9
  147. package/esm2022/lib/compose/version-compare/version.pane.component.mjs +3 -3
  148. package/esm2022/lib/core/account.service.mjs +3 -3
  149. package/esm2022/lib/core/animated-icon/animated-icon.directive.mjs +3 -3
  150. package/esm2022/lib/core/avatar/avatar.component.mjs +3 -3
  151. package/esm2022/lib/core/checkbox.mjs +3 -3
  152. package/esm2022/lib/core/component-factory-resolver.mjs +3 -3
  153. package/esm2022/lib/core/datasource.service.mjs +3 -3
  154. package/esm2022/lib/core/document-factory.service.mjs +3 -3
  155. package/esm2022/lib/core/fields/address.designer.mjs +3 -3
  156. package/esm2022/lib/core/fields/address.field.mjs +3 -3
  157. package/esm2022/lib/core/fields/autocomplete.field.mjs +6 -6
  158. package/esm2022/lib/core/fields/checkbox.designer.mjs +3 -3
  159. package/esm2022/lib/core/fields/checkbox.field.mjs +3 -3
  160. package/esm2022/lib/core/fields/checklist.designer.mjs +3 -3
  161. package/esm2022/lib/core/fields/checklist.field.mjs +3 -3
  162. package/esm2022/lib/core/fields/date-range.designer.mjs +3 -3
  163. package/esm2022/lib/core/fields/date-range.field.mjs +3 -3
  164. package/esm2022/lib/core/fields/date.designer.mjs +3 -3
  165. package/esm2022/lib/core/fields/date.field.mjs +3 -3
  166. package/esm2022/lib/core/fields/expression.field.mjs +6 -6
  167. package/esm2022/lib/core/fields/file.designer.mjs +3 -3
  168. package/esm2022/lib/core/fields/file.field.mjs +3 -3
  169. package/esm2022/lib/core/fields/html.designer.mjs +3 -3
  170. package/esm2022/lib/core/fields/html.field.mjs +3 -3
  171. package/esm2022/lib/core/fields/input.designer.mjs +3 -3
  172. package/esm2022/lib/core/fields/input.field.mjs +3 -3
  173. package/esm2022/lib/core/fields/localized-string.field.mjs +6 -6
  174. package/esm2022/lib/core/fields/numeric.designer.mjs +3 -3
  175. package/esm2022/lib/core/fields/numeric.field.mjs +3 -3
  176. package/esm2022/lib/core/fields/options.base.mjs +6 -6
  177. package/esm2022/lib/core/fields/options.component.mjs +3 -3
  178. package/esm2022/lib/core/fields/radio-button.designer.mjs +3 -3
  179. package/esm2022/lib/core/fields/radio-button.field.mjs +3 -3
  180. package/esm2022/lib/core/fields/select.designer.mjs +3 -3
  181. package/esm2022/lib/core/fields/select.field.mjs +3 -3
  182. package/esm2022/lib/core/fields/signature.designer.mjs +3 -3
  183. package/esm2022/lib/core/fields/signature.field.mjs +3 -3
  184. package/esm2022/lib/core/fields/switch.field.mjs +3 -3
  185. package/esm2022/lib/core/fields/tags.designer.mjs +3 -3
  186. package/esm2022/lib/core/fields/tags.field.mjs +3 -3
  187. package/esm2022/lib/core/fields/textarea.designer.mjs +3 -3
  188. package/esm2022/lib/core/fields/textarea.field.mjs +3 -3
  189. package/esm2022/lib/core/fields/time.designer.mjs +3 -3
  190. package/esm2022/lib/core/fields/time.field.mjs +3 -3
  191. package/esm2022/lib/core/fields/timespan.field.mjs +6 -6
  192. package/esm2022/lib/core/fields/yesno.designer.mjs +3 -3
  193. package/esm2022/lib/core/fields/yesno.field.mjs +3 -3
  194. package/esm2022/lib/core/firebase.service.mjs +2 -1
  195. package/esm2022/lib/core/guide/guide.component.mjs +3 -3
  196. package/esm2022/lib/core/guide/guide.service.mjs +3 -3
  197. package/esm2022/lib/core/guide/help-tip.component.mjs +3 -3
  198. package/esm2022/lib/core/http.interceptor.mjs +3 -3
  199. package/esm2022/lib/core/hub.service.mjs +3 -3
  200. package/esm2022/lib/core/identity/identity.component.mjs +3 -3
  201. package/esm2022/lib/core/info/attachment-info.service.mjs +3 -3
  202. package/esm2022/lib/core/info/document-info.service.mjs +3 -3
  203. package/esm2022/lib/core/info/location-info.component.mjs +3 -3
  204. package/esm2022/lib/core/info/map-info.mjs +3 -3
  205. package/esm2022/lib/core/inputs/address.input.mjs +3 -3
  206. package/esm2022/lib/core/inputs/auto-complete.input.mjs +3 -3
  207. package/esm2022/lib/core/inputs/combination-picker-body.mjs +3 -3
  208. package/esm2022/lib/core/inputs/combination-picker.mjs +3 -3
  209. package/esm2022/lib/core/inputs/combination-pool.mjs +3 -3
  210. package/esm2022/lib/core/inputs/file.input.mjs +3 -3
  211. package/esm2022/lib/core/inputs/select.input.mjs +3 -3
  212. package/esm2022/lib/core/inputs/signature.input.mjs +3 -3
  213. package/esm2022/lib/core/inputs/time-picker.mjs +3 -3
  214. package/esm2022/lib/core/inputs/timespan.input.mjs +3 -3
  215. package/esm2022/lib/core/layout.component.mjs +3 -3
  216. package/esm2022/lib/core/lottie-animation.mjs +3 -3
  217. package/esm2022/lib/core/mailbox.service.mjs +3 -3
  218. package/esm2022/lib/core/none.component.mjs +3 -3
  219. package/esm2022/lib/core/pipes/action.pipe.mjs +3 -3
  220. package/esm2022/lib/core/pipes/calendar.pipe.mjs +3 -3
  221. package/esm2022/lib/core/pipes/date-format.pipe.mjs +3 -3
  222. package/esm2022/lib/core/pipes/daterange.pipe.mjs +6 -6
  223. package/esm2022/lib/core/pipes/difference.pipe.mjs +3 -3
  224. package/esm2022/lib/core/pipes/duration-format.pipe.mjs +3 -3
  225. package/esm2022/lib/core/pipes/duration.pipe.mjs +3 -3
  226. package/esm2022/lib/core/pipes/form.pipe.mjs +3 -3
  227. package/esm2022/lib/core/pipes/join.pipe.mjs +3 -3
  228. package/esm2022/lib/core/pipes/localized-string.pipe.mjs +3 -3
  229. package/esm2022/lib/core/pipes/role.pipe.mjs +3 -3
  230. package/esm2022/lib/core/pipes/sanitize-html.pipe.mjs +3 -3
  231. package/esm2022/lib/core/pipes/sort.pipe.mjs +9 -9
  232. package/esm2022/lib/core/pipes/state.pipe.mjs +3 -3
  233. package/esm2022/lib/core/pipes/time-ago.pipe.mjs +3 -3
  234. package/esm2022/lib/core/pipes/to-now.pipe.mjs +3 -3
  235. package/esm2022/lib/core/pipes/translate.pipe.mjs +9 -9
  236. package/esm2022/lib/core/pipes/type-value.pipe.mjs +3 -3
  237. package/esm2022/lib/core/pipes/user-name.pipe.mjs +3 -3
  238. package/esm2022/lib/core/popup/popup.component.mjs +3 -3
  239. package/esm2022/lib/core/popup/popup.service.mjs +3 -3
  240. package/esm2022/lib/core/popup/tooltip.directive.mjs +6 -6
  241. package/esm2022/lib/core/prompt/ask/ask.dialog.mjs +3 -3
  242. package/esm2022/lib/core/prompt/mask/mask.component.mjs +3 -3
  243. package/esm2022/lib/core/prompt.service.mjs +3 -3
  244. package/esm2022/lib/core/router.mjs +6 -6
  245. package/esm2022/lib/core/save-changes.dialog.mjs +3 -3
  246. package/esm2022/lib/core/session.service.mjs +3 -3
  247. package/esm2022/lib/core/slots/router.directive.mjs +3 -3
  248. package/esm2022/lib/core/slots/router.service.mjs +13 -6
  249. package/esm2022/lib/core/slots/slots.component.mjs +98 -58
  250. package/esm2022/lib/core/sticky-toolbar.exp.mjs +3 -3
  251. package/esm2022/lib/core/tagging/documents.component.mjs +3 -3
  252. package/esm2022/lib/core/tagging/edit-input.component.mjs +3 -3
  253. package/esm2022/lib/core/tagging/emoji.component.mjs +6 -6
  254. package/esm2022/lib/core/tagging/tagging-item.directive.mjs +3 -3
  255. package/esm2022/lib/core/tagging/tagging.component-base.mjs +3 -3
  256. package/esm2022/lib/core/tagging/tagging.directive.mjs +3 -3
  257. package/esm2022/lib/core/tagging/tagging.pipe.mjs +3 -3
  258. package/esm2022/lib/core/tagging/users.component.mjs +3 -3
  259. package/esm2022/lib/core/translate.service.mjs +3 -3
  260. package/esm2022/lib/core/virtual-tabs.component.exp.mjs +6 -6
  261. package/esm2022/lib/core/window-title.service.mjs +3 -3
  262. package/esm2022/lib/cube/accum/accum.component.mjs +3 -3
  263. package/esm2022/lib/cube/chart/chart.component.mjs +3 -3
  264. package/esm2022/lib/cube/cube-info.service.mjs +3 -3
  265. package/esm2022/lib/cube/cube-menu.component.mjs +3 -3
  266. package/esm2022/lib/cube/cube-view.component.mjs +3 -3
  267. package/esm2022/lib/cube/cube.service.mjs +3 -3
  268. package/esm2022/lib/cube/explore/document-item.component.mjs +3 -3
  269. package/esm2022/lib/cube/explore/explore-item.component.mjs +3 -3
  270. package/esm2022/lib/cube/explore/explore-items.component.mjs +3 -3
  271. package/esm2022/lib/cube/explore/explore.pane.component.mjs +3 -3
  272. package/esm2022/lib/cube/explore/item-resolver.service.mjs +6 -6
  273. package/esm2022/lib/cube/explore/item.pane.component.mjs +3 -3
  274. package/esm2022/lib/cube/filter/filter-tags.component.exp.mjs +3 -3
  275. package/esm2022/lib/cube/filter/filter.component.mjs +3 -3
  276. package/esm2022/lib/cube/grid/grid.component.mjs +3 -3
  277. package/esm2022/lib/cube/matrix/matrix.base.mjs +3 -3
  278. package/esm2022/lib/cube/matrix/matrix.mobile.component.mjs +3 -3
  279. package/esm2022/lib/cube/matrix/matrix.pane.component.mjs +3 -3
  280. package/esm2022/lib/cube/matrix/popup.component.mjs +3 -3
  281. package/esm2022/lib/cube/matrix/table.component.mjs +3 -3
  282. package/esm2022/lib/cube/parallel/parallel.component.mjs +3 -3
  283. package/esm2022/lib/cube/pivot/pivot.component.mjs +3 -3
  284. package/esm2022/lib/cube/spreadsheet/spreadsheet.component.mjs +3 -3
  285. package/esm2022/lib/cube/spreadsheet/spreadsheet.container.exp.mjs +3 -3
  286. package/esm2022/lib/cube/sum/sum.component.mjs +3 -3
  287. package/esm2022/lib/cube/view-base.mjs +3 -3
  288. package/esm2022/lib/cube/view.mobile.component.mjs +3 -3
  289. package/esm2022/lib/cube/view.pane.component.mjs +3 -3
  290. package/esm2022/lib/dashboard/actions/actions.widget.mjs +3 -3
  291. package/esm2022/lib/dashboard/cube/accum-cube.widget.mjs +3 -3
  292. package/esm2022/lib/dashboard/cube/compare.widget.mjs +3 -3
  293. package/esm2022/lib/dashboard/cube/cube-analysis.base.mjs +3 -3
  294. package/esm2022/lib/dashboard/cube/cube-analysis.widget.mjs +3 -3
  295. package/esm2022/lib/dashboard/cube/cube-chart.widget.mjs +3 -3
  296. package/esm2022/lib/dashboard/cube/document-state.widget.mjs +3 -3
  297. package/esm2022/lib/dashboard/cube/documents.widget.mjs +3 -3
  298. package/esm2022/lib/dashboard/cube/filter/filter.component.mjs +3 -3
  299. package/esm2022/lib/dashboard/dashboard.component.mjs +3 -3
  300. package/esm2022/lib/dashboard/dashboard.pane.component.mjs +3 -3
  301. package/esm2022/lib/dashboard/recents/recents.widget.mjs +3 -3
  302. package/esm2022/lib/dashboard/score/activity.widget.mjs +3 -3
  303. package/esm2022/lib/dashboard/score/compare-groups.widget.mjs +3 -3
  304. package/esm2022/lib/dashboard/score/peers-performance.widget.mjs +7 -7
  305. package/esm2022/lib/dashboard/score/pending-results.widget.mjs +3 -3
  306. package/esm2022/lib/dashboard/score/personal-score.widget.mjs +3 -3
  307. package/esm2022/lib/dashboard/widget-item.component.mjs +3 -3
  308. package/esm2022/lib/designer.module.mjs +4 -4
  309. package/esm2022/lib/desktop.module.mjs +4 -4
  310. package/esm2022/lib/home/about/about.dialog.mjs +3 -3
  311. package/esm2022/lib/home/home-base.component.mjs +3 -3
  312. package/esm2022/lib/home/home.desktop.component.mjs +34 -32
  313. package/esm2022/lib/home/home.mobile.component.mjs +3 -3
  314. package/esm2022/lib/home/notifications/notifications.component.mjs +3 -3
  315. package/esm2022/lib/home/options/options.component.mjs +3 -3
  316. package/esm2022/lib/home/outofoffice/outofoffice.component.mjs +3 -3
  317. package/esm2022/lib/home/sign/sign.component.mjs +3 -3
  318. package/esm2022/lib/impersonate/impersonate.component.mjs +3 -3
  319. package/esm2022/lib/mobile.module.mjs +4 -4
  320. package/esm2022/lib/modules/chart.module.mjs +4 -4
  321. package/esm2022/lib/modules/circular-gauge.module.mjs +4 -4
  322. package/esm2022/lib/modules/datepicker.intl.mjs +3 -3
  323. package/esm2022/lib/modules/dayjs.module.mjs +4 -4
  324. package/esm2022/lib/modules/diagram.module.mjs +4 -4
  325. package/esm2022/lib/modules/gantt.module.mjs +4 -4
  326. package/esm2022/lib/modules/grid.module.mjs +4 -4
  327. package/esm2022/lib/modules/linear-gauge.module.mjs +4 -4
  328. package/esm2022/lib/modules/material.module.mjs +4 -4
  329. package/esm2022/lib/modules/paginator.intl.mjs +3 -3
  330. package/esm2022/lib/modules/pivot.module.mjs +4 -4
  331. package/esm2022/lib/modules/schedule.module.mjs +4 -4
  332. package/esm2022/lib/modules/spreadsheet.module.mjs +4 -4
  333. package/esm2022/lib/modules/stepper.intl.mjs +3 -3
  334. package/esm2022/lib/modules/texteditor.module.mjs +4 -4
  335. package/esm2022/lib/notifications/filter.component.mjs +3 -3
  336. package/esm2022/lib/notifications/notifications-table.component.mjs +3 -3
  337. package/esm2022/lib/notifications/notifications.mobile.component.mjs +3 -3
  338. package/esm2022/lib/notifications/notifications.pane.component.mjs +3 -3
  339. package/esm2022/lib/notifications/notifications.service.mjs +3 -3
  340. package/esm2022/lib/notifications/types/commented.notification.mjs +3 -3
  341. package/esm2022/lib/notifications/types/cube-anomaly.notification.mjs +3 -3
  342. package/esm2022/lib/notifications/types/escalated.notification.mjs +3 -3
  343. package/esm2022/lib/notifications/types/invite.notification.mjs +3 -3
  344. package/esm2022/lib/notifications/types/liked.notification.mjs +3 -3
  345. package/esm2022/lib/notifications/types/long-running-task.notification.mjs +3 -3
  346. package/esm2022/lib/notifications/types/notification-base.mjs +3 -3
  347. package/esm2022/lib/notifications/types/nudge.notification.mjs +3 -3
  348. package/esm2022/lib/notifications/types/state-changed.notification.mjs +3 -3
  349. package/esm2022/lib/notifications/types/tagged.notification.mjs +3 -3
  350. package/esm2022/lib/notifications/types/text.notification.mjs +3 -3
  351. package/esm2022/lib/notifications/types/upcoming-event.notification.mjs +3 -3
  352. package/esm2022/lib/options/options.component.mjs +3 -3
  353. package/esm2022/lib/options/options.service.mjs +3 -3
  354. package/esm2022/lib/reports/arguments-component.mjs +3 -3
  355. package/esm2022/lib/reports/cube/documents.component.mjs +3 -3
  356. package/esm2022/lib/reports/cube/grid-documents.component.mjs +3 -3
  357. package/esm2022/lib/reports/cube/performance-hilo.component.mjs +3 -3
  358. package/esm2022/lib/reports/cube/performance-wind.component.mjs +4 -4
  359. package/esm2022/lib/reports/cube/table-documents.component.mjs +3 -3
  360. package/esm2022/lib/reports/cube/usage-args.component.mjs +3 -3
  361. package/esm2022/lib/reports/cube/usage-base.mjs +3 -3
  362. package/esm2022/lib/reports/cube/usage-chart.component.mjs +3 -3
  363. package/esm2022/lib/reports/cube/usage-pivot.component.mjs +3 -3
  364. package/esm2022/lib/reports/cube/usage.component.mjs +3 -3
  365. package/esm2022/lib/reports/report-viewer.component.mjs +3 -3
  366. package/esm2022/lib/reports/report.mobile.component.mjs +3 -3
  367. package/esm2022/lib/reports/report.pane.component.mjs +3 -3
  368. package/esm2022/lib/reports/reports-menu.component.mjs +3 -3
  369. package/esm2022/lib/reports/substitution/substitution.component.mjs +3 -3
  370. package/esm2022/lib/reports/table/table-view.component.mjs +3 -3
  371. package/esm2022/lib/reports/tasks/tasks.component.mjs +3 -3
  372. package/esm2022/lib/scheduler/schedule.component.mjs +3 -3
  373. package/esm2022/lib/scheduler/scheduler.mobile.component.mjs +3 -3
  374. package/esm2022/lib/scheduler/scheduler.pane.component.mjs +3 -3
  375. package/esm2022/lib/search/cube.component.mjs +3 -3
  376. package/esm2022/lib/search/document.component.mjs +3 -3
  377. package/esm2022/lib/search/guide.component.mjs +3 -3
  378. package/esm2022/lib/search/path.component.mjs +3 -3
  379. package/esm2022/lib/search/search.service.mjs +3 -3
  380. package/esm2022/lib/shared.module.mjs +4 -4
  381. package/esm2022/lib/system.module.mjs +4 -4
  382. package/esm2022/lib/views/cube/chart.component.mjs +3 -3
  383. package/esm2022/lib/views/cube/cube-base.mjs +3 -3
  384. package/esm2022/lib/views/cube/explore.component.mjs +3 -3
  385. package/esm2022/lib/views/cube/matrix.component.mjs +3 -3
  386. package/esm2022/lib/views/cube/parallel.component.mjs +3 -3
  387. package/esm2022/lib/views/cube/pivot.component.mjs +3 -3
  388. package/esm2022/lib/views/cube/sum.component.mjs +3 -3
  389. package/esm2022/lib/views/cube/view.component.mjs +3 -3
  390. package/esm2022/lib/views/timeline/timeline.component.mjs +3 -3
  391. package/esm2022/lib/views/view-item.component.mjs +3 -3
  392. package/esm2022/lib/views/views.component.mjs +3 -3
  393. package/esm2022/lib/views/views.mobile.component.mjs +3 -3
  394. package/esm2022/lib/views/views.pane.component.mjs +3 -3
  395. package/fesm2022/bizdoc-core.mjs +1390 -1338
  396. package/fesm2022/bizdoc-core.mjs.map +1 -1
  397. package/lib/admin/architecture/declarations.d.ts +1 -0
  398. package/lib/admin/architecture/designer-element.component.d.ts +1 -0
  399. package/lib/admin/architecture/designer.component.d.ts +3 -3
  400. package/lib/admin/architecture/elements/role.component.d.ts +1 -0
  401. package/lib/core/firebase.service.d.ts +1 -0
  402. package/lib/core/slots/router.service.d.ts +7 -1
  403. package/lib/core/slots/slots.component.d.ts +34 -7
  404. package/lib/home/home.desktop.component.d.ts +5 -4
  405. package/package.json +31 -31
@@ -28,14 +28,6 @@ export class SlotsComponent {
28
28
  this._selectedTabIndex = value;
29
29
  this._setTabAnimation();
30
30
  }
31
- _setTabAnimation() {
32
- this.tabsAnimation = {
33
- value: this.selectedTabIndex,
34
- params: {
35
- startWidth: this._tabsElement ? this._tabsElement.nativeElement.clientWidth : 0
36
- }
37
- };
38
- }
39
31
  constructor(data, _session, _cd, _router, _title, _injector) {
40
32
  this._session = _session;
41
33
  this._cd = _cd;
@@ -44,10 +36,10 @@ export class SlotsComponent {
44
36
  this._injector = _injector;
45
37
  this.dialogChange = new EventEmitter();
46
38
  this.titleVariant = 0;
39
+ this.dialog = false;
47
40
  this.panes = [];
48
41
  this.tabs = [];
49
42
  this._selectedTabIndex = -1;
50
- this.dialog = false;
51
43
  this.selectedIndex = -1;
52
44
  this.dragging = false;
53
45
  this.ripple = {
@@ -60,24 +52,15 @@ export class SlotsComponent {
60
52
  this._rtl = this._session.inverse;
61
53
  this._resizing = new Subject();
62
54
  this._destroy = new Subject();
63
- _session.themeChange.pipe(takeUntil(this._destroy)).
55
+ _session.themeChange.
64
56
  subscribe(() => this.accent = _session.getAccent());
65
- _router._comm$.
66
- subscribe(e => {
67
- switch (e) {
68
- case 'collapse':
69
- this.collapse();
70
- break;
71
- default:
72
- }
73
- });
74
- this._repository = prepareRoutes(data);
57
+ this._routes = prepareRoutes(data);
75
58
  }
76
59
  ngOnInit() {
77
60
  this._router._navigate$.
78
61
  subscribe(async (n) => {
79
62
  const { commands, component, pathMode, relativeTo, injector } = n;
80
- let { icon, title, group, help, policy, queryParams, state } = n;
63
+ let { icon, title, group, help, policy, queryParams, state: data } = n;
81
64
  let queryString, params, parent, path, route;
82
65
  if (commands && commands.length) {
83
66
  path = n.commands.join('/');
@@ -100,10 +83,10 @@ export class SlotsComponent {
100
83
  }
101
84
  path = parentpath + '/' + path;
102
85
  }
103
- route = this._match(path);
86
+ route = this._matchRoute(path);
104
87
  if (!route)
105
88
  throw `no match ${path}`;
106
- params = this._params(route, path);
89
+ params = this._parseParams(route, path);
107
90
  if (!policy)
108
91
  policy = route.policy || DEFAULT_POLICY;
109
92
  else if (route.policy)
@@ -137,7 +120,7 @@ export class SlotsComponent {
137
120
  this.selectedTabIndex = this.tabs.length - 1;
138
121
  }
139
122
  else {
140
- state && tab._data$.next(state);
123
+ data && tab._data$.next(data);
141
124
  this.group = tab.group;
142
125
  this.selectedTabIndex = i;
143
126
  this._cd.detectChanges();
@@ -145,7 +128,7 @@ export class SlotsComponent {
145
128
  return;
146
129
  }
147
130
  else {
148
- this._navQueryParams(tab, queryParams, state);
131
+ this._navQueryParams(tab, queryParams, data);
149
132
  this.group = tab.group;
150
133
  this.selectedTabIndex = i;
151
134
  this._cd.detectChanges();
@@ -154,7 +137,7 @@ export class SlotsComponent {
154
137
  }
155
138
  }
156
139
  else if (tab.route === route) {
157
- await this._navParams(path, tab, params, queryParams, state);
140
+ await this._navParams(path, tab, params, queryParams, data);
158
141
  this.group = tab.group;
159
142
  this.selectedTabIndex = i;
160
143
  this._syncBrowserHistory();
@@ -170,30 +153,30 @@ export class SlotsComponent {
170
153
  if ((policy & OpenPolicy.Toggle) == OpenPolicy.Toggle)
171
154
  await this.removeAt(i);
172
155
  else {
173
- state && pane._data$.next(state);
156
+ data && pane._data$.next(data);
174
157
  this._cd.detectChanges();
175
158
  this.scrollTo(i);
176
159
  }
177
160
  return;
178
161
  }
179
162
  else {
180
- this._navQueryParams(pane, queryParams, state);
163
+ this._navQueryParams(pane, queryParams, data);
181
164
  this.scrollTo(i);
182
165
  this._syncBrowserHistory();
183
166
  return;
184
167
  }
185
168
  }
186
169
  else if (pane.route === route) {
187
- await this._navParams(path, pane, params, queryParams, state);
170
+ await this._navParams(path, pane, params, queryParams, data);
188
171
  this._syncBrowserHistory();
189
172
  return;
190
173
  }
191
174
  i++;
192
175
  }
193
176
  if (commands.length) {
194
- if (!state)
195
- state = {};
196
- await this._state(route, path, params, state);
177
+ if (!data)
178
+ data = {};
179
+ await this._state(route, path, params, data);
197
180
  if ((policy & OpenPolicy.Tab) == OpenPolicy.Tab)
198
181
  this._insertTab(route.component, {
199
182
  queryString,
@@ -203,7 +186,7 @@ export class SlotsComponent {
203
186
  title,
204
187
  group,
205
188
  help,
206
- data: state,
189
+ data,
207
190
  parent,
208
191
  params,
209
192
  queryParams,
@@ -218,7 +201,7 @@ export class SlotsComponent {
218
201
  icon,
219
202
  title,
220
203
  help,
221
- data: state,
204
+ data,
222
205
  parent,
223
206
  params,
224
207
  queryParams,
@@ -231,7 +214,7 @@ export class SlotsComponent {
231
214
  else {
232
215
  const pane = (policy & OpenPolicy.Tab) == OpenPolicy.Tab ?
233
216
  this.tabs[this.selectedTabIndex] : this.panes[this.selectedIndex];
234
- this._navQueryParams(pane, queryParams, state);
217
+ this._navQueryParams(pane, queryParams, data);
235
218
  this._syncBrowserHistory();
236
219
  if ((policy & OpenPolicy.Tab) != OpenPolicy.Tab)
237
220
  this.select(this.selectedIndex);
@@ -242,7 +225,7 @@ export class SlotsComponent {
242
225
  if ((policy & OpenPolicy.Defer) == OpenPolicy.Defer)
243
226
  await this._clearTabs();
244
227
  this._insertTab(component, {
245
- data: state,
228
+ data,
246
229
  icon, title, help,
247
230
  parent,
248
231
  queryString,
@@ -257,7 +240,7 @@ export class SlotsComponent {
257
240
  }
258
241
  else
259
242
  this._insertPane(component, {
260
- data: state,
243
+ data,
261
244
  icon, title, help,
262
245
  parent,
263
246
  queryString,
@@ -278,9 +261,9 @@ export class SlotsComponent {
278
261
  }
279
262
  if (e.state && e.state.bizdoc) {
280
263
  const evt = new BackNavigation();
264
+ this._router._events$.next(evt);
281
265
  if (evt._preventDefault)
282
266
  return;
283
- this._router._events$.next(evt);
284
267
  const state = e.state;
285
268
  this._deserialize(location.pathname.substring(1), state);
286
269
  this.swap = state.swap;
@@ -292,6 +275,15 @@ export class SlotsComponent {
292
275
  else
293
276
  this._deserialize(location.pathname.substring(1));
294
277
  });
278
+ this._router._comm$.
279
+ subscribe(e => {
280
+ switch (e) {
281
+ case 'collapse':
282
+ this.collapse();
283
+ break;
284
+ default:
285
+ }
286
+ });
295
287
  if (location.pathname.length > 1)
296
288
  this._deserialize(location.pathname.substring(1), history.state && history.state.bizdoc ? history.state : undefined);
297
289
  else
@@ -300,6 +292,11 @@ export class SlotsComponent {
300
292
  });
301
293
  this._resizing.pipe(debounceTime(150), takeUntil(this._destroy)).subscribe(this._resize.bind(this));
302
294
  }
295
+ /**
296
+ *
297
+ * @param url
298
+ * @param state
299
+ */
303
300
  async _deserialize(url, state) {
304
301
  const sections = decodeURIComponent(url).split(PANE_CHAR), panes = deserialize(sections[0]), tabs = sections.length > 1 ? deserialize(sections[1]) : [];
305
302
  function deserialize(path) {
@@ -368,7 +365,7 @@ export class SlotsComponent {
368
365
  * @param state
369
366
  */
370
367
  async _navigatePane(index, path, queryString, state) {
371
- const route = this._match(path);
368
+ const route = this._matchRoute(path);
372
369
  if (!route)
373
370
  throw `no match ${path}`;
374
371
  if (!state)
@@ -387,13 +384,13 @@ export class SlotsComponent {
387
384
  }
388
385
  else if (pane.route === route) {
389
386
  const queryParams = this._parseQueryParams(queryString);
390
- const params = this._params(pane.route, path);
387
+ const params = this._parseParams(pane.route, path);
391
388
  await this._navParams(path, pane, params, queryParams, state);
392
389
  return;
393
390
  }
394
391
  index++;
395
392
  }
396
- const params = this._params(route, path);
393
+ const params = this._parseParams(route, path);
397
394
  const queryParams = this._parseQueryParams(queryString);
398
395
  const parent = this._findAncestor(route, path);
399
396
  await this._state(route, path, params, state);
@@ -405,8 +402,16 @@ export class SlotsComponent {
405
402
  focus: false
406
403
  });
407
404
  }
405
+ /**
406
+ *
407
+ * @param index
408
+ * @param path
409
+ * @param queryString
410
+ * @param state
411
+ * @returns
412
+ */
408
413
  async _navigateTab(index, path, queryString, state) {
409
- const route = this._match(path);
414
+ const route = this._matchRoute(path);
410
415
  if (!route)
411
416
  throw `no match ${path}`;
412
417
  if (!state)
@@ -425,13 +430,13 @@ export class SlotsComponent {
425
430
  }
426
431
  else if (tab.route === route) {
427
432
  const queryParams = this._parseQueryParams(queryString);
428
- const params = this._params(tab.route, path);
433
+ const params = this._parseParams(tab.route, path);
429
434
  await this._navParams(path, tab, params, queryParams, state);
430
435
  return;
431
436
  }
432
437
  index++;
433
438
  }
434
- const params = this._params(route, path);
439
+ const params = this._parseParams(route, path);
435
440
  const queryParams = this._parseQueryParams(queryString);
436
441
  const parent = this._findAncestor(route, path);
437
442
  await this._state(route, path, params, state);
@@ -446,6 +451,12 @@ export class SlotsComponent {
446
451
  swap: false
447
452
  });
448
453
  }
454
+ /**
455
+ *
456
+ * @param route
457
+ * @param path
458
+ * @returns
459
+ */
449
460
  _findAncestor(route, path) {
450
461
  if (route.parent)
451
462
  return this.panes.find(p => p.route ===
@@ -510,7 +521,7 @@ export class SlotsComponent {
510
521
  }
511
522
  /** */
512
523
  _syncBrowserHistory() {
513
- let path = this.panes.filter(p => p.route).map(s => s.fullPath).join(PATH_CHAR);
524
+ let path = this.panes.filter(p => p.route).map(p => p.fullPath).join(PATH_CHAR);
514
525
  if (this.tabs.length) {
515
526
  const tabs = this.tabs.filter(p => p.route);
516
527
  if (tabs.length)
@@ -534,6 +545,14 @@ export class SlotsComponent {
534
545
  prevGroup: this.prevGroup
535
546
  };
536
547
  }
548
+ _setTabAnimation() {
549
+ this.tabsAnimation = {
550
+ value: this.selectedTabIndex,
551
+ params: {
552
+ startWidth: this._tabsElement ? this._tabsElement.nativeElement.clientWidth : 0
553
+ }
554
+ };
555
+ }
537
556
  drop(evt) {
538
557
  const pane = this.panes[evt.previousIndex];
539
558
  this.panes.splice(evt.previousIndex, 1);
@@ -588,7 +607,7 @@ export class SlotsComponent {
588
607
  * @param route
589
608
  * @param path
590
609
  */
591
- _params(route, path) {
610
+ _parseParams(route, path) {
592
611
  const ex = route.regEx.exec(path), params = ex.groups;
593
612
  return params || {};
594
613
  }
@@ -596,8 +615,8 @@ export class SlotsComponent {
596
615
  *
597
616
  * @param url
598
617
  */
599
- _match(url) {
600
- let route = this._repository.find(r => r.regEx.test(url));
618
+ _matchRoute(url) {
619
+ let route = this._routes.find(r => r.regEx.test(url));
601
620
  if (route)
602
621
  while (route.children) {
603
622
  let child = route.children.find(r => r.regEx.test(url));
@@ -623,7 +642,7 @@ export class SlotsComponent {
623
642
  this._pending.push(path);
624
643
  const { parent, resolve } = route;
625
644
  if (parent)
626
- await this._parentstate(parent, path, params, data);
645
+ await this._parentState(parent, path, params, data);
627
646
  if (resolve) {
628
647
  await this._resolve(resolve, params, data);
629
648
  }
@@ -636,10 +655,10 @@ export class SlotsComponent {
636
655
  * @param params
637
656
  * @param data
638
657
  */
639
- async _parentstate(route, path, params, data) {
658
+ async _parentState(route, path, params, data) {
640
659
  const { parent, resolve } = route;
641
660
  if (parent)
642
- await this._parentstate(parent, path, params, data);
661
+ await this._parentState(parent, path, params, data);
643
662
  const pane = this.panes.find(s => s.route && s.route === route
644
663
  && path.startsWith(s.path));
645
664
  pane && Object.assign(data, pane.data);
@@ -669,6 +688,13 @@ export class SlotsComponent {
669
688
  const pane = this._insertPane(component, options || {}, position);
670
689
  return pane;
671
690
  }
691
+ /**
692
+ *
693
+ * @param component
694
+ * @param options
695
+ * @param position
696
+ * @returns
697
+ */
672
698
  _insertPane(component, options, position) {
673
699
  const stretchable = (options.policy & OpenPolicy.Stretch) == OpenPolicy.Stretch;
674
700
  const pane = this._constract(component, {
@@ -746,6 +772,7 @@ export class SlotsComponent {
746
772
  }
747
773
  return tab;
748
774
  }
775
+ /** */
749
776
  back() {
750
777
  this._navBack(this.swap);
751
778
  this.swap = null;
@@ -846,7 +873,7 @@ export class SlotsComponent {
846
873
  }
847
874
  closeTab(position) {
848
875
  const tab = this.tabs[position];
849
- if (!this._closing(tab))
876
+ if (!this._closable(tab))
850
877
  return;
851
878
  this.tabs.splice(position, 1);
852
879
  this._destroyPane(tab);
@@ -859,15 +886,20 @@ export class SlotsComponent {
859
886
  *
860
887
  * @param pane
861
888
  */
862
- _closing(pane) {
889
+ _closable(pane) {
863
890
  let evt = new NavigationClose(pane);
864
891
  pane._events$.next(evt);
892
+ if (evt._preventDefault)
893
+ return false;
894
+ this._router._events$.next(evt);
865
895
  return !evt._preventDefault;
866
896
  }
867
897
  expandPane() {
868
898
  const pane = this.panes[this.selectedIndex];
869
899
  const evt = new NavigationExpand(pane._expanded = true, pane);
870
900
  pane._events$.next(evt);
901
+ if (evt._preventDefault)
902
+ return;
871
903
  this._router._events$.next(evt);
872
904
  if (evt._preventDefault)
873
905
  return;
@@ -891,6 +923,8 @@ export class SlotsComponent {
891
923
  const tab = this.tabs[this.selectedTabIndex];
892
924
  const evt = new NavigationExpand(tab._expanded = true, tab);
893
925
  tab._events$.next(evt);
926
+ if (evt._preventDefault)
927
+ return;
894
928
  this._router._events$.next(evt);
895
929
  if (evt._preventDefault)
896
930
  return;
@@ -921,7 +955,7 @@ export class SlotsComponent {
921
955
  }
922
956
  async removeAt(position) {
923
957
  const pane = this.panes[position];
924
- if (!this._closing(pane))
958
+ if (!this._closable(pane))
925
959
  return;
926
960
  await this._dismiss(pane);
927
961
  this._discardPane(pane);
@@ -1081,8 +1115,8 @@ export class SlotsComponent {
1081
1115
  this._destroy.next();
1082
1116
  this._destroy.complete();
1083
1117
  }
1084
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: SlotsComponent, deps: [{ token: PANES_DATA }, { token: i1.SessionService }, { token: i0.ChangeDetectorRef }, { token: i2.PanesRouter }, { token: i3.WindowTitleService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
1085
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.1", type: SlotsComponent, selector: "bizdoc-panes-outlet", outputs: { dialogChange: "dialogChange" }, host: { listeners: { "document:keydown": "handleKeydown($event)", "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "_panesContainerRef", first: true, predicate: ["panesEl"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_tabsElement", first: true, predicate: ["tabsEl"], descendants: true }, { propertyName: "_scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }], ngImport: i0, template: "<div #panesEl class=\"panes\"\n cdkScrollable\n @panes\n (scroll)=\"enableNavigationArrows($event)\">\n <!---->\n @if (prev) {\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\">\n <i class=\"material-icons mat-icon-rtl-mirror\">\n arrow_back_ios\n </i>\n </div>\n }\n <!--panes-->\n @for (p of panes; track p; let i = $index) {\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\n (click)=\"select(i)\"\n [class.active]=\"selectedIndex === i && panes.length > 1\" class=\"pane\" @pane>\n <ng-container [cdkPortalOutlet]=\"p._portal\" (attached)=\"p._instance = $event.instance\"></ng-container>\n </div>\n @if (i < panes.length - 1) {\n <div class=\"pane-separator\" (mousedown)=\"onPaneResize(p, $event)\"></div>\n }\n }\n <!--dialog-->\n @if (dialog) {\n <div class=\"backdrop\" (click)=\"closeTab(0)\"></div>\n }\n <!--next-->\n @if (next) {\n <div class=\"scroll-arrow forward\">\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\n (click)=\"scrollBy(400)\">\n arrow_forward_ios\n </i>\n </div>\n }\n</div>\n<!--tabs-->\n@if (tabs.length) {\n<div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\"></div>\n<div class=\"tabs mat-elevation-z18\" #tabsEl [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\">\n <!--title-->\n <div class=\"row tabs-title\">\n @if (swapTab) {\n <button mat-icon-button (click)=\"tabBack()\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\n }\n <h2>{{group}}</h2>\n @if (!dialog) {\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon class=\"mat-icon-rtl-mirror\" style=\"font-size: 22px\">open_in_full</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\n </div>\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\" [tabPanel]=\"tabPanel\">\n @for (t of tabs; track t; let i = $index) {\n <a mat-tab-link class=\"mat-tab-link\"\n (click)=\"selectedTabIndex = i\"\n [active]=\"selectedTabIndex === i\">\n <mat-icon [matBadge]=\"t.badge\" [matBadgeHidden]=\"!t.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\" aria-hidden=\"false\">{{t.icon}}</mat-icon>&nbsp;\n {{t.title}}\n @if (t.dismissable) {\n <mat-icon (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\n }\n <!--inline=\"true\"-->\n </a>\n }\n </nav>\n <mat-tab-nav-panel #tabPanel class=\"flex\">\n @for (t of tabs; track t; let i = $index) {\n <div [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\n <ng-container [cdkPortalOutlet]=\"t._portal\" (attached)=\"t._instance = $event.instance\"></ng-container>\n </div>\n }\n </mat-tab-nav-panel>\n</div>\n}\n", styles: [":host{flex:1;overflow:hidden;display:flex}.scroll-arrow{cursor:pointer;align-self:center;position:sticky;top:50%;z-index:200}.scroll-arrow i{font-size:50px;opacity:.2}.scroll-arrow i:hover{opacity:.9}.scroll-arrow:first-child{margin-inline-start:-50px;left:0}.scroll-arrow:last-child{margin-inline-end:-50px;right:0}.panes{overflow-x:auto;position:relative;flex:1;height:100%;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.panes .pane{-webkit-flex-grow:1;flex-grow:1;min-width:420px;overflow-y:auto;overflow-x:clip}.panes .pane>*{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow-x:hidden;flex-grow:1}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.pane-separator{width:8px}.tabs-separator{width:12px}::ng-deep .mat-mdc-tab-link-container{overflow-x:auto;border-bottom:1px solid lightgray;-ms-overflow-style:none;scrollbar-width:none}::ng-deep .mat-mdc-tab-link-container::-webkit-scrollbar{display:none}::ng-deep .mat-mdc-tab-nav-panel{overflow-y:auto}.tabs{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;z-index:300;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0;max-width:80vw}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-mdc-tab-link .tool{opacity:0}.tabs .mat-mdc-tab-link:hover .tool{opacity:1}.tabs .tab{overflow-y:auto;overflow-x:hidden;display:flex;height:100%}\n"], dependencies: [{ kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i5.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: i6.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i7.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i7.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i7.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "directive", type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }], animations: [
1118
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SlotsComponent, deps: [{ token: PANES_DATA }, { token: i1.SessionService }, { token: i0.ChangeDetectorRef }, { token: i2.PanesRouter }, { token: i3.WindowTitleService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
1119
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.0", type: SlotsComponent, selector: "bizdoc-panes-outlet", outputs: { dialogChange: "dialogChange" }, host: { listeners: { "document:keydown": "handleKeydown($event)", "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "_panesContainerRef", first: true, predicate: ["panesEl"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "_tabsElement", first: true, predicate: ["tabsEl"], descendants: true }, { propertyName: "_scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }], ngImport: i0, template: "<div #panesEl class=\"panes\"\n cdkScrollable\n @panes\n (scroll)=\"enableNavigationArrows($event)\">\n <!---->\n @if (prev) {\n <div class=\"scroll-arrow\" (click)=\"scrollBy(-400)\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleColor]=\"accent\">\n <i class=\"material-icons mat-icon-rtl-mirror\">\n arrow_back_ios\n </i>\n </div>\n }\n <!--panes-->\n @for (p of panes; track p; let i = $index) {\n <div (mouseenter)=\"selectedIndex !== i && !dragging && select(i)\"\n (click)=\"select(i)\"\n [class.active]=\"selectedIndex === i && panes.length > 1\" class=\"pane\" @pane>\n <ng-container [cdkPortalOutlet]=\"p._portal\" (attached)=\"p._instance = $event.instance\"></ng-container>\n </div>\n @if (i < panes.length - 1) {\n <div class=\"pane-separator\" (mousedown)=\"onPaneResize(p, $event)\"></div>\n }\n }\n <!--dialog-->\n @if (dialog) {\n <div class=\"backdrop\" (click)=\"closeTab(0)\"></div>\n }\n <!--next-->\n @if (next) {\n <div class=\"scroll-arrow forward\">\n <i class=\"material-icons mat-icon-rtl-mirror\" matRipple [matRippleUnbounded]=\"true\" [matRippleCentered]=\"true\" [matRippleRadius]=\"30\" [matRippleColor]=\"accent\"\n (click)=\"scrollBy(400)\">\n arrow_forward_ios\n </i>\n </div>\n }\n</div>\n<!--tabs-->\n@if (tabs.length) {\n<div class=\"tabs-separator\" (mousedown)=\"onTabResize($event)\"></div>\n<div class=\"tabs mat-elevation-z18\" #tabsEl [@tabs]=\"tabsAnimation\" (@tabs.done)=\"done()\">\n <!--title-->\n <div class=\"row tabs-title\">\n @if (swapTab) {\n <button mat-icon-button (click)=\"tabBack()\" [bizdocTooltip]=\"prevGroup || ('Back'|translate)\"><mat-icon class=\"mat-icon-rtl-mirror\">arrow_back</mat-icon></button>\n }\n <h2>{{group}}</h2>\n @if (!dialog) {\n <button mat-icon-button (click)=\"expandTab()\" [bizdocTooltip]=\"'Expand'| translate\"><mat-icon class=\"mat-icon-rtl-mirror\" style=\"font-size: 22px\">open_in_full</mat-icon></button>\n }\n <span class=\"divider\"></span>\n <button mat-icon-button (click)=\"collapse()\" bizdocTooltip=\"Esc\"><mat-icon>close</mat-icon></button>\n </div>\n <nav mat-tab-nav-bar color=\"accent\" [disablePagination]=\"true\" [tabPanel]=\"tabPanel\">\n @for (t of tabs; track t; let i = $index) {\n <a mat-tab-link class=\"mat-tab-link\"\n (click)=\"selectedTabIndex = i\"\n [active]=\"selectedTabIndex === i\">\n <mat-icon [matBadge]=\"t.badge\" [matBadgeHidden]=\"!t.badge\" matBadgeSize=\"small\" matBadgeColor=\"accent\" aria-hidden=\"false\">{{t.icon}}</mat-icon>&nbsp;\n {{t.title}}\n @if (t.dismissable) {\n <mat-icon (click)=\"closeTab(i)\" class=\"tool\">close</mat-icon>\n }\n <!--inline=\"true\"-->\n </a>\n }\n </nav>\n <mat-tab-nav-panel #tabPanel class=\"flex\">\n @for (t of tabs; track t; let i = $index) {\n <div [style.display]=\"selectedTabIndex === i ? '': 'none'\" class=\"tab\" [@tab]=\"selectedTabIndex\">\n <ng-container [cdkPortalOutlet]=\"t._portal\" (attached)=\"t._instance = $event.instance\"></ng-container>\n </div>\n }\n </mat-tab-nav-panel>\n</div>\n}\n", styles: [":host{flex:1;overflow:hidden;display:flex}.scroll-arrow{cursor:pointer;align-self:center;position:sticky;top:50%;z-index:200}.scroll-arrow i{font-size:50px;opacity:.2}.scroll-arrow i:hover{opacity:.9}.scroll-arrow:first-child{margin-inline-start:-50px;left:0}.scroll-arrow:last-child{margin-inline-end:-50px;right:0}.panes{overflow-x:auto;position:relative;flex:1;height:100%;display:flex;-ms-flex-direction:row;-webkit-flex-direction:row;flex-direction:row}.panes .pane{-webkit-flex-grow:1;flex-grow:1;min-width:420px;overflow-y:auto;overflow-x:clip}.panes .pane>*{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;overflow-x:hidden;flex-grow:1}.pane-separator,.tabs-separator{cursor:ew-resize;background-repeat:no-repeat;background-position:center;display:table;height:100%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.pane-separator{width:8px}.tabs-separator{width:12px}::ng-deep .mat-mdc-tab-link-container{overflow-x:auto;border-bottom:1px solid lightgray;-ms-overflow-style:none;scrollbar-width:none}::ng-deep .mat-mdc-tab-link-container::-webkit-scrollbar{display:none}::ng-deep .mat-mdc-tab-nav-panel{overflow-y:auto}.tabs{display:flex;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column;z-index:300;-webkit-flex-grow:0;flex-shrink:1;flex-basis:0;max-width:80vw}.tabs .tabs-title{align-items:center}.tabs .tabs-title h2{font-size:x-large;margin:9px;font-weight:100}.tabs .tabs-title:hover{opacity:1}.tabs .mat-mdc-tab-link .tool{opacity:0}.tabs .mat-mdc-tab-link:hover .tool{opacity:1}.tabs .tab{overflow-y:auto;overflow-x:hidden;display:flex;height:100%}\n"], dependencies: [{ kind: "directive", type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i5.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: i6.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "component", type: i7.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["fitInkBarToContent", "mat-stretch-tabs", "animationDuration", "backgroundColor", "disableRipple", "color", "tabPanel"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i7.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i7.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["active", "disabled", "disableRipple", "tabIndex", "id"], exportAs: ["matTabLink"] }, { kind: "directive", type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "pipe", type: i12.TranslatePipe, name: "translate" }], animations: [
1086
1120
  panesAnimation,
1087
1121
  paneAnimation,
1088
1122
  paramAnimation,
@@ -1091,7 +1125,7 @@ export class SlotsComponent {
1091
1125
  tabAnimation
1092
1126
  ] }); }
1093
1127
  }
1094
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: SlotsComponent, decorators: [{
1128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: SlotsComponent, decorators: [{
1095
1129
  type: Component,
1096
1130
  args: [{ selector: 'bizdoc-panes-outlet', animations: [
1097
1131
  panesAnimation,
@@ -1123,6 +1157,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImpor
1123
1157
  args: ['window:resize']
1124
1158
  }] } });
1125
1159
  const PANE_PARAMS_REGEX = /(:[\w\-\.]+)/g;
1160
+ /**
1161
+ *
1162
+ * @param routes
1163
+ * @param treePath
1164
+ * @returns
1165
+ */
1126
1166
  function prepareRoutes(routes, treePath) {
1127
1167
  for (let i = 0; i < routes.length; i++) {
1128
1168
  let route = routes[i], fullPath = (treePath ? (treePath + '/') : '') + route.path;
@@ -1142,4 +1182,4 @@ function prepareRoutes(routes, treePath) {
1142
1182
  }
1143
1183
  return routes;
1144
1184
  }
1145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb3JlL3Nsb3RzL3Nsb3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29yZS9zbG90cy9zbG90cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUErQixNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUUvSyxPQUFPLEVBQUUsYUFBYSxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQTRCLG9CQUFvQixFQUFFLGVBQWUsRUFBa0IsZUFBZSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQVksZ0JBQWdCLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDblUsT0FBTyxFQUFn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QUssQ0FBQyxJQUFJLENBQUM7UUFFbEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkIsUUFBUTtZQUNSLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsUUFBUTtnQkFDOUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMxRSxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN6QixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBeUIsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlLCBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBSaXBwbGVDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIGlzT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBXaW5kb3dUaXRsZVNlcnZpY2UgfSBmcm9tICcuLi93aW5kb3ctdGl0bGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgcGFuZXNBbmltYXRpb24sIHBhbmVBbmltYXRpb24sIHBhcmFtQW5pbWF0aW9uLCBxdWVyeUFuaW1hdGlvbiwgdGFiQW5pbWF0aW9uLCB0YWJzQW5pbWF0aW9uIH0gZnJvbSAnLi4vYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzQm9vbGVhbiwgaXNEYXRlLCBpc1Byb21pc2UsIGlzU3RyaW5nIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgUEFORVNfREFUQSwgUGFuZVJlZiwgUGFuZU9wdGlvbnMsIFBhbmVDb21tYW5kLCBRdWVyeVBhcmFtTmF2aWdhdGlvbiwgUGFyYW1OYXZpZ2F0aW9uLCBOYXZpZ2F0aW9uTW9kZSwgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uQ2xvc2UsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25Gb2N1cywgUEFUSF9DSEFSLCBRVUVSWV9DSEFSLCBBUkdfQ0hBUiwgUEFORV9DSEFSLCBDb2xsYXBzZU5hdmlnYXRpb24sIEJhY2tOYXZpZ2F0aW9uLCBOYXZpZ2F0aW9uRXhwYW5kLCBQYW5lTW9kZSwgTmF2aWdhdGlvblJlc2l6ZSwgfSBmcm9tICcuL3BhbmUtcmVmJztcclxuaW1wb3J0IHsgUGFuZVJlc29sdmUsIFBhbmVSb3V0ZSwgUGFyYW1NYXAsIENhbkRpc21pc3MsIERFRkFVTFRfUE9MSUNZLCBPcGVuUG9saWN5IH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgIHJlbW92ZUFsbExpc3RlbmVycyhuYW1lPzogc3RyaW5nKTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfUk9VVEUgPSBbJ2Rhc2hib2FyZCddO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JpemRvYy1wYW5lcy1vdXRsZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbG90cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2xvdHMuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBwYW5lc0FuaW1hdGlvbixcclxuICAgIHBhbmVBbmltYXRpb24sXHJcbiAgICBwYXJhbUFuaW1hdGlvbixcclxuICAgIHF1ZXJ5QW5pbWF0aW9uLFxyXG4gICAgdGFic0FuaW1hdGlvbixcclxuICAgIHRhYkFuaW1hdGlvblxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsb3RzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBkaWFsb2dDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQFZpZXdDaGlsZCgncGFuZXNFbCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIF9wYW5lc0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJzRWwnKSBfdGFic0VsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChDZGtTY3JvbGxhYmxlLCB7IHN0YXRpYzogdHJ1ZSB9KSBfc2Nyb2xsYWJsZTogQ2RrU2Nyb2xsYWJsZTtcclxuICB0aXRsZVZhcmlhbnQgPSAwO1xyXG4gIGdyb3VwOiBzdHJpbmc7XHJcbiAgc3dhcD86IG51bWJlcjtcclxuICBzd2FwVGFiPzogbnVtYmVyO1xyXG4gIHByZXZHcm91cD86IHN0cmluZztcclxuXHJcbiAgcmVhZG9ubHkgcGFuZXM6IFBhbmVSZWY8YW55PltdID0gW107XHJcbiAgcmVhZG9ubHkgdGFiczogUGFuZVJlZjxhbnk+W10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3RlZFRhYkluZGV4ID0gLTE7XHJcbiAgZGlhbG9nID0gZmFsc2U7XHJcbiAgcHVibGljIGdldCBzZWxlY3RlZFRhYkluZGV4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFiSW5kZXg7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRUYWJJbmRleCh2YWx1ZSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJJbmRleCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fc2V0VGFiQW5pbWF0aW9uKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldFRhYkFuaW1hdGlvbigpIHtcclxuICAgIHRoaXMudGFic0FuaW1hdGlvbiA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VsZWN0ZWRUYWJJbmRleCxcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgc3RhcnRXaWR0aDogdGhpcy5fdGFic0VsZW1lbnQgPyB0aGlzLl90YWJzRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDogMFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuICBzZWxlY3RlZEluZGV4ID0gLTE7XHJcbiAgbmV4dDogYm9vbGVhbjtcclxuICBwcmV2OiBib29sZWFuO1xyXG4gIGRyYWdnaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdGFic0FuaW1hdGlvbjoge1xyXG4gICAgdmFsdWU6IG51bWJlcixcclxuICAgIHBhcmFtczoge1xyXG4gICAgICBzdGFydFdpZHRoOiBudW1iZXJcclxuICAgIH1cclxuICB9O1xyXG4gIHJlYWRvbmx5IHJpcHBsZTogUmlwcGxlQ29uZmlnID0ge1xyXG4gICAgY29sb3I6IHRoaXMuX3Nlc3Npb24uZ2V0QWNjZW50KCksXHJcbiAgICBjZW50ZXJlZDogdHJ1ZSxcclxuICAgIHJhZGl1czogMjVcclxuICB9XHJcbiAgYWNjZW50OiBzdHJpbmcgPSB0aGlzLl9zZXNzaW9uLmdldEFjY2VudCgpO1xyXG4gIHByaXZhdGUgX25hdmlnYXRpb25JblByb2Nlc3M6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfcmVwb3NpdG9yeTogRXh0ZW5kZWRSb3V0ZVtdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BlbmRpbmcgPSBbXSBhcyBzdHJpbmdbXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9ydGwgPSB0aGlzLl9zZXNzaW9uLmludmVyc2U7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzaXppbmcgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChQQU5FU19EQVRBKSBkYXRhOiBFeHRlbmRlZFJvdXRlW10sXHJcbiAgICBwcml2YXRlIF9zZXNzaW9uOiBTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX3JvdXRlcjogUGFuZXNSb3V0ZXIsXHJcbiAgICBwcml2YXRlIF90aXRsZTogV2luZG93VGl0bGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICBfc2Vzc2lvbi50aGVtZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuXHJcbiAgICAgIHN1YnNjcmliZSgoKSA9PiB0aGlzLmFjY2VudCA9IF9zZXNzaW9uLmdldEFjY2VudCgpKTtcclxuICAgIF9yb3V0ZXIuX2NvbW0kLlxyXG4gICAgICBzdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChlKSB7XHJcbiAgICAgICAgICBjYXNlICdjb2xsYXBzZSc6XHJcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLl9yZXBvc2l0b3J5ID0gcHJlcGFyZVJvdXRlcyhkYXRhKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcm91dGVyLl9uYXZpZ2F0ZSQuXHJcbiAgICAgIHN1YnNjcmliZShhc3luYyBuID0+IHtcclxuICAgICAgICBjb25zdCB7IGNvbW1hbmRzLCBjb21wb25lbnQsIHBhdGhNb2RlLCByZWxhdGl2ZVRvLCBpbmplY3RvciB9ID0gbjtcclxuICAgICAgICBsZXQge1xyXG4gICAgICAgICAgaWNvbixcclxuICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBoZWxwLFxyXG4gICAgICAgICAgcG9saWN5LFxyXG4gICAgICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICBzdGF0ZVxyXG4gICAgICAgIH0gPSBuO1xyXG4gICAgICAgIGxldFxyXG4gICAgICAgICAgcXVlcnlTdHJpbmc6IHN0cmluZyxcclxuICAgICAgICAgIHBhcmFtczogUGFyYW1NYXAsXHJcbiAgICAgICAgICBwYXJlbnQ6IFBhbmVSZWYsXHJcbiAgICAgICAgICBwYXRoOiBzdHJpbmcsXHJcbiAgICAgICAgICByb3V0ZTogRXh0ZW5kZWRSb3V0ZTtcclxuXHJcbiAgICAgICAgaWYgKGNvbW1hbmRzICYmIGNvbW1hbmRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcGF0aCA9IG4uY29tbWFuZHMuam9pbignLycpO1xyXG4gICAgICAgICAgaWYgKHBhdGguaW5kZXhPZihRVUVSWV9DSEFSKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlZ3MgPSBwYXRoLnNwbGl0KFFVRVJZX0NIQVIpO1xyXG4gICAgICAgICAgICBxdWVyeVN0cmluZyA9IHNlZ3NbMV07XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyB8fCAnJyk7XHJcbiAgICAgICAgICAgIHBhdGggPSBzZWdzWzBdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zID0gbi5xdWVyeVBhcmFtcyB8fCB7fTtcclxuICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSB0aGlzLl9xdWVyeVN0cmluZyhxdWVyeVBhcmFtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocGF0aE1vZGUgPT09ICdyZWxhdGl2ZScgfHwgcGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xyXG4gICAgICAgICAgICBwYXJlbnQgPSByZWxhdGl2ZVRvIHx8IHRoaXMucGFuZXNbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudHBhdGggPSBwYXJlbnQucGF0aDtcclxuICAgICAgICAgICAgd2hpbGUgKHBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcclxuICAgICAgICAgICAgICBwYXJlbnRwYXRoID0gcGFyZW50cGF0aC5zdWJzdHJpbmcoMCwgcGFyZW50cGF0aC5sYXN0SW5kZXhPZignLycpKTtcclxuICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcGF0aCA9IHBhcmVudHBhdGggKyAnLycgKyBwYXRoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcm91dGUgPSB0aGlzLl9tYXRjaChwYXRoKTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJvdXRlKVxyXG4gICAgICAgICAgICB0aHJvdyBgbm8gbWF0Y2ggJHtwYXRofWA7XHJcbiAgICAgICAgICBwYXJhbXMgPSB0aGlzLl9wYXJhbXMocm91dGUsIHBhdGgpO1xyXG4gICAgICAgICAgaWYgKCFwb2xpY3kpIHBvbGljeSA9IHJvdXRlLnBvbGljeSB8fCBERUZBVUxUX1BPTElDWTtcclxuICAgICAgICAgIGVsc2UgaWYgKHJvdXRlLnBvbGljeSkgcG9saWN5IHw9IHJvdXRlLnBvbGljeTtcclxuICAgICAgICAgIGlmICghaWNvbikgaWNvbiA9IHJvdXRlLmljb247XHJcbiAgICAgICAgICBpZiAoIWhlbHApIGhlbHAgPSByb3V0ZS5oZWxwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICghcG9saWN5KSBwb2xpY3kgPSBERUZBVUxUX1BPTElDWTtcclxuICAgICAgICAgIGlmICghcXVlcnlQYXJhbXMpIHF1ZXJ5UGFyYW1zID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKHBvbGljeSAmIE9wZW5Qb2xpY3kuQ2xlYXIpID09IE9wZW5Qb2xpY3kuQ2xlYXIpIHtcclxuICAgICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZygpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2xlYXJUYWJzKCk7XHJcbiAgICAgICAgICBpZiAoKHBvbGljeSAmIE9wZW5Qb2xpY3kuVGFiKSAhPSBPcGVuUG9saWN5LlRhYilcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2xlYXJQYW5lcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29tbWFuZHMpIHtcclxuICAgICAgICAgIGxldCBpID0gMDtcclxuICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpID09IE9wZW5Qb2xpY3kuVGFiKVxyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IHRoaXMudGFicy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICBsZXQgdGFiID0gdGhpcy50YWJzW2ldO1xyXG4gICAgICAgICAgICAgIGlmIChwYXRoID09PSB0YWIucGF0aCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nID09PSB0YWIucXVlcnlTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKChwb2xpY3kgJiBPcGVuUG9saWN5LlRvZ2dsZSkgPT0gT3BlblBvbGljeS5Ub2dnbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMudGFicy5sZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICYmIHRhYi5fZGF0YSQubmV4dChzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cCA9IHRhYi5ncm91cDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fbmF2UXVlcnlQYXJhbXModGFiLCBxdWVyeVBhcmFtcywgc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwID0gdGFiLmdyb3VwO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHRhYi5yb3V0ZSA9PT0gcm91dGUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25hdlBhcmFtcyhwYXRoLCB0YWIsIHBhcmFtcywgcXVlcnlQYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSB0YWIuZ3JvdXA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IHRoaXMucGFuZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHBhbmUgPSB0aGlzLnBhbmVzW2ldO1xyXG4gICAgICAgICAgICAgIGlmIChwYXRoID09PSBwYW5lLnBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyA9PT0gcGFuZS5xdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoKHBvbGljeSAmIE9wZW5Qb2xpY3kuVG9nZ2xlKSA9PSBPcGVuUG9saWN5LlRvZ2dsZSlcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUF0KGkpO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSAmJiBwYW5lLl9kYXRhJC5uZXh0KHN0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhpKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fbmF2UXVlcnlQYXJhbXMocGFuZSwgcXVlcnlQYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhpKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAocGFuZS5yb3V0ZSA9PT0gcm91dGUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX25hdlBhcmFtcyhwYXRoLCBwYW5lLCBwYXJhbXMsIHF1ZXJ5UGFyYW1zLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY29tbWFuZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICghc3RhdGUpIHN0YXRlID0ge307XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3N0YXRlKHJvdXRlLCBwYXRoLCBwYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICAgICAgaWYgKChwb2xpY3kgJiBPcGVuUG9saWN5LlRhYikgPT0gT3BlblBvbGljeS5UYWIpXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0VGFiKHJvdXRlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgIHJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICBpY29uLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgIGhlbHAsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgIHBvbGljeSxcclxuICAgICAgICAgICAgICAgICAgaW5qZWN0b3JcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0UGFuZShyb3V0ZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICByb3V0ZSxcclxuICAgICAgICAgICAgICAgICAgaWNvbixcclxuICAgICAgICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgIGhlbHAsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHN0YXRlLFxyXG4gICAgICAgICAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgIHBvbGljeSxcclxuICAgICAgICAgICAgICAgICAgaW5qZWN0b3JcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByb3V0ZSAmJlxyXG4gICAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhbmUgPSAocG9saWN5ICYgT3BlblBvbGljeS5UYWIpID09IE9wZW5Qb2xpY3kuVGFiID9cclxuICAgICAgICAgICAgICB0aGlzLnRhYnNbdGhpcy5zZWxlY3RlZFRhYkluZGV4XSA6IHRoaXMucGFuZXNbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5fbmF2UXVlcnlQYXJhbXMocGFuZSwgcXVlcnlQYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICAgICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpICE9IE9wZW5Qb2xpY3kuVGFiKSB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpID09IE9wZW5Qb2xpY3kuVGFiKSB7XHJcbiAgICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5EZWZlcikgPT0gT3BlblBvbGljeS5EZWZlcilcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jbGVhclRhYnMoKTtcclxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0VGFiKGNvbXBvbmVudCxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiBzdGF0ZSxcclxuICAgICAgICAgICAgICAgIGljb24sIHRpdGxlLCBoZWxwLFxyXG4gICAgICAgICAgICAgICAgcGFyZW50LFxyXG4gICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICAgICAgcm91dGUsXHJcbiAgICAgICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgcG9saWN5LFxyXG4gICAgICAgICAgICAgICAgaW5qZWN0b3JcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgdGhpcy5faW5zZXJ0UGFuZShjb21wb25lbnQsXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBkYXRhOiBzdGF0ZSxcclxuICAgICAgICAgICAgICBpY29uLCB0aXRsZSwgaGVscCxcclxuICAgICAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICAgICAgcXVlcnlTdHJpbmcsXHJcbiAgICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgICByb3V0ZSxcclxuICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICAgICAgcG9saWN5LFxyXG4gICAgICAgICAgICAgIGluamVjdG9yXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB3aW5kb3cucmVtb3ZlQWxsTGlzdGVuZXJzKCdwb3BzdGF0ZScpO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgZSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9uYXZpZ2F0aW9uSW5Qcm9jZXNzKSB7XHJcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvbkluUHJvY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZS5zdGF0ZSAmJiBlLnN0YXRlLmJpemRvYykge1xyXG4gICAgICAgIGNvbnN0IGV2dCA9IG5ldyBCYWNrTmF2aWdhdGlvbigpO1xyXG4gICAgICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fcm91dGVyLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IGUuc3RhdGUgYXMgSGlzdG9yeVN0YXRlO1xyXG4gICAgICAgIHRoaXMuX2Rlc2VyaWFsaXplKGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cmluZygxKSwgc3RhdGUpO1xyXG4gICAgICAgIHRoaXMuc3dhcCA9IHN0YXRlLnN3YXA7XHJcbiAgICAgICAgdGhpcy5zd2FwVGFiID0gc3RhdGUuc3dhcFRhYjtcclxuICAgICAgICB0aGlzLnByZXZHcm91cCA9IHN0YXRlLnByZXZHcm91cDtcclxuICAgICAgICB0aGlzLmdyb3VwID0gc3RhdGUuZ3JvdXA7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gc3RhdGUuc2VsZWN0ZWRUYWJJbmRleDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgdGhpcy5fZGVzZXJpYWxpemUobG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyaW5nKDEpKTtcclxuICAgIH0pO1xyXG4gICAgaWYgKGxvY2F0aW9uLnBhdGhuYW1lLmxlbmd0aCA+IDEpXHJcbiAgICAgIHRoaXMuX2Rlc2VyaWFsaXplKGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cmluZygxKSxcclxuICAgICAgICBoaXN0b3J5LnN0YXRlICYmIGhpc3Rvcnkuc3RhdGUuYml6ZG9jID8gaGlzdG9yeS5zdGF0ZSA6IHVuZGVmaW5lZCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX3JvdXRlci5fbmF2aWdhdGUkLm5leHQoe1xyXG4gICAgICAgIGNvbW1hbmRzOiBERUZBVUxUX1JPVVRFLFxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuX3Jlc2l6aW5nLnBpcGUoZGVib3VuY2VUaW1lKDE1MCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKHRoaXMuX3Jlc2l6ZS5iaW5kKHRoaXMpKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBhc3luYyBfZGVzZXJpYWxpemUodXJsOiBzdHJpbmcsIHN0YXRlPzogSGlzdG9yeVN0YXRlKSB7XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbnMgPSBkZWNvZGVVUklDb21wb25lbnQodXJsKS5zcGxpdChQQU5FX0NIQVIpLFxyXG4gICAgICBwYW5lcyA9IGRlc2VyaWFsaXplKHNlY3Rpb25zWzBdKSxcclxuICAgICAgdGFicyA9IHNlY3Rpb25zLmxlbmd0aCA+IDEgPyBkZXNlcmlhbGl6ZShzZWN0aW9uc1sxXSkgOiBbXTtcclxuXHJcbiAgICBmdW5jdGlvbiBkZXNlcmlhbGl6ZShwYXRoOiBzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuIHBhdGguXHJcbiAgICAgICAgc3BsaXQoUEFUSF9DSEFSKS5tYXAocyA9PiB7XHJcbiAgICAgICAgICBjb25zdCBbcGF0aCwgcXVlcnlTdHJpbmddID0gcy5zcGxpdChRVUVSWV9DSEFSKTtcclxuICAgICAgICAgIHJldHVybiB7IHBhdGgsIHF1ZXJ5U3RyaW5nIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgcGFuZSA9IHBhbmVzW2ldO1xyXG4gICAgICBhd2FpdCB0aGlzLl9uYXZpZ2F0ZVBhbmUoaSwgcGFuZS5wYXRoLCBwYW5lLnF1ZXJ5U3RyaW5nLCBzdGF0ZSA/IHN0YXRlLnBhbmVzW2ldIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wYW5lcy5sZW5ndGggPiBwYW5lcy5sZW5ndGgpIHtcclxuICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICB3aGlsZSAoaSA8IHRoaXMucGFuZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHBhbmUgPSB0aGlzLnBhbmVzW2ldO1xyXG4gICAgICAgIGlmIChwYW5lcy5sZW5ndGggLSAxIDwgaSB8fCBwYW5lLnBhdGggIT09IHBhbmVzW2ldLnBhdGgpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPT09IGkpXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGkgLSAxO1xyXG4gICAgICAgICAgdGhpcy5wYW5lcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLl9kZXN0cm95UGFuZShwYW5lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaSsrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4IDwgMClcclxuICAgICAgdGhpcy5zZWxlY3QoMCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHRhYiA9IHRhYnNbaV07XHJcbiAgICAgIGF3YWl0IHRoaXMuX25hdmlnYXRlVGFiKGksIHRhYi5wYXRoLCB0YWIucXVlcnlTdHJpbmcsIHN0YXRlID8gc3RhdGUudGFic1tpXSA6IG51bGwpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGFicy5sZW5ndGggPiB0YWJzLmxlbmd0aCkge1xyXG4gICAgICBsZXQgaSA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgdGhpcy50YWJzLmxlbmd0aCkge1xyXG4gICAgICAgIGxldCB0YWIgPSB0aGlzLnRhYnNbaV07XHJcbiAgICAgICAgaWYgKHRhYnMubGVuZ3RoIC0gMSA8IGkgfHwgdGFiLnBhdGggIT09IHRhYnNbaV0ucGF0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9PT0gaSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpIC0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudGFicy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLl9kZXN0cm95UGFuZSh0YWIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoICYmIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA8IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMDtcclxuICAgIH1cclxuICAgIGNvbnN0IG4gPSB0aGlzLnBhbmVzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgIGxldCBwYW5lID0gdGhpcy5wYW5lc1tpXTtcclxuICAgICAgaWYgKHBhbmUuZXhwYW5kZWQgIT09IChuID09PSAxKSkge1xyXG4gICAgICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uRXhwYW5kKHBhbmUuX2V4cGFuZGVkID0gbiA9PT0gMSwgcGFuZSk7XHJcbiAgICAgICAgcGFuZS5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGluZGV4XHJcbiAgICogQHBhcmFtIHBhdGhcclxuICAgKiBAcGFyYW0gcXVlcnlTdHJpbmdcclxuICAgKiBAcGFyYW0gc3RhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9uYXZpZ2F0ZVBhbmUoaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nLCBxdWVyeVN0cmluZzogc3RyaW5nLCBzdGF0ZT86IGFueSkge1xyXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLl9tYXRjaChwYXRoKTtcclxuXHJcbiAgICBpZiAoIXJvdXRlKSB0aHJvdyBgbm8gbWF0Y2ggJHtwYXRofWA7XHJcblxyXG4gICAgaWYgKCFzdGF0ZSkgc3RhdGUgPSB7fTtcclxuXHJcbiAgICB3aGlsZSAoaW5kZXggPCB0aGlzLnBhbmVzLmxlbmd0aCkge1xyXG4gICAgICBsZXQgcGFuZSA9IHRoaXMucGFuZXNbaW5kZXhdO1xyXG4gICAgICBpZiAocGF0aCA9PT0gcGFuZS5wYXRoKSB7XHJcbiAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nID09PSBwYW5lLnF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLl9wYXJzZVF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKTtcclxuICAgICAgICAgIHRoaXMuX25hdlF1ZXJ5UGFyYW1zKHBhbmUsIHF1ZXJ5UGFyYW1zLCBzdGF0ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHBhbmUucm91dGUgPT09IHJvdXRlKSB7XHJcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLl9wYXJzZVF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKTtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9wYXJhbXMocGFuZS5yb3V0ZSBhcyBFeHRlbmRlZFJvdXRlLCBwYXRoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9uYXZQYXJhbXMocGF0aCwgcGFuZSwgcGFyYW1zLCBxdWVyeVBhcmFtcywgc3RhdGUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpbmRleCsrO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcyhyb3V0ZSwgcGF0aCk7XHJcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZmluZEFuY2VzdG9yKHJvdXRlLCBwYXRoKTtcclxuICAgIGF3YWl0IHRoaXMuX3N0YXRlKHJvdXRlLCBwYXRoLCBwYXJhbXMsIHN0YXRlKTtcclxuICAgIHRoaXMuX2luc2VydFBhbmUocm91dGUuY29tcG9uZW50LCB7XHJcbiAgICAgIHBhdGgsIHBhcmVudCwgcm91dGUsIGRhdGE6IHN0YXRlLCBwYXJhbXMsIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICBpY29uOiByb3V0ZS5pY29uLFxyXG4gICAgICBoZWxwOiByb3V0ZS5oZWxwLFxyXG4gICAgICBwb2xpY3k6IHJvdXRlLnBvbGljeSxcclxuICAgICAgZm9jdXM6IGZhbHNlXHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBhc3luYyBfbmF2aWdhdGVUYWIoaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nLCBxdWVyeVN0cmluZzogc3RyaW5nLCBzdGF0ZT86IGFueSkge1xyXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLl9tYXRjaChwYXRoKTtcclxuXHJcbiAgICBpZiAoIXJvdXRlKSB0aHJvdyBgbm8gbWF0Y2ggJHtwYXRofWA7XHJcblxyXG4gICAgaWYgKCFzdGF0ZSkgc3RhdGUgPSB7fTtcclxuXHJcbiAgICB3aGlsZSAoaW5kZXggPCB0aGlzLnRhYnMubGVuZ3RoKSB7XHJcbiAgICAgIGxldCB0YWIgPSB0aGlzLnRhYnNbaW5kZXhdO1xyXG4gICAgICBpZiAocGF0aCA9PT0gdGFiLnBhdGgpIHtcclxuICAgICAgICBpZiAocXVlcnlTdHJpbmcgPT09IHRhYi5xdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgICB0aGlzLl9uYXZRdWVyeVBhcmFtcyh0YWIsIHF1ZXJ5UGFyYW1zLCBzdGF0ZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRhYi5yb3V0ZSA9PT0gcm91dGUpIHtcclxuICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcyh0YWIucm91dGUgYXMgRXh0ZW5kZWRSb3V0ZSwgcGF0aCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbmF2UGFyYW1zKHBhdGgsIHRhYiwgcGFyYW1zLCBxdWVyeVBhcmFtcywgc3RhdGUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpbmRleCsrO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcmFtcyhyb3V0ZSwgcGF0aCk7XHJcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG5cclxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2ZpbmRBbmNlc3Rvcihyb3V0ZSwgcGF0aCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5fc3RhdGUocm91dGUsIHBhdGgsIHBhcmFtcywgc3RhdGUpO1xyXG4gICAgdGhpcy5faW5zZXJ0VGFiKHJvdXRlLmNvbXBvbmVudCwge1xyXG4gICAgICBpY29uOiByb3V0ZS5pY29uLFxyXG4gICAgICBoZWxwOiByb3V0ZS5oZWxwLFxyXG4gICAgICBwb2xpY3k6IHJvdXRlLnBvbGljeSB8IE9wZW5Qb2xpY3kuVGFiLFxyXG4gICAgICBwYXRoLCBwYXJlbnQsIHJvdXRlLFxyXG4gICAgICBkYXRhOiBzdGF0ZSxcclxuICAgICAgcGFyYW1zLCBxdWVyeVBhcmFtcyxcclxuICAgICAgZm9jdXM6IGZhbHNlLFxyXG4gICAgICBzd2FwOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2ZpbmRBbmNlc3Rvcihyb3V0ZTogRXh0ZW5kZWRSb3V0ZSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBpZiAoKHJvdXRlIGFzIEV4dGVuZGVkUm91dGUpLnBhcmVudClcclxuICAgICAgcmV0dXJuIHRoaXMucGFuZXMuZmluZChwID0+IChwLnJvdXRlIGFzIEV4dGVuZGVkUm91dGUpID09PVxyXG4gICAgICAgIChyb3V0ZSBhcyBFeHRlbmRlZFJvdXRlKS5wYXJlbnQgJiZcclxuICAgICAgICBwYXRoLnN0YXJ0c1dpdGgocC5wYXRoKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYW5lXHJcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbmF2UXVlcnlQYXJhbXMocGFuZTogUGFuZVJlZjxhbnk+LCBxdWVyeVBhcmFtczogUGFyYW1NYXAsIHN0YXRlOiBQYXJhbU1hcCkge1xyXG4gICAgcGFuZS5fcXVlcnlTdHJpbmcgPSB0aGlzLl9xdWVyeVN0cmluZyhxdWVyeVBhcmFtcyk7XHJcbiAgICBzdGF0ZSAmJiBwYW5lLl9kYXRhJC5uZXh0KHN0YXRlKTtcclxuICAgIHBhbmUuX3F1ZXJ5UGFyYW1zJC5uZXh0KHF1ZXJ5UGFyYW1zKTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBRdWVyeVBhcmFtTmF2aWdhdGlvbihxdWVyeVBhcmFtcywgcGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYXRoXHJcbiAgICogQHBhcmFtIHBhbmVcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIHF1ZXJ5UGFyYW1zXHJcbiAgICogQHBhcmFtIHN0YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBfbmF2UGFyYW1zKHBhdGg6IHN0cmluZywgcGFuZTogUGFuZVJlZjxhbnk+LCBwYXJhbXM6IFBhcmFtTWFwLCBxdWVyeVBhcmFtczogUGFyYW1NYXAsIHN0YXRlOiBQYXJhbU1hcCkge1xyXG4gICAgaWYgKHBhbmUucm91dGUuY2FuRGlzbWlzcylcclxuICAgICAgYXdhaXQgdGhpcy5fZGlzbWlzcyhwYW5lKTtcclxuXHJcbiAgICBpZiAoIXN0YXRlKSBzdGF0ZSA9IHt9O1xyXG4gICAgYXdhaXQgdGhpcy5fc3RhdGUocGFuZS5yb3V0ZSBhcyBFeHRlbmRlZFJvdXRlLCBwYXRoLCBwYXJhbXMsIHN0YXRlKTtcclxuICAgIHBhbmUuX2RhdGEkLm5leHQoc3RhdGUpO1xyXG4gICAgcGFuZS5fcGF0aCA9IHBhdGg7XHJcbiAgICBwYW5lLl9wYXJhbXMkLm5leHQocGFyYW1zKTtcclxuICAgIGlmIChxdWVyeVBhcmFtcykge1xyXG4gICAgICBwYW5lLl9xdWVyeVN0cmluZyA9IHRoaXMuX3F1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zKTtcclxuICAgICAgcGFuZS5fcXVlcnlQYXJhbXMkLm5leHQocXVlcnlQYXJhbXMpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHBhbmUuX3F1ZXJ5U3RyaW5nID0gJyc7XHJcbiAgICAgIHBhbmUuX3F1ZXJ5UGFyYW1zJC5uZXh0KHt9KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGV2dCA9IG5ldyBQYXJhbU5hdmlnYXRpb24ocGFyYW1zLCBwYW5lKTtcclxuICAgIHBhbmUuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgdGhpcy5fcm91dGVyLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuXHJcbiAgICB0aGlzLnBhbmVzLmNvbmNhdCh0aGlzLnRhYnMpLmZvckVhY2goY2hpbGQgPT4ge1xyXG4gICAgICBpZiAoY2hpbGQucm91dGUgJiYgKGNoaWxkLnJvdXRlIGFzIEV4dGVuZGVkUm91dGUpLnBhcmVudCA9PT0gcGFuZS5yb3V0ZSkge1xyXG4gICAgICAgIGNoaWxkLl9kYXRhJC5uZXh0KE9iamVjdC5hc3NpZ24oY2hpbGQuZGF0YSwgc3RhdGUpKTtcclxuICAgICAgICBjaGlsZC5fcGFyYW1zJC5uZXh0KHBhcmFtcyk7XHJcbiAgICAgICAgY2hpbGQuX3BhdGggPSBwYW5lLnBhdGggKyAnLycgKyBjaGlsZC5yb3V0ZS5wYXRoO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiSW5kZXggPiAtMSAmJiBjaGlsZCA9PT0gdGhpcy50YWJzW3RoaXMuc2VsZWN0ZWRUYWJJbmRleF0pIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMuc2VsZWN0ZWRUYWJJbmRleDtcclxuICAgICAgICAgIHRoaXMuZ3JvdXAgPSBjaGlsZC5ncm91cDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKHBhbmUubW9kZSA9PT0gJ3BhbmUnKSB0aGlzLnRpdGxlVmFyaWFudCsrO1xyXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuICAvKiogKi9cclxuICBwcml2YXRlIF9zeW5jQnJvd3Nlckhpc3RvcnkoKSB7XHJcbiAgICBsZXQgcGF0aCA9IHRoaXMucGFuZXMuZmlsdGVyKHAgPT4gcC5yb3V0ZSkubWFwKHMgPT4gcy5mdWxsUGF0aCkuam9pbihQQVRIX0NIQVIpO1xyXG4gICAgaWYgKHRoaXMudGFicy5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgdGFicyA9IHRoaXMudGFicy5maWx0ZXIocCA9PiBwLnJvdXRlKTtcclxuICAgICAgaWYgKHRhYnMubGVuZ3RoKVxyXG4gICAgICAgIHBhdGggKz0gUEFORV9DSEFSICsgdGFicy5tYXAocyA9PiBzLmZ1bGxQYXRoKS5qb2luKFBBVEhfQ0hBUik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NyZWF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgdGhpcy5fbmF2aWdhdGlvbkluUHJvY2VzcyA9IHRydWU7XHJcbiAgICBoaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgJycsICcvJyArIHBhdGgpO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9uYXZpZ2F0aW9uSW5Qcm9jZXNzID0gZmFsc2UsIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jcmVhdGVIaXN0b3J5U3RhdGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBiaXpkb2M6IHRydWUsXHJcbiAgICAgIHN0ZXA6IGhpc3Rvcnkuc3RhdGUgJiYgaGlzdG9yeS5zdGF0ZS5iaXpkb2MgPyAoaGlzdG9yeS5zdGF0ZSBhcyBIaXN0b3J5U3RhdGUpLnN0ZXAgKyAxIDogMSxcclxuICAgICAgc2VsZWN0ZWRUYWJJbmRleDogdGhpcy5zZWxlY3RlZFRhYkluZGV4LFxyXG4gICAgICBwYW5lczogdGhpcy5wYW5lcy5tYXAocCA9PiBwLmRhdGEpLFxyXG4gICAgICB0YWJzOiB0aGlzLnRhYnMubWFwKHQgPT4gdC5kYXRhKSxcclxuICAgICAgc3dhcDogdGhpcy5zd2FwLFxyXG4gICAgICBncm91cDogdGhpcy5ncm91cCxcclxuICAgICAgc3dhcFRhYjogdGhpcy5zd2FwVGFiLFxyXG4gICAgICBwcmV2R3JvdXA6IHRoaXMucHJldkdyb3VwXHJcbiAgICB9IGFzIEhpc3RvcnlTdGF0ZTtcclxuICB9XHJcblxyXG4gIGRyb3AoZXZ0OiBDZGtEcmFnRHJvcDxzdHJpbmcsIHN0cmluZz4pIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzW2V2dC5wcmV2aW91c0luZGV4XTtcclxuICAgIHRoaXMucGFuZXMuc3BsaWNlKGV2dC5wcmV2aW91c0luZGV4LCAxKTtcclxuICAgIHRoaXMucGFuZXMuc3BsaWNlKGV2dC5jdXJyZW50SW5kZXgsIDAsIHBhbmUpO1xyXG4gICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQaW5uZWQocGFuZTogUGFuZVJlZjxhbnk+KSB7XHJcbiAgICBwYW5lLnBpbm5lZCA9ICFwYW5lLnBpbm5lZDtcclxuICAgIHRoaXMucGFuZXMuZm9yRWFjaChzID0+IHtcclxuICAgICAgaWYgKHMuZGVjZW5kZW50T2YocGFuZSkpIHMucGlubmVkID0gcGFuZS5waW5uZWQ7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3F1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zOiBQYXJhbU1hcCkge1xyXG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhxdWVyeVBhcmFtcyk7XHJcbiAgICBsZXQgcXVlcnlTdHJpbmc6IHN0cmluZztcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IHZhbCA9IHF1ZXJ5UGFyYW1zW25hbWVzW2ldXTtcclxuXHJcbiAgICAgIGlmICh2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoIXF1ZXJ5U3RyaW5nKSBxdWVyeVN0cmluZyA9ICcnO1xyXG4gICAgICAgIGVsc2UgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZyArIEFSR19DSEFSO1xyXG5cclxuICAgICAgICBpZiAoaXNTdHJpbmcodmFsKSlcclxuICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAke25hbWVzW2ldfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWwpfWA7XHJcbiAgICAgICAgZWxzZSBpZiAoaXNBcnJheSh2YWwpKVxyXG4gICAgICAgICAgcXVlcnlTdHJpbmcgKz0gdmFsLm1hcCh2ID0+IGAke25hbWVzW2ldfT0ke3Z9YCkuam9pbihBUkdfQ0hBUik7XHJcbiAgICAgICAgZWxzZSBpZiAoaXNEYXRlKHZhbCkpXHJcbiAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJHtuYW1lc1tpXX09JHt2YWwudG9KU09OKCl9YDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBxdWVyeVN0cmluZyArPSBgJHtuYW1lc1tpXX09JHt2YWx9YDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHF1ZXJ5U3RyaW5nO1xyXG4gIH1cclxuICBwcml2YXRlIF9wYXJzZVF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiBQYXJhbU1hcCB7XHJcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHt9O1xyXG4gICAgcXVlcnlTdHJpbmcgJiYgcXVlcnlTdHJpbmcuXHJcbiAgICAgIHNwbGl0KEFSR19DSEFSKS5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSBwLnNwbGl0KCc9Jyk7XHJcbiAgICAgICAgaWYgKCFxdWVyeVBhcmFtc1tuYW1lXSlcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zW25hbWVdID0gdmFsdWU7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCB2YWxzID0gcXVlcnlQYXJhbXNbbmFtZV07XHJcbiAgICAgICAgICBxdWVyeVBhcmFtc1tuYW1lXSA9IGlzQXJyYXkodmFscykgPyBbLi4udmFscywgdmFsdWVdIDogW3ZhbHMsIHZhbHVlXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgcmV0dXJuIHF1ZXJ5UGFyYW1zO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcm91dGVcclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3BhcmFtcyhyb3V0ZTogRXh0ZW5kZWRSb3V0ZSwgcGF0aDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBleCA9IHJvdXRlLnJlZ0V4LmV4ZWMocGF0aCksXHJcbiAgICAgIHBhcmFtcyA9IGV4Lmdyb3VwcztcclxuXHJcbiAgICByZXR1cm4gcGFyYW1zIHx8IHt9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gdXJsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbWF0Y2godXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCByb3V0ZSA9IHRoaXMuX3JlcG9zaXRvcnkuZmluZChyID0+IHIucmVnRXgudGVzdCh1cmwpKTtcclxuICAgIGlmIChyb3V0ZSlcclxuICAgICAgd2hpbGUgKHJvdXRlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgbGV0IGNoaWxkID0gcm91dGUuY2hpbGRyZW4uZmluZChyID0+IHIucmVnRXgudGVzdCh1cmwpKTtcclxuICAgICAgICBpZiAoY2hpbGQpXHJcbiAgICAgICAgICByb3V0ZSA9IGNoaWxkO1xyXG4gICAgICAgIGVsc2UgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIHJldHVybiByb3V0ZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHJvdXRlXHJcbiAgICogQHBhcmFtIHBhdGhcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIGRhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9zdGF0ZShyb3V0ZTogRXh0ZW5kZWRSb3V0ZSwgcGF0aDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtTWFwLCBkYXRhOiBQYXJhbU1hcCkge1xyXG4gICAgaWYgKHRoaXMuX3BlbmRpbmcuaW5kZXhPZihwYXRoKSA+IC0xKSB7XHJcbiAgICAgIC8vdGhpcy5fcHMudG9hc3QoJ1dvcmtpbmcnKTtcclxuICAgICAgdGhyb3cgJ2FscmVhZHkgcHJvY2Vzc2luZyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wZW5kaW5nLnB1c2gocGF0aCk7XHJcblxyXG4gICAgY29uc3QgeyBwYXJlbnQsIHJlc29sdmUgfSA9IHJvdXRlO1xyXG4gICAgaWYgKHBhcmVudClcclxuICAgICAgYXdhaXQgdGhpcy5fcGFyZW50c3RhdGUocGFyZW50LCBwYXRoLCBwYXJhbXMsIGRhdGEpO1xyXG4gICAgaWYgKHJlc29sdmUpIHtcclxuICAgICAgYXdhaXQgdGhpcy5fcmVzb2x2ZShyZXNvbHZlLCBwYXJhbXMsIGRhdGEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGVuZGluZy5yZW1vdmUocGF0aCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSByb3V0ZVxyXG4gICAqIEBwYXJhbSBwYXRoXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEBwYXJhbSBkYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBfcGFyZW50c3RhdGUocm91dGU6IEV4dGVuZGVkUm91dGUsIHBhdGg6IHN0cmluZywgcGFyYW1zOiBQYXJhbU1hcCwgZGF0YTogUGFyYW1NYXApIHtcclxuICAgIGNvbnN0IHsgcGFyZW50LCByZXNvbHZlIH0gPSByb3V0ZTtcclxuXHJcbiAgICBpZiAocGFyZW50KVxyXG4gICAgICBhd2FpdCB0aGlzLl9wYXJlbnRzdGF0ZShwYXJlbnQsIHBhdGgsIHBhcmFtcywgZGF0YSk7XHJcblxyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZXMuZmluZChzID0+IHMucm91dGUgJiYgcy5yb3V0ZSA9PT0gcm91dGVcclxuICAgICAgJiYgcGF0aC5zdGFydHNXaXRoKHMucGF0aCkpO1xyXG5cclxuICAgIHBhbmUgJiYgT2JqZWN0LmFzc2lnbihkYXRhLCBwYW5lLmRhdGEpO1xyXG5cclxuICAgIGlmIChyZXNvbHZlKVxyXG4gICAgICBhd2FpdCB0aGlzLl9yZXNvbHZlKHJlc29sdmUsIHBhcmFtcywgZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9yZXNvbHZlKHJlc29sdmU6IHsgW2tleTogc3RyaW5nXTogQ29tcG9uZW50VHlwZTxQYW5lUmVzb2x2ZTxhbnk+PiB9LCBwYXJhbXM6IFBhcmFtTWFwLCBkYXRhOiBQYXJhbU1hcCkge1xyXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJlc29sdmUpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBrZXkgPSBrZXlzW2ldO1xyXG4gICAgICBpZiAoIWRhdGFba2V5XSkge1xyXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KHJlc29sdmVba2V5XSkgYXMgUGFuZVJlc29sdmU8YW55PjtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGluc3RhbmNlLm9uUmVzb2x2ZShwYXJhbXMpO1xyXG4gICAgICAgIGlmIChpc1Byb21pc2UodmFsdWUpKVxyXG4gICAgICAgICAgYXdhaXQgdmFsdWUudGhlbihyID0+IGRhdGFba2V5XSA9IHIpO1xyXG4gICAgICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpXHJcbiAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2YWx1ZS5waXBlKHRhcChyID0+IGRhdGFba2V5XSA9IHIpKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZDxUPihjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8VD4sIG9wdGlvbnM/OiBQYW5lT3B0aW9ucykge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0KHRoaXMucGFuZXMubGVuZ3RoLCBjb21wb25lbnQsIG9wdGlvbnMpO1xyXG4gIH1cclxuICBpbnNlcnQ8VD4ocG9zaXRpb246IG51bWJlciwgY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LCBvcHRpb25zPzogUGFuZU9wdGlvbnMpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLl9pbnNlcnRQYW5lPFQ+KGNvbXBvbmVudCwgb3B0aW9ucyB8fCB7fSwgcG9zaXRpb24pO1xyXG4gICAgcmV0dXJuIHBhbmU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2luc2VydFBhbmU8VCA9IGFueT4oY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LCBvcHRpb25zOiB7XHJcbiAgICBwYXRoPzogc3RyaW5nO1xyXG4gICAgcm91dGU/OiBQYW5lUm91dGU7XHJcbiAgICBpY29uPzogc3RyaW5nO1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgICBpbnB1dHM/OiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcclxuICAgIGRhdGE/OiBQYXJhbU1hcDtcclxuICAgIHBhcmFtcz86IFBhcmFtTWFwO1xyXG4gICAgcXVlcnlQYXJhbXM/OiBQYXJhbU1hcDtcclxuICAgIGhlbHA/OiBzdHJpbmc7XHJcbiAgICBwYXJlbnQ/OiBQYW5lUmVmPGFueT47XHJcbiAgICBxdWVyeVN0cmluZz86IHN0cmluZztcclxuICAgIHBvbGljeT86IE9wZW5Qb2xpY3k7XHJcbiAgICBpbmplY3Rvcj86IEluamVjdG9yO1xyXG4gICAgZm9jdXM/OiBib29sZWFuXHJcbiAgfSwgcG9zaXRpb24/OiBudW1iZXIpIHtcclxuXHJcbiAgICBjb25zdCBzdHJldGNoYWJsZSA9IChvcHRpb25zLnBvbGljeSAmIE9wZW5Qb2xpY3kuU3RyZXRjaCkgPT0gT3BlblBvbGljeS5TdHJldGNoO1xyXG5cclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLl9jb25zdHJhY3Q8VD4oY29tcG9uZW50LCB7XHJcbiAgICAgIG1vZGU6ICdwYW5lJyxcclxuICAgICAgZXhwYW5kZWQ6ICF0aGlzLnBhbmVzLmxlbmd0aCxcclxuICAgICAgc3RyZXRjaGFibGUsXHJcbiAgICAgIC4uLm9wdGlvbnNcclxuICAgIH0pO1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpXHJcbiAgICAgIHBvc2l0aW9uID0gdGhpcy5wYW5lcy5sZW5ndGg7XHJcbiAgICB0aGlzLnBhbmVzLnB1c2gocGFuZSk7XHJcbiAgICB0aGlzLnRpdGxlVmFyaWFudCsrO1xyXG4gICAgdGhpcy5fY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IE5hdmlnYXRpb25TdGFydChwYW5lKTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICBpZiAob3B0aW9ucy5mb2N1cyAhPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gcG9zaXRpb247XHJcbiAgICAgIHRoaXMuX3RpdGxlLnNldChwYW5lLnRpdGxlKTtcclxuICAgICAgaWYgKHRoaXMucGFuZXMubGVuZ3RoID4gMSkgdGhpcy5zY3JvbGxUbyhwb3NpdGlvbik7XHJcbiAgICB9XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb25BcnJvd3MoKTtcclxuICAgIHJldHVybiBwYW5lO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29tcG9uZW50XHJcbiAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgKi9cclxuICBwcml2YXRlIF9jb25zdHJhY3Q8VCA9IGFueT4oY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LFxyXG4gICAgb3B0aW9uczoge1xyXG4gICAgICBtb2RlOiBQYW5lTW9kZSxcclxuICAgICAgZXhwYW5kZWQ/OiBib29sZWFuO1xyXG4gICAgICBkaWFsb2c/OiBib29sZWFuO1xyXG4gICAgICBzdHJldGNoYWJsZT86IGJvb2xlYW47XHJcbiAgICAgIHBhdGg/OiBzdHJpbmc7XHJcbiAgICAgIHJvdXRlPzogUGFuZVJvdXRlO1xyXG4gICAgICBpY29uPzogc3RyaW5nO1xyXG4gICAgICB0aXRsZT86IHN0cmluZztcclxuICAgICAgZ3JvdXA/OiBzdHJpbmc7XHJcbiAgICAgIGRhdGE/OiBQYXJhbU1hcDtcclxuICAgICAgcGFyYW1zPzogUGFyYW1NYXA7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1NYXA7XHJcbiAgICAgIGhlbHA/OiBzdHJpbmc7XHJcbiAgICAgIHBhcmVudD86IFBhbmVSZWY8YW55PjtcclxuICAgICAgaW5qZWN0b3I/OiBJbmplY3RvcjtcclxuICAgICAgcXVlcnlTdHJpbmc/OiBzdHJpbmc7XHJcbiAgICAgIGRpc21pc3NhYmxlPzogYm9vbGVhbjtcclxuICAgICAgZXhwYW5kYWJsZT86IGJvb2xlYW5cclxuICAgIH0pIHtcclxuICAgIGNvbnN0IHBhbmUgPSBuZXcgUGFuZVJlZjxUPihjb21wb25lbnQsIG9wdGlvbnMuaW5qZWN0b3IgfHwgdGhpcy5faW5qZWN0b3IsIG9wdGlvbnMpO1xyXG4gICAgcGFuZS5fY29tbWFuZCQuc3Vic2NyaWJlKGUgPT4gdGhpcy5fcGFuZUNvbW1hbmQ8VD4oZSwgcGFuZSkpO1xyXG4gICAgcmV0dXJuIHBhbmU7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0gb3B0aW9uc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX2luc2VydFRhYjxUID0gYW55Pihjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8VD4sIG9wdGlvbnM6IHtcclxuICAgIGljb24/OiBzdHJpbmc7XHJcbiAgICB0aXRsZT86IHN0cmluZztcclxuICAgIGdyb3VwPzogc3RyaW5nO1xyXG4gICAgaGVscD86IHN0cmluZztcclxuICAgIHBhdGg/OiBzdHJpbmc7XHJcbiAgICBxdWVyeVN0cmluZz86IHN0cmluZztcclxuICAgIHJvdXRlPzogUGFuZVJvdXRlO1xyXG4gICAgZGF0YT86IFBhcmFtTWFwO1xyXG4gICAgcGFyYW1zPzogUGFyYW1NYXA7XHJcbiAgICBxdWVyeVBhcmFtcz86IFBhcmFtTWFwO1xyXG4gICAgcGFyZW50PzogUGFuZVJlZjxhbnk+O1xyXG4gICAgcG9saWN5PzogT3BlblBvbGljeTtcclxuICAgIGluamVjdG9yPzogSW5qZWN0b3I7XHJcbiAgICBzd2FwPzogYm9vbGVhbjtcclxuICAgIGZvY3VzPzogYm9vbGVhbjtcclxuICB9KSB7XHJcbiAgICBjb25zdCB7IHBvbGljeSB9ID0gb3B0aW9ucyxcclxuICAgICAgZGlhbG9nID0gKHBvbGljeSAmIE9wZW5Qb2xpY3kuRGlhbG9nKSA9PSBPcGVuUG9saWN5LkRpYWxvZyxcclxuICAgICAgZXhwYW5kYWJsZSA9IChwb2xpY3kgJiBPcGVuUG9saWN5LkV4cGFuZGFibGUpID09IE9wZW5Qb2xpY3kuRXhwYW5kYWJsZSxcclxuICAgICAgZGlzbWlzc2FibGUgPSAocG9saWN5ICYgT3BlblBvbGljeS5EaXNtaXNzYWJsZSkgPT0gT3BlblBvbGljeS5EaXNtaXNzYWJsZTtcclxuXHJcbiAgICBjb25zdCB0YWIgPSB0aGlzLl9jb25zdHJhY3Q8VD4oY29tcG9uZW50LFxyXG4gICAgICB7XHJcbiAgICAgICAgbW9kZTogJ3RhYicsXHJcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxyXG4gICAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgICAgZGlhbG9nLFxyXG4gICAgICAgIGRpc21pc3NhYmxlLFxyXG4gICAgICAgIGV4cGFuZGFibGVcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnRhYnMucHVzaCh0YWIpO1xyXG4gICAgZGlhbG9nICYmIHRoaXMuZGlhbG9nQ2hhbmdlLmVtaXQodGhpcy5kaWFsb2cgPSB0cnVlKTtcclxuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KG5ldyBOYXZpZ2F0aW9uU3RhcnQodGFiKSk7XHJcbiAgICBpZiAodGFiLmdyb3VwICYmIHRoaXMuZ3JvdXAgIT09IHRhYi5ncm91cCAmJiBvcHRpb25zLnN3YXAgIT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBpID0gMCwgc3dhcCA9IGZhbHNlO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgaWYgKHRoaXMudGFic1tpXS5ncm91cCAhPT0gdGFiLmdyb3VwKSB7XHJcbiAgICAgICAgICB0aGlzLl9kZXN0cm95UGFuZSh0aGlzLnRhYnNbaV0pO1xyXG4gICAgICAgICAgdGhpcy50YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgIHN3YXAgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBpKytcclxuICAgICAgfSB3aGlsZSAoaSA8IHRoaXMudGFicy5sZW5ndGgpO1xyXG4gICAgICBpZiAoc3dhcCkge1xyXG4gICAgICAgIHRoaXMuc3dhcFRhYiA9IHRoaXMuX2dldEhpc3RvcnlTdGVwKCk7XHJcbiAgICAgICAgdGhpcy5wcmV2R3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuc3dhcFRhYiA9IG51bGw7XHJcbiAgICB0aGlzLmdyb3VwID0gdGFiLmdyb3VwO1xyXG4gICAgaWYgKG9wdGlvbnMuZm9jdXMgIT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMudGFicy5sZW5ndGggLSAxO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRhYjtcclxuICB9XHJcblxyXG4gIGJhY2soKSB7XHJcbiAgICB0aGlzLl9uYXZCYWNrKHRoaXMuc3dhcCk7XHJcbiAgICB0aGlzLnN3YXAgPSBudWxsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gc3RlcHNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9uYXZCYWNrKHN0ZXBzOiBudW1iZXIpIHtcclxuICAgIGhpc3RvcnkuZ28oc3RlcHMgLSAoaGlzdG9yeS5zdGF0ZSBhcyBIaXN0b3J5U3RhdGUpLnN0ZXApO1xyXG4gIH1cclxuICB0YWJCYWNrKCkge1xyXG4gICAgdGhpcy5fbmF2QmFjayh0aGlzLnN3YXBUYWIpO1xyXG4gICAgdGhpcy5zd2FwVGFiID0gbnVsbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbW1hbmRcclxuICAgKiBAcGFyYW0gcGFuZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX3BhbmVDb21tYW5kPFQgPSBhbnk+KGNvbW1hbmQ6IFBhbmVDb21tYW5kLCBwYW5lOiBQYW5lUmVmPFQ+KSB7XHJcbiAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgY2FzZSAnZm9jdXMnOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYW5lcy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzKGluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnY2xvc2UnOlxyXG4gICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKSB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVRhYihpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBhbmVzLmluZGV4T2YocGFuZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZygpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2xlYXJUYWJzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5wYW5lcy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoREVGQVVMVF9ST1VURSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdleHBhbmQnOlxyXG4gICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKVxyXG4gICAgICAgICAgdGhpcy5leHBhbmRUYWIoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLmV4cGFuZFBhbmUoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVjeWNsZSc6IHtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NyZWF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlLCAnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAqIEFsdC1oXHJcbiAqIEBwYXJhbSBldmVudFxyXG4gKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnRhYnMubGVuZ3RoKVxyXG4gICAgICB0aGlzLmNvbGxhcHNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGVzY2FwZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIGFzeW5jIGNvbGxhcHNlKCkge1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IENvbGxhcHNlTmF2aWdhdGlvbigpO1xyXG4gICAgdGhpcy5fcm91dGVyLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLl9jbGVhclBlbmRpbmcoKTtcclxuICAgIGF3YWl0IHRoaXMuX2NsZWFyVGFicygpO1xyXG4gICAgdGhpcy5kaWFsb2cgJiZcclxuICAgICAgdGhpcy5kaWFsb2dDaGFuZ2UuZW1pdCh0aGlzLmRpYWxvZyA9IGZhbHNlKTtcclxuICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBvblJlc2l6ZSgpIHtcclxuICAgIHRoaXMuX3Jlc2l6aW5nLm5leHQoKTtcclxuICB9XHJcbiAgLyoqICovXHJcbiAgcHJpdmF0ZSBfcmVzaXplKCkge1xyXG4gICAgLy9pZiAodGhpcy5wYW5lcy5sZW5ndGggPiAxICYmICF0aGlzLnBhbmVzW3RoaXMucGFuZXMubGVuZ3RoIC0gMV0uc3RyZXRjaGFibGUpIHtcclxuICAgIC8vICBjb25zdCBlbCA9IHRoaXMuX3BhbmVzQ29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCxcclxuICAgIC8vICAgIGNoaWxkID0gZWwubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgIC8vICBjaGlsZC5zdHlsZS5taW5XaWR0aCA9XHJcbiAgICAvLyAgICAoZWwucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gZWwucGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0IC0gY2hpbGQub2Zmc2V0TGVmdCAtIDIpICsgJ3B4JztcclxuICAgIC8vfVxyXG4gICAgdGhpcy50YWJzLmNvbmNhdCh0aGlzLnBhbmVzKS5mb3JFYWNoKHAgPT4gcC5fZXZlbnRzJC5uZXh0KG5ldyBOYXZpZ2F0aW9uUmVzaXplKHtcclxuICAgIH0gYXMgYW55LCBwKSkpO1xyXG4gIH1cclxuICBjbG9zZVRhYihwb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB0YWIgPSB0aGlzLnRhYnNbcG9zaXRpb25dO1xyXG4gICAgaWYgKCF0aGlzLl9jbG9zaW5nKHRhYikpIHJldHVybjtcclxuICAgIHRoaXMudGFicy5zcGxpY2UocG9zaXRpb24sIDEpO1xyXG4gICAgdGhpcy5fZGVzdHJveVBhbmUodGFiKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMudGFicy5sZW5ndGggPyBwb3NpdGlvbiA+IDAgPyBwb3NpdGlvbiAtIDEgOiAwIDogLTE7XHJcbiAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICAgIHRhYi5kaWFsb2cgJiZcclxuICAgICAgdGhpcy5kaWFsb2dDaGFuZ2UuZW1pdCh0aGlzLmRpYWxvZyA9IGZhbHNlKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBhbmVcclxuICAgKi9cclxuICBwcml2YXRlIF9jbG9zaW5nKHBhbmU6IFBhbmVSZWY8YW55Pikge1xyXG4gICAgbGV0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uQ2xvc2UocGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHJldHVybiAhZXZ0Ll9wcmV2ZW50RGVmYXVsdDtcclxuICB9XHJcblxyXG4gIGV4cGFuZFBhbmUoKSB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5wYW5lc1t0aGlzLnNlbGVjdGVkSW5kZXhdO1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IE5hdmlnYXRpb25FeHBhbmQocGFuZS5fZXhwYW5kZWQgPSB0cnVlLCBwYW5lKTtcclxuICAgIHBhbmUuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgdGhpcy5fcm91dGVyLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLnN3YXAgPSB0aGlzLl9nZXRIaXN0b3J5U3RlcCgpO1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgZG8ge1xyXG4gICAgICBpZiAodGhpcy5wYW5lc1tpXSAhPT0gcGFuZSkge1xyXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3lQYW5lKHRoaXMucGFuZXNbaV0pO1xyXG4gICAgICAgIHRoaXMucGFuZXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBpKys7XHJcbiAgICB9XHJcbiAgICB3aGlsZSAoaSA8IHRoaXMucGFuZXMubGVuZ3RoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfZ2V0SGlzdG9yeVN0ZXAoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiBoaXN0b3J5LnN0YXRlICYmIGhpc3Rvcnkuc3RhdGUuYml6ZG9jID8gKGhpc3Rvcnkuc3RhdGUgYXMgSGlzdG9yeVN0YXRlKS5zdGVwIDogMDtcclxuICB9XHJcblxyXG4gIGV4cGFuZFRhYigpIHtcclxuICAgIGNvbnN0IHRhYiA9IHRoaXMudGFic1t0aGlzLnNlbGVjdGVkVGFiSW5kZXhdO1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IE5hdmlnYXRpb25FeHBhbmQodGFiLl9leHBhbmRlZCA9IHRydWUsIHRhYilcclxuICAgIHRhYi5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgaWYgKGV2dC5fcHJldmVudERlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuc3dhcCA9IHRoaXMuX2dldEhpc3RvcnlTdGVwKCk7XHJcbiAgICB0aGlzLnN3YXBUYWIgPSBudWxsO1xyXG4gICAgdGhpcy5wYW5lcy5mb3JFYWNoKHAgPT5cclxuICAgICAgdGhpcy5fZGVzdHJveVBhbmUocClcclxuICAgICk7XHJcbiAgICB0aGlzLnRhYnMuc3BsaWNlKHRoaXMuc2VsZWN0ZWRUYWJJbmRleCwgMSk7XHJcbiAgICB0aGlzLnBhbmVzLnNwbGljZSgwLCB0aGlzLnBhbmVzLmxlbmd0aCwgdGFiKTtcclxuXHJcbiAgICB0YWIuX21vZGUgPSAncGFuZSc7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3QocG9zaXRpb246IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gcG9zaXRpb24pIHJldHVybjtcclxuICAgIGlmIChwb3NpdGlvbiA9PT0gLTEpIHtcclxuICAgICAgaWYgKHRoaXMucGFuZXMubGVuZ3RoKSBwb3NpdGlvbiA9IHRoaXMucGFuZXMubGVuZ3RoIC0gMTtcclxuICAgICAgZWxzZSByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBwb3NpdGlvbjtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzW3Bvc2l0aW9uXTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uRm9jdXMocGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICB0aGlzLl90aXRsZS5zZXQocGFuZS50aXRsZSk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZUF0KHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzW3Bvc2l0aW9uXTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2Nsb3NpbmcocGFuZSkpIHJldHVybjtcclxuXHJcbiAgICBhd2FpdCB0aGlzLl9kaXNtaXNzKHBhbmUpO1xyXG5cclxuICAgIHRoaXMuX2Rpc2NhcmRQYW5lKHBhbmUpO1xyXG5cclxuICAgIGlmIChwb3NpdGlvbiA+PSB0aGlzLnNlbGVjdGVkSW5kZXgpXHJcbiAgICAgIHRoaXMuc2VsZWN0KC0xKTtcclxuICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFuZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX2Rpc21pc3MocGFuZTogUGFuZVJlZjxhbnk+KSB7XHJcbiAgICBjb25zdCBwYW5lcyA9IHRoaXMucGFuZXMuY29uY2F0KHRoaXMudGFicykuXHJcbiAgICAgIGZpbHRlcihzID0+IHMuZGVjZW5kZW50T2YocGFuZSkgJiYgcy5yb3V0ZSAmJiBzLnJvdXRlLmNhbkRpc21pc3MpLlxyXG4gICAgICByZXZlcnNlKCk7XHJcblxyXG4gICAgcGFuZS5yb3V0ZSAmJiBwYW5lLnJvdXRlLmNhbkRpc21pc3MgJiZcclxuICAgICAgcGFuZXMucHVzaChwYW5lKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBvayA9IGF3YWl0IHRoaXMuX2Rpc21pc3NhYmxlKHBhbmVzW2ldKTtcclxuICAgICAgaWYgKCFvaykgdGhyb3cgJyc7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYW5lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZGlzY2FyZFBhbmUocGFuZTogUGFuZVJlZjxhbnk+KSB7XHJcbiAgICB0aGlzLnBhbmVzLmNvbmNhdCh0aGlzLnRhYnMpLlxyXG4gICAgICBmaWx0ZXIocyA9PiBzLmRlY2VuZGVudE9mKHBhbmUpKS5cclxuICAgICAgcmV2ZXJzZSgpLlxyXG4gICAgICBmb3JFYWNoKHMgPT4gdGhpcy5fZGlzY2FyZFBhbmUocykpO1xyXG4gICAgdGhpcy5fZGVzdHJveVBhbmUocGFuZSk7XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFuZXMuaW5kZXhPZihwYW5lKTtcclxuICAgIHRoaXMucGFuZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xlYXJQZW5kaW5nKCkge1xyXG4gICAgdGhpcy5fcGVuZGluZy5zcGxpY2UoMCwgdGhpcy5fcGVuZGluZy5sZW5ndGgpO1xyXG4gIH1cclxuICAvKiogKi9cclxuICBwcml2YXRlIGFzeW5jIF9jbGVhclBhbmVzKCkge1xyXG4gICAgYXdhaXQgdGhpcy5fZGlzbWlzc0FsbCh0aGlzLnBhbmVzKTtcclxuICAgIHRoaXMucGFuZXMuZm9yRWFjaChwID0+IHRoaXMuX2Rlc3Ryb3lQYW5lKHApKTtcclxuICAgIHRoaXMucGFuZXMuc3BsaWNlKDAsIHRoaXMucGFuZXMubGVuZ3RoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG4gICAgdGhpcy5zd2FwID0gbnVsbDtcclxuICB9XHJcbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJUYWJzKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICBhd2FpdCB0aGlzLl9kaXNtaXNzQWxsKHRoaXMudGFicyk7XHJcbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0ID0+IHRoaXMuX2Rlc3Ryb3lQYW5lKHQpKTtcclxuICAgIHRoaXMudGFicy5zcGxpY2UoMCwgdGhpcy50YWJzLmxlbmd0aCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAtMTtcclxuICAgIHRoaXMuc3dhcFRhYiA9IG51bGw7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYW5lc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX2Rpc21pc3NBbGwocGFuZXM6IFBhbmVSZWZbXSkge1xyXG4gICAgZm9yIChsZXQgcGFuZSBvZiBwYW5lcy5cclxuICAgICAgZmlsdGVyKHMgPT4gcy5yb3V0ZSAmJiBzLnJvdXRlLmNhbkRpc21pc3MpKSB7XHJcbiAgICAgIGxldCBvayA9IGF3YWl0IHRoaXMuX2Rpc21pc3NhYmxlKHBhbmUpO1xyXG4gICAgICBpZiAoIW9rKVxyXG4gICAgICAgIHRocm93ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBhbmVcclxuICAgKi9cclxuICBwcml2YXRlIF9kaXNtaXNzYWJsZShwYW5lOiBQYW5lUmVmPGFueT4pIHtcclxuICAgIGNvbnN0IHsgaW5zdGFuY2UsIHJvdXRlOiB7IGNhbkRpc21pc3MgfSB9ID0gcGFuZTtcclxuICAgIGNvbnN0IGRpc21pc3NhYmxlID0gdGhpcy5faW5qZWN0b3IuZ2V0KGNhbkRpc21pc3MpIGFzIENhbkRpc21pc3M8YW55PjtcclxuICAgIGNvbnN0IG9rID0gZGlzbWlzc2FibGUub25EaXNtaXNzKGluc3RhbmNlKTtcclxuICAgIGlmIChpc0Jvb2xlYW4ob2spKVxyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9rKTtcclxuICAgIGVsc2UgaWYgKGlzUHJvbWlzZShvaykpXHJcbiAgICAgIHJldHVybiBvaztcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKG9rKTtcclxuICB9XHJcbiAgc2Nyb2xsVG8oaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2NoaWxkcmVuLml0ZW0oaW5kZXgpIGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgaXRlbSAmJiBpdGVtLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBpbmxpbmU6ICdlbmQnLCBibG9jazogJ2VuZCcgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBfY2hpbGRyZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGFuZXNDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lJyk7XHJcbiAgfVxyXG4gIGRvbmUoKSB7XHJcbiAgICB0aGlzLmVuYWJsZU5hdmlnYXRpb25BcnJvd3MoKTtcclxuICAgIHRoaXMuX3Jlc2l6ZSgpO1xyXG4gIH1cclxuICBlbmFibGVOYXZpZ2F0aW9uQXJyb3dzKF8/OiBFdmVudCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fcGFuZXNDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICBzY3JvbGxMZWZ0ID0gTWF0aC5mbG9vcihjb250YWluZXIuc2Nyb2xsTGVmdCkgKyAxO1xyXG4gICAgdGhpcy5uZXh0ID0gdGhpcy5fcnRsID8gY29udGFpbmVyLmNsaWVudFdpZHRoIC0gc2Nyb2xsTGVmdCA8IGNvbnRhaW5lci5zY3JvbGxXaWR0aCAtIDUwIDpcclxuICAgICAgc2Nyb2xsTGVmdCArIGNvbnRhaW5lci5jbGllbnRXaWR0aCA8IGNvbnRhaW5lci5zY3JvbGxXaWR0aCAtIDUwO1xyXG4gICAgdGhpcy5wcmV2ID0gdGhpcy5fcnRsID8gc2Nyb2xsTGVmdCA8IDEgOiBzY3JvbGxMZWZ0ID4gMTtcclxuICB9XHJcbiAgc2Nyb2xsQnkobjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsZWZ0ID0gbiAqICh0aGlzLl9ydGwgPyAtMSA6IDEpO1xyXG4gICAgdGhpcy5fcGFuZXNDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbEJ5KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBsZWZ0IH0pO1xyXG4gIH1cclxuICBmb2N1cyhpbmRleCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLl9jaGlsZHJlbi5pdGVtKGluZGV4KSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgIGVsLmZvY3VzKCk7XHJcbiAgfVxyXG4gIG9uUGFuZVJlc2l6ZShwYW5lOiBQYW5lUmVmPGFueT4sIGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCBlbCA9IChldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3QgLy8gcmVtZW1iZXIgbW91c2UgZG93biBpbmZvXHJcbiAgICAgIHdpZHRoID0gZWwuY2xpZW50V2lkdGgsXHJcbiAgICAgIGQgPSB0aGlzLl9ydGwgPyAtMSA6IDE7XHJcblxyXG4gICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuY2xhc3NMaXN0LmFkZCgncmVzaXppbmcnKTtcclxuXHJcbiAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IG9uTW91c2VNb3ZlO1xyXG4gICAgZG9jdW1lbnQub25tb3VzZXVwID0gKCkgPT4ge1xyXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS5jbGFzc0xpc3QucmVtb3ZlKCdyZXNpemluZycpO1xyXG4gICAgICBkb2N1bWVudC5vbm1vdXNlbW92ZSA9IGRvY3VtZW50Lm9ubW91c2V1cCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcbiAgICBmdW5jdGlvbiBvbk1vdXNlTW92ZShlKSB7XHJcblxyXG4gICAgICBjb25zdCBkZWx0YSA9IChlLmNsaWVudFggLSBldmVudC5jbGllbnRYKSAqIGQ7XHJcbiAgICAgIGVsLnN0eWxlLndpZHRoID0gZWwuc3R5bGUubWluV2lkdGhcclxuICAgICAgICA9IE1hdGgubWF4KHdpZHRoICsgZGVsdGEsIDM1MCkgKyAncHgnO1xyXG4gICAgICBwYW5lLl9ldmVudHMkLm5leHQobmV3IE5hdmlnYXRpb25SZXNpemUoe30gYXMgYW55LCBwYW5lKSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uVGFiUmVzaXplKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBjb25zdCBlbCA9IChldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgICBjb25zdFxyXG4gICAgICBtZSA9IHRoaXMsXHJcbiAgICAgIC8vIHJlbWVtYmVyIG1vdXNlIGRvd24gaW5mb1xyXG4gICAgICB3aWR0aCA9IGVsLmNsaWVudFdpZHRoLFxyXG4gICAgICBkID0gdGhpcy5fcnRsID8gMSA6IC0xO1xyXG5cclxuICAgIChldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpLmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XHJcblxyXG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XHJcblxyXG4gICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBvbk1vdXNlTW92ZTtcclxuICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9ICgpID0+IHtcclxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xyXG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgIG1lLmVuYWJsZU5hdmlnYXRpb25BcnJvd3MoKTtcclxuICAgICAgdGhpcy5fcmVzaXplKCk7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xyXG5cclxuICAgICAgLy8gcHJldmVudCBuZWdhdGl2ZS1zaXplZCBlbGVtZW50c1xyXG4gICAgICBjb25zdCBkZWx0YSA9IE1hdGgubWF4KChlLmNsaWVudFggLSBldmVudC5jbGllbnRYKSAqIGQsIC13aWR0aCk7XHJcbiAgICAgIGVsLnN0eWxlLndpZHRoID0gZWwuc3R5bGUubWluV2lkdGggPSAod2lkdGggKyBkZWx0YSkgKyAncHgnO1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndGFicycsIGVsLnN0eWxlLndpZHRoKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfZGVzdHJveVBhbmUocGFuZTogUGFuZVJlZikge1xyXG4gICAgcGFuZS5fZGVzdHJveSgpO1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IE5hdmlnYXRpb25FbmQocGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBQQU5FX1BBUkFNU19SRUdFWCA9IC8oOltcXHdcXC1cXC5dKykvZztcclxuXHJcbmZ1bmN0aW9uIHByZXBhcmVSb3V0ZXMocm91dGVzOiBQYW5lUm91dGVbXSwgdHJlZVBhdGg/OiBzdHJpbmcpOiBFeHRlbmRlZFJvdXRlW10ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBsZXQgcm91dGUgPSByb3V0ZXNbaV0sIGZ1bGxQYXRoID0gKHRyZWVQYXRoID8gKHRyZWVQYXRoICsgJy8nKSA6ICcnKSArIHJvdXRlLnBhdGg7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihyb3V0ZSwge1xyXG4gICAgICBmdWxsUGF0aCxcclxuICAgICAgcmVnRXg6IG5ldyBSZWdFeHAoJ14nICsgZnVsbFBhdGguXHJcbiAgICAgICAgcmVwbGFjZSgnLycsICdcXFxcLycpLlxyXG4gICAgICAgIHJlcGxhY2UoUEFORV9QQVJBTVNfUkVHRVgsIGUgPT4gYCg/PCR7ZS5zdWJzdHJpbmcoMSl9PltcXFxcd0BcXFxcLVxcXFwuXSopYCkpXHJcbiAgICB9KTtcclxuICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xyXG4gICAgICBsZXQgY2hpbGRyZW4gPSBwcmVwYXJlUm91dGVzKHJvdXRlLmNoaWxkcmVuLCBmdWxsUGF0aCk7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGlsZHJlbltqXSwge1xyXG4gICAgICAgICAgcGFyZW50OiByb3V0ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcm91dGVzIGFzIEV4dGVuZGVkUm91dGVbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIEV4dGVuZGVkUm91dGUgZXh0ZW5kcyBQYW5lUm91dGUge1xyXG4gIGZ1bGxQYXRoOiBzdHJpbmc7XHJcbiAgcmVnRXg6IFJlZ0V4cDtcclxuICBwYXJlbnQ/OiBFeHRlbmRlZFJvdXRlO1xyXG4gIGNoaWxkcmVuPzogRXh0ZW5kZWRSb3V0ZVtdO1xyXG59XHJcbmludGVyZmFjZSBIaXN0b3J5U3RhdGUge1xyXG4gIGJpemRvYzogdHJ1ZTtcclxuICBzdGVwOiBudW1iZXI7XHJcbiAgc3dhcD86IG51bWJlcjtcclxuICBzd2FwVGFiPzogbnVtYmVyO1xyXG4gIGdyb3VwPzogc3RyaW5nO1xyXG4gIHByZXZHcm91cD86IHN0cmluZztcclxuICBwYW5lczogYW55W107XHJcbiAgdGFiczogYW55W107XHJcbiAgc2VsZWN0ZWRUYWJJbmRleD86IG51bWJlcjtcclxufVxyXG4iLCI8ZGl2ICNwYW5lc0VsIGNsYXNzPVwicGFuZXNcIlxuICAgICBjZGtTY3JvbGxhYmxlXG4gICAgIEBwYW5lc1xuICAgICAoc2Nyb2xsKT1cImVuYWJsZU5hdmlnYXRpb25BcnJvd3MoJGV2ZW50KVwiPlxuICA8IS0tLS0+XG4gIEBpZiAocHJldikge1xuICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWFycm93XCIgKGNsaWNrKT1cInNjcm9sbEJ5KC00MDApXCIgbWF0UmlwcGxlIFttYXRSaXBwbGVVbmJvdW5kZWRdPVwidHJ1ZVwiIFttYXRSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCIgW21hdFJpcHBsZUNvbG9yXT1cImFjY2VudFwiPlxuICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tcnRsLW1pcnJvclwiPlxuICAgICAgYXJyb3dfYmFja19pb3NcbiAgICA8L2k+XG4gIDwvZGl2PlxuICB9XG4gIDwhLS1wYW5lcy0tPlxuICBAZm9yIChwIG9mIHBhbmVzOyB0cmFjayBwOyBsZXQgaSA9ICRpbmRleCkge1xuICA8ZGl2IChtb3VzZWVudGVyKT1cInNlbGVjdGVkSW5kZXggIT09IGkgJiYgIWRyYWdnaW5nICYmIHNlbGVjdChpKVwiXG4gICAgICAgKGNsaWNrKT1cInNlbGVjdChpKVwiXG4gICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZEluZGV4ID09PSBpICYmIHBhbmVzLmxlbmd0aCA+IDFcIiBjbGFzcz1cInBhbmVcIiBAcGFuZT5cbiAgICA8bmctY29udGFpbmVyIFtjZGtQb3J0YWxPdXRsZXRdPVwicC5fcG9ydGFsXCIgKGF0dGFjaGVkKT1cInAuX2luc3RhbmNlID0gJGV2ZW50Lmluc3RhbmNlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICBAaWYgKGkgPCBwYW5lcy5sZW5ndGggLSAxKSB7XG4gIDxkaXYgY2xhc3M9XCJwYW5lLXNlcGFyYXRvclwiIChtb3VzZWRvd24pPVwib25QYW5lUmVzaXplKHAsICRldmVudClcIj48L2Rpdj5cbiAgfVxuICB9XG4gIDwhLS1kaWFsb2ctLT5cbiAgQGlmIChkaWFsb2cpIHtcbiAgPGRpdiBjbGFzcz1cImJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlVGFiKDApXCI+PC9kaXY+XG4gIH1cbiAgPCEtLW5leHQtLT5cbiAgQGlmIChuZXh0KSB7XG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtYXJyb3cgZm9yd2FyZFwiPlxuICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tcnRsLW1pcnJvclwiIG1hdFJpcHBsZSBbbWF0UmlwcGxlVW5ib3VuZGVkXT1cInRydWVcIiBbbWF0UmlwcGxlQ2VudGVyZWRdPVwidHJ1ZVwiIFttYXRSaXBwbGVSYWRpdXNdPVwiMzBcIiBbbWF0UmlwcGxlQ29sb3JdPVwiYWNjZW50XCJcbiAgICAgICAoY2xpY2spPVwic2Nyb2xsQnkoNDAwKVwiPlxuICAgICAgYXJyb3dfZm9yd2FyZF9pb3NcbiAgICA8L2k+XG4gIDwvZGl2PlxuICB9XG48L2Rpdj5cbjwhLS10YWJzLS0+XG5AaWYgKHRhYnMubGVuZ3RoKSB7XG48ZGl2IGNsYXNzPVwidGFicy1zZXBhcmF0b3JcIiAobW91c2Vkb3duKT1cIm9uVGFiUmVzaXplKCRldmVudClcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ0YWJzIG1hdC1lbGV2YXRpb24tejE4XCIgI3RhYnNFbCBbQHRhYnNdPVwidGFic0FuaW1hdGlvblwiIChAdGFicy5kb25lKT1cImRvbmUoKVwiPlxuICA8IS0tdGl0bGUtLT5cbiAgPGRpdiBjbGFzcz1cInJvdyB0YWJzLXRpdGxlXCI+XG4gICAgQGlmIChzd2FwVGFiKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRhYkJhY2soKVwiIFtiaXpkb2NUb29sdGlwXT1cInByZXZHcm91cCB8fCAoJ0JhY2snfHRyYW5zbGF0ZSlcIj48bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+YXJyb3dfYmFjazwvbWF0LWljb24+PC9idXR0b24+XG4gICAgfVxuICAgIDxoMj57e2dyb3VwfX08L2gyPlxuICAgIEBpZiAoIWRpYWxvZykge1xuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJleHBhbmRUYWIoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFeHBhbmQnfCB0cmFuc2xhdGVcIj48bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCIgc3R5bGU9XCJmb250LXNpemU6IDIycHhcIj5vcGVuX2luX2Z1bGw8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgIH1cbiAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNvbGxhcHNlKClcIiBiaXpkb2NUb29sdGlwPVwiRXNjXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxuYXYgbWF0LXRhYi1uYXYtYmFyIGNvbG9yPVwiYWNjZW50XCIgW2Rpc2FibGVQYWdpbmF0aW9uXT1cInRydWVcIiBbdGFiUGFuZWxdPVwidGFiUGFuZWxcIj5cbiAgICBAZm9yICh0IG9mIHRhYnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgPGEgbWF0LXRhYi1saW5rIGNsYXNzPVwibWF0LXRhYi1saW5rXCJcbiAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRUYWJJbmRleCA9IGlcIlxuICAgICAgIFthY3RpdmVdPVwic2VsZWN0ZWRUYWJJbmRleCA9PT0gaVwiPlxuICAgICAgPG1hdC1pY29uIFttYXRCYWRnZV09XCJ0LmJhZGdlXCIgW21hdEJhZGdlSGlkZGVuXT1cIiF0LmJhZGdlXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIiBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiPnt7dC5pY29ufX08L21hdC1pY29uPiZuYnNwO1xuICAgICAge3t0LnRpdGxlfX1cbiAgICAgIEBpZiAodC5kaXNtaXNzYWJsZSkge1xuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZVRhYihpKVwiIGNsYXNzPVwidG9vbFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIH1cbiAgICAgIDwhLS1pbmxpbmU9XCJ0cnVlXCItLT5cbiAgICA8L2E+XG4gICAgfVxuICA8L25hdj5cbiAgPG1hdC10YWItbmF2LXBhbmVsICN0YWJQYW5lbCBjbGFzcz1cImZsZXhcIj5cbiAgICBAZm9yICh0IG9mIHRhYnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJzZWxlY3RlZFRhYkluZGV4ID09PSBpID8gJyc6ICdub25lJ1wiIGNsYXNzPVwidGFiXCIgW0B0YWJdPVwic2VsZWN0ZWRUYWJJbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbY2RrUG9ydGFsT3V0bGV0XT1cInQuX3BvcnRhbFwiIChhdHRhY2hlZCk9XCJ0Ll9pbnN0YW5jZSA9ICRldmVudC5pbnN0YW5jZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9tYXQtdGFiLW5hdi1wYW5lbD5cbjwvZGl2PlxufVxuIl19
1185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xvdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jb3JlL3Nsb3RzL3Nsb3RzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvY29yZS9zbG90cy9zbG90cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUErQixNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUUvSyxPQUFPLEVBQUUsYUFBYSxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQTRCLG9CQUFvQixFQUFFLGVBQWUsRUFBa0IsZUFBZSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQVksZ0JBQWdCLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDblUsT0FBTyxFQUFn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QUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFbEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDbkIsUUFBUTtZQUNSLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsUUFBUTtnQkFDOUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMxRSxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUN6QixNQUFNLEVBQUUsS0FBSztpQkFDZCxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBeUIsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlLCBDb21wb25lbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBSaXBwbGVDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIGlzT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBXaW5kb3dUaXRsZVNlcnZpY2UgfSBmcm9tICcuLi93aW5kb3ctdGl0bGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgcGFuZXNBbmltYXRpb24sIHBhbmVBbmltYXRpb24sIHBhcmFtQW5pbWF0aW9uLCBxdWVyeUFuaW1hdGlvbiwgdGFiQW5pbWF0aW9uLCB0YWJzQW5pbWF0aW9uIH0gZnJvbSAnLi4vYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzQm9vbGVhbiwgaXNEYXRlLCBpc1Byb21pc2UsIGlzU3RyaW5nIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgUEFORVNfREFUQSwgUGFuZVJlZiwgUGFuZU9wdGlvbnMsIFBhbmVDb21tYW5kLCBRdWVyeVBhcmFtTmF2aWdhdGlvbiwgUGFyYW1OYXZpZ2F0aW9uLCBOYXZpZ2F0aW9uTW9kZSwgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uQ2xvc2UsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25Gb2N1cywgUEFUSF9DSEFSLCBRVUVSWV9DSEFSLCBBUkdfQ0hBUiwgUEFORV9DSEFSLCBDb2xsYXBzZU5hdmlnYXRpb24sIEJhY2tOYXZpZ2F0aW9uLCBOYXZpZ2F0aW9uRXhwYW5kLCBQYW5lTW9kZSwgTmF2aWdhdGlvblJlc2l6ZSwgfSBmcm9tICcuL3BhbmUtcmVmJztcclxuaW1wb3J0IHsgUGFuZVJlc29sdmUsIFBhbmVSb3V0ZSwgUGFyYW1NYXAsIENhbkRpc21pc3MsIERFRkFVTFRfUE9MSUNZLCBPcGVuUG9saWN5IH0gZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgIHJlbW92ZUFsbExpc3RlbmVycyhuYW1lPzogc3RyaW5nKTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfUk9VVEUgPSBbJ2Rhc2hib2FyZCddO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JpemRvYy1wYW5lcy1vdXRsZXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zbG90cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc2xvdHMuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBwYW5lc0FuaW1hdGlvbixcclxuICAgIHBhbmVBbmltYXRpb24sXHJcbiAgICBwYXJhbUFuaW1hdGlvbixcclxuICAgIHF1ZXJ5QW5pbWF0aW9uLFxyXG4gICAgdGFic0FuaW1hdGlvbixcclxuICAgIHRhYkFuaW1hdGlvblxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNsb3RzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBkaWFsb2dDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQFZpZXdDaGlsZCgncGFuZXNFbCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIF9wYW5lc0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcclxuICBAVmlld0NoaWxkKCd0YWJzRWwnKSBfdGFic0VsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZChDZGtTY3JvbGxhYmxlLCB7IHN0YXRpYzogdHJ1ZSB9KSBfc2Nyb2xsYWJsZTogQ2RrU2Nyb2xsYWJsZTtcclxuICB0aXRsZVZhcmlhbnQgPSAwO1xyXG4gIGdyb3VwOiBzdHJpbmc7XHJcbiAgc3dhcD86IG51bWJlcjtcclxuICBzd2FwVGFiPzogbnVtYmVyO1xyXG4gIHByZXZHcm91cD86IHN0cmluZztcclxuICBkaWFsb2cgPSBmYWxzZTtcclxuXHJcbiAgcmVhZG9ubHkgcGFuZXM6IFBhbmVSZWY8YW55PltdID0gW107XHJcbiAgcmVhZG9ubHkgdGFiczogUGFuZVJlZjxhbnk+W10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3RlZFRhYkluZGV4ID0gLTE7XHJcbiAgcHVibGljIGdldCBzZWxlY3RlZFRhYkluZGV4KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkVGFiSW5kZXg7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRUYWJJbmRleCh2YWx1ZSkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJJbmRleCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fc2V0VGFiQW5pbWF0aW9uKCk7XHJcbiAgfVxyXG4gIHNlbGVjdGVkSW5kZXggPSAtMTtcclxuICBuZXh0OiBib29sZWFuO1xyXG4gIHByZXY6IGJvb2xlYW47XHJcbiAgZHJhZ2dpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0YWJzQW5pbWF0aW9uOiB7XHJcbiAgICB2YWx1ZTogbnVtYmVyLFxyXG4gICAgcGFyYW1zOiB7XHJcbiAgICAgIHN0YXJ0V2lkdGg6IG51bWJlclxyXG4gICAgfVxyXG4gIH07XHJcbiAgcmVhZG9ubHkgcmlwcGxlOiBSaXBwbGVDb25maWcgPSB7XHJcbiAgICBjb2xvcjogdGhpcy5fc2Vzc2lvbi5nZXRBY2NlbnQoKSxcclxuICAgIGNlbnRlcmVkOiB0cnVlLFxyXG4gICAgcmFkaXVzOiAyNVxyXG4gIH1cclxuICBhY2NlbnQ6IHN0cmluZyA9IHRoaXMuX3Nlc3Npb24uZ2V0QWNjZW50KCk7XHJcbiAgcHJpdmF0ZSBfbmF2aWdhdGlvbkluUHJvY2VzczogYm9vbGVhbjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9wZW5kaW5nID0gW10gYXMgc3RyaW5nW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcnRsID0gdGhpcy5fc2Vzc2lvbi5pbnZlcnNlO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlczogRXh0ZW5kZWRSb3V0ZVtdO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc2l6aW5nID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoUEFORVNfREFUQSkgZGF0YTogRXh0ZW5kZWRSb3V0ZVtdLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFBhbmVzUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBfdGl0bGU6IFdpbmRvd1RpdGxlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgX3Nlc3Npb24udGhlbWVDaGFuZ2UuXHJcbiAgICAgIHN1YnNjcmliZSgoKSA9PiB0aGlzLmFjY2VudCA9IF9zZXNzaW9uLmdldEFjY2VudCgpKTtcclxuICAgIHRoaXMuX3JvdXRlcyA9IHByZXBhcmVSb3V0ZXMoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3JvdXRlci5fbmF2aWdhdGUkLlxyXG4gICAgICBzdWJzY3JpYmUoYXN5bmMgbiA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tYW5kcywgY29tcG9uZW50LCBwYXRoTW9kZSwgcmVsYXRpdmVUbywgaW5qZWN0b3IgfSA9IG47XHJcbiAgICAgICAgbGV0IHtcclxuICAgICAgICAgIGljb24sXHJcbiAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgaGVscCxcclxuICAgICAgICAgIHBvbGljeSxcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgc3RhdGU6IGRhdGFcclxuICAgICAgICB9ID0gbjtcclxuICAgICAgICBsZXRcclxuICAgICAgICAgIHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXHJcbiAgICAgICAgICBwYXJhbXM6IFBhcmFtTWFwLFxyXG4gICAgICAgICAgcGFyZW50OiBQYW5lUmVmLFxyXG4gICAgICAgICAgcGF0aDogc3RyaW5nLFxyXG4gICAgICAgICAgcm91dGU6IEV4dGVuZGVkUm91dGU7XHJcblxyXG4gICAgICAgIGlmIChjb21tYW5kcyAmJiBjb21tYW5kcy5sZW5ndGgpIHtcclxuICAgICAgICAgIHBhdGggPSBuLmNvbW1hbmRzLmpvaW4oJy8nKTtcclxuICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoUVVFUllfQ0hBUikgPiAtMSkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWdzID0gcGF0aC5zcGxpdChRVUVSWV9DSEFSKTtcclxuICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBzZWdzWzFdO1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9IHRoaXMuX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmcgfHwgJycpO1xyXG4gICAgICAgICAgICBwYXRoID0gc2Vnc1swXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBxdWVyeVBhcmFtcyA9IG4ucXVlcnlQYXJhbXMgfHwge307XHJcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nID0gdGhpcy5fcXVlcnlTdHJpbmcocXVlcnlQYXJhbXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHBhdGhNb2RlID09PSAncmVsYXRpdmUnIHx8IHBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcclxuICAgICAgICAgICAgcGFyZW50ID0gcmVsYXRpdmVUbyB8fCB0aGlzLnBhbmVzW3RoaXMuc2VsZWN0ZWRJbmRleF07XHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRwYXRoID0gcGFyZW50LnBhdGg7XHJcbiAgICAgICAgICAgIHdoaWxlIChwYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XHJcbiAgICAgICAgICAgICAgcGFyZW50cGF0aCA9IHBhcmVudHBhdGguc3Vic3RyaW5nKDAsIHBhcmVudHBhdGgubGFzdEluZGV4T2YoJy8nKSk7XHJcbiAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhdGggPSBwYXJlbnRwYXRoICsgJy8nICsgcGF0aDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJvdXRlID0gdGhpcy5fbWF0Y2hSb3V0ZShwYXRoKTtcclxuXHJcbiAgICAgICAgICBpZiAoIXJvdXRlKVxyXG4gICAgICAgICAgICB0aHJvdyBgbm8gbWF0Y2ggJHtwYXRofWA7XHJcbiAgICAgICAgICBwYXJhbXMgPSB0aGlzLl9wYXJzZVBhcmFtcyhyb3V0ZSwgcGF0aCk7XHJcbiAgICAgICAgICBpZiAoIXBvbGljeSkgcG9saWN5ID0gcm91dGUucG9saWN5IHx8IERFRkFVTFRfUE9MSUNZO1xyXG4gICAgICAgICAgZWxzZSBpZiAocm91dGUucG9saWN5KSBwb2xpY3kgfD0gcm91dGUucG9saWN5O1xyXG4gICAgICAgICAgaWYgKCFpY29uKSBpY29uID0gcm91dGUuaWNvbjtcclxuICAgICAgICAgIGlmICghaGVscCkgaGVscCA9IHJvdXRlLmhlbHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKCFwb2xpY3kpIHBvbGljeSA9IERFRkFVTFRfUE9MSUNZO1xyXG4gICAgICAgICAgaWYgKCFxdWVyeVBhcmFtcykgcXVlcnlQYXJhbXMgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5DbGVhcikgPT0gT3BlblBvbGljeS5DbGVhcikge1xyXG4gICAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nKCk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLl9jbGVhclRhYnMoKTtcclxuICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpICE9IE9wZW5Qb2xpY3kuVGFiKVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9jbGVhclBhbmVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb21tYW5kcykge1xyXG4gICAgICAgICAgbGV0IGkgPSAwO1xyXG4gICAgICAgICAgaWYgKChwb2xpY3kgJiBPcGVuUG9saWN5LlRhYikgPT0gT3BlblBvbGljeS5UYWIpXHJcbiAgICAgICAgICAgIHdoaWxlIChpIDwgdGhpcy50YWJzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGxldCB0YWIgPSB0aGlzLnRhYnNbaV07XHJcbiAgICAgICAgICAgICAgaWYgKHBhdGggPT09IHRhYi5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgPT09IHRhYi5xdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoKHBvbGljeSAmIE9wZW5Qb2xpY3kuVG9nZ2xlKSA9PSBPcGVuUG9saWN5LlRvZ2dsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFicy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gdGhpcy50YWJzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSAmJiB0YWIuX2RhdGEkLm5leHQoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cCA9IHRhYi5ncm91cDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fbmF2UXVlcnlQYXJhbXModGFiLCBxdWVyeVBhcmFtcywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXAgPSB0YWIuZ3JvdXA7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAodGFiLnJvdXRlID09PSByb3V0ZSkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbmF2UGFyYW1zKHBhdGgsIHRhYiwgcGFyYW1zLCBxdWVyeVBhcmFtcywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3VwID0gdGFiLmdyb3VwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgd2hpbGUgKGkgPCB0aGlzLnBhbmVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgIGxldCBwYW5lID0gdGhpcy5wYW5lc1tpXTtcclxuICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gcGFuZS5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlTdHJpbmcgPT09IHBhbmUucXVlcnlTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgaWYgKChwb2xpY3kgJiBPcGVuUG9saWN5LlRvZ2dsZSkgPT0gT3BlblBvbGljeS5Ub2dnbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZW1vdmVBdChpKTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YSAmJiBwYW5lLl9kYXRhJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKGkpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9uYXZRdWVyeVBhcmFtcyhwYW5lLCBxdWVyeVBhcmFtcywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8oaSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHBhbmUucm91dGUgPT09IHJvdXRlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9uYXZQYXJhbXMocGF0aCwgcGFuZSwgcGFyYW1zLCBxdWVyeVBhcmFtcywgZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY29tbWFuZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICghZGF0YSkgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zdGF0ZShyb3V0ZSwgcGF0aCwgcGFyYW1zLCBkYXRhKTtcclxuICAgICAgICAgICAgaWYgKChwb2xpY3kgJiBPcGVuUG9saWN5LlRhYikgPT0gT3BlblBvbGljeS5UYWIpXHJcbiAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0VGFiKHJvdXRlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgIHJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICBpY29uLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICAgICAgICAgIGhlbHAsXHJcbiAgICAgICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgICAgIHBhcmVudCxcclxuICAgICAgICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgcG9saWN5LFxyXG4gICAgICAgICAgICAgICAgICBpbmplY3RvclxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRQYW5lKHJvdXRlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgcXVlcnlTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgIHJvdXRlLFxyXG4gICAgICAgICAgICAgICAgICBpY29uLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgaGVscCxcclxuICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgcGFyZW50LFxyXG4gICAgICAgICAgICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgICBwb2xpY3ksXHJcbiAgICAgICAgICAgICAgICAgIGluamVjdG9yXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcm91dGUgJiZcclxuICAgICAgICAgICAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYW5lID0gKHBvbGljeSAmIE9wZW5Qb2xpY3kuVGFiKSA9PSBPcGVuUG9saWN5LlRhYiA/XHJcbiAgICAgICAgICAgICAgdGhpcy50YWJzW3RoaXMuc2VsZWN0ZWRUYWJJbmRleF0gOiB0aGlzLnBhbmVzW3RoaXMuc2VsZWN0ZWRJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMuX25hdlF1ZXJ5UGFyYW1zKHBhbmUsIHF1ZXJ5UGFyYW1zLCBkYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpICE9IE9wZW5Qb2xpY3kuVGFiKSB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5UYWIpID09IE9wZW5Qb2xpY3kuVGFiKSB7XHJcbiAgICAgICAgICAgIGlmICgocG9saWN5ICYgT3BlblBvbGljeS5EZWZlcikgPT0gT3BlblBvbGljeS5EZWZlcilcclxuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9jbGVhclRhYnMoKTtcclxuICAgICAgICAgICAgdGhpcy5faW5zZXJ0VGFiKGNvbXBvbmVudCxcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBkYXRhLFxyXG4gICAgICAgICAgICAgICAgaWNvbiwgdGl0bGUsIGhlbHAsXHJcbiAgICAgICAgICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgICAgICAgICBxdWVyeVN0cmluZyxcclxuICAgICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgICByb3V0ZSxcclxuICAgICAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBwb2xpY3ksXHJcbiAgICAgICAgICAgICAgICBpbmplY3RvclxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB0aGlzLl9pbnNlcnRQYW5lKGNvbXBvbmVudCxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGRhdGEsXHJcbiAgICAgICAgICAgICAgaWNvbiwgdGl0bGUsIGhlbHAsXHJcbiAgICAgICAgICAgICAgcGFyZW50LFxyXG4gICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nLFxyXG4gICAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICAgICAgcm91dGUsXHJcbiAgICAgICAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICAgICAgICAgIHBvbGljeSxcclxuICAgICAgICAgICAgICBpbmplY3RvclxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgd2luZG93LnJlbW92ZUFsbExpc3RlbmVycygncG9wc3RhdGUnKTtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGUgPT4ge1xyXG4gICAgICBpZiAodGhpcy5fbmF2aWdhdGlvbkluUHJvY2Vzcykge1xyXG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25JblByb2Nlc3MgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGUuc3RhdGUgJiYgZS5zdGF0ZS5iaXpkb2MpIHtcclxuICAgICAgICBjb25zdCBldnQgPSBuZXcgQmFja05hdmlnYXRpb24oKTtcclxuICAgICAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBlLnN0YXRlIGFzIEhpc3RvcnlTdGF0ZTtcclxuICAgICAgICB0aGlzLl9kZXNlcmlhbGl6ZShsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMSksIHN0YXRlKTtcclxuICAgICAgICB0aGlzLnN3YXAgPSBzdGF0ZS5zd2FwO1xyXG4gICAgICAgIHRoaXMuc3dhcFRhYiA9IHN0YXRlLnN3YXBUYWI7XHJcbiAgICAgICAgdGhpcy5wcmV2R3JvdXAgPSBzdGF0ZS5wcmV2R3JvdXA7XHJcbiAgICAgICAgdGhpcy5ncm91cCA9IHN0YXRlLmdyb3VwO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHN0YXRlLnNlbGVjdGVkVGFiSW5kZXg7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHRoaXMuX2Rlc2VyaWFsaXplKGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cmluZygxKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3JvdXRlci5fY29tbSQuXHJcbiAgICAgIHN1YnNjcmliZShlID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2NvbGxhcHNlJzpcclxuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIGlmIChsb2NhdGlvbi5wYXRobmFtZS5sZW5ndGggPiAxKVxyXG4gICAgICB0aGlzLl9kZXNlcmlhbGl6ZShsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMSksXHJcbiAgICAgICAgaGlzdG9yeS5zdGF0ZSAmJiBoaXN0b3J5LnN0YXRlLmJpemRvYyA/IGhpc3Rvcnkuc3RhdGUgOiB1bmRlZmluZWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl9yb3V0ZXIuX25hdmlnYXRlJC5uZXh0KHtcclxuICAgICAgICBjb21tYW5kczogREVGQVVMVF9ST1VURSxcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLl9yZXNpemluZy5waXBlKGRlYm91bmNlVGltZSgxNTApLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSh0aGlzLl9yZXNpemUuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB1cmxcclxuICAgKiBAcGFyYW0gc3RhdGVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9kZXNlcmlhbGl6ZSh1cmw6IHN0cmluZywgc3RhdGU/OiBIaXN0b3J5U3RhdGUpIHtcclxuXHJcbiAgICBjb25zdCBzZWN0aW9ucyA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwpLnNwbGl0KFBBTkVfQ0hBUiksXHJcbiAgICAgIHBhbmVzID0gZGVzZXJpYWxpemUoc2VjdGlvbnNbMF0pLFxyXG4gICAgICB0YWJzID0gc2VjdGlvbnMubGVuZ3RoID4gMSA/IGRlc2VyaWFsaXplKHNlY3Rpb25zWzFdKSA6IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGRlc2VyaWFsaXplKHBhdGg6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gcGF0aC5cclxuICAgICAgICBzcGxpdChQQVRIX0NIQVIpLm1hcChzID0+IHtcclxuICAgICAgICAgIGNvbnN0IFtwYXRoLCBxdWVyeVN0cmluZ10gPSBzLnNwbGl0KFFVRVJZX0NIQVIpO1xyXG4gICAgICAgICAgcmV0dXJuIHsgcGF0aCwgcXVlcnlTdHJpbmcgfTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBwYW5lID0gcGFuZXNbaV07XHJcbiAgICAgIGF3YWl0IHRoaXMuX25hdmlnYXRlUGFuZShpLCBwYW5lLnBhdGgsIHBhbmUucXVlcnlTdHJpbmcsIHN0YXRlID8gc3RhdGUucGFuZXNbaV0gOiBudWxsKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBhbmVzLmxlbmd0aCA+IHBhbmVzLmxlbmd0aCkge1xyXG4gICAgICBsZXQgaSA9IDA7XHJcbiAgICAgIHdoaWxlIChpIDwgdGhpcy5wYW5lcy5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgcGFuZSA9IHRoaXMucGFuZXNbaV07XHJcbiAgICAgICAgaWYgKHBhbmVzLmxlbmd0aCAtIDEgPCBpIHx8IHBhbmUucGF0aCAhPT0gcGFuZXNbaV0ucGF0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gaSlcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaSAtIDE7XHJcbiAgICAgICAgICB0aGlzLnBhbmVzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lQYW5lKHBhbmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPCAwKVxyXG4gICAgICB0aGlzLnNlbGVjdCgwKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdGFiID0gdGFic1tpXTtcclxuICAgICAgYXdhaXQgdGhpcy5fbmF2aWdhdGVUYWIoaSwgdGFiLnBhdGgsIHRhYi5xdWVyeVN0cmluZywgc3RhdGUgPyBzdGF0ZS50YWJzW2ldIDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50YWJzLmxlbmd0aCA+IHRhYnMubGVuZ3RoKSB7XHJcbiAgICAgIGxldCBpID0gMDtcclxuICAgICAgd2hpbGUgKGkgPCB0aGlzLnRhYnMubGVuZ3RoKSB7XHJcbiAgICAgICAgbGV0IHRhYiA9IHRoaXMudGFic1tpXTtcclxuICAgICAgICBpZiAodGFicy5sZW5ndGggLSAxIDwgaSB8fCB0YWIucGF0aCAhPT0gdGFic1tpXS5wYXRoKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRhYkluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IGkgLSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy50YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lQYW5lKHRhYik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudGFicy5sZW5ndGggJiYgdGhpcy5zZWxlY3RlZFRhYkluZGV4IDwgMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSAwO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbiA9IHRoaXMucGFuZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcclxuICAgICAgbGV0IHBhbmUgPSB0aGlzLnBhbmVzW2ldO1xyXG4gICAgICBpZiAocGFuZS5leHBhbmRlZCAhPT0gKG4gPT09IDEpKSB7XHJcbiAgICAgICAgY29uc3QgZXZ0ID0gbmV3IE5hdmlnYXRpb25FeHBhbmQocGFuZS5fZXhwYW5kZWQgPSBuID09PSAxLCBwYW5lKTtcclxuICAgICAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqIEBwYXJhbSBxdWVyeVN0cmluZ1xyXG4gICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX25hdmlnYXRlUGFuZShpbmRleDogbnVtYmVyLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5U3RyaW5nOiBzdHJpbmcsIHN0YXRlPzogYW55KSB7XHJcbiAgICBjb25zdCByb3V0ZSA9IHRoaXMuX21hdGNoUm91dGUocGF0aCk7XHJcblxyXG4gICAgaWYgKCFyb3V0ZSkgdGhyb3cgYG5vIG1hdGNoICR7cGF0aH1gO1xyXG5cclxuICAgIGlmICghc3RhdGUpIHN0YXRlID0ge307XHJcblxyXG4gICAgd2hpbGUgKGluZGV4IDwgdGhpcy5wYW5lcy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHBhbmUgPSB0aGlzLnBhbmVzW2luZGV4XTtcclxuICAgICAgaWYgKHBhdGggPT09IHBhbmUucGF0aCkge1xyXG4gICAgICAgIGlmIChxdWVyeVN0cmluZyA9PT0gcGFuZS5xdWVyeVN0cmluZykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgICB0aGlzLl9uYXZRdWVyeVBhcmFtcyhwYW5lLCBxdWVyeVBhcmFtcywgc3RhdGUpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChwYW5lLnJvdXRlID09PSByb3V0ZSkge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbXMocGFuZS5yb3V0ZSBhcyBFeHRlbmRlZFJvdXRlLCBwYXRoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9uYXZQYXJhbXMocGF0aCwgcGFuZSwgcGFyYW1zLCBxdWVyeVBhcmFtcywgc3RhdGUpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpbmRleCsrO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuX3BhcnNlUGFyYW1zKHJvdXRlLCBwYXRoKTtcclxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7XHJcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9maW5kQW5jZXN0b3Iocm91dGUsIHBhdGgpO1xyXG4gICAgYXdhaXQgdGhpcy5fc3RhdGUocm91dGUsIHBhdGgsIHBhcmFtcywgc3RhdGUpO1xyXG4gICAgdGhpcy5faW5zZXJ0UGFuZShyb3V0ZS5jb21wb25lbnQsIHtcclxuICAgICAgcGF0aCwgcGFyZW50LCByb3V0ZSwgZGF0YTogc3RhdGUsIHBhcmFtcywgcXVlcnlQYXJhbXMsXHJcbiAgICAgIGljb246IHJvdXRlLmljb24sXHJcbiAgICAgIGhlbHA6IHJvdXRlLmhlbHAsXHJcbiAgICAgIHBvbGljeTogcm91dGUucG9saWN5LFxyXG4gICAgICBmb2N1czogZmFsc2VcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gaW5kZXhcclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqIEBwYXJhbSBxdWVyeVN0cmluZ1xyXG4gICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBfbmF2aWdhdGVUYWIoaW5kZXg6IG51bWJlciwgcGF0aDogc3RyaW5nLCBxdWVyeVN0cmluZzogc3RyaW5nLCBzdGF0ZT86IGFueSkge1xyXG4gICAgY29uc3Qgcm91dGUgPSB0aGlzLl9tYXRjaFJvdXRlKHBhdGgpO1xyXG5cclxuICAgIGlmICghcm91dGUpIHRocm93IGBubyBtYXRjaCAke3BhdGh9YDtcclxuXHJcbiAgICBpZiAoIXN0YXRlKSBzdGF0ZSA9IHt9O1xyXG5cclxuICAgIHdoaWxlIChpbmRleCA8IHRoaXMudGFicy5sZW5ndGgpIHtcclxuICAgICAgbGV0IHRhYiA9IHRoaXMudGFic1tpbmRleF07XHJcbiAgICAgIGlmIChwYXRoID09PSB0YWIucGF0aCkge1xyXG4gICAgICAgIGlmIChxdWVyeVN0cmluZyA9PT0gdGFiLnF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLl9wYXJzZVF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nKTtcclxuICAgICAgICAgIHRoaXMuX25hdlF1ZXJ5UGFyYW1zKHRhYiwgcXVlcnlQYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGFiLnJvdXRlID09PSByb3V0ZSkge1xyXG4gICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gdGhpcy5fcGFyc2VRdWVyeVBhcmFtcyhxdWVyeVN0cmluZyk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5fcGFyc2VQYXJhbXModGFiLnJvdXRlIGFzIEV4dGVuZGVkUm91dGUsIHBhdGgpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX25hdlBhcmFtcyhwYXRoLCB0YWIsIHBhcmFtcywgcXVlcnlQYXJhbXMsIHN0YXRlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLl9wYXJzZVBhcmFtcyhyb3V0ZSwgcGF0aCk7XHJcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmcpO1xyXG5cclxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX2ZpbmRBbmNlc3Rvcihyb3V0ZSwgcGF0aCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5fc3RhdGUocm91dGUsIHBhdGgsIHBhcmFtcywgc3RhdGUpO1xyXG4gICAgdGhpcy5faW5zZXJ0VGFiKHJvdXRlLmNvbXBvbmVudCwge1xyXG4gICAgICBpY29uOiByb3V0ZS5pY29uLFxyXG4gICAgICBoZWxwOiByb3V0ZS5oZWxwLFxyXG4gICAgICBwb2xpY3k6IHJvdXRlLnBvbGljeSB8IE9wZW5Qb2xpY3kuVGFiLFxyXG4gICAgICBwYXRoLCBwYXJlbnQsIHJvdXRlLFxyXG4gICAgICBkYXRhOiBzdGF0ZSxcclxuICAgICAgcGFyYW1zLCBxdWVyeVBhcmFtcyxcclxuICAgICAgZm9jdXM6IGZhbHNlLFxyXG4gICAgICBzd2FwOiBmYWxzZVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSByb3V0ZVxyXG4gICAqIEBwYXJhbSBwYXRoXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIF9maW5kQW5jZXN0b3Iocm91dGU6IEV4dGVuZGVkUm91dGUsIHBhdGg6IHN0cmluZykge1xyXG4gICAgaWYgKChyb3V0ZSBhcyBFeHRlbmRlZFJvdXRlKS5wYXJlbnQpXHJcbiAgICAgIHJldHVybiB0aGlzLnBhbmVzLmZpbmQocCA9PiAocC5yb3V0ZSBhcyBFeHRlbmRlZFJvdXRlKSA9PT1cclxuICAgICAgICAocm91dGUgYXMgRXh0ZW5kZWRSb3V0ZSkucGFyZW50ICYmXHJcbiAgICAgICAgcGF0aC5zdGFydHNXaXRoKHAucGF0aCkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFuZVxyXG4gICAqIEBwYXJhbSBxdWVyeVBhcmFtc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgX25hdlF1ZXJ5UGFyYW1zKHBhbmU6IFBhbmVSZWY8YW55PiwgcXVlcnlQYXJhbXM6IFBhcmFtTWFwLCBzdGF0ZTogUGFyYW1NYXApIHtcclxuICAgIHBhbmUuX3F1ZXJ5U3RyaW5nID0gdGhpcy5fcXVlcnlTdHJpbmcocXVlcnlQYXJhbXMpO1xyXG4gICAgc3RhdGUgJiYgcGFuZS5fZGF0YSQubmV4dChzdGF0ZSk7XHJcbiAgICBwYW5lLl9xdWVyeVBhcmFtcyQubmV4dChxdWVyeVBhcmFtcyk7XHJcbiAgICBjb25zdCBldnQgPSBuZXcgUXVlcnlQYXJhbU5hdmlnYXRpb24ocXVlcnlQYXJhbXMsIHBhbmUpO1xyXG4gICAgcGFuZS5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqIEBwYXJhbSBwYW5lXHJcbiAgICogQHBhcmFtIHBhcmFtc1xyXG4gICAqIEBwYXJhbSBxdWVyeVBhcmFtc1xyXG4gICAqIEBwYXJhbSBzdGF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX25hdlBhcmFtcyhwYXRoOiBzdHJpbmcsIHBhbmU6IFBhbmVSZWY8YW55PiwgcGFyYW1zOiBQYXJhbU1hcCwgcXVlcnlQYXJhbXM6IFBhcmFtTWFwLCBzdGF0ZTogUGFyYW1NYXApIHtcclxuICAgIGlmIChwYW5lLnJvdXRlLmNhbkRpc21pc3MpXHJcbiAgICAgIGF3YWl0IHRoaXMuX2Rpc21pc3MocGFuZSk7XHJcblxyXG4gICAgaWYgKCFzdGF0ZSkgc3RhdGUgPSB7fTtcclxuICAgIGF3YWl0IHRoaXMuX3N0YXRlKHBhbmUucm91dGUgYXMgRXh0ZW5kZWRSb3V0ZSwgcGF0aCwgcGFyYW1zLCBzdGF0ZSk7XHJcbiAgICBwYW5lLl9kYXRhJC5uZXh0KHN0YXRlKTtcclxuICAgIHBhbmUuX3BhdGggPSBwYXRoO1xyXG4gICAgcGFuZS5fcGFyYW1zJC5uZXh0KHBhcmFtcyk7XHJcbiAgICBpZiAocXVlcnlQYXJhbXMpIHtcclxuICAgICAgcGFuZS5fcXVlcnlTdHJpbmcgPSB0aGlzLl9xdWVyeVN0cmluZyhxdWVyeVBhcmFtcyk7XHJcbiAgICAgIHBhbmUuX3F1ZXJ5UGFyYW1zJC5uZXh0KHF1ZXJ5UGFyYW1zKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBwYW5lLl9xdWVyeVN0cmluZyA9ICcnO1xyXG4gICAgICBwYW5lLl9xdWVyeVBhcmFtcyQubmV4dCh7fSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBldnQgPSBuZXcgUGFyYW1OYXZpZ2F0aW9uKHBhcmFtcywgcGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcblxyXG4gICAgdGhpcy5wYW5lcy5jb25jYXQodGhpcy50YWJzKS5mb3JFYWNoKGNoaWxkID0+IHtcclxuICAgICAgaWYgKGNoaWxkLnJvdXRlICYmIChjaGlsZC5yb3V0ZSBhcyBFeHRlbmRlZFJvdXRlKS5wYXJlbnQgPT09IHBhbmUucm91dGUpIHtcclxuICAgICAgICBjaGlsZC5fZGF0YSQubmV4dChPYmplY3QuYXNzaWduKGNoaWxkLmRhdGEsIHN0YXRlKSk7XHJcbiAgICAgICAgY2hpbGQuX3BhcmFtcyQubmV4dChwYXJhbXMpO1xyXG4gICAgICAgIGNoaWxkLl9wYXRoID0gcGFuZS5wYXRoICsgJy8nICsgY2hpbGQucm91dGUucGF0aDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFRhYkluZGV4ID4gLTEgJiYgY2hpbGQgPT09IHRoaXMudGFic1t0aGlzLnNlbGVjdGVkVGFiSW5kZXhdKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0aGlzLnNlbGVjdGVkVGFiSW5kZXg7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwID0gY2hpbGQuZ3JvdXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChwYW5lLm1vZGUgPT09ICdwYW5lJykgdGhpcy50aXRsZVZhcmlhbnQrKztcclxuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgLyoqICovXHJcbiAgcHJpdmF0ZSBfc3luY0Jyb3dzZXJIaXN0b3J5KCkge1xyXG4gICAgbGV0IHBhdGggPSB0aGlzLnBhbmVzLmZpbHRlcihwID0+IHAucm91dGUpLm1hcChwID0+IHAuZnVsbFBhdGgpLmpvaW4oUEFUSF9DSEFSKTtcclxuICAgIGlmICh0aGlzLnRhYnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLnRhYnMuZmlsdGVyKHAgPT4gcC5yb3V0ZSk7XHJcbiAgICAgIGlmICh0YWJzLmxlbmd0aClcclxuICAgICAgICBwYXRoICs9IFBBTkVfQ0hBUiArIHRhYnMubWFwKHMgPT4gcy5mdWxsUGF0aCkuam9pbihQQVRIX0NIQVIpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9jcmVhdGVIaXN0b3J5U3RhdGUoKTtcclxuICAgIHRoaXMuX25hdmlnYXRpb25JblByb2Nlc3MgPSB0cnVlO1xyXG4gICAgaGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsICcnLCAnLycgKyBwYXRoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fbmF2aWdhdGlvbkluUHJvY2VzcyA9IGZhbHNlLCAyMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlSGlzdG9yeVN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgYml6ZG9jOiB0cnVlLFxyXG4gICAgICBzdGVwOiBoaXN0b3J5LnN0YXRlICYmIGhpc3Rvcnkuc3RhdGUuYml6ZG9jID8gKGhpc3Rvcnkuc3RhdGUgYXMgSGlzdG9yeVN0YXRlKS5zdGVwICsgMSA6IDEsXHJcbiAgICAgIHNlbGVjdGVkVGFiSW5kZXg6IHRoaXMuc2VsZWN0ZWRUYWJJbmRleCxcclxuICAgICAgcGFuZXM6IHRoaXMucGFuZXMubWFwKHAgPT4gcC5kYXRhKSxcclxuICAgICAgdGFiczogdGhpcy50YWJzLm1hcCh0ID0+IHQuZGF0YSksXHJcbiAgICAgIHN3YXA6IHRoaXMuc3dhcCxcclxuICAgICAgZ3JvdXA6IHRoaXMuZ3JvdXAsXHJcbiAgICAgIHN3YXBUYWI6IHRoaXMuc3dhcFRhYixcclxuICAgICAgcHJldkdyb3VwOiB0aGlzLnByZXZHcm91cFxyXG4gICAgfSBhcyBIaXN0b3J5U3RhdGU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3NldFRhYkFuaW1hdGlvbigpIHtcclxuICAgIHRoaXMudGFic0FuaW1hdGlvbiA9IHtcclxuICAgICAgdmFsdWU6IHRoaXMuc2VsZWN0ZWRUYWJJbmRleCxcclxuICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgc3RhcnRXaWR0aDogdGhpcy5fdGFic0VsZW1lbnQgPyB0aGlzLl90YWJzRWxlbWVudC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDogMFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZHJvcChldnQ6IENka0RyYWdEcm9wPHN0cmluZywgc3RyaW5nPikge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZXNbZXZ0LnByZXZpb3VzSW5kZXhdO1xyXG4gICAgdGhpcy5wYW5lcy5zcGxpY2UoZXZ0LnByZXZpb3VzSW5kZXgsIDEpO1xyXG4gICAgdGhpcy5wYW5lcy5zcGxpY2UoZXZ0LmN1cnJlbnRJbmRleCwgMCwgcGFuZSk7XHJcbiAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVBpbm5lZChwYW5lOiBQYW5lUmVmPGFueT4pIHtcclxuICAgIHBhbmUucGlubmVkID0gIXBhbmUucGlubmVkO1xyXG4gICAgdGhpcy5wYW5lcy5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICBpZiAocy5kZWNlbmRlbnRPZihwYW5lKSkgcy5waW5uZWQgPSBwYW5lLnBpbm5lZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcXVlcnlTdHJpbmcocXVlcnlQYXJhbXM6IFBhcmFtTWFwKSB7XHJcbiAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKTtcclxuICAgIGxldCBxdWVyeVN0cmluZzogc3RyaW5nO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdmFsID0gcXVlcnlQYXJhbXNbbmFtZXNbaV1dO1xyXG5cclxuICAgICAgaWYgKHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHF1ZXJ5U3RyaW5nID0gJyc7XHJcbiAgICAgICAgZWxzZSBxdWVyeVN0cmluZyA9IHF1ZXJ5U3RyaW5nICsgQVJHX0NIQVI7XHJcblxyXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpKVxyXG4gICAgICAgICAgcXVlcnlTdHJpbmcgKz0gYCR7bmFtZXNbaV19PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbCl9YDtcclxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KHZhbCkpXHJcbiAgICAgICAgICBxdWVyeVN0cmluZyArPSB2YWwubWFwKHYgPT4gYCR7bmFtZXNbaV19PSR7dn1gKS5qb2luKEFSR19DSEFSKTtcclxuICAgICAgICBlbHNlIGlmIChpc0RhdGUodmFsKSlcclxuICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAke25hbWVzW2ldfT0ke3ZhbC50b0pTT04oKX1gO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAke25hbWVzW2ldfT0ke3ZhbH1gO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcXVlcnlTdHJpbmc7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3BhcnNlUXVlcnlQYXJhbXMocXVlcnlTdHJpbmc6IHN0cmluZyk6IFBhcmFtTWFwIHtcclxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge307XHJcbiAgICBxdWVyeVN0cmluZyAmJiBxdWVyeVN0cmluZy5cclxuICAgICAgc3BsaXQoQVJHX0NIQVIpLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IHAuc3BsaXQoJz0nKTtcclxuICAgICAgICBpZiAoIXF1ZXJ5UGFyYW1zW25hbWVdKVxyXG4gICAgICAgICAgcXVlcnlQYXJhbXNbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHZhbHMgPSBxdWVyeVBhcmFtc1tuYW1lXTtcclxuICAgICAgICAgIHF1ZXJ5UGFyYW1zW25hbWVdID0gaXNBcnJheSh2YWxzKSA/IFsuLi52YWxzLCB2YWx1ZV0gOiBbdmFscywgdmFsdWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gcXVlcnlQYXJhbXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSByb3V0ZVxyXG4gICAqIEBwYXJhbSBwYXRoXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfcGFyc2VQYXJhbXMocm91dGU6IEV4dGVuZGVkUm91dGUsIHBhdGg6IHN0cmluZykge1xyXG4gICAgY29uc3QgZXggPSByb3V0ZS5yZWdFeC5leGVjKHBhdGgpLFxyXG4gICAgICBwYXJhbXMgPSBleC5ncm91cHM7XHJcblxyXG4gICAgcmV0dXJuIHBhcmFtcyB8fCB7fTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHVybFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX21hdGNoUm91dGUodXJsOiBzdHJpbmcpIHtcclxuICAgIGxldCByb3V0ZSA9IHRoaXMuX3JvdXRlcy5maW5kKHIgPT4gci5yZWdFeC50ZXN0KHVybCkpO1xyXG4gICAgaWYgKHJvdXRlKVxyXG4gICAgICB3aGlsZSAocm91dGUuY2hpbGRyZW4pIHtcclxuICAgICAgICBsZXQgY2hpbGQgPSByb3V0ZS5jaGlsZHJlbi5maW5kKHIgPT4gci5yZWdFeC50ZXN0KHVybCkpO1xyXG4gICAgICAgIGlmIChjaGlsZClcclxuICAgICAgICAgIHJvdXRlID0gY2hpbGQ7XHJcbiAgICAgICAgZWxzZSBicmVhaztcclxuICAgICAgfVxyXG4gICAgcmV0dXJuIHJvdXRlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcm91dGVcclxuICAgKiBAcGFyYW0gcGF0aFxyXG4gICAqIEBwYXJhbSBwYXJhbXNcclxuICAgKiBAcGFyYW0gZGF0YVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX3N0YXRlKHJvdXRlOiBFeHRlbmRlZFJvdXRlLCBwYXRoOiBzdHJpbmcsIHBhcmFtczogUGFyYW1NYXAsIGRhdGE6IFBhcmFtTWFwKSB7XHJcbiAgICBpZiAodGhpcy5fcGVuZGluZy5pbmRleE9mKHBhdGgpID4gLTEpIHtcclxuICAgICAgLy90aGlzLl9wcy50b2FzdCgnV29ya2luZycpO1xyXG4gICAgICB0aHJvdyAnYWxyZWFkeSBwcm9jZXNzaW5nJztcclxuICAgIH1cclxuICAgIHRoaXMuX3BlbmRpbmcucHVzaChwYXRoKTtcclxuXHJcbiAgICBjb25zdCB7IHBhcmVudCwgcmVzb2x2ZSB9ID0gcm91dGU7XHJcbiAgICBpZiAocGFyZW50KVxyXG4gICAgICBhd2FpdCB0aGlzLl9wYXJlbnRTdGF0ZShwYXJlbnQsIHBhdGgsIHBhcmFtcywgZGF0YSk7XHJcbiAgICBpZiAocmVzb2x2ZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9yZXNvbHZlKHJlc29sdmUsIHBhcmFtcywgZGF0YSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wZW5kaW5nLnJlbW92ZShwYXRoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHJvdXRlXHJcbiAgICogQHBhcmFtIHBhdGhcclxuICAgKiBAcGFyYW0gcGFyYW1zXHJcbiAgICogQHBhcmFtIGRhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9wYXJlbnRTdGF0ZShyb3V0ZTogRXh0ZW5kZWRSb3V0ZSwgcGF0aDogc3RyaW5nLCBwYXJhbXM6IFBhcmFtTWFwLCBkYXRhOiBQYXJhbU1hcCkge1xyXG4gICAgY29uc3QgeyBwYXJlbnQsIHJlc29sdmUgfSA9IHJvdXRlO1xyXG5cclxuICAgIGlmIChwYXJlbnQpXHJcbiAgICAgIGF3YWl0IHRoaXMuX3BhcmVudFN0YXRlKHBhcmVudCwgcGF0aCwgcGFyYW1zLCBkYXRhKTtcclxuXHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5wYW5lcy5maW5kKHMgPT4gcy5yb3V0ZSAmJiBzLnJvdXRlID09PSByb3V0ZVxyXG4gICAgICAmJiBwYXRoLnN0YXJ0c1dpdGgocy5wYXRoKSk7XHJcblxyXG4gICAgcGFuZSAmJiBPYmplY3QuYXNzaWduKGRhdGEsIHBhbmUuZGF0YSk7XHJcblxyXG4gICAgaWYgKHJlc29sdmUpXHJcbiAgICAgIGF3YWl0IHRoaXMuX3Jlc29sdmUocmVzb2x2ZSwgcGFyYW1zLCBkYXRhKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX3Jlc29sdmUocmVzb2x2ZTogeyBba2V5OiBzdHJpbmddOiBDb21wb25lbnRUeXBlPFBhbmVSZXNvbHZlPGFueT4+IH0sIHBhcmFtczogUGFyYW1NYXAsIGRhdGE6IFBhcmFtTWFwKSB7XHJcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocmVzb2x2ZSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGtleSA9IGtleXNbaV07XHJcbiAgICAgIGlmICghZGF0YVtrZXldKSB7XHJcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQocmVzb2x2ZVtrZXldKSBhcyBQYW5lUmVzb2x2ZTxhbnk+O1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gaW5zdGFuY2Uub25SZXNvbHZlKHBhcmFtcyk7XHJcbiAgICAgICAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpXHJcbiAgICAgICAgICBhd2FpdCB2YWx1ZS50aGVuKHIgPT4gZGF0YVtrZXldID0gcik7XHJcbiAgICAgICAgZWxzZSBpZiAoaXNPYnNlcnZhYmxlKHZhbHVlKSlcclxuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHZhbHVlLnBpcGUodGFwKHIgPT4gZGF0YVtrZXldID0gcikpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkPFQ+KGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUPiwgb3B0aW9ucz86IFBhbmVPcHRpb25zKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQodGhpcy5wYW5lcy5sZW5ndGgsIGNvbXBvbmVudCwgb3B0aW9ucyk7XHJcbiAgfVxyXG4gIGluc2VydDxUPihwb3NpdGlvbjogbnVtYmVyLCBjb21wb25lbnQ6IENvbXBvbmVudFR5cGU8VD4sIG9wdGlvbnM/OiBQYW5lT3B0aW9ucykge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuX2luc2VydFBhbmU8VD4oY29tcG9uZW50LCBvcHRpb25zIHx8IHt9LCBwb3NpdGlvbik7XHJcbiAgICByZXR1cm4gcGFuZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICogQHBhcmFtIHBvc2l0aW9uXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcml2YXRlIF9pbnNlcnRQYW5lPFQgPSBhbnk+KGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUPiwgb3B0aW9uczoge1xyXG4gICAgcGF0aD86IHN0cmluZztcclxuICAgIHJvdXRlPzogUGFuZVJvdXRlO1xyXG4gICAgaWNvbj86IHN0cmluZztcclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG4gICAgaW5wdXRzPzogeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXHJcbiAgICBkYXRhPzogUGFyYW1NYXA7XHJcbiAgICBwYXJhbXM/OiBQYXJhbU1hcDtcclxuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1NYXA7XHJcbiAgICBoZWxwPzogc3RyaW5nO1xyXG4gICAgcGFyZW50PzogUGFuZVJlZjxhbnk+O1xyXG4gICAgcXVlcnlTdHJpbmc/OiBzdHJpbmc7XHJcbiAgICBwb2xpY3k/OiBPcGVuUG9saWN5O1xyXG4gICAgaW5qZWN0b3I/OiBJbmplY3RvcjtcclxuICAgIGZvY3VzPzogYm9vbGVhblxyXG4gIH0sIHBvc2l0aW9uPzogbnVtYmVyKSB7XHJcblxyXG4gICAgY29uc3Qgc3RyZXRjaGFibGUgPSAob3B0aW9ucy5wb2xpY3kgJiBPcGVuUG9saWN5LlN0cmV0Y2gpID09IE9wZW5Qb2xpY3kuU3RyZXRjaDtcclxuXHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5fY29uc3RyYWN0PFQ+KGNvbXBvbmVudCwge1xyXG4gICAgICBtb2RlOiAncGFuZScsXHJcbiAgICAgIGV4cGFuZGVkOiAhdGhpcy5wYW5lcy5sZW5ndGgsXHJcbiAgICAgIHN0cmV0Y2hhYmxlLFxyXG4gICAgICAuLi5vcHRpb25zXHJcbiAgICB9KTtcclxuICAgIGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICBwb3NpdGlvbiA9IHRoaXMucGFuZXMubGVuZ3RoO1xyXG4gICAgdGhpcy5wYW5lcy5wdXNoKHBhbmUpO1xyXG4gICAgdGhpcy50aXRsZVZhcmlhbnQrKztcclxuICAgIHRoaXMuX2NkLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uU3RhcnQocGFuZSk7XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgaWYgKG9wdGlvbnMuZm9jdXMgIT09IGZhbHNlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHBvc2l0aW9uO1xyXG4gICAgICB0aGlzLl90aXRsZS5zZXQocGFuZS50aXRsZSk7XHJcbiAgICAgIGlmICh0aGlzLnBhbmVzLmxlbmd0aCA+IDEpIHRoaXMuc2Nyb2xsVG8ocG9zaXRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5lbmFibGVOYXZpZ2F0aW9uQXJyb3dzKCk7XHJcbiAgICByZXR1cm4gcGFuZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSBvcHRpb25zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY29uc3RyYWN0PFQgPSBhbnk+KGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUPixcclxuICAgIG9wdGlvbnM6IHtcclxuICAgICAgbW9kZTogUGFuZU1vZGUsXHJcbiAgICAgIGV4cGFuZGVkPzogYm9vbGVhbjtcclxuICAgICAgZGlhbG9nPzogYm9vbGVhbjtcclxuICAgICAgc3RyZXRjaGFibGU/OiBib29sZWFuO1xyXG4gICAgICBwYXRoPzogc3RyaW5nO1xyXG4gICAgICByb3V0ZT86IFBhbmVSb3V0ZTtcclxuICAgICAgaWNvbj86IHN0cmluZztcclxuICAgICAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgICAgIGdyb3VwPzogc3RyaW5nO1xyXG4gICAgICBkYXRhPzogUGFyYW1NYXA7XHJcbiAgICAgIHBhcmFtcz86IFBhcmFtTWFwO1xyXG4gICAgICBxdWVyeVBhcmFtcz86IFBhcmFtTWFwO1xyXG4gICAgICBoZWxwPzogc3RyaW5nO1xyXG4gICAgICBwYXJlbnQ/OiBQYW5lUmVmPGFueT47XHJcbiAgICAgIGluamVjdG9yPzogSW5qZWN0b3I7XHJcbiAgICAgIHF1ZXJ5U3RyaW5nPzogc3RyaW5nO1xyXG4gICAgICBkaXNtaXNzYWJsZT86IGJvb2xlYW47XHJcbiAgICAgIGV4cGFuZGFibGU/OiBib29sZWFuXHJcbiAgICB9KSB7XHJcbiAgICBjb25zdCBwYW5lID0gbmV3IFBhbmVSZWY8VD4oY29tcG9uZW50LCBvcHRpb25zLmluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLCBvcHRpb25zKTtcclxuICAgIHBhbmUuX2NvbW1hbmQkLnN1YnNjcmliZShlID0+IHRoaXMuX3BhbmVDb21tYW5kPFQ+KGUsIHBhbmUpKTtcclxuICAgIHJldHVybiBwYW5lO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29tcG9uZW50XHJcbiAgICogQHBhcmFtIG9wdGlvbnNcclxuICAgKi9cclxuICBwcml2YXRlIF9pbnNlcnRUYWI8VCA9IGFueT4oY29tcG9uZW50OiBDb21wb25lbnRUeXBlPFQ+LCBvcHRpb25zOiB7XHJcbiAgICBpY29uPzogc3RyaW5nO1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgICBncm91cD86IHN0cmluZztcclxuICAgIGhlbHA/OiBzdHJpbmc7XHJcbiAgICBwYXRoPzogc3RyaW5nO1xyXG4gICAgcXVlcnlTdHJpbmc/OiBzdHJpbmc7XHJcbiAgICByb3V0ZT86IFBhbmVSb3V0ZTtcclxuICAgIGRhdGE/OiBQYXJhbU1hcDtcclxuICAgIHBhcmFtcz86IFBhcmFtTWFwO1xyXG4gICAgcXVlcnlQYXJhbXM/OiBQYXJhbU1hcDtcclxuICAgIHBhcmVudD86IFBhbmVSZWY8YW55PjtcclxuICAgIHBvbGljeT86IE9wZW5Qb2xpY3k7XHJcbiAgICBpbmplY3Rvcj86IEluamVjdG9yO1xyXG4gICAgc3dhcD86IGJvb2xlYW47XHJcbiAgICBmb2N1cz86IGJvb2xlYW47XHJcbiAgfSkge1xyXG4gICAgY29uc3QgeyBwb2xpY3kgfSA9IG9wdGlvbnMsXHJcbiAgICAgIGRpYWxvZyA9IChwb2xpY3kgJiBPcGVuUG9saWN5LkRpYWxvZykgPT0gT3BlblBvbGljeS5EaWFsb2csXHJcbiAgICAgIGV4cGFuZGFibGUgPSAocG9saWN5ICYgT3BlblBvbGljeS5FeHBhbmRhYmxlKSA9PSBPcGVuUG9saWN5LkV4cGFuZGFibGUsXHJcbiAgICAgIGRpc21pc3NhYmxlID0gKHBvbGljeSAmIE9wZW5Qb2xpY3kuRGlzbWlzc2FibGUpID09IE9wZW5Qb2xpY3kuRGlzbWlzc2FibGU7XHJcblxyXG4gICAgY29uc3QgdGFiID0gdGhpcy5fY29uc3RyYWN0PFQ+KGNvbXBvbmVudCxcclxuICAgICAge1xyXG4gICAgICAgIG1vZGU6ICd0YWInLFxyXG4gICAgICAgIGV4cGFuZGVkOiBmYWxzZSxcclxuICAgICAgICAuLi5vcHRpb25zLFxyXG4gICAgICAgIGRpYWxvZyxcclxuICAgICAgICBkaXNtaXNzYWJsZSxcclxuICAgICAgICBleHBhbmRhYmxlXHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy50YWJzLnB1c2godGFiKTtcclxuICAgIGRpYWxvZyAmJiB0aGlzLmRpYWxvZ0NoYW5nZS5lbWl0KHRoaXMuZGlhbG9nID0gdHJ1ZSk7XHJcbiAgICB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChuZXcgTmF2aWdhdGlvblN0YXJ0KHRhYikpO1xyXG4gICAgaWYgKHRhYi5ncm91cCAmJiB0aGlzLmdyb3VwICE9PSB0YWIuZ3JvdXAgJiYgb3B0aW9ucy5zd2FwICE9PSBmYWxzZSkge1xyXG4gICAgICBsZXQgaSA9IDAsIHN3YXAgPSBmYWxzZTtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIGlmICh0aGlzLnRhYnNbaV0uZ3JvdXAgIT09IHRhYi5ncm91cCkge1xyXG4gICAgICAgICAgdGhpcy5fZGVzdHJveVBhbmUodGhpcy50YWJzW2ldKTtcclxuICAgICAgICAgIHRoaXMudGFicy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICBzd2FwID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgaSsrXHJcbiAgICAgIH0gd2hpbGUgKGkgPCB0aGlzLnRhYnMubGVuZ3RoKTtcclxuICAgICAgaWYgKHN3YXApIHtcclxuICAgICAgICB0aGlzLnN3YXBUYWIgPSB0aGlzLl9nZXRIaXN0b3J5U3RlcCgpO1xyXG4gICAgICAgIHRoaXMucHJldkdyb3VwID0gdGhpcy5ncm91cDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnN3YXBUYWIgPSBudWxsO1xyXG4gICAgdGhpcy5ncm91cCA9IHRhYi5ncm91cDtcclxuICAgIGlmIChvcHRpb25zLmZvY3VzICE9PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoIC0gMTtcclxuICAgIH1cclxuICAgIHJldHVybiB0YWI7XHJcbiAgfVxyXG4gIC8qKiAqL1xyXG4gIGJhY2soKSB7XHJcbiAgICB0aGlzLl9uYXZCYWNrKHRoaXMuc3dhcCk7XHJcbiAgICB0aGlzLnN3YXAgPSBudWxsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gc3RlcHNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9uYXZCYWNrKHN0ZXBzOiBudW1iZXIpIHtcclxuICAgIGhpc3RvcnkuZ28oc3RlcHMgLSAoaGlzdG9yeS5zdGF0ZSBhcyBIaXN0b3J5U3RhdGUpLnN0ZXApO1xyXG4gIH1cclxuICB0YWJCYWNrKCkge1xyXG4gICAgdGhpcy5fbmF2QmFjayh0aGlzLnN3YXBUYWIpO1xyXG4gICAgdGhpcy5zd2FwVGFiID0gbnVsbDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbW1hbmRcclxuICAgKiBAcGFyYW0gcGFuZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgX3BhbmVDb21tYW5kPFQgPSBhbnk+KGNvbW1hbmQ6IFBhbmVDb21tYW5kLCBwYW5lOiBQYW5lUmVmPFQ+KSB7XHJcbiAgICBzd2l0Y2ggKGNvbW1hbmQpIHtcclxuICAgICAgY2FzZSAnZm9jdXMnOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJJbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5wYW5lcy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgICB0aGlzLmZvY3VzKGluZGV4KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnY2xvc2UnOlxyXG4gICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKSB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGFicy5pbmRleE9mKHBhbmUpO1xyXG4gICAgICAgICAgdGhpcy5jbG9zZVRhYihpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBhbmVzLmluZGV4T2YocGFuZSk7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICAgIHRoaXMuX2NsZWFyUGVuZGluZygpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5fY2xlYXJUYWJzKCk7XHJcbiAgICAgICAgICBpZiAodGhpcy5wYW5lcy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoREVGQVVMVF9ST1VURSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdleHBhbmQnOlxyXG4gICAgICAgIGlmIChwYW5lLm1vZGUgPT09ICd0YWInKVxyXG4gICAgICAgICAgdGhpcy5leHBhbmRUYWIoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICB0aGlzLmV4cGFuZFBhbmUoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmVjeWNsZSc6IHtcclxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2NyZWF0ZUhpc3RvcnlTdGF0ZSgpO1xyXG4gICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlLCAnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLyoqXHJcbiAqIEFsdC1oXHJcbiAqIEBwYXJhbSBldmVudFxyXG4gKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnRhYnMubGVuZ3RoKVxyXG4gICAgICB0aGlzLmNvbGxhcHNlKCk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIGVzY2FwZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIGFzeW5jIGNvbGxhcHNlKCkge1xyXG4gICAgY29uc3QgZXZ0ID0gbmV3IENvbGxhcHNlTmF2aWdhdGlvbigpO1xyXG4gICAgdGhpcy5fcm91dGVyLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLl9jbGVhclBlbmRpbmcoKTtcclxuICAgIGF3YWl0IHRoaXMuX2NsZWFyVGFicygpO1xyXG4gICAgdGhpcy5kaWFsb2cgJiZcclxuICAgICAgdGhpcy5kaWFsb2dDaGFuZ2UuZW1pdCh0aGlzLmRpYWxvZyA9IGZhbHNlKTtcclxuICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcclxuICBvblJlc2l6ZSgpIHtcclxuICAgIHRoaXMuX3Jlc2l6aW5nLm5leHQoKTtcclxuICB9XHJcbiAgLyoqICovXHJcbiAgcHJpdmF0ZSBfcmVzaXplKCkge1xyXG4gICAgLy9pZiAodGhpcy5wYW5lcy5sZW5ndGggPiAxICYmICF0aGlzLnBhbmVzW3RoaXMucGFuZXMubGVuZ3RoIC0gMV0uc3RyZXRjaGFibGUpIHtcclxuICAgIC8vICBjb25zdCBlbCA9IHRoaXMuX3BhbmVzQ29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCxcclxuICAgIC8vICAgIGNoaWxkID0gZWwubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgIC8vICBjaGlsZC5zdHlsZS5taW5XaWR0aCA9XHJcbiAgICAvLyAgICAoZWwucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gZWwucGFyZW50RWxlbWVudC5vZmZzZXRMZWZ0IC0gY2hpbGQub2Zmc2V0TGVmdCAtIDIpICsgJ3B4JztcclxuICAgIC8vfVxyXG4gICAgdGhpcy50YWJzLmNvbmNhdCh0aGlzLnBhbmVzKS5mb3JFYWNoKHAgPT4gcC5fZXZlbnRzJC5uZXh0KG5ldyBOYXZpZ2F0aW9uUmVzaXplKHtcclxuICAgIH0gYXMgYW55LCBwKSkpO1xyXG4gIH1cclxuICBjbG9zZVRhYihwb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCB0YWIgPSB0aGlzLnRhYnNbcG9zaXRpb25dO1xyXG4gICAgaWYgKCF0aGlzLl9jbG9zYWJsZSh0YWIpKSByZXR1cm47XHJcbiAgICB0aGlzLnRhYnMuc3BsaWNlKHBvc2l0aW9uLCAxKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3lQYW5lKHRhYik7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoID8gcG9zaXRpb24gPiAwID8gcG9zaXRpb24gLSAxIDogMCA6IC0xO1xyXG4gICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgICB0YWIuZGlhbG9nICYmXHJcbiAgICAgIHRoaXMuZGlhbG9nQ2hhbmdlLmVtaXQodGhpcy5kaWFsb2cgPSBmYWxzZSk7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYW5lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY2xvc2FibGUocGFuZTogUGFuZVJlZjxhbnk+KSB7XHJcbiAgICBsZXQgZXZ0ID0gbmV3IE5hdmlnYXRpb25DbG9zZShwYW5lKTtcclxuICAgIHBhbmUuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgaWYgKGV2dC5fcHJldmVudERlZmF1bHQpIHJldHVybiBmYWxzZTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICByZXR1cm4gIWV2dC5fcHJldmVudERlZmF1bHQ7XHJcbiAgfVxyXG5cclxuICBleHBhbmRQYW5lKCkge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMucGFuZXNbdGhpcy5zZWxlY3RlZEluZGV4XTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uRXhwYW5kKHBhbmUuX2V4cGFuZGVkID0gdHJ1ZSwgcGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgaWYgKGV2dC5fcHJldmVudERlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuc3dhcCA9IHRoaXMuX2dldEhpc3RvcnlTdGVwKCk7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBkbyB7XHJcbiAgICAgIGlmICh0aGlzLnBhbmVzW2ldICE9PSBwYW5lKSB7XHJcbiAgICAgICAgdGhpcy5fZGVzdHJveVBhbmUodGhpcy5wYW5lc1tpXSk7XHJcbiAgICAgICAgdGhpcy5wYW5lcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGkrKztcclxuICAgIH1cclxuICAgIHdoaWxlIChpIDwgdGhpcy5wYW5lcy5sZW5ndGgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcclxuICAgIHRoaXMuX3N5bmNCcm93c2VySGlzdG9yeSgpO1xyXG4gIH1cclxuICBwcml2YXRlIF9nZXRIaXN0b3J5U3RlcCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGhpc3Rvcnkuc3RhdGUgJiYgaGlzdG9yeS5zdGF0ZS5iaXpkb2MgPyAoaGlzdG9yeS5zdGF0ZSBhcyBIaXN0b3J5U3RhdGUpLnN0ZXAgOiAwO1xyXG4gIH1cclxuXHJcbiAgZXhwYW5kVGFiKCkge1xyXG4gICAgY29uc3QgdGFiID0gdGhpcy50YWJzW3RoaXMuc2VsZWN0ZWRUYWJJbmRleF07XHJcbiAgICBjb25zdCBldnQgPSBuZXcgTmF2aWdhdGlvbkV4cGFuZCh0YWIuX2V4cGFuZGVkID0gdHJ1ZSwgdGFiKVxyXG4gICAgdGFiLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIGlmIChldnQuX3ByZXZlbnREZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gICAgaWYgKGV2dC5fcHJldmVudERlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuc3dhcCA9IHRoaXMuX2dldEhpc3RvcnlTdGVwKCk7XHJcbiAgICB0aGlzLnN3YXBUYWIgPSBudWxsO1xyXG4gICAgdGhpcy5wYW5lcy5mb3JFYWNoKHAgPT5cclxuICAgICAgdGhpcy5fZGVzdHJveVBhbmUocClcclxuICAgICk7XHJcbiAgICB0aGlzLnRhYnMuc3BsaWNlKHRoaXMuc2VsZWN0ZWRUYWJJbmRleCwgMSk7XHJcbiAgICB0aGlzLnBhbmVzLnNwbGljZSgwLCB0aGlzLnBhbmVzLmxlbmd0aCwgdGFiKTtcclxuXHJcbiAgICB0YWIuX21vZGUgPSAncGFuZSc7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoID8gMCA6IC0xO1xyXG4gICAgdGhpcy5fc3luY0Jyb3dzZXJIaXN0b3J5KCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3QocG9zaXRpb246IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA9PT0gcG9zaXRpb24pIHJldHVybjtcclxuICAgIGlmIChwb3NpdGlvbiA9PT0gLTEpIHtcclxuICAgICAgaWYgKHRoaXMucGFuZXMubGVuZ3RoKSBwb3NpdGlvbiA9IHRoaXMucGFuZXMubGVuZ3RoIC0gMTtcclxuICAgICAgZWxzZSByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBwb3NpdGlvbjtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzW3Bvc2l0aW9uXTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uRm9jdXMocGFuZSk7XHJcbiAgICBwYW5lLl9ldmVudHMkLm5leHQoZXZ0KTtcclxuICAgIHRoaXMuX3JvdXRlci5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICB0aGlzLl90aXRsZS5zZXQocGFuZS50aXRsZSk7XHJcbiAgfVxyXG4gIGFzeW5jIHJlbW92ZUF0KHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnBhbmVzW3Bvc2l0aW9uXTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2Nsb3NhYmxlKHBhbmUpKSByZXR1cm47XHJcblxyXG4gICAgYXdhaXQgdGhpcy5fZGlzbWlzcyhwYW5lKTtcclxuXHJcbiAgICB0aGlzLl9kaXNjYXJkUGFuZShwYW5lKTtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPj0gdGhpcy5zZWxlY3RlZEluZGV4KVxyXG4gICAgICB0aGlzLnNlbGVjdCgtMSk7XHJcbiAgICB0aGlzLl9zeW5jQnJvd3Nlckhpc3RvcnkoKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHBhbmVcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9kaXNtaXNzKHBhbmU6IFBhbmVSZWY8YW55Pikge1xyXG4gICAgY29uc3QgcGFuZXMgPSB0aGlzLnBhbmVzLmNvbmNhdCh0aGlzLnRhYnMpLlxyXG4gICAgICBmaWx0ZXIocyA9PiBzLmRlY2VuZGVudE9mKHBhbmUpICYmIHMucm91dGUgJiYgcy5yb3V0ZS5jYW5EaXNtaXNzKS5cclxuICAgICAgcmV2ZXJzZSgpO1xyXG5cclxuICAgIHBhbmUucm91dGUgJiYgcGFuZS5yb3V0ZS5jYW5EaXNtaXNzICYmXHJcbiAgICAgIHBhbmVzLnB1c2gocGFuZSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYW5lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgb2sgPSBhd2FpdCB0aGlzLl9kaXNtaXNzYWJsZShwYW5lc1tpXSk7XHJcbiAgICAgIGlmICghb2spIHRocm93ICcnO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFuZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2Rpc2NhcmRQYW5lKHBhbmU6IFBhbmVSZWY8YW55Pikge1xyXG4gICAgdGhpcy5wYW5lcy5jb25jYXQodGhpcy50YWJzKS5cclxuICAgICAgZmlsdGVyKHMgPT4gcy5kZWNlbmRlbnRPZihwYW5lKSkuXHJcbiAgICAgIHJldmVyc2UoKS5cclxuICAgICAgZm9yRWFjaChzID0+IHRoaXMuX2Rpc2NhcmRQYW5lKHMpKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3lQYW5lKHBhbmUpO1xyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBhbmVzLmluZGV4T2YocGFuZSk7XHJcbiAgICB0aGlzLnBhbmVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NsZWFyUGVuZGluZygpIHtcclxuICAgIHRoaXMuX3BlbmRpbmcuc3BsaWNlKDAsIHRoaXMuX3BlbmRpbmcubGVuZ3RoKTtcclxuICB9XHJcbiAgLyoqICovXHJcbiAgcHJpdmF0ZSBhc3luYyBfY2xlYXJQYW5lcygpIHtcclxuICAgIGF3YWl0IHRoaXMuX2Rpc21pc3NBbGwodGhpcy5wYW5lcyk7XHJcbiAgICB0aGlzLnBhbmVzLmZvckVhY2gocCA9PiB0aGlzLl9kZXN0cm95UGFuZShwKSk7XHJcbiAgICB0aGlzLnBhbmVzLnNwbGljZSgwLCB0aGlzLnBhbmVzLmxlbmd0aCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTtcclxuICAgIHRoaXMuc3dhcCA9IG51bGw7XHJcbiAgfVxyXG4gIHByaXZhdGUgYXN5bmMgX2NsZWFyVGFicygpIHtcclxuICAgIGlmICghdGhpcy50YWJzLmxlbmd0aCkgcmV0dXJuO1xyXG4gICAgYXdhaXQgdGhpcy5fZGlzbWlzc0FsbCh0aGlzLnRhYnMpO1xyXG4gICAgdGhpcy50YWJzLmZvckVhY2godCA9PiB0aGlzLl9kZXN0cm95UGFuZSh0KSk7XHJcbiAgICB0aGlzLnRhYnMuc3BsaWNlKDAsIHRoaXMudGFicy5sZW5ndGgpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gLTE7XHJcbiAgICB0aGlzLnN3YXBUYWIgPSBudWxsO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0gcGFuZXNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIF9kaXNtaXNzQWxsKHBhbmVzOiBQYW5lUmVmW10pIHtcclxuICAgIGZvciAobGV0IHBhbmUgb2YgcGFuZXMuXHJcbiAgICAgIGZpbHRlcihzID0+IHMucm91dGUgJiYgcy5yb3V0ZS5jYW5EaXNtaXNzKSkge1xyXG4gICAgICBsZXQgb2sgPSBhd2FpdCB0aGlzLl9kaXNtaXNzYWJsZShwYW5lKTtcclxuICAgICAgaWYgKCFvaylcclxuICAgICAgICB0aHJvdyAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBwYW5lXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZGlzbWlzc2FibGUocGFuZTogUGFuZVJlZjxhbnk+KSB7XHJcbiAgICBjb25zdCB7IGluc3RhbmNlLCByb3V0ZTogeyBjYW5EaXNtaXNzIH0gfSA9IHBhbmU7XHJcbiAgICBjb25zdCBkaXNtaXNzYWJsZSA9IHRoaXMuX2luamVjdG9yLmdldChjYW5EaXNtaXNzKSBhcyBDYW5EaXNtaXNzPGFueT47XHJcbiAgICBjb25zdCBvayA9IGRpc21pc3NhYmxlLm9uRGlzbWlzcyhpbnN0YW5jZSk7XHJcbiAgICBpZiAoaXNCb29sZWFuKG9rKSlcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShvayk7XHJcbiAgICBlbHNlIGlmIChpc1Byb21pc2Uob2spKVxyXG4gICAgICByZXR1cm4gb2s7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShvayk7XHJcbiAgfVxyXG4gIHNjcm9sbFRvKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9jaGlsZHJlbi5pdGVtKGluZGV4KSBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgIGl0ZW0gJiYgaXRlbS5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgaW5saW5lOiAnZW5kJywgYmxvY2s6ICdlbmQnIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgX2NoaWxkcmVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhbmVzQ29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZScpO1xyXG4gIH1cclxuICBkb25lKCkge1xyXG4gICAgdGhpcy5lbmFibGVOYXZpZ2F0aW9uQXJyb3dzKCk7XHJcbiAgICB0aGlzLl9yZXNpemUoKTtcclxuICB9XHJcbiAgZW5hYmxlTmF2aWdhdGlvbkFycm93cyhfPzogRXZlbnQpIHtcclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX3BhbmVzQ29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgc2Nyb2xsTGVmdCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnNjcm9sbExlZnQpICsgMTtcclxuICAgIHRoaXMubmV4dCA9IHRoaXMuX3J0bCA/IGNvbnRhaW5lci5jbGllbnRXaWR0aCAtIHNjcm9sbExlZnQgPCBjb250YWluZXIuc2Nyb2xsV2lkdGggLSA1MCA6XHJcbiAgICAgIHNjcm9sbExlZnQgKyBjb250YWluZXIuY2xpZW50V2lkdGggPCBjb250YWluZXIuc2Nyb2xsV2lkdGggLSA1MDtcclxuICAgIHRoaXMucHJldiA9IHRoaXMuX3J0bCA/IHNjcm9sbExlZnQgPCAxIDogc2Nyb2xsTGVmdCA+IDE7XHJcbiAgfVxyXG4gIHNjcm9sbEJ5KG46IG51bWJlcikge1xyXG4gICAgY29uc3QgbGVmdCA9IG4gKiAodGhpcy5fcnRsID8gLTEgOiAxKTtcclxuICAgIHRoaXMuX3BhbmVzQ29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxCeSh7IGJlaGF2aW9yOiAnc21vb3RoJywgbGVmdCB9KTtcclxuICB9XHJcbiAgZm9jdXMoaW5kZXgpIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5fY2hpbGRyZW4uaXRlbShpbmRleCkgYXMgSFRNTERpdkVsZW1lbnQ7XHJcbiAgICBlbC5mb2N1cygpO1xyXG4gIH1cclxuICBvblBhbmVSZXNpemUocGFuZTogUGFuZVJlZjxhbnk+LCBldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgZWwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0IC8vIHJlbWVtYmVyIG1vdXNlIGRvd24gaW5mb1xyXG4gICAgICB3aWR0aCA9IGVsLmNsaWVudFdpZHRoLFxyXG4gICAgICBkID0gdGhpcy5fcnRsID8gLTEgOiAxO1xyXG5cclxuICAgIChldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpLmNsYXNzTGlzdC5hZGQoJ3Jlc2l6aW5nJyk7XHJcblxyXG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XHJcblxyXG4gICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBvbk1vdXNlTW92ZTtcclxuICAgIGRvY3VtZW50Lm9ubW91c2V1cCA9ICgpID0+IHtcclxuICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRGl2RWxlbWVudCkuY2xhc3NMaXN0LnJlbW92ZSgncmVzaXppbmcnKTtcclxuICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkb2N1bWVudC5vbm1vdXNldXAgPSBudWxsO1xyXG4gICAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XHJcbiAgICB9O1xyXG4gICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xyXG5cclxuICAgICAgY29uc3QgZGVsdGEgPSAoZS5jbGllbnRYIC0gZXZlbnQuY2xpZW50WCkgKiBkO1xyXG4gICAgICBlbC5zdHlsZS53aWR0aCA9IGVsLnN0eWxlLm1pbldpZHRoXHJcbiAgICAgICAgPSBNYXRoLm1heCh3aWR0aCArIGRlbHRhLCAzNTApICsgJ3B4JztcclxuICAgICAgcGFuZS5fZXZlbnRzJC5uZXh0KG5ldyBOYXZpZ2F0aW9uUmVzaXplKHt9IGFzIGFueSwgcGFuZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBvblRhYlJlc2l6ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgZWwgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTERpdkVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RcclxuICAgICAgbWUgPSB0aGlzLFxyXG4gICAgICAvLyByZW1lbWJlciBtb3VzZSBkb3duIGluZm9cclxuICAgICAgd2lkdGggPSBlbC5jbGllbnRXaWR0aCxcclxuICAgICAgZCA9IHRoaXMuX3J0bCA/IDEgOiAtMTtcclxuXHJcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxEaXZFbGVtZW50KS5jbGFzc0xpc3QuYWRkKCdyZXNpemluZycpO1xyXG5cclxuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xyXG5cclxuICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gb25Nb3VzZU1vdmU7XHJcbiAgICBkb2N1bWVudC5vbm1vdXNldXAgPSAoKSA9PiB7XHJcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpLmNsYXNzTGlzdC5yZW1vdmUoJ3Jlc2l6aW5nJyk7XHJcbiAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcclxuICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICBtZS5lbmFibGVOYXZpZ2F0aW9uQXJyb3dzKCk7XHJcbiAgICAgIHRoaXMuX3Jlc2l6ZSgpO1xyXG4gICAgfTtcclxuICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcclxuXHJcbiAgICAgIC8vIHByZXZlbnQgbmVnYXRpdmUtc2l6ZWQgZWxlbWVudHNcclxuICAgICAgY29uc3QgZGVsdGEgPSBNYXRoLm1heCgoZS5jbGllbnRYIC0gZXZlbnQuY2xpZW50WCkgKiBkLCAtd2lkdGgpO1xyXG4gICAgICBlbC5zdHlsZS53aWR0aCA9IGVsLnN0eWxlLm1pbldpZHRoID0gKHdpZHRoICsgZGVsdGEpICsgJ3B4JztcclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RhYnMnLCBlbC5zdHlsZS53aWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgX2Rlc3Ryb3lQYW5lKHBhbmU6IFBhbmVSZWYpIHtcclxuICAgIHBhbmUuX2Rlc3Ryb3koKTtcclxuICAgIGNvbnN0IGV2dCA9IG5ldyBOYXZpZ2F0aW9uRW5kKHBhbmUpO1xyXG4gICAgcGFuZS5fZXZlbnRzJC5uZXh0KGV2dCk7XHJcbiAgICB0aGlzLl9yb3V0ZXIuX2V2ZW50cyQubmV4dChldnQpO1xyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgUEFORV9QQVJBTVNfUkVHRVggPSAvKDpbXFx3XFwtXFwuXSspL2c7XHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHJvdXRlc1xyXG4gKiBAcGFyYW0gdHJlZVBhdGhcclxuICogQHJldHVybnNcclxuICovXHJcbmZ1bmN0aW9uIHByZXBhcmVSb3V0ZXMocm91dGVzOiBQYW5lUm91dGVbXSwgdHJlZVBhdGg/OiBzdHJpbmcpOiBFeHRlbmRlZFJvdXRlW10ge1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBsZXQgcm91dGUgPSByb3V0ZXNbaV0sIGZ1bGxQYXRoID0gKHRyZWVQYXRoID8gKHRyZWVQYXRoICsgJy8nKSA6ICcnKSArIHJvdXRlLnBhdGg7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihyb3V0ZSwge1xyXG4gICAgICBmdWxsUGF0aCxcclxuICAgICAgcmVnRXg6IG5ldyBSZWdFeHAoJ14nICsgZnVsbFBhdGguXHJcbiAgICAgICAgcmVwbGFjZSgnLycsICdcXFxcLycpLlxyXG4gICAgICAgIHJlcGxhY2UoUEFORV9QQVJBTVNfUkVHRVgsIGUgPT4gYCg/PCR7ZS5zdWJzdHJpbmcoMSl9PltcXFxcd0BcXFxcLVxcXFwuXSopYCkpXHJcbiAgICB9KTtcclxuICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xyXG4gICAgICBsZXQgY2hpbGRyZW4gPSBwcmVwYXJlUm91dGVzKHJvdXRlLmNoaWxkcmVuLCBmdWxsUGF0aCk7XHJcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspXHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGlsZHJlbltqXSwge1xyXG4gICAgICAgICAgcGFyZW50OiByb3V0ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcm91dGVzIGFzIEV4dGVuZGVkUm91dGVbXTtcclxufVxyXG5cclxuaW50ZXJmYWNlIEV4dGVuZGVkUm91dGUgZXh0ZW5kcyBQYW5lUm91dGUge1xyXG4gIGZ1bGxQYXRoOiBzdHJpbmc7XHJcbiAgcmVnRXg6IFJlZ0V4cDtcclxuICBwYXJlbnQ/OiBFeHRlbmRlZFJvdXRlO1xyXG4gIGNoaWxkcmVuPzogRXh0ZW5kZWRSb3V0ZVtdO1xyXG59XHJcbmludGVyZmFjZSBIaXN0b3J5U3RhdGUge1xyXG4gIGJpemRvYzogdHJ1ZTtcclxuICBzdGVwOiBudW1iZXI7XHJcbiAgc3dhcD86IG51bWJlcjtcclxuICBzd2FwVGFiPzogbnVtYmVyO1xyXG4gIGdyb3VwPzogc3RyaW5nO1xyXG4gIHByZXZHcm91cD86IHN0cmluZztcclxuICBwYW5lczogYW55W107XHJcbiAgdGFiczogYW55W107XHJcbiAgc2VsZWN0ZWRUYWJJbmRleD86IG51bWJlcjtcclxufVxyXG4iLCI8ZGl2ICNwYW5lc0VsIGNsYXNzPVwicGFuZXNcIlxuICAgICBjZGtTY3JvbGxhYmxlXG4gICAgIEBwYW5lc1xuICAgICAoc2Nyb2xsKT1cImVuYWJsZU5hdmlnYXRpb25BcnJvd3MoJGV2ZW50KVwiPlxuICA8IS0tLS0+XG4gIEBpZiAocHJldikge1xuICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWFycm93XCIgKGNsaWNrKT1cInNjcm9sbEJ5KC00MDApXCIgbWF0UmlwcGxlIFttYXRSaXBwbGVVbmJvdW5kZWRdPVwidHJ1ZVwiIFttYXRSaXBwbGVDZW50ZXJlZF09XCJ0cnVlXCIgW21hdFJpcHBsZUNvbG9yXT1cImFjY2VudFwiPlxuICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tcnRsLW1pcnJvclwiPlxuICAgICAgYXJyb3dfYmFja19pb3NcbiAgICA8L2k+XG4gIDwvZGl2PlxuICB9XG4gIDwhLS1wYW5lcy0tPlxuICBAZm9yIChwIG9mIHBhbmVzOyB0cmFjayBwOyBsZXQgaSA9ICRpbmRleCkge1xuICA8ZGl2IChtb3VzZWVudGVyKT1cInNlbGVjdGVkSW5kZXggIT09IGkgJiYgIWRyYWdnaW5nICYmIHNlbGVjdChpKVwiXG4gICAgICAgKGNsaWNrKT1cInNlbGVjdChpKVwiXG4gICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZEluZGV4ID09PSBpICYmIHBhbmVzLmxlbmd0aCA+IDFcIiBjbGFzcz1cInBhbmVcIiBAcGFuZT5cbiAgICA8bmctY29udGFpbmVyIFtjZGtQb3J0YWxPdXRsZXRdPVwicC5fcG9ydGFsXCIgKGF0dGFjaGVkKT1cInAuX2luc3RhbmNlID0gJGV2ZW50Lmluc3RhbmNlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICBAaWYgKGkgPCBwYW5lcy5sZW5ndGggLSAxKSB7XG4gIDxkaXYgY2xhc3M9XCJwYW5lLXNlcGFyYXRvclwiIChtb3VzZWRvd24pPVwib25QYW5lUmVzaXplKHAsICRldmVudClcIj48L2Rpdj5cbiAgfVxuICB9XG4gIDwhLS1kaWFsb2ctLT5cbiAgQGlmIChkaWFsb2cpIHtcbiAgPGRpdiBjbGFzcz1cImJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlVGFiKDApXCI+PC9kaXY+XG4gIH1cbiAgPCEtLW5leHQtLT5cbiAgQGlmIChuZXh0KSB7XG4gIDxkaXYgY2xhc3M9XCJzY3JvbGwtYXJyb3cgZm9yd2FyZFwiPlxuICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tcnRsLW1pcnJvclwiIG1hdFJpcHBsZSBbbWF0UmlwcGxlVW5ib3VuZGVkXT1cInRydWVcIiBbbWF0UmlwcGxlQ2VudGVyZWRdPVwidHJ1ZVwiIFttYXRSaXBwbGVSYWRpdXNdPVwiMzBcIiBbbWF0UmlwcGxlQ29sb3JdPVwiYWNjZW50XCJcbiAgICAgICAoY2xpY2spPVwic2Nyb2xsQnkoNDAwKVwiPlxuICAgICAgYXJyb3dfZm9yd2FyZF9pb3NcbiAgICA8L2k+XG4gIDwvZGl2PlxuICB9XG48L2Rpdj5cbjwhLS10YWJzLS0+XG5AaWYgKHRhYnMubGVuZ3RoKSB7XG48ZGl2IGNsYXNzPVwidGFicy1zZXBhcmF0b3JcIiAobW91c2Vkb3duKT1cIm9uVGFiUmVzaXplKCRldmVudClcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ0YWJzIG1hdC1lbGV2YXRpb24tejE4XCIgI3RhYnNFbCBbQHRhYnNdPVwidGFic0FuaW1hdGlvblwiIChAdGFicy5kb25lKT1cImRvbmUoKVwiPlxuICA8IS0tdGl0bGUtLT5cbiAgPGRpdiBjbGFzcz1cInJvdyB0YWJzLXRpdGxlXCI+XG4gICAgQGlmIChzd2FwVGFiKSB7XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRhYkJhY2soKVwiIFtiaXpkb2NUb29sdGlwXT1cInByZXZHcm91cCB8fCAoJ0JhY2snfHRyYW5zbGF0ZSlcIj48bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCI+YXJyb3dfYmFjazwvbWF0LWljb24+PC9idXR0b24+XG4gICAgfVxuICAgIDxoMj57e2dyb3VwfX08L2gyPlxuICAgIEBpZiAoIWRpYWxvZykge1xuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJleHBhbmRUYWIoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidFeHBhbmQnfCB0cmFuc2xhdGVcIj48bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbi1ydGwtbWlycm9yXCIgc3R5bGU9XCJmb250LXNpemU6IDIycHhcIj5vcGVuX2luX2Z1bGw8L21hdC1pY29uPjwvYnV0dG9uPlxuICAgIH1cbiAgICA8c3BhbiBjbGFzcz1cImRpdmlkZXJcIj48L3NwYW4+XG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImNvbGxhcHNlKClcIiBiaXpkb2NUb29sdGlwPVwiRXNjXCI+PG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj48L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxuYXYgbWF0LXRhYi1uYXYtYmFyIGNvbG9yPVwiYWNjZW50XCIgW2Rpc2FibGVQYWdpbmF0aW9uXT1cInRydWVcIiBbdGFiUGFuZWxdPVwidGFiUGFuZWxcIj5cbiAgICBAZm9yICh0IG9mIHRhYnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgPGEgbWF0LXRhYi1saW5rIGNsYXNzPVwibWF0LXRhYi1saW5rXCJcbiAgICAgICAoY2xpY2spPVwic2VsZWN0ZWRUYWJJbmRleCA9IGlcIlxuICAgICAgIFthY3RpdmVdPVwic2VsZWN0ZWRUYWJJbmRleCA9PT0gaVwiPlxuICAgICAgPG1hdC1pY29uIFttYXRCYWRnZV09XCJ0LmJhZGdlXCIgW21hdEJhZGdlSGlkZGVuXT1cIiF0LmJhZGdlXCIgbWF0QmFkZ2VTaXplPVwic21hbGxcIiBtYXRCYWRnZUNvbG9yPVwiYWNjZW50XCIgYXJpYS1oaWRkZW49XCJmYWxzZVwiPnt7dC5pY29ufX08L21hdC1pY29uPiZuYnNwO1xuICAgICAge3t0LnRpdGxlfX1cbiAgICAgIEBpZiAodC5kaXNtaXNzYWJsZSkge1xuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJjbG9zZVRhYihpKVwiIGNsYXNzPVwidG9vbFwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIH1cbiAgICAgIDwhLS1pbmxpbmU9XCJ0cnVlXCItLT5cbiAgICA8L2E+XG4gICAgfVxuICA8L25hdj5cbiAgPG1hdC10YWItbmF2LXBhbmVsICN0YWJQYW5lbCBjbGFzcz1cImZsZXhcIj5cbiAgICBAZm9yICh0IG9mIHRhYnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJzZWxlY3RlZFRhYkluZGV4ID09PSBpID8gJyc6ICdub25lJ1wiIGNsYXNzPVwidGFiXCIgW0B0YWJdPVwic2VsZWN0ZWRUYWJJbmRleFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbY2RrUG9ydGFsT3V0bGV0XT1cInQuX3BvcnRhbFwiIChhdHRhY2hlZCk9XCJ0Ll9pbnN0YW5jZSA9ICRldmVudC5pbnN0YW5jZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIH1cbiAgPC9tYXQtdGFiLW5hdi1wYW5lbD5cbjwvZGl2PlxufVxuIl19