@pepperi-addons/ngx-lib 0.5.0-ng15.3 → 0.5.0-ng16.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 (749) hide show
  1. package/address/address.component.d.ts +1 -1
  2. package/attachment/attachment.component.d.ts +1 -1
  3. package/bread-crumbs/bread-crumbs.component.d.ts +1 -1
  4. package/button/button.component.d.ts +1 -1
  5. package/carousel/carousel-item.directive.d.ts +1 -1
  6. package/carousel/carousel.component.d.ts +1 -1
  7. package/checkbox/checkbox.component.d.ts +1 -1
  8. package/chips/chips.component.d.ts +1 -1
  9. package/color/color.component.d.ts +1 -1
  10. package/core/clipboard/clipboard.directive.d.ts +1 -1
  11. package/core/common/directives/auto-width.directive.d.ts +1 -1
  12. package/core/common/directives/button-loader.directive.d.ts +1 -1
  13. package/core/common/directives/data-qa.directive.d.ts +1 -1
  14. package/core/common/directives/div-loader.directive.d.ts +1 -1
  15. package/core/common/directives/prevent-multi-click.directive.d.ts +1 -1
  16. package/core/common/directives/print.directive.d.ts +1 -1
  17. package/core/portal/attach.directive.d.ts +1 -1
  18. package/core/portal/target.directive.d.ts +1 -1
  19. package/date/date.component.d.ts +1 -1
  20. package/dialog/dialog.component.d.ts +1 -1
  21. package/draggable-items/draggable-item/draggable-item.component.d.ts +1 -1
  22. package/draggable-items/draggable-items.component.d.ts +1 -1
  23. package/esm2022/address/address.component.mjs +112 -0
  24. package/{esm2020 → esm2022}/address/address.module.mjs +23 -23
  25. package/{esm2020 → esm2022}/attachment/attachment.component.mjs +65 -61
  26. package/{esm2020 → esm2022}/attachment/attachment.module.mjs +21 -21
  27. package/esm2022/bread-crumbs/bread-crumbs.component.mjs +87 -0
  28. package/esm2022/bread-crumbs/bread-crumbs.model.mjs +10 -0
  29. package/esm2022/bread-crumbs/bread-crumbs.module.mjs +51 -0
  30. package/{esm2020 → esm2022}/button/button.component.mjs +76 -53
  31. package/esm2022/button/button.model.mjs +13 -0
  32. package/{esm2020 → esm2022}/button/button.module.mjs +19 -19
  33. package/esm2022/carousel/carousel-item.directive.mjs +34 -0
  34. package/esm2022/carousel/carousel.component.mjs +765 -0
  35. package/{esm2020 → esm2022}/carousel/carousel.module.mjs +5 -5
  36. package/esm2022/checkbox/checkbox.component.mjs +182 -0
  37. package/esm2022/checkbox/checkbox.module.mjs +64 -0
  38. package/esm2022/chips/chips.component.mjs +187 -0
  39. package/esm2022/chips/chips.module.mjs +82 -0
  40. package/{esm2020 → esm2022}/chips/chips.service.mjs +5 -5
  41. package/esm2022/color/color-picker.component.mjs +229 -0
  42. package/esm2022/color/color.component.mjs +93 -0
  43. package/esm2022/color/color.module.mjs +93 -0
  44. package/{esm2020 → esm2022}/core/clipboard/clipboard.directive.mjs +4 -4
  45. package/{esm2020 → esm2022}/core/clipboard/clipboard.service.mjs +4 -4
  46. package/esm2022/core/common/directives/auto-width.directive.mjs +79 -0
  47. package/esm2022/core/common/directives/base-destroyer.directive.mjs +23 -0
  48. package/esm2022/core/common/directives/button-blur.directive.mjs +25 -0
  49. package/esm2022/core/common/directives/button-loader.directive.mjs +117 -0
  50. package/esm2022/core/common/directives/data-qa.directive.mjs +26 -0
  51. package/esm2022/core/common/directives/div-loader.directive.mjs +67 -0
  52. package/esm2022/core/common/directives/menu-blur.directive.mjs +33 -0
  53. package/esm2022/core/common/directives/prevent-multi-click.directive.mjs +25 -0
  54. package/esm2022/core/common/directives/print.directive.mjs +176 -0
  55. package/esm2022/core/common/model/wapi.model.mjs +247 -0
  56. package/esm2022/core/common/pipes/common-pipes.mjs +180 -0
  57. package/esm2022/core/common/pipes/date-ago.pipe.mjs +47 -0
  58. package/esm2022/core/common/services/addon.service.mjs +234 -0
  59. package/esm2022/core/common/services/color.service.mjs +383 -0
  60. package/esm2022/core/common/services/cookie.service.mjs +156 -0
  61. package/esm2022/core/common/services/data-convertor.service.mjs +139 -0
  62. package/esm2022/core/common/services/file.service.mjs +252 -0
  63. package/{esm2020 → esm2022}/core/common/services/jwt-helper.service.mjs +4 -4
  64. package/esm2022/core/common/services/session.service.mjs +73 -0
  65. package/esm2022/core/common/services/translate.service.mjs +47 -0
  66. package/esm2022/core/common/services/utilities.service.mjs +302 -0
  67. package/esm2022/core/common/services/validator.service.mjs +273 -0
  68. package/esm2022/core/common/services/window-scrolling.service.mjs +38 -0
  69. package/esm2022/core/customization/customization.model.mjs +377 -0
  70. package/esm2022/core/customization/customization.service.mjs +802 -0
  71. package/{esm2020 → esm2022}/core/http/interceptors/error.interceptor.mjs +4 -4
  72. package/esm2022/core/http/interceptors/loader.interceptor.mjs +33 -0
  73. package/{esm2020 → esm2022}/core/http/interceptors/profiler.interceptor.mjs +4 -4
  74. package/esm2022/core/http/services/http.service.mjs +158 -0
  75. package/{esm2020 → esm2022}/core/http/services/loader.service.mjs +6 -6
  76. package/esm2022/core/layout/layout.service.mjs +171 -0
  77. package/esm2022/core/layout/rtl.directive.mjs +50 -0
  78. package/esm2022/core/portal/attach.directive.mjs +30 -0
  79. package/esm2022/core/portal/portal.service.mjs +37 -0
  80. package/esm2022/core/portal/target.directive.mjs +27 -0
  81. package/{esm2020 → esm2022}/core/scroll-to/scroll-to.service.mjs +4 -4
  82. package/esm2022/date/date.component.mjs +345 -0
  83. package/{esm2020 → esm2022}/date/date.model.mjs +7 -7
  84. package/esm2022/date/date.module.mjs +89 -0
  85. package/esm2022/dialog/default-dialog.component.mjs +39 -0
  86. package/esm2022/dialog/dialog.component.mjs +37 -0
  87. package/esm2022/dialog/dialog.model.mjs +41 -0
  88. package/esm2022/dialog/dialog.module.mjs +59 -0
  89. package/esm2022/dialog/dialog.service.mjs +106 -0
  90. package/esm2022/draggable-items/draggable-item/draggable-item.component.mjs +68 -0
  91. package/esm2022/draggable-items/draggable-items.component.mjs +95 -0
  92. package/esm2022/draggable-items/draggable-items.module.mjs +65 -0
  93. package/esm2022/field-title/field-title.component.mjs +46 -0
  94. package/esm2022/field-title/field-title.module.mjs +48 -0
  95. package/{esm2020 → esm2022}/files-uploader/files-uploader.component.mjs +36 -27
  96. package/esm2022/files-uploader/files-uploader.module.mjs +80 -0
  97. package/esm2022/form/field-generator.component.mjs +152 -0
  98. package/esm2022/form/form.component.mjs +1258 -0
  99. package/esm2022/form/form.module.mjs +180 -0
  100. package/esm2022/form/indicators.component.mjs +23 -0
  101. package/esm2022/form/internal-button.component.mjs +188 -0
  102. package/esm2022/form/internal-carusel.component.mjs +126 -0
  103. package/esm2022/form/internal-carusel.service.mjs +34 -0
  104. package/esm2022/form/internal-field-generator.component.mjs +146 -0
  105. package/esm2022/form/internal-form.component.mjs +1236 -0
  106. package/esm2022/form/internal-list.component.mjs +524 -0
  107. package/esm2022/form/internal-menu.component.mjs +62 -0
  108. package/esm2022/form/internal-page.component.mjs +380 -0
  109. package/esm2022/form/internal-page.service.mjs +125 -0
  110. package/esm2022/group-buttons/group-buttons.component.mjs +73 -0
  111. package/esm2022/group-buttons/group-buttons.module.mjs +60 -0
  112. package/esm2022/icon/icon-registry.service.mjs +24 -0
  113. package/esm2022/icon/icon.component.mjs +95 -0
  114. package/{esm2020 → esm2022}/icon/icon.module.mjs +5 -5
  115. package/esm2022/icon/icon.service.mjs +34 -0
  116. package/{esm2020 → esm2022}/image/image.component.mjs +45 -39
  117. package/esm2022/image/image.module.mjs +74 -0
  118. package/esm2022/image/image.service.mjs +53 -0
  119. package/esm2022/images-filmstrip/images-filmstrip.component.mjs +360 -0
  120. package/esm2022/images-filmstrip/images-filmstrip.module.mjs +84 -0
  121. package/esm2022/link/link.component.mjs +324 -0
  122. package/esm2022/link/link.module.mjs +81 -0
  123. package/{esm2020 → esm2022}/link/link.pipes.mjs +4 -4
  124. package/esm2022/list/list-actions.component.mjs +42 -0
  125. package/esm2022/list/list-carousel.component.mjs +110 -0
  126. package/esm2022/list/list-chooser.component.mjs +64 -0
  127. package/esm2022/list/list-pager.component.mjs +126 -0
  128. package/{esm2020 → esm2022}/list/list-sorting.component.mjs +15 -13
  129. package/esm2022/list/list-total.component.mjs +31 -0
  130. package/esm2022/list/list-views.component.mjs +86 -0
  131. package/esm2022/list/list.component.mjs +1394 -0
  132. package/{esm2020 → esm2022}/list/list.model.mjs +4 -1
  133. package/esm2022/list/list.module.mjs +145 -0
  134. package/esm2022/list/list.pipes.mjs +45 -0
  135. package/esm2022/list/virtual-scroller.mjs +1124 -0
  136. package/esm2022/menu/menu-item.component.mjs +111 -0
  137. package/esm2022/menu/menu.component.mjs +218 -0
  138. package/esm2022/menu/menu.model.mjs +23 -0
  139. package/esm2022/menu/menu.module.mjs +60 -0
  140. package/{esm2020 → esm2022}/ngx-lib.module.mjs +65 -65
  141. package/esm2022/page-layout/page-layout.component.mjs +41 -0
  142. package/{esm2020 → esm2022}/page-layout/page-layout.module.mjs +13 -13
  143. package/esm2022/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +48 -0
  144. package/esm2022/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +82 -0
  145. package/esm2022/profile-data-views-list/profile-data-views-list.component.mjs +131 -0
  146. package/esm2022/profile-data-views-list/profile-data-views-list.module.mjs +89 -0
  147. package/esm2022/quantity-selector/quantity-selector-validation.directive.mjs +53 -0
  148. package/{esm2020 → esm2022}/quantity-selector/quantity-selector.component.mjs +83 -73
  149. package/esm2022/quantity-selector/quantity-selector.module.mjs +83 -0
  150. package/{esm2020 → esm2022}/quantity-selector/quantity-selector.pipes.mjs +4 -4
  151. package/esm2022/query-builder/common/model/type-map.mjs +28 -0
  152. package/esm2022/query-builder/common/services/output-query.service.mjs +118 -0
  153. package/esm2022/query-builder/common/services/query-structure.service.mjs +263 -0
  154. package/esm2022/query-builder/common/services/type-convertor.service.mjs +42 -0
  155. package/esm2022/query-builder/query-builder-item/query-builder-item.component.mjs +134 -0
  156. package/esm2022/query-builder/query-builder-section/query-builder-section.component.mjs +76 -0
  157. package/esm2022/query-builder/query-builder.component.mjs +116 -0
  158. package/esm2022/query-builder/query-builder.module.mjs +71 -0
  159. package/{esm2020 → esm2022}/query-builder/query-builder.service.mjs +4 -4
  160. package/esm2022/remote-loader/addon-block-loader.component.mjs +115 -0
  161. package/esm2022/remote-loader/addon-block-loader.service.mjs +66 -0
  162. package/esm2022/remote-loader/remote-loader-element.component.mjs +179 -0
  163. package/esm2022/remote-loader/remote-loader.component.mjs +120 -0
  164. package/{esm2020 → esm2022}/remote-loader/remote-loader.module.mjs +26 -26
  165. package/esm2022/remote-loader/remote-loader.service.mjs +107 -0
  166. package/{esm2020 → esm2022}/rich-html-textarea/rich-html-textarea.component.mjs +38 -30
  167. package/esm2022/rich-html-textarea/rich-html-textarea.module.mjs +96 -0
  168. package/esm2022/search/search.component.mjs +322 -0
  169. package/esm2022/search/search.module.mjs +71 -0
  170. package/esm2022/select/select.component.mjs +341 -0
  171. package/esm2022/select/select.module.mjs +71 -0
  172. package/esm2022/select-panel/select-panel.component.mjs +161 -0
  173. package/{esm2020 → esm2022}/select-panel/select-panel.module.mjs +31 -31
  174. package/esm2022/separator/separator.component.mjs +65 -0
  175. package/{esm2020 → esm2022}/separator/separator.module.mjs +5 -5
  176. package/esm2022/side-bar/side-bar.component.mjs +141 -0
  177. package/esm2022/side-bar/side-bar.module.mjs +56 -0
  178. package/esm2022/signature/signature-dialog.component.mjs +82 -0
  179. package/{esm2020 → esm2022}/signature/signature.component.mjs +41 -31
  180. package/esm2022/signature/signature.module.mjs +92 -0
  181. package/esm2022/size-detector/size-detector.component.mjs +97 -0
  182. package/{esm2020 → esm2022}/size-detector/size-detector.module.mjs +13 -13
  183. package/esm2022/skeleton-loader/skeleton-loader.component.mjs +46 -0
  184. package/{esm2020 → esm2022}/skeleton-loader/skeleton-loader.module.mjs +7 -7
  185. package/esm2022/slider/slider.component.mjs +105 -0
  186. package/{esm2020 → esm2022}/slider/slider.module.mjs +17 -17
  187. package/esm2022/smart-filters/boolean-filter/boolean-filter.component.mjs +74 -0
  188. package/esm2022/smart-filters/common/filter-actions.component.mjs +28 -0
  189. package/esm2022/smart-filters/common/model/base-filter-component.mjs +307 -0
  190. package/esm2022/smart-filters/common/model/field.mjs +125 -0
  191. package/esm2022/smart-filters/common/model/operator.mjs +287 -0
  192. package/esm2022/smart-filters/date-filter/date-filter.component.mjs +181 -0
  193. package/esm2022/smart-filters/multi-select-filter/multi-select-filter.component.mjs +202 -0
  194. package/esm2022/smart-filters/number-filter/number-filter.component.mjs +133 -0
  195. package/esm2022/smart-filters/smart-filters.component.mjs +143 -0
  196. package/esm2022/smart-filters/smart-filters.module.mjs +159 -0
  197. package/esm2022/smart-filters/text-filter/text-filter.component.mjs +110 -0
  198. package/esm2022/snack-bar/default-snack-bar.component.mjs +31 -0
  199. package/esm2022/snack-bar/snack-bar.component.mjs +28 -0
  200. package/esm2022/snack-bar/snack-bar.model.mjs +9 -0
  201. package/esm2022/snack-bar/snack-bar.module.mjs +63 -0
  202. package/esm2022/snack-bar/snack-bar.service.mjs +62 -0
  203. package/{esm2020 → esm2022}/textarea/textarea.component.mjs +35 -27
  204. package/esm2022/textarea/textarea.module.mjs +83 -0
  205. package/esm2022/textbox/textbox-validation.directive.mjs +96 -0
  206. package/esm2022/textbox/textbox.component.mjs +646 -0
  207. package/esm2022/textbox/textbox.module.mjs +73 -0
  208. package/esm2022/textbox-icon/textbox-icon.component.mjs +50 -0
  209. package/esm2022/textbox-icon/textbox-icon.module.mjs +65 -0
  210. package/esm2022/top-bar/top-bar.component.mjs +127 -0
  211. package/esm2022/top-bar/top-bar.module.mjs +63 -0
  212. package/fesm2022/pepperi-addons-ngx-lib-address.mjs +173 -0
  213. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-address.mjs.map +1 -1
  214. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-attachment.mjs +84 -80
  215. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-attachment.mjs.map +1 -1
  216. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-bread-crumbs.mjs +34 -28
  217. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -1
  218. package/fesm2022/pepperi-addons-ngx-lib-button.mjs +227 -0
  219. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-button.mjs.map +1 -1
  220. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-carousel.mjs +76 -55
  221. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-carousel.mjs.map +1 -1
  222. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-checkbox.mjs +54 -48
  223. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -1
  224. package/fesm2022/pepperi-addons-ngx-lib-chips.mjs +308 -0
  225. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-chips.mjs.map +1 -1
  226. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-color.mjs +92 -84
  227. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-color.mjs.map +1 -1
  228. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-date.mjs +116 -104
  229. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-date.mjs.map +1 -1
  230. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-dialog.mjs +50 -36
  231. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-dialog.mjs.map +1 -1
  232. package/fesm2022/pepperi-addons-ngx-lib-draggable-items.mjs +229 -0
  233. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -1
  234. package/fesm2022/pepperi-addons-ngx-lib-field-title.mjs +101 -0
  235. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-field-title.mjs.map +1 -1
  236. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-files-uploader.mjs +66 -56
  237. package/fesm2022/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
  238. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-form.mjs +391 -310
  239. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-form.mjs.map +1 -1
  240. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-group-buttons.mjs +38 -35
  241. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -1
  242. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-icon.mjs +23 -18
  243. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-icon.mjs.map +1 -1
  244. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-image.mjs +77 -68
  245. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-image.mjs.map +1 -1
  246. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-images-filmstrip.mjs +83 -60
  247. package/fesm2022/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
  248. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-link.mjs +113 -103
  249. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-link.mjs.map +1 -1
  250. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-list.mjs +339 -273
  251. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-list.mjs.map +1 -1
  252. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-menu.mjs +89 -87
  253. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-menu.mjs.map +1 -1
  254. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-page-layout.mjs +23 -17
  255. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -1
  256. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-profile-data-views-list.mjs +72 -63
  257. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -1
  258. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-quantity-selector.mjs +125 -110
  259. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -1
  260. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-query-builder.mjs +93 -66
  261. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -1
  262. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-remote-loader.mjs +84 -64
  263. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -1
  264. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-rich-html-textarea.mjs +76 -67
  265. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -1
  266. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-search.mjs +85 -79
  267. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-search.mjs.map +1 -1
  268. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-select-panel.mjs +53 -49
  269. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -1
  270. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-select.mjs +74 -66
  271. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-select.mjs.map +1 -1
  272. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-separator.mjs +18 -16
  273. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-separator.mjs.map +1 -1
  274. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-side-bar.mjs +44 -38
  275. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -1
  276. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-signature.mjs +95 -81
  277. package/fesm2022/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
  278. package/fesm2022/pepperi-addons-ngx-lib-size-detector.mjs +139 -0
  279. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -1
  280. package/fesm2022/pepperi-addons-ngx-lib-skeleton-loader.mjs +78 -0
  281. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-skeleton-loader.mjs.map +1 -1
  282. package/fesm2022/pepperi-addons-ngx-lib-slider.mjs +154 -0
  283. package/fesm2022/pepperi-addons-ngx-lib-slider.mjs.map +1 -0
  284. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-smart-filters.mjs +186 -158
  285. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -1
  286. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-snack-bar.mjs +42 -34
  287. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -1
  288. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-textarea.mjs +67 -58
  289. package/{fesm2015 → fesm2022}/pepperi-addons-ngx-lib-textarea.mjs.map +1 -1
  290. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-textbox-icon.mjs +28 -25
  291. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-textbox-icon.mjs.map +1 -1
  292. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-textbox.mjs +156 -144
  293. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-textbox.mjs.map +1 -1
  294. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-top-bar.mjs +48 -32
  295. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -1
  296. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib.mjs +661 -449
  297. package/{fesm2020 → fesm2022}/pepperi-addons-ngx-lib.mjs.map +1 -1
  298. package/field-title/field-title.component.d.ts +1 -1
  299. package/files-uploader/files-uploader.component.d.ts +1 -1
  300. package/form/field-generator.component.d.ts +1 -1
  301. package/form/form.component.d.ts +1 -1
  302. package/form/form.module.d.ts +2 -2
  303. package/form/indicators.component.d.ts +1 -1
  304. package/form/internal-button.component.d.ts +1 -1
  305. package/form/internal-carusel.component.d.ts +1 -1
  306. package/form/internal-field-generator.component.d.ts +1 -1
  307. package/form/internal-form.component.d.ts +1 -1
  308. package/form/internal-list.component.d.ts +1 -1
  309. package/form/internal-menu.component.d.ts +1 -1
  310. package/form/internal-page.component.d.ts +1 -1
  311. package/group-buttons/group-buttons.component.d.ts +1 -1
  312. package/icon/icon.component.d.ts +1 -1
  313. package/image/image.component.d.ts +1 -1
  314. package/images-filmstrip/images-filmstrip.component.d.ts +1 -1
  315. package/link/link.component.d.ts +1 -1
  316. package/list/list-actions.component.d.ts +1 -1
  317. package/list/list-carousel.component.d.ts +1 -1
  318. package/list/list-chooser.component.d.ts +1 -1
  319. package/list/list-pager.component.d.ts +1 -1
  320. package/list/list-sorting.component.d.ts +1 -1
  321. package/list/list-total.component.d.ts +1 -1
  322. package/list/list-views.component.d.ts +1 -1
  323. package/list/list.component.d.ts +1 -1
  324. package/list/virtual-scroller.d.ts +1 -1
  325. package/menu/menu-item.component.d.ts +1 -1
  326. package/menu/menu.component.d.ts +1 -1
  327. package/package.json +145 -235
  328. package/page-layout/page-layout.component.d.ts +1 -1
  329. package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +1 -1
  330. package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +1 -1
  331. package/profile-data-views-list/profile-data-views-list.component.d.ts +1 -1
  332. package/quantity-selector/quantity-selector-validation.directive.d.ts +1 -1
  333. package/quantity-selector/quantity-selector.component.d.ts +1 -1
  334. package/query-builder/query-builder-item/query-builder-item.component.d.ts +1 -1
  335. package/query-builder/query-builder-section/query-builder-section.component.d.ts +1 -1
  336. package/query-builder/query-builder.component.d.ts +1 -1
  337. package/remote-loader/addon-block-loader.component.d.ts +1 -1
  338. package/remote-loader/remote-loader-element.component.d.ts +1 -1
  339. package/remote-loader/remote-loader.component.d.ts +1 -1
  340. package/rich-html-textarea/rich-html-textarea.component.d.ts +1 -1
  341. package/search/search.component.d.ts +1 -1
  342. package/select/select.component.d.ts +1 -1
  343. package/select-panel/select-panel.component.d.ts +1 -1
  344. package/separator/separator.component.d.ts +1 -1
  345. package/side-bar/side-bar.component.d.ts +1 -1
  346. package/signature/signature-dialog.component.d.ts +2 -2
  347. package/signature/signature.component.d.ts +1 -1
  348. package/signature/signature.module.d.ts +2 -2
  349. package/size-detector/size-detector.component.d.ts +1 -1
  350. package/skeleton-loader/skeleton-loader.component.d.ts +1 -1
  351. package/slider/slider.component.d.ts +1 -1
  352. package/slider/slider.component.theme.scss +13 -6
  353. package/smart-filters/boolean-filter/boolean-filter.component.d.ts +1 -1
  354. package/smart-filters/common/filter-actions.component.d.ts +1 -1
  355. package/smart-filters/common/model/base-filter-component.d.ts +1 -1
  356. package/smart-filters/smart-filters.component.d.ts +1 -1
  357. package/snack-bar/snack-bar.component.d.ts +1 -1
  358. package/textarea/textarea.component.d.ts +1 -1
  359. package/textbox/textbox-validation.directive.d.ts +1 -1
  360. package/textbox/textbox.component.d.ts +1 -1
  361. package/textbox-icon/textbox-icon.component.d.ts +1 -1
  362. package/top-bar/top-bar.component.d.ts +1 -1
  363. package/esm2020/address/address.component.mjs +0 -109
  364. package/esm2020/bread-crumbs/bread-crumbs.component.mjs +0 -85
  365. package/esm2020/bread-crumbs/bread-crumbs.model.mjs +0 -7
  366. package/esm2020/bread-crumbs/bread-crumbs.module.mjs +0 -50
  367. package/esm2020/button/button.model.mjs +0 -6
  368. package/esm2020/carousel/carousel-item.directive.mjs +0 -33
  369. package/esm2020/carousel/carousel.component.mjs +0 -745
  370. package/esm2020/checkbox/checkbox.component.mjs +0 -177
  371. package/esm2020/checkbox/checkbox.module.mjs +0 -63
  372. package/esm2020/chips/chips.component.mjs +0 -185
  373. package/esm2020/chips/chips.module.mjs +0 -81
  374. package/esm2020/color/color-picker.component.mjs +0 -224
  375. package/esm2020/color/color.component.mjs +0 -90
  376. package/esm2020/color/color.module.mjs +0 -93
  377. package/esm2020/core/common/directives/auto-width.directive.mjs +0 -77
  378. package/esm2020/core/common/directives/base-destroyer.directive.mjs +0 -22
  379. package/esm2020/core/common/directives/button-blur.directive.mjs +0 -24
  380. package/esm2020/core/common/directives/button-loader.directive.mjs +0 -112
  381. package/esm2020/core/common/directives/data-qa.directive.mjs +0 -23
  382. package/esm2020/core/common/directives/div-loader.directive.mjs +0 -61
  383. package/esm2020/core/common/directives/menu-blur.directive.mjs +0 -32
  384. package/esm2020/core/common/directives/prevent-multi-click.directive.mjs +0 -27
  385. package/esm2020/core/common/directives/print.directive.mjs +0 -170
  386. package/esm2020/core/common/model/wapi.model.mjs +0 -157
  387. package/esm2020/core/common/pipes/common-pipes.mjs +0 -177
  388. package/esm2020/core/common/pipes/date-ago.pipe.mjs +0 -46
  389. package/esm2020/core/common/services/addon.service.mjs +0 -227
  390. package/esm2020/core/common/services/color.service.mjs +0 -385
  391. package/esm2020/core/common/services/cookie.service.mjs +0 -153
  392. package/esm2020/core/common/services/data-convertor.service.mjs +0 -122
  393. package/esm2020/core/common/services/file.service.mjs +0 -250
  394. package/esm2020/core/common/services/session.service.mjs +0 -72
  395. package/esm2020/core/common/services/translate.service.mjs +0 -46
  396. package/esm2020/core/common/services/utilities.service.mjs +0 -301
  397. package/esm2020/core/common/services/validator.service.mjs +0 -272
  398. package/esm2020/core/common/services/window-scrolling.service.mjs +0 -36
  399. package/esm2020/core/customization/customization.model.mjs +0 -338
  400. package/esm2020/core/customization/customization.service.mjs +0 -799
  401. package/esm2020/core/http/interceptors/loader.interceptor.mjs +0 -32
  402. package/esm2020/core/http/services/http.service.mjs +0 -155
  403. package/esm2020/core/layout/layout.service.mjs +0 -168
  404. package/esm2020/core/layout/rtl.directive.mjs +0 -44
  405. package/esm2020/core/portal/attach.directive.mjs +0 -27
  406. package/esm2020/core/portal/portal.service.mjs +0 -36
  407. package/esm2020/core/portal/target.directive.mjs +0 -24
  408. package/esm2020/date/date.component.mjs +0 -334
  409. package/esm2020/date/date.module.mjs +0 -88
  410. package/esm2020/dialog/default-dialog.component.mjs +0 -37
  411. package/esm2020/dialog/dialog.component.mjs +0 -36
  412. package/esm2020/dialog/dialog.model.mjs +0 -33
  413. package/esm2020/dialog/dialog.module.mjs +0 -59
  414. package/esm2020/dialog/dialog.service.mjs +0 -103
  415. package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +0 -67
  416. package/esm2020/draggable-items/draggable-items.component.mjs +0 -94
  417. package/esm2020/draggable-items/draggable-items.module.mjs +0 -64
  418. package/esm2020/field-title/field-title.component.mjs +0 -48
  419. package/esm2020/field-title/field-title.module.mjs +0 -47
  420. package/esm2020/files-uploader/files-uploader.module.mjs +0 -79
  421. package/esm2020/form/field-generator.component.mjs +0 -152
  422. package/esm2020/form/form.component.mjs +0 -1240
  423. package/esm2020/form/form.module.mjs +0 -179
  424. package/esm2020/form/indicators.component.mjs +0 -23
  425. package/esm2020/form/internal-button.component.mjs +0 -184
  426. package/esm2020/form/internal-carusel.component.mjs +0 -121
  427. package/esm2020/form/internal-carusel.service.mjs +0 -32
  428. package/esm2020/form/internal-field-generator.component.mjs +0 -146
  429. package/esm2020/form/internal-form.component.mjs +0 -1218
  430. package/esm2020/form/internal-list.component.mjs +0 -513
  431. package/esm2020/form/internal-menu.component.mjs +0 -64
  432. package/esm2020/form/internal-page.component.mjs +0 -361
  433. package/esm2020/form/internal-page.service.mjs +0 -120
  434. package/esm2020/group-buttons/group-buttons.component.mjs +0 -71
  435. package/esm2020/group-buttons/group-buttons.module.mjs +0 -59
  436. package/esm2020/icon/icon-registry.service.mjs +0 -26
  437. package/esm2020/icon/icon.component.mjs +0 -91
  438. package/esm2020/icon/icon.service.mjs +0 -31
  439. package/esm2020/image/image.module.mjs +0 -74
  440. package/esm2020/image/image.service.mjs +0 -50
  441. package/esm2020/images-filmstrip/images-filmstrip.component.mjs +0 -338
  442. package/esm2020/images-filmstrip/images-filmstrip.module.mjs +0 -83
  443. package/esm2020/link/link.component.mjs +0 -315
  444. package/esm2020/link/link.module.mjs +0 -80
  445. package/esm2020/list/list-actions.component.mjs +0 -44
  446. package/esm2020/list/list-carousel.component.mjs +0 -107
  447. package/esm2020/list/list-chooser.component.mjs +0 -64
  448. package/esm2020/list/list-pager.component.mjs +0 -120
  449. package/esm2020/list/list-total.component.mjs +0 -33
  450. package/esm2020/list/list-views.component.mjs +0 -85
  451. package/esm2020/list/list.component.mjs +0 -1382
  452. package/esm2020/list/list.module.mjs +0 -144
  453. package/esm2020/list/list.pipes.mjs +0 -47
  454. package/esm2020/list/virtual-scroller.mjs +0 -1080
  455. package/esm2020/menu/menu-item.component.mjs +0 -115
  456. package/esm2020/menu/menu.component.mjs +0 -216
  457. package/esm2020/menu/menu.model.mjs +0 -20
  458. package/esm2020/menu/menu.module.mjs +0 -59
  459. package/esm2020/page-layout/page-layout.component.mjs +0 -35
  460. package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +0 -45
  461. package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +0 -81
  462. package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +0 -127
  463. package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +0 -88
  464. package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +0 -49
  465. package/esm2020/quantity-selector/quantity-selector.module.mjs +0 -82
  466. package/esm2020/query-builder/common/model/type-map.mjs +0 -27
  467. package/esm2020/query-builder/common/services/output-query.service.mjs +0 -116
  468. package/esm2020/query-builder/common/services/query-structure.service.mjs +0 -258
  469. package/esm2020/query-builder/common/services/type-convertor.service.mjs +0 -42
  470. package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +0 -127
  471. package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +0 -71
  472. package/esm2020/query-builder/query-builder.component.mjs +0 -110
  473. package/esm2020/query-builder/query-builder.module.mjs +0 -70
  474. package/esm2020/remote-loader/addon-block-loader.component.mjs +0 -112
  475. package/esm2020/remote-loader/addon-block-loader.service.mjs +0 -65
  476. package/esm2020/remote-loader/remote-loader-element.component.mjs +0 -171
  477. package/esm2020/remote-loader/remote-loader.component.mjs +0 -115
  478. package/esm2020/remote-loader/remote-loader.service.mjs +0 -104
  479. package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +0 -95
  480. package/esm2020/search/search.component.mjs +0 -317
  481. package/esm2020/search/search.module.mjs +0 -70
  482. package/esm2020/select/select.component.mjs +0 -334
  483. package/esm2020/select/select.module.mjs +0 -70
  484. package/esm2020/select-panel/select-panel.component.mjs +0 -157
  485. package/esm2020/separator/separator.component.mjs +0 -63
  486. package/esm2020/side-bar/side-bar.component.mjs +0 -136
  487. package/esm2020/side-bar/side-bar.module.mjs +0 -55
  488. package/esm2020/signature/signature-dialog.component.mjs +0 -79
  489. package/esm2020/signature/signature.module.mjs +0 -91
  490. package/esm2020/size-detector/size-detector.component.mjs +0 -94
  491. package/esm2020/skeleton-loader/skeleton-loader.component.mjs +0 -44
  492. package/esm2020/slider/slider.component.mjs +0 -101
  493. package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +0 -75
  494. package/esm2020/smart-filters/common/filter-actions.component.mjs +0 -29
  495. package/esm2020/smart-filters/common/model/base-filter-component.mjs +0 -290
  496. package/esm2020/smart-filters/common/model/field.mjs +0 -117
  497. package/esm2020/smart-filters/common/model/operator.mjs +0 -280
  498. package/esm2020/smart-filters/date-filter/date-filter.component.mjs +0 -182
  499. package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +0 -200
  500. package/esm2020/smart-filters/number-filter/number-filter.component.mjs +0 -136
  501. package/esm2020/smart-filters/smart-filters.component.mjs +0 -141
  502. package/esm2020/smart-filters/smart-filters.module.mjs +0 -158
  503. package/esm2020/smart-filters/text-filter/text-filter.component.mjs +0 -113
  504. package/esm2020/snack-bar/default-snack-bar.component.mjs +0 -29
  505. package/esm2020/snack-bar/snack-bar.component.mjs +0 -26
  506. package/esm2020/snack-bar/snack-bar.model.mjs +0 -7
  507. package/esm2020/snack-bar/snack-bar.module.mjs +0 -63
  508. package/esm2020/snack-bar/snack-bar.service.mjs +0 -60
  509. package/esm2020/textarea/textarea.module.mjs +0 -82
  510. package/esm2020/textbox/textbox-validation.directive.mjs +0 -93
  511. package/esm2020/textbox/textbox.component.mjs +0 -638
  512. package/esm2020/textbox/textbox.module.mjs +0 -72
  513. package/esm2020/textbox-icon/textbox-icon.component.mjs +0 -48
  514. package/esm2020/textbox-icon/textbox-icon.module.mjs +0 -64
  515. package/esm2020/top-bar/top-bar.component.mjs +0 -112
  516. package/esm2020/top-bar/top-bar.module.mjs +0 -62
  517. package/fesm2015/pepperi-addons-ngx-lib-address.mjs +0 -170
  518. package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +0 -1
  519. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +0 -306
  520. package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs.map +0 -1
  521. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +0 -147
  522. package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +0 -1
  523. package/fesm2015/pepperi-addons-ngx-lib-button.mjs +0 -197
  524. package/fesm2015/pepperi-addons-ngx-lib-button.mjs.map +0 -1
  525. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +0 -804
  526. package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs.map +0 -1
  527. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +0 -246
  528. package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs.map +0 -1
  529. package/fesm2015/pepperi-addons-ngx-lib-chips.mjs +0 -306
  530. package/fesm2015/pepperi-addons-ngx-lib-chips.mjs.map +0 -1
  531. package/fesm2015/pepperi-addons-ngx-lib-color.mjs +0 -404
  532. package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +0 -1
  533. package/fesm2015/pepperi-addons-ngx-lib-date.mjs +0 -481
  534. package/fesm2015/pepperi-addons-ngx-lib-date.mjs.map +0 -1
  535. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs +0 -263
  536. package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs.map +0 -1
  537. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +0 -227
  538. package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs.map +0 -1
  539. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs +0 -102
  540. package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs.map +0 -1
  541. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +0 -331
  542. package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs.map +0 -1
  543. package/fesm2015/pepperi-addons-ngx-lib-form.mjs +0 -4232
  544. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +0 -136
  545. package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs.map +0 -1
  546. package/fesm2015/pepperi-addons-ngx-lib-icon.mjs +0 -741
  547. package/fesm2015/pepperi-addons-ngx-lib-image.mjs +0 -397
  548. package/fesm2015/pepperi-addons-ngx-lib-image.mjs.map +0 -1
  549. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +0 -426
  550. package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +0 -1
  551. package/fesm2015/pepperi-addons-ngx-lib-link.mjs +0 -414
  552. package/fesm2015/pepperi-addons-ngx-lib-link.mjs.map +0 -1
  553. package/fesm2015/pepperi-addons-ngx-lib-list.mjs +0 -3131
  554. package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +0 -1
  555. package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +0 -403
  556. package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs.map +0 -1
  557. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +0 -337
  558. package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +0 -1
  559. package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +0 -741
  560. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +0 -1226
  561. package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs.map +0 -1
  562. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +0 -644
  563. package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs.map +0 -1
  564. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +0 -363
  565. package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +0 -1
  566. package/fesm2015/pepperi-addons-ngx-lib-search.mjs +0 -393
  567. package/fesm2015/pepperi-addons-ngx-lib-search.mjs.map +0 -1
  568. package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs +0 -235
  569. package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs.map +0 -1
  570. package/fesm2015/pepperi-addons-ngx-lib-select.mjs +0 -410
  571. package/fesm2015/pepperi-addons-ngx-lib-select.mjs.map +0 -1
  572. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +0 -89
  573. package/fesm2015/pepperi-addons-ngx-lib-separator.mjs.map +0 -1
  574. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +0 -196
  575. package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs.map +0 -1
  576. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +0 -464
  577. package/fesm2015/pepperi-addons-ngx-lib-signature.mjs.map +0 -1
  578. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +0 -136
  579. package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs.map +0 -1
  580. package/fesm2015/pepperi-addons-ngx-lib-skeleton-loader.mjs +0 -78
  581. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs +0 -151
  582. package/fesm2015/pepperi-addons-ngx-lib-slider.mjs.map +0 -1
  583. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +0 -1731
  584. package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +0 -1
  585. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +0 -183
  586. package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs.map +0 -1
  587. package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +0 -286
  588. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs +0 -118
  589. package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs.map +0 -1
  590. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +0 -806
  591. package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +0 -1
  592. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +0 -180
  593. package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs.map +0 -1
  594. package/fesm2015/pepperi-addons-ngx-lib.mjs +0 -4995
  595. package/fesm2015/pepperi-addons-ngx-lib.mjs.map +0 -1
  596. package/fesm2020/pepperi-addons-ngx-lib-address.mjs +0 -170
  597. package/fesm2020/pepperi-addons-ngx-lib-button.mjs +0 -197
  598. package/fesm2020/pepperi-addons-ngx-lib-chips.mjs +0 -305
  599. package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +0 -226
  600. package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs +0 -102
  601. package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs.map +0 -1
  602. package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +0 -1
  603. package/fesm2020/pepperi-addons-ngx-lib-icon.mjs.map +0 -1
  604. package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +0 -1
  605. package/fesm2020/pepperi-addons-ngx-lib-menu.mjs.map +0 -1
  606. package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +0 -77
  607. package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs.map +0 -1
  608. package/fesm2020/pepperi-addons-ngx-lib-signature.mjs.map +0 -1
  609. package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +0 -136
  610. package/fesm2020/pepperi-addons-ngx-lib-skeleton-loader.mjs +0 -76
  611. package/fesm2020/pepperi-addons-ngx-lib-skeleton-loader.mjs.map +0 -1
  612. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs +0 -150
  613. package/fesm2020/pepperi-addons-ngx-lib-slider.mjs.map +0 -1
  614. package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +0 -1
  615. /package/{esm2020 → esm2022}/address/pepperi-addons-ngx-lib-address.mjs +0 -0
  616. /package/{esm2020 → esm2022}/address/public-api.mjs +0 -0
  617. /package/{esm2020 → esm2022}/attachment/pepperi-addons-ngx-lib-attachment.mjs +0 -0
  618. /package/{esm2020 → esm2022}/attachment/public-api.mjs +0 -0
  619. /package/{esm2020 → esm2022}/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +0 -0
  620. /package/{esm2020 → esm2022}/bread-crumbs/public-api.mjs +0 -0
  621. /package/{esm2020 → esm2022}/button/pepperi-addons-ngx-lib-button.mjs +0 -0
  622. /package/{esm2020 → esm2022}/button/public-api.mjs +0 -0
  623. /package/{esm2020 → esm2022}/carousel/pepperi-addons-ngx-lib-carousel.mjs +0 -0
  624. /package/{esm2020 → esm2022}/carousel/public-api.mjs +0 -0
  625. /package/{esm2020 → esm2022}/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +0 -0
  626. /package/{esm2020 → esm2022}/checkbox/public-api.mjs +0 -0
  627. /package/{esm2020 → esm2022}/chips/chips.model.mjs +0 -0
  628. /package/{esm2020 → esm2022}/chips/pepperi-addons-ngx-lib-chips.mjs +0 -0
  629. /package/{esm2020 → esm2022}/chips/public-api.mjs +0 -0
  630. /package/{esm2020 → esm2022}/color/color.model.mjs +0 -0
  631. /package/{esm2020 → esm2022}/color/pepperi-addons-ngx-lib-color.mjs +0 -0
  632. /package/{esm2020 → esm2022}/color/public-api.mjs +0 -0
  633. /package/{esm2020 → esm2022}/core/clipboard/index.mjs +0 -0
  634. /package/{esm2020 → esm2022}/core/clipboard/public-api.mjs +0 -0
  635. /package/{esm2020 → esm2022}/core/common/directives/index.mjs +0 -0
  636. /package/{esm2020 → esm2022}/core/common/directives/public-api.mjs +0 -0
  637. /package/{esm2020 → esm2022}/core/common/index.mjs +0 -0
  638. /package/{esm2020 → esm2022}/core/common/model/index.mjs +0 -0
  639. /package/{esm2020 → esm2022}/core/common/model/papi.model.mjs +0 -0
  640. /package/{esm2020 → esm2022}/core/common/model/public-api.mjs +0 -0
  641. /package/{esm2020 → esm2022}/core/common/model/utilities.model.mjs +0 -0
  642. /package/{esm2020 → esm2022}/core/common/pipes/index.mjs +0 -0
  643. /package/{esm2020 → esm2022}/core/common/pipes/public-api.mjs +0 -0
  644. /package/{esm2020 → esm2022}/core/common/public-api.mjs +0 -0
  645. /package/{esm2020 → esm2022}/core/common/services/index.mjs +0 -0
  646. /package/{esm2020 → esm2022}/core/common/services/public-api.mjs +0 -0
  647. /package/{esm2020 → esm2022}/core/customization/index.mjs +0 -0
  648. /package/{esm2020 → esm2022}/core/customization/public-api.mjs +0 -0
  649. /package/{esm2020 → esm2022}/core/http/index.mjs +0 -0
  650. /package/{esm2020 → esm2022}/core/http/interceptors/index.mjs +0 -0
  651. /package/{esm2020 → esm2022}/core/http/public-api.mjs +0 -0
  652. /package/{esm2020 → esm2022}/core/index.mjs +0 -0
  653. /package/{esm2020 → esm2022}/core/layout/index.mjs +0 -0
  654. /package/{esm2020 → esm2022}/core/layout/public-api.mjs +0 -0
  655. /package/{esm2020 → esm2022}/core/portal/index.mjs +0 -0
  656. /package/{esm2020 → esm2022}/core/portal/public-api.mjs +0 -0
  657. /package/{esm2020 → esm2022}/core/public-api.mjs +0 -0
  658. /package/{esm2020 → esm2022}/core/scroll-to/index.mjs +0 -0
  659. /package/{esm2020 → esm2022}/core/scroll-to/public-api.mjs +0 -0
  660. /package/{esm2020 → esm2022}/date/pepperi-addons-ngx-lib-date.mjs +0 -0
  661. /package/{esm2020 → esm2022}/date/public-api.mjs +0 -0
  662. /package/{esm2020 → esm2022}/dialog/pepperi-addons-ngx-lib-dialog.mjs +0 -0
  663. /package/{esm2020 → esm2022}/dialog/public-api.mjs +0 -0
  664. /package/{esm2020 → esm2022}/draggable-items/draggable-items.model.mjs +0 -0
  665. /package/{esm2020 → esm2022}/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +0 -0
  666. /package/{esm2020 → esm2022}/draggable-items/public-api.mjs +0 -0
  667. /package/{esm2020 → esm2022}/field-title/pepperi-addons-ngx-lib-field-title.mjs +0 -0
  668. /package/{esm2020 → esm2022}/field-title/public-api.mjs +0 -0
  669. /package/{esm2020 → esm2022}/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +0 -0
  670. /package/{esm2020 → esm2022}/files-uploader/public-api.mjs +0 -0
  671. /package/{esm2020 → esm2022}/form/form.model.mjs +0 -0
  672. /package/{esm2020 → esm2022}/form/pepperi-addons-ngx-lib-form.mjs +0 -0
  673. /package/{esm2020 → esm2022}/form/public-api.mjs +0 -0
  674. /package/{esm2020 → esm2022}/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +0 -0
  675. /package/{esm2020 → esm2022}/group-buttons/public-api.mjs +0 -0
  676. /package/{esm2020 → esm2022}/icon/icon-generated-all.model.mjs +0 -0
  677. /package/{esm2020 → esm2022}/icon/icon-generated.model.mjs +0 -0
  678. /package/{esm2020 → esm2022}/icon/pepperi-addons-ngx-lib-icon.mjs +0 -0
  679. /package/{esm2020 → esm2022}/icon/public-api.mjs +0 -0
  680. /package/{esm2020 → esm2022}/image/pepperi-addons-ngx-lib-image.mjs +0 -0
  681. /package/{esm2020 → esm2022}/image/public-api.mjs +0 -0
  682. /package/{esm2020 → esm2022}/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +0 -0
  683. /package/{esm2020 → esm2022}/images-filmstrip/public-api.mjs +0 -0
  684. /package/{esm2020 → esm2022}/link/pepperi-addons-ngx-lib-link.mjs +0 -0
  685. /package/{esm2020 → esm2022}/link/public-api.mjs +0 -0
  686. /package/{esm2020 → esm2022}/list/pepperi-addons-ngx-lib-list.mjs +0 -0
  687. /package/{esm2020 → esm2022}/list/public-api.mjs +0 -0
  688. /package/{esm2020 → esm2022}/menu/pepperi-addons-ngx-lib-menu.mjs +0 -0
  689. /package/{esm2020 → esm2022}/menu/public-api.mjs +0 -0
  690. /package/{esm2020 → esm2022}/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +0 -0
  691. /package/{esm2020 → esm2022}/page-layout/public-api.mjs +0 -0
  692. /package/{esm2020 → esm2022}/pepperi-addons-ngx-lib.mjs +0 -0
  693. /package/{esm2020 → esm2022}/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +0 -0
  694. /package/{esm2020 → esm2022}/profile-data-views-list/profile-data-views-list.model.mjs +0 -0
  695. /package/{esm2020 → esm2022}/profile-data-views-list/public-api.mjs +0 -0
  696. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  697. /package/{esm2020 → esm2022}/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +0 -0
  698. /package/{esm2020 → esm2022}/quantity-selector/public-api.mjs +0 -0
  699. /package/{esm2020 → esm2022}/query-builder/common/model/field.mjs +0 -0
  700. /package/{esm2020 → esm2022}/query-builder/common/model/filter.mjs +0 -0
  701. /package/{esm2020 → esm2022}/query-builder/common/model/legacy.mjs +0 -0
  702. /package/{esm2020 → esm2022}/query-builder/common/model/operator-unit.mjs +0 -0
  703. /package/{esm2020 → esm2022}/query-builder/common/model/operator.mjs +0 -0
  704. /package/{esm2020 → esm2022}/query-builder/common/model/structure.mjs +0 -0
  705. /package/{esm2020 → esm2022}/query-builder/common/model/type.mjs +0 -0
  706. /package/{esm2020 → esm2022}/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +0 -0
  707. /package/{esm2020 → esm2022}/query-builder/public-api.mjs +0 -0
  708. /package/{esm2020 → esm2022}/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +0 -0
  709. /package/{esm2020 → esm2022}/remote-loader/public-api.mjs +0 -0
  710. /package/{esm2020 → esm2022}/remote-loader/remote-loader.model.mjs +0 -0
  711. /package/{esm2020 → esm2022}/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +0 -0
  712. /package/{esm2020 → esm2022}/rich-html-textarea/public-api.mjs +0 -0
  713. /package/{esm2020 → esm2022}/search/pepperi-addons-ngx-lib-search.mjs +0 -0
  714. /package/{esm2020 → esm2022}/search/public-api.mjs +0 -0
  715. /package/{esm2020 → esm2022}/search/search.model.mjs +0 -0
  716. /package/{esm2020 → esm2022}/select/pepperi-addons-ngx-lib-select.mjs +0 -0
  717. /package/{esm2020 → esm2022}/select/public-api.mjs +0 -0
  718. /package/{esm2020 → esm2022}/select-panel/pepperi-addons-ngx-lib-select-panel.mjs +0 -0
  719. /package/{esm2020 → esm2022}/select-panel/public-api.mjs +0 -0
  720. /package/{esm2020 → esm2022}/select-panel/select-panel.model.mjs +0 -0
  721. /package/{esm2020 → esm2022}/separator/pepperi-addons-ngx-lib-separator.mjs +0 -0
  722. /package/{esm2020 → esm2022}/separator/public-api.mjs +0 -0
  723. /package/{esm2020 → esm2022}/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +0 -0
  724. /package/{esm2020 → esm2022}/side-bar/public-api.mjs +0 -0
  725. /package/{esm2020 → esm2022}/side-bar/side-bar.model.mjs +0 -0
  726. /package/{esm2020 → esm2022}/signature/pepperi-addons-ngx-lib-signature.mjs +0 -0
  727. /package/{esm2020 → esm2022}/signature/public-api.mjs +0 -0
  728. /package/{esm2020 → esm2022}/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +0 -0
  729. /package/{esm2020 → esm2022}/size-detector/public-api.mjs +0 -0
  730. /package/{esm2020 → esm2022}/skeleton-loader/pepperi-addons-ngx-lib-skeleton-loader.mjs +0 -0
  731. /package/{esm2020 → esm2022}/skeleton-loader/public-api.mjs +0 -0
  732. /package/{esm2020 → esm2022}/slider/pepperi-addons-ngx-lib-slider.mjs +0 -0
  733. /package/{esm2020 → esm2022}/slider/public-api.mjs +0 -0
  734. /package/{esm2020 → esm2022}/smart-filters/common/model/creator.mjs +0 -0
  735. /package/{esm2020 → esm2022}/smart-filters/common/model/filter.mjs +0 -0
  736. /package/{esm2020 → esm2022}/smart-filters/common/model/type.mjs +0 -0
  737. /package/{esm2020 → esm2022}/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +0 -0
  738. /package/{esm2020 → esm2022}/smart-filters/public-api.mjs +0 -0
  739. /package/{esm2020 → esm2022}/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +0 -0
  740. /package/{esm2020 → esm2022}/snack-bar/public-api.mjs +0 -0
  741. /package/{esm2020 → esm2022}/textarea/pepperi-addons-ngx-lib-textarea.mjs +0 -0
  742. /package/{esm2020 → esm2022}/textarea/public-api.mjs +0 -0
  743. /package/{esm2020 → esm2022}/textbox/pepperi-addons-ngx-lib-textbox.mjs +0 -0
  744. /package/{esm2020 → esm2022}/textbox/public-api.mjs +0 -0
  745. /package/{esm2020 → esm2022}/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.mjs +0 -0
  746. /package/{esm2020 → esm2022}/textbox-icon/public-api.mjs +0 -0
  747. /package/{esm2020 → esm2022}/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +0 -0
  748. /package/{esm2020 → esm2022}/top-bar/public-api.mjs +0 -0
  749. /package/{esm2020 → esm2022}/top-bar/top-bar.model.mjs +0 -0
