ontimize-web-ngx 15.5.1 → 15.6.0-next.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 (458) hide show
  1. package/esm2020/lib/components/app-header/o-app-header.component.mjs +4 -4
  2. package/esm2020/lib/components/app-header/o-app-header.module.mjs +5 -5
  3. package/esm2020/lib/components/app-sidenav/image/o-app-sidenav-image.component.mjs +4 -4
  4. package/esm2020/lib/components/app-sidenav/menu-group/o-app-sidenav-menu-group.component.mjs +4 -4
  5. package/esm2020/lib/components/app-sidenav/menu-item/o-app-sidenav-menu-item.component.mjs +4 -4
  6. package/esm2020/lib/components/app-sidenav/o-app-sidenav.component.mjs +4 -4
  7. package/esm2020/lib/components/app-sidenav/o-app-sidenav.module.mjs +5 -5
  8. package/esm2020/lib/components/bar-menu/locale-menu-item/o-locale-bar-menu-item.component.mjs +4 -4
  9. package/esm2020/lib/components/bar-menu/menu-group/o-bar-menu-group.component.mjs +4 -4
  10. package/esm2020/lib/components/bar-menu/menu-item/o-bar-menu-item.component.mjs +4 -4
  11. package/esm2020/lib/components/bar-menu/menu-nested/o-bar-menu-nested.component.mjs +4 -4
  12. package/esm2020/lib/components/bar-menu/menu-separator/o-bar-menu-separator.component.mjs +4 -4
  13. package/esm2020/lib/components/bar-menu/o-bar-menu-base.class.mjs +4 -4
  14. package/esm2020/lib/components/bar-menu/o-bar-menu.component.mjs +4 -4
  15. package/esm2020/lib/components/bar-menu/o-bar-menu.module.mjs +5 -5
  16. package/esm2020/lib/components/bar-menu/o-base-menu-item.class.mjs +4 -4
  17. package/esm2020/lib/components/breadcrumb/o-breadcrumb.component.mjs +4 -4
  18. package/esm2020/lib/components/breadcrumb/o-breadcrumb.module.mjs +5 -5
  19. package/esm2020/lib/components/button/o-button.component.mjs +4 -4
  20. package/esm2020/lib/components/button/o-button.module.mjs +5 -5
  21. package/esm2020/lib/components/button-toggle/o-button-toggle-group/o-button-toggle-group.component.mjs +4 -4
  22. package/esm2020/lib/components/button-toggle/o-button-toggle.component.mjs +4 -4
  23. package/esm2020/lib/components/button-toggle/o-button-toggle.module.mjs +5 -5
  24. package/esm2020/lib/components/card-menu-item/o-card-menu-item.component.mjs +4 -4
  25. package/esm2020/lib/components/card-menu-item/o-card-menu-item.module.mjs +5 -5
  26. package/esm2020/lib/components/container/column/o-column.component.mjs +4 -4
  27. package/esm2020/lib/components/container/column/o-column.module.mjs +5 -5
  28. package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.component.mjs +4 -4
  29. package/esm2020/lib/components/container/column-collapsible/o-column-collapsible.module.mjs +5 -5
  30. package/esm2020/lib/components/container/o-container-collapsible-component.class.mjs +4 -4
  31. package/esm2020/lib/components/container/o-container-component.class.mjs +4 -4
  32. package/esm2020/lib/components/container/row/o-row.component.mjs +4 -4
  33. package/esm2020/lib/components/container/row/o-row.module.mjs +5 -5
  34. package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.component.mjs +4 -4
  35. package/esm2020/lib/components/container/row-collapsible/o-row-collapsible.module.mjs +5 -5
  36. package/esm2020/lib/components/contextmenu/context-menu/o-context-menu-content.component.mjs +4 -4
  37. package/esm2020/lib/components/contextmenu/context-menu/o-wrapper-content-menu/o-wrapper-content-menu.component.mjs +4 -4
  38. package/esm2020/lib/components/contextmenu/context-menu-group/o-context-menu-group.component.mjs +4 -4
  39. package/esm2020/lib/components/contextmenu/context-menu-item/o-context-menu-item.component.mjs +4 -4
  40. package/esm2020/lib/components/contextmenu/context-menu-separator/o-context-menu-separator.component.mjs +4 -4
  41. package/esm2020/lib/components/contextmenu/o-content-menu-base-item.class.mjs +4 -4
  42. package/esm2020/lib/components/contextmenu/o-context-menu-overlay.service.mjs +4 -4
  43. package/esm2020/lib/components/contextmenu/o-context-menu.component.mjs +4 -4
  44. package/esm2020/lib/components/contextmenu/o-context-menu.directive.mjs +4 -4
  45. package/esm2020/lib/components/contextmenu/o-context-menu.module.mjs +5 -5
  46. package/esm2020/lib/components/contextmenu/o-context-menu.service.mjs +4 -4
  47. package/esm2020/lib/components/dual-list-selector/dual-list-selector-item/date/o-dual-list-selector-date-item.component.mjs +4 -4
  48. package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.component.mjs +4 -4
  49. package/esm2020/lib/components/dual-list-selector/o-dual-list-selector.module.mjs +5 -5
  50. package/esm2020/lib/components/expandable-container/o-expandable-container.component.mjs +4 -4
  51. package/esm2020/lib/components/expandable-container/o-expandable-container.module.mjs +5 -5
  52. package/esm2020/lib/components/filter-builder/filter-builder-menu/filter-builder-menu.component.mjs +4 -4
  53. package/esm2020/lib/components/filter-builder/o-filter-builder-clear.directive.mjs +4 -4
  54. package/esm2020/lib/components/filter-builder/o-filter-builder-query.directive.mjs +4 -4
  55. package/esm2020/lib/components/filter-builder/o-filter-builder.component.mjs +4 -4
  56. package/esm2020/lib/components/filter-builder/o-filter-builder.module.mjs +5 -5
  57. package/esm2020/lib/components/form/guards/o-form-can-deactivate.guard.mjs +4 -4
  58. package/esm2020/lib/components/form/navigation/o-form-confirm-exit.service.mjs +4 -4
  59. package/esm2020/lib/components/form/navigation/o-form-navigation.component.mjs +6 -5
  60. package/esm2020/lib/components/form/o-form.component.mjs +27 -13
  61. package/esm2020/lib/components/form/o-form.module.mjs +5 -5
  62. package/esm2020/lib/components/form/services/o-form-message.service.mjs +4 -4
  63. package/esm2020/lib/components/form/toolbar/o-form-toolbar.component.mjs +4 -4
  64. package/esm2020/lib/components/form/toolbar/o-form-toolbar.module.mjs +5 -5
  65. package/esm2020/lib/components/form-container/o-form-container.component.mjs +4 -4
  66. package/esm2020/lib/components/form-container/o-form-container.module.mjs +5 -5
  67. package/esm2020/lib/components/grid/grid-item/o-grid-item.component.mjs +4 -4
  68. package/esm2020/lib/components/grid/grid-item/o-grid-item.directive.mjs +4 -4
  69. package/esm2020/lib/components/grid/o-grid.component.mjs +5 -5
  70. package/esm2020/lib/components/grid/o-grid.module.mjs +5 -5
  71. package/esm2020/lib/components/grid/skeketon/o-grid-skeleton.component.mjs +4 -4
  72. package/esm2020/lib/components/image/fullscreen/fullscreen-dialog.component.mjs +4 -4
  73. package/esm2020/lib/components/image/o-image.component.mjs +6 -6
  74. package/esm2020/lib/components/image/o-image.module.mjs +5 -5
  75. package/esm2020/lib/components/input/checkbox/o-checkbox.component.mjs +4 -4
  76. package/esm2020/lib/components/input/checkbox/o-checkbox.module.mjs +5 -5
  77. package/esm2020/lib/components/input/combo/combo-renderer/boolean/o-combo-renderer-boolean.component.mjs +4 -4
  78. package/esm2020/lib/components/input/combo/combo-renderer/currency/o-combo-renderer-currency.component.mjs +4 -4
  79. package/esm2020/lib/components/input/combo/combo-renderer/date/o-combo-renderer-date.component.mjs +4 -4
  80. package/esm2020/lib/components/input/combo/combo-renderer/icon/o-combo-renderer-icon.component.mjs +4 -4
  81. package/esm2020/lib/components/input/combo/combo-renderer/integer/o-combo-renderer-integer.component.mjs +4 -4
  82. package/esm2020/lib/components/input/combo/combo-renderer/o-combo-renderer.class.mjs +4 -4
  83. package/esm2020/lib/components/input/combo/combo-renderer/percentage/o-combo-renderer-percentage.component.mjs +4 -4
  84. package/esm2020/lib/components/input/combo/combo-renderer/real/o-combo-renderer-real.component.mjs +4 -4
  85. package/esm2020/lib/components/input/combo/combo-search/o-combo-search.component.mjs +4 -4
  86. package/esm2020/lib/components/input/combo/o-combo.component.mjs +4 -4
  87. package/esm2020/lib/components/input/combo/o-combo.module.mjs +5 -5
  88. package/esm2020/lib/components/input/currency-input/o-currency-input.component.mjs +5 -5
  89. package/esm2020/lib/components/input/currency-input/o-currency-input.module.mjs +5 -5
  90. package/esm2020/lib/components/input/date-input/o-date-input.component.mjs +4 -4
  91. package/esm2020/lib/components/input/date-input/o-date-input.module.mjs +5 -5
  92. package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +4 -4
  93. package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +5 -5
  94. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +4 -4
  95. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +4 -4
  96. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +5 -5
  97. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +4 -4
  98. package/esm2020/lib/components/input/email-input/o-email-input.component.mjs +4 -4
  99. package/esm2020/lib/components/input/email-input/o-email-input.module.mjs +5 -5
  100. package/esm2020/lib/components/input/file-input/o-file-input.component.mjs +9 -5
  101. package/esm2020/lib/components/input/file-input/o-file-input.module.mjs +5 -5
  102. package/esm2020/lib/components/input/hour-input/o-hour-input.component.mjs +4 -4
  103. package/esm2020/lib/components/input/hour-input/o-hour-input.module.mjs +5 -5
  104. package/esm2020/lib/components/input/html-input/o-html-input.component.mjs +4 -4
  105. package/esm2020/lib/components/input/html-input/o-html-input.module.mjs +5 -5
  106. package/esm2020/lib/components/input/integer-input/o-integer-input.component.mjs +4 -4
  107. package/esm2020/lib/components/input/integer-input/o-integer-input.module.mjs +5 -5
  108. package/esm2020/lib/components/input/listpicker/listpicker-renderer/currency/o-list-picker-renderer-currency.component.mjs +4 -4
  109. package/esm2020/lib/components/input/listpicker/listpicker-renderer/date/o-list-picker-renderer-date.component.mjs +4 -4
  110. package/esm2020/lib/components/input/listpicker/listpicker-renderer/integer/o-list-picker-renderer-integer.component.mjs +4 -4
  111. package/esm2020/lib/components/input/listpicker/listpicker-renderer/o-list-picker-renderer.class.mjs +4 -4
  112. package/esm2020/lib/components/input/listpicker/listpicker-renderer/percentage/o-list-picker-renderer-percentage.component.mjs +4 -4
  113. package/esm2020/lib/components/input/listpicker/listpicker-renderer/real/o-list-picker-renderer-real.component.mjs +4 -4
  114. package/esm2020/lib/components/input/listpicker/o-list-picker-dialog.component.mjs +4 -4
  115. package/esm2020/lib/components/input/listpicker/o-list-picker.component.mjs +4 -4
  116. package/esm2020/lib/components/input/listpicker/o-list-picker.module.mjs +5 -5
  117. package/esm2020/lib/components/input/nif-input/o-nif-input.component.mjs +4 -4
  118. package/esm2020/lib/components/input/nif-input/o-nif-input.module.mjs +5 -5
  119. package/esm2020/lib/components/input/o-boolean-form-data-component.class.mjs +4 -4
  120. package/esm2020/lib/components/input/o-form-service-component.class.mjs +20 -11
  121. package/esm2020/lib/components/input/password-input/o-password-input.component.mjs +4 -4
  122. package/esm2020/lib/components/input/password-input/o-password-input.module.mjs +5 -5
  123. package/esm2020/lib/components/input/percent-input/o-percent-input.component.mjs +4 -4
  124. package/esm2020/lib/components/input/percent-input/o-percent-input.module.mjs +5 -5
  125. package/esm2020/lib/components/input/phone-input/data/country-code.mjs +4 -4
  126. package/esm2020/lib/components/input/phone-input/o-phone-input.component.mjs +4 -4
  127. package/esm2020/lib/components/input/phone-input/o-phone-input.module.mjs +5 -5
  128. package/esm2020/lib/components/input/radio/o-radio.component.mjs +4 -4
  129. package/esm2020/lib/components/input/radio/o-radio.module.mjs +5 -5
  130. package/esm2020/lib/components/input/real-input/o-real-input.component.mjs +4 -4
  131. package/esm2020/lib/components/input/real-input/o-real-input.module.mjs +5 -5
  132. package/esm2020/lib/components/input/search-input/o-search-input.component.mjs +4 -4
  133. package/esm2020/lib/components/input/search-input/o-search-input.module.mjs +5 -5
  134. package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.component.mjs +4 -4
  135. package/esm2020/lib/components/input/slide-toggle/o-slide-toggle.module.mjs +5 -5
  136. package/esm2020/lib/components/input/slider/o-slider.component.mjs +4 -4
  137. package/esm2020/lib/components/input/slider/o-slider.module.mjs +5 -5
  138. package/esm2020/lib/components/input/text-input/o-text-input.component.mjs +4 -4
  139. package/esm2020/lib/components/input/text-input/o-text-input.module.mjs +5 -5
  140. package/esm2020/lib/components/input/textarea-input/o-textarea-input.component.mjs +4 -4
  141. package/esm2020/lib/components/input/textarea-input/o-textarea-input.module.mjs +5 -5
  142. package/esm2020/lib/components/input/time-input/o-time-input.component.mjs +4 -4
  143. package/esm2020/lib/components/input/time-input/o-time-input.module.mjs +5 -5
  144. package/esm2020/lib/components/language-selector/o-language-selector.component.mjs +4 -4
  145. package/esm2020/lib/components/language-selector/o-language-selector.module.mjs +5 -5
  146. package/esm2020/lib/components/list/list-item/o-list-item.component.mjs +4 -4
  147. package/esm2020/lib/components/list/list-item/o-list-item.directive.mjs +4 -4
  148. package/esm2020/lib/components/list/o-list.component.mjs +5 -5
  149. package/esm2020/lib/components/list/o-list.module.mjs +5 -5
  150. package/esm2020/lib/components/list/renderers/avatar/o-list-item-avatar.component.mjs +4 -4
  151. package/esm2020/lib/components/list/renderers/card/o-list-item-card.component.mjs +4 -4
  152. package/esm2020/lib/components/list/renderers/card-image/o-list-item-card-image.component.mjs +4 -4
  153. package/esm2020/lib/components/list/renderers/o-list-item-card-renderer.class.mjs +4 -4
  154. package/esm2020/lib/components/list/renderers/o-list-item-text-renderer.class.mjs +4 -4
  155. package/esm2020/lib/components/list/renderers/text/o-list-item-text.component.mjs +4 -4
  156. package/esm2020/lib/components/list/skeleton/o-list-skeleton.component.mjs +4 -4
  157. package/esm2020/lib/components/material/ckeditor/ck-editor.component.mjs +4 -4
  158. package/esm2020/lib/components/material/ckeditor/ck-editor.module.mjs +5 -5
  159. package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.component.mjs +4 -4
  160. package/esm2020/lib/components/o-data-toolbar/o-data-toolbar.module.mjs +5 -5
  161. package/esm2020/lib/components/o-form-data-component.class.mjs +4 -4
  162. package/esm2020/lib/components/o-service-base-component.class.mjs +35 -24
  163. package/esm2020/lib/components/o-service-component.class.mjs +8 -8
  164. package/esm2020/lib/components/o-skeleton.component.mjs +4 -4
  165. package/esm2020/lib/components/table/column/calculated/o-table-column-calculated.component.mjs +4 -4
  166. package/esm2020/lib/components/table/column/cell-editor/boolean/o-table-cell-editor-boolean.component.mjs +4 -4
  167. package/esm2020/lib/components/table/column/cell-editor/date/o-table-cell-editor-date.component.mjs +4 -4
  168. package/esm2020/lib/components/table/column/cell-editor/email/o-table-cell-editor-email.component.mjs +4 -4
  169. package/esm2020/lib/components/table/column/cell-editor/integer/o-table-cell-editor-integer.component.mjs +4 -4
  170. package/esm2020/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.mjs +4 -4
  171. package/esm2020/lib/components/table/column/cell-editor/real/o-table-cell-editor-real.component.mjs +4 -4
  172. package/esm2020/lib/components/table/column/cell-editor/text/o-table-cell-editor-text.component.mjs +4 -4
  173. package/esm2020/lib/components/table/column/cell-editor/time/o-table-cell-editor-time.component.mjs +4 -4
  174. package/esm2020/lib/components/table/column/cell-renderer/action/o-table-cell-renderer-action.component.mjs +4 -4
  175. package/esm2020/lib/components/table/column/cell-renderer/boolean/o-table-cell-renderer-boolean.component.mjs +4 -4
  176. package/esm2020/lib/components/table/column/cell-renderer/currency/o-table-cell-renderer-currency.component.mjs +4 -4
  177. package/esm2020/lib/components/table/column/cell-renderer/date/o-table-cell-renderer-date.component.mjs +4 -4
  178. package/esm2020/lib/components/table/column/cell-renderer/image/o-table-cell-renderer-image.component.mjs +4 -4
  179. package/esm2020/lib/components/table/column/cell-renderer/integer/o-table-cell-renderer-integer.component.mjs +4 -4
  180. package/esm2020/lib/components/table/column/cell-renderer/o-base-table-cell-renderer.class.mjs +4 -4
  181. package/esm2020/lib/components/table/column/cell-renderer/percentage/o-table-cell-renderer-percentage.component.mjs +4 -4
  182. package/esm2020/lib/components/table/column/cell-renderer/real/o-table-cell-renderer-real.component.mjs +4 -4
  183. package/esm2020/lib/components/table/column/cell-renderer/service/o-table-cell-renderer-service.component.mjs +23 -9
  184. package/esm2020/lib/components/table/column/cell-renderer/time/o-table-cell-renderer-time.component.mjs +4 -4
  185. package/esm2020/lib/components/table/column/cell-renderer/translate/o-table-cell-renderer-translate.component.mjs +4 -4
  186. package/esm2020/lib/components/table/column/o-table-column.component.mjs +4 -4
  187. package/esm2020/lib/components/table/extensions/contextmenu/o-table-context-menu.component.mjs +4 -4
  188. package/esm2020/lib/components/table/extensions/dialog/apply-configuration/o-table-apply-configuration-dialog.component.mjs +4 -4
  189. package/esm2020/lib/components/table/extensions/dialog/export/o-table-export-dialog.component.mjs +4 -4
  190. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +4 -4
  191. package/esm2020/lib/components/table/extensions/dialog/group-by-columns/o-table-group-by-columns-dialog.component.mjs +4 -4
  192. package/esm2020/lib/components/table/extensions/dialog/o-table-base-dialog.class.mjs +4 -4
  193. package/esm2020/lib/components/table/extensions/dialog/store-configuration/o-table-store-configuration-dialog.component.mjs +4 -4
  194. package/esm2020/lib/components/table/extensions/dialog/visible-columns/o-table-visible-columns-dialog.component.mjs +4 -4
  195. package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.component.mjs +4 -4
  196. package/esm2020/lib/components/table/extensions/export-button/o-table-export-button.service.mjs +4 -4
  197. package/esm2020/lib/components/table/extensions/footer/aggregate/o-table-column-aggregate.component.mjs +4 -4
  198. package/esm2020/lib/components/table/extensions/footer/expanded/o-table-expanded-footer.directive.mjs +4 -4
  199. package/esm2020/lib/components/table/extensions/footer/paginator/o-table-mat-paginator-intl.mjs +4 -4
  200. package/esm2020/lib/components/table/extensions/footer/paginator/o-table-paginator.component.mjs +4 -4
  201. package/esm2020/lib/components/table/extensions/header/o-table-header-components.mjs +3 -2
  202. package/esm2020/lib/components/table/extensions/header/table-button/o-table-button.component.mjs +4 -4
  203. package/esm2020/lib/components/table/extensions/header/table-buttons/o-table-buttons.component.mjs +4 -4
  204. package/esm2020/lib/components/table/extensions/header/table-column-resizer/o-table-column-resizer.component.mjs +4 -4
  205. package/esm2020/lib/components/table/extensions/header/table-column-select-all/o-table-column-select-all.directive.mjs +4 -4
  206. package/esm2020/lib/components/table/extensions/header/table-columns-filter/columns/o-table-columns-filter-column.component.mjs +4 -4
  207. package/esm2020/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.mjs +4 -4
  208. package/esm2020/lib/components/table/extensions/header/table-columns-grouping/columns/o-table-columns-grouping-column.component.mjs +4 -4
  209. package/esm2020/lib/components/table/extensions/header/table-columns-grouping/o-table-columns-grouping.component.mjs +4 -4
  210. package/esm2020/lib/components/table/extensions/header/table-header/o-table-header.component.mjs +4 -4
  211. package/esm2020/lib/components/table/extensions/header/table-header-column-filter-icon/o-table-header-column-filter-icon.component.mjs +4 -4
  212. package/esm2020/lib/components/table/extensions/header/table-header-select-all/o-table-header-select-all.component.mjs +4 -4
  213. package/esm2020/lib/components/table/extensions/header/table-insertable-row/o-table-insertable-row.component.mjs +4 -4
  214. package/esm2020/lib/components/table/extensions/header/table-menu/o-table-menu.component.mjs +4 -4
  215. package/esm2020/lib/components/table/extensions/header/table-option/o-table-option.component.mjs +4 -4
  216. package/esm2020/lib/components/table/extensions/header/table-quickfilter/o-table-quickfilter.component.mjs +4 -4
  217. package/esm2020/lib/components/table/extensions/o-table-datasource.service.mjs +4 -4
  218. package/esm2020/lib/components/table/extensions/o-table-strategy.service.mjs +4 -4
  219. package/esm2020/lib/components/table/extensions/o-table.dao.mjs +10 -12
  220. package/esm2020/lib/components/table/extensions/pipes/o-table-row-class.pipe.mjs +4 -4
  221. package/esm2020/lib/components/table/extensions/row/o-table-row.directive.mjs +4 -4
  222. package/esm2020/lib/components/table/extensions/row/table-row-expandable/o-table-row-expandable.component.mjs +4 -4
  223. package/esm2020/lib/components/table/extensions/skeleton/o-table-skeleton.component.mjs +4 -4
  224. package/esm2020/lib/components/table/extensions/sort/o-mat-sort-header.mjs +4 -4
  225. package/esm2020/lib/components/table/extensions/sort/o-mat-sort-module.mjs +5 -5
  226. package/esm2020/lib/components/table/extensions/sort/o-mat-sort.mjs +4 -4
  227. package/esm2020/lib/components/table/o-table-base.class.mjs +1 -1
  228. package/esm2020/lib/components/table/o-table.component.mjs +20 -15
  229. package/esm2020/lib/components/table/o-table.module.mjs +6 -6
  230. package/esm2020/lib/components/tree/header/tree-menu/o-tree-menu.component.mjs +4 -4
  231. package/esm2020/lib/components/tree/o-tree-dao.service.mjs +4 -4
  232. package/esm2020/lib/components/tree/o-tree.component.mjs +6 -6
  233. package/esm2020/lib/components/tree/o-tree.module.mjs +5 -5
  234. package/esm2020/lib/components/tree/tree-node/tree-node.component.mjs +4 -4
  235. package/esm2020/lib/components/user-info/o-user-info.component.mjs +4 -4
  236. package/esm2020/lib/components/user-info/o-user-info.module.mjs +5 -5
  237. package/esm2020/lib/components/user-info/user-info-configuration/o-user-info-configuration.directive.mjs +4 -4
  238. package/esm2020/lib/components/user-info/user-info-configuration-item/o-user-info-configuration-item.directive.mjs +4 -4
  239. package/esm2020/lib/config/app-config.mjs +4 -1
  240. package/esm2020/lib/config/o-modules.mjs +5 -5
  241. package/esm2020/lib/config/o-providers.mjs +7 -4
  242. package/esm2020/lib/directives/input-regulate.directive.mjs +4 -4
  243. package/esm2020/lib/directives/keyboard-listener.directive.mjs +4 -4
  244. package/esm2020/lib/directives/locker.directive.mjs +4 -4
  245. package/esm2020/lib/directives/o-file-drag-and-drop.directive.mjs +4 -4
  246. package/esm2020/lib/directives/o-hidden.directive.mjs +4 -4
  247. package/esm2020/lib/directives/o-mat-error.directive.mjs +4 -4
  248. package/esm2020/lib/directives/o-mat-prefix.directive.mjs +4 -4
  249. package/esm2020/lib/directives/o-mat-suffix.directive.mjs +4 -4
  250. package/esm2020/lib/directives/o-tab-group.directive.mjs +4 -4
  251. package/esm2020/lib/interfaces/base-response.interface.mjs +2 -0
  252. package/esm2020/lib/interfaces/data-service.interface.mjs +1 -1
  253. package/esm2020/lib/interfaces/form-data-component.interface.mjs +1 -1
  254. package/esm2020/lib/interfaces/index.mjs +4 -1
  255. package/esm2020/lib/interfaces/jsonapi-response.interface.mjs +2 -0
  256. package/esm2020/lib/interfaces/name-convention.interface.mjs +2 -0
  257. package/esm2020/lib/interfaces/prefereces-service.interface.mjs +2 -0
  258. package/esm2020/lib/interfaces/service-response-adapter.interface.mjs +1 -1
  259. package/esm2020/lib/interfaces/service-response.interface.mjs +1 -1
  260. package/esm2020/lib/layouts/app-layout/app-layout-header/o-app-layout-header.component.mjs +4 -4
  261. package/esm2020/lib/layouts/app-layout/app-layout-sidenav/o-app-layout-sidenav.component.mjs +4 -4
  262. package/esm2020/lib/layouts/app-layout/o-app-layout.component.mjs +4 -4
  263. package/esm2020/lib/layouts/app-layout/o-app-layout.module.mjs +5 -5
  264. package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.component.mjs +4 -4
  265. package/esm2020/lib/layouts/card-menu-layout/o-card-menu-layout.module.mjs +5 -5
  266. package/esm2020/lib/layouts/form-layout/dialog/o-form-layout-dialog.component.mjs +4 -4
  267. package/esm2020/lib/layouts/form-layout/dialog/options/o-form-layout-dialog-options.directive.mjs +4 -4
  268. package/esm2020/lib/layouts/form-layout/directives/o-form-layout-manager-content.directive.mjs +4 -4
  269. package/esm2020/lib/layouts/form-layout/guards/o-form-layout-can-activate-child.guard.mjs +4 -4
  270. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +4 -4
  271. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.module.mjs +5 -5
  272. package/esm2020/lib/layouts/form-layout/split-pane/o-form-layout-split-pane.component.mjs +4 -4
  273. package/esm2020/lib/layouts/form-layout/split-pane/options/o-form-layout-split-pane-options.directive.mjs +4 -4
  274. package/esm2020/lib/layouts/form-layout/tabgroup/o-form-layout-tabgroup.component.mjs +4 -4
  275. package/esm2020/lib/layouts/form-layout/tabgroup/options/o-form-layout-tabgroup-options.directive.mjs +4 -4
  276. package/esm2020/lib/ontimize-web-ngx.module.mjs +5 -5
  277. package/esm2020/lib/pipes/columns-filter.pipe.mjs +4 -4
  278. package/esm2020/lib/pipes/is-empty-value.pipe.mjs +4 -4
  279. package/esm2020/lib/pipes/o-currency.pipe.mjs +4 -4
  280. package/esm2020/lib/pipes/o-icon.pipe.mjs +4 -4
  281. package/esm2020/lib/pipes/o-integer.pipe.mjs +4 -4
  282. package/esm2020/lib/pipes/o-moment.pipe.mjs +4 -4
  283. package/esm2020/lib/pipes/o-percentage.pipe.mjs +4 -4
  284. package/esm2020/lib/pipes/o-real.pipe.mjs +4 -4
  285. package/esm2020/lib/pipes/o-safe.pipe.mjs +4 -4
  286. package/esm2020/lib/pipes/o-translate.pipe.mjs +8 -8
  287. package/esm2020/lib/pipes/order-by.pipe.mjs +4 -4
  288. package/esm2020/lib/services/app-menu.service.mjs +4 -4
  289. package/esm2020/lib/services/appearance.service.mjs +4 -4
  290. package/esm2020/lib/services/auth-guard.service.mjs +4 -4
  291. package/esm2020/lib/services/auth.service.mjs +4 -4
  292. package/esm2020/lib/services/base-data-service.class.mjs +20 -0
  293. package/esm2020/lib/services/base-service.class.mjs +36 -9
  294. package/esm2020/lib/services/currency.service.mjs +4 -4
  295. package/esm2020/lib/services/dialog.service.mjs +4 -4
  296. package/esm2020/lib/services/factories.mjs +74 -5
  297. package/esm2020/lib/services/icon.service.mjs +4 -4
  298. package/esm2020/lib/services/index.mjs +5 -1
  299. package/esm2020/lib/services/jsonapi/index.mjs +5 -0
  300. package/esm2020/lib/services/jsonapi/jsonapi-preferences.service.mjs +47 -0
  301. package/esm2020/lib/services/jsonapi/jsonapi-service-response.adapter.mjs +31 -0
  302. package/esm2020/lib/services/jsonapi/jsonapi-service-response.class.mjs +45 -0
  303. package/esm2020/lib/services/jsonapi/jsonapi.service.mjs +165 -0
  304. package/esm2020/lib/services/local-storage.service.mjs +4 -4
  305. package/esm2020/lib/services/login-storage.service.mjs +4 -4
  306. package/esm2020/lib/services/moment.service.mjs +4 -4
  307. package/esm2020/lib/services/name-convention/base-name-convention.service.mjs +59 -0
  308. package/esm2020/lib/services/name-convention/index.mjs +4 -0
  309. package/esm2020/lib/services/name-convention/name-convention-lower.service.mjs +11 -0
  310. package/esm2020/lib/services/name-convention/name-convention-upper.service.mjs +11 -0
  311. package/esm2020/lib/services/name-convention/name-convention.service.mjs +24 -0
  312. package/esm2020/lib/services/navigation.service.mjs +4 -4
  313. package/esm2020/lib/services/number.service.mjs +4 -4
  314. package/esm2020/lib/services/o-auth.service.mjs +4 -4
  315. package/esm2020/lib/services/o-breadcrumb.service.mjs +4 -4
  316. package/esm2020/lib/services/o-error-dialog-manager.service.mjs +4 -4
  317. package/esm2020/lib/services/o-form-layout-manager.service.mjs +4 -4
  318. package/esm2020/lib/services/o-modules-info.service.mjs +4 -4
  319. package/esm2020/lib/services/o-user-info.service.mjs +4 -4
  320. package/esm2020/lib/services/ontimize/index.mjs +3 -1
  321. package/esm2020/lib/services/ontimize/o-preference-response.adapter.mjs +22 -0
  322. package/esm2020/lib/services/ontimize/ontimize-base-service.class.mjs +7 -12
  323. package/esm2020/lib/services/ontimize/ontimize-ee.service.mjs +33 -16
  324. package/esm2020/lib/services/ontimize/ontimize-export-3xx.service.mjs +7 -7
  325. package/esm2020/lib/services/ontimize/ontimize-export.service.mjs +6 -6
  326. package/esm2020/lib/services/ontimize/ontimize-file.service.mjs +6 -6
  327. package/esm2020/lib/services/ontimize/ontimize-preferences.service.mjs +56 -0
  328. package/esm2020/lib/services/ontimize/ontimize-service-response.adapter.mjs +7 -4
  329. package/esm2020/lib/services/ontimize/ontimize.service.mjs +32 -23
  330. package/esm2020/lib/services/ontimize-export-data-base-provider.service.mjs +4 -4
  331. package/esm2020/lib/services/ontimize-export-data-provider-3x.service.mjs +4 -4
  332. package/esm2020/lib/services/ontimize-export-data-provider.service.mjs +4 -4
  333. package/esm2020/lib/services/ontimize-icon-registry.service.mjs +4 -4
  334. package/esm2020/lib/services/pagination-context.service.mjs +4 -4
  335. package/esm2020/lib/services/parser/o-service-response.parser.mjs +21 -4
  336. package/esm2020/lib/services/permissions/o-permissions.module.mjs +5 -5
  337. package/esm2020/lib/services/permissions/ontimize-ee-permissions.service.mjs +4 -4
  338. package/esm2020/lib/services/permissions/ontimize-permissions.service.mjs +4 -4
  339. package/esm2020/lib/services/permissions/permissions-can-activate.guard.mjs +4 -4
  340. package/esm2020/lib/services/permissions/permissions.service.mjs +4 -4
  341. package/esm2020/lib/services/query-arguments/base-query-argument.adapter.mjs +9 -0
  342. package/esm2020/lib/services/query-arguments/base-query-argument.interface.mjs +2 -0
  343. package/esm2020/lib/services/query-arguments/index.mjs +5 -0
  344. package/esm2020/lib/services/query-arguments/jsonapi-query-arguments.adapter.mjs +62 -0
  345. package/esm2020/lib/services/query-arguments/ontimize-query-arguments.adapter.mjs +19 -0
  346. package/esm2020/lib/services/remote-config.service.mjs +5 -5
  347. package/esm2020/lib/services/share-can-activate-child.service.mjs +4 -4
  348. package/esm2020/lib/services/snackbar.service.mjs +4 -4
  349. package/esm2020/lib/services/state/o-app-menu-component-state.service.mjs +4 -4
  350. package/esm2020/lib/services/state/o-component-state.service.mjs +10 -10
  351. package/esm2020/lib/services/state/o-filter-builder-component-state.service.mjs +4 -4
  352. package/esm2020/lib/services/state/o-form-layout-manager-component-state.service.mjs +4 -4
  353. package/esm2020/lib/services/state/o-grid-component-state.service.mjs +4 -4
  354. package/esm2020/lib/services/state/o-list-component-state.service.mjs +4 -4
  355. package/esm2020/lib/services/state/o-table-component-state.service.mjs +4 -4
  356. package/esm2020/lib/services/state/o-tree-component-state.service.mjs +4 -4
  357. package/esm2020/lib/services/translate/o-translate.parser.mjs +4 -4
  358. package/esm2020/lib/services/translate/o-translate.service.mjs +10 -7
  359. package/esm2020/lib/shared/components/dialog/o-dialog-internal.component.mjs +4 -4
  360. package/esm2020/lib/shared/components/dialog/o-dialog.component.mjs +4 -4
  361. package/esm2020/lib/shared/components/error403/o-error-403.component.mjs +4 -4
  362. package/esm2020/lib/shared/components/filter/load-filter/o-load-filter-dialog.component.mjs +4 -4
  363. package/esm2020/lib/shared/components/filter/store-filter/o-store-filter-dialog.component.mjs +4 -4
  364. package/esm2020/lib/shared/components/snackbar/o-snackbar-base.class.mjs +4 -4
  365. package/esm2020/lib/shared/components/snackbar/o-snackbar.component.mjs +4 -4
  366. package/esm2020/lib/shared/components/validation/o-error.component.mjs +4 -4
  367. package/esm2020/lib/shared/components/validation/o-validator.component.mjs +4 -4
  368. package/esm2020/lib/shared/material/custom.material.module.mjs +5 -5
  369. package/esm2020/lib/shared/material/date/ontimize-moment-date-adapter.mjs +4 -4
  370. package/esm2020/lib/shared/shared.module.mjs +5 -5
  371. package/esm2020/lib/types/config.type.mjs +1 -1
  372. package/esm2020/lib/types/configure-service-args.type.mjs +1 -1
  373. package/esm2020/lib/types/index.mjs +5 -1
  374. package/esm2020/lib/types/json-query-parameter.type.mjs +2 -0
  375. package/esm2020/lib/types/preferences.type.mjs +2 -0
  376. package/esm2020/lib/types/query-params.type.mjs +2 -0
  377. package/esm2020/lib/types/service-configuration.type.mjs +2 -0
  378. package/esm2020/lib/types/service-request-param.type.mjs +1 -1
  379. package/esm2020/lib/types/service-type.type.mjs +8 -0
  380. package/esm2020/lib/util/codes.mjs +2 -1
  381. package/esm2020/lib/util/index.mjs +2 -1
  382. package/esm2020/lib/util/preference-mapping-util.mjs +95 -0
  383. package/esm2020/lib/util/sqltypes.mjs +5 -1
  384. package/esm2020/lib/util/util.mjs +118 -12
  385. package/fesm2015/ontimize-web-ngx.mjs +4515 -3577
  386. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  387. package/fesm2020/ontimize-web-ngx.mjs +4524 -3591
  388. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  389. package/lib/components/form/navigation/o-form-navigation.component.d.ts +3 -1
  390. package/lib/components/form/o-form.component.d.ts +12 -7
  391. package/lib/components/grid/o-grid.component.d.ts +2 -1
  392. package/lib/components/input/file-input/o-file-input.component.d.ts +3 -1
  393. package/lib/components/input/o-form-service-component.class.d.ts +11 -4
  394. package/lib/components/list/o-list.component.d.ts +2 -1
  395. package/lib/components/o-service-base-component.class.d.ts +8 -4
  396. package/lib/components/o-service-component.class.d.ts +1 -1
  397. package/lib/components/table/column/cell-renderer/service/o-table-cell-renderer-service.component.d.ts +7 -2
  398. package/lib/components/table/column/o-table-column.component.d.ts +1 -1
  399. package/lib/components/table/extensions/o-table.dao.d.ts +7 -4
  400. package/lib/components/table/o-table-base.class.d.ts +1 -0
  401. package/lib/components/table/o-table.component.d.ts +4 -2
  402. package/lib/components/table/o-table.module.d.ts +1 -1
  403. package/lib/config/app-config.d.ts +2 -1
  404. package/lib/config/o-directives.d.ts +1 -1
  405. package/lib/interfaces/base-response.interface.d.ts +7 -0
  406. package/lib/interfaces/data-service.interface.d.ts +1 -0
  407. package/lib/interfaces/form-data-component.interface.d.ts +1 -0
  408. package/lib/interfaces/index.d.ts +3 -0
  409. package/lib/interfaces/jsonapi-response.interface.d.ts +9 -0
  410. package/lib/interfaces/name-convention.interface.d.ts +9 -0
  411. package/lib/interfaces/prefereces-service.interface.d.ts +7 -0
  412. package/lib/interfaces/service-response-adapter.interface.d.ts +4 -2
  413. package/lib/interfaces/service-response.interface.d.ts +2 -6
  414. package/lib/services/base-data-service.class.d.ts +18 -0
  415. package/lib/services/base-service.class.d.ts +27 -20
  416. package/lib/services/factories.d.ts +32 -2
  417. package/lib/services/index.d.ts +4 -0
  418. package/lib/services/jsonapi/index.d.ts +4 -0
  419. package/lib/services/jsonapi/jsonapi-preferences.service.d.ts +13 -0
  420. package/lib/services/jsonapi/jsonapi-service-response.adapter.d.ts +12 -0
  421. package/lib/services/jsonapi/jsonapi-service-response.class.d.ts +23 -0
  422. package/lib/services/jsonapi/jsonapi.service.d.ts +30 -0
  423. package/lib/services/name-convention/base-name-convention.service.d.ts +12 -0
  424. package/lib/services/name-convention/index.d.ts +3 -0
  425. package/lib/services/name-convention/name-convention-lower.service.d.ts +5 -0
  426. package/lib/services/name-convention/name-convention-upper.service.d.ts +5 -0
  427. package/lib/services/name-convention/name-convention.service.d.ts +10 -0
  428. package/lib/services/ontimize/index.d.ts +2 -0
  429. package/lib/services/ontimize/o-preference-response.adapter.d.ts +9 -0
  430. package/lib/services/ontimize/ontimize-base-service.class.d.ts +3 -3
  431. package/lib/services/ontimize/ontimize-ee.service.d.ts +1 -1
  432. package/lib/services/ontimize/ontimize-export-3xx.service.d.ts +3 -2
  433. package/lib/services/ontimize/ontimize-export.service.d.ts +2 -2
  434. package/lib/services/ontimize/ontimize-file.service.d.ts +3 -2
  435. package/lib/services/ontimize/ontimize-preferences.service.d.ts +16 -0
  436. package/lib/services/ontimize/ontimize-service-response.adapter.d.ts +6 -5
  437. package/lib/services/ontimize/ontimize.service.d.ts +2 -0
  438. package/lib/services/parser/o-service-response.parser.d.ts +11 -5
  439. package/lib/services/query-arguments/base-query-argument.adapter.d.ts +6 -0
  440. package/lib/services/query-arguments/base-query-argument.interface.d.ts +3 -0
  441. package/lib/services/query-arguments/index.d.ts +4 -0
  442. package/lib/services/query-arguments/jsonapi-query-arguments.adapter.d.ts +12 -0
  443. package/lib/services/query-arguments/ontimize-query-arguments.adapter.d.ts +8 -0
  444. package/lib/services/translate/o-translate.service.d.ts +1 -0
  445. package/lib/types/config.type.d.ts +3 -1
  446. package/lib/types/configure-service-args.type.d.ts +5 -5
  447. package/lib/types/index.d.ts +4 -0
  448. package/lib/types/json-query-parameter.type.d.ts +15 -0
  449. package/lib/types/preferences.type.d.ts +7 -0
  450. package/lib/types/query-params.type.d.ts +11 -0
  451. package/lib/types/service-configuration.type.d.ts +7 -0
  452. package/lib/types/service-request-param.type.d.ts +5 -5
  453. package/lib/types/service-type.type.d.ts +5 -0
  454. package/lib/util/codes.d.ts +6 -5
  455. package/lib/util/index.d.ts +1 -0
  456. package/lib/util/preference-mapping-util.d.ts +93 -0
  457. package/lib/util/util.d.ts +12 -2
  458. package/package.json +1 -1
