@tsi-developpement/tsi-shared-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/esm2022/lib/consts/app-providers.mjs +11 -0
  2. package/esm2022/lib/consts/html-template.const.mjs +40 -0
  3. package/esm2022/lib/consts/index.mjs +8 -0
  4. package/esm2022/lib/consts/localization-key.mjs +12 -0
  5. package/esm2022/lib/consts/locals.const.mjs +8 -0
  6. package/esm2022/lib/consts/queryParamNames.const.mjs +11 -0
  7. package/esm2022/lib/consts/themes.mjs +5 -0
  8. package/esm2022/lib/consts/tsi-consts.mjs +45 -0
  9. package/esm2022/lib/end-points/authorization-endpoints.mjs +35 -0
  10. package/esm2022/lib/end-points/baseuri.mjs +11 -0
  11. package/esm2022/lib/end-points/endpoints.mjs +208 -0
  12. package/esm2022/lib/end-points/import-export-endpoint.mjs +35 -0
  13. package/esm2022/lib/end-points/index.mjs +7 -0
  14. package/esm2022/lib/end-points/presentation-settings-endpoints.mjs +13 -0
  15. package/esm2022/lib/end-points/reporting-endpoints.mjs +55 -0
  16. package/esm2022/lib/end-points/shared-endpoint.mjs +12 -0
  17. package/esm2022/lib/end-points/user-identity-endpoints.mjs +61 -0
  18. package/esm2022/lib/enums/Language.mjs +9 -0
  19. package/esm2022/lib/enums/auto-complete.mjs +6 -0
  20. package/esm2022/lib/enums/button-type.enum.mjs +6 -0
  21. package/esm2022/lib/enums/claim-types.mjs +15 -0
  22. package/esm2022/lib/enums/code-format.mjs +6 -0
  23. package/esm2022/lib/enums/component-use-modes-enum.mjs +19 -0
  24. package/esm2022/lib/enums/css-units.mjs +10 -0
  25. package/esm2022/lib/enums/decimal-format.mjs +8 -0
  26. package/esm2022/lib/enums/display-types.mjs +35 -0
  27. package/esm2022/lib/enums/filter-operator-type.mjs +34 -0
  28. package/esm2022/lib/enums/form-validation-error.mjs +7 -0
  29. package/esm2022/lib/enums/grid-selection-mode.mjs +7 -0
  30. package/esm2022/lib/enums/grid-sort-mode.mjs +7 -0
  31. package/esm2022/lib/enums/http-method-types.mjs +6 -0
  32. package/esm2022/lib/enums/index.mjs +25 -0
  33. package/esm2022/lib/enums/input-types.mjs +20 -0
  34. package/esm2022/lib/enums/layout-orientation.mjs +6 -0
  35. package/esm2022/lib/enums/logout-reason-enum.mjs +8 -0
  36. package/esm2022/lib/enums/modal-size-enum.mjs +10 -0
  37. package/esm2022/lib/enums/report-type.mjs +9 -0
  38. package/esm2022/lib/enums/status.mjs +9 -0
  39. package/esm2022/lib/enums/text-box-type.mjs +7 -0
  40. package/esm2022/lib/enums/tooltipPosition.enum.mjs +8 -0
  41. package/esm2022/lib/enums/tsi-component-enum.mjs +40 -0
  42. package/esm2022/lib/enums/type-import.mjs +6 -0
  43. package/esm2022/lib/functions/array.functions.mjs +8 -0
  44. package/esm2022/lib/functions/index.mjs +3 -0
  45. package/esm2022/lib/functions/modal-open.function.mjs +69 -0
  46. package/esm2022/lib/guards/admin.guard.mjs +37 -0
  47. package/esm2022/lib/guards/auth.guard.mjs +30 -0
  48. package/esm2022/lib/guards/index.mjs +4 -0
  49. package/esm2022/lib/guards/permission.guard.mjs +32 -0
  50. package/esm2022/lib/interfaces/configuration/configuration.mjs +2 -0
  51. package/esm2022/lib/interfaces/generic-form/generic-form.mjs +118 -0
  52. package/esm2022/lib/interfaces/generic-types/dictionary.mjs +2 -0
  53. package/esm2022/lib/interfaces/grid/grid-configuration.mjs +2 -0
  54. package/esm2022/lib/interfaces/index.mjs +12 -0
  55. package/esm2022/lib/interfaces/modal/dynamic.component.mjs +7 -0
  56. package/esm2022/lib/interfaces/modal/modal-size.mjs +2 -0
  57. package/esm2022/lib/interfaces/pagination/pagination-base.mjs +2 -0
  58. package/esm2022/lib/interfaces/select-list/combo-status-model.mjs +10 -0
  59. package/esm2022/lib/interfaces/settings/app-settings.mjs +2 -0
  60. package/esm2022/lib/interfaces/styles/css-size-property.mjs +17 -0
  61. package/esm2022/lib/interfaces/translation/translation.mjs +2 -0
  62. package/esm2022/lib/models/Notes/Note.mjs +7 -0
  63. package/esm2022/lib/models/application/configuration/endpoint-infos.mjs +3 -0
  64. package/esm2022/lib/models/application/configuration/entity-delete-behavior.mjs +2 -0
  65. package/esm2022/lib/models/authorization/authorization-token-mapper.mjs +24 -0
  66. package/esm2022/lib/models/authorization/authorization-token.mjs +2 -0
  67. package/esm2022/lib/models/common/component-descriminator.mjs +2 -0
  68. package/esm2022/lib/models/common/entity-properties.mjs +2 -0
  69. package/esm2022/lib/models/common/entity-validations.mjs +2 -0
  70. package/esm2022/lib/models/common/event-schema.mjs +2 -0
  71. package/esm2022/lib/models/common/key-value-pair.mjs +2 -0
  72. package/esm2022/lib/models/entity-info/entity-info.mjs +29 -0
  73. package/esm2022/lib/models/filter/filter-by-existing-values.mjs +7 -0
  74. package/esm2022/lib/models/filter/paged-result-request-base.mjs +13 -0
  75. package/esm2022/lib/models/filter/search-field.mjs +2 -0
  76. package/esm2022/lib/models/import-export/import-export.mjs +15 -0
  77. package/esm2022/lib/models/index.mjs +38 -0
  78. package/esm2022/lib/models/journalisation-application/journalisation-application.mjs +10 -0
  79. package/esm2022/lib/models/journalisation-application/status-history.mjs +3 -0
  80. package/esm2022/lib/models/layout/layout-config.mjs +2 -0
  81. package/esm2022/lib/models/modal/bs-modal.mjs +6 -0
  82. package/esm2022/lib/models/presentation-settings/presentation-settings.mjs +8 -0
  83. package/esm2022/lib/models/progress-bar/progress-bar-create-request.mjs +2 -0
  84. package/esm2022/lib/models/progress-bar/progress-bar-response.mjs +8 -0
  85. package/esm2022/lib/models/progress-bar/progress-bar-update-request.mjs +3 -0
  86. package/esm2022/lib/models/remote-services-utility/subscription-result.mjs +17 -0
  87. package/esm2022/lib/models/reporting/json-data-connection.mjs +2 -0
  88. package/esm2022/lib/models/reporting/optional-endpoints.mjs +2 -0
  89. package/esm2022/lib/models/reporting/report-template-response.mjs +2 -0
  90. package/esm2022/lib/models/reporting/report-to-edit-template.mjs +2 -0
  91. package/esm2022/lib/models/reporting/report-to-print.mjs +2 -0
  92. package/esm2022/lib/models/reporting/report-to-template.mjs +2 -0
  93. package/esm2022/lib/models/settings/devise.mjs +3 -0
  94. package/esm2022/lib/models/settings/fichier.mjs +6 -0
  95. package/esm2022/lib/models/settings/type-fichier.mjs +3 -0
  96. package/esm2022/lib/models/tsi-card/tsi-card.mjs +3 -0
  97. package/esm2022/lib/models/user-identity/login-response.mjs +7 -0
  98. package/esm2022/lib/models/user-identity/tenant.mjs +3 -0
  99. package/esm2022/lib/models/user-identity/user-identity.mjs +3 -0
  100. package/esm2022/lib/models/workflow/workflow.mjs +14 -0
  101. package/esm2022/lib/package-initializer.mjs +7 -0
  102. package/esm2022/lib/pipes/cut-label.pipe.mjs +23 -0
  103. package/esm2022/lib/pipes/index.mjs +8 -0
  104. package/esm2022/lib/pipes/localize.pipe.mjs +51 -0
  105. package/esm2022/lib/pipes/modal-label.pipe.mjs +37 -0
  106. package/esm2022/lib/pipes/shorten.pipe.mjs +20 -0
  107. package/esm2022/lib/pipes/to-number.pipe.mjs +20 -0
  108. package/esm2022/lib/pipes/tsi-currency.pipe.mjs +29 -0
  109. package/esm2022/lib/pipes/tsi-decimal.pipe.mjs +21 -0
  110. package/esm2022/lib/providers/index.mjs +2 -0
  111. package/esm2022/lib/providers/shared-ui-tsi.provider.mjs +15 -0
  112. package/esm2022/lib/routes/admin.routes.mjs +5 -0
  113. package/esm2022/lib/routes/app.routes.mjs +7 -0
  114. package/esm2022/lib/routes/identity.routes.mjs +4 -0
  115. package/esm2022/lib/routes/index.mjs +5 -0
  116. package/esm2022/lib/routes/manage-reporting.routes.mjs +5 -0
  117. package/esm2022/lib/services/Component-Finder/tsi-component-finder.service.mjs +22 -0
  118. package/esm2022/lib/services/Import-Export/modele-import.service.mjs +59 -0
  119. package/esm2022/lib/services/Note/Note.service.mjs +35 -0
  120. package/esm2022/lib/services/UserIdentity/identity-platform-authentication.service.mjs +29 -0
  121. package/esm2022/lib/services/UserIdentity/user-identity.service.mjs +40 -0
  122. package/esm2022/lib/services/application/api-explorer.service.mjs +24 -0
  123. package/esm2022/lib/services/application/app.layout.service.mjs +97 -0
  124. package/esm2022/lib/services/application/parametres-application-parambase.service.mjs +20 -0
  125. package/esm2022/lib/services/authorization/authorization.service.mjs +124 -0
  126. package/esm2022/lib/services/authorization/identity-manager.service.mjs +97 -0
  127. package/esm2022/lib/services/base/crud-base.service.mjs +38 -0
  128. package/esm2022/lib/services/configuration/entity-configuration.service.mjs +49 -0
  129. package/esm2022/lib/services/currentUser/currentUser.service.mjs +49 -0
  130. package/esm2022/lib/services/date-helper.service.mjs +133 -0
  131. package/esm2022/lib/services/dialog-data.service.mjs +32 -0
  132. package/esm2022/lib/services/fichier/fichier-upload.service.mjs +44 -0
  133. package/esm2022/lib/services/fichier/fichier.service.mjs +20 -0
  134. package/esm2022/lib/services/formula.service.mjs +20 -0
  135. package/esm2022/lib/services/generator/html-template-generator.service.mjs +196 -0
  136. package/esm2022/lib/services/index.mjs +41 -0
  137. package/esm2022/lib/services/journalisation/journalisation-application.service.mjs +23 -0
  138. package/esm2022/lib/services/journalisation/status-history.service.mjs +23 -0
  139. package/esm2022/lib/services/layout/layout-helper.service.mjs +72 -0
  140. package/esm2022/lib/services/modal/tsi-bs-modal.service.mjs +37 -0
  141. package/esm2022/lib/services/modal/tsi-modal.service.mjs +21 -0
  142. package/esm2022/lib/services/module-code/module-code.service.mjs +31 -0
  143. package/esm2022/lib/services/module-main-parameter.service.mjs +31 -0
  144. package/esm2022/lib/services/notification/error-response-manager.service.mjs +57 -0
  145. package/esm2022/lib/services/notification/tsi-confirmation.service.mjs +37 -0
  146. package/esm2022/lib/services/notification/tsi-message.service.mjs +54 -0
  147. package/esm2022/lib/services/notification/tsi-notification.service.mjs +47 -0
  148. package/esm2022/lib/services/presentation-setting/presentation-designer-base.service.mjs +26 -0
  149. package/esm2022/lib/services/presentation-setting/presentation-designer.service.mjs +58 -0
  150. package/esm2022/lib/services/presentation-setting/presentation-setting.service.mjs +39 -0
  151. package/esm2022/lib/services/progress-bar/progress-bar-helper.service.mjs +39 -0
  152. package/esm2022/lib/services/progress-bar/progress-bar.service.mjs +30 -0
  153. package/esm2022/lib/services/record-info-popup.service.mjs +21 -0
  154. package/esm2022/lib/services/reporting/dashboard-module.service.mjs +24 -0
  155. package/esm2022/lib/services/reporting/reporting.service.mjs +111 -0
  156. package/esm2022/lib/services/settings/app-settings.service.mjs +47 -0
  157. package/esm2022/lib/services/settings/keyboard-shortcut.service.mjs +30 -0
  158. package/esm2022/lib/services/status/entityStatus.service.mjs +21 -0
  159. package/esm2022/lib/services/translation/translation.service.mjs +71 -0
  160. package/esm2022/lib/services/validation/entity-validations.service.mjs +21 -0
  161. package/esm2022/lib/services/validation/generic-validation-state.service.mjs +30 -0
  162. package/esm2022/lib/services/validation/input-registry.service.mjs +25 -0
  163. package/esm2022/lib/services/workflow/workflow-configuration.service.mjs +80 -0
  164. package/esm2022/lib/shared.module.mjs +643 -0
  165. package/esm2022/lib/tsi-base/components/app-base/app-base.component.mjs +101 -0
  166. package/esm2022/lib/tsi-base/components/tsi-base/tsi-base.component.mjs +25 -0
  167. package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +645 -0
  168. package/esm2022/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.mjs +514 -0
  169. package/esm2022/lib/tsi-base/index.mjs +6 -0
  170. package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +141 -0
  171. package/esm2022/lib/tsi-components/alert-import-message/alert-import-message.component.mjs +19 -0
  172. package/esm2022/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.mjs +40 -0
  173. package/esm2022/lib/tsi-components/button-components/tsi-button/tsi-button.component.mjs +75 -0
  174. package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +173 -0
  175. package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +201 -0
  176. package/esm2022/lib/tsi-components/index.mjs +80 -0
  177. package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +643 -0
  178. package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +120 -0
  179. package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +53 -0
  180. package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +62 -0
  181. package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +116 -0
  182. package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +51 -0
  183. package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +195 -0
  184. package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +54 -0
  185. package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +55 -0
  186. package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +43 -0
  187. package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +56 -0
  188. package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +649 -0
  189. package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +44 -0
  190. package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +50 -0
  191. package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +65 -0
  192. package/esm2022/lib/tsi-components/logout-popup/logout-popup.component.mjs +12 -0
  193. package/esm2022/lib/tsi-components/manage-import-export/manage-import-export.component.mjs +435 -0
  194. package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +148 -0
  195. package/esm2022/lib/tsi-components/manage-reporting/manage-reporting.component.mjs +1075 -0
  196. package/esm2022/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.mjs +31 -0
  197. package/esm2022/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.mjs +24 -0
  198. package/esm2022/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.mjs +19 -0
  199. package/esm2022/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.mjs +22 -0
  200. package/esm2022/lib/tsi-components/modal-component/modal.component.mjs +138 -0
  201. package/esm2022/lib/tsi-components/modal-loader/modal-loader.component.mjs +58 -0
  202. package/esm2022/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.mjs +32 -0
  203. package/esm2022/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.mjs +18 -0
  204. package/esm2022/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.mjs +17 -0
  205. package/esm2022/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.mjs +57 -0
  206. package/esm2022/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.mjs +27 -0
  207. package/esm2022/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.mjs +25 -0
  208. package/esm2022/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.mjs +139 -0
  209. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +1509 -0
  210. package/esm2022/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.mjs +144 -0
  211. package/esm2022/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.mjs +13 -0
  212. package/esm2022/lib/tsi-components/output-components/tsi-label/tsi-label.component.mjs +24 -0
  213. package/esm2022/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.mjs +18 -0
  214. package/esm2022/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.mjs +20 -0
  215. package/esm2022/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.mjs +17 -0
  216. package/esm2022/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.mjs +30 -0
  217. package/esm2022/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.mjs +17 -0
  218. package/esm2022/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.mjs +427 -0
  219. package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +667 -0
  220. package/esm2022/lib/tsi-components/spinner/spinner.component.mjs +15 -0
  221. package/esm2022/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.mjs +21 -0
  222. package/esm2022/lib/tsi-components/tsi-calender/context-menu/context-menu.component.mjs +46 -0
  223. package/esm2022/lib/tsi-components/tsi-calender/tsi-calender.component.mjs +297 -0
  224. package/esm2022/lib/tsi-components/tsi-card/tsi-card.component.mjs +64 -0
  225. package/esm2022/lib/tsi-components/tsi-card-list/tsi-card-list.component.mjs +112 -0
  226. package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +39 -0
  227. package/esm2022/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.mjs +83 -0
  228. package/esm2022/lib/tsi-components/tsi-divider/tsi-divider.component.mjs +18 -0
  229. package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +305 -0
  230. package/esm2022/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.mjs +15 -0
  231. package/esm2022/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.mjs +883 -0
  232. package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +149 -0
  233. package/esm2022/lib/tsi-components/tsi-kanban/tsi-kanban.component.mjs +231 -0
  234. package/esm2022/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.mjs +119 -0
  235. package/esm2022/lib/tsi-components/tsi-modal/tsi-modal.component.mjs +25 -0
  236. package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +119 -0
  237. package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +54 -0
  238. package/esm2022/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.mjs +27 -0
  239. package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +123 -0
  240. package/esm2022/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.mjs +41 -0
  241. package/esm2022/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.mjs +187 -0
  242. package/esm2022/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.mjs +170 -0
  243. package/esm2022/lib/tsi-components/tsi-search-box/tsi-search-box.component.mjs +142 -0
  244. package/esm2022/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.mjs +37 -0
  245. package/esm2022/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.mjs +52 -0
  246. package/esm2022/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.mjs +46 -0
  247. package/esm2022/lib/tsi-components/tsi-tenants/tsi-tenants.component.mjs +122 -0
  248. package/esm2022/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.mjs +21 -0
  249. package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +186 -0
  250. package/esm2022/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.mjs +54 -0
  251. package/esm2022/lib/tsi-directives/auto-select.directive.mjs +33 -0
  252. package/esm2022/lib/tsi-directives/busy.directive.mjs +32 -0
  253. package/esm2022/lib/tsi-directives/dynamic-component-loader/ad.directive.mjs +16 -0
  254. package/esm2022/lib/tsi-directives/index.mjs +8 -0
  255. package/esm2022/lib/tsi-directives/module-main-parameter.directive.mjs +16 -0
  256. package/esm2022/lib/tsi-directives/presentation-designer-base.directive.mjs +238 -0
  257. package/esm2022/lib/tsi-directives/presentation-designer.directive.mjs +205 -0
  258. package/esm2022/lib/tsi-directives/validation.directive.mjs +85 -0
  259. package/esm2022/lib/tsi-helpers/compoent-reference.helper.mjs +7 -0
  260. package/esm2022/lib/tsi-helpers/date-helper.mjs +21 -0
  261. package/esm2022/lib/tsi-helpers/export-excel.helper.mjs +40 -0
  262. package/esm2022/lib/tsi-helpers/filter-helper.mjs +126 -0
  263. package/esm2022/lib/tsi-helpers/grid-col-style.helper.mjs +7 -0
  264. package/esm2022/lib/tsi-helpers/guid.helper.mjs +19 -0
  265. package/esm2022/lib/tsi-helpers/helpers.mjs +9 -0
  266. package/esm2022/lib/tsi-helpers/index.mjs +13 -0
  267. package/esm2022/lib/tsi-helpers/mapping-helper.mjs +10 -0
  268. package/esm2022/lib/tsi-helpers/object.helper.mjs +6 -0
  269. package/esm2022/lib/tsi-helpers/primeng-translate-config.mjs +55 -0
  270. package/esm2022/lib/tsi-helpers/storage-manager.mjs +33 -0
  271. package/esm2022/lib/tsi-helpers/type-registry.helper.mjs +49 -0
  272. package/esm2022/lib/types/enum-description.type.mjs +2 -0
  273. package/esm2022/lib/types/index.mjs +3 -0
  274. package/esm2022/lib/types/time-only.mjs +42 -0
  275. package/esm2022/public-api.mjs +21 -0
  276. package/esm2022/tsi-developpement-tsi-shared-ui.mjs +5 -0
  277. package/esm2022/tsi-tsi-shared-ui.mjs +5 -0
  278. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +17486 -0
  279. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -0
  280. package/fesm2022/tsi-tsi-shared-ui.mjs +17486 -0
  281. package/fesm2022/tsi-tsi-shared-ui.mjs.map +1 -0
  282. package/index.d.ts +5 -0
  283. package/lib/consts/app-providers.d.ts +4 -0
  284. package/lib/consts/html-template.const.d.ts +12 -0
  285. package/lib/consts/index.d.ts +7 -0
  286. package/lib/consts/localization-key.d.ts +11 -0
  287. package/lib/consts/locals.const.d.ts +7 -0
  288. package/lib/consts/queryParamNames.const.d.ts +10 -0
  289. package/lib/consts/themes.d.ts +4 -0
  290. package/lib/consts/tsi-consts.d.ts +40 -0
  291. package/lib/end-points/authorization-endpoints.d.ts +31 -0
  292. package/lib/end-points/baseuri.d.ts +10 -0
  293. package/lib/end-points/endpoints.d.ts +205 -0
  294. package/lib/end-points/import-export-endpoint.d.ts +33 -0
  295. package/lib/end-points/index.d.ts +6 -0
  296. package/lib/end-points/presentation-settings-endpoints.d.ts +11 -0
  297. package/lib/end-points/reporting-endpoints.d.ts +53 -0
  298. package/lib/end-points/shared-endpoint.d.ts +9 -0
  299. package/lib/end-points/user-identity-endpoints.d.ts +59 -0
  300. package/lib/enums/Language.d.ts +9 -0
  301. package/lib/enums/auto-complete.d.ts +4 -0
  302. package/lib/enums/button-type.enum.d.ts +4 -0
  303. package/lib/enums/claim-types.d.ts +13 -0
  304. package/lib/enums/code-format.d.ts +4 -0
  305. package/lib/enums/component-use-modes-enum.d.ts +17 -0
  306. package/lib/enums/css-units.d.ts +8 -0
  307. package/lib/enums/decimal-format.d.ts +6 -0
  308. package/lib/enums/display-types.d.ts +17 -0
  309. package/lib/enums/filter-operator-type.d.ts +18 -0
  310. package/lib/enums/form-validation-error.d.ts +11 -0
  311. package/lib/enums/grid-selection-mode.d.ts +5 -0
  312. package/lib/enums/grid-sort-mode.d.ts +5 -0
  313. package/lib/enums/http-method-types.d.ts +4 -0
  314. package/lib/enums/index.d.ts +24 -0
  315. package/lib/enums/input-types.d.ts +18 -0
  316. package/lib/enums/layout-orientation.d.ts +4 -0
  317. package/lib/enums/logout-reason-enum.d.ts +6 -0
  318. package/lib/enums/modal-size-enum.d.ts +10 -0
  319. package/lib/enums/report-type.d.ts +7 -0
  320. package/lib/enums/status.d.ts +7 -0
  321. package/lib/enums/text-box-type.d.ts +5 -0
  322. package/lib/enums/tooltipPosition.enum.d.ts +6 -0
  323. package/lib/enums/tsi-component-enum.d.ts +37 -0
  324. package/lib/enums/type-import.d.ts +4 -0
  325. package/lib/functions/array.functions.d.ts +1 -0
  326. package/lib/functions/index.d.ts +1 -0
  327. package/lib/functions/modal-open.function.d.ts +9 -0
  328. package/lib/guards/admin.guard.d.ts +14 -0
  329. package/lib/guards/auth.guard.d.ts +12 -0
  330. package/lib/guards/index.d.ts +3 -0
  331. package/lib/guards/permission.guard.d.ts +2 -0
  332. package/lib/interfaces/configuration/configuration.d.ts +10 -0
  333. package/lib/interfaces/generic-form/generic-form.d.ts +45 -0
  334. package/lib/interfaces/generic-types/dictionary.d.ts +3 -0
  335. package/lib/interfaces/grid/grid-configuration.d.ts +116 -0
  336. package/lib/interfaces/index.d.ts +11 -0
  337. package/lib/interfaces/modal/dynamic.component.d.ts +18 -0
  338. package/lib/interfaces/modal/modal-size.d.ts +4 -0
  339. package/lib/interfaces/pagination/pagination-base.d.ts +46 -0
  340. package/lib/interfaces/select-list/combo-status-model.d.ts +8 -0
  341. package/lib/interfaces/settings/app-settings.d.ts +4 -0
  342. package/lib/interfaces/styles/css-size-property.d.ts +10 -0
  343. package/lib/interfaces/translation/translation.d.ts +10 -0
  344. package/lib/models/Notes/Note.d.ts +25 -0
  345. package/lib/models/application/configuration/endpoint-infos.d.ts +6 -0
  346. package/lib/models/application/configuration/entity-delete-behavior.d.ts +6 -0
  347. package/lib/models/authorization/authorization-token-mapper.d.ts +4 -0
  348. package/lib/models/authorization/authorization-token.d.ts +16 -0
  349. package/lib/models/common/component-descriminator.d.ts +4 -0
  350. package/lib/models/common/entity-properties.d.ts +5 -0
  351. package/lib/models/common/entity-validations.d.ts +7 -0
  352. package/lib/models/common/event-schema.d.ts +6 -0
  353. package/lib/models/common/key-value-pair.d.ts +4 -0
  354. package/lib/models/entity-info/entity-info.d.ts +37 -0
  355. package/lib/models/filter/filter-by-existing-values.d.ts +6 -0
  356. package/lib/models/filter/paged-result-request-base.d.ts +16 -0
  357. package/lib/models/filter/search-field.d.ts +35 -0
  358. package/lib/models/import-export/import-export.d.ts +28 -0
  359. package/lib/models/index.d.ts +37 -0
  360. package/lib/models/journalisation-application/journalisation-application.d.ts +39 -0
  361. package/lib/models/journalisation-application/status-history.d.ts +12 -0
  362. package/lib/models/layout/layout-config.d.ts +3 -0
  363. package/lib/models/modal/bs-modal.d.ts +5 -0
  364. package/lib/models/presentation-settings/presentation-settings.d.ts +14 -0
  365. package/lib/models/progress-bar/progress-bar-create-request.d.ts +8 -0
  366. package/lib/models/progress-bar/progress-bar-response.d.ts +10 -0
  367. package/lib/models/progress-bar/progress-bar-update-request.d.ts +9 -0
  368. package/lib/models/remote-services-utility/subscription-result.d.ts +15 -0
  369. package/lib/models/reporting/json-data-connection.d.ts +6 -0
  370. package/lib/models/reporting/optional-endpoints.d.ts +8 -0
  371. package/lib/models/reporting/report-template-response.d.ts +13 -0
  372. package/lib/models/reporting/report-to-edit-template.d.ts +29 -0
  373. package/lib/models/reporting/report-to-print.d.ts +18 -0
  374. package/lib/models/reporting/report-to-template.d.ts +19 -0
  375. package/lib/models/settings/devise.d.ts +9 -0
  376. package/lib/models/settings/fichier.d.ts +14 -0
  377. package/lib/models/settings/type-fichier.d.ts +4 -0
  378. package/lib/models/tsi-card/tsi-card.d.ts +9 -0
  379. package/lib/models/user-identity/login-response.d.ts +8 -0
  380. package/lib/models/user-identity/tenant.d.ts +5 -0
  381. package/lib/models/user-identity/user-identity.d.ts +5 -0
  382. package/lib/models/workflow/workflow.d.ts +36 -0
  383. package/lib/package-initializer.d.ts +1 -0
  384. package/lib/pipes/cut-label.pipe.d.ts +7 -0
  385. package/lib/pipes/index.d.ts +7 -0
  386. package/lib/pipes/localize.pipe.d.ts +11 -0
  387. package/lib/pipes/modal-label.pipe.d.ts +10 -0
  388. package/lib/pipes/shorten.pipe.d.ts +7 -0
  389. package/lib/pipes/to-number.pipe.d.ts +7 -0
  390. package/lib/pipes/tsi-currency.pipe.d.ts +10 -0
  391. package/lib/pipes/tsi-decimal.pipe.d.ts +7 -0
  392. package/lib/providers/index.d.ts +1 -0
  393. package/lib/providers/shared-ui-tsi.provider.d.ts +8 -0
  394. package/lib/routes/admin.routes.d.ts +4 -0
  395. package/lib/routes/app.routes.d.ts +6 -0
  396. package/lib/routes/identity.routes.d.ts +3 -0
  397. package/lib/routes/index.d.ts +4 -0
  398. package/lib/routes/manage-reporting.routes.d.ts +4 -0
  399. package/lib/services/Component-Finder/tsi-component-finder.service.d.ts +10 -0
  400. package/lib/services/Import-Export/modele-import.service.d.ts +21 -0
  401. package/lib/services/Note/Note.service.d.ts +15 -0
  402. package/lib/services/UserIdentity/identity-platform-authentication.service.d.ts +13 -0
  403. package/lib/services/UserIdentity/user-identity.service.d.ts +15 -0
  404. package/lib/services/application/api-explorer.service.d.ts +13 -0
  405. package/lib/services/application/app.layout.service.d.ts +47 -0
  406. package/lib/services/application/parametres-application-parambase.service.d.ts +10 -0
  407. package/lib/services/authorization/authorization.service.d.ts +46 -0
  408. package/lib/services/authorization/identity-manager.service.d.ts +23 -0
  409. package/lib/services/base/crud-base.service.d.ts +20 -0
  410. package/lib/services/configuration/entity-configuration.service.d.ts +22 -0
  411. package/lib/services/currentUser/currentUser.service.d.ts +26 -0
  412. package/lib/services/date-helper.service.d.ts +32 -0
  413. package/lib/services/dialog-data.service.d.ts +12 -0
  414. package/lib/services/fichier/fichier-upload.service.d.ts +15 -0
  415. package/lib/services/fichier/fichier.service.d.ts +10 -0
  416. package/lib/services/formula.service.d.ts +10 -0
  417. package/lib/services/generator/html-template-generator.service.d.ts +28 -0
  418. package/lib/services/index.d.ts +40 -0
  419. package/lib/services/journalisation/journalisation-application.service.d.ts +12 -0
  420. package/lib/services/journalisation/status-history.service.d.ts +12 -0
  421. package/lib/services/layout/layout-helper.service.d.ts +25 -0
  422. package/lib/services/modal/tsi-bs-modal.service.d.ts +16 -0
  423. package/lib/services/modal/tsi-modal.service.d.ts +9 -0
  424. package/lib/services/module-code/module-code.service.d.ts +18 -0
  425. package/lib/services/module-main-parameter.service.d.ts +12 -0
  426. package/lib/services/notification/error-response-manager.service.d.ts +13 -0
  427. package/lib/services/notification/tsi-confirmation.service.d.ts +11 -0
  428. package/lib/services/notification/tsi-message.service.d.ts +13 -0
  429. package/lib/services/notification/tsi-notification.service.d.ts +18 -0
  430. package/lib/services/presentation-setting/presentation-designer-base.service.d.ts +14 -0
  431. package/lib/services/presentation-setting/presentation-designer.service.d.ts +19 -0
  432. package/lib/services/presentation-setting/presentation-setting.service.d.ts +16 -0
  433. package/lib/services/progress-bar/progress-bar-helper.service.d.ts +19 -0
  434. package/lib/services/progress-bar/progress-bar.service.d.ts +16 -0
  435. package/lib/services/record-info-popup.service.d.ts +10 -0
  436. package/lib/services/reporting/dashboard-module.service.d.ts +11 -0
  437. package/lib/services/reporting/reporting.service.d.ts +32 -0
  438. package/lib/services/settings/app-settings.service.d.ts +13 -0
  439. package/lib/services/settings/keyboard-shortcut.service.d.ts +9 -0
  440. package/lib/services/status/entityStatus.service.d.ts +11 -0
  441. package/lib/services/translation/translation.service.d.ts +20 -0
  442. package/lib/services/validation/entity-validations.service.d.ts +10 -0
  443. package/lib/services/validation/generic-validation-state.service.d.ts +15 -0
  444. package/lib/services/validation/input-registry.service.d.ts +11 -0
  445. package/lib/services/workflow/workflow-configuration.service.d.ts +28 -0
  446. package/lib/shared.module.d.ts +141 -0
  447. package/lib/tsi-base/components/app-base/app-base.component.d.ts +28 -0
  448. package/lib/tsi-base/components/tsi-base/tsi-base.component.d.ts +11 -0
  449. package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +118 -0
  450. package/lib/tsi-base/components/tsi-list-base/tsi-list-base.component.d.ts +85 -0
  451. package/lib/tsi-base/index.d.ts +5 -0
  452. package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +34 -0
  453. package/lib/tsi-components/alert-import-message/alert-import-message.component.d.ts +10 -0
  454. package/lib/tsi-components/button-components/Tsi-Submit-Button/tsi-submit-button.component.d.ts +16 -0
  455. package/lib/tsi-components/button-components/tsi-button/tsi-button.component.d.ts +26 -0
  456. package/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.d.ts +31 -0
  457. package/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.d.ts +52 -0
  458. package/lib/tsi-components/index.d.ts +79 -0
  459. package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +127 -0
  460. package/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.d.ts +30 -0
  461. package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +18 -0
  462. package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +21 -0
  463. package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +38 -0
  464. package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +14 -0
  465. package/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.d.ts +45 -0
  466. package/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.d.ts +17 -0
  467. package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +19 -0
  468. package/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.d.ts +16 -0
  469. package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +16 -0
  470. package/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.d.ts +92 -0
  471. package/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.d.ts +17 -0
  472. package/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.d.ts +21 -0
  473. package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +23 -0
  474. package/lib/tsi-components/logout-popup/logout-popup.component.d.ts +5 -0
  475. package/lib/tsi-components/manage-import-export/manage-import-export.component.d.ts +64 -0
  476. package/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.d.ts +151 -0
  477. package/lib/tsi-components/manage-reporting/manage-reporting.component.d.ts +109 -0
  478. package/lib/tsi-components/message-components/tsi-error-message/tsi-error-message.component.d.ts +15 -0
  479. package/lib/tsi-components/message-components/tsi-info-message/tsi-info-message.component.d.ts +13 -0
  480. package/lib/tsi-components/message-components/tsi-redirection-message/tsi-redirection-message.component.d.ts +9 -0
  481. package/lib/tsi-components/message-components/tsi-success-message/tsi-success-message.component.d.ts +13 -0
  482. package/lib/tsi-components/modal-component/modal.component.d.ts +25 -0
  483. package/lib/tsi-components/modal-loader/modal-loader.component.d.ts +27 -0
  484. package/lib/tsi-components/output-components/display-nested-prop/display-nested-prop.component.d.ts +14 -0
  485. package/lib/tsi-components/output-components/tsi-checkbox-display/tsi-checkbox-display.component.d.ts +6 -0
  486. package/lib/tsi-components/output-components/tsi-currency-other-display/tsi-currency-other-display.component.d.ts +7 -0
  487. package/lib/tsi-components/output-components/tsi-currency-societe-display/tsi-currency-societe-display.component.d.ts +19 -0
  488. package/lib/tsi-components/output-components/tsi-date-display/tsi-date-display.component.d.ts +10 -0
  489. package/lib/tsi-components/output-components/tsi-decimal-display/tsi-decimal-display.component.d.ts +9 -0
  490. package/lib/tsi-components/output-components/tsi-display-grid/tsi-display-grid.component.d.ts +41 -0
  491. package/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.d.ts +231 -0
  492. package/lib/tsi-components/output-components/tsi-image-display/tsi-image-display.component.d.ts +46 -0
  493. package/lib/tsi-components/output-components/tsi-integer-display/tsi-integer-display.component.d.ts +6 -0
  494. package/lib/tsi-components/output-components/tsi-label/tsi-label.component.d.ts +8 -0
  495. package/lib/tsi-components/output-components/tsi-label-legend/tsi-label-legend.component.d.ts +6 -0
  496. package/lib/tsi-components/output-components/tsi-legend/tsi-legend.component.d.ts +9 -0
  497. package/lib/tsi-components/output-components/tsi-paragraph/tsi-paragraph.component.d.ts +6 -0
  498. package/lib/tsi-components/output-components/tsi-rate-display/tsi-rate-display.component.d.ts +10 -0
  499. package/lib/tsi-components/output-components/tsi-time-display/tsi-time-display.component.d.ts +7 -0
  500. package/lib/tsi-components/output-components/tsi-view-grid/tsi-view-grid.component.d.ts +97 -0
  501. package/lib/tsi-components/reporting/reporting.component.d.ts +103 -0
  502. package/lib/tsi-components/spinner/spinner.component.d.ts +8 -0
  503. package/lib/tsi-components/tsi-bubble-info/tsi-bubble-info.component.d.ts +9 -0
  504. package/lib/tsi-components/tsi-calender/context-menu/context-menu.component.d.ts +25 -0
  505. package/lib/tsi-components/tsi-calender/tsi-calender.component.d.ts +50 -0
  506. package/lib/tsi-components/tsi-card/tsi-card.component.d.ts +25 -0
  507. package/lib/tsi-components/tsi-card-list/tsi-card-list.component.d.ts +35 -0
  508. package/lib/tsi-components/tsi-change-password/tsi-change-password.component.d.ts +21 -0
  509. package/lib/tsi-components/tsi-code-generator/tsi-code-generator.component.d.ts +23 -0
  510. package/lib/tsi-components/tsi-divider/tsi-divider.component.d.ts +6 -0
  511. package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +91 -0
  512. package/lib/tsi-components/tsi-form-modal-footer/tsi-form-modal-footer.component.d.ts +8 -0
  513. package/lib/tsi-components/tsi-generic-crud/tsi-generic-crud.component.d.ts +156 -0
  514. package/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.d.ts +28 -0
  515. package/lib/tsi-components/tsi-kanban/tsi-kanban.component.d.ts +68 -0
  516. package/lib/tsi-components/tsi-log-event-history/tsi-log-event-history.component.d.ts +35 -0
  517. package/lib/tsi-components/tsi-modal/tsi-modal.component.d.ts +10 -0
  518. package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +38 -0
  519. package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +19 -0
  520. package/lib/tsi-components/tsi-notes-avertir/tsi-notes-avertir.component.d.ts +13 -0
  521. package/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.d.ts +21 -0
  522. package/lib/tsi-components/tsi-notes-grid/tsi-notes-grid.component.d.ts +12 -0
  523. package/lib/tsi-components/tsi-popup-text-viewer/tsi-popup-text-viewer.component.d.ts +41 -0
  524. package/lib/tsi-components/tsi-progress-bar/tsi-progress-bar.component.d.ts +38 -0
  525. package/lib/tsi-components/tsi-search-box/tsi-search-box.component.d.ts +44 -0
  526. package/lib/tsi-components/tsi-send-mail/tsi-send-mail.component.d.ts +21 -0
  527. package/lib/tsi-components/tsi-tab-panel/tsi-tab-panel.component.d.ts +18 -0
  528. package/lib/tsi-components/tsi-tab-view/tsi-tab-view.component.d.ts +17 -0
  529. package/lib/tsi-components/tsi-tenants/tsi-tenants.component.d.ts +39 -0
  530. package/lib/tsi-components/tsi-tooltip/tsi-tooltip.component.d.ts +9 -0
  531. package/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.d.ts +35 -0
  532. package/lib/tsi-components/tsi-upload-grid/tsi-upload-grid.component.d.ts +13 -0
  533. package/lib/tsi-directives/auto-select.directive.d.ts +9 -0
  534. package/lib/tsi-directives/busy.directive.d.ts +11 -0
  535. package/lib/tsi-directives/dynamic-component-loader/ad.directive.d.ts +8 -0
  536. package/lib/tsi-directives/index.d.ts +7 -0
  537. package/lib/tsi-directives/module-main-parameter.directive.d.ts +8 -0
  538. package/lib/tsi-directives/presentation-designer-base.directive.d.ts +41 -0
  539. package/lib/tsi-directives/presentation-designer.directive.d.ts +37 -0
  540. package/lib/tsi-directives/validation.directive.d.ts +18 -0
  541. package/lib/tsi-helpers/compoent-reference.helper.d.ts +5 -0
  542. package/lib/tsi-helpers/date-helper.d.ts +6 -0
  543. package/lib/tsi-helpers/export-excel.helper.d.ts +5 -0
  544. package/lib/tsi-helpers/filter-helper.d.ts +12 -0
  545. package/lib/tsi-helpers/grid-col-style.helper.d.ts +5 -0
  546. package/lib/tsi-helpers/guid.helper.d.ts +6 -0
  547. package/lib/tsi-helpers/helpers.d.ts +4 -0
  548. package/lib/tsi-helpers/index.d.ts +12 -0
  549. package/lib/tsi-helpers/mapping-helper.d.ts +5 -0
  550. package/lib/tsi-helpers/object.helper.d.ts +3 -0
  551. package/lib/tsi-helpers/primeng-translate-config.d.ts +54 -0
  552. package/lib/tsi-helpers/storage-manager.d.ts +8 -0
  553. package/lib/tsi-helpers/type-registry.helper.d.ts +34 -0
  554. package/lib/types/enum-description.type.d.ts +3 -0
  555. package/lib/types/index.d.ts +2 -0
  556. package/lib/types/time-only.d.ts +17 -0
  557. package/package.json +24 -0
  558. package/public-api.d.ts +17 -0
