@sumaris-net/ngx-components 4.0.0-rc6 → 4.0.0-rc8

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 (293) hide show
  1. package/esm2022/public_api.mjs +5 -2
  2. package/esm2022/src/app/admin/admin-routing.module.mjs +4 -4
  3. package/esm2022/src/app/admin/admin.module.mjs +4 -4
  4. package/esm2022/src/app/admin/services/person.service.mjs +3 -3
  5. package/esm2022/src/app/admin/services/validator/person.validator.mjs +3 -3
  6. package/esm2022/src/app/admin/users/users.mjs +15 -24
  7. package/esm2022/src/app/admin/users/users.module.mjs +4 -4
  8. package/esm2022/src/app/core/about/about.modal.mjs +3 -3
  9. package/esm2022/src/app/core/about/about.module.mjs +4 -4
  10. package/esm2022/src/app/core/account/account.module.mjs +4 -4
  11. package/esm2022/src/app/core/account/account.page.mjs +21 -19
  12. package/esm2022/src/app/core/account/new-token.modal.mjs +3 -3
  13. package/esm2022/src/app/core/account/token.table.mjs +3 -3
  14. package/esm2022/src/app/core/auth/auth.form.mjs +3 -3
  15. package/esm2022/src/app/core/auth/auth.modal.mjs +3 -3
  16. package/esm2022/src/app/core/auth/auth.module.mjs +4 -4
  17. package/esm2022/src/app/core/core.module.mjs +4 -4
  18. package/esm2022/src/app/core/core.testing.module.mjs +4 -4
  19. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +4 -4
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +4 -4
  21. package/esm2022/src/app/core/form/entity/editor.class.mjs +15 -10
  22. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +3 -3
  23. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +15 -9
  24. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
  25. package/esm2022/src/app/core/form/entity/entity.module.mjs +4 -4
  26. package/esm2022/src/app/core/form/form.class.mjs +3 -3
  27. package/esm2022/src/app/core/form/form.module.mjs +4 -4
  28. package/esm2022/src/app/core/form/list/list.form.mjs +3 -3
  29. package/esm2022/src/app/core/form/list/list.module.mjs +4 -4
  30. package/esm2022/src/app/core/form/properties/properties.form.mjs +3 -3
  31. package/esm2022/src/app/core/form/properties/properties.module.mjs +4 -4
  32. package/esm2022/src/app/core/form/properties/properties.table.mjs +6 -6
  33. package/esm2022/src/app/core/form/properties/property.validator.mjs +3 -3
  34. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +3 -3
  35. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +4 -4
  36. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +3 -3
  37. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +4 -4
  38. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +6 -6
  39. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +6 -11
  40. package/esm2022/src/app/core/graphql/graphql.module.mjs +4 -4
  41. package/esm2022/src/app/core/graphql/graphql.service.mjs +9 -5
  42. package/esm2022/src/app/core/home/home.mjs +5 -6
  43. package/esm2022/src/app/core/home/home.module.mjs +4 -4
  44. package/esm2022/src/app/core/icon/icon.component.mjs +3 -3
  45. package/esm2022/src/app/core/icon/icon.module.mjs +4 -4
  46. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +3 -3
  47. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +4 -4
  48. package/esm2022/src/app/core/menu/menu.component.mjs +14 -10
  49. package/esm2022/src/app/core/menu/menu.module.mjs +4 -4
  50. package/esm2022/src/app/core/menu/menu.service.mjs +11 -5
  51. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +3 -3
  52. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +3 -3
  53. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +3 -3
  54. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +4 -4
  55. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +3 -3
  56. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +4 -4
  57. package/esm2022/src/app/core/peer/select-peer.modal.mjs +3 -3
  58. package/esm2022/src/app/core/peer/select-peer.module.mjs +4 -4
  59. package/esm2022/src/app/core/register/register-confirm.page.mjs +3 -3
  60. package/esm2022/src/app/core/register/register.form.mjs +3 -3
  61. package/esm2022/src/app/core/register/register.modal.mjs +3 -3
  62. package/esm2022/src/app/core/register/register.module.mjs +4 -4
  63. package/esm2022/src/app/core/services/account.service.mjs +50 -23
  64. package/esm2022/src/app/core/services/auth-guard.service.mjs +3 -3
  65. package/esm2022/src/app/core/services/base-entity-service.class.mjs +3 -3
  66. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +3 -3
  67. package/esm2022/src/app/core/services/config/core.config.mjs +7 -7
  68. package/esm2022/src/app/core/services/config.service.mjs +3 -3
  69. package/esm2022/src/app/core/services/crypto.service.mjs +3 -3
  70. package/esm2022/src/app/core/services/local-settings.service.mjs +3 -3
  71. package/esm2022/src/app/core/services/model/referential.model.mjs +5 -2
  72. package/esm2022/src/app/core/services/network.service.mjs +3 -3
  73. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +8 -8
  74. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +4 -4
  75. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +4 -4
  76. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +8 -8
  77. package/esm2022/src/app/core/services/platform.service.mjs +20 -10
  78. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +3 -3
  79. package/esm2022/src/app/core/services/testing/referential.validator.mjs +3 -3
  80. package/esm2022/src/app/core/services/validator/account.validator.mjs +3 -3
  81. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +3 -3
  82. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +3 -3
  83. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +3 -3
  84. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +3 -3
  85. package/esm2022/src/app/core/settings/settings.module.mjs +4 -4
  86. package/esm2022/src/app/core/settings/settings.page.mjs +3 -3
  87. package/esm2022/src/app/core/table/actions-column.component.mjs +3 -3
  88. package/esm2022/src/app/core/table/async-table.class.mjs +3 -3
  89. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +3 -3
  90. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +3 -3
  91. package/esm2022/src/app/core/table/memory-table.class.mjs +3 -3
  92. package/esm2022/src/app/core/table/table-select-columns.component.mjs +3 -3
  93. package/esm2022/src/app/core/table/table.class.mjs +3 -3
  94. package/esm2022/src/app/core/table/table.module.mjs +4 -4
  95. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +3 -3
  96. package/esm2022/src/app/core/table/testing/table.testing.mjs +3 -3
  97. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +4 -4
  98. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +3 -3
  99. package/esm2022/src/app/core/table/testing/table2.testing.mjs +3 -3
  100. package/esm2022/src/app/shared/audio/audio.mjs +3 -3
  101. package/esm2022/src/app/shared/audio/audio.testing.mjs +3 -3
  102. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +4 -4
  103. package/esm2022/src/app/shared/capacitor/keyboard.mjs +3 -3
  104. package/esm2022/src/app/shared/debug/debug.component.mjs +3 -3
  105. package/esm2022/src/app/shared/debug/debug.module.mjs +4 -4
  106. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +3 -3
  107. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +3 -3
  108. package/esm2022/src/app/shared/directives/directives.module.mjs +4 -4
  109. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +3 -3
  110. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +3 -3
  111. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +3 -3
  112. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +3 -3
  113. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  114. package/esm2022/src/app/shared/file/file.service.mjs +3 -3
  115. package/esm2022/src/app/shared/form/field.component.mjs +3 -3
  116. package/esm2022/src/app/shared/form/loading-spinner.mjs +3 -3
  117. package/esm2022/src/app/shared/gesture/gesture-config.mjs +3 -3
  118. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +3 -3
  119. package/esm2022/src/app/shared/help/help.modal.mjs +3 -3
  120. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +3 -3
  121. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +3 -3
  122. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +4 -4
  123. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +4 -4
  124. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +4 -4
  125. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +3 -3
  126. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +3 -3
  127. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +4 -4
  128. package/esm2022/src/app/shared/image/image.module.mjs +4 -4
  129. package/esm2022/src/app/shared/image/image.service.mjs +3 -3
  130. package/esm2022/src/app/shared/logging/logging-service.class.mjs +3 -3
  131. package/esm2022/src/app/shared/logging/logging-service.module.mjs +4 -4
  132. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +6 -6
  133. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -4
  134. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
  135. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +3 -3
  136. package/esm2022/src/app/shared/material/badge/badge.module.mjs +4 -4
  137. package/esm2022/src/app/shared/material/badge/badge.test.mjs +3 -3
  138. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +4 -4
  139. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +3 -3
  140. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +3 -3
  141. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +3 -3
  142. package/esm2022/src/app/shared/material/chips/chips.module.mjs +4 -4
  143. package/esm2022/src/app/shared/material/chips/material.chips.mjs +3 -3
  144. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +3 -3
  145. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +4 -4
  146. package/esm2022/src/app/shared/material/datetime/material.date.mjs +6 -6
  147. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +3 -3
  148. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +3 -3
  149. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +6 -5
  150. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +7 -6
  151. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +3 -3
  152. package/esm2022/src/app/shared/material/duration/duration.module.mjs +4 -4
  153. package/esm2022/src/app/shared/material/duration/material.duration.mjs +3 -3
  154. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +3 -3
  155. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +3 -3
  156. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +4 -4
  157. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +3 -3
  158. package/esm2022/src/app/shared/material/material.module.mjs +14 -9
  159. package/esm2022/src/app/shared/material/material.testing.module.mjs +16 -5
  160. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +3 -3
  161. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +3 -3
  162. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +3 -3
  163. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +3 -3
  164. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +3 -3
  165. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +3 -3
  166. package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +4 -4
  167. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +3 -3
  168. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +3 -3
  169. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +3 -3
  170. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +3 -3
  171. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +4 -4
  172. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +3 -3
  173. package/esm2022/src/app/shared/material/testing/common.test.mjs +3 -3
  174. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +31 -0
  175. package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
  176. package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
  177. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +19 -9
  178. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +4 -4
  179. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +3 -3
  180. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +24 -24
  181. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +3 -3
  182. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +4 -4
  183. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +6 -6
  184. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +4 -4
  185. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +4 -4
  186. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +3 -3
  187. package/esm2022/src/app/shared/pipes/form.pipes.mjs +18 -18
  188. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +4 -4
  189. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +9 -9
  190. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +12 -12
  191. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +6 -6
  192. package/esm2022/src/app/shared/pipes/math.pipes.mjs +12 -12
  193. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +3 -3
  194. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +4 -4
  195. package/esm2022/src/app/shared/pipes/pipes.module.mjs +4 -4
  196. package/esm2022/src/app/shared/pipes/property.pipes.mjs +7 -7
  197. package/esm2022/src/app/shared/pipes/string.pipes.mjs +30 -30
  198. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +8 -8
  199. package/esm2022/src/app/shared/pipes/types.pipes.mjs +12 -12
  200. package/esm2022/src/app/shared/rx-state.module.mjs +4 -4
  201. package/esm2022/src/app/shared/services/entity-service.class.mjs +1 -1
  202. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +6 -6
  203. package/esm2022/src/app/shared/services/progress-bar.service.mjs +3 -3
  204. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +3 -3
  205. package/esm2022/src/app/shared/services/startable-service.class.mjs +5 -5
  206. package/esm2022/src/app/shared/services/translate-context.service.mjs +3 -3
  207. package/esm2022/src/app/shared/shared-routing.module.mjs +7 -7
  208. package/esm2022/src/app/shared/shared.module.mjs +29 -13
  209. package/esm2022/src/app/shared/shared.testing.module.mjs +4 -4
  210. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +3 -3
  211. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +4 -4
  212. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +4 -4
  213. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +4 -4
  214. package/esm2022/src/app/shared/storage/storage.service.mjs +3 -3
  215. package/esm2022/src/app/shared/testing/observable.test.mjs +3 -3
  216. package/esm2022/src/app/shared/testing/tests.page.mjs +3 -3
  217. package/esm2022/src/app/shared/toast/toast.testing.mjs +3 -3
  218. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +4 -4
  219. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +3 -3
  220. package/esm2022/src/app/shared/toolbar/toolbar.mjs +4 -4
  221. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +4 -4
  222. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +3 -3
  223. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +4 -4
  224. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +3 -3
  225. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +3 -3
  226. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +3 -3
  227. package/esm2022/src/app/social/job/job.module.mjs +4 -4
  228. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +3 -3
  229. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +3 -3
  230. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +3 -3
  231. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +3 -3
  232. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +3 -3
  233. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +3 -3
  234. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +4 -4
  235. package/esm2022/src/app/social/message/message.form.mjs +58 -6
  236. package/esm2022/src/app/social/message/message.modal.mjs +20 -12
  237. package/esm2022/src/app/social/message/message.model.mjs +5 -1
  238. package/esm2022/src/app/social/message/message.module.mjs +9 -22
  239. package/esm2022/src/app/social/message/message.service.mjs +32 -10
  240. package/esm2022/src/app/social/social.module.mjs +4 -4
  241. package/esm2022/src/app/social/social.testing.module.mjs +4 -4
  242. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +3 -3
  243. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +3 -3
  244. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +3 -3
  245. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +4 -4
  246. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +3 -3
  247. package/esm2022/src/app/social/user-event/user-event.module.mjs +4 -4
  248. package/esm2022/src/app/social/user-event/user-event.service.mjs +39 -25
  249. package/esm2022/src/environments/environment.class.mjs +3 -1
  250. package/esm2022/src/environments/environment.loader.mjs +83 -0
  251. package/esm2022/src/environments/environment.mjs +18 -15
  252. package/fesm2022/sumaris-net.ngx-components.mjs +6719 -6387
  253. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  254. package/package.json +25 -3
  255. package/public_api.d.ts +4 -1
  256. package/src/app/core/account/account.page.d.ts +3 -2
  257. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -1
  258. package/src/app/core/form/entity/editor.class.d.ts +1 -1
  259. package/src/app/core/form/entity/entity-editor.class.d.ts +10 -6
  260. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  261. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  262. package/src/app/core/form/text-popover/text-popover.module.d.ts +4 -5
  263. package/src/app/core/menu/menu.component.d.ts +6 -2
  264. package/src/app/core/menu/menu.service.d.ts +2 -0
  265. package/src/app/core/services/account.service.d.ts +4 -0
  266. package/src/app/core/services/config/core.config.d.ts +2 -2
  267. package/src/app/core/services/model/referential.model.d.ts +2 -1
  268. package/src/app/shared/inputs.d.ts +1 -1
  269. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -1
  270. package/src/app/shared/material/material.module.d.ts +2 -1
  271. package/src/app/shared/material/material.testing.module.d.ts +14 -13
  272. package/src/app/shared/material/text/testing/text-form.testing.d.ts +13 -0
  273. package/src/app/{core/form/text-popover → shared/material/text}/text-form.component.d.ts +2 -2
  274. package/src/app/shared/material/text/text-form.module.d.ts +16 -0
  275. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +4 -1
  276. package/src/app/shared/services/entity-service.class.d.ts +1 -1
  277. package/src/app/shared/services/memory-entity-service.class.d.ts +3 -1
  278. package/src/app/shared/shared.module.d.ts +5 -3
  279. package/src/app/social/message/message.form.d.ts +8 -2
  280. package/src/app/social/message/message.modal.d.ts +5 -1
  281. package/src/app/social/message/message.model.d.ts +2 -0
  282. package/src/app/social/message/message.module.d.ts +2 -1
  283. package/src/app/social/message/message.service.d.ts +8 -3
  284. package/src/app/social/user-event/user-event.service.d.ts +5 -0
  285. package/src/assets/environments/environment-test.json +6 -0
  286. package/src/assets/i18n/en-US.json +25 -23
  287. package/src/assets/i18n/en.json +25 -23
  288. package/src/assets/i18n/fr.json +8 -5
  289. package/src/assets/manifest.json +1 -1
  290. package/src/environments/environment.class.d.ts +1 -0
  291. package/src/environments/environment.loader.d.ts +26 -0
  292. package/src/theme/_ngx-components.table.scss +1 -1
  293. package/esm2022/src/app/core/form/text-popover/text-form.component.mjs +0 -97