@@ -0,0 +1,802 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../common/services/session.service";
5
+ import * as i2 from "../common/services/file.service";
6
+ import * as i3 from "@angular/forms";
7
+ export class PepCustomizationService {
8
+ sessionService;
9
+ fileService;
10
+ fb;
11
+ static STAND_ALONE_FIELD_CLASS_NAME = 'pep-field';
12
+ static STAND_ALONE_FIELD_NO_SPACING_CLASS_NAME = 'pep-field-no-spacing';
13
+ static REM_STRING = 'rem';
14
+ static PX_STRING = 'px';
15
+ static USER_THEME = 'user_theme';
16
+ static USER_COLOR = 'user_color';
17
+ static USER_THEME_VARIABLES = 'user_theme_variables';
18
+ // Header height
19
+ static HEADER_HEIGHT_KEY = '--pep-header-height';
20
+ // Side bar variables keys
21
+ static SIDE_BAR_WIDTH_KEY = '--pep-side-bar-width';
22
+ // Settings width
23
+ static SETTINGS_WIDTH_KEY = '--pep-settings-bar-width';
24
+ // Top bar variables keys
25
+ static TOP_BAR_SPACING_TOP_KEY = '--pep-top-bar-spacing-top';
26
+ static TOP_BAR_SPACING_BOTTOM_KEY = '--pep-top-bar-spacing-bottom';
27
+ static TOP_BAR_FIELD_HEIGHT_KEY = '--pep-top-bar-field-height';
28
+ // Footer variables keys
29
+ static FOOTER_HEIGHT_KEY = '--pep-footer-bar-height';
30
+ static FOOTER_BAR_SPACING_TOP_KEY = '--pep-footer-bar-spacing-top';
31
+ static FOOTER_BAR_SPACING_BOTTOM_KEY = '--pep-footer-bar-spacing-bottom';
32
+ // Main container height
33
+ static MAIN_HEIGHT_KEY = '--pep-main-height';
34
+ // Colors variables keys
35
+ static COLOR_USER_PRIMARY_KEY = '--pep-color-user-primary';
36
+ static COLOR_USER_SECONDARY_KEY = '--pep-color-user-secondary';
37
+ static COLOR_SYSTEM_PRIMARY_INVERT_KEY = '--pep-color-system-primary-invert';
38
+ static COLOR_SYSTEM_PRIMARY_KEY = '--pep-color-system-primary';
39
+ static COLOR_TEXT_LINK_KEY = '--pep-color-text-link';
40
+ static COLOR_SYSTEM_CAUTION_KEY = '--pep-color-system-caution';
41
+ static COLOR_SYSTEM_SUCCESS_KEY = '--pep-color-system-success';
42
+ static COLOR_STRONG_KEY = '--pep-color-strong';
43
+ static COLOR_REGULAR_KEY = '--pep-color-regular';
44
+ static COLOR_WEAK_KEY = '--pep-color-weak';
45
+ // Top header variables keys
46
+ static COLOR_TOP_LEGACY_KEY = '--pep-color-legacy';
47
+ static COLOR_TOP_HEADER_KEY = '--pep-color-top-header';
48
+ static STYLE_TOP_HEADER_KEY = '--pep-style-top-header';
49
+ // Loader variables keys
50
+ static COLOR_LOADER_KEY = '--pep-color-loader';
51
+ // QS variables keys
52
+ static COLOR_QS_KEY = '--pep-color-qs';
53
+ static STYLE_QS_KEY = '--pep-style-qs';
54
+ // Fonts variables keys
55
+ static FONT_FAMILY_TITLE_KEY = '--pep-font-family-title';
56
+ static FONT_FAMILY_TITLE_NORMAL_URL_KEY = '--pep-font-family-title-normal-url';
57
+ static FONT_FAMILY_TITLE_BOLD_URL_KEY = '--pep-font-family-title-bold-url';
58
+ static FONT_FAMILY_BODY_KEY = '--pep-font-family-body';
59
+ static FONT_FAMILY_BODY_NORMAL_URL_KEY = '--pep-font-family-body-normal-url';
60
+ static FONT_FAMILY_BODY_BOLD_URL_KEY = '--pep-font-family-body-bold-url';
61
+ // Border radius variables keys
62
+ static BORDER_RADIUS_KEY = '--pep-border-radius';
63
+ static BORDER_RADIUS_SM_KEY = PepCustomizationService.BORDER_RADIUS_KEY + '-sm';
64
+ static BORDER_RADIUS_MD_KEY = PepCustomizationService.BORDER_RADIUS_KEY + '-md';
65
+ static BORDER_RADIUS_LG_KEY = PepCustomizationService.BORDER_RADIUS_KEY + '-lg';
66
+ static BORDER_RADIUS_XL_KEY = PepCustomizationService.BORDER_RADIUS_KEY + '-xl';
67
+ // Fonts variables keys
68
+ static FONT_SIZE_2XS_KEY = '--pep-font-size-2xs';
69
+ static FONT_SIZE_XS_KEY = '--pep-font-size-xs';
70
+ static FONT_SIZE_SM_KEY = '--pep-font-size-sm';
71
+ static FONT_SIZE_MD_KEY = '--pep-font-size-md';
72
+ static FONT_SIZE_LG_KEY = '--pep-font-size-lg';
73
+ static FONT_SIZE_XL_KEY = '--pep-font-size-xl';
74
+ static FONT_SIZE_2XL_KEY = '--pep-font-size-2xl';
75
+ // Line height variables keys
76
+ static LINE_HEIGHT_2XS_KEY = '--pep-line-height-2xs';
77
+ static LINE_HEIGHT_XS_KEY = '--pep-line-height-xs';
78
+ static LINE_HEIGHT_SM_KEY = '--pep-line-height-sm';
79
+ static LINE_HEIGHT_MD_KEY = '--pep-line-height-md';
80
+ static LINE_HEIGHT_LG_KEY = '--pep-line-height-lg';
81
+ static LINE_HEIGHT_XL_KEY = '--pep-line-height-xl';
82
+ static LINE_HEIGHT_2XL_KEY = '--pep-line-height-2xl';
83
+ // Shadows offset variables keys
84
+ static SHADOW_NONE_OFFSET_KEY = '--pep-shadow-none-offset';
85
+ static SHADOW_XS_OFFSET_KEY = '--pep-shadow-xs-offset';
86
+ static SHADOW_SM_OFFSET_KEY = '--pep-shadow-sm-offset';
87
+ static SHADOW_MD_OFFSET_KEY = '--pep-shadow-md-offset';
88
+ static SHADOW_LG_OFFSET_KEY = '--pep-shadow-lg-offset';
89
+ static SHADOW_XL_OFFSET_KEY = '--pep-shadow-xl-offset';
90
+ // Spacing variables keys
91
+ static SPACING_SIZE_2XS_KEY = '--pep-spacing-2xs';
92
+ static SPACING_SIZE_XS_KEY = '--pep-spacing-xs';
93
+ static SPACING_SIZE_SM_KEY = '--pep-spacing-sm';
94
+ static SPACING_SIZE_MD_KEY = '--pep-spacing-md';
95
+ static SPACING_SIZE_LG_KEY = '--pep-spacing-lg';
96
+ static SPACING_SIZE_XL_KEY = '--pep-spacing-xl';
97
+ static SPACING_SIZE_2XL_KEY = '--pep-spacing-2xl';
98
+ static SPACING_SIZE_3XL_KEY = '--pep-spacing-3xl';
99
+ static SPACING_SIZE_4XL_KEY = '--pep-spacing-4xl';
100
+ static SPACING_SIZE_5XL_KEY = '--pep-spacing-5xl';
101
+ static SPACING_SIZE_6XL_KEY = '--pep-spacing-6xl';
102
+ static SPACING_SIZE_7XL_KEY = '--pep-spacing-7xl';
103
+ static SPACING_SIZE_8XL_KEY = '--pep-spacing-8xl';
104
+ static SPACING_SIZE_9XL_KEY = '--pep-spacing-9xl';
105
+ // Form variables keys
106
+ static FORM_FIELD_HEIGHT_KEY = '--pep-form-field-height';
107
+ static FORM_FIELD_TITLE_HEIGHT_KEY = '--pep-form-field-title-height';
108
+ static FORM_FIELD_SPACEING_KEY = '--pep-form-field-spacing';
109
+ static FORM_SPACEING_KEY = '--pep-form-spacing';
110
+ // Card variables keys
111
+ static CARD_FIELD_HEIGHT_KEY = '--pep-card-field-height';
112
+ static CARD_SPACEING_KEY = '--pep-card-spacing';
113
+ static CARD_SHADOW_OFFSET_KEY = '--pep-shadow-card-offset';
114
+ static CARD_BORDER_RADIUS_KEY = '--pep-card-border-radius';
115
+ // Table variables keys
116
+ static TABLE_FIELD_HEIGHT_KEY = '--pep-table-field-height';
117
+ static TABLE_SPACEING_KEY = '--pep-table-spacing';
118
+ static TABLE_BORDER_RADIUS_KEY = '--pep-table-border-radius';
119
+ // // Branding keys
120
+ // static BRANDING_LOGO_SRC = '--pep-branding-logo-src';
121
+ // static FAV_ICON_SRC = '--pep-favicon-src';
122
+ static DEFAULT_HEADER_HEIGHT = 64; // Default
123
+ static DEFAULT_SPINNER_COLOR = '#78aa00';
124
+ static DEFAULT_BRANDING_COLOR = '#fff';
125
+ hasCustomHomepage = null;
126
+ hasCustomHeader = null;
127
+ customHeaderHeight = PepCustomizationService.DEFAULT_HEADER_HEIGHT;
128
+ mainContHeight = 0;
129
+ footerHeight = new BehaviorSubject(0);
130
+ settingsWidth = new BehaviorSubject(0);
131
+ constructor(sessionService, fileService, fb) {
132
+ this.sessionService = sessionService;
133
+ this.fileService = fileService;
134
+ this.fb = fb;
135
+ this.hideFooter();
136
+ //
137
+ }
138
+ getDefaultFromGroup(field, withValidators = true) {
139
+ const validators = withValidators ? field.getValidators() : [];
140
+ const group = {};
141
+ group[field.key] = [
142
+ { value: field.value, disabled: field.disabled },
143
+ validators,
144
+ ];
145
+ return this.fb.group(group);
146
+ }
147
+ getFormControl(form, fieldKey, parentFieldKey = null) {
148
+ let formControl = null;
149
+ if (form && form.controls) {
150
+ if (parentFieldKey === null) {
151
+ formControl = form.controls[fieldKey];
152
+ }
153
+ else {
154
+ formControl = form.controls[parentFieldKey]?.get(fieldKey);
155
+ }
156
+ }
157
+ return formControl;
158
+ }
159
+ updateFormFieldValue(form, fieldKey, value = '', parentFieldKey = null) {
160
+ const formControl = this.getFormControl(form, fieldKey, parentFieldKey);
161
+ if (formControl) {
162
+ formControl.setValue(value);
163
+ }
164
+ }
165
+ updateFormField(form, field, value = '', parentField = null) {
166
+ const formControl = this.getFormControl(form, field.key, parentField?.key);
167
+ if (formControl) {
168
+ formControl.setValue(value);
169
+ // If disabled has changed.
170
+ if (formControl.disabled !== field.disabled) {
171
+ field.disabled ? formControl.disable() : formControl.enable();
172
+ const validators = field.getValidators();
173
+ formControl.setValidators(validators);
174
+ formControl.updateValueAndValidity();
175
+ }
176
+ }
177
+ }
178
+ calculateFormFieldHeight(withTitle = true, rowSpan = 1, standAlone = false) {
179
+ const themeVars = this.getThemeVariables();
180
+ const rowFieldHeight = this.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_HEIGHT_KEY);
181
+ const rowFieldTitleHeight = this.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_FIELD_TITLE_HEIGHT_KEY);
182
+ const rowFieldSpacingBottom = this.getNumberThemeVariable(themeVars, PepCustomizationService.FORM_SPACEING_KEY);
183
+ let fieldHeight = 0;
184
+ if (rowSpan === 1) {
185
+ fieldHeight =
186
+ (withTitle ? rowFieldTitleHeight : 0) + rowFieldHeight;
187
+ }
188
+ else {
189
+ const rowSpanCalc = withTitle ? rowSpan : rowSpan - 1;
190
+ fieldHeight =
191
+ rowSpan * rowFieldHeight +
192
+ rowSpanCalc * rowFieldTitleHeight +
193
+ (standAlone ? 0 : rowSpanCalc * rowFieldSpacingBottom);
194
+ }
195
+ return fieldHeight;
196
+ }
197
+ calculateCardRowsHeight(rowsCount = 1, withSpacing = true) {
198
+ const themeVars = this.getThemeVariables();
199
+ const cardFieldHeight = this.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_FIELD_HEIGHT_KEY);
200
+ const cardFieldSpacing = this.getNumberThemeVariable(themeVars, PepCustomizationService.CARD_SPACEING_KEY);
201
+ const fieldHeight = rowsCount * cardFieldHeight +
202
+ (rowsCount - 1) * (withSpacing ? cardFieldSpacing : 0);
203
+ return fieldHeight;
204
+ }
205
+ calculateTableRowsHeight(rowsCount = 1, withSpacing = true) {
206
+ const themeVars = this.getThemeVariables();
207
+ const tableFieldHeight = this.getNumberThemeVariable(themeVars, PepCustomizationService.TABLE_FIELD_HEIGHT_KEY);
208
+ const tableFieldSpacing = this.getNumberThemeVariable(themeVars, PepCustomizationService.TABLE_SPACEING_KEY);
209
+ const fieldHeight = rowsCount *
210
+ (tableFieldHeight + (withSpacing ? tableFieldSpacing * 2 : 0));
211
+ return fieldHeight;
212
+ }
213
+ calculateFieldHeight(layoutType = 'form', rowSpan, standAlone) {
214
+ let fieldHeight = 'inherit'; // Default for card (with no title)
215
+ if (layoutType === 'table') {
216
+ fieldHeight = this.getThemeVariable(PepCustomizationService.TABLE_FIELD_HEIGHT_KEY);
217
+ }
218
+ else if (layoutType === 'card') {
219
+ fieldHeight =
220
+ this.calculateCardRowsHeight(rowSpan, !standAlone) +
221
+ PepCustomizationService.REM_STRING;
222
+ }
223
+ else {
224
+ // Form
225
+ fieldHeight =
226
+ this.calculateFormFieldHeight(false, rowSpan, standAlone) +
227
+ PepCustomizationService.REM_STRING;
228
+ }
229
+ return fieldHeight;
230
+ }
231
+ getBrandingTheme() {
232
+ const themeObj = this.sessionService.getObject(PepCustomizationService.USER_THEME);
233
+ return (themeObj && themeObj.Theme) || 'default-theme'; // 'light-theme';
234
+ }
235
+ getDefaultThemeLayoutVariables(themeVars) {
236
+ // Declare default screen sizes.
237
+ themeVars['--pep-screen-max-size-2xs'] =
238
+ '460' + PepCustomizationService.PX_STRING;
239
+ themeVars['--pep-screen-max-size-xs'] =
240
+ '767' + PepCustomizationService.PX_STRING;
241
+ themeVars['--pep-screen-max-size-sm'] =
242
+ '991' + PepCustomizationService.PX_STRING;
243
+ themeVars['--pep-screen-max-size-md'] =
244
+ '1199' + PepCustomizationService.PX_STRING;
245
+ themeVars['--pep-screen-max-size-lg'] =
246
+ '1366' + PepCustomizationService.PX_STRING;
247
+ themeVars['--pep-screen-max-size-xl'] =
248
+ '1920' + PepCustomizationService.PX_STRING;
249
+ // Declare default top bar.
250
+ themeVars[PepCustomizationService.SIDE_BAR_WIDTH_KEY] =
251
+ '16' + PepCustomizationService.REM_STRING;
252
+ // Declare default top bar.
253
+ themeVars[PepCustomizationService.TOP_BAR_SPACING_TOP_KEY] =
254
+ '1.5' + PepCustomizationService.REM_STRING;
255
+ themeVars[PepCustomizationService.TOP_BAR_SPACING_BOTTOM_KEY] =
256
+ '0.5' + PepCustomizationService.REM_STRING;
257
+ themeVars[PepCustomizationService.TOP_BAR_FIELD_HEIGHT_KEY] =
258
+ '2.5' + PepCustomizationService.REM_STRING;
259
+ // Declare default footer.
260
+ themeVars[PepCustomizationService.FOOTER_BAR_SPACING_TOP_KEY] =
261
+ '0.75' + PepCustomizationService.REM_STRING;
262
+ themeVars[PepCustomizationService.FOOTER_BAR_SPACING_BOTTOM_KEY] =
263
+ '1.25' + PepCustomizationService.REM_STRING;
264
+ }
265
+ getDefaultThemeBorderRadiusVariables(themeVars) {
266
+ themeVars[PepCustomizationService.BORDER_RADIUS_SM_KEY] =
267
+ '0.125' + PepCustomizationService.REM_STRING;
268
+ themeVars[PepCustomizationService.BORDER_RADIUS_MD_KEY] =
269
+ '0.25' + PepCustomizationService.REM_STRING;
270
+ themeVars[PepCustomizationService.BORDER_RADIUS_LG_KEY] =
271
+ '0.5' + PepCustomizationService.REM_STRING;
272
+ themeVars[PepCustomizationService.BORDER_RADIUS_XL_KEY] =
273
+ '1' + PepCustomizationService.REM_STRING;
274
+ }
275
+ getDefaultThemeSpacingVariables(themeVars) {
276
+ themeVars[PepCustomizationService.SPACING_SIZE_2XS_KEY] =
277
+ '0.125' + PepCustomizationService.REM_STRING;
278
+ themeVars[PepCustomizationService.SPACING_SIZE_XS_KEY] =
279
+ '0.25' + PepCustomizationService.REM_STRING;
280
+ themeVars[PepCustomizationService.SPACING_SIZE_SM_KEY] =
281
+ '0.5' + PepCustomizationService.REM_STRING;
282
+ themeVars[PepCustomizationService.SPACING_SIZE_MD_KEY] =
283
+ '0.75' + PepCustomizationService.REM_STRING;
284
+ themeVars[PepCustomizationService.SPACING_SIZE_LG_KEY] =
285
+ '1' + PepCustomizationService.REM_STRING;
286
+ themeVars[PepCustomizationService.SPACING_SIZE_XL_KEY] =
287
+ '1.5' + PepCustomizationService.REM_STRING;
288
+ themeVars[PepCustomizationService.SPACING_SIZE_2XL_KEY] =
289
+ '2' + PepCustomizationService.REM_STRING;
290
+ themeVars[PepCustomizationService.SPACING_SIZE_3XL_KEY] =
291
+ '2.5' + PepCustomizationService.REM_STRING;
292
+ themeVars[PepCustomizationService.SPACING_SIZE_4XL_KEY] =
293
+ '3' + PepCustomizationService.REM_STRING;
294
+ themeVars[PepCustomizationService.SPACING_SIZE_5XL_KEY] =
295
+ '3.5' + PepCustomizationService.REM_STRING;
296
+ themeVars[PepCustomizationService.SPACING_SIZE_6XL_KEY] =
297
+ '5' + PepCustomizationService.REM_STRING;
298
+ themeVars[PepCustomizationService.SPACING_SIZE_7XL_KEY] =
299
+ '6' + PepCustomizationService.REM_STRING;
300
+ themeVars[PepCustomizationService.SPACING_SIZE_8XL_KEY] =
301
+ '8' + PepCustomizationService.REM_STRING;
302
+ themeVars[PepCustomizationService.SPACING_SIZE_9XL_KEY] =
303
+ '16' + PepCustomizationService.REM_STRING;
304
+ }
305
+ getDefaultThemeFontsVariables(themeVars) {
306
+ // Title font family
307
+ themeVars[PepCustomizationService.FONT_FAMILY_TITLE_KEY] = 'Nexa';
308
+ // Body font family
309
+ themeVars[PepCustomizationService.FONT_FAMILY_BODY_KEY] = 'Inter';
310
+ // Font sizes
311
+ themeVars[PepCustomizationService.FONT_SIZE_2XS_KEY] =
312
+ '0.625' + PepCustomizationService.REM_STRING;
313
+ themeVars[PepCustomizationService.FONT_SIZE_XS_KEY] =
314
+ '0.75' + PepCustomizationService.REM_STRING;
315
+ themeVars[PepCustomizationService.FONT_SIZE_SM_KEY] =
316
+ '0.875' + PepCustomizationService.REM_STRING;
317
+ themeVars[PepCustomizationService.FONT_SIZE_MD_KEY] =
318
+ '1' + PepCustomizationService.REM_STRING;
319
+ themeVars[PepCustomizationService.FONT_SIZE_LG_KEY] =
320
+ '1.125' + PepCustomizationService.REM_STRING;
321
+ themeVars[PepCustomizationService.FONT_SIZE_XL_KEY] =
322
+ '1.25' + PepCustomizationService.REM_STRING;
323
+ themeVars[PepCustomizationService.FONT_SIZE_2XL_KEY] =
324
+ '1.5' + PepCustomizationService.REM_STRING;
325
+ // Line height
326
+ themeVars[PepCustomizationService.LINE_HEIGHT_2XS_KEY] =
327
+ '0.75' + PepCustomizationService.REM_STRING;
328
+ themeVars[PepCustomizationService.LINE_HEIGHT_XS_KEY] =
329
+ '1' + PepCustomizationService.REM_STRING;
330
+ themeVars[PepCustomizationService.LINE_HEIGHT_SM_KEY] =
331
+ '1.25' + PepCustomizationService.REM_STRING;
332
+ themeVars[PepCustomizationService.LINE_HEIGHT_MD_KEY] =
333
+ '1.5' + PepCustomizationService.REM_STRING;
334
+ themeVars[PepCustomizationService.LINE_HEIGHT_LG_KEY] =
335
+ '1.75' + PepCustomizationService.REM_STRING;
336
+ themeVars[PepCustomizationService.LINE_HEIGHT_XL_KEY] =
337
+ '2' + PepCustomizationService.REM_STRING;
338
+ themeVars[PepCustomizationService.LINE_HEIGHT_2XL_KEY] =
339
+ '2.25' + PepCustomizationService.REM_STRING;
340
+ // Font weight
341
+ themeVars['--pep-font-weight-normal'] = 400;
342
+ themeVars['--pep-font-weight-bold'] = 600;
343
+ themeVars['--pep-font-weight-bolder'] = 800;
344
+ }
345
+ getDefaultThemeButtonsVariables(themeVars) {
346
+ themeVars['--pep-button-2xs-horizontal-spacing'] =
347
+ '0.25' + PepCustomizationService.REM_STRING;
348
+ themeVars['--pep-button-2xs-min-width'] =
349
+ '1' + PepCustomizationService.REM_STRING;
350
+ themeVars['--pep-button-2xs-height'] =
351
+ '1' + PepCustomizationService.REM_STRING;
352
+ themeVars['--pep-button-2xs-font-size'] =
353
+ 'var(' + PepCustomizationService.FONT_SIZE_2XS_KEY + ')';
354
+ // themeVars['--pep-button-2xs-icon-horizontal-spacing'] = '0.125' + PepCustomizationService.REM_STRING;
355
+ themeVars['--pep-button-xs-horizontal-spacing'] =
356
+ '0.5' + PepCustomizationService.REM_STRING;
357
+ themeVars['--pep-button-xs-min-width'] =
358
+ '1.5' + PepCustomizationService.REM_STRING;
359
+ themeVars['--pep-button-xs-height'] =
360
+ '1.5' + PepCustomizationService.REM_STRING;
361
+ themeVars['--pep-button-xs-font-size'] =
362
+ 'var(' + PepCustomizationService.FONT_SIZE_XS_KEY + ')';
363
+ // themeVars['--pep-button-xs-icon-horizontal-spacing'] = '0.25' + PepCustomizationService.REM_STRING;
364
+ themeVars['--pep-button-sm-horizontal-spacing'] =
365
+ '0.75' + PepCustomizationService.REM_STRING;
366
+ themeVars['--pep-button-sm-min-width'] =
367
+ '2' + PepCustomizationService.REM_STRING;
368
+ themeVars['--pep-button-sm-height'] =
369
+ '2' + PepCustomizationService.REM_STRING;
370
+ themeVars['--pep-button-sm-font-size'] =
371
+ 'var(' + PepCustomizationService.FONT_SIZE_SM_KEY + ')';
372
+ // themeVars['--pep-button-sm-icon-horizontal-spacing'] = '0.5' + PepCustomizationService.REM_STRING;
373
+ themeVars['--pep-button-md-horizontal-spacing'] =
374
+ '1' + PepCustomizationService.REM_STRING;
375
+ themeVars['--pep-button-md-min-width'] =
376
+ '2.5' + PepCustomizationService.REM_STRING;
377
+ themeVars['--pep-button-md-height'] =
378
+ '2.5' + PepCustomizationService.REM_STRING;
379
+ themeVars['--pep-button-md-font-size'] =
380
+ 'var(' + PepCustomizationService.FONT_SIZE_MD_KEY + ')';
381
+ // themeVars['--pep-button-md-icon-horizontal-spacing'] = '0.5' + PepCustomizationService.REM_STRING;
382
+ themeVars['--pep-button-lg-horizontal-spacing'] =
383
+ '1' + PepCustomizationService.REM_STRING;
384
+ themeVars['--pep-button-lg-min-width'] =
385
+ '3' + PepCustomizationService.REM_STRING;
386
+ themeVars['--pep-button-lg-height'] =
387
+ '3' + PepCustomizationService.REM_STRING;
388
+ themeVars['--pep-button-lg-font-size'] =
389
+ 'var(' + PepCustomizationService.FONT_SIZE_LG_KEY + ')';
390
+ // themeVars['--pep-button-lg-icon-horizontal-spacing'] = '0.75' + PepCustomizationService.REM_STRING;
391
+ themeVars['--pep-button-xl-horizontal-spacing'] =
392
+ '1.5' + PepCustomizationService.REM_STRING;
393
+ themeVars['--pep-button-xl-min-width'] =
394
+ '4' + PepCustomizationService.REM_STRING;
395
+ themeVars['--pep-button-xl-height'] =
396
+ '4' + PepCustomizationService.REM_STRING;
397
+ themeVars['--pep-button-xl-font-size'] =
398
+ 'var(' + PepCustomizationService.FONT_SIZE_XL_KEY + ')';
399
+ // themeVars['--pep-button-xl-icon-horizontal-spacing'] = '1' + PepCustomizationService.REM_STRING;
400
+ }
401
+ getSystemPrimaryInvertColorsVariables(themeVars) {
402
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_INVERT_KEY + '-h'] = '255';
403
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_INVERT_KEY + '-s'] = '100%';
404
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_INVERT_KEY + '-l'] = '100%';
405
+ }
406
+ getSystemPrimaryColorsVariables(themeVars) {
407
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-h'] =
408
+ '0';
409
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-s'] =
410
+ '0%';
411
+ themeVars[PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-l'] =
412
+ '10%';
413
+ }
414
+ getSystemSuccessColorsVariables(themeVars) {
415
+ themeVars[PepCustomizationService.COLOR_SYSTEM_SUCCESS_KEY + '-h'] =
416
+ '100';
417
+ themeVars[PepCustomizationService.COLOR_SYSTEM_SUCCESS_KEY + '-s'] =
418
+ '100%';
419
+ themeVars[PepCustomizationService.COLOR_SYSTEM_SUCCESS_KEY + '-l'] =
420
+ '25%';
421
+ }
422
+ getSystemCautionColorsVariables(themeVars) {
423
+ themeVars[PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-h'] =
424
+ '360';
425
+ themeVars[PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-s'] =
426
+ '100%';
427
+ themeVars[PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-l'] =
428
+ '40%';
429
+ }
430
+ getUserPrimaryColorsVariables(themeVars) {
431
+ themeVars[PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-h'] = '78';
432
+ themeVars[PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-s'] =
433
+ '87%';
434
+ themeVars[PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-l'] =
435
+ '27%';
436
+ }
437
+ getUserSecondaryColorsVariables(themeVars) {
438
+ themeVars[PepCustomizationService.COLOR_USER_SECONDARY_KEY + '-h'] =
439
+ '36';
440
+ themeVars[PepCustomizationService.COLOR_USER_SECONDARY_KEY + '-s'] =
441
+ '100%';
442
+ themeVars[PepCustomizationService.COLOR_USER_SECONDARY_KEY + '-l'] =
443
+ '50%';
444
+ }
445
+ getWeakColorsVariables(themeVars) {
446
+ themeVars[PepCustomizationService.COLOR_WEAK_KEY + '-h'] =
447
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-h)';
448
+ themeVars[PepCustomizationService.COLOR_WEAK_KEY + '-s'] =
449
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-s)';
450
+ themeVars[PepCustomizationService.COLOR_WEAK_KEY + '-l'] =
451
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-l)';
452
+ }
453
+ getRegularColorsVariables(themeVars) {
454
+ themeVars[PepCustomizationService.COLOR_REGULAR_KEY + '-h'] =
455
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-h)';
456
+ themeVars[PepCustomizationService.COLOR_REGULAR_KEY + '-s'] =
457
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-s)';
458
+ themeVars[PepCustomizationService.COLOR_REGULAR_KEY + '-l'] =
459
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-l)';
460
+ }
461
+ getStrongColorsVariables(themeVars) {
462
+ themeVars[PepCustomizationService.COLOR_STRONG_KEY + '-h'] =
463
+ 'var(' + PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-h)';
464
+ themeVars[PepCustomizationService.COLOR_STRONG_KEY + '-s'] =
465
+ 'var(' + PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-s)';
466
+ themeVars[PepCustomizationService.COLOR_STRONG_KEY + '-l'] =
467
+ 'var(' + PepCustomizationService.COLOR_USER_PRIMARY_KEY + '-l)';
468
+ }
469
+ getTextColorsVariables(themeVars) {
470
+ themeVars[PepCustomizationService.COLOR_TEXT_LINK_KEY + '-h'] = '207';
471
+ themeVars[PepCustomizationService.COLOR_TEXT_LINK_KEY + '-s'] = '76%';
472
+ themeVars[PepCustomizationService.COLOR_TEXT_LINK_KEY + '-l'] = '37%';
473
+ }
474
+ getDefaultThemeColorsVariables(themeVars) {
475
+ // System primary invert colors.
476
+ this.getSystemPrimaryInvertColorsVariables(themeVars);
477
+ // System primary colors.
478
+ this.getSystemPrimaryColorsVariables(themeVars);
479
+ // System success colors.
480
+ this.getSystemSuccessColorsVariables(themeVars);
481
+ // System caution colors.
482
+ this.getSystemCautionColorsVariables(themeVars);
483
+ // User primary colors.
484
+ this.getUserPrimaryColorsVariables(themeVars);
485
+ // User secondary colors.
486
+ this.getUserSecondaryColorsVariables(themeVars);
487
+ // Weak colors.
488
+ this.getWeakColorsVariables(themeVars);
489
+ // Regular colors.
490
+ this.getRegularColorsVariables(themeVars);
491
+ // Strong colors.
492
+ this.getStrongColorsVariables(themeVars);
493
+ // Text colors.
494
+ this.getTextColorsVariables(themeVars);
495
+ }
496
+ getDefaultThemeShadowsVariables(themeVars) {
497
+ const noneOffset = '0';
498
+ themeVars[PepCustomizationService.SHADOW_NONE_OFFSET_KEY] = noneOffset;
499
+ const xsOffset = '0 0.125rem 0.25rem 0';
500
+ themeVars[PepCustomizationService.SHADOW_XS_OFFSET_KEY] = xsOffset;
501
+ const smOffset = '0 0.25rem 0.5rem 0';
502
+ themeVars[PepCustomizationService.SHADOW_SM_OFFSET_KEY] = smOffset;
503
+ const mdOffset = '0 0.5rem 1rem 0';
504
+ themeVars[PepCustomizationService.SHADOW_MD_OFFSET_KEY] = mdOffset;
505
+ const lgOffset = '0 1rem 2rem 0';
506
+ themeVars[PepCustomizationService.SHADOW_LG_OFFSET_KEY] = lgOffset;
507
+ const xlOffset = '0 2rem 4rem 0';
508
+ themeVars[PepCustomizationService.SHADOW_XL_OFFSET_KEY] = xlOffset;
509
+ }
510
+ getDefaultThemeFormCustomizationVariables(themeVars) {
511
+ const formFieldSpacing = 1;
512
+ themeVars[PepCustomizationService.FORM_FIELD_HEIGHT_KEY] =
513
+ '2.5' + PepCustomizationService.REM_STRING;
514
+ themeVars[PepCustomizationService.FORM_FIELD_TITLE_HEIGHT_KEY] =
515
+ '1.5' + PepCustomizationService.REM_STRING;
516
+ themeVars[PepCustomizationService.FORM_SPACEING_KEY] =
517
+ formFieldSpacing + PepCustomizationService.REM_STRING;
518
+ themeVars[PepCustomizationService.FORM_FIELD_SPACEING_KEY] =
519
+ formFieldSpacing + PepCustomizationService.REM_STRING;
520
+ }
521
+ getDefaultThemeCardCustomizationVariables(themeVars) {
522
+ themeVars[PepCustomizationService.CARD_FIELD_HEIGHT_KEY] =
523
+ '1.5' + PepCustomizationService.REM_STRING;
524
+ themeVars[PepCustomizationService.CARD_SPACEING_KEY] =
525
+ 'var(' + PepCustomizationService.SPACING_SIZE_XS_KEY + ')';
526
+ themeVars[PepCustomizationService.CARD_BORDER_RADIUS_KEY] =
527
+ 'var(' + PepCustomizationService.BORDER_RADIUS_MD_KEY + ')';
528
+ themeVars[PepCustomizationService.CARD_SHADOW_OFFSET_KEY] =
529
+ 'var(' + PepCustomizationService.SHADOW_MD_OFFSET_KEY + ')';
530
+ }
531
+ getDefaultThemeTableCustomizationVariables(themeVars) {
532
+ themeVars[PepCustomizationService.TABLE_FIELD_HEIGHT_KEY] =
533
+ '2' + PepCustomizationService.REM_STRING;
534
+ themeVars[PepCustomizationService.TABLE_SPACEING_KEY] =
535
+ '0.5' + PepCustomizationService.REM_STRING;
536
+ themeVars[PepCustomizationService.TABLE_BORDER_RADIUS_KEY] =
537
+ 'var(' + PepCustomizationService.BORDER_RADIUS_MD_KEY + ')';
538
+ }
539
+ getDefaultThemeQSCustomizationVariables(themeVars) {
540
+ const qsState = 'regular';
541
+ themeVars[PepCustomizationService.STYLE_QS_KEY] = qsState;
542
+ themeVars[PepCustomizationService.COLOR_QS_KEY + '-h'] =
543
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-h)';
544
+ themeVars[PepCustomizationService.COLOR_QS_KEY + '-s'] =
545
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-s)';
546
+ themeVars[PepCustomizationService.COLOR_QS_KEY + '-l'] =
547
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_PRIMARY_KEY + '-l)';
548
+ }
549
+ getDefaultThemeLoaderCustomizationVariables(themeVars) {
550
+ themeVars[PepCustomizationService.COLOR_LOADER_KEY + '-h'] =
551
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-h)';
552
+ themeVars[PepCustomizationService.COLOR_LOADER_KEY + '-s'] =
553
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-s)';
554
+ themeVars[PepCustomizationService.COLOR_LOADER_KEY + '-l'] =
555
+ 'var(' + PepCustomizationService.COLOR_SYSTEM_CAUTION_KEY + '-l)';
556
+ }
557
+ getDefaultThemeTopHeaderCustomizationVariables(themeVars) {
558
+ const topHeaderState = 'strong';
559
+ themeVars[PepCustomizationService.STYLE_TOP_HEADER_KEY] = topHeaderState;
560
+ themeVars[PepCustomizationService.COLOR_TOP_HEADER_KEY + '-h'] = '';
561
+ themeVars[PepCustomizationService.COLOR_TOP_HEADER_KEY + '-s'] = '';
562
+ themeVars[PepCustomizationService.COLOR_TOP_HEADER_KEY + '-l'] = '';
563
+ }
564
+ getDefaultThemeTopLegacyCustomizationVariables(themeVars) {
565
+ themeVars[PepCustomizationService.COLOR_TOP_LEGACY_KEY + '-h'] = '';
566
+ themeVars[PepCustomizationService.COLOR_TOP_LEGACY_KEY + '-s'] = '';
567
+ themeVars[PepCustomizationService.COLOR_TOP_LEGACY_KEY + '-l'] = '';
568
+ }
569
+ // getDefaultThemeBrandingCustomizationVariables(themeVars: any): void {
570
+ // themeVars[PepCustomizationService.BRANDING_LOGO_SRC] = '/assets/images/Pepperi-Logo-HiRes.png';
571
+ // themeVars[PepCustomizationService.FAV_ICON_SRC] = '/assets/favicon.ico';
572
+ // }
573
+ getDefaultThemeVariables() {
574
+ const themeVars = {};
575
+ // Declare default layout.
576
+ this.getDefaultThemeLayoutVariables(themeVars);
577
+ // Declare default border radius.
578
+ this.getDefaultThemeBorderRadiusVariables(themeVars);
579
+ // Declare default spacing.
580
+ this.getDefaultThemeSpacingVariables(themeVars);
581
+ // Declare default fonts size & line height.
582
+ this.getDefaultThemeFontsVariables(themeVars);
583
+ // Declare default buttons.
584
+ this.getDefaultThemeButtonsVariables(themeVars);
585
+ // Declare default colors.
586
+ this.getDefaultThemeColorsVariables(themeVars);
587
+ // Declare default shadows.
588
+ this.getDefaultThemeShadowsVariables(themeVars);
589
+ // Declare default form customization.
590
+ this.getDefaultThemeFormCustomizationVariables(themeVars);
591
+ // Declare default card customization.
592
+ this.getDefaultThemeCardCustomizationVariables(themeVars);
593
+ // Declare default table customization.
594
+ this.getDefaultThemeTableCustomizationVariables(themeVars);
595
+ // Declare default qs customization.
596
+ this.getDefaultThemeQSCustomizationVariables(themeVars);
597
+ // Declare default top header customization.
598
+ this.getDefaultThemeTopHeaderCustomizationVariables(themeVars);
599
+ // Declare default top legacy customization.
600
+ this.getDefaultThemeTopLegacyCustomizationVariables(themeVars);
601
+ // // Declare default branding logo's customization
602
+ // this.getDefaultThemeBrandingCustomizationVariables(themeVars);
603
+ return themeVars;
604
+ }
605
+ getThemeVariables() {
606
+ const ret = this.getDefaultThemeVariables();
607
+ const themeVars = this.sessionService.getObject(PepCustomizationService.USER_THEME_VARIABLES);
608
+ // Override defaults.
609
+ if (themeVars) {
610
+ for (const key in themeVars) {
611
+ ret[key] = themeVars[key];
612
+ }
613
+ }
614
+ return ret;
615
+ }
616
+ setThemeVariables(themeVariablesToSet = null) {
617
+ const themeVariables = this.getThemeVariables();
618
+ // Override defaults.
619
+ if (themeVariablesToSet) {
620
+ for (const key in themeVariablesToSet) {
621
+ themeVariables[key] = themeVariablesToSet[key];
622
+ }
623
+ }
624
+ this.sessionService.setObject(PepCustomizationService.USER_THEME_VARIABLES, JSON.stringify(themeVariables));
625
+ for (const key in themeVariables) {
626
+ if (this.isFontUrlKey(key)) {
627
+ this.fileService.loadFontStyle(key, themeVariables[key]);
628
+ }
629
+ else {
630
+ document.documentElement.style.setProperty(key, themeVariables[key]);
631
+ }
632
+ }
633
+ }
634
+ isFontUrlKey(key) {
635
+ let res = false;
636
+ if (key === PepCustomizationService.FONT_FAMILY_TITLE_NORMAL_URL_KEY ||
637
+ key === PepCustomizationService.FONT_FAMILY_TITLE_BOLD_URL_KEY ||
638
+ key === PepCustomizationService.FONT_FAMILY_BODY_NORMAL_URL_KEY ||
639
+ key === PepCustomizationService.FONT_FAMILY_BODY_BOLD_URL_KEY) {
640
+ res = true;
641
+ }
642
+ return res;
643
+ }
644
+ getThemeVariable(key) {
645
+ const themeVars = this.getThemeVariables();
646
+ if (themeVars.hasOwnProperty(key)) {
647
+ return themeVars[key];
648
+ }
649
+ else {
650
+ return '';
651
+ }
652
+ }
653
+ getNumberThemeVariable(themeVars, key) {
654
+ if (themeVars && themeVars.hasOwnProperty(key)) {
655
+ // If it's reference to another key.
656
+ if (themeVars[key].indexOf('var(') === 0) {
657
+ key = themeVars[key].substr(4).split(')')[0];
658
+ }
659
+ const tmp = Number(themeVars[key].replace(PepCustomizationService.REM_STRING, ''));
660
+ return tmp;
661
+ }
662
+ else {
663
+ return 0;
664
+ }
665
+ }
666
+ setFooterHeight(height) {
667
+ if (this.footerHeight.getValue() !== height) {
668
+ // it is publishing this value to all the subscribers that have already subscribed to this message
669
+ setTimeout(() => {
670
+ this.footerHeight.next(height);
671
+ }, 0);
672
+ }
673
+ document.documentElement.style.setProperty(PepCustomizationService.FOOTER_HEIGHT_KEY, height + PepCustomizationService.REM_STRING);
674
+ }
675
+ hideFooter() {
676
+ this.setFooterHeight(0);
677
+ }
678
+ showFooter() {
679
+ const themeVars = this.getThemeVariables();
680
+ const res = this.getNumberThemeVariable(themeVars, PepCustomizationService.FOOTER_BAR_SPACING_TOP_KEY) +
681
+ this.getNumberThemeVariable(themeVars, PepCustomizationService.FOOTER_BAR_SPACING_BOTTOM_KEY) +
682
+ this.getNumberThemeVariable(themeVars, PepCustomizationService.TOP_BAR_FIELD_HEIGHT_KEY);
683
+ this.setFooterHeight(res);
684
+ }
685
+ setSettingsWidth(width) {
686
+ if (this.settingsWidth.getValue() !== width) {
687
+ // it is publishing this value to all the subscribers that have already subscribed to this message
688
+ setTimeout(() => {
689
+ this.settingsWidth.next(width);
690
+ }, 0);
691
+ }
692
+ document.documentElement.style.setProperty(PepCustomizationService.SETTINGS_WIDTH_KEY, width + PepCustomizationService.REM_STRING);
693
+ }
694
+ hideSettings() {
695
+ this.setSettingsWidth(0);
696
+ }
697
+ showSettings() {
698
+ const themeVars = this.getThemeVariables();
699
+ const res = this.getNumberThemeVariable(themeVars, PepCustomizationService.SIDE_BAR_WIDTH_KEY);
700
+ this.setSettingsWidth(res);
701
+ }
702
+ getTopBarHeight() {
703
+ const themeVars = this.getThemeVariables();
704
+ const res = this.getNumberThemeVariable(themeVars, PepCustomizationService.TOP_BAR_SPACING_TOP_KEY) +
705
+ this.getNumberThemeVariable(themeVars, PepCustomizationService.TOP_BAR_SPACING_BOTTOM_KEY) +
706
+ this.getNumberThemeVariable(themeVars, PepCustomizationService.TOP_BAR_FIELD_HEIGHT_KEY);
707
+ return res;
708
+ }
709
+ setOldUserTheme(res) {
710
+ // Added user theme.
711
+ const themeObj = {
712
+ Theme: res.Theme || 'default-theme',
713
+ };
714
+ this.sessionService.setObject(PepCustomizationService.USER_THEME, JSON.stringify(themeObj));
715
+ let spinnerColor;
716
+ let brandingFontColor;
717
+ if (this.isLightColor(res.BrandingMainColor)) {
718
+ spinnerColor = PepCustomizationService.DEFAULT_SPINNER_COLOR;
719
+ brandingFontColor = '#222';
720
+ }
721
+ else {
722
+ spinnerColor = res.BrandingMainColor;
723
+ brandingFontColor = PepCustomizationService.DEFAULT_BRANDING_COLOR;
724
+ }
725
+ const color = {
726
+ BrandingSecondaryColor: res.BrandingSecondaryColor,
727
+ BrandingMainColor: res.BrandingMainColor,
728
+ BrandingFontColor: brandingFontColor,
729
+ SpinnerColor: spinnerColor,
730
+ };
731
+ this.sessionService.setObject(PepCustomizationService.USER_COLOR, JSON.stringify(color));
732
+ this.hasCustomHeader =
733
+ res.TopHeaderFiles &&
734
+ res.TopHeaderFiles.length > 0 &&
735
+ res.TopHeaderFiles[0] !== ''
736
+ ? true
737
+ : false;
738
+ this.hasCustomHomepage =
739
+ res.UserRole === 'Buyer' &&
740
+ res.TopHeaderFiles &&
741
+ res.TopHeaderFiles.length > 1 &&
742
+ res.TopHeaderFiles[1] !== '';
743
+ }
744
+ isLegacyColor() {
745
+ const h = document.documentElement.style.getPropertyValue(PepCustomizationService.COLOR_TOP_HEADER_KEY + '-h');
746
+ const s = document.documentElement.style.getPropertyValue(PepCustomizationService.COLOR_TOP_HEADER_KEY + '-s');
747
+ const l = document.documentElement.style.getPropertyValue(PepCustomizationService.COLOR_TOP_HEADER_KEY + '-l');
748
+ return !(h && s && l);
749
+ }
750
+ getLoadingSpinnerColor() {
751
+ let spinnerColor = '';
752
+ if (this.isLegacyColor()) {
753
+ const color = this.sessionService.getObject(PepCustomizationService.USER_COLOR);
754
+ if (color && color.SpinnerColor) {
755
+ spinnerColor = color.SpinnerColor;
756
+ }
757
+ else {
758
+ spinnerColor = PepCustomizationService.DEFAULT_SPINNER_COLOR;
759
+ }
760
+ }
761
+ return spinnerColor;
762
+ }
763
+ getBrandingMainColor() {
764
+ let brandingMainColor = '';
765
+ if (this.isLegacyColor()) {
766
+ const color = this.sessionService.getObject(PepCustomizationService.USER_COLOR);
767
+ if (color && color.BrandingMainColor) {
768
+ brandingMainColor = color.BrandingMainColor;
769
+ }
770
+ else {
771
+ brandingMainColor =
772
+ PepCustomizationService.DEFAULT_BRANDING_COLOR;
773
+ }
774
+ }
775
+ return brandingMainColor;
776
+ }
777
+ isLightColor(hexColor) {
778
+ if (!hexColor) {
779
+ return;
780
+ }
781
+ let isBright = false;
782
+ let sum = 0;
783
+ const c = hexColor.replace(/^#/, '');
784
+ sum = parseInt(c[0] + c[1], 16);
785
+ sum += parseInt(c[2] + c[3], 16);
786
+ sum += parseInt(c[4] + c[5], 16);
787
+ if (sum > 382.6) {
788
+ // it's bright color
789
+ isBright = true;
790
+ }
791
+ return isBright;
792
+ }
793
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PepCustomizationService, deps: [{ token: i1.PepSessionService }, { token: i2.PepFileService }, { token: i3.FormBuilder }], target: i0.ɵɵFactoryTarget.Injectable });
794
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PepCustomizationService, providedIn: 'root' });
795
+ }
796
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PepCustomizationService, decorators: [{
797
+ type: Injectable,
798
+ args: [{
799
+ providedIn: 'root',
800
+ }]
801
+ }], ctorParameters: function () { return [{ type: i1.PepSessionService }, { type: i2.PepFileService }, { type: i3.FormBuilder }]; } });
802
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9taXphdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWxpYi9zcmMvY29yZS9jdXN0b21pemF0aW9uL2N1c3RvbWl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBUXZDLE1BQU0sT0FBTyx1QkFBdUI7SUEwSnBCO0lBQ0E7SUFDRDtJQTNKWCxNQUFNLENBQUMsNEJBQTRCLEdBQUcsV0FBVyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyx1Q0FBdUMsR0FBRyxzQkFBc0IsQ0FBQztJQUV4RSxNQUFNLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixNQUFNLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQztJQUNqQyxNQUFNLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQztJQUNqQyxNQUFNLENBQUMsb0JBQW9CLEdBQUcsc0JBQXNCLENBQUM7SUFFckQsZ0JBQWdCO0lBQ2hCLE1BQU0sQ0FBQyxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztJQUVqRCwwQkFBMEI7SUFDMUIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDO0lBRW5ELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsa0JBQWtCLEdBQUcsMEJBQTBCLENBQUM7SUFFdkQseUJBQXlCO0lBQ3pCLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRywyQkFBMkIsQ0FBQztJQUM3RCxNQUFNLENBQUMsMEJBQTBCLEdBQUcsOEJBQThCLENBQUM7SUFDbkUsTUFBTSxDQUFDLHdCQUF3QixHQUFHLDRCQUE0QixDQUFDO0lBRS9ELHdCQUF3QjtJQUN4QixNQUFNLENBQUMsaUJBQWlCLEdBQUcs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QUMsbUJBQW1CLENBQUM7WUFDbEQsTUFBTSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUNoRCxTQUFTLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsS0FBSyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUMvQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsTUFBTSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUNoRCxTQUFTLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsR0FBRyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUM3QyxTQUFTLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsS0FBSyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUMvQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsR0FBRyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUM3QyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsS0FBSyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUMvQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsR0FBRyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUM3QyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsS0FBSyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUMvQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsR0FBRyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUM3QyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsR0FBRyxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztRQUM3QyxTQUFTLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsR0FBRyxHQUFHLHVCQUF1QixDQUFD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QyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFO1lBQ2Isb0JBQW9CO1lBQ3BCLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFFRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO3dHQXpoQ1EsdUJBQXVCOzRHQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTs7NEZBRVQsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQZXBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlcy9zZXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGVwRmlsZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vc2VydmljZXMvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBlcFN0eWxlVHlwZSwgUGVwRmllbGRCYXNlIH0gZnJvbSAnLi9jdXN0b21pemF0aW9uLm1vZGVsJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGVwQ3VzdG9taXphdGlvblNlcnZpY2Uge1xuICAgIHN0YXRpYyBTVEFORF9BTE9ORV9GSUVMRF9DTEFTU19OQU1FID0gJ3BlcC1maWVsZCc7XG4gICAgc3RhdGljIFNUQU5EX0FMT05FX0ZJRUxEX05PX1NQQUNJTkdfQ0xBU1NfTkFNRSA9ICdwZXAtZmllbGQtbm8tc3BhY2luZyc7XG5cbiAgICBzdGF0aWMgUkVNX1NUUklORyA9ICdyZW0nO1xuICAgIHN0YXRpYyBQWF9TVFJJTkcgPSAncHgnO1xuICAgIHN0YXRpYyBVU0VSX1RIRU1FID0gJ3VzZXJfdGhlbWUnO1xuICAgIHN0YXRpYyBVU0VSX0NPTE9SID0gJ3VzZXJfY29sb3InO1xuICAgIHN0YXRpYyBVU0VSX1RIRU1FX1ZBUklBQkxFUyA9ICd1c2VyX3RoZW1lX3ZhcmlhYmxlcyc7XG5cbiAgICAvLyBIZWFkZXIgaGVpZ2h0XG4gICAgc3RhdGljIEhFQURFUl9IRUlHSFRfS0VZID0gJy0tcGVwLWhlYWRlci1oZWlnaHQnO1xuXG4gICAgLy8gU2lkZSBiYXIgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgU0lERV9CQVJfV0lEVEhfS0VZID0gJy0tcGVwLXNpZGUtYmFyLXdpZHRoJztcblxuICAgIC8vIFNldHRpbmdzIHdpZHRoXG4gICAgc3RhdGljIFNFVFRJTkdTX1dJRFRIX0tFWSA9ICctLXBlcC1zZXR0aW5ncy1iYXItd2lkdGgnO1xuXG4gICAgLy8gVG9wIGJhciB2YXJpYWJsZXMga2V5c1xuICAgIHN0YXRpYyBUT1BfQkFSX1NQQUNJTkdfVE9QX0tFWSA9ICctLXBlcC10b3AtYmFyLXNwYWNpbmctdG9wJztcbiAgICBzdGF0aWMgVE9QX0JBUl9TUEFDSU5HX0JPVFRPTV9LRVkgPSAnLS1wZXAtdG9wLWJhci1zcGFjaW5nLWJvdHRvbSc7XG4gICAgc3RhdGljIFRPUF9CQVJfRklFTERfSEVJR0hUX0tFWSA9ICctLXBlcC10b3AtYmFyLWZpZWxkLWhlaWdodCc7XG5cbiAgICAvLyBGb290ZXIgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgRk9PVEVSX0hFSUdIVF9LRVkgPSAnLS1wZXAtZm9vdGVyLWJhci1oZWlnaHQnO1xuICAgIHN0YXRpYyBGT09URVJfQkFSX1NQQUNJTkdfVE9QX0tFWSA9ICctLXBlcC1mb290ZXItYmFyLXNwYWNpbmctdG9wJztcbiAgICBzdGF0aWMgRk9PVEVSX0JBUl9TUEFDSU5HX0JPVFRPTV9LRVkgPSAnLS1wZXAtZm9vdGVyLWJhci1zcGFjaW5nLWJvdHRvbSc7XG5cbiAgICAvLyBNYWluIGNvbnRhaW5lciBoZWlnaHRcbiAgICBzdGF0aWMgTUFJTl9IRUlHSFRfS0VZID0gJy0tcGVwLW1haW4taGVpZ2h0JztcblxuICAgIC8vIENvbG9ycyB2YXJpYWJsZXMga2V5c1xuICAgIHN0YXRpYyBDT0xPUl9VU0VSX1BSSU1BUllfS0VZID0gJy0tcGVwLWNvbG9yLXVzZXItcHJpbWFyeSc7XG4gICAgc3RhdGljIENPTE9SX1VTRVJfU0VDT05EQVJZX0tFWSA9ICctLXBlcC1jb2xvci11c2VyLXNlY29uZGFyeSc7XG4gICAgc3RhdGljIENPTE9SX1NZU1RFTV9QUklNQVJZX0lOVkVSVF9LRVkgPVxuICAgICAgICAnLS1wZXAtY29sb3Itc3lzdGVtLXByaW1hcnktaW52ZXJ0JztcbiAgICBzdGF0aWMgQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZID0gJy0tcGVwLWNvbG9yLXN5c3RlbS1wcmltYXJ5JztcbiAgICBzdGF0aWMgQ09MT1JfVEVYVF9MSU5LX0tFWSA9ICctLXBlcC1jb2xvci10ZXh0LWxpbmsnO1xuICAgIHN0YXRpYyBDT0xPUl9TWVNURU1fQ0FVVElPTl9LRVkgPSAnLS1wZXAtY29sb3Itc3lzdGVtLWNhdXRpb24nO1xuICAgIHN0YXRpYyBDT0xPUl9TWVNURU1fU1VDQ0VTU19LRVkgPSAnLS1wZXAtY29sb3Itc3lzdGVtLXN1Y2Nlc3MnO1xuICAgIHN0YXRpYyBDT0xPUl9TVFJPTkdfS0VZID0gJy0tcGVwLWNvbG9yLXN0cm9uZyc7XG4gICAgc3RhdGljIENPTE9SX1JFR1VMQVJfS0VZID0gJy0tcGVwLWNvbG9yLXJlZ3VsYXInO1xuICAgIHN0YXRpYyBDT0xPUl9XRUFLX0tFWSA9ICctLXBlcC1jb2xvci13ZWFrJztcbiAgICBcbiAgICAvLyBUb3AgaGVhZGVyIHZhcmlhYmxlcyBrZXlzXG4gICAgc3RhdGljIENPTE9SX1RPUF9MRUdBQ1lfS0VZID0gJy0tcGVwLWNvbG9yLWxlZ2FjeSc7XG4gICAgc3RhdGljIENPTE9SX1RPUF9IRUFERVJfS0VZID0gJy0tcGVwLWNvbG9yLXRvcC1oZWFkZXInO1xuICAgIHN0YXRpYyBTVFlMRV9UT1BfSEVBREVSX0tFWSA9ICctLXBlcC1zdHlsZS10b3AtaGVhZGVyJztcblxuICAgIC8vIExvYWRlciB2YXJpYWJsZXMga2V5c1xuICAgIHN0YXRpYyBDT0xPUl9MT0FERVJfS0VZID0gJy0tcGVwLWNvbG9yLWxvYWRlcic7XG5cbiAgICAvLyBRUyB2YXJpYWJsZXMga2V5c1xuICAgIHN0YXRpYyBDT0xPUl9RU19LRVkgPSAnLS1wZXAtY29sb3ItcXMnO1xuICAgIHN0YXRpYyBTVFlMRV9RU19LRVkgPSAnLS1wZXAtc3R5bGUtcXMnO1xuXG4gICAgLy8gRm9udHMgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgRk9OVF9GQU1JTFlfVElUTEVfS0VZID0gJy0tcGVwLWZvbnQtZmFtaWx5LXRpdGxlJztcbiAgICBzdGF0aWMgRk9OVF9GQU1JTFlfVElUTEVfTk9STUFMX1VSTF9LRVkgPVxuICAgICAgICAnLS1wZXAtZm9udC1mYW1pbHktdGl0bGUtbm9ybWFsLXVybCc7XG4gICAgc3RhdGljIEZPTlRfRkFNSUxZX1RJVExFX0JPTERfVVJMX0tFWSA9ICctLXBlcC1mb250LWZhbWlseS10aXRsZS1ib2xkLXVybCc7XG4gICAgc3RhdGljIEZPTlRfRkFNSUxZX0JPRFlfS0VZID0gJy0tcGVwLWZvbnQtZmFtaWx5LWJvZHknO1xuICAgIHN0YXRpYyBGT05UX0ZBTUlMWV9CT0RZX05PUk1BTF9VUkxfS0VZID1cbiAgICAgICAgJy0tcGVwLWZvbnQtZmFtaWx5LWJvZHktbm9ybWFsLXVybCc7XG4gICAgc3RhdGljIEZPTlRfRkFNSUxZX0JPRFlfQk9MRF9VUkxfS0VZID0gJy0tcGVwLWZvbnQtZmFtaWx5LWJvZHktYm9sZC11cmwnO1xuXG4gICAgLy8gQm9yZGVyIHJhZGl1cyB2YXJpYWJsZXMga2V5c1xuICAgIHN0YXRpYyBCT1JERVJfUkFESVVTX0tFWSA9ICctLXBlcC1ib3JkZXItcmFkaXVzJztcbiAgICBzdGF0aWMgQk9SREVSX1JBRElVU19TTV9LRVkgPVxuICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5CT1JERVJfUkFESVVTX0tFWSArICctc20nO1xuICAgIHN0YXRpYyBCT1JERVJfUkFESVVTX01EX0tFWSA9XG4gICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkJPUkRFUl9SQURJVVNfS0VZICsgJy1tZCc7XG4gICAgc3RhdGljIEJPUkRFUl9SQURJVVNfTEdfS0VZID1cbiAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQk9SREVSX1JBRElVU19LRVkgKyAnLWxnJztcbiAgICBzdGF0aWMgQk9SREVSX1JBRElVU19YTF9LRVkgPVxuICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5CT1JERVJfUkFESVVTX0tFWSArICcteGwnO1xuXG4gICAgLy8gRm9udHMgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgRk9OVF9TSVpFXzJYU19LRVkgPSAnLS1wZXAtZm9udC1zaXplLTJ4cyc7XG4gICAgc3RhdGljIEZPTlRfU0laRV9YU19LRVkgPSAnLS1wZXAtZm9udC1zaXplLXhzJztcbiAgICBzdGF0aWMgRk9OVF9TSVpFX1NNX0tFWSA9ICctLXBlcC1mb250LXNpemUtc20nO1xuICAgIHN0YXRpYyBGT05UX1NJWkVfTURfS0VZID0gJy0tcGVwLWZvbnQtc2l6ZS1tZCc7XG4gICAgc3RhdGljIEZPTlRfU0laRV9MR19LRVkgPSAnLS1wZXAtZm9udC1zaXplLWxnJztcbiAgICBzdGF0aWMgRk9OVF9TSVpFX1hMX0tFWSA9ICctLXBlcC1mb250LXNpemUteGwnO1xuICAgIHN0YXRpYyBGT05UX1NJWkVfMlhMX0tFWSA9ICctLXBlcC1mb250LXNpemUtMnhsJztcblxuICAgIC8vIExpbmUgaGVpZ2h0IHZhcmlhYmxlcyBrZXlzXG4gICAgc3RhdGljIExJTkVfSEVJR0hUXzJYU19LRVkgPSAnLS1wZXAtbGluZS1oZWlnaHQtMnhzJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfWFNfS0VZID0gJy0tcGVwLWxpbmUtaGVpZ2h0LXhzJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfU01fS0VZID0gJy0tcGVwLWxpbmUtaGVpZ2h0LXNtJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfTURfS0VZID0gJy0tcGVwLWxpbmUtaGVpZ2h0LW1kJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfTEdfS0VZID0gJy0tcGVwLWxpbmUtaGVpZ2h0LWxnJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfWExfS0VZID0gJy0tcGVwLWxpbmUtaGVpZ2h0LXhsJztcbiAgICBzdGF0aWMgTElORV9IRUlHSFRfMlhMX0tFWSA9ICctLXBlcC1saW5lLWhlaWdodC0yeGwnO1xuXG4gICAgLy8gU2hhZG93cyBvZmZzZXQgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgU0hBRE9XX05PTkVfT0ZGU0VUX0tFWSA9ICctLXBlcC1zaGFkb3ctbm9uZS1vZmZzZXQnO1xuICAgIHN0YXRpYyBTSEFET1dfWFNfT0ZGU0VUX0tFWSA9ICctLXBlcC1zaGFkb3cteHMtb2Zmc2V0JztcbiAgICBzdGF0aWMgU0hBRE9XX1NNX09GRlNFVF9LRVkgPSAnLS1wZXAtc2hhZG93LXNtLW9mZnNldCc7XG4gICAgc3RhdGljIFNIQURPV19NRF9PRkZTRVRfS0VZID0gJy0tcGVwLXNoYWRvdy1tZC1vZmZzZXQnO1xuICAgIHN0YXRpYyBTSEFET1dfTEdfT0ZGU0VUX0tFWSA9ICctLXBlcC1zaGFkb3ctbGctb2Zmc2V0JztcbiAgICBzdGF0aWMgU0hBRE9XX1hMX09GRlNFVF9LRVkgPSAnLS1wZXAtc2hhZG93LXhsLW9mZnNldCc7XG5cbiAgICAvLyBTcGFjaW5nIHZhcmlhYmxlcyBrZXlzXG4gICAgc3RhdGljIFNQQUNJTkdfU0laRV8yWFNfS0VZID0gJy0tcGVwLXNwYWNpbmctMnhzJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFX1hTX0tFWSA9ICctLXBlcC1zcGFjaW5nLXhzJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFX1NNX0tFWSA9ICctLXBlcC1zcGFjaW5nLXNtJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFX01EX0tFWSA9ICctLXBlcC1zcGFjaW5nLW1kJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFX0xHX0tFWSA9ICctLXBlcC1zcGFjaW5nLWxnJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFX1hMX0tFWSA9ICctLXBlcC1zcGFjaW5nLXhsJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFXzJYTF9LRVkgPSAnLS1wZXAtc3BhY2luZy0yeGwnO1xuICAgIHN0YXRpYyBTUEFDSU5HX1NJWkVfM1hMX0tFWSA9ICctLXBlcC1zcGFjaW5nLTN4bCc7XG4gICAgc3RhdGljIFNQQUNJTkdfU0laRV80WExfS0VZID0gJy0tcGVwLXNwYWNpbmctNHhsJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFXzVYTF9LRVkgPSAnLS1wZXAtc3BhY2luZy01eGwnO1xuICAgIHN0YXRpYyBTUEFDSU5HX1NJWkVfNlhMX0tFWSA9ICctLXBlcC1zcGFjaW5nLTZ4bCc7XG4gICAgc3RhdGljIFNQQUNJTkdfU0laRV83WExfS0VZID0gJy0tcGVwLXNwYWNpbmctN3hsJztcbiAgICBzdGF0aWMgU1BBQ0lOR19TSVpFXzhYTF9LRVkgPSAnLS1wZXAtc3BhY2luZy04eGwnO1xuICAgIHN0YXRpYyBTUEFDSU5HX1NJWkVfOVhMX0tFWSA9ICctLXBlcC1zcGFjaW5nLTl4bCc7XG5cbiAgICAvLyBGb3JtIHZhcmlhYmxlcyBrZXlzXG4gICAgc3RhdGljIEZPUk1fRklFTERfSEVJR0hUX0tFWSA9ICctLXBlcC1mb3JtLWZpZWxkLWhlaWdodCc7XG4gICAgc3RhdGljIEZPUk1fRklFTERfVElUTEVfSEVJR0hUX0tFWSA9ICctLXBlcC1mb3JtLWZpZWxkLXRpdGxlLWhlaWdodCc7XG4gICAgc3RhdGljIEZPUk1fRklFTERfU1BBQ0VJTkdfS0VZID0gJy0tcGVwLWZvcm0tZmllbGQtc3BhY2luZyc7XG4gICAgc3RhdGljIEZPUk1fU1BBQ0VJTkdfS0VZID0gJy0tcGVwLWZvcm0tc3BhY2luZyc7XG5cbiAgICAvLyBDYXJkIHZhcmlhYmxlcyBrZXlzXG4gICAgc3RhdGljIENBUkRfRklFTERfSEVJR0hUX0tFWSA9ICctLXBlcC1jYXJkLWZpZWxkLWhlaWdodCc7XG4gICAgc3RhdGljIENBUkRfU1BBQ0VJTkdfS0VZID0gJy0tcGVwLWNhcmQtc3BhY2luZyc7XG4gICAgc3RhdGljIENBUkRfU0hBRE9XX09GRlNFVF9LRVkgPSAnLS1wZXAtc2hhZG93LWNhcmQtb2Zmc2V0JztcbiAgICBzdGF0aWMgQ0FSRF9CT1JERVJfUkFESVVTX0tFWSA9ICctLXBlcC1jYXJkLWJvcmRlci1yYWRpdXMnO1xuXG4gICAgLy8gVGFibGUgdmFyaWFibGVzIGtleXNcbiAgICBzdGF0aWMgVEFCTEVfRklFTERfSEVJR0hUX0tFWSA9ICctLXBlcC10YWJsZS1maWVsZC1oZWlnaHQnO1xuICAgIHN0YXRpYyBUQUJMRV9TUEFDRUlOR19LRVkgPSAnLS1wZXAtdGFibGUtc3BhY2luZyc7XG4gICAgc3RhdGljIFRBQkxFX0JPUkRFUl9SQURJVVNfS0VZID0gJy0tcGVwLXRhYmxlLWJvcmRlci1yYWRpdXMnO1xuXG4gICAgLy8gLy8gQnJhbmRpbmcga2V5c1xuICAgIC8vIHN0YXRpYyBCUkFORElOR19MT0dPX1NSQyA9ICctLXBlcC1icmFuZGluZy1sb2dvLXNyYyc7XG4gICAgLy8gc3RhdGljIEZBVl9JQ09OX1NSQyA9ICctLXBlcC1mYXZpY29uLXNyYyc7XG5cbiAgICBzdGF0aWMgREVGQVVMVF9IRUFERVJfSEVJR0hUID0gNjQ7IC8vIERlZmF1bHRcblxuICAgIHN0YXRpYyBERUZBVUxUX1NQSU5ORVJfQ09MT1IgPSAnIzc4YWEwMCc7XG4gICAgc3RhdGljIERFRkFVTFRfQlJBTkRJTkdfQ09MT1IgPSAnI2ZmZic7XG5cbiAgICBwdWJsaWMgaGFzQ3VzdG9tSG9tZXBhZ2U6IGJvb2xlYW4gPSBudWxsO1xuICAgIHB1YmxpYyBoYXNDdXN0b21IZWFkZXI6IGJvb2xlYW4gPSBudWxsO1xuICAgIHB1YmxpYyBjdXN0b21IZWFkZXJIZWlnaHQgPSBQZXBDdXN0b21pemF0aW9uU2VydmljZS5ERUZBVUxUX0hFQURFUl9IRUlHSFQ7XG4gICAgcHVibGljIG1haW5Db250SGVpZ2h0ID0gMDtcbiAgICBwdWJsaWMgZm9vdGVySGVpZ2h0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICAgIHB1YmxpYyBzZXR0aW5nc1dpZHRoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFBlcFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBQZXBGaWxlU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlclxuICAgICkge1xuICAgICAgICB0aGlzLmhpZGVGb290ZXIoKTtcbiAgICAgICAgLy9cbiAgICB9XG5cbiAgICBnZXREZWZhdWx0RnJvbUdyb3VwKGZpZWxkOiBQZXBGaWVsZEJhc2UsIHdpdGhWYWxpZGF0b3JzID0gdHJ1ZSk6IEZvcm1Hcm91cCB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB3aXRoVmFsaWRhdG9ycyA/IGZpZWxkLmdldFZhbGlkYXRvcnMoKSA6IFtdO1xuICAgICAgICBjb25zdCBncm91cCA9IHt9O1xuICAgICAgICBncm91cFtmaWVsZC5rZXldID0gW1xuICAgICAgICAgICAgeyB2YWx1ZTogZmllbGQudmFsdWUsIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB9LFxuICAgICAgICAgICAgdmFsaWRhdG9ycyxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmIuZ3JvdXAoZ3JvdXApO1xuICAgIH1cblxuICAgIGdldEZvcm1Db250cm9sKFxuICAgICAgICBmb3JtOiBGb3JtR3JvdXAsXG4gICAgICAgIGZpZWxkS2V5OiBzdHJpbmcsXG4gICAgICAgIHBhcmVudEZpZWxkS2V5OiBzdHJpbmcgPSBudWxsXG4gICAgKTogYW55IHtcbiAgICAgICAgbGV0IGZvcm1Db250cm9sID0gbnVsbDtcblxuICAgICAgICBpZiAoZm9ybSAmJiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50RmllbGRLZXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbCA9IGZvcm0uY29udHJvbHNbZmllbGRLZXldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbCA9IGZvcm0uY29udHJvbHNbcGFyZW50RmllbGRLZXldPy5nZXQoZmllbGRLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1Db250cm9sO1xuICAgIH1cblxuICAgIHVwZGF0ZUZvcm1GaWVsZFZhbHVlKFxuICAgICAgICBmb3JtOiBGb3JtR3JvdXAsXG4gICAgICAgIGZpZWxkS2V5OiBzdHJpbmcsXG4gICAgICAgIHZhbHVlID0gJycsXG4gICAgICAgIHBhcmVudEZpZWxkS2V5OiBzdHJpbmcgPSBudWxsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5nZXRGb3JtQ29udHJvbChmb3JtLCBmaWVsZEtleSwgcGFyZW50RmllbGRLZXkpO1xuICAgICAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUZvcm1GaWVsZChcbiAgICAgICAgZm9ybTogRm9ybUdyb3VwLFxuICAgICAgICBmaWVsZDogUGVwRmllbGRCYXNlLFxuICAgICAgICB2YWx1ZSA9ICcnLFxuICAgICAgICBwYXJlbnRGaWVsZDogUGVwRmllbGRCYXNlID0gbnVsbFxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2wgPSB0aGlzLmdldEZvcm1Db250cm9sKFxuICAgICAgICAgICAgZm9ybSxcbiAgICAgICAgICAgIGZpZWxkLmtleSxcbiAgICAgICAgICAgIHBhcmVudEZpZWxkPy5rZXlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZvcm1Db250cm9sKSB7XG4gICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIElmIGRpc2FibGVkIGhhcyBjaGFuZ2VkLlxuICAgICAgICAgICAgaWYgKGZvcm1Db250cm9sLmRpc2FibGVkICE9PSBmaWVsZC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGZpZWxkLmRpc2FibGVkID8gZm9ybUNvbnRyb2wuZGlzYWJsZSgpIDogZm9ybUNvbnRyb2wuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IGZpZWxkLmdldFZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNhbGN1bGF0ZUZvcm1GaWVsZEhlaWdodChcbiAgICAgICAgd2l0aFRpdGxlID0gdHJ1ZSxcbiAgICAgICAgcm93U3BhbiA9IDEsXG4gICAgICAgIHN0YW5kQWxvbmUgPSBmYWxzZVxuICAgICk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFycyA9IHRoaXMuZ2V0VGhlbWVWYXJpYWJsZXMoKTtcbiAgICAgICAgY29uc3Qgcm93RmllbGRIZWlnaHQgPSB0aGlzLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT1JNX0ZJRUxEX0hFSUdIVF9LRVlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgcm93RmllbGRUaXRsZUhlaWdodCA9IHRoaXMuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgIHRoZW1lVmFycyxcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfVElUTEVfSEVJR0hUX0tFWVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByb3dGaWVsZFNwYWNpbmdCb3R0b20gPSB0aGlzLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT1JNX1NQQUNFSU5HX0tFWVxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBmaWVsZEhlaWdodCA9IDA7XG4gICAgICAgIGlmIChyb3dTcGFuID09PSAxKSB7XG4gICAgICAgICAgICBmaWVsZEhlaWdodCA9XG4gICAgICAgICAgICAgICAgKHdpdGhUaXRsZSA/IHJvd0ZpZWxkVGl0bGVIZWlnaHQgOiAwKSArIHJvd0ZpZWxkSGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgcm93U3BhbkNhbGMgPSB3aXRoVGl0bGUgPyByb3dTcGFuIDogcm93U3BhbiAtIDE7XG4gICAgICAgICAgICBmaWVsZEhlaWdodCA9XG4gICAgICAgICAgICAgICAgcm93U3BhbiAqIHJvd0ZpZWxkSGVpZ2h0ICtcbiAgICAgICAgICAgICAgICByb3dTcGFuQ2FsYyAqIHJvd0ZpZWxkVGl0bGVIZWlnaHQgK1xuICAgICAgICAgICAgICAgIChzdGFuZEFsb25lID8gMCA6IHJvd1NwYW5DYWxjICogcm93RmllbGRTcGFjaW5nQm90dG9tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWVsZEhlaWdodDtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVDYXJkUm93c0hlaWdodChyb3dzQ291bnQgPSAxLCB3aXRoU3BhY2luZyA9IHRydWUpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmdldFRoZW1lVmFyaWFibGVzKCk7XG4gICAgICAgIGNvbnN0IGNhcmRGaWVsZEhlaWdodCA9IHRoaXMuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgIHRoZW1lVmFycyxcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNBUkRfRklFTERfSEVJR0hUX0tFWVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjYXJkRmllbGRTcGFjaW5nID0gdGhpcy5nZXROdW1iZXJUaGVtZVZhcmlhYmxlKFxuICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ0FSRF9TUEFDRUlOR19LRVlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBmaWVsZEhlaWdodCA9XG4gICAgICAgICAgICByb3dzQ291bnQgKiBjYXJkRmllbGRIZWlnaHQgK1xuICAgICAgICAgICAgKHJvd3NDb3VudCAtIDEpICogKHdpdGhTcGFjaW5nID8gY2FyZEZpZWxkU3BhY2luZyA6IDApO1xuICAgICAgICByZXR1cm4gZmllbGRIZWlnaHQ7XG4gICAgfVxuXG4gICAgY2FsY3VsYXRlVGFibGVSb3dzSGVpZ2h0KHJvd3NDb3VudCA9IDEsIHdpdGhTcGFjaW5nID0gdHJ1ZSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFycyA9IHRoaXMuZ2V0VGhlbWVWYXJpYWJsZXMoKTtcbiAgICAgICAgY29uc3QgdGFibGVGaWVsZEhlaWdodCA9IHRoaXMuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgIHRoZW1lVmFycyxcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlRBQkxFX0ZJRUxEX0hFSUdIVF9LRVlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGFibGVGaWVsZFNwYWNpbmcgPSB0aGlzLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5UQUJMRV9TUEFDRUlOR19LRVlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBmaWVsZEhlaWdodCA9XG4gICAgICAgICAgICByb3dzQ291bnQgKlxuICAgICAgICAgICAgKHRhYmxlRmllbGRIZWlnaHQgKyAod2l0aFNwYWNpbmcgPyB0YWJsZUZpZWxkU3BhY2luZyAqIDIgOiAwKSk7XG4gICAgICAgIHJldHVybiBmaWVsZEhlaWdodDtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVGaWVsZEhlaWdodChsYXlvdXRUeXBlID0gJ2Zvcm0nLCByb3dTcGFuLCBzdGFuZEFsb25lKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGZpZWxkSGVpZ2h0ID0gJ2luaGVyaXQnOyAvLyBEZWZhdWx0IGZvciBjYXJkICh3aXRoIG5vIHRpdGxlKVxuICAgICAgICBpZiAobGF5b3V0VHlwZSA9PT0gJ3RhYmxlJykge1xuICAgICAgICAgICAgZmllbGRIZWlnaHQgPSB0aGlzLmdldFRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuVEFCTEVfRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXlvdXRUeXBlID09PSAnY2FyZCcpIHtcbiAgICAgICAgICAgIGZpZWxkSGVpZ2h0ID1cbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNhcmRSb3dzSGVpZ2h0KHJvd1NwYW4sICFzdGFuZEFsb25lKSArXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZvcm1cbiAgICAgICAgICAgIGZpZWxkSGVpZ2h0ID1cbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUZvcm1GaWVsZEhlaWdodChmYWxzZSwgcm93U3Bhbiwgc3RhbmRBbG9uZSkgK1xuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmllbGRIZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0QnJhbmRpbmdUaGVtZSgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0aGVtZU9iaiA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuVVNFUl9USEVNRVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gKHRoZW1lT2JqICYmIHRoZW1lT2JqLlRoZW1lKSB8fCAnZGVmYXVsdC10aGVtZSc7IC8vICdsaWdodC10aGVtZSc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lTGF5b3V0VmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCBzY3JlZW4gc2l6ZXMuXG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtc2NyZWVuLW1heC1zaXplLTJ4cyddID1cbiAgICAgICAgICAgICc0NjAnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUFhfU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLXNjcmVlbi1tYXgtc2l6ZS14cyddID1cbiAgICAgICAgICAgICc3NjcnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUFhfU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLXNjcmVlbi1tYXgtc2l6ZS1zbSddID1cbiAgICAgICAgICAgICc5OTEnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUFhfU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLXNjcmVlbi1tYXgtc2l6ZS1tZCddID1cbiAgICAgICAgICAgICcxMTk5JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlBYX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1zY3JlZW4tbWF4LXNpemUtbGcnXSA9XG4gICAgICAgICAgICAnMTM2NicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5QWF9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtc2NyZWVuLW1heC1zaXplLXhsJ10gPVxuICAgICAgICAgICAgJzE5MjAnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUFhfU1RSSU5HO1xuXG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCB0b3AgYmFyLlxuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0lERV9CQVJfV0lEVEhfS0VZXSA9XG4gICAgICAgICAgICAnMTYnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcblxuICAgICAgICAvLyBEZWNsYXJlIGRlZmF1bHQgdG9wIGJhci5cbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlRPUF9CQVJfU1BBQ0lOR19UT1BfS0VZXSA9XG4gICAgICAgICAgICAnMS41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5UT1BfQkFSX1NQQUNJTkdfQk9UVE9NX0tFWV0gPVxuICAgICAgICAgICAgJzAuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuVE9QX0JBUl9GSUVMRF9IRUlHSFRfS0VZXSA9XG4gICAgICAgICAgICAnMi41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IGZvb3Rlci5cbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPT1RFUl9CQVJfU1BBQ0lOR19UT1BfS0VZXSA9XG4gICAgICAgICAgICAnMC43NScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9PVEVSX0JBUl9TUEFDSU5HX0JPVFRPTV9LRVldID1cbiAgICAgICAgICAgICcxLjI1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lQm9yZGVyUmFkaXVzVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5CT1JERVJfUkFESVVTX1NNX0tFWV0gPVxuICAgICAgICAgICAgJzAuMTI1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5CT1JERVJfUkFESVVTX01EX0tFWV0gPVxuICAgICAgICAgICAgJzAuMjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkJPUkRFUl9SQURJVVNfTEdfS0VZXSA9XG4gICAgICAgICAgICAnMC41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5CT1JERVJfUkFESVVTX1hMX0tFWV0gPVxuICAgICAgICAgICAgJzEnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0VGhlbWVTcGFjaW5nVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfMlhTX0tFWV0gPVxuICAgICAgICAgICAgJzAuMTI1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfWFNfS0VZXSA9XG4gICAgICAgICAgICAnMC4yNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU1BBQ0lOR19TSVpFX1NNX0tFWV0gPVxuICAgICAgICAgICAgJzAuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU1BBQ0lOR19TSVpFX01EX0tFWV0gPVxuICAgICAgICAgICAgJzAuNzUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNQQUNJTkdfU0laRV9MR19LRVldID1cbiAgICAgICAgICAgICcxJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfWExfS0VZXSA9XG4gICAgICAgICAgICAnMS41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfMlhMX0tFWV0gPVxuICAgICAgICAgICAgJzInICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNQQUNJTkdfU0laRV8zWExfS0VZXSA9XG4gICAgICAgICAgICAnMi41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfNFhMX0tFWV0gPVxuICAgICAgICAgICAgJzMnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNQQUNJTkdfU0laRV81WExfS0VZXSA9XG4gICAgICAgICAgICAnMy41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfNlhMX0tFWV0gPVxuICAgICAgICAgICAgJzUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNQQUNJTkdfU0laRV83WExfS0VZXSA9XG4gICAgICAgICAgICAnNicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU1BBQ0lOR19TSVpFXzhYTF9LRVldID1cbiAgICAgICAgICAgICc4JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TUEFDSU5HX1NJWkVfOVhMX0tFWV0gPVxuICAgICAgICAgICAgJzE2JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lRm9udHNWYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gVGl0bGUgZm9udCBmYW1pbHlcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPTlRfRkFNSUxZX1RJVExFX0tFWV0gPSAnTmV4YSc7XG5cbiAgICAgICAgLy8gQm9keSBmb250IGZhbWlseVxuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9GQU1JTFlfQk9EWV9LRVldID0gJ0ludGVyJztcblxuICAgICAgICAvLyBGb250IHNpemVzXG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfMlhTX0tFWV0gPVxuICAgICAgICAgICAgJzAuNjI1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfWFNfS0VZXSA9XG4gICAgICAgICAgICAnMC43NScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9TSVpFX1NNX0tFWV0gPVxuICAgICAgICAgICAgJzAuODc1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfTURfS0VZXSA9XG4gICAgICAgICAgICAnMScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9TSVpFX0xHX0tFWV0gPVxuICAgICAgICAgICAgJzEuMTI1JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfWExfS0VZXSA9XG4gICAgICAgICAgICAnMS4yNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9TSVpFXzJYTF9LRVldID1cbiAgICAgICAgICAgICcxLjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcblxuICAgICAgICAvLyBMaW5lIGhlaWdodFxuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuTElORV9IRUlHSFRfMlhTX0tFWV0gPVxuICAgICAgICAgICAgJzAuNzUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkxJTkVfSEVJR0hUX1hTX0tFWV0gPVxuICAgICAgICAgICAgJzEnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkxJTkVfSEVJR0hUX1NNX0tFWV0gPVxuICAgICAgICAgICAgJzEuMjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkxJTkVfSEVJR0hUX01EX0tFWV0gPVxuICAgICAgICAgICAgJzEuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuTElORV9IRUlHSFRfTEdfS0VZXSA9XG4gICAgICAgICAgICAnMS43NScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuTElORV9IRUlHSFRfWExfS0VZXSA9XG4gICAgICAgICAgICAnMicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuTElORV9IRUlHSFRfMlhMX0tFWV0gPVxuICAgICAgICAgICAgJzIuMjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcblxuICAgICAgICAvLyBGb250IHdlaWdodFxuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWZvbnQtd2VpZ2h0LW5vcm1hbCddID0gNDAwO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWZvbnQtd2VpZ2h0LWJvbGQnXSA9IDYwMDtcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1mb250LXdlaWdodC1ib2xkZXInXSA9IDgwMDtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0VGhlbWVCdXR0b25zVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLTJ4cy1ob3Jpem9udGFsLXNwYWNpbmcnXSA9XG4gICAgICAgICAgICAnMC4yNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi0yeHMtbWluLXdpZHRoJ10gPVxuICAgICAgICAgICAgJzEnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24tMnhzLWhlaWdodCddID1cbiAgICAgICAgICAgICcxJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLTJ4cy1mb250LXNpemUnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfMlhTX0tFWSArICcpJztcbiAgICAgICAgLy8gdGhlbWVWYXJzWyctLXBlcC1idXR0b24tMnhzLWljb24taG9yaXpvbnRhbC1zcGFjaW5nJ10gPSAnMC4xMjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcblxuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi14cy1ob3Jpem9udGFsLXNwYWNpbmcnXSA9XG4gICAgICAgICAgICAnMC41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLXhzLW1pbi13aWR0aCddID1cbiAgICAgICAgICAgICcxLjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24teHMtaGVpZ2h0J10gPVxuICAgICAgICAgICAgJzEuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi14cy1mb250LXNpemUnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfWFNfS0VZICsgJyknO1xuICAgICAgICAvLyB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi14cy1pY29uLWhvcml6b250YWwtc3BhY2luZyddID0gJzAuMjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcblxuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1zbS1ob3Jpem9udGFsLXNwYWNpbmcnXSA9XG4gICAgICAgICAgICAnMC43NScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1zbS1taW4td2lkdGgnXSA9XG4gICAgICAgICAgICAnMicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1zbS1oZWlnaHQnXSA9XG4gICAgICAgICAgICAnMicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1zbS1mb250LXNpemUnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfU01fS0VZICsgJyknO1xuICAgICAgICAvLyB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1zbS1pY29uLWhvcml6b250YWwtc3BhY2luZyddID0gJzAuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuXG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLW1kLWhvcml6b250YWwtc3BhY2luZyddID1cbiAgICAgICAgICAgICcxJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLW1kLW1pbi13aWR0aCddID1cbiAgICAgICAgICAgICcyLjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24tbWQtaGVpZ2h0J10gPVxuICAgICAgICAgICAgJzIuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1tZC1mb250LXNpemUnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX1NJWkVfTURfS0VZICsgJyknO1xuICAgICAgICAvLyB0aGVtZVZhcnNbJy0tcGVwLWJ1dHRvbi1tZC1pY29uLWhvcml6b250YWwtc3BhY2luZyddID0gJzAuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuXG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLWxnLWhvcml6b250YWwtc3BhY2luZyddID1cbiAgICAgICAgICAgICcxJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLWxnLW1pbi13aWR0aCddID1cbiAgICAgICAgICAgICczJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLWxnLWhlaWdodCddID1cbiAgICAgICAgICAgICczJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLWxnLWZvbnQtc2l6ZSddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPTlRfU0laRV9MR19LRVkgKyAnKSc7XG4gICAgICAgIC8vIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLWxnLWljb24taG9yaXpvbnRhbC1zcGFjaW5nJ10gPSAnMC43NScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuXG4gICAgICAgIHRoZW1lVmFyc1snLS1wZXAtYnV0dG9uLXhsLWhvcml6b250YWwtc3BhY2luZyddID1cbiAgICAgICAgICAgICcxLjUnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24teGwtbWluLXdpZHRoJ10gPVxuICAgICAgICAgICAgJzQnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24teGwtaGVpZ2h0J10gPVxuICAgICAgICAgICAgJzQnICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORztcbiAgICAgICAgdGhlbWVWYXJzWyctLXBlcC1idXR0b24teGwtZm9udC1zaXplJ10gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9TSVpFX1hMX0tFWSArICcpJztcbiAgICAgICAgLy8gdGhlbWVWYXJzWyctLXBlcC1idXR0b24teGwtaWNvbi1ob3Jpem9udGFsLXNwYWNpbmcnXSA9ICcxJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgfVxuXG4gICAgZ2V0U3lzdGVtUHJpbWFyeUludmVydENvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fUFJJTUFSWV9JTlZFUlRfS0VZICsgJy1oJ1xuICAgICAgICBdID0gJzI1NSc7XG4gICAgICAgIHRoZW1lVmFyc1tcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0lOVkVSVF9LRVkgKyAnLXMnXG4gICAgICAgIF0gPSAnMTAwJSc7XG4gICAgICAgIHRoZW1lVmFyc1tcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0lOVkVSVF9LRVkgKyAnLWwnXG4gICAgICAgIF0gPSAnMTAwJSc7XG4gICAgfVxuXG4gICAgZ2V0U3lzdGVtUHJpbWFyeUNvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZICsgJy1oJ10gPVxuICAgICAgICAgICAgJzAnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZICsgJy1zJ10gPVxuICAgICAgICAgICAgJzAlJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0tFWSArICctbCddID1cbiAgICAgICAgICAgICcxMCUnO1xuICAgIH1cblxuICAgIGdldFN5c3RlbVN1Y2Nlc3NDb2xvcnNWYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9TVUNDRVNTX0tFWSArICctaCddID1cbiAgICAgICAgICAgICcxMDAnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1NVQ0NFU1NfS0VZICsgJy1zJ10gPVxuICAgICAgICAgICAgJzEwMCUnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1NVQ0NFU1NfS0VZICsgJy1sJ10gPVxuICAgICAgICAgICAgJzI1JSc7XG4gICAgfVxuXG4gICAgZ2V0U3lzdGVtQ2F1dGlvbkNvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX0NBVVRJT05fS0VZICsgJy1oJ10gPVxuICAgICAgICAgICAgJzM2MCc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fQ0FVVElPTl9LRVkgKyAnLXMnXSA9XG4gICAgICAgICAgICAnMTAwJSc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fQ0FVVElPTl9LRVkgKyAnLWwnXSA9XG4gICAgICAgICAgICAnNDAlJztcbiAgICB9XG5cbiAgICBnZXRVc2VyUHJpbWFyeUNvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVVNFUl9QUklNQVJZX0tFWSArICctaCddID0gJzc4JztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1VTRVJfUFJJTUFSWV9LRVkgKyAnLXMnXSA9XG4gICAgICAgICAgICAnODclJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1VTRVJfUFJJTUFSWV9LRVkgKyAnLWwnXSA9XG4gICAgICAgICAgICAnMjclJztcbiAgICB9XG5cbiAgICBnZXRVc2VyU2Vjb25kYXJ5Q29sb3JzVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9VU0VSX1NFQ09OREFSWV9LRVkgKyAnLWgnXSA9XG4gICAgICAgICAgICAnMzYnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVVNFUl9TRUNPTkRBUllfS0VZICsgJy1zJ10gPVxuICAgICAgICAgICAgJzEwMCUnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVVNFUl9TRUNPTkRBUllfS0VZICsgJy1sJ10gPVxuICAgICAgICAgICAgJzUwJSc7XG4gICAgfVxuXG4gICAgZ2V0V2Vha0NvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfV0VBS19LRVkgKyAnLWgnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fUFJJTUFSWV9LRVkgKyAnLWgpJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1dFQUtfS0VZICsgJy1zJ10gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZICsgJy1zKSc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9XRUFLX0tFWSArICctbCddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0tFWSArICctbCknO1xuICAgIH1cblxuICAgIGdldFJlZ3VsYXJDb2xvcnNWYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1JFR1VMQVJfS0VZICsgJy1oJ10gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZICsgJy1oKSc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9SRUdVTEFSX0tFWSArICctcyddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0tFWSArICctcyknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfUkVHVUxBUl9LRVkgKyAnLWwnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fUFJJTUFSWV9LRVkgKyAnLWwpJztcbiAgICB9XG5cbiAgICBnZXRTdHJvbmdDb2xvcnNWYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NUUk9OR19LRVkgKyAnLWgnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9VU0VSX1BSSU1BUllfS0VZICsgJy1oKSc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TVFJPTkdfS0VZICsgJy1zJ10gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVVNFUl9QUklNQVJZX0tFWSArICctcyknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1RST05HX0tFWSArICctbCddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1VTRVJfUFJJTUFSWV9LRVkgKyAnLWwpJztcbiAgICB9XG5cbiAgICBnZXRUZXh0Q29sb3JzVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9URVhUX0xJTktfS0VZICsgJy1oJ10gPSAnMjA3JztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1RFWFRfTElOS19LRVkgKyAnLXMnXSA9ICc3NiUnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVEVYVF9MSU5LX0tFWSArICctbCddID0gJzM3JSc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lQ29sb3JzVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIFN5c3RlbSBwcmltYXJ5IGludmVydCBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtUHJpbWFyeUludmVydENvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgICAgICAvLyBTeXN0ZW0gcHJpbWFyeSBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtUHJpbWFyeUNvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgICAgICAvLyBTeXN0ZW0gc3VjY2VzcyBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtU3VjY2Vzc0NvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgICAgICAvLyBTeXN0ZW0gY2F1dGlvbiBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0U3lzdGVtQ2F1dGlvbkNvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgICAgICAvLyBVc2VyIHByaW1hcnkgY29sb3JzLlxuICAgICAgICB0aGlzLmdldFVzZXJQcmltYXJ5Q29sb3JzVmFyaWFibGVzKHRoZW1lVmFycyk7XG4gICAgICAgIC8vIFVzZXIgc2Vjb25kYXJ5IGNvbG9ycy5cbiAgICAgICAgdGhpcy5nZXRVc2VyU2Vjb25kYXJ5Q29sb3JzVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gV2VhayBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0V2Vha0NvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgICAgICAvLyBSZWd1bGFyIGNvbG9ycy5cbiAgICAgICAgdGhpcy5nZXRSZWd1bGFyQ29sb3JzVmFyaWFibGVzKHRoZW1lVmFycyk7XG4gICAgICAgIC8vIFN0cm9uZyBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0U3Ryb25nQ29sb3JzVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gVGV4dCBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0VGV4dENvbG9yc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRUaGVtZVNoYWRvd3NWYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgbm9uZU9mZnNldCA9ICcwJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNIQURPV19OT05FX09GRlNFVF9LRVldID0gbm9uZU9mZnNldDtcblxuICAgICAgICBjb25zdCB4c09mZnNldCA9ICcwIDAuMTI1cmVtIDAuMjVyZW0gMCc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TSEFET1dfWFNfT0ZGU0VUX0tFWV0gPSB4c09mZnNldDtcblxuICAgICAgICBjb25zdCBzbU9mZnNldCA9ICcwIDAuMjVyZW0gMC41cmVtIDAnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0hBRE9XX1NNX09GRlNFVF9LRVldID0gc21PZmZzZXQ7XG5cbiAgICAgICAgY29uc3QgbWRPZmZzZXQgPSAnMCAwLjVyZW0gMXJlbSAwJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNIQURPV19NRF9PRkZTRVRfS0VZXSA9IG1kT2Zmc2V0O1xuXG4gICAgICAgIGNvbnN0IGxnT2Zmc2V0ID0gJzAgMXJlbSAycmVtIDAnO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0hBRE9XX0xHX09GRlNFVF9LRVldID0gbGdPZmZzZXQ7XG5cbiAgICAgICAgY29uc3QgeGxPZmZzZXQgPSAnMCAycmVtIDRyZW0gMCc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5TSEFET1dfWExfT0ZGU0VUX0tFWV0gPSB4bE9mZnNldDtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0VGhlbWVGb3JtQ3VzdG9taXphdGlvblZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtRmllbGRTcGFjaW5nID0gMTtcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkZPUk1fRklFTERfSEVJR0hUX0tFWV0gPVxuICAgICAgICAgICAgJzIuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9STV9GSUVMRF9USVRMRV9IRUlHSFRfS0VZXSA9XG4gICAgICAgICAgICAnMS41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT1JNX1NQQUNFSU5HX0tFWV0gPVxuICAgICAgICAgICAgZm9ybUZpZWxkU3BhY2luZyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT1JNX0ZJRUxEX1NQQUNFSU5HX0tFWV0gPVxuICAgICAgICAgICAgZm9ybUZpZWxkU3BhY2luZyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lQ2FyZEN1c3RvbWl6YXRpb25WYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNBUkRfRklFTERfSEVJR0hUX0tFWV0gPVxuICAgICAgICAgICAgJzEuNScgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ0FSRF9TUEFDRUlOR19LRVldID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNQQUNJTkdfU0laRV9YU19LRVkgKyAnKSc7XG5cbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNBUkRfQk9SREVSX1JBRElVU19LRVldID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkJPUkRFUl9SQURJVVNfTURfS0VZICsgJyknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ0FSRF9TSEFET1dfT0ZGU0VUX0tFWV0gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0hBRE9XX01EX09GRlNFVF9LRVkgKyAnKSc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lVGFibGVDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5UQUJMRV9GSUVMRF9IRUlHSFRfS0VZXSA9XG4gICAgICAgICAgICAnMicgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuVEFCTEVfU1BBQ0VJTkdfS0VZXSA9XG4gICAgICAgICAgICAnMC41JyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5UQUJMRV9CT1JERVJfUkFESVVTX0tFWV0gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQk9SREVSX1JBRElVU19NRF9LRVkgKyAnKSc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lUVNDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHFzU3RhdGU6IFBlcFN0eWxlVHlwZSA9ICdyZWd1bGFyJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlNUWUxFX1FTX0tFWV0gPSBxc1N0YXRlO1xuXG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9RU19LRVkgKyAnLWgnXSA9XG4gICAgICAgICAgICAndmFyKCcgKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9TWVNURU1fUFJJTUFSWV9LRVkgKyAnLWgpJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1FTX0tFWSArICctcyddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9QUklNQVJZX0tFWSArICctcyknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfUVNfS0VZICsgJy1sJ10gPVxuICAgICAgICAgICAgJ3ZhcignICsgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfU1lTVEVNX1BSSU1BUllfS0VZICsgJy1sKSc7XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdFRoZW1lTG9hZGVyQ3VzdG9taXphdGlvblZhcmlhYmxlcyh0aGVtZVZhcnM6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfTE9BREVSX0tFWSArICctaCddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9DQVVUSU9OX0tFWSArICctaCknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfTE9BREVSX0tFWSArICctcyddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9DQVVUSU9OX0tFWSArICctcyknO1xuICAgICAgICB0aGVtZVZhcnNbUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfTE9BREVSX0tFWSArICctbCddID1cbiAgICAgICAgICAgICd2YXIoJyArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1NZU1RFTV9DQVVUSU9OX0tFWSArICctbCknO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRUaGVtZVRvcEhlYWRlckN1c3RvbWl6YXRpb25WYXJpYWJsZXModGhlbWVWYXJzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdG9wSGVhZGVyU3RhdGU6IFBlcFN0eWxlVHlwZSA9ICdzdHJvbmcnO1xuICAgICAgICB0aGVtZVZhcnNbXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5TVFlMRV9UT1BfSEVBREVSX0tFWVxuICAgICAgICBdID0gdG9wSGVhZGVyU3RhdGU7XG5cbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1RPUF9IRUFERVJfS0VZICsgJy1oJ10gPSAnJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1RPUF9IRUFERVJfS0VZICsgJy1zJ10gPSAnJztcbiAgICAgICAgdGhlbWVWYXJzW1BlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1RPUF9IRUFERVJfS0VZICsgJy1sJ10gPSAnJztcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0VGhlbWVUb3BMZWdhY3lDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9UT1BfTEVHQUNZX0tFWSArICctaCddID0gJyc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9UT1BfTEVHQUNZX0tFWSArICctcyddID0gJyc7XG4gICAgICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9UT1BfTEVHQUNZX0tFWSArICctbCddID0gJyc7XG4gICAgfVxuXG4gICAgLy8gZ2V0RGVmYXVsdFRoZW1lQnJhbmRpbmdDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFyczogYW55KTogdm9pZCB7XG4gICAgLy8gICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5CUkFORElOR19MT0dPX1NSQ10gPSAnL2Fzc2V0cy9pbWFnZXMvUGVwcGVyaS1Mb2dvLUhpUmVzLnBuZyc7XG4gICAgLy8gICAgIHRoZW1lVmFyc1tQZXBDdXN0b21pemF0aW9uU2VydmljZS5GQVZfSUNPTl9TUkNdID0gJy9hc3NldHMvZmF2aWNvbi5pY28nO1xuICAgIC8vIH1cblxuICAgIGdldERlZmF1bHRUaGVtZVZhcmlhYmxlcygpOiBhbnkge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB7fTtcblxuICAgICAgICAvLyBEZWNsYXJlIGRlZmF1bHQgbGF5b3V0LlxuICAgICAgICB0aGlzLmdldERlZmF1bHRUaGVtZUxheW91dFZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuXG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCBib3JkZXIgcmFkaXVzLlxuICAgICAgICB0aGlzLmdldERlZmF1bHRUaGVtZUJvcmRlclJhZGl1c1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuXG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCBzcGFjaW5nLlxuICAgICAgICB0aGlzLmdldERlZmF1bHRUaGVtZVNwYWNpbmdWYXJpYWJsZXModGhlbWVWYXJzKTtcblxuICAgICAgICAvLyBEZWNsYXJlIGRlZmF1bHQgZm9udHMgc2l6ZSAmIGxpbmUgaGVpZ2h0LlxuICAgICAgICB0aGlzLmdldERlZmF1bHRUaGVtZUZvbnRzVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IGJ1dHRvbnMuXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lQnV0dG9uc1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuXG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCBjb2xvcnMuXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lQ29sb3JzVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IHNoYWRvd3MuXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lU2hhZG93c1ZhcmlhYmxlcyh0aGVtZVZhcnMpO1xuXG4gICAgICAgIC8vIERlY2xhcmUgZGVmYXVsdCBmb3JtIGN1c3RvbWl6YXRpb24uXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lRm9ybUN1c3RvbWl6YXRpb25WYXJpYWJsZXModGhlbWVWYXJzKTtcblxuICAgICAgICAvLyBEZWNsYXJlIGRlZmF1bHQgY2FyZCBjdXN0b21pemF0aW9uLlxuICAgICAgICB0aGlzLmdldERlZmF1bHRUaGVtZUNhcmRDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IHRhYmxlIGN1c3RvbWl6YXRpb24uXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lVGFibGVDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IHFzIGN1c3RvbWl6YXRpb24uXG4gICAgICAgIHRoaXMuZ2V0RGVmYXVsdFRoZW1lUVNDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IHRvcCBoZWFkZXIgY3VzdG9taXphdGlvbi5cbiAgICAgICAgdGhpcy5nZXREZWZhdWx0VGhlbWVUb3BIZWFkZXJDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gRGVjbGFyZSBkZWZhdWx0IHRvcCBsZWdhY3kgY3VzdG9taXphdGlvbi5cbiAgICAgICAgdGhpcy5nZXREZWZhdWx0VGhlbWVUb3BMZWdhY3lDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgLy8gLy8gRGVjbGFyZSBkZWZhdWx0IGJyYW5kaW5nIGxvZ28ncyBjdXN0b21pemF0aW9uXG4gICAgICAgIC8vIHRoaXMuZ2V0RGVmYXVsdFRoZW1lQnJhbmRpbmdDdXN0b21pemF0aW9uVmFyaWFibGVzKHRoZW1lVmFycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoZW1lVmFycztcbiAgICB9XG5cbiAgICBnZXRUaGVtZVZhcmlhYmxlcygpOiBhbnkge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLmdldERlZmF1bHRUaGVtZVZhcmlhYmxlcygpO1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdChcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlVTRVJfVEhFTUVfVkFSSUFCTEVTXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdHMuXG4gICAgICAgIGlmICh0aGVtZVZhcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoZW1lVmFycykge1xuICAgICAgICAgICAgICAgIHJldFtrZXldID0gdGhlbWVWYXJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHNldFRoZW1lVmFyaWFibGVzKHRoZW1lVmFyaWFibGVzVG9TZXQgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFyaWFibGVzID0gdGhpcy5nZXRUaGVtZVZhcmlhYmxlcygpO1xuXG4gICAgICAgIC8vIE92ZXJyaWRlIGRlZmF1bHRzLlxuICAgICAgICBpZiAodGhlbWVWYXJpYWJsZXNUb1NldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhlbWVWYXJpYWJsZXNUb1NldCkge1xuICAgICAgICAgICAgICAgIHRoZW1lVmFyaWFibGVzW2tleV0gPSB0aGVtZVZhcmlhYmxlc1RvU2V0W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnNldE9iamVjdChcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlVTRVJfVEhFTUVfVkFSSUFCTEVTLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhlbWVWYXJpYWJsZXMpXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhlbWVWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRm9udFVybEtleShrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlU2VydmljZS5sb2FkRm9udFN0eWxlKGtleSwgdGhlbWVWYXJpYWJsZXNba2V5XSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICB0aGVtZVZhcmlhYmxlc1trZXldXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRm9udFVybEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAga2V5ID09PSBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX0ZBTUlMWV9USVRMRV9OT1JNQUxfVVJMX0tFWSB8fFxuICAgICAgICAgICAga2V5ID09PSBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX0ZBTUlMWV9USVRMRV9CT0xEX1VSTF9LRVkgfHxcbiAgICAgICAgICAgIGtleSA9PT0gUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9OVF9GQU1JTFlfQk9EWV9OT1JNQUxfVVJMX0tFWSB8fFxuICAgICAgICAgICAga2V5ID09PSBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT05UX0ZBTUlMWV9CT0RZX0JPTERfVVJMX0tFWVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGdldFRoZW1lVmFyaWFibGUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmdldFRoZW1lVmFyaWFibGVzKCk7XG5cbiAgICAgICAgaWYgKHRoZW1lVmFycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlbWVWYXJzW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXROdW1iZXJUaGVtZVZhcmlhYmxlKHRoZW1lVmFycywga2V5OiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhlbWVWYXJzICYmIHRoZW1lVmFycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBJZiBpdCdzIHJlZmVyZW5jZSB0byBhbm90aGVyIGtleS5cbiAgICAgICAgICAgIGlmICh0aGVtZVZhcnNba2V5XS5pbmRleE9mKCd2YXIoJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0aGVtZVZhcnNba2V5XS5zdWJzdHIoNCkuc3BsaXQoJyknKVswXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdG1wID0gTnVtYmVyKFxuICAgICAgICAgICAgICAgIHRoZW1lVmFyc1trZXldLnJlcGxhY2UoUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuUkVNX1NUUklORywgJycpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIHRtcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRGb290ZXJIZWlnaHQoaGVpZ2h0KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvb3RlckhlaWdodC5nZXRWYWx1ZSgpICE9PSBoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIGl0IGlzIHB1Ymxpc2hpbmcgdGhpcyB2YWx1ZSB0byBhbGwgdGhlIHN1YnNjcmliZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IHN1YnNjcmliZWQgdG8gdGhpcyBtZXNzYWdlXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlckhlaWdodC5uZXh0KGhlaWdodCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT09URVJfSEVJR0hUX0tFWSxcbiAgICAgICAgICAgIGhlaWdodCArIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlJFTV9TVFJJTkdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBoaWRlRm9vdGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldEZvb3RlckhlaWdodCgwKTtcbiAgICB9XG5cbiAgICBzaG93Rm9vdGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmdldFRoZW1lVmFyaWFibGVzKCk7XG5cbiAgICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICAgIHRoaXMuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuRk9PVEVSX0JBUl9TUEFDSU5HX1RPUF9LRVlcbiAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgdGhpcy5nZXROdW1iZXJUaGVtZVZhcmlhYmxlKFxuICAgICAgICAgICAgICAgIHRoZW1lVmFycyxcbiAgICAgICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5GT09URVJfQkFSX1NQQUNJTkdfQk9UVE9NX0tFWVxuICAgICAgICAgICAgKSArXG4gICAgICAgICAgICB0aGlzLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlRPUF9CQVJfRklFTERfSEVJR0hUX0tFWVxuICAgICAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNldEZvb3RlckhlaWdodChyZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U2V0dGluZ3NXaWR0aCh3aWR0aCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5nc1dpZHRoLmdldFZhbHVlKCkgIT09IHdpZHRoKSB7XG4gICAgICAgICAgICAvLyBpdCBpcyBwdWJsaXNoaW5nIHRoaXMgdmFsdWUgdG8gYWxsIHRoZSBzdWJzY3JpYmVycyB0aGF0IGhhdmUgYWxyZWFkeSBzdWJzY3JpYmVkIHRvIHRoaXMgbWVzc2FnZVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1dpZHRoLm5leHQod2lkdGgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0VUVElOR1NfV0lEVEhfS0VZLFxuICAgICAgICAgICAgd2lkdGggKyBQZXBDdXN0b21pemF0aW9uU2VydmljZS5SRU1fU1RSSU5HXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaGlkZVNldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFNldHRpbmdzV2lkdGgoMCk7XG4gICAgfVxuXG4gICAgc2hvd1NldHRpbmdzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGVtZVZhcnMgPSB0aGlzLmdldFRoZW1lVmFyaWFibGVzKCk7XG5cbiAgICAgICAgY29uc3QgcmVzID0gdGhpcy5nZXROdW1iZXJUaGVtZVZhcmlhYmxlKFxuICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuU0lERV9CQVJfV0lEVEhfS0VZXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zZXRTZXR0aW5nc1dpZHRoKHJlcyk7XG4gICAgfVxuXG4gICAgZ2V0VG9wQmFySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRoZW1lVmFycyA9IHRoaXMuZ2V0VGhlbWVWYXJpYWJsZXMoKTtcblxuICAgICAgICBjb25zdCByZXMgPVxuICAgICAgICAgICAgdGhpcy5nZXROdW1iZXJUaGVtZVZhcmlhYmxlKFxuICAgICAgICAgICAgICAgIHRoZW1lVmFycyxcbiAgICAgICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5UT1BfQkFSX1NQQUNJTkdfVE9QX0tFWVxuICAgICAgICAgICAgKSArXG4gICAgICAgICAgICB0aGlzLmdldE51bWJlclRoZW1lVmFyaWFibGUoXG4gICAgICAgICAgICAgICAgdGhlbWVWYXJzLFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlRPUF9CQVJfU1BBQ0lOR19CT1RUT01fS0VZXG4gICAgICAgICAgICApICtcbiAgICAgICAgICAgIHRoaXMuZ2V0TnVtYmVyVGhlbWVWYXJpYWJsZShcbiAgICAgICAgICAgICAgICB0aGVtZVZhcnMsXG4gICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuVE9QX0JBUl9GSUVMRF9IRUlHSFRfS0VZXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc2V0T2xkVXNlclRoZW1lKHJlczogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEFkZGVkIHVzZXIgdGhlbWUuXG4gICAgICAgIGNvbnN0IHRoZW1lT2JqID0ge1xuICAgICAgICAgICAgVGhlbWU6IHJlcy5UaGVtZSB8fCAnZGVmYXVsdC10aGVtZScsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5zZXRPYmplY3QoXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5VU0VSX1RIRU1FLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhlbWVPYmopXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNwaW5uZXJDb2xvcjtcbiAgICAgICAgbGV0IGJyYW5kaW5nRm9udENvbG9yO1xuXG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRDb2xvcihyZXMuQnJhbmRpbmdNYWluQ29sb3IpKSB7XG4gICAgICAgICAgICBzcGlubmVyQ29sb3IgPSBQZXBDdXN0b21pemF0aW9uU2VydmljZS5ERUZBVUxUX1NQSU5ORVJfQ09MT1I7XG4gICAgICAgICAgICBicmFuZGluZ0ZvbnRDb2xvciA9ICcjMjIyJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwaW5uZXJDb2xvciA9IHJlcy5CcmFuZGluZ01haW5Db2xvcjtcbiAgICAgICAgICAgIGJyYW5kaW5nRm9udENvbG9yID0gUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuREVGQVVMVF9CUkFORElOR19DT0xPUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbG9yID0ge1xuICAgICAgICAgICAgQnJhbmRpbmdTZWNvbmRhcnlDb2xvcjogcmVzLkJyYW5kaW5nU2Vjb25kYXJ5Q29sb3IsXG4gICAgICAgICAgICBCcmFuZGluZ01haW5Db2xvcjogcmVzLkJyYW5kaW5nTWFpbkNvbG9yLFxuICAgICAgICAgICAgQnJhbmRpbmdGb250Q29sb3I6IGJyYW5kaW5nRm9udENvbG9yLFxuICAgICAgICAgICAgU3Bpbm5lckNvbG9yOiBzcGlubmVyQ29sb3IsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5zZXRPYmplY3QoXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5VU0VSX0NPTE9SLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29sb3IpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5oYXNDdXN0b21IZWFkZXIgPVxuICAgICAgICAgICAgcmVzLlRvcEhlYWRlckZpbGVzICYmXG4gICAgICAgICAgICAgICAgcmVzLlRvcEhlYWRlckZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICByZXMuVG9wSGVhZGVyRmlsZXNbMF0gIT09ICcnXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5oYXNDdXN0b21Ib21lcGFnZSA9XG4gICAgICAgICAgICByZXMuVXNlclJvbGUgPT09ICdCdXllcicgJiZcbiAgICAgICAgICAgIHJlcy5Ub3BIZWFkZXJGaWxlcyAmJlxuICAgICAgICAgICAgcmVzLlRvcEhlYWRlckZpbGVzLmxlbmd0aCA+IDEgJiZcbiAgICAgICAgICAgIHJlcy5Ub3BIZWFkZXJGaWxlc1sxXSAhPT0gJyc7XG4gICAgfVxuXG4gICAgaXNMZWdhY3lDb2xvcigpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuQ09MT1JfVE9QX0hFQURFUl9LRVkgKyAnLWgnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkNPTE9SX1RPUF9IRUFERVJfS0VZICsgJy1zJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICAgICBQZXBDdXN0b21pemF0aW9uU2VydmljZS5DT0xPUl9UT1BfSEVBREVSX0tFWSArICctbCdcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gIShoICYmIHMgJiYgbCk7XG4gICAgfVxuXG4gICAgZ2V0TG9hZGluZ1NwaW5uZXJDb2xvcigpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3Bpbm5lckNvbG9yID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDb2xvcigpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlVTRVJfQ09MT1JcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChjb2xvciAmJiBjb2xvci5TcGlubmVyQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBzcGlubmVyQ29sb3IgPSBjb2xvci5TcGlubmVyQ29sb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwaW5uZXJDb2xvciA9IFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLkRFRkFVTFRfU1BJTk5FUl9DT0xPUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGlubmVyQ29sb3I7XG4gICAgfVxuXG4gICAgZ2V0QnJhbmRpbmdNYWluQ29sb3IoKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGJyYW5kaW5nTWFpbkNvbG9yID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lDb2xvcigpKSB7XG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcEN1c3RvbWl6YXRpb25TZXJ2aWNlLlVTRVJfQ09MT1JcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChjb2xvciAmJiBjb2xvci5CcmFuZGluZ01haW5Db2xvcikge1xuICAgICAgICAgICAgICAgIGJyYW5kaW5nTWFpbkNvbG9yID0gY29sb3IuQnJhbmRpbmdNYWluQ29sb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyYW5kaW5nTWFpbkNvbG9yID1cbiAgICAgICAgICAgICAgICAgICAgUGVwQ3VzdG9taXphdGlvblNlcnZpY2UuREVGQVVMVF9CUkFORElOR19DT0xPUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmFuZGluZ01haW5Db2xvcjtcbiAgICB9XG5cbiAgICBpc0xpZ2h0Q29sb3IoaGV4Q29sb3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFoZXhDb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQnJpZ2h0ID0gZmFsc2U7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBjb25zdCBjID0gaGV4Q29sb3IucmVwbGFjZSgvXiMvLCAnJyk7XG5cbiAgICAgICAgc3VtID0gcGFyc2VJbnQoY1swXSArIGNbMV0sIDE2KTtcbiAgICAgICAgc3VtICs9IHBhcnNlSW50KGNbMl0gKyBjWzNdLCAxNik7XG4gICAgICAgIHN1bSArPSBwYXJzZUludChjWzRdICsgY1s1XSwgMTYpO1xuXG4gICAgICAgIGlmIChzdW0gPiAzODIuNikge1xuICAgICAgICAgICAgLy8gaXQncyBicmlnaHQgY29sb3JcbiAgICAgICAgICAgIGlzQnJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0JyaWdodDtcbiAgICB9XG59XG4iXX0=