@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
@@ -0,0 +1,904 @@
1
+ /**
2
+ * @module ng-ui-system/blackbox
3
+ * Componente debugger BlackBox — aperto in modale fullscreen.
4
+ *
5
+ * Layout:
6
+ * - Header con titolo e chiusura
7
+ * - Tab group: Dashboard | Timeline | Form Events | HTTP Calls
8
+ *
9
+ * Funzionalita:
10
+ * - Timeline unificata (navigazioni + click + form events + HTTP calls)
11
+ * - Form events con valori del form visibili
12
+ * - JSON detail modal al click su dati strutturati
13
+ */
14
+ import { Component, ChangeDetectionStrategy, ChangeDetectorRef, inject, Optional, Inject, } from '@angular/core';
15
+ import { CommonModule } from '@angular/common';
16
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
17
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
18
+ import { MatTabsModule } from '@angular/material/tabs';
19
+ import { LucideAngularModule } from 'lucide-angular';
20
+ import { Subject, interval } from 'rxjs';
21
+ import { takeUntil } from 'rxjs/operators';
22
+ import { UiButtonComponent } from '../button/index';
23
+ import { UiModalService } from '../modal/index';
24
+ import { UiBlackboxService } from './blackbox.service';
25
+ import { UiBlackboxJsonViewerComponent } from './blackbox-json-viewer.component';
26
+ import * as i0 from "@angular/core";
27
+ import * as i1 from "@angular/material/dialog";
28
+ import * as i2 from "@angular/common";
29
+ import * as i3 from "@angular/material/tabs";
30
+ import * as i4 from "lucide-angular";
31
+ export class UiBlackboxDebuggerComponent {
32
+ constructor(dialogRef, dialogData) {
33
+ this.dialogRef = dialogRef;
34
+ this.dialogData = dialogData;
35
+ this.blackbox = inject(UiBlackboxService);
36
+ this.http = inject(HttpClient);
37
+ this.modalService = inject(UiModalService);
38
+ this.cdr = inject(ChangeDetectorRef);
39
+ this.destroy$ = new Subject();
40
+ /** Whether opened inside a dialog. */
41
+ this.isDialogMode = false;
42
+ this.selectedTab = 0;
43
+ this.session = null;
44
+ this.viewingSession = null;
45
+ this.pastSessions = [];
46
+ this.statsCards = [];
47
+ /** Unified timeline entries sorted by timestamp. */
48
+ this.timelineEntries = [];
49
+ this.isDialogMode = !!this.dialogRef;
50
+ }
51
+ get sessionDuration() {
52
+ if (!this.session)
53
+ return '—';
54
+ const ms = Date.now() - this.session.startedAt;
55
+ const s = Math.floor(ms / 1000);
56
+ const m = Math.floor(s / 60);
57
+ const h = Math.floor(m / 60);
58
+ if (h > 0)
59
+ return `${h}h ${m % 60}m`;
60
+ if (m > 0)
61
+ return `${m}m ${s % 60}s`;
62
+ return `${s}s`;
63
+ }
64
+ ngOnInit() {
65
+ this.refresh();
66
+ // Auto-refresh every 2s
67
+ interval(2000)
68
+ .pipe(takeUntil(this.destroy$))
69
+ .subscribe(() => {
70
+ this.refresh();
71
+ this.cdr.markForCheck();
72
+ });
73
+ // Load imported sessions if provided
74
+ if (this.dialogData?.importedSessions?.length) {
75
+ this.pastSessions = this.dialogData.importedSessions;
76
+ this.viewingSession = this.pastSessions[0];
77
+ }
78
+ }
79
+ ngOnDestroy() {
80
+ this.destroy$.next();
81
+ this.destroy$.complete();
82
+ }
83
+ refresh() {
84
+ this.session = this.blackbox.getCurrentSession();
85
+ this.viewingSession = this.viewingSession ?? this.session;
86
+ this.updateStats();
87
+ this.buildTimeline();
88
+ this.blackbox.getSessionHistory().then(sessions => {
89
+ this.pastSessions = sessions.filter(s => s.sessionId !== this.session?.sessionId);
90
+ this.cdr.markForCheck();
91
+ });
92
+ }
93
+ updateStats() {
94
+ const s = this.viewingSession;
95
+ this.statsCards = [
96
+ { icon: 'git-branch', value: s?.steps?.length ?? 0, label: 'Navigazioni' },
97
+ { icon: 'mouse-pointer-click', value: s?.steps?.reduce((sum, st) => sum + st.actions.length, 0) ?? 0, label: 'Click' },
98
+ { icon: 'file-text', value: s?.formEvents?.length ?? 0, label: 'Form Events' },
99
+ { icon: 'external-link', value: s?.calls?.length ?? 0, label: 'HTTP Calls' },
100
+ ];
101
+ }
102
+ /** Builds a unified timeline from all event sources. */
103
+ buildTimeline() {
104
+ const entries = [];
105
+ const s = this.viewingSession;
106
+ if (!s) {
107
+ this.timelineEntries = [];
108
+ return;
109
+ }
110
+ // Navigation steps + their child actions
111
+ for (const step of s.steps) {
112
+ entries.push({
113
+ timestamp: step.timestamp,
114
+ kind: 'navigation',
115
+ route: step.route,
116
+ previousRoute: step.previousRoute,
117
+ actionsCount: step.actions.length,
118
+ });
119
+ for (const action of step.actions) {
120
+ entries.push({
121
+ timestamp: action.timestamp,
122
+ kind: 'click',
123
+ tag: action.target.tag,
124
+ trackId: action.target.trackId,
125
+ text: action.target.text,
126
+ });
127
+ }
128
+ }
129
+ // Form events
130
+ for (const fe of s.formEvents) {
131
+ entries.push({
132
+ timestamp: fe.timestamp,
133
+ kind: 'formEvent',
134
+ route: fe.route,
135
+ formId: fe.formId,
136
+ fieldKey: fe.fieldKey,
137
+ eventType: fe.eventType,
138
+ metadata: fe.metadata,
139
+ });
140
+ }
141
+ // HTTP calls
142
+ for (const call of s.calls) {
143
+ entries.push({
144
+ timestamp: call.timestamp,
145
+ kind: 'httpCall',
146
+ method: call.method,
147
+ url: call.url,
148
+ status: call.status,
149
+ durationMs: call.durationMs,
150
+ requestPayload: call.requestPayload,
151
+ responseHeaders: call.responseHeaders,
152
+ });
153
+ }
154
+ entries.sort((a, b) => a.timestamp - b.timestamp);
155
+ this.timelineEntries = entries;
156
+ }
157
+ viewSession(s) {
158
+ this.viewingSession = s;
159
+ this.updateStats();
160
+ this.buildTimeline();
161
+ this.selectedTab = 1; // switch to timeline
162
+ this.cdr.markForCheck();
163
+ }
164
+ closeDialog() {
165
+ this.dialogRef?.close();
166
+ }
167
+ // ─── JSON Modal ──────────────────────────────────────────────
168
+ openJsonModal(title, data) {
169
+ this.modalService.open(UiBlackboxJsonViewerComponent, {
170
+ size: 'md',
171
+ data: { title, json: data },
172
+ });
173
+ }
174
+ // ─── HTTP Simulator ────────────────────────────────────────────
175
+ simulateGet() {
176
+ this.http.get('https://jsonplaceholder.typicode.com/todos/1', {
177
+ headers: new HttpHeaders({
178
+ 'X-Ui-Blackbox': 'true',
179
+ 'X-Ui-Blackbox-Headers': 'content-type',
180
+ }),
181
+ }).subscribe({ next: () => this.refresh(), error: () => this.refresh() });
182
+ }
183
+ simulatePost() {
184
+ this.http.post('https://jsonplaceholder.typicode.com/posts', {
185
+ title: 'BlackBox Test',
186
+ body: 'Payload fittizio dalla demo',
187
+ userId: 42,
188
+ }, {
189
+ headers: new HttpHeaders({ 'X-Ui-Blackbox': 'true' }),
190
+ }).subscribe({ next: () => this.refresh(), error: () => this.refresh() });
191
+ }
192
+ simulateFail() {
193
+ this.http.get('https://jsonplaceholder.typicode.com/todos/99999999', {
194
+ headers: new HttpHeaders({ 'X-Ui-Blackbox': 'true' }),
195
+ }).subscribe({ next: () => this.refresh(), error: () => this.refresh() });
196
+ }
197
+ // ─── Export / Import / Clear ───────────────────────────────────
198
+ async exportSessions() {
199
+ const blob = await this.blackbox.exportSessions();
200
+ const url = URL.createObjectURL(blob);
201
+ const a = document.createElement('a');
202
+ a.href = url;
203
+ a.download = `blackbox-${new Date().toISOString().slice(0, 10)}.jsonl`;
204
+ a.click();
205
+ URL.revokeObjectURL(url);
206
+ }
207
+ importJsonl() {
208
+ const input = document.createElement('input');
209
+ input.type = 'file';
210
+ input.accept = '.jsonl,.json';
211
+ input.onchange = async (e) => {
212
+ const file = e.target.files[0];
213
+ if (!file)
214
+ return;
215
+ try {
216
+ const text = await file.text();
217
+ const lines = text.trim().split('\n').filter((l) => l.trim());
218
+ const sessions = lines.map((l) => JSON.parse(l));
219
+ this.pastSessions = [...sessions, ...this.pastSessions];
220
+ if (sessions.length > 0) {
221
+ this.viewingSession = sessions[0];
222
+ this.updateStats();
223
+ this.buildTimeline();
224
+ this.selectedTab = 1;
225
+ }
226
+ this.cdr.markForCheck();
227
+ }
228
+ catch {
229
+ console.error('[BlackBox Debugger] Errore parsing JSONL');
230
+ }
231
+ };
232
+ input.click();
233
+ }
234
+ async clearHistory() {
235
+ await this.blackbox.clearHistory();
236
+ this.pastSessions = [];
237
+ this.cdr.markForCheck();
238
+ }
239
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxDebuggerComponent, deps: [{ token: i1.MatDialogRef, optional: true }, { token: MAT_DIALOG_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
240
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UiBlackboxDebuggerComponent, isStandalone: true, selector: "ui-blackbox-debugger", ngImport: i0, template: `
241
+ <div class="dbg-root" [class.dialog-mode]="isDialogMode">
242
+
243
+ <!-- Header -->
244
+ @if (isDialogMode) {
245
+ <div class="dbg-header">
246
+ <div class="dbg-header__left">
247
+ <lucide-angular name="activity" [size]="20" class="dbg-header__icon"></lucide-angular>
248
+ <h2>BlackBox Debugger</h2>
249
+ </div>
250
+ <ui-button icon="x" variant="ghost" size="md" ariaLabel="Chiudi" tooltip="Chiudi" (click)="closeDialog()" />
251
+ </div>
252
+ }
253
+
254
+ <!-- Tabs -->
255
+ <mat-tab-group
256
+ [selectedIndex]="selectedTab"
257
+ (selectedIndexChange)="selectedTab = $event"
258
+ class="dbg-tabs"
259
+ >
260
+ <!-- TAB: Dashboard -->
261
+ <mat-tab>
262
+ <ng-template mat-tab-label>
263
+ <lucide-angular name="monitor" [size]="14" style="margin-right:6px"></lucide-angular>
264
+ Dashboard
265
+ </ng-template>
266
+
267
+ <div class="dbg-tab-content dbg-dashboard">
268
+ <!-- Stats -->
269
+ <div class="dbg-stats">
270
+ <div class="dbg-stat" *ngFor="let s of statsCards">
271
+ <lucide-angular [name]="s.icon" [size]="18" class="dbg-stat__icon"></lucide-angular>
272
+ <span class="dbg-stat__value">{{ s.value }}</span>
273
+ <span class="dbg-stat__label">{{ s.label }}</span>
274
+ </div>
275
+ </div>
276
+ <div class="dbg-dashboard-grid">
277
+ <!-- Session info -->
278
+ <div class="dbg-panel" *ngIf="session">
279
+ <div class="dbg-panel__header">
280
+ <lucide-angular name="info" [size]="14"></lucide-angular>
281
+ Sessione corrente
282
+ </div>
283
+ <div class="dbg-kv">
284
+ <span class="dbg-kv__k">Session ID</span>
285
+ <code class="dbg-kv__v dbg-mono">{{ session.sessionId }}</code>
286
+ <span class="dbg-kv__k">Fingerprint</span>
287
+ <code class="dbg-kv__v dbg-mono">{{ session.fingerprint }}</code>
288
+ <span class="dbg-kv__k">Inizio</span>
289
+ <span class="dbg-kv__v">{{ session.startedAt | date:'dd/MM/yyyy HH:mm:ss' }}</span>
290
+ <span class="dbg-kv__k">Durata</span>
291
+ <span class="dbg-kv__v">{{ sessionDuration }}</span>
292
+ </div>
293
+ </div>
294
+
295
+ <!-- HTTP Simulator -->
296
+ <div class="dbg-panel">
297
+ <div class="dbg-panel__header">
298
+ <lucide-angular name="zap" [size]="14"></lucide-angular>
299
+ HTTP Simulator
300
+ </div>
301
+ <p class="dbg-panel__desc">Genera chiamate fittizie per testare l'interceptor BlackBox.</p>
302
+ <div class="dbg-sim-btns">
303
+ <button class="dbg-sim-btn dbg-sim-btn--get" (click)="simulateGet()">
304
+ <lucide-angular name="play" [size]="12"></lucide-angular> GET /todos/1
305
+ </button>
306
+ <button class="dbg-sim-btn dbg-sim-btn--post" (click)="simulatePost()">
307
+ <lucide-angular name="play" [size]="12"></lucide-angular> POST /posts
308
+ </button>
309
+ <button class="dbg-sim-btn dbg-sim-btn--fail" (click)="simulateFail()">
310
+ <lucide-angular name="play" [size]="12"></lucide-angular> GET /404
311
+ </button>
312
+ </div>
313
+ </div>
314
+
315
+ <!-- Actions -->
316
+ <div class="dbg-panel">
317
+ <div class="dbg-panel__header">
318
+ <lucide-angular name="settings" [size]="14"></lucide-angular>
319
+ Azioni
320
+ </div>
321
+ <div class="dbg-sim-btns">
322
+ <button class="dbg-action-btn" (click)="refresh()">
323
+ <lucide-angular name="refresh-cw" [size]="12"></lucide-angular> Aggiorna
324
+ </button>
325
+ <button class="dbg-action-btn" (click)="exportSessions()">
326
+ <lucide-angular name="download" [size]="12"></lucide-angular> Esporta JSONL
327
+ </button>
328
+ <button class="dbg-action-btn" (click)="importJsonl()">
329
+ <lucide-angular name="upload" [size]="12"></lucide-angular> Importa JSONL
330
+ </button>
331
+ <button class="dbg-action-btn dbg-action-btn--danger" (click)="clearHistory()">
332
+ <lucide-angular name="trash-2" [size]="12"></lucide-angular> Svuota
333
+ </button>
334
+ </div>
335
+ </div>
336
+
337
+ <!-- Past sessions -->
338
+ <div class="dbg-panel" *ngIf="pastSessions.length > 0">
339
+ <div class="dbg-panel__header">
340
+ <lucide-angular name="clock" [size]="14"></lucide-angular>
341
+ Sessioni archiviate ({{ pastSessions.length }})
342
+ </div>
343
+ <div class="dbg-session-list">
344
+ <div class="dbg-session-row" *ngFor="let s of pastSessions" (click)="viewSession(s)">
345
+ <code class="dbg-mono">{{ s.sessionId | slice:0:12 }}...</code>
346
+ <span>{{ s.startedAt | date:'dd/MM HH:mm' }}</span>
347
+ <span>{{ s.steps.length }} steps</span>
348
+ <lucide-angular name="chevron-right" [size]="14" class="dbg-session-row__arrow"></lucide-angular>
349
+ </div>
350
+ </div>
351
+ </div>
352
+ </div>
353
+
354
+ </div>
355
+ </mat-tab>
356
+
357
+ <!-- TAB: Timeline (unified) -->
358
+ <mat-tab>
359
+ <ng-template mat-tab-label>
360
+ <lucide-angular name="git-branch" [size]="14" style="margin-right:6px"></lucide-angular>
361
+ Timeline
362
+ </ng-template>
363
+
364
+ <div class="dbg-tab-content">
365
+ <div class="dbg-timeline" *ngIf="timelineEntries.length; else noData">
366
+ <div class="dbg-tl-entry"
367
+ *ngFor="let entry of timelineEntries; let last = last"
368
+ >
369
+ <div class="dbg-tl-entry__row">
370
+ <!-- Dot -->
371
+ <div class="dbg-tl-dot" [ngClass]="'dbg-tl-dot--' + entry.kind"></div>
372
+
373
+ <!-- Time -->
374
+ <span class="dbg-tl-entry__time dbg-mono">{{ entry.timestamp | date:'HH:mm:ss.SSS' }}</span>
375
+
376
+ <!-- Kind badge -->
377
+ <span class="dbg-badge" [ngClass]="'dbg-badge--tl-' + entry.kind">{{ entry.kind }}</span>
378
+
379
+ <!-- Content based on kind -->
380
+ <ng-container [ngSwitch]="entry.kind">
381
+
382
+ <!-- Navigation -->
383
+ <ng-container *ngSwitchCase="'navigation'">
384
+ <code class="dbg-tl-entry__route">{{ entry.route }}</code>
385
+ <span class="dbg-tl-entry__detail">{{ entry.actionsCount }} azioni</span>
386
+ </ng-container>
387
+
388
+ <!-- Click -->
389
+ <ng-container *ngSwitchCase="'click'">
390
+ <code class="dbg-tl-entry__target">&lt;{{ entry.tag }}&gt;</code>
391
+ <span class="dbg-badge dbg-badge--id" *ngIf="entry.trackId">#{{ entry.trackId }}</span>
392
+ <span class="dbg-tl-entry__text" *ngIf="entry.text">{{ entry.text }}</span>
393
+ </ng-container>
394
+
395
+ <!-- Form event -->
396
+ <ng-container *ngSwitchCase="'formEvent'">
397
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + entry.eventType">{{ entry.eventType }}</span>
398
+ <code class="dbg-tl-entry__field">{{ entry.formId }}.{{ entry.fieldKey }}</code>
399
+ <button class="dbg-json-btn" *ngIf="entry.metadata" (click)="openJsonModal('Form Event — ' + entry.fieldKey, entry.metadata)">
400
+ <lucide-angular name="code" [size]="12"></lucide-angular>
401
+ </button>
402
+ </ng-container>
403
+
404
+ <!-- HTTP call -->
405
+ <ng-container *ngSwitchCase="'httpCall'">
406
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + (entry.method ?? '').toLowerCase()">{{ entry.method }}</span>
407
+ <code class="dbg-tl-entry__url">{{ entry.url }}</code>
408
+ <span class="dbg-status" [class.dbg-status--ok]="entry.status && entry.status < 400"
409
+ [class.dbg-status--err]="!entry.status || entry.status! >= 400">
410
+ {{ entry.status ?? '—' }}
411
+ </span>
412
+ <span class="dbg-tl-entry__detail" *ngIf="entry.durationMs">{{ entry.durationMs }}ms</span>
413
+ <button class="dbg-json-btn" *ngIf="entry.requestPayload" (click)="openJsonModal('HTTP Payload', entry.requestPayload)">
414
+ <lucide-angular name="code" [size]="12"></lucide-angular>
415
+ </button>
416
+ </ng-container>
417
+
418
+ </ng-container>
419
+ </div>
420
+
421
+ <div class="dbg-tl-line" *ngIf="!last"></div>
422
+ </div>
423
+ </div>
424
+
425
+ <ng-template #noData>
426
+ <div class="dbg-empty">
427
+ <lucide-angular name="git-branch" [size]="48" style="opacity:0.3"></lucide-angular>
428
+ <p>Nessun evento registrato</p>
429
+ </div>
430
+ </ng-template>
431
+ </div>
432
+ </mat-tab>
433
+
434
+ <!-- TAB: Form Events -->
435
+ <mat-tab>
436
+ <ng-template mat-tab-label>
437
+ <lucide-angular name="file-text" [size]="14" style="margin-right:6px"></lucide-angular>
438
+ Form Events
439
+ </ng-template>
440
+
441
+ <div class="dbg-tab-content">
442
+ <div class="dbg-table-wrap" *ngIf="viewingSession?.formEvents?.length; else noFormData">
443
+ <table class="dbg-table">
444
+ <thead>
445
+ <tr>
446
+ <th>Ora</th>
447
+ <th>Rotta</th>
448
+ <th>Form</th>
449
+ <th>Campo</th>
450
+ <th>Evento</th>
451
+ <th>Valore campo</th>
452
+ <th>Form completo</th>
453
+ <th>Dettagli</th>
454
+ </tr>
455
+ </thead>
456
+ <tbody>
457
+ <tr *ngFor="let ev of viewingSession!.formEvents">
458
+ <td class="dbg-mono">{{ ev.timestamp | date:'HH:mm:ss.SSS' }}</td>
459
+ <td class="dbg-mono dbg-truncate">{{ ev.route }}</td>
460
+ <td>{{ ev.formId }}</td>
461
+ <td><code>{{ ev.fieldKey }}</code></td>
462
+ <td>
463
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + ev.eventType">{{ ev.eventType }}</span>
464
+ </td>
465
+ <td>
466
+ <button class="dbg-json-btn" *ngIf="ev.metadata?.value !== undefined"
467
+ (click)="openJsonModal('Valore: ' + ev.fieldKey, ev.metadata!.value)">
468
+ <lucide-angular name="code" [size]="12"></lucide-angular> valore
469
+ </button>
470
+ <span class="dbg-na" *ngIf="ev.metadata?.value === undefined">—</span>
471
+ </td>
472
+ <td>
473
+ <button class="dbg-json-btn" *ngIf="ev.metadata?.formValues"
474
+ (click)="openJsonModal('Form Values — ' + ev.formId, ev.metadata!.formValues)">
475
+ <lucide-angular name="code" [size]="12"></lucide-angular> form
476
+ </button>
477
+ <span class="dbg-na" *ngIf="!ev.metadata?.formValues">—</span>
478
+ </td>
479
+ <td>
480
+ <button class="dbg-json-btn" *ngIf="ev.metadata"
481
+ (click)="openJsonModal('Dettagli evento', ev.metadata)">
482
+ <lucide-angular name="code" [size]="12"></lucide-angular>
483
+ </button>
484
+ </td>
485
+ </tr>
486
+ </tbody>
487
+ </table>
488
+ </div>
489
+
490
+ <ng-template #noFormData>
491
+ <div class="dbg-empty">
492
+ <lucide-angular name="file-text" [size]="48" style="opacity:0.3"></lucide-angular>
493
+ <p>Nessun form event registrato</p>
494
+ </div>
495
+ </ng-template>
496
+ </div>
497
+ </mat-tab>
498
+
499
+ <!-- TAB: HTTP Calls -->
500
+ <mat-tab>
501
+ <ng-template mat-tab-label>
502
+ <lucide-angular name="external-link" [size]="14" style="margin-right:6px"></lucide-angular>
503
+ HTTP Calls
504
+ </ng-template>
505
+
506
+ <div class="dbg-tab-content">
507
+ <div class="dbg-table-wrap" *ngIf="viewingSession?.calls?.length; else noHttpData">
508
+ <table class="dbg-table">
509
+ <thead>
510
+ <tr>
511
+ <th>Ora</th>
512
+ <th>Metodo</th>
513
+ <th>URL</th>
514
+ <th>Status</th>
515
+ <th>Durata</th>
516
+ <th>Payload</th>
517
+ <th>Headers</th>
518
+ </tr>
519
+ </thead>
520
+ <tbody>
521
+ <tr *ngFor="let call of viewingSession!.calls">
522
+ <td class="dbg-mono">{{ call.timestamp | date:'HH:mm:ss.SSS' }}</td>
523
+ <td>
524
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + call.method.toLowerCase()">{{ call.method }}</span>
525
+ </td>
526
+ <td class="dbg-mono dbg-truncate">{{ call.url }}</td>
527
+ <td>
528
+ <span class="dbg-status" [class.dbg-status--ok]="call.status && call.status < 400"
529
+ [class.dbg-status--err]="!call.status || call.status >= 400">
530
+ {{ call.status ?? '—' }}
531
+ </span>
532
+ </td>
533
+ <td class="dbg-mono">{{ call.durationMs }}ms</td>
534
+ <td>
535
+ <button class="dbg-json-btn" *ngIf="call.requestPayload"
536
+ (click)="openJsonModal('Payload — ' + call.method + ' ' + call.url, call.requestPayload)">
537
+ <lucide-angular name="code" [size]="12"></lucide-angular>
538
+ </button>
539
+ <span class="dbg-na" *ngIf="!call.requestPayload">—</span>
540
+ </td>
541
+ <td>
542
+ <button class="dbg-json-btn" *ngIf="call.responseHeaders"
543
+ (click)="openJsonModal('Response Headers', call.responseHeaders)">
544
+ <lucide-angular name="code" [size]="12"></lucide-angular>
545
+ </button>
546
+ <span class="dbg-na" *ngIf="!call.responseHeaders">—</span>
547
+ </td>
548
+ </tr>
549
+ </tbody>
550
+ </table>
551
+ </div>
552
+
553
+ <ng-template #noHttpData>
554
+ <div class="dbg-empty">
555
+ <lucide-angular name="external-link" [size]="48" style="opacity:0.3"></lucide-angular>
556
+ <p>Nessuna chiamata HTTP intercettata</p>
557
+ </div>
558
+ </ng-template>
559
+ </div>
560
+ </mat-tab>
561
+ </mat-tab-group>
562
+ </div>
563
+ `, isInline: true, styles: ["@use \"../../core/tokens/mixins\" as ui;.dbg-root{display:flex;flex-direction:column;height:100vh;background:var(--ui-color-bg-subtle);&.dialog-mode{height:100%}}.dbg-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-surface);border-bottom:1px solid var(--ui-color-border);box-shadow:var(--ui-shadow-sm);h2{margin:0;font-size:var(--ui-font-size-lg);font-weight:500;color:var(--ui-color-text)}}.dbg-header__left{display:flex;align-items:center;gap:var(--ui-spacing-2)}.dbg-header__icon{color:var(--ui-color-primary)}.dbg-tabs{flex:1;display:flex;flex-direction:column;overflow:hidden;::ng-deep .mat-mdc-tab-header{background:var(--ui-color-surface);border-bottom:1px solid var(--ui-color-border)}::ng-deep .mat-mdc-tab .mdc-tab__text-label{color:var(--ui-color-text-secondary);font-weight:500;font-size:var(--ui-font-size-sm)}::ng-deep .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--ui-color-primary);font-weight:600}::ng-deep .mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--ui-color-primary);border-width:3px}::ng-deep .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden}::ng-deep .mat-mdc-tab-body{height:100%}::ng-deep .mat-mdc-tab-body-content{height:100%;overflow:auto}}.dbg-tab-content{padding:var(--ui-spacing-4);max-width:1200px;margin:0 auto;width:100%}.dbg-dashboard{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.dbg-dashboard-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--ui-spacing-4)}.dbg-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--ui-spacing-3)}.dbg-stat{display:flex;flex-direction:column;align-items:center;gap:4px;padding:var(--ui-spacing-4);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg);transition:box-shadow .15s;&:hover{box-shadow:var(--ui-shadow-md)}}.dbg-stat__icon{color:var(--ui-color-primary);opacity:.7}.dbg-stat__value{font-size:var(--ui-font-size-2xl);font-weight:var(--ui-font-weight-bold);color:var(--ui-color-primary);font-family:var(--ui-font-family-mono)}.dbg-stat__label{font-size:11px;color:var(--ui-color-text-muted);text-transform:uppercase;letter-spacing:.05em}.dbg-panel{background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg);padding:var(--ui-spacing-4)}.dbg-panel__header{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-3)}.dbg-panel__desc{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-3)}.dbg-kv{display:grid;grid-template-columns:100px 1fr;gap:var(--ui-spacing-2) var(--ui-spacing-4);font-size:var(--ui-font-size-sm)}.dbg-kv__k{font-weight:600;color:var(--ui-color-text-secondary);font-size:11px;text-transform:uppercase;letter-spacing:.03em}.dbg-kv__v{color:var(--ui-color-text)}.dbg-mono{font-family:var(--ui-font-family-mono);font-size:var(--ui-font-size-xs)}.dbg-sim-btns{display:flex;gap:var(--ui-spacing-2);flex-wrap:wrap}.dbg-sim-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);font-weight:600;cursor:pointer;border:1px solid transparent;transition:all .15s}.dbg-sim-btn--get{background:#dcfce7;color:#166534;border-color:#86efac;&:hover{background:#bbf7d0}}.dbg-sim-btn--post{background:#dbeafe;color:#1e40af;border-color:#93c5fd;&:hover{background:#bfdbfe}}.dbg-sim-btn--fail{background:#fee2e2;color:#991b1b;border-color:#fca5a5;&:hover{background:#fecaca}}.dbg-action-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);font-weight:600;cursor:pointer;background:var(--ui-color-surface);color:var(--ui-color-text);border:1px solid var(--ui-color-border);transition:all .15s;&:hover{background:var(--ui-color-surface-hover)}}.dbg-action-btn--danger{color:#dc2626;border-color:#fca5a5}.dbg-action-btn--danger:hover{background:#fee2e2}.dbg-session-list{display:flex;flex-direction:column;gap:var(--ui-spacing-1)}.dbg-session-row{display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) var(--ui-spacing-3);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);cursor:pointer;transition:all .12s;&:hover{border-color:var(--ui-color-primary);background:color-mix(in srgb,var(--ui-color-primary) 4%,transparent)}}.dbg-session-row__arrow{margin-left:auto;color:var(--ui-color-text-muted)}.dbg-timeline{position:relative;padding-left:24px}.dbg-tl-entry{position:relative;margin-bottom:2px}.dbg-tl-entry__row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:4px var(--ui-spacing-3);border-radius:var(--ui-radius-md);font-size:12px;transition:background .12s;&:hover{background:var(--ui-color-surface-hover)}}.dbg-tl-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;position:absolute;left:-16px;top:10px}.dbg-tl-dot--navigation{background:var(--ui-color-primary);width:10px;height:10px;left:-17px;top:9px}.dbg-tl-dot--click{background:var(--ui-color-border-strong)}.dbg-tl-dot--formEvent{background:#f59e0b}.dbg-tl-dot--httpCall{background:#3b82f6}.dbg-tl-line{position:absolute;left:-12px;top:24px;bottom:-2px;width:2px;background:var(--ui-color-border)}.dbg-tl-entry__time{color:var(--ui-color-text-muted);min-width:85px;font-size:11px}.dbg-tl-entry__route{font-family:var(--ui-font-family-mono);font-weight:600;color:var(--ui-color-text);font-size:12px}.dbg-tl-entry__target,.dbg-tl-entry__field{font-family:var(--ui-font-family-mono);color:var(--ui-color-text-secondary);font-size:11px}.dbg-tl-entry__url{font-family:var(--ui-font-family-mono);color:var(--ui-color-text-secondary);font-size:11px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dbg-tl-entry__detail{font-size:11px;color:var(--ui-color-text-muted)}.dbg-tl-entry__text{color:var(--ui-color-text-muted);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.dbg-json-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--ui-radius-sm);font-size:10px;font-weight:600;cursor:pointer;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-secondary);border:1px solid var(--ui-color-border);transition:all .12s;&:hover{background:var(--ui-color-surface-hover);color:var(--ui-color-primary);border-color:var(--ui-color-primary)}}.dbg-na{color:var(--ui-color-text-muted);font-size:11px}.dbg-table-wrap{overflow-x:auto;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg)}.dbg-table{width:100%;border-collapse:collapse;font-size:var(--ui-font-size-xs);th,td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--ui-color-border)}th{background:var(--ui-color-bg-subtle);font-weight:600;color:var(--ui-color-text-secondary);text-transform:uppercase;letter-spacing:.05em;font-size:10px}tbody tr:hover{background:var(--ui-color-surface-hover)}tbody tr:last-child td{border-bottom:none}}.dbg-truncate{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dbg-badge{display:inline-block;padding:1px 8px;border-radius:var(--ui-radius-full);font-size:10px;font-weight:600;white-space:nowrap}.dbg-badge--tl-navigation{background:color-mix(in srgb,var(--ui-color-primary) 12%,transparent);color:var(--ui-color-primary)}.dbg-badge--tl-click{background:#f1f5f9;color:#475569}.dbg-badge--tl-formEvent{background:#fef3c7;color:#92400e}.dbg-badge--tl-httpCall{background:#dbeafe;color:#1e40af}.dbg-badge--action{background:color-mix(in srgb,var(--ui-color-primary) 10%,transparent);color:var(--ui-color-primary);text-transform:uppercase}.dbg-badge--id{background:color-mix(in srgb,var(--ui-color-primary) 8%,transparent);color:var(--ui-color-primary)}.dbg-badge--focus{background:#dbeafe;color:#1e40af}.dbg-badge--blur{background:#f1f5f9;color:#475569}.dbg-badge--valueChange{background:#fef3c7;color:#92400e}.dbg-badge--validationError{background:#fee2e2;color:#991b1b}.dbg-badge--get{background:#dcfce7;color:#166534}.dbg-badge--post{background:#dbeafe;color:#1e40af}.dbg-badge--put{background:#fef3c7;color:#92400e}.dbg-badge--delete{background:#fee2e2;color:#991b1b}.dbg-status{font-family:var(--ui-font-family-mono);font-weight:600}.dbg-status--ok{color:#16a34a}.dbg-status--err{color:#dc2626}.dbg-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--ui-spacing-12);color:var(--ui-color-text-muted);text-align:center;p{margin:var(--ui-spacing-3) 0 0;font-size:var(--ui-font-size-sm)}}@media (max-width: 640px){.dbg-stats{grid-template-columns:repeat(2,1fr)}.dbg-dashboard-grid{grid-template-columns:1fr}.dbg-sim-btns{flex-direction:column}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "ngmodule", type: MatTabsModule }, { kind: "directive", type: i3.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i4.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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
564
+ }
565
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UiBlackboxDebuggerComponent, decorators: [{
566
+ type: Component,
567
+ args: [{ selector: 'ui-blackbox-debugger', standalone: true, imports: [
568
+ CommonModule,
569
+ MatTabsModule,
570
+ LucideAngularModule,
571
+ UiButtonComponent,
572
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: `
573
+ <div class="dbg-root" [class.dialog-mode]="isDialogMode">
574
+
575
+ <!-- Header -->
576
+ @if (isDialogMode) {
577
+ <div class="dbg-header">
578
+ <div class="dbg-header__left">
579
+ <lucide-angular name="activity" [size]="20" class="dbg-header__icon"></lucide-angular>
580
+ <h2>BlackBox Debugger</h2>
581
+ </div>
582
+ <ui-button icon="x" variant="ghost" size="md" ariaLabel="Chiudi" tooltip="Chiudi" (click)="closeDialog()" />
583
+ </div>
584
+ }
585
+
586
+ <!-- Tabs -->
587
+ <mat-tab-group
588
+ [selectedIndex]="selectedTab"
589
+ (selectedIndexChange)="selectedTab = $event"
590
+ class="dbg-tabs"
591
+ >
592
+ <!-- TAB: Dashboard -->
593
+ <mat-tab>
594
+ <ng-template mat-tab-label>
595
+ <lucide-angular name="monitor" [size]="14" style="margin-right:6px"></lucide-angular>
596
+ Dashboard
597
+ </ng-template>
598
+
599
+ <div class="dbg-tab-content dbg-dashboard">
600
+ <!-- Stats -->
601
+ <div class="dbg-stats">
602
+ <div class="dbg-stat" *ngFor="let s of statsCards">
603
+ <lucide-angular [name]="s.icon" [size]="18" class="dbg-stat__icon"></lucide-angular>
604
+ <span class="dbg-stat__value">{{ s.value }}</span>
605
+ <span class="dbg-stat__label">{{ s.label }}</span>
606
+ </div>
607
+ </div>
608
+ <div class="dbg-dashboard-grid">
609
+ <!-- Session info -->
610
+ <div class="dbg-panel" *ngIf="session">
611
+ <div class="dbg-panel__header">
612
+ <lucide-angular name="info" [size]="14"></lucide-angular>
613
+ Sessione corrente
614
+ </div>
615
+ <div class="dbg-kv">
616
+ <span class="dbg-kv__k">Session ID</span>
617
+ <code class="dbg-kv__v dbg-mono">{{ session.sessionId }}</code>
618
+ <span class="dbg-kv__k">Fingerprint</span>
619
+ <code class="dbg-kv__v dbg-mono">{{ session.fingerprint }}</code>
620
+ <span class="dbg-kv__k">Inizio</span>
621
+ <span class="dbg-kv__v">{{ session.startedAt | date:'dd/MM/yyyy HH:mm:ss' }}</span>
622
+ <span class="dbg-kv__k">Durata</span>
623
+ <span class="dbg-kv__v">{{ sessionDuration }}</span>
624
+ </div>
625
+ </div>
626
+
627
+ <!-- HTTP Simulator -->
628
+ <div class="dbg-panel">
629
+ <div class="dbg-panel__header">
630
+ <lucide-angular name="zap" [size]="14"></lucide-angular>
631
+ HTTP Simulator
632
+ </div>
633
+ <p class="dbg-panel__desc">Genera chiamate fittizie per testare l'interceptor BlackBox.</p>
634
+ <div class="dbg-sim-btns">
635
+ <button class="dbg-sim-btn dbg-sim-btn--get" (click)="simulateGet()">
636
+ <lucide-angular name="play" [size]="12"></lucide-angular> GET /todos/1
637
+ </button>
638
+ <button class="dbg-sim-btn dbg-sim-btn--post" (click)="simulatePost()">
639
+ <lucide-angular name="play" [size]="12"></lucide-angular> POST /posts
640
+ </button>
641
+ <button class="dbg-sim-btn dbg-sim-btn--fail" (click)="simulateFail()">
642
+ <lucide-angular name="play" [size]="12"></lucide-angular> GET /404
643
+ </button>
644
+ </div>
645
+ </div>
646
+
647
+ <!-- Actions -->
648
+ <div class="dbg-panel">
649
+ <div class="dbg-panel__header">
650
+ <lucide-angular name="settings" [size]="14"></lucide-angular>
651
+ Azioni
652
+ </div>
653
+ <div class="dbg-sim-btns">
654
+ <button class="dbg-action-btn" (click)="refresh()">
655
+ <lucide-angular name="refresh-cw" [size]="12"></lucide-angular> Aggiorna
656
+ </button>
657
+ <button class="dbg-action-btn" (click)="exportSessions()">
658
+ <lucide-angular name="download" [size]="12"></lucide-angular> Esporta JSONL
659
+ </button>
660
+ <button class="dbg-action-btn" (click)="importJsonl()">
661
+ <lucide-angular name="upload" [size]="12"></lucide-angular> Importa JSONL
662
+ </button>
663
+ <button class="dbg-action-btn dbg-action-btn--danger" (click)="clearHistory()">
664
+ <lucide-angular name="trash-2" [size]="12"></lucide-angular> Svuota
665
+ </button>
666
+ </div>
667
+ </div>
668
+
669
+ <!-- Past sessions -->
670
+ <div class="dbg-panel" *ngIf="pastSessions.length > 0">
671
+ <div class="dbg-panel__header">
672
+ <lucide-angular name="clock" [size]="14"></lucide-angular>
673
+ Sessioni archiviate ({{ pastSessions.length }})
674
+ </div>
675
+ <div class="dbg-session-list">
676
+ <div class="dbg-session-row" *ngFor="let s of pastSessions" (click)="viewSession(s)">
677
+ <code class="dbg-mono">{{ s.sessionId | slice:0:12 }}...</code>
678
+ <span>{{ s.startedAt | date:'dd/MM HH:mm' }}</span>
679
+ <span>{{ s.steps.length }} steps</span>
680
+ <lucide-angular name="chevron-right" [size]="14" class="dbg-session-row__arrow"></lucide-angular>
681
+ </div>
682
+ </div>
683
+ </div>
684
+ </div>
685
+
686
+ </div>
687
+ </mat-tab>
688
+
689
+ <!-- TAB: Timeline (unified) -->
690
+ <mat-tab>
691
+ <ng-template mat-tab-label>
692
+ <lucide-angular name="git-branch" [size]="14" style="margin-right:6px"></lucide-angular>
693
+ Timeline
694
+ </ng-template>
695
+
696
+ <div class="dbg-tab-content">
697
+ <div class="dbg-timeline" *ngIf="timelineEntries.length; else noData">
698
+ <div class="dbg-tl-entry"
699
+ *ngFor="let entry of timelineEntries; let last = last"
700
+ >
701
+ <div class="dbg-tl-entry__row">
702
+ <!-- Dot -->
703
+ <div class="dbg-tl-dot" [ngClass]="'dbg-tl-dot--' + entry.kind"></div>
704
+
705
+ <!-- Time -->
706
+ <span class="dbg-tl-entry__time dbg-mono">{{ entry.timestamp | date:'HH:mm:ss.SSS' }}</span>
707
+
708
+ <!-- Kind badge -->
709
+ <span class="dbg-badge" [ngClass]="'dbg-badge--tl-' + entry.kind">{{ entry.kind }}</span>
710
+
711
+ <!-- Content based on kind -->
712
+ <ng-container [ngSwitch]="entry.kind">
713
+
714
+ <!-- Navigation -->
715
+ <ng-container *ngSwitchCase="'navigation'">
716
+ <code class="dbg-tl-entry__route">{{ entry.route }}</code>
717
+ <span class="dbg-tl-entry__detail">{{ entry.actionsCount }} azioni</span>
718
+ </ng-container>
719
+
720
+ <!-- Click -->
721
+ <ng-container *ngSwitchCase="'click'">
722
+ <code class="dbg-tl-entry__target">&lt;{{ entry.tag }}&gt;</code>
723
+ <span class="dbg-badge dbg-badge--id" *ngIf="entry.trackId">#{{ entry.trackId }}</span>
724
+ <span class="dbg-tl-entry__text" *ngIf="entry.text">{{ entry.text }}</span>
725
+ </ng-container>
726
+
727
+ <!-- Form event -->
728
+ <ng-container *ngSwitchCase="'formEvent'">
729
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + entry.eventType">{{ entry.eventType }}</span>
730
+ <code class="dbg-tl-entry__field">{{ entry.formId }}.{{ entry.fieldKey }}</code>
731
+ <button class="dbg-json-btn" *ngIf="entry.metadata" (click)="openJsonModal('Form Event — ' + entry.fieldKey, entry.metadata)">
732
+ <lucide-angular name="code" [size]="12"></lucide-angular>
733
+ </button>
734
+ </ng-container>
735
+
736
+ <!-- HTTP call -->
737
+ <ng-container *ngSwitchCase="'httpCall'">
738
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + (entry.method ?? '').toLowerCase()">{{ entry.method }}</span>
739
+ <code class="dbg-tl-entry__url">{{ entry.url }}</code>
740
+ <span class="dbg-status" [class.dbg-status--ok]="entry.status && entry.status < 400"
741
+ [class.dbg-status--err]="!entry.status || entry.status! >= 400">
742
+ {{ entry.status ?? '—' }}
743
+ </span>
744
+ <span class="dbg-tl-entry__detail" *ngIf="entry.durationMs">{{ entry.durationMs }}ms</span>
745
+ <button class="dbg-json-btn" *ngIf="entry.requestPayload" (click)="openJsonModal('HTTP Payload', entry.requestPayload)">
746
+ <lucide-angular name="code" [size]="12"></lucide-angular>
747
+ </button>
748
+ </ng-container>
749
+
750
+ </ng-container>
751
+ </div>
752
+
753
+ <div class="dbg-tl-line" *ngIf="!last"></div>
754
+ </div>
755
+ </div>
756
+
757
+ <ng-template #noData>
758
+ <div class="dbg-empty">
759
+ <lucide-angular name="git-branch" [size]="48" style="opacity:0.3"></lucide-angular>
760
+ <p>Nessun evento registrato</p>
761
+ </div>
762
+ </ng-template>
763
+ </div>
764
+ </mat-tab>
765
+
766
+ <!-- TAB: Form Events -->
767
+ <mat-tab>
768
+ <ng-template mat-tab-label>
769
+ <lucide-angular name="file-text" [size]="14" style="margin-right:6px"></lucide-angular>
770
+ Form Events
771
+ </ng-template>
772
+
773
+ <div class="dbg-tab-content">
774
+ <div class="dbg-table-wrap" *ngIf="viewingSession?.formEvents?.length; else noFormData">
775
+ <table class="dbg-table">
776
+ <thead>
777
+ <tr>
778
+ <th>Ora</th>
779
+ <th>Rotta</th>
780
+ <th>Form</th>
781
+ <th>Campo</th>
782
+ <th>Evento</th>
783
+ <th>Valore campo</th>
784
+ <th>Form completo</th>
785
+ <th>Dettagli</th>
786
+ </tr>
787
+ </thead>
788
+ <tbody>
789
+ <tr *ngFor="let ev of viewingSession!.formEvents">
790
+ <td class="dbg-mono">{{ ev.timestamp | date:'HH:mm:ss.SSS' }}</td>
791
+ <td class="dbg-mono dbg-truncate">{{ ev.route }}</td>
792
+ <td>{{ ev.formId }}</td>
793
+ <td><code>{{ ev.fieldKey }}</code></td>
794
+ <td>
795
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + ev.eventType">{{ ev.eventType }}</span>
796
+ </td>
797
+ <td>
798
+ <button class="dbg-json-btn" *ngIf="ev.metadata?.value !== undefined"
799
+ (click)="openJsonModal('Valore: ' + ev.fieldKey, ev.metadata!.value)">
800
+ <lucide-angular name="code" [size]="12"></lucide-angular> valore
801
+ </button>
802
+ <span class="dbg-na" *ngIf="ev.metadata?.value === undefined">—</span>
803
+ </td>
804
+ <td>
805
+ <button class="dbg-json-btn" *ngIf="ev.metadata?.formValues"
806
+ (click)="openJsonModal('Form Values — ' + ev.formId, ev.metadata!.formValues)">
807
+ <lucide-angular name="code" [size]="12"></lucide-angular> form
808
+ </button>
809
+ <span class="dbg-na" *ngIf="!ev.metadata?.formValues">—</span>
810
+ </td>
811
+ <td>
812
+ <button class="dbg-json-btn" *ngIf="ev.metadata"
813
+ (click)="openJsonModal('Dettagli evento', ev.metadata)">
814
+ <lucide-angular name="code" [size]="12"></lucide-angular>
815
+ </button>
816
+ </td>
817
+ </tr>
818
+ </tbody>
819
+ </table>
820
+ </div>
821
+
822
+ <ng-template #noFormData>
823
+ <div class="dbg-empty">
824
+ <lucide-angular name="file-text" [size]="48" style="opacity:0.3"></lucide-angular>
825
+ <p>Nessun form event registrato</p>
826
+ </div>
827
+ </ng-template>
828
+ </div>
829
+ </mat-tab>
830
+
831
+ <!-- TAB: HTTP Calls -->
832
+ <mat-tab>
833
+ <ng-template mat-tab-label>
834
+ <lucide-angular name="external-link" [size]="14" style="margin-right:6px"></lucide-angular>
835
+ HTTP Calls
836
+ </ng-template>
837
+
838
+ <div class="dbg-tab-content">
839
+ <div class="dbg-table-wrap" *ngIf="viewingSession?.calls?.length; else noHttpData">
840
+ <table class="dbg-table">
841
+ <thead>
842
+ <tr>
843
+ <th>Ora</th>
844
+ <th>Metodo</th>
845
+ <th>URL</th>
846
+ <th>Status</th>
847
+ <th>Durata</th>
848
+ <th>Payload</th>
849
+ <th>Headers</th>
850
+ </tr>
851
+ </thead>
852
+ <tbody>
853
+ <tr *ngFor="let call of viewingSession!.calls">
854
+ <td class="dbg-mono">{{ call.timestamp | date:'HH:mm:ss.SSS' }}</td>
855
+ <td>
856
+ <span class="dbg-badge" [ngClass]="'dbg-badge--' + call.method.toLowerCase()">{{ call.method }}</span>
857
+ </td>
858
+ <td class="dbg-mono dbg-truncate">{{ call.url }}</td>
859
+ <td>
860
+ <span class="dbg-status" [class.dbg-status--ok]="call.status && call.status < 400"
861
+ [class.dbg-status--err]="!call.status || call.status >= 400">
862
+ {{ call.status ?? '—' }}
863
+ </span>
864
+ </td>
865
+ <td class="dbg-mono">{{ call.durationMs }}ms</td>
866
+ <td>
867
+ <button class="dbg-json-btn" *ngIf="call.requestPayload"
868
+ (click)="openJsonModal('Payload — ' + call.method + ' ' + call.url, call.requestPayload)">
869
+ <lucide-angular name="code" [size]="12"></lucide-angular>
870
+ </button>
871
+ <span class="dbg-na" *ngIf="!call.requestPayload">—</span>
872
+ </td>
873
+ <td>
874
+ <button class="dbg-json-btn" *ngIf="call.responseHeaders"
875
+ (click)="openJsonModal('Response Headers', call.responseHeaders)">
876
+ <lucide-angular name="code" [size]="12"></lucide-angular>
877
+ </button>
878
+ <span class="dbg-na" *ngIf="!call.responseHeaders">—</span>
879
+ </td>
880
+ </tr>
881
+ </tbody>
882
+ </table>
883
+ </div>
884
+
885
+ <ng-template #noHttpData>
886
+ <div class="dbg-empty">
887
+ <lucide-angular name="external-link" [size]="48" style="opacity:0.3"></lucide-angular>
888
+ <p>Nessuna chiamata HTTP intercettata</p>
889
+ </div>
890
+ </ng-template>
891
+ </div>
892
+ </mat-tab>
893
+ </mat-tab-group>
894
+ </div>
895
+ `, styles: ["@use \"../../core/tokens/mixins\" as ui;.dbg-root{display:flex;flex-direction:column;height:100vh;background:var(--ui-color-bg-subtle);&.dialog-mode{height:100%}}.dbg-header{display:flex;align-items:center;justify-content:space-between;padding:var(--ui-spacing-3) var(--ui-spacing-4);background:var(--ui-color-surface);border-bottom:1px solid var(--ui-color-border);box-shadow:var(--ui-shadow-sm);h2{margin:0;font-size:var(--ui-font-size-lg);font-weight:500;color:var(--ui-color-text)}}.dbg-header__left{display:flex;align-items:center;gap:var(--ui-spacing-2)}.dbg-header__icon{color:var(--ui-color-primary)}.dbg-tabs{flex:1;display:flex;flex-direction:column;overflow:hidden;::ng-deep .mat-mdc-tab-header{background:var(--ui-color-surface);border-bottom:1px solid var(--ui-color-border)}::ng-deep .mat-mdc-tab .mdc-tab__text-label{color:var(--ui-color-text-secondary);font-weight:500;font-size:var(--ui-font-size-sm)}::ng-deep .mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--ui-color-primary);font-weight:600}::ng-deep .mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--ui-color-primary);border-width:3px}::ng-deep .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden}::ng-deep .mat-mdc-tab-body{height:100%}::ng-deep .mat-mdc-tab-body-content{height:100%;overflow:auto}}.dbg-tab-content{padding:var(--ui-spacing-4);max-width:1200px;margin:0 auto;width:100%}.dbg-dashboard{display:flex;flex-direction:column;gap:var(--ui-spacing-4)}.dbg-dashboard-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--ui-spacing-4)}.dbg-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--ui-spacing-3)}.dbg-stat{display:flex;flex-direction:column;align-items:center;gap:4px;padding:var(--ui-spacing-4);background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg);transition:box-shadow .15s;&:hover{box-shadow:var(--ui-shadow-md)}}.dbg-stat__icon{color:var(--ui-color-primary);opacity:.7}.dbg-stat__value{font-size:var(--ui-font-size-2xl);font-weight:var(--ui-font-weight-bold);color:var(--ui-color-primary);font-family:var(--ui-font-family-mono)}.dbg-stat__label{font-size:11px;color:var(--ui-color-text-muted);text-transform:uppercase;letter-spacing:.05em}.dbg-panel{background:var(--ui-color-surface);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg);padding:var(--ui-spacing-4)}.dbg-panel__header{display:flex;align-items:center;gap:var(--ui-spacing-2);font-size:var(--ui-font-size-sm);font-weight:var(--ui-font-weight-semibold);color:var(--ui-color-text);margin-bottom:var(--ui-spacing-3)}.dbg-panel__desc{font-size:var(--ui-font-size-xs);color:var(--ui-color-text-secondary);margin:0 0 var(--ui-spacing-3)}.dbg-kv{display:grid;grid-template-columns:100px 1fr;gap:var(--ui-spacing-2) var(--ui-spacing-4);font-size:var(--ui-font-size-sm)}.dbg-kv__k{font-weight:600;color:var(--ui-color-text-secondary);font-size:11px;text-transform:uppercase;letter-spacing:.03em}.dbg-kv__v{color:var(--ui-color-text)}.dbg-mono{font-family:var(--ui-font-family-mono);font-size:var(--ui-font-size-xs)}.dbg-sim-btns{display:flex;gap:var(--ui-spacing-2);flex-wrap:wrap}.dbg-sim-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);font-weight:600;cursor:pointer;border:1px solid transparent;transition:all .15s}.dbg-sim-btn--get{background:#dcfce7;color:#166534;border-color:#86efac;&:hover{background:#bbf7d0}}.dbg-sim-btn--post{background:#dbeafe;color:#1e40af;border-color:#93c5fd;&:hover{background:#bfdbfe}}.dbg-sim-btn--fail{background:#fee2e2;color:#991b1b;border-color:#fca5a5;&:hover{background:#fecaca}}.dbg-action-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);font-weight:600;cursor:pointer;background:var(--ui-color-surface);color:var(--ui-color-text);border:1px solid var(--ui-color-border);transition:all .15s;&:hover{background:var(--ui-color-surface-hover)}}.dbg-action-btn--danger{color:#dc2626;border-color:#fca5a5}.dbg-action-btn--danger:hover{background:#fee2e2}.dbg-session-list{display:flex;flex-direction:column;gap:var(--ui-spacing-1)}.dbg-session-row{display:flex;align-items:center;gap:var(--ui-spacing-3);padding:var(--ui-spacing-2) var(--ui-spacing-3);border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-md);font-size:var(--ui-font-size-xs);cursor:pointer;transition:all .12s;&:hover{border-color:var(--ui-color-primary);background:color-mix(in srgb,var(--ui-color-primary) 4%,transparent)}}.dbg-session-row__arrow{margin-left:auto;color:var(--ui-color-text-muted)}.dbg-timeline{position:relative;padding-left:24px}.dbg-tl-entry{position:relative;margin-bottom:2px}.dbg-tl-entry__row{display:flex;align-items:center;gap:var(--ui-spacing-2);padding:4px var(--ui-spacing-3);border-radius:var(--ui-radius-md);font-size:12px;transition:background .12s;&:hover{background:var(--ui-color-surface-hover)}}.dbg-tl-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;position:absolute;left:-16px;top:10px}.dbg-tl-dot--navigation{background:var(--ui-color-primary);width:10px;height:10px;left:-17px;top:9px}.dbg-tl-dot--click{background:var(--ui-color-border-strong)}.dbg-tl-dot--formEvent{background:#f59e0b}.dbg-tl-dot--httpCall{background:#3b82f6}.dbg-tl-line{position:absolute;left:-12px;top:24px;bottom:-2px;width:2px;background:var(--ui-color-border)}.dbg-tl-entry__time{color:var(--ui-color-text-muted);min-width:85px;font-size:11px}.dbg-tl-entry__route{font-family:var(--ui-font-family-mono);font-weight:600;color:var(--ui-color-text);font-size:12px}.dbg-tl-entry__target,.dbg-tl-entry__field{font-family:var(--ui-font-family-mono);color:var(--ui-color-text-secondary);font-size:11px}.dbg-tl-entry__url{font-family:var(--ui-font-family-mono);color:var(--ui-color-text-secondary);font-size:11px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dbg-tl-entry__detail{font-size:11px;color:var(--ui-color-text-muted)}.dbg-tl-entry__text{color:var(--ui-color-text-muted);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.dbg-json-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--ui-radius-sm);font-size:10px;font-weight:600;cursor:pointer;background:var(--ui-color-bg-subtle);color:var(--ui-color-text-secondary);border:1px solid var(--ui-color-border);transition:all .12s;&:hover{background:var(--ui-color-surface-hover);color:var(--ui-color-primary);border-color:var(--ui-color-primary)}}.dbg-na{color:var(--ui-color-text-muted);font-size:11px}.dbg-table-wrap{overflow-x:auto;border:1px solid var(--ui-color-border);border-radius:var(--ui-radius-lg)}.dbg-table{width:100%;border-collapse:collapse;font-size:var(--ui-font-size-xs);th,td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--ui-color-border)}th{background:var(--ui-color-bg-subtle);font-weight:600;color:var(--ui-color-text-secondary);text-transform:uppercase;letter-spacing:.05em;font-size:10px}tbody tr:hover{background:var(--ui-color-surface-hover)}tbody tr:last-child td{border-bottom:none}}.dbg-truncate{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dbg-badge{display:inline-block;padding:1px 8px;border-radius:var(--ui-radius-full);font-size:10px;font-weight:600;white-space:nowrap}.dbg-badge--tl-navigation{background:color-mix(in srgb,var(--ui-color-primary) 12%,transparent);color:var(--ui-color-primary)}.dbg-badge--tl-click{background:#f1f5f9;color:#475569}.dbg-badge--tl-formEvent{background:#fef3c7;color:#92400e}.dbg-badge--tl-httpCall{background:#dbeafe;color:#1e40af}.dbg-badge--action{background:color-mix(in srgb,var(--ui-color-primary) 10%,transparent);color:var(--ui-color-primary);text-transform:uppercase}.dbg-badge--id{background:color-mix(in srgb,var(--ui-color-primary) 8%,transparent);color:var(--ui-color-primary)}.dbg-badge--focus{background:#dbeafe;color:#1e40af}.dbg-badge--blur{background:#f1f5f9;color:#475569}.dbg-badge--valueChange{background:#fef3c7;color:#92400e}.dbg-badge--validationError{background:#fee2e2;color:#991b1b}.dbg-badge--get{background:#dcfce7;color:#166534}.dbg-badge--post{background:#dbeafe;color:#1e40af}.dbg-badge--put{background:#fef3c7;color:#92400e}.dbg-badge--delete{background:#fee2e2;color:#991b1b}.dbg-status{font-family:var(--ui-font-family-mono);font-weight:600}.dbg-status--ok{color:#16a34a}.dbg-status--err{color:#dc2626}.dbg-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--ui-spacing-12);color:var(--ui-color-text-muted);text-align:center;p{margin:var(--ui-spacing-3) 0 0;font-size:var(--ui-font-size-sm)}}@media (max-width: 640px){.dbg-stats{grid-template-columns:repeat(2,1fr)}.dbg-dashboard-grid{grid-template-columns:1fr}.dbg-sim-btns{flex-direction:column}}\n"] }]
896
+ }], ctorParameters: () => [{ type: i1.MatDialogRef, decorators: [{
897
+ type: Optional
898
+ }] }, { type: undefined, decorators: [{
899
+ type: Optional
900
+ }, {
901
+ type: Inject,
902
+ args: [MAT_DIALOG_DATA]
903
+ }] }] });
904
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxhY2tib3gtZGVidWdnZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctdWktc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9ibGFja2JveC9ibGFja2JveC1kZWJ1Z2dlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsT0FBTyxFQUNILFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBR2pCLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBZ0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7OztBQThyQmpGLE1BQU0sT0FBTywyQkFBMkI7SUFvQnBDLFlBQ3VCLFNBQW9ELEVBQzNCLFVBQWU7UUFEeEMsY0FBUyxHQUFU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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtVVg7OzBCQTBXTSxRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQG1vZHVsZSBuZy11aS1zeXN0ZW0vYmxhY2tib3hcclxuICogQ29tcG9uZW50ZSBkZWJ1Z2dlciBCbGFja0JveCDigJQgYXBlcnRvIGluIG1vZGFsZSBmdWxsc2NyZWVuLlxyXG4gKlxyXG4gKiBMYXlvdXQ6XHJcbiAqIC0gSGVhZGVyIGNvbiB0aXRvbG8gZSBjaGl1c3VyYVxyXG4gKiAtIFRhYiBncm91cDogRGFzaGJvYXJkIHwgVGltZWxpbmUgfCBGb3JtIEV2ZW50cyB8IEhUVFAgQ2FsbHNcclxuICpcclxuICogRnVuemlvbmFsaXRhOlxyXG4gKiAtIFRpbWVsaW5lIHVuaWZpY2F0YSAobmF2aWdhemlvbmkgKyBjbGljayArIGZvcm0gZXZlbnRzICsgSFRUUCBjYWxscylcclxuICogLSBGb3JtIGV2ZW50cyBjb24gdmFsb3JpIGRlbCBmb3JtIHZpc2liaWxpXHJcbiAqIC0gSlNPTiBkZXRhaWwgbW9kYWwgYWwgY2xpY2sgc3UgZGF0aSBzdHJ1dHR1cmF0aVxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgT25Jbml0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgaW5qZWN0LFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBJbmplY3QsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTHVjaWRlQW5ndWxhck1vZHVsZSB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgaW50ZXJ2YWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgVWlCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vaW5kZXgnO1xyXG5pbXBvcnQgeyBVaU1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL2luZGV4JztcclxuaW1wb3J0IHsgVWlCbGFja2JveFNlcnZpY2UgfSBmcm9tICcuL2JsYWNrYm94LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVaUJsYWNrYm94U2Vzc2lvbiwgVWlCbGFja2JveEZvcm1FdmVudCwgVWlCbGFja2JveEh0dHBDYWxsIH0gZnJvbSAnLi9ibGFja2JveC50eXBlcyc7XHJcbmltcG9ydCB7IFVpQmxhY2tib3hKc29uVmlld2VyQ29tcG9uZW50IH0gZnJvbSAnLi9ibGFja2JveC1qc29uLXZpZXdlci5jb21wb25lbnQnO1xyXG5cclxuLyoqIERpc2NyaW1pbmF0ZWQgdW5pb24gZm9yIHRoZSB1bmlmaWVkIHRpbWVsaW5lLiAqL1xyXG5pbnRlcmZhY2UgVGltZWxpbmVFbnRyeSB7XHJcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcclxuICAgIGtpbmQ6ICduYXZpZ2F0aW9uJyB8ICdjbGljaycgfCAnZm9ybUV2ZW50JyB8ICdodHRwQ2FsbCc7XHJcbiAgICByb3V0ZT86IHN0cmluZztcclxuICAgIC8vIE5hdmlnYXRpb25cclxuICAgIHByZXZpb3VzUm91dGU/OiBzdHJpbmc7XHJcbiAgICBhY3Rpb25zQ291bnQ/OiBudW1iZXI7XHJcbiAgICAvLyBDbGlja1xyXG4gICAgdGFnPzogc3RyaW5nO1xyXG4gICAgdHJhY2tJZD86IHN0cmluZztcclxuICAgIHRleHQ/OiBzdHJpbmc7XHJcbiAgICAvLyBGb3JtIGV2ZW50XHJcbiAgICBmb3JtSWQ/OiBzdHJpbmc7XHJcbiAgICBmaWVsZEtleT86IHN0cmluZztcclxuICAgIGV2ZW50VHlwZT86IHN0cmluZztcclxuICAgIG1ldGFkYXRhPzogYW55O1xyXG4gICAgLy8gSFRUUFxyXG4gICAgbWV0aG9kPzogc3RyaW5nO1xyXG4gICAgdXJsPzogc3RyaW5nO1xyXG4gICAgc3RhdHVzPzogbnVtYmVyO1xyXG4gICAgZHVyYXRpb25Ncz86IG51bWJlcjtcclxuICAgIHJlcXVlc3RQYXlsb2FkPzogYW55O1xyXG4gICAgcmVzcG9uc2VIZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3VpLWJsYWNrYm94LWRlYnVnZ2VyJyxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbXHJcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICAgICAgTHVjaWRlQW5ndWxhck1vZHVsZSxcclxuICAgICAgICBVaUJ1dHRvbkNvbXBvbmVudCxcclxuICAgIF0sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwiZGJnLXJvb3RcIiBbY2xhc3MuZGlhbG9nLW1vZGVdPVwiaXNEaWFsb2dNb2RlXCI+XHJcblxyXG4gICAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgICAgQGlmIChpc0RpYWxvZ01vZGUpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1oZWFkZXJfX2xlZnRcIj5cclxuICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJhY3Rpdml0eVwiIFtzaXplXT1cIjIwXCIgY2xhc3M9XCJkYmctaGVhZGVyX19pY29uXCI+PC9sdWNpZGUtYW5ndWxhcj5cclxuICAgICAgICAgICAgPGgyPkJsYWNrQm94IERlYnVnZ2VyPC9oMj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHVpLWJ1dHRvbiBpY29uPVwieFwiIHZhcmlhbnQ9XCJnaG9zdFwiIHNpemU9XCJtZFwiIGFyaWFMYWJlbD1cIkNoaXVkaVwiIHRvb2x0aXA9XCJDaGl1ZGlcIiAoY2xpY2spPVwiY2xvc2VEaWFsb2coKVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gVGFicyAtLT5cclxuICAgICAgPG1hdC10YWItZ3JvdXBcclxuICAgICAgICBbc2VsZWN0ZWRJbmRleF09XCJzZWxlY3RlZFRhYlwiXHJcbiAgICAgICAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwic2VsZWN0ZWRUYWIgPSAkZXZlbnRcIlxyXG4gICAgICAgIGNsYXNzPVwiZGJnLXRhYnNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPCEtLSBUQUI6IERhc2hib2FyZCAtLT5cclxuICAgICAgICA8bWF0LXRhYj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cIm1vbml0b3JcIiBbc2l6ZV09XCIxNFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjZweFwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgIERhc2hib2FyZFxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXRhYi1jb250ZW50IGRiZy1kYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgPCEtLSBTdGF0cyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1zdGF0c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctc3RhdFwiICpuZ0Zvcj1cImxldCBzIG9mIHN0YXRzQ2FyZHNcIj5cclxuICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhciBbbmFtZV09XCJzLmljb25cIiBbc2l6ZV09XCIxOFwiIGNsYXNzPVwiZGJnLXN0YXRfX2ljb25cIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctc3RhdF9fdmFsdWVcIj57eyBzLnZhbHVlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctc3RhdF9fbGFiZWxcIj57eyBzLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1kYXNoYm9hcmQtZ3JpZFwiPlxyXG4gICAgICAgICAgICA8IS0tIFNlc3Npb24gaW5mbyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1wYW5lbFwiICpuZ0lmPVwic2Vzc2lvblwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctcGFuZWxfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJpbmZvXCIgW3NpemVdPVwiMTRcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgU2Vzc2lvbmUgY29ycmVudGVcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLWt2XCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1rdl9fa1wiPlNlc3Npb24gSUQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz1cImRiZy1rdl9fdiBkYmctbW9ub1wiPnt7IHNlc3Npb24uc2Vzc2lvbklkIH19PC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmcta3ZfX2tcIj5GaW5nZXJwcmludDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZGJnLWt2X192IGRiZy1tb25vXCI+e3sgc2Vzc2lvbi5maW5nZXJwcmludCB9fTwvY29kZT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLWt2X19rXCI+SW5pemlvPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmcta3ZfX3ZcIj57eyBzZXNzaW9uLnN0YXJ0ZWRBdCB8IGRhdGU6J2RkL01NL3l5eXkgSEg6bW06c3MnIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmcta3ZfX2tcIj5EdXJhdGE8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1rdl9fdlwiPnt7IHNlc3Npb25EdXJhdGlvbiB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIEhUVFAgU2ltdWxhdG9yIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1wYW5lbF9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cInphcFwiIFtzaXplXT1cIjE0XCI+PC9sdWNpZGUtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgIEhUVFAgU2ltdWxhdG9yXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkYmctcGFuZWxfX2Rlc2NcIj5HZW5lcmEgY2hpYW1hdGUgZml0dGl6aWUgcGVyIHRlc3RhcmUgbCdpbnRlcmNlcHRvciBCbGFja0JveC48L3A+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1zaW0tYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1zaW0tYnRuIGRiZy1zaW0tYnRuLS1nZXRcIiAoY2xpY2spPVwic2ltdWxhdGVHZXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cInBsYXlcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+IEdFVCAvdG9kb3MvMVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGJnLXNpbS1idG4gZGJnLXNpbS1idG4tLXBvc3RcIiAoY2xpY2spPVwic2ltdWxhdGVQb3N0KClcIj5cclxuICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJwbGF5XCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPiBQT1NUIC9wb3N0c1xyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGJnLXNpbS1idG4gZGJnLXNpbS1idG4tLWZhaWxcIiAoY2xpY2spPVwic2ltdWxhdGVGYWlsKClcIj5cclxuICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJwbGF5XCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPiBHRVQgLzQwNFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBBY3Rpb25zIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXBhbmVsXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1wYW5lbF9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cInNldHRpbmdzXCIgW3NpemVdPVwiMTRcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgQXppb25pXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1zaW0tYnRuc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1hY3Rpb24tYnRuXCIgKGNsaWNrKT1cInJlZnJlc2goKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cInJlZnJlc2gtY3dcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+IEFnZ2lvcm5hXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkYmctYWN0aW9uLWJ0blwiIChjbGljayk9XCJleHBvcnRTZXNzaW9ucygpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhciBuYW1lPVwiZG93bmxvYWRcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+IEVzcG9ydGEgSlNPTkxcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1hY3Rpb24tYnRuXCIgKGNsaWNrKT1cImltcG9ydEpzb25sKClcIj5cclxuICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJ1cGxvYWRcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+IEltcG9ydGEgSlNPTkxcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1hY3Rpb24tYnRuIGRiZy1hY3Rpb24tYnRuLS1kYW5nZXJcIiAoY2xpY2spPVwiY2xlYXJIaXN0b3J5KClcIj5cclxuICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJ0cmFzaC0yXCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPiBTdnVvdGFcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gUGFzdCBzZXNzaW9ucyAtLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy1wYW5lbFwiICpuZ0lmPVwicGFzdFNlc3Npb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXBhbmVsX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhciBuYW1lPVwiY2xvY2tcIiBbc2l6ZV09XCIxNFwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgICBTZXNzaW9uaSBhcmNoaXZpYXRlICh7eyBwYXN0U2Vzc2lvbnMubGVuZ3RoIH19KVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctc2Vzc2lvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXNlc3Npb24tcm93XCIgKm5nRm9yPVwibGV0IHMgb2YgcGFzdFNlc3Npb25zXCIgKGNsaWNrKT1cInZpZXdTZXNzaW9uKHMpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZGJnLW1vbm9cIj57eyBzLnNlc3Npb25JZCB8IHNsaWNlOjA6MTIgfX0uLi48L2NvZGU+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHMuc3RhcnRlZEF0IHwgZGF0ZTonZGQvTU0gSEg6bW0nIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBzLnN0ZXBzLmxlbmd0aCB9fSBzdGVwczwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJjaGV2cm9uLXJpZ2h0XCIgW3NpemVdPVwiMTRcIiBjbGFzcz1cImRiZy1zZXNzaW9uLXJvd19fYXJyb3dcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC10YWI+XHJcblxyXG4gICAgICAgIDwhLS0gVEFCOiBUaW1lbGluZSAodW5pZmllZCkgLS0+XHJcbiAgICAgICAgPG1hdC10YWI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cclxuICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJnaXQtYnJhbmNoXCIgW3NpemVdPVwiMTRcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDo2cHhcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICBUaW1lbGluZVxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXRhYi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctdGltZWxpbmVcIiAqbmdJZj1cInRpbWVsaW5lRW50cmllcy5sZW5ndGg7IGVsc2Ugbm9EYXRhXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy10bC1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZW50cnkgb2YgdGltZWxpbmVFbnRyaWVzOyBsZXQgbGFzdCA9IGxhc3RcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctdGwtZW50cnlfX3Jvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIERvdCAtLT5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy10bC1kb3RcIiBbbmdDbGFzc109XCInZGJnLXRsLWRvdC0tJyArIGVudHJ5LmtpbmRcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gVGltZSAtLT5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctdGwtZW50cnlfX3RpbWUgZGJnLW1vbm9cIj57eyBlbnRyeS50aW1lc3RhbXAgfCBkYXRlOidISDptbTpzcy5TU1MnIH19PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBLaW5kIGJhZGdlIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1iYWRnZVwiIFtuZ0NsYXNzXT1cIidkYmctYmFkZ2UtLXRsLScgKyBlbnRyeS5raW5kXCI+e3sgZW50cnkua2luZCB9fTwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gQ29udGVudCBiYXNlZCBvbiBraW5kIC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJlbnRyeS5raW5kXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTmF2aWdhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbmF2aWdhdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZGJnLXRsLWVudHJ5X19yb3V0ZVwiPnt7IGVudHJ5LnJvdXRlIH19PC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctdGwtZW50cnlfX2RldGFpbFwiPnt7IGVudHJ5LmFjdGlvbnNDb3VudCB9fSBhemlvbmk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ2xpY2sgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NsaWNrJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJkYmctdGwtZW50cnlfX3RhcmdldFwiPiZsdDt7eyBlbnRyeS50YWcgfX0mZ3Q7PC9jb2RlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctYmFkZ2UgZGJnLWJhZGdlLS1pZFwiICpuZ0lmPVwiZW50cnkudHJhY2tJZFwiPiN7eyBlbnRyeS50cmFja0lkIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctdGwtZW50cnlfX3RleHRcIiAqbmdJZj1cImVudHJ5LnRleHRcIj57eyBlbnRyeS50ZXh0IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEZvcm0gZXZlbnQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Zvcm1FdmVudCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLWJhZGdlXCIgW25nQ2xhc3NdPVwiJ2RiZy1iYWRnZS0tJyArIGVudHJ5LmV2ZW50VHlwZVwiPnt7IGVudHJ5LmV2ZW50VHlwZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPVwiZGJnLXRsLWVudHJ5X19maWVsZFwiPnt7IGVudHJ5LmZvcm1JZCB9fS57eyBlbnRyeS5maWVsZEtleSB9fTwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkYmctanNvbi1idG5cIiAqbmdJZj1cImVudHJ5Lm1ldGFkYXRhXCIgKGNsaWNrKT1cIm9wZW5Kc29uTW9kYWwoJ0Zvcm0gRXZlbnQg4oCUICcgKyBlbnRyeS5maWVsZEtleSwgZW50cnkubWV0YWRhdGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhciBuYW1lPVwiY29kZVwiIFtzaXplXT1cIjEyXCI+PC9sdWNpZGUtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIEhUVFAgY2FsbCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaHR0cENhbGwnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1iYWRnZVwiIFtuZ0NsYXNzXT1cIidkYmctYmFkZ2UtLScgKyAoZW50cnkubWV0aG9kID8/ICcnKS50b0xvd2VyQ2FzZSgpXCI+e3sgZW50cnkubWV0aG9kIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9XCJkYmctdGwtZW50cnlfX3VybFwiPnt7IGVudHJ5LnVybCB9fTwvY29kZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLXN0YXR1c1wiIFtjbGFzcy5kYmctc3RhdHVzLS1va109XCJlbnRyeS5zdGF0dXMgJiYgZW50cnkuc3RhdHVzIDwgNDAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5kYmctc3RhdHVzLS1lcnJdPVwiIWVudHJ5LnN0YXR1cyB8fCBlbnRyeS5zdGF0dXMhID49IDQwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBlbnRyeS5zdGF0dXMgPz8gJ+KAlCcgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLXRsLWVudHJ5X19kZXRhaWxcIiAqbmdJZj1cImVudHJ5LmR1cmF0aW9uTXNcIj57eyBlbnRyeS5kdXJhdGlvbk1zIH19bXM8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGJnLWpzb24tYnRuXCIgKm5nSWY9XCJlbnRyeS5yZXF1ZXN0UGF5bG9hZFwiIChjbGljayk9XCJvcGVuSnNvbk1vZGFsKCdIVFRQIFBheWxvYWQnLCBlbnRyeS5yZXF1ZXN0UGF5bG9hZClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctdGwtbGluZVwiICpuZ0lmPVwiIWxhc3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vRGF0YT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLWVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImdpdC1icmFuY2hcIiBbc2l6ZV09XCI0OFwiIHN0eWxlPVwib3BhY2l0eTowLjNcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgPHA+TmVzc3VuIGV2ZW50byByZWdpc3RyYXRvPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtdGFiPlxyXG5cclxuICAgICAgICA8IS0tIFRBQjogRm9ybSBFdmVudHMgLS0+XHJcbiAgICAgICAgPG1hdC10YWI+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cclxuICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJmaWxlLXRleHRcIiBbc2l6ZV09XCIxNFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjZweFwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgIEZvcm0gRXZlbnRzXHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctdGFiLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy10YWJsZS13cmFwXCIgKm5nSWY9XCJ2aWV3aW5nU2Vzc2lvbj8uZm9ybUV2ZW50cz8ubGVuZ3RoOyBlbHNlIG5vRm9ybURhdGFcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkYmctdGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5PcmE8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5Sb3R0YTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPkZvcm08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5DYW1wbzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPkV2ZW50bzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPlZhbG9yZSBjYW1wbzwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPkZvcm0gY29tcGxldG88L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5EZXR0YWdsaTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGV2IG9mIHZpZXdpbmdTZXNzaW9uIS5mb3JtRXZlbnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZGJnLW1vbm9cIj57eyBldi50aW1lc3RhbXAgfCBkYXRlOidISDptbTpzcy5TU1MnIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJkYmctbW9ubyBkYmctdHJ1bmNhdGVcIj57eyBldi5yb3V0ZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPnt7IGV2LmZvcm1JZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPnt7IGV2LmZpZWxkS2V5IH19PC9jb2RlPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctYmFkZ2VcIiBbbmdDbGFzc109XCInZGJnLWJhZGdlLS0nICsgZXYuZXZlbnRUeXBlXCI+e3sgZXYuZXZlbnRUeXBlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1qc29uLWJ0blwiICpuZ0lmPVwiZXYubWV0YWRhdGE/LnZhbHVlICE9PSB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkpzb25Nb2RhbCgnVmFsb3JlOiAnICsgZXYuZmllbGRLZXksIGV2Lm1ldGFkYXRhIS52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPiB2YWxvcmVcclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctbmFcIiAqbmdJZj1cImV2Lm1ldGFkYXRhPy52YWx1ZSA9PT0gdW5kZWZpbmVkXCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRiZy1qc29uLWJ0blwiICpuZ0lmPVwiZXYubWV0YWRhdGE/LmZvcm1WYWx1ZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3Blbkpzb25Nb2RhbCgnRm9ybSBWYWx1ZXMg4oCUICcgKyBldi5mb3JtSWQsIGV2Lm1ldGFkYXRhIS5mb3JtVmFsdWVzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImNvZGVcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+IGZvcm1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkYmctbmFcIiAqbmdJZj1cIiFldi5tZXRhZGF0YT8uZm9ybVZhbHVlc1wiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkYmctanNvbi1idG5cIiAqbmdJZj1cImV2Lm1ldGFkYXRhXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Kc29uTW9kYWwoJ0RldHRhZ2xpIGV2ZW50bycsIGV2Lm1ldGFkYXRhKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImNvZGVcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9Gb3JtRGF0YT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLWVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImZpbGUtdGV4dFwiIFtzaXplXT1cIjQ4XCIgc3R5bGU9XCJvcGFjaXR5OjAuM1wiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgICA8cD5OZXNzdW4gZm9ybSBldmVudCByZWdpc3RyYXRvPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtdGFiPlxyXG5cclxuICAgICAgICA8IS0tIFRBQjogSFRUUCBDYWxscyAtLT5cclxuICAgICAgICA8bWF0LXRhYj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxyXG4gICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImV4dGVybmFsLWxpbmtcIiBbc2l6ZV09XCIxNFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjZweFwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgIEhUVFAgQ2FsbHNcclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRiZy10YWItY29udGVudFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGJnLXRhYmxlLXdyYXBcIiAqbmdJZj1cInZpZXdpbmdTZXNzaW9uPy5jYWxscz8ubGVuZ3RoOyBlbHNlIG5vSHR0cERhdGFcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkYmctdGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5PcmE8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5NZXRvZG88L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5VUkw8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5EdXJhdGE8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aD5QYXlsb2FkPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+SGVhZGVyczwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGNhbGwgb2Ygdmlld2luZ1Nlc3Npb24hLmNhbGxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiZGJnLW1vbm9cIj57eyBjYWxsLnRpbWVzdGFtcCB8IGRhdGU6J0hIOm1tOnNzLlNTUycgfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLWJhZGdlXCIgW25nQ2xhc3NdPVwiJ2RiZy1iYWRnZS0tJyArIGNhbGwubWV0aG9kLnRvTG93ZXJDYXNlKClcIj57eyBjYWxsLm1ldGhvZCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImRiZy1tb25vIGRiZy10cnVuY2F0ZVwiPnt7IGNhbGwudXJsIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1zdGF0dXNcIiBbY2xhc3MuZGJnLXN0YXR1cy0tb2tdPVwiY2FsbC5zdGF0dXMgJiYgY2FsbC5zdGF0dXMgPCA0MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRiZy1zdGF0dXMtLWVycl09XCIhY2FsbC5zdGF0dXMgfHwgY2FsbC5zdGF0dXMgPj0gNDAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNhbGwuc3RhdHVzID8/ICfigJQnIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJkYmctbW9ub1wiPnt7IGNhbGwuZHVyYXRpb25NcyB9fW1zPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGJnLWpzb24tYnRuXCIgKm5nSWY9XCJjYWxsLnJlcXVlc3RQYXlsb2FkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Kc29uTW9kYWwoJ1BheWxvYWQg4oCUICcgKyBjYWxsLm1ldGhvZCArICcgJyArIGNhbGwudXJsLCBjYWxsLnJlcXVlc3RQYXlsb2FkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWFuZ3VsYXIgbmFtZT1cImNvZGVcIiBbc2l6ZV09XCIxMlwiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGJnLW5hXCIgKm5nSWY9XCIhY2FsbC5yZXF1ZXN0UGF5bG9hZFwiPuKAlDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkYmctanNvbi1idG5cIiAqbmdJZj1cImNhbGwucmVzcG9uc2VIZWFkZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Kc29uTW9kYWwoJ1Jlc3BvbnNlIEhlYWRlcnMnLCBjYWxsLnJlc3BvbnNlSGVhZGVycylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1hbmd1bGFyIG5hbWU9XCJjb2RlXCIgW3NpemVdPVwiMTJcIj48L2x1Y2lkZS1hbmd1bGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRiZy1uYVwiICpuZ0lmPVwiIWNhbGwucmVzcG9uc2VIZWFkZXJzXCI+4oCUPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub0h0dHBEYXRhPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYmctZW1wdHlcIj5cclxuICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhciBuYW1lPVwiZXh0ZXJuYWwtbGlua1wiIFtzaXplXT1cIjQ4XCIgc3R5bGU9XCJvcGFjaXR5OjAuM1wiPjwvbHVjaWRlLWFuZ3VsYXI+XHJcbiAgICAgICAgICAgICAgICA8cD5OZXNzdW5hIGNoaWFtYXRhIEhUVFAgaW50ZXJjZXR0YXRhPC9wPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICA8L21hdC10YWItZ3JvdXA+XHJcbiAgICA8L2Rpdj5cclxuICBgLFxyXG4gICAgc3R5bGVzOiBbYFxyXG4gICAgQHVzZSAnLi4vLi4vY29yZS90b2tlbnMvbWl4aW5zJyBhcyB1aTtcclxuXHJcbiAgICAvKiDilIDilIAgUm9vdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuICAgIC5kYmctcm9vdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGhlaWdodDogMTAwdmg7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgICYuZGlhbG9nLW1vZGUgeyBoZWlnaHQ6IDEwMCU7IH1cclxuICAgIH1cclxuXHJcbiAgICAvKiDilIDilIAgSGVhZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy1oZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctMykgdmFyKC0tdWktc3BhY2luZy00KTtcclxuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSk7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3gtc2hhZG93OiB2YXIoLS11aS1zaGFkb3ctc20pO1xyXG5cclxuICAgICAgaDIge1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS1sZyk7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICAgICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC5kYmctaGVhZGVyX19sZWZ0IHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTIpO1xyXG4gICAgfVxyXG4gICAgLmRiZy1oZWFkZXJfX2ljb24geyBjb2xvcjogdmFyKC0tdWktY29sb3ItcHJpbWFyeSk7IH1cclxuXHJcbiAgICAvKiDilIDilIAgVGFicyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuICAgIC5kYmctdGFicyB7XHJcbiAgICAgIGZsZXg6IDE7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICA6Om5nLWRlZXAgLm1hdC1tZGMtdGFiLWhlYWRlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdWktY29sb3Itc3VyZmFjZSk7XHJcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXVpLWNvbG9yLWJvcmRlcik7XHJcbiAgICAgIH1cclxuICAgICAgOjpuZy1kZWVwIC5tYXQtbWRjLXRhYiAubWRjLXRhYl9fdGV4dC1sYWJlbCB7XHJcbiAgICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQtc2Vjb25kYXJ5KTtcclxuICAgICAgICBmb250LXdlaWdodDogNTAwO1xyXG4gICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXNtKTtcclxuICAgICAgfVxyXG4gICAgICA6Om5nLWRlZXAgLm1hdC1tZGMtdGFiLm1kYy10YWItLWFjdGl2ZSAubWRjLXRhYl9fdGV4dC1sYWJlbCB7XHJcbiAgICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIH1cclxuICAgICAgOjpuZy1kZWVwIC5tYXQtbWRjLXRhYi1oZWFkZXIgLm1kYy10YWItaW5kaWNhdG9yX19jb250ZW50LS11bmRlcmxpbmUge1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tdWktY29sb3ItcHJpbWFyeSk7XHJcbiAgICAgICAgYm9yZGVyLXdpZHRoOiAzcHg7XHJcbiAgICAgIH1cclxuICAgICAgOjpuZy1kZWVwIC5tYXQtbWRjLXRhYi1ib2R5LXdyYXBwZXIgeyBmbGV4OiAxOyBvdmVyZmxvdzogaGlkZGVuOyB9XHJcbiAgICAgIDo6bmctZGVlcCAubWF0LW1kYy10YWItYm9keSB7IGhlaWdodDogMTAwJTsgfVxyXG4gICAgICA6Om5nLWRlZXAgLm1hdC1tZGMtdGFiLWJvZHktY29udGVudCB7IGhlaWdodDogMTAwJTsgb3ZlcmZsb3c6IGF1dG87IH1cclxuICAgIH1cclxuXHJcbiAgICAuZGJnLXRhYi1jb250ZW50IHtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy00KTtcclxuICAgICAgbWF4LXdpZHRoOiAxMjAwcHg7XHJcbiAgICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIH1cclxuXHJcbiAgICAvKiDilIDilIAgRGFzaGJvYXJkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy1kYXNoYm9hcmQgeyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IHZhcigtLXVpLXNwYWNpbmctNCk7IH1cclxuICAgIC5kYmctZGFzaGJvYXJkLWdyaWQge1xyXG4gICAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctNCk7XHJcbiAgICB9XHJcblxyXG4gICAgLmRiZy1zdGF0cyB7XHJcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0zKTtcclxuICAgIH1cclxuICAgIC5kYmctc3RhdCB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogNHB4O1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTQpO1xyXG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlKTtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tdWktY29sb3ItYm9yZGVyKTtcclxuICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdWktcmFkaXVzLWxnKTtcclxuICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjE1cztcclxuICAgICAgJjpob3ZlciB7IGJveC1zaGFkb3c6IHZhcigtLXVpLXNoYWRvdy1tZCk7IH1cclxuICAgIH1cclxuICAgIC5kYmctc3RhdF9faWNvbiB7IGNvbG9yOiB2YXIoLS11aS1jb2xvci1wcmltYXJ5KTsgb3BhY2l0eTogMC43OyB9XHJcbiAgICAuZGJnLXN0YXRfX3ZhbHVlIHtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtMnhsKTtcclxuICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXVpLWZvbnQtd2VpZ2h0LWJvbGQpO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItcHJpbWFyeSk7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS11aS1mb250LWZhbWlseS1tb25vKTtcclxuICAgIH1cclxuICAgIC5kYmctc3RhdF9fbGFiZWwge1xyXG4gICAgICBmb250LXNpemU6IDExcHg7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTtcclxuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiDilIDilIAgUGFuZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy1wYW5lbCB7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLXN1cmZhY2UpO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbGcpO1xyXG4gICAgICBwYWRkaW5nOiB2YXIoLS11aS1zcGFjaW5nLTQpO1xyXG4gICAgfVxyXG4gICAgLmRiZy1wYW5lbF9faGVhZGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiB2YXIoLS11aS1zcGFjaW5nLTIpO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS1zbSk7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS11aS1mb250LXdlaWdodC1zZW1pYm9sZCk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0KTtcclxuICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tdWktc3BhY2luZy0zKTtcclxuICAgIH1cclxuICAgIC5kYmctcGFuZWxfX2Rlc2Mge1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS14cyk7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LXNlY29uZGFyeSk7XHJcbiAgICAgIG1hcmdpbjogMCAwIHZhcigtLXVpLXNwYWNpbmctMyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyog4pSA4pSAIEtleS9WYWx1ZSBncmlkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy1rdiB7XHJcbiAgICAgIGRpc3BsYXk6IGdyaWQ7XHJcbiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMTAwcHggMWZyO1xyXG4gICAgICBnYXA6IHZhcigtLXVpLXNwYWNpbmctMikgdmFyKC0tdWktc3BhY2luZy00KTtcclxuICAgICAgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUtc20pO1xyXG4gICAgfVxyXG4gICAgLmRiZy1rdl9fayB7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LXNlY29uZGFyeSk7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTFweDtcclxuICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTtcclxuICAgIH1cclxuICAgIC5kYmcta3ZfX3YgeyBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dCk7IH1cclxuICAgIC5kYmctbW9ubyB7IGZvbnQtZmFtaWx5OiB2YXIoLS11aS1mb250LWZhbWlseS1tb25vKTsgZm9udC1zaXplOiB2YXIoLS11aS1mb250LXNpemUteHMpOyB9XHJcblxyXG4gICAgLyog4pSA4pSAIFNpbXVsYXRvciBidXR0b25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy1zaW0tYnRucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogdmFyKC0tdWktc3BhY2luZy0yKTsgZmxleC13cmFwOiB3cmFwOyB9XHJcbiAgICAuZGJnLXNpbS1idG4ge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA2cHg7XHJcbiAgICAgIHBhZGRpbmc6IDZweCAxNHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbWQpO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS14cyk7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cztcclxuICAgIH1cclxuICAgIC5kYmctc2ltLWJ0bi0tZ2V0IHsgYmFja2dyb3VuZDogI2RjZmNlNzsgY29sb3I6ICMxNjY1MzQ7IGJvcmRlci1jb2xvcjogIzg2ZWZhYzsgJjpob3ZlciB7IGJhY2tncm91bmQ6ICNiYmY3ZDA7IH0gfVxyXG4gICAgLmRiZy1zaW0tYnRuLS1wb3N0IHsgYmFja2dyb3VuZDogI2RiZWFmZTsgY29sb3I6ICMxZTQwYWY7IGJvcmRlci1jb2xvcjogIzkzYzVmZDsgJjpob3ZlciB7IGJhY2tncm91bmQ6ICNiZmRiZmU7IH0gfVxyXG4gICAgLmRiZy1zaW0tYnRuLS1mYWlsIHsgYmFja2dyb3VuZDogI2ZlZTJlMjsgY29sb3I6ICM5OTFiMWI7IGJvcmRlci1jb2xvcjogI2ZjYTVhNTsgJjpob3ZlciB7IGJhY2tncm91bmQ6ICNmZWNhY2E7IH0gfVxyXG5cclxuICAgIC5kYmctYWN0aW9uLWJ0biB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBnYXA6IDZweDtcclxuICAgICAgcGFkZGluZzogNnB4IDE0cHg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1tZCk7XHJcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXhzKTtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlKTtcclxuICAgICAgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQpO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7XHJcbiAgICAgICY6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlLWhvdmVyKTsgfVxyXG4gICAgfVxyXG4gICAgLmRiZy1hY3Rpb24tYnRuLS1kYW5nZXIge1xyXG4gICAgICBjb2xvcjogI2RjMjYyNjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjZmNhNWE1O1xyXG4gICAgfVxyXG4gICAgLmRiZy1hY3Rpb24tYnRuLS1kYW5nZXI6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjZmVlMmUyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgCBTZXNzaW9uIGxpc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcbiAgICAuZGJnLXNlc3Npb24tbGlzdCB7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogdmFyKC0tdWktc3BhY2luZy0xKTsgfVxyXG4gICAgLmRiZy1zZXNzaW9uLXJvdyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0zKTtcclxuICAgICAgcGFkZGluZzogdmFyKC0tdWktc3BhY2luZy0yKSB2YXIoLS11aS1zcGFjaW5nLTMpO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbWQpO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS14cyk7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTJzO1xyXG4gICAgICAmOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS11aS1jb2xvci1wcmltYXJ5KTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXVpLWNvbG9yLXByaW1hcnkpIDQlLCB0cmFuc3BhcmVudCk7IH1cclxuICAgIH1cclxuICAgIC5kYmctc2Vzc2lvbi1yb3dfX2Fycm93IHsgbWFyZ2luLWxlZnQ6IGF1dG87IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTsgfVxyXG5cclxuICAgIC8qIOKUgOKUgCBVbmlmaWVkIFRpbWVsaW5lIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgLmRiZy10aW1lbGluZSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgcGFkZGluZy1sZWZ0OiAyNHB4OyB9XHJcbiAgICAuZGJnLXRsLWVudHJ5IHsgcG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW4tYm90dG9tOiAycHg7IH1cclxuICAgIC5kYmctdGwtZW50cnlfX3JvdyB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGdhcDogdmFyKC0tdWktc3BhY2luZy0yKTtcclxuICAgICAgcGFkZGluZzogNHB4IHZhcigtLXVpLXNwYWNpbmctMyk7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1tZCk7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjEycztcclxuICAgICAgJjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLXN1cmZhY2UtaG92ZXIpOyB9XHJcbiAgICB9XHJcbiAgICAuZGJnLXRsLWRvdCB7XHJcbiAgICAgIHdpZHRoOiA4cHg7IGhlaWdodDogOHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIGxlZnQ6IC0xNnB4OyB0b3A6IDEwcHg7XHJcbiAgICB9XHJcbiAgICAuZGJnLXRsLWRvdC0tbmF2aWdhdGlvbiB7IGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpOyB3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4OyBsZWZ0OiAtMTdweDsgdG9wOiA5cHg7IH1cclxuICAgIC5kYmctdGwtZG90LS1jbGljayB7IGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJvcmRlci1zdHJvbmcpOyB9XHJcbiAgICAuZGJnLXRsLWRvdC0tZm9ybUV2ZW50IHsgYmFja2dyb3VuZDogI2Y1OWUwYjsgfVxyXG4gICAgLmRiZy10bC1kb3QtLWh0dHBDYWxsIHsgYmFja2dyb3VuZDogIzNiODJmNjsgfVxyXG4gICAgLmRiZy10bC1saW5lIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICBsZWZ0OiAtMTJweDsgdG9wOiAyNHB4OyBib3R0b206IC0ycHg7XHJcbiAgICAgIHdpZHRoOiAycHg7XHJcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJvcmRlcik7XHJcbiAgICB9XHJcbiAgICAuZGJnLXRsLWVudHJ5X190aW1lIHsgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQtbXV0ZWQpOyBtaW4td2lkdGg6IDg1cHg7IGZvbnQtc2l6ZTogMTFweDsgfVxyXG4gICAgLmRiZy10bC1lbnRyeV9fcm91dGUgeyBmb250LWZhbWlseTogdmFyKC0tdWktZm9udC1mYW1pbHktbW9ubyk7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0KTsgZm9udC1zaXplOiAxMnB4OyB9XHJcbiAgICAuZGJnLXRsLWVudHJ5X190YXJnZXQgeyBmb250LWZhbWlseTogdmFyKC0tdWktZm9udC1mYW1pbHktbW9ubyk7IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LXNlY29uZGFyeSk7IGZvbnQtc2l6ZTogMTFweDsgfVxyXG4gICAgLmRiZy10bC1lbnRyeV9fZmllbGQgeyBmb250LWZhbWlseTogdmFyKC0tdWktZm9udC1mYW1pbHktbW9ubyk7IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LXNlY29uZGFyeSk7IGZvbnQtc2l6ZTogMTFweDsgfVxyXG4gICAgLmRiZy10bC1lbnRyeV9fdXJsIHsgZm9udC1mYW1pbHk6IHZhcigtLXVpLWZvbnQtZmFtaWx5LW1vbm8pOyBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpOyBmb250LXNpemU6IDExcHg7IG1heC13aWR0aDogMzAwcHg7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XHJcbiAgICAuZGJnLXRsLWVudHJ5X19kZXRhaWwgeyBmb250LXNpemU6IDExcHg7IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTsgfVxyXG4gICAgLmRiZy10bC1lbnRyeV9fdGV4dCB7IGNvbG9yOiB2YXIoLS11aS1jb2xvci10ZXh0LW11dGVkKTsgbWF4LXdpZHRoOiAyMDBweDsgb3ZlcmZsb3c6IGhpZGRlbjsgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7IHdoaXRlLXNwYWNlOiBub3dyYXA7IGZvbnQtc2l6ZTogMTFweDsgfVxyXG5cclxuICAgIC8qIOKUgOKUgCBKU09OIGJ1dHRvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuICAgIC5kYmctanNvbi1idG4ge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA0cHg7XHJcbiAgICAgIHBhZGRpbmc6IDJweCA4cHg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1zbSk7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTBweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1iZy1zdWJ0bGUpO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4xMnM7XHJcbiAgICAgICY6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlLWhvdmVyKTsgY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpOyBib3JkZXItY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpOyB9XHJcbiAgICB9XHJcbiAgICAuZGJnLW5hIHsgY29sb3I6IHZhcigtLXVpLWNvbG9yLXRleHQtbXV0ZWQpOyBmb250LXNpemU6IDExcHg7IH1cclxuXHJcbiAgICAvKiDilIDilIAgVGFibGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcbiAgICAuZGJnLXRhYmxlLXdyYXAge1xyXG4gICAgICBvdmVyZmxvdy14OiBhdXRvO1xyXG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS11aS1jb2xvci1ib3JkZXIpO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS11aS1yYWRpdXMtbGcpO1xyXG4gICAgfVxyXG4gICAgLmRiZy10YWJsZSB7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gICAgICBmb250LXNpemU6IHZhcigtLXVpLWZvbnQtc2l6ZS14cyk7XHJcblxyXG4gICAgICB0aCwgdGQge1xyXG4gICAgICAgIHBhZGRpbmc6IDhweCAxMnB4O1xyXG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXVpLWNvbG9yLWJvcmRlcik7XHJcbiAgICAgIH1cclxuICAgICAgdGgge1xyXG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXVpLWNvbG9yLWJnLXN1YnRsZSk7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1zZWNvbmRhcnkpO1xyXG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcclxuICAgICAgICBmb250LXNpemU6IDEwcHg7XHJcbiAgICAgIH1cclxuICAgICAgdGJvZHkgdHI6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS11aS1jb2xvci1zdXJmYWNlLWhvdmVyKTsgfVxyXG4gICAgICB0Ym9keSB0cjpsYXN0LWNoaWxkIHRkIHsgYm9yZGVyLWJvdHRvbTogbm9uZTsgfVxyXG4gICAgfVxyXG4gICAgLmRiZy10cnVuY2F0ZSB7IG1heC13aWR0aDogMjAwcHg7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9XHJcblxyXG4gICAgLyog4pSA4pSAIEJhZGdlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgKi9cclxuICAgIC5kYmctYmFkZ2Uge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgIHBhZGRpbmc6IDFweCA4cHg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXVpLXJhZGl1cy1mdWxsKTtcclxuICAgICAgZm9udC1zaXplOiAxMHB4O1xyXG4gICAgICBmb250LXdlaWdodDogNjAwO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG4gICAgLmRiZy1iYWRnZS0tdGwtbmF2aWdhdGlvbiB7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS11aS1jb2xvci1wcmltYXJ5KSAxMiUsIHRyYW5zcGFyZW50KTsgY29sb3I6IHZhcigtLXVpLWNvbG9yLXByaW1hcnkpOyB9XHJcbiAgICAuZGJnLWJhZGdlLS10bC1jbGljayB7IGJhY2tncm91bmQ6ICNmMWY1Zjk7IGNvbG9yOiAjNDc1NTY5OyB9XHJcbiAgICAuZGJnLWJhZGdlLS10bC1mb3JtRXZlbnQgeyBiYWNrZ3JvdW5kOiAjZmVmM2M3OyBjb2xvcjogIzkyNDAwZTsgfVxyXG4gICAgLmRiZy1iYWRnZS0tdGwtaHR0cENhbGwgeyBiYWNrZ3JvdW5kOiAjZGJlYWZlOyBjb2xvcjogIzFlNDBhZjsgfVxyXG4gICAgLmRiZy1iYWRnZS0tYWN0aW9uIHsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXVpLWNvbG9yLXByaW1hcnkpIDEwJSwgdHJhbnNwYXJlbnQpOyBjb2xvcjogdmFyKC0tdWktY29sb3ItcHJpbWFyeSk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH1cclxuICAgIC5kYmctYmFkZ2UtLWlkIHsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXVpLWNvbG9yLXByaW1hcnkpIDglLCB0cmFuc3BhcmVudCk7IGNvbG9yOiB2YXIoLS11aS1jb2xvci1wcmltYXJ5KTsgfVxyXG4gICAgLmRiZy1iYWRnZS0tZm9jdXMgeyBiYWNrZ3JvdW5kOiAjZGJlYWZlOyBjb2xvcjogIzFlNDBhZjsgfVxyXG4gICAgLmRiZy1iYWRnZS0tYmx1ciB7IGJhY2tncm91bmQ6ICNmMWY1Zjk7IGNvbG9yOiAjNDc1NTY5OyB9XHJcbiAgICAuZGJnLWJhZGdlLS12YWx1ZUNoYW5nZSB7IGJhY2tncm91bmQ6ICNmZWYzYzc7IGNvbG9yOiAjOTI0MDBlOyB9XHJcbiAgICAuZGJnLWJhZGdlLS12YWxpZGF0aW9uRXJyb3IgeyBiYWNrZ3JvdW5kOiAjZmVlMmUyOyBjb2xvcjogIzk5MWIxYjsgfVxyXG4gICAgLmRiZy1iYWRnZS0tZ2V0IHsgYmFja2dyb3VuZDogI2RjZmNlNzsgY29sb3I6ICMxNjY1MzQ7IH1cclxuICAgIC5kYmctYmFkZ2UtLXBvc3QgeyBiYWNrZ3JvdW5kOiAjZGJlYWZlOyBjb2xvcjogIzFlNDBhZjsgfVxyXG4gICAgLmRiZy1iYWRnZS0tcHV0IHsgYmFja2dyb3VuZDogI2ZlZjNjNzsgY29sb3I6ICM5MjQwMGU7IH1cclxuICAgIC5kYmctYmFkZ2UtLWRlbGV0ZSB7IGJhY2tncm91bmQ6ICNmZWUyZTI7IGNvbG9yOiAjOTkxYjFiOyB9XHJcblxyXG4gICAgLmRiZy1zdGF0dXMgeyBmb250LWZhbWlseTogdmFyKC0tdWktZm9udC1mYW1pbHktbW9ubyk7IGZvbnQtd2VpZ2h0OiA2MDA7IH1cclxuICAgIC5kYmctc3RhdHVzLS1vayB7IGNvbG9yOiAjMTZhMzRhOyB9XHJcbiAgICAuZGJnLXN0YXR1cy0tZXJyIHsgY29sb3I6ICNkYzI2MjY7IH1cclxuXHJcbiAgICAvKiDilIDilIAgRW1wdHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAICovXHJcbiAgICAuZGJnLWVtcHR5IHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IHZhcigtLXVpLXNwYWNpbmctMTIpO1xyXG4gICAgICBjb2xvcjogdmFyKC0tdWktY29sb3ItdGV4dC1tdXRlZCk7XHJcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgICAgcCB7IG1hcmdpbjogdmFyKC0tdWktc3BhY2luZy0zKSAwIDA7IGZvbnQtc2l6ZTogdmFyKC0tdWktZm9udC1zaXplLXNtKTsgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qIOKUgOKUgCBSZXNwb25zaXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCAqL1xyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7XHJcbiAgICAgIC5kYmctc3RhdHMgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOyB9XHJcbiAgICAgIC5kYmctZGFzaGJvYXJkLWdyaWQgeyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjsgfVxyXG4gICAgICAuZGJnLXNpbS1idG5zIHsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfVxyXG4gICAgfVxyXG4gIGBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVWlCbGFja2JveERlYnVnZ2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBibGFja2JveCA9IGluamVjdChVaUJsYWNrYm94U2VydmljZSk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZSA9IGluamVjdChVaU1vZGFsU2VydmljZSk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICAvKiogV2hldGhlciBvcGVuZWQgaW5zaWRlIGEgZGlhbG9nLiAqL1xyXG4gICAgaXNEaWFsb2dNb2RlID0gZmFsc2U7XHJcbiAgICBzZWxlY3RlZFRhYiA9IDA7XHJcblxyXG4gICAgc2Vzc2lvbjogVWlCbGFja2JveFNlc3Npb24gfCBudWxsID0gbnVsbDtcclxuICAgIHZpZXdpbmdTZXNzaW9uOiBVaUJsYWNrYm94U2Vzc2lvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgcGFzdFNlc3Npb25zOiBVaUJsYWNrYm94U2Vzc2lvbltdID0gW107XHJcblxyXG4gICAgc3RhdHNDYXJkczogeyBpY29uOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgLyoqIFVuaWZpZWQgdGltZWxpbmUgZW50cmllcyBzb3J0ZWQgYnkgdGltZXN0YW1wLiAqL1xyXG4gICAgdGltZWxpbmVFbnRyaWVzOiBUaW1lbGluZUVudHJ5W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8VWlCbGFja2JveERlYnVnZ2VyQ29tcG9uZW50PixcclxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRpYWxvZ0RhdGE6IGFueSxcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuaXNEaWFsb2dNb2RlID0gISF0aGlzLmRpYWxvZ1JlZjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2Vzc2lvbkR1cmF0aW9uKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb24pIHJldHVybiAn4oCUJztcclxuICAgICAgICBjb25zdCBtcyA9IERhdGUubm93KCkgLSB0aGlzLnNlc3Npb24uc3RhcnRlZEF0O1xyXG4gICAgICAgIGNvbnN0IHMgPSBNYXRoLmZsb29yKG1zIC8gMTAwMCk7XHJcbiAgICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3IocyAvIDYwKTtcclxuICAgICAgICBjb25zdCBoID0gTWF0aC5mbG9vcihtIC8gNjApO1xyXG4gICAgICAgIGlmIChoID4gMCkgcmV0dXJuIGAke2h9aCAke20gJSA2MH1tYDtcclxuICAgICAgICBpZiAobSA+IDApIHJldHVybiBgJHttfW0gJHtzICUgNjB9c2A7XHJcbiAgICAgICAgcmV0dXJuIGAke3N9c2A7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcblxyXG4gICAgICAgIC8vIEF1dG8tcmVmcmVzaCBldmVyeSAyc1xyXG4gICAgICAgIGludGVydmFsKDIwMDApXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gTG9hZCBpbXBvcnRlZCBzZXNzaW9ucyBpZiBwcm92aWRlZFxyXG4gICAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGE/LmltcG9ydGVkU2Vzc2lvbnM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhc3RTZXNzaW9ucyA9IHRoaXMuZGlhbG9nRGF0YS5pbXBvcnRlZFNlc3Npb25zO1xyXG4gICAgICAgICAgICB0aGlzLnZpZXdpbmdTZXNzaW9uID0gdGhpcy5wYXN0U2Vzc2lvbnNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHRoaXMuYmxhY2tib3guZ2V0Q3VycmVudFNlc3Npb24oKTtcclxuICAgICAgICB0aGlzLnZpZXdpbmdTZXNzaW9uID0gdGhpcy52aWV3aW5nU2Vzc2lvbiA/PyB0aGlzLnNlc3Npb247XHJcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0cygpO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUaW1lbGluZSgpO1xyXG5cclxuICAgICAgICB0aGlzLmJsYWNrYm94LmdldFNlc3Npb25IaXN0b3J5KCkudGhlbihzZXNzaW9ucyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucGFzdFNlc3Npb25zID0gc2Vzc2lvbnMuZmlsdGVyKHMgPT4gcy5zZXNzaW9uSWQgIT09IHRoaXMuc2Vzc2lvbj8uc2Vzc2lvbklkKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVTdGF0cygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzID0gdGhpcy52aWV3aW5nU2Vzc2lvbjtcclxuICAgICAgICB0aGlzLnN0YXRzQ2FyZHMgPSBbXHJcbiAgICAgICAgICAgIHsgaWNvbjogJ2dpdC1icmFuY2gnLCB2YWx1ZTogcz8uc3RlcHM/Lmxlbmd0aCA/PyAwLCBsYWJlbDogJ05hdmlnYXppb25pJyB9LFxyXG4gICAgICAgICAgICB7IGljb246ICdtb3VzZS1wb2ludGVyLWNsaWNrJywgdmFsdWU6IHM/LnN0ZXBzPy5yZWR1Y2UoKHN1bSwgc3QpID0+IHN1bSArIHN0LmFjdGlvbnMubGVuZ3RoLCAwKSA/PyAwLCBsYWJlbDogJ0NsaWNrJyB9LFxyXG4gICAgICAgICAgICB7IGljb246ICdmaWxlLXRleHQnLCB2YWx1ZTogcz8uZm9ybUV2ZW50cz8ubGVuZ3RoID8/IDAsIGxhYmVsOiAnRm9ybSBFdmVudHMnIH0sXHJcbiAgICAgICAgICAgIHsgaWNvbjogJ2V4dGVybmFsLWxpbmsnLCB2YWx1ZTogcz8uY2FsbHM/Lmxlbmd0aCA/PyAwLCBsYWJlbDogJ0hUVFAgQ2FsbHMnIH0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQnVpbGRzIGEgdW5pZmllZCB0aW1lbGluZSBmcm9tIGFsbCBldmVudCBzb3VyY2VzLiAqL1xyXG4gICAgcHJpdmF0ZSBidWlsZFRpbWVsaW5lKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVudHJpZXM6IFRpbWVsaW5lRW50cnlbXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHMgPSB0aGlzLnZpZXdpbmdTZXNzaW9uO1xyXG4gICAgICAgIGlmICghcykgeyB0aGlzLnRpbWVsaW5lRW50cmllcyA9IFtdOyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgLy8gTmF2aWdhdGlvbiBzdGVwcyArIHRoZWlyIGNoaWxkIGFjdGlvbnNcclxuICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2Ygcy5zdGVwcykge1xyXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBzdGVwLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgIGtpbmQ6ICduYXZpZ2F0aW9uJyxcclxuICAgICAgICAgICAgICAgIHJvdXRlOiBzdGVwLnJvdXRlLFxyXG4gICAgICAgICAgICAgICAgcHJldmlvdXNSb3V0ZTogc3RlcC5wcmV2aW91c1JvdXRlLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uc0NvdW50OiBzdGVwLmFjdGlvbnMubGVuZ3RoLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2Ygc3RlcC5hY3Rpb25zKSB7XHJcbiAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogYWN0aW9uLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgICAgICBraW5kOiAnY2xpY2snLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhZzogYWN0aW9uLnRhcmdldC50YWcsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhY2tJZDogYWN0aW9uLnRhcmdldC50cmFja0lkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGFjdGlvbi50YXJnZXQudGV4dCxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGb3JtIGV2ZW50c1xyXG4gICAgICAgIGZvciAoY29uc3QgZmUgb2Ygcy5mb3JtRXZlbnRzKSB7XHJcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IGZlLnRpbWVzdGFtcCxcclxuICAgICAgICAgICAgICAgIGtpbmQ6ICdmb3JtRXZlbnQnLFxyXG4gICAgICAgICAgICAgICAgcm91dGU6IGZlLnJvdXRlLFxyXG4gICAgICAgICAgICAgICAgZm9ybUlkOiBmZS5mb3JtSWQsXHJcbiAgICAgICAgICAgICAgICBmaWVsZEtleTogZmUuZmllbGRLZXksXHJcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IGZlLmV2ZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBmZS5tZXRhZGF0YSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBIVFRQIGNhbGxzXHJcbiAgICAgICAgZm9yIChjb25zdCBjYWxsIG9mIHMuY2FsbHMpIHtcclxuICAgICAgICAgICAgZW50cmllcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogY2FsbC50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgICAgICBraW5kOiAnaHR0cENhbGwnLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBjYWxsLm1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHVybDogY2FsbC51cmwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGNhbGwuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgZHVyYXRpb25NczogY2FsbC5kdXJhdGlvbk1zLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdFBheWxvYWQ6IGNhbGwucmVxdWVzdFBheWxvYWQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zZUhlYWRlcnM6IGNhbGwucmVzcG9uc2VIZWFkZXJzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVudHJpZXMuc29ydCgoYSwgYikgPT4gYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcCk7XHJcbiAgICAgICAgdGhpcy50aW1lbGluZUVudHJpZXMgPSBlbnRyaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHZpZXdTZXNzaW9uKHM6IFVpQmxhY2tib3hTZXNzaW9uKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52aWV3aW5nU2Vzc2lvbiA9IHM7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0cygpO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUaW1lbGluZSgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAxOyAvLyBzd2l0Y2ggdG8gdGltZWxpbmVcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZURpYWxvZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDilIDilIDilIAgSlNPTiBNb2RhbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgICBvcGVuSnNvbk1vZGFsKHRpdGxlOiBzdHJpbmcsIGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVWlCbGFja2JveEpzb25WaWV3ZXJDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgc2l6ZTogJ21kJyxcclxuICAgICAgICAgICAgZGF0YTogeyB0aXRsZSwganNvbjogZGF0YSB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOKUgOKUgOKUgCBIVFRQIFNpbXVsYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgICBzaW11bGF0ZUdldCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0dHAuZ2V0KCdodHRwczovL2pzb25wbGFjZWhvbGRlci50eXBpY29kZS5jb20vdG9kb3MvMScsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgICdYLVVpLUJsYWNrYm94JzogJ3RydWUnLFxyXG4gICAgICAgICAgICAgICAgJ1gtVWktQmxhY2tib3gtSGVhZGVycyc6ICdjb250ZW50LXR5cGUnLFxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICB9KS5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB0aGlzLnJlZnJlc2goKSwgZXJyb3I6ICgpID0+IHRoaXMucmVmcmVzaCgpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpbXVsYXRlUG9zdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmh0dHAucG9zdCgnaHR0cHM6Ly9qc29ucGxhY2Vob2xkZXIudHlwaWNvZGUuY29tL3Bvc3RzJywge1xyXG4gICAgICAgICAgICB0aXRsZTogJ0JsYWNrQm94IFRlc3QnLFxyXG4gICAgICAgICAgICBib2R5OiAnUGF5bG9hZCBmaXR0aXppbyBkYWxsYSBkZW1vJyxcclxuICAgICAgICAgICAgdXNlcklkOiA0MixcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7ICdYLVVpLUJsYWNrYm94JzogJ3RydWUnIH0pLFxyXG4gICAgICAgIH0pLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHRoaXMucmVmcmVzaCgpLCBlcnJvcjogKCkgPT4gdGhpcy5yZWZyZXNoKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2ltdWxhdGVGYWlsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaHR0cC5nZXQoJ2h0dHBzOi8vanNvbnBsYWNlaG9sZGVyLnR5cGljb2RlLmNvbS90b2Rvcy85OTk5OTk5OScsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ1gtVWktQmxhY2tib3gnOiAndHJ1ZScgfSksXHJcbiAgICAgICAgfSkuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4gdGhpcy5yZWZyZXNoKCksIGVycm9yOiAoKSA9PiB0aGlzLnJlZnJlc2goKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDilIDilIDilIAgRXhwb3J0IC8gSW1wb3J0IC8gQ2xlYXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gICAgYXN5bmMgZXhwb3J0U2Vzc2lvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMuYmxhY2tib3guZXhwb3J0U2Vzc2lvbnMoKTtcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgYS5ocmVmID0gdXJsO1xyXG4gICAgICAgIGEuZG93bmxvYWQgPSBgYmxhY2tib3gtJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfS5qc29ubGA7XHJcbiAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBpbXBvcnRKc29ubCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgaW5wdXQudHlwZSA9ICdmaWxlJztcclxuICAgICAgICBpbnB1dC5hY2NlcHQgPSAnLmpzb25sLC5qc29uJztcclxuXHJcbiAgICAgICAgaW5wdXQub25jaGFuZ2UgPSBhc3luYyAoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcclxuICAgICAgICAgICAgaWYgKCFmaWxlKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSB0ZXh0LnRyaW0oKS5zcGxpdCgnXFxuJykuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwudHJpbSgpKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25zOiBVaUJsYWNrYm94U2Vzc2lvbltdID0gbGluZXMubWFwKChsOiBzdHJpbmcpID0+IEpTT04ucGFyc2UobCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXN0U2Vzc2lvbnMgPSBbLi4uc2Vzc2lvbnMsIC4uLnRoaXMucGFzdFNlc3Npb25zXTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3aW5nU2Vzc2lvbiA9IHNlc3Npb25zWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RhdHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkVGltZWxpbmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tCbGFja0JveCBEZWJ1Z2dlcl0gRXJyb3JlIHBhcnNpbmcgSlNPTkwnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xlYXJIaXN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYmxhY2tib3guY2xlYXJIaXN0b3J5KCk7XHJcbiAgICAgICAgdGhpcy5wYXN0U2Vzc2lvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxufVxyXG4iXX0=