@@ -42,8 +42,6 @@ const Fragments = {
42
42
  lastName
43
43
  email
44
44
  pubkey
45
- # username
46
- # usernameExtranet
47
45
  avatar
48
46
  statusId
49
47
  updateDate
@@ -52,9 +50,6 @@ const Fragments = {
52
50
  settings {
53
51
  ...UserSettingsFragment
54
52
  }
55
- tokens {
56
- ...UserTokenFragment
57
- }
58
53
  department {
59
54
  id
60
55
  label
@@ -85,34 +80,53 @@ const Fragments = {
85
80
  __typename
86
81
  }`
87
82
  };
88
- // Load account query
89
- const LoadQuery = gql `
90
- query Account {
83
+ // Account queries
84
+ const Queries = {
85
+ load: gql `query Account {
91
86
  data: account {
92
87
  ...AccountFragment
93
88
  }
94
89
  }
95
90
  ${Fragments.account}
91
+ ${Fragments.settings}`,
92
+ loadWithTokens: gql `query AccountWithToken {
93
+ data: account {
94
+ ...AccountFragment
95
+ tokens {
96
+ ...UserTokenFragment
97
+ }
98
+ }
99
+ }
100
+ ${Fragments.account}
96
101
  ${Fragments.settings}
97
- ${Fragments.token}
98
- `;
102
+ ${Fragments.token}`,
103
+ };
99
104
  // Check email query
100
105
  const IsEmailExistsQuery = gql `
101
106
  query IsEmailExists($email: String, $hash: String){
102
107
  isEmailExists(email: $email, hash: $hash)
103
108
  }
104
109
  `;
105
- // Save (create or update) account mutation
106
- const AccountMutations = {
110
+ // Account mutations
111
+ const Mutations = {
107
112
  save: gql ` mutation SaveAccount($data:AccountVOInput){
108
113
  data: saveAccount(account: $data){
109
114
  ...AccountFragment
110
115
  }
111
116
  }
112
117
  ${Fragments.account}
113
- ${Fragments.token}
118
+ ${Fragments.settings}`,
119
+ saveWithTokens: gql ` mutation SaveAccountWithTokens($data:AccountVOInput){
120
+ data: saveAccount(account: $data){
121
+ ...AccountFragment
122
+ tokens {
123
+ ...UserTokenFragment
124
+ }
125
+ }
126
+ }
127
+ ${Fragments.account}
114
128
  ${Fragments.settings}
115
- `,
129
+ ${Fragments.token}`,
116
130
  create: gql `mutation CreateAccount($data:AccountVOInput){
117
131
  data: createAccount(account: $data){
118
132
  ...AccountFragment
@@ -120,7 +134,6 @@ const AccountMutations = {
120
134
  }
121
135
  ${Fragments.account}
122
136
  ${Fragments.settings}
123
- ${Fragments.token}
124
137
  `,
125
138
  saveSettings: gql `mutation SaveSettings($data:UserSettingsVOInput){
126
139
  data: saveSettings(settings: $data){
@@ -195,6 +208,7 @@ export class AccountService extends BaseGraphqlService {
195
208
  _optionDefs;
196
209
  _$additionalFields = new BehaviorSubject([]);
197
210
  _tokenType$ = new BehaviorSubject(undefined);
211
+ _apiTokenEnabled = true;
198
212
  get account() {
199
213
  return this._cache.loaded ? this._data : undefined;
200
214
  }
@@ -224,6 +238,12 @@ export class AccountService extends BaseGraphqlService {
224
238
  this.onAuthBasicChange.next(undefined);
225
239
  }
226
240
  }
241
+ get apiTokenEnabled() {
242
+ return this._apiTokenEnabled;
243
+ }
244
+ set apiTokenEnabled(value) {
245
+ this._apiTokenEnabled = value;
246
+ }
227
247
  constructor(network, graphql, settings, storage, file, translate, toastController, environment, options) {
228
248
  super(graphql, environment);
229
249
  this.network = network;
@@ -629,8 +649,9 @@ export class AccountService extends BaseGraphqlService {
629
649
  }
630
650
  // Load remotely
631
651
  else {
652
+ const query = opts?.query || (this.apiTokenEnabled ? Queries.loadWithTokens : Queries.load);
632
653
  const { data } = await this.graphql.query({
633
- query: LoadQuery,
654
+ query,
634
655
  error: { code: ErrorCodes.LOAD_ACCOUNT_ERROR, message: 'ERROR.LOAD_ACCOUNT_ERROR' },
635
656
  fetchPolicy: opts && opts.fetchPolicy || 'no-cache' || undefined
636
657
  });
@@ -998,9 +1019,11 @@ export class AccountService extends BaseGraphqlService {
998
1019
  const json = account.asObject(MINIFY_ENTITY_FOR_POD);
999
1020
  // User not allow to change his profiles
1000
1021
  delete json.profiles;
1022
+ const mutation = isNew ? Mutations.create :
1023
+ (this._apiTokenEnabled ? Mutations.saveWithTokens : Mutations.save);
1001
1024
  // Execute mutation
1002
1025
  const { data } = await this.graphql.mutate({
1003
- mutation: isNew ? AccountMutations.create : AccountMutations.save,
1026
+ mutation,
1004
1027
  variables: { data: json },
1005
1028
  error: {
1006
1029
  code: ErrorCodes.SAVE_ACCOUNT_ERROR,
@@ -1025,7 +1048,7 @@ export class AccountService extends BaseGraphqlService {
1025
1048
  const json = settings.asObject(MINIFY_ENTITY_FOR_POD);
1026
1049
  // Execute mutation
1027
1050
  const { data } = await this.graphql.mutate({
1028
- mutation: AccountMutations.saveSettings,
1051
+ mutation: Mutations.saveSettings,
1029
1052
  variables: { data: json },
1030
1053
  error: {
1031
1054
  code: ErrorCodes.SAVE_SETTINGS_ERROR,
@@ -1170,8 +1193,12 @@ export class AccountService extends BaseGraphqlService {
1170
1193
  return;
1171
1194
  target.id = source.id || target.id;
1172
1195
  target.updateDate = source.updateDate || target.updateDate;
1196
+ // Update settings
1173
1197
  this.copyIdAndUpdateDateSettings(source.settings, target.settings);
1174
- this.copyIdAndUpdateDateToken(source.tokens, target.tokens);
1198
+ // Update tokens
1199
+ if (this._apiTokenEnabled) {
1200
+ this.copyIdAndUpdateDateToken(source.tokens, target.tokens);
1201
+ }
1175
1202
  }
1176
1203
  copyIdAndUpdateDateSettings(source, target) {
1177
1204
  if (!source)
@@ -1195,10 +1222,10 @@ export class AccountService extends BaseGraphqlService {
1195
1222
  showToast(opts) {
1196
1223
  return Toasts.show(this.toastController, this.translate, opts);
1197
1224
  }
1198
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: AccountService, deps: [{ token: i1.NetworkService }, { token: i2.GraphqlService }, { token: i3.LocalSettingsService }, { token: i4.Storage }, { token: i5.FileService }, { token: i6.TranslateService, optional: true }, { token: i7.ToastController, optional: true }, { token: ENVIRONMENT }, { token: APP_USER_SETTINGS_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1199
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: AccountService, providedIn: 'root' });
1225
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, deps: [{ token: i1.NetworkService }, { token: i2.GraphqlService }, { token: i3.LocalSettingsService }, { token: i4.Storage }, { token: i5.FileService }, { token: i6.TranslateService, optional: true }, { token: i7.ToastController, optional: true }, { token: ENVIRONMENT }, { token: APP_USER_SETTINGS_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1226
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, providedIn: 'root' });
1200
1227
  }
1201
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: AccountService, decorators: [{
1228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AccountService, decorators: [{
1202
1229
  type: Injectable,
1203
1230
  args: [{ providedIn: 'root', deps: [ENVIRONMENT] }]
1204
1231
  }], ctorParameters: () => [{ type: i1.NetworkService }, { type: i2.GraphqlService }, { type: i3.LocalSettingsService }, { type: i4.Storage }, { type: i5.FileService }, { type: i6.TranslateService, decorators: [{
@@ -1214,4 +1241,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
1214
1241
  type: Inject,
1215
1242
  args: [APP_USER_SETTINGS_OPTIONS]
1216
1243
  }] }] });
1217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBQyxhQUFhLEVBQVUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4RCxPQUFPLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRSxPQUFPLEVBQVMsV0FBVyxFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBQyxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFjLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBR3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBT3RELE9BQU8sRUFBRSxxQkFBcUIsRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVB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QztnQkFDM0QsTUFBTSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxTQUFTLENBQVUsSUFBc0I7UUFDakQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO3VHQXpxQ1UsY0FBYyxtUUFtRWYsV0FBVyxhQUNDLHlCQUF5QjsyR0FwRXBDLGNBQWMsY0FERixNQUFNOzsyRkFDbEIsY0FBYztrQkFEMUIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUUsV0FBVyxDQUFFLEVBQUM7OzBCQWtFbEQsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q3J5cHRvU2VydmljZSwgS2V5cGFpcn0gZnJvbSAnLi9jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQge0RlcGFydG1lbnR9IGZyb20gJy4vbW9kZWwvZGVwYXJ0bWVudC5tb2RlbCc7XG5pbXBvcnQge0FjY291bnQsIEFjY291bnRVdGlscywgVXNlclNldHRpbmdzfSBmcm9tICcuL21vZGVsL2FjY291bnQubW9kZWwnO1xuaW1wb3J0IHtQZXJzb24sIFBlcnNvblV0aWxzLCBVc2VyUHJvZmlsZUxhYmVsfSBmcm9tICcuL21vZGVsL3BlcnNvbi5tb2RlbCc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3MsIFVzYWdlTW9kZX0gZnJvbSAnLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmV0Y2hQb2xpY3ksIGdxbH0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0Bpb25pYy9zdG9yYWdlLWFuZ3VsYXInO1xuXG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsLCBzbGVlcCwgdG9OdW1iZXJ9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtCYXNlR3JhcGhxbFNlcnZpY2V9IGZyb20gJy4vYmFzZS1ncmFwaHFsLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtFcnJvckNvZGVzLCBTZXJ2ZXJFcnJvckNvZGVzfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge0dyYXBocWxTZXJ2aWNlfSBmcm9tICcuLi9ncmFwaHFsL2dyYXBocWwuc2VydmljZSc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtGb3JtRmllbGREZWZpbml0aW9uLCBGb3JtRmllbGREZWZpbml0aW9uTWFwfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhUb2tlblR5cGUgfSBmcm9tICcuL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgRmlsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTUlOSUZZX0VOVElUWV9GT1JfUE9ELCBSZWZlcmVudGlhbCwgUmVmZXJlbnRpYWxVdGlscyB9IGZyb20gJy4vbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHsgU3RhdHVzSWRzIH0gZnJvbSAnLi9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCB7IEJhc2U1OCB9IGZyb20gJy4vYmFzZTU4JztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBmcm9tRGF0ZUlTT1N0cmluZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQgeyBmaXJzdE5vdE5pbFByb21pc2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtCYXNlRW50aXR5R3JhcGhxbE11dGF0aW9ucywgQmFzZUVudGl0eUdyYXBocWxTdWJzY3JpcHRpb25zfSBmcm9tICcuL2Jhc2UtZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtNb21lbnR9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQge092ZXJsYXlFdmVudERldGFpbH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHtUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1Rva2VuU2NvcGUsIFVzZXJUb2tlbn0gZnJvbSAnLi9tb2RlbC90b2tlbi5tb2RlbCc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBY2NvdW50RGV0YWlscyB7XG4gIGxvYWRlZDogYm9vbGVhbjtcbiAga2V5cGFpcjogS2V5cGFpcjtcbiAgYXV0aFRva2VuOiBzdHJpbmc7XG4gIGF1dGhCYXNpYz86IHN0cmluZztcbiAgcHVia2V5OiBzdHJpbmc7XG4gIHBlcnNvbjogUGVyc29uO1xuICBkZXBhcnRtZW50OiBEZXBhcnRtZW50O1xuICBtYWluUHJvZmlsZTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdXRoRGF0YSB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIG9mZmxpbmU/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRhdGEgZXh0ZW5kcyBBdXRoRGF0YSB7XG4gIGFjY291bnQ6IEFjY291bnQ7XG59XG5cbmNvbnN0IFRPS0VOX1NUT1JBR0VfS0VZID0gJ3Rva2VuJztcbmNvbnN0IFBVQktFWV9TVE9SQUdFX0tFWSA9ICdwdWJrZXknO1xuY29uc3QgU0VDS0VZX1NUT1JBR0VfS0VZID0gJ3NlY2tleSc7XG5jb25zdCBBQ0NPVU5UX1NUT1JBR0VfS0VZID0gJ2FjY291bnQnO1xuXG5jb25zdCBERUZBVUxUX0FWQVRBUl9JTUFHRSA9ICdhc3NldHMvaW1nL3BlcnNvbi5wbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXR0aW5nc09wdGlvbnMge1xuICBvcHRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uTWFwO1xufVxuZXhwb3J0IGNvbnN0IEFQUF9VU0VSX1NFVFRJTkdTX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VXNlclNldHRpbmdzT3B0aW9ucz4oJ1VzZXJTZXR0aW5nc09wdGlvbnMnKTtcbmV4cG9ydCBjb25zdCBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VG9rZW5TY29wZVtdPignVXNlclRva2VuU2NvcGVzJyk7XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4jICAgICAgdXNlcm5hbWVcbiMgICAgICB1c2VybmFtZUV4dHJhbmV0XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgICB9XG4gICAgICB0b2tlbnMge1xuICAgICAgICAuLi5Vc2VyVG9rZW5GcmFnbWVudFxuICAgICAgfVxuICAgICAgZGVwYXJ0bWVudCB7XG4gICAgICAgIGlkXG4gICAgICAgIGxhYmVsXG4gICAgICAgIG5hbWVcbiAgICAgICAgX190eXBlbmFtZVxuICAgICAgfVxuICAgICAgX190eXBlbmFtZVxuICAgIH1gLFxuXG4gIHNldHRpbmdzOiBncWxgZnJhZ21lbnQgVXNlclNldHRpbmdzRnJhZ21lbnQgb24gVXNlclNldHRpbmdzVk8ge1xuICAgIGlkXG4gICAgbG9jYWxlXG4gICAgbGF0TG9uZ0Zvcm1hdFxuICAgIGNvbnRlbnRcbiAgICBub25jZVxuICAgIHVwZGF0ZURhdGVcbiAgICBfX3R5cGVuYW1lXG4gIH1gLFxuXG4gIHRva2VuOiBncWxgZnJhZ21lbnQgVXNlclRva2VuRnJhZ21lbnQgb24gVXNlclRva2VuVk8ge1xuICAgIGlkXG4gICAgcHVia2V5XG4gICAgdG9rZW5cbiAgICBuYW1lXG4gICAgZmxhZ3NcbiAgICBleHBpcmF0aW9uRGF0ZVxuICAgIGxhc3RVc2VkRGF0ZVxuICAgIGNyZWF0aW9uRGF0ZVxuICAgIHVwZGF0ZURhdGVcbiAgICBfX3R5cGVuYW1lXG4gIH1gXG59O1xuXG4vLyBMb2FkIGFjY291bnQgcXVlcnlcbmNvbnN0IExvYWRRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBY2NvdW50IHtcbiAgICBkYXRhOiBhY2NvdW50IHtcbiAgICAgIC4uLkFjY291bnRGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5hY2NvdW50fVxuICAke0ZyYWdtZW50cy5zZXR0aW5nc31cbiAgJHtGcmFnbWVudHMudG9rZW59XG5gO1xuXG4vLyBDaGVjayBlbWFpbCBxdWVyeVxuY29uc3QgSXNFbWFpbEV4aXN0c1F1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IElzRW1haWxFeGlzdHMoJGVtYWlsOiBTdHJpbmcsICRoYXNoOiBTdHJpbmcpe1xuICAgIGlzRW1haWxFeGlzdHMoZW1haWw6ICRlbWFpbCwgaGFzaDogJGhhc2gpXG4gIH1cbmA7XG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSXNFbWFpbEV4aXN0c1ZhcmlhYmxlcyB7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGhhc2g6IHN0cmluZztcbn1cblxuLy8gU2F2ZSAoY3JlYXRlIG9yIHVwZGF0ZSkgYWNjb3VudCBtdXRhdGlvblxuY29uc3QgQWNjb3VudE11dGF0aW9uczogUGFydGlhbDxCYXNlRW50aXR5R3JhcGhxbE11dGF0aW9ucz4gJiB7IGNyZWF0ZTogYW55OyBzYXZlU2V0dGluZ3M6IGFueSB9ID0ge1xuICBzYXZlOiBncWxgIG11dGF0aW9uIFNhdmVBY2NvdW50KCRkYXRhOkFjY291bnRWT0lucHV0KXtcbiAgICBkYXRhOiBzYXZlQWNjb3VudChhY2NvdW50OiAkZGF0YSl7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICB9XG4gIH1cbiAgJHtGcmFnbWVudHMuYWNjb3VudH1cbiAgJHtGcmFnbWVudHMudG9rZW59XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICBgLFxuXG4gIGNyZWF0ZTogZ3FsYG11dGF0aW9uIENyZWF0ZUFjY291bnQoJGRhdGE6QWNjb3VudFZPSW5wdXQpe1xuICAgIGRhdGE6IGNyZWF0ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICAke0ZyYWdtZW50cy50b2tlbn1cbiAgYCxcblxuICBzYXZlU2V0dGluZ3M6IGdxbGBtdXRhdGlvbiBTYXZlU2V0dGluZ3MoJGRhdGE6VXNlclNldHRpbmdzVk9JbnB1dCl7XG4gICAgZGF0YTogc2F2ZVNldHRpbmdzKHNldHRpbmdzOiAkZGF0YSl7XG4gICAgICAuLi5Vc2VyU2V0dGluZ3NGcmFnbWVudFxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5zZXR0aW5nc31gXG59O1xuXG4vLyBTZW50IGNvbmZpcm1hdGlvbiBlbWFpbFxuY29uc3QgU2VuZENvbmZpcm1FbWFpbE11dGF0aW9uOiBhbnkgPSBncWxgXG4gIG11dGF0aW9uIHNlbmRBY2NvdW50Q29uZmlybWF0aW9uRW1haWwoJGVtYWlsOlN0cmluZywgJGxvY2FsZTpTdHJpbmcpe1xuICAgIHNlbmRBY2NvdW50Q29uZmlybWF0aW9uRW1haWwoZW1haWw6ICRlbWFpbCwgbG9jYWxlOiAkbG9jYWxlKVxuICB9XG5gO1xuXG4vLyBDb25maXJtIGFjY291bnQgZW1haWxcbmNvbnN0IENvbmZpcm1FbWFpbE11dGF0aW9uOiBhbnkgPSBncWxgXG4gIG11dGF0aW9uIGNvbmZpcm1BY2NvdW50RW1haWwoJGVtYWlsOlN0cmluZywgJGNvZGU6U3RyaW5nKXtcbiAgICBjb25maXJtQWNjb3VudEVtYWlsKGVtYWlsOiAkZW1haWwsIGNvZGU6ICRjb2RlKVxuICB9XG5gO1xuXG4vLyBBdXRoZW50aWNhdGlvbiAgcXVlcnlcbmNvbnN0IEF1dGhRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoKCR0b2tlbjogU3RyaW5nKXtcbiAgICBhdXRoZW50aWNhdGUodG9rZW46ICR0b2tlbilcbiAgfVxuYDtcblxuLy8gTmV3IGF1dGggY2hhbGxlbmdlIHF1ZXJ5XG5jb25zdCBBdXRoQ2hhbGxlbmdlUXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgQXV0aENoYWxsZW5nZXtcbiAgICBhdXRoQ2hhbGxlbmdle1xuICAgICAgY2hhbGxlbmdlXG4gICAgICBwdWJrZXlcbiAgICAgIHNpZ25hdHVyZVxuICAgIH1cbiAgfVxuYDtcblxuaW50ZXJmYWNlIElBdXRoQ2hhbGxlbmdlIHtcbiAgcHVia2V5OiBzdHJpbmc7XG4gIGNoYWxsZW5nZTogc3RyaW5nO1xuICBzaWduYXR1cmU6IHN0cmluZztcbn1cblxuY29uc3QgQWNjb3VudFN1YnNjcmlwdGlvbnM6IEJhc2VFbnRpdHlHcmFwaHFsU3Vic2NyaXB0aW9ucyA9IHtcbiAgbGlzdGVuQ2hhbmdlczogZ3FsYHN1YnNjcmlwdGlvbiB1cGRhdGVBY2NvdW50KCRpbnRlcnZhbDogSW50KXtcbiAgICBkYXRhOiB1cGRhdGVBY2NvdW50KGludGVydmFsOiAkaW50ZXJ2YWwpIHtcbiAgICAgIGlkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgfVxuICB9YFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50V2F0Y2hPcHRpb25zIHtcbiAgaW50ZXJ2YWxJblNlY29uZHM/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCcsIGRlcHM6IFsgRU5WSVJPTk1FTlQgXX0pXG5leHBvcnQgY2xhc3MgQWNjb3VudFNlcnZpY2UgZXh0ZW5kcyBCYXNlR3JhcGhxbFNlcnZpY2U8QWNjb3VudCwgYW55LCBudW1iZXIsIEFjY291bnQ+IHtcblxuICBvbkxvZ2luID0gbmV3IFN1YmplY3Q8QWNjb3VudD4oKTtcbiAgb25Mb2dvdXQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBvbkNoYW5nZSA9IG5ldyBTdWJqZWN0PEFjY291bnQ+KCk7XG4gIG9uQXV0aFRva2VuQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIG9uQXV0aEJhc2ljQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSBfbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZW5hYmxlTGlzdGVuQ2hhbmdlczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBfbGlzdGVuSW50ZXJ2YWxJblNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfY2FjaGU6IEFjY291bnREZXRhaWxzID0ge1xuICAgIGxvYWRlZDogZmFsc2UsXG4gICAga2V5cGFpcjogbnVsbCxcbiAgICBhdXRoVG9rZW46IG51bGwsXG4gICAgYXV0aEJhc2ljOiBudWxsLFxuICAgIHB1YmtleTogbnVsbCxcbiAgICBtYWluUHJvZmlsZTogbnVsbCxcbiAgICBwZXJzb246IG51bGwsXG4gICAgZGVwYXJ0bWVudDogbnVsbFxuICB9O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25EZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIHByaXZhdGUgXyRhZGRpdGlvbmFsRmllbGRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb3JtRmllbGREZWZpbml0aW9uW10+KFtdKTtcbiAgcHJpdmF0ZSBfdG9rZW5UeXBlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFRva2VuVHlwZT4odW5kZWZpbmVkKTtcblxuICBnZXQgYWNjb3VudCgpOiBBY2NvdW50IHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGUubG9hZGVkID8gdGhpcy5fZGF0YSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBwZXJzb24oKTogUGVyc29uIHtcbiAgICBpZiAodGhpcy5fY2FjaGUubG9hZGVkICYmICF0aGlzLl9jYWNoZS5wZXJzb24pIHtcbiAgICAgIHRoaXMuX2NhY2hlLnBlcnNvbiA9IHRoaXMuX2NhY2hlLmxvYWRlZCA/IHRoaXMuX2RhdGEuYXNQZXJzb24oKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLnBlcnNvbjtcbiAgfVxuXG4gIGdldCBkZXBhcnRtZW50KCk6IERlcGFydG1lbnQge1xuICAgIGlmICh0aGlzLl9jYWNoZS5sb2FkZWQgJiYgIXRoaXMuX2NhY2hlLmRlcGFydG1lbnQpIHtcbiAgICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSB0aGlzLl9jYWNoZS5sb2FkZWQgPyB0aGlzLl9kYXRhLmFzUGVyc29uKCkuZGVwYXJ0bWVudCA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQ7XG4gIH1cblxuICBnZXQgdG9rZW5UeXBlKCk6IEF1dGhUb2tlblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90b2tlblR5cGUkLnZhbHVlO1xuICB9XG5cbiAgc2V0IHRva2VuVHlwZSh2YWx1ZTogQXV0aFRva2VuVHlwZSkge1xuICAgIGlmICh0aGlzLl90b2tlblR5cGUkLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gVXNpbmcgYXV0aGVudGljYXRpb24gdG9rZW4gdHlwZTogJyArIHZhbHVlKTtcbiAgICAgIHRoaXMuX3Rva2VuVHlwZSQubmV4dCh2YWx1ZSk7XG4gICAgICAvLyBSZXNldCB2YWx1ZXNcbiAgICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBncmFwaHFsOiBHcmFwaHFsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlLFxuICAgIHByb3RlY3RlZCBmaWxlOiBGaWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9TRVRUSU5HU19PUFRJT05TKSBvcHRpb25zOiBVc2VyU2V0dGluZ3NPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKGdyYXBocWwsIGVudmlyb25tZW50KTtcbiAgICB0aGlzLl9lbmFibGVMaXN0ZW5DaGFuZ2VzID0gKCFlbnZpcm9ubWVudC5hY2NvdW50IHx8IGVudmlyb25tZW50LmFjY291bnQuZW5hYmxlTGlzdGVuQ2hhbmdlcyAhPT0gZmFsc2UpOyAvLyBUcnVlIGJ5IGRlZmF1bHRcbiAgICB0aGlzLl9saXN0ZW5JbnRlcnZhbEluU2Vjb25kcyA9IHRvTnVtYmVyKGVudmlyb25tZW50LmFjY291bnQgJiYgZW52aXJvbm1lbnQuYWNjb3VudC5saXN0ZW5JbnRlcnZhbEluU2Vjb25kcywgMCk7IC8vIG5vIHRpbWVyIGJ5IGRlZmF1bHRcblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudC1zZXJ2aWNlXSBDcmVhdGluZyBzZXJ2aWNlJyk7XG4gICAgdGhpcy5fb3B0aW9uRGVmcyA9IE9iamVjdC52YWx1ZXMob3B0aW9ucz8ub3B0aW9ucyB8fCB7fSk7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgLy8gU2VuZCBhdXRoIHRva2VuIHRvIHRoZSBncmFwaHFsIGxheWVyLCB3aGVuIGNoYW5nZWRcbiAgICB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLnN1YnNjcmliZSgodG9rZW4pID0+IHRoaXMuZ3JhcGhxbC5zZXRBdXRoVG9rZW4odG9rZW4pKTtcbiAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLnN1YnNjcmliZSgoYmFzaWMpID0+IHRoaXMuZ3JhcGhxbC5zZXRBdXRoQmFzaWMoYmFzaWMpKTtcblxuICAgIC8vIEZvcmNlIG5ldHdvcmsgdG8gd2FpdCBhY2NvdW50IHNlcnZpY2UsIGFmdGVyIGdldHRpbmcgY29ubmVjdGlvbiB0byB0aGUgcGVlclxuICAgIHRoaXMubmV0d29yay5vbignYmVmb3JlVHJ5T25saW5lRmluaXNoJywgYXN5bmMgKG9ubGluZSkgPT4ge1xuICAgICAgLy8gSWYgb25saW5lLCB3YWl0IGEgZnVsbCByZXN0YXJ0LCBiZWNhdXNlIGl0IGNhbiBmb3JjZSBvZmZsaW5lIG1vZGVcbiAgICAgIGlmIChvbmxpbmUgJiYgKCF0aGlzLnN0YXJ0ZWQgfHwgdGhpcy5pc0xvZ2luKCkpKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBGb3JjZSBuZXR3b3JrU2VydmljZS50cnlPbmxpbmUoKSB0byB3YWl0LCB0aGF0IGdyYXBocWwgYW5kIGFjY291bnQgc2VydmljZSBpcyByZXN0YXJ0ZWQuLi4nKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoNTAwKTsgLy8gd2FpdCBncmFwaHFsIHNlcnZpY2UgdG8gYmUgcmVzdGFydGVkXG4gICAgICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuXG4gIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPEFjY291bnQ+IHtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKSxcbiAgICAgIC8vIFdhaXQgdG9rZW4gdHlwZSB0byBiZSBzZXRcbiAgICAgIGZpcnN0Tm90TmlsUHJvbWlzZSh0aGlzLl90b2tlblR5cGUkKVxuICAgIF0pO1xuXG4gICAgLy8gTGlzdGVuIGdyYXBocWwgc3RhcnQgKG9yIHJlc3RhcnQpXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZ3JhcGhxbC5zdG9wU3ViamVjdC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGFydGVkICYmIHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFJlc3RhcnRpbmcsIHRvIHJldHJ5IHRvIGF1dGhlbnRpY2F0ZS4uLicpO1xuICAgICAgICAgIHRoaXMucmVzdGFydCgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVMb2NhbGx5KCk7XG4gICAgYXdhaXQgdGhpcy5saXN0ZW5TZXR0aW5ncygpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGFkQXV0aFRva2VuID0gdGhpcy5fY2FjaGUuYXV0aFRva2VuICYmIHRydWU7XG4gICAgY29uc3QgaGFkQXV0aEJhc2ljID0gdGhpcy5fY2FjaGUuYXV0aEJhc2ljICYmIHRydWU7XG4gICAgY29uc3QgaGFkQXV0aCA9IGhhZEF1dGhUb2tlbiB8fCBoYWRBdXRoQmFzaWM7XG4gICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICBpZiAoaGFkQXV0aCkge1xuICAgICAgdGhpcy5vbkxvZ291dC5uZXh0KCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYWRBdXRoVG9rZW4pIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhZEF1dGhCYXNpYykgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgaXNMb2dpbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5fY2FjaGUucHVia2V5ICYmIHRoaXMuX2NhY2hlLmxvYWRlZCk7XG4gIH1cblxuICBpc0F1dGgoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2NhY2hlLnB1YmtleSAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyICYmIHRoaXMuX2NhY2hlLmtleXBhaXIuc2VjcmV0S2V5KTtcbiAgfVxuXG4gIGhhc01pblByb2ZpbGUodXNlclByb2ZpbGU6IFVzZXJQcm9maWxlTGFiZWwpOiBib29sZWFuIHtcbiAgICAvLyBzaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFIG9yIFRFTVBPUkFSWVxuICAgIGlmICghdGhpcy5fZGF0YSB8fCAhdGhpcy5fZGF0YS5wdWJrZXkgfHxcbiAgICAgICh0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFICYmIHRoaXMuX2RhdGEuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLl9kYXRhLnByb2ZpbGVzLCB1c2VyUHJvZmlsZSk7XG4gIH1cblxuICBoYXNFeGFjdFByb2ZpbGUobGFiZWw6IFVzZXJQcm9maWxlTGFiZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQWNjb3VudFV0aWxzLmhhc0V4YWN0UHJvZmlsZSh0aGlzLl9kYXRhLCBsYWJlbCk7XG4gIH1cblxuICBoYXNQcm9maWxlQW5kSXNFbmFibGUodXNlclByb2ZpbGU6IFVzZXJQcm9maWxlTGFiZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQWNjb3VudFV0aWxzLmhhc1Byb2ZpbGVBbmRJc0VuYWJsZSh0aGlzLl9kYXRhLCB1c2VyUHJvZmlsZSk7XG4gIH1cblxuICBpc0FkbWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1Byb2ZpbGVBbmRJc0VuYWJsZSgnQURNSU4nKTtcbiAgfVxuXG4gIGlzU3VwZXJ2aXNvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ1NVUEVSVklTT1InKTtcbiAgfVxuXG4gIGlzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ1VTRVInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAcGFyYW0gbW9kZVxuICAgKi9cbiAgaXNVc2FnZU1vZGUobW9kZTogVXNhZ2VNb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaXNVc2FnZU1vZGUobW9kZSk7XG4gIH1cblxuICBpc09ubHlHdWVzdCgpOiBib29sZWFuIHtcbiAgICAvLyBTaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFIG9yIFRFTVBPUkFSWVxuICAgIGlmICghdGhpcy5fZGF0YSB8fCAhdGhpcy5fZGF0YS5wdWJrZXkgfHxcbiAgICAgICh0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFICYmIHRoaXMuX2RhdGEuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5URU1QT1JBUlkpKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFByb2ZpbGUgbGVzcyB0aGVuIHVzZXJcbiAgICByZXR1cm4gIVBlcnNvblV0aWxzLmhhc1VwcGVyT3JFcXVhbHNQcm9maWxlKHRoaXMuX2RhdGEucHJvZmlsZXMsICdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlY29yZGVyRGVwYXJ0bWVudFxuICAgKiBAZGVwcmVjYXRlZCB1c2UgUHJvZ3JhbVJlZlNlcnZpY2UuY2FuVXNlcldyaXRlRW50aXR5KCkgaW5zdGVhZFxuICAgKi9cbiAgY2FuVXNlcldyaXRlRGF0YUZvckRlcGFydG1lbnQocmVjb3JkZXJEZXBhcnRtZW50OiBSZWZlcmVudGlhbCB8IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChSZWZlcmVudGlhbFV0aWxzLmlzRW1wdHkocmVjb3JkZXJEZXBhcnRtZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNBZG1pbigpO1xuICAgIH1cblxuICAgIC8vIFNob3VsZCBiZSBsb2dpbiwgYW5kIHN0YXR1cyBFTkFCTEVcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8IHRoaXMuX2RhdGEuc3RhdHVzSWQgIT09IFN0YXR1c0lkcy5FTkFCTEUpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICghdGhpcy5fZGF0YS5kZXBhcnRtZW50IHx8ICF0aGlzLl9kYXRhLmRlcGFydG1lbnQuaWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignVXNlciBhY2NvdW50IGhhcyBubyBkZXBhcnRtZW50ICEgVW5hYmxlIHRvIGNoZWNrIHdyaXRlIHJpZ2h0IGFnYWluc3QgcmVjb3JkZXJEZXBhcnRtZW50Jyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2FtZSByZWNvcmRlciBkZXBhcnRtZW50OiBPSywgdXNlciBjYW4gd3JpdGVcbiAgICBpZiAodGhpcy5fZGF0YS5kZXBhcnRtZW50LmlkID09PSByZWNvcmRlckRlcGFydG1lbnQuaWQpIHJldHVybiB0cnVlO1xuXG4gICAgLy8gQ2Fubm90IHdyaXRlXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgcmVnaXN0ZXIoZGF0YTogUmVnaXN0ZXJEYXRhKTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgYWxyZWFkeSBsb2dpbi4gUGxlYXNlIGxvZ291dCBiZWZvcmUgcmVnaXN0ZXIuJyk7XG4gICAgfVxuICAgIGlmICghZGF0YS51c2VybmFtZSB8fCAhZGF0YS5wYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHVzZXJuYW1lIG9yIHBhc3N3b3JkJyk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBSZWdpc3RlciBuZXcgdXNlciBhY2NvdW50Li4uJywgZGF0YS5hY2NvdW50KTtcbiAgICB0aGlzLl9jYWNoZS5sb2FkZWQgPSBmYWxzZTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBhd2FpdCBDcnlwdG9TZXJ2aWNlLnNjcnlwdEtleXBhaXIoZGF0YS51c2VybmFtZSwgZGF0YS5wYXNzd29yZCk7XG4gICAgICBkYXRhLmFjY291bnQucHVia2V5ID0gQmFzZTU4LmVuY29kZShrZXlwYWlyLnB1YmxpY0tleSk7XG5cbiAgICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MgPSBkYXRhLmFjY291bnQuc2V0dGluZ3MgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmxvY2FsZSA9IHRoaXMuc2V0dGluZ3MubG9jYWxlO1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmxhdExvbmdGb3JtYXQgPSB0aGlzLnNldHRpbmdzLmxhdExvbmdGb3JtYXQ7XG4gICAgICBkYXRhLmFjY291bnQuc2V0dGluZ3MuY29udGVudCA9IGRhdGEuYWNjb3VudC5zZXR0aW5ncy5jb250ZW50IHx8IHt9O1xuICAgICAgZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQgPSBkYXRhLmFjY291bnQuZGVwYXJ0bWVudC5pZCB8fCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHREZXBhcnRtZW50SWQ7XG5cbiAgICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPSBrZXlwYWlyO1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IHRoaXMuc2F2ZVJlbW90ZWx5KGRhdGEuYWNjb3VudCwga2V5cGFpcik7XG5cbiAgICAgIC8vIERlZmF1bHQgdmFsdWVzXG4gICAgICBhY2NvdW50LmF2YXRhciA9IGFjY291bnQuYXZhdGFyIHx8ICh0aGlzLmVudmlyb25tZW50LmJhc2VVcmwgKyBERUZBVUxUX0FWQVRBUl9JTUFHRSk7XG4gICAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IGFjY291bnQucHVia2V5O1xuXG4gICAgICAvLyBUcnkgdG8gYXV0aCBvbiBwb2RcbiAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKGRhdGEpO1xuXG4gICAgICB0aGlzLl9jYWNoZS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICAgIC8vIExpc3RlbiByZW1vdGUgY2hhbmdlc1xuICAgICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IgJiYgZXJyb3IubWVzc2FnZSB8fCBlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKGRhdGE/OiBBdXRoRGF0YSkge1xuICAgIC8vIFdhaXQgdGhlIGF1dGggdG9rZW4sIHRoZW4gY29udGludWVcbiAgICBjb25zdCB0b2tlblR5cGUgPSBhd2FpdCBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJCk7XG5cbiAgICAvLyBCYXNpYyBhdXRoXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ2Jhc2ljJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG5cbiAgICAgIC8vIEdlbmVyYXRlIHRoZSBhdXRoQmFzaWMsIGlmIHVzZWRcbiAgICAgIGlmICghdGhpcy5fY2FjaGUuYXV0aEJhc2ljKSB7XG4gICAgICAgIC8vIFNraXAgaWYgdG9rZW4gYWxyZWFkeSBwcm92aWRlZFxuICAgICAgICBpZiAoISh0aGlzLl9jYWNoZS5hdXRoVG9rZW4gJiYgdG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykpIHtcbiAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB1c2VybmFtZSBhbmQgcGFzc3dvcmQnKTtcbiAgICAgICAgICB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgPSBDcnlwdG9TZXJ2aWNlLmVuY29kZUJhc2U2NChgJHtkYXRhLnVzZXJuYW1lfToke2RhdGEucGFzc3dvcmR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh0aGlzLl9jYWNoZS5hdXRoQmFzaWMpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHRoZSBhdXRoVG9rZW4sIGlmIHVzZWRcbiAgICBpZiAodG9rZW5UeXBlID09PSAndG9rZW4nIHx8IHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4odGhpcy5fY2FjaGUuYXV0aFRva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE5ldmVyIGF1dGhlbnRpY2F0ZSwgb3Igbm90IHJlYWR5IGZvciBvZmZsaW5lIG1vZGUgPT4gZXhpdFxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yZ2V0IGF1dGhCYXNpYywgdG8gc3dpdGNoIHRvIGF1dGhUb2tlblxuICAgIGlmICh0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2dpbihkYXRhOiBBdXRoRGF0YSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghZGF0YSB8fCAhZGF0YS51c2VybmFtZSB8fCAhZGF0YS5wYXNzd29yZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHVzZXJuYW1lIG9yIHBhc3N3b3JkJyk7XG5cbiAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gTG9naW4uLi4nKTtcblxuICAgIGxldCBrZXlwYWlyO1xuICAgIHRyeSB7XG4gICAgICBrZXlwYWlyID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zY3J5cHRLZXlwYWlyKGRhdGEudXNlcm5hbWUsIGRhdGEucGFzc3dvcmQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9FUlJPUiwgbWVzc2FnZTogJ0VSUk9SLlNDUllQVF9FUlJPUicgfTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBwdWJrZXkra2V5cGFpclxuICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IEJhc2U1OC5lbmNvZGUoa2V5cGFpci5wdWJsaWNLZXkpO1xuICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPSBrZXlwYWlyO1xuXG4gICAgLy8gVHJ5IHRvIGxvYWQgcHJldmlvdXMgdG9rZW5cbiAgICBsZXQgcHJldmlvdXNUb2tlbjogc3RyaW5nID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChUT0tFTl9TVE9SQUdFX0tFWSk7XG4gICAgcHJldmlvdXNUb2tlbiA9IHByZXZpb3VzVG9rZW4gJiYgcHJldmlvdXNUb2tlbi5zdGFydHNXaXRoKHRoaXMuX2NhY2hlLnB1YmtleSkgJiYgcHJldmlvdXNUb2tlbiB8fCBudWxsO1xuXG4gICAgLy8gT2ZmbGluZSBtb2RlXG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSAmJiAodGhpcy5uZXR3b3JrLm9mZmxpbmUgfHwgZGF0YS5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkgIHtcbiAgICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHByZXZpb3VzVG9rZW47XG5cbiAgICAgIC8vIE1ha2Ugc3VyZSBuZXR3b3JrIGlmIHNldCBhcyBvZmZsaW5lXG4gICAgICB0aGlzLm5ldHdvcmsuc2V0Rm9yY2VPZmZsaW5lKHRydWUsIHtzaG93VG9hc3Q6IGZhbHNlfSk7XG4gICAgICBjb25zb2xlLmluZm8oYFthY2NvdW50XSBMb2dpbiBbT0tdIHtwdWJrZXk6ICR7dGhpcy5fY2FjaGUucHVia2V5LnN1YnN0cigwLCA4KX19LCB7b2ZmbGluZTogdHJ1ZX1gKTtcbiAgICB9XG5cbiAgICAvLyBPbmxpbmUgbW9kZTogdHJ5IHRvIGF1dGggb24gcG9kXG4gICAgZWxzZSB7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV2ZXIgYXV0aGVudGljYXRlLCBvciBub3QgcmVhZHkgZm9yIG9mZmxpbmUgbW9kZSA9PiBleGl0XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIGFjY291bnQgZGF0YVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWREYXRhKHtvZmZsaW5lLCBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seSd9KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgLy8gSWYgYWNjb3VudCBub3QgZm91bmQsIGNoZWNrIGlmIGVtYWlsIGlzIHZhbGlkXG4gICAgICBpZiAoZXJyICYmICsoZXJyLmNvZGUpID09PSBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUikge1xuXG4gICAgICAgIC8vIENoZWNrIGVtYWlsIGV4aXN0c1xuICAgICAgICBpZiAoZGF0YS51c2VybmFtZS5pbmRleE9mKCdAJykgIT09IC0xKSB7XG4gICAgICAgICAgbGV0IGlzRW1haWxFeGlzdHM7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlzRW1haWxFeGlzdHMgPSBhd2FpdCB0aGlzLmlzRW1haWxFeGlzdHMoZGF0YS51c2VybmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCAob3RoZXJFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgZXJyOyAvLyByZXNlbmQgdGhlIGZpcnN0IGVycm9yXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW1haWwgbm90IGV4aXN0cyAobm8gYWNjb3VudClcbiAgICAgICAgICBpZiAoIWlzRW1haWxFeGlzdHMpIHtcbiAgICAgICAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5VTktOT1dOX0FDQ09VTlRfRU1BSUwsIG1lc3NhZ2U6ICdFUlJPUi5VTktOT1dOX0FDQ09VTlRfRU1BSUwnIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1haWwgZXhpc3RzLCBzbyBlcnJvciA9ICdiYWQgcGFzc3dvcmQnXG4gICAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5CQURfUEFTU1dPUkQsIG1lc3NhZ2U6ICdFUlJPUi5CQURfUEFTU1dPUkQnIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBTdG9yZSB0byBsb2NhbCBzdG9yYWdlXG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBldmVudCB0byBvYnNlcnZlcnNcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhKTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICBpZiAodGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcykgdGhpcy5zdGFydExpc3RlblJlbW90ZUNoYW5nZXMoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgYXN5bmMgcmVsb2FkKG9wdHM/OiB7c2hvd1RvYXN0PzogYm9vbGVhbn0pOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNoZWNrIGFjY291bnQgaW4gb2ZmbGluZSBtb2RlJyk7XG5cbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBSZWxvYWRpbmcgYWNjb3VudC4uLmApO1xuICAgIGNvbnN0IHdhc0xvZ2luID0gdGhpcy5pc0xvZ2luKCk7XG5cbiAgICB0cnkge1xuXG4gICAgICBhd2FpdCB0aGlzLmxvYWREYXRhKCk7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBSZWxvYWRpbmcgYWNjb3VudCBbT0tdIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBFbWl0IGxvZ2luIGV2ZW50IHRvIHN1YnNjcmliZXJzXG4gICAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhKTtcbiAgICAgIHRoaXMub25DaGFuZ2UubmV4dCh0aGlzLl9kYXRhKTtcblxuICAgICAgLy8gRGlzcGxheSB0b2FzdCAod2l0aG91dCBhd2FpdCwgYmVjYXVzZSBub3QgbmVlZCB0byB3YWl0IHRvYXN0IGNsb3NlIGV2ZW50KVxuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuc2hvd1RvYXN0ICE9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0FDQ09VTlQuSU5GTy5SRUxPQURFRCcsIHR5cGU6ICdpbmZvJ30pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDYW5ub3QgcmVsb2FkIGJ1dCB3YXMgbG9naW46IGZvcmNlIHRvIGxvZ291dFxuICAgICAgaWYgKHdhc0xvZ2luICYmICF0aGlzLmlzTG9naW4oKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQgZmFpbGVkLiBXaWxsIGZvcmNlIGxvZ291dC4uLmAsIGVycm9yKTtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIHVwZGF0ZSBhbiB1c2VyIGFjY291bnQsIHRvIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudFxuICAgKi9cbiAgYXN5bmMgc2F2ZShhY2NvdW50OiBBY2NvdW50KTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHJldHVybiBQcm9taXNlLnJlamVjdCgnVXNlciBub3QgbG9nZ2VkJyk7XG4gICAgaWYgKHRoaXMuX2NhY2hlLnB1YmtleSAhPT0gYWNjb3VudC5wdWJrZXkpIHJldHVybiBQcm9taXNlLnJlamVjdCgnTm90IHVzZXIgYWNjb3VudCcpO1xuXG4gICAgYWNjb3VudCA9IGF3YWl0IHRoaXMuc2F2ZVJlbW90ZWx5KGFjY291bnQsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuXG4gICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gUGVyc29uVXRpbHMuZ2V0TWFpblByb2ZpbGUoYWNjb3VudC5wcm9maWxlcyk7XG5cbiAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICB0aGlzLl9jYWNoZS5sb2FkZWQgPSB0cnVlO1xuXG4gICAgLy8gU2F2ZSBsb2NhbGx5IChpbiBzdG9yYWdlKVxuICAgIGF3YWl0IHRoaXMuc2F2ZUxvY2FsbHkoKTtcblxuICAgIC8vIFNlbmQgZXZlbnRcbiAgICB0aGlzLm9uTG9naW4ubmV4dCh0aGlzLl9kYXRhKTtcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuX2NhY2hlLmF1dGhUb2tlbiAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGhCYXNpYyA9IHRoaXMuX2NhY2hlLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IHB1YmtleSA9IHRoaXMuX2NhY2hlICYmIHRoaXMuX2NhY2hlLnB1YmtleTtcblxuICAgIHRoaXMucmVzZXREYXRhKCk7XG5cbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKSkge1xuXG4gICAgICAvLyBSZW1vdmUgYWxsIGRhdGEgZnJvbSB0aGUgbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoVE9LRU5fU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKEFDQ09VTlRfU1RPUkFHRV9LRVkpLFxuICAgICAgICBwdWJrZXkgJiYgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZICsgJyMnICsgcHVia2V5KSB8fCBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShTRUNLRVlfU1RPUkFHRV9LRVkpXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBPZmZsaW5lIGZlYXR1cmVzIGVuYWJsZTogbmVlZCB0byBrZWVwIHNvbWUgZGF0YVxuICAgIGVsc2Uge1xuICAgICAgLy8gQWx3YXlzIHJlbW92ZSBvbmx5IHNlY3JldCBrZXlcbiAgICAgIC8vIEJ1dCBrZWVwOlxuICAgICAgLy8gLSBhY2NvdW50IGJ5IHB1YmtleVxuICAgICAgLy8gLSBhdXRoIHRva2VuXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoUFVCS0VZX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShTRUNLRVlfU1RPUkFHRV9LRVkpXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiBwYWdlIGhpc3RvcnksIGluIGxvY2FsIHNldHRpbmdzXG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5jbGVhclBhZ2VIaXN0b3J5KCk7XG5cbiAgICAvLyBOb3RpZnkgb2JzZXJ2ZXJzXG4gICAgdGhpcy5vbkxvZ291dC5uZXh0KCk7XG4gICAgaWYgKGhhZEF1dGhUb2tlbikgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgaWYgKGhhZEF1dGhCYXNpYykgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIGFjY291bnRcbiAgICpcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIGFzeW5jIGxvYWQob3B0cz86IHtcbiAgICBvZmZsaW5lPzogYm9vbGVhbjtcbiAgICBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5O1xuICB9KTogUHJvbWlzZTxBY2NvdW50IHwgdW5kZWZpbmVkPiB7XG5cbiAgICBjb25zdCBub3cgPSB0aGlzLl9kZWJ1ZyAmJiBEYXRlLm5vdygpO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIExvYWRpbmcgYWNjb3VudC4uLmApO1xuICAgIGxldCBqc29uOiBhbnk7XG5cbiAgICAvLyBMb2FkIGxvY2FsbHlcbiAgICBjb25zdCBvZmZsaW5lID0gdGhpcy5uZXR3b3JrLm9mZmxpbmVcbiAgICAgICYmICghb3B0cyB8fCAob3B0cy5mZXRjaFBvbGljeSAhPT0gJ25ldHdvcmstb25seScgJiYgb3B0cy5mZXRjaFBvbGljeSAhPT0gJ25vLWNhY2hlJykpXG4gICAgICB8fCAob3B0cyAmJiBvcHRzLm9mZmxpbmUgPT09IHRydWUpO1xuICAgIGlmIChvZmZsaW5lKSB7XG4gICAgICBqc29uID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChBQ0NPVU5UX1NUT1JBR0VfS0VZKTtcbiAgICAgIGpzb24gPSBqc29uICYmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbikgfHwganNvbjtcbiAgICAgIGpzb24gPSBqc29uICYmIHRoaXMuX2NhY2hlLnB1YmtleSAmJiAoanNvbi5wdWJrZXkgPT09IHRoaXMuX2NhY2hlLnB1YmtleSkgJiYganNvbiB8fCBudWxsO1xuICAgICAgaWYgKCFqc29uICYmIHRoaXMuX2NhY2hlLnB1YmtleSkge1xuICAgICAgICBqc29uID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChBQ0NPVU5UX1NUT1JBR0VfS0VZICsgJyMnICsgdGhpcy5fY2FjaGUucHVia2V5KTtcbiAgICAgICAganNvbiA9IGpzb24gJiYgKHR5cGVvZiBqc29uID09PSAnc3RyaW5nJykgJiYgSlNPTi5wYXJzZShqc29uKSB8fCBqc29uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgcmVtb3RlbHlcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHtkYXRhfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGRhdGE6IGFueSB9Pih7XG4gICAgICAgIHF1ZXJ5OiBMb2FkUXVlcnksXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyB9LFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduby1jYWNoZScgfHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGpzb24gPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCwgYWNjb3VudCk7XG4gICAgICAgcmV0dXJuIGFjY291bnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbYWNjb3VudF0gQWNjb3VudCBub3QgZm91bmQgIWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVRva2VuKGZsYWdzOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBHZW5lcmF0ZSB0b2tlbi4uLmApO1xuXG4gICAgY29uc3QgYXV0aENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZ2V0QXV0aENoYWxsZW5nZSgpO1xuICAgIC8vIEFkZCBGbGFncyB0byBjaGFsbGVuZ2VcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBgJHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX06JHtmbGFnc31gO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2lnbihjaGFsbGVuZ2UsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7dGhpcy5fY2FjaGUucHVia2V5fToke2NoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIGlmIChuZXdUb2tlbikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gVG9rZW4gZ2VuZXJhdGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFthY2NvdW50XSBUb2tlbiBnZW5lcmF0aW9uIGZhaWxlZCAhYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGF2YWlsYWJsZSBmb3IgbmV3IGFjY291bnQgcmVnaXN0cmF0aW9uLlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFbWFpbEF2YWlsYWJsZShlbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbWFpbEV4aXN0cyA9IGF3YWl0IHRoaXMuaXNFbWFpbEV4aXN0cyhlbWFpbCk7XG4gICAgaWYgKGlzRW1haWxFeGlzdHMpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQsIG1lc3NhZ2U6ICdFUlJPUi5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGV4aXN0cyBpbiBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgaXNFbWFpbEV4aXN0cyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBDaGVja2luZyBpZiB7JyArIGVtYWlsICsgJ30gZXhpc3RzLi4uJyk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgaXNFbWFpbEV4aXN0czogYm9vbGVhbiB9LCBJc0VtYWlsRXhpc3RzVmFyaWFibGVzPih7XG4gICAgICBxdWVyeTogSXNFbWFpbEV4aXN0c1F1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBoYXNoOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEVtYWlsIGV4aXN0OiAnICsgKGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzKSk7XG5cbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmlzRW1haWxFeGlzdHM7XG4gIH1cblxuICBhc3luYyBzZW5kQ29uZmlybWF0aW9uRW1haWwoZW1haWw6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybWF0aW9uIGVtYWlsIHRvIHsnICsgZW1haWwgKyAnfSB3aXRoIGxvY2FsZSB7JyArIGxvY2FsZSArICd9Li4uJyk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTxib29sZWFuPih7XG4gICAgICBtdXRhdGlvbjogU2VuZENvbmZpcm1FbWFpbE11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBsb2NhbGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNFTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNFTlRfQUNDT1VOVF9DT05GSVJNQVRJT05fRU1BSUxfRkFJTEVEJ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybUVtYWlsKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybSByZXF1ZXN0IGZvciBlbWFpbCB7JyArIGVtYWlsICsgJ30gd2l0aCBjb2RlIHsnICsgY29kZSArICd9Li4uJyk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgY29uZmlybUFjY291bnRFbWFpbDogYm9vbGVhbiB9Pih7XG4gICAgICBtdXRhdGlvbjogQ29uZmlybUVtYWlsTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNPTkZJUk1fRU1BSUxfRkFJTEVELFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQ09ORklSTV9BQ0NPVU5UX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzICYmIHJlcy5jb25maXJtQWNjb3VudEVtYWlsO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IFN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCk7IC8vIEFscmVhZHkgc3RhcnRlZDogc2tpcFxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKG9wdHMpO1xuICB9XG5cbiAgZ2V0IGFkZGl0aW9uYWxGaWVsZHMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCAkYWRkaXRpb25hbEZpZWxkcygpOiBPYnNlcnZhYmxlPEZvcm1GaWVsZERlZmluaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEFkZGl0aW9uYWxGaWVsZChrZXk6IHN0cmluZyk6IEZvcm1GaWVsZERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5nZXRWYWx1ZSgpLmZpbmQoZiA9PiBmLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWRkaXRpb25hbEZpZWxkKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgICBpZiAodmFsdWVzLmZpbmQoZiA9PiBmLmtleSA9PT0gZmllbGQua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFjY291bnQgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gRm91bmQgYWRkaXRpb25hbCBhY2NvdW50J3MgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fWApO1xuICAgIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLm5leHQodmFsdWVzLmNvbmNhdChmaWVsZCkpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbkRlZnMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRGVmcztcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKGRlZjogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGlmICh0aGlzLl9vcHRpb25EZWZzLmZpbmRJbmRleChmID0+IGYua2V5ID09PSBkZWYua2V5KSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19IGFscmVhZHkgZGVmaW5lLmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBZGRpbmcgYWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19YCwgZGVmKTtcbiAgICB0aGlzLl9vcHRpb25EZWZzLnB1c2goZGVmKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9ucyhkZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICAoZGVmcyB8fCBbXSkuZm9yRWFjaChkZWYgPT4gdGhpcy5yZWdpc3Rlck9wdGlvbihkZWYpKTtcbiAgfVxuXG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCByZXNldERhdGEoKSB7XG4gICAgdGhpcy5zdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wZXJzb24gPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQWNjb3VudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREYXRhKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgfSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IChhd2FpdCB0aGlzLmxvYWQob3B0cykpIHx8IG5ldyBBY2NvdW50KCk7XG5cbiAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgPSBhY2NvdW50LnNldHRpbmdzLmxvY2FsZSB8fCB0aGlzLnNldHRpbmdzLmxvY2FsZTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCA9IGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCB8fCB0aGlzLnNldHRpbmdzLmxhdExvbmdGb3JtYXQgfHwgJ0RETU0nO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50ID0gYWNjb3VudC5zZXR0aW5ncy5jb250ZW50IHx8IHt9O1xuXG4gICAgICAvLyBSZWFkIG1haW4gcHJvZmlsZVxuICAgICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgICAgLy8gVXBkYXRlLCBpbnN0ZWFkIG9mIHJlcGxhY2UgaXRcbiAgICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZnJvbU9iamVjdChhY2NvdW50KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIC8vIEFwcGx5IHNldHRpbmdzLCBmb3VuZCBpbiByZW1vdGUgYWNjb3VudFxuICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5hY2NvdW50LnNldHRpbmdzLmFzTG9jYWxTZXR0aW5ncygpXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoc2V0dGluZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgJiYgZXJyb3IubWVzc2FnZSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkxPQURfQUNDT1VOVF9FUlJPUidcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxpc3RlblNldHRpbmdzKCk6IFByb21pc2U8dm9pZD57XG4gICAgLy8gV2hlbiBzZXR0aW5ncyBjaGFuZ2VkOiBzYXZlIGl0IHJlbW90ZWx5XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmlzTG9naW4oKSAmJiB0aGlzLm5ldHdvcmsub25saW5lKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoc2V0dGluZ3MgPT4gdGhpcy5zYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLy8gUmVzdG9yZSBmcm9tIHN0b3JhZ2VcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgIHRoaXMuc3RvcmFnZS5nZXQoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgIF0pO1xuICAgIGxldCBwdWJrZXkgPSB2YWx1ZXNbMF07XG4gICAgbGV0IHRva2VuID0gdmFsdWVzWzFdO1xuICAgIGNvbnN0IHNlY2tleSA9IHZhbHVlc1syXTtcblxuICAgIC8vIERFViBvbmx5IC0gYXV0aCBieSB0b2tlblxuICAgIGlmICghdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uICYmIHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXM/LnRva2VuKSB7XG4gICAgICB0b2tlbiA9IHRva2VuIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXMudG9rZW47XG4gICAgICBwdWJrZXkgPSBwdWJrZXkgfHwgdG9rZW4/LnNwbGl0KCc6JywgMilbMF07XG4gICAgfVxuXG4gICAgLy8gUXVpdCBpZiBubyBwdWJrZXkgKG5vdCBsb2dnZWQpXG4gICAgaWYgKCFwdWJrZXkpIHJldHVybjtcblxuICAgIC8vIFF1aXQgaWYgY291bGQgbm90IGF1dGggb24gcG9kXG4gICAgY29uc3QgY2FuUmVtb3RlQXV0aCA9IHRva2VuIHx8IHNlY2tleSB8fCBmYWxzZTtcbiAgICBpZiAoIWNhblJlbW90ZUF1dGgpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24uLi5gKTtcblxuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IHB1YmtleTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0gc2Vja2V5ICYmIHtcbiAgICAgIHB1YmxpY0tleTogQmFzZTU4LmRlY29kZShwdWJrZXkpLFxuICAgICAgc2VjcmV0S2V5OiBCYXNlNTguZGVjb2RlKHNlY2tleSlcbiAgICB9IHx8IG51bGw7XG5cbiAgICAvLyBPbmxpbmUgbW9kZTogdHJ5IHRvIGNvbm5lY3QgdG8gcG9kXG4gICAgaWYgKHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUuYXV0aFRva2VuICYmICF0aGlzLl9jYWNoZS5hdXRoQmFzaWMpIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2ZmbGluZSBmZWF0dXJlIGFyZSBlbmFibGU6IGNvbnRpbnVlIGluIG9mZmxpbmUgbW9kZVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBvbiBwb2Q6IGZvcmNpbmcgb2ZmbGluZSBtb2RlJyk7XG4gICAgICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiBmYWxzZX0pO1xuICAgICAgICAgIC8vIENvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gb2ZmbGluZSBmZWF0dXJlcyBlbmFibGUgKD1vZmZsaW5lIG1vZGUgbm90IGFsbG93ZWQpXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQsIGZyb20gcHVia2V5XG4gICAgbGV0IGpzb25BY2NvdW50ID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3B1YmtleX1gKTtcbiAgICBpZiAoIWpzb25BY2NvdW50KSB7XG4gICAgICAvLyBUcnkgdXNpbmcgdGhlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgY29uc3QgYWNjb3VudFN0ciA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uQWNjb3VudCA9IGFjY291bnRTdHIgJiYgKCh0eXBlb2YgYWNjb3VudFN0ciA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbkFjY291bnQpIHx8IGFjY291bnRTdHIpO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgYWNjb3VudDogZG8gbm90IHVzZSBpdFxuICAgIGlmICghanNvbkFjY291bnQgfHwganNvbkFjY291bnQucHVia2V5ICE9PSBwdWJrZXkpIHtcblxuICAgICAgLy8gREVWIG9ubHk6IGNyZWF0ZSBhIGZha2UgYWNjb3VudCB3aXRoIGdpdmVuIHVzZXJuYW1lXG4gICAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiAmJiB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBdXRoVmFsdWVzLnVzZXJuYW1lKSB7XG4gICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcy51c2VybmFtZTtcbiAgICAgICAganNvbkFjY291bnQgPSB7cHVia2V5LCB1c2VybmFtZSwgZmlyc3ROYW1lOiB1c2VybmFtZSwgbGFzdE5hbWU6IHVzZXJuYW1lfTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHRvIGVudGl0eVxuICAgIGNvbnN0IGFjY291bnQgPSBBY2NvdW50LmZyb21PYmplY3QoanNvbkFjY291bnQpO1xuXG4gICAgLy8gVXBkYXRlIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlc3RvcmF0aW9uIFtPS10ge3B1YmtleTogJHtwdWJrZXkuc3Vic3RyKDAsIDgpfX0sIHtwcm9maWxlOiAke3RoaXMuX2NhY2hlLm1haW5Qcm9maWxlfX1gKTtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWNjb3VudCBpbnRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUxvY2FsbHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCB7JHt0aGlzLl9jYWNoZS5wdWJrZXkuc3Vic3RyaW5nKDAsIDYpfX0gaW4gbG9jYWwgc3RvcmFnZS4uLmApO1xuXG4gICAgLy8gQ29udmVydCBhY2NvdW50IHRvIGpzb25cbiAgICBjb25zdCBqc29uID0gdGhpcy5fZGF0YS5hc09iamVjdCh7a2VlcFR5cGVuYW1lOiB0cnVlfSk7XG4gICAgY29uc3Qgc2Vja2V5ID0gdGhpcy5fY2FjaGUua2V5cGFpciAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyLnNlY3JldEtleSAmJiBCYXNlNTguZW5jb2RlKHRoaXMuX2NhY2hlLmtleXBhaXIuc2VjcmV0S2V5KSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9IGpzb24uYXZhdGFyICYmICFqc29uLmF2YXRhci5lbmRzV2l0aChERUZBVUxUX0FWQVRBUl9JTUFHRSkgJiZcbiAgICAgIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgKGpzb24uYXZhdGFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKTtcbiAgICBpZiAoaGFzQXZhdGFyVXJsICYmIHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZS5nZXRJbWFnZShqc29uLmF2YXRhciwge1xuICAgICAgICB0aHVtYm5haWw6IHRydWUsXG4gICAgICAgIG91dHB1dFR5cGU6ICdkYXRhVXJsJ1xuICAgICAgfSlcbiAgICAgICAgLnRoZW4oZGF0YVVybCA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFVcmwgJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBJbWFnZSBmZXRjaGVkOiAnLCBkYXRhVXJsLnN1YnN0cmluZygwLCA1MCkpO1xuXG4gICAgICAgICAgLy8gVE9ETzogbWFrZSBzdXJlIHRvIGRpc3BsYXkgQmFzZTY0IGltYWdlIGluIHRoZSBtZW51IHRvcCBoZWFkZXJcbiAgICAgICAgICAvL2pzb25BY2NvdW50LmF2YXRhciA9IGRhdGFVcmw7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFthY2NvdW50XSBFcnJvciB3aGlsZSBmZXRjaGluZyBpbWFnZTogJHtqc29uLmF2YXRhcn06ICR7ZXJyfWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KFBVQktFWV9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUucHVia2V5KSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChUT0tFTl9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUuYXV0aFRva2VuKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3RoaXMuX2NhY2hlLnB1YmtleX1gLCBqc29uKSxcbiAgICAgICAgLy8gU2VjcmV0IGtleSAob3B0aW9uYWwpXG4gICAgICAgIHNlY2tleSAmJiB0aGlzLnN0b3JhZ2Uuc2V0KFNFQ0tFWV9TVE9SQUdFX0tFWSwgc2Vja2V5KSB8fCB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIC8vIFJlbW92ZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEFjY291bnQgc2F2ZWQgaW4gbG9jYWwgc3RvcmFnZScpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY2NvdW50XSBFcnJvciB3aGlsZSBzYXZpbmcgYWNjb3VudCBsb2NhbGx5OiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gICBhc3luYyBzYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNvdXJjZTogTG9jYWxTZXR0aW5ncyl7XG4gICAgIGlmICghc291cmNlIHx8ICF0aGlzLmlzTG9naW4oKSB8fCBzb3VyY2UuYWNjb3VudEluaGVyaXRhbmNlID09PSBmYWxzZSkgcmV0dXJuOyAvLyBTa2lwXG4gICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmFjY291bnQ7XG5cbiAgICAgLy8gTWVyZ2UgbG9jYWwgc2V0dGluZ3MgaW50byBhY2NvdW50J3Mgc2V0dGluZ3NcbiAgICAgY29uc3Qgc2V0dGluZ3MgPSBVc2VyU2V0dGluZ3MuZnJvbU9iamVjdChhY2NvdW50LnNldHRpbmdzKSB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgIGNvbnN0IGNoYW5nZWQgPSBzZXR0aW5ncy5tZXJnZShzb3VyY2UsIFsnbG9jYWxlJywgJ2xhdExvbmdGb3JtYXQnLCAncHJvcGVydGllcyddKTtcblxuICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjsgLy8gU2tpcCBpZiB1bmNoYW5nZWRcblxuICAgICAvLyBTYXZlIHJlbW90ZWx5XG4gICAgIHRoaXMuYWNjb3VudC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIGFuIHVzZXIgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudFxuICAgKiBAcGFyYW0ga2V5UGFpclxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVSZW1vdGVseShhY2NvdW50OiBBY2NvdW50LCBrZXlQYWlyPzogS2V5cGFpcik6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGFjY291bnQucHVia2V5ID0gYWNjb3VudC5wdWJrZXkgfHwgKGtleVBhaXIgJiYgQmFzZTU4LmVuY29kZShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICAgIGlmICghYWNjb3VudC5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhY2NvdW50IHB1YmtleScpO1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCByZW1vdGVseS4uLmApO1xuXG4gICAgY29uc3QgaXNOZXcgPSBpc05pbChhY2NvdW50LmlkKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlOiBnZXQgZXhpc3RpbmcgYWNjb3VudCdzIHVwZGF0ZURhdGUsIHRvIGF2b2lkICd2ZXJzaW9uIGVycm9yJyB3aGVuIHNhdmluZ1xuICAgIGlmICghaXNOZXcpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudCA9IGF3YWl0IHRoaXMubG9hZCh7IGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyB9KTtcbiAgICAgIGlmICghZXhpc3RpbmdBY2NvdW50IHx8ICFleGlzdGluZ0FjY291bnQudXBkYXRlRGF0ZSkge1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQUNDT1VOVF9OT1RfRVhJU1RTLCBtZXNzYWdlOiAnRVJST1IuQUNDT1VOVF9OT1RfRVhJU1RTJyB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlKGV4aXN0aW5nQWNjb3VudCwgYWNjb3VudCk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2luZyBzZXR0aW5nc1xuICAgIGFjY291bnQuc2V0dGluZ3MuY29udGVudFsncGFnZXMnXSA9IHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MucGFnZXM7XG4gICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50WydwYWdlSGlzdG9yeSddID0gdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5wYWdlSGlzdG9yeTtcblxuICAgIC8vIENvbnZlcnQgdG8ganNvblxuICAgIGNvbnN0IGpzb24gPSBhY2NvdW50LmFzT2JqZWN0KE1JTklGWV9FTlRJVFlfRk9SX1BPRCk7XG5cbiAgICAvLyBVc2VyIG5vdCBhbGxvdyB0byBjaGFuZ2UgaGlzIHByb2ZpbGVzXG4gICAgZGVsZXRlIGpzb24ucHJvZmlsZXM7XG5cbiAgICAvLyBFeGVjdXRlIG11dGF0aW9uXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgZGF0YTogQWNjb3VudCB9Pih7XG4gICAgICBtdXRhdGlvbjogaXNOZXcgPyBBY2NvdW50TXV0YXRpb25zLmNyZWF0ZSA6IEFjY291bnRNdXRhdGlvbnMuc2F2ZSxcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNBVkVfQUNDT1VOVF9FUlJPUidcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENvcHkgdXBkYXRlIHByb3BlcnRpZXNcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGUoZGF0YSwgYWNjb3VudCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgcmV0dXJuIGFjY291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIHVwZGF0ZSB1c2VyIHNldHRpbmdzXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzOiBVc2VyU2V0dGluZ3MpIHtcblxuICAgIGNvbnN0IG5vdyA9IHRoaXMuX2RlYnVnICYmIERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU2F2aW5nIHNldHRpbmdzIHJlbW90ZWx5Li4uYCk7XG5cbiAgICBjb25zdCBqc29uID0gc2V0dGluZ3MuYXNPYmplY3QoTUlOSUZZX0VOVElUWV9GT1JfUE9EKTtcblxuICAgIC8vIEV4ZWN1dGUgbXV0YXRpb25cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBVc2VyU2V0dGluZ3MgfT4oe1xuICAgICAgbXV0YXRpb246IEFjY291bnRNdXRhdGlvbnMuc2F2ZVNldHRpbmdzLFxuICAgICAgdmFyaWFibGVzOiB7IGRhdGE6IGpzb24gfSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU0FWRV9TRVRUSU5HU19FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNBVkVfU0VUVElOR1NfRVJST1InXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDb3B5IHVwZGF0ZSBwcm9wZXJ0aWVzXG4gICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlU2V0dGluZ3MoZGF0YSwgc2V0dGluZ3MpO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU2V0dGluZ3MgcmVtb3RlbHkgc2F2ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICAvLyBTYXZlIGludG8gYWNjb3VudFxuICAgIGlmICh0aGlzLmFjY291bnQpIHRoaXMuYWNjb3VudC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKHRva2VuPzogc3RyaW5nLCBjb3VudGVyPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdVc2VyIG5vdCBsb2dnZWQnKTtcblxuICAgIGlmICghY291bnRlcikgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gQXV0aGVudGljYXRpb24gb24gcG9kLi4uJyk7XG5cbiAgICBpZiAoY291bnRlciA+IDQpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEZhaWxlZCB0byBhdXRoZW50aWNhdGlvbiBvbiBwb2QgKGFmdGVyICR7Y291bnRlcn0gYXR0ZW1wdHMpYCk7XG4gICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQVVUSF9TRVJWRVJfRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX1NFUlZFUl9FUlJPUicgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB2YWxpZFxuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7IGF1dGhlbnRpY2F0ZTogYm9vbGVhbiB9LCB7IHRva2VuOiBzdHJpbmcgfT4oe1xuICAgICAgICBxdWVyeTogQXV0aFF1ZXJ5LFxuICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICB0b2tlblxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuVU5BVVRIT1JJWkVELFxuICAgICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5VTkFVVEhPUklaRUQnXG4gICAgICAgIH0sXG4gICAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnXG4gICAgICB9KTtcblxuICAgICAgLy8gVG9rZW4gaXMgYWNjZXB0ZWQgYnkgdGhlIHNlcnZlclxuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5hdXRoZW50aWNhdGUpIHtcbiAgICAgICAgLy8gU3RvcmUgdGhlIHRva2VuXG4gICAgICAgIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh0b2tlbik7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKGBbYWNjb3VudF0gQXV0aGVudGljYXRpb24gb24gcG9kIFtPS10ge3B1YmtleTogJyR7dGhpcy5fY2FjaGUucHVia2V5LnN1YnN0cigwLCA4KX0nfWApO1xuICAgICAgICByZXR1cm4gdG9rZW47IC8vIHJldHVybiB0aGUgdG9rZW5cbiAgICAgIH1cblxuICAgICAgLy8gQ29udGludWUgKHdpbGwgcmV0cnkgd2l0aCBhbm90aGVyIGNoYWxsZW5nZSlcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhIG5ldyB0b2tlblxuICAgIGNvbnN0IGF1dGhDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmdldEF1dGhDaGFsbGVuZ2UoKTtcbiAgICAvLyBUT0RPOiBjaGVjayBzZXJ2ZXIgcHVia2V5IGFzIGEgdmFsaWQgY2VydGlmaWNhdGVcblxuICAgIC8vIERvIHRoZSBjaGFsbGVuZ2VcbiAgICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCBDcnlwdG9TZXJ2aWNlLnNpZ24oYXV0aENoYWxsZW5nZS5jaGFsbGVuZ2UsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7dGhpcy5fY2FjaGUucHVia2V5fToke2F1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlfXwke3NpZ25hdHVyZX1gO1xuXG4gICAgLy8gaXRlcmF0ZSB3aXRoIHRoZSBuZXcgdG9rZW5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hdXRoZW50aWNhdGVBbmRHZXRUb2tlbihuZXdUb2tlbiwgKGNvdW50ZXIgfHwgMSkgKyAxIC8qIGluY3JlbWVudCAqLyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0QXV0aENoYWxsZW5nZSgpOiBQcm9taXNlPElBdXRoQ2hhbGxlbmdlPiB7XG4gICAgY29uc3QgY2hhbGxlbmdlRXJyb3IgPSB7XG4gICAgICBjb2RlOiBFcnJvckNvZGVzLkFVVEhfQ0hBTExFTkdFX0VSUk9SLFxuICAgICAgbWVzc2FnZTogJ0VSUk9SLkFVVEhfQ0hBTExFTkdFX0VSUk9SJ1xuICAgIH07XG4gICAgY29uc3QgeyBhdXRoQ2hhbGxlbmdlfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5xdWVyeTx7XG4gICAgICBhdXRoQ2hhbGxlbmdlOiBJQXV0aENoYWxsZW5nZTtcbiAgICB9Pih7XG4gICAgICBxdWVyeTogQXV0aENoYWxsZW5nZVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIGVycm9yOiBjaGFsbGVuZ2VFcnJvcixcbiAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5J1xuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2sgY2hhbGxlbmdlXG4gICAgaWYgKCFhdXRoQ2hhbGxlbmdlKSB0aHJvdyBjaGFsbGVuZ2VFcnJvcjsgLy8gU2hvdWxkIG5ldmVyIG9jY3VyXG5cbiAgICAvLyBDaGVjayBzZXJ2ZXIgc2lnbmF0dXJlXG4gICAgY29uc3Qgc2lnbmF0dXJlT0sgPSBhd2FpdCBDcnlwdG9TZXJ2aWNlLnZlcmlmeShcbiAgICAgIGF1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlLFxuICAgICAgYXV0aENoYWxsZW5nZS5zaWduYXR1cmUsXG4gICAgICBhdXRoQ2hhbGxlbmdlLnB1YmtleVxuICAgICk7XG4gICAgaWYgKCFzaWduYXR1cmVPSykge1xuICAgICAgY29uc29sZS53YXJuKCdGSVhNRTogQmFkIHBlZXIgc2lnbmF0dXJlIG9uIGF1dGggY2hhbGxlbmdlICEnLCBhdXRoQ2hhbGxlbmdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGF1dGhDaGFsbGVuZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKG9wdHM/OiBBY2NvdW50V2F0Y2hPcHRpb25zKTogU3Vic2NyaXB0aW9uIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbikgdGhpcy5zdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpOyAvLyBTdG9wIHByZXZpb3VzIHN1YnNjcmlwdGlvblxuICAgIGlmICh0aGlzLm5ldHdvcmsub2ZmbGluZSkgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTsgLy8gT2ZmbGluZTogc2tpcFxuXG4gICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMud2F0Y2hDaGFuZ2VzKG9wdHMpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVtb3RlIHVwZGF0ZSBkZXRlY3RlZCBhdCAke2RhdGEudXBkYXRlRGF0ZX1gKTtcbiAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgJiYgK2Vyci5jb2RlID09PSBTZXJ2ZXJFcnJvckNvZGVzLk5PVF9GT1VORCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gW1dTXSBBY2NvdW50IG5vdCBleGlzdHMgYW55bW9yZTogZm9yY2UgdXNlciB0byBsb2dvdXQuLi4nLCBlcnIpO1xuICAgICAgICAgICAgdGhpcy5sb2dvdXQoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVyciAmJiArZXJyLmNvZGUgPT09IFNlcnZlckVycm9yQ29kZXMuVU5BVVRIT1JJWkVEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oJ1thY2NvdW50XSBbV1NdIEFjY291bnQgbm90IGF1dGhvcml6ZWQ6IGZvcmNlIHVzZXIgdG8gbG9nb3V0Li4uJywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW2FjY291bnRdIFtXU10gUmVjZWl2ZWQgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKCgpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTdG9wIHdhdGNoaW5nIHJlbW90ZSBjaGFuZ2VzYCk7XG4gICAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhdGNoQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IE9ic2VydmFibGU8QWNjb3VudD4ge1xuXG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIC8vIFdhaXQgc2VydmljZSByZWFkeSwgdGhlbiBsb29wXG4gICAgICByZXR1cm4gZnJvbSh0aGlzLnJlYWR5KCkpXG4gICAgICAgIC5waXBlKHN3aXRjaE1hcCgoKSA9PiB0aGlzLndhdGNoQ2hhbmdlcyhvcHRzKSkpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ05vdCBsb2dnZWQgaW4nKTtcbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHdhdGNoIGFjY291bnQgY2hhbmdlczogbmV0d29yayBpcyBvZmZsaW5lLicpO1xuXG4gICAgY29uc3QgdmFyaWFibGVzID0ge1xuICAgICAgaW50ZXJ2YWw6IHRvTnVtYmVyKG9wdHMgJiYgb3B0cy5pbnRlcnZhbEluU2Vjb25kcywgdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHMpXG4gICAgfTtcblxuICAgIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBXYXRjaGluZyByZW1vdGUgY2hhbmdlcywgZXZlcnkgJHt2YXJpYWJsZXMuaW50ZXJ2YWx9c2ApO1xuXG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhxbC5zdWJzY3JpYmU8e2RhdGE6IGFueX0+KHtcbiAgICAgIHF1ZXJ5OiBBY2NvdW50U3Vic2NyaXB0aW9ucy5saXN0ZW5DaGFuZ2VzLFxuICAgICAgdmFyaWFibGVzLFxuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogRXJyb3JDb2Rlcy5TVUJTQ1JJQkVfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkFDQ09VTlQuU1VCU0NSSUJFX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICAgIG1hcCgoe2RhdGF9KSA9PiBkYXRhKSxcbiAgICAgICAgLy8gS2VlcCBvbmx5IGlmIG5ld2VyXG4gICAgICAgIGZpbHRlcihkYXRhID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VXBkYXRlRGF0ZTogTW9tZW50ID0gZnJvbURhdGVJU09TdHJpbmcodGhpcy5fZGF0YT8udXBkYXRlRGF0ZSk7XG4gICAgICAgICAgY29uc3QgcmVtb3RlVXBkYXRlRGF0ZTogTW9tZW50ID0gZnJvbURhdGVJU09TdHJpbmcoZGF0YT8udXBkYXRlRGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIChyZW1vdGVVcGRhdGVEYXRlICYmICghY3VycmVudFVwZGF0ZURhdGUgfHwgIXJlbW90ZVVwZGF0ZURhdGUuaXNTYW1lKGN1cnJlbnRVcGRhdGVEYXRlLCAnbWlsbGlzZWNvbmQnKSkpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlKHNvdXJjZTogQWNjb3VudCB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBBY2NvdW50KSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcblxuICAgIHRhcmdldC5pZCA9IHNvdXJjZS5pZCB8fCB0YXJnZXQuaWQ7XG4gICAgdGFyZ2V0LnVwZGF0ZURhdGUgPSBzb3VyY2UudXBkYXRlRGF0ZSB8fCB0YXJnZXQudXBkYXRlRGF0ZTtcblxuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZVNldHRpbmdzKHNvdXJjZS5zZXR0aW5ncywgdGFyZ2V0LnNldHRpbmdzKTtcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGVUb2tlbihzb3VyY2UudG9rZW5zLCB0YXJnZXQudG9rZW5zKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlU2V0dGluZ3Moc291cmNlOiBVc2VyU2V0dGluZ3MgfCB1bmRlZmluZWQsIHRhcmdldDogVXNlclNldHRpbmdzKSB7XG4gICAgaWYgKCFzb3VyY2UpIHJldHVybjtcblxuICAgIHRhcmdldC5pZCA9IHNvdXJjZS5pZCB8fCB0YXJnZXQuaWQ7XG4gICAgdGFyZ2V0LnVwZGF0ZURhdGUgPSBzb3VyY2UudXBkYXRlRGF0ZSB8fCB0YXJnZXQudXBkYXRlRGF0ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb3B5SWRBbmRVcGRhdGVEYXRlVG9rZW4oc291cmNlczogVXNlclRva2VuW10gfCB1bmRlZmluZWQsIHRhcmdldHM6IFVzZXJUb2tlbltdKSB7XG4gICAgaWYgKGlzRW1wdHlBcnJheShzb3VyY2VzKSkgcmV0dXJuO1xuXG4gICAgc291cmNlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXRzLmZpbmQodmFsdWUgPT4gdmFsdWUuaWQgPT09IHNvdXJjZS5pZCB8fCB2YWx1ZS5uYW1lID09PSBzb3VyY2UubmFtZSk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5pZCA9IHNvdXJjZS5pZCB8fCB0YXJnZXQuaWQ7XG4gICAgICAgIHRhcmdldC5jcmVhdGlvbkRhdGUgPSBzb3VyY2UuY3JlYXRpb25EYXRlIHx8IHRhcmdldC5jcmVhdGlvbkRhdGU7XG4gICAgICAgIHRhcmdldC51cGRhdGVEYXRlID0gc291cmNlLnVwZGF0ZURhdGUgfHwgdGFyZ2V0LnVwZGF0ZURhdGU7XG4gICAgICAgIHRhcmdldC50b2tlbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Q8VCA9IGFueT4ob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8T3ZlcmxheUV2ZW50RGV0YWlsPFQ+PiB7XG4gICAgcmV0dXJuIFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cbn1cbiJdfQ==
1244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL2FjY291bnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQVcsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQVUsV0FBVyxFQUFvQixNQUFNLHNCQUFzQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEYsT0FBTyxFQUFlLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBT3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVB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QUFFLENBQUUsV0FBVyxDQUFFLEVBQUM7OzBCQTJFbEQsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSwgS2V5cGFpciB9IGZyb20gJy4vY3J5cHRvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGVwYXJ0bWVudCB9IGZyb20gJy4vbW9kZWwvZGVwYXJ0bWVudC5tb2RlbCc7XG5pbXBvcnQgeyBBY2NvdW50LCBBY2NvdW50VXRpbHMsIFVzZXJTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWwvYWNjb3VudC5tb2RlbCc7XG5pbXBvcnQgeyBQZXJzb24sIFBlcnNvblV0aWxzLCBVc2VyUHJvZmlsZUxhYmVsIH0gZnJvbSAnLi9tb2RlbC9wZXJzb24ubW9kZWwnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5ncywgVXNhZ2VNb2RlIH0gZnJvbSAnLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmV0Y2hQb2xpY3ksIGdxbCB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUnO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0Bpb25pYy9zdG9yYWdlLWFuZ3VsYXInO1xuXG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsLCBzbGVlcCwgdG9OdW1iZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEJhc2VHcmFwaHFsU2VydmljZSB9IGZyb20gJy4vYmFzZS1ncmFwaHFsLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgU2VydmVyRXJyb3JDb2RlcyB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEdyYXBocWxTZXJ2aWNlIH0gZnJvbSAnLi4vZ3JhcGhxbC9ncmFwaHFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4vbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBGaWxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBNSU5JRllfRU5USVRZX0ZPUl9QT0QsIFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbFV0aWxzIH0gZnJvbSAnLi9tb2RlbC9yZWZlcmVudGlhbC5tb2RlbCc7XG5pbXBvcnQgeyBTdGF0dXNJZHMgfSBmcm9tICcuL21vZGVsL21vZGVsLmVudW0nO1xuaW1wb3J0IHsgQmFzZTU4IH0gZnJvbSAnLi9iYXNlNTgnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IGZyb21EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5R3JhcGhxbE11dGF0aW9ucywgQmFzZUVudGl0eUdyYXBocWxRdWVyaWVzLCBCYXNlRW50aXR5R3JhcGhxbFN1YnNjcmlwdGlvbnMgfSBmcm9tICcuL2Jhc2UtZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgT3ZlcmxheUV2ZW50RGV0YWlsIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9rZW5TY29wZSwgVXNlclRva2VuIH0gZnJvbSAnLi9tb2RlbC90b2tlbi5tb2RlbCc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBY2NvdW50RGV0YWlscyB7XG4gIGxvYWRlZDogYm9vbGVhbjtcbiAga2V5cGFpcjogS2V5cGFpcjtcbiAgYXV0aFRva2VuOiBzdHJpbmc7XG4gIGF1dGhCYXNpYz86IHN0cmluZztcbiAgcHVia2V5OiBzdHJpbmc7XG4gIHBlcnNvbjogUGVyc29uO1xuICBkZXBhcnRtZW50OiBEZXBhcnRtZW50O1xuICBtYWluUHJvZmlsZTogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBBdXRoRGF0YSB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHBhc3N3b3JkOiBzdHJpbmc7XG4gIG9mZmxpbmU/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRhdGEgZXh0ZW5kcyBBdXRoRGF0YSB7XG4gIGFjY291bnQ6IEFjY291bnQ7XG59XG5cbmNvbnN0IFRPS0VOX1NUT1JBR0VfS0VZID0gJ3Rva2VuJztcbmNvbnN0IFBVQktFWV9TVE9SQUdFX0tFWSA9ICdwdWJrZXknO1xuY29uc3QgU0VDS0VZX1NUT1JBR0VfS0VZID0gJ3NlY2tleSc7XG5jb25zdCBBQ0NPVU5UX1NUT1JBR0VfS0VZID0gJ2FjY291bnQnO1xuXG5jb25zdCBERUZBVUxUX0FWQVRBUl9JTUFHRSA9ICdhc3NldHMvaW1nL3BlcnNvbi5wbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJTZXR0aW5nc09wdGlvbnMge1xuICBvcHRpb25zOiBGb3JtRmllbGREZWZpbml0aW9uTWFwO1xufVxuZXhwb3J0IGNvbnN0IEFQUF9VU0VSX1NFVFRJTkdTX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VXNlclNldHRpbmdzT3B0aW9ucz4oJ1VzZXJTZXR0aW5nc09wdGlvbnMnKTtcbmV4cG9ydCBjb25zdCBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48VG9rZW5TY29wZVtdPignVXNlclRva2VuU2NvcGVzJyk7XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBHcmFwaFFMIHF1ZXJpZXNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5jb25zdCBGcmFnbWVudHMgPSB7XG4gIGFjY291bnQ6IGdxbGBcbiAgICBmcmFnbWVudCBBY2NvdW50RnJhZ21lbnQgb24gQWNjb3VudFZPIHtcbiAgICAgIGlkXG4gICAgICBmaXJzdE5hbWVcbiAgICAgIGxhc3ROYW1lXG4gICAgICBlbWFpbFxuICAgICAgcHVia2V5XG4gICAgICBhdmF0YXJcbiAgICAgIHN0YXR1c0lkXG4gICAgICB1cGRhdGVEYXRlXG4gICAgICBjcmVhdGlvbkRhdGVcbiAgICAgIHByb2ZpbGVzXG4gICAgICBzZXR0aW5ncyB7XG4gICAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBkZXBhcnRtZW50IHtcbiAgICAgICAgaWRcbiAgICAgICAgbGFiZWxcbiAgICAgICAgbmFtZVxuICAgICAgICBfX3R5cGVuYW1lXG4gICAgICB9XG4gICAgICBfX3R5cGVuYW1lXG4gICAgfWAsXG5cbiAgc2V0dGluZ3M6IGdxbGBmcmFnbWVudCBVc2VyU2V0dGluZ3NGcmFnbWVudCBvbiBVc2VyU2V0dGluZ3NWTyB7XG4gICAgaWRcbiAgICBsb2NhbGVcbiAgICBsYXRMb25nRm9ybWF0XG4gICAgY29udGVudFxuICAgIG5vbmNlXG4gICAgdXBkYXRlRGF0ZVxuICAgIF9fdHlwZW5hbWVcbiAgfWAsXG5cbiAgdG9rZW46IGdxbGBmcmFnbWVudCBVc2VyVG9rZW5GcmFnbWVudCBvbiBVc2VyVG9rZW5WTyB7XG4gICAgaWRcbiAgICBwdWJrZXlcbiAgICB0b2tlblxuICAgIG5hbWVcbiAgICBmbGFnc1xuICAgIGV4cGlyYXRpb25EYXRlXG4gICAgbGFzdFVzZWREYXRlXG4gICAgY3JlYXRpb25EYXRlXG4gICAgdXBkYXRlRGF0ZVxuICAgIF9fdHlwZW5hbWVcbiAgfWBcbn07XG5cbi8vIEFjY291bnQgcXVlcmllc1xuY29uc3QgUXVlcmllczogUGFydGlhbDxCYXNlRW50aXR5R3JhcGhxbFF1ZXJpZXM+ICYgeyBsb2FkV2l0aFRva2VuczogYW55OyB9ID0ge1xuICBsb2FkOiBncWxgcXVlcnkgQWNjb3VudCB7XG4gICAgZGF0YTogYWNjb3VudCB7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICB9XG4gIH1cbiAgJHtGcmFnbWVudHMuYWNjb3VudH1cbiAgJHtGcmFnbWVudHMuc2V0dGluZ3N9YCxcblxuICBsb2FkV2l0aFRva2VuczogZ3FsYHF1ZXJ5IEFjY291bnRXaXRoVG9rZW4ge1xuICAgIGRhdGE6IGFjY291bnQge1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgICB0b2tlbnMge1xuICAgICAgICAuLi5Vc2VyVG9rZW5GcmFnbWVudFxuICAgICAgfVxuICAgIH1cbiAgfVxuICAke0ZyYWdtZW50cy5hY2NvdW50fVxuICAke0ZyYWdtZW50cy5zZXR0aW5nc31cbiAgJHtGcmFnbWVudHMudG9rZW59YCxcbn07XG5cbi8vIENoZWNrIGVtYWlsIHF1ZXJ5XG5jb25zdCBJc0VtYWlsRXhpc3RzUXVlcnk6IGFueSA9IGdxbGBcbiAgcXVlcnkgSXNFbWFpbEV4aXN0cygkZW1haWw6IFN0cmluZywgJGhhc2g6IFN0cmluZyl7XG4gICAgaXNFbWFpbEV4aXN0cyhlbWFpbDogJGVtYWlsLCBoYXNoOiAkaGFzaClcbiAgfVxuYDtcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJc0VtYWlsRXhpc3RzVmFyaWFibGVzIHtcbiAgZW1haWw6IHN0cmluZztcbiAgaGFzaDogc3RyaW5nO1xufVxuXG4vLyBBY2NvdW50IG11dGF0aW9uc1xuY29uc3QgTXV0YXRpb25zOiBQYXJ0aWFsPEJhc2VFbnRpdHlHcmFwaHFsTXV0YXRpb25zPiAmIHsgc2F2ZVdpdGhUb2tlbnM6IGFueSwgc2F2ZVNldHRpbmdzOiBhbnk7IGNyZWF0ZTogYW55OyAgfSA9IHtcbiAgc2F2ZTogZ3FsYCBtdXRhdGlvbiBTYXZlQWNjb3VudCgkZGF0YTpBY2NvdW50Vk9JbnB1dCl7XG4gICAgZGF0YTogc2F2ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfWAsXG5cbiAgc2F2ZVdpdGhUb2tlbnM6IGdxbGAgbXV0YXRpb24gU2F2ZUFjY291bnRXaXRoVG9rZW5zKCRkYXRhOkFjY291bnRWT0lucHV0KXtcbiAgICBkYXRhOiBzYXZlQWNjb3VudChhY2NvdW50OiAkZGF0YSl7XG4gICAgICAuLi5BY2NvdW50RnJhZ21lbnRcbiAgICAgIHRva2VucyB7XG4gICAgICAgIC4uLlVzZXJUb2tlbkZyYWdtZW50XG4gICAgICB9XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICAke0ZyYWdtZW50cy50b2tlbn1gLFxuXG4gIGNyZWF0ZTogZ3FsYG11dGF0aW9uIENyZWF0ZUFjY291bnQoJGRhdGE6QWNjb3VudFZPSW5wdXQpe1xuICAgIGRhdGE6IGNyZWF0ZUFjY291bnQoYWNjb3VudDogJGRhdGEpe1xuICAgICAgLi4uQWNjb3VudEZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLmFjY291bnR9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfVxuICBgLFxuXG4gIHNhdmVTZXR0aW5nczogZ3FsYG11dGF0aW9uIFNhdmVTZXR0aW5ncygkZGF0YTpVc2VyU2V0dGluZ3NWT0lucHV0KXtcbiAgICBkYXRhOiBzYXZlU2V0dGluZ3Moc2V0dGluZ3M6ICRkYXRhKXtcbiAgICAgIC4uLlVzZXJTZXR0aW5nc0ZyYWdtZW50XG4gICAgfVxuICB9XG4gICR7RnJhZ21lbnRzLnNldHRpbmdzfWBcbn07XG5cbi8vIFNlbnQgY29uZmlybWF0aW9uIGVtYWlsXG5jb25zdCBTZW5kQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbCgkZW1haWw6U3RyaW5nLCAkbG9jYWxlOlN0cmluZyl7XG4gICAgc2VuZEFjY291bnRDb25maXJtYXRpb25FbWFpbChlbWFpbDogJGVtYWlsLCBsb2NhbGU6ICRsb2NhbGUpXG4gIH1cbmA7XG5cbi8vIENvbmZpcm0gYWNjb3VudCBlbWFpbFxuY29uc3QgQ29uZmlybUVtYWlsTXV0YXRpb246IGFueSA9IGdxbGBcbiAgbXV0YXRpb24gY29uZmlybUFjY291bnRFbWFpbCgkZW1haWw6U3RyaW5nLCAkY29kZTpTdHJpbmcpe1xuICAgIGNvbmZpcm1BY2NvdW50RW1haWwoZW1haWw6ICRlbWFpbCwgY29kZTogJGNvZGUpXG4gIH1cbmA7XG5cbi8vIEF1dGhlbnRpY2F0aW9uICBxdWVyeVxuY29uc3QgQXV0aFF1ZXJ5OiBhbnkgPSBncWxgXG4gIHF1ZXJ5IEF1dGgoJHRva2VuOiBTdHJpbmcpe1xuICAgIGF1dGhlbnRpY2F0ZSh0b2tlbjogJHRva2VuKVxuICB9XG5gO1xuXG4vLyBOZXcgYXV0aCBjaGFsbGVuZ2UgcXVlcnlcbmNvbnN0IEF1dGhDaGFsbGVuZ2VRdWVyeTogYW55ID0gZ3FsYFxuICBxdWVyeSBBdXRoQ2hhbGxlbmdle1xuICAgIGF1dGhDaGFsbGVuZ2V7XG4gICAgICBjaGFsbGVuZ2VcbiAgICAgIHB1YmtleVxuICAgICAgc2lnbmF0dXJlXG4gICAgfVxuICB9XG5gO1xuXG5pbnRlcmZhY2UgSUF1dGhDaGFsbGVuZ2Uge1xuICBwdWJrZXk6IHN0cmluZztcbiAgY2hhbGxlbmdlOiBzdHJpbmc7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG5jb25zdCBBY2NvdW50U3Vic2NyaXB0aW9uczogQmFzZUVudGl0eUdyYXBocWxTdWJzY3JpcHRpb25zID0ge1xuICBsaXN0ZW5DaGFuZ2VzOiBncWxgc3Vic2NyaXB0aW9uIHVwZGF0ZUFjY291bnQoJGludGVydmFsOiBJbnQpe1xuICAgIGRhdGE6IHVwZGF0ZUFjY291bnQoaW50ZXJ2YWw6ICRpbnRlcnZhbCkge1xuICAgICAgaWRcbiAgICAgIHVwZGF0ZURhdGVcbiAgICB9XG4gIH1gXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRXYXRjaE9wdGlvbnMge1xuICBpbnRlcnZhbEluU2Vjb25kcz86IG51bWJlcjtcbn1cblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290JywgZGVwczogWyBFTlZJUk9OTUVOVCBdfSlcbmV4cG9ydCBjbGFzcyBBY2NvdW50U2VydmljZSBleHRlbmRzIEJhc2VHcmFwaHFsU2VydmljZTxBY2NvdW50LCBhbnksIG51bWJlciwgQWNjb3VudD4ge1xuXG4gIG9uTG9naW4gPSBuZXcgU3ViamVjdDxBY2NvdW50PigpO1xuICBvbkxvZ291dCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8QWNjb3VudD4oKTtcbiAgb25BdXRoVG9rZW5DaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgb25BdXRoQmFzaWNDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcml2YXRlIF9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9lbmFibGVMaXN0ZW5DaGFuZ2VzOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9saXN0ZW5JbnRlcnZhbEluU2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIF9jYWNoZTogQWNjb3VudERldGFpbHMgPSB7XG4gICAgbG9hZGVkOiBmYWxzZSxcbiAgICBrZXlwYWlyOiBudWxsLFxuICAgIGF1dGhUb2tlbjogbnVsbCxcbiAgICBhdXRoQmFzaWM6IG51bGwsXG4gICAgcHVia2V5OiBudWxsLFxuICAgIG1haW5Qcm9maWxlOiBudWxsLFxuICAgIHBlcnNvbjogbnVsbCxcbiAgICBkZXBhcnRtZW50OiBudWxsXG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbkRlZnM6IEZvcm1GaWVsZERlZmluaXRpb25bXTtcbiAgcHJpdmF0ZSBfJGFkZGl0aW9uYWxGaWVsZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZvcm1GaWVsZERlZmluaXRpb25bXT4oW10pO1xuICBwcml2YXRlIF90b2tlblR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVG9rZW5UeXBlPih1bmRlZmluZWQpO1xuICBwcml2YXRlIF9hcGlUb2tlbkVuYWJsZWQgPSB0cnVlO1xuXG4gIGdldCBhY2NvdW50KCk6IEFjY291bnQge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZS5sb2FkZWQgPyB0aGlzLl9kYXRhIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0IHBlcnNvbigpOiBQZXJzb24ge1xuICAgIGlmICh0aGlzLl9jYWNoZS5sb2FkZWQgJiYgIXRoaXMuX2NhY2hlLnBlcnNvbikge1xuICAgICAgdGhpcy5fY2FjaGUucGVyc29uID0gdGhpcy5fY2FjaGUubG9hZGVkID8gdGhpcy5fZGF0YS5hc1BlcnNvbigpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGUucGVyc29uO1xuICB9XG5cbiAgZ2V0IGRlcGFydG1lbnQoKTogRGVwYXJ0bWVudCB7XG4gICAgaWYgKHRoaXMuX2NhY2hlLmxvYWRlZCAmJiAhdGhpcy5fY2FjaGUuZGVwYXJ0bWVudCkge1xuICAgICAgdGhpcy5fY2FjaGUuZGVwYXJ0bWVudCA9IHRoaXMuX2NhY2hlLmxvYWRlZCA/IHRoaXMuX2RhdGEuYXNQZXJzb24oKS5kZXBhcnRtZW50IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGUuZGVwYXJ0bWVudDtcbiAgfVxuXG4gIGdldCB0b2tlblR5cGUoKTogQXV0aFRva2VuVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rva2VuVHlwZSQudmFsdWU7XG4gIH1cblxuICBzZXQgdG9rZW5UeXBlKHZhbHVlOiBBdXRoVG9rZW5UeXBlKSB7XG4gICAgaWYgKHRoaXMuX3Rva2VuVHlwZSQudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1thY2NvdW50XSBVc2luZyBhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlOiAnICsgdmFsdWUpO1xuICAgICAgdGhpcy5fdG9rZW5UeXBlJC5uZXh0KHZhbHVlKTtcbiAgICAgIC8vIFJlc2V0IHZhbHVlc1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aFRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYXBpVG9rZW5FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hcGlUb2tlbkVuYWJsZWQ7XG4gIH1cblxuICBzZXQgYXBpVG9rZW5FbmFibGVkKHZhbHVlOiBib29sZWFuKXtcbiAgICB0aGlzLl9hcGlUb2tlbkVuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZ3JhcGhxbDogR3JhcGhxbFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcm90ZWN0ZWQgZmlsZTogRmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX1VTRVJfU0VUVElOR1NfT1BUSU9OUykgb3B0aW9uczogVXNlclNldHRpbmdzT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcihncmFwaHFsLCBlbnZpcm9ubWVudCk7XG4gICAgdGhpcy5fZW5hYmxlTGlzdGVuQ2hhbmdlcyA9ICghZW52aXJvbm1lbnQuYWNjb3VudCB8fCBlbnZpcm9ubWVudC5hY2NvdW50LmVuYWJsZUxpc3RlbkNoYW5nZXMgIT09IGZhbHNlKTsgLy8gVHJ1ZSBieSBkZWZhdWx0XG4gICAgdGhpcy5fbGlzdGVuSW50ZXJ2YWxJblNlY29uZHMgPSB0b051bWJlcihlbnZpcm9ubWVudC5hY2NvdW50ICYmIGVudmlyb25tZW50LmFjY291bnQubGlzdGVuSW50ZXJ2YWxJblNlY29uZHMsIDApOyAvLyBubyB0aW1lciBieSBkZWZhdWx0XG5cbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnQtc2VydmljZV0gQ3JlYXRpbmcgc2VydmljZScpO1xuICAgIHRoaXMuX29wdGlvbkRlZnMgPSBPYmplY3QudmFsdWVzKG9wdGlvbnM/Lm9wdGlvbnMgfHwge30pO1xuXG4gICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgIC8vIFNlbmQgYXV0aCB0b2tlbiB0byB0aGUgZ3JhcGhxbCBsYXllciwgd2hlbiBjaGFuZ2VkXG4gICAgdGhpcy5vbkF1dGhUb2tlbkNoYW5nZS5zdWJzY3JpYmUoKHRva2VuKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aFRva2VuKHRva2VuKSk7XG4gICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5zdWJzY3JpYmUoKGJhc2ljKSA9PiB0aGlzLmdyYXBocWwuc2V0QXV0aEJhc2ljKGJhc2ljKSk7XG5cbiAgICAvLyBGb3JjZSBuZXR3b3JrIHRvIHdhaXQgYWNjb3VudCBzZXJ2aWNlLCBhZnRlciBnZXR0aW5nIGNvbm5lY3Rpb24gdG8gdGhlIHBlZXJcbiAgICB0aGlzLm5ldHdvcmsub24oJ2JlZm9yZVRyeU9ubGluZUZpbmlzaCcsIGFzeW5jIChvbmxpbmUpID0+IHtcbiAgICAgIC8vIElmIG9ubGluZSwgd2FpdCBhIGZ1bGwgcmVzdGFydCwgYmVjYXVzZSBpdCBjYW4gZm9yY2Ugb2ZmbGluZSBtb2RlXG4gICAgICBpZiAob25saW5lICYmICghdGhpcy5zdGFydGVkIHx8IHRoaXMuaXNMb2dpbigpKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gRm9yY2UgbmV0d29ya1NlcnZpY2UudHJ5T25saW5lKCkgdG8gd2FpdCwgdGhhdCBncmFwaHFsIGFuZCBhY2NvdW50IHNlcnZpY2UgaXMgcmVzdGFydGVkLi4uJyk7XG4gICAgICAgIGF3YWl0IHNsZWVwKDUwMCk7IC8vIHdhaXQgZ3JhcGhxbCBzZXJ2aWNlIHRvIGJlIHJlc3RhcnRlZFxuICAgICAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICBhc3luYyBuZ09uU3RhcnQoKTogUHJvbWlzZTxBY2NvdW50PiB7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnNldHRpbmdzLnJlYWR5KCksXG4gICAgICAvLyBXYWl0IHRva2VuIHR5cGUgdG8gYmUgc2V0XG4gICAgICBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5fdG9rZW5UeXBlJClcbiAgICBdKTtcblxuICAgIC8vIExpc3RlbiBncmFwaHFsIHN0YXJ0IChvciByZXN0YXJ0KVxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmdyYXBocWwuc3RvcFN1YmplY3Quc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRlZCAmJiB0aGlzLmlzTG9naW4oKSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBSZXN0YXJ0aW5nLCB0byByZXRyeSB0byBhdXRoZW50aWNhdGUuLi4nKTtcbiAgICAgICAgICB0aGlzLnJlc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5yZXN0b3JlTG9jYWxseSgpO1xuICAgIGF3YWl0IHRoaXMubGlzdGVuU2V0dGluZ3MoKTtcblxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhhZEF1dGhUb2tlbiA9IHRoaXMuX2NhY2hlLmF1dGhUb2tlbiAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGhCYXNpYyA9IHRoaXMuX2NhY2hlLmF1dGhCYXNpYyAmJiB0cnVlO1xuICAgIGNvbnN0IGhhZEF1dGggPSBoYWRBdXRoVG9rZW4gfHwgaGFkQXV0aEJhc2ljO1xuICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgaWYgKGhhZEF1dGgpIHtcbiAgICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICBpZiAoaGFkQXV0aFRva2VuKSB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGlzTG9naW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuX2NhY2hlLnB1YmtleSAmJiB0aGlzLl9jYWNoZS5sb2FkZWQpO1xuICB9XG5cbiAgaXNBdXRoKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhISh0aGlzLl9jYWNoZS5wdWJrZXkgJiYgdGhpcy5fY2FjaGUua2V5cGFpciAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyLnNlY3JldEtleSk7XG4gIH1cblxuICBoYXNNaW5Qcm9maWxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgLy8gc2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8XG4gICAgICAodGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gUGVyc29uVXRpbHMuaGFzVXBwZXJPckVxdWFsc1Byb2ZpbGUodGhpcy5fZGF0YS5wcm9maWxlcywgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaGFzRXhhY3RQcm9maWxlKGxhYmVsOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNFeGFjdFByb2ZpbGUodGhpcy5fZGF0YSwgbGFiZWwpO1xuICB9XG5cbiAgaGFzUHJvZmlsZUFuZElzRW5hYmxlKHVzZXJQcm9maWxlOiBVc2VyUHJvZmlsZUxhYmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFjY291bnRVdGlscy5oYXNQcm9maWxlQW5kSXNFbmFibGUodGhpcy5fZGF0YSwgdXNlclByb2ZpbGUpO1xuICB9XG5cbiAgaXNBZG1pbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5oYXNQcm9maWxlQW5kSXNFbmFibGUoJ0FETUlOJyk7XG4gIH1cblxuICBpc1N1cGVydmlzb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdTVVBFUlZJU09SJyk7XG4gIH1cblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzUHJvZmlsZUFuZElzRW5hYmxlKCdVU0VSJyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQHBhcmFtIG1vZGVcbiAgICovXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmlzVXNhZ2VNb2RlKG1vZGUpO1xuICB9XG5cbiAgaXNPbmx5R3Vlc3QoKTogYm9vbGVhbiB7XG4gICAgLy8gU2hvdWxkIGJlIGxvZ2luLCBhbmQgc3RhdHVzIEVOQUJMRSBvciBURU1QT1JBUllcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIXRoaXMuX2RhdGEucHVia2V5IHx8XG4gICAgICAodGhpcy5fZGF0YS5zdGF0dXNJZCAhPT0gU3RhdHVzSWRzLkVOQUJMRSAmJiB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBQcm9maWxlIGxlc3MgdGhlbiB1c2VyXG4gICAgcmV0dXJuICFQZXJzb25VdGlscy5oYXNVcHBlck9yRXF1YWxzUHJvZmlsZSh0aGlzLl9kYXRhLnByb2ZpbGVzLCAnVVNFUicpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmRlckRlcGFydG1lbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIFByb2dyYW1SZWZTZXJ2aWNlLmNhblVzZXJXcml0ZUVudGl0eSgpIGluc3RlYWRcbiAgICovXG4gIGNhblVzZXJXcml0ZURhdGFGb3JEZXBhcnRtZW50KHJlY29yZGVyRGVwYXJ0bWVudDogUmVmZXJlbnRpYWwgfCBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoUmVmZXJlbnRpYWxVdGlscy5pc0VtcHR5KHJlY29yZGVyRGVwYXJ0bWVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzQWRtaW4oKTtcbiAgICB9XG5cbiAgICAvLyBTaG91bGQgYmUgbG9naW4sIGFuZCBzdGF0dXMgRU5BQkxFXG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICF0aGlzLl9kYXRhLnB1YmtleSB8fCB0aGlzLl9kYXRhLnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuRU5BQkxFKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuX2RhdGEuZGVwYXJ0bWVudCB8fCAhdGhpcy5fZGF0YS5kZXBhcnRtZW50LmlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1VzZXIgYWNjb3VudCBoYXMgbm8gZGVwYXJ0bWVudCAhIFVuYWJsZSB0byBjaGVjayB3cml0ZSByaWdodCBhZ2FpbnN0IHJlY29yZGVyRGVwYXJ0bWVudCcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNhbWUgcmVjb3JkZXIgZGVwYXJ0bWVudDogT0ssIHVzZXIgY2FuIHdyaXRlXG4gICAgaWYgKHRoaXMuX2RhdGEuZGVwYXJ0bWVudC5pZCA9PT0gcmVjb3JkZXJEZXBhcnRtZW50LmlkKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIENhbm5vdCB3cml0ZVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyKGRhdGE6IFJlZ2lzdGVyRGF0YSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICh0aGlzLmlzTG9naW4oKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2VyIGFscmVhZHkgbG9naW4uIFBsZWFzZSBsb2dvdXQgYmVmb3JlIHJlZ2lzdGVyLicpO1xuICAgIH1cbiAgICBpZiAoIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbYWNjb3VudF0gUmVnaXN0ZXIgbmV3IHVzZXIgYWNjb3VudC4uLicsIGRhdGEuYWNjb3VudCk7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlwYWlyID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zY3J5cHRLZXlwYWlyKGRhdGEudXNlcm5hbWUsIGRhdGEucGFzc3dvcmQpO1xuICAgICAgZGF0YS5hY2NvdW50LnB1YmtleSA9IEJhc2U1OC5lbmNvZGUoa2V5cGFpci5wdWJsaWNLZXkpO1xuXG4gICAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzID0gZGF0YS5hY2NvdW50LnNldHRpbmdzIHx8IG5ldyBVc2VyU2V0dGluZ3MoKTtcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgPSB0aGlzLnNldHRpbmdzLmxvY2FsZTtcbiAgICAgIGRhdGEuYWNjb3VudC5zZXR0aW5ncy5sYXRMb25nRm9ybWF0ID0gdGhpcy5zZXR0aW5ncy5sYXRMb25nRm9ybWF0O1xuICAgICAgZGF0YS5hY2NvdW50LnNldHRpbmdzLmNvbnRlbnQgPSBkYXRhLmFjY291bnQuc2V0dGluZ3MuY29udGVudCB8fCB7fTtcbiAgICAgIGRhdGEuYWNjb3VudC5kZXBhcnRtZW50LmlkID0gZGF0YS5hY2NvdW50LmRlcGFydG1lbnQuaWQgfHwgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0RGVwYXJ0bWVudElkO1xuXG4gICAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0ga2V5cGFpcjtcbiAgICAgIGNvbnN0IGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShkYXRhLmFjY291bnQsIGtleXBhaXIpO1xuXG4gICAgICAvLyBEZWZhdWx0IHZhbHVlc1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgICAgdGhpcy5fZGF0YSA9IGFjY291bnQ7XG4gICAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBhY2NvdW50LnB1YmtleTtcblxuICAgICAgLy8gVHJ5IHRvIGF1dGggb24gcG9kXG4gICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcblxuICAgICAgdGhpcy5fY2FjaGUubG9hZGVkID0gdHJ1ZTtcblxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcblxuICAgICAgLy8gRW1pdCBldmVudHNcbiAgICAgIHRoaXMub25Mb2dpbi5uZXh0KHRoaXMuX2RhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgICAvLyBMaXN0ZW4gcmVtb3RlIGNoYW5nZXNcbiAgICAgIGlmICh0aGlzLl9lbmFibGVMaXN0ZW5DaGFuZ2VzKSB0aGlzLnN0YXJ0TGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yICYmIGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShkYXRhPzogQXV0aERhdGEpIHtcbiAgICAvLyBXYWl0IHRoZSBhdXRoIHRva2VuLCB0aGVuIGNvbnRpbnVlXG4gICAgY29uc3QgdG9rZW5UeXBlID0gYXdhaXQgZmlyc3ROb3ROaWxQcm9taXNlKHRoaXMuX3Rva2VuVHlwZSQpO1xuXG4gICAgLy8gQmFzaWMgYXV0aFxuICAgIGlmICh0b2tlblR5cGUgPT09ICdiYXNpYycgfHwgdG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykge1xuXG4gICAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aEJhc2ljLCBpZiB1c2VkXG4gICAgICBpZiAoIXRoaXMuX2NhY2hlLmF1dGhCYXNpYykge1xuICAgICAgICAvLyBTa2lwIGlmIHRva2VuIGFscmVhZHkgcHJvdmlkZWRcbiAgICAgICAgaWYgKCEodGhpcy5fY2FjaGUuYXV0aFRva2VuICYmIHRva2VuVHlwZSA9PT0gJ2Jhc2ljLWFuZC10b2tlbicpKSB7XG4gICAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLnVzZXJuYW1lIHx8ICFkYXRhLnBhc3N3b3JkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkJyk7XG4gICAgICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gQ3J5cHRvU2VydmljZS5lbmNvZGVCYXNlNjQoYCR7ZGF0YS51c2VybmFtZX06JHtkYXRhLnBhc3N3b3JkfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm9uQXV0aEJhc2ljQ2hhbmdlLm5leHQodGhpcy5fY2FjaGUuYXV0aEJhc2ljKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSB0aGUgYXV0aFRva2VuLCBpZiB1c2VkXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ3Rva2VuJyB8fCB0b2tlblR5cGUgPT09ICdiYXNpYy1hbmQtdG9rZW4nKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZUFuZEdldFRva2VuKHRoaXMuX2NhY2hlLmF1dGhUb2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBOZXZlciBhdXRoZW50aWNhdGUsIG9yIG5vdCByZWFkeSBmb3Igb2ZmbGluZSBtb2RlID0+IGV4aXRcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMucmVzZXREYXRhKCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcmdldCBhdXRoQmFzaWMsIHRvIHN3aXRjaCB0byBhdXRoVG9rZW5cbiAgICBpZiAodG9rZW5UeXBlID09PSAnYmFzaWMtYW5kLXRva2VuJykge1xuICAgICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5vbkF1dGhCYXNpY0NoYW5nZS5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oZGF0YTogQXV0aERhdGEpOiBQcm9taXNlPEFjY291bnQ+IHtcbiAgICBpZiAoIWRhdGEgfHwgIWRhdGEudXNlcm5hbWUgfHwgIWRhdGEucGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIExvZ2luLi4uJyk7XG5cbiAgICBsZXQga2V5cGFpcjtcbiAgICB0cnkge1xuICAgICAga2V5cGFpciA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2NyeXB0S2V5cGFpcihkYXRhLnVzZXJuYW1lLCBkYXRhLnBhc3N3b3JkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLlVOS05PV05fRVJST1IsIG1lc3NhZ2U6ICdFUlJPUi5TQ1JZUFRfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gU3RvcmUgcHVia2V5K2tleXBhaXJcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBCYXNlNTguZW5jb2RlKGtleXBhaXIucHVibGljS2V5KTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0ga2V5cGFpcjtcblxuICAgIC8vIFRyeSB0byBsb2FkIHByZXZpb3VzIHRva2VuXG4gICAgbGV0IHByZXZpb3VzVG9rZW46IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoVE9LRU5fU1RPUkFHRV9LRVkpO1xuICAgIHByZXZpb3VzVG9rZW4gPSBwcmV2aW91c1Rva2VuICYmIHByZXZpb3VzVG9rZW4uc3RhcnRzV2l0aCh0aGlzLl9jYWNoZS5wdWJrZXkpICYmIHByZXZpb3VzVG9rZW4gfHwgbnVsbDtcblxuICAgIC8vIE9mZmxpbmUgbW9kZVxuICAgIGNvbnN0IG9mZmxpbmUgPSB0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkgJiYgKHRoaXMubmV0d29yay5vZmZsaW5lIHx8IGRhdGEub2ZmbGluZSA9PT0gdHJ1ZSk7XG4gICAgaWYgKG9mZmxpbmUpICB7XG4gICAgICB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gPSBwcmV2aW91c1Rva2VuO1xuXG4gICAgICAvLyBNYWtlIHN1cmUgbmV0d29yayBpZiBzZXQgYXMgb2ZmbGluZVxuICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiBmYWxzZX0pO1xuICAgICAgY29uc29sZS5pbmZvKGBbYWNjb3VudF0gTG9naW4gW09LXSB7cHVia2V5OiAke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9fSwge29mZmxpbmU6IHRydWV9YCk7XG4gICAgfVxuXG4gICAgLy8gT25saW5lIG1vZGU6IHRyeSB0byBhdXRoIG9uIHBvZFxuICAgIGVsc2Uge1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhlbnRpY2F0ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE5ldmVyIGF1dGhlbnRpY2F0ZSwgb3Igbm90IHJlYWR5IGZvciBvZmZsaW5lIG1vZGUgPT4gZXhpdFxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhY2NvdW50IGRhdGFcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSh7b2ZmbGluZSwgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGFjY291bnQgbm90IGZvdW5kLCBjaGVjayBpZiBlbWFpbCBpcyB2YWxpZFxuICAgICAgaWYgKGVyciAmJiArKGVyci5jb2RlKSA9PT0gRXJyb3JDb2Rlcy5MT0FEX0FDQ09VTlRfRVJST1IpIHtcblxuICAgICAgICAvLyBDaGVjayBlbWFpbCBleGlzdHNcbiAgICAgICAgaWYgKGRhdGEudXNlcm5hbWUuaW5kZXhPZignQCcpICE9PSAtMSkge1xuICAgICAgICAgIGxldCBpc0VtYWlsRXhpc3RzO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpc0VtYWlsRXhpc3RzID0gYXdhaXQgdGhpcy5pc0VtYWlsRXhpc3RzKGRhdGEudXNlcm5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKG90aGVyRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IGVycjsgLy8gcmVzZW5kIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVtYWlsIG5vdCBleGlzdHMgKG5vIGFjY291bnQpXG4gICAgICAgICAgaWYgKCFpc0VtYWlsRXhpc3RzKSB7XG4gICAgICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMLCBtZXNzYWdlOiAnRVJST1IuVU5LTk9XTl9BQ0NPVU5UX0VNQUlMJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtYWlsIGV4aXN0cywgc28gZXJyb3IgPSAnYmFkIHBhc3N3b3JkJ1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQkFEX1BBU1NXT1JELCBtZXNzYWdlOiAnRVJST1IuQkFEX1BBU1NXT1JEJyB9O1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7IC8vIHJlc2VuZCB0aGUgZmlyc3QgZXJyb3JcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gU3RvcmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5yZXNldERhdGEoKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnQgdG8gb2JzZXJ2ZXJzXG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZChvcHRzPzoge3Nob3dUb2FzdD86IGJvb2xlYW59KTogUHJvbWlzZTxBY2NvdW50PiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjaGVjayBhY2NvdW50IGluIG9mZmxpbmUgbW9kZScpO1xuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBjb25zdCB3YXNMb2dpbiA9IHRoaXMuaXNMb2dpbigpO1xuXG4gICAgdHJ5IHtcblxuICAgICAgYXdhaXQgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgYXdhaXQgdGhpcy5zYXZlTG9jYWxseSgpO1xuXG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gUmVsb2FkaW5nIGFjY291bnQgW09LXSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgKTtcblxuICAgICAgLy8gRW1pdCBsb2dpbiBldmVudCB0byBzdWJzY3JpYmVyc1xuICAgICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG5cbiAgICAgIC8vIERpc3BsYXkgdG9hc3QgKHdpdGhvdXQgYXdhaXQsIGJlY2F1c2Ugbm90IG5lZWQgdG8gd2FpdCB0b2FzdCBjbG9zZSBldmVudClcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLnNob3dUb2FzdCAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdBQ0NPVU5ULklORk8uUkVMT0FERUQnLCB0eXBlOiAnaW5mbyd9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2Fubm90IHJlbG9hZCBidXQgd2FzIGxvZ2luOiBmb3JjZSB0byBsb2dvdXRcbiAgICAgIGlmICh3YXNMb2dpbiAmJiAhdGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW2FjY291bnRdIFJlbG9hZGluZyBhY2NvdW50IGZhaWxlZC4gV2lsbCBmb3JjZSBsb2dvdXQuLi5gLCBlcnJvcik7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciB1cGRhdGUgYW4gdXNlciBhY2NvdW50LCB0byB0aGUgcmVtb3RlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIGFjY291bnRcbiAgICovXG4gIGFzeW5jIHNhdmUoYWNjb3VudDogQWNjb3VudCk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuICAgIGlmICh0aGlzLl9jYWNoZS5wdWJrZXkgIT09IGFjY291bnQucHVia2V5KSByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ05vdCB1c2VyIGFjY291bnQnKTtcblxuICAgIGFjY291bnQgPSBhd2FpdCB0aGlzLnNhdmVSZW1vdGVseShhY2NvdW50LCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcblxuICAgIC8vIFNldCBkZWZhdWx0c1xuICAgIGFjY291bnQuYXZhdGFyID0gYWNjb3VudC5hdmF0YXIgfHwgKHRoaXMuZW52aXJvbm1lbnQuYmFzZVVybCArIERFRkFVTFRfQVZBVEFSX0lNQUdFKTtcbiAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuXG4gICAgdGhpcy5fZGF0YSA9IGFjY291bnQ7XG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gdHJ1ZTtcblxuICAgIC8vIFNhdmUgbG9jYWxseSAoaW4gc3RvcmFnZSlcbiAgICBhd2FpdCB0aGlzLnNhdmVMb2NhbGx5KCk7XG5cbiAgICAvLyBTZW5kIGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG5cbiAgICBjb25zdCBoYWRBdXRoVG9rZW4gPSB0aGlzLl9jYWNoZS5hdXRoVG9rZW4gJiYgdHJ1ZTtcbiAgICBjb25zdCBoYWRBdXRoQmFzaWMgPSB0aGlzLl9jYWNoZS5hdXRoQmFzaWMgJiYgdHJ1ZTtcbiAgICBjb25zdCBwdWJrZXkgPSB0aGlzLl9jYWNoZSAmJiB0aGlzLl9jYWNoZS5wdWJrZXk7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCkpIHtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBkYXRhIGZyb20gdGhlIGxvY2FsIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShQVUJLRVlfU1RPUkFHRV9LRVkpLFxuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKSxcbiAgICAgICAgcHVia2V5ICYmIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHB1YmtleSkgfHwgUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gT2ZmbGluZSBmZWF0dXJlcyBlbmFibGU6IG5lZWQgdG8ga2VlcCBzb21lIGRhdGFcbiAgICBlbHNlIHtcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgb25seSBzZWNyZXQga2V5XG4gICAgICAvLyBCdXQga2VlcDpcbiAgICAgIC8vIC0gYWNjb3VudCBieSBwdWJrZXlcbiAgICAgIC8vIC0gYXV0aCB0b2tlblxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoQUNDT1VOVF9TVE9SQUdFX0tFWSksXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmUoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gcGFnZSBoaXN0b3J5LCBpbiBsb2NhbCBzZXR0aW5nc1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuY2xlYXJQYWdlSGlzdG9yeSgpO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgIHRoaXMub25Mb2dvdXQubmV4dCgpO1xuICAgIGlmIChoYWRBdXRoVG9rZW4pIHRoaXMub25BdXRoVG9rZW5DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIGlmIChoYWRBdXRoQmFzaWMpIHRoaXMub25BdXRoQmFzaWNDaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMub25DaGFuZ2UubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBhY2NvdW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyBsb2FkKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgICBxdWVyeT86IGFueTtcbiAgfSk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBMb2FkaW5nIGFjY291bnQuLi5gKTtcbiAgICBsZXQganNvbjogYW55O1xuXG4gICAgLy8gTG9hZCBsb2NhbGx5XG4gICAgY29uc3Qgb2ZmbGluZSA9IHRoaXMubmV0d29yay5vZmZsaW5lXG4gICAgICAmJiAoIW9wdHMgfHwgKG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduZXR3b3JrLW9ubHknICYmIG9wdHMuZmV0Y2hQb2xpY3kgIT09ICduby1jYWNoZScpKVxuICAgICAgfHwgKG9wdHMgJiYgb3B0cy5vZmZsaW5lID09PSB0cnVlKTtcbiAgICBpZiAob2ZmbGluZSkge1xuICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uID0ganNvbiAmJiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSAmJiBKU09OLnBhcnNlKGpzb24pIHx8IGpzb247XG4gICAgICBqc29uID0ganNvbiAmJiB0aGlzLl9jYWNoZS5wdWJrZXkgJiYgKGpzb24ucHVia2V5ID09PSB0aGlzLl9jYWNoZS5wdWJrZXkpICYmIGpzb24gfHwgbnVsbDtcbiAgICAgIGlmICghanNvbiAmJiB0aGlzLl9jYWNoZS5wdWJrZXkpIHtcbiAgICAgICAganNvbiA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSArICcjJyArIHRoaXMuX2NhY2hlLnB1YmtleSk7XG4gICAgICAgIGpzb24gPSBqc29uICYmICh0eXBlb2YganNvbiA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbikgfHwganNvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb2FkIHJlbW90ZWx5XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBxdWVyeSA9IG9wdHM/LnF1ZXJ5IHx8ICh0aGlzLmFwaVRva2VuRW5hYmxlZCA/IFF1ZXJpZXMubG9hZFdpdGhUb2tlbnMgOiBRdWVyaWVzLmxvYWQpO1xuICAgICAgY29uc3Qge2RhdGF9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgZGF0YTogYW55IH0+KHtcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGVycm9yOiB7IGNvZGU6IEVycm9yQ29kZXMuTE9BRF9BQ0NPVU5UX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuTE9BRF9BQ0NPVU5UX0VSUk9SJyB9LFxuICAgICAgICBmZXRjaFBvbGljeTogb3B0cyAmJiBvcHRzLmZldGNoUG9saWN5IHx8ICduby1jYWNoZScgfHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICAgIGpzb24gPSBkYXRhO1xuICAgIH1cblxuICAgIGlmIChqc29uKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KGpzb24pO1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gQWNjb3VudCBsb2FkZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCwgYWNjb3VudCk7XG4gICAgICAgcmV0dXJuIGFjY291bnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbYWNjb3VudF0gQWNjb3VudCBub3QgZm91bmQgIWApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVRva2VuKGZsYWdzOiBudW1iZXIpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBHZW5lcmF0ZSB0b2tlbi4uLmApO1xuXG4gICAgY29uc3QgYXV0aENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZ2V0QXV0aENoYWxsZW5nZSgpO1xuICAgIC8vIEFkZCBGbGFncyB0byBjaGFsbGVuZ2VcbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBgJHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX06JHtmbGFnc31gO1xuICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IENyeXB0b1NlcnZpY2Uuc2lnbihjaGFsbGVuZ2UsIHRoaXMuX2NhY2hlLmtleXBhaXIpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gYCR7dGhpcy5fY2FjaGUucHVia2V5fToke2NoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIGlmIChuZXdUb2tlbikge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gVG9rZW4gZ2VuZXJhdGVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFthY2NvdW50XSBUb2tlbiBnZW5lcmF0aW9uIGZhaWxlZCAhYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGF2YWlsYWJsZSBmb3IgbmV3IGFjY291bnQgcmVnaXN0cmF0aW9uLlxuICAgKiBUaHJvdyBhbiBlcnJvciBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFbWFpbEF2YWlsYWJsZShlbWFpbDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbWFpbEV4aXN0cyA9IGF3YWl0IHRoaXMuaXNFbWFpbEV4aXN0cyhlbWFpbCk7XG4gICAgaWYgKGlzRW1haWxFeGlzdHMpIHtcbiAgICAgIHRocm93IHsgY29kZTogRXJyb3JDb2Rlcy5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQsIG1lc3NhZ2U6ICdFUlJPUi5FTUFJTF9BTFJFQURZX1JFR0lTVEVSRUQnIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGVtYWlsIGlzIGV4aXN0cyBpbiBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgaXNFbWFpbEV4aXN0cyhlbWFpbDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBDaGVja2luZyBpZiB7JyArIGVtYWlsICsgJ30gZXhpc3RzLi4uJyk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5ncmFwaHFsLnF1ZXJ5PHsgaXNFbWFpbEV4aXN0czogYm9vbGVhbiB9LCBJc0VtYWlsRXhpc3RzVmFyaWFibGVzPih7XG4gICAgICBxdWVyeTogSXNFbWFpbEV4aXN0c1F1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBoYXNoOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEVtYWlsIGV4aXN0OiAnICsgKGRhdGEgJiYgZGF0YS5pc0VtYWlsRXhpc3RzKSk7XG5cbiAgICByZXR1cm4gZGF0YSAmJiBkYXRhLmlzRW1haWxFeGlzdHM7XG4gIH1cblxuICBhc3luYyBzZW5kQ29uZmlybWF0aW9uRW1haWwoZW1haWw6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBsb2NhbGUgPSBsb2NhbGUgfHwgdGhpcy5zZXR0aW5ncy5sb2NhbGU7XG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybWF0aW9uIGVtYWlsIHRvIHsnICsgZW1haWwgKyAnfSB3aXRoIGxvY2FsZSB7JyArIGxvY2FsZSArICd9Li4uJyk7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTxib29sZWFuPih7XG4gICAgICBtdXRhdGlvbjogU2VuZENvbmZpcm1FbWFpbE11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBsb2NhbGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNFTlRfQ09ORklSTUFUSU9OX0VNQUlMX0ZBSUxFRCxcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLlNFTlRfQUNDT1VOVF9DT05GSVJNQVRJT05fRU1BSUxfRkFJTEVEJ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29uZmlybUVtYWlsKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNlbmRpbmcgY29uZmlybSByZXF1ZXN0IGZvciBlbWFpbCB7JyArIGVtYWlsICsgJ30gd2l0aCBjb2RlIHsnICsgY29kZSArICd9Li4uJyk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdyYXBocWwubXV0YXRlPHsgY29uZmlybUFjY291bnRFbWFpbDogYm9vbGVhbiB9Pih7XG4gICAgICBtdXRhdGlvbjogQ29uZmlybUVtYWlsTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIGNvZGVcbiAgICAgIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNPTkZJUk1fRU1BSUxfRkFJTEVELFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuQ09ORklSTV9BQ0NPVU5UX0VNQUlMX0ZBSUxFRCdcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzICYmIHJlcy5jb25maXJtQWNjb3VudEVtYWlsO1xuICB9XG5cbiAgbGlzdGVuQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IFN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCk7IC8vIEFscmVhZHkgc3RhcnRlZDogc2tpcFxuXG4gICAgcmV0dXJuIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKG9wdHMpO1xuICB9XG5cbiAgZ2V0IGFkZGl0aW9uYWxGaWVsZHMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCAkYWRkaXRpb25hbEZpZWxkcygpOiBPYnNlcnZhYmxlPEZvcm1GaWVsZERlZmluaXRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldEFkZGl0aW9uYWxGaWVsZChrZXk6IHN0cmluZyk6IEZvcm1GaWVsZERlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl8kYWRkaXRpb25hbEZpZWxkcy5nZXRWYWx1ZSgpLmZpbmQoZiA9PiBmLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyQWRkaXRpb25hbEZpZWxkKGZpZWxkOiBGb3JtRmllbGREZWZpbml0aW9uKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5fJGFkZGl0aW9uYWxGaWVsZHMuZ2V0VmFsdWUoKTtcbiAgICBpZiAodmFsdWVzLmZpbmQoZiA9PiBmLmtleSA9PT0gZmllbGQua2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFjY291bnQgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gRm91bmQgYWRkaXRpb25hbCBhY2NvdW50J3MgZmllbGQge2tleTogJHtmaWVsZC5rZXl9fWApO1xuICAgIHRoaXMuXyRhZGRpdGlvbmFsRmllbGRzLm5leHQodmFsdWVzLmNvbmNhdChmaWVsZCkpO1xuICB9XG5cbiAgZ2V0IG9wdGlvbkRlZnMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRGVmcztcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKGRlZjogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGlmICh0aGlzLl9vcHRpb25EZWZzLmZpbmRJbmRleChmID0+IGYua2V5ID09PSBkZWYua2V5KSAhPT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19IGFscmVhZHkgZGVmaW5lLmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBZGRpbmcgYWRkaXRpb25hbCBvcHRpb24geyR7ZGVmLmtleX19YCwgZGVmKTtcbiAgICB0aGlzLl9vcHRpb25EZWZzLnB1c2goZGVmKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9ucyhkZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICAoZGVmcyB8fCBbXSkuZm9yRWFjaChkZWYgPT4gdGhpcy5yZWdpc3Rlck9wdGlvbihkZWYpKTtcbiAgfVxuXG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZCAtLSAqL1xuXG4gIHByb3RlY3RlZCByZXNldERhdGEoKSB7XG4gICAgdGhpcy5zdG9wTGlzdGVuUmVtb3RlQ2hhbmdlcygpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NhY2hlLmtleXBhaXIgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IG51bGw7XG4gICAgdGhpcy5fY2FjaGUuYXV0aEJhc2ljID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wdWJrZXkgPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLm1haW5Qcm9maWxlID0gbnVsbDtcbiAgICB0aGlzLl9jYWNoZS5wZXJzb24gPSBudWxsO1xuICAgIHRoaXMuX2NhY2hlLmRlcGFydG1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQWNjb3VudCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxvYWREYXRhKG9wdHM/OiB7XG4gICAgb2ZmbGluZT86IGJvb2xlYW47XG4gICAgZmV0Y2hQb2xpY3k/OiBGZXRjaFBvbGljeTtcbiAgfSk6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGlmICghdGhpcy5fY2FjaGUucHVia2V5KSB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGxvZ2dlZCcpO1xuXG4gICAgdGhpcy5fY2FjaGUubG9hZGVkID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IChhd2FpdCB0aGlzLmxvYWQob3B0cykpIHx8IG5ldyBBY2NvdW50KCk7XG5cbiAgICAgIC8vIFNldCBkZWZhdWx0c1xuICAgICAgYWNjb3VudC5hdmF0YXIgPSBhY2NvdW50LmF2YXRhciB8fCAodGhpcy5lbnZpcm9ubWVudC5iYXNlVXJsICsgREVGQVVMVF9BVkFUQVJfSU1BR0UpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MgfHwgbmV3IFVzZXJTZXR0aW5ncygpO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5sb2NhbGUgPSBhY2NvdW50LnNldHRpbmdzLmxvY2FsZSB8fCB0aGlzLnNldHRpbmdzLmxvY2FsZTtcbiAgICAgIGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCA9IGFjY291bnQuc2V0dGluZ3MubGF0TG9uZ0Zvcm1hdCB8fCB0aGlzLnNldHRpbmdzLmxhdExvbmdGb3JtYXQgfHwgJ0RETU0nO1xuICAgICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50ID0gYWNjb3VudC5zZXR0aW5ncy5jb250ZW50IHx8IHt9O1xuXG4gICAgICAvLyBSZWFkIG1haW4gcHJvZmlsZVxuICAgICAgdGhpcy5fY2FjaGUubWFpblByb2ZpbGUgPSBQZXJzb25VdGlscy5nZXRNYWluUHJvZmlsZShhY2NvdW50LnByb2ZpbGVzKTtcblxuICAgICAgLy8gVXBkYXRlLCBpbnN0ZWFkIG9mIHJlcGxhY2UgaXRcbiAgICAgIGlmICh0aGlzLl9kYXRhKSB7XG4gICAgICAgIHRoaXMuX2RhdGEuZnJvbU9iamVjdChhY2NvdW50KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAgIC8vIEFwcGx5IHNldHRpbmdzLCBmb3VuZCBpbiByZW1vdGUgYWNjb3VudFxuICAgICAgaWYgKGFjY291bnQuc2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5hY2NvdW50LnNldHRpbmdzLmFzTG9jYWxTZXR0aW5ncygpXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MuYXBwbHkoc2V0dGluZ3MpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgJiYgZXJyb3IubWVzc2FnZSkgdGhyb3cgZXJyb3I7XG5cbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhyb3cge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkxPQURfQUNDT1VOVF9FUlJPUixcbiAgICAgICAgbWVzc2FnZTogJ0VSUk9SLkxPQURfQUNDT1VOVF9FUlJPUidcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGxpc3RlblNldHRpbmdzKCk6IFByb21pc2U8dm9pZD57XG4gICAgLy8gV2hlbiBzZXR0aW5ncyBjaGFuZ2VkOiBzYXZlIGl0IHJlbW90ZWx5XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2VcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmlzTG9naW4oKSAmJiB0aGlzLm5ldHdvcmsub25saW5lKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoc2V0dGluZ3MgPT4gdGhpcy5zYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8QWNjb3VudCB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLy8gUmVzdG9yZSBmcm9tIHN0b3JhZ2VcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFBVQktFWV9TVE9SQUdFX0tFWSksXG4gICAgICB0aGlzLnN0b3JhZ2UuZ2V0KFRPS0VOX1NUT1JBR0VfS0VZKSxcbiAgICAgIHRoaXMuc3RvcmFnZS5nZXQoU0VDS0VZX1NUT1JBR0VfS0VZKVxuICAgIF0pO1xuICAgIGxldCBwdWJrZXkgPSB2YWx1ZXNbMF07XG4gICAgbGV0IHRva2VuID0gdmFsdWVzWzFdO1xuICAgIGNvbnN0IHNlY2tleSA9IHZhbHVlc1syXTtcblxuICAgIC8vIERFViBvbmx5IC0gYXV0aCBieSB0b2tlblxuICAgIGlmICghdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uICYmIHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXM/LnRva2VuKSB7XG4gICAgICB0b2tlbiA9IHRva2VuIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEF1dGhWYWx1ZXMudG9rZW47XG4gICAgICBwdWJrZXkgPSBwdWJrZXkgfHwgdG9rZW4/LnNwbGl0KCc6JywgMilbMF07XG4gICAgfVxuXG4gICAgLy8gUXVpdCBpZiBubyBwdWJrZXkgKG5vdCBsb2dnZWQpXG4gICAgaWYgKCFwdWJrZXkpIHJldHVybjtcblxuICAgIC8vIFF1aXQgaWYgY291bGQgbm90IGF1dGggb24gcG9kXG4gICAgY29uc3QgY2FuUmVtb3RlQXV0aCA9IHRva2VuIHx8IHNlY2tleSB8fCBmYWxzZTtcbiAgICBpZiAoIWNhblJlbW90ZUF1dGgpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVzdG9yYXRpb24uLi5gKTtcblxuICAgIHRoaXMuX2NhY2hlLmF1dGhUb2tlbiA9IHRva2VuO1xuICAgIHRoaXMuX2NhY2hlLnB1YmtleSA9IHB1YmtleTtcbiAgICB0aGlzLl9jYWNoZS5rZXlwYWlyID0gc2Vja2V5ICYmIHtcbiAgICAgIHB1YmxpY0tleTogQmFzZTU4LmRlY29kZShwdWJrZXkpLFxuICAgICAgc2VjcmV0S2V5OiBCYXNlNTguZGVjb2RlKHNlY2tleSlcbiAgICB9IHx8IG51bGw7XG5cbiAgICAvLyBPbmxpbmUgbW9kZTogdHJ5IHRvIGNvbm5lY3QgdG8gcG9kXG4gICAgaWYgKHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGUuYXV0aFRva2VuICYmICF0aGlzLl9jYWNoZS5hdXRoQmFzaWMpIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2ZmbGluZSBmZWF0dXJlIGFyZSBlbmFibGU6IGNvbnRpbnVlIGluIG9mZmxpbmUgbW9kZVxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oYXNPZmZsaW5lRmVhdHVyZSgpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbYWNjb3VudF0gVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBvbiBwb2Q6IGZvcmNpbmcgb2ZmbGluZSBtb2RlJyk7XG4gICAgICAgICAgdGhpcy5uZXR3b3JrLnNldEZvcmNlT2ZmbGluZSh0cnVlLCB7c2hvd1RvYXN0OiBmYWxzZX0pO1xuICAgICAgICAgIC8vIENvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gb2ZmbGluZSBmZWF0dXJlcyBlbmFibGUgKD1vZmZsaW5lIG1vZGUgbm90IGFsbG93ZWQpXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGFjY291bnQsIGZyb20gcHVia2V5XG4gICAgbGV0IGpzb25BY2NvdW50ID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3B1YmtleX1gKTtcbiAgICBpZiAoIWpzb25BY2NvdW50KSB7XG4gICAgICAvLyBUcnkgdXNpbmcgdGhlIG9sZCBzdG9yYWdlIGtleVxuICAgICAgY29uc3QgYWNjb3VudFN0ciA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXQoQUNDT1VOVF9TVE9SQUdFX0tFWSk7XG4gICAgICBqc29uQWNjb3VudCA9IGFjY291bnRTdHIgJiYgKCh0eXBlb2YgYWNjb3VudFN0ciA9PT0gJ3N0cmluZycpICYmIEpTT04ucGFyc2UoanNvbkFjY291bnQpIHx8IGFjY291bnRTdHIpO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgYWNjb3VudDogZG8gbm90IHVzZSBpdFxuICAgIGlmICghanNvbkFjY291bnQgfHwganNvbkFjY291bnQucHVia2V5ICE9PSBwdWJrZXkpIHtcblxuICAgICAgLy8gREVWIG9ubHk6IGNyZWF0ZSBhIGZha2UgYWNjb3VudCB3aXRoIGdpdmVuIHVzZXJuYW1lXG4gICAgICBpZiAoIXRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiAmJiB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBdXRoVmFsdWVzLnVzZXJuYW1lKSB7XG4gICAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcy51c2VybmFtZTtcbiAgICAgICAganNvbkFjY291bnQgPSB7cHVia2V5LCB1c2VybmFtZSwgZmlyc3ROYW1lOiB1c2VybmFtZSwgbGFzdE5hbWU6IHVzZXJuYW1lfTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIHRvIGVudGl0eVxuICAgIGNvbnN0IGFjY291bnQgPSBBY2NvdW50LmZyb21PYmplY3QoanNvbkFjY291bnQpO1xuXG4gICAgLy8gVXBkYXRlIGRhdGFcbiAgICB0aGlzLl9kYXRhID0gYWNjb3VudDtcbiAgICB0aGlzLl9jYWNoZS5tYWluUHJvZmlsZSA9IFBlcnNvblV0aWxzLmdldE1haW5Qcm9maWxlKGFjY291bnQucHJvZmlsZXMpO1xuICAgIHRoaXMuX2NhY2hlLmxvYWRlZCA9IHRydWU7XG5cbiAgICAvLyBFbWl0IGV2ZW50XG4gICAgdGhpcy5vbkxvZ2luLm5leHQodGhpcy5fZGF0YSk7XG4gICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuXG4gICAgaWYgKHRoaXMuX2VuYWJsZUxpc3RlbkNoYW5nZXMpIHRoaXMuc3RhcnRMaXN0ZW5SZW1vdGVDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBBY2NvdW50IHJlc3RvcmF0aW9uIFtPS10ge3B1YmtleTogJHtwdWJrZXkuc3Vic3RyKDAsIDgpfX0sIHtwcm9maWxlOiAke3RoaXMuX2NhY2hlLm1haW5Qcm9maWxlfX1gKTtcblxuICAgIHJldHVybiBhY2NvdW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYWNjb3VudCBpbnRvIHRoZSBsb2NhbCBzdG9yYWdlXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZUxvY2FsbHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCB7JHt0aGlzLl9jYWNoZS5wdWJrZXkuc3Vic3RyaW5nKDAsIDYpfX0gaW4gbG9jYWwgc3RvcmFnZS4uLmApO1xuXG4gICAgLy8gQ29udmVydCBhY2NvdW50IHRvIGpzb25cbiAgICBjb25zdCBqc29uID0gdGhpcy5fZGF0YS5hc09iamVjdCh7a2VlcFR5cGVuYW1lOiB0cnVlfSk7XG4gICAgY29uc3Qgc2Vja2V5ID0gdGhpcy5fY2FjaGUua2V5cGFpciAmJiB0aGlzLl9jYWNoZS5rZXlwYWlyLnNlY3JldEtleSAmJiBCYXNlNTguZW5jb2RlKHRoaXMuX2NhY2hlLmtleXBhaXIuc2VjcmV0S2V5KSB8fCBudWxsO1xuXG4gICAgLy8gQ29udmVydCBhdmF0YXIgVVJMIHRvIGRhdGFVcmwgKGUuZy4gJ2RhdGE6aW1hZ2UvcG5nOjxiYXNlNjQgY29udGVudD4nKVxuICAgIGNvbnN0IGhhc0F2YXRhclVybCA9IGpzb24uYXZhdGFyICYmICFqc29uLmF2YXRhci5lbmRzV2l0aChERUZBVUxUX0FWQVRBUl9JTUFHRSkgJiZcbiAgICAgIChqc29uLmF2YXRhci5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgKGpzb24uYXZhdGFyLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKTtcbiAgICBpZiAoaGFzQXZhdGFyVXJsICYmIHRoaXMubmV0d29yay5vbmxpbmUpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZS5nZXRJbWFnZShqc29uLmF2YXRhciwge1xuICAgICAgICB0aHVtYm5haWw6IHRydWUsXG4gICAgICAgIG91dHB1dFR5cGU6ICdkYXRhVXJsJ1xuICAgICAgfSlcbiAgICAgICAgLnRoZW4oZGF0YVVybCA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFVcmwgJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBJbWFnZSBmZXRjaGVkOiAnLCBkYXRhVXJsLnN1YnN0cmluZygwLCA1MCkpO1xuXG4gICAgICAgICAgLy8gVE9ETzogbWFrZSBzdXJlIHRvIGRpc3BsYXkgQmFzZTY0IGltYWdlIGluIHRoZSBtZW51IHRvcCBoZWFkZXJcbiAgICAgICAgICAvL2pzb25BY2NvdW50LmF2YXRhciA9IGRhdGFVcmw7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFthY2NvdW50XSBFcnJvciB3aGlsZSBmZXRjaGluZyBpbWFnZTogJHtqc29uLmF2YXRhcn06ICR7ZXJyfWApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KFBVQktFWV9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUucHVia2V5KSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChUT0tFTl9TVE9SQUdFX0tFWSwgdGhpcy5fY2FjaGUuYXV0aFRva2VuKSxcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldChgJHtBQ0NPVU5UX1NUT1JBR0VfS0VZfSMke3RoaXMuX2NhY2hlLnB1YmtleX1gLCBqc29uKSxcbiAgICAgICAgLy8gU2VjcmV0IGtleSAob3B0aW9uYWwpXG4gICAgICAgIHNlY2tleSAmJiB0aGlzLnN0b3JhZ2Uuc2V0KFNFQ0tFWV9TVE9SQUdFX0tFWSwgc2Vja2V5KSB8fCB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFQ0tFWV9TVE9SQUdFX0tFWSksXG4gICAgICAgIC8vIFJlbW92ZSBvbGQgc3RvcmFnZSBrZXlcbiAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZShBQ0NPVU5UX1NUT1JBR0VfS0VZKVxuICAgICAgXSk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIEFjY291bnQgc2F2ZWQgaW4gbG9jYWwgc3RvcmFnZScpO1xuICAgIH1cbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1thY2NvdW50XSBFcnJvciB3aGlsZSBzYXZpbmcgYWNjb3VudCBsb2NhbGx5OiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gICBhc3luYyBzYXZlTG9jYWxTZXR0aW5nc1JlbW90ZWx5KHNvdXJjZTogTG9jYWxTZXR0aW5ncyl7XG4gICAgIGlmICghc291cmNlIHx8ICF0aGlzLmlzTG9naW4oKSB8fCBzb3VyY2UuYWNjb3VudEluaGVyaXRhbmNlID09PSBmYWxzZSkgcmV0dXJuOyAvLyBTa2lwXG4gICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLmFjY291bnQ7XG5cbiAgICAgLy8gTWVyZ2UgbG9jYWwgc2V0dGluZ3MgaW50byBhY2NvdW50J3Mgc2V0dGluZ3NcbiAgICAgY29uc3Qgc2V0dGluZ3MgPSBVc2VyU2V0dGluZ3MuZnJvbU9iamVjdChhY2NvdW50LnNldHRpbmdzKSB8fCBuZXcgVXNlclNldHRpbmdzKCk7XG4gICAgIGNvbnN0IGNoYW5nZWQgPSBzZXR0aW5ncy5tZXJnZShzb3VyY2UsIFsnbG9jYWxlJywgJ2xhdExvbmdGb3JtYXQnLCAncHJvcGVydGllcyddKTtcblxuICAgICBpZiAoIWNoYW5nZWQpIHJldHVybjsgLy8gU2tpcCBpZiB1bmNoYW5nZWRcblxuICAgICAvLyBTYXZlIHJlbW90ZWx5XG4gICAgIHRoaXMuYWNjb3VudC5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgICBhd2FpdCB0aGlzLnNhdmVTZXR0aW5nc1JlbW90ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIGFuIHVzZXIgYWNjb3VudFxuICAgKlxuICAgKiBAcGFyYW0gYWNjb3VudFxuICAgKiBAcGFyYW0ga2V5UGFpclxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVSZW1vdGVseShhY2NvdW50OiBBY2NvdW50LCBrZXlQYWlyPzogS2V5cGFpcik6IFByb21pc2U8QWNjb3VudD4ge1xuICAgIGFjY291bnQucHVia2V5ID0gYWNjb3VudC5wdWJrZXkgfHwgKGtleVBhaXIgJiYgQmFzZTU4LmVuY29kZShrZXlQYWlyLnB1YmxpY0tleSkpO1xuICAgIGlmICghYWNjb3VudC5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhY2NvdW50IHB1YmtleScpO1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgYWNjb3VudCByZW1vdGVseS4uLmApO1xuXG4gICAgY29uc3QgaXNOZXcgPSBpc05pbChhY2NvdW50LmlkKTtcblxuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlOiBnZXQgZXhpc3RpbmcgYWNjb3VudCdzIHVwZGF0ZURhdGUsIHRvIGF2b2lkICd2ZXJzaW9uIGVycm9yJyB3aGVuIHNhdmluZ1xuICAgIGlmICghaXNOZXcpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudCA9IGF3YWl0IHRoaXMubG9hZCh7IGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyB9KTtcbiAgICAgIGlmICghZXhpc3RpbmdBY2NvdW50IHx8ICFleGlzdGluZ0FjY291bnQudXBkYXRlRGF0ZSkge1xuICAgICAgICB0aHJvdyB7IGNvZGU6IEVycm9yQ29kZXMuQUNDT1VOVF9OT1RfRVhJU1RTLCBtZXNzYWdlOiAnRVJST1IuQUNDT1VOVF9OT1RfRVhJU1RTJyB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlKGV4aXN0aW5nQWNjb3VudCwgYWNjb3VudCk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2luZyBzZXR0aW5nc1xuICAgIGFjY291bnQuc2V0dGluZ3MuY29udGVudFsncGFnZXMnXSA9IHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MucGFnZXM7XG4gICAgYWNjb3VudC5zZXR0aW5ncy5jb250ZW50WydwYWdlSGlzdG9yeSddID0gdGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5wYWdlSGlzdG9yeTtcblxuICAgIC8vIENvbnZlcnQgdG8ganNvblxuICAgIGNvbnN0IGpzb24gPSBhY2NvdW50LmFzT2JqZWN0KE1JTklGWV9FTlRJVFlfRk9SX1BPRCk7XG5cbiAgICAvLyBVc2VyIG5vdCBhbGxvdyB0byBjaGFuZ2UgaGlzIHByb2ZpbGVzXG4gICAgZGVsZXRlIGpzb24ucHJvZmlsZXM7XG5cbiAgICBjb25zdCBtdXRhdGlvbiA9IGlzTmV3ID8gTXV0YXRpb25zLmNyZWF0ZSA6XG4gICAgICAodGhpcy5fYXBpVG9rZW5FbmFibGVkICA/IE11dGF0aW9ucy5zYXZlV2l0aFRva2VucyA6IE11dGF0aW9ucy5zYXZlKTtcblxuICAgIC8vIEV4ZWN1dGUgbXV0YXRpb25cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuZ3JhcGhxbC5tdXRhdGU8eyBkYXRhOiBBY2NvdW50IH0+KHtcbiAgICAgIG11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7IGRhdGE6IGpzb24gfSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU0FWRV9BQ0NPVU5UX0VSUk9SLFxuICAgICAgICBtZXNzYWdlOiAnRVJST1IuU0FWRV9BQ0NPVU5UX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZShkYXRhLCBhY2NvdW50KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIEFjY291bnQgcmVtb3RlbHkgc2F2ZWQgaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICByZXR1cm4gYWNjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgdXBkYXRlIHVzZXIgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVNldHRpbmdzUmVtb3RlbHkoc2V0dGluZ3M6IFVzZXJTZXR0aW5ncykge1xuXG4gICAgY29uc3Qgbm93ID0gdGhpcy5fZGVidWcgJiYgRGF0ZS5ub3coKTtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBTYXZpbmcgc2V0dGluZ3MgcmVtb3RlbHkuLi5gKTtcblxuICAgIGNvbnN0IGpzb24gPSBzZXR0aW5ncy5hc09iamVjdChNSU5JRllfRU5USVRZX0ZPUl9QT0QpO1xuXG4gICAgLy8gRXhlY3V0ZSBtdXRhdGlvblxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5ncmFwaHFsLm11dGF0ZTx7IGRhdGE6IFVzZXJTZXR0aW5ncyB9Pih7XG4gICAgICBtdXRhdGlvbjogTXV0YXRpb25zLnNhdmVTZXR0aW5ncyxcbiAgICAgIHZhcmlhYmxlczogeyBkYXRhOiBqc29uIH0sXG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlNBVkVfU0VUVElOR1NfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5TQVZFX1NFVFRJTkdTX0VSUk9SJ1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ29weSB1cGRhdGUgcHJvcGVydGllc1xuICAgIHRoaXMuY29weUlkQW5kVXBkYXRlRGF0ZVNldHRpbmdzKGRhdGEsIHNldHRpbmdzKTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFNldHRpbmdzIHJlbW90ZWx5IHNhdmVkIGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgLy8gU2F2ZSBpbnRvIGFjY291bnRcbiAgICBpZiAodGhpcy5hY2NvdW50KSB0aGlzLmFjY291bnQuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBhdXRoZW50aWNhdGVBbmRHZXRUb2tlbih0b2tlbj86IHN0cmluZywgY291bnRlcj86IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9jYWNoZS5wdWJrZXkpIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgbG9nZ2VkJyk7XG5cbiAgICBpZiAoIWNvdW50ZXIpIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZC4uLicpO1xuXG4gICAgaWYgKGNvdW50ZXIgPiA0KSB7XG4gICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFthY2NvdW50XSBGYWlsZWQgdG8gYXV0aGVudGljYXRpb24gb24gcG9kIChhZnRlciAke2NvdW50ZXJ9IGF0dGVtcHRzKWApO1xuICAgICAgdGhyb3cgeyBjb2RlOiBFcnJvckNvZGVzLkFVVEhfU0VSVkVSX0VSUk9SLCBtZXNzYWdlOiAnRVJST1IuQVVUSF9TRVJWRVJfRVJST1InIH07XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdmFsaWRcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8eyBhdXRoZW50aWNhdGU6IGJvb2xlYW4gfSwgeyB0b2tlbjogc3RyaW5nIH0+KHtcbiAgICAgICAgcXVlcnk6IEF1dGhRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgdG9rZW5cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICAgICBtZXNzYWdlOiAnRVJST1IuVU5BVVRIT1JJWkVEJ1xuICAgICAgICB9LFxuICAgICAgICBmZXRjaFBvbGljeTogJ25vLWNhY2hlJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRva2VuIGlzIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuYXV0aGVudGljYXRlKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0b2tlblxuICAgICAgICB0aGlzLm9uQXV0aFRva2VuQ2hhbmdlLm5leHQodG9rZW4pO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2FjY291bnRdIEF1dGhlbnRpY2F0aW9uIG9uIHBvZCBbT0tdIHtwdWJrZXk6ICcke3RoaXMuX2NhY2hlLnB1YmtleS5zdWJzdHIoMCwgOCl9J31gKTtcbiAgICAgICAgcmV0dXJuIHRva2VuOyAvLyByZXR1cm4gdGhlIHRva2VuXG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRpbnVlICh3aWxsIHJldHJ5IHdpdGggYW5vdGhlciBjaGFsbGVuZ2UpXG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgYSBuZXcgdG9rZW5cbiAgICBjb25zdCBhdXRoQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5nZXRBdXRoQ2hhbGxlbmdlKCk7XG4gICAgLy8gVE9ETzogY2hlY2sgc2VydmVyIHB1YmtleSBhcyBhIHZhbGlkIGNlcnRpZmljYXRlXG5cbiAgICAvLyBEbyB0aGUgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgQ3J5cHRvU2VydmljZS5zaWduKGF1dGhDaGFsbGVuZ2UuY2hhbGxlbmdlLCB0aGlzLl9jYWNoZS5rZXlwYWlyKTtcbiAgICBjb25zdCBuZXdUb2tlbiA9IGAke3RoaXMuX2NhY2hlLnB1YmtleX06JHthdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZX18JHtzaWduYXR1cmV9YDtcblxuICAgIC8vIGl0ZXJhdGUgd2l0aCB0aGUgbmV3IHRva2VuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0aGVudGljYXRlQW5kR2V0VG9rZW4obmV3VG9rZW4sIChjb3VudGVyIHx8IDEpICsgMSAvKiBpbmNyZW1lbnQgKi8pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEF1dGhDaGFsbGVuZ2UoKTogUHJvbWlzZTxJQXV0aENoYWxsZW5nZT4ge1xuICAgIGNvbnN0IGNoYWxsZW5nZUVycm9yID0ge1xuICAgICAgY29kZTogRXJyb3JDb2Rlcy5BVVRIX0NIQUxMRU5HRV9FUlJPUixcbiAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BVVRIX0NIQUxMRU5HRV9FUlJPUidcbiAgICB9O1xuICAgIGNvbnN0IHsgYXV0aENoYWxsZW5nZX0gPSBhd2FpdCB0aGlzLmdyYXBocWwucXVlcnk8e1xuICAgICAgYXV0aENoYWxsZW5nZTogSUF1dGhDaGFsbGVuZ2U7XG4gICAgfT4oe1xuICAgICAgcXVlcnk6IEF1dGhDaGFsbGVuZ2VRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge30sXG4gICAgICBlcnJvcjogY2hhbGxlbmdlRXJyb3IsXG4gICAgICBmZXRjaFBvbGljeTogJ25ldHdvcmstb25seSdcbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGNoYWxsZW5nZVxuICAgIGlmICghYXV0aENoYWxsZW5nZSkgdGhyb3cgY2hhbGxlbmdlRXJyb3I7IC8vIFNob3VsZCBuZXZlciBvY2N1clxuXG4gICAgLy8gQ2hlY2sgc2VydmVyIHNpZ25hdHVyZVxuICAgIGNvbnN0IHNpZ25hdHVyZU9LID0gYXdhaXQgQ3J5cHRvU2VydmljZS52ZXJpZnkoXG4gICAgICBhdXRoQ2hhbGxlbmdlLmNoYWxsZW5nZSxcbiAgICAgIGF1dGhDaGFsbGVuZ2Uuc2lnbmF0dXJlLFxuICAgICAgYXV0aENoYWxsZW5nZS5wdWJrZXlcbiAgICApO1xuICAgIGlmICghc2lnbmF0dXJlT0spIHtcbiAgICAgIGNvbnNvbGUud2FybignRklYTUU6IEJhZCBwZWVyIHNpZ25hdHVyZSBvbiBhdXRoIGNoYWxsZW5nZSAhJywgYXV0aENoYWxsZW5nZSk7XG4gICAgfVxuICAgIHJldHVybiBhdXRoQ2hhbGxlbmdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0TGlzdGVuUmVtb3RlQ2hhbmdlcyhvcHRzPzogQWNjb3VudFdhdGNoT3B0aW9ucyk6IFN1YnNjcmlwdGlvbiB7XG4gICAgaWYgKHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24pIHRoaXMuc3RvcExpc3RlblJlbW90ZUNoYW5nZXMoKTsgLy8gU3RvcCBwcmV2aW91cyBzdWJzY3JpcHRpb25cbiAgICBpZiAodGhpcy5uZXR3b3JrLm9mZmxpbmUpIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKCk7IC8vIE9mZmxpbmU6IHNraXBcblxuICAgIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLndhdGNoQ2hhbmdlcyhvcHRzKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW2FjY291bnRdIFJlbW90ZSB1cGRhdGUgZGV0ZWN0ZWQgYXQgJHtkYXRhLnVwZGF0ZURhdGV9YCk7XG4gICAgICAgICAgdGhpcy5yZWxvYWQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICBpZiAoZXJyICYmICtlcnIuY29kZSA9PT0gU2VydmVyRXJyb3JDb2Rlcy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbygnW2FjY291bnRdIFtXU10gQWNjb3VudCBub3QgZXhpc3RzIGFueW1vcmU6IGZvcmNlIHVzZXIgdG8gbG9nb3V0Li4uJywgZXJyKTtcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgK2Vyci5jb2RlID09PSBTZXJ2ZXJFcnJvckNvZGVzLlVOQVVUSE9SSVpFRCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKCdbYWNjb3VudF0gW1dTXSBBY2NvdW50IG5vdCBhdXRob3JpemVkOiBmb3JjZSB1c2VyIHRvIGxvZ291dC4uLicsIGVycik7XG4gICAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1thY2NvdW50XSBbV1NdIFJlY2VpdmVkIGVycm9yOicsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLl9saXN0ZW5DaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gU3RvcCB3YXRjaGluZyByZW1vdGUgY2hhbmdlc2ApO1xuICAgICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2xpc3RlbkNoYW5nZXNTdWJzY3JpcHRpb247XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcExpc3RlblJlbW90ZUNoYW5nZXMoKSB7XG4gICAgdGhpcy5fbGlzdGVuQ2hhbmdlc1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3YXRjaENoYW5nZXMob3B0cz86IEFjY291bnRXYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPEFjY291bnQ+IHtcblxuICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICAvLyBXYWl0IHNlcnZpY2UgcmVhZHksIHRoZW4gbG9vcFxuICAgICAgcmV0dXJuIGZyb20odGhpcy5yZWFkeSgpKVxuICAgICAgICAucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy53YXRjaENoYW5nZXMob3B0cykpKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2NhY2hlLnB1YmtleSkgdGhyb3cgbmV3IEVycm9yKCdOb3QgbG9nZ2VkIGluJyk7XG4gICAgaWYgKHRoaXMubmV0d29yay5vZmZsaW5lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB3YXRjaCBhY2NvdW50IGNoYW5nZXM6IG5ldHdvcmsgaXMgb2ZmbGluZS4nKTtcblxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHtcbiAgICAgIGludGVydmFsOiB0b051bWJlcihvcHRzICYmIG9wdHMuaW50ZXJ2YWxJblNlY29uZHMsIHRoaXMuX2xpc3RlbkludGVydmFsSW5TZWNvbmRzKVxuICAgIH07XG5cbiAgICBjb25zb2xlLmRlYnVnKGBbYWNjb3VudF0gV2F0Y2hpbmcgcmVtb3RlIGNoYW5nZXMsIGV2ZXJ5ICR7dmFyaWFibGVzLmludGVydmFsfXNgKTtcblxuICAgIHJldHVybiB0aGlzLmdyYXBocWwuc3Vic2NyaWJlPHtkYXRhOiBhbnl9Pih7XG4gICAgICBxdWVyeTogQWNjb3VudFN1YnNjcmlwdGlvbnMubGlzdGVuQ2hhbmdlcyxcbiAgICAgIHZhcmlhYmxlcyxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIGNvZGU6IEVycm9yQ29kZXMuU1VCU0NSSUJFX0FDQ09VTlRfRVJST1IsXG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5BQ0NPVU5ULlNVQlNDUklCRV9FUlJPUidcbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgICBtYXAoKHtkYXRhfSkgPT4gZGF0YSksXG4gICAgICAgIC8vIEtlZXAgb25seSBpZiBuZXdlclxuICAgICAgICBmaWx0ZXIoZGF0YSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVwZGF0ZURhdGU6IE1vbWVudCA9IGZyb21EYXRlSVNPU3RyaW5nKHRoaXMuX2RhdGE/LnVwZGF0ZURhdGUpO1xuICAgICAgICAgIGNvbnN0IHJlbW90ZVVwZGF0ZURhdGU6IE1vbWVudCA9IGZyb21EYXRlSVNPU3RyaW5nKGRhdGE/LnVwZGF0ZURhdGUpO1xuICAgICAgICAgIHJldHVybiAocmVtb3RlVXBkYXRlRGF0ZSAmJiAoIWN1cnJlbnRVcGRhdGVEYXRlIHx8ICFyZW1vdGVVcGRhdGVEYXRlLmlzU2FtZShjdXJyZW50VXBkYXRlRGF0ZSwgJ21pbGxpc2Vjb25kJykpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29weUlkQW5kVXBkYXRlRGF0ZShzb3VyY2U6IEFjY291bnQgfCB1bmRlZmluZWQsIHRhcmdldDogQWNjb3VudCkge1xuICAgIGlmICghc291cmNlKSByZXR1cm47XG5cbiAgICB0YXJnZXQuaWQgPSBzb3VyY2UuaWQgfHwgdGFyZ2V0LmlkO1xuICAgIHRhcmdldC51cGRhdGVEYXRlID0gc291cmNlLnVwZGF0ZURhdGUgfHwgdGFyZ2V0LnVwZGF0ZURhdGU7XG5cbiAgICAvLyBVcGRhdGUgc2V0dGluZ3NcbiAgICB0aGlzLmNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2Uuc2V0dGluZ3MsIHRhcmdldC5zZXR0aW5ncyk7XG5cbiAgICAvLyBVcGRhdGUgdG9rZW5zXG4gICAgaWYgKHRoaXMuX2FwaVRva2VuRW5hYmxlZCkge1xuICAgICAgdGhpcy5jb3B5SWRBbmRVcGRhdGVEYXRlVG9rZW4oc291cmNlLnRva2VucywgdGFyZ2V0LnRva2Vucyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVTZXR0aW5ncyhzb3VyY2U6IFVzZXJTZXR0aW5ncyB8IHVuZGVmaW5lZCwgdGFyZ2V0OiBVc2VyU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNvdXJjZSkgcmV0dXJuO1xuXG4gICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICB0YXJnZXQudXBkYXRlRGF0ZSA9IHNvdXJjZS51cGRhdGVEYXRlIHx8IHRhcmdldC51cGRhdGVEYXRlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvcHlJZEFuZFVwZGF0ZURhdGVUb2tlbihzb3VyY2VzOiBVc2VyVG9rZW5bXSB8IHVuZGVmaW5lZCwgdGFyZ2V0czogVXNlclRva2VuW10pIHtcbiAgICBpZiAoaXNFbXB0eUFycmF5KHNvdXJjZXMpKSByZXR1cm47XG5cbiAgICBzb3VyY2VzLmZvckVhY2goc291cmNlID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5pZCA9PT0gc291cmNlLmlkIHx8IHZhbHVlLm5hbWUgPT09IHNvdXJjZS5uYW1lKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmlkID0gc291cmNlLmlkIHx8IHRhcmdldC5pZDtcbiAgICAgICAgdGFyZ2V0LmNyZWF0aW9uRGF0ZSA9IHNvdXJjZS5jcmVhdGlvbkRhdGUgfHwgdGFyZ2V0LmNyZWF0aW9uRGF0ZTtcbiAgICAgICAgdGFyZ2V0LnVwZGF0ZURhdGUgPSBzb3VyY2UudXBkYXRlRGF0ZSB8fCB0YXJnZXQudXBkYXRlRGF0ZTtcbiAgICAgICAgdGFyZ2V0LnRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dUb2FzdDxUID0gYW55PihvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxPdmVybGF5RXZlbnREZXRhaWw8VD4+IHtcbiAgICByZXR1cm4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCBvcHRzKTtcbiAgfVxufVxuIl19