@gnggln/ng-ui-system 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (721) hide show
  1. package/accordion/entry-accordion.d.ts +4 -0
  2. package/accordion/index.d.ts +5 -0
  3. package/accordion/lib/components/accordion/accordion.component.d.ts +125 -0
  4. package/accordion/lib/components/accordion/accordion.types.d.ts +64 -0
  5. package/accordion/lib/components/accordion/index.d.ts +2 -0
  6. package/accordion/lib/core/types/index.d.ts +133 -0
  7. package/base-layout/entry-base-layout.d.ts +4 -0
  8. package/base-layout/index.d.ts +5 -0
  9. package/base-layout/lib/components/base-layout/base-layout.component.d.ts +108 -0
  10. package/base-layout/lib/components/base-layout/base-layout.types.d.ts +40 -0
  11. package/base-layout/lib/components/base-layout/index.d.ts +13 -0
  12. package/base-layout/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  13. package/base-layout/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  14. package/base-layout/lib/components/blackbox/blackbox.service.d.ts +144 -0
  15. package/base-layout/lib/components/blackbox/blackbox.types.d.ts +238 -0
  16. package/base-layout/lib/components/button/button-area.component.d.ts +93 -0
  17. package/base-layout/lib/components/button/button.component.d.ts +61 -0
  18. package/base-layout/lib/components/button/button.types.d.ts +75 -0
  19. package/base-layout/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  20. package/base-layout/lib/components/page-header/page-header.component.d.ts +59 -0
  21. package/base-layout/lib/components/page-header/page-header.types.d.ts +96 -0
  22. package/base-layout/lib/core/types/index.d.ts +133 -0
  23. package/blackbox/entry-blackbox.d.ts +4 -0
  24. package/blackbox/index.d.ts +5 -0
  25. package/blackbox/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  26. package/blackbox/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  27. package/blackbox/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  28. package/blackbox/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  29. package/blackbox/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  30. package/blackbox/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  31. package/blackbox/lib/components/blackbox/blackbox.service.d.ts +144 -0
  32. package/blackbox/lib/components/blackbox/blackbox.types.d.ts +238 -0
  33. package/blackbox/lib/components/blackbox/index.d.ts +23 -0
  34. package/blackbox/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  35. package/blackbox/lib/components/button/button-area.component.d.ts +93 -0
  36. package/blackbox/lib/components/button/button.component.d.ts +61 -0
  37. package/blackbox/lib/components/button/button.types.d.ts +75 -0
  38. package/blackbox/lib/components/button/index.d.ts +15 -0
  39. package/blackbox/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  40. package/blackbox/lib/components/modal/index.d.ts +4 -0
  41. package/blackbox/lib/components/modal/modal.component.d.ts +44 -0
  42. package/blackbox/lib/components/modal/modal.service.d.ts +93 -0
  43. package/blackbox/lib/components/modal/modal.types.d.ts +110 -0
  44. package/blackbox/lib/core/types/index.d.ts +133 -0
  45. package/button/entry-button.d.ts +4 -0
  46. package/button/index.d.ts +5 -0
  47. package/button/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  48. package/button/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  49. package/button/lib/components/blackbox/blackbox.service.d.ts +144 -0
  50. package/button/lib/components/blackbox/blackbox.types.d.ts +238 -0
  51. package/button/lib/components/button/button-area.component.d.ts +93 -0
  52. package/button/lib/components/button/button.component.d.ts +61 -0
  53. package/button/lib/components/button/button.types.d.ts +75 -0
  54. package/button/lib/components/button/index.d.ts +15 -0
  55. package/button/lib/core/types/index.d.ts +133 -0
  56. package/core/entry-core.d.ts +5 -0
  57. package/core/index.d.ts +5 -0
  58. package/core/lib/core/types/index.d.ts +133 -0
  59. package/core/lib/core/utils/index.d.ts +60 -0
  60. package/crud-table/entry-crud-table.d.ts +4 -0
  61. package/crud-table/index.d.ts +5 -0
  62. package/crud-table/lib/components/accordion/accordion.component.d.ts +125 -0
  63. package/crud-table/lib/components/accordion/accordion.types.d.ts +64 -0
  64. package/crud-table/lib/components/accordion/index.d.ts +2 -0
  65. package/crud-table/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  66. package/crud-table/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  67. package/crud-table/lib/components/blackbox/blackbox.service.d.ts +144 -0
  68. package/crud-table/lib/components/blackbox/blackbox.types.d.ts +238 -0
  69. package/crud-table/lib/components/button/button-area.component.d.ts +93 -0
  70. package/crud-table/lib/components/button/button.component.d.ts +61 -0
  71. package/crud-table/lib/components/button/button.types.d.ts +75 -0
  72. package/crud-table/lib/components/button/index.d.ts +15 -0
  73. package/crud-table/lib/components/crud-table/crud-table.component.d.ts +143 -0
  74. package/crud-table/lib/components/crud-table/crud-table.types.d.ts +207 -0
  75. package/crud-table/lib/components/crud-table/index.d.ts +15 -0
  76. package/crud-table/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  77. package/crud-table/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  78. package/crud-table/lib/components/form-builder/form-builder.component.d.ts +279 -0
  79. package/crud-table/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  80. package/crud-table/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  81. package/crud-table/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  82. package/crud-table/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  83. package/crud-table/lib/components/form-builder/services/location.service.d.ts +83 -0
  84. package/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  85. package/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  86. package/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  87. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  88. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  89. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  90. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  91. package/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  92. package/crud-table/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  93. package/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  94. package/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  95. package/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  96. package/crud-table/lib/components/form-builder/types/condition.types.d.ts +51 -0
  97. package/crud-table/lib/components/form-builder/types/field.types.d.ts +330 -0
  98. package/crud-table/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  99. package/crud-table/lib/components/form-builder/types/schema.types.d.ts +304 -0
  100. package/crud-table/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  101. package/crud-table/lib/components/form-builder/types/validation.types.d.ts +179 -0
  102. package/crud-table/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  103. package/crud-table/lib/components/modal/modal.service.d.ts +93 -0
  104. package/crud-table/lib/components/modal/modal.types.d.ts +110 -0
  105. package/crud-table/lib/core/logging/logger.config.d.ts +18 -0
  106. package/crud-table/lib/core/logging/logger.service.d.ts +75 -0
  107. package/crud-table/lib/core/logging/logger.types.d.ts +70 -0
  108. package/crud-table/lib/core/types/index.d.ts +133 -0
  109. package/esm2022/accordion/entry-accordion.mjs +5 -0
  110. package/esm2022/accordion/gnggln-ng-ui-system-accordion.mjs +5 -0
  111. package/esm2022/accordion/lib/components/accordion/accordion.component.mjs +398 -0
  112. package/esm2022/accordion/lib/components/accordion/accordion.types.mjs +6 -0
  113. package/esm2022/accordion/lib/components/accordion/index.mjs +2 -0
  114. package/esm2022/accordion/lib/core/types/index.mjs +6 -0
  115. package/esm2022/base-layout/entry-base-layout.mjs +5 -0
  116. package/esm2022/base-layout/gnggln-ng-ui-system-base-layout.mjs +5 -0
  117. package/esm2022/base-layout/lib/components/base-layout/base-layout.component.mjs +272 -0
  118. package/esm2022/base-layout/lib/components/base-layout/base-layout.types.mjs +6 -0
  119. package/esm2022/base-layout/lib/components/base-layout/index.mjs +14 -0
  120. package/esm2022/base-layout/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  121. package/esm2022/base-layout/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  122. package/esm2022/base-layout/lib/components/blackbox/blackbox.service.mjs +323 -0
  123. package/esm2022/base-layout/lib/components/blackbox/blackbox.types.mjs +25 -0
  124. package/esm2022/base-layout/lib/components/button/button-area.component.mjs +210 -0
  125. package/esm2022/base-layout/lib/components/button/button.component.mjs +180 -0
  126. package/esm2022/base-layout/lib/components/button/button.types.mjs +6 -0
  127. package/esm2022/base-layout/lib/components/page-header/breadcrumb.service.mjs +243 -0
  128. package/esm2022/base-layout/lib/components/page-header/page-header.component.mjs +243 -0
  129. package/esm2022/base-layout/lib/components/page-header/page-header.types.mjs +21 -0
  130. package/esm2022/base-layout/lib/core/types/index.mjs +6 -0
  131. package/esm2022/blackbox/entry-blackbox.mjs +5 -0
  132. package/esm2022/blackbox/gnggln-ng-ui-system-blackbox.mjs +5 -0
  133. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  134. package/esm2022/blackbox/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  135. package/esm2022/blackbox/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  136. package/esm2022/blackbox/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  137. package/esm2022/blackbox/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  138. package/esm2022/blackbox/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  139. package/esm2022/blackbox/lib/components/blackbox/blackbox.service.mjs +323 -0
  140. package/esm2022/blackbox/lib/components/blackbox/blackbox.types.mjs +25 -0
  141. package/esm2022/blackbox/lib/components/blackbox/index.mjs +27 -0
  142. package/esm2022/blackbox/lib/components/blackbox/ui-track.directive.mjs +69 -0
  143. package/esm2022/blackbox/lib/components/button/button-area.component.mjs +210 -0
  144. package/esm2022/blackbox/lib/components/button/button.component.mjs +180 -0
  145. package/esm2022/blackbox/lib/components/button/button.types.mjs +6 -0
  146. package/esm2022/blackbox/lib/components/button/index.mjs +16 -0
  147. package/esm2022/blackbox/lib/components/modal/confirm-dialog.component.mjs +151 -0
  148. package/esm2022/blackbox/lib/components/modal/index.mjs +4 -0
  149. package/esm2022/blackbox/lib/components/modal/modal.component.mjs +139 -0
  150. package/esm2022/blackbox/lib/components/modal/modal.service.mjs +197 -0
  151. package/esm2022/blackbox/lib/components/modal/modal.types.mjs +6 -0
  152. package/esm2022/blackbox/lib/core/types/index.mjs +6 -0
  153. package/esm2022/button/entry-button.mjs +5 -0
  154. package/esm2022/button/gnggln-ng-ui-system-button.mjs +5 -0
  155. package/esm2022/button/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  156. package/esm2022/button/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  157. package/esm2022/button/lib/components/blackbox/blackbox.service.mjs +323 -0
  158. package/esm2022/button/lib/components/blackbox/blackbox.types.mjs +25 -0
  159. package/esm2022/button/lib/components/button/button-area.component.mjs +210 -0
  160. package/esm2022/button/lib/components/button/button.component.mjs +180 -0
  161. package/esm2022/button/lib/components/button/button.types.mjs +6 -0
  162. package/esm2022/button/lib/components/button/index.mjs +16 -0
  163. package/esm2022/button/lib/core/types/index.mjs +6 -0
  164. package/esm2022/core/entry-core.mjs +6 -0
  165. package/esm2022/core/gnggln-ng-ui-system-core.mjs +5 -0
  166. package/esm2022/core/lib/core/types/index.mjs +6 -0
  167. package/esm2022/core/lib/core/utils/index.mjs +102 -0
  168. package/esm2022/crud-table/entry-crud-table.mjs +5 -0
  169. package/esm2022/crud-table/gnggln-ng-ui-system-crud-table.mjs +5 -0
  170. package/esm2022/crud-table/lib/components/accordion/accordion.component.mjs +398 -0
  171. package/esm2022/crud-table/lib/components/accordion/accordion.types.mjs +6 -0
  172. package/esm2022/crud-table/lib/components/accordion/index.mjs +2 -0
  173. package/esm2022/crud-table/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  174. package/esm2022/crud-table/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  175. package/esm2022/crud-table/lib/components/blackbox/blackbox.service.mjs +323 -0
  176. package/esm2022/crud-table/lib/components/blackbox/blackbox.types.mjs +25 -0
  177. package/esm2022/crud-table/lib/components/button/button-area.component.mjs +210 -0
  178. package/esm2022/crud-table/lib/components/button/button.component.mjs +180 -0
  179. package/esm2022/crud-table/lib/components/button/button.types.mjs +6 -0
  180. package/esm2022/crud-table/lib/components/button/index.mjs +16 -0
  181. package/esm2022/crud-table/lib/components/crud-table/crud-table.component.mjs +789 -0
  182. package/esm2022/crud-table/lib/components/crud-table/crud-table.types.mjs +6 -0
  183. package/esm2022/crud-table/lib/components/crud-table/index.mjs +16 -0
  184. package/esm2022/crud-table/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  185. package/esm2022/crud-table/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  186. package/esm2022/crud-table/lib/components/form-builder/form-builder.component.mjs +1351 -0
  187. package/esm2022/crud-table/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  188. package/esm2022/crud-table/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  189. package/esm2022/crud-table/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  190. package/esm2022/crud-table/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  191. package/esm2022/crud-table/lib/components/form-builder/services/location.service.mjs +141 -0
  192. package/esm2022/crud-table/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  193. package/esm2022/crud-table/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  194. package/esm2022/crud-table/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  195. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  196. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  197. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  198. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  199. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  200. package/esm2022/crud-table/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  201. package/esm2022/crud-table/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  202. package/esm2022/crud-table/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  203. package/esm2022/crud-table/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  204. package/esm2022/crud-table/lib/components/form-builder/types/condition.types.mjs +6 -0
  205. package/esm2022/crud-table/lib/components/form-builder/types/field.types.mjs +6 -0
  206. package/esm2022/crud-table/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  207. package/esm2022/crud-table/lib/components/form-builder/types/schema.types.mjs +6 -0
  208. package/esm2022/crud-table/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  209. package/esm2022/crud-table/lib/components/form-builder/types/validation.types.mjs +10 -0
  210. package/esm2022/crud-table/lib/components/modal/confirm-dialog.component.mjs +151 -0
  211. package/esm2022/crud-table/lib/components/modal/modal.service.mjs +197 -0
  212. package/esm2022/crud-table/lib/components/modal/modal.types.mjs +6 -0
  213. package/esm2022/crud-table/lib/core/logging/logger.config.mjs +18 -0
  214. package/esm2022/crud-table/lib/core/logging/logger.service.mjs +295 -0
  215. package/esm2022/crud-table/lib/core/logging/logger.types.mjs +7 -0
  216. package/esm2022/crud-table/lib/core/types/index.mjs +6 -0
  217. package/esm2022/crud-table/lib/sources/location-data.opt.json +8942 -0
  218. package/esm2022/crud-table/lib/sources/nazioni.opt.json +215 -0
  219. package/esm2022/form-builder/entry-form-builder.mjs +5 -0
  220. package/esm2022/form-builder/gnggln-ng-ui-system-form-builder.mjs +5 -0
  221. package/esm2022/form-builder/lib/components/accordion/accordion.component.mjs +398 -0
  222. package/esm2022/form-builder/lib/components/accordion/accordion.types.mjs +6 -0
  223. package/esm2022/form-builder/lib/components/accordion/index.mjs +2 -0
  224. package/esm2022/form-builder/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  225. package/esm2022/form-builder/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  226. package/esm2022/form-builder/lib/components/blackbox/blackbox.service.mjs +323 -0
  227. package/esm2022/form-builder/lib/components/blackbox/blackbox.types.mjs +25 -0
  228. package/esm2022/form-builder/lib/components/button/button-area.component.mjs +210 -0
  229. package/esm2022/form-builder/lib/components/button/button.component.mjs +180 -0
  230. package/esm2022/form-builder/lib/components/button/button.types.mjs +6 -0
  231. package/esm2022/form-builder/lib/components/button/index.mjs +16 -0
  232. package/esm2022/form-builder/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  233. package/esm2022/form-builder/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  234. package/esm2022/form-builder/lib/components/form-builder/form-builder.component.mjs +1351 -0
  235. package/esm2022/form-builder/lib/components/form-builder/form-wizard.component.mjs +1064 -0
  236. package/esm2022/form-builder/lib/components/form-builder/index.mjs +24 -0
  237. package/esm2022/form-builder/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  238. package/esm2022/form-builder/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  239. package/esm2022/form-builder/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  240. package/esm2022/form-builder/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  241. package/esm2022/form-builder/lib/components/form-builder/services/location.service.mjs +141 -0
  242. package/esm2022/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  243. package/esm2022/form-builder/lib/components/form-builder/services/wizard-sync.service.mjs +84 -0
  244. package/esm2022/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  245. package/esm2022/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  246. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  247. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  248. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  249. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  250. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  251. package/esm2022/form-builder/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  252. package/esm2022/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  253. package/esm2022/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  254. package/esm2022/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  255. package/esm2022/form-builder/lib/components/form-builder/types/condition.types.mjs +6 -0
  256. package/esm2022/form-builder/lib/components/form-builder/types/field.types.mjs +6 -0
  257. package/esm2022/form-builder/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  258. package/esm2022/form-builder/lib/components/form-builder/types/index.mjs +3 -0
  259. package/esm2022/form-builder/lib/components/form-builder/types/schema.types.mjs +6 -0
  260. package/esm2022/form-builder/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  261. package/esm2022/form-builder/lib/components/form-builder/types/validation.types.mjs +10 -0
  262. package/esm2022/form-builder/lib/core/logging/logger.config.mjs +18 -0
  263. package/esm2022/form-builder/lib/core/logging/logger.service.mjs +295 -0
  264. package/esm2022/form-builder/lib/core/logging/logger.types.mjs +7 -0
  265. package/esm2022/form-builder/lib/core/types/index.mjs +6 -0
  266. package/esm2022/form-builder/lib/sources/location-data.opt.json +8942 -0
  267. package/esm2022/form-builder/lib/sources/nazioni.opt.json +215 -0
  268. package/esm2022/form-builder-editor/entry-form-builder-editor.mjs +5 -0
  269. package/esm2022/form-builder-editor/gnggln-ng-ui-system-form-builder-editor.mjs +5 -0
  270. package/esm2022/form-builder-editor/lib/components/accordion/accordion.component.mjs +398 -0
  271. package/esm2022/form-builder-editor/lib/components/accordion/accordion.types.mjs +6 -0
  272. package/esm2022/form-builder-editor/lib/components/accordion/index.mjs +2 -0
  273. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  274. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  275. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.service.mjs +323 -0
  276. package/esm2022/form-builder-editor/lib/components/blackbox/blackbox.types.mjs +25 -0
  277. package/esm2022/form-builder-editor/lib/components/button/button-area.component.mjs +210 -0
  278. package/esm2022/form-builder-editor/lib/components/button/button.component.mjs +180 -0
  279. package/esm2022/form-builder-editor/lib/components/button/button.types.mjs +6 -0
  280. package/esm2022/form-builder-editor/lib/components/button/index.mjs +16 -0
  281. package/esm2022/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.mjs +82 -0
  282. package/esm2022/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.mjs +184 -0
  283. package/esm2022/form-builder-editor/lib/components/form-builder/form-builder.component.mjs +1351 -0
  284. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-condition.service.mjs +132 -0
  285. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  286. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  287. package/esm2022/form-builder-editor/lib/components/form-builder/services/form-validation.service.mjs +381 -0
  288. package/esm2022/form-builder-editor/lib/components/form-builder/services/location.service.mjs +141 -0
  289. package/esm2022/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  290. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +190 -0
  291. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.mjs +310 -0
  292. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  293. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  294. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  295. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  296. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  297. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  298. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  299. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.mjs +648 -0
  300. package/esm2022/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +432 -0
  301. package/esm2022/form-builder-editor/lib/components/form-builder/types/condition.types.mjs +6 -0
  302. package/esm2022/form-builder-editor/lib/components/form-builder/types/field.types.mjs +6 -0
  303. package/esm2022/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  304. package/esm2022/form-builder-editor/lib/components/form-builder/types/index.mjs +3 -0
  305. package/esm2022/form-builder-editor/lib/components/form-builder/types/schema.types.mjs +6 -0
  306. package/esm2022/form-builder-editor/lib/components/form-builder/types/territoriale.types.mjs +6 -0
  307. package/esm2022/form-builder-editor/lib/components/form-builder/types/validation.types.mjs +10 -0
  308. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.mjs +730 -0
  309. package/esm2022/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.mjs +56 -0
  310. package/esm2022/form-builder-editor/lib/components/form-builder-editor/index.mjs +23 -0
  311. package/esm2022/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  312. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.mjs +190 -0
  313. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.mjs +324 -0
  314. package/esm2022/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.mjs +188 -0
  315. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.mjs +667 -0
  316. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.mjs +317 -0
  317. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.mjs +611 -0
  318. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.mjs +267 -0
  319. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.mjs +276 -0
  320. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.mjs +323 -0
  321. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +238 -0
  322. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +473 -0
  323. package/esm2022/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.mjs +473 -0
  324. package/esm2022/form-builder-editor/lib/components/form-builder-editor/types/editor.types.mjs +6 -0
  325. package/esm2022/form-builder-editor/lib/components/modal/confirm-dialog.component.mjs +151 -0
  326. package/esm2022/form-builder-editor/lib/components/modal/index.mjs +4 -0
  327. package/esm2022/form-builder-editor/lib/components/modal/modal.component.mjs +139 -0
  328. package/esm2022/form-builder-editor/lib/components/modal/modal.service.mjs +197 -0
  329. package/esm2022/form-builder-editor/lib/components/modal/modal.types.mjs +6 -0
  330. package/esm2022/form-builder-editor/lib/core/logging/logger.config.mjs +18 -0
  331. package/esm2022/form-builder-editor/lib/core/logging/logger.service.mjs +295 -0
  332. package/esm2022/form-builder-editor/lib/core/logging/logger.types.mjs +7 -0
  333. package/esm2022/form-builder-editor/lib/core/types/index.mjs +6 -0
  334. package/esm2022/form-builder-editor/lib/sources/location-data.opt.json +8942 -0
  335. package/esm2022/form-builder-editor/lib/sources/nazioni.opt.json +215 -0
  336. package/esm2022/http/entry-http.mjs +5 -0
  337. package/esm2022/http/gnggln-ng-ui-system-http.mjs +5 -0
  338. package/esm2022/http/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  339. package/esm2022/http/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  340. package/esm2022/http/lib/components/blackbox/blackbox.service.mjs +323 -0
  341. package/esm2022/http/lib/components/blackbox/blackbox.types.mjs +25 -0
  342. package/esm2022/http/lib/components/http/http-message.handler.mjs +143 -0
  343. package/esm2022/http/lib/components/http/http.service.mjs +228 -0
  344. package/esm2022/http/lib/components/http/http.tokens.mjs +29 -0
  345. package/esm2022/http/lib/components/http/http.types.mjs +6 -0
  346. package/esm2022/http/lib/components/http/index.mjs +19 -0
  347. package/esm2022/http/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  348. package/esm2022/http/lib/components/layout-builder/layout.service.mjs +239 -0
  349. package/esm2022/http/lib/components/toast/toast-container.component.mjs +80 -0
  350. package/esm2022/http/lib/components/toast/toast.component.mjs +151 -0
  351. package/esm2022/http/lib/components/toast/toast.service.mjs +156 -0
  352. package/esm2022/http/lib/components/toast/toast.types.mjs +12 -0
  353. package/esm2022/http/lib/core/types/index.mjs +6 -0
  354. package/esm2022/http/lib/core/utils/index.mjs +102 -0
  355. package/esm2022/layout-builder/entry-layout-builder.mjs +5 -0
  356. package/esm2022/layout-builder/gnggln-ng-ui-system-layout-builder.mjs +5 -0
  357. package/esm2022/layout-builder/lib/components/layout-builder/index.mjs +18 -0
  358. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.component.mjs +1804 -0
  359. package/esm2022/layout-builder/lib/components/layout-builder/layout-builder.types.mjs +9 -0
  360. package/esm2022/layout-builder/lib/components/layout-builder/layout.service.mjs +239 -0
  361. package/esm2022/layout-builder/lib/core/types/index.mjs +6 -0
  362. package/esm2022/lib/components/accordion/accordion.component.mjs +106 -61
  363. package/esm2022/lib/components/accordion/accordion.types.mjs +1 -1
  364. package/esm2022/lib/components/base-layout/base-layout.component.mjs +88 -34
  365. package/esm2022/lib/components/base-layout/base-layout.types.mjs +1 -1
  366. package/esm2022/lib/components/base-layout/index.mjs +1 -1
  367. package/esm2022/lib/components/blackbox/blackbox-debugger.component.mjs +904 -0
  368. package/esm2022/lib/components/blackbox/blackbox-debugger.service.mjs +51 -0
  369. package/esm2022/lib/components/blackbox/blackbox-fingerprint.service.mjs +116 -0
  370. package/esm2022/lib/components/blackbox/blackbox-json-viewer.component.mjs +66 -0
  371. package/esm2022/lib/components/blackbox/blackbox-storage.service.mjs +286 -0
  372. package/esm2022/lib/components/blackbox/blackbox.interceptor.mjs +135 -0
  373. package/esm2022/lib/components/blackbox/blackbox.service.mjs +323 -0
  374. package/esm2022/lib/components/blackbox/blackbox.types.mjs +25 -0
  375. package/esm2022/lib/components/blackbox/index.mjs +27 -0
  376. package/esm2022/lib/components/blackbox/ui-track.directive.mjs +69 -0
  377. package/esm2022/lib/components/button/button-area.component.mjs +16 -2
  378. package/esm2022/lib/components/button/button.component.mjs +23 -7
  379. package/esm2022/lib/components/button/button.types.mjs +1 -1
  380. package/esm2022/lib/components/crud-table/crud-table.component.mjs +14 -14
  381. package/esm2022/lib/components/form-builder/form-builder.component.mjs +710 -183
  382. package/esm2022/lib/components/form-builder/form-wizard.component.mjs +789 -235
  383. package/esm2022/lib/components/form-builder/index.mjs +7 -2
  384. package/esm2022/lib/components/form-builder/services/form-error-state.matcher.mjs +10 -0
  385. package/esm2022/lib/components/form-builder/services/form-field-error.service.mjs +103 -0
  386. package/esm2022/lib/components/form-builder/services/location.service.mjs +4 -3
  387. package/esm2022/lib/components/form-builder/services/nominatim-geocoding.service.mjs +120 -0
  388. package/esm2022/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.mjs +142 -113
  389. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-number-field.component.mjs +113 -0
  390. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.mjs +105 -0
  391. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-select-field.component.mjs +126 -0
  392. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-text-field.component.mjs +147 -0
  393. package/esm2022/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.mjs +99 -0
  394. package/esm2022/lib/components/form-builder/sub-components/form-fields/index.mjs +6 -0
  395. package/esm2022/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.mjs +322 -0
  396. package/esm2022/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.mjs +3 -3
  397. package/esm2022/lib/components/form-builder/types/field.types.mjs +1 -1
  398. package/esm2022/lib/components/form-builder/types/geocoded-location.types.mjs +6 -0
  399. package/esm2022/lib/components/form-builder/types/index.mjs +3 -2
  400. package/esm2022/lib/components/form-builder/types/schema.types.mjs +1 -1
  401. package/esm2022/lib/components/form-builder/types/validation.types.mjs +6 -2
  402. package/esm2022/lib/components/form-builder-editor/form-builder-editor.component.mjs +3 -3
  403. package/esm2022/lib/components/form-builder-editor/index.mjs +3 -1
  404. package/esm2022/lib/components/form-builder-editor/presets/editor-presets.mjs +395 -0
  405. package/esm2022/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.mjs +2 -2
  406. package/esm2022/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.mjs +2 -1
  407. package/esm2022/lib/components/http/http-message.handler.mjs +143 -0
  408. package/esm2022/lib/components/http/http.service.mjs +228 -0
  409. package/esm2022/lib/components/http/http.tokens.mjs +29 -0
  410. package/esm2022/lib/components/http/http.types.mjs +6 -0
  411. package/esm2022/lib/components/http/index.mjs +19 -0
  412. package/esm2022/lib/components/layout-builder/layout-builder.component.mjs +27 -15
  413. package/esm2022/lib/components/modal/confirm-dialog.component.mjs +3 -3
  414. package/esm2022/lib/components/modal/modal.service.mjs +5 -2
  415. package/esm2022/lib/components/page-header/breadcrumb.service.mjs +5 -4
  416. package/esm2022/lib/components/table/paginated-table.component.mjs +17 -3
  417. package/esm2022/lib/components/table/table.types.mjs +1 -1
  418. package/esm2022/lib/components/toast/index.mjs +18 -0
  419. package/esm2022/lib/components/toast/toast-container.component.mjs +80 -0
  420. package/esm2022/lib/components/toast/toast.component.mjs +151 -0
  421. package/esm2022/lib/components/toast/toast.service.mjs +156 -0
  422. package/esm2022/lib/components/toast/toast.types.mjs +12 -0
  423. package/esm2022/lib/core/logging/index.mjs +10 -0
  424. package/esm2022/lib/core/logging/logger.config.mjs +18 -0
  425. package/esm2022/lib/core/logging/logger.service.mjs +295 -0
  426. package/esm2022/lib/core/logging/logger.types.mjs +7 -0
  427. package/esm2022/lib/core/types/index.mjs +1 -1
  428. package/esm2022/lib/core/utils/index.mjs +50 -1
  429. package/esm2022/lib/version/ng-ui-system-version.mjs +12 -0
  430. package/esm2022/modal/entry-modal.mjs +5 -0
  431. package/esm2022/modal/gnggln-ng-ui-system-modal.mjs +5 -0
  432. package/esm2022/modal/lib/components/button/button.component.mjs +180 -0
  433. package/esm2022/modal/lib/components/button/button.types.mjs +6 -0
  434. package/esm2022/modal/lib/components/modal/confirm-dialog.component.mjs +151 -0
  435. package/esm2022/modal/lib/components/modal/index.mjs +4 -0
  436. package/esm2022/modal/lib/components/modal/modal.component.mjs +139 -0
  437. package/esm2022/modal/lib/components/modal/modal.service.mjs +197 -0
  438. package/esm2022/modal/lib/components/modal/modal.types.mjs +6 -0
  439. package/esm2022/modal/lib/core/types/index.mjs +6 -0
  440. package/esm2022/page-header/entry-page-header.mjs +5 -0
  441. package/esm2022/page-header/gnggln-ng-ui-system-page-header.mjs +5 -0
  442. package/esm2022/page-header/lib/components/page-header/breadcrumb.service.mjs +243 -0
  443. package/esm2022/page-header/lib/components/page-header/index.mjs +20 -0
  444. package/esm2022/page-header/lib/components/page-header/page-header.component.mjs +243 -0
  445. package/esm2022/page-header/lib/components/page-header/page-header.types.mjs +21 -0
  446. package/esm2022/public-api.mjs +17 -8
  447. package/esm2022/table/entry-table.mjs +5 -0
  448. package/esm2022/table/gnggln-ng-ui-system-table.mjs +5 -0
  449. package/esm2022/table/lib/components/table/index.mjs +2 -0
  450. package/esm2022/table/lib/components/table/paginated-table.component.mjs +421 -0
  451. package/esm2022/table/lib/components/table/table.types.mjs +6 -0
  452. package/esm2022/table/lib/core/utils/index.mjs +102 -0
  453. package/esm2022/toast/entry-toast.mjs +5 -0
  454. package/esm2022/toast/gnggln-ng-ui-system-toast.mjs +5 -0
  455. package/esm2022/toast/lib/components/toast/index.mjs +18 -0
  456. package/esm2022/toast/lib/components/toast/toast-container.component.mjs +80 -0
  457. package/esm2022/toast/lib/components/toast/toast.component.mjs +151 -0
  458. package/esm2022/toast/lib/components/toast/toast.service.mjs +156 -0
  459. package/esm2022/toast/lib/components/toast/toast.types.mjs +12 -0
  460. package/esm2022/toast/lib/core/types/index.mjs +6 -0
  461. package/esm2022/toast/lib/core/utils/index.mjs +102 -0
  462. package/fesm2022/gnggln-ng-ui-system-accordion.mjs +409 -0
  463. package/fesm2022/gnggln-ng-ui-system-accordion.mjs.map +1 -0
  464. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs +1905 -0
  465. package/fesm2022/gnggln-ng-ui-system-base-layout.mjs.map +1 -0
  466. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs +2829 -0
  467. package/fesm2022/gnggln-ng-ui-system-blackbox.mjs.map +1 -0
  468. package/fesm2022/gnggln-ng-ui-system-button.mjs +1148 -0
  469. package/fesm2022/gnggln-ng-ui-system-button.mjs.map +1 -0
  470. package/fesm2022/gnggln-ng-ui-system-core.mjs +117 -0
  471. package/fesm2022/gnggln-ng-ui-system-core.mjs.map +1 -0
  472. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs +49600 -0
  473. package/fesm2022/gnggln-ng-ui-system-crud-table.mjs.map +1 -0
  474. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs +54332 -0
  475. package/fesm2022/gnggln-ng-ui-system-form-builder-editor.mjs.map +1 -0
  476. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs +49609 -0
  477. package/fesm2022/gnggln-ng-ui-system-form-builder.mjs.map +1 -0
  478. package/fesm2022/gnggln-ng-ui-system-http.mjs +1878 -0
  479. package/fesm2022/gnggln-ng-ui-system-http.mjs.map +1 -0
  480. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs +2064 -0
  481. package/fesm2022/gnggln-ng-ui-system-layout-builder.mjs.map +1 -0
  482. package/fesm2022/gnggln-ng-ui-system-modal.mjs +664 -0
  483. package/fesm2022/gnggln-ng-ui-system-modal.mjs.map +1 -0
  484. package/fesm2022/gnggln-ng-ui-system-page-header.mjs +526 -0
  485. package/fesm2022/gnggln-ng-ui-system-page-header.mjs.map +1 -0
  486. package/fesm2022/gnggln-ng-ui-system-table.mjs +533 -0
  487. package/fesm2022/gnggln-ng-ui-system-table.mjs.map +1 -0
  488. package/fesm2022/gnggln-ng-ui-system-toast.mjs +516 -0
  489. package/fesm2022/gnggln-ng-ui-system-toast.mjs.map +1 -0
  490. package/fesm2022/gnggln-ng-ui-system.mjs +10068 -4234
  491. package/fesm2022/gnggln-ng-ui-system.mjs.map +1 -1
  492. package/form-builder/entry-form-builder.d.ts +4 -0
  493. package/form-builder/index.d.ts +5 -0
  494. package/form-builder/lib/components/accordion/accordion.component.d.ts +125 -0
  495. package/form-builder/lib/components/accordion/accordion.types.d.ts +64 -0
  496. package/form-builder/lib/components/accordion/index.d.ts +2 -0
  497. package/form-builder/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  498. package/form-builder/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  499. package/form-builder/lib/components/blackbox/blackbox.service.d.ts +144 -0
  500. package/form-builder/lib/components/blackbox/blackbox.types.d.ts +238 -0
  501. package/form-builder/lib/components/button/button-area.component.d.ts +93 -0
  502. package/form-builder/lib/components/button/button.component.d.ts +61 -0
  503. package/form-builder/lib/components/button/button.types.d.ts +75 -0
  504. package/form-builder/lib/components/button/index.d.ts +15 -0
  505. package/form-builder/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  506. package/form-builder/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  507. package/form-builder/lib/components/form-builder/form-builder.component.d.ts +279 -0
  508. package/form-builder/lib/components/form-builder/form-wizard.component.d.ts +172 -0
  509. package/form-builder/lib/components/form-builder/index.d.ts +19 -0
  510. package/form-builder/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  511. package/form-builder/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  512. package/form-builder/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  513. package/form-builder/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  514. package/form-builder/lib/components/form-builder/services/location.service.d.ts +83 -0
  515. package/form-builder/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  516. package/form-builder/lib/components/form-builder/services/wizard-sync.service.d.ts +63 -0
  517. package/form-builder/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  518. package/form-builder/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  519. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  520. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  521. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  522. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  523. package/form-builder/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  524. package/form-builder/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  525. package/form-builder/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  526. package/form-builder/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  527. package/form-builder/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  528. package/form-builder/lib/components/form-builder/types/condition.types.d.ts +51 -0
  529. package/form-builder/lib/components/form-builder/types/field.types.d.ts +330 -0
  530. package/form-builder/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  531. package/form-builder/lib/components/form-builder/types/index.d.ts +6 -0
  532. package/form-builder/lib/components/form-builder/types/schema.types.d.ts +304 -0
  533. package/form-builder/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  534. package/form-builder/lib/components/form-builder/types/validation.types.d.ts +179 -0
  535. package/form-builder/lib/core/logging/logger.config.d.ts +18 -0
  536. package/form-builder/lib/core/logging/logger.service.d.ts +75 -0
  537. package/form-builder/lib/core/logging/logger.types.d.ts +70 -0
  538. package/form-builder/lib/core/types/index.d.ts +133 -0
  539. package/form-builder-editor/entry-form-builder-editor.d.ts +4 -0
  540. package/form-builder-editor/index.d.ts +5 -0
  541. package/form-builder-editor/lib/components/accordion/accordion.component.d.ts +125 -0
  542. package/form-builder-editor/lib/components/accordion/accordion.types.d.ts +64 -0
  543. package/form-builder-editor/lib/components/accordion/index.d.ts +2 -0
  544. package/form-builder-editor/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  545. package/form-builder-editor/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  546. package/form-builder-editor/lib/components/blackbox/blackbox.service.d.ts +144 -0
  547. package/form-builder-editor/lib/components/blackbox/blackbox.types.d.ts +238 -0
  548. package/form-builder-editor/lib/components/button/button-area.component.d.ts +93 -0
  549. package/form-builder-editor/lib/components/button/button.component.d.ts +61 -0
  550. package/form-builder-editor/lib/components/button/button.types.d.ts +75 -0
  551. package/form-builder-editor/lib/components/button/index.d.ts +15 -0
  552. package/form-builder-editor/lib/components/form-builder/adapters/it-date-adapter.d.ts +32 -0
  553. package/form-builder-editor/lib/components/form-builder/directives/currency-input.directive.d.ts +48 -0
  554. package/form-builder-editor/lib/components/form-builder/form-builder.component.d.ts +279 -0
  555. package/form-builder-editor/lib/components/form-builder/services/form-condition.service.d.ts +46 -0
  556. package/form-builder-editor/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  557. package/form-builder-editor/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  558. package/form-builder-editor/lib/components/form-builder/services/form-validation.service.d.ts +63 -0
  559. package/form-builder-editor/lib/components/form-builder/services/location.service.d.ts +83 -0
  560. package/form-builder-editor/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  561. package/form-builder-editor/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +31 -0
  562. package/form-builder-editor/lib/components/form-builder/sub-components/file-input/file-input.component.d.ts +41 -0
  563. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  564. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  565. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  566. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  567. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  568. package/form-builder-editor/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  569. package/form-builder-editor/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  570. package/form-builder-editor/lib/components/form-builder/sub-components/specifica-territoriale/specifica-territoriale.component.d.ts +145 -0
  571. package/form-builder-editor/lib/components/form-builder/sub-components/table-territoriale/table-territoriale.component.d.ts +108 -0
  572. package/form-builder-editor/lib/components/form-builder/types/condition.types.d.ts +51 -0
  573. package/form-builder-editor/lib/components/form-builder/types/field.types.d.ts +330 -0
  574. package/form-builder-editor/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  575. package/form-builder-editor/lib/components/form-builder/types/index.d.ts +6 -0
  576. package/form-builder-editor/lib/components/form-builder/types/schema.types.d.ts +304 -0
  577. package/form-builder-editor/lib/components/form-builder/types/territoriale.types.d.ts +170 -0
  578. package/form-builder-editor/lib/components/form-builder/types/validation.types.d.ts +179 -0
  579. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.component.d.ts +117 -0
  580. package/form-builder-editor/lib/components/form-builder-editor/form-builder-editor.service.d.ts +38 -0
  581. package/form-builder-editor/lib/components/form-builder-editor/index.d.ts +17 -0
  582. package/form-builder-editor/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  583. package/form-builder-editor/lib/components/form-builder-editor/services/editor-persistence.service.d.ts +42 -0
  584. package/form-builder-editor/lib/components/form-builder-editor/services/editor-state.service.d.ts +66 -0
  585. package/form-builder-editor/lib/components/form-builder-editor/services/field-factory.service.d.ts +28 -0
  586. package/form-builder-editor/lib/components/form-builder-editor/sub-components/condition-editor/condition-editor.component.d.ts +139 -0
  587. package/form-builder-editor/lib/components/form-builder-editor/sub-components/editor-toolbar/editor-toolbar.component.d.ts +43 -0
  588. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-config-panel/field-config-panel.component.d.ts +83 -0
  589. package/form-builder-editor/lib/components/form-builder-editor/sub-components/field-palette/field-palette.component.d.ts +40 -0
  590. package/form-builder-editor/lib/components/form-builder-editor/sub-components/form-values-panel/form-values-panel.component.d.ts +51 -0
  591. package/form-builder-editor/lib/components/form-builder-editor/sub-components/options-editor/options-editor.component.d.ts +63 -0
  592. package/form-builder-editor/lib/components/form-builder-editor/sub-components/preview-container/preview-container.component.d.ts +68 -0
  593. package/form-builder-editor/lib/components/form-builder-editor/sub-components/section-editor/section-editor.component.d.ts +82 -0
  594. package/form-builder-editor/lib/components/form-builder-editor/sub-components/validation-editor/validation-editor.component.d.ts +112 -0
  595. package/form-builder-editor/lib/components/form-builder-editor/types/editor.types.d.ts +124 -0
  596. package/form-builder-editor/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  597. package/form-builder-editor/lib/components/modal/index.d.ts +4 -0
  598. package/form-builder-editor/lib/components/modal/modal.component.d.ts +44 -0
  599. package/form-builder-editor/lib/components/modal/modal.service.d.ts +93 -0
  600. package/form-builder-editor/lib/components/modal/modal.types.d.ts +110 -0
  601. package/form-builder-editor/lib/core/logging/logger.config.d.ts +18 -0
  602. package/form-builder-editor/lib/core/logging/logger.service.d.ts +75 -0
  603. package/form-builder-editor/lib/core/logging/logger.types.d.ts +70 -0
  604. package/form-builder-editor/lib/core/types/index.d.ts +133 -0
  605. package/http/entry-http.d.ts +4 -0
  606. package/http/index.d.ts +5 -0
  607. package/http/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  608. package/http/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  609. package/http/lib/components/blackbox/blackbox.service.d.ts +144 -0
  610. package/http/lib/components/blackbox/blackbox.types.d.ts +238 -0
  611. package/http/lib/components/http/http-message.handler.d.ts +59 -0
  612. package/http/lib/components/http/http.service.d.ts +98 -0
  613. package/http/lib/components/http/http.tokens.d.ts +29 -0
  614. package/http/lib/components/http/http.types.d.ts +50 -0
  615. package/http/lib/components/http/index.d.ts +17 -0
  616. package/http/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  617. package/http/lib/components/layout-builder/layout.service.d.ts +100 -0
  618. package/http/lib/components/toast/toast-container.component.d.ts +27 -0
  619. package/http/lib/components/toast/toast.component.d.ts +37 -0
  620. package/http/lib/components/toast/toast.service.d.ts +39 -0
  621. package/http/lib/components/toast/toast.types.d.ts +52 -0
  622. package/http/lib/core/types/index.d.ts +133 -0
  623. package/http/lib/core/utils/index.d.ts +60 -0
  624. package/layout-builder/entry-layout-builder.d.ts +4 -0
  625. package/layout-builder/index.d.ts +5 -0
  626. package/layout-builder/lib/components/layout-builder/index.d.ts +16 -0
  627. package/layout-builder/lib/components/layout-builder/layout-builder.component.d.ts +85 -0
  628. package/layout-builder/lib/components/layout-builder/layout-builder.types.d.ts +436 -0
  629. package/layout-builder/lib/components/layout-builder/layout.service.d.ts +100 -0
  630. package/layout-builder/lib/core/types/index.d.ts +133 -0
  631. package/lib/components/accordion/accordion.component.d.ts +10 -3
  632. package/lib/components/accordion/accordion.types.d.ts +2 -0
  633. package/lib/components/base-layout/base-layout.component.d.ts +36 -11
  634. package/lib/components/base-layout/base-layout.types.d.ts +14 -0
  635. package/lib/components/base-layout/index.d.ts +1 -1
  636. package/lib/components/blackbox/blackbox-debugger.component.d.ts +80 -0
  637. package/lib/components/blackbox/blackbox-debugger.service.d.ts +34 -0
  638. package/lib/components/blackbox/blackbox-fingerprint.service.d.ts +36 -0
  639. package/lib/components/blackbox/blackbox-json-viewer.component.d.ts +18 -0
  640. package/lib/components/blackbox/blackbox-storage.service.d.ts +55 -0
  641. package/lib/components/blackbox/blackbox.interceptor.d.ts +38 -0
  642. package/lib/components/blackbox/blackbox.service.d.ts +144 -0
  643. package/lib/components/blackbox/blackbox.types.d.ts +238 -0
  644. package/lib/components/blackbox/index.d.ts +23 -0
  645. package/lib/components/blackbox/ui-track.directive.d.ts +20 -0
  646. package/lib/components/button/button-area.component.d.ts +6 -1
  647. package/lib/components/button/button.component.d.ts +8 -2
  648. package/lib/components/button/button.types.d.ts +5 -0
  649. package/lib/components/form-builder/form-builder.component.d.ts +125 -29
  650. package/lib/components/form-builder/form-wizard.component.d.ts +89 -4
  651. package/lib/components/form-builder/index.d.ts +7 -1
  652. package/lib/components/form-builder/services/form-error-state.matcher.d.ts +9 -0
  653. package/lib/components/form-builder/services/form-field-error.service.d.ts +38 -0
  654. package/lib/components/form-builder/services/nominatim-geocoding.service.d.ts +37 -0
  655. package/lib/components/form-builder/sub-components/error-summary/form-error-summary.component.d.ts +9 -6
  656. package/lib/components/form-builder/sub-components/form-fields/form-number-field.component.d.ts +42 -0
  657. package/lib/components/form-builder/sub-components/form-fields/form-radio-field.component.d.ts +45 -0
  658. package/lib/components/form-builder/sub-components/form-fields/form-select-field.component.d.ts +44 -0
  659. package/lib/components/form-builder/sub-components/form-fields/form-text-field.component.d.ts +62 -0
  660. package/lib/components/form-builder/sub-components/form-fields/form-textarea-field.component.d.ts +39 -0
  661. package/lib/components/form-builder/sub-components/form-fields/index.d.ts +5 -0
  662. package/lib/components/form-builder/sub-components/location-geocoded/location-geocoded.component.d.ts +84 -0
  663. package/lib/components/form-builder/types/field.types.d.ts +48 -6
  664. package/lib/components/form-builder/types/geocoded-location.types.d.ts +116 -0
  665. package/lib/components/form-builder/types/index.d.ts +4 -3
  666. package/lib/components/form-builder/types/schema.types.d.ts +83 -6
  667. package/lib/components/form-builder/types/validation.types.d.ts +5 -0
  668. package/lib/components/form-builder-editor/index.d.ts +2 -0
  669. package/lib/components/form-builder-editor/presets/editor-presets.d.ts +25 -0
  670. package/lib/components/http/http-message.handler.d.ts +59 -0
  671. package/lib/components/http/http.service.d.ts +98 -0
  672. package/lib/components/http/http.tokens.d.ts +29 -0
  673. package/lib/components/http/http.types.d.ts +50 -0
  674. package/lib/components/http/index.d.ts +17 -0
  675. package/lib/components/page-header/breadcrumb.service.d.ts +2 -2
  676. package/lib/components/table/table.types.d.ts +5 -0
  677. package/lib/components/toast/index.d.ts +17 -0
  678. package/lib/components/toast/toast-container.component.d.ts +27 -0
  679. package/lib/components/toast/toast.component.d.ts +37 -0
  680. package/lib/components/toast/toast.service.d.ts +39 -0
  681. package/lib/components/toast/toast.types.d.ts +52 -0
  682. package/lib/core/logging/index.d.ts +8 -0
  683. package/lib/core/logging/logger.config.d.ts +18 -0
  684. package/lib/core/logging/logger.service.d.ts +75 -0
  685. package/lib/core/logging/logger.types.d.ts +70 -0
  686. package/lib/core/types/index.d.ts +76 -0
  687. package/lib/core/utils/index.d.ts +31 -0
  688. package/lib/version/ng-ui-system-version.d.ts +9 -0
  689. package/modal/entry-modal.d.ts +4 -0
  690. package/modal/index.d.ts +5 -0
  691. package/modal/lib/components/button/button.component.d.ts +61 -0
  692. package/modal/lib/components/button/button.types.d.ts +75 -0
  693. package/modal/lib/components/modal/confirm-dialog.component.d.ts +46 -0
  694. package/modal/lib/components/modal/index.d.ts +4 -0
  695. package/modal/lib/components/modal/modal.component.d.ts +44 -0
  696. package/modal/lib/components/modal/modal.service.d.ts +93 -0
  697. package/modal/lib/components/modal/modal.types.d.ts +110 -0
  698. package/modal/lib/core/types/index.d.ts +133 -0
  699. package/package.json +93 -8
  700. package/page-header/entry-page-header.d.ts +4 -0
  701. package/page-header/index.d.ts +5 -0
  702. package/page-header/lib/components/page-header/breadcrumb.service.d.ts +96 -0
  703. package/page-header/lib/components/page-header/index.d.ts +16 -0
  704. package/page-header/lib/components/page-header/page-header.component.d.ts +59 -0
  705. package/page-header/lib/components/page-header/page-header.types.d.ts +96 -0
  706. package/public-api.d.ts +11 -6
  707. package/table/entry-table.d.ts +4 -0
  708. package/table/index.d.ts +5 -0
  709. package/table/lib/components/table/index.d.ts +2 -0
  710. package/table/lib/components/table/paginated-table.component.d.ts +85 -0
  711. package/table/lib/components/table/table.types.d.ts +86 -0
  712. package/table/lib/core/utils/index.d.ts +60 -0
  713. package/toast/entry-toast.d.ts +4 -0
  714. package/toast/index.d.ts +5 -0
  715. package/toast/lib/components/toast/index.d.ts +17 -0
  716. package/toast/lib/components/toast/toast-container.component.d.ts +27 -0
  717. package/toast/lib/components/toast/toast.component.d.ts +37 -0
  718. package/toast/lib/components/toast/toast.service.d.ts +39 -0
  719. package/toast/lib/components/toast/toast.types.d.ts +52 -0
  720. package/toast/lib/core/types/index.d.ts +133 -0
  721. package/toast/lib/core/utils/index.d.ts +60 -0
