@sumaris-net/ngx-components 18.0.10 → 18.1.1

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 (263) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/src/app/admin/admin-routing.module.mjs +5 -5
  3. package/esm2022/src/app/admin/admin.module.mjs +5 -5
  4. package/esm2022/src/app/admin/services/person.service.mjs +4 -4
  5. package/esm2022/src/app/admin/services/validator/person.validator.mjs +4 -4
  6. package/esm2022/src/app/admin/users/users.mjs +4 -4
  7. package/esm2022/src/app/admin/users/users.module.mjs +5 -5
  8. package/esm2022/src/app/core/about/about.modal.mjs +4 -4
  9. package/esm2022/src/app/core/about/about.module.mjs +5 -5
  10. package/esm2022/src/app/core/account/account.module.mjs +5 -5
  11. package/esm2022/src/app/core/account/account.page.mjs +4 -4
  12. package/esm2022/src/app/core/account/new-token.form.mjs +4 -4
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +4 -4
  14. package/esm2022/src/app/core/account/password/change-password.form.mjs +4 -4
  15. package/esm2022/src/app/core/account/password/change-password.module.mjs +5 -5
  16. package/esm2022/src/app/core/account/password/change-password.page.mjs +4 -4
  17. package/esm2022/src/app/core/account/token.table.mjs +4 -4
  18. package/esm2022/src/app/core/auth/auth.form.mjs +4 -4
  19. package/esm2022/src/app/core/auth/auth.modal.mjs +4 -4
  20. package/esm2022/src/app/core/auth/auth.module.mjs +5 -5
  21. package/esm2022/src/app/core/auth/reset-password.modal.mjs +4 -4
  22. package/esm2022/src/app/core/core.module.mjs +5 -5
  23. package/esm2022/src/app/core/core.testing.module.mjs +5 -5
  24. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +5 -5
  25. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +4 -4
  26. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +4 -4
  27. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +5 -5
  28. package/esm2022/src/app/core/form/entity/editor.class.mjs +4 -4
  29. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +4 -4
  30. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +4 -4
  31. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +4 -4
  32. package/esm2022/src/app/core/form/entity/entity.module.mjs +5 -5
  33. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +4 -4
  34. package/esm2022/src/app/core/form/form-container.class.mjs +4 -4
  35. package/esm2022/src/app/core/form/form.class.mjs +4 -4
  36. package/esm2022/src/app/core/form/form.module.mjs +5 -5
  37. package/esm2022/src/app/core/form/list/list.form.mjs +4 -4
  38. package/esm2022/src/app/core/form/list/list.module.mjs +5 -5
  39. package/esm2022/src/app/core/form/properties/properties.form.mjs +4 -4
  40. package/esm2022/src/app/core/form/properties/properties.module.mjs +5 -5
  41. package/esm2022/src/app/core/form/properties/properties.table.mjs +7 -7
  42. package/esm2022/src/app/core/form/properties/property.validator.mjs +4 -4
  43. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +4 -4
  44. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +5 -5
  45. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +4 -4
  46. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +5 -5
  47. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +4 -4
  48. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +5 -5
  49. package/esm2022/src/app/core/form/username/username.form.mjs +4 -4
  50. package/esm2022/src/app/core/form/username/username.module.mjs +5 -5
  51. package/esm2022/src/app/core/graphql/graphql.module.mjs +5 -5
  52. package/esm2022/src/app/core/graphql/graphql.service.mjs +4 -4
  53. package/esm2022/src/app/core/home/home.mjs +5 -5
  54. package/esm2022/src/app/core/home/home.module.mjs +5 -5
  55. package/esm2022/src/app/core/icon/icon.component.mjs +4 -4
  56. package/esm2022/src/app/core/icon/icon.module.mjs +5 -5
  57. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +4 -4
  58. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +5 -5
  59. package/esm2022/src/app/core/menu/menu.component.mjs +4 -4
  60. package/esm2022/src/app/core/menu/menu.module.mjs +5 -5
  61. package/esm2022/src/app/core/menu/menu.service.mjs +4 -4
  62. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +4 -4
  63. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +4 -4
  64. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +4 -4
  65. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +5 -5
  66. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +4 -4
  67. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +5 -5
  68. package/esm2022/src/app/core/peer/select-peer.modal.mjs +4 -4
  69. package/esm2022/src/app/core/peer/select-peer.module.mjs +5 -5
  70. package/esm2022/src/app/core/register/register-confirm.page.mjs +4 -4
  71. package/esm2022/src/app/core/register/register.form.mjs +4 -4
  72. package/esm2022/src/app/core/register/register.modal.mjs +4 -4
  73. package/esm2022/src/app/core/register/register.module.mjs +5 -5
  74. package/esm2022/src/app/core/services/account.service.mjs +4 -4
  75. package/esm2022/src/app/core/services/auth-guard.service.mjs +4 -4
  76. package/esm2022/src/app/core/services/base-entity-service.class.mjs +4 -4
  77. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +4 -4
  78. package/esm2022/src/app/core/services/config.service.mjs +4 -4
  79. package/esm2022/src/app/core/services/crypto.service.mjs +4 -4
  80. package/esm2022/src/app/core/services/local-settings.service.mjs +4 -4
  81. package/esm2022/src/app/core/services/network.service.mjs +4 -4
  82. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +9 -9
  83. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  84. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  85. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +5 -5
  86. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +4 -4
  87. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  88. package/esm2022/src/app/core/services/platform.service.mjs +4 -4
  89. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +4 -4
  90. package/esm2022/src/app/core/services/testing/referential.validator.mjs +4 -4
  91. package/esm2022/src/app/core/services/validator/account.validator.mjs +4 -4
  92. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +4 -4
  93. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +4 -4
  94. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +4 -4
  95. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +4 -4
  96. package/esm2022/src/app/core/settings/settings.module.mjs +5 -5
  97. package/esm2022/src/app/core/settings/settings.page.mjs +4 -4
  98. package/esm2022/src/app/core/table/async-table.class.mjs +4 -4
  99. package/esm2022/src/app/core/table/column/actions-column.component.mjs +4 -4
  100. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +4 -4
  101. package/esm2022/src/app/core/table/column/row-field.component.mjs +4 -4
  102. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +4 -4
  103. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +4 -4
  104. package/esm2022/src/app/core/table/memory-table.class.mjs +4 -4
  105. package/esm2022/src/app/core/table/table-select-columns.component.mjs +4 -4
  106. package/esm2022/src/app/core/table/table.class.mjs +4 -4
  107. package/esm2022/src/app/core/table/table.module.mjs +5 -5
  108. package/esm2022/src/app/core/table/table.pipes.mjs +10 -10
  109. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +4 -4
  110. package/esm2022/src/app/core/table/testing/table.testing.mjs +4 -4
  111. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +5 -5
  112. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +4 -4
  113. package/esm2022/src/app/core/table/testing/table2.testing.mjs +4 -4
  114. package/esm2022/src/app/shared/audio/audio.mjs +4 -4
  115. package/esm2022/src/app/shared/audio/audio.testing.mjs +4 -4
  116. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +5 -5
  117. package/esm2022/src/app/shared/capacitor/keyboard.mjs +4 -4
  118. package/esm2022/src/app/shared/debug/debug.component.mjs +4 -4
  119. package/esm2022/src/app/shared/debug/debug.module.mjs +5 -5
  120. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +4 -4
  121. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +4 -4
  122. package/esm2022/src/app/shared/directives/directives.module.mjs +5 -5
  123. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
  124. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +4 -4
  125. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +4 -4
  126. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +4 -4
  127. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  128. package/esm2022/src/app/shared/file/file.service.mjs +4 -4
  129. package/esm2022/src/app/shared/form/field.component.mjs +4 -4
  130. package/esm2022/src/app/shared/form/loading-spinner.mjs +4 -4
  131. package/esm2022/src/app/shared/gesture/gesture-config.mjs +4 -4
  132. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +4 -4
  133. package/esm2022/src/app/shared/help/help.modal.mjs +4 -4
  134. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +4 -4
  135. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +4 -4
  136. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +5 -5
  137. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +4 -4
  138. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +5 -5
  139. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +4 -4
  140. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +4 -4
  141. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +5 -5
  142. package/esm2022/src/app/shared/image/image.module.mjs +5 -5
  143. package/esm2022/src/app/shared/image/image.service.mjs +4 -4
  144. package/esm2022/src/app/shared/logging/logging-service.class.mjs +4 -4
  145. package/esm2022/src/app/shared/logging/logging-service.module.mjs +5 -5
  146. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +4 -4
  147. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +5 -5
  148. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +4 -4
  149. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +4 -4
  150. package/esm2022/src/app/shared/material/badge/badge.module.mjs +5 -5
  151. package/esm2022/src/app/shared/material/badge/badge.test.mjs +4 -4
  152. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -5
  153. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +4 -4
  154. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +4 -4
  155. package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -5
  156. package/esm2022/src/app/shared/material/chips/material.chips.mjs +4 -4
  157. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +4 -4
  158. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +5 -5
  159. package/esm2022/src/app/shared/material/datetime/material.date.mjs +4 -4
  160. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +4 -4
  161. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +4 -4
  162. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +4 -4
  163. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +4 -4
  164. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +4 -4
  165. package/esm2022/src/app/shared/material/duration/duration.module.mjs +5 -5
  166. package/esm2022/src/app/shared/material/duration/material.duration.mjs +4 -4
  167. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +4 -4
  168. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +4 -4
  169. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +5 -5
  170. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +4 -4
  171. package/esm2022/src/app/shared/material/material.module.mjs +5 -5
  172. package/esm2022/src/app/shared/material/material.testing.module.mjs +5 -5
  173. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +4 -4
  174. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +4 -4
  175. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +4 -4
  176. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +5 -5
  177. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +4 -4
  178. package/esm2022/src/app/shared/material/testing/common.test.mjs +4 -4
  179. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +4 -4
  180. package/esm2022/src/app/shared/material/text/text-form.component.mjs +4 -4
  181. package/esm2022/src/app/shared/material/text/text-form.module.mjs +5 -5
  182. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +4 -4
  183. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  184. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +4 -4
  185. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +4 -4
  186. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +5 -5
  187. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +28 -28
  188. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +4 -4
  189. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +4 -4
  190. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +5 -5
  191. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +7 -7
  192. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +5 -5
  193. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +5 -5
  194. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +5 -5
  195. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +4 -4
  196. package/esm2022/src/app/shared/pipes/form.pipes.mjs +22 -22
  197. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  198. package/esm2022/src/app/shared/pipes/html.pipes.mjs +7 -7
  199. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +10 -10
  200. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +13 -13
  201. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +4 -4
  202. package/esm2022/src/app/shared/pipes/math.pipes.mjs +13 -13
  203. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +4 -4
  204. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  205. package/esm2022/src/app/shared/pipes/pipes.module.mjs +5 -5
  206. package/esm2022/src/app/shared/pipes/property.pipes.mjs +15 -15
  207. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +22 -22
  208. package/esm2022/src/app/shared/pipes/string.pipes.mjs +31 -31
  209. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +9 -9
  210. package/esm2022/src/app/shared/pipes/types.pipes.mjs +16 -16
  211. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +5 -5
  212. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +4 -4
  213. package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
  214. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +4 -4
  215. package/esm2022/src/app/shared/services/startable-service.class.mjs +4 -4
  216. package/esm2022/src/app/shared/services/translate-context.service.mjs +4 -4
  217. package/esm2022/src/app/shared/shared-routing.module.mjs +8 -8
  218. package/esm2022/src/app/shared/shared.module.mjs +5 -5
  219. package/esm2022/src/app/shared/shared.testing.module.mjs +5 -5
  220. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +4 -4
  221. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +5 -5
  222. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +5 -5
  223. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +5 -5
  224. package/esm2022/src/app/shared/storage/storage.service.mjs +4 -4
  225. package/esm2022/src/app/shared/testing/maskito.test.mjs +4 -4
  226. package/esm2022/src/app/shared/testing/observable.test.mjs +4 -4
  227. package/esm2022/src/app/shared/testing/tests.page.mjs +4 -4
  228. package/esm2022/src/app/shared/toast/toast.testing.mjs +4 -4
  229. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +5 -5
  230. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +4 -4
  231. package/esm2022/src/app/shared/toolbar/toolbar.mjs +4 -4
  232. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +5 -5
  233. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +4 -4
  234. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +5 -5
  235. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +4 -4
  236. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +4 -4
  237. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +4 -4
  238. package/esm2022/src/app/social/job/job.module.mjs +5 -5
  239. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +4 -4
  240. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +4 -4
  241. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +4 -4
  242. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +4 -4
  243. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +4 -4
  244. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +4 -4
  245. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +5 -5
  246. package/esm2022/src/app/social/message/message.form.mjs +4 -4
  247. package/esm2022/src/app/social/message/message.modal.mjs +4 -4
  248. package/esm2022/src/app/social/message/message.module.mjs +5 -5
  249. package/esm2022/src/app/social/message/message.service.mjs +4 -4
  250. package/esm2022/src/app/social/social.module.mjs +5 -5
  251. package/esm2022/src/app/social/social.testing.module.mjs +5 -5
  252. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +4 -4
  253. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +4 -4
  254. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +4 -4
  255. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +5 -5
  256. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +4 -4
  257. package/esm2022/src/app/social/user-event/user-event.module.mjs +5 -5
  258. package/esm2022/src/app/social/user-event/user-event.service.mjs +4 -4
  259. package/esm2022/src/environments/environment.loader.mjs +4 -4
  260. package/fesm2022/sumaris-net.ngx-components.mjs +1022 -1022
  261. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  262. package/package.json +11 -12
  263. package/src/assets/manifest.json +1 -1