@@ -0,0 +1,645 @@
1
+ import { Component, EventEmitter, inject, Input, Output, Renderer2, ViewChild, ViewChildren, ViewContainerRef } from '@angular/core';
2
+ import { AppBaseComponent } from '../app-base/app-base.component';
3
+ import { LocalizationKeys } from '../../../consts';
4
+ import { Component_Modes, Modes, FormValidationError } from '../../../enums';
5
+ import { PresentationSetting } from '../../../models';
6
+ import { LayoutHelperService, WorkflowConfigurationService, PresentationSettingService, TsiNotificationService, ErrorResponseManagerService, PresentationDesignerService, ReportingService, InputRegistryService, GenericValidationStateService } from '../../../services';
7
+ import { PresentationDesignerDirective } from '../../../tsi-directives';
8
+ import { TsiFormComponent } from '../../../tsi-components/tsi-form/tsi-form.component';
9
+ import { TsiButtonComponent } from '../../../tsi-components/button-components/tsi-button/tsi-button.component';
10
+ import { TsiCheckboxComponent } from '../../../tsi-components/input-components/tsi-checkbox/tsi-checkbox.component';
11
+ import { LocalizePipe } from '../../../pipes/localize.pipe';
12
+ import { PresentationDesignerBaseService } from '../../../services/presentation-setting/presentation-designer-base.service';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "primeng/dynamicdialog";
15
+ export class TsiFormComponentBaseComponent extends AppBaseComponent {
16
+ //#region properties
17
+ get formEndpoint() {
18
+ return super.formEndpoint;
19
+ }
20
+ ;
21
+ set formEndpoint(endpoint) {
22
+ super.formEndpoint = `${endpoint}/${this.id}`;
23
+ }
24
+ get businessClass() {
25
+ return this._businessClass;
26
+ }
27
+ set businessClass(value) {
28
+ this._businessClass = value;
29
+ this.formEndpoint = this.businessClass;
30
+ this._genericValidationStateService?.loadEntityValidationInfos(this._businessClass);
31
+ }
32
+ set componentDescriminator(value) {
33
+ this._componentDescriminator = value;
34
+ if (value && value.propertyValue) {
35
+ if (this.form) {
36
+ this.form.descriminatorValue = value.propertyValue;
37
+ }
38
+ this.descriminatorValue = value.propertyValue;
39
+ this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
40
+ this.directiveElements = [...this._presentationDesignerService.getDirectives(),
41
+ ...this._presentationDesignerBaseService.getDirectives()
42
+ ];
43
+ this.addInputs(this.presentationRequest, !this._layoutHelperService?.isDesignMode);
44
+ // this._reportingService.getReportDecriminator(req).subscribe({
45
+ // next: async (result) => {
46
+ // this.descriminatorValue = result.propertyValue;
47
+ // this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier()) ?? new PresentationSetting()
48
+ // if (this.form) {
49
+ // this.form.descriminatorValue = result.propertyValue
50
+ // if (this.entityInfo?.isWorkflow) {
51
+ // await this.form.getWorkflowEntityInformation(this.businessClass, this.id, this.entityInfo?.discriminatorClassName,
52
+ // this.entityInfo?.discriminatorPropertyName)
53
+ // }
54
+ // }
55
+ // this.addInputs(this.presentationRequest, !this._layoutHelperService?.isDesignMode)
56
+ // },
57
+ // error: (err: any) => {
58
+ // console.log(err);
59
+ // },
60
+ // });
61
+ }
62
+ else {
63
+ if (this.form) {
64
+ this.form.descriminatorValue = undefined;
65
+ }
66
+ }
67
+ }
68
+ get componentDescriminator() {
69
+ return this._componentDescriminator;
70
+ }
71
+ set isloading(value) {
72
+ this._isloading = value;
73
+ console.log('isloading set to', value);
74
+ if (!value) {
75
+ setTimeout(() => {
76
+ this.processDisabledInputs(this.presentationRequest);
77
+ }, 0);
78
+ }
79
+ }
80
+ get isloading() {
81
+ return this._isloading;
82
+ }
83
+ get status() {
84
+ return this._status;
85
+ }
86
+ set status(value) {
87
+ this._status = value;
88
+ if (this.form && this.form.status !== this._status) {
89
+ this.form.status = this._status;
90
+ }
91
+ }
92
+ constructor(ref, config, cdRef) {
93
+ super(cdRef);
94
+ this.ref = ref;
95
+ this.config = config;
96
+ this.cdRef = cdRef;
97
+ this.faultyInputs = [];
98
+ this.requiredInputs = [];
99
+ // @ViewChildren(EditableGridComponent) editableGridComponents!: QueryList<EditableGridComponent>;
100
+ // @ViewChildren(TsiViewGridComponent) viewGridsComponents!: QueryList<TsiViewGridComponent>;
101
+ // @ViewChildren(TsiGenericGridComponent) genericGridsComponents!: QueryList<TsiGenericGridComponent>;
102
+ // @ViewChildren(TsiGenericCrudComponent) genericCrudsComponents!: QueryList<TsiGenericCrudComponent>;
103
+ this.editableGridComponents = [];
104
+ this.viewGridsComponents = [];
105
+ this.genericGridsComponents = [];
106
+ this.genericCrudsComponents = [];
107
+ this.isFormDisabled = false;
108
+ //#endregion
109
+ //#region Inputs
110
+ this.itemDialog = false;
111
+ this.mode = '';
112
+ this._isloading = false;
113
+ this.saving = false;
114
+ this._status = '';
115
+ //bsModalRef?: any;
116
+ //#endregion
117
+ this._viewContainerRef = inject(ViewContainerRef);
118
+ this._renderer = inject(Renderer2);
119
+ this._layoutHelperService = inject(LayoutHelperService);
120
+ this._workflowConfigurationService = inject(WorkflowConfigurationService);
121
+ this._presentationSettingService = inject(PresentationSettingService);
122
+ this._messageInfoService = inject(TsiNotificationService);
123
+ this._errorResponseManager = inject(ErrorResponseManagerService);
124
+ this._presentationDesignerService = inject(PresentationDesignerService);
125
+ this._presentationDesignerBaseService = inject(PresentationDesignerBaseService);
126
+ this._reportingService = inject(ReportingService);
127
+ this.localize = inject(LocalizePipe);
128
+ this._inputRegistry = inject(InputRegistryService);
129
+ this.directiveElements = [];
130
+ this.presentationRequest = new PresentationSetting();
131
+ //#region Outputs
132
+ this.onSave = new EventEmitter();
133
+ //#endregion
134
+ this._genericValidationStateService = inject(GenericValidationStateService);
135
+ this.isReportingToolbarDisabled = false;
136
+ //#endregion
137
+ //#region traiter multiple combo
138
+ this.allComboLoadingStatus = [];
139
+ this.areAllComboLoaded = false;
140
+ }
141
+ //#endregion
142
+ ngOnInit() {
143
+ super.ngOnInit();
144
+ this._initModalRef();
145
+ this.initModalData();
146
+ this._addedDirectiveSubscritpion = this._presentationDesignerService.addedDirectiveObservable
147
+ .subscribe(data => {
148
+ if (data.treated) {
149
+ return;
150
+ }
151
+ if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
152
+ this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
153
+ }
154
+ if (!this.entityInfo?.discriminatorPropertyName && !this.entityInfo?.discriminatorClassName) {
155
+ this.processSingleElement(data);
156
+ }
157
+ else if (this.descriminatorValue) {
158
+ this.processSingleElement(data);
159
+ }
160
+ });
161
+ this._addedDirectiveBaseSubscritpion = this._presentationDesignerBaseService.addedDirectiveObservable
162
+ .subscribe(data => {
163
+ if (data.treated) {
164
+ return;
165
+ }
166
+ if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
167
+ this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
168
+ }
169
+ if (!this.entityInfo?.discriminatorPropertyName && !this.entityInfo?.discriminatorClassName) {
170
+ this.processSingleElement(data);
171
+ }
172
+ else if (this.descriminatorValue) {
173
+ this.processSingleElement(data);
174
+ }
175
+ });
176
+ this._designModeFormSubscription = this._layoutHelperService._designModeFormSubject.subscribe(data => {
177
+ if (data && data == true) {
178
+ this.toggleDesignMode();
179
+ }
180
+ });
181
+ }
182
+ toggleDesignMode() {
183
+ this.removeTsiModalFooter();
184
+ this.createSaveButton();
185
+ this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
186
+ this.directiveElements = [...this._presentationDesignerService.getDirectives(),
187
+ ...this._presentationDesignerBaseService.getDirectives()
188
+ ];
189
+ this.directiveElements?.forEach(input => {
190
+ input.insertElement();
191
+ if (input instanceof PresentationDesignerDirective) {
192
+ input.selectApproriateColumns(this.presentationRequest);
193
+ }
194
+ input.addCheckboxesToInputs(this.presentationRequest);
195
+ });
196
+ }
197
+ ngOnDestroy() {
198
+ super.ngOnDestroy();
199
+ this.unsubscribeFromActiveSubscritpion();
200
+ this._layoutHelperService.isDesignMode = false;
201
+ }
202
+ ngAfterViewChecked() {
203
+ }
204
+ async ngAfterViewInit() {
205
+ this.directiveElements = [...this._presentationDesignerService.getDirectives(),
206
+ ...this._presentationDesignerBaseService.getDirectives()
207
+ ];
208
+ console.log("count of directiveElements => ", this.directiveElements.length);
209
+ if (this._layoutHelperService?.isDesignMode
210
+ && !this._workflowConfigurationService.isDesginModeFromWorkflow) {
211
+ // this.removeTsiModalFooter()
212
+ // this.createSaveButton()
213
+ }
214
+ else {
215
+ if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
216
+ this.entityInfo = this._workflowConfigurationService.currentWorkflowEntityInfo;
217
+ }
218
+ // else {
219
+ // this.entityInfo = await this._entityConfigService.getEntityInfoFromCache(this.businessClass)
220
+ // }
221
+ }
222
+ //init genericCrud reporting
223
+ if (this.form) {
224
+ this.form.formRefChange.subscribe(f => {
225
+ if (f) {
226
+ this.formRef = f;
227
+ }
228
+ });
229
+ this.form.disabled = this.isFormDisabled;
230
+ this.form.formEndpoint = this.formEndpoint;
231
+ this.form.formName = this.formName;
232
+ this.form.businessClass = this._businessClass;
233
+ this.form.formName = this.formName;
234
+ this.form.id = this.id;
235
+ this.form.mode = this.mode;
236
+ // workflow form design
237
+ this._saveWorkflowFormConfigurationSubscription = this.form.onSubmitFormWorkflowConfiguration.subscribe(data => {
238
+ let workflowFormConfiguration = this.getFormWorfklowPresentationSetting();
239
+ console.log("FormWorfklowSetting => ", workflowFormConfiguration);
240
+ this.hide(workflowFormConfiguration);
241
+ });
242
+ this.form.onStatusChange.subscribe((newValue) => {
243
+ this.status = newValue;
244
+ });
245
+ }
246
+ if (this.mode == Component_Modes.CREATE) {
247
+ if (this.checkbox) {
248
+ this.checkbox.forEach(box => {
249
+ box.inputField = false;
250
+ box.checked = false;
251
+ });
252
+ }
253
+ }
254
+ }
255
+ initTsiGridsRef() {
256
+ this.viewGridsComponents = this._presentationDesignerService.getViewGrids();
257
+ this.genericGridsComponents = this._presentationDesignerService.getGenericGrids();
258
+ this.editableGridComponents = this._presentationDesignerService.getEditableGrids();
259
+ this.genericCrudsComponents = this._presentationDesignerService.getGenericCruds();
260
+ }
261
+ getFormWorfklowPresentationSetting() {
262
+ let presentationRequest = new PresentationSetting();
263
+ this.directiveElements = [...this._presentationDesignerService.getDirectives(),
264
+ ...this._presentationDesignerBaseService.getDirectives()
265
+ ];
266
+ let presentationSettingDetails = [];
267
+ let availableDirectiveElements = this.directiveElements.filter(x => !(this.presentationRequest?.presentationSettingDetails.some(y => y.blockName === x.presentationDesigner && !y.isBlockVisible)));
268
+ this.initTsiGridsRef();
269
+ availableDirectiveElements?.forEach((directive) => {
270
+ let configuration = undefined;
271
+ let gridState = [
272
+ ...this.viewGridsComponents,
273
+ ...this.genericGridsComponents,
274
+ ...this.genericCrudsComponents,
275
+ ...this.editableGridComponents
276
+ ]
277
+ .find(x => x.id === directive.presentationDesigner || ('formName' in x && x.formName === directive.presentationDesigner))
278
+ ?.getState();
279
+ configuration = gridState ? JSON.stringify(gridState) : undefined;
280
+ let object = {
281
+ blockName: directive.presentationDesigner,
282
+ isBlockVisible: !directive.showHideCheckboxComponentRef?.instance?._checked,
283
+ uid: this.getPresentationSetingDetailUid(directive.presentationDesigner ?? ""),
284
+ configuration: configuration,
285
+ isInputEnabled: !directive.disabledCheckboxComponentRef?.instance?._checked
286
+ };
287
+ presentationSettingDetails.push(object);
288
+ });
289
+ presentationRequest.componentIdentifer = this.getComponentIdentifier();
290
+ presentationRequest.presentationSettingDetails = presentationSettingDetails;
291
+ console.log("presentationRequest => ", presentationRequest);
292
+ return presentationRequest;
293
+ }
294
+ isDeleteMode() {
295
+ return this.mode == Component_Modes.DELETE;
296
+ }
297
+ isSubmitDisabled() {
298
+ //return !this.formRef?.form?.valid || this.saving;
299
+ return false;
300
+ }
301
+ isConsultMode() {
302
+ return this.mode == Component_Modes.CONSULT;
303
+ }
304
+ isDuplicateMode() {
305
+ return this.mode == Component_Modes.DUPLICATE;
306
+ }
307
+ isEditMode() {
308
+ return this.mode == Component_Modes.EDIT;
309
+ }
310
+ //#region private methods
311
+ initModalData() {
312
+ super.initModalData();
313
+ if (this.openedDialogRef != null
314
+ && this.openedDialogRef != undefined
315
+ && this.openedDialogConfig != null
316
+ && this.openedDialogConfig != undefined) {
317
+ //check have openedDialogConfig
318
+ if (this.openedDialogConfig.data != null && this.openedDialogConfig.data != undefined) {
319
+ this.cudComponent = this.openedDialogConfig.data.cudComponent;
320
+ }
321
+ }
322
+ }
323
+ _verifyModalData() {
324
+ return this.openedDialogRef != null
325
+ && this.openedDialogRef != undefined
326
+ && this.openedDialogConfig != null
327
+ && this.openedDialogConfig != undefined;
328
+ }
329
+ _initModalRef() {
330
+ if (this._verifyModalData()) {
331
+ //this.bsModalRef = {hide: () => this.openedDialogRef.destroy(),close: (val: any)=>{this.openedDialogRef.close(val)}}
332
+ }
333
+ }
334
+ //
335
+ l(key) {
336
+ if (this.localize != null
337
+ && this.localize != undefined) {
338
+ return this.localize.transform(key);
339
+ }
340
+ return key;
341
+ }
342
+ processComboInitEvent(comboStatus) {
343
+ if (!this.allComboLoadingStatus.find(u => u.uid == comboStatus.uid))
344
+ this.allComboLoadingStatus.push(comboStatus);
345
+ }
346
+ processComboIsLoadedEvent(comboStatus) {
347
+ let comboS = this.allComboLoadingStatus.find(u => u.uid == comboStatus.uid);
348
+ if (comboS != null && comboS != undefined) {
349
+ comboS.isDataLoaded = comboStatus.isDataLoaded;
350
+ }
351
+ this.areAllComboLoadedFn();
352
+ }
353
+ areAllComboLoadedFn() {
354
+ let result = true;
355
+ if (this.allComboLoadingStatus.length > 0)
356
+ this.allComboLoadingStatus.forEach(u => {
357
+ result = result && u.isDataLoaded;
358
+ });
359
+ else
360
+ result = false;
361
+ this.areAllComboLoaded = result;
362
+ }
363
+ hide(val) {
364
+ if (this.openedDialogRef != null && this.openedDialogRef != undefined) {
365
+ if (val == false) {
366
+ this.openedDialogRef.destroy();
367
+ }
368
+ else {
369
+ this.openedDialogRef.close(val);
370
+ }
371
+ }
372
+ }
373
+ //#endregion traiter multiple combo
374
+ getWorkflowEtatForm() {
375
+ let workflowEtatForm = this._workflowConfigurationService.workflowEtatFormForCurrentForm
376
+ ?.find(x => x.uid == this.workflowInformation?.workflowEtat);
377
+ if (workflowEtatForm) {
378
+ let workflowEtat = this._workflowConfigurationService.mapWorkflowEtatFormToPresentationSetting(workflowEtatForm?.workflowEtatsForms);
379
+ return workflowEtat;
380
+ }
381
+ return undefined;
382
+ }
383
+ // #region Presentation Settings
384
+ addInputs(presentationRequest, applyGridConfig = true, workflowEtat, directiveElements = this.directiveElements) {
385
+ if ((!workflowEtat || workflowEtat.presentationSettingDetails.length == 0)
386
+ && this.workflowInformation
387
+ && this.workflowInformation?.workflowEtat) {
388
+ workflowEtat = this.getWorkflowEtatForm();
389
+ }
390
+ const hasPresentationRequest = presentationRequest?.presentationSettingDetails?.length > 0;
391
+ if (hasPresentationRequest) {
392
+ directiveElements = directiveElements.filter(x => presentationRequest.presentationSettingDetails?.some(y => y.blockName === x.presentationDesigner && (y.isBlockVisible == undefined || y.isBlockVisible == true)
393
+ && x.treated == false));
394
+ }
395
+ directiveElements?.forEach(directive => {
396
+ const presentationSettingDetail = presentationRequest.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
397
+ if (presentationSettingDetail == undefined || presentationSettingDetail.isBlockVisible) {
398
+ let worfkflowEtatForm = this.getWorkflowEtatForm();
399
+ if (worfkflowEtatForm) {
400
+ let workflowConfig = worfkflowEtatForm.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
401
+ if (!workflowConfig) {
402
+ directive.execute(true, presentationSettingDetail?.configuration);
403
+ }
404
+ else if (workflowConfig && workflowConfig.isBlockVisible && (workflowConfig.isInputEnabled == undefined || workflowConfig.isInputEnabled == true)) {
405
+ directive.execute(true, presentationSettingDetail?.configuration);
406
+ }
407
+ else if (workflowConfig && workflowConfig.isBlockVisible && workflowConfig.isInputEnabled == false) {
408
+ directive.disableInputs();
409
+ }
410
+ }
411
+ else {
412
+ directive.execute(true, presentationSettingDetail?.configuration);
413
+ }
414
+ if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
415
+ directive.addCheckboxesToInputs(this._workflowConfigurationService.workflowFormConfiguration);
416
+ }
417
+ }
418
+ });
419
+ if (this.mode === Modes.create) {
420
+ this.processDisabledInputs(presentationRequest, directiveElements);
421
+ }
422
+ this.removeEmptyAncestorsFromElements();
423
+ }
424
+ processDisabledInputs(presentationRequest, directiveElements = this.directiveElements) {
425
+ if (this._layoutHelperService?.isDesignMode || this._workflowConfigurationService.isDesginModeFromWorkflow) {
426
+ return;
427
+ }
428
+ const hasPresentationRequest = presentationRequest?.presentationSettingDetails?.length > 0;
429
+ if (hasPresentationRequest) {
430
+ directiveElements = directiveElements.filter(x => presentationRequest.presentationSettingDetails?.some(y => y.blockName === x.presentationDesigner && y.isBlockVisible));
431
+ }
432
+ const worfkflowEtatForm = this.getWorkflowEtatForm();
433
+ directiveElements?.forEach(directive => {
434
+ let workflowConfig = worfkflowEtatForm?.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
435
+ if (workflowConfig && !workflowConfig.isInputEnabled && (workflowConfig.isBlockVisible ?? true)) {
436
+ directive.disableInputs();
437
+ }
438
+ });
439
+ }
440
+ removeEmptyAncestorsFromElements() {
441
+ // setTimeout(() => {
442
+ // this._presentationDesignerService.getDirectives().forEach(s => s.removeEmptyAncestors(s?.tempTemplateParentNode))
443
+ // }, 0);
444
+ }
445
+ getPresentationSetingDetailUid(blockName) {
446
+ return this.presentationRequest?.presentationSettingDetails?.find(x => x.blockName == blockName)?.uid;
447
+ }
448
+ getComponentIdentifier() {
449
+ // if (this.descriminatorValue) {
450
+ // return `${this._myName()}_${this.descriminatorValue}`
451
+ // }
452
+ return this._myName();
453
+ }
454
+ saveProperties() {
455
+ this.initTsiGridsRef();
456
+ this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
457
+ if (!this.presentationRequest) {
458
+ this.presentationRequest = new PresentationSetting();
459
+ }
460
+ let presentationSettingDetails = [];
461
+ this.directiveElements?.forEach((directive) => {
462
+ let configuration = undefined;
463
+ let gridState = [
464
+ ...this.viewGridsComponents,
465
+ ...this.genericGridsComponents,
466
+ ...this.genericCrudsComponents,
467
+ ...this.editableGridComponents
468
+ ]
469
+ .find(x => x.id === directive.presentationDesigner || ('formName' in x && x.formName === directive.presentationDesigner))
470
+ ?.getState();
471
+ configuration = gridState ? JSON.stringify(gridState) : undefined;
472
+ let object = {
473
+ blockName: directive.presentationDesigner,
474
+ isBlockVisible: !directive.showHideCheckboxComponentRef?.instance?._checked,
475
+ uid: this.getPresentationSetingDetailUid(directive.presentationDesigner ?? ""),
476
+ configuration: configuration
477
+ };
478
+ presentationSettingDetails.push(object);
479
+ });
480
+ this.presentationRequest.componentIdentifer = this.getComponentIdentifier();
481
+ this.presentationRequest.descriminatorValue = this.descriminatorValue;
482
+ this.presentationRequest.presentationSettingDetails = presentationSettingDetails;
483
+ this.isloading = true;
484
+ if (this.presentationRequest.uid != null && this.presentationRequest.uid != undefined) {
485
+ this._presentationSettingService.updatePresentationSetting(this.presentationRequest, this.presentationRequest.uid)
486
+ .subscribe({
487
+ next: async (data) => {
488
+ await this.processAfterSaveConfiguration();
489
+ },
490
+ error: (error) => {
491
+ console.log(error);
492
+ this._errorResponseManager.showErrorMessage(error);
493
+ }
494
+ });
495
+ }
496
+ else {
497
+ this._presentationSettingService.createPresentationSetting(this.presentationRequest)
498
+ .subscribe({
499
+ next: async (data) => {
500
+ await this.processAfterSaveConfiguration();
501
+ },
502
+ error: (error) => {
503
+ console.log(error);
504
+ this._errorResponseManager.showErrorMessage(error);
505
+ }
506
+ });
507
+ }
508
+ }
509
+ processSingleElement(directive) {
510
+ this.presentationRequest = this._presentationSettingService.getPresentationSettingByComponentIdentifierSync(this.getComponentIdentifier(), this.descriminatorValue) ?? new PresentationSetting();
511
+ let presentationSettingDetail = this.presentationRequest?.presentationSettingDetails?.find(x => x.blockName == directive.presentationDesigner);
512
+ if (presentationSettingDetail == undefined || presentationSettingDetail.isBlockVisible) {
513
+ let worfkflowEtatForm = this.getWorkflowEtatForm();
514
+ if (worfkflowEtatForm) {
515
+ let workflowConfig = worfkflowEtatForm.presentationSettingDetails.find(x => x.blockName == directive.presentationDesigner);
516
+ if (!workflowConfig) {
517
+ directive.execute(true, presentationSettingDetail?.configuration);
518
+ }
519
+ else if (workflowConfig && workflowConfig.isBlockVisible && (workflowConfig.isInputEnabled == undefined || workflowConfig.isInputEnabled == true)) {
520
+ directive.execute(true, presentationSettingDetail?.configuration);
521
+ }
522
+ else if (workflowConfig && workflowConfig.isBlockVisible && workflowConfig.isInputEnabled == false) {
523
+ directive.disableInputs();
524
+ }
525
+ }
526
+ else {
527
+ directive.execute(true, presentationSettingDetail?.configuration);
528
+ }
529
+ if (this._workflowConfigurationService.isDesginModeFromWorkflow) {
530
+ directive.addCheckboxesToInputs(this._workflowConfigurationService.workflowFormConfiguration);
531
+ }
532
+ }
533
+ }
534
+ unsubscribeFromActiveSubscritpion() {
535
+ if (this._designModeFormSubscription) {
536
+ this._designModeFormSubscription.unsubscribe();
537
+ }
538
+ if (this._saveWorkflowFormConfigurationSubscription) {
539
+ this._saveWorkflowFormConfigurationSubscription.unsubscribe();
540
+ }
541
+ if (this._addedDirectiveSubscritpion) {
542
+ this._addedDirectiveSubscritpion.unsubscribe();
543
+ }
544
+ if (this._addedDirectiveBaseSubscritpion) {
545
+ this._addedDirectiveBaseSubscritpion.unsubscribe();
546
+ }
547
+ }
548
+ removeTsiModalFooter() {
549
+ const tsiModalFooter = document.querySelector("tsi-modal-footer");
550
+ if (tsiModalFooter && tsiModalFooter.lastChild) {
551
+ this._renderer?.removeChild(tsiModalFooter, tsiModalFooter.lastChild);
552
+ }
553
+ }
554
+ createSaveButton() {
555
+ const tsiButtonRef = this._viewContainerRef?.createComponent(TsiButtonComponent);
556
+ tsiButtonRef?.setInput('text', 'shared_tsi_component_save_config_show_hide');
557
+ tsiButtonRef?.setInput('icon', 'save');
558
+ tsiButtonRef.instance.onClick.emit = () => this.saveProperties();
559
+ const tsiForm = document.querySelector("tsi-form");
560
+ if (tsiForm) {
561
+ this._renderer?.appendChild(tsiForm, tsiButtonRef?.location.nativeElement);
562
+ }
563
+ }
564
+ async processAfterSaveConfiguration() {
565
+ this.isloading = false;
566
+ this.hide();
567
+ this._messageInfoService.success(LocalizationKeys.savedSuccessfully);
568
+ this._layoutHelperService.isDesignMode = false;
569
+ // this._layoutHelperService.currentFormName = undefined
570
+ this._layoutHelperService._designModeFormSubject.next(false);
571
+ await this._presentationSettingService.loadPresentationSettings();
572
+ }
573
+ save() {
574
+ this.requiredInputs = this._inputRegistry.getAll().filter(inp => inp.isRequired && inp.disabled === false);
575
+ this.faultyInputs = [];
576
+ this.isFormValid = this.requiredInputs.every(input => input.isValid().isValid === true);
577
+ this.requiredInputs.forEach(input => {
578
+ let fvr = input.isValid();
579
+ if (fvr.isValid === false) {
580
+ this.faultyInputs.push(fvr);
581
+ }
582
+ });
583
+ if (this.isFormValid === false && this.faultyInputs.length > 0) {
584
+ console.log(this.faultyInputs);
585
+ let faultyInputsNames = "";
586
+ this.faultyInputs.forEach((item, index) => {
587
+ if (index === this.faultyInputs.length - 1)
588
+ faultyInputsNames += `${item.inputName}. `;
589
+ else
590
+ faultyInputsNames += `${item.inputName}, `;
591
+ });
592
+ faultyInputsNames = faultyInputsNames.replace(/,$/, '');
593
+ if (this.faultyInputs.some(fi => fi.error === FormValidationError.Required)) {
594
+ this._messageInfoService.warn(faultyInputsNames, this.localize?.transform('tsi_form_base_auto_validation_required_field_title'));
595
+ throw new Error(`Les champs ${faultyInputsNames} sont obligatoire.`);
596
+ }
597
+ else if (this.faultyInputs.some(fi => fi.error === FormValidationError.MaxLength)) {
598
+ this._messageInfoService.warn(`
599
+ ${this.localize?.transform('tsi_form_base_auto_validation_the_field')}
600
+ ${this.faultyInputs[0].inputName}
601
+ ${this.localize?.transform('tsi_form_base_auto_validation_max_length')}
602
+ ${this.faultyInputs[0].data} ${this.localize?.transform('tsi_form_base_auto_validation_max_length_chars')}`, this.localize?.transform('tsi_form_base_auto_validation_max_length_field_title'));
603
+ throw new Error(`Le champ ${this.faultyInputs[0].inputName} ne doit pas dépasser ${this.faultyInputs[0].data} caractères.`);
604
+ }
605
+ else if (this.faultyInputs.some(fi => fi.error === FormValidationError.OutOfRange)) {
606
+ //to do
607
+ throw new Error(`Le champ ${this.faultyInputs[0].inputName} doit être dans l'intervalle.`);
608
+ }
609
+ }
610
+ }
611
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponentBaseComponent, deps: [{ token: i1.DynamicDialogRef }, { token: i1.DynamicDialogConfig }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
612
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponentBaseComponent, selector: "app-tsi-form-base", inputs: { itemDialog: "itemDialog", mode: "mode", id: "id", isloading: "isloading", header: "header", saving: "saving", item: "item", status: "status" }, outputs: { onSave: "onSave" }, viewQueries: [{ propertyName: "form", first: true, predicate: TsiFormComponent, descendants: true }, { propertyName: "modalFooter", first: true, predicate: TsiButtonComponent, descendants: true }, { propertyName: "checkbox", predicate: TsiCheckboxComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<p>tsi-form-base works!</p>\r\n", styles: [".new-block{margin-bottom:20px;border:1px solid #ccc;padding:10px}.flex{display:flex;align-items:center;margin-bottom:5px}.flex input[type=checkbox]{margin-right:10px}\n"] }); }
613
+ }
614
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponentBaseComponent, decorators: [{
615
+ type: Component,
616
+ args: [{ selector: 'app-tsi-form-base', template: "<p>tsi-form-base works!</p>\r\n", styles: [".new-block{margin-bottom:20px;border:1px solid #ccc;padding:10px}.flex{display:flex;align-items:center;margin-bottom:5px}.flex input[type=checkbox]{margin-right:10px}\n"] }]
617
+ }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
618
+ type: ViewChild,
619
+ args: [TsiFormComponent]
620
+ }], modalFooter: [{
621
+ type: ViewChild,
622
+ args: [TsiButtonComponent]
623
+ }], checkbox: [{
624
+ type: ViewChildren,
625
+ args: [TsiCheckboxComponent]
626
+ }], itemDialog: [{
627
+ type: Input
628
+ }], mode: [{
629
+ type: Input
630
+ }], id: [{
631
+ type: Input
632
+ }], isloading: [{
633
+ type: Input
634
+ }], header: [{
635
+ type: Input
636
+ }], saving: [{
637
+ type: Input
638
+ }], item: [{
639
+ type: Input
640
+ }], status: [{
641
+ type: Input
642
+ }], onSave: [{
643
+ type: Output
644
+ }] } });
645
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWJhc2UvY29tcG9uZW50cy90c2ktZm9ybS1iYXNlL3RzaS1mb3JtLWJhc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1iYXNlL2NvbXBvbmVudHMvdHNpLWZvcm0tYmFzZS90c2ktZm9ybS1iYXNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBeUQsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQWEsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFeFAsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFzQixlQUFlLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakcsT0FBTyxFQUEwQixtQkFBbUIsRUFBOEUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxSixPQUFPLEVBQUUsbUJBQW1CLEVBQThCLDRCQUE0QixFQUFFLDBCQUEwQixFQUFFLHNCQUFzQixFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdlMsT0FBTyxFQUFFLDZCQUE2QixFQUFxQyxNQUFNLHlCQUF5QixDQUFDO0FBRTNHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3ZGLE9B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QUMsQ0FBQyxDQUFDLENBQUMsU0FBUyx5QkFBeUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDO1lBQzlILENBQUM7aUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDbkYsT0FBTztnQkFDUCxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLCtCQUErQixDQUFDLENBQUM7WUFDN0YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQXZ3QlUsNkJBQTZCO21HQUE3Qiw2QkFBNkIsd1JBcUU3QixnQkFBZ0IsOEVBR2hCLGtCQUFrQiw4REFFZixvQkFBb0IsdUVDdEdwQyxpQ0FDQTs7NEZEMkJhLDZCQUE2QjtrQkFMekMsU0FBUzsrQkFDRSxtQkFBbUI7dUpBeUVBLElBQUk7c0JBQWhDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUdJLFdBQVc7c0JBQXpDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUVPLFFBQVE7c0JBQTNDLFlBQVk7dUJBQUMsb0JBQW9CO2dCQXNCekIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUlGLFNBQVM7c0JBRFosS0FBSztnQkFjRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFNTyxNQUFNO3NCQUFsQixLQUFLO2dCQTRCSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBSZW5kZXJlcjIsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFwcEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9hcHAtYmFzZS9hcHAtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTG9jYWxpemF0aW9uS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cyc7XHJcbmltcG9ydCB7IEZvcm1WYWxpZGl0eVJlc3VsdCwgQ29tcG9uZW50X01vZGVzLCBNb2RlcywgRm9ybVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnREZXNjcmltaW5hdG9yLCBQcmVzZW50YXRpb25TZXR0aW5nLCBlbnRpdHlJbmZvLCB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSwgUHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IExheW91dEhlbHBlclNlcnZpY2UsIEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLCBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLCBQcmVzZW50YXRpb25TZXR0aW5nU2VydmljZSwgVHNpTm90aWZpY2F0aW9uU2VydmljZSwgRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLCBQcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UsIFJlcG9ydGluZ1NlcnZpY2UsIElucHV0UmVnaXN0cnlTZXJ2aWNlLCBHZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgUHJlc2VudGF0aW9uRGVzaWduZXJEaXJlY3RpdmUsIFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSB9IGZyb20gJy4uLy4uLy4uL3RzaS1kaXJlY3RpdmVzJztcclxuaW1wb3J0IHsgVHNpSW5wdXRCYXNlIH0gZnJvbSAnLi4vLi4vdHNpLWlucHV0LWJhc2UvdHNpLWlucHV0LWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVHNpRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFRzaUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL2J1dHRvbi1jb21wb25lbnRzL3RzaS1idXR0b24vdHNpLWJ1dHRvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLWNoZWNrYm94L3RzaS1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFZGl0YWJsZUdyaWRDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi90c2ktY29tcG9uZW50cy9pbnB1dC1jb21wb25lbnRzL2VkaXRhYmxlLWdyaWQvZWRpdGFibGUtZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lWaWV3R3JpZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL291dHB1dC1jb21wb25lbnRzL3RzaS12aWV3LWdyaWQvdHNpLXZpZXctZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lHZW5lcmljR3JpZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL291dHB1dC1jb21wb25lbnRzL3RzaS1nZW5lcmljLWdyaWQvdHNpLWdlbmVyaWMtZ3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lHZW5lcmljQ3J1ZENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3RzaS1jb21wb25lbnRzL3RzaS1nZW5lcmljLWNydWQvdHNpLWdlbmVyaWMtY3J1ZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMb2NhbGl6ZVBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy9sb2NhbGl6ZS5waXBlJztcclxuaW1wb3J0IHsgUHJlc2VudGF0aW9uRGVzaWduZXJCYXNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ByZXNlbnRhdGlvbi1zZXR0aW5nL3ByZXNlbnRhdGlvbi1kZXNpZ25lci1iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC10c2ktZm9ybS1iYXNlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdHNpLWZvcm0tYmFzZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHNpLWZvcm0tYmFzZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUc2lGb3JtQ29tcG9uZW50QmFzZUNvbXBvbmVudCBleHRlbmRzIEFwcEJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkIHtcclxuICAvLyNyZWdpb24gcHJvcGVydGllc1xyXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgZm9ybUVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gc3VwZXIuZm9ybUVuZHBvaW50O1xyXG4gIH07XHJcbiAgcHJpdmF0ZSBvdmVycmlkZSBzZXQgZm9ybUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpIHtcclxuICAgIHN1cGVyLmZvcm1FbmRwb2ludCA9IGAke2VuZHBvaW50fS8ke3RoaXMuaWR9YDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgYnVzaW5lc3NDbGFzcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9idXNpbmVzc0NsYXNzO1xyXG4gIH1cclxuICBwdWJsaWMgb3ZlcnJpZGUgc2V0IGJ1c2luZXNzQ2xhc3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fYnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5mb3JtRW5kcG9pbnQgPSB0aGlzLmJ1c2luZXNzQ2xhc3M7XHJcbiAgICB0aGlzLl9nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT8ubG9hZEVudGl0eVZhbGlkYXRpb25JbmZvcyh0aGlzLl9idXNpbmVzc0NsYXNzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBvbmVudERlc2NyaW1pbmF0b3I6IENvbXBvbmVudERlc2NyaW1pbmF0b3IgfCB1bmRlZmluZWRcclxuICBwcml2YXRlIGRlc2NyaW1pbmF0b3JWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXHJcblxyXG4gIHByb3RlY3RlZCBzZXQgY29tcG9uZW50RGVzY3JpbWluYXRvcih2YWx1ZTogQ29tcG9uZW50RGVzY3JpbWluYXRvciB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fY29tcG9uZW50RGVzY3JpbWluYXRvciA9IHZhbHVlXHJcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUucHJvcGVydHlWYWx1ZSkge1xyXG4gICAgICBpZiAodGhpcy5mb3JtKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmRlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlLnByb3BlcnR5VmFsdWVcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlLnByb3BlcnR5VmFsdWVcclxuICAgICAgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0ID0gdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuZ2V0UHJlc2VudGF0aW9uU2V0dGluZ0J5Q29tcG9uZW50SWRlbnRpZmllclN5bmModGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCksXHJcbiAgICAgICAgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUpID8/IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuICAgICAgdGhpcy5kaXJlY3RpdmVFbGVtZW50cyA9IFsuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RGlyZWN0aXZlcygpLFxyXG4gICAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgICBdO1xyXG4gICAgICB0aGlzLmFkZElucHV0cyh0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QsICF0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlPy5pc0Rlc2lnbk1vZGUpXHJcblxyXG4gICAgICAvLyB0aGlzLl9yZXBvcnRpbmdTZXJ2aWNlLmdldFJlcG9ydERlY3JpbWluYXRvcihyZXEpLnN1YnNjcmliZSh7XHJcbiAgICAgIC8vICAgbmV4dDogYXN5bmMgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAvLyAgICAgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUgPSByZXN1bHQucHJvcGVydHlWYWx1ZTtcclxuICAgICAgLy8gICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmdldFByZXNlbnRhdGlvblNldHRpbmdCeUNvbXBvbmVudElkZW50aWZpZXJTeW5jKHRoaXMuZ2V0Q29tcG9uZW50SWRlbnRpZmllcigpKSA/PyBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgICAgIC8vICAgICBpZiAodGhpcy5mb3JtKSB7XHJcbiAgICAgIC8vICAgICAgIHRoaXMuZm9ybS5kZXNjcmltaW5hdG9yVmFsdWUgPSByZXN1bHQucHJvcGVydHlWYWx1ZVxyXG4gICAgICAvLyAgICAgICBpZiAodGhpcy5lbnRpdHlJbmZvPy5pc1dvcmtmbG93KSB7XHJcbiAgICAgIC8vICAgICAgICAgYXdhaXQgdGhpcy5mb3JtLmdldFdvcmtmbG93RW50aXR5SW5mb3JtYXRpb24odGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmlkLCB0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JDbGFzc05hbWUsXHJcbiAgICAgIC8vICAgICAgICAgICB0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUpXHJcbiAgICAgIC8vICAgICAgIH1cclxuICAgICAgLy8gICAgIH1cclxuICAgICAgLy8gICAgIHRoaXMuYWRkSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCwgIXRoaXMuX2xheW91dEhlbHBlclNlcnZpY2U/LmlzRGVzaWduTW9kZSlcclxuICAgICAgLy8gICB9LFxyXG4gICAgICAvLyAgIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIC8vICAgfSxcclxuICAgICAgLy8gfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5kZXNjcmltaW5hdG9yVmFsdWUgPSB1bmRlZmluZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldCBjb21wb25lbnREZXNjcmltaW5hdG9yKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbXBvbmVudERlc2NyaW1pbmF0b3JcclxuICB9XHJcblxyXG5cclxuICBAVmlld0NoaWxkKFRzaUZvcm1Db21wb25lbnQpIGZvcm0/OiBUc2lGb3JtQ29tcG9uZW50O1xyXG5cclxuXHJcbiAgQFZpZXdDaGlsZChUc2lCdXR0b25Db21wb25lbnQpIG1vZGFsRm9vdGVyPzogRWxlbWVudFJlZiB8IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihUc2lDaGVja2JveENvbXBvbmVudCkgY2hlY2tib3g/OiBBcnJheTxUc2lDaGVja2JveENvbXBvbmVudD47XHJcblxyXG4gIGZhdWx0eUlucHV0czogRm9ybVZhbGlkaXR5UmVzdWx0W10gPSBbXTtcclxuICBpc0Zvcm1WYWxpZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICByZXF1aXJlZElucHV0czogVHNpSW5wdXRCYXNlW10gPSBbXTtcclxuICAvLyBAVmlld0NoaWxkcmVuKEVkaXRhYmxlR3JpZENvbXBvbmVudCkgZWRpdGFibGVHcmlkQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxFZGl0YWJsZUdyaWRDb21wb25lbnQ+O1xyXG5cclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaVZpZXdHcmlkQ29tcG9uZW50KSB2aWV3R3JpZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaVZpZXdHcmlkQ29tcG9uZW50PjtcclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaUdlbmVyaWNHcmlkQ29tcG9uZW50KSBnZW5lcmljR3JpZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaUdlbmVyaWNHcmlkQ29tcG9uZW50PjtcclxuICAvLyBAVmlld0NoaWxkcmVuKFRzaUdlbmVyaWNDcnVkQ29tcG9uZW50KSBnZW5lcmljQ3J1ZHNDb21wb25lbnRzITogUXVlcnlMaXN0PFRzaUdlbmVyaWNDcnVkQ29tcG9uZW50PjtcclxuICBlZGl0YWJsZUdyaWRDb21wb25lbnRzOiBBcnJheTxFZGl0YWJsZUdyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgdmlld0dyaWRzQ29tcG9uZW50czogQXJyYXk8VHNpVmlld0dyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgZ2VuZXJpY0dyaWRzQ29tcG9uZW50czogQXJyYXk8VHNpR2VuZXJpY0dyaWRDb21wb25lbnQ+ID0gW107XHJcbiAgZ2VuZXJpY0NydWRzQ29tcG9uZW50czogQXJyYXk8VHNpR2VuZXJpY0NydWRDb21wb25lbnQ+ID0gW107XHJcblxyXG5cclxuICBmb3JtUmVmPzogTmdGb3JtO1xyXG4gIGlzRm9ybURpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VkQ29tcG9uZW50OiBhbnk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBJbnB1dHNcclxuICBASW5wdXQoKSBpdGVtRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbW9kZT86IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2lzbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBpc2xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgY29uc29sZS5sb2coJ2lzbG9hZGluZyBzZXQgdG8nLCB2YWx1ZSk7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0Rpc2FibGVkSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdClcclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaXNsb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzbG9hZGluZztcclxuICB9XHJcbiAgQElucHV0KCkgaGVhZGVyPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNhdmluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGl0ZW06IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RhdHVzPzogc3RyaW5nID0gJyc7XHJcbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IHN0YXR1cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLmZvcm0gJiYgdGhpcy5mb3JtLnN0YXR1cyAhPT0gdGhpcy5fc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5zdGF0dXMgPSB0aGlzLl9zdGF0dXM7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vYnNNb2RhbFJlZj86IGFueTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKVxyXG4gIHByaXZhdGUgX3JlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMilcclxuICBwcml2YXRlIF9sYXlvdXRIZWxwZXJTZXJ2aWNlID0gaW5qZWN0KExheW91dEhlbHBlclNlcnZpY2UpXHJcbiAgcHJpdmF0ZSBfd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSA9IGluamVjdChXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlKVxyXG4gIHByaXZhdGUgX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlID0gaW5qZWN0KFByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlKVxyXG4gIHByaXZhdGUgX21lc3NhZ2VJbmZvU2VydmljZSA9IGluamVjdChUc2lOb3RpZmljYXRpb25TZXJ2aWNlKVxyXG4gIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyID0gaW5qZWN0KEVycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZSlcclxuICBwcml2YXRlIF9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UgPSBpbmplY3QoUHJlc2VudGF0aW9uRGVzaWduZXJTZXJ2aWNlKVxyXG4gIHByaXZhdGUgX3ByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZVNlcnZpY2UgPSBpbmplY3QoUHJlc2VudGF0aW9uRGVzaWduZXJCYXNlU2VydmljZSlcclxuICBwcml2YXRlIF9yZXBvcnRpbmdTZXJ2aWNlID0gaW5qZWN0KFJlcG9ydGluZ1NlcnZpY2UpXHJcbiAgcHVibGljIGxvY2FsaXplPyA9IGluamVjdChMb2NhbGl6ZVBpcGUpXHJcbiAgcHVibGljIF9pbnB1dFJlZ2lzdHJ5ID0gaW5qZWN0KElucHV0UmVnaXN0cnlTZXJ2aWNlKVxyXG4gIHByaXZhdGUgZGlyZWN0aXZlRWxlbWVudHM6IChQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSlbXSA9IFtdO1xyXG4gIHByZXNlbnRhdGlvblJlcXVlc3Q6IFByZXNlbnRhdGlvblNldHRpbmcgPSBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgX2Rlc2lnbk1vZGVGb3JtU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XHJcbiAgX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWRcclxuICBfYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZFxyXG4gIF9hZGRlZERpcmVjdGl2ZUJhc2VTdWJzY3JpdHBpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZFxyXG4gIC8vI3JlZ2lvbiBPdXRwdXRzXHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIF9nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT86IEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlID0gaW5qZWN0KEdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlKTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHJlZj86IER5bmFtaWNEaWFsb2dSZWYsXHJcbiAgICBwdWJsaWMgY29uZmlnPzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuICAgIHB1YmxpYyBvdmVycmlkZSBjZFJlZj86IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihjZFJlZik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB3b3JrZmxvd0luZm9ybWF0aW9uPzogd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2VcclxuICBjdXN0b21EYXRhPzogYW55XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICB0aGlzLl9pbml0TW9kYWxSZWYoKTtcclxuICAgIHRoaXMuaW5pdE1vZGFsRGF0YSgpO1xyXG4gICAgdGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24gPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuYWRkZWREaXJlY3RpdmVPYnNlcnZhYmxlXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEudHJlYXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3cpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuY3VycmVudFdvcmtmbG93RW50aXR5SW5mb1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgJiYgIXRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvckNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuX2FkZGVkRGlyZWN0aXZlQmFzZVN1YnNjcml0cGlvbiA9IHRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyQmFzZVNlcnZpY2UuYWRkZWREaXJlY3RpdmVPYnNlcnZhYmxlXHJcbiAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEudHJlYXRlZCkge1xyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3cpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5SW5mbyA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuY3VycmVudFdvcmtmbG93RW50aXR5SW5mb1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVudGl0eUluZm8/LmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgJiYgIXRoaXMuZW50aXR5SW5mbz8uZGlzY3JpbWluYXRvckNsYXNzTmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU2luZ2xlRWxlbWVudChkYXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICB0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbiA9IHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuX2Rlc2lnbk1vZGVGb3JtU3ViamVjdC5zdWJzY3JpYmUoZGF0YSA9PiB7XHJcbiAgICAgIGlmIChkYXRhICYmIGRhdGEgPT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMudG9nZ2xlRGVzaWduTW9kZSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB0b2dnbGVEZXNpZ25Nb2RlKCkge1xyXG4gICAgdGhpcy5yZW1vdmVUc2lNb2RhbEZvb3RlcigpXHJcbiAgICB0aGlzLmNyZWF0ZVNhdmVCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QgPSB0aGlzLl9wcmVzZW50YXRpb25TZXR0aW5nU2VydmljZS5nZXRQcmVzZW50YXRpb25TZXR0aW5nQnlDb21wb25lbnRJZGVudGlmaWVyU3luYyh0aGlzLmdldENvbXBvbmVudElkZW50aWZpZXIoKSwgdGhpcy5kZXNjcmltaW5hdG9yVmFsdWUpID8/IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzPy5mb3JFYWNoKGlucHV0ID0+IHtcclxuICAgICAgaW5wdXQuaW5zZXJ0RWxlbWVudCgpO1xyXG4gICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSkge1xyXG4gICAgICAgIGlucHV0LnNlbGVjdEFwcHJvcmlhdGVDb2x1bW5zKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCk7XHJcbiAgICAgIH1cclxuICAgICAgaW5wdXQuYWRkQ2hlY2tib3hlc1RvSW5wdXRzKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpXHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFjdGl2ZVN1YnNjcml0cGlvbigpXHJcbiAgICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuICAgIGNvbnNvbGUubG9nKFwiY291bnQgb2YgZGlyZWN0aXZlRWxlbWVudHMgPT4gXCIsIHRoaXMuZGlyZWN0aXZlRWxlbWVudHMubGVuZ3RoKVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZT8uaXNEZXNpZ25Nb2RlXHJcbiAgICAgICYmICF0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICAvLyB0aGlzLnJlbW92ZVRzaU1vZGFsRm9vdGVyKClcclxuICAgICAgLy8gdGhpcy5jcmVhdGVTYXZlQnV0dG9uKClcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG5cclxuICAgICAgaWYgKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuaXNEZXNnaW5Nb2RlRnJvbVdvcmtmbG93KSB7XHJcbiAgICAgICAgdGhpcy5lbnRpdHlJbmZvID0gdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5jdXJyZW50V29ya2Zsb3dFbnRpdHlJbmZvXHJcbiAgICAgIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5lbnRpdHlJbmZvID0gYXdhaXQgdGhpcy5fZW50aXR5Q29uZmlnU2VydmljZS5nZXRFbnRpdHlJbmZvRnJvbUNhY2hlKHRoaXMuYnVzaW5lc3NDbGFzcylcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8vaW5pdCBnZW5lcmljQ3J1ZCByZXBvcnRpbmdcclxuICAgIGlmICh0aGlzLmZvcm0pIHtcclxuICAgICAgdGhpcy5mb3JtLmZvcm1SZWZDaGFuZ2Uuc3Vic2NyaWJlKGYgPT4ge1xyXG4gICAgICAgIGlmIChmKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1SZWYgPSBmO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9ybS5kaXNhYmxlZCA9IHRoaXMuaXNGb3JtRGlzYWJsZWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5mb3JtRW5kcG9pbnQgPSB0aGlzLmZvcm1FbmRwb2ludDtcclxuICAgICAgdGhpcy5mb3JtLmZvcm1OYW1lID0gdGhpcy5mb3JtTmFtZTtcclxuICAgICAgdGhpcy5mb3JtLmJ1c2luZXNzQ2xhc3MgPSB0aGlzLl9idXNpbmVzc0NsYXNzXHJcbiAgICAgIHRoaXMuZm9ybS5mb3JtTmFtZSA9IHRoaXMuZm9ybU5hbWU7XHJcbiAgICAgIHRoaXMuZm9ybS5pZCA9IHRoaXMuaWQ7XHJcbiAgICAgIHRoaXMuZm9ybS5tb2RlID0gdGhpcy5tb2RlXHJcblxyXG4gICAgICAvLyB3b3JrZmxvdyBmb3JtIGRlc2lnblxyXG4gICAgICB0aGlzLl9zYXZlV29ya2Zsb3dGb3JtQ29uZmlndXJhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuZm9ybS5vblN1Ym1pdEZvcm1Xb3JrZmxvd0NvbmZpZ3VyYXRpb24uc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uID0gdGhpcy5nZXRGb3JtV29yZmtsb3dQcmVzZW50YXRpb25TZXR0aW5nKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJGb3JtV29yZmtsb3dTZXR0aW5nID0+IFwiLCB3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICAgIHRoaXMuaGlkZSh3b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgdGhpcy5mb3JtLm9uU3RhdHVzQ2hhbmdlLnN1YnNjcmliZSgobmV3VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gbmV3VmFsdWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubW9kZSA9PSBDb21wb25lbnRfTW9kZXMuQ1JFQVRFKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrYm94KSB7XHJcbiAgICAgICAgdGhpcy5jaGVja2JveC5mb3JFYWNoKGJveCA9PiB7XHJcbiAgICAgICAgICBib3guaW5wdXRGaWVsZCA9IGZhbHNlO1xyXG4gICAgICAgICAgYm94LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGluaXRUc2lHcmlkc1JlZigpIHtcclxuICAgIHRoaXMudmlld0dyaWRzQ29tcG9uZW50cyA9IHRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXRWaWV3R3JpZHMoKVxyXG4gICAgdGhpcy5nZW5lcmljR3JpZHNDb21wb25lbnRzID0gdGhpcy5fcHJlc2VudGF0aW9uRGVzaWduZXJTZXJ2aWNlLmdldEdlbmVyaWNHcmlkcygpXHJcbiAgICB0aGlzLmVkaXRhYmxlR3JpZENvbXBvbmVudHMgPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RWRpdGFibGVHcmlkcygpXHJcbiAgICB0aGlzLmdlbmVyaWNDcnVkc0NvbXBvbmVudHMgPSB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0R2VuZXJpY0NydWRzKClcclxuICB9XHJcblxyXG4gIGdldEZvcm1Xb3Jma2xvd1ByZXNlbnRhdGlvblNldHRpbmcoKSB7XHJcbiAgICBsZXQgcHJlc2VudGF0aW9uUmVxdWVzdCA9IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuXHJcbiAgICB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzID0gWy4uLnRoaXMuX3ByZXNlbnRhdGlvbkRlc2lnbmVyU2VydmljZS5nZXREaXJlY3RpdmVzKCksXHJcbiAgICAuLi50aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lckJhc2VTZXJ2aWNlLmdldERpcmVjdGl2ZXMoKVxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxbXSA9IFtdXHJcbiAgICBsZXQgYXZhaWxhYmxlRGlyZWN0aXZlRWxlbWVudHMgPSB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRzLmZpbHRlcih4ID0+XHJcbiAgICAgICEodGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0Py5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5zb21lKHkgPT5cclxuICAgICAgICB5LmJsb2NrTmFtZSA9PT0geC5wcmVzZW50YXRpb25EZXNpZ25lciAmJiAheS5pc0Jsb2NrVmlzaWJsZVxyXG4gICAgICApKVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmluaXRUc2lHcmlkc1JlZigpXHJcblxyXG4gICAgYXZhaWxhYmxlRGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goKGRpcmVjdGl2ZSkgPT4ge1xyXG5cclxuICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWRcclxuXHJcblxyXG4gICAgICBsZXQgZ3JpZFN0YXRlID0gW1xyXG4gICAgICAgIC4uLnRoaXMudmlld0dyaWRzQ29tcG9uZW50cyxcclxuICAgICAgICAuLi50aGlzLmdlbmVyaWNHcmlkc0NvbXBvbmVudHMsXHJcbiAgICAgICAgLi4udGhpcy5nZW5lcmljQ3J1ZHNDb21wb25lbnRzLFxyXG4gICAgICAgIC4uLnRoaXMuZWRpdGFibGVHcmlkQ29tcG9uZW50c1xyXG4gICAgICBdXHJcbiAgICAgICAgLmZpbmQoeCA9PiB4LmlkID09PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIgfHwgKCdmb3JtTmFtZScgaW4geCAmJiB4LmZvcm1OYW1lID09PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpKVxyXG4gICAgICAgID8uZ2V0U3RhdGUoKTtcclxuXHJcbiAgICAgIGNvbmZpZ3VyYXRpb24gPSBncmlkU3RhdGUgPyBKU09OLnN0cmluZ2lmeShncmlkU3RhdGUpIDogdW5kZWZpbmVkO1xyXG5cclxuXHJcbiAgICAgIGxldCBvYmplY3Q6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWwgPSB7XHJcbiAgICAgICAgYmxvY2tOYW1lOiBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIsXHJcbiAgICAgICAgaXNCbG9ja1Zpc2libGU6ICFkaXJlY3RpdmUuc2hvd0hpZGVDaGVja2JveENvbXBvbmVudFJlZj8uaW5zdGFuY2U/Ll9jaGVja2VkLFxyXG4gICAgICAgIHVpZDogdGhpcy5nZXRQcmVzZW50YXRpb25TZXRpbmdEZXRhaWxVaWQoZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyID8/IFwiXCIpLFxyXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgaXNJbnB1dEVuYWJsZWQ6ICFkaXJlY3RpdmUuZGlzYWJsZWRDaGVja2JveENvbXBvbmVudFJlZj8uaW5zdGFuY2U/Ll9jaGVja2VkXHJcbiAgICAgIH1cclxuICAgICAgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHMucHVzaChvYmplY3QpXHJcbiAgICB9KVxyXG5cclxuICAgIHByZXNlbnRhdGlvblJlcXVlc3QuY29tcG9uZW50SWRlbnRpZmVyID0gdGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCk7XHJcbiAgICBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzID0gcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHNcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcInByZXNlbnRhdGlvblJlcXVlc3QgPT4gXCIsIHByZXNlbnRhdGlvblJlcXVlc3QpXHJcbiAgICByZXR1cm4gcHJlc2VudGF0aW9uUmVxdWVzdFxyXG4gIH1cclxuXHJcblxyXG4gIGlzRGVsZXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkRFTEVURTtcclxuICB9XHJcbiAgaXNTdWJtaXREaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIC8vcmV0dXJuICF0aGlzLmZvcm1SZWY/LmZvcm0/LnZhbGlkIHx8IHRoaXMuc2F2aW5nO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBpc0NvbnN1bHRNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PSBDb21wb25lbnRfTW9kZXMuQ09OU1VMVDtcclxuICB9XHJcblxyXG4gIGlzRHVwbGljYXRlTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkRVUExJQ0FURTtcclxuICB9XHJcbiAgaXNFZGl0TW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGUgPT0gQ29tcG9uZW50X01vZGVzLkVESVQ7XHJcbiAgfVxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaW5pdE1vZGFsRGF0YSgpIHtcclxuICAgIHN1cGVyLmluaXRNb2RhbERhdGEoKVxyXG4gICAgaWYgKHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dSZWYgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dDb25maWcgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vY2hlY2sgaGF2ZSBvcGVuZWREaWFsb2dDb25maWdcclxuICAgICAgaWYgKHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnLmRhdGEgIT0gbnVsbCAmJiB0aGlzLm9wZW5lZERpYWxvZ0NvbmZpZy5kYXRhICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuY3VkQ29tcG9uZW50ID0gdGhpcy5vcGVuZWREaWFsb2dDb25maWcuZGF0YS5jdWRDb21wb25lbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBfdmVyaWZ5TW9kYWxEYXRhKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dSZWYgIT0gdW5kZWZpbmVkXHJcbiAgICAgICYmIHRoaXMub3BlbmVkRGlhbG9nQ29uZmlnICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5vcGVuZWREaWFsb2dDb25maWcgIT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwcml2YXRlIF9pbml0TW9kYWxSZWYoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fdmVyaWZ5TW9kYWxEYXRhKCkpIHtcclxuICAgICAgLy90aGlzLmJzTW9kYWxSZWYgPSB7aGlkZTogKCkgPT4gdGhpcy5vcGVuZWREaWFsb2dSZWYuZGVzdHJveSgpLGNsb3NlOiAodmFsOiBhbnkpPT57dGhpcy5vcGVuZWREaWFsb2dSZWYuY2xvc2UodmFsKX19XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vXHJcbiAgbChrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5sb2NhbGl6ZSAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMubG9jYWxpemUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiB0cmFpdGVyIG11bHRpcGxlIGNvbWJvXHJcbiAgYWxsQ29tYm9Mb2FkaW5nU3RhdHVzOiBBcnJheTxDb21ib1N0YXR1c01vZGVsPiA9IFtdO1xyXG4gIGFyZUFsbENvbWJvTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJvY2Vzc0NvbWJvSW5pdEV2ZW50KGNvbWJvU3RhdHVzOiBDb21ib1N0YXR1c01vZGVsKSB7XHJcbiAgICBpZiAoIXRoaXMuYWxsQ29tYm9Mb2FkaW5nU3RhdHVzLmZpbmQodSA9PiB1LnVpZCA9PSBjb21ib1N0YXR1cy51aWQpKVxyXG4gICAgICB0aGlzLmFsbENvbWJvTG9hZGluZ1N0YXR1cy5wdXNoKGNvbWJvU3RhdHVzKTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NDb21ib0lzTG9hZGVkRXZlbnQoY29tYm9TdGF0dXM6IENvbWJvU3RhdHVzTW9kZWwpIHtcclxuICAgIGxldCBjb21ib1MgPSB0aGlzLmFsbENvbWJvTG9hZGluZ1N0YXR1cy5maW5kKHUgPT4gdS51aWQgPT0gY29tYm9TdGF0dXMudWlkKTtcclxuICAgIGlmIChjb21ib1MgIT0gbnVsbCAmJiBjb21ib1MgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbWJvUy5pc0RhdGFMb2FkZWQgPSBjb21ib1N0YXR1cy5pc0RhdGFMb2FkZWQ7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFyZUFsbENvbWJvTG9hZGVkRm4oKTtcclxuICB9XHJcblxyXG4gIGFyZUFsbENvbWJvTG9hZGVkRm4oKTogdm9pZCB7XHJcbiAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxDb21ib0xvYWRpbmdTdGF0dXMubGVuZ3RoID4gMClcclxuICAgICAgdGhpcy5hbGxDb21ib0xvYWRpbmdTdGF0dXMuZm9yRWFjaCh1ID0+IHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdS5pc0RhdGFMb2FkZWQ7XHJcbiAgICAgIH0pO1xyXG4gICAgZWxzZSByZXN1bHQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmFyZUFsbENvbWJvTG9hZGVkID0gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaGlkZSh2YWw/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm9wZW5lZERpYWxvZ1JlZiAhPSBudWxsICYmIHRoaXMub3BlbmVkRGlhbG9nUmVmICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodmFsID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuZWREaWFsb2dSZWYuZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMub3BlbmVkRGlhbG9nUmVmLmNsb3NlKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHRyYWl0ZXIgbXVsdGlwbGUgY29tYm9cclxuXHJcbiAgZ2V0V29ya2Zsb3dFdGF0Rm9ybSgpIHtcclxuICAgIGxldCB3b3JrZmxvd0V0YXRGb3JtID0gdGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS53b3JrZmxvd0V0YXRGb3JtRm9yQ3VycmVudEZvcm1cclxuICAgICAgPy5maW5kKHggPT4geC51aWQgPT0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpXHJcblxyXG4gICAgaWYgKHdvcmtmbG93RXRhdEZvcm0pIHtcclxuICAgICAgbGV0IHdvcmtmbG93RXRhdCA9IHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UubWFwV29ya2Zsb3dFdGF0Rm9ybVRvUHJlc2VudGF0aW9uU2V0dGluZyhcclxuICAgICAgICB3b3JrZmxvd0V0YXRGb3JtPy53b3JrZmxvd0V0YXRzRm9ybXNcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB3b3JrZmxvd0V0YXRcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWRcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gUHJlc2VudGF0aW9uIFNldHRpbmdzXHJcbiAgYWRkSW5wdXRzKFxyXG4gICAgcHJlc2VudGF0aW9uUmVxdWVzdDogUHJlc2VudGF0aW9uU2V0dGluZyxcclxuICAgIGFwcGx5R3JpZENvbmZpZzogYm9vbGVhbiA9IHRydWUsXHJcbiAgICB3b3JrZmxvd0V0YXQ/OiBQcmVzZW50YXRpb25TZXR0aW5nLFxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM6IChQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSlbXSA9IHRoaXMuZGlyZWN0aXZlRWxlbWVudHNcclxuICApOiB2b2lkIHtcclxuXHJcbiAgICBpZiAoKCF3b3JrZmxvd0V0YXQgfHwgd29ya2Zsb3dFdGF0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb25cclxuICAgICAgJiYgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpIHtcclxuICAgICAgd29ya2Zsb3dFdGF0ID0gdGhpcy5nZXRXb3JrZmxvd0V0YXRGb3JtKClcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoYXNQcmVzZW50YXRpb25SZXF1ZXN0ID0gcHJlc2VudGF0aW9uUmVxdWVzdD8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM/Lmxlbmd0aCA+IDA7XHJcblxyXG5cclxuICAgIGlmIChoYXNQcmVzZW50YXRpb25SZXF1ZXN0KSB7XHJcbiAgICAgIGRpcmVjdGl2ZUVsZW1lbnRzID0gZGlyZWN0aXZlRWxlbWVudHMuZmlsdGVyKHggPT5cclxuICAgICAgICBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzPy5zb21lKFxyXG4gICAgICAgICAgeSA9PiB5LmJsb2NrTmFtZSA9PT0geC5wcmVzZW50YXRpb25EZXNpZ25lciAmJiAoeS5pc0Jsb2NrVmlzaWJsZSA9PSB1bmRlZmluZWQgfHwgeS5pc0Jsb2NrVmlzaWJsZSA9PSB0cnVlKVxyXG4gICAgICAgICAgICAmJiB4LnRyZWF0ZWQgPT0gZmFsc2VcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goZGlyZWN0aXZlID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWwgPSBwcmVzZW50YXRpb25SZXF1ZXN0LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG4gICAgICBpZiAocHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9PSB1bmRlZmluZWQgfHwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbC5pc0Jsb2NrVmlzaWJsZSkge1xyXG5cclxuICAgICAgICBsZXQgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKTtcclxuXHJcbiAgICAgICAgaWYgKHdvcmZrZmxvd0V0YXRGb3JtKSB7XHJcbiAgICAgICAgICBsZXQgd29ya2Zsb3dDb25maWcgPSB3b3Jma2Zsb3dFdGF0Rm9ybS5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyKVxyXG5cclxuICAgICAgICAgIGlmICghd29ya2Zsb3dDb25maWcpIHtcclxuICAgICAgICAgICAgZGlyZWN0aXZlLmV4ZWN1dGUodHJ1ZSwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbD8uY29uZmlndXJhdGlvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmICh3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCA9PSB1bmRlZmluZWQgfHwgd29ya2Zsb3dDb25maWcuaXNJbnB1dEVuYWJsZWQgPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgICAgZGlyZWN0aXZlLmV4ZWN1dGUodHJ1ZSwgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbD8uY29uZmlndXJhdGlvbilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmIHdvcmtmbG93Q29uZmlnLmlzSW5wdXRFbmFibGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGRpcmVjdGl2ZS5kaXNhYmxlSW5wdXRzKClcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuZXhlY3V0ZSh0cnVlLCBwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsPy5jb25maWd1cmF0aW9uKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2UuaXNEZXNnaW5Nb2RlRnJvbVdvcmtmbG93KSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuYWRkQ2hlY2tib3hlc1RvSW5wdXRzKHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2Uud29ya2Zsb3dGb3JtQ29uZmlndXJhdGlvbilcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5tb2RlID09PSBNb2Rlcy5jcmVhdGUpIHtcclxuICAgICAgdGhpcy5wcm9jZXNzRGlzYWJsZWRJbnB1dHMocHJlc2VudGF0aW9uUmVxdWVzdCwgZGlyZWN0aXZlRWxlbWVudHMpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnJlbW92ZUVtcHR5QW5jZXN0b3JzRnJvbUVsZW1lbnRzKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHByb2Nlc3NEaXNhYmxlZElucHV0cyhwcmVzZW50YXRpb25SZXF1ZXN0OiBQcmVzZW50YXRpb25TZXR0aW5nLCBkaXJlY3RpdmVFbGVtZW50czogKFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlIHwgUHJlc2VudGF0aW9uRGVzaWduZXJEaXJlY3RpdmVCYXNlKVtdID0gdGhpcy5kaXJlY3RpdmVFbGVtZW50cykge1xyXG4gICAgaWYgKHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2U/LmlzRGVzaWduTW9kZSB8fCB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGNvbnN0IGhhc1ByZXNlbnRhdGlvblJlcXVlc3QgPSBwcmVzZW50YXRpb25SZXF1ZXN0Py5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscz8ubGVuZ3RoID4gMDtcclxuXHJcbiAgICBpZiAoaGFzUHJlc2VudGF0aW9uUmVxdWVzdCkge1xyXG4gICAgICBkaXJlY3RpdmVFbGVtZW50cyA9IGRpcmVjdGl2ZUVsZW1lbnRzLmZpbHRlcih4ID0+XHJcbiAgICAgICAgcHJlc2VudGF0aW9uUmVxdWVzdC5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscz8uc29tZShcclxuICAgICAgICAgIHkgPT4geS5ibG9ja05hbWUgPT09IHgucHJlc2VudGF0aW9uRGVzaWduZXIgJiYgeS5pc0Jsb2NrVmlzaWJsZVxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3Qgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKVxyXG4gICAgZGlyZWN0aXZlRWxlbWVudHM/LmZvckVhY2goZGlyZWN0aXZlID0+IHtcclxuXHJcbiAgICAgIGxldCB3b3JrZmxvd0NvbmZpZyA9IHdvcmZrZmxvd0V0YXRGb3JtPy5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gZGlyZWN0aXZlLnByZXNlbnRhdGlvbkRlc2lnbmVyKVxyXG5cclxuICAgICAgaWYgKHdvcmtmbG93Q29uZmlnICYmICF3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCAmJiAod29ya2Zsb3dDb25maWcuaXNCbG9ja1Zpc2libGUgPz8gdHJ1ZSkpIHtcclxuICAgICAgICBkaXJlY3RpdmUuZGlzYWJsZUlucHV0cygpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZW1vdmVFbXB0eUFuY2VzdG9yc0Zyb21FbGVtZW50cygpIHtcclxuICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICB0aGlzLl9wcmVzZW50YXRpb25EZXNpZ25lclNlcnZpY2UuZ2V0RGlyZWN0aXZlcygpLmZvckVhY2gocyA9PiBzLnJlbW92ZUVtcHR5QW5jZXN0b3JzKHM/LnRlbXBUZW1wbGF0ZVBhcmVudE5vZGUpKVxyXG4gICAgLy8gfSwgMCk7XHJcbiAgfVxyXG5cclxuICBnZXRQcmVzZW50YXRpb25TZXRpbmdEZXRhaWxVaWQoYmxvY2tOYW1lOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3Q/LnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzPy5maW5kKHggPT4geC5ibG9ja05hbWUgPT0gYmxvY2tOYW1lKT8udWlkXHJcbiAgfVxyXG5cclxuICBnZXRDb21wb25lbnRJZGVudGlmaWVyKCkge1xyXG4gICAgLy8gaWYgKHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKSB7XHJcbiAgICAvLyAgIHJldHVybiBgJHt0aGlzLl9teU5hbWUoKX1fJHt0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZX1gXHJcbiAgICAvLyB9XHJcbiAgICByZXR1cm4gdGhpcy5fbXlOYW1lKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVByb3BlcnRpZXMoKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5pbml0VHNpR3JpZHNSZWYoKVxyXG5cclxuICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmdldFByZXNlbnRhdGlvblNldHRpbmdCeUNvbXBvbmVudElkZW50aWZpZXJTeW5jKHRoaXMuZ2V0Q29tcG9uZW50SWRlbnRpZmllcigpLCB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSkgPz8gbmV3IFByZXNlbnRhdGlvblNldHRpbmcoKVxyXG5cclxuICAgIGlmICghdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCA9IG5ldyBQcmVzZW50YXRpb25TZXR0aW5nKClcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM6IFByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxbXSA9IFtdXHJcblxyXG4gICAgdGhpcy5kaXJlY3RpdmVFbGVtZW50cz8uZm9yRWFjaCgoZGlyZWN0aXZlKSA9PiB7XHJcblxyXG4gICAgICBsZXQgY29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZFxyXG5cclxuXHJcbiAgICAgIGxldCBncmlkU3RhdGUgPSBbXHJcbiAgICAgICAgLi4udGhpcy52aWV3R3JpZHNDb21wb25lbnRzLFxyXG4gICAgICAgIC4uLnRoaXMuZ2VuZXJpY0dyaWRzQ29tcG9uZW50cyxcclxuICAgICAgICAuLi50aGlzLmdlbmVyaWNDcnVkc0NvbXBvbmVudHMsXHJcbiAgICAgICAgLi4udGhpcy5lZGl0YWJsZUdyaWRDb21wb25lbnRzXHJcbiAgICAgIF1cclxuICAgICAgICAuZmluZCh4ID0+IHguaWQgPT09IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lciB8fCAoJ2Zvcm1OYW1lJyBpbiB4ICYmIHguZm9ybU5hbWUgPT09IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lcikpXHJcbiAgICAgICAgPy5nZXRTdGF0ZSgpO1xyXG5cclxuICAgICAgY29uZmlndXJhdGlvbiA9IGdyaWRTdGF0ZSA/IEpTT04uc3RyaW5naWZ5KGdyaWRTdGF0ZSkgOiB1bmRlZmluZWQ7XHJcblxyXG5cclxuICAgICAgbGV0IG9iamVjdDogUHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9IHtcclxuICAgICAgICBibG9ja05hbWU6IGRpcmVjdGl2ZS5wcmVzZW50YXRpb25EZXNpZ25lcixcclxuICAgICAgICBpc0Jsb2NrVmlzaWJsZTogIWRpcmVjdGl2ZS5zaG93SGlkZUNoZWNrYm94Q29tcG9uZW50UmVmPy5pbnN0YW5jZT8uX2NoZWNrZWQsXHJcbiAgICAgICAgdWlkOiB0aGlzLmdldFByZXNlbnRhdGlvblNldGluZ0RldGFpbFVpZChkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIgPz8gXCJcIiksXHJcbiAgICAgICAgY29uZmlndXJhdGlvbjogY29uZmlndXJhdGlvblxyXG4gICAgICB9XHJcbiAgICAgIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLnB1c2gob2JqZWN0KVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QuY29tcG9uZW50SWRlbnRpZmVyID0gdGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCk7XHJcbiAgICB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QuZGVzY3JpbWluYXRvclZhbHVlID0gdGhpcy5kZXNjcmltaW5hdG9yVmFsdWVcclxuICAgIHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdC5wcmVzZW50YXRpb25TZXR0aW5nRGV0YWlscyA9IHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzXHJcblxyXG4gICAgdGhpcy5pc2xvYWRpbmcgPSB0cnVlXHJcblxyXG4gICAgaWYgKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdC51aWQgIT0gbnVsbCAmJiB0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QudWlkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9wcmVzZW50YXRpb25TZXR0aW5nU2VydmljZS51cGRhdGVQcmVzZW50YXRpb25TZXR0aW5nKHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdCwgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0LnVpZClcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IGFzeW5jIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0FmdGVyU2F2ZUNvbmZpZ3VyYXRpb24oKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpXHJcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyLnNob3dFcnJvck1lc3NhZ2UoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuY3JlYXRlUHJlc2VudGF0aW9uU2V0dGluZyh0aGlzLnByZXNlbnRhdGlvblJlcXVlc3QpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiBhc3luYyAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NBZnRlclNhdmVDb25maWd1cmF0aW9uKClcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgICAgICB0aGlzLl9lcnJvclJlc3BvbnNlTWFuYWdlci5zaG93RXJyb3JNZXNzYWdlKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1NpbmdsZUVsZW1lbnQoZGlyZWN0aXZlOiBQcmVzZW50YXRpb25EZXNpZ25lckRpcmVjdGl2ZSB8IFByZXNlbnRhdGlvbkRlc2lnbmVyRGlyZWN0aXZlQmFzZSkge1xyXG4gICAgdGhpcy5wcmVzZW50YXRpb25SZXF1ZXN0ID0gdGhpcy5fcHJlc2VudGF0aW9uU2V0dGluZ1NlcnZpY2UuZ2V0UHJlc2VudGF0aW9uU2V0dGluZ0J5Q29tcG9uZW50SWRlbnRpZmllclN5bmModGhpcy5nZXRDb21wb25lbnRJZGVudGlmaWVyKCksIHRoaXMuZGVzY3JpbWluYXRvclZhbHVlKSA/PyBuZXcgUHJlc2VudGF0aW9uU2V0dGluZygpXHJcbiAgICBsZXQgcHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbCA9IHRoaXMucHJlc2VudGF0aW9uUmVxdWVzdD8ucHJlc2VudGF0aW9uU2V0dGluZ0RldGFpbHM/LmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG5cclxuICAgIGlmIChwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsID09IHVuZGVmaW5lZCB8fCBwcmVzZW50YXRpb25TZXR0aW5nRGV0YWlsLmlzQmxvY2tWaXNpYmxlKSB7XHJcblxyXG4gICAgICBsZXQgd29yZmtmbG93RXRhdEZvcm0gPSB0aGlzLmdldFdvcmtmbG93RXRhdEZvcm0oKTtcclxuXHJcbiAgICAgIGlmICh3b3Jma2Zsb3dFdGF0Rm9ybSkge1xyXG4gICAgICAgIGxldCB3b3JrZmxvd0NvbmZpZyA9IHdvcmZrZmxvd0V0YXRGb3JtLnByZXNlbnRhdGlvblNldHRpbmdEZXRhaWxzLmZpbmQoeCA9PiB4LmJsb2NrTmFtZSA9PSBkaXJlY3RpdmUucHJlc2VudGF0aW9uRGVzaWduZXIpXHJcblxyXG4gICAgICAgIGlmICghd29ya2Zsb3dDb25maWcpIHtcclxuICAgICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmICh3b3JrZmxvd0NvbmZpZy5pc0lucHV0RW5hYmxlZCA9PSB1bmRlZmluZWQgfHwgd29ya2Zsb3dDb25maWcuaXNJbnB1dEVuYWJsZWQgPT0gdHJ1ZSkpIHtcclxuICAgICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHdvcmtmbG93Q29uZmlnICYmIHdvcmtmbG93Q29uZmlnLmlzQmxvY2tWaXNpYmxlICYmIHdvcmtmbG93Q29uZmlnLmlzSW5wdXRFbmFibGVkID09IGZhbHNlKSB7XHJcbiAgICAgICAgICBkaXJlY3RpdmUuZGlzYWJsZUlucHV0cygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGRpcmVjdGl2ZS5leGVjdXRlKHRydWUsIHByZXNlbnRhdGlvblNldHRpbmdEZXRhaWw/LmNvbmZpZ3VyYXRpb24pXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICAgIGRpcmVjdGl2ZS5hZGRDaGVja2JveGVzVG9JbnB1dHModGhpcy5fd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS53b3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uKVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlRnJvbUFjdGl2ZVN1YnNjcml0cGlvbigpIHtcclxuICAgIGlmICh0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLl9kZXNpZ25Nb2RlRm9ybVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuX3NhdmVXb3JrZmxvd0Zvcm1Db25maWd1cmF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24pIHtcclxuICAgICAgdGhpcy5fYWRkZWREaXJlY3RpdmVTdWJzY3JpdHBpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hZGRlZERpcmVjdGl2ZUJhc2VTdWJzY3JpdHBpb24pIHtcclxuICAgICAgdGhpcy5fYWRkZWREaXJlY3RpdmVCYXNlU3Vic2NyaXRwaW9uLnVuc3Vic2NyaWJlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVRzaU1vZGFsRm9vdGVyKCkge1xyXG4gICAgY29uc3QgdHNpTW9kYWxGb290ZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidHNpLW1vZGFsLWZvb3RlclwiKVxyXG5cclxuICAgIGlmICh0c2lNb2RhbEZvb3RlciAmJiB0c2lNb2RhbEZvb3Rlci5sYXN0Q2hpbGQpIHtcclxuICAgICAgdGhpcy5fcmVuZGVyZXI/LnJlbW92ZUNoaWxkKHRzaU1vZGFsRm9vdGVyLCB0c2lNb2RhbEZvb3Rlci5sYXN0Q2hpbGQpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTYXZlQnV0dG9uKCkge1xyXG4gICAgY29uc3QgdHNpQnV0dG9uUmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZj8uY3JlYXRlQ29tcG9uZW50KFRzaUJ1dHRvbkNvbXBvbmVudCk7XHJcbiAgICB0c2lCdXR0b25SZWY/LnNldElucHV0KCd0ZXh0JywgJ3NoYXJlZF90c2lfY29tcG9uZW50X3NhdmVfY29uZmlnX3Nob3dfaGlkZScpO1xyXG4gICAgdHNpQnV0dG9uUmVmPy5zZXRJbnB1dCgnaWNvbicsICdzYXZlJyk7XHJcblxyXG4gICAgdHNpQnV0dG9uUmVmIS5pbnN0YW5jZS5vbkNsaWNrLmVtaXQgPSAoKSA9PiB0aGlzLnNhdmVQcm9wZXJ0aWVzKCk7XHJcblxyXG4gICAgY29uc3QgdHNpRm9ybSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0c2ktZm9ybVwiKVxyXG5cclxuICAgIGlmICh0c2lGb3JtKSB7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyPy5hcHBlbmRDaGlsZCh0c2lGb3JtLCB0c2lCdXR0b25SZWY/LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgcHJvY2Vzc0FmdGVyU2F2ZUNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICB0aGlzLmlzbG9hZGluZyA9IGZhbHNlXHJcbiAgICB0aGlzLmhpZGUoKVxyXG4gICAgdGhpcy5fbWVzc2FnZUluZm9TZXJ2aWNlLnN1Y2Nlc3MoTG9jYWxpemF0aW9uS2V5cy5zYXZlZFN1Y2Nlc3NmdWxseSlcclxuICAgIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlID0gZmFsc2VcclxuICAgIC8vIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuY3VycmVudEZvcm1OYW1lID0gdW5kZWZpbmVkXHJcbiAgICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLl9kZXNpZ25Nb2RlRm9ybVN1YmplY3QubmV4dChmYWxzZSlcclxuICAgIGF3YWl0IHRoaXMuX3ByZXNlbnRhdGlvblNldHRpbmdTZXJ2aWNlLmxvYWRQcmVzZW50YXRpb25TZXR0aW5ncygpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZSgpOiB2b2lkIHtcclxuXHJcbiAgICB0aGlzLnJlcXVpcmVkSW5wdXRzID0gdGhpcy5faW5wdXRSZWdpc3RyeS5nZXRBbGwoKS5maWx0ZXIoaW5wID0+IGlucC5pc1JlcXVpcmVkICYmIGlucC5kaXNhYmxlZCA9PT0gZmFsc2UpO1xyXG4gICAgdGhpcy5mYXVsdHlJbnB1dHMgPSBbXTtcclxuICAgIHRoaXMuaXNGb3JtVmFsaWQgPSB0aGlzLnJlcXVpcmVkSW5wdXRzLmV2ZXJ5KGlucHV0ID0+IGlucHV0LmlzVmFsaWQoKS5pc1ZhbGlkID09PSB0cnVlKVxyXG5cclxuICAgIHRoaXMucmVxdWlyZWRJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgIGxldCBmdnIgPSBpbnB1dC5pc1ZhbGlkKCk7XHJcbiAgICAgIGlmIChmdnIuaXNWYWxpZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLmZhdWx0eUlucHV0cy5wdXNoKGZ2cilcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5pc0Zvcm1WYWxpZCA9PT0gZmFsc2UgJiYgdGhpcy5mYXVsdHlJbnB1dHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZhdWx0eUlucHV0cylcclxuICAgICAgbGV0IGZhdWx0eUlucHV0c05hbWVzID0gXCJcIjtcclxuICAgICAgdGhpcy5mYXVsdHlJbnB1dHMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZmF1bHR5SW5wdXRzLmxlbmd0aCAtIDEpXHJcbiAgICAgICAgICBmYXVsdHlJbnB1dHNOYW1lcyArPSBgJHtpdGVtLmlucHV0TmFtZX0uIGBcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBmYXVsdHlJbnB1dHNOYW1lcyArPSBgJHtpdGVtLmlucHV0TmFtZX0sIGBcclxuICAgICAgfSlcclxuICAgICAgZmF1bHR5SW5wdXRzTmFtZXMgPSBmYXVsdHlJbnB1dHNOYW1lcy5yZXBsYWNlKC8sJC8sICcnKTtcclxuICAgICAgaWYgKHRoaXMuZmF1bHR5SW5wdXRzLnNvbWUoZmkgPT4gZmkuZXJyb3IgPT09IEZvcm1WYWxpZGF0aW9uRXJyb3IuUmVxdWlyZWQpKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUluZm9TZXJ2aWNlLndhcm4oZmF1bHR5SW5wdXRzTmFtZXMsIHRoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fcmVxdWlyZWRfZmllbGRfdGl0bGUnKSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExlcyBjaGFtcHMgJHtmYXVsdHlJbnB1dHNOYW1lc30gc29udCBvYmxpZ2F0b2lyZS5gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmZhdWx0eUlucHV0cy5zb21lKGZpID0+IGZpLmVycm9yID09PSBGb3JtVmFsaWRhdGlvbkVycm9yLk1heExlbmd0aCkpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlSW5mb1NlcnZpY2Uud2FybihgXHJcbiAgICAgICAgICAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fdGhlX2ZpZWxkJyl9XHJcbiAgICAgICAgICAke3RoaXMuZmF1bHR5SW5wdXRzWzBdLmlucHV0TmFtZX0gXHJcbiAgICAgICAgICAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aCcpfVxyXG4gICAgICAgICAgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5kYXRhfSAke3RoaXMubG9jYWxpemU/LnRyYW5zZm9ybSgndHNpX2Zvcm1fYmFzZV9hdXRvX3ZhbGlkYXRpb25fbWF4X2xlbmd0aF9jaGFycycpfWAsXHJcbiAgICAgICAgICB0aGlzLmxvY2FsaXplPy50cmFuc2Zvcm0oJ3RzaV9mb3JtX2Jhc2VfYXV0b192YWxpZGF0aW9uX21heF9sZW5ndGhfZmllbGRfdGl0bGUnKSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExlIGNoYW1wICR7dGhpcy5mYXVsdHlJbnB1dHNbMF0uaW5wdXROYW1lfSBuZSBkb2l0IHBhcyBkw6lwYXNzZXIgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5kYXRhfSBjYXJhY3TDqHJlcy5gKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLmZhdWx0eUlucHV0cy5zb21lKGZpID0+IGZpLmVycm9yID09PSBGb3JtVmFsaWRhdGlvbkVycm9yLk91dE9mUmFuZ2UpKSB7XHJcbiAgICAgICAgLy90byBkb1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGUgY2hhbXAgJHt0aGlzLmZhdWx0eUlucHV0c1swXS5pbnB1dE5hbWV9IGRvaXQgw6p0cmUgZGFucyBsJ2ludGVydmFsbGUuYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuIiwiPHA+dHNpLWZvcm0tYmFzZSB3b3JrcyE8L3A+XHJcbiJdfQ==