@@ -65,6 +65,7 @@ export const DEFAULT_INPUTS_O_FORM = [
65
65
  'queryFallbackFunction: query-fallback-function',
66
66
  'ignoreDefaultNavigation: ignore-default-navigation',
67
67
  'messageServiceType : message-service-type',
68
+ 'configureServiceArgs: configure-service-args',
68
69
  'setValueOrder: set-value-order',
69
70
  'formDataValidationFunction: form-data-validation-function'
70
71
  ];
@@ -127,7 +128,8 @@ export class OFormComponent {
127
128
  this.stayInRecordAfterEdit = false;
128
129
  this.afterInsertMode = 'close';
129
130
  this.queryOnInit = true;
130
- this.queryMethod = Codes.QUERY_METHOD;
131
+ this.getMethod = "";
132
+ this.queryMethod = Codes.QUERYBYID_METHOD;
131
133
  this.insertMethod = Codes.INSERT_METHOD;
132
134
  this.updateMethod = Codes.UPDATE_METHOD;
133
135
  this.deleteMethod = Codes.DELETE_METHOD;
@@ -313,6 +315,9 @@ export class OFormComponent {
313
315
  getComponents() {
314
316
  return this._components;
315
317
  }
318
+ getComponentByAttr(attr) {
319
+ return this._components[attr];
320
+ }
316
321
  load() {
317
322
  const self = this;
318
323
  const zone = this.injector.get(NgZone);
@@ -514,7 +519,10 @@ export class OFormComponent {
514
519
  configureService() {
515
520
  const msgConfigureServiceArgs = { injector: this.injector, baseService: OFormMessageService, serviceType: this.messageServiceType };
516
521
  this._messageService = Util.configureMessageService(msgConfigureServiceArgs);
517
- const configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType };
522
+ let configureServiceArgs = { injector: this.injector, baseService: OntimizeService, entity: this.entity, service: this.service, serviceType: this.serviceType };
523
+ if (Util.isDefined(this.configureServiceArgs)) {
524
+ configureServiceArgs = { ...configureServiceArgs, ...this.configureServiceArgs };
525
+ }
518
526
  this.dataService = Util.configureService(configureServiceArgs);
519
527
  }
520
528
  get messageService() {
@@ -640,11 +648,16 @@ export class OFormComponent {
640
648
  this.reload(useFilter);
641
649
  }
642
650
  reload(useFilter = false) {
643
- let filter = {};
651
+ let queryArguments = this.getQueryArguments(useFilter);
652
+ this.queryData(queryArguments.filter);
653
+ }
654
+ getQueryArguments(useFilter, filter = {}) {
655
+ const av = this.getAttributesToQuery();
656
+ const sqlTypes = this.getAttributesSQLTypes();
644
657
  if (useFilter) {
645
658
  filter = this.getCurrentKeysValues();
646
659
  }
647
- this.queryData(filter);
660
+ return { filter: filter, columns: av, entity: this.entity, sqlTypes: sqlTypes };
648
661
  }
649
662
  _goInsertMode(options) {
650
663
  console.warn('Method `OFormComponent._goInsertMode` is deprecated and will be removed in the furute. Use `goInsertMode` instead');
@@ -782,9 +795,8 @@ export class OFormComponent {
782
795
  this.loaderSubscription.unsubscribe();
783
796
  }
784
797
  this.loaderSubscription = this.load();
785
- const av = this.getAttributesToQuery();
786
- const sqlTypes = this.getAttributesSQLTypes();
787
- this.querySubscription = this.dataService[this.queryMethod](filter, av, this.entity, sqlTypes)
798
+ const queryParameter = this.getQueryArguments(false, filter);
799
+ this.querySubscription = this.dataService[this.queryMethod](...this.dataService.queryArgumentAdapter.parseQueryParameters(queryParameter))
788
800
  .subscribe((resp) => {
789
801
  if (resp.isSuccessful()) {
790
802
  this.setData(resp.data);
@@ -902,7 +914,9 @@ export class OFormComponent {
902
914
  changedAttrs.indexOf(controlName) !== -1).forEach((item) => {
903
915
  const control = self.formGroup.controls[item];
904
916
  if (control instanceof OFormControl) {
905
- values[item] = control.getValue();
917
+ const comp = this.getComponentByAttr(item);
918
+ values[item] = SQLTypes.parseUsingSQLType(control.getValue(), SQLTypes.getSQLTypeKey(comp.getSQLType()));
919
+ ;
906
920
  }
907
921
  else {
908
922
  values[item] = control.value;
@@ -1120,7 +1134,7 @@ export class OFormComponent {
1120
1134
  const componentsKeys = Object.keys(components).filter(key => self.ignoreFormCacheKeys.indexOf(key) === -1);
1121
1135
  componentsKeys.forEach(compKey => {
1122
1136
  const comp = components[compKey];
1123
- values[compKey] = comp.getValue();
1137
+ values[compKey] = SQLTypes.parseUsingSQLType(comp.getValue(), SQLTypes.getSQLTypeKey(comp.getSQLType()));
1124
1138
  });
1125
1139
  return values;
1126
1140
  }
@@ -1349,8 +1363,8 @@ export class OFormComponent {
1349
1363
  }
1350
1364
  OFormComponent.DEFAULT_LAYOUT_DIRECTION = 'column';
1351
1365
  OFormComponent.guardClassName = 'CanDeactivateFormGuard';
1352
- OFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1353
- OFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OFormComponent, selector: "o-form", inputs: { showHeader: ["show-header", "showHeader"], headerMode: ["header-mode", "headerMode"], headerPosition: ["header-position", "headerPosition"], labelheader: ["label-header", "labelheader"], labelHeaderAlign: ["label-header-align", "labelHeaderAlign"], headeractions: ["header-actions", "headeractions"], showHeaderActionsText: ["show-header-actions-text", "showHeaderActionsText"], entity: "entity", keys: "keys", columns: "columns", service: "service", stayInRecordAfterEdit: ["stay-in-record-after-edit", "stayInRecordAfterEdit"], afterInsertMode: ["after-insert-mode", "afterInsertMode"], serviceType: ["service-type", "serviceType"], queryOnInit: ["query-on-init", "queryOnInit"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], insertMethod: ["insert-method", "insertMethod"], updateMethod: ["update-method", "updateMethod"], deleteMethod: ["delete-method", "deleteMethod"], layoutDirection: ["layout-direction", "layoutDirection"], layoutAlign: ["layout-align", "layoutAlign"], editableDetail: ["editable-detail", "editableDetail"], keysSqlTypes: ["keys-sql-types", "keysSqlTypes"], undoButton: ["undo-button", "undoButton"], showHeaderNavigation: ["show-header-navigation", "showHeaderNavigation"], oattr: ["attr", "oattr"], includeBreadcrumb: ["include-breadcrumb", "includeBreadcrumb"], detectChangesOnBlur: ["detect-changes-on-blur", "detectChangesOnBlur"], confirmExit: ["confirm-exit", "confirmExit"], ignoreOnExit: ["ignore-on-exit", "ignoreOnExit"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], ignoreDefaultNavigation: ["ignore-default-navigation", "ignoreDefaultNavigation"], messageServiceType: ["message-service-type", "messageServiceType"], setValueOrder: ["set-value-order", "setValueOrder"], formDataValidationFunction: ["form-data-validation-function", "formDataValidationFunction"] }, outputs: { onDataLoaded: "onDataLoaded", beforeCloseDetail: "beforeCloseDetail", beforeGoEditMode: "beforeGoEditMode", onFormModeChange: "onFormModeChange", onBeforeInsert: "onBeforeInsert", onBeforeUpdate: "onBeforeUpdate", onBeforeDelete: "onBeforeDelete", onInsert: "onInsert", onUpdate: "onUpdate", onDelete: "onDelete", beforeInsertMode: "beforeInsertMode", beforeUpdateMode: "beforeUpdateMode", beforeInitialMode: "beforeInitialMode", onInsertMode: "onInsertMode", onUpdateMode: "onUpdateMode", onInitialMode: "onInitialMode", onCancel: "onCancel" }, host: { properties: { "class.o-form": "true" } }, providers: [
1366
+ OFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OFormComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1367
+ OFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: OFormComponent, selector: "o-form", inputs: { showHeader: ["show-header", "showHeader"], headerMode: ["header-mode", "headerMode"], headerPosition: ["header-position", "headerPosition"], labelheader: ["label-header", "labelheader"], labelHeaderAlign: ["label-header-align", "labelHeaderAlign"], headeractions: ["header-actions", "headeractions"], showHeaderActionsText: ["show-header-actions-text", "showHeaderActionsText"], entity: "entity", keys: "keys", columns: "columns", service: "service", stayInRecordAfterEdit: ["stay-in-record-after-edit", "stayInRecordAfterEdit"], afterInsertMode: ["after-insert-mode", "afterInsertMode"], serviceType: ["service-type", "serviceType"], queryOnInit: ["query-on-init", "queryOnInit"], parentKeys: ["parent-keys", "parentKeys"], queryMethod: ["query-method", "queryMethod"], insertMethod: ["insert-method", "insertMethod"], updateMethod: ["update-method", "updateMethod"], deleteMethod: ["delete-method", "deleteMethod"], layoutDirection: ["layout-direction", "layoutDirection"], layoutAlign: ["layout-align", "layoutAlign"], editableDetail: ["editable-detail", "editableDetail"], keysSqlTypes: ["keys-sql-types", "keysSqlTypes"], undoButton: ["undo-button", "undoButton"], showHeaderNavigation: ["show-header-navigation", "showHeaderNavigation"], oattr: ["attr", "oattr"], includeBreadcrumb: ["include-breadcrumb", "includeBreadcrumb"], detectChangesOnBlur: ["detect-changes-on-blur", "detectChangesOnBlur"], confirmExit: ["confirm-exit", "confirmExit"], ignoreOnExit: ["ignore-on-exit", "ignoreOnExit"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], ignoreDefaultNavigation: ["ignore-default-navigation", "ignoreDefaultNavigation"], messageServiceType: ["message-service-type", "messageServiceType"], configureServiceArgs: ["configure-service-args", "configureServiceArgs"], setValueOrder: ["set-value-order", "setValueOrder"], formDataValidationFunction: ["form-data-validation-function", "formDataValidationFunction"] }, outputs: { onDataLoaded: "onDataLoaded", beforeCloseDetail: "beforeCloseDetail", beforeGoEditMode: "beforeGoEditMode", onFormModeChange: "onFormModeChange", onBeforeInsert: "onBeforeInsert", onBeforeUpdate: "onBeforeUpdate", onBeforeDelete: "onBeforeDelete", onInsert: "onInsert", onUpdate: "onUpdate", onDelete: "onDelete", beforeInsertMode: "beforeInsertMode", beforeUpdateMode: "beforeUpdateMode", beforeInitialMode: "beforeInitialMode", onInsertMode: "onInsertMode", onUpdateMode: "onUpdateMode", onInitialMode: "onInitialMode", onCancel: "onCancel" }, host: { properties: { "class.o-form": "true" } }, providers: [
1354
1368
  { provide: OFormBase, useExisting: forwardRef(() => OFormComponent) },
1355
1369
  OntimizeServiceProvider,
1356
1370
  OFormMessageService
@@ -1395,7 +1409,7 @@ __decorate([
1395
1409
  BooleanInputConverter(),
1396
1410
  __metadata("design:type", Boolean)
1397
1411
  ], OFormComponent.prototype, "ignoreDefaultNavigation", void 0);
1398
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OFormComponent, decorators: [{
1412
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: OFormComponent, decorators: [{
1399
1413
  type: Component,
1400
1414
  args: [{ selector: 'o-form', providers: [
1401
1415
  { provide: OFormBase, useExisting: forwardRef(() => OFormComponent) },
@@ -1408,4 +1422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1408
1422
  type: ViewChild,
1409
1423
  args: ['innerForm']
1410
1424
  }] } });
1411
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU16RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFRbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtC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RTs7c0RBQ2lCO0FBRXpDO0lBQUMscUJBQXFCLEVBQUU7O2tEQUNHO0FBQzNCO0lBQUMscUJBQXFCLEVBQUU7OzREQUNjO0FBRXRDO0lBQUMscUJBQXFCLEVBQUU7O3lEQUNXO0FBQ25DO0lBQUMscUJBQXFCLEVBQUU7OzJEQUNZO0FBQ3BDO0lBQUMscUJBQXFCLEVBQUU7O21EQUNJO0FBZTVCO0lBQUMscUJBQXFCLEVBQUU7OytEQUN3Qjs0RkE3RHJDLGNBQWM7a0JBaEIxQixTQUFTOytCQUNFLFFBQVEsYUFDUDt3QkFDVCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLEVBQUU7d0JBQ3JFLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3FCQUNwQixVQUdPLHFCQUFxQixXQUNwQixzQkFBc0IsaUJBQ2hCLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osZ0JBQWdCLEVBQUUsTUFBTTtxQkFDekI7K05BU0QsVUFBVSxNQWFWLHFCQUFxQixNQUlYLFdBQVcsTUFTWCxjQUFjLE1BR3hCLFVBQVUsTUFFVixvQkFBb0IsTUFHcEIsaUJBQWlCLE1BRWpCLG1CQUFtQixNQUVuQixXQUFXLE1BZ0JKLHVCQUF1QixNQTBFTixXQUFXO3NCQUFsQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdG9yLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBJQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1kYXRhLWNvbXBvbmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZvcm1EYXRhVHlwZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1kYXRhLXR5cGUtY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZXJ2aWNlUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NlcnZpY2UtcmVzcG9uc2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2UgfSBmcm9tICcuLi8uLi9sYXlvdXRzL2Zvcm0tbGF5b3V0L28tZm9ybS1sYXlvdXQtbWFuYWdlci1iYXNlLmNsYXNzJztcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBPbnRpbWl6ZVNlcnZpY2VQcm92aWRlciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSwgT05hdmlnYXRpb25JdGVtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL29udGltaXplL29udGltaXplLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBTbmFja0JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IE9Db25maWd1cmVNZXNzYWdlU2VydmljZUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9jb25maWd1cmUtbWVzc2FnZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBPQ29uZmlndXJlU2VydmljZUFyZ3MgfSBmcm9tICcuLi8uLi90eXBlcy9jb25maWd1cmUtc2VydmljZS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgRm9ybUxheW91dENsb3NlRGV0YWlsT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tbGF5b3V0LWRldGFpbC1jb21wb25lbnQtZGF0YS50eXBlJztcbmltcG9ydCB7IEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcy9mb3JtLXZhbHVlLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPRm9ybUluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL28tZm9ybS1pbml0aWFsaXphdGlvbi1vcHRpb25zLnR5cGUnO1xuaW1wb3J0IHsgT0Zvcm1QZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL28tZm9ybS1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9QZXJtaXNzaW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL28tcGVybWlzc2lvbnMudHlwZSc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4uLy4uL3V0aWwvY29kZXMnO1xuaW1wb3J0IHsgU1FMVHlwZXMgfSBmcm9tICcuLi8uLi91dGlsL3NxbHR5cGVzJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgT0Zvcm1Db250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLWNvbnRhaW5lci9vLWZvcm0tY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPRm9ybUNvbnRyb2wgfSBmcm9tICcuLi9pbnB1dC9vLWZvcm0tY29udHJvbC5jbGFzcyc7XG5pbXBvcnQgeyBPRm9ybUNhY2hlQ2xhc3MgfSBmcm9tICcuL2NhY2hlL28tZm9ybS5jYWNoZS5jbGFzcyc7XG5pbXBvcnQgeyBDYW5Db21wb25lbnREZWFjdGl2YXRlLCBDYW5EZWFjdGl2YXRlRm9ybUd1YXJkIH0gZnJvbSAnLi9ndWFyZHMvby1mb3JtLWNhbi1kZWFjdGl2YXRlLmd1YXJkJztcbmltcG9ydCB7IE9Gb3JtTmF2aWdhdGlvbkNsYXNzIH0gZnJvbSAnLi9uYXZpZ2F0aW9uL28tZm9ybS5uYXZpZ2F0aW9uLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQmFzZSB9IGZyb20gJy4vby1mb3JtLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT19GT1JNX0dMT0JBTF9DT05GSUcgfSBmcm9tICcuL28tZm9ybS10b2tlbnMnO1xuaW1wb3J0IHsgT0Zvcm1WYWx1ZSB9IGZyb20gJy4vby1mb3JtLXZhbHVlJztcbmltcG9ydCB7IE9Gb3JtTWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL28tZm9ybS1tZXNzYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0Zvcm1Ub29sYmFyQmFzZSB9IGZyb20gJy4vdG9vbGJhci9vLWZvcm0tdG9vbGJhci1iYXNlLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vdG9vbGJhci9vLWZvcm0tdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgT0Zvcm1WYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMvZXJyb3ItZm9ybS12YWxpZGF0aW9uLnR5cGUnO1xuXG5pbnRlcmZhY2UgSUZvcm1EYXRhQ29tcG9uZW50SGFzaCB7XG4gIFthdHRyOiBzdHJpbmddOiBJRm9ybURhdGFDb21wb25lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0lOUFVUU19PX0ZPUk0gPSBbXG4gIC8vIHNob3ctaGVhZGVyIFtib29sZWFuXTogdmlzaWJpbGl0eSBvZiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6IHllcy5cbiAgJ3Nob3dIZWFkZXI6IHNob3ctaGVhZGVyJyxcblxuICAvLyBoZWFkZXItbW9kZSBbc3RyaW5nXVsgbm9uZSB8IGZsb2F0aW5nIF06IHBhaW50aW5nIG1vZGUgb2YgZm9ybSB0b29sYmFyLiBEZWZhdWx0OiAnZmxvYXRpbmcnXG4gICdoZWFkZXJNb2RlOiBoZWFkZXItbW9kZScsXG5cbiAgLy8gaGVhZGVyLXBvc2l0aW9uIFsgdG9wIHwgYm90dG9tIF06IHBvc2l0aW9uIG9mIHRoZSBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICd0b3AnXG4gICdoZWFkZXJQb3NpdGlvbjogaGVhZGVyLXBvc2l0aW9uJyxcblxuICAvLyBsYWJlbC1oZWFkZXIgW3N0cmluZ106IGRpc3BsYXlhYmxlIHRleHQgb24gZm9ybSB0b29sYmFyLiBEZWZhdWx0OiAnJy5cbiAgJ2xhYmVsaGVhZGVyOiBsYWJlbC1oZWFkZXInLFxuXG4gIC8vIGxhYmVsLWhlYWRlci1hbGlnbiBbc3RyaW5nXVtzdGFydCB8IGNlbnRlciB8IGVuZF06IGFsaWdubWVudCBvZiBmb3JtIHRvb2xiYXIgdGV4dC4gRGVmYXVsdDogJ2NlbnRlcidcbiAgJ2xhYmVsSGVhZGVyQWxpZ246IGxhYmVsLWhlYWRlci1hbGlnbicsXG5cbiAgLy8gaGVhZGVyLWFjdGlvbnMgW3N0cmluZ106IGF2YWlsYWJsZSBhY3Rpb24gYnV0dG9ucyBvbiBmb3JtIHRvb2xiYXIgb2Ygc3RhbmRhcmQgQ1JVRCBvcGVyYXRpb25zLCBzZXBhcmF0ZWQgYnkgJzsnLiBBdmFpbGFibGUgb3B0aW9ucyBhcmUgUjtJO1U7RCAoUmVmcmVzaCwgSW5zZXJ0LCBVcGRhdGUsIERlbGV0ZSkuIERlZmF1bHQ6IFI7STtVO0RcbiAgJ2hlYWRlcmFjdGlvbnM6IGhlYWRlci1hY3Rpb25zJyxcblxuICAvLyBzaG93LWhlYWRlci1hY3Rpb25zLXRleHQgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93IHRleHQgb2YgZm9ybSB0b29sYmFyIGJ1dHRvbnMuIERlZmF1bHQgeWVzXG4gICdzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHNob3ctaGVhZGVyLWFjdGlvbnMtdGV4dCcsXG5cbiAgLy8gZW50aXR5IFtzdHJpbmddOiBlbnRpdHkgb2YgdGhlIHNlcnZpY2UuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnZW50aXR5JyxcblxuICAvLyBrZXlzIFtzdHJpbmddOiBlbnRpdHkga2V5cywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdrZXlzJyxcblxuICAvLyBjb2x1bW5zIFtzdHJpbmddOiBjb2x1bW5zIG9mIHRoZSBlbnRpdHksIHNlcGFyYXRlZCBieSAnOycuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAnY29sdW1ucycsXG5cbiAgLy8gc2VydmljZSBbc3RyaW5nXTogSkVFIHNlcnZpY2UgcGF0aC4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdzZXJ2aWNlJyxcblxuICAvLyBzdGF5LWluLXJlY29yZC1hZnRlci1lZGl0IFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogc2hvd3MgZWRpdCBmb3JtIGFmdGVyIGVkaXQgYSByZWNvcmQuIERlZmF1bHQ6IGZhbHNlO1xuICAnc3RheUluUmVjb3JkQWZ0ZXJFZGl0OiBzdGF5LWluLXJlY29yZC1hZnRlci1lZGl0JyxcblxuICAvLyBbc3RyaW5nXVtuZXcgfCBkZXRhaWxdOiBzaG93cyByZXNldGVkIGZvcm0gYWZ0ZXIgaW5zZXJ0IGEgbmV3IHJlY29yZCAobmV3KSBvciBzaG93cyB0aGUgaW5zZXJ0ZWQgcmVjb3JkIGFmdGVyIChkZXRhaWwpXG4gICdhZnRlckluc2VydE1vZGU6IGFmdGVyLWluc2VydC1tb2RlJyxcblxuICAnc2VydmljZVR5cGUgOiBzZXJ2aWNlLXR5cGUnLFxuXG4gICdxdWVyeU9uSW5pdCA6IHF1ZXJ5LW9uLWluaXQnLFxuXG4gICdwYXJlbnRLZXlzOiBwYXJlbnQta2V5cycsXG5cbiAgLy8gcXVlcnktbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIHF1ZXJpZXMuIERlZmF1bHQ6IHF1ZXJ5LlxuICAncXVlcnlNZXRob2Q6IHF1ZXJ5LW1ldGhvZCcsXG5cbiAgLy8gaW5zZXJ0LW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSBpbnNlcnRzLiBEZWZhdWx0OiBpbnNlcnQuXG4gICdpbnNlcnRNZXRob2Q6IGluc2VydC1tZXRob2QnLFxuXG4gIC8vIHVwZGF0ZS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gdXBkYXRlcy4gRGVmYXVsdDogdXBkYXRlLlxuICAndXBkYXRlTWV0aG9kOiB1cGRhdGUtbWV0aG9kJyxcblxuICAvLyBkZWxldGUtbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIGRlbGV0aW9ucy4gRGVmYXVsdDogZGVsZXRlLlxuICAnZGVsZXRlTWV0aG9kOiBkZWxldGUtbWV0aG9kJyxcblxuICAvLyBsYXlvdXQtZGlyZWN0aW9uIFtzdHJpbmddW2NvbHVtbnxyb3ddOiBEZWZhdWx0OiBjb2x1bW5cbiAgJ2xheW91dERpcmVjdGlvbjogbGF5b3V0LWRpcmVjdGlvbicsXG5cbiAgLy8gZnhMYXlvdXRBbGlnbiB2YWx1ZS4gRGVmYXVsdDogJ3N0YXJ0IHN0YXJ0J1xuICAnbGF5b3V0QWxpZ246IGxheW91dC1hbGlnbicsXG5cbiAgLy8gZWRpdGFibGUtZGV0YWlsIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogRGVmYXVsdDogdHJ1ZTtcbiAgJ2VkaXRhYmxlRGV0YWlsOiBlZGl0YWJsZS1kZXRhaWwnLFxuXG4gIC8vIGtleXMtc3FsLXR5cGVzIFtzdHJpbmddOiBlbnRpdHkga2V5cyB0eXBlcywgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdrZXlzU3FsVHlwZXM6IGtleXMtc3FsLXR5cGVzJyxcblxuICAvLyB1bmRvLWJ1dHRvbiBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluY2x1ZGUgdW5kbyBidXR0b24gaW4gZm9ybS10b29sYmFyLiBEZWZhdWx0OiB0cnVlO1xuICAndW5kb0J1dHRvbjogdW5kby1idXR0b24nLFxuXG4gIC8vIHNob3ctaGVhZGVyLW5hdmlnYXRpb24gW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBJbmNsdWRlIG5hdmlnYXRpb25zIGJ1dHRvbnMgaW4gZm9ybS10b29sYmFyLiBEZWZhdWx0OiBmYWxzZTtcbiAgJ3Nob3dIZWFkZXJOYXZpZ2F0aW9uOiBzaG93LWhlYWRlci1uYXZpZ2F0aW9uJyxcblxuICAvLyBhdHRyXG4gICdvYXR0cjphdHRyJyxcblxuICAnaW5jbHVkZUJyZWFkY3J1bWI6IGluY2x1ZGUtYnJlYWRjcnVtYicsXG5cbiAgJ2RldGVjdENoYW5nZXNPbkJsdXI6IGRldGVjdC1jaGFuZ2VzLW9uLWJsdXInLFxuXG4gICdjb25maXJtRXhpdDogY29uZmlybS1leGl0JyxcblxuICAvLyBpZ25vcmUtb24tZXhpdCBbc3RyaW5nXTogZmllbGRzIGF0dHIncyB0aGF0IHdpbGwgYmUgaWdub3JlZCB3aGVuIHRoZSBmb3JtIGlzIGNsb3NlZCwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdpZ25vcmVPbkV4aXQ6IGlnbm9yZS1vbi1leGl0JyxcblxuICAvLyBbZnVuY3Rpb25dOiBmdW5jdGlvbiB0byBleGVjdXRlIG9uIHF1ZXJ5IGVycm9yLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3F1ZXJ5RmFsbGJhY2tGdW5jdGlvbjogcXVlcnktZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICdpbnNlcnRGYWxsYmFja0Z1bmN0aW9uOiBpbnNlcnQtZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICd1cGRhdGVGYWxsYmFja0Z1bmN0aW9uOiB1cGRhdGUtZmFsbGJhY2stZnVuY3Rpb24nLFxuXG4gIC8vICdkZWxldGVGYWxsYmFja0Z1bmN0aW9uOiBkZWxldGUtZmFsbGJhY2stZnVuY3Rpb24nXG5cbiAgLy8gaWdub3JlLWRlZmF1bHQtbmF2aWdhdGlvbiBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IGlnbm9yZSBkZWZhdWx0IG5hdmlnYXRpb24gd2hlbiB1c2VyIGNsaWNrIHRoZSB0b29sYmFyIGJ1dHRvbnMuIERlZmF1bHQ6IG5vLlxuICAnaWdub3JlRGVmYXVsdE5hdmlnYXRpb246IGlnbm9yZS1kZWZhdWx0LW5hdmlnYXRpb24nLFxuXG4gICdtZXNzYWdlU2VydmljZVR5cGUgOiBtZXNzYWdlLXNlcnZpY2UtdHlwZScsXG4gIC8vc2V0LXZhbHVlLW9yZGVyOiBvcmRlciBvZiB0aGUgZmllbGQgYXR0cmlidXRlcyBieSB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQsIHNlcGFyYXRlZCBieSAnOyAnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NldFZhbHVlT3JkZXI6IHNldC12YWx1ZS1vcmRlcicsXG5cbiAgLy9mb3JtLWRhdGEtdmFsaWRhdGlvbjogRXhlY3V0ZXMgdGhlIGJlZm9yZS1zYXZlIHZhbGlkYXRpb24gY2FsbGJhY2sgZm9yIGluc2VydCBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAgJ2Zvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uOiBmb3JtLWRhdGEtdmFsaWRhdGlvbi1mdW5jdGlvbidcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNID0gW1xuICAnb25EYXRhTG9hZGVkJyxcbiAgJ2JlZm9yZUNsb3NlRGV0YWlsJyxcbiAgJ2JlZm9yZUdvRWRpdE1vZGUnLFxuICAnb25Gb3JtTW9kZUNoYW5nZScsXG4gICdvbkJlZm9yZUluc2VydCcsXG4gICdvbkJlZm9yZVVwZGF0ZScsXG4gICdvbkJlZm9yZURlbGV0ZScsXG4gICdvbkluc2VydCcsXG4gICdvblVwZGF0ZScsXG4gICdvbkRlbGV0ZScsXG4gICdiZWZvcmVJbnNlcnRNb2RlJyxcbiAgJ2JlZm9yZVVwZGF0ZU1vZGUnLFxuICAnYmVmb3JlSW5pdGlhbE1vZGUnLFxuICAnb25JbnNlcnRNb2RlJyxcbiAgJ29uVXBkYXRlTW9kZScsXG4gICdvbkluaXRpYWxNb2RlJyxcbiAgJ29uQ2FuY2VsJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1mb3JtJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBPRm9ybUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSB9LFxuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIE9Gb3JtTWVzc2FnZVNlcnZpY2VcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fRk9STSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fRk9STSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1mb3JtXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkNvbXBvbmVudERlYWN0aXZhdGUsIEFmdGVyVmlld0luaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OID0gJ2NvbHVtbic7XG4gIHB1YmxpYyBzdGF0aWMgZ3VhcmRDbGFzc05hbWUgPSAnQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCc7XG5cbiAgLyogaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIGhlYWRlck1vZGU6IHN0cmluZyA9ICdmbG9hdGluZyc7XG4gIGhlYWRlclBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nID0gJ3RvcCc7XG4gIGxhYmVsaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgbGFiZWxIZWFkZXJBbGlnbjogc3RyaW5nID0gJ2NlbnRlcic7XG4gIGhlYWRlcmFjdGlvbnM6IHN0cmluZyA9ICdhbGwnO1xuICBzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHN0cmluZyA9ICd5ZXMnO1xuICBlbnRpdHk6IHN0cmluZztcbiAga2V5czogc3RyaW5nID0gJyc7XG4gIGNvbHVtbnM6IHN0cmluZyA9ICcnO1xuICBzZXRWYWx1ZU9yZGVyOiBzdHJpbmcgPSAnJztcbiAgc2VydmljZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc3RheUluUmVjb3JkQWZ0ZXJFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIGFmdGVySW5zZXJ0TW9kZTogJ25ldycgfCAnZGV0YWlsJyB8ICdjbG9zZScgPSAnY2xvc2UnO1xuICBzZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHF1ZXJ5T25Jbml0OiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHBhcmVudEtleXM6IHN0cmluZztcbiAgcHJvdGVjdGVkIHF1ZXJ5TWV0aG9kOiBzdHJpbmcgPSBDb2Rlcy5RVUVSWV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBpbnNlcnRNZXRob2Q6IHN0cmluZyA9IENvZGVzLklOU0VSVF9NRVRIT0Q7XG4gIHByb3RlY3RlZCB1cGRhdGVNZXRob2Q6IHN0cmluZyA9IENvZGVzLlVQREFURV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBkZWxldGVNZXRob2Q6IHN0cmluZyA9IENvZGVzLkRFTEVURV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBfbGF5b3V0RGlyZWN0aW9uOiBzdHJpbmcgPSBPRm9ybUNvbXBvbmVudC5ERUZBVUxUX0xBWU9VVF9ESVJFQ1RJT047XG4gIHByb3RlY3RlZCBfbGF5b3V0QWxpZ246IHN0cmluZyA9ICdzdGFydCBzdHJldGNoJztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCBlZGl0YWJsZURldGFpbDogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCBrZXlzU3FsVHlwZXM6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHVuZG9CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlck5hdmlnYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG9hdHRyOiBzdHJpbmcgPSAnJztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGluY2x1ZGVCcmVhZGNydW1iOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkZXRlY3RDaGFuZ2VzT25CbHVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbmZpcm1FeGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgc2V0VmFsdWVPcmRlckFycmF5OiBzdHJpbmdbXTtcblxuICBzZXQgaWdub3JlT25FeGl0KHZhbDogc3RyaW5nW10pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbCA9IFV0aWwucGFyc2VBcnJheSh2YWwsIHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9pZ25vcmVPbkV4aXQgPSB2YWw7XG4gIH1cbiAgZ2V0IGlnbm9yZU9uRXhpdCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZU9uRXhpdDtcbiAgfVxuICBwcm90ZWN0ZWQgX2lnbm9yZU9uRXhpdDogc3RyaW5nW107XG4gIHB1YmxpYyBxdWVyeUZhbGxiYWNrRnVuY3Rpb246IChlcnJvcjogYW55KSA9PiB2b2lkO1xuXG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBwdWJsaWMgaWdub3JlRGVmYXVsdE5hdmlnYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgbWVzc2FnZVNlcnZpY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtRGF0YVZhbGlkYXRpb25GdW5jdGlvbjogKGRhdGE6IGFueSkgPT4gT0Zvcm1WYWxpZGF0aW9uO1xuXG4gIC8qIGVuZCBvZiBpbnB1dHMgdmFyaWFibGVzICovXG5cbiAgLypwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBpc0RldGFpbEZvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAga2V5c0FycmF5OiBzdHJpbmdbXSA9IFtdO1xuICBjb2xzQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIGRhdGFTZXJ2aWNlOiBhbnk7XG4gIF9wS2V5c0VxdWl2ID0ge307XG4gIGtleXNTcWxUeXBlc0FycmF5OiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHByb3RlY3RlZCBfbWVzc2FnZVNlcnZpY2U6IE9Gb3JtTWVzc2FnZVNlcnZpY2U7XG4gIC8qIGVuZCBvZiBwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cDtcbiAgb25EYXRhTG9hZGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICBiZWZvcmVDbG9zZURldGFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYmVmb3JlVXBkYXRlTW9kZWAgaW5zdGVhZFxuICAgKi9cbiAgYmVmb3JlR29FZGl0TW9kZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgYmVmb3JlSW5zZXJ0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgYmVmb3JlVXBkYXRlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgYmVmb3JlSW5pdGlhbE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIG9uSW5zZXJ0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25VcGRhdGVNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkluaXRpYWxNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkZvcm1Nb2RlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBwdWJsaWMgb25CZWZvcmVJbnNlcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25CZWZvcmVVcGRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25CZWZvcmVEZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25JbnNlcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25VcGRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25EZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwdWJsaWMgZm9ybURhdGE6IG9iamVjdCA9IHt9O1xuICBwdWJsaWMgbmF2aWdhdGlvbkRhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIGN1cnJlbnRJbmRleCA9IDA7XG4gIHB1YmxpYyBtb2RlOiBudW1iZXIgPSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDtcblxuICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZTtcbiAgcHJvdGVjdGVkIHNuYWNrQmFyU2VydmljZTogU25hY2tCYXJTZXJ2aWNlO1xuXG4gIHByb3RlY3RlZCBfZm9ybVRvb2xiYXI6IE9Gb3JtVG9vbGJhckJhc2U7XG5cbiAgcHJvdGVjdGVkIF9jb21wb25lbnRzOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0ge307XG4gIHByb3RlY3RlZCBfY29tcFNRTFR5cGVzOiBvYmplY3QgPSB7fTtcblxuICBmb3JtUGFyZW50S2V5c1ZhbHVlczogb2JqZWN0O1xuXG4gIHB1YmxpYyBvbkZvcm1Jbml0U3RyZWFtOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHByb3RlY3RlZCByZWxvYWRTdHJlYW06IE9ic2VydmFibGU8YW55PjtcbiAgcHJvdGVjdGVkIHJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBxdWVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgbG9hZGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBkeW5hbWljRm9ybVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBkZWFjdGl2YXRlR3VhcmQ6IENhbkRlYWN0aXZhdGVGb3JtR3VhcmQ7XG4gIHB1YmxpYyBkZWFjdGl2YXRlR3VhcmRJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZm9ybUNhY2hlOiBPRm9ybUNhY2hlQ2xhc3M7XG4gIHByb3RlY3RlZCBmb3JtTmF2aWdhdGlvbjogT0Zvcm1OYXZpZ2F0aW9uQ2xhc3M7XG5cbiAgcHVibGljIGZvcm1Db250YWluZXI6IE9Gb3JtQ29udGFpbmVyQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCBwZXJtaXNzaW9uc1NlcnZpY2U6IFBlcm1pc3Npb25zU2VydmljZTtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPRm9ybVBlcm1pc3Npb25zO1xuXG4gIEBWaWV3Q2hpbGQoJ2lubmVyRm9ybScpIGlubmVyRm9ybUVsOiBFbGVtZW50UmVmO1xuXG4gIGlnbm9yZUZvcm1DYWNoZUtleXM6IEFycmF5PGFueT4gPSBbXTtcbiAgY2FuRGlzY2FyZENoYW5nZXM6IGJvb2xlYW47XG5cbiAgcHVibGljIHN0YXRpYyBNb2RlKCk6IGFueSB7XG4gICAgZW51bSBtIHtcbiAgICAgIFFVRVJZLFxuICAgICAgSU5TRVJULFxuICAgICAgVVBEQVRFLFxuICAgICAgSU5JVElBTFxuICAgIH1cbiAgICByZXR1cm4gbTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgYWN0Um91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCBlbFJlZjogRWxlbWVudFJlZlxuICApIHtcblxuICAgIHRoaXMuZm9ybUNhY2hlID0gbmV3IE9Gb3JtQ2FjaGVDbGFzcyh0aGlzKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uID0gbmV3IE9Gb3JtTmF2aWdhdGlvbkNsYXNzKHRoaXMuaW5qZWN0b3IsIHRoaXMsIHRoaXMucm91dGVyLCB0aGlzLmFjdFJvdXRlKTtcblxuICAgIHRoaXMuZGlhbG9nU2VydmljZSA9IGluamVjdG9yLmdldDxEaWFsb2dTZXJ2aWNlPihEaWFsb2dTZXJ2aWNlIGFzIFR5cGU8RGlhbG9nU2VydmljZT4pO1xuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UgPSBpbmplY3Rvci5nZXQ8TmF2aWdhdGlvblNlcnZpY2U+KE5hdmlnYXRpb25TZXJ2aWNlIGFzIFR5cGU8TmF2aWdhdGlvblNlcnZpY2U+KTtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZSA9IGluamVjdG9yLmdldDxTbmFja0JhclNlcnZpY2U+KFNuYWNrQmFyU2VydmljZSBhcyBUeXBlPFNuYWNrQmFyU2VydmljZT4pO1xuICAgIHRoaXMucGVybWlzc2lvbnNTZXJ2aWNlID0gdGhpcy5pbmplY3Rvci5nZXQ8UGVybWlzc2lvbnNTZXJ2aWNlPihQZXJtaXNzaW9uc1NlcnZpY2UgYXMgVHlwZTxQZXJtaXNzaW9uc1NlcnZpY2U+KTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMucmVsb2FkU3RyZWFtID0gY29tYmluZUxhdGVzdChbXG4gICAgICBzZWxmLm9uRm9ybUluaXRTdHJlYW0uYXNPYnNlcnZhYmxlKCksXG4gICAgICBzZWxmLmZvcm1OYXZpZ2F0aW9uLm5hdmlnYXRpb25TdHJlYW0uYXNPYnNlcnZhYmxlKClcbiAgICBdKTtcblxuICAgIHRoaXMucmVsb2FkU3RyZWFtU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWRTdHJlYW0uc3Vic2NyaWJlKHZhbEFyciA9PiB7XG4gICAgICBpZiAoVXRpbC5pc0FycmF5KHZhbEFycikgJiYgdmFsQXJyLmxlbmd0aCA9PT0gMiAmJiAhc2VsZi5pc0luSW5zZXJ0TW9kZSgpKSB7XG4gICAgICAgIGNvbnN0IHZhbEFyclZhbHVlcyA9IHZhbEFyclswXSA9PT0gdHJ1ZSAmJiB2YWxBcnJbMV0gPT09IHRydWU7XG4gICAgICAgIGlmIChzZWxmLnF1ZXJ5T25Jbml0ICYmIHZhbEFyclZhbHVlcykge1xuICAgICAgICAgIHNlbGYucmVsb2FkKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZUZpZWxkcygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5mb3JtQ29udGFpbmVyID0gaW5qZWN0b3IuZ2V0KE9Gb3JtQ29udGFpbmVyQ29tcG9uZW50KTtcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lci5zZXRGb3JtKHRoaXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vXG4gICAgfVxuICAgIHRoaXMuZ2V0R2xvYmFsQ29uZmlnKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEdsb2JhbENvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb0Zvcm1HbG9iYWxDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChPX0ZPUk1fR0xPQkFMX0NPTkZJRyk7XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQob0Zvcm1HbG9iYWxDb25maWcuaGVhZGVyQWN0aW9ucykpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJhY3Rpb25zID0gb0Zvcm1HbG9iYWxDb25maWcuaGVhZGVyQWN0aW9ucztcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRG8gbm90aGluZyBiZWNhdXNlIGlzIG9wdGlvbmFsXG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJGb3JtQ29tcG9uZW50KGNvbXA6IGFueSkge1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgIGlmIChhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuXG4gICAgICAgIGlmICghY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIGNvbXAucmVwZWF0ZWRBdHRyID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGVyZSBpcyBhbHJlYWR5IGEgY29tcG9uZW50IHJlZ2lzdGVyZWQgaW4gdGhlIGZvcm0gd2l0aCB0aGUgYXR0cjogJyArIGF0dHIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0gPSBjb21wO1xuICAgICAgICAvLyBTZXR0aW5nIHBhcmVudCBrZXkgdmFsdWVzLi4uXG4gICAgICAgIGlmICh0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzICYmIHRoaXMuZm9ybVBhcmVudEtleXNWYWx1ZXNbYXR0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybVBhcmVudEtleXNWYWx1ZXNbYXR0cl07XG4gICAgICAgICAgdGhpcy5fY29tcG9uZW50c1thdHRyXS5zZXRWYWx1ZSh2YWwsIHtcbiAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLypcbiAgICAgICAgKiBUT0RPLiBDaGVjayBpdCEhIVxuICAgICAgICAqIEVuIHVuIGZvcm11bGFyaW8gY29uIHRhYnMsIGN1YW5kbyBzZSBjYW1iaWEgZGUgdW5vIGEgb3Rybywgc2UgZGVzdHJ1eWVuIGxhcyB2aXN0YXNcbiAgICAgICAgKiBkZSBsb3MgY29tcG9uZW50ZXMgaGlqbyBkZWwgZm9ybXVsYXJpby5cbiAgICAgICAgKiBmb3JtRGF0YUNhY2hlIGNvbnRpZW5lIGxvcyB2YWxvcmVzIChvcmlnaW5hbGVzIMOzIGVkaXRhZG9zKSBkZSBsb3MgY2FtcG9zIGRlbCBmb3JtdWxhcmlvLlxuICAgICAgICAqIExhIGlkZWEgZXMgYXNpZ25hciBlc2UgdmFsb3IgYWwgY2FtcG8gY3VhbmRvIHNlIHJlZ2lzdHJlIGRlIG51ZXZvIChIYXkgcXVlIGFzZWd1cmFyIGVsIHByb2Nlc29cbiAgICAgICAgKiBwYXJhIHF1ZSBzw7NsbyBzZWEgY3VhbmRvIHNlIHJlZ2lzdHJhIGRlIG51ZXZvIDspIClcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWUgPSB0aGlzLmZvcm1DYWNoZS5nZXRDYWNoZWRWYWx1ZShhdHRyKTtcbiAgICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKGNhY2hlZFZhbHVlKSAmJiB0aGlzLmdldERhdGFWYWx1ZXMoKSAmJiB0aGlzLl9jb21wb25lbnRzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgdGhpcy5fY29tcG9uZW50c1thdHRyXS5zZXRWYWx1ZShjYWNoZWRWYWx1ZSwge1xuICAgICAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyU1FMVHlwZUZvcm1Db21wb25lbnQoY29tcDogSUZvcm1EYXRhVHlwZUNvbXBvbmVudCkge1xuICAgIGlmICgoY29tcCBhcyBhbnkpLnJlcGVhdGVkQXR0cikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgdHlwZSA9IGNvbXAuZ2V0U1FMVHlwZSgpO1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAodHlwZSAhPT0gU1FMVHlwZXMuT1RIRVIgJiYgYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDAgJiYgdGhpcy5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2YoYXR0cikgPT09IC0xKSB7XG4gICAgICAgIC8vIFJpZ2h0IG5vdyBqdXN0IHN0b3JlIHZhbHVlcyBkaWZmZXJlbnQgb2YgJ09USEVSJ1xuICAgICAgICB0aGlzLl9jb21wU1FMVHlwZXNbYXR0cl0gPSB0eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRm9ybUNvbnRyb2xDb21wb25lbnQoY29tcDogSUZvcm1EYXRhQ29tcG9uZW50KSB7XG4gICAgaWYgKChjb21wIGFzIGFueSkucmVwZWF0ZWRBdHRyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjb21wKSB7XG4gICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgIGlmIChhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBjb21wLmdldENvbnRyb2woKTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5yZWdpc3RlckNvbnRyb2woYXR0ciwgY29udHJvbCk7XG4gICAgICAgICAgaWYgKCFjb21wLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5pZ25vcmVGb3JtQ2FjaGVLZXlzLnB1c2goY29tcC5nZXRBdHRyaWJ1dGUoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlckZvcm1Db21wb25lbnQoY29tcDogSUNvbXBvbmVudCkge1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgIGlmIChhdHRyICYmIGF0dHIubGVuZ3RoID4gMCAmJiB0aGlzLl9jb21wb25lbnRzLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jb21wb25lbnRzW2F0dHJdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm9hdHRyKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYXR0cjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVucmVnaXN0ZXJGb3JtQ29udHJvbENvbXBvbmVudChjb21wOiBJRm9ybURhdGFDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCAmJiBjb21wLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSkge1xuICAgICAgY29uc3QgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gY29tcC5nZXRDb250cm9sKCk7XG4gICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgIGlmIChjb250cm9sICYmIGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woYXR0cik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlclNRTFR5cGVGb3JtQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YVR5cGVDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2NvbXBTUUxUeXBlc1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRvb2xiYXIoZlRvb2xiYXI6IE9Gb3JtVG9vbGJhckNvbXBvbmVudCkge1xuICAgIGlmIChmVG9vbGJhcikge1xuICAgICAgdGhpcy5fZm9ybVRvb2xiYXIgPSBmVG9vbGJhcjtcbiAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLmlzRGV0YWlsID0gdGhpcy5pc0RldGFpbEZvcm07XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50cygpOiBJRm9ybURhdGFDb21wb25lbnRIYXNoIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cztcbiAgfVxuXG4gIHB1YmxpYyBsb2FkKCk6IGFueSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgem9uZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgY29uc3QgbG9hZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBjb25zdCB0aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh0cnVlKTtcbiAgICAgIH0sIDI1MCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgc2VsZi5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgfSk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbG9hZE9ic2VydmFibGUuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHNlbGYubG9hZGluZ1N1YmplY3QubmV4dCh2YWwgYXMgYm9vbGVhbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0RGF0YVZhbHVlKGF0dHI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmlzSW5JbnNlcnRNb2RlKCkpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0RmlsdGVyRnJvbVVybFBhcmFtcygpO1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5mb3JtR3JvdXAudmFsdWVbYXR0cl0gfHwgdXJsUGFyYW1zW2F0dHJdO1xuICAgICAgcmV0dXJuIG5ldyBPRm9ybVZhbHVlKHZhbCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW5Jbml0aWFsTW9kZSgpICYmICF0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSkge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIHJldHVybiBkYXRhW2F0dHJdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0luVXBkYXRlTW9kZSgpIHx8IHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKSB7XG4gICAgICBpZiAodGhpcy5mb3JtRGF0YSAmJiBPYmplY3Qua2V5cyh0aGlzLmZvcm1EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybUNhY2hlLmdldENhY2hlZFZhbHVlKGF0dHIpO1xuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXAuZGlydHkgJiYgdmFsKSB7XG4gICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE9Gb3JtVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSh2YWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJldHVybiBvcmlnaW5hbCB2YWx1ZSBzdG9yZWQgaW50byBmb3JtIGRhdGEuLi5cbiAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtRGF0YTtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YVthdHRyXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBPRm9ybVZhbHVlKCk7XG4gIH1cblxuICBnZXREYXRhVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1EYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgZm9ybSBkYXRhLiBUaGUgZGF0YSByZWxhdGVkIHRvIHVybCBwYXJhbXMgYW5kIHBhcmVudCBrZXlzIHJlbWFpbiB1bmNoYW5nZWQuXG4gICAqL1xuICBjbGVhckRhdGEoKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5mb3JtTmF2aWdhdGlvbi5nZXRGaWx0ZXJGcm9tVXJsUGFyYW1zKCk7XG4gICAgdGhpcy5mb3JtR3JvdXAucmVzZXQoe30sIHtcbiAgICAgIGVtaXRFdmVudDogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLnNldERhdGEoZmlsdGVyKTtcbiAgfVxuXG4gIGNhbkRlYWN0aXZhdGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIHtcbiAgICBjb25zdCByZWFkT25seSA9IHRoaXMuaXNJbkluaXRpYWxNb2RlKCkgJiYgIXRoaXMuaXNFZGl0YWJsZURldGFpbCgpO1xuICAgIGNvbnN0IGNhbmNlbGxlZEVkaXRpb24gPSB0aGlzLmlzSW5VcGRhdGVNb2RlKCkgJiYgdGhpcy5fZm9ybVRvb2xiYXIgJiYgIXRoaXMuX2Zvcm1Ub29sYmFyLmVkaXRNb2RlO1xuICAgIGlmIChyZWFkT25seSB8fCBjYW5jZWxsZWRFZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY29uZmlybUV4aXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjYW5EaXNjYXJkQ2hhbmdlcyA9ICEhdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcztcbiAgICB0aGlzLmNhbkRpc2NhcmRDaGFuZ2VzID0gZmFsc2U7XG4gICAgcmV0dXJuIGNhbkRpc2NhcmRDaGFuZ2VzIHx8IHRoaXMuc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcygpO1xuICB9XG5cbiAgc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5zaG93Q29uZmlybURpc2NhcmRDaGFuZ2VzKHRoaXMuaWdub3JlT25FeGl0KTtcbiAgfVxuXG4gIGV4ZWN1dGVUb29sYmFyQWN0aW9uKGFjdGlvbjogc3RyaW5nLCBvcHRpb25zPzogYW55KSB7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgQ29kZXMuQkFDS19BQ1RJT046IHRoaXMuYmFjayhvcHRpb25zKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkNMT1NFX0RFVEFJTF9BQ1RJT046IHRoaXMuY2xvc2VEZXRhaWwob3B0aW9ucyk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5SRUxPQURfQUNUSU9OOiB0aGlzLnJlbG9hZCh0cnVlKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkdPX0lOU0VSVF9BQ1RJT046IHRoaXMuZ29JbnNlcnRNb2RlKG9wdGlvbnMpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuSU5TRVJUX0FDVElPTjogdGhpcy5pbnNlcnQoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkdPX0VESVRfQUNUSU9OOiB0aGlzLmdvRWRpdE1vZGUoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkVESVRfQUNUSU9OOiB0aGlzLnVwZGF0ZSgpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuVU5ET19MQVNUX0NIQU5HRV9BQ1RJT046IHRoaXMudW5kbygpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuREVMRVRFX0FDVElPTjogcmV0dXJuIHRoaXMuZGVsZXRlKCk7XG4gICAgICBkZWZhdWx0OiBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWRkRGVhY3RpdmF0ZUd1YXJkKCk7XG5cbiAgICB0aGlzLmZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcblxuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICBhZGREZWFjdGl2YXRlR3VhcmQoKSB7XG4gICAgaWYgKCF0aGlzLmFjdFJvdXRlIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkID0gdGhpcy5pbmplY3Rvci5nZXQoQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCk7XG4gICAgdGhpcy5kZWFjdGl2YXRlR3VhcmQuYWRkRm9ybSh0aGlzKTtcbiAgICBjb25zdCBjYW5EZWFjdGl2YXRlQXJyYXkgPSAodGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlIHx8IFtdKTtcbiAgICBsZXQgcHJldmlvdXNseUFkZGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbkRlYWN0aXZhdGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgcHJldmlvdXNseUFkZGVkID0gKChjYW5EZWFjdGl2YXRlQXJyYXlbaV0uaGFzT3duUHJvcGVydHkoJ0NMQVNTTkFNRScpICYmIGNhbkRlYWN0aXZhdGVBcnJheVtpXS5DTEFTU05BTUUpID09PSBPRm9ybUNvbXBvbmVudC5ndWFyZENsYXNzTmFtZSk7XG4gICAgICBpZiAocHJldmlvdXNseUFkZGVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXByZXZpb3VzbHlBZGRlZCkge1xuICAgICAgY2FuRGVhY3RpdmF0ZUFycmF5LnB1c2godGhpcy5kZWFjdGl2YXRlR3VhcmQuY29uc3RydWN0b3IpO1xuICAgICAgdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gY2FuRGVhY3RpdmF0ZUFycmF5O1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lEZWFjdGl2YXRlR3VhcmQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmhhc0RlYWN0aXZhdGVHdWFyZCgpKSB7XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkLnJlbW92ZUZvcm0odGhpcyk7XG4gICAgICAgIGlmICghdGhpcy5kZWFjdGl2YXRlR3VhcmQuaXNGb3Jtc0NhY2hlRW1wdHkoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmFjdFJvdXRlIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnIHx8ICF0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZ3VhcmRJbmRleCA9IHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5maW5kSW5kZXgoKGNhbkRlYWN0aXZhdGUpID0+IGNhbkRlYWN0aXZhdGUubmFtZSA9PT0gT0Zvcm1Db21wb25lbnQuZ3VhcmRDbGFzc05hbWUpXG4gICAgICBpZiAoZ3VhcmRJbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5zcGxpY2UoZ3VhcmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vXG4gICAgfVxuICB9XG5cbiAgaGFzRGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZCh0aGlzLmRlYWN0aXZhdGVHdWFyZCk7XG4gIH1cblxuICAvKipcbiAgICogQW5ndWxhciBtZXRob2RzXG4gICAqL1xuXG4gIGluaXRpYWxpemUoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWYgKHRoaXMuaGVhZGVyYWN0aW9ucyA9PT0gJ2FsbCcpIHtcbiAgICAgIHRoaXMuaGVhZGVyYWN0aW9ucyA9ICdSO0k7VTtEJztcbiAgICB9XG4gICAgdGhpcy5rZXlzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5rZXlzLCB0cnVlKTtcbiAgICB0aGlzLmNvbHNBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmNvbHVtbnMsIHRydWUpO1xuICAgIGNvbnN0IHBrQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5wYXJlbnRLZXlzKTtcbiAgICB0aGlzLl9wS2V5c0VxdWl2ID0gVXRpbC5wYXJzZVBhcmVudEtleXNFcXVpdmFsZW5jZXMocGtBcnJheSk7XG4gICAgdGhpcy5rZXlzU3FsVHlwZXNBcnJheSA9IFV0aWwucGFyc2VBcnJheSh0aGlzLmtleXNTcWxUeXBlcyk7XG4gICAgdGhpcy5zZXRWYWx1ZU9yZGVyQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5zZXRWYWx1ZU9yZGVyKTtcblxuICAgIHRoaXMuY29uZmlndXJlU2VydmljZSgpO1xuXG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdWJzY3JpYmVUb1F1ZXJ5UGFyYW1zKCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdWJzY3JpYmVUb1VybFBhcmFtcygpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9VcmwoKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN1YnNjcmliZVRvQ2FjaGVDaGFuZ2VzKCk7XG5cbiAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU2VydmljZSkge1xuICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vblZpc2libGVDaGFuZ2UodmlzaWJsZSA9PiB7XG4gICAgICAgIHNlbGYuc2hvd0hlYWRlciA9IHZpc2libGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm1vZGUgPSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDtcblxuICAgIHRoaXMucGVybWlzc2lvbnMgPSB0aGlzLnBlcm1pc3Npb25zU2VydmljZS5nZXRGb3JtUGVybWlzc2lvbnModGhpcy5vYXR0ciwgdGhpcy5hY3RSb3V0ZSk7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMucXVlcnlGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gaWYgKHR5cGVvZiB0aGlzLmluc2VydEZhbGxiYWNrRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAgIHRoaXMuaW5zZXJ0RmFsbGJhY2tGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyB9XG4gICAgLy8gaWYgKHR5cGVvZiB0aGlzLnVwZGF0ZUZhbGxiYWNrRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAgIHRoaXMudXBkYXRlRmFsbGJhY2tGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyB9XG4gICAgLy8gaWYgKHR5cGVvZiB0aGlzLmRlbGV0ZUZhbGxiYWNrRnVuY3Rpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyAgIHRoaXMuZGVsZXRlRmFsbGJhY2tGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZWluaXRpYWxpemUgZm9ybSBhZGRpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgcmVpbml0aWFsaXplKG9wdGlvbnM6IE9Gb3JtSW5pdGlhbGl6YXRpb25PcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucykubGVuZ3RoKSB7XG4gICAgICBjb25zdCBjbG9uZWRPcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBmb3IgKGNvbnN0IHByb3AgaW4gY2xvbmVkT3B0cykge1xuICAgICAgICBpZiAoY2xvbmVkT3B0cy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgICAgIHRoaXNbcHJvcF0gPSBjbG9uZWRPcHRzW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpZ3VyZVNlcnZpY2UoKSB7XG4gICAgY29uc3QgbXNnQ29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVNZXNzYWdlU2VydmljZUFyZ3MgPSB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yLCBiYXNlU2VydmljZTogT0Zvcm1NZXNzYWdlU2VydmljZSwgc2VydmljZVR5cGU6IHRoaXMubWVzc2FnZVNlcnZpY2VUeXBlIH1cbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZSA9IFV0aWwuY29uZmlndXJlTWVzc2FnZVNlcnZpY2UobXNnQ29uZmlndXJlU2VydmljZUFyZ3MpO1xuXG4gICAgY29uc3QgY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncyA9IHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsIGJhc2VTZXJ2aWNlOiBPbnRpbWl6ZVNlcnZpY2UsIGVudGl0eTogdGhpcy5lbnRpdHksIHNlcnZpY2U6IHRoaXMuc2VydmljZSwgc2VydmljZVR5cGU6IHRoaXMuc2VydmljZVR5cGUgfVxuICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBVdGlsLmNvbmZpZ3VyZVNlcnZpY2UoY29uZmlndXJlU2VydmljZUFyZ3MpO1xuICB9XG5cbiAgZ2V0IG1lc3NhZ2VTZXJ2aWNlKCk6IE9Gb3JtTWVzc2FnZVNlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU2VydmljZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yZWxvYWRTdHJlYW1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVsb2FkU3RyZWFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtQ2FjaGUuZGVzdHJveSgpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uZGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveURlYWN0aXZhdGVHdWFyZCgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5kZXRlcm1pbmF0ZUZvcm1Nb2RlKCk7XG4gICAgICB0aGlzLm9uRm9ybUluaXRTdHJlYW0uZW1pdCh0cnVlKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qXG4gICAqIElubmVyIG1ldGhvZHNcbiAgICovXG5cbiAgX3NldENvbXBvbmVudHNFZGl0YWJsZShzdGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IGFueSA9IHRoaXMuZ2V0Q29tcG9uZW50cygpO1xuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goY29tcEtleSA9PiB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBLZXldO1xuICAgICAgY29tcG9uZW50LmlzUmVhZE9ubHkgPSAhc3RhdGU7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBmb3JtIG9wZXJhdGlvbiBtb2RlLlxuICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSB0byBiZSBlc3RhYmxpc2hlZFxuICAgKi9cbiAgc2V0Rm9ybU1vZGUobW9kZTogbnVtYmVyKSB7XG4gICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMOlxuICAgICAgICB0aGlzLmJlZm9yZUluaXRpYWxNb2RlLmVtaXQoKTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1Ub29sYmFyKSB7XG4gICAgICAgICAgdGhpcy5fZm9ybVRvb2xiYXIuc2V0SW5pdGlhbE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodGhpcy5pc0VkaXRhYmxlRGV0YWlsKCkpO1xuICAgICAgICB0aGlzLm9uRm9ybU1vZGVDaGFuZ2UuZW1pdCh0aGlzLm1vZGUpO1xuICAgICAgICB0aGlzLm9uSW5pdGlhbE1vZGUuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOU0VSVDpcbiAgICAgICAgdGhpcy5iZWZvcmVJbnNlcnRNb2RlLmVtaXQoKTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1Ub29sYmFyKSB7XG4gICAgICAgICAgdGhpcy5fZm9ybVRvb2xiYXIuc2V0SW5zZXJ0TW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xlYXJEYXRhKCk7XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0cnVlKTtcbiAgICAgICAgdGhpcy5vbkZvcm1Nb2RlQ2hhbmdlLmVtaXQodGhpcy5tb2RlKTtcbiAgICAgICAgdGhpcy5vbkluc2VydE1vZGUuZW1pdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURTpcbiAgICAgICAgdGhpcy5iZWZvcmVVcGRhdGVNb2RlLmVtaXQoKTtcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm1Ub29sYmFyKSB7XG4gICAgICAgICAgdGhpcy5fZm9ybVRvb2xiYXIuc2V0RWRpdE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodHJ1ZSk7XG4gICAgICAgIHRoaXMub25Gb3JtTW9kZUNoYW5nZS5lbWl0KHRoaXMubW9kZSk7XG4gICAgICAgIHRoaXMub25VcGRhdGVNb2RlLmVtaXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5RVUVSWTpcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9ybSBRVUVSWSBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNldHMgbmV3IGRhdGEgZm9yIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBzZXREYXRhKGRhdGEpOiB2b2lkIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09Gb3JtQ29tcG9uZW50XSBGb3JtIGRhdGEgaGFzIG1vcmUgdGhhbiBhIHNpbmdsZSByZWNvcmQuIFN0b3JpbmcgZW1wdHkgZGF0YScpO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudERhdGEgPSBkYXRhLmxlbmd0aCA9PT0gMSA/IGRhdGFbMF0gOiB7fTtcbiAgICAgIHRoaXMuX3VwZGF0ZUZvcm1EYXRhKHRoaXMudG9Gb3JtVmFsdWVEYXRhKGN1cnJlbnREYXRhKSk7XG4gICAgICB0aGlzLl9lbWl0RGF0YShjdXJyZW50RGF0YSk7XG4gICAgfSBlbHNlIGlmIChVdGlsLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh0aGlzLnRvRm9ybVZhbHVlRGF0YShkYXRhKSk7XG4gICAgICB0aGlzLl9lbWl0RGF0YShkYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdGb3JtIGhhcyByZWNlaXZlZCBub3Qgc3VwcG9ydGVkIHNlcnZpY2UgZGF0YS4gU3VwcG9ydGVkIGRhdGEgYXJlIEFycmF5IG9yIE9iamVjdCcpO1xuICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHNldERhdGEoZGF0YSlgIGluc3RlYWRcbiAgICovXG4gIF9zZXREYXRhKGRhdGEpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX3NldERhdGFgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYHNldERhdGFgIGluc3RlYWQnKTtcbiAgICB0aGlzLnNldERhdGEoZGF0YSk7XG4gIH1cblxuICBfZW1pdERhdGEoZGF0YSkge1xuICAgIHRoaXMub25EYXRhTG9hZGVkLmVtaXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBiYWNrKClgIGluc3RlYWRcbiAgICovXG4gIF9iYWNrQWN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fYmFja0FjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgYmFja2AgaW5zdGVhZCcpO1xuICAgIHRoaXMuYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIGJhY2tcbiAgICovXG4gIGJhY2sob3B0aW9ucz86IGFueSkge1xuICAgIGNvbnN0IGFsbE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKG9wdGlvbnMgfHwge30sIHsgaWdub3JlTmF2aWdhdGlvbjogdGhpcy5pZ25vcmVEZWZhdWx0TmF2aWdhdGlvbiB9KTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLm5hdmlnYXRlQmFjayhhbGxPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGNsb3NlRGV0YWlsKG9wdGlvbnM/OiBhbnkpYCBpbnN0ZWFkXG4gICAqL1xuICBfY2xvc2VEZXRhaWxBY3Rpb24ob3B0aW9ucz86IGFueSkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5fY2xvc2VEZXRhaWxBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGNsb3NlRGV0YWlsYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5jbG9zZURldGFpbChvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSBjdXJyZW50IGRldGFpbCBmb3JtXG4gICAqL1xuICBjbG9zZURldGFpbChvcHRpb25zPzogYW55KSB7XG4gICAgb3B0aW9ucyA9IFV0aWwuaXNEZWZpbmVkKG9wdGlvbnMpID8gb3B0aW9ucyA6IHt9O1xuICAgIG9wdGlvbnMuaWdub3JlTmF2aWdhdGlvbiA9IHRoaXMuaWdub3JlRGVmYXVsdE5hdmlnYXRpb247XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5jbG9zZURldGFpbEFjdGlvbihvcHRpb25zKTtcbiAgfVxuXG4gIF9zdGF5SW5SZWNvcmRBZnRlckluc2VydChpbnNlcnRlZEtleXM6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3RheUluUmVjb3JkQWZ0ZXJJbnNlcnQoaW5zZXJ0ZWRLZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHJlbG9hZCh1c2VGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSlgIGluc3RlYWRcbiAgICovXG4gIF9yZWxvYWRBY3Rpb24odXNlRmlsdGVyOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX3JlbG9hZEFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgcmVsb2FkYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5yZWxvYWQodXNlRmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhlIGZvcm0gZGF0YVxuICAgKi9cbiAgcmVsb2FkKHVzZUZpbHRlcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgbGV0IGZpbHRlciA9IHt9O1xuICAgIGlmICh1c2VGaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IHRoaXMuZ2V0Q3VycmVudEtleXNWYWx1ZXMoKTtcbiAgICB9XG4gICAgdGhpcy5xdWVyeURhdGEoZmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2luc2VydCcgbW9kZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGdvSW5zZXJ0TW9kZShvcHRpb25zPzogYW55KWAgaW5zdGVhZFxuICAgKi9cbiAgX2dvSW5zZXJ0TW9kZShvcHRpb25zPzogYW55KSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9nb0luc2VydE1vZGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGdvSW5zZXJ0TW9kZWAgaW5zdGVhZCcpO1xuICAgIHRoaXMuZ29JbnNlcnRNb2RlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byAnaW5zZXJ0JyBtb2RlXG4gICAqL1xuICBnb0luc2VydE1vZGUob3B0aW9ucz86IGFueSkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uZ29JbnNlcnRNb2RlKG9wdGlvbnMpO1xuICB9XG5cbiAgX2NsZWFyRm9ybUFmdGVySW5zZXJ0KCkge1xuICAgIHRoaXMuY2xlYXJEYXRhKCk7XG4gICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICB9XG5cbiAgX2NsZWFyQW5kQ2xvc2VGb3JtQWZ0ZXJJbnNlcnQoKSB7XG4gICAgY29uc3QgY2xvc2VPcHRzOiBGb3JtTGF5b3V0Q2xvc2VEZXRhaWxPcHRpb25zID0geyBleGl0V2l0aG91dENvbmZpcm1hdGlvbjogdHJ1ZSB9O1xuICAgIHRoaXMuY2xvc2VEZXRhaWwoY2xvc2VPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBpbnNlcnQgYWN0aW9uLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGluc2VydCgpYCBpbnN0ZWFkXG4gICAqL1xuICBfaW5zZXJ0QWN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5faW5zZXJ0QWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBpbnNlcnRgIGluc3RlYWQnKTtcbiAgICB0aGlzLmluc2VydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGluc2VydCBhY3Rpb24uXG4gICAqL1xuICBpbnNlcnQoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCh0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3JEaWFsb2dUaXRsZSgpLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9JbnNlcnQoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG5cbiAgICAvLyB2YWxpZGF0aW9uIGJlZm9yZSBpbnNlcnRcbiAgICBpZiAoISh0aGlzLnZhbGlkYXRlQmVmb3JlQWN0aW9uKHZhbHVlcykpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZUluc2VydC5lbWl0KHZhbHVlcyk7XG4gICAgdGhpcy5pbnNlcnREYXRhKHZhbHVlcywgc3FsVHlwZXMpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgIHNlbGYucG9zdENvcnJlY3RJbnNlcnQocmVzcCk7XG4gICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICBpZiAoc2VsZi5hZnRlckluc2VydE1vZGUgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgIHNlbGYuX3N0YXlJblJlY29yZEFmdGVySW5zZXJ0KHJlc3ApO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmFmdGVySW5zZXJ0TW9kZSA9PT0gJ25ldycpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJGb3JtQWZ0ZXJJbnNlcnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5hZnRlckluc2VydE1vZGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbmRDbG9zZUZvcm1BZnRlckluc2VydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jbG9zZURldGFpbCgpO1xuICAgICAgfVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHNlbGYucG9zdEluY29ycmVjdEluc2VydChlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUJlZm9yZUFjdGlvbih2YWx1ZXM6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uKHZhbHVlcyk7XG4gICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgcmVzdWx0LnRpdGxlID8/IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFZhbGlkYXRpb25FcnJvckRpYWxvZ1RpdGxlKCksXG4gICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VzID8gcmVzdWx0Lm1lc3NhZ2VzLmpvaW4oJzwvYnI+JykgOiB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvICdlZGl0JyBtb2RlXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZ29FZGl0TW9kZSgpYCBpbnN0ZWFkXG4gICAqL1xuICBfZ29FZGl0TW9kZSgpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2dvRWRpdE1vZGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGdvRWRpdE1vZGVgIGluc3RlYWQnKTtcbiAgICB0aGlzLmdvRWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2VkaXQnIG1vZGVcbiAgICovXG4gIGdvRWRpdE1vZGUoKSB7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5nb0VkaXRNb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2VkaXQnIGFjdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHVwZGF0ZSgpYCBpbnN0ZWFkXG4gICAqL1xuICBfZWRpdEFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2VkaXRBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYHVwZGF0ZWAgaW5zdGVhZCcpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2VkaXQnIGFjdGlvblxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKFxuICAgICAgKGNvbnRyb2wpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbF0ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJldHJpZXZpbmcga2V5cy4uLlxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0S2V5c1ZhbHVlcygpO1xuXG4gICAgLy8gcmV0cmlldmluZyB2YWx1ZXMgdG8gdXBkYXRlLi4uXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9VcGRhdGUoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gdXBkYXRlXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0lORk8nLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXROb3RoaW5nVG9VcGRhdGVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRpb24gYmVmb3JlIHVwZGF0ZVxuICAgIGlmICghKHRoaXMudmFsaWRhdGVCZWZvcmVBY3Rpb24odmFsdWVzKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQmVmb3JlVXBkYXRlLmVtaXQodmFsdWVzKTtcbiAgICAvLyBpbnZva2UgdXBkYXRlIG1ldGhvZC4uLlxuICAgIHRoaXMudXBkYXRlRGF0YShmaWx0ZXIsIHZhbHVlcywgc3FsVHlwZXMpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgIHNlbGYucG9zdENvcnJlY3RVcGRhdGUocmVzcCk7XG4gICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICBpZiAoc2VsZi5zdGF5SW5SZWNvcmRBZnRlckVkaXQpIHtcbiAgICAgICAgc2VsZi5yZWxvYWQodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmNsb3NlRGV0YWlsKCk7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0VXBkYXRlKGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZGVsZXRlJyBhY3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWxldGUoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2RlbGV0ZUFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2RlbGV0ZUFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgZGVsZXRlYCBpbnN0ZWFkJyk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2RlbGV0ZScgYWN0aW9uXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRLZXlzVmFsdWVzKCk7XG4gICAgdGhpcy5vbkJlZm9yZURlbGV0ZS5lbWl0KGZpbHRlcik7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlRGF0YShmaWx0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgc2VydmljZSBkYXRhXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICovXG4gIHF1ZXJ5RGF0YShmaWx0ZXI6IGFueSkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQodGhpcy5kYXRhU2VydmljZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignT0Zvcm1Db21wb25lbnQ6IG5vIHNlcnZpY2UgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChmaWx0ZXIpIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09Gb3JtQ29tcG9uZW50OiBubyBmaWx0ZXIgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb3JtQ2FjaGUucmVzdGFydENhY2hlKCk7XG4gICAgdGhpcy5jbGVhckNvbXBvbmVudHNPbGRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBhdiA9IHRoaXMuZ2V0QXR0cmlidXRlc1RvUXVlcnkoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG4gICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5xdWVyeU1ldGhvZF0oZmlsdGVyLCBhdiwgdGhpcy5lbnRpdHksIHNxbFR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHJlc3AuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFUlJPUjogJyArIHJlc3AubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24pKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgZXJyLnN0YXR1c1RleHQpIHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyLnN0YXR1c1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzVG9RdWVyeSgpOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgYXR0cmlidXRlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIC8vIGFkZCBmb3JtIGtleXMuLi5cbiAgICBpZiAodGhpcy5rZXlzQXJyYXkgJiYgdGhpcy5rZXlzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgYXR0cmlidXRlcy5wdXNoKC4uLnRoaXMua2V5c0FycmF5KTtcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50czogYW55ID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgLy8gYWRkIG9ubHkgdGhlIGZpZWxkcyBjb250YWluZWQgaW50byB0aGUgZm9ybS4uLlxuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoYXR0cmlidXRlcy5pbmRleE9mKGl0ZW0pIDwgMCAmJlxuICAgICAgICBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSAmJiBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljQmluZGluZygpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFkZCBmaWVsZHMgc3RvcmVkIGludG8gZm9ybSBjYWNoZS4uLlxuICAgIGNvbnN0IGRhdGFDYWNoZSA9IHRoaXMuZm9ybUNhY2hlLmdldERhdGFDYWNoZSgpO1xuICAgIGlmIChkYXRhQ2FjaGUpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFDYWNoZSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBhdHRyaWJ1dGVzLmluZGV4T2YoaXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuY29uY2F0KHRoaXMuY29sc0FycmF5LmZpbHRlcihjb2wgPT4gYXR0cmlidXRlcy5pbmRleE9mKGNvbCkgPCAwKSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBtYW5hZ2UgdGhlIGNhbGwgdG8gdGhlIGluc2VydCBzZXJ2aWNlXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIFtzcWxUeXBlc11cbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnk+XG4gICAqL1xuICBpbnNlcnREYXRhKHZhbHVlcywgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5kYXRhU2VydmljZVt0aGlzLmluc2VydE1ldGhvZF0odmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb0luc2VydCgpOiBvYmplY3Qge1xuICAgIGNvbnN0IGF0dHJWYWx1ZXMgPSB7fTtcbiAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyVmFsdWVzLCB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXR0clZhbHVlcywgdGhpcy5nZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNxbCB0eXBlcyBmcm9tIHRoZSBmb3JtIGNvbXBvbmVudHMgYW5kIHRoZSBmb3JtIGtleXNcbiAgICovXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTogb2JqZWN0IHtcbiAgICBjb25zdCB0eXBlczogb2JqZWN0ID0ge307XG4gICAgLy8gQWRkIGZvcm0ga2V5cyBzcWwgdHlwZXNcbiAgICB0aGlzLmtleXNTcWxUeXBlc0FycmF5LmZvckVhY2goKGtzdCwgaSkgPT4gdHlwZXNbdGhpcy5rZXlzQXJyYXlbaV1dID0gU1FMVHlwZXMuZ2V0U1FMVHlwZVZhbHVlKGtzdCkpO1xuICAgIC8vIEFkZCBmb3JtIGNvbXBvbmVudHMgc3FsIHR5cGVzXG4gICAgaWYgKHRoaXMuX2NvbXBTUUxUeXBlcyAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb21wU1FMVHlwZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odHlwZXMsIHRoaXMuX2NvbXBTUUxUeXBlcyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgdXBkYXRlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEBwYXJhbSBbc3FsVHlwZXNdXG4gICAqIEByZXR1cm5zICBPYnNlcnZhYmxlPGFueT5cbiAgICovXG4gIHVwZGF0ZURhdGEoZmlsdGVyLCB2YWx1ZXMsIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy51cGRhdGVNZXRob2RdKGZpbHRlciwgdmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb1VwZGF0ZSgpOiBvYmplY3Qge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGNoYW5nZWRBdHRycyA9IHRoaXMuZm9ybUNhY2hlLmdldENoYW5nZWRGb3JtQ29udHJvbHNBdHRyKCk7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZpbHRlcihjb250cm9sTmFtZSA9PlxuICAgICAgc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2YoY29udHJvbE5hbWUpID09PSAtMSAmJlxuICAgICAgY2hhbmdlZEF0dHJzLmluZGV4T2YoY29udHJvbE5hbWUpICE9PSAtMVxuICAgICkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHNlbGYuZm9ybUdyb3VwLmNvbnRyb2xzW2l0ZW1dO1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgdmFsdWVzW2l0ZW1dID0gY29udHJvbC5nZXRWYWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzW2l0ZW1dID0gY29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZXNbaXRlbV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZXNbaXRlbV0gPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgdG8gbWFuYWdlIHRoZSBjYWxsIHRvIHRoZSBkZWxldGUgc2VydmljZVxuICAgKiBAcGFyYW0gZmlsdGVyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGU8YW55PlxuICAgKi9cbiAgZGVsZXRlRGF0YShmaWx0ZXI6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbiA9IHRoaXMubG9hZCgpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNxbFR5cGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTtcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcyA9IHRydWU7XG4gICAgICB0aGlzLmRhdGFTZXJ2aWNlW3RoaXMuZGVsZXRlTWV0aG9kXShmaWx0ZXIsIHRoaXMuZW50aXR5LCBzcWxUeXBlcykuc3Vic2NyaWJlKFxuICAgICAgICByZXNwID0+IHtcbiAgICAgICAgICBpZiAocmVzcC5pc1N1Y2Nlc3NmdWwoKSkge1xuICAgICAgICAgICAgc2VsZi5mb3JtQ2FjaGUuc2V0Q2FjaGVTbmFwc2hvdCgpO1xuICAgICAgICAgICAgc2VsZi5tYXJrRm9ybUxheW91dE1hbmFnZXJUb1VwZGF0ZSgpO1xuICAgICAgICAgICAgc2VsZi5wb3N0Q29ycmVjdERlbGV0ZShyZXNwKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGYucG9zdEluY29ycmVjdERlbGV0ZShyZXNwKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0RGVsZXRlKGVycik7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIHRvSlNPTkRhdGEoZGF0YSkge1xuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IHt9O1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZURhdGEgPSB7fTtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICB2YWx1ZURhdGFbaXRlbV0gPSBkYXRhW2l0ZW1dLnZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZURhdGE7XG4gIH1cblxuICB0b0Zvcm1WYWx1ZURhdGEoZGF0YSkge1xuICAgIGlmIChkYXRhICYmIFV0aWwuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QgdmFsdWVEYXRhOiBBcnJheTxvYmplY3Q+ID0gW107XG4gICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgIGRhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgdmFsdWVEYXRhLnB1c2goc2VsZi5vYmplY3RUb0Zvcm1WYWx1ZURhdGEoaXRlbSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVEYXRhO1xuICAgIH0gZWxzZSBpZiAoZGF0YSAmJiBVdGlsLmlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYmplY3RUb0Zvcm1WYWx1ZURhdGEoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBrZXlzIHZhbHVlc1xuICAgKiBAcmV0dXJucyBrZXlzXG4gICAqL1xuICBnZXRLZXlzVmFsdWVzKCk6IGFueSB7XG4gICAgY29uc3QgZmlsdGVyID0ge307XG4gICAgY29uc3QgY3VycmVudFJlY29yZCA9IHRoaXMuZm9ybURhdGE7XG4gICAgaWYgKCF0aGlzLmtleXNBcnJheSkge1xuICAgICAgcmV0dXJuIGZpbHRlcjtcbiAgICB9XG4gICAgdGhpcy5rZXlzQXJyYXkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKGN1cnJlbnRSZWNvcmRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBjdXJyZW50RGF0YSA9IGN1cnJlbnRSZWNvcmRba2V5XTtcbiAgICAgICAgaWYgKGN1cnJlbnREYXRhIGluc3RhbmNlb2YgT0Zvcm1WYWx1ZSkge1xuICAgICAgICAgIGN1cnJlbnREYXRhID0gY3VycmVudERhdGEudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZmlsdGVyW2tleV0gPSBjdXJyZW50RGF0YTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgaXNJblF1ZXJ5TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuUVVFUlk7XG4gIH1cblxuICBpc0luSW5zZXJ0TW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUO1xuICB9XG5cbiAgaXNJblVwZGF0ZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURTtcbiAgfVxuXG4gIGlzSW5Jbml0aWFsTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDtcbiAgfVxuXG4gIHNldFF1ZXJ5TW9kZSgpIHtcbiAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5RVUVSWSk7XG4gIH1cblxuICBzZXRJbnNlcnRNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOU0VSVCk7XG4gIH1cblxuICBzZXRVcGRhdGVNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURSk7XG4gIH1cblxuICBzZXRJbml0aWFsTW9kZSgpIHtcbiAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRHluYW1pY0Zvcm1Db21wb25lbnQoZHluYW1pY0Zvcm0pIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGR5bmFtaWNGb3JtKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmR5bmFtaWNGb3JtU3Vic2NyaXB0aW9uID0gZHluYW1pY0Zvcm0ucmVuZGVyLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcykge1xuICAgICAgICBzZWxmLnJlZnJlc2hDb21wb25lbnRzRWRpdGFibGVTdGF0ZSgpO1xuICAgICAgICBpZiAoIXNlbGYuaXNJbkluc2VydE1vZGUoKSAmJiBzZWxmLnF1ZXJ5T25Jbml0KSB7XG4gICAgICAgICAgc2VsZi5yZWxvYWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmZvcm1QYXJlbnRLZXlzVmFsdWVzKS5mb3JFYWNoKHBhcmVudEtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBzZWxmLmdldEZpZWxkUmVmZXJlbmNlKHBhcmVudEtleSk7XG4gICAgICAgICAgICBpZiAoVXRpbC5pc0Zvcm1EYXRhQ29tcG9uZW50KGNvbXApICYmIGNvbXAuaXNBdXRvbWF0aWNCaW5kaW5nKCkpIHtcbiAgICAgICAgICAgICAgY29tcC5zZXRWYWx1ZSh2YWx1ZSwge1xuICAgICAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdW5yZWdpc3RlckR5bmFtaWNGb3JtQ29tcG9uZW50KGR5bmFtaWNGb3JtKSB7XG4gICAgaWYgKGR5bmFtaWNGb3JtICYmIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRSZXF1aXJlZENvbXBvbmVudHMoKTogb2JqZWN0IHtcbiAgICBjb25zdCByZXF1aXJlZENvbXBvbnRlbnRzOiBvYmplY3QgPSB7fTtcbiAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgaWYgKGNvbXBvbmVudHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNba2V5XTtcbiAgICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICAgIGlmICgoY29tcCBhcyBhbnkpLmlzUmVxdWlyZWQgJiYgYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXF1aXJlZENvbXBvbnRlbnRzW2F0dHJdID0gY29tcDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXF1aXJlZENvbXBvbnRlbnRzO1xuICB9XG5cbiAgZ2V0IGxheW91dERpcmVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sYXlvdXREaXJlY3Rpb247XG4gIH1cblxuICBzZXQgbGF5b3V0RGlyZWN0aW9uKHZhbDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFyc2VkVmFsID0gKHZhbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLl9sYXlvdXREaXJlY3Rpb24gPSBbJ3JvdycsICdjb2x1bW4nLCAncm93LXJldmVyc2UnLCAnY29sdW1uLXJldmVyc2UnXS5pbmRleE9mKHBhcnNlZFZhbCkgIT09IC0xID8gcGFyc2VkVmFsIDogT0Zvcm1Db21wb25lbnQuREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OO1xuICB9XG5cbiAgZ2V0IGxheW91dEFsaWduKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dEFsaWduO1xuICB9XG5cbiAgc2V0IGxheW91dEFsaWduKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGF5b3V0QWxpZ24gPSB2YWw7XG4gIH1cblxuICBnZXQgc2hvd0Zsb2F0aW5nVG9vbGJhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93SGVhZGVyICYmIHRoaXMuaGVhZGVyTW9kZSA9PT0gJ2Zsb2F0aW5nJztcbiAgfVxuXG4gIGdldCBzaG93Tm90RmxvYXRpbmdUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5oZWFkZXJNb2RlICE9PSAnZmxvYXRpbmcnO1xuICB9XG5cbiAgaXNFZGl0YWJsZURldGFpbCgpIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZURldGFpbDtcbiAgfVxuXG4gIGlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRyczogc3RyaW5nW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZS5pc0luaXRpYWxTdGF0ZUNoYW5nZWQoaWdub3JlQXR0cnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgdW5kbygpYCBpbnN0ZWFkXG4gICAqL1xuICBfdW5kb0xhc3RDaGFuZ2VBY3Rpb24oKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll91bmRvTGFzdENoYW5nZUFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgdW5kb2AgaW5zdGVhZCcpO1xuICAgIHRoaXMudW5kbygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuZG8gbGFzdCBjaGFuZ2VcbiAgICovXG4gIHVuZG8oKSB7XG4gICAgdGhpcy5mb3JtQ2FjaGUudW5kb0xhc3RDaGFuZ2UoKTtcbiAgfVxuXG4gIGdldCBpc0NhY2hlU3RhY2tFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ2FjaGUuaXNDYWNoZVN0YWNrRW1wdHk7XG4gIH1cblxuICB1bmRvS2V5Ym9hcmRQcmVzc2VkKCkge1xuICAgIHRoaXMuZm9ybUNhY2hlLnVuZG9MYXN0Q2hhbmdlKCk7XG4gIH1cblxuICBnZXRGb3JtVG9vbGJhcigpOiBPRm9ybVRvb2xiYXJCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybVRvb2xiYXI7XG4gIH1cblxuICBnZXRGb3JtTWFuYWdlcigpOiBPRm9ybUxheW91dE1hbmFnZXJCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5mb3JtTGF5b3V0TWFuYWdlcjtcbiAgfVxuXG4gIGdldEZvcm1OYXZpZ2F0aW9uKCk6IE9Gb3JtTmF2aWdhdGlvbkNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbjtcbiAgfVxuXG4gIGdldEZvcm1DYWNoZSgpOiBPRm9ybUNhY2hlQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZTtcbiAgfVxuXG4gIGdldFVybFBhcmFtKGFyZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU5hdmlnYXRpb24oKS5nZXRVcmxQYXJhbXMoKVthcmddO1xuICB9XG5cbiAgZ2V0VXJsUGFyYW1zKCkge1xuICAgIHJldHVybiB0aGlzLmdldEZvcm1OYXZpZ2F0aW9uKCkuZ2V0VXJsUGFyYW1zKCk7XG4gIH1cblxuICBzZXRVcmxQYXJhbXNBbmRSZWxvYWQodmFsOiBvYmplY3QpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnNldFVybFBhcmFtcyh2YWwpO1xuICAgIHRoaXMucmVsb2FkKHRydWUpO1xuICB9XG5cbiAgZ2V0UmVnaXN0ZXJlZEZpZWxkc1ZhbHVlcygpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB7fTtcbiAgICBjb25zdCBjb21wb25lbnRzOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY29tcG9uZW50c0tleXMgPSBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5maWx0ZXIoa2V5ID0+IHNlbGYuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgICBjb21wb25lbnRzS2V5cy5mb3JFYWNoKGNvbXBLZXkgPT4ge1xuICAgICAgY29uc3QgY29tcDogSUZvcm1EYXRhQ29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wS2V5XTtcbiAgICAgIHZhbHVlc1tjb21wS2V5XSA9IGNvbXAuZ2V0VmFsdWUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0ciB0aGUgYXR0ciBvZiB0aGUgZm9ybSBmaWVsZFxuICAgKi9cbiAgZ2V0RmllbGRWYWx1ZShhdHRyOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2UoYXR0cik7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIHZhbHVlID0gY29tcC5nZXRWYWx1ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9iamVjdCB3aXRoIHRoZSB2YWx1ZXMgb2YgZWFjaCBhdHRyaWJ1dGVcbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyJ3Mgb2YgdGhlIGZvcm0gZmllbGRzXG4gICAqL1xuICBnZXRGaWVsZFZhbHVlcyhhdHRyczogc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IGFyciA9IHt9O1xuICAgIGF0dHJzLmZvckVhY2goa2V5ID0+IGFycltrZXldID0gdGhpcy5nZXRGaWVsZFZhbHVlKGtleSkpO1xuICAgIHJldHVybiBhcnI7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIGF0dHIgYXR0cmlidXRlIG9mIGNvbnRyb2xcbiAgICogQHBhcmFtIHZhbHVlIHZhbHVlXG4gICAqL1xuICBzZXRGaWVsZFZhbHVlKGF0dHI6IHN0cmluZywgdmFsdWU6IGFueSwgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBjb25zdCBjb21wID0gdGhpcy5nZXRGaWVsZFJlZmVyZW5jZShhdHRyKTtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29tcC5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzXG4gICAqL1xuICBzZXRGaWVsZFZhbHVlcyh2YWx1ZXM6IGFueSwgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICB0aGlzLnNldEZpZWxkVmFsdWUoa2V5LCB2YWx1ZXNba2V5XSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbnRyb2wgaW4gdGhlIGZvcm1cbiAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHIgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIGNsZWFyRmllbGRWYWx1ZShhdHRyOiBzdHJpbmcsIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2UoYXR0cik7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbXAuY2xlYXJWYWx1ZShvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHZhbHVlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHIncyBvZiB0aGUgZm9ybSBmaWVsZHNcbiAgICovXG4gIGNsZWFyRmllbGRWYWx1ZXMoYXR0cnM6IHN0cmluZ1tdLCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucykge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGF0dHJzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgc2VsZi5jbGVhckZpZWxkVmFsdWUoa2V5LCBvcHRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSBvZiB0aGUgY29udHJvbCBpbiB0aGUgZm9ybS5cbiAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHIgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIGdldEZpZWxkUmVmZXJlbmNlKGF0dHI6IHN0cmluZyk6IElGb3JtRGF0YUNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHNbYXR0cl07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByZWZlcmVuY2Ugb2YgZWFjaCBjb250cm9sIGluIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cidzIG9mIHRoZSBmb3JtIGZpbGVkc1xuICAgKi9cbiAgZ2V0RmllbGRSZWZlcmVuY2VzKGF0dHJzOiBzdHJpbmdbXSk6IElGb3JtRGF0YUNvbXBvbmVudEhhc2gge1xuICAgIGNvbnN0IGFycjogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCA9IHt9O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGF0dHJzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgYXJyW2tleV0gPSBzZWxmLmdldEZpZWxkUmVmZXJlbmNlKGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIGdldEZvcm1Db21wb25lbnRQZXJtaXNzaW9ucyhhdHRyOiBzdHJpbmcpOiBPUGVybWlzc2lvbnMge1xuICAgIGxldCBwZXJtaXNzaW9uczogT1Blcm1pc3Npb25zO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnBlcm1pc3Npb25zKSkge1xuICAgICAgcGVybWlzc2lvbnMgPSAodGhpcy5wZXJtaXNzaW9ucy5jb21wb25lbnRzIHx8IFtdKS5maW5kKGNvbXAgPT4gY29tcC5hdHRyID09PSBhdHRyKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgZ2V0QWN0aW9uc1Blcm1pc3Npb25zKCk6IE9QZXJtaXNzaW9uc1tdIHtcbiAgICBsZXQgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9uc1tdO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZCh0aGlzLnBlcm1pc3Npb25zKSkge1xuICAgICAgcGVybWlzc2lvbnMgPSAodGhpcy5wZXJtaXNzaW9ucy5hY3Rpb25zIHx8IFtdKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm1pc3Npb25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVybWluYXRlRm9ybU1vZGUoKTogdm9pZCB7XG4gICAgY29uc3QgdXJsU2VnbWVudHMgPSB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldFVybFNlZ21lbnRzKCk7XG4gICAgaWYgKHVybFNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlZ21lbnQgPSB1cmxTZWdtZW50c1t1cmxTZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZGV0ZXJtaW5hdGVNb2RlRnJvbVVybFNlZ21lbnQoc2VnbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFjdFJvdXRlLnBhcmVudCkge1xuICAgICAgdGhpcy5hY3RSb3V0ZS5wYXJlbnQudXJsLnN1YnNjcmliZShzZWdtZW50cyA9PiB7XG4gICAgICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgdGhpcy5kZXRlcm1pbmF0ZU1vZGVGcm9tVXJsU2VnbWVudChzZWdtZW50KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEZvcm1Nb2RlKE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMKTtcbiAgICB9XG4gICAgLy8gc3RheUluUmVjb3JkQWZ0ZXJFZGl0IGlzIHRydWUgaWYgZm9ybSBoYXMgZWRpdGFibGUgZGV0YWlsID0gdHJ1ZVxuICAgIHRoaXMuc3RheUluUmVjb3JkQWZ0ZXJFZGl0ID0gdGhpcy5zdGF5SW5SZWNvcmRBZnRlckVkaXQgfHwgdGhpcy5pc0VkaXRhYmxlRGV0YWlsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGV0ZXJtaW5hdGVNb2RlRnJvbVVybFNlZ21lbnQoc2VnbWVudDogVXJsU2VnbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IF9wYXRoID0gc2VnbWVudCA/IHNlZ21lbnQucGF0aCA6ICcnO1xuICAgIGlmICh0aGlzLmlzSW5zZXJ0TW9kZVBhdGgoX3BhdGgpKSB7XG4gICAgICB0aGlzLnNldEluc2VydE1vZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNVcGRhdGVNb2RlUGF0aChfcGF0aCkpIHtcbiAgICAgIHRoaXMuc2V0VXBkYXRlTW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEluaXRpYWxNb2RlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIF91cGRhdGVGb3JtRGF0YShuZXdGb3JtRGF0YTogb2JqZWN0KTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gbmV3Rm9ybURhdGE7XG4gICAgICBjb25zdCBjb21wb25lbnRzID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgICBjb25zdCBrZXlDb21wb25lbnRzID0gWy4uLk9iamVjdC5rZXlzKGNvbXBvbmVudHMpXTtcbiAgICAgIGlmICghVXRpbC5pc0FycmF5RW1wdHkodGhpcy5zZXRWYWx1ZU9yZGVyQXJyYXkpKSB7XG4gICAgICAgIGtleUNvbXBvbmVudHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4QSA9IHRoaXMuc2V0VmFsdWVPcmRlckFycmF5LmluZGV4T2YoYSkgPT09IC0xID8gMSA6IDA7XG4gICAgICAgICAgY29uc3QgaW5kZXhCID0gdGhpcy5zZXRWYWx1ZU9yZGVyQXJyYXkuaW5kZXhPZihiKSA9PT0gLTEgPyAxIDogMDtcbiAgICAgICAgICByZXR1cm4gaW5kZXhBIC0gaW5kZXhCO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFVdGlsLmlzQXJyYXlFbXB0eShrZXlDb21wb25lbnRzKSkge1xuICAgICAgICBrZXlDb21wb25lbnRzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wID0gY29tcG9uZW50c1trZXldO1xuICAgICAgICAgIHRoaXMuc2V0RGF0YUluRm9ybURhdGFDb21wb25lbnQoY29tcCwga2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbGYuaW5pdGlhbGl6ZUZpZWxkcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhSW5Gb3JtRGF0YUNvbXBvbmVudChjb21wOiBJRm9ybURhdGFDb21wb25lbnQsIGF0dHI6IHN0cmluZykge1xuICAgIGlmIChVdGlsLmlzRm9ybURhdGFDb21wb25lbnQoY29tcCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChjb21wLmlzQXV0b21hdGljQmluZGluZygpKSB7XG4gICAgICAgICAgY29tcC5kYXRhID0gdGhpcy5nZXREYXRhVmFsdWUoYXR0cik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXplRmllbGRzKCk6IHZvaWQge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbF0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9KTtcbiAgICB0aGlzLmZvcm1DYWNoZS5yZWdpc3RlckNhY2hlKCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi51cGRhdGVOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJDb21wb25lbnRzT2xkVmFsdWUoKTogdm9pZCB7XG4gICAgY29uc3QgY29tcG9uZW50czogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCA9IHRoaXMuZ2V0Q29tcG9uZW50cygpO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGNvbXBvbmVudHNLZXlzID0gT2JqZWN0LmtleXMoY29tcG9uZW50cykuZmlsdGVyKGtleSA9PiBzZWxmLmlnbm9yZUZvcm1DYWNoZUtleXMuaW5kZXhPZihrZXkpID09PSAtMSk7XG4gICAgY29tcG9uZW50c0tleXMuZm9yRWFjaChjb21wS2V5ID0+IHtcbiAgICAgIGNvbnN0IGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCA9IGNvbXBvbmVudHNbY29tcEtleV07XG4gICAgICAoY29tcCBhcyBhbnkpLm9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgY29tcC5nZXRGb3JtQ29udHJvbCgpLnNldFZhbHVlKHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdENvcnJlY3RJbnNlcnQocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldEluc2VydFN1Y2Nlc3NNZXNzYWdlKCksIHsgaWNvbjogJ2NoZWNrX2NpcmNsZScgfSk7XG4gICAgdGhpcy5vbkluc2VydC5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdEluY29ycmVjdEluc2VydChyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Vycm9yKCdpbnNlcnQnLCByZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RJbmNvcnJlY3REZWxldGUocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFcnJvcignZGVsZXRlJywgcmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0SW5jb3JyZWN0VXBkYXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RXJyb3IoJ3VwZGF0ZScsIHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdENvcnJlY3RVcGRhdGUocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFVwZGF0ZVN1Y2Nlc3NNZXNzYWdlKCksIHsgaWNvbjogJ2NoZWNrX2NpcmNsZScgfSk7XG4gICAgdGhpcy5vblVwZGF0ZS5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdENvcnJlY3REZWxldGUocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNuYWNrQmFyU2VydmljZS5vcGVuKHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldERlbGV0ZVN1Y2Nlc3NNZXNzYWdlKCksIHsgaWNvbjogJ2NoZWNrX2NpcmNsZScgfSk7XG4gICAgdGhpcy5vbkRlbGV0ZS5lbWl0KHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0Zvcm1MYXlvdXRNYW5hZ2VyVG9VcGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUxheW91dE1hbmFnZXIgPSB0aGlzLmdldEZvcm1NYW5hZ2VyKCk7XG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKGZvcm1MYXlvdXRNYW5hZ2VyKSkge1xuICAgICAgZm9ybUxheW91dE1hbmFnZXIubWFya0ZvclVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9iamVjdFRvRm9ybVZhbHVlRGF0YShkYXRhOiBvYmplY3QgPSB7fSk6IG9iamVjdCB7XG4gICAgY29uc3QgdmFsdWVEYXRhID0ge307XG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdmFsdWVEYXRhW2l0ZW1dID0gbmV3IE9Gb3JtVmFsdWUoZGF0YVtpdGVtXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlRGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRDdXJyZW50S2V5c1ZhbHVlcygpOiBvYmplY3Qge1xuICAgIHJldHVybiB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldEN1cnJlbnRLZXlzVmFsdWVzKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaENvbXBvbmVudHNFZGl0YWJsZVN0YXRlKCk6IHZvaWQge1xuICAgIHN3aXRjaCAodGhpcy5tb2RlKSB7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMOlxuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodGhpcy5pc0VkaXRhYmxlRGV0YWlsKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOU0VSVDpcbiAgICAgIGNhc2UgT0Zvcm1Db21wb25lbnQuTW9kZSgpLlVQREFURTpcbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBpc0luc2VydE1vZGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hdkRhdGE6IE9OYXZpZ2F0aW9uSXRlbSA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TGFzdEl0ZW0oKTtcbiAgICAvLyBUT0RPOiBzb2x2ZSBpc3N1ZSAjNzI3IHdoZW4gYGluc2VydC1mb3JtLXJvdXRlYCBpcyBwcmVzZW50XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKG5hdkRhdGEpID8gcGF0aCA9PT0gbmF2RGF0YS5nZXRJbnNlcnRGb3JtUm91dGUoKSA6IENvZGVzLkRFRkFVTFRfSU5TRVJUX1JPVVRFID09PSBwYXRoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzVXBkYXRlTW9kZVBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmF2RGF0YTogT05hdmlnYXRpb25JdGVtID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRQcmV2aW91c1JvdXRlRGF0YSgpO1xuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChuYXZEYXRhKSAmJiBwYXRoID09PSBuYXZEYXRhLmdldEVkaXRGb3JtUm91dGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Vycm9yKG9wZXJhdGlvbjogc3RyaW5nLCByZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzc2FnZSA9ICcnXG4gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgICBjYXNlICd1cGRhdGUnOlxuICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRVcGRhdGVFcnJvck1lc3NhZ2UoKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpbnNlcnQnOlxuICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRJbnNlcnRFcnJvck1lc3NhZ2UoKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXREZWxldGVFcnJvck1lc3NhZ2UoKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFsZXJ0KCdFUlJPUicsIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG59XG4iLCI8bmctdGVtcGxhdGUgI2N1c3RvbUZvcm1Ub29sYmFyQnV0dG9ucz5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW28tZm9ybS10b29sYmFyLWJ1dHRvbnNdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG8tZm9ybS10b29sYmFyICpuZ0lmPVwic2hvd0Zsb2F0aW5nVG9vbGJhciAmJiBoZWFkZXJQb3NpdGlvbj09PSd0b3AnXCIgW2xhYmVsLWhlYWRlcl09XCJsYWJlbGhlYWRlclwiIFtsYWJlbC1oZWFkZXItYWxpZ25dPVwibGFiZWxIZWFkZXJBbGlnblwiXG4gIFtoZWFkZXItYWN0aW9uc109XCJoZWFkZXJhY3Rpb25zXCIgW3Nob3ctaGVhZGVyLW5hdmlnYXRpb25dPVwic2hvd0hlYWRlck5hdmlnYXRpb25cIiBbc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0XT1cInNob3dIZWFkZXJBY3Rpb25zVGV4dFwiXG4gIChvbkNhbmNlbCk9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIiBsYXlvdXQtcGFkZGluZz5cbiAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9vLWZvcm0tdG9vbGJhcj5cblxuPG5nLWhvc3Qgb0tleWJvYXJkTGlzdGVuZXIga2V5Ym9hcmRLZXlzPVwiMTc7OTBcIiAob25LZXlzUHJlc3NlZCk9XCJ1bmRvS2V5Ym9hcmRQcmVzc2VkKClcIiBjbGFzcz1cInNjcm9sbGluZyBvLXNjcm9sbFwiPlxuICA8ZGl2IGZ4RmxleD1cImdyb3dcIj5cbiAgICA8by1mb3JtLXRvb2xiYXIgKm5nSWY9XCJzaG93Tm90RmxvYXRpbmdUb29sYmFyICYmIGhlYWRlclBvc2l0aW9uPT09J3RvcCdcIiBbbGFiZWwtaGVhZGVyXT1cImxhYmVsaGVhZGVyXCIgW2xhYmVsLWhlYWRlci1hbGlnbl09XCJsYWJlbEhlYWRlckFsaWduXCJcbiAgICAgIFtoZWFkZXItYWN0aW9uc109XCJoZWFkZXJhY3Rpb25zXCIgW3Nob3ctaGVhZGVyLW5hdmlnYXRpb25dPVwic2hvd0hlYWRlck5hdmlnYXRpb25cIiBbc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0XT1cInNob3dIZWFkZXJBY3Rpb25zVGV4dFwiXG4gICAgICAob25DYW5jZWwpPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCIgbGF5b3V0LXBhZGRpbmc+XG4gICAgICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgICAgICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L28tZm9ybS10b29sYmFyPlxuXG4gICAgPGZvcm0gI2lubmVyRm9ybSBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIGNsYXNzPVwiaW5uZXItZm9ybVwiIFtjbGFzcy5mb3JtLW5vLXRvb2xiYXJdPVwiIXNob3dIZWFkZXJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY29ycmVjdD1cIm9mZlwiXG4gICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiPlxuICAgICAgPGRpdiAqbmdJZj1cImxvYWRpbmcgfCBhc3luY1wiIGNsYXNzPVwicHJvZ3Jlc3MtYmFyLWNvbnRhaW5lclwiPlxuICAgICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBsYXlvdXQtcGFkZGluZyBbZnhMYXlvdXRdPVwibGF5b3V0RGlyZWN0aW9uXCIgW2Z4TGF5b3V0QWxpZ25dPVwibGF5b3V0QWxpZ25cIiBjbGFzcz1cIm8tZm9ybS1jb250ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuXG4gICAgPG8tZm9ybS10b29sYmFyICpuZ0lmPVwic2hvd05vdEZsb2F0aW5nVG9vbGJhciAmJiBoZWFkZXJQb3NpdGlvbj09PSdib3R0b20nXCIgW2xhYmVsLWhlYWRlcl09XCJsYWJlbGhlYWRlclwiIFtsYWJlbC1oZWFkZXItYWxpZ25dPVwibGFiZWxIZWFkZXJBbGlnblwiXG4gICAgICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICAgICAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZvcm1Ub29sYmFyQnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9vLWZvcm0tdG9vbGJhcj5cbiAgPC9kaXY+XG48L25nLWhvc3Q+XG5cbjxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0nYm90dG9tJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAob25DYW5jZWwpPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCIgbGF5b3V0LXBhZGRpbmc+XG4gIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZvcm1Ub29sYmFyQnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvby1mb3JtLXRvb2xiYXI+XG4iXX0=
1425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vby1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxFQUlOLFNBQVMsRUFDVCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFzQixnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUVoRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU96RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFtQixNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFVbEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtC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QkFBcUIsRUFBRTs7bURBQ0k7QUFnQjVCO0lBQUMscUJBQXFCLEVBQUU7OytEQUN3QjsyRkEvRHJDLGNBQWM7a0JBaEIxQixTQUFTOytCQUNFLFFBQVEsYUFDUDt3QkFDVCxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLEVBQUU7d0JBQ3JFLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3FCQUNwQixVQUdPLHFCQUFxQixXQUNwQixzQkFBc0IsaUJBQ2hCLGlCQUFpQixDQUFDLElBQUksUUFDL0I7d0JBQ0osZ0JBQWdCLEVBQUUsTUFBTTtxQkFDekI7K05BU0QsVUFBVSxNQWFWLHFCQUFxQixNQUlYLFdBQVcsTUFVWCxjQUFjLE1BR3hCLFVBQVUsTUFFVixvQkFBb0IsTUFHcEIsaUJBQWlCLE1BRWpCLG1CQUFtQixNQUVuQixXQUFXLE1BaUJKLHVCQUF1QixNQTBFTixXQUFXO3NCQUFsQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdG9yLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBCb29sZWFuSW5wdXRDb252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2lucHV0LWNvbnZlcnRlcic7XG5pbXBvcnQgeyBJQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQtaGFzaC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZvcm1EYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JtLWRhdGEtY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRm9ybURhdGFUeXBlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JtLWRhdGEtdHlwZS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNlcnZpY2VSZXNwb25zZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2VydmljZS1yZXNwb25zZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgT0Zvcm1MYXlvdXRNYW5hZ2VyQmFzZSB9IGZyb20gJy4uLy4uL2xheW91dHMvZm9ybS1sYXlvdXQvby1mb3JtLWxheW91dC1tYW5hZ2VyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFjdG9yaWVzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlLCBPTmF2aWdhdGlvbkl0ZW0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUuc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wZXJtaXNzaW9ucy9wZXJtaXNzaW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFNuYWNrQmFyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NuYWNrYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT0NvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1tZXNzYWdlLXNlcnZpY2UtYXJncy50eXBlJztcbmltcG9ydCB7IE9Db25maWd1cmVTZXJ2aWNlQXJncyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBPRm9ybVZhbGlkYXRpb24gfSBmcm9tICcuLi8uLi90eXBlcy9lcnJvci1mb3JtLXZhbGlkYXRpb24udHlwZSc7XG5pbXBvcnQgeyBGb3JtTGF5b3V0Q2xvc2VEZXRhaWxPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvZm9ybS1sYXlvdXQtZGV0YWlsLWNvbXBvbmVudC1kYXRhLnR5cGUnO1xuaW1wb3J0IHsgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzL2Zvcm0tdmFsdWUtb3B0aW9ucy50eXBlJztcbmltcG9ydCB7IE9Gb3JtSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLWluaXRpYWxpemF0aW9uLW9wdGlvbnMudHlwZSc7XG5pbXBvcnQgeyBPRm9ybVBlcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1mb3JtLXBlcm1pc3Npb25zLnR5cGUnO1xuaW1wb3J0IHsgT1Blcm1pc3Npb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvby1wZXJtaXNzaW9ucy50eXBlJztcbmltcG9ydCB7IE9RdWVyeVBhcmFtcyB9IGZyb20gJy4uLy4uL3R5cGVzL3F1ZXJ5LXBhcmFtcy50eXBlJztcbmltcG9ydCB7IENvZGVzIH0gZnJvbSAnLi4vLi4vdXRpbC9jb2Rlcyc7XG5pbXBvcnQgeyBTUUxUeXBlcyB9IGZyb20gJy4uLy4uL3V0aWwvc3FsdHlwZXMnO1xuaW1wb3J0IHsgVXRpbCB9IGZyb20gJy4uLy4uL3V0aWwvdXRpbCc7XG5pbXBvcnQgeyBPRm9ybUNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tY29udGFpbmVyL28tZm9ybS1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9Gb3JtQ29udHJvbCB9IGZyb20gJy4uL2lucHV0L28tZm9ybS1jb250cm9sLmNsYXNzJztcbmltcG9ydCB7IE9Gb3JtQ2FjaGVDbGFzcyB9IGZyb20gJy4vY2FjaGUvby1mb3JtLmNhY2hlLmNsYXNzJztcbmltcG9ydCB7IENhbkNvbXBvbmVudERlYWN0aXZhdGUsIENhbkRlYWN0aXZhdGVGb3JtR3VhcmQgfSBmcm9tICcuL2d1YXJkcy9vLWZvcm0tY2FuLWRlYWN0aXZhdGUuZ3VhcmQnO1xuaW1wb3J0IHsgT0Zvcm1OYXZpZ2F0aW9uQ2xhc3MgfSBmcm9tICcuL25hdmlnYXRpb24vby1mb3JtLm5hdmlnYXRpb24uY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1CYXNlIH0gZnJvbSAnLi9vLWZvcm0tYmFzZS5jbGFzcyc7XG5pbXBvcnQgeyBPX0ZPUk1fR0xPQkFMX0NPTkZJRyB9IGZyb20gJy4vby1mb3JtLXRva2Vucyc7XG5pbXBvcnQgeyBPRm9ybVZhbHVlIH0gZnJvbSAnLi9vLWZvcm0tdmFsdWUnO1xuaW1wb3J0IHsgT0Zvcm1NZXNzYWdlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvby1mb3JtLW1lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPRm9ybVRvb2xiYXJCYXNlIH0gZnJvbSAnLi90b29sYmFyL28tZm9ybS10b29sYmFyLWJhc2UuY2xhc3MnO1xuaW1wb3J0IHsgT0Zvcm1Ub29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyL28tZm9ybS10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Jhc2Utc2VydmljZS5jbGFzcyc7XG5cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5QVVRTX09fRk9STSA9IFtcbiAgLy8gc2hvdy1oZWFkZXIgW2Jvb2xlYW5dOiB2aXNpYmlsaXR5IG9mIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogeWVzLlxuICAnc2hvd0hlYWRlcjogc2hvdy1oZWFkZXInLFxuXG4gIC8vIGhlYWRlci1tb2RlIFtzdHJpbmddWyBub25lIHwgZmxvYXRpbmcgXTogcGFpbnRpbmcgbW9kZSBvZiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICdmbG9hdGluZydcbiAgJ2hlYWRlck1vZGU6IGhlYWRlci1tb2RlJyxcblxuICAvLyBoZWFkZXItcG9zaXRpb24gWyB0b3AgfCBib3R0b20gXTogcG9zaXRpb24gb2YgdGhlIGZvcm0gdG9vbGJhci4gRGVmYXVsdDogJ3RvcCdcbiAgJ2hlYWRlclBvc2l0aW9uOiBoZWFkZXItcG9zaXRpb24nLFxuXG4gIC8vIGxhYmVsLWhlYWRlciBbc3RyaW5nXTogZGlzcGxheWFibGUgdGV4dCBvbiBmb3JtIHRvb2xiYXIuIERlZmF1bHQ6ICcnLlxuICAnbGFiZWxoZWFkZXI6IGxhYmVsLWhlYWRlcicsXG5cbiAgLy8gbGFiZWwtaGVhZGVyLWFsaWduIFtzdHJpbmddW3N0YXJ0IHwgY2VudGVyIHwgZW5kXTogYWxpZ25tZW50IG9mIGZvcm0gdG9vbGJhciB0ZXh0LiBEZWZhdWx0OiAnY2VudGVyJ1xuICAnbGFiZWxIZWFkZXJBbGlnbjogbGFiZWwtaGVhZGVyLWFsaWduJyxcblxuICAvLyBoZWFkZXItYWN0aW9ucyBbc3RyaW5nXTogYXZhaWxhYmxlIGFjdGlvbiBidXR0b25zIG9uIGZvcm0gdG9vbGJhciBvZiBzdGFuZGFyZCBDUlVEIG9wZXJhdGlvbnMsIHNlcGFyYXRlZCBieSAnOycuIEF2YWlsYWJsZSBvcHRpb25zIGFyZSBSO0k7VTtEIChSZWZyZXNoLCBJbnNlcnQsIFVwZGF0ZSwgRGVsZXRlKS4gRGVmYXVsdDogUjtJO1U7RFxuICAnaGVhZGVyYWN0aW9uczogaGVhZGVyLWFjdGlvbnMnLFxuXG4gIC8vIHNob3ctaGVhZGVyLWFjdGlvbnMtdGV4dCBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IHNob3cgdGV4dCBvZiBmb3JtIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdCB5ZXNcbiAgJ3Nob3dIZWFkZXJBY3Rpb25zVGV4dDogc2hvdy1oZWFkZXItYWN0aW9ucy10ZXh0JyxcblxuICAvLyBlbnRpdHkgW3N0cmluZ106IGVudGl0eSBvZiB0aGUgc2VydmljZS4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdlbnRpdHknLFxuXG4gIC8vIGtleXMgW3N0cmluZ106IGVudGl0eSBrZXlzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXMnLFxuXG4gIC8vIGNvbHVtbnMgW3N0cmluZ106IGNvbHVtbnMgb2YgdGhlIGVudGl0eSwgc2VwYXJhdGVkIGJ5ICc7Jy4gRGVmYXVsdDogbm8gdmFsdWUuXG4gICdjb2x1bW5zJyxcblxuICAvLyBzZXJ2aWNlIFtzdHJpbmddOiBKRUUgc2VydmljZSBwYXRoLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NlcnZpY2UnLFxuXG4gIC8vIHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBzaG93cyBlZGl0IGZvcm0gYWZ0ZXIgZWRpdCBhIHJlY29yZC4gRGVmYXVsdDogZmFsc2U7XG4gICdzdGF5SW5SZWNvcmRBZnRlckVkaXQ6IHN0YXktaW4tcmVjb3JkLWFmdGVyLWVkaXQnLFxuXG4gIC8vIFtzdHJpbmddW25ldyB8IGRldGFpbF06IHNob3dzIHJlc2V0ZWQgZm9ybSBhZnRlciBpbnNlcnQgYSBuZXcgcmVjb3JkIChuZXcpIG9yIHNob3dzIHRoZSBpbnNlcnRlZCByZWNvcmQgYWZ0ZXIgKGRldGFpbClcbiAgJ2FmdGVySW5zZXJ0TW9kZTogYWZ0ZXItaW5zZXJ0LW1vZGUnLFxuXG4gICdzZXJ2aWNlVHlwZSA6IHNlcnZpY2UtdHlwZScsXG5cbiAgJ3F1ZXJ5T25Jbml0IDogcXVlcnktb24taW5pdCcsXG5cbiAgJ3BhcmVudEtleXM6IHBhcmVudC1rZXlzJyxcblxuICAvLyBxdWVyeS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gcXVlcmllcy4gRGVmYXVsdDogcXVlcnkuXG4gICdxdWVyeU1ldGhvZDogcXVlcnktbWV0aG9kJyxcblxuICAvLyBpbnNlcnQtbWV0aG9kIFtzdHJpbmddOiBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCB0byBwZXJmb3JtIGluc2VydHMuIERlZmF1bHQ6IGluc2VydC5cbiAgJ2luc2VydE1ldGhvZDogaW5zZXJ0LW1ldGhvZCcsXG5cbiAgLy8gdXBkYXRlLW1ldGhvZCBbc3RyaW5nXTogbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QgdG8gcGVyZm9ybSB1cGRhdGVzLiBEZWZhdWx0OiB1cGRhdGUuXG4gICd1cGRhdGVNZXRob2Q6IHVwZGF0ZS1tZXRob2QnLFxuXG4gIC8vIGRlbGV0ZS1tZXRob2QgW3N0cmluZ106IG5hbWUgb2YgdGhlIHNlcnZpY2UgbWV0aG9kIHRvIHBlcmZvcm0gZGVsZXRpb25zLiBEZWZhdWx0OiBkZWxldGUuXG4gICdkZWxldGVNZXRob2Q6IGRlbGV0ZS1tZXRob2QnLFxuXG4gIC8vIGxheW91dC1kaXJlY3Rpb24gW3N0cmluZ11bY29sdW1ufHJvd106IERlZmF1bHQ6IGNvbHVtblxuICAnbGF5b3V0RGlyZWN0aW9uOiBsYXlvdXQtZGlyZWN0aW9uJyxcblxuICAvLyBmeExheW91dEFsaWduIHZhbHVlLiBEZWZhdWx0OiAnc3RhcnQgc3RhcnQnXG4gICdsYXlvdXRBbGlnbjogbGF5b3V0LWFsaWduJyxcblxuICAvLyBlZGl0YWJsZS1kZXRhaWwgW3N0cmluZ11beWVzfG5vfHRydWV8ZmFsc2VdOiBEZWZhdWx0OiB0cnVlO1xuICAnZWRpdGFibGVEZXRhaWw6IGVkaXRhYmxlLWRldGFpbCcsXG5cbiAgLy8ga2V5cy1zcWwtdHlwZXMgW3N0cmluZ106IGVudGl0eSBrZXlzIHR5cGVzLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2tleXNTcWxUeXBlczoga2V5cy1zcWwtdHlwZXMnLFxuXG4gIC8vIHVuZG8tYnV0dG9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogSW5jbHVkZSB1bmRvIGJ1dHRvbiBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IHRydWU7XG4gICd1bmRvQnV0dG9uOiB1bmRvLWJ1dHRvbicsXG5cbiAgLy8gc2hvdy1oZWFkZXItbmF2aWdhdGlvbiBbc3RyaW5nXVt5ZXN8bm98dHJ1ZXxmYWxzZV06IEluY2x1ZGUgbmF2aWdhdGlvbnMgYnV0dG9ucyBpbiBmb3JtLXRvb2xiYXIuIERlZmF1bHQ6IGZhbHNlO1xuICAnc2hvd0hlYWRlck5hdmlnYXRpb246IHNob3ctaGVhZGVyLW5hdmlnYXRpb24nLFxuXG4gIC8vIGF0dHJcbiAgJ29hdHRyOmF0dHInLFxuXG4gICdpbmNsdWRlQnJlYWRjcnVtYjogaW5jbHVkZS1icmVhZGNydW1iJyxcblxuICAnZGV0ZWN0Q2hhbmdlc09uQmx1cjogZGV0ZWN0LWNoYW5nZXMtb24tYmx1cicsXG5cbiAgJ2NvbmZpcm1FeGl0OiBjb25maXJtLWV4aXQnLFxuXG4gIC8vIGlnbm9yZS1vbi1leGl0IFtzdHJpbmddOiBmaWVsZHMgYXR0cidzIHRoYXQgd2lsbCBiZSBpZ25vcmVkIHdoZW4gdGhlIGZvcm0gaXMgY2xvc2VkLCBzZXBhcmF0ZWQgYnkgJzsnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ2lnbm9yZU9uRXhpdDogaWdub3JlLW9uLWV4aXQnLFxuXG4gIC8vIFtmdW5jdGlvbl06IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gcXVlcnkgZXJyb3IuIERlZmF1bHQ6IG5vIHZhbHVlLlxuICAncXVlcnlGYWxsYmFja0Z1bmN0aW9uOiBxdWVyeS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2luc2VydEZhbGxiYWNrRnVuY3Rpb246IGluc2VydC1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ3VwZGF0ZUZhbGxiYWNrRnVuY3Rpb246IHVwZGF0ZS1mYWxsYmFjay1mdW5jdGlvbicsXG5cbiAgLy8gJ2RlbGV0ZUZhbGxiYWNrRnVuY3Rpb246IGRlbGV0ZS1mYWxsYmFjay1mdW5jdGlvbidcblxuICAvLyBpZ25vcmUtZGVmYXVsdC1uYXZpZ2F0aW9uIFtzdHJpbmddW3llc3xub3x0cnVlfGZhbHNlXTogaWdub3JlIGRlZmF1bHQgbmF2aWdhdGlvbiB3aGVuIHVzZXIgY2xpY2sgdGhlIHRvb2xiYXIgYnV0dG9ucy4gRGVmYXVsdDogbm8uXG4gICdpZ25vcmVEZWZhdWx0TmF2aWdhdGlvbjogaWdub3JlLWRlZmF1bHQtbmF2aWdhdGlvbicsXG5cbiAgJ21lc3NhZ2VTZXJ2aWNlVHlwZSA6IG1lc3NhZ2Utc2VydmljZS10eXBlJyxcbiAgLy8gIGNvbmZpZ3VyZS1zZXJ2aWNlLWFyZ3MgW09Db25maWd1cmVTZXJ2aWNlQXJnc106IEFsbG93cyBjb25maWd1cmUgc2VydmljZSAuXG4gICdjb25maWd1cmVTZXJ2aWNlQXJnczogY29uZmlndXJlLXNlcnZpY2UtYXJncycsXG4gIC8vc2V0LXZhbHVlLW9yZGVyOiBvcmRlciBvZiB0aGUgZmllbGQgYXR0cmlidXRlcyBieSB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQsIHNlcGFyYXRlZCBieSAnOyAnLiBEZWZhdWx0OiBubyB2YWx1ZS5cbiAgJ3NldFZhbHVlT3JkZXI6IHNldC12YWx1ZS1vcmRlcicsXG5cbiAgLy9mb3JtLWRhdGEtdmFsaWRhdGlvbjogRXhlY3V0ZXMgdGhlIGJlZm9yZS1zYXZlIHZhbGlkYXRpb24gY2FsbGJhY2sgZm9yIGluc2VydCBhbmQgdXBkYXRlIG9wZXJhdGlvbnNcbiAgJ2Zvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uOiBmb3JtLWRhdGEtdmFsaWRhdGlvbi1mdW5jdGlvbidcbl07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09VVFBVVFNfT19GT1JNID0gW1xuICAnb25EYXRhTG9hZGVkJyxcbiAgJ2JlZm9yZUNsb3NlRGV0YWlsJyxcbiAgJ2JlZm9yZUdvRWRpdE1vZGUnLFxuICAnb25Gb3JtTW9kZUNoYW5nZScsXG4gICdvbkJlZm9yZUluc2VydCcsXG4gICdvbkJlZm9yZVVwZGF0ZScsXG4gICdvbkJlZm9yZURlbGV0ZScsXG4gICdvbkluc2VydCcsXG4gICdvblVwZGF0ZScsXG4gICdvbkRlbGV0ZScsXG4gICdiZWZvcmVJbnNlcnRNb2RlJyxcbiAgJ2JlZm9yZVVwZGF0ZU1vZGUnLFxuICAnYmVmb3JlSW5pdGlhbE1vZGUnLFxuICAnb25JbnNlcnRNb2RlJyxcbiAgJ29uVXBkYXRlTW9kZScsXG4gICdvbkluaXRpYWxNb2RlJyxcbiAgJ29uQ2FuY2VsJ1xuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnby1mb3JtJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBPRm9ybUJhc2UsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9Gb3JtQ29tcG9uZW50KSB9LFxuICAgIE9udGltaXplU2VydmljZVByb3ZpZGVyLFxuICAgIE9Gb3JtTWVzc2FnZVNlcnZpY2VcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL28tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL28tZm9ybS5jb21wb25lbnQuc2NzcyddLFxuICBpbnB1dHM6IERFRkFVTFRfSU5QVVRTX09fRk9STSxcbiAgb3V0cHV0czogREVGQVVMVF9PVVRQVVRTX09fRk9STSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDoge1xuICAgICdbY2xhc3Muby1mb3JtXSc6ICd0cnVlJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE9Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkNvbXBvbmVudERlYWN0aXZhdGUsIEFmdGVyVmlld0luaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9MQVlPVVRfRElSRUNUSU9OID0gJ2NvbHVtbic7XG4gIHB1YmxpYyBzdGF0aWMgZ3VhcmRDbGFzc05hbWUgPSAnQ2FuRGVhY3RpdmF0ZUZvcm1HdWFyZCc7XG5cbiAgLyogaW5wdXRzIHZhcmlhYmxlcyAqL1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIGhlYWRlck1vZGU6IHN0cmluZyA9ICdmbG9hdGluZyc7XG4gIGhlYWRlclBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nID0gJ3RvcCc7XG4gIGxhYmVsaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgbGFiZWxIZWFkZXJBbGlnbjogc3RyaW5nID0gJ2NlbnRlcic7XG4gIGhlYWRlcmFjdGlvbnM6IHN0cmluZyA9ICdhbGwnO1xuICBzaG93SGVhZGVyQWN0aW9uc1RleHQ6IHN0cmluZyA9ICd5ZXMnO1xuICBlbnRpdHk6IHN0cmluZztcbiAga2V5czogc3RyaW5nID0gJyc7XG4gIGNvbHVtbnM6IHN0cmluZyA9ICcnO1xuICBzZXRWYWx1ZU9yZGVyOiBzdHJpbmcgPSAnJztcbiAgc2VydmljZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc3RheUluUmVjb3JkQWZ0ZXJFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIGFmdGVySW5zZXJ0TW9kZTogJ25ldycgfCAnZGV0YWlsJyB8ICdjbG9zZScgPSAnY2xvc2UnO1xuICBzZXJ2aWNlVHlwZTogc3RyaW5nO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgcHJvdGVjdGVkIHF1ZXJ5T25Jbml0OiBib29sZWFuID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHBhcmVudEtleXM6IHN0cmluZztcbiAgcHJvdGVjdGVkIGdldE1ldGhvZDogc3RyaW5nID0gXCJcIlxuICBwcm90ZWN0ZWQgcXVlcnlNZXRob2Q6IHN0cmluZyA9IENvZGVzLlFVRVJZQllJRF9NRVRIT0Q7XG4gIHByb3RlY3RlZCBpbnNlcnRNZXRob2Q6IHN0cmluZyA9IENvZGVzLklOU0VSVF9NRVRIT0Q7XG4gIHByb3RlY3RlZCB1cGRhdGVNZXRob2Q6IHN0cmluZyA9IENvZGVzLlVQREFURV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBkZWxldGVNZXRob2Q6IHN0cmluZyA9IENvZGVzLkRFTEVURV9NRVRIT0Q7XG4gIHByb3RlY3RlZCBfbGF5b3V0RGlyZWN0aW9uOiBzdHJpbmcgPSBPRm9ybUNvbXBvbmVudC5ERUZBVUxUX0xBWU9VVF9ESVJFQ1RJT047XG4gIHByb3RlY3RlZCBfbGF5b3V0QWxpZ246IHN0cmluZyA9ICdzdGFydCBzdHJldGNoJztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHByb3RlY3RlZCBlZGl0YWJsZURldGFpbDogYm9vbGVhbiA9IHRydWU7XG4gIHByb3RlY3RlZCBrZXlzU3FsVHlwZXM6IHN0cmluZztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHVuZG9CdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuICBAQm9vbGVhbklucHV0Q29udmVydGVyKClcbiAgc2hvd0hlYWRlck5hdmlnYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIG9hdHRyOiBzdHJpbmcgPSAnJztcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGluY2x1ZGVCcmVhZGNydW1iOiBib29sZWFuID0gZmFsc2U7XG4gIEBCb29sZWFuSW5wdXRDb252ZXJ0ZXIoKVxuICBkZXRlY3RDaGFuZ2VzT25CbHVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIGNvbmZpcm1FeGl0OiBib29sZWFuID0gdHJ1ZTtcblxuICBzZXRWYWx1ZU9yZGVyQXJyYXk6IHN0cmluZ1tdO1xuXG4gIHNldCBpZ25vcmVPbkV4aXQodmFsOiBzdHJpbmdbXSkge1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsID0gVXRpbC5wYXJzZUFycmF5KHZhbCwgdHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2lnbm9yZU9uRXhpdCA9IHZhbDtcbiAgfVxuICBnZXQgaWdub3JlT25FeGl0KCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlT25FeGl0O1xuICB9XG4gIHByb3RlY3RlZCBfaWdub3JlT25FeGl0OiBzdHJpbmdbXTtcbiAgcHVibGljIHF1ZXJ5RmFsbGJhY2tGdW5jdGlvbjogKGVycm9yOiBhbnkpID0+IHZvaWQ7XG5cbiAgQEJvb2xlYW5JbnB1dENvbnZlcnRlcigpXG4gIHB1YmxpYyBpZ25vcmVEZWZhdWx0TmF2aWdhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBtZXNzYWdlU2VydmljZVR5cGU6IHN0cmluZztcbiAgcHVibGljIGZvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uOiAoZGF0YTogYW55KSA9PiBPRm9ybVZhbGlkYXRpb247XG5cbiAgLyogZW5kIG9mIGlucHV0cyB2YXJpYWJsZXMgKi9cblxuICAvKnBhcnNlZCBpbnB1dHMgdmFyaWFibGVzICovXG4gIGlzRGV0YWlsRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBrZXlzQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIGNvbHNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgZGF0YVNlcnZpY2U6IEJhc2VTZXJ2aWNlPFNlcnZpY2VSZXNwb25zZT47XG4gIF9wS2V5c0VxdWl2ID0ge307XG4gIGtleXNTcWxUeXBlc0FycmF5OiBBcnJheTxzdHJpbmc+ID0gW107XG4gIHByb3RlY3RlZCBfbWVzc2FnZVNlcnZpY2U6IE9Gb3JtTWVzc2FnZVNlcnZpY2U7XG4gIC8qIGVuZCBvZiBwYXJzZWQgaW5wdXRzIHZhcmlhYmxlcyAqL1xuXG4gIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cDtcbiAgb25EYXRhTG9hZGVkOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xuICBiZWZvcmVDbG9zZURldGFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYmVmb3JlVXBkYXRlTW9kZWAgaW5zdGVhZFxuICAgKi9cbiAgYmVmb3JlR29FZGl0TW9kZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgYmVmb3JlSW5zZXJ0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgYmVmb3JlVXBkYXRlTW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgYmVmb3JlSW5pdGlhbE1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPG51bGw+KCk7XG4gIG9uSW5zZXJ0TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcbiAgb25VcGRhdGVNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkluaXRpYWxNb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxudWxsPigpO1xuICBvbkZvcm1Nb2RlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBwdWJsaWMgb25CZWZvcmVJbnNlcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25CZWZvcmVVcGRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25CZWZvcmVEZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25JbnNlcnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25VcGRhdGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25EZWxldGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwdWJsaWMgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwcm90ZWN0ZWQgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGxvYWRpbmc6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmxvYWRpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwdWJsaWMgZm9ybURhdGE6IG9iamVjdCA9IHt9O1xuICBwdWJsaWMgbmF2aWdhdGlvbkRhdGE6IEFycmF5PGFueT4gPSBbXTtcbiAgcHVibGljIGN1cnJlbnRJbmRleCA9IDA7XG4gIHB1YmxpYyBtb2RlOiBudW1iZXIgPSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDtcblxuICBwcm90ZWN0ZWQgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZTtcbiAgcHJvdGVjdGVkIG5hdmlnYXRpb25TZXJ2aWNlOiBOYXZpZ2F0aW9uU2VydmljZTtcbiAgcHJvdGVjdGVkIHNuYWNrQmFyU2VydmljZTogU25hY2tCYXJTZXJ2aWNlO1xuXG4gIHByb3RlY3RlZCBfZm9ybVRvb2xiYXI6IE9Gb3JtVG9vbGJhckJhc2U7XG5cbiAgcHJvdGVjdGVkIF9jb21wb25lbnRzOiBJRm9ybURhdGFDb21wb25lbnRIYXNoID0ge307XG4gIHByb3RlY3RlZCBfY29tcFNRTFR5cGVzOiBvYmplY3QgPSB7fTtcblxuICBmb3JtUGFyZW50S2V5c1ZhbHVlczogb2JqZWN0O1xuXG4gIHB1YmxpYyBvbkZvcm1Jbml0U3RyZWFtOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIHByb3RlY3RlZCByZWxvYWRTdHJlYW06IE9ic2VydmFibGU8YW55PjtcbiAgcHJvdGVjdGVkIHJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBxdWVyeVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcm90ZWN0ZWQgbG9hZGVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByb3RlY3RlZCBkeW5hbWljRm9ybVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIHByb3RlY3RlZCBkZWFjdGl2YXRlR3VhcmQ6IENhbkRlYWN0aXZhdGVGb3JtR3VhcmQ7XG4gIHB1YmxpYyBkZWFjdGl2YXRlR3VhcmRJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZm9ybUNhY2hlOiBPRm9ybUNhY2hlQ2xhc3M7XG4gIHByb3RlY3RlZCBmb3JtTmF2aWdhdGlvbjogT0Zvcm1OYXZpZ2F0aW9uQ2xhc3M7XG5cbiAgcHVibGljIGZvcm1Db250YWluZXI6IE9Gb3JtQ29udGFpbmVyQ29tcG9uZW50O1xuXG4gIHByb3RlY3RlZCBwZXJtaXNzaW9uc1NlcnZpY2U6IFBlcm1pc3Npb25zU2VydmljZTtcbiAgcHJvdGVjdGVkIHBlcm1pc3Npb25zOiBPRm9ybVBlcm1pc3Npb25zO1xuXG4gIEBWaWV3Q2hpbGQoJ2lubmVyRm9ybScpIGlubmVyRm9ybUVsOiBFbGVtZW50UmVmO1xuXG4gIGlnbm9yZUZvcm1DYWNoZUtleXM6IEFycmF5PGFueT4gPSBbXTtcbiAgY2FuRGlzY2FyZENoYW5nZXM6IGJvb2xlYW47XG5cbiAgcHVibGljIHN0YXRpYyBNb2RlKCk6IGFueSB7XG4gICAgZW51bSBtIHtcbiAgICAgIFFVRVJZLFxuICAgICAgSU5TRVJULFxuICAgICAgVVBEQVRFLFxuICAgICAgSU5JVElBTFxuICAgIH1cbiAgICByZXR1cm4gbTtcbiAgfVxuICBwcm90ZWN0ZWQgY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFjdFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZWxSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG5cbiAgICB0aGlzLmZvcm1DYWNoZSA9IG5ldyBPRm9ybUNhY2hlQ2xhc3ModGhpcyk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbiA9IG5ldyBPRm9ybU5hdmlnYXRpb25DbGFzcyh0aGlzLmluamVjdG9yLCB0aGlzLCB0aGlzLnJvdXRlciwgdGhpcy5hY3RSb3V0ZSk7XG5cbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQ8RGlhbG9nU2VydmljZT4oRGlhbG9nU2VydmljZSBhcyBUeXBlPERpYWxvZ1NlcnZpY2U+KTtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PE5hdmlnYXRpb25TZXJ2aWNlPihOYXZpZ2F0aW9uU2VydmljZSBhcyBUeXBlPE5hdmlnYXRpb25TZXJ2aWNlPik7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2UgPSBpbmplY3Rvci5nZXQ8U25hY2tCYXJTZXJ2aWNlPihTbmFja0JhclNlcnZpY2UgYXMgVHlwZTxTbmFja0JhclNlcnZpY2U+KTtcbiAgICB0aGlzLnBlcm1pc3Npb25zU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0PFBlcm1pc3Npb25zU2VydmljZT4oUGVybWlzc2lvbnNTZXJ2aWNlIGFzIFR5cGU8UGVybWlzc2lvbnNTZXJ2aWNlPik7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLnJlbG9hZFN0cmVhbSA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgc2VsZi5vbkZvcm1Jbml0U3RyZWFtLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgc2VsZi5mb3JtTmF2aWdhdGlvbi5uYXZpZ2F0aW9uU3RyZWFtLmFzT2JzZXJ2YWJsZSgpXG4gICAgXSk7XG5cbiAgICB0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbiA9IHRoaXMucmVsb2FkU3RyZWFtLnN1YnNjcmliZSh2YWxBcnIgPT4ge1xuICAgICAgaWYgKFV0aWwuaXNBcnJheSh2YWxBcnIpICYmIHZhbEFyci5sZW5ndGggPT09IDIgJiYgIXNlbGYuaXNJbkluc2VydE1vZGUoKSkge1xuICAgICAgICBjb25zdCB2YWxBcnJWYWx1ZXMgPSB2YWxBcnJbMF0gPT09IHRydWUgJiYgdmFsQXJyWzFdID09PSB0cnVlO1xuICAgICAgICBpZiAoc2VsZi5xdWVyeU9uSW5pdCAmJiB2YWxBcnJWYWx1ZXMpIHtcbiAgICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLmluaXRpYWxpemVGaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZm9ybUNvbnRhaW5lciA9IGluamVjdG9yLmdldChPRm9ybUNvbnRhaW5lckNvbXBvbmVudCk7XG4gICAgICB0aGlzLmZvcm1Db250YWluZXIuc2V0Rm9ybSh0aGlzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL1xuICAgIH1cbiAgICB0aGlzLmdldEdsb2JhbENvbmZpZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHbG9iYWxDb25maWcoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9Gb3JtR2xvYmFsQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQoT19GT1JNX0dMT0JBTF9DT05GSUcpO1xuICAgICAgaWYgKFV0aWwuaXNEZWZpbmVkKG9Gb3JtR2xvYmFsQ29uZmlnLmhlYWRlckFjdGlvbnMpKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyYWN0aW9ucyA9IG9Gb3JtR2xvYmFsQ29uZmlnLmhlYWRlckFjdGlvbnM7XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgYmVjYXVzZSBpcyBvcHRpb25hbFxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyRm9ybUNvbXBvbmVudChjb21wOiBhbnkpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcblxuICAgICAgICBpZiAoIWNvbXAuaXNBdXRvbWF0aWNSZWdpc3RlcmluZygpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoYXR0cikpIHtcbiAgICAgICAgICBjb21wLnJlcGVhdGVkQXR0ciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgaXMgYWxyZWFkeSBhIGNvbXBvbmVudCByZWdpc3RlcmVkIGluIHRoZSBmb3JtIHdpdGggdGhlIGF0dHI6ICcgKyBhdHRyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb21wb25lbnRzW2F0dHJdID0gY29tcDtcbiAgICAgICAgLy8gU2V0dGluZyBwYXJlbnQga2V5IHZhbHVlcy4uLlxuICAgICAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcyAmJiB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzW2F0dHJdO1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUodmFsLCB7XG4gICAgICAgICAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qXG4gICAgICAgICogVE9ETy4gQ2hlY2sgaXQhISFcbiAgICAgICAgKiBFbiB1biBmb3JtdWxhcmlvIGNvbiB0YWJzLCBjdWFuZG8gc2UgY2FtYmlhIGRlIHVubyBhIG90cm8sIHNlIGRlc3RydXllbiBsYXMgdmlzdGFzXG4gICAgICAgICogZGUgbG9zIGNvbXBvbmVudGVzIGhpam8gZGVsIGZvcm11bGFyaW8uXG4gICAgICAgICogZm9ybURhdGFDYWNoZSBjb250aWVuZSBsb3MgdmFsb3JlcyAob3JpZ2luYWxlcyDDsyBlZGl0YWRvcykgZGUgbG9zIGNhbXBvcyBkZWwgZm9ybXVsYXJpby5cbiAgICAgICAgKiBMYSBpZGVhIGVzIGFzaWduYXIgZXNlIHZhbG9yIGFsIGNhbXBvIGN1YW5kbyBzZSByZWdpc3RyZSBkZSBudWV2byAoSGF5IHF1ZSBhc2VndXJhciBlbCBwcm9jZXNvXG4gICAgICAgICogcGFyYSBxdWUgc8OzbG8gc2VhIGN1YW5kbyBzZSByZWdpc3RyYSBkZSBudWV2byA7KSApXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IGNhY2hlZFZhbHVlID0gdGhpcy5mb3JtQ2FjaGUuZ2V0Q2FjaGVkVmFsdWUoYXR0cik7XG4gICAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChjYWNoZWRWYWx1ZSkgJiYgdGhpcy5nZXREYXRhVmFsdWVzKCkgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgIHRoaXMuX2NvbXBvbmVudHNbYXR0cl0uc2V0VmFsdWUoY2FjaGVkVmFsdWUsIHtcbiAgICAgICAgICAgIGVtaXRNb2RlbFRvVmlld0NoYW5nZTogZmFsc2UsXG4gICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlclNRTFR5cGVGb3JtQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YVR5cGVDb21wb25lbnQpIHtcbiAgICBpZiAoKGNvbXAgYXMgYW55KS5yZXBlYXRlZEF0dHIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBjb21wLmdldFNRTFR5cGUoKTtcbiAgICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgICAgaWYgKHR5cGUgIT09IFNRTFR5cGVzLk9USEVSICYmIGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwICYmIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5pbmRleE9mKGF0dHIpID09PSAtMSkge1xuICAgICAgICAvLyBSaWdodCBub3cganVzdCBzdG9yZSB2YWx1ZXMgZGlmZmVyZW50IG9mICdPVEhFUidcbiAgICAgICAgdGhpcy5fY29tcFNRTFR5cGVzW2F0dHJdID0gdHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlckZvcm1Db250cm9sQ29tcG9uZW50KGNvbXA6IElGb3JtRGF0YUNvbXBvbmVudCkge1xuICAgIGlmICgoY29tcCBhcyBhbnkpLnJlcGVhdGVkQXR0cikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gY29tcC5nZXRDb250cm9sKCk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAucmVnaXN0ZXJDb250cm9sKGF0dHIsIGNvbnRyb2wpO1xuICAgICAgICAgIGlmICghY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaWdub3JlRm9ybUNhY2hlS2V5cy5wdXNoKGNvbXAuZ2V0QXR0cmlidXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJGb3JtQ29tcG9uZW50KGNvbXA6IElDb21wb25lbnQpIHtcbiAgICBpZiAoY29tcCkge1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoYXR0ciAmJiBhdHRyLmxlbmd0aCA+IDAgJiYgdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5fY29tcG9uZW50c1thdHRyXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5vYXR0cikge1xuICAgICAgcmV0dXJuIHRoaXMub2F0dHI7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB1bnJlZ2lzdGVyRm9ybUNvbnRyb2xDb21wb25lbnQoY29tcDogSUZvcm1EYXRhQ29tcG9uZW50KSB7XG4gICAgaWYgKGNvbXAgJiYgY29tcC5pc0F1dG9tYXRpY1JlZ2lzdGVyaW5nKCkpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbCA9IGNvbXAuZ2V0Q29udHJvbCgpO1xuICAgICAgY29uc3QgYXR0ciA9IGNvbXAuZ2V0QXR0cmlidXRlKCk7XG4gICAgICBpZiAoY29udHJvbCAmJiBhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5yZW1vdmVDb250cm9sKGF0dHIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVucmVnaXN0ZXJTUUxUeXBlRm9ybUNvbXBvbmVudChjb21wOiBJRm9ybURhdGFUeXBlQ29tcG9uZW50KSB7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbnN0IGF0dHIgPSBjb21wLmdldEF0dHJpYnV0ZSgpO1xuICAgICAgaWYgKGF0dHIgJiYgYXR0ci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jb21wU1FMVHlwZXNbYXR0cl07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUb29sYmFyKGZUb29sYmFyOiBPRm9ybVRvb2xiYXJDb21wb25lbnQpIHtcbiAgICBpZiAoZlRvb2xiYXIpIHtcbiAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyID0gZlRvb2xiYXI7XG4gICAgICB0aGlzLl9mb3JtVG9vbGJhci5pc0RldGFpbCA9IHRoaXMuaXNEZXRhaWxGb3JtO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudHMoKTogSUZvcm1EYXRhQ29tcG9uZW50SGFzaCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudHM7XG4gIH1cblxuICBnZXRDb21wb25lbnRCeUF0dHIoYXR0cjpzdHJpbmcpOiBJRm9ybURhdGFDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzW2F0dHJdO1xuICB9XG5cblxuICBwdWJsaWMgbG9hZCgpOiBhbnkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIGNvbnN0IGxvYWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQodHJ1ZSk7XG4gICAgICB9LCAyNTApO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHNlbGYubG9hZGluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgIH0pO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGxvYWRPYnNlcnZhYmxlLnN1YnNjcmliZSh2YWwgPT4ge1xuICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBzZWxmLmxvYWRpbmdTdWJqZWN0Lm5leHQodmFsIGFzIGJvb2xlYW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldERhdGFWYWx1ZShhdHRyOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc0luSW5zZXJ0TW9kZSgpKSB7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSB0aGlzLmZvcm1OYXZpZ2F0aW9uLmdldEZpbHRlckZyb21VcmxQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZm9ybUdyb3VwLnZhbHVlW2F0dHJdIHx8IHVybFBhcmFtc1thdHRyXTtcbiAgICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0luSW5pdGlhbE1vZGUoKSAmJiAhdGhpcy5pc0VkaXRhYmxlRGV0YWlsKCkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1EYXRhO1xuICAgICAgaWYgKGRhdGEgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICByZXR1cm4gZGF0YVthdHRyXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJblVwZGF0ZU1vZGUoKSB8fCB0aGlzLmlzRWRpdGFibGVEZXRhaWwoKSkge1xuICAgICAgaWYgKHRoaXMuZm9ybURhdGEgJiYgT2JqZWN0LmtleXModGhpcy5mb3JtRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZvcm1DYWNoZS5nZXRDYWNoZWRWYWx1ZShhdHRyKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwLmRpcnR5ICYmIHZhbCkge1xuICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBPRm9ybVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IE9Gb3JtVmFsdWUodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gb3JpZ2luYWwgdmFsdWUgc3RvcmVkIGludG8gZm9ybSBkYXRhLi4uXG4gICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybURhdGE7XG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFbYXR0cl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgT0Zvcm1WYWx1ZSgpO1xuICB9XG5cbiAgZ2V0RGF0YVZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGZvcm0gZGF0YS4gVGhlIGRhdGEgcmVsYXRlZCB0byB1cmwgcGFyYW1zIGFuZCBwYXJlbnQga2V5cyByZW1haW4gdW5jaGFuZ2VkLlxuICAgKi9cbiAgY2xlYXJEYXRhKCkge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZm9ybU5hdmlnYXRpb24uZ2V0RmlsdGVyRnJvbVVybFBhcmFtcygpO1xuICAgIHRoaXMuZm9ybUdyb3VwLnJlc2V0KHt9LCB7XG4gICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgfSk7XG4gICAgdGhpcy5zZXREYXRhKGZpbHRlcik7XG4gIH1cblxuICBjYW5EZWFjdGl2YXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgY29uc3QgcmVhZE9ubHkgPSB0aGlzLmlzSW5Jbml0aWFsTW9kZSgpICYmICF0aGlzLmlzRWRpdGFibGVEZXRhaWwoKTtcbiAgICBjb25zdCBjYW5jZWxsZWRFZGl0aW9uID0gdGhpcy5pc0luVXBkYXRlTW9kZSgpICYmIHRoaXMuX2Zvcm1Ub29sYmFyICYmICF0aGlzLl9mb3JtVG9vbGJhci5lZGl0TW9kZTtcbiAgICBpZiAocmVhZE9ubHkgfHwgY2FuY2VsbGVkRWRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbmZpcm1FeGl0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgY2FuRGlzY2FyZENoYW5nZXMgPSAhIXRoaXMuY2FuRGlzY2FyZENoYW5nZXM7XG4gICAgdGhpcy5jYW5EaXNjYXJkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIHJldHVybiBjYW5EaXNjYXJkQ2hhbmdlcyB8fCB0aGlzLnNob3dDb25maXJtRGlzY2FyZENoYW5nZXMoKTtcbiAgfVxuXG4gIHNob3dDb25maXJtRGlzY2FyZENoYW5nZXMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybU5hdmlnYXRpb24uc2hvd0NvbmZpcm1EaXNjYXJkQ2hhbmdlcyh0aGlzLmlnbm9yZU9uRXhpdCk7XG4gIH1cblxuICBleGVjdXRlVG9vbGJhckFjdGlvbihhY3Rpb246IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICBjYXNlIENvZGVzLkJBQ0tfQUNUSU9OOiB0aGlzLmJhY2sob3B0aW9ucyk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5DTE9TRV9ERVRBSUxfQUNUSU9OOiB0aGlzLmNsb3NlRGV0YWlsKG9wdGlvbnMpOyBicmVhaztcbiAgICAgIGNhc2UgQ29kZXMuUkVMT0FEX0FDVElPTjogdGhpcy5yZWxvYWQodHJ1ZSk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5HT19JTlNFUlRfQUNUSU9OOiB0aGlzLmdvSW5zZXJ0TW9kZShvcHRpb25zKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLklOU0VSVF9BQ1RJT046IHRoaXMuaW5zZXJ0KCk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5HT19FRElUX0FDVElPTjogdGhpcy5nb0VkaXRNb2RlKCk7IGJyZWFrO1xuICAgICAgY2FzZSBDb2Rlcy5FRElUX0FDVElPTjogdGhpcy51cGRhdGUoKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLlVORE9fTEFTVF9DSEFOR0VfQUNUSU9OOiB0aGlzLnVuZG8oKTsgYnJlYWs7XG4gICAgICBjYXNlIENvZGVzLkRFTEVURV9BQ1RJT046IHJldHVybiB0aGlzLmRlbGV0ZSgpO1xuICAgICAgZGVmYXVsdDogYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZERlYWN0aXZhdGVHdWFyZCgpO1xuXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XG5cbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgYWRkRGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIGlmICghdGhpcy5hY3RSb3V0ZSB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRlYWN0aXZhdGVHdWFyZCA9IHRoaXMuaW5qZWN0b3IuZ2V0KENhbkRlYWN0aXZhdGVGb3JtR3VhcmQpO1xuICAgIHRoaXMuZGVhY3RpdmF0ZUd1YXJkLmFkZEZvcm0odGhpcyk7XG4gICAgY29uc3QgY2FuRGVhY3RpdmF0ZUFycmF5ID0gKHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSB8fCBbXSk7XG4gICAgbGV0IHByZXZpb3VzbHlBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjYW5EZWFjdGl2YXRlQXJyYXkubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHByZXZpb3VzbHlBZGRlZCA9ICgoY2FuRGVhY3RpdmF0ZUFycmF5W2ldLmhhc093blByb3BlcnR5KCdDTEFTU05BTUUnKSAmJiBjYW5EZWFjdGl2YXRlQXJyYXlbaV0uQ0xBU1NOQU1FKSA9PT0gT0Zvcm1Db21wb25lbnQuZ3VhcmRDbGFzc05hbWUpO1xuICAgICAgaWYgKHByZXZpb3VzbHlBZGRlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFwcmV2aW91c2x5QWRkZWQpIHtcbiAgICAgIGNhbkRlYWN0aXZhdGVBcnJheS5wdXNoKHRoaXMuZGVhY3RpdmF0ZUd1YXJkLmNvbnN0cnVjdG9yKTtcbiAgICAgIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZSA9IGNhbkRlYWN0aXZhdGVBcnJheTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95RGVhY3RpdmF0ZUd1YXJkKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oYXNEZWFjdGl2YXRlR3VhcmQoKSkge1xuICAgICAgICB0aGlzLmRlYWN0aXZhdGVHdWFyZC5yZW1vdmVGb3JtKHRoaXMpO1xuICAgICAgICBpZiAoIXRoaXMuZGVhY3RpdmF0ZUd1YXJkLmlzRm9ybXNDYWNoZUVtcHR5KCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5hY3RSb3V0ZSB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZyB8fCAhdGhpcy5hY3RSb3V0ZS5yb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGd1YXJkSW5kZXggPSB0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuZmluZEluZGV4KChjYW5EZWFjdGl2YXRlKSA9PiBjYW5EZWFjdGl2YXRlLm5hbWUgPT09IE9Gb3JtQ29tcG9uZW50Lmd1YXJkQ2xhc3NOYW1lKVxuICAgICAgaWYgKGd1YXJkSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLmFjdFJvdXRlLnJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuc3BsaWNlKGd1YXJkSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuYWN0Um91dGUucm91dGVDb25maWcuY2FuRGVhY3RpdmF0ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL1xuICAgIH1cbiAgfVxuXG4gIGhhc0RlYWN0aXZhdGVHdWFyZCgpIHtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQodGhpcy5kZWFjdGl2YXRlR3VhcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgbWV0aG9kc1xuICAgKi9cblxuICBpbml0aWFsaXplKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLmhlYWRlcmFjdGlvbnMgPT09ICdhbGwnKSB7XG4gICAgICB0aGlzLmhlYWRlcmFjdGlvbnMgPSAnUjtJO1U7RCc7XG4gICAgfVxuICAgIHRoaXMua2V5c0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMua2V5cywgdHJ1ZSk7XG4gICAgdGhpcy5jb2xzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5jb2x1bW5zLCB0cnVlKTtcbiAgICBjb25zdCBwa0FycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMucGFyZW50S2V5cyk7XG4gICAgdGhpcy5fcEtleXNFcXVpdiA9IFV0aWwucGFyc2VQYXJlbnRLZXlzRXF1aXZhbGVuY2VzKHBrQXJyYXkpO1xuICAgIHRoaXMua2V5c1NxbFR5cGVzQXJyYXkgPSBVdGlsLnBhcnNlQXJyYXkodGhpcy5rZXlzU3FsVHlwZXMpO1xuICAgIHRoaXMuc2V0VmFsdWVPcmRlckFycmF5ID0gVXRpbC5wYXJzZUFycmF5KHRoaXMuc2V0VmFsdWVPcmRlcik7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVNlcnZpY2UoKTtcblxuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9RdWVyeVBhcmFtcygpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc3Vic2NyaWJlVG9VcmxQYXJhbXMoKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN1YnNjcmliZVRvVXJsKCk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5zdWJzY3JpYmVUb0NhY2hlQ2hhbmdlcygpO1xuXG4gICAgaWYgKHRoaXMubmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25WaXNpYmxlQ2hhbmdlKHZpc2libGUgPT4ge1xuICAgICAgICBzZWxmLnNob3dIZWFkZXIgPSB2aXNpYmxlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlID0gT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUw7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25zID0gdGhpcy5wZXJtaXNzaW9uc1NlcnZpY2UuZ2V0Rm9ybVBlcm1pc3Npb25zKHRoaXMub2F0dHIsIHRoaXMuYWN0Um91dGUpO1xuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnF1ZXJ5RmFsbGJhY2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy5pbnNlcnRGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLmluc2VydEZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy51cGRhdGVGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLnVwZGF0ZUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICAgIC8vIGlmICh0eXBlb2YgdGhpcy5kZWxldGVGYWxsYmFja0Z1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gICB0aGlzLmRlbGV0ZUZhbGxiYWNrRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG4gICAgLy8gfVxuICB9XG5cblxuICAvKipcbiAgICogUmVpbml0aWFsaXplIGZvcm0gYWRkaW5nIG9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIHJlaW5pdGlhbGl6ZShvcHRpb25zOiBPRm9ybUluaXRpYWxpemF0aW9uT3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCkge1xuICAgICAgY29uc3QgY2xvbmVkT3B0cyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wIGluIGNsb25lZE9wdHMpIHtcbiAgICAgICAgaWYgKGNsb25lZE9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICB0aGlzW3Byb3BdID0gY2xvbmVkT3B0c1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgICB9XG4gIH1cblxuICBjb25maWd1cmVTZXJ2aWNlKCkge1xuICAgIGNvbnN0IG1zZ0NvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlTWVzc2FnZVNlcnZpY2VBcmdzID0geyBpbmplY3RvcjogdGhpcy5pbmplY3RvciwgYmFzZVNlcnZpY2U6IE9Gb3JtTWVzc2FnZVNlcnZpY2UsIHNlcnZpY2VUeXBlOiB0aGlzLm1lc3NhZ2VTZXJ2aWNlVHlwZSB9O1xuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlID0gVXRpbC5jb25maWd1cmVNZXNzYWdlU2VydmljZShtc2dDb25maWd1cmVTZXJ2aWNlQXJncyk7XG5cbiAgICBsZXQgY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncyA9IHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IsIGJhc2VTZXJ2aWNlOiBPbnRpbWl6ZVNlcnZpY2UsIGVudGl0eTogdGhpcy5lbnRpdHksIHNlcnZpY2U6IHRoaXMuc2VydmljZSwgc2VydmljZVR5cGU6IHRoaXMuc2VydmljZVR5cGUgfTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5jb25maWd1cmVTZXJ2aWNlQXJncykpIHtcbiAgICAgIGNvbmZpZ3VyZVNlcnZpY2VBcmdzID0geyAuLi5jb25maWd1cmVTZXJ2aWNlQXJncywgLi4udGhpcy5jb25maWd1cmVTZXJ2aWNlQXJncyB9O1xuICAgIH1cbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gVXRpbC5jb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzKTtcbiAgfVxuXG4gIGdldCBtZXNzYWdlU2VydmljZSgpOiBPRm9ybU1lc3NhZ2VTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNlcnZpY2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3RyZWFtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN0cmVhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5xdWVyeVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybUNhY2hlLmRlc3Ryb3koKTtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLmRlc3Ryb3koKTtcbiAgICB0aGlzLmRlc3Ryb3lEZWFjdGl2YXRlR3VhcmQoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGV0ZXJtaW5hdGVGb3JtTW9kZSgpO1xuICAgICAgdGhpcy5vbkZvcm1Jbml0U3RyZWFtLmVtaXQodHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKlxuICAgKiBJbm5lciBtZXRob2RzXG4gICAqL1xuXG4gIF9zZXRDb21wb25lbnRzRWRpdGFibGUoc3RhdGU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb21wb25lbnRzOiBhbnkgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBPYmplY3Qua2V5cyhjb21wb25lbnRzKS5mb3JFYWNoKGNvbXBLZXkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wS2V5XTtcbiAgICAgIGNvbXBvbmVudC5pc1JlYWRPbmx5ID0gIXN0YXRlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZm9ybSBvcGVyYXRpb24gbW9kZS5cbiAgICogQHBhcmFtIG1vZGUgVGhlIG1vZGUgdG8gYmUgZXN0YWJsaXNoZWRcbiAgICovXG4gIHNldEZvcm1Nb2RlKG1vZGU6IG51bWJlcikge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDpcbiAgICAgICAgdGhpcy5iZWZvcmVJbml0aWFsTW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEluaXRpYWxNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKTtcbiAgICAgICAgdGhpcy5vbkZvcm1Nb2RlQ2hhbmdlLmVtaXQodGhpcy5tb2RlKTtcbiAgICAgICAgdGhpcy5vbkluaXRpYWxNb2RlLmVtaXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ6XG4gICAgICAgIHRoaXMuYmVmb3JlSW5zZXJ0TW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEluc2VydE1vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyRGF0YSgpO1xuICAgICAgICB0aGlzLl9zZXRDb21wb25lbnRzRWRpdGFibGUodHJ1ZSk7XG4gICAgICAgIHRoaXMub25Gb3JtTW9kZUNoYW5nZS5lbWl0KHRoaXMubW9kZSk7XG4gICAgICAgIHRoaXMub25JbnNlcnRNb2RlLmVtaXQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5VUERBVEU6XG4gICAgICAgIHRoaXMuYmVmb3JlVXBkYXRlTW9kZS5lbWl0KCk7XG4gICAgICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtVG9vbGJhcikge1xuICAgICAgICAgIHRoaXMuX2Zvcm1Ub29sYmFyLnNldEVkaXRNb2RlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICAgICAgICB0aGlzLm9uRm9ybU1vZGVDaGFuZ2UuZW1pdCh0aGlzLm1vZGUpO1xuICAgICAgICB0aGlzLm9uVXBkYXRlTW9kZS5lbWl0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuUVVFUlk6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Zvcm0gUVVFUlkgbW9kZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXRzIG5ldyBkYXRhIGZvciB0aGUgZm9ybVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKi9cbiAgc2V0RGF0YShkYXRhKTogdm9pZCB7XG4gICAgaWYgKFV0aWwuaXNBcnJheShkYXRhKSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPRm9ybUNvbXBvbmVudF0gRm9ybSBkYXRhIGhhcyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVjb3JkLiBTdG9yaW5nIGVtcHR5IGRhdGEnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnREYXRhID0gZGF0YS5sZW5ndGggPT09IDEgPyBkYXRhWzBdIDoge307XG4gICAgICB0aGlzLl91cGRhdGVGb3JtRGF0YSh0aGlzLnRvRm9ybVZhbHVlRGF0YShjdXJyZW50RGF0YSkpO1xuICAgICAgdGhpcy5fZW1pdERhdGEoY3VycmVudERhdGEpO1xuICAgIH0gZWxzZSBpZiAoVXRpbC5pc09iamVjdChkYXRhKSkge1xuICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEodGhpcy50b0Zvcm1WYWx1ZURhdGEoZGF0YSkpO1xuICAgICAgdGhpcy5fZW1pdERhdGEoZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignRm9ybSBoYXMgcmVjZWl2ZWQgbm90IHN1cHBvcnRlZCBzZXJ2aWNlIGRhdGEuIFN1cHBvcnRlZCBkYXRhIGFyZSBBcnJheSBvciBPYmplY3QnKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUZvcm1EYXRhKHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBzZXREYXRhKGRhdGEpYCBpbnN0ZWFkXG4gICAqL1xuICBfc2V0RGF0YShkYXRhKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9zZXREYXRhYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBzZXREYXRhYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy5zZXREYXRhKGRhdGEpO1xuICB9XG5cbiAgX2VtaXREYXRhKGRhdGEpIHtcbiAgICB0aGlzLm9uRGF0YUxvYWRlZC5lbWl0KGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgYmFjaygpYCBpbnN0ZWFkXG4gICAqL1xuICBfYmFja0FjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2JhY2tBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGJhY2tgIGluc3RlYWQnKTtcbiAgICB0aGlzLmJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSBiYWNrXG4gICAqL1xuICBiYWNrKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zdCBhbGxPcHRpb25zID0gT2JqZWN0LmFzc2lnbihvcHRpb25zIHx8IHt9LCB7IGlnbm9yZU5hdmlnYXRpb246IHRoaXMuaWdub3JlRGVmYXVsdE5hdmlnYXRpb24gfSk7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5uYXZpZ2F0ZUJhY2soYWxsT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBjbG9zZURldGFpbChvcHRpb25zPzogYW55KWAgaW5zdGVhZFxuICAgKi9cbiAgX2Nsb3NlRGV0YWlsQWN0aW9uKG9wdGlvbnM/OiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2Nsb3NlRGV0YWlsQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBjbG9zZURldGFpbGAgaW5zdGVhZCcpO1xuICAgIHRoaXMuY2xvc2VEZXRhaWwob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgY3VycmVudCBkZXRhaWwgZm9ybVxuICAgKi9cbiAgY2xvc2VEZXRhaWwob3B0aW9ucz86IGFueSkge1xuICAgIG9wdGlvbnMgPSBVdGlsLmlzRGVmaW5lZChvcHRpb25zKSA/IG9wdGlvbnMgOiB7fTtcbiAgICBvcHRpb25zLmlnbm9yZU5hdmlnYXRpb24gPSB0aGlzLmlnbm9yZURlZmF1bHROYXZpZ2F0aW9uO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uY2xvc2VEZXRhaWxBY3Rpb24ob3B0aW9ucyk7XG4gIH1cblxuICBfc3RheUluUmVjb3JkQWZ0ZXJJbnNlcnQoaW5zZXJ0ZWRLZXlzOiBvYmplY3QpIHtcbiAgICB0aGlzLmZvcm1OYXZpZ2F0aW9uLnN0YXlJblJlY29yZEFmdGVySW5zZXJ0KGluc2VydGVkS2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGByZWxvYWQodXNlRmlsdGVyOiBib29sZWFuID0gZmFsc2UpYCBpbnN0ZWFkXG4gICAqL1xuICBfcmVsb2FkQWN0aW9uKHVzZUZpbHRlcjogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9yZWxvYWRBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYHJlbG9hZGAgaW5zdGVhZCcpO1xuICAgIHRoaXMucmVsb2FkKHVzZUZpbHRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRoZSBmb3JtIGRhdGFcbiAgICovXG4gIHJlbG9hZCh1c2VGaWx0ZXI6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGxldCBxdWVyeUFyZ3VtZW50cyA9IHRoaXMuZ2V0UXVlcnlBcmd1bWVudHModXNlRmlsdGVyKTtcbiAgICB0aGlzLnF1ZXJ5RGF0YShxdWVyeUFyZ3VtZW50cy5maWx0ZXIpO1xuICB9XG5cbiAgZ2V0UXVlcnlBcmd1bWVudHModXNlRmlsdGVyOiBib29sZWFuLCBmaWx0ZXI6IGFueSA9IHt9KTogT1F1ZXJ5UGFyYW1zIHtcbiAgICBjb25zdCBhdiA9IHRoaXMuZ2V0QXR0cmlidXRlc1RvUXVlcnkoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG5cbiAgICBpZiAodXNlRmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSB0aGlzLmdldEN1cnJlbnRLZXlzVmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZmlsdGVyOiBmaWx0ZXIsIGNvbHVtbnM6IGF2LCBlbnRpdHk6IHRoaXMuZW50aXR5LCBzcWxUeXBlczogc3FsVHlwZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2luc2VydCcgbW9kZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGdvSW5zZXJ0TW9kZShvcHRpb25zPzogYW55KWAgaW5zdGVhZFxuICAgKi9cbiAgX2dvSW5zZXJ0TW9kZShvcHRpb25zPzogYW55KSB7XG4gICAgY29uc29sZS53YXJuKCdNZXRob2QgYE9Gb3JtQ29tcG9uZW50Ll9nb0luc2VydE1vZGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGdvSW5zZXJ0TW9kZWAgaW5zdGVhZCcpO1xuICAgIHRoaXMuZ29JbnNlcnRNb2RlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byAnaW5zZXJ0JyBtb2RlXG4gICAqL1xuICBnb0luc2VydE1vZGUob3B0aW9ucz86IGFueSkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uZ29JbnNlcnRNb2RlKG9wdGlvbnMpO1xuICB9XG5cbiAgX2NsZWFyRm9ybUFmdGVySW5zZXJ0KCkge1xuICAgIHRoaXMuY2xlYXJEYXRhKCk7XG4gICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRydWUpO1xuICB9XG5cbiAgX2NsZWFyQW5kQ2xvc2VGb3JtQWZ0ZXJJbnNlcnQoKSB7XG4gICAgY29uc3QgY2xvc2VPcHRzOiBGb3JtTGF5b3V0Q2xvc2VEZXRhaWxPcHRpb25zID0geyBleGl0V2l0aG91dENvbmZpcm1hdGlvbjogdHJ1ZSB9O1xuICAgIHRoaXMuY2xvc2VEZXRhaWwoY2xvc2VPcHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBpbnNlcnQgYWN0aW9uLlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYGluc2VydCgpYCBpbnN0ZWFkXG4gICAqL1xuICBfaW5zZXJ0QWN0aW9uKCkge1xuICAgIGNvbnNvbGUud2FybignTWV0aG9kIGBPRm9ybUNvbXBvbmVudC5faW5zZXJ0QWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGBpbnNlcnRgIGluc3RlYWQnKTtcbiAgICB0aGlzLmluc2VydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGluc2VydCBhY3Rpb24uXG4gICAqL1xuICBpbnNlcnQoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9KTtcblxuICAgIGlmICghdGhpcy5mb3JtR3JvdXAudmFsaWQpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCh0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3JEaWFsb2dUaXRsZSgpLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9JbnNlcnQoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG5cbiAgICAvLyB2YWxpZGF0aW9uIGJlZm9yZSBpbnNlcnRcbiAgICBpZiAoISh0aGlzLnZhbGlkYXRlQmVmb3JlQWN0aW9uKHZhbHVlcykpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vbkJlZm9yZUluc2VydC5lbWl0KHZhbHVlcyk7XG4gICAgdGhpcy5pbnNlcnREYXRhKHZhbHVlcywgc3FsVHlwZXMpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgIHNlbGYucG9zdENvcnJlY3RJbnNlcnQocmVzcCk7XG4gICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICBpZiAoc2VsZi5hZnRlckluc2VydE1vZGUgPT09ICdkZXRhaWwnKSB7XG4gICAgICAgIHNlbGYuX3N0YXlJblJlY29yZEFmdGVySW5zZXJ0KHJlc3ApO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLmFmdGVySW5zZXJ0TW9kZSA9PT0gJ25ldycpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJGb3JtQWZ0ZXJJbnNlcnQoKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VsZi5hZnRlckluc2VydE1vZGUgPT09ICdjbG9zZScpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJBbmRDbG9zZUZvcm1BZnRlckluc2VydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jbG9zZURldGFpbCgpO1xuICAgICAgfVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIHNlbGYucG9zdEluY29ycmVjdEluc2VydChlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICB2YWxpZGF0ZUJlZm9yZUFjdGlvbih2YWx1ZXM6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZvcm1EYXRhVmFsaWRhdGlvbkZ1bmN0aW9uKHZhbHVlcyk7XG4gICAgICBpZiAoIXJlc3VsdC52YWxpZCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoXG4gICAgICAgICAgcmVzdWx0LnRpdGxlID8/IHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmdldFZhbGlkYXRpb25FcnJvckRpYWxvZ1RpdGxlKCksXG4gICAgICAgICAgcmVzdWx0Lm1lc3NhZ2VzID8gcmVzdWx0Lm1lc3NhZ2VzLmpvaW4oJzwvYnI+JykgOiB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRWYWxpZGF0aW9uRXJyb3IoKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIHRvICdlZGl0JyBtb2RlXG4gICAqIEBkZXByZWNhdGVkIFVzZSBgZ29FZGl0TW9kZSgpYCBpbnN0ZWFkXG4gICAqL1xuICBfZ29FZGl0TW9kZSgpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2dvRWRpdE1vZGVgIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYGdvRWRpdE1vZGVgIGluc3RlYWQnKTtcbiAgICB0aGlzLmdvRWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gJ2VkaXQnIG1vZGVcbiAgICovXG4gIGdvRWRpdE1vZGUoKSB7XG4gICAgdGhpcy5mb3JtTmF2aWdhdGlvbi5nb0VkaXRNb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2VkaXQnIGFjdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHVwZGF0ZSgpYCBpbnN0ZWFkXG4gICAqL1xuICBfZWRpdEFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2VkaXRBY3Rpb25gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnVydXRlLiBVc2UgYHVwZGF0ZWAgaW5zdGVhZCcpO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2VkaXQnIGFjdGlvblxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKFxuICAgICAgKGNvbnRyb2wpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29udHJvbF0ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VmFsaWRhdGlvbkVycm9yKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJldHJpZXZpbmcga2V5cy4uLlxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ2V0S2V5c1ZhbHVlcygpO1xuXG4gICAgLy8gcmV0cmlldmluZyB2YWx1ZXMgdG8gdXBkYXRlLi4uXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzVG9VcGRhdGUoKTtcbiAgICBjb25zdCBzcWxUeXBlcyA9IHRoaXMuZ2V0QXR0cmlidXRlc1NRTFR5cGVzKCk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gdXBkYXRlXG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0lORk8nLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXROb3RoaW5nVG9VcGRhdGVNZXNzYWdlKCkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRpb24gYmVmb3JlIHVwZGF0ZVxuICAgIGlmICghKHRoaXMudmFsaWRhdGVCZWZvcmVBY3Rpb24odmFsdWVzKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uQmVmb3JlVXBkYXRlLmVtaXQodmFsdWVzKTtcbiAgICAvLyBpbnZva2UgdXBkYXRlIG1ldGhvZC4uLlxuICAgIHRoaXMudXBkYXRlRGF0YShmaWx0ZXIsIHZhbHVlcywgc3FsVHlwZXMpLnN1YnNjcmliZShyZXNwID0+IHtcbiAgICAgIHNlbGYucG9zdENvcnJlY3RVcGRhdGUocmVzcCk7XG4gICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICBpZiAoc2VsZi5zdGF5SW5SZWNvcmRBZnRlckVkaXQpIHtcbiAgICAgICAgc2VsZi5yZWxvYWQodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmLmNsb3NlRGV0YWlsKCk7XG4gICAgICB9XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0VXBkYXRlKGVycm9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyAnZGVsZXRlJyBhY3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBkZWxldGUoKWAgaW5zdGVhZFxuICAgKi9cbiAgX2RlbGV0ZUFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX2RlbGV0ZUFjdGlvbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXJ1dGUuIFVzZSBgZGVsZXRlYCBpbnN0ZWFkJyk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgJ2RlbGV0ZScgYWN0aW9uXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5nZXRLZXlzVmFsdWVzKCk7XG4gICAgdGhpcy5vbkJlZm9yZURlbGV0ZS5lbWl0KGZpbHRlcik7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlRGF0YShmaWx0ZXIpO1xuICB9XG5cblxuICBxdWVyeURhdGEoZmlsdGVyOiBhbnkpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHRoaXMuZGF0YVNlcnZpY2UpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09Gb3JtQ29tcG9uZW50OiBubyBzZXJ2aWNlIGNvbmZpZ3VyZWQhIGFib3J0aW5nIHF1ZXJ5Jyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChmaWx0ZXIpIHx8IE9iamVjdC5rZXlzKGZpbHRlcikubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09Gb3JtQ29tcG9uZW50OiBubyBmaWx0ZXIgY29uZmlndXJlZCEgYWJvcnRpbmcgcXVlcnknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb3JtQ2FjaGUucmVzdGFydENhY2hlKCk7XG4gICAgdGhpcy5jbGVhckNvbXBvbmVudHNPbGRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcblxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1ldGVyID0gdGhpcy5nZXRRdWVyeUFyZ3VtZW50cyhmYWxzZSwgZmlsdGVyKTtcblxuICAgIHRoaXMucXVlcnlTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFTZXJ2aWNlW3RoaXMucXVlcnlNZXRob2RdKC4uLnRoaXMuZGF0YVNlcnZpY2UucXVlcnlBcmd1bWVudEFkYXB0ZXIucGFyc2VRdWVyeVBhcmFtZXRlcnMocXVlcnlQYXJhbWV0ZXIpKVxuICAgICAgLnN1YnNjcmliZSgocmVzcDogU2VydmljZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHJlc3AuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFUlJPUjogJyArIHJlc3AubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH0sIGVyciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRm9ybURhdGEoe30pO1xuICAgICAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24pKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeUZhbGxiYWNrRnVuY3Rpb24oZXJyKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgJiYgZXJyLnN0YXR1c1RleHQpIHtcbiAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgZXJyLnN0YXR1c1RleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCB0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRRdWVyeUVycm9yTWVzc2FnZSgpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXRBdHRyaWJ1dGVzVG9RdWVyeSgpOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgYXR0cmlidXRlczogQXJyYXk8YW55PiA9IFtdO1xuICAgIC8vIGFkZCBmb3JtIGtleXMuLi5cbiAgICBpZiAodGhpcy5rZXlzQXJyYXkgJiYgdGhpcy5rZXlzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgYXR0cmlidXRlcy5wdXNoKC4uLnRoaXMua2V5c0FycmF5KTtcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50czogYW55ID0gdGhpcy5nZXRDb21wb25lbnRzKCk7XG4gICAgLy8gYWRkIG9ubHkgdGhlIGZpZWxkcyBjb250YWluZWQgaW50byB0aGUgZm9ybS4uLlxuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpZiAoYXR0cmlidXRlcy5pbmRleE9mKGl0ZW0pIDwgMCAmJlxuICAgICAgICBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljUmVnaXN0ZXJpbmcoKSAmJiBjb21wb25lbnRzW2l0ZW1dLmlzQXV0b21hdGljQmluZGluZygpKSB7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGFkZCBmaWVsZHMgc3RvcmVkIGludG8gZm9ybSBjYWNoZS4uLlxuICAgIGNvbnN0IGRhdGFDYWNoZSA9IHRoaXMuZm9ybUNhY2hlLmdldERhdGFDYWNoZSgpO1xuICAgIGlmIChkYXRhQ2FjaGUpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRhdGFDYWNoZSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCAmJiBhdHRyaWJ1dGVzLmluZGV4T2YoaXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuY29uY2F0KHRoaXMuY29sc0FycmF5LmZpbHRlcihjb2wgPT4gYXR0cmlidXRlcy5pbmRleE9mKGNvbCkgPCAwKSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBtYW5hZ2UgdGhlIGNhbGwgdG8gdGhlIGluc2VydCBzZXJ2aWNlXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIFtzcWxUeXBlc11cbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnk+XG4gICAqL1xuICBpbnNlcnREYXRhKHZhbHVlcywgc3FsVHlwZXM/OiBvYmplY3QpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLmxvYWRlclN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5sb2FkZXJTdWJzY3JpcHRpb24gPSB0aGlzLmxvYWQoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgdGhpcy5kYXRhU2VydmljZVt0aGlzLmluc2VydE1ldGhvZF0odmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb0luc2VydCgpOiBvYmplY3Qge1xuICAgIGNvbnN0IGF0dHJWYWx1ZXMgPSB7fTtcbiAgICBpZiAodGhpcy5mb3JtUGFyZW50S2V5c1ZhbHVlcykge1xuICAgICAgT2JqZWN0LmFzc2lnbihhdHRyVmFsdWVzLCB0aGlzLmZvcm1QYXJlbnRLZXlzVmFsdWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYXR0clZhbHVlcywgdGhpcy5nZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNxbCB0eXBlcyBmcm9tIHRoZSBmb3JtIGNvbXBvbmVudHMgYW5kIHRoZSBmb3JtIGtleXNcbiAgICovXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGVzU1FMVHlwZXMoKTogb2JqZWN0IHtcbiAgICBjb25zdCB0eXBlczogb2JqZWN0ID0ge307XG4gICAgLy8gQWRkIGZvcm0ga2V5cyBzcWwgdHlwZXNcbiAgICB0aGlzLmtleXNTcWxUeXBlc0FycmF5LmZvckVhY2goKGtzdCwgaSkgPT4gdHlwZXNbdGhpcy5rZXlzQXJyYXlbaV1dID0gU1FMVHlwZXMuZ2V0U1FMVHlwZVZhbHVlKGtzdCkpO1xuICAgIC8vIEFkZCBmb3JtIGNvbXBvbmVudHMgc3FsIHR5cGVzXG4gICAgaWYgKHRoaXMuX2NvbXBTUUxUeXBlcyAmJiBPYmplY3Qua2V5cyh0aGlzLl9jb21wU1FMVHlwZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odHlwZXMsIHRoaXMuX2NvbXBTUUxUeXBlcyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlcztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEFsbG93IHRvIG1hbmFnZSB0aGUgY2FsbCB0byB0aGUgdXBkYXRlIHNlcnZpY2VcbiAgICogQHBhcmFtIGZpbHRlclxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEBwYXJhbSBbc3FsVHlwZXNdXG4gICAqIEByZXR1cm5zICBPYnNlcnZhYmxlPGFueT5cbiAgICovXG4gIHVwZGF0ZURhdGEoZmlsdGVyLCB2YWx1ZXMsIHNxbFR5cGVzPzogb2JqZWN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKG9ic2VydmVyID0+IHtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy51cGRhdGVNZXRob2RdKGZpbHRlciwgdmFsdWVzLCB0aGlzLmVudGl0eSwgc3FsVHlwZXMpLnN1YnNjcmliZShcbiAgICAgICAgcmVzcCA9PiB7XG4gICAgICAgICAgaWYgKHJlc3AuaXNTdWNjZXNzZnVsKCkpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzcC5kYXRhKTtcbiAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlc3AubWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICBzZWxmLmxvYWRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JzZXJ2YWJsZTtcbiAgfVxuXG4gIGdldEF0dHJpYnV0ZXNWYWx1ZXNUb1VwZGF0ZSgpOiBvYmplY3Qge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGNoYW5nZWRBdHRycyA9IHRoaXMuZm9ybUNhY2hlLmdldENoYW5nZWRGb3JtQ29udHJvbHNBdHRyKCk7XG4gICAgT2JqZWN0LmtleXModGhpcy5mb3JtR3JvdXAuY29udHJvbHMpLmZpbHRlcihjb250cm9sTmFtZSA9PlxuICAgICAgc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2YoY29udHJvbE5hbWUpID09PSAtMSAmJlxuICAgICAgY2hhbmdlZEF0dHJzLmluZGV4T2YoY29udHJvbE5hbWUpICE9PSAtMVxuICAgICkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgY29udHJvbCA9IHNlbGYuZm9ybUdyb3VwLmNvbnRyb2xzW2l0ZW1dO1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBPRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0Q29tcG9uZW50QnlBdHRyKGl0ZW0pO1xuICAgICAgICAvKiogUGFyc2UgdGhlIHZhbHVlcyDigIvigIt0byB0aGUgZm9ybWF0IGFjY29yZGluZyB0byB0aGVpciBzcWx0eXBlIHRvIHNlbmQgdG8gdGhlIHVwZGF0ZSByZXF1ZXN0ICovXG4gICAgICAgIHZhbHVlc1tpdGVtXSA9IFNRTFR5cGVzLnBhcnNlVXNpbmdTUUxUeXBlKGNvbnRyb2wuZ2V0VmFsdWUoKSwgU1FMVHlwZXMuZ2V0U1FMVHlwZUtleShjb21wLmdldFNRTFR5cGUoKSkpOyA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXNbaXRlbV0gPSBjb250cm9sLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlc1tpdGVtXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlc1tpdGVtXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyB0byBtYW5hZ2UgdGhlIGNhbGwgdG8gdGhlIGRlbGV0ZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWx0ZXJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZTxhbnk+XG4gICAqL1xuICBkZWxldGVEYXRhKGZpbHRlcjogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy5sb2FkZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGVyU3Vic2NyaXB0aW9uID0gdGhpcy5sb2FkKCk7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc3FsVHlwZXMgPSB0aGlzLmdldEF0dHJpYnV0ZXNTUUxUeXBlcygpO1xuICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICB0aGlzLmNhbkRpc2NhcmRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2VbdGhpcy5kZWxldGVNZXRob2RdKGZpbHRlciwgdGhpcy5lbnRpdHksIHNxbFR5cGVzKS5zdWJzY3JpYmUoXG4gICAgICAgIHJlc3AgPT4ge1xuICAgICAgICAgIGlmIChyZXNwLmlzU3VjY2Vzc2Z1bCgpKSB7XG4gICAgICAgICAgICBzZWxmLmZvcm1DYWNoZS5zZXRDYWNoZVNuYXBzaG90KCk7XG4gICAgICAgICAgICBzZWxmLm1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk7XG4gICAgICAgICAgICBzZWxmLnBvc3RDb3JyZWN0RGVsZXRlKHJlc3ApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwLmRhdGEpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5wb3N0SW5jb3JyZWN0RGVsZXRlKHJlc3ApO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IocmVzcC5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5sb2FkZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICBzZWxmLnBvc3RJbmNvcnJlY3REZWxldGUoZXJyKTtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgIHNlbGYubG9hZGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICB9XG5cbiAgdG9KU09ORGF0YShkYXRhKSB7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0ge307XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlRGF0YSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHZhbHVlRGF0YVtpdGVtXSA9IGRhdGFbaXRlbV0udmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlRGF0YTtcbiAgfVxuXG4gIHRvRm9ybVZhbHVlRGF0YShkYXRhKSB7XG4gICAgaWYgKGRhdGEgJiYgVXRpbC5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB2YWx1ZURhdGE6IEFycmF5PG9iamVjdD4gPSBbXTtcbiAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgZGF0YS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICB2YWx1ZURhdGEucHVzaChzZWxmLm9iamVjdFRvRm9ybVZhbHVlRGF0YShpdGVtKSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB2YWx1ZURhdGE7XG4gICAgfSBlbHNlIGlmIChkYXRhICYmIFV0aWwuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9iamVjdFRvRm9ybVZhbHVlRGF0YShkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGtleXMgdmFsdWVzXG4gICAqIEByZXR1cm5zIGtleXNcbiAgICovXG4gIGdldEtleXNWYWx1ZXMoKTogYW55IHtcbiAgICBjb25zdCBmaWx0ZXIgPSB7fTtcbiAgICBjb25zdCBjdXJyZW50UmVjb3JkID0gdGhpcy5mb3JtRGF0YTtcbiAgICBpZiAoIXRoaXMua2V5c0FycmF5KSB7XG4gICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cbiAgICB0aGlzLmtleXNBcnJheS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoY3VycmVudFJlY29yZFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGN1cnJlbnREYXRhID0gY3VycmVudFJlY29yZFtrZXldO1xuICAgICAgICBpZiAoY3VycmVudERhdGEgaW5zdGFuY2VvZiBPRm9ybVZhbHVlKSB7XG4gICAgICAgICAgY3VycmVudERhdGEgPSBjdXJyZW50RGF0YS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJba2V5XSA9IGN1cnJlbnREYXRhO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXI7XG4gIH1cblxuICBpc0luUXVlcnlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5RVUVSWTtcbiAgfVxuXG4gIGlzSW5JbnNlcnRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ7XG4gIH1cblxuICBpc0luVXBkYXRlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlID09PSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFO1xuICB9XG5cbiAgaXNJbkluaXRpYWxNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTklUSUFMO1xuICB9XG5cbiAgc2V0UXVlcnlNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLlFVRVJZKTtcbiAgfVxuXG4gIHNldEluc2VydE1vZGUoKSB7XG4gICAgdGhpcy5zZXRGb3JtTW9kZShPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5TRVJUKTtcbiAgfVxuXG4gIHNldFVwZGF0ZU1vZGUoKSB7XG4gICAgdGhpcy5zZXRGb3JtTW9kZShPRm9ybUNvbXBvbmVudC5Nb2RlKCkuVVBEQVRFKTtcbiAgfVxuXG4gIHNldEluaXRpYWxNb2RlKCkge1xuICAgIHRoaXMuc2V0Rm9ybU1vZGUoT0Zvcm1Db21wb25lbnQuTW9kZSgpLklOSVRJQUwpO1xuICB9XG5cbiAgcmVnaXN0ZXJEeW5hbWljRm9ybUNvbXBvbmVudChkeW5hbWljRm9ybSkge1xuICAgIGlmICghVXRpbC5pc0RlZmluZWQoZHluYW1pY0Zvcm0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZHluYW1pY0Zvcm1TdWJzY3JpcHRpb24gPSBkeW5hbWljRm9ybS5yZW5kZXIuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHNlbGYucmVmcmVzaENvbXBvbmVudHNFZGl0YWJsZVN0YXRlKCk7XG4gICAgICAgIGlmICghc2VsZi5pc0luSW5zZXJ0TW9kZSgpICYmIHNlbGYucXVlcnlPbkluaXQpIHtcbiAgICAgICAgICBzZWxmLnJlbG9hZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5mb3JtUGFyZW50S2V5c1ZhbHVlcykge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuZm9ybVBhcmVudEtleXNWYWx1ZXMpLmZvckVhY2gocGFyZW50S2V5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi5mb3JtUGFyZW50S2V5c1ZhbHVlc1twYXJlbnRLZXldO1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IHNlbGYuZ2V0RmllbGRSZWZlcmVuY2UocGFyZW50S2V5KTtcbiAgICAgICAgICAgIGlmIChVdGlsLmlzRm9ybURhdGFDb21wb25lbnQoY29tcCkgJiYgY29tcC5pc0F1dG9tYXRpY0JpbmRpbmcoKSkge1xuICAgICAgICAgICAgICBjb21wLnNldFZhbHVlKHZhbHVlLCB7XG4gICAgICAgICAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQ6IGZhbHNlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1bnJlZ2lzdGVyRHluYW1pY0Zvcm1Db21wb25lbnQoZHluYW1pY0Zvcm0pIHtcbiAgICBpZiAoZHluYW1pY0Zvcm0gJiYgdGhpcy5keW5hbWljRm9ybVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5keW5hbWljRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlcXVpcmVkQ29tcG9uZW50cygpOiBvYmplY3Qge1xuICAgIGNvbnN0IHJlcXVpcmVkQ29tcG9udGVudHM6IG9iamVjdCA9IHt9O1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBjb21wID0gY29tcG9uZW50c1trZXldO1xuICAgICAgICBjb25zdCBhdHRyID0gY29tcC5nZXRBdHRyaWJ1dGUoKTtcbiAgICAgICAgaWYgKChjb21wIGFzIGFueSkuaXNSZXF1aXJlZCAmJiBhdHRyICYmIGF0dHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlcXVpcmVkQ29tcG9udGVudHNbYXR0cl0gPSBjb21wO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVpcmVkQ29tcG9udGVudHM7XG4gIH1cblxuICBnZXQgbGF5b3V0RGlyZWN0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xheW91dERpcmVjdGlvbjtcbiAgfVxuXG4gIHNldCBsYXlvdXREaXJlY3Rpb24odmFsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXJzZWRWYWwgPSAodmFsIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuX2xheW91dERpcmVjdGlvbiA9IFsncm93JywgJ2NvbHVtbicsICdyb3ctcmV2ZXJzZScsICdjb2x1bW4tcmV2ZXJzZSddLmluZGV4T2YocGFyc2VkVmFsKSAhPT0gLTEgPyBwYXJzZWRWYWwgOiBPRm9ybUNvbXBvbmVudC5ERUZBVUxUX0xBWU9VVF9ESVJFQ1RJT047XG4gIH1cblxuICBnZXQgbGF5b3V0QWxpZ24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbGF5b3V0QWxpZ247XG4gIH1cblxuICBzZXQgbGF5b3V0QWxpZ24odmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sYXlvdXRBbGlnbiA9IHZhbDtcbiAgfVxuXG4gIGdldCBzaG93RmxvYXRpbmdUb29sYmFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5oZWFkZXJNb2RlID09PSAnZmxvYXRpbmcnO1xuICB9XG5cbiAgZ2V0IHNob3dOb3RGbG9hdGluZ1Rvb2xiYXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0hlYWRlciAmJiB0aGlzLmhlYWRlck1vZGUgIT09ICdmbG9hdGluZyc7XG4gIH1cblxuICBpc0VkaXRhYmxlRGV0YWlsKCkge1xuICAgIHJldHVybiB0aGlzLmVkaXRhYmxlRGV0YWlsO1xuICB9XG5cbiAgaXNJbml0aWFsU3RhdGVDaGFuZ2VkKGlnbm9yZUF0dHJzOiBzdHJpbmdbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNhY2hlLmlzSW5pdGlhbFN0YXRlQ2hhbmdlZChpZ25vcmVBdHRycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGB1bmRvKClgIGluc3RlYWRcbiAgICovXG4gIF91bmRvTGFzdENoYW5nZUFjdGlvbigpIHtcbiAgICBjb25zb2xlLndhcm4oJ01ldGhvZCBgT0Zvcm1Db21wb25lbnQuX3VuZG9MYXN0Q2hhbmdlQWN0aW9uYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1cnV0ZS4gVXNlIGB1bmRvYCBpbnN0ZWFkJyk7XG4gICAgdGhpcy51bmRvKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5kbyBsYXN0IGNoYW5nZVxuICAgKi9cbiAgdW5kbygpIHtcbiAgICB0aGlzLmZvcm1DYWNoZS51bmRvTGFzdENoYW5nZSgpO1xuICB9XG5cbiAgZ2V0IGlzQ2FjaGVTdGFja0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZvcm1DYWNoZS5pc0NhY2hlU3RhY2tFbXB0eTtcbiAgfVxuXG4gIHVuZG9LZXlib2FyZFByZXNzZWQoKSB7XG4gICAgdGhpcy5mb3JtQ2FjaGUudW5kb0xhc3RDaGFuZ2UoKTtcbiAgfVxuXG4gIGdldEZvcm1Ub29sYmFyKCk6IE9Gb3JtVG9vbGJhckJhc2Uge1xuICAgIHJldHVybiB0aGlzLl9mb3JtVG9vbGJhcjtcbiAgfVxuXG4gIGdldEZvcm1NYW5hZ2VyKCk6IE9Gb3JtTGF5b3V0TWFuYWdlckJhc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1OYXZpZ2F0aW9uLmZvcm1MYXlvdXRNYW5hZ2VyO1xuICB9XG5cbiAgZ2V0Rm9ybU5hdmlnYXRpb24oKTogT0Zvcm1OYXZpZ2F0aW9uQ2xhc3Mge1xuICAgIHJldHVybiB0aGlzLmZvcm1OYXZpZ2F0aW9uO1xuICB9XG5cbiAgZ2V0Rm9ybUNhY2hlKCk6IE9Gb3JtQ2FjaGVDbGFzcyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNhY2hlO1xuICB9XG5cbiAgZ2V0VXJsUGFyYW0oYXJnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGb3JtTmF2aWdhdGlvbigpLmdldFVybFBhcmFtcygpW2FyZ107XG4gIH1cblxuICBnZXRVcmxQYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybU5hdmlnYXRpb24oKS5nZXRVcmxQYXJhbXMoKTtcbiAgfVxuXG4gIHNldFVybFBhcmFtc0FuZFJlbG9hZCh2YWw6IG9iamVjdCkge1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24uc2V0VXJsUGFyYW1zKHZhbCk7XG4gICAgdGhpcy5yZWxvYWQodHJ1ZSk7XG4gIH1cblxuICBnZXRSZWdpc3RlcmVkRmllbGRzVmFsdWVzKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHt9O1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBjb21wb25lbnRzS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZpbHRlcihrZXkgPT4gc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICAgIGNvbXBvbmVudHNLZXlzLmZvckVhY2goY29tcEtleSA9PiB7XG4gICAgICBjb25zdCBjb21wOiBJRm9ybURhdGFDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBLZXldO1xuICAgICAgLyoqIFBhcnNlIHRoZSB2YWx1ZXMg4oCL4oCLdG8gdGhlIGZvcm1hdCBhY2NvcmRpbmcgdG8gdGhlaXIgc3FsdHlwZSB0byBzZW5kIHRvIHRoZSBpbnNlcnQgcmVxdWVzdCAqL1xuICAgICAgdmFsdWVzW2NvbXBLZXldID0gU1FMVHlwZXMucGFyc2VVc2luZ1NRTFR5cGUoY29tcC5nZXRWYWx1ZSgpLCBTUUxUeXBlcy5nZXRTUUxUeXBlS2V5KGNvbXAuZ2V0U1FMVHlwZSgpKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm1cbiAgICogQHBhcmFtIGF0dHIgdGhlIGF0dHIgb2YgdGhlIGZvcm0gZmllbGRcbiAgICovXG4gIGdldEZpZWxkVmFsdWUoYXR0cjogc3RyaW5nKTogYW55IHtcbiAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlKGF0dHIpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICB2YWx1ZSA9IGNvbXAuZ2V0VmFsdWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgdmFsdWVzIG9mIGVhY2ggYXR0cmlidXRlXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cidzIG9mIHRoZSBmb3JtIGZpZWxkc1xuICAgKi9cbiAgZ2V0RmllbGRWYWx1ZXMoYXR0cnM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBhcnIgPSB7fTtcbiAgICBhdHRycy5mb3JFYWNoKGtleSA9PiBhcnJba2V5XSA9IHRoaXMuZ2V0RmllbGRWYWx1ZShrZXkpKTtcbiAgICByZXR1cm4gYXJyO1xuXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSBhdHRyIGF0dHJpYnV0ZSBvZiBjb250cm9sXG4gICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZVxuICAgKi9cbiAgc2V0RmllbGRWYWx1ZShhdHRyOiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgY29uc3QgY29tcCA9IHRoaXMuZ2V0RmllbGRSZWZlcmVuY2UoYXR0cik7XG4gICAgaWYgKGNvbXApIHtcbiAgICAgIGNvbXAuc2V0VmFsdWUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBlYWNoIGNvbnRyb2wgaW4gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlc1xuICAgKi9cbiAgc2V0RmllbGRWYWx1ZXModmFsdWVzOiBhbnksIG9wdGlvbnM/OiBGb3JtVmFsdWVPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGtleSwgdmFsdWVzW2tleV0sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgdmFsdWUgb2YgZWFjaCBjb250cm9sIGluIHRoZSBmb3JtXG4gICAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqL1xuICBjbGVhckZpZWxkVmFsdWUoYXR0cjogc3RyaW5nLCBvcHRpb25zPzogRm9ybVZhbHVlT3B0aW9ucykge1xuICAgIGNvbnN0IGNvbXAgPSB0aGlzLmdldEZpZWxkUmVmZXJlbmNlKGF0dHIpO1xuICAgIGlmIChjb21wKSB7XG4gICAgICBjb21wLmNsZWFyVmFsdWUob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSB2YWx1ZSBvZiBlYWNoIGNvbnRyb2wgaW4gdGhlIGZvcm1cbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhdHRyJ3Mgb2YgdGhlIGZvcm0gZmllbGRzXG4gICAqL1xuICBjbGVhckZpZWxkVmFsdWVzKGF0dHJzOiBzdHJpbmdbXSwgb3B0aW9ucz86IEZvcm1WYWx1ZU9wdGlvbnMpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBhdHRycy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHNlbGYuY2xlYXJGaWVsZFZhbHVlKGtleSwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSByZWZlcmVuY2Ugb2YgdGhlIGNvbnRyb2wgaW4gdGhlIGZvcm0uXG4gICAqIEBwYXJhbSBhdHRyIHRoZSBhdHRyIG9mIHRoZSBmb3JtIGZpZWxkXG4gICAqL1xuICBnZXRGaWVsZFJlZmVyZW5jZShhdHRyOiBzdHJpbmcpOiBJRm9ybURhdGFDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzW2F0dHJdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlIG9mIGVhY2ggY29udHJvbCBpbiB0aGUgZm9ybVxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHIncyBvZiB0aGUgZm9ybSBmaWxlZHNcbiAgICovXG4gIGdldEZpZWxkUmVmZXJlbmNlcyhhdHRyczogc3RyaW5nW10pOiBJRm9ybURhdGFDb21wb25lbnRIYXNoIHtcbiAgICBjb25zdCBhcnI6IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggPSB7fTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBhdHRycy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGFycltrZXldID0gc2VsZi5nZXRGaWVsZFJlZmVyZW5jZShrZXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICBnZXRGb3JtQ29tcG9uZW50UGVybWlzc2lvbnMoYXR0cjogc3RyaW5nKTogT1Blcm1pc3Npb25zIHtcbiAgICBsZXQgcGVybWlzc2lvbnM6IE9QZXJtaXNzaW9ucztcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5wZXJtaXNzaW9ucykpIHtcbiAgICAgIHBlcm1pc3Npb25zID0gKHRoaXMucGVybWlzc2lvbnMuY29tcG9uZW50cyB8fCBbXSkuZmluZChjb21wID0+IGNvbXAuYXR0ciA9PT0gYXR0cik7XG4gICAgfVxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfVxuXG4gIGdldEFjdGlvbnNQZXJtaXNzaW9ucygpOiBPUGVybWlzc2lvbnNbXSB7XG4gICAgbGV0IHBlcm1pc3Npb25zOiBPUGVybWlzc2lvbnNbXTtcbiAgICBpZiAoVXRpbC5pc0RlZmluZWQodGhpcy5wZXJtaXNzaW9ucykpIHtcbiAgICAgIHBlcm1pc3Npb25zID0gKHRoaXMucGVybWlzc2lvbnMuYWN0aW9ucyB8fCBbXSk7XG4gICAgfVxuICAgIHJldHVybiBwZXJtaXNzaW9ucztcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlcm1pbmF0ZUZvcm1Nb2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IHVybFNlZ21lbnRzID0gdGhpcy5mb3JtTmF2aWdhdGlvbi5nZXRVcmxTZWdtZW50cygpO1xuICAgIGlmICh1cmxTZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWdtZW50ID0gdXJsU2VnbWVudHNbdXJsU2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICB0aGlzLmRldGVybWluYXRlTW9kZUZyb21VcmxTZWdtZW50KHNlZ21lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hY3RSb3V0ZS5wYXJlbnQpIHtcbiAgICAgIHRoaXMuYWN0Um91dGUucGFyZW50LnVybC5zdWJzY3JpYmUoc2VnbWVudHMgPT4ge1xuICAgICAgICBjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHRoaXMuZGV0ZXJtaW5hdGVNb2RlRnJvbVVybFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRGb3JtTW9kZShPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTCk7XG4gICAgfVxuICAgIC8vIHN0YXlJblJlY29yZEFmdGVyRWRpdCBpcyB0cnVlIGlmIGZvcm0gaGFzIGVkaXRhYmxlIGRldGFpbCA9IHRydWVcbiAgICB0aGlzLnN0YXlJblJlY29yZEFmdGVyRWRpdCA9IHRoaXMuc3RheUluUmVjb3JkQWZ0ZXJFZGl0IHx8IHRoaXMuaXNFZGl0YWJsZURldGFpbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRldGVybWluYXRlTW9kZUZyb21VcmxTZWdtZW50KHNlZ21lbnQ6IFVybFNlZ21lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBfcGF0aCA9IHNlZ21lbnQgPyBzZWdtZW50LnBhdGggOiAnJztcbiAgICBpZiAodGhpcy5pc0luc2VydE1vZGVQYXRoKF9wYXRoKSkge1xuICAgICAgdGhpcy5zZXRJbnNlcnRNb2RlKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVXBkYXRlTW9kZVBhdGgoX3BhdGgpKSB7XG4gICAgICB0aGlzLnNldFVwZGF0ZU1vZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRJbml0aWFsTW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfdXBkYXRlRm9ybURhdGEobmV3Rm9ybURhdGE6IG9iamVjdCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5mb3JtRGF0YSA9IG5ld0Zvcm1EYXRhO1xuICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuZ2V0Q29tcG9uZW50cygpO1xuICAgICAgY29uc3Qga2V5Q29tcG9uZW50cyA9IFsuLi5PYmplY3Qua2V5cyhjb21wb25lbnRzKV07XG4gICAgICBpZiAoIVV0aWwuaXNBcnJheUVtcHR5KHRoaXMuc2V0VmFsdWVPcmRlckFycmF5KSkge1xuICAgICAgICBrZXlDb21wb25lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleEEgPSB0aGlzLnNldFZhbHVlT3JkZXJBcnJheS5pbmRleE9mKGEpID09PSAtMSA/IDEgOiAwO1xuICAgICAgICAgIGNvbnN0IGluZGV4QiA9IHRoaXMuc2V0VmFsdWVPcmRlckFycmF5LmluZGV4T2YoYikgPT09IC0xID8gMSA6IDA7XG4gICAgICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghVXRpbC5pc0FycmF5RW1wdHkoa2V5Q29tcG9uZW50cykpIHtcbiAgICAgICAga2V5Q29tcG9uZW50cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcCA9IGNvbXBvbmVudHNba2V5XTtcbiAgICAgICAgICB0aGlzLnNldERhdGFJbkZvcm1EYXRhQ29tcG9uZW50KGNvbXAsIGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLmluaXRpYWxpemVGaWVsZHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0YUluRm9ybURhdGFDb21wb25lbnQoY29tcDogSUZvcm1EYXRhQ29tcG9uZW50LCBhdHRyOiBzdHJpbmcpIHtcbiAgICBpZiAoVXRpbC5pc0Zvcm1EYXRhQ29tcG9uZW50KGNvbXApKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoY29tcC5pc0F1dG9tYXRpY0JpbmRpbmcoKSkge1xuICAgICAgICAgIGNvbXAuZGF0YSA9IHRoaXMuZ2V0RGF0YVZhbHVlKGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZUZpZWxkcygpOiB2b2lkIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaChjb250cm9sID0+IHtcbiAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbnRyb2xdLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfSk7XG4gICAgdGhpcy5mb3JtQ2FjaGUucmVnaXN0ZXJDYWNoZSgpO1xuICAgIHRoaXMuZm9ybU5hdmlnYXRpb24udXBkYXRlTmF2aWdhdGlvbigpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyQ29tcG9uZW50c09sZFZhbHVlKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudHM6IElGb3JtRGF0YUNvbXBvbmVudEhhc2ggPSB0aGlzLmdldENvbXBvbmVudHMoKTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBjb21wb25lbnRzS2V5cyA9IE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZpbHRlcihrZXkgPT4gc2VsZi5pZ25vcmVGb3JtQ2FjaGVLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICAgIGNvbXBvbmVudHNLZXlzLmZvckVhY2goY29tcEtleSA9PiB7XG4gICAgICBjb25zdCBjb21wOiBJRm9ybURhdGFDb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBLZXldO1xuICAgICAgKGNvbXAgYXMgYW55KS5vbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbXAuZ2V0Rm9ybUNvbnRyb2woKS5zZXRWYWx1ZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0SW5zZXJ0KHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRJbnNlcnRTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25JbnNlcnQuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RJbmNvcnJlY3RJbnNlcnQocmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dFcnJvcignaW5zZXJ0JywgcmVzdWx0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3N0SW5jb3JyZWN0RGVsZXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zaG93RXJyb3IoJ2RlbGV0ZScsIHJlc3VsdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdEluY29ycmVjdFVwZGF0ZShyZXN1bHQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0Vycm9yKCd1cGRhdGUnLCByZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0VXBkYXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXRVcGRhdGVTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25VcGRhdGUuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RDb3JyZWN0RGVsZXRlKHJlc3VsdDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zbmFja0JhclNlcnZpY2Uub3Blbih0aGlzLl9tZXNzYWdlU2VydmljZS5nZXREZWxldGVTdWNjZXNzTWVzc2FnZSgpLCB7IGljb246ICdjaGVja19jaXJjbGUnIH0pO1xuICAgIHRoaXMub25EZWxldGUuZW1pdChyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JtTGF5b3V0TWFuYWdlclRvVXBkYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm1MYXlvdXRNYW5hZ2VyID0gdGhpcy5nZXRGb3JtTWFuYWdlcigpO1xuICAgIGlmIChVdGlsLmlzRGVmaW5lZChmb3JtTGF5b3V0TWFuYWdlcikpIHtcbiAgICAgIGZvcm1MYXlvdXRNYW5hZ2VyLm1hcmtGb3JVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBvYmplY3RUb0Zvcm1WYWx1ZURhdGEoZGF0YTogb2JqZWN0ID0ge30pOiBvYmplY3Qge1xuICAgIGNvbnN0IHZhbHVlRGF0YSA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGRhdGEpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHZhbHVlRGF0YVtpdGVtXSA9IG5ldyBPRm9ybVZhbHVlKGRhdGFbaXRlbV0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2YWx1ZURhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q3VycmVudEtleXNWYWx1ZXMoKTogb2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtTmF2aWdhdGlvbi5nZXRDdXJyZW50S2V5c1ZhbHVlcygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hDb21wb25lbnRzRWRpdGFibGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKHRoaXMubW9kZSkge1xuICAgICAgY2FzZSBPRm9ybUNvbXBvbmVudC5Nb2RlKCkuSU5JVElBTDpcbiAgICAgICAgdGhpcy5fc2V0Q29tcG9uZW50c0VkaXRhYmxlKHRoaXMuaXNFZGl0YWJsZURldGFpbCgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5JTlNFUlQ6XG4gICAgICBjYXNlIE9Gb3JtQ29tcG9uZW50Lk1vZGUoKS5VUERBVEU6XG4gICAgICAgIHRoaXMuX3NldENvbXBvbmVudHNFZGl0YWJsZSh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNJbnNlcnRNb2RlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBuYXZEYXRhOiBPTmF2aWdhdGlvbkl0ZW0gPSB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldExhc3RJdGVtKCk7XG4gICAgLy8gVE9ETzogc29sdmUgaXNzdWUgIzcyNyB3aGVuIGBpbnNlcnQtZm9ybS1yb3V0ZWAgaXMgcHJlc2VudFxuICAgIHJldHVybiBVdGlsLmlzRGVmaW5lZChuYXZEYXRhKSA/IHBhdGggPT09IG5hdkRhdGEuZ2V0SW5zZXJ0Rm9ybVJvdXRlKCkgOiBDb2Rlcy5ERUZBVUxUX0lOU0VSVF9ST1VURSA9PT0gcGF0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc1VwZGF0ZU1vZGVQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5hdkRhdGE6IE9OYXZpZ2F0aW9uSXRlbSA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0UHJldmlvdXNSb3V0ZURhdGEoKTtcbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQobmF2RGF0YSkgJiYgcGF0aCA9PT0gbmF2RGF0YS5nZXRFZGl0Rm9ybVJvdXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dFcnJvcihvcGVyYXRpb246IHN0cmluZywgcmVzdWx0OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWxlcnQoJ0VSUk9SJywgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG1lc3NhZ2UgPSAnJ1xuICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICAgICAgY2FzZSAndXBkYXRlJzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0VXBkYXRlRXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaW5zZXJ0JzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0SW5zZXJ0RXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICBtZXNzYWdlID0gdGhpcy5fbWVzc2FnZVNlcnZpY2UuZ2V0RGVsZXRlRXJyb3JNZXNzYWdlKClcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5hbGVydCgnRVJST1InLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlICNjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnM+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltvLWZvcm0tdG9vbGJhci1idXR0b25zXVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG5cbjxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0ndG9wJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAob25DYW5jZWwpPVwib25DYW5jZWwuZW1pdCgkZXZlbnQpXCIgbGF5b3V0LXBhZGRpbmc+XG4gIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUZvcm1Ub29sYmFyQnV0dG9uc1wiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvby1mb3JtLXRvb2xiYXI+XG5cbjxuZy1ob3N0IG9LZXlib2FyZExpc3RlbmVyIGtleWJvYXJkS2V5cz1cIjE3OzkwXCIgKG9uS2V5c1ByZXNzZWQpPVwidW5kb0tleWJvYXJkUHJlc3NlZCgpXCIgY2xhc3M9XCJzY3JvbGxpbmcgby1zY3JvbGxcIj5cbiAgPGRpdiBmeEZsZXg9XCJncm93XCI+XG4gICAgPG8tZm9ybS10b29sYmFyICpuZ0lmPVwic2hvd05vdEZsb2F0aW5nVG9vbGJhciAmJiBoZWFkZXJQb3NpdGlvbj09PSd0b3AnXCIgW2xhYmVsLWhlYWRlcl09XCJsYWJlbGhlYWRlclwiIFtsYWJlbC1oZWFkZXItYWxpZ25dPVwibGFiZWxIZWFkZXJBbGlnblwiXG4gICAgICBbaGVhZGVyLWFjdGlvbnNdPVwiaGVhZGVyYWN0aW9uc1wiIFtzaG93LWhlYWRlci1uYXZpZ2F0aW9uXT1cInNob3dIZWFkZXJOYXZpZ2F0aW9uXCIgW3Nob3ctaGVhZGVyLWFjdGlvbnMtdGV4dF09XCJzaG93SGVhZGVyQWN0aW9uc1RleHRcIlxuICAgICAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICAgICAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgPGRpdiBvLWN1c3RvbS1mb3JtLXRvb2xiYXItYnV0dG9ucy13cmFwcGVyIGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cImVuZCBjZW50ZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3VzdG9tRm9ybVRvb2xiYXJCdXR0b25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9vLWZvcm0tdG9vbGJhcj5cblxuICAgIDxmb3JtICNpbm5lckZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIiBjbGFzcz1cImlubmVyLWZvcm1cIiBbY2xhc3MuZm9ybS1uby10b29sYmFyXT1cIiFzaG93SGVhZGVyXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJsb2FkaW5nIHwgYXN5bmNcIiBjbGFzcz1cInByb2dyZXNzLWJhci1jb250YWluZXJcIj5cbiAgICAgICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgbGF5b3V0LXBhZGRpbmcgW2Z4TGF5b3V0XT1cImxheW91dERpcmVjdGlvblwiIFtmeExheW91dEFsaWduXT1cImxheW91dEFsaWduXCIgY2xhc3M9XCJvLWZvcm0tY29udGVudC13cmFwcGVyXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cblxuICAgIDxvLWZvcm0tdG9vbGJhciAqbmdJZj1cInNob3dOb3RGbG9hdGluZ1Rvb2xiYXIgJiYgaGVhZGVyUG9zaXRpb249PT0nYm90dG9tJ1wiIFtsYWJlbC1oZWFkZXJdPVwibGFiZWxoZWFkZXJcIiBbbGFiZWwtaGVhZGVyLWFsaWduXT1cImxhYmVsSGVhZGVyQWxpZ25cIlxuICAgICAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgICAgIChvbkNhbmNlbCk9XCJvbkNhbmNlbC5lbWl0KCRldmVudClcIiBsYXlvdXQtcGFkZGluZz5cbiAgICAgIDxkaXYgby1jdXN0b20tZm9ybS10b29sYmFyLWJ1dHRvbnMtd3JhcHBlciBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJlbmQgY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvby1mb3JtLXRvb2xiYXI+XG4gIDwvZGl2PlxuPC9uZy1ob3N0PlxuXG48by1mb3JtLXRvb2xiYXIgKm5nSWY9XCJzaG93RmxvYXRpbmdUb29sYmFyICYmIGhlYWRlclBvc2l0aW9uPT09J2JvdHRvbSdcIiBbbGFiZWwtaGVhZGVyXT1cImxhYmVsaGVhZGVyXCIgW2xhYmVsLWhlYWRlci1hbGlnbl09XCJsYWJlbEhlYWRlckFsaWduXCJcbiAgW2hlYWRlci1hY3Rpb25zXT1cImhlYWRlcmFjdGlvbnNcIiBbc2hvdy1oZWFkZXItbmF2aWdhdGlvbl09XCJzaG93SGVhZGVyTmF2aWdhdGlvblwiIFtzaG93LWhlYWRlci1hY3Rpb25zLXRleHRdPVwic2hvd0hlYWRlckFjdGlvbnNUZXh0XCJcbiAgKG9uQ2FuY2VsKT1cIm9uQ2FuY2VsLmVtaXQoJGV2ZW50KVwiIGxheW91dC1wYWRkaW5nPlxuICA8ZGl2IG8tY3VzdG9tLWZvcm0tdG9vbGJhci1idXR0b25zLXdyYXBwZXIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiZW5kIGNlbnRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Gb3JtVG9vbGJhckJ1dHRvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L28tZm9ybS10b29sYmFyPlxuIl19