@@ -401,10 +401,10 @@ export class MatDateShort {
401
401
  markForCheck() {
402
402
  this.cd.markForCheck();
403
403
  }
404
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatDateShort, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
405
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: MatDateShort, selector: "mat-date-short-field", inputs: { formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], required: ["required", "required", booleanAttribute], startDate: "startDate", datePickerFilter: "datePickerFilter", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: "readonly", tabindex: "tabindex" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "_matInput", first: true, predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: yearPattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker\n #datePicker\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"disabled\"\n (yearSelected)=\"_closeDatePicker($event)\"\n panelClass=\"mat-date-short-panel\"\n [startAt]=\"startDate\"\n >\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i13.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i14.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i15.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i16.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
404
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatDateShort, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
405
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatDateShort, selector: "mat-date-short-field", inputs: { formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", mobile: ["mobile", "mobile", booleanAttribute], compact: ["compact", "compact", booleanAttribute], autofocus: ["autofocus", "autofocus", booleanAttribute], clearable: ["clearable", "clearable", booleanAttribute], required: ["required", "required", booleanAttribute], startDate: "startDate", datePickerFilter: "datePickerFilter", appearance: "appearance", subscriptSizing: "subscriptSizing", readonly: "readonly", tabindex: "tabindex" }, providers: [DEFAULT_VALUE_ACCESSOR], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "_matInput", first: true, predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: yearPattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker\n #datePicker\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"disabled\"\n (yearSelected)=\"_closeDatePicker($event)\"\n panelClass=\"mat-date-short-panel\"\n [startAt]=\"startDate\"\n >\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i10.MatDatepickerActions, selector: "mat-datepicker-actions, mat-date-range-picker-actions" }, { kind: "directive", type: i10.MatDatepickerCancel, selector: "[matDatepickerCancel], [matDateRangePickerCancel]" }, { kind: "directive", type: i10.MatDatepickerApply, selector: "[matDatepickerApply], [matDateRangePickerApply]" }, { kind: "directive", type: i11.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i13.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i14.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i15.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i16.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
406
406
  }
407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatDateShort, decorators: [{
407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatDateShort, decorators: [{
408
408
  type: Component,
409
409
  args: [{ selector: 'mat-date-short-field', providers: [DEFAULT_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n@if (readonly) {\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ formControl.value | dateFormat: { pattern: yearPattern } }}</ion-text>\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n </mat-form-field>\n} @else {\n <!-- writable -->\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n (focus)=\"_openDatePickerIfMobile($event)\"\n (click)=\"_openDatePickerIfMobile($event)\"\n >\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n <!-- Desktop -->\n @if (!mobile) {\n <input\n matInput\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n [maskito]=\"maskitoOptions\"\n [formControl]=\"textControl\"\n (blur)=\"_checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker()\"\n (keyup.escape)=\"_preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n <input\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n } @else {\n <!-- Mobile -->\n <input\n #matInput\n autocomplete=\"off\"\n type=\"text\"\n class=\"mat-mdc-form-field-input-control mdc-text-field__input\"\n [formControl]=\"textControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly\n />\n <input\n matInput\n type=\"text\"\n [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"_onDatePickerChange($event)\"\n readonly\n />\n }\n\n <div matSuffix>\n <button type=\"button\" mat-icon-button tabindex=\"-1\" (click)=\"openDatePicker()\" [disabled]=\"disabled\">\n <mat-icon>{{ mobile ? 'date_range' : 'keyboard_arrow_down' }}</mat-icon>\n </button>\n @if (clearable) {\n <button\n mat-icon-button\n tabindex=\"-1\"\n type=\"button\"\n (click)=\"clear($event)\"\n [hidden]=\"formControl.disabled || !formControl.value\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors | mapKeys | arrayFirst; let errorKey\">\n @switch (errorKey) {\n @case ('required') {\n <span translate>ERROR.FIELD_REQUIRED</span>\n }\n @case ('validDate') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE</span>\n }\n @case ('dateIsAfter') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}\n </span>\n }\n @case ('dateIsBefore') {\n <span>\n {{ 'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}\n </span>\n }\n @case ('dateRange') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n }\n @case ('dateMaxDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n }\n @case ('dateMinDuration') {\n <span translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n }\n @case ('msg') {\n <span>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </span>\n }\n }\n </mat-error>\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n\n <!-- hints -->\n @if (!formControl.invalid) {\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </mat-form-field>\n\n <mat-datepicker\n #datePicker\n startView=\"multi-year\"\n [touchUi]=\"mobile\"\n [disabled]=\"disabled\"\n (yearSelected)=\"_closeDatePicker($event)\"\n panelClass=\"mat-date-short-panel\"\n [startAt]=\"startDate\"\n >\n <!-- Date picker buttons -->\n @if (mobile) {\n <mat-datepicker-actions>\n <ion-button fill=\"clear\" color=\"dark\" matDatepickerCancel>\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n <ion-button fill=\"solid\" color=\"tertiary\" matDatepickerApply>\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </mat-datepicker-actions>\n }\n </mat-datepicker>\n}\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}mat-form-field input[readonly]{-webkit-user-select:none!important;user-select:none!important}mat-form-field .datetime-md{padding:0!important}mat-form-field button[hidden]{display:none}\n"] }]
410
410
  }], ctorParameters: () => [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
@@ -454,4 +454,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
454
454
  type: ViewChild,
455
455
  args: ['matInput', { static: false }]
456
456
  }] } });
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZXNob3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvZGF0ZXRpbWUvbWF0ZXJpYWwuZGF0ZXNob3J0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvZGF0ZXRpbWUvbWF0ZXJpYWwuZGF0ZXNob3J0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFFUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBMEMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakosT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pGLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLDhCQUE4QixFQUF1RSxNQUFNLDhCQUE4QixDQUFDO0FBRW5KLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7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QUFnQixFQUFFO2dCQUNFLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdGLFVBQVU7c0JBRGIsS0FBSztnQkFTRixlQUFlO3NCQURsQixLQUFLO2dCQVFPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBU08sUUFBUTtzQkFBcEIsS0FBSztnQkFtQm1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDbUIsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpc01vbWVudCwgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEtFWUJPQVJEX0hJREVfREVMQVlfTVMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2hhcmVkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IGlzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBzbGVlcCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQsIHNldFRhYkluZGV4IH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucywgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBpc0ZvY3VzYWJsZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9mb2N1c2FibGUnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2tleWJvYXJkJztcbmltcG9ydCB7IGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1vbWVudERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUgfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE1hc2tpdG9PcHRpb25zIH0gZnJvbSAnQG1hc2tpdG8vY29yZSc7XG5pbXBvcnQgeyBNYXNraXRvRGF0ZU1vZGUsIG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvciwgbWFza2l0b1dpdGhQbGFjZWhvbGRlciB9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0UsIE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORyB9IGZyb20gJy4uL21hdGVyaWFsLmNvbmZpZyc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZVNob3J0KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IEkxOE5fS0VZUyA9IFsnQ09NTU9OLkRBVEVfWUVBUl9QQVRURVJOJywgJ0NPTU1PTi5EQVRFX1lFQVJfUExBQ0VIT0xERVInXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWRhdGUtc2hvcnQtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuZGF0ZXNob3J0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5kYXRlc2hvcnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVTaG9ydCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF93cml0aW5nID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcblxuICBwcm90ZWN0ZWQgdGV4dENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHJvdGVjdGVkIHllYXJQYXR0ZXJuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB5ZWFyUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIGxvY2FsZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWFza2l0b09wdGlvbnM6IE1hc2tpdG9PcHRpb25zO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbXBhY3QgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0ZVBpY2tlckZpbHRlcjogRGF0ZUZpbHRlckZuPE1vbWVudD47XG5cbiAgQElucHV0KClcbiAgc2V0IGFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICB0aGlzLl9hcHBlYXJhbmNlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFwcGVhcmFuY2UoKTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGVhcmFuY2UgfHwgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic2NyaXB0U2l6aW5nKCk6IFN1YnNjcmlwdFNpemluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdFNpemluZyB8fCB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0YWJpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFiaW5kZXggPSB2YWx1ZTtcbiAgICAgIGlmICghdGhpcy5fd3JpdGluZykgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcicpIGRhdGVQaWNrZXIhOiBNYXREYXRlcGlja2VyPE1vbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIF9tYXRJbnB1dDogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgZGVmYXVsdE9wdGlvbnM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9ICh0cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZyA9IGRlZmF1bHRPcHRpb25zPy5zdWJzY3JpcHRTaXppbmcgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICAgIHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlID0gZGVmYXVsdE9wdGlvbnM/LmFwcGVhcmFuY2UgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9XG4gICAgICB0aGlzLmZvcm1Db250cm9sIHx8ICh0aGlzLmZvcm1Db250cm9sTmFtZSAmJiB0aGlzLmZvcm1Hcm91cERpciAmJiAodGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbCkpO1xuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlICdmb3JtQ29udHJvbCcgb3IgJ2Zvcm1Db250cm9sTmFtZScgaW4gPG1hdC1kYXRlLXNob3J0LWZpZWxkPi5cIik7XG5cbiAgICB0aGlzLm1vYmlsZSA9IGlzTm90TmlsKHRoaXMubW9iaWxlKSA/IHRoaXMubW9iaWxlIDogaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLnJlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMucmVxdWlyZWQpXG4gICAgICA/IHRoaXMucmVxdWlyZWRcbiAgICAgIDogdGhpcy5mb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgfHwgaXNCbGFua1N0cmluZyh0aGlzLnJlcXVpcmVkKTtcblxuICAgIC8vIEFkZCAndmFsaWREYXRlJyB2YWxpZGF0b3IgKHdoZW4gZXhpc3RpbmcgdmFsaWRhdG9yIGFyZSBudWxsIG9yIHJlcXVpcmVkLCB0byBiZSBzdXJlIHRvIGtlZXAgaXQpXG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciB8fCB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMucmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoXG4gICAgICAgIHRoaXMucmVxdWlyZWRcbiAgICAgICAgICA/IFt0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdXG4gICAgICAgICAgOiBbdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHRleHQgY29udHJvbFxuICAgIHRoaXMudGV4dENvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICBudWxsLFxuICAgICAgLy8gSW1wb3J0YW50OiBzaG91bGQgY29weSBlcnJvcnMgZnJvbSB0aGUgbW9kZWwgZm9ybUNvbnRyb2xcbiAgICAgICgpID0+IHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzXG4gICAgKTtcblxuICAgIC8vIEdldCBwYXR0ZXJucyB0byBkaXNwbGF5IGRhdGVcbiAgICB0aGlzLnVwZGF0ZVRyYW5zbGF0aW9ucyh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEkxOE5fS0VZUykpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAuZ2V0KEkxOE5fS0VZUylcbiAgICAgICAgLnBpcGUoc2tpcCgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgodHJhbnNsYXRpb25zKSA9PiB0aGlzLnVwZGF0ZVRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnMpKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMudGV4dENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMub25Gb3JtQ2hhbmdlKHZhbHVlKSkpO1xuXG4gICAgLy8gTGlzdGVuIHN0YXR1cyBjaGFuZ2VzICh3aGVuIGRvbmUgb3V0c2lkZSB0aGUgY29tcG9uZW50ICAtIGUuZy4gd2hlbiBzZXRFcnJvcnMoKSBpcyBjYWxsaW5nIG9uIHRoZSBmb3JtQ29udHJvbClcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoXykgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGV4dENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAhdGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJbbWF0LWRhdGVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZSk7XG5cbiAgICAvLyBDb252ZXJ0IGludG8gZGF0ZVxuICAgIC8vIEltcG9ydGFudDogY2xvbmUsIGJlY2F1c2Ugc3RhcnRPZiB3aWxsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZGF0ZVxuICAgIGNvbnN0IGRhdGUgPSBpc01vbWVudCh2YWx1ZSkgPyB2YWx1ZS5jbG9uZSgpIDogZnJvbURhdGVJU09TdHJpbmcodmFsdWUpO1xuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGRheVxuICAgICAgY29uc3QgeWVhciA9IGRhdGUuc3RhcnRPZigneWVhcicpO1xuICAgICAgY29uc3QgeWVhclN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KHllYXIsIHRoaXMueWVhclBhdHRlcm4pO1xuXG4gICAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0geWVhclN0cikge1xuICAgICAgICAvLyBVcGRhdGUgdGV4dCBjb250cm9sXG4gICAgICAgIHRoaXMudGV4dENvbnRyb2wucGF0Y2hWYWx1ZSh5ZWFyU3RyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kaXNhYmxpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX2Rpc2FibGluZyA9IHRydWU7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudGV4dENvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dENvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5fZGlzYWJsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb3BlbkRhdGVQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXIpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5kYXRlUGlja2VyLm9wZW5lZCkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlLXNob3J0XSBPcGVuaW5nIGRhdGUgcGlja2VyLi4uJyk7XG5cbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXRJbnB1dCkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNGb2N1c2FibGVFbGVtZW50KHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKGV2ZW50PzogRXZlbnQpIHtcbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKG51bGwpO1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIF9vbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBObyB2YWx1ZSwgYnV0IG1vYmlsZSBtb2RlOiB1c2UgdGhlIGN1cnJlbnQgeWVhclxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5tb2JpbGUpIHtcbiAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1vbWVudCgpLmxvY2FsZSh0aGlzLmxvY2FsZSkuc3RhcnRPZigneWVhcicpLnV0Yyh0cnVlKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodG9EYXRlSVNPU3RyaW5nKHZhbHVlKSwge1xuICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLCAvLyBXaWxsIGNhbGwgd3JpdGVWYWx1ZSgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gdmFsdWU/LmNsb25lKCkubG9jYWxlKHRoaXMubG9jYWxlKS5zdGFydE9mKCd5ZWFyJykudXRjKHRydWUpO1xuICAgIGNvbnN0IGRhdGVTdHIgPSAoZGF0ZSAmJiB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLnllYXJQYXR0ZXJuKSkgfHwgbnVsbDtcblxuICAgIGlmICh0aGlzLnRleHRDb250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBkYXRlU3RyKTtcblxuICAgICAgdGhpcy50ZXh0Q29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7XG4gICAgICAgIGVtaXRFdmVudDogdHJ1ZSwgLy8gV2lsbCBjYWxsIG9uRm9ybUNoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5kYXRlUGlja2VyPy5vcGVuZWQgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtc2hvcnRdIFByZXBhcmluZyB0byBvcGVuIGRhdGUgcGlja2VyLi4uICcpO1xuXG4gICAgdGhpcy5fcHJldmVudEV2ZW50KGV2ZW50KTtcblxuICAgIC8vIE9wZW4gdGhlIHBpY2tlclxuICAgIHRoaXMub3BlbkRhdGVQaWNrZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMudGV4dENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZWxlY3Qgb25seSB5ZWFyXG4gIHByb3RlY3RlZCBfY2xvc2VEYXRlUGlja2VyKHZhbHVlOiBNb21lbnQpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXI/LmNsb3NlKCk7XG5cbiAgICAvLyBHZXQgdGhlIG1vZGVsIHZhbHVlXG4gICAgY29uc3QgaXNvRGF0ZSA9IHRvRGF0ZUlTT1N0cmluZyh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gaXNvRGF0ZSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShpc29EYXRlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZXZlbnRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kcyAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9ZRUFSX1BBVFRFUk4nXSAhPT0gJ0NPTU1PTi5EQVRFX1lFQVJfUEFUVEVSTicgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1lFQVJfUEFUVEVSTiddIDogJ1lZWVknO1xuICAgIHRoaXMudXBkYXRlUGF0dGVybihkYXRlUGF0dGVybik7XG5cbiAgICBjb25zdCB5ZWFyUGxhY2Vob2xkZXIgPVxuICAgICAgdHJhbnNsYXRpb25zWydDT01NT04uREFURV9ZRUFSX1BMQUNFSE9MREVSJ10gIT09ICdDT01NT04uREFURV9ZRUFSX1BMQUNFSE9MREVSJ1xuICAgICAgICA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfWUVBUl9QTEFDRUhPTERFUiddXG4gICAgICAgIDogZGF0ZVBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnVwZGF0ZU1hc2tPcHRpb25zKHllYXJQbGFjZWhvbGRlcik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMueWVhclBhdHRlcm4gIT09IHBhdHRlcm4pIHtcbiAgICAgIHRoaXMueWVhclBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hc2tPcHRpb25zKHllYXJQbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMueWVhclBsYWNlaG9sZGVyICE9PSB5ZWFyUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMueWVhclBsYWNlaG9sZGVyID0geWVhclBsYWNlaG9sZGVyO1xuXG4gICAgICBjb25zdCBkYXRlT3B0aW9ucyA9IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICAgIG1vZGU6IHRoaXMueWVhclBhdHRlcm4udG9Mb3dlckNhc2UoKSBhcyBNYXNraXRvRGF0ZU1vZGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbHVnaW5zLCAvLyBwbHVnaW5zIGtlZXBzIGNhcmV0IGluc2lkZSBhY3R1YWwgdmFsdWUgYW5kIHJlbW92ZSBwbGFjZWhvbGRlciBvbiBibHVyXG4gICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9uc1xuICAgICAgICAvLyBwYXNzICd0cnVlJyBhcyBzZWNvbmQgYXJndW1lbnQgdG8gYWRkIHBsdWdpbiB0byBoaWRlIHBsYWNlaG9sZGVyIHdoZW4gaW5wdXQgaXMgbm90IGZvY3VzZWRcbiAgICAgIH0gPSBtYXNraXRvV2l0aFBsYWNlaG9sZGVyKHRoaXMueWVhclBsYWNlaG9sZGVyLCB0cnVlKTtcblxuICAgICAgdGhpcy5tYXNraXRvT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZGF0ZU9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMuY29uY2F0KGRhdGVPcHRpb25zLnBsdWdpbnMgfHwgW10pLFxuICAgICAgICBwcmVwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBCRUZPUkUgYWxsIG90aGVyIHByZXByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAuLi5kYXRlT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgICBwb3N0cHJvY2Vzc29yczogW1xuICAgICAgICAgIC4uLmRhdGVPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQUZURVIgYWxsIG90aGVyIHBvc3Rwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgfSBhcyBSZXF1aXJlZDxNYXNraXRvT3B0aW9ucz47XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICBpZiAodmFsdWUgPT09IHRoaXMueWVhclBsYWNlaG9sZGVyKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB5ZWFyIHN0cmluZ1xuICAgIGxldCBkYXRlID0gKHZhbHVlICYmIHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodmFsdWUsIHRoaXMueWVhclBhdHRlcm4pKSB8fCBudWxsO1xuXG4gICAgLy8gUmVzZXQgdGltZVxuICAgIGRhdGUgPSBkYXRlICYmIGRhdGUubG9jYWxlKHRoaXMubG9jYWxlKS5zdGFydE9mKCd5ZWFyJyk7XG5cbiAgICAvLyBHZXQgdGhlIG1vZGVsIHZhbHVlXG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUgJiYgZGF0ZS5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiBkYXRlO1xuICAgIC8vIFNldCBtb2RlbCB2YWx1ZVxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBkYXRlU3RyKTtcblxuICAgICAgaWYgKGRhdGU/LmlzVmFsaWQoKSkge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybUNvbnRyb2wgdmFsdWUgKHdpbGwgdXBkYXRlIGRhdGVQaWNrZXIgYWxzbylcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoYW5nZXMgY29tZXMgZnJvbSBpbnNpZGUgZnVuY3Rpb246IHVzZSB0aGUgY2FsbGJhY2tcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soZGF0ZVN0cik7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuXG4gICAgICAvLyBGb3JjZSB0ZXh0Q29udHJvbCB2YWxpZGl0eVxuICAgICAgdGhpcy50ZXh0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRLZXlib2FyZEhpZGUod2FpdEtleWJvYXJkRGVsYXk6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yY2Uga2V5Ym9hcmQgdG8gYmUgaGlkZVxuICAgICAgYXdhaXQgS2V5Ym9hcmQuaGlkZSgpO1xuXG4gICAgICAvLyBXYWl0IGFuIGFkZGl0aW9uYWwgZGVsYXksIHRvIGJlIHN1cmUgdGhlIGtleWJvYXJkIGhhcyBiZWVuIHRvdGFsbHkgaGlkZGVuXG4gICAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9ISURFX0RFTEFZX01TKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSB8fCB0aGlzLl90YWJpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gc2tpcFxuXG4gICAgLy8gRm9jdXMgdG8gaW5wdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFRhYkluZGV4KHRoaXMuX21hdElucHV0LCB0aGlzLl90YWJpbmRleCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy50ZXh0Q29udHJvbC5tYXJrQXNUb3VjaGVkKG9wdHMpO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzRGlydHkob3B0cz86IGFueSkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICA8aW9uLXRleHQ+e3sgZm9ybUNvbnRyb2wudmFsdWUgfCBkYXRlRm9ybWF0OiB7IHBhdHRlcm46IHllYXJQYXR0ZXJuIH0gfX08L2lvbi10ZXh0PlxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICA8IS0tIHdyaXRhYmxlIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIChmb2N1cyk9XCJfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZSgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50KVwiXG4gID5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gRGVza3RvcCAtLT5cbiAgICBAaWYgKCFtb2JpbGUpIHtcbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbWFza2l0b109XCJtYXNraXRvT3B0aW9uc1wiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgIChibHVyKT1cIl9jaGVja0lmVG91Y2hlZCgpXCJcbiAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJvcGVuRGF0ZVBpY2tlcigpXCJcbiAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJfcHJldmVudEV2ZW50KCRldmVudClcIlxuICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAvPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgaGlkZGVuXG4gICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIE1vYmlsZSAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIG1kYy10ZXh0LWZpZWxkX19pbnB1dFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAvPlxuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgaGlkZGVuXG4gICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgIC8+XG4gICAgfVxuXG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJvcGVuRGF0ZVBpY2tlcigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxtYXQtaWNvbj57eyBtb2JpbGUgPyAnZGF0ZV9yYW5nZScgOiAna2V5Ym9hcmRfYXJyb3dfZG93bicgfX08L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGVycm9ycyAtLT5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5lcnJvcnMgfCBtYXBLZXlzIHwgYXJyYXlGaXJzdDsgbGV0IGVycm9yS2V5XCI+XG4gICAgICBAc3dpdGNoIChlcnJvcktleSkge1xuICAgICAgICBAY2FzZSAoJ3JlcXVpcmVkJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3ZhbGlkRGF0ZScpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEU8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkYXRlSXNBZnRlcicpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9BRlRFUicgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9ycy5kYXRlSXNBZnRlciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVJc0JlZm9yZScpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9CRUZPUkUnIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMuZGF0ZUlzQmVmb3JlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVNYXhEdXJhdGlvbicpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUFYX0RVUkFUSU9OPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZU1pbkR1cmF0aW9uJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NSU5fRFVSQVRJT048L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtc2cnKSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7eyBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5rZXkgfHwgZm9ybUNvbnRyb2wuZXJyb3JzLm1zZyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ucGFyYW1zIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gaGludHMgLS0+XG4gICAgQGlmICghZm9ybUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgPG1hdC1oaW50PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1oaW50PlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWRhdGVwaWNrZXJcbiAgICAjZGF0ZVBpY2tlclxuICAgIHN0YXJ0Vmlldz1cIm11bHRpLXllYXJcIlxuICAgIFt0b3VjaFVpXT1cIm1vYmlsZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoeWVhclNlbGVjdGVkKT1cIl9jbG9zZURhdGVQaWNrZXIoJGV2ZW50KVwiXG4gICAgcGFuZWxDbGFzcz1cIm1hdC1kYXRlLXNob3J0LXBhbmVsXCJcbiAgICBbc3RhcnRBdF09XCJzdGFydERhdGVcIlxuICA+XG4gICAgPCEtLSBEYXRlIHBpY2tlciBidXR0b25zIC0tPlxuICAgIEBpZiAobW9iaWxlKSB7XG4gICAgICA8bWF0LWRhdGVwaWNrZXItYWN0aW9ucz5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgbWF0RGF0ZXBpY2tlckNhbmNlbD5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwidGVydGlhcnlcIiBtYXREYXRlcGlja2VyQXBwbHk+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L21hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgfVxuICA8L21hdC1kYXRlcGlja2VyPlxufVxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZXNob3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvZGF0ZXRpbWUvbWF0ZXJpYWwuZGF0ZXNob3J0LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvbWF0ZXJpYWwvZGF0ZXRpbWUvbWF0ZXJpYWwuZGF0ZXNob3J0Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFFBQVEsRUFFUixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBMEMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakosT0FBTyxFQUFFLFFBQVEsRUFBVSxNQUFNLFFBQVEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pGLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLDhCQUE4QixFQUF1RSxNQUFNLDhCQUE4QixDQUFDO0FBRW5KLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7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QUFnQixFQUFFO2dCQUNFLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdGLFVBQVU7c0JBRGIsS0FBSztnQkFTRixlQUFlO3NCQURsQixLQUFLO2dCQVFPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBU08sUUFBUTtzQkFBcEIsS0FBSztnQkFtQm1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDbUIsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOR19WQUxVRV9BQ0NFU1NPUiwgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBpc01vbWVudCwgTW9tZW50IH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEtFWUJPQVJEX0hJREVfREVMQVlfTVMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU2hhcmVkVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IGlzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBzbGVlcCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBJbnB1dEVsZW1lbnQsIHNldFRhYkluZGV4IH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucywgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBpc0ZvY3VzYWJsZUVsZW1lbnQgfSBmcm9tICcuLi8uLi9mb2N1c2FibGUnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2tleWJvYXJkJztcbmltcG9ydCB7IGZpbHRlciwgc2tpcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1vbWVudERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vZGF0ZXMnO1xuaW1wb3J0IHsgQXBwRmxvYXRMYWJlbFR5cGUgfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE1hc2tpdG9PcHRpb25zIH0gZnJvbSAnQG1hc2tpdG8vY29yZSc7XG5pbXBvcnQgeyBNYXNraXRvRGF0ZU1vZGUsIG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvciwgbWFza2l0b1dpdGhQbGFjZWhvbGRlciB9IGZyb20gJ0BtYXNraXRvL2tpdCc7XG5pbXBvcnQgeyBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX0FQUEVBUkFOQ0UsIE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORyB9IGZyb20gJy4uL21hdGVyaWFsLmNvbmZpZyc7XG5cbmNvbnN0IERFRkFVTFRfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0RGF0ZVNob3J0KSxcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IEkxOE5fS0VZUyA9IFsnQ09NTU9OLkRBVEVfWUVBUl9QQVRURVJOJywgJ0NPTU1PTi5EQVRFX1lFQVJfUExBQ0VIT0xERVInXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWRhdGUtc2hvcnQtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwuZGF0ZXNob3J0Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5kYXRlc2hvcnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE1hdERhdGVTaG9ydCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIElucHV0RWxlbWVudCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF93cml0aW5nID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0U2l6aW5nOiBTdWJzY3JpcHRTaXppbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdEFwcGVhcmFuY2U6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlZmF1bHRTdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZztcblxuICBwcm90ZWN0ZWQgdGV4dENvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgcHJvdGVjdGVkIHllYXJQYXR0ZXJuOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB5ZWFyUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJvdGVjdGVkIGxvY2FsZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgbWFza2l0b09wdGlvbnM6IE1hc2tpdG9PcHRpb25zO1xuXG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGNvbXBhY3QgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZXF1aXJlZDogYm9vbGVhbjtcbiAgQElucHV0KCkgc3RhcnREYXRlOiBNb21lbnQgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0ZVBpY2tlckZpbHRlcjogRGF0ZUZpbHRlckZuPE1vbWVudD47XG5cbiAgQElucHV0KClcbiAgc2V0IGFwcGVhcmFuY2UodmFsdWU6IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UpIHtcbiAgICB0aGlzLl9hcHBlYXJhbmNlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGFwcGVhcmFuY2UoKTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGVhcmFuY2UgfHwgdGhpcy5fZGVmYXVsdEFwcGVhcmFuY2U7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic2NyaXB0U2l6aW5nKCk6IFN1YnNjcmlwdFNpemluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdFNpemluZyB8fCB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0YWJpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFiaW5kZXggPSB2YWx1ZTtcbiAgICAgIGlmICghdGhpcy5fd3JpdGluZykgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcicpIGRhdGVQaWNrZXIhOiBNYXREYXRlcGlja2VyPE1vbWVudD47XG4gIEBWaWV3Q2hpbGQoJ21hdElucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIF9tYXRJbnB1dDogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUykgZGVmYXVsdE9wdGlvbnM/OiBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmxvY2FsZSA9ICh0cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdHJhbnNsYXRlLmRlZmF1bHRMYW5nKS5zdWJzdHJpbmcoMCwgMik7XG4gICAgdGhpcy5fZGVmYXVsdFN1YnNjcmlwdFNpemluZyA9IGRlZmF1bHRPcHRpb25zPy5zdWJzY3JpcHRTaXppbmcgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9TVUJTQ1JJUFRfU0laSU5HO1xuICAgIHRoaXMuX2RlZmF1bHRBcHBlYXJhbmNlID0gZGVmYXVsdE9wdGlvbnM/LmFwcGVhcmFuY2UgfHwgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9XG4gICAgICB0aGlzLmZvcm1Db250cm9sIHx8ICh0aGlzLmZvcm1Db250cm9sTmFtZSAmJiB0aGlzLmZvcm1Hcm91cERpciAmJiAodGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbCkpO1xuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlICdmb3JtQ29udHJvbCcgb3IgJ2Zvcm1Db250cm9sTmFtZScgaW4gPG1hdC1kYXRlLXNob3J0LWZpZWxkPi5cIik7XG5cbiAgICB0aGlzLm1vYmlsZSA9IGlzTm90TmlsKHRoaXMubW9iaWxlKSA/IHRoaXMubW9iaWxlIDogaXNNb2JpbGUod2luZG93KTtcbiAgICB0aGlzLnJlcXVpcmVkID0gaXNOb3ROaWxCb29sZWFuKHRoaXMucmVxdWlyZWQpXG4gICAgICA/IHRoaXMucmVxdWlyZWRcbiAgICAgIDogdGhpcy5mb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgfHwgaXNCbGFua1N0cmluZyh0aGlzLnJlcXVpcmVkKTtcblxuICAgIC8vIEFkZCAndmFsaWREYXRlJyB2YWxpZGF0b3IgKHdoZW4gZXhpc3RpbmcgdmFsaWRhdG9yIGFyZSBudWxsIG9yIHJlcXVpcmVkLCB0byBiZSBzdXJlIHRvIGtlZXAgaXQpXG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciB8fCB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciA9PT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMucmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdIDogU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoXG4gICAgICAgIHRoaXMucmVxdWlyZWRcbiAgICAgICAgICA/IFt0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdXG4gICAgICAgICAgOiBbdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHRleHQgY29udHJvbFxuICAgIHRoaXMudGV4dENvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICBudWxsLFxuICAgICAgLy8gSW1wb3J0YW50OiBzaG91bGQgY29weSBlcnJvcnMgZnJvbSB0aGUgbW9kZWwgZm9ybUNvbnRyb2xcbiAgICAgICgpID0+IHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzXG4gICAgKTtcblxuICAgIC8vIEdldCBwYXR0ZXJucyB0byBkaXNwbGF5IGRhdGVcbiAgICB0aGlzLnVwZGF0ZVRyYW5zbGF0aW9ucyh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEkxOE5fS0VZUykpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZVxuICAgICAgICAuZ2V0KEkxOE5fS0VZUylcbiAgICAgICAgLnBpcGUoc2tpcCgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgodHJhbnNsYXRpb25zKSA9PiB0aGlzLnVwZGF0ZVRyYW5zbGF0aW9ucyh0cmFuc2xhdGlvbnMpKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHRoaXMudGV4dENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHRoaXMub25Gb3JtQ2hhbmdlKHZhbHVlKSkpO1xuXG4gICAgLy8gTGlzdGVuIHN0YXR1cyBjaGFuZ2VzICh3aGVuIGRvbmUgb3V0c2lkZSB0aGUgY29tcG9uZW50ICAtIGUuZy4gd2hlbiBzZXRFcnJvcnMoKSBpcyBjYWxsaW5nIG9uIHRoZSBmb3JtQ29udHJvbClcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoXykgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGV4dENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAhdGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMudXBkYXRlVGFiSW5kZXgoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJbbWF0LWRhdGVdIHdyaXRlVmFsdWUoKSB3aXRoOlwiLCB2YWx1ZSk7XG5cbiAgICAvLyBDb252ZXJ0IGludG8gZGF0ZVxuICAgIC8vIEltcG9ydGFudDogY2xvbmUsIGJlY2F1c2Ugc3RhcnRPZiB3aWxsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgZGF0ZVxuICAgIGNvbnN0IGRhdGUgPSBpc01vbWVudCh2YWx1ZSkgPyB2YWx1ZS5jbG9uZSgpIDogZnJvbURhdGVJU09TdHJpbmcodmFsdWUpO1xuXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc2V0IGRheVxuICAgICAgY29uc3QgeWVhciA9IGRhdGUuc3RhcnRPZigneWVhcicpO1xuICAgICAgY29uc3QgeWVhclN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KHllYXIsIHRoaXMueWVhclBhdHRlcm4pO1xuXG4gICAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0geWVhclN0cikge1xuICAgICAgICAvLyBVcGRhdGUgdGV4dCBjb250cm9sXG4gICAgICAgIHRoaXMudGV4dENvbnRyb2wucGF0Y2hWYWx1ZSh5ZWFyU3RyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kaXNhYmxpbmcpIHJldHVybjtcblxuICAgIHRoaXMuX2Rpc2FibGluZyA9IHRydWU7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMudGV4dENvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dENvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gICAgdGhpcy5fZGlzYWJsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb3BlbkRhdGVQaWNrZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGVQaWNrZXIpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5kYXRlUGlja2VyLm9wZW5lZCkge1xuICAgICAgLy8gREVCVUdcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnW21hdC1kYXRlLXNob3J0XSBPcGVuaW5nIGRhdGUgcGlja2VyLi4uJyk7XG5cbiAgICAgIHRoaXMuZGF0ZVBpY2tlci5vcGVuKCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLl9tYXRJbnB1dCkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNGb2N1c2FibGVFbGVtZW50KHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX21hdElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKGV2ZW50PzogRXZlbnQpIHtcbiAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZXZlbnQpO1xuXG4gICAgdGhpcy50ZXh0Q29udHJvbC5wYXRjaFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKG51bGwpO1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIF9vbkRhdGVQaWNrZXJDaGFuZ2UoZXZlbnQ6IE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50PE1vbWVudD4pOiB2b2lkIHtcbiAgICAvLyBNYWtlIHN1cmUgZXZlbnQgaXMgdmFsaWRcbiAgICBpZiAoIWV2ZW50IHx8IChldmVudC52YWx1ZSAhPT0gbnVsbCAmJiAhaXNNb21lbnQoZXZlbnQudmFsdWUpKSkge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIE1hdERhdGVwaWNrZXIgZXZlbnQuIFNraXBwaW5nJywgZXZlbnQpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgbGV0IHZhbHVlID0gZXZlbnQudmFsdWU7XG5cbiAgICAvLyBObyB2YWx1ZSwgYnV0IG1vYmlsZSBtb2RlOiB1c2UgdGhlIGN1cnJlbnQgeWVhclxuICAgIGlmICghdmFsdWUgJiYgdGhpcy5tb2JpbGUpIHtcbiAgICAgIHZhbHVlID0gRGF0ZVV0aWxzLm1vbWVudCgpLmxvY2FsZSh0aGlzLmxvY2FsZSkuc3RhcnRPZigneWVhcicpLnV0Yyh0cnVlKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUodG9EYXRlSVNPU3RyaW5nKHZhbHVlKSwge1xuICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlLCAvLyBXaWxsIGNhbGwgd3JpdGVWYWx1ZSgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gdmFsdWU/LmNsb25lKCkubG9jYWxlKHRoaXMubG9jYWxlKS5zdGFydE9mKCd5ZWFyJykudXRjKHRydWUpO1xuICAgIGNvbnN0IGRhdGVTdHIgPSAoZGF0ZSAmJiB0aGlzLmRhdGVBZGFwdGVyLmZvcm1hdChkYXRlLCB0aGlzLnllYXJQYXR0ZXJuKSkgfHwgbnVsbDtcblxuICAgIGlmICh0aGlzLnRleHRDb250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBkYXRlU3RyKTtcblxuICAgICAgdGhpcy50ZXh0Q29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7XG4gICAgICAgIGVtaXRFdmVudDogdHJ1ZSwgLy8gV2lsbCBjYWxsIG9uRm9ybUNoYW5nZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF9vcGVuRGF0ZVBpY2tlcklmTW9iaWxlKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5tb2JpbGUgfHwgZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQgfHwgdGhpcy5kYXRlUGlja2VyPy5vcGVuZWQgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtc2hvcnRdIFByZXBhcmluZyB0byBvcGVuIGRhdGUgcGlja2VyLi4uICcpO1xuXG4gICAgdGhpcy5fcHJldmVudEV2ZW50KGV2ZW50KTtcblxuICAgIC8vIE9wZW4gdGhlIHBpY2tlclxuICAgIHRoaXMub3BlbkRhdGVQaWNrZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hlY2tJZlRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMudGV4dENvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZWxlY3Qgb25seSB5ZWFyXG4gIHByb3RlY3RlZCBfY2xvc2VEYXRlUGlja2VyKHZhbHVlOiBNb21lbnQpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXI/LmNsb3NlKCk7XG5cbiAgICAvLyBHZXQgdGhlIG1vZGVsIHZhbHVlXG4gICAgY29uc3QgaXNvRGF0ZSA9IHRvRGF0ZUlTT1N0cmluZyh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gaXNvRGF0ZSkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShpc29EYXRlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3ByZXZlbnRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uKSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kcyAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gdHJhbnNsYXRpb25zWydDT01NT04uREFURV9ZRUFSX1BBVFRFUk4nXSAhPT0gJ0NPTU1PTi5EQVRFX1lFQVJfUEFUVEVSTicgPyB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5EQVRFX1lFQVJfUEFUVEVSTiddIDogJ1lZWVknO1xuICAgIHRoaXMudXBkYXRlUGF0dGVybihkYXRlUGF0dGVybik7XG5cbiAgICBjb25zdCB5ZWFyUGxhY2Vob2xkZXIgPVxuICAgICAgdHJhbnNsYXRpb25zWydDT01NT04uREFURV9ZRUFSX1BMQUNFSE9MREVSJ10gIT09ICdDT01NT04uREFURV9ZRUFSX1BMQUNFSE9MREVSJ1xuICAgICAgICA/IHRyYW5zbGF0aW9uc1snQ09NTU9OLkRBVEVfWUVBUl9QTEFDRUhPTERFUiddXG4gICAgICAgIDogZGF0ZVBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnVwZGF0ZU1hc2tPcHRpb25zKHllYXJQbGFjZWhvbGRlcik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMueWVhclBhdHRlcm4gIT09IHBhdHRlcm4pIHtcbiAgICAgIHRoaXMueWVhclBhdHRlcm4gPSBwYXR0ZXJuO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hc2tPcHRpb25zKHllYXJQbGFjZWhvbGRlcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMueWVhclBsYWNlaG9sZGVyICE9PSB5ZWFyUGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMueWVhclBsYWNlaG9sZGVyID0geWVhclBsYWNlaG9sZGVyO1xuXG4gICAgICBjb25zdCBkYXRlT3B0aW9ucyA9IG1hc2tpdG9EYXRlT3B0aW9uc0dlbmVyYXRvcih7XG4gICAgICAgIG1vZGU6IHRoaXMueWVhclBhdHRlcm4udG9Mb3dlckNhc2UoKSBhcyBNYXNraXRvRGF0ZU1vZGUsXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbHVnaW5zLCAvLyBwbHVnaW5zIGtlZXBzIGNhcmV0IGluc2lkZSBhY3R1YWwgdmFsdWUgYW5kIHJlbW92ZSBwbGFjZWhvbGRlciBvbiBibHVyXG4gICAgICAgIC4uLnBsYWNlaG9sZGVyT3B0aW9uc1xuICAgICAgICAvLyBwYXNzICd0cnVlJyBhcyBzZWNvbmQgYXJndW1lbnQgdG8gYWRkIHBsdWdpbiB0byBoaWRlIHBsYWNlaG9sZGVyIHdoZW4gaW5wdXQgaXMgbm90IGZvY3VzZWRcbiAgICAgIH0gPSBtYXNraXRvV2l0aFBsYWNlaG9sZGVyKHRoaXMueWVhclBsYWNlaG9sZGVyLCB0cnVlKTtcblxuICAgICAgdGhpcy5tYXNraXRvT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uZGF0ZU9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnM6IHBsdWdpbnMuY29uY2F0KGRhdGVPcHRpb25zLnBsdWdpbnMgfHwgW10pLFxuICAgICAgICBwcmVwcm9jZXNzb3JzOiBbXG4gICAgICAgICAgLy8gQWx3YXlzIHB1dCBpdCBCRUZPUkUgYWxsIG90aGVyIHByZXByb2Nlc3NvcnNcbiAgICAgICAgICAuLi5wbGFjZWhvbGRlck9wdGlvbnMucHJlcHJvY2Vzc29ycyxcbiAgICAgICAgICAuLi5kYXRlT3B0aW9ucy5wcmVwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgICBwb3N0cHJvY2Vzc29yczogW1xuICAgICAgICAgIC4uLmRhdGVPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICAgIC8vIEFsd2F5cyBwdXQgaXQgQUZURVIgYWxsIG90aGVyIHBvc3Rwcm9jZXNzb3JzXG4gICAgICAgICAgLi4ucGxhY2Vob2xkZXJPcHRpb25zLnBvc3Rwcm9jZXNzb3JzLFxuICAgICAgICBdLFxuICAgICAgfSBhcyBSZXF1aXJlZDxNYXNraXRvT3B0aW9ucz47XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICBpZiAodmFsdWUgPT09IHRoaXMueWVhclBsYWNlaG9sZGVyKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB5ZWFyIHN0cmluZ1xuICAgIGxldCBkYXRlID0gKHZhbHVlICYmIHRoaXMuZGF0ZUFkYXB0ZXIucGFyc2UodmFsdWUsIHRoaXMueWVhclBhdHRlcm4pKSB8fCBudWxsO1xuXG4gICAgLy8gUmVzZXQgdGltZVxuICAgIGRhdGUgPSBkYXRlICYmIGRhdGUubG9jYWxlKHRoaXMubG9jYWxlKS5zdGFydE9mKCd5ZWFyJyk7XG5cbiAgICAvLyBHZXQgdGhlIG1vZGVsIHZhbHVlXG4gICAgY29uc3QgZGF0ZVN0ciA9IGRhdGUgJiYgZGF0ZS5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiBkYXRlO1xuICAgIC8vIFNldCBtb2RlbCB2YWx1ZVxuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGUtdGltZV0gRW1pdCBuZXcgdmFsdWU6ICcgKyBkYXRlU3RyKTtcblxuICAgICAgaWYgKGRhdGU/LmlzVmFsaWQoKSkge1xuICAgICAgICAvLyBVcGRhdGUgZm9ybUNvbnRyb2wgdmFsdWUgKHdpbGwgdXBkYXRlIGRhdGVQaWNrZXIgYWxzbylcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWx1ZShkYXRlU3RyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoYW5nZXMgY29tZXMgZnJvbSBpbnNpZGUgZnVuY3Rpb246IHVzZSB0aGUgY2FsbGJhY2tcbiAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soZGF0ZVN0cik7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5lZWQgdG8gdXBkYXRlIGNvbnRyb2xzXG4gICAgICB0aGlzLl9jaGVja0lmVG91Y2hlZCgpO1xuXG4gICAgICAvLyBGb3JjZSB0ZXh0Q29udHJvbCB2YWxpZGl0eVxuICAgICAgdGhpcy50ZXh0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRLZXlib2FyZEhpZGUod2FpdEtleWJvYXJkRGVsYXk6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gRm9yY2Uga2V5Ym9hcmQgdG8gYmUgaGlkZVxuICAgICAgYXdhaXQgS2V5Ym9hcmQuaGlkZSgpO1xuXG4gICAgICAvLyBXYWl0IGFuIGFkZGl0aW9uYWwgZGVsYXksIHRvIGJlIHN1cmUgdGhlIGtleWJvYXJkIGhhcyBiZWVuIHRvdGFsbHkgaGlkZGVuXG4gICAgICBhd2FpdCBzbGVlcChLRVlCT0FSRF9ISURFX0RFTEFZX01TKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVGFiSW5kZXgoKSB7XG4gICAgaWYgKGlzTmlsKHRoaXMuX3RhYmluZGV4KSB8fCB0aGlzLl90YWJpbmRleCA9PT0gLTEpIHJldHVybjsgLy8gc2tpcFxuXG4gICAgLy8gRm9jdXMgdG8gaW5wdXRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFRhYkluZGV4KHRoaXMuX21hdElucHV0LCB0aGlzLl90YWJpbmRleCk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNUb3VjaGVkKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gICAgdGhpcy50ZXh0Q29udHJvbC5tYXJrQXNUb3VjaGVkKG9wdHMpO1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzRGlydHkob3B0cz86IGFueSkge1xuICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuQGlmIChyZWFkb25seSkge1xuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIGNsYXNzPVwibWF0LWZvcm0tZmllbGQtZGlzYWJsZWRcIlxuICA+XG4gICAgPGRpdiBtYXRQcmVmaXg+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0UHJlZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHkgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgLz5cbiAgICA8aW9uLXRleHQ+e3sgZm9ybUNvbnRyb2wudmFsdWUgfCBkYXRlRm9ybWF0OiB7IHBhdHRlcm46IHllYXJQYXR0ZXJuIH0gfX08L2lvbi10ZXh0PlxuICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGhpbnRzIC0tPlxuICAgIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cbn0gQGVsc2Uge1xuICA8IS0tIHdyaXRhYmxlIC0tPlxuICA8bWF0LWZvcm0tZmllbGRcbiAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICAgIChmb2N1cyk9XCJfb3BlbkRhdGVQaWNrZXJJZk1vYmlsZSgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwiX29wZW5EYXRlUGlja2VySWZNb2JpbGUoJGV2ZW50KVwiXG4gID5cbiAgICBAaWYgKGZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlcikge1xuICAgICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICAgIH1cbiAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDwhLS0gRGVza3RvcCAtLT5cbiAgICBAaWYgKCFtb2JpbGUpIHtcbiAgICAgIDxpbnB1dFxuICAgICAgICBtYXRJbnB1dFxuICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbWFza2l0b109XCJtYXNraXRvT3B0aW9uc1wiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgIChibHVyKT1cIl9jaGVja0lmVG91Y2hlZCgpXCJcbiAgICAgICAgKGtleXVwLmFycm93RG93bik9XCJvcGVuRGF0ZVBpY2tlcigpXCJcbiAgICAgICAgKGtleXVwLmVzY2FwZSk9XCJfcHJldmVudEV2ZW50KCRldmVudClcIlxuICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAvPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgaGlkZGVuXG4gICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIE1vYmlsZSAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICAjbWF0SW5wdXRcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIG1kYy10ZXh0LWZpZWxkX19pbnB1dFwiXG4gICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAvPlxuICAgICAgPGlucHV0XG4gICAgICAgIG1hdElucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgaGlkZGVuXG4gICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgKGRhdGVDaGFuZ2UpPVwiX29uRGF0ZVBpY2tlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgcmVhZG9ubHlcbiAgICAgIC8+XG4gICAgfVxuXG4gICAgPGRpdiBtYXRTdWZmaXg+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gdGFiaW5kZXg9XCItMVwiIChjbGljayk9XCJvcGVuRGF0ZVBpY2tlcigpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICAgIDxtYXQtaWNvbj57eyBtb2JpbGUgPyAnZGF0ZV9yYW5nZScgOiAna2V5Ym9hcmRfYXJyb3dfZG93bicgfX08L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKGNsZWFyYWJsZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICAgIFtoaWRkZW5dPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWQgfHwgIWZvcm1Db250cm9sLnZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIGVycm9ycyAtLT5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5lcnJvcnMgfCBtYXBLZXlzIHwgYXJyYXlGaXJzdDsgbGV0IGVycm9yS2V5XCI+XG4gICAgICBAc3dpdGNoIChlcnJvcktleSkge1xuICAgICAgICBAY2FzZSAoJ3JlcXVpcmVkJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3ZhbGlkRGF0ZScpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEU8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkYXRlSXNBZnRlcicpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9BRlRFUicgfCB0cmFuc2xhdGU6IGZvcm1Db250cm9sLmVycm9ycy5kYXRlSXNBZnRlciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVJc0JlZm9yZScpIHtcbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgIHt7ICdFUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9CRUZPUkUnIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMuZGF0ZUlzQmVmb3JlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZVJhbmdlJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ2RhdGVNYXhEdXJhdGlvbicpIHtcbiAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUFYX0RVUkFUSU9OPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZGF0ZU1pbkR1cmF0aW9uJykge1xuICAgICAgICAgIDxzcGFuIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NSU5fRFVSQVRJT048L3NwYW4+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdtc2cnKSB7XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7eyBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5rZXkgfHwgZm9ybUNvbnRyb2wuZXJyb3JzLm1zZyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ucGFyYW1zIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEVycm9yVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gaGludHMgLS0+XG4gICAgQGlmICghZm9ybUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgPG1hdC1oaW50PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0SGludFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L21hdC1oaW50PlxuICAgIH1cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bWF0LWRhdGVwaWNrZXJcbiAgICAjZGF0ZVBpY2tlclxuICAgIHN0YXJ0Vmlldz1cIm11bHRpLXllYXJcIlxuICAgIFt0b3VjaFVpXT1cIm1vYmlsZVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAoeWVhclNlbGVjdGVkKT1cIl9jbG9zZURhdGVQaWNrZXIoJGV2ZW50KVwiXG4gICAgcGFuZWxDbGFzcz1cIm1hdC1kYXRlLXNob3J0LXBhbmVsXCJcbiAgICBbc3RhcnRBdF09XCJzdGFydERhdGVcIlxuICA+XG4gICAgPCEtLSBEYXRlIHBpY2tlciBidXR0b25zIC0tPlxuICAgIEBpZiAobW9iaWxlKSB7XG4gICAgICA8bWF0LWRhdGVwaWNrZXItYWN0aW9ucz5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgbWF0RGF0ZXBpY2tlckNhbmNlbD5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJzb2xpZFwiIGNvbG9yPVwidGVydGlhcnlcIiBtYXREYXRlcGlja2VyQXBwbHk+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L21hdC1kYXRlcGlja2VyLWFjdGlvbnM+XG4gICAgfVxuICA8L21hdC1kYXRlcGlja2VyPlxufVxuXG48bmctdGVtcGxhdGUgI21hdFByZWZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0UHJlZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0U3VmZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRTdWZmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRFcnJvclRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3IsW21hdEVycm9yXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0SGludFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSxbbWF0SGludF1cIj48L25nLWNvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1oaW50LXNwYWNlclwiPjwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19