@@ -1,15 +1,429 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, ViewEncapsulation, ViewChild, inject, HostListener, } from '@angular/core';
2
2
  import { LucideAngularModule } from 'lucide-angular';
3
3
  import { Subject, takeUntil } from 'rxjs';
4
4
  import { UiButtonComponent } from '../../components/button/index';
5
5
  import { UiFormBuilderComponent } from './form-builder.component';
6
- import { UiWizardSyncService } from './services/wizard-sync.service';
6
+ import { UiWizardSyncService, } from './services/wizard-sync.service';
7
+ import { UiLoggerService } from '../../core/logging/logger.service';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "lucide-angular";
10
+ // ─── Componenti interni ───────────────────────────────────────────
11
+ /**
12
+ * Header del wizard: progresso e info dello step corrente.
13
+ * Con `progressStyle: 'steps'` emette `stepSelect` per saltare a uno step già completato.
14
+ */
15
+ export class UiWizardHeaderComponent {
16
+ constructor() {
17
+ this.stepGroups = [];
18
+ this.progressPercent = 0;
19
+ this.currentStepTitle = '';
20
+ this.currentStepDescription = '';
21
+ /** Quando true, i bullet step non sono interattivi (es. wizard disabilitato). */
22
+ this.disableStepIndicators = false;
23
+ this.stepSelect = new EventEmitter();
24
+ }
25
+ /** Indice step selezionabile tramite bullet/titolo (solo step già completati, non il corrente). */
26
+ isStepIndicatorNavigable(stepIndex) {
27
+ if (this.config.allowStepIndicatorNavigation === false)
28
+ return false;
29
+ if (this.disableStepIndicators)
30
+ return false;
31
+ if (this.config.allowBackNavigation === false)
32
+ return false;
33
+ return (stepIndex !== this.state.currentStep &&
34
+ this.state.completedSteps.has(stepIndex));
35
+ }
36
+ /** Testo accessibile per il pulsante step (navigazione). */
37
+ stepAriaLabel(stepTitle) {
38
+ return `Vai allo step: ${stepTitle}`;
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardHeaderComponent, isStandalone: true, selector: "ui-wizard-header", inputs: { config: "config", stepGroups: "stepGroups", state: "state", progressPercent: "progressPercent", currentStepTitle: "currentStepTitle", currentStepDescription: "currentStepDescription", disableStepIndicators: "disableStepIndicators" }, outputs: { stepSelect: "stepSelect" }, ngImport: i0, template: `
42
+ <div class="ui-form-wizard__header">
43
+ @if (config.showProgress !== false) {
44
+ @if (config.progressStyle !== 'steps') {
45
+ <div class="ui-form-wizard__progress-bar">
46
+ <div
47
+ class="ui-form-wizard__progress-fill"
48
+ [style.width.%]="progressPercent"
49
+ ></div>
50
+ </div>
51
+ <span class="ui-form-wizard__progress-text">
52
+ {{ progressPercent }}% completato
53
+ </span>
54
+ } @else {
55
+ <div class="ui-form-wizard__steps">
56
+ @for (
57
+ group of stepGroups;
58
+ track $index;
59
+ let i = $index
60
+ ) {
61
+ <div
62
+ class="ui-form-wizard__step"
63
+ [class.ui-form-wizard__step--current]="
64
+ i === state.currentStep
65
+ "
66
+ [class.ui-form-wizard__step--completed]="
67
+ state.completedSteps.has(i)
68
+ "
69
+ [class.ui-form-wizard__step--visited]="
70
+ state.visitedSteps.has(i)
71
+ "
72
+ [class.ui-form-wizard__step--navigable]="
73
+ isStepIndicatorNavigable(i)
74
+ "
75
+ >
76
+ @if (isStepIndicatorNavigable(i)) {
77
+ <button
78
+ type="button"
79
+ class="ui-form-wizard__step-trigger"
80
+ [attr.aria-label]="
81
+ stepAriaLabel(
82
+ group[0].wizardStep?.stepTitle ||
83
+ group[0].title ||
84
+ 'Step ' + (i + 1)
85
+ )
86
+ "
87
+ (click)="stepSelect.emit(i)"
88
+ >
89
+ <div class="ui-form-wizard__step-circle">
90
+ @if (state.completedSteps.has(i)) {
91
+ <lucide-icon name="check" [size]="16" />
92
+ } @else {
93
+ <span>{{ i + 1 }}</span>
94
+ }
95
+ </div>
96
+ <div class="ui-form-wizard__step-label">
97
+ {{
98
+ group[0].wizardStep?.stepTitle ||
99
+ group[0].title ||
100
+ 'Step ' + (i + 1)
101
+ }}
102
+ </div>
103
+ </button>
104
+ } @else {
105
+ <div
106
+ class="ui-form-wizard__step-static"
107
+ [attr.aria-current]="
108
+ i === state.currentStep ? 'step' : null
109
+ "
110
+ >
111
+ <div class="ui-form-wizard__step-circle">
112
+ @if (state.completedSteps.has(i)) {
113
+ <lucide-icon name="check" [size]="16" />
114
+ } @else {
115
+ <span>{{ i + 1 }}</span>
116
+ }
117
+ </div>
118
+ <div class="ui-form-wizard__step-label">
119
+ {{
120
+ group[0].wizardStep?.stepTitle ||
121
+ group[0].title ||
122
+ 'Step ' + (i + 1)
123
+ }}
124
+ </div>
125
+ </div>
126
+ }
127
+ </div>
128
+ }
129
+ </div>
130
+ }
131
+ }
132
+
133
+ <div class="ui-form-wizard__step-info">
134
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
135
+ @if (currentStepDescription) {
136
+ <p class="ui-form-wizard__step-description">
137
+ {{ currentStepDescription }}
138
+ </p>
139
+ }
140
+ <span class="ui-form-wizard__step-counter">
141
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
142
+ </span>
143
+ </div>
144
+ </div>
145
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], encapsulation: i0.ViewEncapsulation.None }); }
146
+ }
147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardHeaderComponent, decorators: [{
148
+ type: Component,
149
+ args: [{
150
+ selector: 'ui-wizard-header',
151
+ standalone: true,
152
+ imports: [LucideAngularModule],
153
+ encapsulation: ViewEncapsulation.None,
154
+ template: `
155
+ <div class="ui-form-wizard__header">
156
+ @if (config.showProgress !== false) {
157
+ @if (config.progressStyle !== 'steps') {
158
+ <div class="ui-form-wizard__progress-bar">
159
+ <div
160
+ class="ui-form-wizard__progress-fill"
161
+ [style.width.%]="progressPercent"
162
+ ></div>
163
+ </div>
164
+ <span class="ui-form-wizard__progress-text">
165
+ {{ progressPercent }}% completato
166
+ </span>
167
+ } @else {
168
+ <div class="ui-form-wizard__steps">
169
+ @for (
170
+ group of stepGroups;
171
+ track $index;
172
+ let i = $index
173
+ ) {
174
+ <div
175
+ class="ui-form-wizard__step"
176
+ [class.ui-form-wizard__step--current]="
177
+ i === state.currentStep
178
+ "
179
+ [class.ui-form-wizard__step--completed]="
180
+ state.completedSteps.has(i)
181
+ "
182
+ [class.ui-form-wizard__step--visited]="
183
+ state.visitedSteps.has(i)
184
+ "
185
+ [class.ui-form-wizard__step--navigable]="
186
+ isStepIndicatorNavigable(i)
187
+ "
188
+ >
189
+ @if (isStepIndicatorNavigable(i)) {
190
+ <button
191
+ type="button"
192
+ class="ui-form-wizard__step-trigger"
193
+ [attr.aria-label]="
194
+ stepAriaLabel(
195
+ group[0].wizardStep?.stepTitle ||
196
+ group[0].title ||
197
+ 'Step ' + (i + 1)
198
+ )
199
+ "
200
+ (click)="stepSelect.emit(i)"
201
+ >
202
+ <div class="ui-form-wizard__step-circle">
203
+ @if (state.completedSteps.has(i)) {
204
+ <lucide-icon name="check" [size]="16" />
205
+ } @else {
206
+ <span>{{ i + 1 }}</span>
207
+ }
208
+ </div>
209
+ <div class="ui-form-wizard__step-label">
210
+ {{
211
+ group[0].wizardStep?.stepTitle ||
212
+ group[0].title ||
213
+ 'Step ' + (i + 1)
214
+ }}
215
+ </div>
216
+ </button>
217
+ } @else {
218
+ <div
219
+ class="ui-form-wizard__step-static"
220
+ [attr.aria-current]="
221
+ i === state.currentStep ? 'step' : null
222
+ "
223
+ >
224
+ <div class="ui-form-wizard__step-circle">
225
+ @if (state.completedSteps.has(i)) {
226
+ <lucide-icon name="check" [size]="16" />
227
+ } @else {
228
+ <span>{{ i + 1 }}</span>
229
+ }
230
+ </div>
231
+ <div class="ui-form-wizard__step-label">
232
+ {{
233
+ group[0].wizardStep?.stepTitle ||
234
+ group[0].title ||
235
+ 'Step ' + (i + 1)
236
+ }}
237
+ </div>
238
+ </div>
239
+ }
240
+ </div>
241
+ }
242
+ </div>
243
+ }
244
+ }
245
+
246
+ <div class="ui-form-wizard__step-info">
247
+ <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
248
+ @if (currentStepDescription) {
249
+ <p class="ui-form-wizard__step-description">
250
+ {{ currentStepDescription }}
251
+ </p>
252
+ }
253
+ <span class="ui-form-wizard__step-counter">
254
+ Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
255
+ </span>
256
+ </div>
257
+ </div>
258
+ `,
259
+ }]
260
+ }], propDecorators: { config: [{
261
+ type: Input
262
+ }], stepGroups: [{
263
+ type: Input
264
+ }], state: [{
265
+ type: Input
266
+ }], progressPercent: [{
267
+ type: Input
268
+ }], currentStepTitle: [{
269
+ type: Input
270
+ }], currentStepDescription: [{
271
+ type: Input
272
+ }], disableStepIndicators: [{
273
+ type: Input
274
+ }], stepSelect: [{
275
+ type: Output
276
+ }] } });
277
+ /**
278
+ * Footer del wizard: pulsanti di navigazione e salvataggio.
279
+ * Emette eventi per Previous, Next, Finish, Save.
280
+ */
281
+ export class UiWizardFooterComponent {
282
+ constructor() {
283
+ this.isLastStep = false;
284
+ this.previous = new EventEmitter();
285
+ this.next = new EventEmitter();
286
+ this.finish = new EventEmitter();
287
+ this.save = new EventEmitter();
288
+ }
289
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
290
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiWizardFooterComponent, isStandalone: true, selector: "ui-wizard-footer", inputs: { config: "config", state: "state", isLastStep: "isLastStep" }, outputs: { previous: "previous", next: "next", finish: "finish", save: "save" }, ngImport: i0, template: `
291
+ <div class="ui-form-wizard__footer">
292
+ @if (
293
+ config.allowBackNavigation !== false && state.currentStep > 0
294
+ ) {
295
+ <div class="ui-form-wizard__nav-action">
296
+ <ui-button
297
+ [label]="config.buttonLabels?.previous ?? 'Indietro'"
298
+ variant="outline"
299
+ icon="chevron-left"
300
+ (click)="previous.emit()"
301
+ />
302
+ <span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
303
+ </div>
304
+ } @else {
305
+ <div></div>
306
+ }
307
+
308
+ <div class="ui-form-wizard__footer-right">
309
+ @if (config.autoSave && config.buttonLabels?.save) {
310
+ <ui-button
311
+ [label]="config.buttonLabels!.save!"
312
+ variant="outline"
313
+ (click)="save.emit()"
314
+ />
315
+ }
316
+ <div class="ui-form-wizard__nav-action">
317
+ @if (isLastStep) {
318
+ <ui-button
319
+ [label]="config.buttonLabels?.finish ?? 'Completa'"
320
+ variant="primary"
321
+ icon="check"
322
+ iconPosition="trailing"
323
+ (click)="finish.emit()"
324
+ />
325
+ } @else {
326
+ <ui-button
327
+ [label]="
328
+ config.buttonLabels?.next ??
329
+ config.buttonLabels?.submit ??
330
+ 'Avanti'
331
+ "
332
+ variant="primary"
333
+ icon="chevron-right"
334
+ iconPosition="trailing"
335
+ (click)="next.emit()"
336
+ />
337
+ }
338
+ <span class="ui-form-wizard__nav-hint">Ctrl + →</span>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ `, isInline: true, dependencies: [{ kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }], encapsulation: i0.ViewEncapsulation.None }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiWizardFooterComponent, decorators: [{
345
+ type: Component,
346
+ args: [{
347
+ selector: 'ui-wizard-footer',
348
+ standalone: true,
349
+ imports: [UiButtonComponent],
350
+ encapsulation: ViewEncapsulation.None,
351
+ template: `
352
+ <div class="ui-form-wizard__footer">
353
+ @if (
354
+ config.allowBackNavigation !== false && state.currentStep > 0
355
+ ) {
356
+ <div class="ui-form-wizard__nav-action">
357
+ <ui-button
358
+ [label]="config.buttonLabels?.previous ?? 'Indietro'"
359
+ variant="outline"
360
+ icon="chevron-left"
361
+ (click)="previous.emit()"
362
+ />
363
+ <span class="ui-form-wizard__nav-hint">Ctrl + ←</span>
364
+ </div>
365
+ } @else {
366
+ <div></div>
367
+ }
368
+
369
+ <div class="ui-form-wizard__footer-right">
370
+ @if (config.autoSave && config.buttonLabels?.save) {
371
+ <ui-button
372
+ [label]="config.buttonLabels!.save!"
373
+ variant="outline"
374
+ (click)="save.emit()"
375
+ />
376
+ }
377
+ <div class="ui-form-wizard__nav-action">
378
+ @if (isLastStep) {
379
+ <ui-button
380
+ [label]="config.buttonLabels?.finish ?? 'Completa'"
381
+ variant="primary"
382
+ icon="check"
383
+ iconPosition="trailing"
384
+ (click)="finish.emit()"
385
+ />
386
+ } @else {
387
+ <ui-button
388
+ [label]="
389
+ config.buttonLabels?.next ??
390
+ config.buttonLabels?.submit ??
391
+ 'Avanti'
392
+ "
393
+ variant="primary"
394
+ icon="chevron-right"
395
+ iconPosition="trailing"
396
+ (click)="next.emit()"
397
+ />
398
+ }
399
+ <span class="ui-form-wizard__nav-hint">Ctrl + →</span>
400
+ </div>
401
+ </div>
402
+ </div>
403
+ `,
404
+ }]
405
+ }], propDecorators: { config: [{
406
+ type: Input
407
+ }], state: [{
408
+ type: Input
409
+ }], isLastStep: [{
410
+ type: Input
411
+ }], previous: [{
412
+ type: Output
413
+ }], next: [{
414
+ type: Output
415
+ }], finish: [{
416
+ type: Output
417
+ }], save: [{
418
+ type: Output
419
+ }] } });
420
+ // ─── Componente wizard principale ─────────────────────────────────
9
421
  /**
10
422
  * Componente wizard che wrappa `UiFormBuilderComponent`
11
423
  * aggiungendo navigazione multi-step, barra di progresso,
12
424
  * validazione per step e sincronizzazione wireless.
425
+ * Più sezioni schema con lo stesso `wizardStep.stepNumber` formano un unico passo
426
+ * (es. più blocchi collassabili per step); metadati del passo dalla prima sezione del gruppo.
13
427
  *
14
428
  * @selector ui-form-wizard
15
429
  *
@@ -27,6 +441,7 @@ export class UiFormWizardComponent {
27
441
  constructor() {
28
442
  this.cdr = inject(ChangeDetectorRef);
29
443
  this.wizardSync = inject(UiWizardSyncService);
444
+ this.logger = inject(UiLoggerService, { optional: true });
30
445
  this.destroy$ = new Subject();
31
446
  /** Metodi di validazione custom per step. */
32
447
  this.customValidationMethods = {};
@@ -38,6 +453,8 @@ export class UiFormWizardComponent {
38
453
  this.disabled = false;
39
454
  /** Pulsante in caricamento. */
40
455
  this.loadingFor = null;
456
+ /** Template per campi `type: 'custom'` (inoltro al form builder). */
457
+ this.customFieldTemplates = {};
41
458
  // ─── Output ─────────────────────────────────────────────────────
42
459
  this.stepChange = new EventEmitter();
43
460
  this.stepComplete = new EventEmitter();
@@ -55,8 +472,11 @@ export class UiFormWizardComponent {
55
472
  isValid: false,
56
473
  stepErrors: {},
57
474
  };
58
- /** Step ordinati per stepNumber. */
59
- this.wizardSteps = [];
475
+ /**
476
+ * Gruppi di sezioni schema per passo logico del wizard.
477
+ * Sezioni con lo stesso `wizardStep.stepNumber` compongono un unico passo (ordine: come in `schema.sections` dopo sort per numero).
478
+ */
479
+ this.wizardStepGroups = [];
60
480
  /** Dati accumulati del form. */
61
481
  this.accumulatedData = {};
62
482
  /**
@@ -70,27 +490,28 @@ export class UiFormWizardComponent {
70
490
  // ─── Getter calcolati ───────────────────────────────────────────
71
491
  get currentStepSchema() {
72
492
  // Se lo step non e cambiato, restituisci lo schema cachato
73
- if (this._cachedStepIndex === this.state.currentStep && this._cachedStepSchema) {
493
+ if (this._cachedStepIndex === this.state.currentStep &&
494
+ this._cachedStepSchema) {
74
495
  return this._cachedStepSchema;
75
496
  }
76
- const step = this.wizardSteps[this.state.currentStep];
77
- if (!step)
497
+ const group = this.wizardStepGroups[this.state.currentStep];
498
+ if (!group?.length)
78
499
  return null;
79
500
  this._cachedStepSchema = {
80
501
  id: this.schema.id + '-step-' + this.state.currentStep,
81
- sections: [step],
502
+ sections: group,
82
503
  config: { ...this.schema.config, hideFooter: true, showButtons: false },
83
504
  };
84
505
  this._cachedStepIndex = this.state.currentStep;
85
506
  return this._cachedStepSchema;
86
507
  }
87
508
  get currentStepTitle() {
88
- const step = this.wizardSteps[this.state.currentStep];
89
- return step?.wizardStep?.stepTitle || step?.title || '';
509
+ const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
510
+ return primary?.wizardStep?.stepTitle || primary?.title || '';
90
511
  }
91
512
  get currentStepDescription() {
92
- const step = this.wizardSteps[this.state.currentStep];
93
- return step?.wizardStep?.stepDescription || step?.description || '';
513
+ const primary = this.wizardStepGroups[this.state.currentStep]?.[0];
514
+ return primary?.wizardStep?.stepDescription || primary?.description || '';
94
515
  }
95
516
  get isLastStep() {
96
517
  return this.state.currentStep >= this.state.totalSteps - 1;
@@ -100,16 +521,44 @@ export class UiFormWizardComponent {
100
521
  return 100;
101
522
  return Math.round((this.state.currentStep / (this.state.totalSteps - 1)) * 100);
102
523
  }
524
+ /**
525
+ * Dati passati al form builder: unione tra valori forniti dal consumer e
526
+ * stato accumulato tra gli step. Senza questo, tornando indietro il builder
527
+ * riceverebbe solo `initialData` e ricreerebbe i campi vuoti, pur avendo
528
+ * i valori ancora in `accumulatedData`.
529
+ */
530
+ get mergedInitialDataForBuilder() {
531
+ return { ...this.initialData, ...this.accumulatedData };
532
+ }
533
+ /** Mostra la navigazione sopra il form builder. */
534
+ get showTopNav() {
535
+ if (this.wizardConfig.showNavigationButtons === false)
536
+ return false;
537
+ const pos = this.wizardConfig.navigationPosition;
538
+ return pos === 'top' || pos === 'both';
539
+ }
540
+ /** Mostra la navigazione sotto il form builder. */
541
+ get showBottomNav() {
542
+ if (this.wizardConfig.showNavigationButtons === false)
543
+ return false;
544
+ const pos = this.wizardConfig.navigationPosition;
545
+ return pos === 'bottom' || pos === 'both' || pos == null;
546
+ }
103
547
  // ─── Lifecycle ──────────────────────────────────────────────────
104
548
  ngOnInit() {
105
- if (!this.schema)
549
+ if (!this.schema) {
550
+ this.logger?.logWizardAction('init', { wizardId: this.wizardConfig?.wizardId, error: 'schema non presente' });
106
551
  return;
107
- // Estrai e ordina gli step
108
- this.wizardSteps = this.schema.sections
109
- .filter((s) => s.wizardStep)
110
- .sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
111
- this.state.totalSteps = this.wizardSteps.length;
552
+ }
553
+ this.wizardStepGroups = this.buildWizardStepGroups(this.schema.sections);
554
+ this.state.totalSteps = this.wizardStepGroups.length;
112
555
  this.accumulatedData = { ...this.initialData };
556
+ this.logger?.logWizardAction('init', {
557
+ wizardId: this.wizardConfig?.wizardId,
558
+ schemaId: this.schema.id,
559
+ totalSteps: this.state.totalSteps,
560
+ totalSections: this.wizardStepGroups.reduce((sum, g) => sum + g.length, 0),
561
+ });
113
562
  // Sincronizzazione wireless
114
563
  if (this.wizardConfig.wizardId) {
115
564
  this.syncWizardState();
@@ -125,12 +574,73 @@ export class UiFormWizardComponent {
125
574
  }
126
575
  }
127
576
  ngOnDestroy() {
577
+ this.logger?.logWizardAction('destroy', {
578
+ wizardId: this.wizardConfig?.wizardId,
579
+ schemaId: this.schema?.id,
580
+ currentStep: this.state.currentStep,
581
+ });
128
582
  this.destroy$.next();
129
583
  this.destroy$.complete();
130
584
  if (this.wizardConfig?.wizardId) {
131
585
  this.wizardSync.unregisterWizard(this.wizardConfig.wizardId);
132
586
  }
133
587
  }
588
+ /**
589
+ * Scorciatoia: Ctrl + Freccia sinistra/destra per navigare come i pulsanti
590
+ * Indietro / Avanti (sull'ultimo step, Avanti equivale a Completa).
591
+ * Ignorata se il focus è in un campo di input per non interferire con la digitazione.
592
+ */
593
+ onDocumentKeydown(event) {
594
+ if (!this.schema || !this.wizardConfig || this.disabled)
595
+ return;
596
+ if (this.wizardConfig.showNavigationButtons === false)
597
+ return;
598
+ if (!event.ctrlKey || event.altKey || event.metaKey || event.shiftKey)
599
+ return;
600
+ if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')
601
+ return;
602
+ if (this.isEditableKeyboardTarget(event.target))
603
+ return;
604
+ if (event.key === 'ArrowLeft') {
605
+ if (this.wizardConfig.allowBackNavigation === false)
606
+ return;
607
+ if (this.state.currentStep <= 0)
608
+ return;
609
+ event.preventDefault();
610
+ this.logger?.logWizardAction('keyboardNavigation', {
611
+ wizardId: this.wizardConfig.wizardId,
612
+ direction: 'previous',
613
+ fromStep: this.state.currentStep,
614
+ });
615
+ this.goToPreviousStep();
616
+ return;
617
+ }
618
+ // ArrowRight
619
+ event.preventDefault();
620
+ this.logger?.logWizardAction('keyboardNavigation', {
621
+ wizardId: this.wizardConfig.wizardId,
622
+ direction: this.isLastStep ? 'finish' : 'next',
623
+ fromStep: this.state.currentStep,
624
+ });
625
+ if (this.isLastStep) {
626
+ void this.finishWizard();
627
+ }
628
+ else {
629
+ void this.goToNextStep();
630
+ }
631
+ }
632
+ /** True se il target del keydown è un elemento dove la digitazione ha priorità sulla shortcut wizard. */
633
+ isEditableKeyboardTarget(target) {
634
+ if (!target || !(target instanceof HTMLElement))
635
+ return false;
636
+ const el = target;
637
+ if (el.isContentEditable)
638
+ return true;
639
+ const tag = el.tagName;
640
+ if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT')
641
+ return true;
642
+ return false;
643
+ }
134
644
  // ─── Navigazione ────────────────────────────────────────────────
135
645
  /** Vai allo step successivo con validazione. */
136
646
  async goToNextStep() {
@@ -150,24 +660,70 @@ export class UiFormWizardComponent {
150
660
  return;
151
661
  this.navigateToStep(this.state.currentStep - 1);
152
662
  }
663
+ /**
664
+ * Navigazione tramite indicatori step (bullet + titolo) quando `progressStyle` è `'steps'`.
665
+ * Consentito solo verso step già marcati completati.
666
+ */
667
+ onWizardStepIndicatorSelect(stepIndex) {
668
+ if (this.disabled)
669
+ return;
670
+ if (this.wizardConfig.allowStepIndicatorNavigation === false)
671
+ return;
672
+ if (this.wizardConfig.allowBackNavigation === false)
673
+ return;
674
+ if (stepIndex === this.state.currentStep)
675
+ return;
676
+ if (!this.state.completedSteps.has(stepIndex))
677
+ return;
678
+ this.logger?.logWizardAction('navigation', {
679
+ wizardId: this.wizardConfig.wizardId,
680
+ via: 'stepIndicator',
681
+ fromStep: this.state.currentStep,
682
+ toStep: stepIndex,
683
+ });
684
+ this.navigateToStep(stepIndex);
685
+ }
153
686
  /** Completa il wizard. */
154
687
  async finishWizard() {
155
- if (!(await this.validateCurrentStep()))
688
+ if (!(await this.validateCurrentStep())) {
689
+ this.logger?.logWizardAction('stepValidationFailed', {
690
+ wizardId: this.wizardConfig.wizardId,
691
+ step: this.state.currentStep,
692
+ context: 'finish',
693
+ });
156
694
  return;
695
+ }
157
696
  this.state.completedSteps.add(this.state.currentStep);
158
697
  await this.autoSaveIfNeeded();
698
+ this.logger?.logWizardAction('complete', {
699
+ wizardId: this.wizardConfig.wizardId,
700
+ schemaId: this.schema?.id,
701
+ totalSteps: this.state.totalSteps,
702
+ completedSteps: Array.from(this.state.completedSteps),
703
+ });
159
704
  this.wizardComplete.emit(this.accumulatedData);
160
705
  }
161
706
  /** Salva lo step corrente manualmente. */
162
707
  async saveCurrentStep() {
163
708
  if (this.wizardConfig.onStepSave) {
164
709
  const data = this.formBuilder?.getFormValue() || {};
710
+ this.logger?.logWizardAction('save', {
711
+ wizardId: this.wizardConfig.wizardId,
712
+ step: this.state.currentStep,
713
+ schemaId: this.schema?.id,
714
+ });
165
715
  await this.wizardConfig.onStepSave(data, this.state.currentStep);
166
716
  }
167
717
  }
168
718
  // ─── Callback form builder ─────────────────────────────────────
169
719
  onValueChange(data) {
170
720
  this.accumulatedData = { ...this.accumulatedData, ...data };
721
+ this.logger?.logWizardAction('valueChange', {
722
+ wizardId: this.wizardConfig.wizardId,
723
+ step: this.state.currentStep,
724
+ schemaId: this.schema?.id,
725
+ changedKeys: Object.keys(data),
726
+ });
171
727
  this.valueChange.emit(this.accumulatedData);
172
728
  }
173
729
  onValidationChange(state) {
@@ -184,6 +740,13 @@ export class UiFormWizardComponent {
184
740
  // Invalida la cache per forzare la creazione di un nuovo schema
185
741
  this._cachedStepSchema = null;
186
742
  this._cachedStepIndex = -1;
743
+ this.logger?.logWizardAction('stepChange', {
744
+ wizardId: this.wizardConfig.wizardId,
745
+ from,
746
+ to: targetStep,
747
+ direction: targetStep > from ? 'next' : 'previous',
748
+ schemaId: this.schema?.id,
749
+ });
187
750
  this.stepChange.emit({
188
751
  from,
189
752
  to: targetStep,
@@ -193,12 +756,16 @@ export class UiFormWizardComponent {
193
756
  this.cdr.markForCheck();
194
757
  }
195
758
  async validateCurrentStep() {
196
- // Validazione form standard
197
759
  this.formBuilder?.validateAllFields();
198
- const isFormValid = this.formBuilder?.isFormValid() ?? true;
199
- // Validazione custom per step
200
- const step = this.wizardSteps[this.state.currentStep];
201
- const customFnName = step?.wizardStep?.customValidationFn;
760
+ const group = this.wizardStepGroups[this.state.currentStep];
761
+ const primary = group?.[0];
762
+ const validateCustomComponents = primary?.wizardStep?.validation?.validateCustomComponents !== false;
763
+ const customFieldKeys = new Set(this.getCustomFieldKeysForGroup(group));
764
+ const isFormValid = validateCustomComponents
765
+ ? (this.formBuilder?.isFormValid() ?? true)
766
+ : (this.formBuilder?.isFormValidExcludingFieldKeys(customFieldKeys) ??
767
+ true);
768
+ const customFnName = primary?.wizardStep?.customValidationFn;
202
769
  if (customFnName && this.customValidationMethods[customFnName]) {
203
770
  const customValid = await this.customValidationMethods[customFnName](this.accumulatedData, this.state.currentStep, isFormValid);
204
771
  if (!customValid) {
@@ -209,21 +776,95 @@ export class UiFormWizardComponent {
209
776
  return false;
210
777
  }
211
778
  }
212
- // Se il form non e valido, blocca la navigazione
213
- if (!isFormValid && step?.wizardStep?.validation?.required !== false) {
214
- const errors = this.formBuilder?.getDetailedFormErrors().flatMap((e) => e.errors) || [];
779
+ if (!isFormValid && primary?.wizardStep?.validation?.required !== false) {
780
+ let details = this.formBuilder?.getDetailedFormErrors() || [];
781
+ if (!validateCustomComponents && group?.length) {
782
+ details = this.filterErrorDetailsExcludingCustomFields(details, group, customFieldKeys);
783
+ }
784
+ const errors = details.flatMap((e) => e.errors);
785
+ this.logger?.logWizardAction('stepValidationFailed', {
786
+ wizardId: this.wizardConfig.wizardId,
787
+ step: this.state.currentStep,
788
+ errors,
789
+ });
215
790
  this.stepValidationFailed.emit({
216
791
  step: this.state.currentStep,
217
792
  errors,
218
793
  });
219
794
  return false;
220
795
  }
796
+ this.logger?.logWizardAction('stepComplete', {
797
+ wizardId: this.wizardConfig.wizardId,
798
+ step: this.state.currentStep,
799
+ schemaId: this.schema?.id,
800
+ });
221
801
  this.stepComplete.emit({
222
802
  step: this.state.currentStep,
223
803
  data: this.formBuilder?.getFormValue() || {},
224
804
  });
225
805
  return true;
226
806
  }
807
+ /**
808
+ * Raggruppa le sezioni con `wizardStep` per `stepNumber` (ordine stabile per numero, poi ordine di apparizione nello schema).
809
+ */
810
+ buildWizardStepGroups(sections) {
811
+ const withWizard = sections.filter((s) => s.wizardStep);
812
+ withWizard.sort((a, b) => (a.wizardStep.stepNumber || 0) - (b.wizardStep.stepNumber || 0));
813
+ const groups = [];
814
+ for (const s of withWizard) {
815
+ const num = s.wizardStep.stepNumber;
816
+ const prev = groups[groups.length - 1];
817
+ if (prev?.length &&
818
+ (prev[0].wizardStep.stepNumber || 0) === (num || 0)) {
819
+ prev.push(s);
820
+ }
821
+ else {
822
+ groups.push([s]);
823
+ }
824
+ }
825
+ return groups;
826
+ }
827
+ /** Chiavi dei campi `custom` in tutte le sezioni del passo corrente. */
828
+ getCustomFieldKeysForGroup(group) {
829
+ if (!group?.length)
830
+ return [];
831
+ const keys = [];
832
+ for (const section of group) {
833
+ for (const f of section.fields || []) {
834
+ if (f.type === 'custom')
835
+ keys.push(f.key);
836
+ }
837
+ }
838
+ return keys;
839
+ }
840
+ /** Rimuove dagli errori i campi custom quando `validateCustomComponents` è false. */
841
+ filterErrorDetailsExcludingCustomFields(details, group, customKeys) {
842
+ const sectionIds = group.map((s) => s.id);
843
+ return details.filter((d) => {
844
+ const logicalKey = this.logicalFieldKeyFromDetailKeyForGroup(d.fieldKey, sectionIds);
845
+ return !customKeys.has(logicalKey);
846
+ });
847
+ }
848
+ /**
849
+ * Risolve la chiave logica del campo rispetto a tutte le sezioni del gruppo (campi flat o repeatable).
850
+ */
851
+ logicalFieldKeyFromDetailKeyForGroup(fieldKey, sectionIds) {
852
+ for (const id of sectionIds) {
853
+ const k = this.logicalFieldKeyFromDetailKey(fieldKey, id);
854
+ if (k !== fieldKey)
855
+ return k;
856
+ }
857
+ return fieldKey;
858
+ }
859
+ /** Estrae la chiave campo da `fieldKey` flat o `sectionId[i].fieldKey`. */
860
+ logicalFieldKeyFromDetailKey(fieldKey, sectionId) {
861
+ const re = new RegExp(`^${this.escapeRegExp(sectionId)}\\[\\d+\\]\\.(.+)$`);
862
+ const m = fieldKey.match(re);
863
+ return m ? m[1] : fieldKey;
864
+ }
865
+ escapeRegExp(s) {
866
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
867
+ }
227
868
  async autoSaveIfNeeded() {
228
869
  if (this.wizardConfig.autoSave && this.wizardConfig.onStepSave) {
229
870
  const data = this.formBuilder?.getFormValue() || {};
@@ -236,9 +877,9 @@ export class UiFormWizardComponent {
236
877
  const syncData = {
237
878
  wizardId: this.wizardConfig.wizardId,
238
879
  wizardState: { ...this.state },
239
- wizardSteps: this.wizardSteps.map((s) => ({
240
- title: s.wizardStep?.stepTitle || s.title,
241
- description: s.wizardStep?.stepDescription || s.description,
880
+ wizardSteps: this.wizardStepGroups.map((g) => ({
881
+ title: g[0]?.wizardStep?.stepTitle || g[0]?.title,
882
+ description: g[0]?.wizardStep?.stepDescription || g[0]?.description,
242
883
  })),
243
884
  isWizardMode: true,
244
885
  schema: this.schema,
@@ -246,235 +887,141 @@ export class UiFormWizardComponent {
246
887
  this.wizardSync.registerWizard(this.wizardConfig.wizardId, syncData);
247
888
  }
248
889
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
249
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
890
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiFormWizardComponent, isStandalone: true, selector: "ui-form-wizard", inputs: { schema: "schema", wizardConfig: "wizardConfig", customValidationMethods: "customValidationMethods", initialData: "initialData", readonly: "readonly", disabled: "disabled", loadingFor: "loadingFor", customFieldTemplates: "customFieldTemplates", customFieldTemplateFallback: "customFieldTemplateFallback" }, outputs: { stepChange: "stepChange", stepComplete: "stepComplete", stepValidationFailed: "stepValidationFailed", wizardComplete: "wizardComplete", valueChange: "valueChange", validationChange: "validationChange", customEvent: "customEvent" }, host: { listeners: { "document:keydown": "onDocumentKeydown($event)" } }, viewQueries: [{ propertyName: "formBuilder", first: true, predicate: UiFormBuilderComponent, descendants: true }], ngImport: i0, template: `
250
891
  @if (schema && wizardConfig) {
251
892
  <div class="ui-form-wizard">
252
-
253
893
  <!-- Header wizard (nascosto se wireless) -->
254
894
  @if (!wizardConfig.wirelessHeading) {
255
- <div class="ui-form-wizard__header">
256
-
257
- @if (wizardConfig.showProgress !== false) {
258
- <!-- Barra progresso lineare -->
259
- @if (wizardConfig.progressStyle !== 'steps') {
260
- <div class="ui-form-wizard__progress-bar">
261
- <div class="ui-form-wizard__progress-fill"
262
- [style.width.%]="progressPercent"></div>
263
- </div>
264
- <span class="ui-form-wizard__progress-text">
265
- {{ progressPercent }}% completato
266
- </span>
267
- } @else {
268
- <!-- Step indicators -->
269
- <div class="ui-form-wizard__steps">
270
- @for (step of wizardSteps; track $index; let i = $index) {
271
- <div class="ui-form-wizard__step"
272
- [class.ui-form-wizard__step--current]="i === state.currentStep"
273
- [class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
274
- [class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
275
- >
276
- <div class="ui-form-wizard__step-circle">
277
- @if (state.completedSteps.has(i)) {
278
- <lucide-icon name="check" [size]="16" />
279
- } @else {
280
- <span>{{ i + 1 }}</span>
281
- }
282
- </div>
283
- <div class="ui-form-wizard__step-label">
284
- {{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
285
- </div>
286
- </div>
287
- }
288
- </div>
289
- }
290
- }
895
+ <ui-wizard-header
896
+ [config]="wizardConfig"
897
+ [stepGroups]="wizardStepGroups"
898
+ [state]="state"
899
+ [progressPercent]="progressPercent"
900
+ [currentStepTitle]="currentStepTitle"
901
+ [currentStepDescription]="currentStepDescription"
902
+ [disableStepIndicators]="disabled"
903
+ (stepSelect)="onWizardStepIndicatorSelect($event)"
904
+ />
905
+ }
291
906
 
292
- <!-- Info step corrente -->
293
- <div class="ui-form-wizard__step-info">
294
- <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
295
- @if (currentStepDescription) {
296
- <p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
297
- }
298
- <span class="ui-form-wizard__step-counter">
299
- Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
300
- </span>
301
- </div>
302
- </div>
907
+ <!-- Navigazione sopra il form -->
908
+ @if (showTopNav) {
909
+ <ui-wizard-footer
910
+ class="ui-form-wizard__footer ui-form-wizard__footer--top"
911
+ [config]="wizardConfig"
912
+ [state]="state"
913
+ [isLastStep]="isLastStep"
914
+ (previous)="goToPreviousStep()"
915
+ (next)="goToNextStep()"
916
+ (finish)="finishWizard()"
917
+ (save)="saveCurrentStep()"
918
+ />
303
919
  }
304
920
 
305
- <!-- Form builder per lo step corrente -->
306
- <ui-form-builder
307
- [schema]="currentStepSchema!"
308
- [initialData]="initialData"
309
- [readonly]="readonly"
310
- [disabled]="disabled"
311
- [loadingFor]="loadingFor"
312
- (valueChange)="onValueChange($event)"
313
- (validationChange)="onValidationChange($event)"
314
- (customEvent)="customEvent.emit($event)"
315
- />
921
+ <div class="ui-form-wizard__content">
922
+ <!-- Form builder per lo step corrente -->
923
+ <ui-form-builder
924
+ [schema]="currentStepSchema!"
925
+ [initialData]="mergedInitialDataForBuilder"
926
+ [readonly]="readonly"
927
+ [disabled]="disabled"
928
+ [loadingFor]="loadingFor"
929
+ [customFieldTemplates]="customFieldTemplates"
930
+ [customFieldTemplateFallback]="customFieldTemplateFallback"
931
+ (valueChange)="onValueChange($event)"
932
+ (validationChange)="onValidationChange($event)"
933
+ (customEvent)="customEvent.emit($event)"
934
+ />
935
+ </div>
316
936
 
317
- <!-- Footer navigazione -->
318
- @if (wizardConfig.showNavigationButtons !== false) {
319
- <div class="ui-form-wizard__footer">
320
- @if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
321
- <ui-button
322
- label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
323
- variant="outline"
324
- icon="chevron-left"
325
- (click)="goToPreviousStep()"
326
- />
327
- } @else {
328
- <div></div>
329
- }
330
-
331
- <div class="ui-form-wizard__footer-right">
332
- @if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
333
- <ui-button
334
- [label]="wizardConfig.buttonLabels!.save!"
335
- variant="outline"
336
- (click)="saveCurrentStep()"
337
- />
338
- }
339
- @if (isLastStep) {
340
- <ui-button
341
- label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
342
- variant="primary"
343
- icon="check"
344
- iconPosition="trailing"
345
- (click)="finishWizard()"
346
- />
347
- } @else {
348
- <ui-button
349
- label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
350
- variant="primary"
351
- icon="chevron-right"
352
- iconPosition="trailing"
353
- (click)="goToNextStep()"
354
- />
355
- }
356
- </div>
357
- </div>
937
+ <!-- Navigazione sotto il form -->
938
+ @if (showBottomNav) {
939
+ <ui-wizard-footer
940
+ class="ui-form-wizard__footer"
941
+ [config]="wizardConfig"
942
+ [state]="state"
943
+ [isLastStep]="isLastStep"
944
+ (previous)="goToPreviousStep()"
945
+ (next)="goToNextStep()"
946
+ (finish)="finishWizard()"
947
+ (save)="saveCurrentStep()"
948
+ />
358
949
  }
359
950
  </div>
360
951
  }
361
- `, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["label", "tooltip", "variant", "size", "icon", "iconPosition", "loading", "disabled", "fullWidth", "type", "ariaLabel", "customClass"] }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }], encapsulation: i0.ViewEncapsulation.None }); }
952
+ `, isInline: true, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"], dependencies: [{ kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: UiFormBuilderComponent, selector: "ui-form-builder", inputs: ["schema", "initialData", "readonly", "disabled", "buttonsOverride", "loadingFor", "customFieldTemplates", "customFieldTemplateFallback"], outputs: ["valueChange", "validationChange", "formSubmit", "formReset", "customEvent"] }, { kind: "component", type: UiWizardHeaderComponent, selector: "ui-wizard-header", inputs: ["config", "stepGroups", "state", "progressPercent", "currentStepTitle", "currentStepDescription", "disableStepIndicators"], outputs: ["stepSelect"] }, { kind: "component", type: UiWizardFooterComponent, selector: "ui-wizard-footer", inputs: ["config", "state", "isLastStep"], outputs: ["previous", "next", "finish", "save"] }], encapsulation: i0.ViewEncapsulation.None }); }
362
953
  }
363
954
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiFormWizardComponent, decorators: [{
364
955
  type: Component,
365
- args: [{ selector: 'ui-form-wizard', standalone: true, imports: [LucideAngularModule, UiButtonComponent, UiFormBuilderComponent], encapsulation: ViewEncapsulation.None, template: `
956
+ args: [{ selector: 'ui-form-wizard', standalone: true, imports: [
957
+ LucideAngularModule,
958
+ UiButtonComponent,
959
+ UiFormBuilderComponent,
960
+ UiWizardHeaderComponent,
961
+ UiWizardFooterComponent,
962
+ ], encapsulation: ViewEncapsulation.None, template: `
366
963
  @if (schema && wizardConfig) {
367
964
  <div class="ui-form-wizard">
368
-
369
965
  <!-- Header wizard (nascosto se wireless) -->
370
966
  @if (!wizardConfig.wirelessHeading) {
371
- <div class="ui-form-wizard__header">
372
-
373
- @if (wizardConfig.showProgress !== false) {
374
- <!-- Barra progresso lineare -->
375
- @if (wizardConfig.progressStyle !== 'steps') {
376
- <div class="ui-form-wizard__progress-bar">
377
- <div class="ui-form-wizard__progress-fill"
378
- [style.width.%]="progressPercent"></div>
379
- </div>
380
- <span class="ui-form-wizard__progress-text">
381
- {{ progressPercent }}% completato
382
- </span>
383
- } @else {
384
- <!-- Step indicators -->
385
- <div class="ui-form-wizard__steps">
386
- @for (step of wizardSteps; track $index; let i = $index) {
387
- <div class="ui-form-wizard__step"
388
- [class.ui-form-wizard__step--current]="i === state.currentStep"
389
- [class.ui-form-wizard__step--completed]="state.completedSteps.has(i)"
390
- [class.ui-form-wizard__step--visited]="state.visitedSteps.has(i)"
391
- >
392
- <div class="ui-form-wizard__step-circle">
393
- @if (state.completedSteps.has(i)) {
394
- <lucide-icon name="check" [size]="16" />
395
- } @else {
396
- <span>{{ i + 1 }}</span>
397
- }
398
- </div>
399
- <div class="ui-form-wizard__step-label">
400
- {{ step.wizardStep?.stepTitle || step.title || 'Step ' + (i + 1) }}
401
- </div>
402
- </div>
403
- }
404
- </div>
405
- }
406
- }
967
+ <ui-wizard-header
968
+ [config]="wizardConfig"
969
+ [stepGroups]="wizardStepGroups"
970
+ [state]="state"
971
+ [progressPercent]="progressPercent"
972
+ [currentStepTitle]="currentStepTitle"
973
+ [currentStepDescription]="currentStepDescription"
974
+ [disableStepIndicators]="disabled"
975
+ (stepSelect)="onWizardStepIndicatorSelect($event)"
976
+ />
977
+ }
407
978
 
408
- <!-- Info step corrente -->
409
- <div class="ui-form-wizard__step-info">
410
- <h2 class="ui-form-wizard__step-title">{{ currentStepTitle }}</h2>
411
- @if (currentStepDescription) {
412
- <p class="ui-form-wizard__step-description">{{ currentStepDescription }}</p>
413
- }
414
- <span class="ui-form-wizard__step-counter">
415
- Passo {{ state.currentStep + 1 }} di {{ state.totalSteps }}
416
- </span>
417
- </div>
418
- </div>
979
+ <!-- Navigazione sopra il form -->
980
+ @if (showTopNav) {
981
+ <ui-wizard-footer
982
+ class="ui-form-wizard__footer ui-form-wizard__footer--top"
983
+ [config]="wizardConfig"
984
+ [state]="state"
985
+ [isLastStep]="isLastStep"
986
+ (previous)="goToPreviousStep()"
987
+ (next)="goToNextStep()"
988
+ (finish)="finishWizard()"
989
+ (save)="saveCurrentStep()"
990
+ />
419
991
  }
420
992
 
421
- <!-- Form builder per lo step corrente -->
422
- <ui-form-builder
423
- [schema]="currentStepSchema!"
424
- [initialData]="initialData"
425
- [readonly]="readonly"
426
- [disabled]="disabled"
427
- [loadingFor]="loadingFor"
428
- (valueChange)="onValueChange($event)"
429
- (validationChange)="onValidationChange($event)"
430
- (customEvent)="customEvent.emit($event)"
431
- />
993
+ <div class="ui-form-wizard__content">
994
+ <!-- Form builder per lo step corrente -->
995
+ <ui-form-builder
996
+ [schema]="currentStepSchema!"
997
+ [initialData]="mergedInitialDataForBuilder"
998
+ [readonly]="readonly"
999
+ [disabled]="disabled"
1000
+ [loadingFor]="loadingFor"
1001
+ [customFieldTemplates]="customFieldTemplates"
1002
+ [customFieldTemplateFallback]="customFieldTemplateFallback"
1003
+ (valueChange)="onValueChange($event)"
1004
+ (validationChange)="onValidationChange($event)"
1005
+ (customEvent)="customEvent.emit($event)"
1006
+ />
1007
+ </div>
432
1008
 
433
- <!-- Footer navigazione -->
434
- @if (wizardConfig.showNavigationButtons !== false) {
435
- <div class="ui-form-wizard__footer">
436
- @if (wizardConfig.allowBackNavigation !== false && state.currentStep > 0) {
437
- <ui-button
438
- label="{{ wizardConfig.buttonLabels?.previous || 'Indietro' }}"
439
- variant="outline"
440
- icon="chevron-left"
441
- (click)="goToPreviousStep()"
442
- />
443
- } @else {
444
- <div></div>
445
- }
446
-
447
- <div class="ui-form-wizard__footer-right">
448
- @if (wizardConfig.autoSave && wizardConfig.buttonLabels?.save) {
449
- <ui-button
450
- [label]="wizardConfig.buttonLabels!.save!"
451
- variant="outline"
452
- (click)="saveCurrentStep()"
453
- />
454
- }
455
- @if (isLastStep) {
456
- <ui-button
457
- label="{{ wizardConfig.buttonLabels?.finish || 'Completa' }}"
458
- variant="primary"
459
- icon="check"
460
- iconPosition="trailing"
461
- (click)="finishWizard()"
462
- />
463
- } @else {
464
- <ui-button
465
- label="{{ wizardConfig.buttonLabels?.next || 'Avanti' }}"
466
- variant="primary"
467
- icon="chevron-right"
468
- iconPosition="trailing"
469
- (click)="goToNextStep()"
470
- />
471
- }
472
- </div>
473
- </div>
1009
+ <!-- Navigazione sotto il form -->
1010
+ @if (showBottomNav) {
1011
+ <ui-wizard-footer
1012
+ class="ui-form-wizard__footer"
1013
+ [config]="wizardConfig"
1014
+ [state]="state"
1015
+ [isLastStep]="isLastStep"
1016
+ (previous)="goToPreviousStep()"
1017
+ (next)="goToNextStep()"
1018
+ (finish)="finishWizard()"
1019
+ (save)="saveCurrentStep()"
1020
+ />
474
1021
  }
475
1022
  </div>
476
1023
  }
477
- `, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;padding-top:var(--ui-spacing-4);border-top:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}\n"] }]
1024
+ `, styles: [".ui-form-wizard{display:flex;flex-direction:column;gap:var(--ui-spacing-6);font-family:var(--ui-font-family)}.ui-form-wizard__header{display:flex;flex-direction:column;gap:var(--ui-spacing-4);padding-bottom:var(--ui-spacing-4);border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__progress-bar{height:6px;background:var(--ui-color-bg-subtle);border-radius:var(--ui-radius-full);overflow:hidden}.ui-form-wizard__progress-fill{height:100%;background:var(--ui-color-primary);border-radius:var(--ui-radius-full);transition:width var(--ui-transition-normal)}.ui-form-wizard__progress-text{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);margin-top:var(--ui-spacing-1)}.ui-form-wizard__steps{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ui-spacing-2);position:relative}.ui-form-wizard__steps:before{content:\"\";position:absolute;top:16px;left:24px;right:24px;height:2px;background:var(--ui-color-border);z-index:0}.ui-form-wizard__step{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);z-index:1;flex:1}.ui-form-wizard__step-trigger,.ui-form-wizard__step-static{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1);width:100%;margin:0;padding:0;border:none;background:transparent;font:inherit;color:inherit;text-align:center}.ui-form-wizard__step-trigger{cursor:pointer;border-radius:var(--ui-radius-md);transition:background-color var(--ui-transition-fast)}.ui-form-wizard__step-trigger:hover{background-color:var(--ui-color-bg-subtle)}.ui-form-wizard__step-trigger:focus-visible{outline:2px solid var(--ui-color-primary);outline-offset:2px}.ui-form-wizard__step-static{cursor:default}.ui-form-wizard__step--navigable:not(.ui-form-wizard__step--current) .ui-form-wizard__step-trigger:hover .ui-form-wizard__step-label{color:var(--ui-color-primary)}.ui-form-wizard__step-circle{width:32px;height:32px;border-radius:var(--ui-radius-full);display:flex;align-items:center;justify-content:center;border:2px solid var(--ui-color-border);background:var(--ui-color-surface);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text-muted);transition:background-color var(--ui-transition-fast),border-color var(--ui-transition-fast),color var(--ui-transition-fast)}.ui-form-wizard__step--current .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);background:var(--ui-color-primary);color:#fff}.ui-form-wizard__step--completed .ui-form-wizard__step-circle{border-color:var(--ui-color-success, #16a34a);background:var(--ui-color-success, #16a34a);color:#fff}.ui-form-wizard__step--visited:not(.ui-form-wizard__step--current):not(.ui-form-wizard__step--completed) .ui-form-wizard__step-circle{border-color:var(--ui-color-primary);color:var(--ui-color-primary)}.ui-form-wizard__step-label{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);text-align:center;max-width:100px;line-height:1.3}.ui-form-wizard__step--current .ui-form-wizard__step-label{color:var(--ui-color-primary);font-weight:var(--ui-font-weight-semibold)}.ui-form-wizard__step-info{text-align:center}.ui-form-wizard__step-title{font-size:var(--ui-font-size-lg);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-description{font-size:var(--ui-font-size-sm);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-1)}.ui-form-wizard__step-counter{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted)}.ui-form-wizard__footer{display:flex;justify-content:space-between;align-items:center;width:100%}.ui-form-wizard__footer--top{padding-top:0;padding-bottom:var(--ui-spacing-4);border-top:none;border-bottom:1px solid var(--ui-color-border)}.ui-form-wizard__footer-right{display:flex;gap:var(--ui-spacing-3)}.ui-form-wizard__nav-action{display:flex;flex-direction:column;align-items:center;gap:var(--ui-spacing-1)}.ui-form-wizard__nav-hint{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-muted);line-height:1}\n"] }]
478
1025
  }], propDecorators: { formBuilder: [{
479
1026
  type: ViewChild,
480
1027
  args: [UiFormBuilderComponent]
@@ -492,6 +1039,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
492
1039
  type: Input
493
1040
  }], loadingFor: [{
494
1041
  type: Input
1042
+ }], customFieldTemplates: [{
1043
+ type: Input
1044
+ }], customFieldTemplateFallback: [{
1045
+ type: Input
495
1046
  }], stepChange: [{
496
1047
  type: Output
497
1048
  }], stepComplete: [{
@@ -506,5 +1057,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
506
1057
  type: Output
507
1058
  }], customEvent: [{
508
1059
  type: Output
1060
+ }], onDocumentKeydown: [{
1061
+ type: HostListener,
1062
+ args: ['document:keydown', ['$event']]
509
1063
  }] } });
510
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsTUFBTSxnQ0FBZ0MsQ0FBQzs7O0FBRXZGOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBeUhILE1BQU0sT0FBTyxxQkFBcUI7SUF4SGxDO1FBeUhtQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBWWhELDZDQUE2QztRQUNwQyw0QkFBdUIsR0FBeUMsRUFBRSxDQUFDO1FBRTVFLHFCQUFxQjtRQUNaLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBRXRDLDZCQUE2QjtRQUNwQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLDBCQUEwQjtRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLCtCQUErQjtR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QixxQkFBcUIsNGpCQUtyQixzQkFBc0IsZ0RBeEh2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdIVCxzL0ZBbEhTLG1CQUFtQixnUEFBRSxpQkFBaUIsdU1BQUUsc0JBQXNCOzs0RkFxSDdELHFCQUFxQjtrQkF4SGpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUNQLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsaUJBQzFELGlCQUFpQixDQUFDLElBQUksWUFDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnSFQ7OEJBUWtDLFdBQVc7c0JBQTdDLFNBQVM7dUJBQUMsc0JBQXNCO2dCQUt4QixNQUFNO3NCQUFkLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFHRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBWaWV3Q2hpbGQsXHJcbiAgaW5qZWN0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7IFVpRm9ybVZhbGlkYXRpb25TdGF0ZSB9IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7IFVpV2l6YXJkU3luY1NlcnZpY2UsIFVpV2l6YXJkU3luY0RhdGEgfSBmcm9tICcuL3NlcnZpY2VzL3dpemFyZC1zeW5jLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudGUgd2l6YXJkIGNoZSB3cmFwcGEgYFVpRm9ybUJ1aWxkZXJDb21wb25lbnRgXHJcbiAqIGFnZ2l1bmdlbmRvIG5hdmlnYXppb25lIG11bHRpLXN0ZXAsIGJhcnJhIGRpIHByb2dyZXNzbyxcclxuICogdmFsaWRhemlvbmUgcGVyIHN0ZXAgZSBzaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzLlxyXG4gKlxyXG4gKiBAc2VsZWN0b3IgdWktZm9ybS13aXphcmRcclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8dWktZm9ybS13aXphcmRcclxuICogICBbc2NoZW1hXT1cIndpemFyZFNjaGVtYVwiXHJcbiAqICAgW3dpemFyZENvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gKiAgICh3aXphcmRDb21wbGV0ZSk9XCJvbkNvbXBsZXRlKCRldmVudClcIlxyXG4gKiAgIChzdGVwQ2hhbmdlKT1cIm9uU3RlcENoYW5nZSgkZXZlbnQpXCJcclxuICogLz5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZvcm0td2l6YXJkJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtMdWNpZGVBbmd1bGFyTW9kdWxlLCBVaUJ1dHRvbkNvbXBvbmVudCwgVWlGb3JtQnVpbGRlckNvbXBvbmVudF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgQGlmIChzY2hlbWEgJiYgd2l6YXJkQ29uZmlnKSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZFwiPlxyXG5cclxuICAgICAgICA8IS0tIEhlYWRlciB3aXphcmQgKG5hc2Nvc3RvIHNlIHdpcmVsZXNzKSAtLT5cclxuICAgICAgICBAaWYgKCF3aXphcmRDb25maWcud2lyZWxlc3NIZWFkaW5nKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2hlYWRlclwiPlxyXG5cclxuICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIDwhLS0gQmFycmEgcHJvZ3Jlc3NvIGxpbmVhcmUgLS0+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcucHJvZ3Jlc3NTdHlsZSAhPT0gJ3N0ZXBzJykge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1iYXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBwcm9ncmVzc1BlcmNlbnQgfX0lIGNvbXBsZXRhdG9cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDwhLS0gU3RlcCBpbmRpY2F0b3JzIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwc1wiPlxyXG4gICAgICAgICAgICAgICAgICBAZm9yIChzdGVwIG9mIHdpemFyZFN0ZXBzOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY3VycmVudF09XCJpID09PSBzdGF0ZS5jdXJyZW50U3RlcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLWNvbXBsZXRlZF09XCJzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS12aXNpdGVkXT1cInN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpICsgMSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RlcC53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcC50aXRsZSB8fCAnU3RlcCAnICsgKGkgKyAxKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPCEtLSBJbmZvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtdGl0bGVcIj57eyBjdXJyZW50U3RlcFRpdGxlIH19PC9oMj5cclxuICAgICAgICAgICAgICBAaWYgKGN1cnJlbnRTdGVwRGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtZGVzY3JpcHRpb25cIj57eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWNvdW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIFBhc3NvIHt7IHN0YXRlLmN1cnJlbnRTdGVwICsgMSB9fSBkaSB7eyBzdGF0ZS50b3RhbFN0ZXBzIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBGb3JtIGJ1aWxkZXIgcGVyIGxvIHN0ZXAgY29ycmVudGUgLS0+XHJcbiAgICAgICAgPHVpLWZvcm0tYnVpbGRlclxyXG4gICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgW2luaXRpYWxEYXRhXT1cImluaXRpYWxEYXRhXCJcclxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChjdXN0b21FdmVudCk9XCJjdXN0b21FdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcblxyXG4gICAgICAgIDwhLS0gRm9vdGVyIG5hdmlnYXppb25lIC0tPlxyXG4gICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIEBpZiAod2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gIT09IGZhbHNlICYmIHN0YXRlLmN1cnJlbnRTdGVwID4gMCkge1xyXG4gICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgIGxhYmVsPVwie3sgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8ucHJldmlvdXMgfHwgJ0luZGlldHJvJyB9fVwiXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgQGlmICh3aXphcmRDb25maWcuYXV0b1NhdmUgJiYgd2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscz8uc2F2ZSkge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2l6YXJkQ29uZmlnLmJ1dHRvbkxhYmVscyEuc2F2ZSFcIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eyB3aXphcmRDb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggfHwgJ0NvbXBsZXRhJyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgaWNvbj1cImNoZWNrXCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2hXaXphcmQoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICBsYWJlbD1cInt7IHdpemFyZENvbmZpZy5idXR0b25MYWJlbHM/Lm5leHQgfHwgJ0F2YW50aScgfX1cIlxyXG4gICAgICAgICAgICAgICAgICB2YXJpYW50PVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjaGV2cm9uLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInRyYWlsaW5nXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFVpRm9ybUJ1aWxkZXJDb21wb25lbnQpIGZvcm1CdWlsZGVyPzogVWlGb3JtQnVpbGRlckNvbXBvbmVudDtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIElucHV0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogU2NoZW1hIGNvbXBsZXRvIGRlbCBmb3JtICh0dXR0ZSBsZSBzZXppb25pIGNvbiB3aXphcmRTdGVwKS4gKi9cclxuICBASW5wdXQoKSBzY2hlbWEhOiBVaUZvcm1TY2hlbWE7XHJcblxyXG4gIC8qKiBDb25maWd1cmF6aW9uZSBkZWwgd2l6YXJkLiAqL1xyXG4gIEBJbnB1dCgpIHdpemFyZENvbmZpZyE6IFVpV2l6YXJkQ29uZmlnO1xyXG5cclxuICAvKiogTWV0b2RpIGRpIHZhbGlkYXppb25lIGN1c3RvbSBwZXIgc3RlcC4gKi9cclxuICBASW5wdXQoKSBjdXN0b21WYWxpZGF0aW9uTWV0aG9kczogUmVjb3JkPHN0cmluZywgVWlXaXphcmRWYWxpZGF0aW9uRm4+ID0ge307XHJcblxyXG4gIC8qKiBEYXRpIGluaXppYWxpLiAqL1xyXG4gIEBJbnB1dCgpIGluaXRpYWxEYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKiBNb2RhbGl0YSBzb2xhIGxldHR1cmEuICovXHJcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFN0YXRvIGRpc2FiaWxpdGF0by4gKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKiogUHVsc2FudGUgaW4gY2FyaWNhbWVudG8uICovXHJcbiAgQElucHV0KCkgbG9hZGluZ0Zvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGVwOiBudW1iZXI7IGVycm9yczogc3RyaW5nW10gfT4oKTtcclxuICBAT3V0cHV0KCkgd2l6YXJkQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1EYXRhPigpO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1WYWxpZGF0aW9uU3RhdGU+KCk7XHJcbiAgQE91dHB1dCgpIGN1c3RvbUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxVaUZvcm1DdXN0b21FdmVudD4oKTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIFN0YXRvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBzdGF0ZTogVWlXaXphcmRTdGF0ZSA9IHtcclxuICAgIGN1cnJlbnRTdGVwOiAwLFxyXG4gICAgdG90YWxTdGVwczogMCxcclxuICAgIGNvbXBsZXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oKSxcclxuICAgIHZpc2l0ZWRTdGVwczogbmV3IFNldDxudW1iZXI+KFswXSksXHJcbiAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgIHN0ZXBFcnJvcnM6IHt9LFxyXG4gIH07XHJcblxyXG4gIC8qKiBTdGVwIG9yZGluYXRpIHBlciBzdGVwTnVtYmVyLiAqL1xyXG4gIHdpemFyZFN0ZXBzOiBVaUZvcm1TZWN0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqIERhdGkgYWNjdW11bGF0aSBkZWwgZm9ybS4gKi9cclxuICBwcml2YXRlIGFjY3VtdWxhdGVkRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBTY2hlbWEgY2FjaGF0byBwZXIgbG8gc3RlcCBjb3JyZW50ZS5cclxuICAgKiBFdml0YSBkaSBjcmVhcmUgdW4gbnVvdm8gb2dnZXR0byBhZCBvZ25pIGNpY2xvIGRpIGNoYW5nZSBkZXRlY3Rpb24sXHJcbiAgICogY29zYSBjaGUgY2F1c2VyZWJiZSByZWJ1aWxkIGluZmluaXRpIG5lbCBmb3JtIGJ1aWxkZXIuXHJcbiAgICovXHJcbiAgX2NhY2hlZFN0ZXBTY2hlbWE6IFVpRm9ybVNjaGVtYSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgX2NhY2hlZFN0ZXBJbmRleDogbnVtYmVyID0gLTE7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBHZXR0ZXIgY2FsY29sYXRpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBTY2hlbWEoKTogVWlGb3JtU2NoZW1hIHwgbnVsbCB7XHJcbiAgICAvLyBTZSBsbyBzdGVwIG5vbiBlIGNhbWJpYXRvLCByZXN0aXR1aXNjaSBsbyBzY2hlbWEgY2FjaGF0b1xyXG4gICAgaWYgKHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLndpemFyZFN0ZXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdO1xyXG4gICAgaWYgKCFzdGVwKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0ge1xyXG4gICAgICBpZDogdGhpcy5zY2hlbWEuaWQgKyAnLXN0ZXAtJyArIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNlY3Rpb25zOiBbc3RlcF0sXHJcbiAgICAgIGNvbmZpZzogeyAuLi50aGlzLnNjaGVtYS5jb25maWcsIGhpZGVGb290ZXI6IHRydWUsIHNob3dCdXR0b25zOiBmYWxzZSB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkU3RlcFNjaGVtYTtcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFRpdGxlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIHJldHVybiBzdGVwPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgc3RlcD8udGl0bGUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBEZXNjcmlwdGlvbigpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMud2l6YXJkU3RlcHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICByZXR1cm4gc3RlcD8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHN0ZXA/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgLyAodGhpcy5zdGF0ZS50b3RhbFN0ZXBzIC0gMSkpICogMTAwKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIEVzdHJhaSBlIG9yZGluYSBnbGkgc3RlcFxyXG4gICAgdGhpcy53aXphcmRTdGVwcyA9IHRoaXMuc2NoZW1hLnNlY3Rpb25zXHJcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMud2l6YXJkU3RlcClcclxuICAgICAgLnNvcnQoKGEsIGIpID0+IChhLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgLSAoYi53aXphcmRTdGVwIS5zdGVwTnVtYmVyIHx8IDApKTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBzLmxlbmd0aDtcclxuICAgIHRoaXMuYWNjdW11bGF0ZWREYXRhID0geyAuLi50aGlzLmluaXRpYWxEYXRhIH07XHJcblxyXG4gICAgLy8gU2luY3Jvbml6emF6aW9uZSB3aXJlbGVzc1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSB7XHJcbiAgICAgIHRoaXMuc3luY1dpemFyZFN0YXRlKCk7XHJcblxyXG4gICAgICAvLyBBc2NvbHRhIG5hdmlnYXppb25lIGVzdGVybmFcclxuICAgICAgdGhpcy53aXphcmRTeW5jXHJcbiAgICAgICAgLmdldFdpemFyZFN0YXRlJCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZClcclxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKGRhdGEud2l6YXJkU3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKiogVmFpIGFsbG8gc3RlcCBzdWNjZXNzaXZvIGNvbiB2YWxpZGF6aW9uZS4gKi9cclxuICBhc3luYyBnb1RvTmV4dFN0ZXAoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5pc0xhc3RTdGVwKSByZXR1cm47XHJcblxyXG4gICAgLy8gVmFsaWRhIHN0ZXAgY29ycmVudGVcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFNhbHZhIGRhdGkgc3RlcCBjb3JyZW50ZVxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlVG9TdGVwKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgKyAxKTtcclxuICB9XHJcblxyXG4gIC8qKiBUb3JuYSBhbGxvIHN0ZXAgcHJlY2VkZW50ZS4gKi9cclxuICBnb1RvUHJldmlvdXNTdGVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPD0gMCkgcmV0dXJuO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC0gMSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29tcGxldGEgaWwgd2l6YXJkLiAqL1xyXG4gIGFzeW5jIGZpbmlzaFdpemFyZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghKGF3YWl0IHRoaXMudmFsaWRhdGVDdXJyZW50U3RlcCgpKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy53aXphcmRDb21wbGV0ZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYWx2YSBsbyBzdGVwIGNvcnJlbnRlIG1hbnVhbG1lbnRlLiAqL1xyXG4gIGFzeW5jIHNhdmVDdXJyZW50U3RlcCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fTtcclxuICAgICAgYXdhaXQgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZShkYXRhLCB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBDYWxsYmFjayBmb3JtIGJ1aWxkZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoZGF0YTogVWlGb3JtRGF0YSk6IHZvaWQge1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhLCAuLi5kYXRhIH07XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgb25WYWxpZGF0aW9uQ2hhbmdlKHN0YXRlOiBVaUZvcm1WYWxpZGF0aW9uU3RhdGUpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUuaXNWYWxpZCA9IHN0YXRlLnZhbGlkO1xyXG4gICAgdGhpcy52YWxpZGF0aW9uQ2hhbmdlLmVtaXQoc3RhdGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIE5hdmlnYXppb25lIGludGVybmEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHByaXZhdGUgbmF2aWdhdGVUb1N0ZXAodGFyZ2V0U3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGFyZ2V0U3RlcCA8IDAgfHwgdGFyZ2V0U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBmcm9tID0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcDtcclxuICAgIHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPSB0YXJnZXRTdGVwO1xyXG4gICAgdGhpcy5zdGF0ZS52aXNpdGVkU3RlcHMuYWRkKHRhcmdldFN0ZXApO1xyXG5cclxuICAgIC8vIEludmFsaWRhIGxhIGNhY2hlIHBlciBmb3J6YXJlIGxhIGNyZWF6aW9uZSBkaSB1biBudW92byBzY2hlbWFcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSBudWxsO1xyXG4gICAgdGhpcy5fY2FjaGVkU3RlcEluZGV4ID0gLTE7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAvLyBWYWxpZGF6aW9uZSBmb3JtIHN0YW5kYXJkXHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgaXNGb3JtVmFsaWQgPSB0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWU7XHJcblxyXG4gICAgLy8gVmFsaWRhemlvbmUgY3VzdG9tIHBlciBzdGVwXHJcbiAgICBjb25zdCBzdGVwID0gdGhpcy53aXphcmRTdGVwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXTtcclxuICAgIGNvbnN0IGN1c3RvbUZuTmFtZSA9IHN0ZXA/LndpemFyZFN0ZXA/LmN1c3RvbVZhbGlkYXRpb25GbjtcclxuXHJcbiAgICBpZiAoY3VzdG9tRm5OYW1lICYmIHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZCA9IGF3YWl0IHRoaXMuY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHNbY3VzdG9tRm5OYW1lXShcclxuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSxcclxuICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGlzRm9ybVZhbGlkLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFjdXN0b21WYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3RlcFZhbGlkYXRpb25GYWlsZWQuZW1pdCh7XHJcbiAgICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgICAgZXJyb3JzOiBbJ1ZhbGlkYXppb25lIGN1c3RvbSBmYWxsaXRhJ10sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2UgaWwgZm9ybSBub24gZSB2YWxpZG8sIGJsb2NjYSBsYSBuYXZpZ2F6aW9uZVxyXG4gICAgaWYgKCFpc0Zvcm1WYWxpZCAmJiBzdGVwPy53aXphcmRTdGVwPy52YWxpZGF0aW9uPy5yZXF1aXJlZCAhPT0gZmFsc2UpIHtcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkuZmxhdE1hcCgoZSkgPT4gZS5lcnJvcnMpIHx8IFtdO1xyXG4gICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RlcENvbXBsZXRlLmVtaXQoe1xyXG4gICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICBkYXRhOiB0aGlzLmZvcm1CdWlsZGVyPy5nZXRGb3JtVmFsdWUoKSB8fCB7fSxcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBhdXRvU2F2ZUlmTmVlZGVkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmF1dG9TYXZlICYmIHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzeW5jV2l6YXJkU3RhdGUoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc3luY0RhdGE6IFVpV2l6YXJkU3luY0RhdGEgPSB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgd2l6YXJkU3RhdGU6IHsgLi4udGhpcy5zdGF0ZSB9LFxyXG4gICAgICB3aXphcmRTdGVwczogdGhpcy53aXphcmRTdGVwcy5tYXAoKHMpID0+ICh7XHJcbiAgICAgICAgdGl0bGU6IHMud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8IHMudGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IHMud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHMuZGVzY3JpcHRpb24sXHJcbiAgICAgIH0pKSxcclxuICAgICAgaXNXaXphcmRNb2RlOiB0cnVlLFxyXG4gICAgICBzY2hlbWE6IHRoaXMuc2NoZW1hLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLndpemFyZFN5bmMucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsIHN5bmNEYXRhKTtcclxuICB9XHJcbn1cclxuIl19
1064
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS13aXphcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLWJ1aWxkZXIvZm9ybS13aXphcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsTUFBTSxFQUVOLFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQWdCbEUsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBRXBFLHFFQUFxRTtBQUVyRTs7O0dBR0c7QUFnSEgsTUFBTSxPQUFPLHVCQUF1QjtJQS9HcEM7UUFpSFcsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFbkMsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxpRkFBaUY7UUFDeEUsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBRTdCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0tBaUJuRDtJQWZDLG1HQUFtRztJQUNuRyx3QkFBd0IsQ0FBQyxTQUFpQjtRQUN4QyxJQUFJLElB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LFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBR0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUdHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUlHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkF3SlAsaUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG4gIFZpZXdDaGlsZCxcclxuICBpbmplY3QsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlIH0gZnJvbSAnbHVjaWRlLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2J1dHRvbi9pbmRleCc7XHJcblxyXG5pbXBvcnQgeyBVaUZvcm1CdWlsZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mb3JtLWJ1aWxkZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBVaUZvcm1TY2hlbWEsXHJcbiAgVWlGb3JtU2VjdGlvbixcclxuICBVaUZvcm1EYXRhLFxyXG4gIFVpV2l6YXJkQ29uZmlnLFxyXG4gIFVpV2l6YXJkU3RhdGUsXHJcbiAgVWlXaXphcmRTdGVwQ2hhbmdlRXZlbnQsXHJcbiAgVWlXaXphcmRTdGVwQ29tcGxldGVFdmVudCxcclxuICBVaVdpemFyZFZhbGlkYXRpb25GbixcclxuICBVaUZvcm1DdXN0b21FdmVudCxcclxufSBmcm9tICcuL3R5cGVzL3NjaGVtYS50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlGb3JtRXJyb3JEZXRhaWwsXHJcbiAgVWlGb3JtVmFsaWRhdGlvblN0YXRlLFxyXG59IGZyb20gJy4vdHlwZXMvdmFsaWRhdGlvbi50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgVWlXaXphcmRTeW5jU2VydmljZSxcclxuICBVaVdpemFyZFN5bmNEYXRhLFxyXG59IGZyb20gJy4vc2VydmljZXMvd2l6YXJkLXN5bmMuc2VydmljZSc7XHJcbmltcG9ydCB7IFVpTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvbG9nZ2luZy9sb2dnZXIuc2VydmljZSc7XHJcblxyXG4vLyDilIDilIDilIAgQ29tcG9uZW50aSBpbnRlcm5pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuLyoqXHJcbiAqIEhlYWRlciBkZWwgd2l6YXJkOiBwcm9ncmVzc28gZSBpbmZvIGRlbGxvIHN0ZXAgY29ycmVudGUuXHJcbiAqIENvbiBgcHJvZ3Jlc3NTdHlsZTogJ3N0ZXBzJ2AgZW1ldHRlIGBzdGVwU2VsZWN0YCBwZXIgc2FsdGFyZSBhIHVubyBzdGVwIGdpw6AgY29tcGxldGF0by5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktd2l6YXJkLWhlYWRlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTHVjaWRlQW5ndWxhck1vZHVsZV0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19oZWFkZXJcIj5cclxuICAgICAgQGlmIChjb25maWcuc2hvd1Byb2dyZXNzICE9PSBmYWxzZSkge1xyXG4gICAgICAgIEBpZiAoY29uZmlnLnByb2dyZXNzU3R5bGUgIT09ICdzdGVwcycpIHtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fcHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19wcm9ncmVzcy1maWxsXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3Byb2dyZXNzLXRleHRcIj5cclxuICAgICAgICAgICAge3sgcHJvZ3Jlc3NQZXJjZW50IH19JSBjb21wbGV0YXRvXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBzXCI+XHJcbiAgICAgICAgICAgIEBmb3IgKFxyXG4gICAgICAgICAgICAgIGdyb3VwIG9mIHN0ZXBHcm91cHM7XHJcbiAgICAgICAgICAgICAgdHJhY2sgJGluZGV4O1xyXG4gICAgICAgICAgICAgIGxldCBpID0gJGluZGV4XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXBcIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnVpLWZvcm0td2l6YXJkX19zdGVwLS1jdXJyZW50XT1cIlxyXG4gICAgICAgICAgICAgICAgICBpID09PSBzdGF0ZS5jdXJyZW50U3RlcFxyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy51aS1mb3JtLXdpemFyZF9fc3RlcC0tY29tcGxldGVkXT1cIlxyXG4gICAgICAgICAgICAgICAgICBzdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLXZpc2l0ZWRdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnZpc2l0ZWRTdGVwcy5oYXMoaSlcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3MudWktZm9ybS13aXphcmRfX3N0ZXAtLW5hdmlnYWJsZV09XCJcclxuICAgICAgICAgICAgICAgICAgaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIEBpZiAoaXNTdGVwSW5kaWNhdG9yTmF2aWdhYmxlKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLXRyaWdnZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwQXJpYUxhYmVsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcFNlbGVjdC5lbWl0KGkpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoc3RhdGUuY29tcGxldGVkU3RlcHMuaGFzKGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiY2hlY2tcIiBbc2l6ZV09XCIxNlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cFswXS50aXRsZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdTdGVwICcgKyAoaSArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1zdGF0aWNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGkgPT09IHN0YXRlLmN1cnJlbnRTdGVwID8gJ3N0ZXAnIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0ud2l6YXJkU3RlcD8uc3RlcFRpdGxlIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBbMF0udGl0bGUgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RlcCAnICsgKGkgKyAxKVxyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19zdGVwLWluZm9cIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC10aXRsZVwiPnt7IGN1cnJlbnRTdGVwVGl0bGUgfX08L2gyPlxyXG4gICAgICAgIEBpZiAoY3VycmVudFN0ZXBEZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgPHAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fc3RlcC1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICB7eyBjdXJyZW50U3RlcERlc2NyaXB0aW9uIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWktZm9ybS13aXphcmRfX3N0ZXAtY291bnRlclwiPlxyXG4gICAgICAgICAgUGFzc28ge3sgc3RhdGUuY3VycmVudFN0ZXAgKyAxIH19IGRpIHt7IHN0YXRlLnRvdGFsU3RlcHMgfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIHN0YXRlITogVWlXaXphcmRTdGF0ZTtcclxuICBASW5wdXQoKSBwcm9ncmVzc1BlcmNlbnQgPSAwO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwVGl0bGUgPSAnJztcclxuICBASW5wdXQoKSBjdXJyZW50U3RlcERlc2NyaXB0aW9uID0gJyc7XHJcbiAgLyoqIFF1YW5kbyB0cnVlLCBpIGJ1bGxldCBzdGVwIG5vbiBzb25vIGludGVyYXR0aXZpIChlcy4gd2l6YXJkIGRpc2FiaWxpdGF0bykuICovXHJcbiAgQElucHV0KCkgZGlzYWJsZVN0ZXBJbmRpY2F0b3JzID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIC8qKiBJbmRpY2Ugc3RlcCBzZWxlemlvbmFiaWxlIHRyYW1pdGUgYnVsbGV0L3RpdG9sbyAoc29sbyBzdGVwIGdpw6AgY29tcGxldGF0aSwgbm9uIGlsIGNvcnJlbnRlKS4gKi9cclxuICBpc1N0ZXBJbmRpY2F0b3JOYXZpZ2FibGUoc3RlcEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd1N0ZXBJbmRpY2F0b3JOYXZpZ2F0aW9uID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZVN0ZXBJbmRpY2F0b3JzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5jb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHN0ZXBJbmRleCAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLnN0YXRlLmNvbXBsZXRlZFN0ZXBzLmhhcyhzdGVwSW5kZXgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRlc3RvIGFjY2Vzc2liaWxlIHBlciBpbCBwdWxzYW50ZSBzdGVwIChuYXZpZ2F6aW9uZSkuICovXHJcbiAgc3RlcEFyaWFMYWJlbChzdGVwVGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYFZhaSBhbGxvIHN0ZXA6ICR7c3RlcFRpdGxlfWA7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRm9vdGVyIGRlbCB3aXphcmQ6IHB1bHNhbnRpIGRpIG5hdmlnYXppb25lIGUgc2FsdmF0YWdnaW8uXHJcbiAqIEVtZXR0ZSBldmVudGkgcGVyIFByZXZpb3VzLCBOZXh0LCBGaW5pc2gsIFNhdmUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLXdpemFyZC1mb290ZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1VpQnV0dG9uQ29tcG9uZW50XSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3RlclwiPlxyXG4gICAgICBAaWYgKFxyXG4gICAgICAgIGNvbmZpZy5hbGxvd0JhY2tOYXZpZ2F0aW9uICE9PSBmYWxzZSAmJiBzdGF0ZS5jdXJyZW50U3RlcCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5wcmV2aW91cyA/PyAnSW5kaWV0cm8nXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICBpY29uPVwiY2hldnJvbi1sZWZ0XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpb3VzLmVtaXQoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fbmF2LWhpbnRcIj5DdHJsICsg4oaQPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9IEBlbHNlIHtcclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwidWktZm9ybS13aXphcmRfX2Zvb3Rlci1yaWdodFwiPlxyXG4gICAgICAgIEBpZiAoY29uZmlnLmF1dG9TYXZlICYmIGNvbmZpZy5idXR0b25MYWJlbHM/LnNhdmUpIHtcclxuICAgICAgICAgIDx1aS1idXR0b25cclxuICAgICAgICAgICAgW2xhYmVsXT1cImNvbmZpZy5idXR0b25MYWJlbHMhLnNhdmUhXCJcclxuICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZS5lbWl0KClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtYWN0aW9uXCI+XHJcbiAgICAgICAgICBAaWYgKGlzTGFzdFN0ZXApIHtcclxuICAgICAgICAgICAgPHVpLWJ1dHRvblxyXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJjb25maWcuYnV0dG9uTGFiZWxzPy5maW5pc2ggPz8gJ0NvbXBsZXRhJ1wiXHJcbiAgICAgICAgICAgICAgdmFyaWFudD1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgIGljb249XCJjaGVja1wiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmaW5pc2guZW1pdCgpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8dWktYnV0dG9uXHJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIlxyXG4gICAgICAgICAgICAgICAgY29uZmlnLmJ1dHRvbkxhYmVscz8ubmV4dCA/P1xyXG4gICAgICAgICAgICAgICAgICBjb25maWcuYnV0dG9uTGFiZWxzPy5zdWJtaXQgPz9cclxuICAgICAgICAgICAgICAgICAgJ0F2YW50aSdcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICBpY29uPVwiY2hldnJvbi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgaWNvblBvc2l0aW9uPVwidHJhaWxpbmdcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJuZXh0LmVtaXQoKVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19uYXYtaGludFwiPkN0cmwgKyDihpI8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpV2l6YXJkRm9vdGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBjb25maWchOiBVaVdpemFyZENvbmZpZztcclxuICBASW5wdXQoKSBzdGF0ZSE6IFVpV2l6YXJkU3RhdGU7XHJcbiAgQElucHV0KCkgaXNMYXN0U3RlcCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcHJldmlvdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIG5leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGZpbmlzaCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSAIENvbXBvbmVudGUgd2l6YXJkIHByaW5jaXBhbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSB3aXphcmQgY2hlIHdyYXBwYSBgVWlGb3JtQnVpbGRlckNvbXBvbmVudGBcclxuICogYWdnaXVuZ2VuZG8gbmF2aWdhemlvbmUgbXVsdGktc3RlcCwgYmFycmEgZGkgcHJvZ3Jlc3NvLFxyXG4gKiB2YWxpZGF6aW9uZSBwZXIgc3RlcCBlIHNpbmNyb25penphemlvbmUgd2lyZWxlc3MuXHJcbiAqIFBpw7kgc2V6aW9uaSBzY2hlbWEgY29uIGxvIHN0ZXNzbyBgd2l6YXJkU3RlcC5zdGVwTnVtYmVyYCBmb3JtYW5vIHVuIHVuaWNvIHBhc3NvXHJcbiAqIChlcy4gcGnDuSBibG9jY2hpIGNvbGxhc3NhYmlsaSBwZXIgc3RlcCk7IG1ldGFkYXRpIGRlbCBwYXNzbyBkYWxsYSBwcmltYSBzZXppb25lIGRlbCBncnVwcG8uXHJcbiAqXHJcbiAqIEBzZWxlY3RvciB1aS1mb3JtLXdpemFyZFxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDx1aS1mb3JtLXdpemFyZFxyXG4gKiAgIFtzY2hlbWFdPVwid2l6YXJkU2NoZW1hXCJcclxuICogICBbd2l6YXJkQ29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAqICAgKHdpemFyZENvbXBsZXRlKT1cIm9uQ29tcGxldGUoJGV2ZW50KVwiXHJcbiAqICAgKHN0ZXBDaGFuZ2UpPVwib25TdGVwQ2hhbmdlKCRldmVudClcIlxyXG4gKiAvPlxyXG4gKiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndWktZm9ybS13aXphcmQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgTHVjaWRlQW5ndWxhck1vZHVsZSxcclxuICAgIFVpQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgVWlGb3JtQnVpbGRlckNvbXBvbmVudCxcclxuICAgIFVpV2l6YXJkSGVhZGVyQ29tcG9uZW50LFxyXG4gICAgVWlXaXphcmRGb290ZXJDb21wb25lbnQsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICBAaWYgKHNjaGVtYSAmJiB3aXphcmRDb25maWcpIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkXCI+XHJcbiAgICAgICAgPCEtLSBIZWFkZXIgd2l6YXJkIChuYXNjb3N0byBzZSB3aXJlbGVzcykgLS0+XHJcbiAgICAgICAgQGlmICghd2l6YXJkQ29uZmlnLndpcmVsZXNzSGVhZGluZykge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1oZWFkZXJcclxuICAgICAgICAgICAgW2NvbmZpZ109XCJ3aXphcmRDb25maWdcIlxyXG4gICAgICAgICAgICBbc3RlcEdyb3Vwc109XCJ3aXphcmRTdGVwR3JvdXBzXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW3Byb2dyZXNzUGVyY2VudF09XCJwcm9ncmVzc1BlcmNlbnRcIlxyXG4gICAgICAgICAgICBbY3VycmVudFN0ZXBUaXRsZV09XCJjdXJyZW50U3RlcFRpdGxlXCJcclxuICAgICAgICAgICAgW2N1cnJlbnRTdGVwRGVzY3JpcHRpb25dPVwiY3VycmVudFN0ZXBEZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlU3RlcEluZGljYXRvcnNdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAoc3RlcFNlbGVjdCk9XCJvbldpemFyZFN0ZXBJbmRpY2F0b3JTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPCEtLSBOYXZpZ2F6aW9uZSBzb3ByYSBpbCBmb3JtIC0tPlxyXG4gICAgICAgIEBpZiAoc2hvd1RvcE5hdikge1xyXG4gICAgICAgICAgPHVpLXdpemFyZC1mb290ZXJcclxuICAgICAgICAgICAgY2xhc3M9XCJ1aS1mb3JtLXdpemFyZF9fZm9vdGVyIHVpLWZvcm0td2l6YXJkX19mb290ZXItLXRvcFwiXHJcbiAgICAgICAgICAgIFtjb25maWddPVwid2l6YXJkQ29uZmlnXCJcclxuICAgICAgICAgICAgW3N0YXRlXT1cInN0YXRlXCJcclxuICAgICAgICAgICAgW2lzTGFzdFN0ZXBdPVwiaXNMYXN0U3RlcFwiXHJcbiAgICAgICAgICAgIChwcmV2aW91cyk9XCJnb1RvUHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAobmV4dCk9XCJnb1RvTmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgIChmaW5pc2gpPVwiZmluaXNoV2l6YXJkKClcIlxyXG4gICAgICAgICAgICAoc2F2ZSk9XCJzYXZlQ3VycmVudFN0ZXAoKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19jb250ZW50XCI+XHJcbiAgICAgICAgICA8IS0tIEZvcm0gYnVpbGRlciBwZXIgbG8gc3RlcCBjb3JyZW50ZSAtLT5cclxuICAgICAgICAgIDx1aS1mb3JtLWJ1aWxkZXJcclxuICAgICAgICAgICAgW3NjaGVtYV09XCJjdXJyZW50U3RlcFNjaGVtYSFcIlxyXG4gICAgICAgICAgICBbaW5pdGlhbERhdGFdPVwibWVyZ2VkSW5pdGlhbERhdGFGb3JCdWlsZGVyXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgICAgW2xvYWRpbmdGb3JdPVwibG9hZGluZ0ZvclwiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlc109XCJjdXN0b21GaWVsZFRlbXBsYXRlc1wiXHJcbiAgICAgICAgICAgIFtjdXN0b21GaWVsZFRlbXBsYXRlRmFsbGJhY2tdPVwiY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrXCJcclxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh2YWxpZGF0aW9uQ2hhbmdlKT1cIm9uVmFsaWRhdGlvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGN1c3RvbUV2ZW50KT1cImN1c3RvbUV2ZW50LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE5hdmlnYXppb25lIHNvdHRvIGlsIGZvcm0gLS0+XHJcbiAgICAgICAgQGlmIChzaG93Qm90dG9tTmF2KSB7XHJcbiAgICAgICAgICA8dWktd2l6YXJkLWZvb3RlclxyXG4gICAgICAgICAgICBjbGFzcz1cInVpLWZvcm0td2l6YXJkX19mb290ZXJcIlxyXG4gICAgICAgICAgICBbY29uZmlnXT1cIndpemFyZENvbmZpZ1wiXHJcbiAgICAgICAgICAgIFtzdGF0ZV09XCJzdGF0ZVwiXHJcbiAgICAgICAgICAgIFtpc0xhc3RTdGVwXT1cImlzTGFzdFN0ZXBcIlxyXG4gICAgICAgICAgICAocHJldmlvdXMpPVwiZ29Ub1ByZXZpb3VzU3RlcCgpXCJcclxuICAgICAgICAgICAgKG5leHQpPVwiZ29Ub05leHRTdGVwKClcIlxyXG4gICAgICAgICAgICAoZmluaXNoKT1cImZpbmlzaFdpemFyZCgpXCJcclxuICAgICAgICAgICAgKHNhdmUpPVwic2F2ZUN1cnJlbnRTdGVwKClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gIGAsXHJcbiAgc3R5bGVVcmw6ICcuL2Zvcm0td2l6YXJkLmNvbXBvbmVudC5zY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRm9ybVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXphcmRTeW5jID0gaW5qZWN0KFVpV2l6YXJkU3luY1NlcnZpY2UpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gaW5qZWN0KFVpTG9nZ2VyU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChVaUZvcm1CdWlsZGVyQ29tcG9uZW50KSBmb3JtQnVpbGRlcj86IFVpRm9ybUJ1aWxkZXJDb21wb25lbnQ7XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBJbnB1dCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFNjaGVtYSBjb21wbGV0byBkZWwgZm9ybSAodHV0dGUgbGUgc2V6aW9uaSBjb24gd2l6YXJkU3RlcCkuICovXHJcbiAgQElucHV0KCkgc2NoZW1hITogVWlGb3JtU2NoZW1hO1xyXG5cclxuICAvKiogQ29uZmlndXJhemlvbmUgZGVsIHdpemFyZC4gKi9cclxuICBASW5wdXQoKSB3aXphcmRDb25maWchOiBVaVdpemFyZENvbmZpZztcclxuXHJcbiAgLyoqIE1ldG9kaSBkaSB2YWxpZGF6aW9uZSBjdXN0b20gcGVyIHN0ZXAuICovXHJcbiAgQElucHV0KCkgY3VzdG9tVmFsaWRhdGlvbk1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVpV2l6YXJkVmFsaWRhdGlvbkZuPiA9IHt9O1xyXG5cclxuICAvKiogRGF0aSBpbml6aWFsaS4gKi9cclxuICBASW5wdXQoKSBpbml0aWFsRGF0YTogVWlGb3JtRGF0YSA9IHt9O1xyXG5cclxuICAvKiogTW9kYWxpdGEgc29sYSBsZXR0dXJhLiAqL1xyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIC8qKiBTdGF0byBkaXNhYmlsaXRhdG8uICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFB1bHNhbnRlIGluIGNhcmljYW1lbnRvLiAqL1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdGb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiogVGVtcGxhdGUgcGVyIGNhbXBpIGB0eXBlOiAnY3VzdG9tJ2AgKGlub2x0cm8gYWwgZm9ybSBidWlsZGVyKS4gKi9cclxuICBASW5wdXQoKSBjdXN0b21GaWVsZFRlbXBsYXRlczogUmVjb3JkPHN0cmluZywgVGVtcGxhdGVSZWY8dW5rbm93bj4+ID0ge307XHJcblxyXG4gIC8qKiBGYWxsYmFjayB0ZW1wbGF0ZSBwZXIgY2FtcGkgY3VzdG9tIChpbm9sdHJvIGFsIGZvcm0gYnVpbGRlcikuICovXHJcbiAgQElucHV0KCkgY3VzdG9tRmllbGRUZW1wbGF0ZUZhbGxiYWNrPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBPdXRwdXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgc3RlcENvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxVaVdpemFyZFN0ZXBDb21wbGV0ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBzdGVwVmFsaWRhdGlvbkZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgc3RlcDogbnVtYmVyO1xyXG4gICAgZXJyb3JzOiBzdHJpbmdbXTtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSB3aXphcmRDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VWlGb3JtRGF0YT4oKTtcclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybURhdGE+KCk7XHJcbiAgQE91dHB1dCgpIHZhbGlkYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybVZhbGlkYXRpb25TdGF0ZT4oKTtcclxuICBAT3V0cHV0KCkgY3VzdG9tRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFVpRm9ybUN1c3RvbUV2ZW50PigpO1xyXG5cclxuICAvLyDilIDilIDilIAgU3RhdG8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIHN0YXRlOiBVaVdpemFyZFN0YXRlID0ge1xyXG4gICAgY3VycmVudFN0ZXA6IDAsXHJcbiAgICB0b3RhbFN0ZXBzOiAwLFxyXG4gICAgY29tcGxldGVkU3RlcHM6IG5ldyBTZXQ8bnVtYmVyPigpLFxyXG4gICAgdmlzaXRlZFN0ZXBzOiBuZXcgU2V0PG51bWJlcj4oWzBdKSxcclxuICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgc3RlcEVycm9yczoge30sXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogR3J1cHBpIGRpIHNlemlvbmkgc2NoZW1hIHBlciBwYXNzbyBsb2dpY28gZGVsIHdpemFyZC5cclxuICAgKiBTZXppb25pIGNvbiBsbyBzdGVzc28gYHdpemFyZFN0ZXAuc3RlcE51bWJlcmAgY29tcG9uZ29ubyB1biB1bmljbyBwYXNzbyAob3JkaW5lOiBjb21lIGluIGBzY2hlbWEuc2VjdGlvbnNgIGRvcG8gc29ydCBwZXIgbnVtZXJvKS5cclxuICAgKi9cclxuICB3aXphcmRTdGVwR3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG5cclxuICAvKiogRGF0aSBhY2N1bXVsYXRpIGRlbCBmb3JtLiAqL1xyXG4gIHByaXZhdGUgYWNjdW11bGF0ZWREYXRhOiBVaUZvcm1EYXRhID0ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjaGVtYSBjYWNoYXRvIHBlciBsbyBzdGVwIGNvcnJlbnRlLlxyXG4gICAqIEV2aXRhIGRpIGNyZWFyZSB1biBudW92byBvZ2dldHRvIGFkIG9nbmkgY2ljbG8gZGkgY2hhbmdlIGRldGVjdGlvbixcclxuICAgKiBjb3NhIGNoZSBjYXVzZXJlYmJlIHJlYnVpbGQgaW5maW5pdGkgbmVsIGZvcm0gYnVpbGRlci5cclxuICAgKi9cclxuICBfY2FjaGVkU3RlcFNjaGVtYTogVWlGb3JtU2NoZW1hIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FjaGVkU3RlcEluZGV4OiBudW1iZXIgPSAtMTtcclxuXHJcbiAgLy8g4pSA4pSA4pSAIEdldHRlciBjYWxjb2xhdGkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIGdldCBjdXJyZW50U3RlcFNjaGVtYSgpOiBVaUZvcm1TY2hlbWEgfCBudWxsIHtcclxuICAgIC8vIFNlIGxvIHN0ZXAgbm9uIGUgY2FtYmlhdG8sIHJlc3RpdHVpc2NpIGxvIHNjaGVtYSBjYWNoYXRvXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9PT0gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAmJlxyXG4gICAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWEgPSB7XHJcbiAgICAgIGlkOiB0aGlzLnNjaGVtYS5pZCArICctc3RlcC0nICsgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2VjdGlvbnM6IGdyb3VwLFxyXG4gICAgICBjb25maWc6IHsgLi4udGhpcy5zY2hlbWEuY29uZmlnLCBoaWRlRm9vdGVyOiB0cnVlLCBzaG93QnV0dG9uczogZmFsc2UgfSxcclxuICAgIH07XHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwSW5kZXggPSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwO1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFN0ZXBTY2hlbWE7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudFN0ZXBUaXRsZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcHJpbWFyeSA9IHRoaXMud2l6YXJkU3RlcEdyb3Vwc1t0aGlzLnN0YXRlLmN1cnJlbnRTdGVwXT8uWzBdO1xyXG4gICAgcmV0dXJuIHByaW1hcnk/LndpemFyZFN0ZXA/LnN0ZXBUaXRsZSB8fCBwcmltYXJ5Py50aXRsZSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldCBjdXJyZW50U3RlcERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gdGhpcy53aXphcmRTdGVwR3JvdXBzW3RoaXMuc3RhdGUuY3VycmVudFN0ZXBdPy5bMF07XHJcbiAgICByZXR1cm4gcHJpbWFyeT8ud2l6YXJkU3RlcD8uc3RlcERlc2NyaXB0aW9uIHx8IHByaW1hcnk/LmRlc2NyaXB0aW9uIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTGFzdFN0ZXAoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA+PSB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgLSAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2dyZXNzUGVyY2VudCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuc3RhdGUudG90YWxTdGVwcyA8PSAxKSByZXR1cm4gMTAwO1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQoXHJcbiAgICAgICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIC8gKHRoaXMuc3RhdGUudG90YWxTdGVwcyAtIDEpKSAqIDEwMCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRpIHBhc3NhdGkgYWwgZm9ybSBidWlsZGVyOiB1bmlvbmUgdHJhIHZhbG9yaSBmb3JuaXRpIGRhbCBjb25zdW1lciBlXHJcbiAgICogc3RhdG8gYWNjdW11bGF0byB0cmEgZ2xpIHN0ZXAuIFNlbnphIHF1ZXN0bywgdG9ybmFuZG8gaW5kaWV0cm8gaWwgYnVpbGRlclxyXG4gICAqIHJpY2V2ZXJlYmJlIHNvbG8gYGluaXRpYWxEYXRhYCBlIHJpY3JlZXJlYmJlIGkgY2FtcGkgdnVvdGksIHB1ciBhdmVuZG9cclxuICAgKiBpIHZhbG9yaSBhbmNvcmEgaW4gYGFjY3VtdWxhdGVkRGF0YWAuXHJcbiAgICovXHJcbiAgZ2V0IG1lcmdlZEluaXRpYWxEYXRhRm9yQnVpbGRlcigpOiBVaUZvcm1EYXRhIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuaW5pdGlhbERhdGEsIC4uLnRoaXMuYWNjdW11bGF0ZWREYXRhIH07XHJcbiAgfVxyXG5cclxuICAvKiogTW9zdHJhIGxhIG5hdmlnYXppb25lIHNvcHJhIGlsIGZvcm0gYnVpbGRlci4gKi9cclxuICBnZXQgc2hvd1RvcE5hdigpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZy5zaG93TmF2aWdhdGlvbkJ1dHRvbnMgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBwb3MgPSB0aGlzLndpemFyZENvbmZpZy5uYXZpZ2F0aW9uUG9zaXRpb247XHJcbiAgICByZXR1cm4gcG9zID09PSAndG9wJyB8fCBwb3MgPT09ICdib3RoJztcclxuICB9XHJcblxyXG4gIC8qKiBNb3N0cmEgbGEgbmF2aWdhemlvbmUgc290dG8gaWwgZm9ybSBidWlsZGVyLiAqL1xyXG4gIGdldCBzaG93Qm90dG9tTmF2KCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IHBvcyA9IHRoaXMud2l6YXJkQ29uZmlnLm5hdmlnYXRpb25Qb3NpdGlvbjtcclxuICAgIHJldHVybiBwb3MgPT09ICdib3R0b20nIHx8IHBvcyA9PT0gJ2JvdGgnIHx8IHBvcyA9PSBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc2NoZW1hKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2luaXQnLCB7IHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsIGVycm9yOiAnc2NoZW1hIG5vbiBwcmVzZW50ZScgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndpemFyZFN0ZXBHcm91cHMgPSB0aGlzLmJ1aWxkV2l6YXJkU3RlcEdyb3Vwcyh0aGlzLnNjaGVtYS5zZWN0aW9ucyk7XHJcbiAgICB0aGlzLnN0YXRlLnRvdGFsU3RlcHMgPSB0aGlzLndpemFyZFN0ZXBHcm91cHMubGVuZ3RoO1xyXG4gICAgdGhpcy5hY2N1bXVsYXRlZERhdGEgPSB7IC4uLnRoaXMuaW5pdGlhbERhdGEgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdpbml0Jywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWc/LndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWEuaWQsXHJcbiAgICAgIHRvdGFsU3RlcHM6IHRoaXMuc3RhdGUudG90YWxTdGVwcyxcclxuICAgICAgdG90YWxTZWN0aW9uczogdGhpcy53aXphcmRTdGVwR3JvdXBzLnJlZHVjZSgoc3VtLCBnKSA9PiBzdW0gKyBnLmxlbmd0aCwgMCksXHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBTaW5jcm9uaXp6YXppb25lIHdpcmVsZXNzXHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy5zeW5jV2l6YXJkU3RhdGUoKTtcclxuXHJcbiAgICAgIC8vIEFzY29sdGEgbmF2aWdhemlvbmUgZXN0ZXJuYVxyXG4gICAgICB0aGlzLndpemFyZFN5bmNcclxuICAgICAgICAuZ2V0V2l6YXJkU3RhdGUkKHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLndpemFyZFN0YXRlLmN1cnJlbnRTdGVwICE9PSB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAoZGF0YS53aXphcmRTdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ2Rlc3Ryb3knLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGN1cnJlbnRTdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIGlmICh0aGlzLndpemFyZENvbmZpZz8ud2l6YXJkSWQpIHtcclxuICAgICAgdGhpcy53aXphcmRTeW5jLnVucmVnaXN0ZXJXaXphcmQodGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2NvcmNpYXRvaWE6IEN0cmwgKyBGcmVjY2lhIHNpbmlzdHJhL2Rlc3RyYSBwZXIgbmF2aWdhcmUgY29tZSBpIHB1bHNhbnRpXHJcbiAgICogSW5kaWV0cm8gLyBBdmFudGkgKHN1bGwndWx0aW1vIHN0ZXAsIEF2YW50aSBlcXVpdmFsZSBhIENvbXBsZXRhKS5cclxuICAgKiBJZ25vcmF0YSBzZSBpbCBmb2N1cyDDqCBpbiB1biBjYW1wbyBkaSBpbnB1dCBwZXIgbm9uIGludGVyZmVyaXJlIGNvbiBsYSBkaWdpdGF6aW9uZS5cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnNjaGVtYSB8fCAhdGhpcy53aXphcmRDb25maWcgfHwgdGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLnNob3dOYXZpZ2F0aW9uQnV0dG9ucyA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmICghZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5zaGlmdEtleSlcclxuICAgICAgcmV0dXJuO1xyXG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJ0Fycm93TGVmdCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcpIHJldHVybjtcclxuICAgIGlmICh0aGlzLmlzRWRpdGFibGVLZXlib2FyZFRhcmdldChldmVudC50YXJnZXQpKSByZXR1cm47XHJcblxyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcclxuICAgICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93QmFja05hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbigna2V5Ym9hcmROYXZpZ2F0aW9uJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBkaXJlY3Rpb246ICdwcmV2aW91cycsXHJcbiAgICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmdvVG9QcmV2aW91c1N0ZXAoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFycm93UmlnaHRcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdrZXlib2FyZE5hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZGlyZWN0aW9uOiB0aGlzLmlzTGFzdFN0ZXAgPyAnZmluaXNoJyA6ICduZXh0JyxcclxuICAgICAgZnJvbVN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLmlzTGFzdFN0ZXApIHtcclxuICAgICAgdm9pZCB0aGlzLmZpbmlzaFdpemFyZCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdm9pZCB0aGlzLmdvVG9OZXh0U3RlcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgc2UgaWwgdGFyZ2V0IGRlbCBrZXlkb3duIMOoIHVuIGVsZW1lbnRvIGRvdmUgbGEgZGlnaXRhemlvbmUgaGEgcHJpb3JpdMOgIHN1bGxhIHNob3J0Y3V0IHdpemFyZC4gKi9cclxuICBwcml2YXRlIGlzRWRpdGFibGVLZXlib2FyZFRhcmdldCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0YXJnZXQgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGVsID0gdGFyZ2V0O1xyXG4gICAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlKSByZXR1cm4gdHJ1ZTtcclxuICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XHJcbiAgICBpZiAodGFnID09PSAnSU5QVVQnIHx8IHRhZyA9PT0gJ1RFWFRBUkVBJyB8fCB0YWcgPT09ICdTRUxFQ1QnKSByZXR1cm4gdHJ1ZTtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFZhaSBhbGxvIHN0ZXAgc3VjY2Vzc2l2byBjb24gdmFsaWRhemlvbmUuICovXHJcbiAgYXN5bmMgZ29Ub05leHRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuaXNMYXN0U3RlcCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIFZhbGlkYSBzdGVwIGNvcnJlbnRlXHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHJldHVybjtcclxuXHJcbiAgICAvLyBTYWx2YSBkYXRpIHN0ZXAgY29ycmVudGVcclxuICAgIHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMuYWRkKHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgYXdhaXQgdGhpcy5hdXRvU2F2ZUlmTmVlZGVkKCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcCh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwICsgMSk7XHJcbiAgfVxyXG5cclxuICAvKiogVG9ybmEgYWxsbyBzdGVwIHByZWNlZGVudGUuICovXHJcbiAgZ29Ub1ByZXZpb3VzU3RlcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwIDw9IDApIHJldHVybjtcclxuICAgIHRoaXMubmF2aWdhdGVUb1N0ZXAodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhemlvbmUgdHJhbWl0ZSBpbmRpY2F0b3JpIHN0ZXAgKGJ1bGxldCArIHRpdG9sbykgcXVhbmRvIGBwcm9ncmVzc1N0eWxlYCDDqCBgJ3N0ZXBzJ2AuXHJcbiAgICogQ29uc2VudGl0byBzb2xvIHZlcnNvIHN0ZXAgZ2nDoCBtYXJjYXRpIGNvbXBsZXRhdGkuXHJcbiAgICovXHJcbiAgb25XaXphcmRTdGVwSW5kaWNhdG9yU2VsZWN0KHN0ZXBJbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLmFsbG93U3RlcEluZGljYXRvck5hdmlnYXRpb24gPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYWxsb3dCYWNrTmF2aWdhdGlvbiA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGlmIChzdGVwSW5kZXggPT09IHRoaXMuc3RhdGUuY3VycmVudFN0ZXApIHJldHVybjtcclxuICAgIGlmICghdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5oYXMoc3RlcEluZGV4KSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ25hdmlnYXRpb24nLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgdmlhOiAnc3RlcEluZGljYXRvcicsXHJcbiAgICAgIGZyb21TdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICB0b1N0ZXA6IHN0ZXBJbmRleCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvU3RlcChzdGVwSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbXBsZXRhIGlsIHdpemFyZC4gKi9cclxuICBhc3luYyBmaW5pc2hXaXphcmQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIShhd2FpdCB0aGlzLnZhbGlkYXRlQ3VycmVudFN0ZXAoKSkpIHtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgY29udGV4dDogJ2ZpbmlzaCcsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZS5jb21wbGV0ZWRTdGVwcy5hZGQodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICBhd2FpdCB0aGlzLmF1dG9TYXZlSWZOZWVkZWQoKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdjb21wbGV0ZScsIHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgICB0b3RhbFN0ZXBzOiB0aGlzLnN0YXRlLnRvdGFsU3RlcHMsXHJcbiAgICAgIGNvbXBsZXRlZFN0ZXBzOiBBcnJheS5mcm9tKHRoaXMuc3RhdGUuY29tcGxldGVkU3RlcHMpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLndpemFyZENvbXBsZXRlLmVtaXQodGhpcy5hY2N1bXVsYXRlZERhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNhbHZhIGxvIHN0ZXAgY29ycmVudGUgbWFudWFsbWVudGUuICovXHJcbiAgYXN5bmMgc2F2ZUN1cnJlbnRTdGVwKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9O1xyXG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzYXZlJywge1xyXG4gICAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0aGlzLndpemFyZENvbmZpZy5vblN0ZXBTYXZlKGRhdGEsIHRoaXMuc3RhdGUuY3VycmVudFN0ZXApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSAIENhbGxiYWNrIGZvcm0gYnVpbGRlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgb25WYWx1ZUNoYW5nZShkYXRhOiBVaUZvcm1EYXRhKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjY3VtdWxhdGVkRGF0YSA9IHsgLi4udGhpcy5hY2N1bXVsYXRlZERhdGEsIC4uLmRhdGEgfTtcclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3ZhbHVlQ2hhbmdlJywge1xyXG4gICAgICB3aXphcmRJZDogdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQsXHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIHNjaGVtYUlkOiB0aGlzLnNjaGVtYT8uaWQsXHJcbiAgICAgIGNoYW5nZWRLZXlzOiBPYmplY3Qua2V5cyhkYXRhKSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMuYWNjdW11bGF0ZWREYXRhKTtcclxuICB9XHJcblxyXG4gIG9uVmFsaWRhdGlvbkNoYW5nZShzdGF0ZTogVWlGb3JtVmFsaWRhdGlvblN0YXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmlzVmFsaWQgPSBzdGF0ZS52YWxpZDtcclxuICAgIHRoaXMudmFsaWRhdGlvbkNoYW5nZS5lbWl0KHN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgCBOYXZpZ2F6aW9uZSBpbnRlcm5hIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9TdGVwKHRhcmdldFN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRhcmdldFN0ZXAgPCAwIHx8IHRhcmdldFN0ZXAgPj0gdGhpcy5zdGF0ZS50b3RhbFN0ZXBzKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgZnJvbSA9IHRoaXMuc3RhdGUuY3VycmVudFN0ZXA7XHJcbiAgICB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwID0gdGFyZ2V0U3RlcDtcclxuICAgIHRoaXMuc3RhdGUudmlzaXRlZFN0ZXBzLmFkZCh0YXJnZXRTdGVwKTtcclxuXHJcbiAgICAvLyBJbnZhbGlkYSBsYSBjYWNoZSBwZXIgZm9yemFyZSBsYSBjcmVhemlvbmUgZGkgdW4gbnVvdm8gc2NoZW1hXHJcbiAgICB0aGlzLl9jYWNoZWRTdGVwU2NoZW1hID0gbnVsbDtcclxuICAgIHRoaXMuX2NhY2hlZFN0ZXBJbmRleCA9IC0xO1xyXG5cclxuICAgIHRoaXMubG9nZ2VyPy5sb2dXaXphcmRBY3Rpb24oJ3N0ZXBDaGFuZ2UnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgZnJvbSxcclxuICAgICAgdG86IHRhcmdldFN0ZXAsXHJcbiAgICAgIGRpcmVjdGlvbjogdGFyZ2V0U3RlcCA+IGZyb20gPyAnbmV4dCcgOiAncHJldmlvdXMnLFxyXG4gICAgICBzY2hlbWFJZDogdGhpcy5zY2hlbWE/LmlkLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBmcm9tLFxyXG4gICAgICB0bzogdGFyZ2V0U3RlcCxcclxuICAgICAgZGlyZWN0aW9uOiB0YXJnZXRTdGVwID4gZnJvbSA/ICduZXh0JyA6ICdwcmV2aW91cycsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN5bmNXaXphcmRTdGF0ZSgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQ3VycmVudFN0ZXAoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLmZvcm1CdWlsZGVyPy52YWxpZGF0ZUFsbEZpZWxkcygpO1xyXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLndpemFyZFN0ZXBHcm91cHNbdGhpcy5zdGF0ZS5jdXJyZW50U3RlcF07XHJcbiAgICBjb25zdCBwcmltYXJ5ID0gZ3JvdXA/LlswXTtcclxuICAgIGNvbnN0IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyA9XHJcbiAgICAgIHByaW1hcnk/LndpemFyZFN0ZXA/LnZhbGlkYXRpb24/LnZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50cyAhPT0gZmFsc2U7XHJcbiAgICBjb25zdCBjdXN0b21GaWVsZEtleXMgPSBuZXcgU2V0KHRoaXMuZ2V0Q3VzdG9tRmllbGRLZXlzRm9yR3JvdXAoZ3JvdXApKTtcclxuXHJcbiAgICBjb25zdCBpc0Zvcm1WYWxpZCA9IHZhbGlkYXRlQ3VzdG9tQ29tcG9uZW50c1xyXG4gICAgICA/ICh0aGlzLmZvcm1CdWlsZGVyPy5pc0Zvcm1WYWxpZCgpID8/IHRydWUpXHJcbiAgICAgIDogKHRoaXMuZm9ybUJ1aWxkZXI/LmlzRm9ybVZhbGlkRXhjbHVkaW5nRmllbGRLZXlzKGN1c3RvbUZpZWxkS2V5cykgPz9cclxuICAgICAgICB0cnVlKTtcclxuXHJcbiAgICBjb25zdCBjdXN0b21Gbk5hbWUgPSBwcmltYXJ5Py53aXphcmRTdGVwPy5jdXN0b21WYWxpZGF0aW9uRm47XHJcblxyXG4gICAgaWYgKGN1c3RvbUZuTmFtZSAmJiB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0pIHtcclxuICAgICAgY29uc3QgY3VzdG9tVmFsaWQgPSBhd2FpdCB0aGlzLmN1c3RvbVZhbGlkYXRpb25NZXRob2RzW2N1c3RvbUZuTmFtZV0oXHJcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZERhdGEsXHJcbiAgICAgICAgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICBpc0Zvcm1WYWxpZCxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICghY3VzdG9tVmFsaWQpIHtcclxuICAgICAgICB0aGlzLnN0ZXBWYWxpZGF0aW9uRmFpbGVkLmVtaXQoe1xyXG4gICAgICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgICAgIGVycm9yczogWydWYWxpZGF6aW9uZSBjdXN0b20gZmFsbGl0YSddLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghaXNGb3JtVmFsaWQgJiYgcHJpbWFyeT8ud2l6YXJkU3RlcD8udmFsaWRhdGlvbj8ucmVxdWlyZWQgIT09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBkZXRhaWxzID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0RGV0YWlsZWRGb3JtRXJyb3JzKCkgfHwgW107XHJcbiAgICAgIGlmICghdmFsaWRhdGVDdXN0b21Db21wb25lbnRzICYmIGdyb3VwPy5sZW5ndGgpIHtcclxuICAgICAgICBkZXRhaWxzID0gdGhpcy5maWx0ZXJFcnJvckRldGFpbHNFeGNsdWRpbmdDdXN0b21GaWVsZHMoXHJcbiAgICAgICAgICBkZXRhaWxzLFxyXG4gICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICBjdXN0b21GaWVsZEtleXMsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBlcnJvcnMgPSBkZXRhaWxzLmZsYXRNYXAoKGUpID0+IGUuZXJyb3JzKTtcclxuICAgICAgdGhpcy5sb2dnZXI/LmxvZ1dpemFyZEFjdGlvbignc3RlcFZhbGlkYXRpb25GYWlsZWQnLCB7XHJcbiAgICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgICAgZXJyb3JzLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zdGVwVmFsaWRhdGlvbkZhaWxlZC5lbWl0KHtcclxuICAgICAgICBzdGVwOiB0aGlzLnN0YXRlLmN1cnJlbnRTdGVwLFxyXG4gICAgICAgIGVycm9ycyxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvZ2dlcj8ubG9nV2l6YXJkQWN0aW9uKCdzdGVwQ29tcGxldGUnLCB7XHJcbiAgICAgIHdpemFyZElkOiB0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCxcclxuICAgICAgc3RlcDogdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCxcclxuICAgICAgc2NoZW1hSWQ6IHRoaXMuc2NoZW1hPy5pZCxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zdGVwQ29tcGxldGUuZW1pdCh7XHJcbiAgICAgIHN0ZXA6IHRoaXMuc3RhdGUuY3VycmVudFN0ZXAsXHJcbiAgICAgIGRhdGE6IHRoaXMuZm9ybUJ1aWxkZXI/LmdldEZvcm1WYWx1ZSgpIHx8IHt9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYWdncnVwcGEgbGUgc2V6aW9uaSBjb24gYHdpemFyZFN0ZXBgIHBlciBgc3RlcE51bWJlcmAgKG9yZGluZSBzdGFiaWxlIHBlciBudW1lcm8sIHBvaSBvcmRpbmUgZGkgYXBwYXJpemlvbmUgbmVsbG8gc2NoZW1hKS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkV2l6YXJkU3RlcEdyb3VwcyhzZWN0aW9uczogVWlGb3JtU2VjdGlvbltdKTogVWlGb3JtU2VjdGlvbltdW10ge1xyXG4gICAgY29uc3Qgd2l0aFdpemFyZCA9IHNlY3Rpb25zLmZpbHRlcigocykgPT4gcy53aXphcmRTdGVwKTtcclxuICAgIHdpdGhXaXphcmQuc29ydChcclxuICAgICAgKGEsIGIpID0+XHJcbiAgICAgICAgKGEud2l6YXJkU3RlcCEuc3RlcE51bWJlciB8fCAwKSAtIChiLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCksXHJcbiAgICApO1xyXG4gICAgY29uc3QgZ3JvdXBzOiBVaUZvcm1TZWN0aW9uW11bXSA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBzIG9mIHdpdGhXaXphcmQpIHtcclxuICAgICAgY29uc3QgbnVtID0gcy53aXphcmRTdGVwIS5zdGVwTnVtYmVyO1xyXG4gICAgICBjb25zdCBwcmV2ID0gZ3JvdXBzW2dyb3Vwcy5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHByZXY/Lmxlbmd0aCAmJlxyXG4gICAgICAgIChwcmV2WzBdLndpemFyZFN0ZXAhLnN0ZXBOdW1iZXIgfHwgMCkgPT09IChudW0gfHwgMClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcHJldi5wdXNoKHMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdyb3Vwcy5wdXNoKFtzXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBncm91cHM7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hpYXZpIGRlaSBjYW1waSBgY3VzdG9tYCBpbiB0dXR0ZSBsZSBzZXppb25pIGRlbCBwYXNzbyBjb3JyZW50ZS4gKi9cclxuICBwcml2YXRlIGdldEN1c3RvbUZpZWxkS2V5c0Zvckdyb3VwKFxyXG4gICAgZ3JvdXA6IFVpRm9ybVNlY3Rpb25bXSB8IHVuZGVmaW5lZCxcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBpZiAoIWdyb3VwPy5sZW5ndGgpIHJldHVybiBbXTtcclxuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgZ3JvdXApIHtcclxuICAgICAgZm9yIChjb25zdCBmIG9mIHNlY3Rpb24uZmllbGRzIHx8IFtdKSB7XHJcbiAgICAgICAgaWYgKGYudHlwZSA9PT0gJ2N1c3RvbScpIGtleXMucHVzaChmLmtleSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBrZXlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJpbXVvdmUgZGFnbGkgZXJyb3JpIGkgY2FtcGkgY3VzdG9tIHF1YW5kbyBgdmFsaWRhdGVDdXN0b21Db21wb25lbnRzYCDDqCBmYWxzZS4gKi9cclxuICBwcml2YXRlIGZpbHRlckVycm9yRGV0YWlsc0V4Y2x1ZGluZ0N1c3RvbUZpZWxkcyhcclxuICAgIGRldGFpbHM6IFVpRm9ybUVycm9yRGV0YWlsW10sXHJcbiAgICBncm91cDogVWlGb3JtU2VjdGlvbltdLFxyXG4gICAgY3VzdG9tS2V5czogU2V0PHN0cmluZz4sXHJcbiAgKTogVWlGb3JtRXJyb3JEZXRhaWxbXSB7XHJcbiAgICBjb25zdCBzZWN0aW9uSWRzID0gZ3JvdXAubWFwKChzKSA9PiBzLmlkKTtcclxuICAgIHJldHVybiBkZXRhaWxzLmZpbHRlcigoZCkgPT4ge1xyXG4gICAgICBjb25zdCBsb2dpY2FsS2V5ID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICAgICAgZC5maWVsZEtleSxcclxuICAgICAgICBzZWN0aW9uSWRzLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gIWN1c3RvbUtleXMuaGFzKGxvZ2ljYWxLZXkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSaXNvbHZlIGxhIGNoaWF2ZSBsb2dpY2EgZGVsIGNhbXBvIHJpc3BldHRvIGEgdHV0dGUgbGUgc2V6aW9uaSBkZWwgZ3J1cHBvIChjYW1waSBmbGF0IG8gcmVwZWF0YWJsZSkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5Rm9yR3JvdXAoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkczogc3RyaW5nW10sXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgaWQgb2Ygc2VjdGlvbklkcykge1xyXG4gICAgICBjb25zdCBrID0gdGhpcy5sb2dpY2FsRmllbGRLZXlGcm9tRGV0YWlsS2V5KGZpZWxkS2V5LCBpZCk7XHJcbiAgICAgIGlmIChrICE9PSBmaWVsZEtleSkgcmV0dXJuIGs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmllbGRLZXk7XHJcbiAgfVxyXG5cclxuICAvKiogRXN0cmFlIGxhIGNoaWF2ZSBjYW1wbyBkYSBgZmllbGRLZXlgIGZsYXQgbyBgc2VjdGlvbklkW2ldLmZpZWxkS2V5YC4gKi9cclxuICBwcml2YXRlIGxvZ2ljYWxGaWVsZEtleUZyb21EZXRhaWxLZXkoXHJcbiAgICBmaWVsZEtleTogc3RyaW5nLFxyXG4gICAgc2VjdGlvbklkOiBzdHJpbmcsXHJcbiAgKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXiR7dGhpcy5lc2NhcGVSZWdFeHAoc2VjdGlvbklkKX1cXFxcW1xcXFxkK1xcXFxdXFxcXC4oLispJGApO1xyXG4gICAgY29uc3QgbSA9IGZpZWxkS2V5Lm1hdGNoKHJlKTtcclxuICAgIHJldHVybiBtID8gbVsxXSA6IGZpZWxkS2V5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBlc2NhcGVSZWdFeHAoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGF1dG9TYXZlSWZOZWVkZWQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy53aXphcmRDb25maWcuYXV0b1NhdmUgJiYgdGhpcy53aXphcmRDb25maWcub25TdGVwU2F2ZSkge1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtQnVpbGRlcj8uZ2V0Rm9ybVZhbHVlKCkgfHwge307XHJcbiAgICAgIGF3YWl0IHRoaXMud2l6YXJkQ29uZmlnLm9uU3RlcFNhdmUoZGF0YSwgdGhpcy5zdGF0ZS5jdXJyZW50U3RlcCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN5bmNXaXphcmRTdGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy53aXphcmRDb25maWcud2l6YXJkSWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBzeW5jRGF0YTogVWlXaXphcmRTeW5jRGF0YSA9IHtcclxuICAgICAgd2l6YXJkSWQ6IHRoaXMud2l6YXJkQ29uZmlnLndpemFyZElkLFxyXG4gICAgICB3aXphcmRTdGF0ZTogeyAuLi50aGlzLnN0YXRlIH0sXHJcbiAgICAgIHdpemFyZFN0ZXBzOiB0aGlzLndpemFyZFN0ZXBHcm91cHMubWFwKChnKSA9PiAoe1xyXG4gICAgICAgIHRpdGxlOiBnWzBdPy53aXphcmRTdGVwPy5zdGVwVGl0bGUgfHwgZ1swXT8udGl0bGUsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGdbMF0/LndpemFyZFN0ZXA/LnN0ZXBEZXNjcmlwdGlvbiB8fCBnWzBdPy5kZXNjcmlwdGlvbixcclxuICAgICAgfSkpLFxyXG4gICAgICBpc1dpemFyZE1vZGU6IHRydWUsXHJcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMud2l6YXJkU3luYy5yZWdpc3RlcldpemFyZCh0aGlzLndpemFyZENvbmZpZy53aXphcmRJZCwgc3luY0RhdGEpO1xyXG4gIH1cclxufVxyXG4iXX0=