@smartbit4all/ng-client 4.5.3 → 4.5.4

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 (316) hide show
  1. package/README.md +386 -386
  2. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +1 -1
  3. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +1 -1
  4. package/esm2022/lib/component-factory-service/projects.mjs +1 -1
  5. package/esm2022/lib/session/api/api/api.mjs +1 -1
  6. package/esm2022/lib/session/api/api/session.service.mjs +1 -1
  7. package/esm2022/lib/session/api/configuration.mjs +1 -1
  8. package/esm2022/lib/session/api/encoder.mjs +1 -1
  9. package/esm2022/lib/session/api/index.mjs +1 -1
  10. package/esm2022/lib/session/api/model/accountInfo.mjs +1 -1
  11. package/esm2022/lib/session/api/model/apiError.mjs +1 -1
  12. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +1 -1
  13. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +1 -1
  14. package/esm2022/lib/session/api/model/models.mjs +1 -1
  15. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +1 -1
  16. package/esm2022/lib/session/api/model/session.mjs +1 -1
  17. package/esm2022/lib/session/api/model/sessionInfoData.mjs +1 -1
  18. package/esm2022/lib/session/api/model/userActivityLog.mjs +1 -1
  19. package/esm2022/lib/session/api/param.mjs +1 -1
  20. package/esm2022/lib/session/api/variables.mjs +1 -1
  21. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +1 -1
  22. package/esm2022/lib/session/projects.mjs +1 -1
  23. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +1 -1
  24. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +1 -1
  25. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +1 -1
  26. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +1 -1
  27. package/esm2022/lib/session/smart-session-handler.service.mjs +1 -1
  28. package/esm2022/lib/session/smart-session.module.mjs +1 -1
  29. package/esm2022/lib/session/smart-session.service.mjs +1 -1
  30. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +3 -3
  31. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +1 -1
  32. package/esm2022/lib/shared/projects.mjs +1 -1
  33. package/esm2022/lib/shared/shared.module.mjs +1 -1
  34. package/esm2022/lib/shared/smart-tooltip.directive.mjs +1 -1
  35. package/esm2022/lib/shared/smarttable.date-pipe.mjs +1 -1
  36. package/esm2022/lib/smart-client/projects.mjs +1 -1
  37. package/esm2022/lib/smart-client/smart-component-api-client.mjs +5 -2
  38. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +3 -3
  39. package/esm2022/lib/smart-client/smart.component.mjs +1 -1
  40. package/esm2022/lib/smart-client/smart.service.mjs +1 -1
  41. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +1 -1
  42. package/esm2022/lib/smart-component-layout/api/model/models.mjs +1 -1
  43. package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +1 -1
  44. package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +1 -1
  45. package/esm2022/lib/smart-component-layout/projects.mjs +1 -1
  46. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +1 -1
  47. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +3 -3
  48. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +1 -1
  49. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +1 -1
  50. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +22 -22
  51. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +1 -1
  52. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +1 -1
  53. package/esm2022/lib/smart-diagram/projects.mjs +1 -1
  54. package/esm2022/lib/smart-dialog/projects.mjs +1 -1
  55. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +3 -3
  56. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +1 -1
  57. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +1 -1
  58. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +1 -1
  59. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +3 -3
  60. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +1 -1
  61. package/esm2022/lib/smart-expandable-section/projects.mjs +1 -1
  62. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +1 -1
  63. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +1 -1
  64. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +1 -1
  65. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +1 -1
  66. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +1 -1
  67. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +1 -1
  68. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +1 -1
  69. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +1 -1
  70. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +1 -1
  71. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +1 -1
  72. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +1 -1
  73. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +1 -1
  74. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +1 -1
  75. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +1 -1
  76. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +1 -1
  77. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +1 -1
  78. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +1 -1
  79. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +1 -1
  80. package/esm2022/lib/smart-filter/api/value/model/value.mjs +1 -1
  81. package/esm2022/lib/smart-filter/projects.mjs +1 -1
  82. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +1 -1
  83. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +3 -3
  84. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +3 -3
  85. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +3 -3
  86. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +1 -1
  87. package/esm2022/lib/smart-filter/smart-filter.model.mjs +1 -1
  88. package/esm2022/lib/smart-filter/smart-filter.module.mjs +1 -1
  89. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +1 -1
  90. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +1 -1
  91. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +1 -1
  92. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +1 -1
  93. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +1 -1
  94. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +1 -1
  95. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +1 -1
  96. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +1 -1
  97. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +1 -1
  98. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +1 -1
  99. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +1 -1
  100. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +1 -1
  101. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +1 -1
  102. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +1 -1
  103. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +1 -1
  104. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +1 -1
  105. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +1 -1
  106. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +1 -1
  107. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +1 -1
  108. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +1 -1
  109. package/esm2022/lib/smart-filter-editor/api/param.mjs +1 -1
  110. package/esm2022/lib/smart-filter-editor/api/variables.mjs +1 -1
  111. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +1 -1
  112. package/esm2022/lib/smart-filter-editor/project.mjs +1 -1
  113. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +3 -3
  114. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +3 -3
  115. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +3 -3
  116. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +1 -1
  117. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +1 -1
  118. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +1 -1
  119. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +3 -3
  120. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +3 -3
  121. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +1 -1
  122. package/esm2022/lib/smart-form/projects.mjs +1 -1
  123. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +1 -1
  124. package/esm2022/lib/smart-form/services/smartform.service.mjs +1 -1
  125. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +3 -3
  126. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +3 -3
  127. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +1 -1
  128. package/esm2022/lib/smart-form/smartform.component.mjs +3 -3
  129. package/esm2022/lib/smart-form/smartform.form-model.mjs +1 -1
  130. package/esm2022/lib/smart-form/smartform.model.mjs +1 -1
  131. package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +3 -3
  132. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +3 -3
  133. package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +3 -3
  134. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +1 -1
  135. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +1 -1
  136. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +3 -3
  137. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +3 -3
  138. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +1 -1
  139. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +1 -1
  140. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +21 -3
  141. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +1 -1
  142. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +1 -1
  143. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +1 -1
  144. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +1 -1
  145. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +1 -1
  146. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +1 -1
  147. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +1 -1
  148. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +1 -1
  149. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +1 -1
  150. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +1 -1
  151. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +1 -1
  152. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +1 -1
  153. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +1 -1
  154. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +1 -1
  155. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +1 -1
  156. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +1 -1
  157. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +1 -1
  158. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +1 -1
  159. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +1 -1
  160. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +1 -1
  161. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +1 -1
  162. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +3 -3
  163. package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +3 -3
  164. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +3 -3
  165. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +3 -3
  166. package/esm2022/lib/smart-grid/models/model.mjs +1 -1
  167. package/esm2022/lib/smart-grid/projects.mjs +1 -1
  168. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +1 -1
  169. package/esm2022/lib/smart-grid/smart-grid.component.mjs +3 -3
  170. package/esm2022/lib/smart-grid/smart-grid.module.mjs +1 -1
  171. package/esm2022/lib/smart-grid/smart-grid.service.mjs +12 -4
  172. package/esm2022/lib/smart-icon/projects.mjs +1 -1
  173. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +3 -3
  174. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +3 -3
  175. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +1 -1
  176. package/esm2022/lib/smart-icon/smart-icon.module.mjs +1 -1
  177. package/esm2022/lib/smart-icon/smart-icon.service.mjs +1 -1
  178. package/esm2022/lib/smart-map/abstract-map.mjs +1 -1
  179. package/esm2022/lib/smart-map/api-default/api-default.mjs +1 -1
  180. package/esm2022/lib/smart-map/impl/google-map.mjs +1 -1
  181. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +1 -1
  182. package/esm2022/lib/smart-map/projects.mjs +1 -1
  183. package/esm2022/lib/smart-map/smart-map.component.mjs +3 -3
  184. package/esm2022/lib/smart-map/smart-map.module.mjs +1 -1
  185. package/esm2022/lib/smart-map/smart-map.types.mjs +1 -1
  186. package/esm2022/lib/smart-navbar/projects.mjs +1 -1
  187. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +3 -3
  188. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +1 -1
  189. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +1 -1
  190. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +1 -1
  191. package/esm2022/lib/smart-navigation/projects.mjs +1 -1
  192. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +1 -1
  193. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +1 -1
  194. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +1 -1
  195. package/esm2022/lib/smart-ng-client.module.mjs +1 -1
  196. package/esm2022/lib/smart-ng-client.service.mjs +1 -1
  197. package/esm2022/lib/smart-subject/projects.mjs +1 -1
  198. package/esm2022/lib/smart-subject/smart-subject.mjs +1 -1
  199. package/esm2022/lib/smart-tab-group/projects.mjs +1 -1
  200. package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +3 -3
  201. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +1 -1
  202. package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +1 -1
  203. package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +3 -3
  204. package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +3 -3
  205. package/esm2022/lib/smart-tab-group/tabTile.model.mjs +1 -1
  206. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +3 -3
  207. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +3 -3
  208. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +1 -1
  209. package/esm2022/lib/smart-table/projects.mjs +1 -1
  210. package/esm2022/lib/smart-table/smarttable.component.mjs +3 -3
  211. package/esm2022/lib/smart-table/smarttable.model.mjs +1 -1
  212. package/esm2022/lib/smart-table/smarttable.module.mjs +1 -1
  213. package/esm2022/lib/smart-table/smarttable.service.mjs +1 -1
  214. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +3 -3
  215. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +3 -3
  216. package/esm2022/lib/smart-table/tables/table.mjs +1 -1
  217. package/esm2022/lib/smart-tree/projects.mjs +1 -1
  218. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +1 -1
  219. package/esm2022/lib/smart-tree/smarttree.component.mjs +3 -3
  220. package/esm2022/lib/smart-tree/smarttree.model.mjs +1 -1
  221. package/esm2022/lib/smart-tree/smarttree.module.mjs +1 -1
  222. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +1 -1
  223. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +1 -1
  224. package/esm2022/lib/smart-tree/smarttree.service.mjs +1 -1
  225. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +1 -1
  226. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +1 -1
  227. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +1 -1
  228. package/esm2022/lib/smart-tree/tree-api/param.mjs +1 -1
  229. package/esm2022/lib/smart-tree/tree-api/variables.mjs +1 -1
  230. package/esm2022/lib/smart-validation/named-validator.service.mjs +1 -1
  231. package/esm2022/lib/smart-validation/projects.mjs +1 -1
  232. package/esm2022/lib/smart-validation/smart-validation.module.mjs +1 -1
  233. package/esm2022/lib/smart-validation/smart-validation.types.mjs +1 -1
  234. package/esm2022/lib/view-context/api/api/view.service.mjs +1 -1
  235. package/esm2022/lib/view-context/api/api-default/binaryData.mjs +1 -1
  236. package/esm2022/lib/view-context/api/api-default/invocationError.mjs +1 -1
  237. package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +1 -1
  238. package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +1 -1
  239. package/esm2022/lib/view-context/api/model/models.mjs +1 -1
  240. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
  241. package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
  242. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
  243. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
  244. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
  245. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
  246. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
  247. package/esm2022/lib/view-context/api/model/view.mjs +1 -1
  248. package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
  249. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
  250. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +3 -3
  251. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +3 -3
  252. package/esm2022/lib/view-context/projects.mjs +1 -1
  253. package/esm2022/lib/view-context/property-definition-data.mjs +1 -1
  254. package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +1 -1
  255. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +3 -3
  256. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +1 -1
  257. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +1 -1
  258. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +3 -3
  259. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +3 -3
  260. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +3 -3
  261. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +3 -3
  262. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +1 -1
  263. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +3 -3
  264. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +3 -3
  265. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +1 -1
  266. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +3 -3
  267. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +3 -3
  268. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +1 -1
  269. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +3 -3
  270. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +1 -1
  271. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +3 -3
  272. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +3 -3
  273. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +3 -3
  274. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +1 -1
  275. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +1 -1
  276. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +1 -1
  277. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +1 -1
  278. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +3 -3
  279. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +1 -1
  280. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +1 -1
  281. package/esm2022/lib/view-context/smart-view-context.model.mjs +1 -1
  282. package/esm2022/lib/view-context/smart-view-context.module.mjs +1 -1
  283. package/esm2022/lib/view-context/smart-view-context.service.mjs +1 -1
  284. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +1 -1
  285. package/esm2022/lib/view-context/utility/componentLibrary.mjs +1 -1
  286. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +1 -1
  287. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +1 -1
  288. package/esm2022/lib/view-context/value-api/api/api.mjs +1 -1
  289. package/esm2022/lib/view-context/value-api/api/value.service.mjs +1 -1
  290. package/esm2022/lib/view-context/value-api/api.module.mjs +1 -1
  291. package/esm2022/lib/view-context/value-api/configuration.mjs +1 -1
  292. package/esm2022/lib/view-context/value-api/encoder.mjs +1 -1
  293. package/esm2022/lib/view-context/value-api/index.mjs +1 -1
  294. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +1 -1
  295. package/esm2022/lib/view-context/value-api/model/models.mjs +1 -1
  296. package/esm2022/lib/view-context/value-api/model/value.mjs +1 -1
  297. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +1 -1
  298. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +1 -1
  299. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +1 -1
  300. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +1 -1
  301. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +1 -1
  302. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +1 -1
  303. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +1 -1
  304. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +1 -1
  305. package/esm2022/lib/view-context/value-api/param.mjs +1 -1
  306. package/esm2022/lib/view-context/value-api/variables.mjs +1 -1
  307. package/esm2022/projects.mjs +1 -1
  308. package/fesm2022/smartbit4all-ng-client.mjs +166 -137
  309. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  310. package/lib/smart-client/smart-component-api-client.d.ts +3 -0
  311. package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +8 -6
  312. package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +6 -0
  313. package/lib/smart-grid/smart-grid.service.d.ts +1 -0
  314. package/package.json +1 -1
  315. package/smartbit4all-ng-client-4.5.4.tgz +0 -0
  316. package/smartbit4all-ng-client-4.5.3.tgz +0 -0
@@ -994,11 +994,11 @@ export class SmartformwidgetComponent {
994
994
  return /<[a-z][\s\S]*>/i.test(text);
995
995
  }
996
996
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartformwidgetComponent, deps: [{ token: i1.SmartFormService }, { token: i2.ComponentFactoryService }, { token: i3.DomSanitizer }, { token: COMPONENT_LIBRARY }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
997
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: { form: "form", widgetInstance: "widgetInstance", onBlur: "onBlur", onValueChange: "onValueChange", labelColor: "labelColor", sophisticatedValueChange: "sophisticatedValueChange", blurSophisticatedValueChange: "blurSophisticatedValueChange" }, outputs: { valueCleared: "valueCleared" }, viewQueries: [{ propertyName: "chipInputChild", first: true, predicate: ["chipInput"], descendants: true }, { propertyName: "customComponentVcRef", first: true, predicate: ["customComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "quill", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "sb4Textarea", first: true, predicate: ["sb4Textarea"], descendants: true }, { propertyName: "fileUploader", first: true, predicate: SmartFileEditorComponent, descendants: true }, { propertyName: "multiFileUploader", first: true, predicate: SmartMultiFileEditorComponent, descendants: true }, { propertyName: "dateInputChild", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "timeInputChild", first: true, predicate: ["timeInput"], descendants: true }, { propertyName: "childrenWidgetsQL", predicate: SmartformwidgetComponent, descendants: true }], ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div class=\"container prime\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer textFieldContainer\">\r\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\r\n <input\r\n *ngIf=\"!widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n pInputText\r\n formControlName=\"text\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <p-inputMask\r\n *ngIf=\"widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [mask]=\"widgetInstance.mask\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div class=\"textFieldButtons\">\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n >\r\n </smart-ui-action-toolbar>\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-inputNumber\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n inputId=\"minmax\"\r\n mode=\"decimal\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n [minFractionDigits]=\"0\"\r\n [maxFractionDigits]=\"5\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"widgetContent\">\r\n <p-editor\r\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [disabled]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\r\n (onTextChange)=\"handleBlurEvent($event)\"\r\n />\r\n </div>\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"true\"\r\n [showClear]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n hourFormat=\"24\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n >\r\n </p-calendar>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n />\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-multiSelect\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onPanelShow)=\"onDropDownShow()\"\r\n (onBlur)=\"safeDropDownBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onPanelHide)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\r\n <p-floatLabel>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n pInputTextarea\r\n [autoResize]=\"true\"\r\n cols=\"30\"\r\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\" \"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (ngModelChange)=\"onTextareaChange($event)\"\r\n ></textarea>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n [for]=\"widgetInstance.key\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-chips\r\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\r\n [max]=\"0\"\r\n [maxLength]=\"0\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n >\r\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\r\n </p-chips>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\r\n class=\"widgetContainer imageContainer\"\r\n >\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties!.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\r\n class=\"widgetContainer toggle-col\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </label>\r\n <p-inputSwitch\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\r\n (onChange)=\"onValueChange?.next($event)\"\r\n (onChange)=\"handleBlurEvent($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [binary]=\"true\"\r\n [label]=\"widgetInstance.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n [binary]=\"true\"\r\n [label]=\"checkbox.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div class=\"widgetContainer\">\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n </div>\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div class=\"container material\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties?.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div class=\"widgetContainer\">\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n </div>\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key + '.data.' + question.code + '.' + option.code\r\n \"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i11.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i14.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i16.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i18.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i18.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i19.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i20.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i20.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i21.QuillEditorComponent, selector: "quill-editor" }, { kind: "component", type: i22.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "disableCookies", "showBeforeIframeApiLoads"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }, { kind: "directive", type: i23.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i24.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "component", type: i25.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i26.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i27.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i28.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "component", type: i29.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "directive", type: i30.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "component", type: i31.FloatLabel, selector: "p-floatLabel" }, { kind: "component", type: i32.Chips, selector: "p-chips", inputs: ["style", "styleClass", "disabled", "field", "placeholder", "max", "maxLength", "ariaLabel", "ariaLabelledBy", "tabindex", "inputId", "allowDuplicate", "caseSensitiveDuplication", "inputStyle", "inputStyleClass", "addOnTab", "addOnBlur", "separator", "showClear", "autofocus", "variant"], outputs: ["onAdd", "onRemove", "onFocus", "onBlur", "onChipClick", "onClear"] }, { kind: "component", type: i33.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i34.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "component", type: i35.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "component", type: i36.Editor, selector: "p-editor", inputs: ["style", "styleClass", "placeholder", "formats", "modules", "bounds", "scrollingContainer", "debug", "readonly"], outputs: ["onInit", "onTextChange", "onSelectionChange"] }, { kind: "component", type: i37.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: ["form", "widgetInstance", "onBlur", "onValueChange", "labelColor", "sophisticatedValueChange", "blurSophisticatedValueChange"], outputs: ["valueCleared"] }, { kind: "directive", type: i38.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { kind: "directive", type: i39.ComparableDropdownDirective, selector: "p-dropdown", inputs: ["compareWith"] }, { kind: "directive", type: i40.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i41.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { kind: "component", type: i42.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }, { kind: "component", type: i43.SmartFileEditorComponent, selector: "smart-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i44.SmartMultiFileEditorComponent, selector: "smart-multi-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent", "fileEvent"] }, { kind: "component", type: i45.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i46.HighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
997
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: { form: "form", widgetInstance: "widgetInstance", onBlur: "onBlur", onValueChange: "onValueChange", labelColor: "labelColor", sophisticatedValueChange: "sophisticatedValueChange", blurSophisticatedValueChange: "blurSophisticatedValueChange" }, outputs: { valueCleared: "valueCleared" }, viewQueries: [{ propertyName: "chipInputChild", first: true, predicate: ["chipInput"], descendants: true }, { propertyName: "customComponentVcRef", first: true, predicate: ["customComponent"], descendants: true, read: ViewContainerRef }, { propertyName: "quill", first: true, predicate: ["quillEditor"], descendants: true }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "sb4Textarea", first: true, predicate: ["sb4Textarea"], descendants: true }, { propertyName: "fileUploader", first: true, predicate: SmartFileEditorComponent, descendants: true }, { propertyName: "multiFileUploader", first: true, predicate: SmartMultiFileEditorComponent, descendants: true }, { propertyName: "dateInputChild", first: true, predicate: ["dateInput"], descendants: true }, { propertyName: "timeInputChild", first: true, predicate: ["timeInput"], descendants: true }, { propertyName: "childrenWidgetsQL", predicate: SmartformwidgetComponent, descendants: true }], ngImport: i0, template: "@if (compLib === componentLibrary.PRIMENG) {\n <div class=\"container prime\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer textFieldContainer\">\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\n <input\n *ngIf=\"!widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n pInputText\n formControlName=\"text\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <p-inputMask\n *ngIf=\"widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [mask]=\"widgetInstance.mask\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div class=\"textFieldButtons\">\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n >\n </smart-ui-action-toolbar>\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-inputNumber\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n inputId=\"minmax\"\n mode=\"decimal\"\n [max]=\"widgetInstance.maxValues ?? null\"\n [minFractionDigits]=\"0\"\n [maxFractionDigits]=\"5\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n </div>\n <div>\n <div class=\"widgetContent\">\n <p-editor\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [modules]=\"\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\n \"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [disabled]=\"widgetInstance.isReadonly ?? false\"\n [maxLength]=\"widgetInstance.maxLength\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\n (onTextChange)=\"handleBlurEvent($event)\"\n />\n </div>\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [showTime]=\"true\"\n [showClear]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n hourFormat=\"24\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n >\n </p-calendar>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-dropdown\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n />\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-multiSelect\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onPanelShow)=\"onDropDownShow()\"\n (onBlur)=\"safeDropDownBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onPanelHide)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\n <p-floatLabel>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n pInputTextarea\n [autoResize]=\"true\"\n cols=\"30\"\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\" \"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (ngModelChange)=\"onTextareaChange($event)\"\n ></textarea>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n [for]=\"widgetInstance.key\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-chips\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\n [max]=\"0\"\n [maxLength]=\"0\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\n </p-chips>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\n class=\"widgetContainer imageContainer\"\n >\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties!.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\n class=\"widgetContainer toggle-col\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\n {{ getWidgetLabel(widgetInstance) }}\n </label>\n <p-inputSwitch\n formControlName=\"{{ widgetInstance.key }}\"\n [(ngModel)]=\"widgetInstance.value\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\n (onChange)=\"onValueChange?.next($event)\"\n (onChange)=\"handleBlurEvent($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n [binary]=\"true\"\n [label]=\"widgetInstance.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [ngModel]=\"checkbox.value\"\n [binary]=\"true\"\n [label]=\"checkbox.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"container material\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n\n <div\n (capsLock)=\"capsOn = $event\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n\n <input\n *ngIf=\"!widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [attr.inputmode]=\"\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\n \"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n (keydown.enter)=\"onKeydown()\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n />\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\n <input\n *ngIf=\"widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (click)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\n [matAutocomplete]=\"textFieldAuto\"\n (keydown.enter)=\"onKeydown()\"\n />\n <button\n *ngIf=\"widgetInstance.isPassword\"\n mat-icon-button\n matSuffix\n (click)=\"togglePasswordVisibility($event)\"\n >\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\n </mat-option>\n </mat-autocomplete>\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\n {{ widgetInstance.capsLockWarning }}\n </span>\n\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <span matPrefix>\n <smart-icon\n *ngIf=\"capsOn && widgetInstance.isPassword\"\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\n color=\"warn\"\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n ></smart-icon>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div class=\"textFieldButtons\">\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n [color]=\"widgetInstance.textFieldButton.iconColor\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n [type]=\"'number'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [min]=\"widgetInstance.minValues ?? null\"\n [max]=\"widgetInstance.maxValues ?? null\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <span matPrefix>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\n </smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip-row\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ value }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input\n #chipInput\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n [readonly]=\"widgetInstance.isReadonly\"\n [matAutocomplete]=\"chipAuto\"\n (matChipInputTokenEnd)=\"add($event)\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n <mat-autocomplete\n #chipAuto=\"matAutocomplete\"\n (optionSelected)=\"selected($event, widgetInstance)\"\n >\n <mat-option\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let item of widgetInstance.valueList\"\n [value]=\"item.value\"\n >\n {{ item.label }}\n </mat-option>\n </mat-autocomplete>\n </mat-chip-grid>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ getChipsValue(value) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipListLookup\"\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\n [matChipInputAddOnBlur]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n </mat-chip-grid>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n cols=\"30\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n ></textarea>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n (change)=\"onValueChange?.next(widgetInstance)\"\n >\n {{ widgetInstance.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [value]=\"checkbox.value\"\n (change)=\"onValueChange?.next(checkbox)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n >\n {{ checkbox.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-radio-group\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n [attr.data-testid]=\"widgetInstance.key\"\n aria-label=\"{{ widgetInstance.label }}\"\n appearance=\"outline\"\n formControlName=\"{{ widgetInstance.key }}\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <div [ngClass]=\"getDirection()\">\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\n <img\n *ngIf=\"radio.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"radio-item-image\"\n [src]=\"radio.imageUrl\"\n />\n <mat-radio-button\n class=\"selecatbleObject\"\n value=\"{{ radio.value }}\"\n [ngClass]=\"getDirection()\"\n (change)=\"onValueChange?.next(radio.value)\"\n [disabled]=\"widgetInstance.isDisabled\"\n >\n {{ radio.label }}\n </mat-radio-button>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"datePicker widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (change)=\"handleBlurEvent(widgetInstance)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <!-- <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <mat-form-field\n class=\"input widgetContent\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"1\"\n [stepSecond]=\"10\"\n [touchUi]=\"false\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n [disableMinute]=\"false\"\n [hideTime]=\"false\"\n >\n </ngx-mat-datetime-picker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n (blur)=\"onBlur?.next(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div> -->\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"dateTimePickerContainer\">\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n #dateInput\n matInput\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (blur)=\"onDatePickerBlur($event)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"hasCreated\"\n class=\"input widgetContent time\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <input\n #timeInput\n [formControlName]=\"widgetInstance.key + '-time'\"\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\n [id]=\"widgetInstance.key\"\n [type]=\"'time'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n (blur)=\"onTimePickerBlur($event)\"\n matInput\n />\n </mat-form-field>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon>\n {{ innerOption.label }}\n </mat-option>\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n multiple\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon\n >{{ innerOption.label }}</mat-option\n >\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'time'\"\n [value]=\"getTime()\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <mat-slide-toggle\n formControlName=\"{{ widgetInstance.key }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n value=\"{{ widgetInstance.value }}\"\n (change)=\"onValueChange?.next($event)\"\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\n ><span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"smartIndicator widgetContent\">\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\n <div\n *ngFor=\"let item of indicatorItems; let i = index\"\n class=\"indicatorItem\"\n [ngClass]=\"getIndicatorItemClass(i)\"\n ></div>\n </div>\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\n {{ getIndicatorStatusLabel() }}\n </p>\n </div>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\n <div class=\"widgetContainer imageContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties?.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [(ngModel)]=\"widgetInstance.value\"\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\n <hr\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n />\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <button\n mat-button\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\n (click)=\"onButtonClicked(widgetInstance)\"\n >\n <div\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\n ></div>\n <ng-template #iconOnly>\n <smart-icon\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n <ng-template #text>\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n {{ widgetInstance.uiActionDescriptor?.title }}\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n </button>\n </div>\n </div>\n\n <div class=\"widgetContainer\">\n <h4\n class=\"labelContainer\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"widgetContent\">\n <ng-template #customComponent></ng-template>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <quill-editor\n #quillEditor\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [maxLength]=\"widgetInstance.maxLength\"\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\n ></quill-editor>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n class=\"rich-text-editor-leeway-counter\"\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\n >\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n\n <table class=\"matrixTable widgetContent\">\n <tr>\n <th></th>\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\n {{ option.displayValue }}\n </th>\n </tr>\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\n <th class=\"questionLabel\">\n <label>{{ question.displayValue }}</label>\n </th>\n\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\n <mat-radio-group\n *ngIf=\"!widgetInstance.isMultiple\"\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\n [name]=\"'q' + i\"\n >\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\n </mat-radio-group>\n <div *ngIf=\"widgetInstance.isMultiple\">\n <mat-checkbox\n [formControlName]=\"\n widgetInstance.key + '.data.' + question.code + '.' + option.code\n \"\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\n [checked]=\"true\"\n ></mat-checkbox>\n </div>\n </td>\n <br />\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\n ><smart-icon icon=\"close\"></smart-icon\n ></button>\n </tr>\n </table>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <youtube-player\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n videoId=\"{{ widgetInstance.videoId }}\"\n [width]=\"widgetInstance.width\"\n [height]=\"widgetInstance.height\"\n [startSeconds]=\"widgetInstance.startSeconds\"\n [endSeconds]=\"widgetInstance.endSeconds\"\n ></youtube-player>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <lib-smart-month-picker\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (valueChange)=\"handleYearMonthPicked($event)\"\n ></lib-smart-month-picker>\n </div>\n </div>\n}\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i9.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i9.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i9.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i10.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i10.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i11.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i11.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i11.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i12.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i13.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i14.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14.MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "directive", type: i15.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i16.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i18.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i18.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: i19.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i20.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i20.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i21.QuillEditorComponent, selector: "quill-editor" }, { kind: "component", type: i22.YouTubePlayer, selector: "youtube-player", inputs: ["videoId", "height", "width", "startSeconds", "endSeconds", "suggestedQuality", "playerVars", "disableCookies", "showBeforeIframeApiLoads"], outputs: ["ready", "stateChange", "error", "apiChange", "playbackQualityChange", "playbackRateChange"] }, { kind: "directive", type: i23.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i24.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "component", type: i25.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i26.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i27.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i28.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "component", type: i29.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "directive", type: i30.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "component", type: i31.FloatLabel, selector: "p-floatLabel" }, { kind: "component", type: i32.Chips, selector: "p-chips", inputs: ["style", "styleClass", "disabled", "field", "placeholder", "max", "maxLength", "ariaLabel", "ariaLabelledBy", "tabindex", "inputId", "allowDuplicate", "caseSensitiveDuplication", "inputStyle", "inputStyleClass", "addOnTab", "addOnBlur", "separator", "showClear", "autofocus", "variant"], outputs: ["onAdd", "onRemove", "onFocus", "onBlur", "onChipClick", "onClear"] }, { kind: "component", type: i33.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i34.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "component", type: i35.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "variant", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autofocus", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "component", type: i36.Editor, selector: "p-editor", inputs: ["style", "styleClass", "placeholder", "formats", "modules", "bounds", "scrollingContainer", "debug", "readonly"], outputs: ["onInit", "onTextChange", "onSelectionChange"] }, { kind: "component", type: i37.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: SmartformwidgetComponent, selector: "smartformwidget", inputs: ["form", "widgetInstance", "onBlur", "onValueChange", "labelColor", "sophisticatedValueChange", "blurSophisticatedValueChange"], outputs: ["valueCleared"] }, { kind: "directive", type: i38.TrackCapsDirective, selector: "[capsLock]", outputs: ["capsLock"] }, { kind: "directive", type: i39.ComparableDropdownDirective, selector: "p-dropdown", inputs: ["compareWith"] }, { kind: "directive", type: i40.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i41.SortableWidgetComponent, selector: "lib-sortable-widget", inputs: ["widgetInstance"] }, { kind: "component", type: i42.SmartMonthPickerComponent, selector: "lib-smart-month-picker", inputs: ["widgetInstance"], outputs: ["valueChange"] }, { kind: "component", type: i43.SmartFileEditorComponent, selector: "smart-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent"] }, { kind: "component", type: i44.SmartMultiFileEditorComponent, selector: "smart-multi-file-editor", inputs: ["widgetInstance"], outputs: ["uploadFilesEvent", "fileEvent"] }, { kind: "component", type: i45.UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i46.HighlightPipe, name: "highlight" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
998
998
  }
999
999
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartformwidgetComponent, decorators: [{
1000
1000
  type: Component,
1001
- args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (compLib === componentLibrary.PRIMENG) {\r\n <div class=\"container prime\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer textFieldContainer\">\r\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\r\n <input\r\n *ngIf=\"!widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n pInputText\r\n formControlName=\"text\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <p-inputMask\r\n *ngIf=\"widgetInstance.mask\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [mask]=\"widgetInstance.mask\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div class=\"textFieldButtons\">\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n >\r\n </smart-ui-action-toolbar>\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-inputNumber\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n inputId=\"minmax\"\r\n mode=\"decimal\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n [minFractionDigits]=\"0\"\r\n [maxFractionDigits]=\"5\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n </div>\r\n <div>\r\n <div class=\"widgetContent\">\r\n <p-editor\r\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [modules]=\"\r\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\r\n \"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [disabled]=\"widgetInstance.isReadonly ?? false\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\r\n (onTextChange)=\"handleBlurEvent($event)\"\r\n />\r\n </div>\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-calendar\r\n [formControlName]=\"widgetInstance.key\"\r\n [iconDisplay]=\"'input'\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"true\"\r\n [showClear]=\"true\"\r\n [minDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\r\n \"\r\n [maxDate]=\"\r\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\r\n \"\r\n hourFormat=\"24\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onShow)=\"onCalendarShow()\"\r\n (onInput)=\"onCalendarInput()\"\r\n (onBlur)=\"safeCalendarBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onClose)=\"handleBlurEvent($event)\"\r\n dateFormat=\"yy-mm-dd\"\r\n appendTo=\"body\"\r\n >\r\n </p-calendar>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance?.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-dropdown\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [filter]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n />\r\n <span class=\"prime-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-multiSelect\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [options]=\"getOptions(widgetInstance.valueList)\"\r\n [checkmark]=\"true\"\r\n [showClear]=\"true\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onPanelShow)=\"onDropDownShow()\"\r\n (onBlur)=\"safeDropDownBlur($event)\"\r\n (onClear)=\"handleBlurEvent($event)\"\r\n (onPanelHide)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n appendTo=\"body\"\r\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\r\n />\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\r\n <p-floatLabel>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n pInputTextarea\r\n [autoResize]=\"true\"\r\n cols=\"30\"\r\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\" \"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (ngModelChange)=\"onTextareaChange($event)\"\r\n ></textarea>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n [for]=\"widgetInstance.key\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <p-messages\r\n class=\"floating-error\"\r\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\r\n [value]=\"errorMessages\"\r\n [closable]=\"true\"\r\n ></p-messages>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </div>\r\n <div class=\"widgetItemContainer\">\r\n <p-floatLabel>\r\n <p-chips\r\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\r\n [max]=\"0\"\r\n [maxLength]=\"0\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (onBlur)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n >\r\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\r\n </p-chips>\r\n <label\r\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}</label\r\n >\r\n </p-floatLabel>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <div class=\"widgetItemContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\r\n class=\"widgetContainer imageContainer\"\r\n >\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties!.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\r\n class=\"widgetContainer toggle-col\"\r\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\r\n >\r\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </label>\r\n <p-inputSwitch\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\r\n (onChange)=\"onValueChange?.next($event)\"\r\n (onChange)=\"handleBlurEvent($event)\"\r\n />\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [binary]=\"true\"\r\n [label]=\"widgetInstance.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n (click)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <p-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [ngModel]=\"checkbox.value\"\r\n [binary]=\"true\"\r\n [label]=\"checkbox.label\"\r\n />\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.hint\"\r\n class=\"p-inputgroup-addon\"\r\n (mouseenter)=\"op.toggle($event)\"\r\n (mouseleave)=\"op.toggle($event)\"\r\n >\r\n <i class=\"pi pi-info-circle\"></i>\r\n </div>\r\n <p-overlayPanel #op>\r\n <div\r\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\r\n [innerHTML]=\"widgetInstance.hint?.text\"\r\n >\r\n </div>\r\n <ng-template #plainText>\r\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div class=\"widgetContainer\">\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n </div>\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n} @else {\r\n <div class=\"container material\" [formGroup]=\"form\">\r\n <div\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n class=\"container\"\r\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\r\n >\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getDirection()\"\r\n >\r\n <smartformwidget\r\n *ngFor=\"let widget of widgetInstance.valueList\"\r\n [form]=\"form\"\r\n [widgetInstance]=\"widget\"\r\n class=\"container-item\"\r\n [ngClass]=\"widget.cssClass ?? ''\"\r\n [onBlur]=\"onBlur\"\r\n [onValueChange]=\"onValueChange\"\r\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\r\n class=\"{{ widget.key }}\"\r\n [labelColor]=\"labelColor\"\r\n ></smartformwidget>\r\n </div>\r\n\r\n <div\r\n (capsLock)=\"capsOn = $event\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n\r\n <input\r\n *ngIf=\"!widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [attr.inputmode]=\"\r\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\r\n \"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\r\n (keydown.enter)=\"onKeydown()\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n />\r\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\r\n <input\r\n *ngIf=\"widgetInstance.selection\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n (click)=\"onValueChange?.next($event)\"\r\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\r\n [matAutocomplete]=\"textFieldAuto\"\r\n (keydown.enter)=\"onKeydown()\"\r\n />\r\n <button\r\n *ngIf=\"widgetInstance.isPassword\"\r\n mat-icon-button\r\n matSuffix\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\r\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\r\n </mat-option>\r\n </mat-autocomplete>\r\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\r\n {{ widgetInstance.capsLockWarning }}\r\n </span>\r\n\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n\r\n <span matPrefix>\r\n <smart-icon\r\n *ngIf=\"capsOn && widgetInstance.isPassword\"\r\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\r\n color=\"warn\"\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n ></smart-icon>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.icon &&\r\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\r\n \"\r\n [icon]=\"widgetInstance.icon\"\r\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\r\n matSuffix\r\n ></smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <div class=\"textFieldButtons\">\r\n @if (widgetInstance.textFieldProperties?.clearable) {\r\n <ui-action-button\r\n class=\"clearButton\"\r\n [addBasicClasses]=\"false\"\r\n [descriptor]=\"clearButtonDescriptor\"\r\n (actionClick)=\"clearField(widgetInstance.key)\"\r\n />\r\n }\r\n </div>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n class=\"textFieldToolbar\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n [color]=\"widgetInstance.textFieldButton.iconColor\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [type]=\"'number'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [min]=\"widgetInstance.minValues ?? null\"\r\n [max]=\"widgetInstance.maxValues ?? null\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <span matPrefix>\r\n {{ widgetInstance.prefix }}\r\n </span>\r\n <span matSuffix>\r\n {{ widgetInstance.suffix }}\r\n </span>\r\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\r\n </smart-icon>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <button\r\n *ngIf=\"widgetInstance.textFieldButton\"\r\n matSuffix\r\n mat-button\r\n color=\"{{ widgetInstance.textFieldButton.color }}\"\r\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\r\n >\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n {{ widgetInstance.textFieldButton.label }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.textFieldButton.iconPosition ===\r\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\r\n \"\r\n [icon]=\"widgetInstance.textFieldButton.icon\"\r\n >\r\n </smart-icon>\r\n </button>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip-row\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ value }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n <input\r\n #chipInput\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"addOnBlur\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n [matAutocomplete]=\"chipAuto\"\r\n (matChipInputTokenEnd)=\"add($event)\"\r\n (change)=\"handleBlurEvent($event)\"\r\n (input)=\"onValueChange?.next($event)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n <mat-autocomplete\r\n #chipAuto=\"matAutocomplete\"\r\n (optionSelected)=\"selected($event, widgetInstance)\"\r\n >\r\n <mat-option\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let item of widgetInstance.valueList\"\r\n [value]=\"item.value\"\r\n >\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-chip-grid>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\r\n <mat-chip\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n *ngFor=\"let value of widgetInstance.value\"\r\n (removed)=\"remove(value)\"\r\n >\r\n {{ getChipsValue(value) }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip>\r\n <input\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matChipInputFor]=\"chipListLookup\"\r\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\r\n [matChipInputAddOnBlur]=\"false\"\r\n [readonly]=\"true\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n />\r\n </mat-chip-grid>\r\n <smart-ui-action-toolbar\r\n #toolbar\r\n *ngIf=\"isToolbarPresent()\"\r\n matSuffix\r\n [id]=\"widgetInstance.toolbarId\"\r\n ></smart-ui-action-toolbar>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <textarea\r\n class=\"sb4-textarea\"\r\n #sb4Textarea\r\n cols=\"30\"\r\n cdkTextareaAutosize\r\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\r\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'string'\"\r\n [value]=\"widgetInstance.value\"\r\n [readonly]=\"widgetInstance.isReadonly\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent($event)\"\r\n maxlength=\"{{ widgetInstance.maxLength }}\"\r\n ></textarea>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n >{{\r\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\r\n }}</mat-hint\r\n >\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div class=\"checkbox-item-container\">\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n (change)=\"onValueChange?.next(widgetInstance)\"\r\n >\r\n {{ widgetInstance.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\r\n <div\r\n class=\"checkbox-item-container\"\r\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\r\n >\r\n <img\r\n *ngIf=\"checkbox.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"checkbox-item-image\"\r\n [src]=\"checkbox.imageUrl\"\r\n />\r\n <mat-checkbox\r\n class=\"selecatbleObject\"\r\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\r\n [value]=\"checkbox.value\"\r\n (change)=\"onValueChange?.next(checkbox)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n >\r\n {{ checkbox.label }}\r\n </mat-checkbox>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-radio-group\r\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n aria-label=\"{{ widgetInstance.label }}\"\r\n appearance=\"outline\"\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n >\r\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <div [ngClass]=\"getDirection()\">\r\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\r\n <img\r\n *ngIf=\"radio.imageUrl\"\r\n title=\"{{ widgetInstance.key }}\"\r\n class=\"radio-item-image\"\r\n [src]=\"radio.imageUrl\"\r\n />\r\n <mat-radio-button\r\n class=\"selecatbleObject\"\r\n value=\"{{ radio.value }}\"\r\n [ngClass]=\"getDirection()\"\r\n (change)=\"onValueChange?.next(radio.value)\"\r\n [disabled]=\"widgetInstance.isDisabled\"\r\n >\r\n {{ radio.label }}\r\n </mat-radio-button>\r\n </div>\r\n <div class=\"radio-error\">\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\r\n class=\"datePicker widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\r\n <ngx-mat-datetime-picker\r\n #picker\r\n [showSpinners]=\"true\"\r\n [showSeconds]=\"false\"\r\n [stepHour]=\"1\"\r\n [stepMinute]=\"1\"\r\n [stepSecond]=\"10\"\r\n [touchUi]=\"false\"\r\n [color]=\"'primary'\"\r\n [enableMeridian]=\"false\"\r\n [disableMinute]=\"false\"\r\n [hideTime]=\"false\"\r\n >\r\n </ngx-mat-datetime-picker>\r\n <input\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [ngxMatDatetimePicker]=\"picker\"\r\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n (blur)=\"onBlur?.next(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n </div> -->\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"dateTimePickerContainer\">\r\n <mat-form-field\r\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\r\n <input\r\n #dateInput\r\n matInput\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\r\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\r\n [id]=\"widgetInstance.key\"\r\n [value]=\"widgetInstance.value\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n [matDatepicker]=\"picker\"\r\n (blur)=\"onDatePickerBlur($event)\"\r\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\r\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\r\n />\r\n\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n <mat-hint>\r\n {{ widgetInstance.dateFormatHint }}\r\n </mat-hint>\r\n </mat-form-field>\r\n <mat-form-field\r\n *ngIf=\"hasCreated\"\r\n class=\"input widgetContent time\"\r\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n appearance=\"outline\"\r\n >\r\n <input\r\n #timeInput\r\n [formControlName]=\"widgetInstance.key + '-time'\"\r\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\r\n [id]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n (blur)=\"onTimePickerBlur($event)\"\r\n matInput\r\n />\r\n </mat-form-field>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon>\r\n {{ innerOption.label }}\r\n </mat-option>\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\r\n class=\"widgetContainer\"\r\n >\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <mat-select\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n multiple\r\n (selectionChange)=\"onValueChange?.next($event.value)\"\r\n (closed)=\"handleBlurEvent(widgetInstance)\"\r\n [disabled]=\"widgetInstance.isDisabled!\"\r\n [compareWith]=\"\r\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\r\n \"\r\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\r\n >\r\n <div *ngFor=\"let option of widgetInstance.valueList\">\r\n <mat-optgroup\r\n *ngIf=\"option.type === getType().ITEM_GROUP\"\r\n [label]=\"option.label\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <mat-option\r\n *ngFor=\"let innerOption of option.valueList\"\r\n [value]=\"innerOption.value\"\r\n [disabled]=\"innerOption.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"innerOption.icon\"\r\n [icon]=\"innerOption.icon\"\r\n [color]=\"innerOption.iconColor\"\r\n ></smart-icon\r\n >{{ innerOption.label }}</mat-option\r\n >\r\n </mat-optgroup>\r\n <mat-option\r\n *ngIf=\"option.type === getType().ITEM\"\r\n [value]=\"option.value\"\r\n [disabled]=\"option.isDisabled\"\r\n >\r\n <smart-icon\r\n *ngIf=\"option.icon\"\r\n [icon]=\"option.icon\"\r\n [color]=\"option.iconColor\"\r\n ></smart-icon\r\n >{{ option.label }}</mat-option\r\n >\r\n </div>\r\n </mat-select>\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n\r\n <div\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\r\n class=\"label widgetContainer\"\r\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\r\n >\r\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n @if (widgetInstance.widgetDescription) {\r\n <p>{{ widgetInstance.widgetDescription }}</p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <mat-form-field\r\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n appearance=\"outline\"\r\n >\r\n <mat-label\r\n class=\"label\"\r\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\r\n *ngIf=\"!widgetInstance.showLabel\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </mat-label>\r\n <input\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [type]=\"'time'\"\r\n [value]=\"getTime()\"\r\n placeholder=\"{{ widgetInstance.placeholder }}\"\r\n matInput\r\n (change)=\"handleBlurEvent(widgetInstance)\"\r\n />\r\n <span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n matSuffix\r\n ></smart-icon>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4\r\n class=\"{{ labelColor }} smart-form-widget-label {{\r\n widgetInstance.cssLabelClass ?? ''\r\n }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <mat-slide-toggle\r\n formControlName=\"{{ widgetInstance.key }}\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n value=\"{{ widgetInstance.value }}\"\r\n (change)=\"onValueChange?.next($event)\"\r\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\r\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\r\n ><span class=\"mat-error\">\r\n {{ widgetInstance.error }}\r\n </span>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\r\n [icon]=\"widgetInstance.errorIcon\"\r\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\r\n ></smart-icon>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"smartIndicator widgetContent\">\r\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\r\n <div\r\n *ngFor=\"let item of indicatorItems; let i = index\"\r\n class=\"indicatorItem\"\r\n [ngClass]=\"getIndicatorItemClass(i)\"\r\n ></div>\r\n </div>\r\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\r\n {{ getIndicatorStatusLabel() }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\r\n <div class=\"widgetContainer\">\r\n <smart-multi-file-editor\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (uploadFilesEvent)=\"upload($event)\"\r\n (fileEvent)=\"executeUiAction($event.uiAction)\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\r\n <div class=\"widgetContainer imageContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n\r\n @if (widgetInstance.imageProperties?.image) {\r\n <smart-icon\r\n [imageResource]=\"widgetInstance.imageProperties?.image\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n } @else if (widgetInstance.value) {\r\n <smart-icon\r\n [(ngModel)]=\"widgetInstance.value\"\r\n [imageResource]=\"widgetInstance.value\"\r\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\r\n alt=\"Image\"\r\n title=\"{{ widgetInstance.key }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></smart-icon>\r\n }\r\n </div>\r\n }\r\n\r\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\r\n <div class=\"widgetContainer\">\r\n <div\r\n class=\"smartDiv\"\r\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n </div>\r\n </div>\r\n }\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n ></div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\r\n <hr\r\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n />\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div\r\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n >\r\n <button\r\n mat-button\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\r\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\r\n (click)=\"onButtonClicked(widgetInstance)\"\r\n >\r\n <div\r\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\r\n ></div>\r\n <ng-template #iconOnly>\r\n <smart-icon\r\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n <ng-template #text>\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n {{ widgetInstance.uiActionDescriptor?.title }}\r\n <smart-icon\r\n *ngIf=\"\r\n widgetInstance.uiActionDescriptor?.icon &&\r\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\r\n \"\r\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\r\n [color]=\"\r\n widgetInstance.uiActionDescriptor?.iconColor ??\r\n widgetInstance.uiActionDescriptor?.color\r\n \"\r\n ></smart-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"widgetContainer\">\r\n <h4\r\n class=\"labelContainer\"\r\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\r\n class=\"{{ labelColor }}\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <div class=\"widgetContent\">\r\n <ng-template #customComponent></ng-template>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <quill-editor\r\n #quillEditor\r\n [formControlName]=\"widgetInstance.key\"\r\n [id]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\r\n [placeholder]=\"widgetInstance.placeholder\"\r\n [readOnly]=\"widgetInstance.isReadonly\"\r\n [maxLength]=\"widgetInstance.maxLength\"\r\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\r\n ></quill-editor>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint ||\r\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n <mat-hint\r\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\r\n matSuffix\r\n align=\"end\"\r\n class=\"rich-text-editor-leeway-counter\"\r\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\r\n >\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <div class=\"widgetContent\">\r\n <lib-sortable-widget\r\n [formControlName]=\"widgetInstance.key\"\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n ></lib-sortable-widget>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n\r\n <table class=\"matrixTable widgetContent\">\r\n <tr>\r\n <th></th>\r\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\r\n {{ option.displayValue }}\r\n </th>\r\n </tr>\r\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\r\n <th class=\"questionLabel\">\r\n <label>{{ question.displayValue }}</label>\r\n </th>\r\n\r\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\r\n <mat-radio-group\r\n *ngIf=\"!widgetInstance.isMultiple\"\r\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\r\n [name]=\"'q' + i\"\r\n >\r\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\r\n </mat-radio-group>\r\n <div *ngIf=\"widgetInstance.isMultiple\">\r\n <mat-checkbox\r\n [formControlName]=\"\r\n widgetInstance.key + '.data.' + question.code + '.' + option.code\r\n \"\r\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\r\n [checked]=\"true\"\r\n ></mat-checkbox>\r\n </div>\r\n </td>\r\n <br />\r\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\r\n ><smart-icon icon=\"close\"></smart-icon\r\n ></button>\r\n </tr>\r\n </table>\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\">\r\n <h4\r\n *ngIf=\"widgetInstance.showLabel\"\r\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\r\n [ngClass]=\"getLabelNgClass()\"\r\n [ngStyle]=\"getLabelStyle()\"\r\n >\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <youtube-player\r\n [ngClass]=\"getNgClass()\"\r\n [ngStyle]=\"getStyle()\"\r\n videoId=\"{{ widgetInstance.videoId }}\"\r\n [width]=\"widgetInstance.width\"\r\n [height]=\"widgetInstance.height\"\r\n [startSeconds]=\"widgetInstance.startSeconds\"\r\n [endSeconds]=\"widgetInstance.endSeconds\"\r\n ></youtube-player>\r\n <mat-hint\r\n *ngIf=\"\r\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\r\n \"\r\n >{{ widgetInstance.hint?.text }}</mat-hint\r\n >\r\n </div>\r\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\r\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\r\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\r\n {{ getWidgetLabel(widgetInstance) }}\r\n </h4>\r\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\r\n widgetInstance.hint?.text\r\n }}</mat-hint>\r\n </div>\r\n <lib-smart-month-picker\r\n [attr.data-testid]=\"widgetInstance.key\"\r\n [widgetInstance]=\"widgetInstance\"\r\n (valueChange)=\"handleYearMonthPicked($event)\"\r\n ></lib-smart-month-picker>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"] }]
1001
+ args: [{ selector: 'smartformwidget', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (compLib === componentLibrary.PRIMENG) {\n <div class=\"container prime\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n [blurSophisticatedValueChange]=\"blurSophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer textFieldContainer\">\n <p-floatLabel [ngClass]=\"{ hasToolbar: isToolbarPresent() }\">\n <input\n *ngIf=\"!widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n pInputText\n formControlName=\"text\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <p-inputMask\n *ngIf=\"widgetInstance.mask\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [mask]=\"widgetInstance.mask\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div class=\"textFieldButtons\">\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n >\n </smart-ui-action-toolbar>\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length != 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-inputNumber\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n inputId=\"minmax\"\n mode=\"decimal\"\n [max]=\"widgetInstance.maxValues ?? null\"\n [minFractionDigits]=\"0\"\n [maxFractionDigits]=\"5\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <div *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n </div>\n <div>\n <div class=\"widgetContent\">\n <p-editor\n [ngClass]=\"widgetInstance.isReadonly == true ? 'disabledEditor' : ''\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [modules]=\"\n widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\n \"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [disabled]=\"widgetInstance.isReadonly ?? false\"\n [maxLength]=\"widgetInstance.maxLength\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onTextChange)=\"onPrimeRichTextEditorContentChanged($event)\"\n (onTextChange)=\"handleBlurEvent($event)\"\n />\n </div>\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-calendar\n [formControlName]=\"widgetInstance.key\"\n [iconDisplay]=\"'input'\"\n [showIcon]=\"true\"\n [showTime]=\"true\"\n [showClear]=\"true\"\n [minDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\n \"\n [maxDate]=\"\n convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\n \"\n hourFormat=\"24\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onShow)=\"onCalendarShow()\"\n (onInput)=\"onCalendarInput()\"\n (onBlur)=\"safeCalendarBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onClose)=\"handleBlurEvent($event)\"\n dateFormat=\"yy-mm-dd\"\n appendTo=\"body\"\n >\n </p-calendar>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance?.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-dropdown\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n />\n <span class=\"prime-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-multiSelect\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n [options]=\"getOptions(widgetInstance.valueList)\"\n [checkmark]=\"true\"\n [showClear]=\"true\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onPanelShow)=\"onDropDownShow()\"\n (onBlur)=\"safeDropDownBlur($event)\"\n (onClear)=\"handleBlurEvent($event)\"\n (onPanelHide)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n appendTo=\"body\"\n selectedItemsLabel=\"{0} elem kiv\u00E1lasztva\"\n />\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\" [ngClass]=\"getNgClass()\" [ngStyle]=\"getStyle()\">\n <p-floatLabel>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n pInputTextarea\n [autoResize]=\"true\"\n cols=\"30\"\n [rows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\" \"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (ngModelChange)=\"onTextareaChange($event)\"\n ></textarea>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n [for]=\"widgetInstance.key\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <p-messages\n class=\"floating-error\"\n *ngIf=\"errorMessages && errorMessages.length && errorMessages.length > 0\"\n [value]=\"errorMessages\"\n [closable]=\"true\"\n ></p-messages>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <div\n *ngIf=\"widgetInstance.showLabel && !widgetInstance.isFloatLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </div>\n <div class=\"widgetItemContainer\">\n <p-floatLabel>\n <p-chips\n [disabled]=\"widgetInstance.isDisabled ? widgetInstance.isDisabled : false\"\n [max]=\"0\"\n [maxLength]=\"0\"\n [formControlName]=\"widgetInstance.key\"\n [(ngModel)]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n (onBlur)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n >\n <ng-template let-item pTemplate=\"item\"> {{ getChipsValue(item) }} </ng-template>\n </p-chips>\n <label\n *ngIf=\"widgetInstance.showLabel && widgetInstance.isFloatLabel\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n >\n {{ getWidgetLabel(widgetInstance) }}</label\n >\n </p-floatLabel>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <div class=\"widgetItemContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n }\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.IMAGE\"\n class=\"widgetContainer imageContainer\"\n >\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties!.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\"\n class=\"widgetContainer toggle-col\"\n [ngClass]=\"widgetInstance.labelPositionClass ?? ''\"\n >\n <label [ngClass]=\"widgetInstance.cssLabelClass ?? ''\" [for]=\"widgetInstance.key\">\n {{ getWidgetLabel(widgetInstance) }}\n </label>\n <p-inputSwitch\n formControlName=\"{{ widgetInstance.key }}\"\n [(ngModel)]=\"widgetInstance.value\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n name=\"{{ getWidgetLabel(widgetInstance) }}\"\n (onChange)=\"onValueChange?.next($event)\"\n (onChange)=\"handleBlurEvent($event)\"\n />\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n [binary]=\"true\"\n [label]=\"widgetInstance.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n (click)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <p-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [ngModel]=\"checkbox.value\"\n [binary]=\"true\"\n [label]=\"checkbox.label\"\n />\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n <div\n *ngIf=\"widgetInstance.hint\"\n class=\"p-inputgroup-addon\"\n (mouseenter)=\"op.toggle($event)\"\n (mouseleave)=\"op.toggle($event)\"\n >\n <i class=\"pi pi-info-circle\"></i>\n </div>\n <p-overlayPanel #op>\n <div\n *ngIf=\"isHtml(widgetInstance.hint?.text ?? ''); else plainText\"\n [innerHTML]=\"widgetInstance.hint?.text\"\n >\n </div>\n <ng-template #plainText>\n <div style=\"white-space: pre-wrap\">{{ widgetInstance.hint?.text }}</div>\n </ng-template>\n </p-overlayPanel>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n </div>\n </div>\n} @else {\n <div class=\"container material\" [formGroup]=\"form\">\n <div\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n class=\"container\"\n *ngIf=\"widgetInstance.isVisible === undefined ? true : widgetInstance.isVisible\"\n >\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CONTAINER\"\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getDirection()\"\n >\n <smartformwidget\n *ngFor=\"let widget of widgetInstance.valueList\"\n [form]=\"form\"\n [widgetInstance]=\"widget\"\n class=\"container-item\"\n [ngClass]=\"widget.cssClass ?? ''\"\n [onBlur]=\"onBlur\"\n [onValueChange]=\"onValueChange\"\n [sophisticatedValueChange]=\"sophisticatedValueChange\"\n class=\"{{ widget.key }}\"\n [labelColor]=\"labelColor\"\n ></smartformwidget>\n </div>\n\n <div\n (capsLock)=\"capsOn = $event\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n\n <input\n *ngIf=\"!widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [attr.inputmode]=\"\n widgetInstance.inputMode ? widgetInstance.inputMode.toLocaleLowerCase() : 'text'\n \"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? (hidePassword ? 'password' : 'text') : '' }}\"\n (keydown.enter)=\"onKeydown()\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n />\n <!-- [mask]=\"widgetInstance.mask ?? ''\" -->\n <input\n *ngIf=\"widgetInstance.selection\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n (click)=\"onValueChange?.next($event)\"\n type=\"{{ widgetInstance.isPassword ? 'password' : '' }}\"\n [matAutocomplete]=\"textFieldAuto\"\n (keydown.enter)=\"onKeydown()\"\n />\n <button\n *ngIf=\"widgetInstance.isPassword\"\n mat-icon-button\n matSuffix\n (click)=\"togglePasswordVisibility($event)\"\n >\n <mat-icon>{{ hidePassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-autocomplete #textFieldAuto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of filteredOptions | async\" [value]=\"option.label\">\n <span [innerHTML]=\"option.label | highlight: toHighlight\"></span>\n </mat-option>\n </mat-autocomplete>\n <span class=\"mat-error\" *ngIf=\"capsOn && widgetInstance.isPassword\">\n {{ widgetInstance.capsLockWarning }}\n </span>\n\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n\n <span matPrefix>\n <smart-icon\n *ngIf=\"capsOn && widgetInstance.isPassword\"\n [icon]=\"widgetInstance.capsLockWarningIcon ?? 'keyboard_capslock'\"\n color=\"warn\"\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.icon && widgetInstance.iconPosition === 'PRE'\"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n ></smart-icon>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon\n *ngIf=\"\n widgetInstance.icon &&\n (!widgetInstance.iconPosition || widgetInstance.iconPosition === 'POST')\n \"\n [icon]=\"widgetInstance.icon\"\n [color]=\"widgetInstance.iconColor ?? 'primary'\"\n matSuffix\n ></smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <div class=\"textFieldButtons\">\n @if (widgetInstance.textFieldProperties?.clearable) {\n <ui-action-button\n class=\"clearButton\"\n [addBasicClasses]=\"false\"\n [descriptor]=\"clearButtonDescriptor\"\n (actionClick)=\"clearField(widgetInstance.key)\"\n />\n }\n </div>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n class=\"textFieldToolbar\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n [color]=\"widgetInstance.textFieldButton.iconColor\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_NUMBER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input textField widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n [type]=\"'number'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [min]=\"widgetInstance.minValues ?? null\"\n [max]=\"widgetInstance.maxValues ?? null\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <span matPrefix>\n {{ widgetInstance.prefix }}\n </span>\n <span matSuffix>\n {{ widgetInstance.suffix }}\n </span>\n <smart-icon *ngIf=\"widgetInstance.icon\" [icon]=\"widgetInstance.icon\" matSuffix>\n </smart-icon>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <button\n *ngIf=\"widgetInstance.textFieldButton\"\n matSuffix\n mat-button\n color=\"{{ widgetInstance.textFieldButton.color }}\"\n (click)=\"widgetInstance.textFieldButton.callback(widgetInstance)\"\n >\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().PRE && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n {{ widgetInstance.textFieldButton.label }}\n <smart-icon\n *ngIf=\"\n widgetInstance.textFieldButton.iconPosition ===\n smartFormTextFieldButtonIconPosition().POST && widgetInstance.textFieldButton.icon\n \"\n [icon]=\"widgetInstance.textFieldButton.icon\"\n >\n </smart-icon>\n </button>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_CHIPS\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipList aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip-row\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ value }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip-row>\n <input\n #chipInput\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipList\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n [readonly]=\"widgetInstance.isReadonly\"\n [matAutocomplete]=\"chipAuto\"\n (matChipInputTokenEnd)=\"add($event)\"\n (change)=\"handleBlurEvent($event)\"\n (input)=\"onValueChange?.next($event)\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n <mat-autocomplete\n #chipAuto=\"matAutocomplete\"\n (optionSelected)=\"selected($event, widgetInstance)\"\n >\n <mat-option\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let item of widgetInstance.valueList\"\n [value]=\"item.value\"\n >\n {{ item.label }}\n </mat-option>\n </mat-autocomplete>\n </mat-chip-grid>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_FIELD_LOOKUP\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-chip-grid #chipListLookup aria-label=\"{{ widgetInstance.label }}\">\n <mat-chip\n [disabled]=\"widgetInstance.isDisabled\"\n *ngFor=\"let value of widgetInstance.value\"\n (removed)=\"remove(value)\"\n >\n {{ getChipsValue(value) }}\n <button matChipRemove>\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input\n [attr.data-testid]=\"widgetInstance.key\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matChipInputFor]=\"chipListLookup\"\n [matChipInputSeparatorKeyCodes]=\"emptySeparatorKeysCodes\"\n [matChipInputAddOnBlur]=\"false\"\n [readonly]=\"true\"\n [disabled]=\"widgetInstance.isDisabled\"\n />\n </mat-chip-grid>\n <smart-ui-action-toolbar\n #toolbar\n *ngIf=\"isToolbarPresent()\"\n matSuffix\n [id]=\"widgetInstance.toolbarId\"\n ></smart-ui-action-toolbar>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TEXT_BOX\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <textarea\n class=\"sb4-textarea\"\n #sb4Textarea\n cols=\"30\"\n cdkTextareaAutosize\n [cdkAutosizeMinRows]=\"widgetInstance.textBoxProperties?.minRows ?? 1\"\n [cdkAutosizeMaxRows]=\"widgetInstance.textBoxProperties?.maxRows ?? undefined\"\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'string'\"\n [value]=\"widgetInstance.value\"\n [readonly]=\"widgetInstance.isReadonly\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent($event)\"\n maxlength=\"{{ widgetInstance.maxLength }}\"\n ></textarea>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n >{{\n widgetInstance.maxLength - form.controls[widgetInstance.key].value.length\n }}</mat-hint\n >\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance.hint || widgetInstance.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div class=\"checkbox-item-container\">\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key }}\"\n (change)=\"onValueChange?.next(widgetInstance)\"\n >\n {{ widgetInstance.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.CHECK_BOX_2\"\n [attr.data-testid]=\"widgetInstance.key\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"input checkbox widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <section class=\"checkbox-section\" [ngClass]=\"getDirection()\">\n <div\n class=\"checkbox-item-container\"\n *ngFor=\"let checkbox of widgetInstance.valueList; let i = index\"\n >\n <img\n *ngIf=\"checkbox.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"checkbox-item-image\"\n [src]=\"checkbox.imageUrl\"\n />\n <mat-checkbox\n class=\"selecatbleObject\"\n formControlName=\"{{ widgetInstance.key + '.' + checkbox.key }}\"\n [value]=\"checkbox.value\"\n (change)=\"onValueChange?.next(checkbox)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n >\n {{ checkbox.label }}\n </mat-checkbox>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </section>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RADIO_BUTTON\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-radio-group\n class=\"input radio-section widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n [attr.data-testid]=\"widgetInstance.key\"\n aria-label=\"{{ widgetInstance.label }}\"\n appearance=\"outline\"\n formControlName=\"{{ widgetInstance.key }}\"\n >\n <mat-label class=\"radioLabel\" *ngIf=\"!widgetInstance.showLabel\">\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <div [ngClass]=\"getDirection()\">\n <div class=\"radio-item-container\" *ngFor=\"let radio of widgetInstance.valueList\">\n <img\n *ngIf=\"radio.imageUrl\"\n title=\"{{ widgetInstance.key }}\"\n class=\"radio-item-image\"\n [src]=\"radio.imageUrl\"\n />\n <mat-radio-button\n class=\"selecatbleObject\"\n value=\"{{ radio.value }}\"\n [ngClass]=\"getDirection()\"\n (change)=\"onValueChange?.next(radio.value)\"\n [disabled]=\"widgetInstance.isDisabled\"\n >\n {{ radio.label }}\n </mat-radio-button>\n </div>\n <div class=\"radio-error\">\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n </mat-radio-group>\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_PICKER\"\n class=\"datePicker widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (change)=\"handleBlurEvent(widgetInstance)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div>\n\n <!-- <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n </div>\n <mat-form-field\n class=\"input widgetContent\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker\n #picker\n [showSpinners]=\"true\"\n [showSeconds]=\"false\"\n [stepHour]=\"1\"\n [stepMinute]=\"1\"\n [stepSecond]=\"10\"\n [touchUi]=\"false\"\n [color]=\"'primary'\"\n [enableMeridian]=\"false\"\n [disableMinute]=\"false\"\n [hideTime]=\"false\"\n >\n </ngx-mat-datetime-picker>\n <input\n matInput\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [ngxMatDatetimePicker]=\"picker\"\n [ngxMatDatetimePickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n (blur)=\"onBlur?.next(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n </div> -->\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.DATE_TIME_PICKER\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"dateTimePickerContainer\">\n <mat-form-field\n class=\"input widgetContent date {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker (closed)=\"handleBlurEvent(widgetInstance)\"></mat-datepicker>\n <input\n #dateInput\n matInput\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [min]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.minDate ?? null)\"\n [max]=\"convertToLocalDateTime(widgetInstance.dateFieldProperties?.maxDate ?? null)\"\n [id]=\"widgetInstance.key\"\n [value]=\"widgetInstance.value\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n [matDatepicker]=\"picker\"\n (blur)=\"onDatePickerBlur($event)\"\n (dateChange)=\"onValueChange?.next(widgetInstance)\"\n [matDatepickerFilter]=\"widgetInstance.filter ?? dateFilter\"\n />\n\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n <mat-hint>\n {{ widgetInstance.dateFormatHint }}\n </mat-hint>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"hasCreated\"\n class=\"input widgetContent time\"\n [ngClass]=\"widgetInstance.cssClass ?? ''\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n appearance=\"outline\"\n >\n <input\n #timeInput\n [formControlName]=\"widgetInstance.key + '-time'\"\n [attr.data-testid]=\"widgetInstance.key + '-time'\"\n [id]=\"widgetInstance.key\"\n [type]=\"'time'\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n (blur)=\"onTimePickerBlur($event)\"\n matInput\n />\n </mat-form-field>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon>\n {{ innerOption.label }}\n </mat-option>\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.SELECT_MULTIPLE\"\n class=\"widgetContainer\"\n >\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <mat-select\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n multiple\n (selectionChange)=\"onValueChange?.next($event.value)\"\n (closed)=\"handleBlurEvent(widgetInstance)\"\n [disabled]=\"widgetInstance.isDisabled!\"\n [compareWith]=\"\n widgetInstance.compareWith == null ? compareItems : widgetInstance.compareWith\n \"\n placeholder=\"{{ widgetInstance.placeholder ? widgetInstance.placeholder : '' }}\"\n >\n <div *ngFor=\"let option of widgetInstance.valueList\">\n <mat-optgroup\n *ngIf=\"option.type === getType().ITEM_GROUP\"\n [label]=\"option.label\"\n [disabled]=\"option.isDisabled\"\n >\n <mat-option\n *ngFor=\"let innerOption of option.valueList\"\n [value]=\"innerOption.value\"\n [disabled]=\"innerOption.isDisabled\"\n >\n <smart-icon\n *ngIf=\"innerOption.icon\"\n [icon]=\"innerOption.icon\"\n [color]=\"innerOption.iconColor\"\n ></smart-icon\n >{{ innerOption.label }}</mat-option\n >\n </mat-optgroup>\n <mat-option\n *ngIf=\"option.type === getType().ITEM\"\n [value]=\"option.value\"\n [disabled]=\"option.isDisabled\"\n >\n <smart-icon\n *ngIf=\"option.icon\"\n [icon]=\"option.icon\"\n [color]=\"option.iconColor\"\n ></smart-icon\n >{{ option.label }}</mat-option\n >\n </div>\n </mat-select>\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n\n <div\n *ngIf=\"widgetInstance.type === smartFormWidgetType.LABEL\"\n class=\"label widgetContainer\"\n [ngStyle]=\"{ width: widgetInstance.minWidth + 'px' }\"\n >\n <div class=\"label-title labelContainer\" [ngClass]=\"widgetInstance.cssClass ?? ''\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n @if (widgetInstance.widgetDescription) {\n <p>{{ widgetInstance.widgetDescription }}</p>\n }\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TIME\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <mat-form-field\n class=\"input widgetContent time {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n appearance=\"outline\"\n >\n <mat-label\n class=\"label\"\n [ngClass]=\"widgetInstance.cssLabelClass ?? ''\"\n *ngIf=\"!widgetInstance.showLabel\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </mat-label>\n <input\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [type]=\"'time'\"\n [value]=\"getTime()\"\n placeholder=\"{{ widgetInstance.placeholder }}\"\n matInput\n (change)=\"handleBlurEvent(widgetInstance)\"\n />\n <span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n matSuffix\n ></smart-icon>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.TOGGLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4\n class=\"{{ labelColor }} smart-form-widget-label {{\n widgetInstance.cssLabelClass ?? ''\n }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <mat-slide-toggle\n formControlName=\"{{ widgetInstance.key }}\"\n [attr.data-testid]=\"widgetInstance.key\"\n value=\"{{ widgetInstance.value }}\"\n (change)=\"onValueChange?.next($event)\"\n [labelPosition]=\"widgetInstance.toggleLabelPosition ?? 'before'\"\n >{{ !widgetInstance.showLabel ? widgetInstance.label : '' }}</mat-slide-toggle\n ><span class=\"mat-error\">\n {{ widgetInstance.error }}\n </span>\n <smart-icon\n *ngIf=\"widgetInstance.error && widgetInstance.errorIcon\"\n [icon]=\"widgetInstance.errorIcon\"\n [color]=\"widgetInstance.errorIconColor ?? 'warn'\"\n ></smart-icon>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.INDICATOR\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} labelContainer {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"smartIndicator widgetContent\">\n <div class=\"indicatorItems {{ widgetInstance.cssClass ?? '' }}\" [ngClass]=\"getNgClass()\">\n <div\n *ngFor=\"let item of indicatorItems; let i = index\"\n class=\"indicatorItem\"\n [ngClass]=\"getIndicatorItemClass(i)\"\n ></div>\n </div>\n <p [ngClass]=\"getIndicatorStatusLabelColor()\">\n {{ getIndicatorStatusLabel() }}\n </p>\n </div>\n </div>\n\n @if (widgetInstance.type === smartFormWidgetType.FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.MULTI_FILE_UPLOADER) {\n <div class=\"widgetContainer\">\n <smart-multi-file-editor\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (uploadFilesEvent)=\"upload($event)\"\n (fileEvent)=\"executeUiAction($event.uiAction)\"\n />\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.IMAGE) {\n <div class=\"widgetContainer imageContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel && getWidgetLabel(widgetInstance)\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n\n @if (widgetInstance.imageProperties?.image) {\n <smart-icon\n [imageResource]=\"widgetInstance.imageProperties?.image\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n } @else if (widgetInstance.value) {\n <smart-icon\n [(ngModel)]=\"widgetInstance.value\"\n [imageResource]=\"widgetInstance.value\"\n class=\"widgetContent {{ widgetInstance.imageCss ?? '' }}\"\n alt=\"Image\"\n title=\"{{ widgetInstance.key }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></smart-icon>\n }\n </div>\n }\n\n @if (widgetInstance.type === smartFormWidgetType.DIV) {\n <div class=\"widgetContainer\">\n <div\n class=\"smartDiv\"\n [innerHTML]=\"sanitizeHtml(getWidgetLabel(widgetInstance))\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n </div>\n </div>\n }\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SVG\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [innerHTML]=\"sanitizeHtml(widgetInstance.value)\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n ></div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.DIVIDER\" class=\"widgetContainer\">\n <hr\n class=\"smartDivider {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n />\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.BUTTON\" class=\"widgetContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"labelContainer {{ labelColor }} {{ widgetInstance.cssLabelClass ?? '' }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div\n class=\"widgetContent {{ widgetInstance.cssClass ?? '' }}\"\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n >\n <button\n mat-button\n [attr.data-testid]=\"widgetInstance.key\"\n [ngClass]=\"getButtonType(widgetInstance.uiActionDescriptor)\"\n [color]=\"widgetInstance.uiActionDescriptor?.color\"\n (click)=\"onButtonClicked(widgetInstance)\"\n >\n <div\n *ngIf=\"isOnlyIcon(widgetInstance.uiActionDescriptor); then iconOnly; else text\"\n ></div>\n <ng-template #iconOnly>\n <smart-icon\n *ngIf=\"widgetInstance.uiActionDescriptor?.icon\"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n <ng-template #text>\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'PRE'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n {{ widgetInstance.uiActionDescriptor?.title }}\n <smart-icon\n *ngIf=\"\n widgetInstance.uiActionDescriptor?.icon &&\n widgetInstance.uiActionDescriptor?.iconPosition === 'POST'\n \"\n [icon]=\"widgetInstance.uiActionDescriptor!.icon!\"\n [color]=\"\n widgetInstance.uiActionDescriptor?.iconColor ??\n widgetInstance.uiActionDescriptor?.color\n \"\n ></smart-icon>\n </ng-template>\n </button>\n </div>\n </div>\n\n <div class=\"widgetContainer\">\n <h4\n class=\"labelContainer\"\n *ngIf=\"widgetInstance.type === smartFormWidgetType.COMPONENT && widgetInstance.showLabel\"\n class=\"{{ labelColor }}\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <div class=\"widgetContent\">\n <ng-template #customComponent></ng-template>\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.RICH_TEXT\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <quill-editor\n #quillEditor\n [formControlName]=\"widgetInstance.key\"\n [id]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [modules]=\"widgetInstance.isDisabled ? emptyQuillToolbar : widgetInstance.quillModules\"\n [placeholder]=\"widgetInstance.placeholder\"\n [readOnly]=\"widgetInstance.isReadonly\"\n [maxLength]=\"widgetInstance.maxLength\"\n (onContentChanged)=\"onRichTextEditorContentChanged($event)\"\n ></quill-editor>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint ||\n widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n <mat-hint\n *ngIf=\"widgetInstance.showCharacterLimitSuffix && widgetInstance.maxLength\"\n matSuffix\n align=\"end\"\n class=\"rich-text-editor-leeway-counter\"\n >{{ getRichTextEditorLengthLeeway() }}</mat-hint\n >\n </div>\n </div>\n\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.SORTABLE\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <div class=\"widgetContent\">\n <lib-sortable-widget\n [formControlName]=\"widgetInstance.key\"\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n ></lib-sortable-widget>\n </div>\n </div>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MATRIX\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4 *ngIf=\"widgetInstance.showLabel\" class=\"{{ labelColor }}\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n\n <table class=\"matrixTable widgetContent\">\n <tr>\n <th></th>\n <th class=\"optionLabel\" *ngFor=\"let option of widgetInstance.value.columns\">\n {{ option.displayValue }}\n </th>\n </tr>\n <tr *ngFor=\"let question of widgetInstance.value.rows; let i = index\">\n <th class=\"questionLabel\">\n <label>{{ question.displayValue }}</label>\n </th>\n\n <td class=\"selectTd\" *ngFor=\"let option of widgetInstance.value.columns; let j = index\">\n <mat-radio-group\n *ngIf=\"!widgetInstance.isMultiple\"\n [formControlName]=\"widgetInstance.key + '.' + question.code\"\n [name]=\"'q' + i\"\n >\n <mat-radio-button [value]=\"option.code\"> </mat-radio-button>\n </mat-radio-group>\n <div *ngIf=\"widgetInstance.isMultiple\">\n <mat-checkbox\n [formControlName]=\"\n widgetInstance.key + '.data.' + question.code + '.' + option.code\n \"\n [value]=\"widgetInstance.value['data'][question.code][option.code]\"\n [checked]=\"true\"\n ></mat-checkbox>\n </div>\n </td>\n <br />\n <button *ngIf=\"widgetInstance.button\" mat-icon-button (click)=\"removeMatrixRow(question)\"\n ><smart-icon icon=\"close\"></smart-icon\n ></button>\n </tr>\n </table>\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.YOUTUBE_PLAYER\" class=\"widgetContainer\">\n <div class=\"labelContainer\">\n <h4\n *ngIf=\"widgetInstance.showLabel\"\n class=\"{{ labelColor }} {{ widgetInstance.cssLabelClass }}\"\n [ngClass]=\"getLabelNgClass()\"\n [ngStyle]=\"getLabelStyle()\"\n >\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <youtube-player\n [ngClass]=\"getNgClass()\"\n [ngStyle]=\"getStyle()\"\n videoId=\"{{ widgetInstance.videoId }}\"\n [width]=\"widgetInstance.width\"\n [height]=\"widgetInstance.height\"\n [startSeconds]=\"widgetInstance.startSeconds\"\n [endSeconds]=\"widgetInstance.endSeconds\"\n ></youtube-player>\n <mat-hint\n *ngIf=\"\n !widgetInstance?.hint || widgetInstance?.hint?.position === SmartWidgetHintPosition.INPUT\n \"\n >{{ widgetInstance.hint?.text }}</mat-hint\n >\n </div>\n <div *ngIf=\"widgetInstance.type === smartFormWidgetType.MONTH_PICKER\" class=\"widgetContainer\">\n <div class=\"labelContainer\" *ngIf=\"widgetInstance.showLabel\">\n <h4 class=\"{{ labelColor }} smart-form-widget-label\">\n {{ getWidgetLabel(widgetInstance) }}\n </h4>\n <mat-hint *ngIf=\"widgetInstance?.hint?.position === SmartWidgetHintPosition.LABEL\">{{\n widgetInstance.hint?.text\n }}</mat-hint>\n </div>\n <lib-smart-month-picker\n [attr.data-testid]=\"widgetInstance.key\"\n [widgetInstance]=\"widgetInstance\"\n (valueChange)=\"handleYearMonthPicked($event)\"\n ></lib-smart-month-picker>\n </div>\n </div>\n}\n", styles: [".ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container.ql-disabled .ql-editor ul[data-checked]>li:before{pointer-events:none}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor>*{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor ul,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0;counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol,.ql-editor ul{padding-left:1.5em}.ql-editor ol>li,.ql-editor ul>li{list-style-type:none}.ql-editor ul>li:before{content:\"\\2022\"}.ql-editor ul[data-checked=true],.ql-editor ul[data-checked=false]{pointer-events:none}.ql-editor ul[data-checked=true]>li *,.ql-editor ul[data-checked=false]>li *{pointer-events:all}.ql-editor ul[data-checked=true]>li:before,.ql-editor ul[data-checked=false]>li:before{color:#777;cursor:pointer;pointer-events:all}.ql-editor ul[data-checked=true]>li:before{content:\"\\2611\"}.ql-editor ul[data-checked=false]>li:before{content:\"\\2610\"}.ql-editor li:before{display:inline-block;white-space:nowrap;width:1.2em}.ql-editor li:not(.ql-direction-rtl):before{margin-left:-1.5em;margin-right:.3em;text-align:right}.ql-editor li.ql-direction-rtl:before{margin-left:.3em;margin-right:-1.5em}.ql-editor ol li:not(.ql-direction-rtl),.ql-editor ul li:not(.ql-direction-rtl){padding-left:1.5em}.ql-editor ol li.ql-direction-rtl,.ql-editor ul li.ql-direction-rtl{padding-right:1.5em}.ql-editor ol li{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;counter-increment:list-0}.ql-editor ol li:before{content:counter(list-0,decimal) \". \"}.ql-editor ol li.ql-indent-1{counter-increment:list-1}.ql-editor ol li.ql-indent-1:before{content:counter(list-1,lower-alpha) \". \"}.ql-editor ol li.ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-2{counter-increment:list-2}.ql-editor ol li.ql-indent-2:before{content:counter(list-2,lower-roman) \". \"}.ql-editor ol li.ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-3{counter-increment:list-3}.ql-editor ol li.ql-indent-3:before{content:counter(list-3,decimal) \". \"}.ql-editor ol li.ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-4{counter-increment:list-4}.ql-editor ol li.ql-indent-4:before{content:counter(list-4,lower-alpha) \". \"}.ql-editor ol li.ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-5{counter-increment:list-5}.ql-editor ol li.ql-indent-5:before{content:counter(list-5,lower-roman) \". \"}.ql-editor ol li.ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}.ql-editor ol li.ql-indent-6{counter-increment:list-6}.ql-editor ol li.ql-indent-6:before{content:counter(list-6,decimal) \". \"}.ql-editor ol li.ql-indent-6{counter-reset:list-7 list-8 list-9}.ql-editor ol li.ql-indent-7{counter-increment:list-7}.ql-editor ol li.ql-indent-7:before{content:counter(list-7,lower-alpha) \". \"}.ql-editor ol li.ql-indent-7{counter-reset:list-8 list-9}.ql-editor ol li.ql-indent-8{counter-increment:list-8}.ql-editor ol li.ql-indent-8:before{content:counter(list-8,lower-roman) \". \"}.ql-editor ol li.ql-indent-8{counter-reset:list-9}.ql-editor ol li.ql-indent-9{counter-increment:list-9}.ql-editor ol li.ql-indent-9:before{content:counter(list-9,decimal) \". \"}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor.ql-blank:before{color:#0009;content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:\"\";display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer: coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow,.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:\"\";display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor pre{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor pre{white-space:pre-wrap;margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor pre.ql-syntax{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label:before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=\"\"]):before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=\"\"]):before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label:before,.ql-snow .ql-picker.ql-header .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"1\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{content:\"Heading 1\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"2\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{content:\"Heading 2\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"3\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{content:\"Heading 3\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"4\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{content:\"Heading 4\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"5\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{content:\"Heading 5\"}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value=\"6\"]:before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{content:\"Heading 6\"}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"1\"]:before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"2\"]:before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"3\"]:before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"4\"]:before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"5\"]:before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value=\"6\"]:before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label:before,.ql-snow .ql-picker.ql-font .ql-picker-item:before{content:\"Sans Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{content:\"Serif\"}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]:before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{content:\"Monospace\"}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]:before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]:before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label:before,.ql-snow .ql-picker.ql-size .ql-picker-item:before{content:\"Normal\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{content:\"Small\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{content:\"Large\"}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]:before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{content:\"Huge\"}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]:before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]:before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]:before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label,.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow+.ql-container.ql-snow{border-top:0px}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip:before{content:\"Visit URL:\";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action:after{border-right:1px solid #ccc;content:\"Edit\";margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove:before{content:\"Remove\";margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action:after{border-right:0px;content:\"Save\";padding-right:0}.ql-snow .ql-tooltip[data-mode=link]:before{content:\"Enter link:\"}.ql-snow .ql-tooltip[data-mode=formula]:before{content:\"Enter formula:\"}.ql-snow .ql-tooltip[data-mode=video]:before{content:\"Enter video:\"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc}.checkbox-section,.radio-section{display:flex;flex-direction:column}.input{width:100%}.direction-col,.toggle-col{display:flex;flex-direction:column;gap:.5em}.toggle-col>label{font-size:.75rem;color:#6b7280;padding-left:.5em}.prime-error{color:red}.direction-row{display:flex;flex-direction:row;align-items:center;gap:.5em}.selecatbleObject{margin:.5em}.radioLabel{color:var(--primary-color);text-align:left!important}.container{height:100%}.input{height:100%;display:flex;flex-direction:column}.checkbox{flex-direction:column}.mat-form-field-wrapper{padding-bottom:0!important}.input .mat-mdc-standard-chip.mat-chip-with-trailing-icon{padding-right:12px}.time-picker{display:flex;flex-direction:row;height:100%;border:solid 2px lightgrey;padding:1em;border-radius:4px}.time-picker:hover{border-color:#000}::ng-deep .mat-h4 .mat-body-1 .mat-typography h4{margin:0}.label{margin:28px 0 8px}.smartIndicator{display:flex;flex-direction:column;gap:.25rem;width:-moz-fit-content;width:fit-content}.indicatorItems{display:flex;flex-direction:row;gap:.25rem}.indicatorItem{width:3rem;height:.25rem;background-color:#d3d3d3;border-radius:.5rem}.radio-error{width:-moz-fit-content;width:fit-content;display:flex;flex-direction:row;gap:.5rem}.mat-calendar-previous-button,.mat-calendar-next-button{padding:0;min-width:0;width:40px!important;height:40px!important;flex-shrink:0;line-height:40px;border-radius:50%}.mat-calendar-arrow{height:36px!important;display:flex!important;flex-direction:column!important;justify-content:center}.radio-item-container,.checkbox-item-container{display:flex;flex-direction:column}.widgetContent::ng-deep .ql-container{height:200px;width:460px}.dateTimePickerContainer{display:flex;flex-direction:row;gap:.25rem}.dateTimePickerContainer mat-form-field{flex:1}.date{width:125px}.time{width:90px}.date .mat-form-field-infix,.time .mat-form-field-infix{width:inherit!important}::ng-deep .mat-icon.mat-drag-indicator{--drag-indicator: #3b3b3b;color:var(--drag-indicator)}.matrixTable{width:100%;border-spacing:0 1rem}.matrixTable th{padding:.25rem}.matrixTable .optionLabel,.matrixTable td{text-align:center}.example-month-picker .mat-calendar-period-button{pointer-events:none}.example-month-picker .mat-calendar-arrow{display:none}.textFieldContainer{display:flex;flex-direction:row}.textFieldContainer p-floatlabel{flex:1}.textFieldContainer{align-content:center;border:1px solid #cbd5e1;border-radius:3px;background-color:#fff}.textFieldContainer input{border:unset}.textFieldContainer:focus-within:not(:has(input:disabled)){outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.textFieldContainer:has(input:disabled) .clearButton{cursor:not-allowed;opacity:.6}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid){border-color:#f44336}.textFieldContainer:has(.p-inputtext.ng-dirty.ng-invalid) label{color:#f44336}.p-inputtext:enabled:focus{outline:unset;outline-offset:unset;box-shadow:unset;border-color:unset}.textFieldButtons{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.clearButton .mat-mdc-raised-button,.clearButton button{background-color:unset!important;border:unset;color:#6b7280!important;box-shadow:unset;font-size:1rem!important}.clearButton .mat-icon.mat-primary{color:#6b7280!important}.clearButton .mat-mdc-raised-button:hover,.clearButton button:hover{color:#6b7280cc!important;background-color:unset;border:unset;box-shadow:unset;font-size:1rem!important}.mat-mdc-form-field-infix{display:flex;flex-direction:row}p-calendar{display:flex;width:100%}p-calendar span{width:100%}textarea:not(:placeholder-shown)~label{top:-.75em!important;font-size:12px!important}.p-calendar ::ng-deep timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar ::ng-deep timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon ::ng-deep .p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.p-calendar timesicon.p-icon-wrapper{position:absolute!important;top:70%!important;margin-top:-.5rem!important;right:7%!important}.container:has(.p-inputswitch){height:unset}.disabledEditor *{-webkit-user-modify:read-only;-moz-user-modify:read-only;user-modify:read-only}.sb4-textarea{--sb4-textarea-line-height: 20px;line-height:var(--sb4-textarea-line-height);overflow-y:auto!important}.widgetContainer .imageIcon{max-width:unset!important;height:unset!important}.prime .widgetContainer{height:100%;width:100%;display:flex;flex-direction:column;position:relative}.prime .widgetContainer smart-ui-action-toolbar{flex:unset}.prime .widgetContainer .p-dropdown{flex:1;display:flex}.prime .widgetContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime .widgetItemContainer{height:100%;width:100%;display:flex;flex-direction:row}.prime .widgetItemContainer smart-ui-action-toolbar{flex:unset}.prime .widgetItemContainer .p-dropdown{flex:1;display:flex}.prime .widgetItemContainer :is(.p-float-label,p-floatlabel){height:100%;width:100%}.prime :is(p-calendar,.p-multiselect){height:100%}.material .sb4-textarea{resize:vertical!important}.label-right{display:flex;gap:.5rem;flex-direction:row-reverse}.label-left{display:flex;gap:.5rem;flex-direction:row}.label-top{display:flex;gap:.5rem;flex-direction:column}.label-bottom{display:flex;gap:.5rem;flex-direction:column-reverse}.p-message .p-message-wrapper{padding:.5rem}.smartDiv{width:100%}.p-message.p-message-error .p-message-icon{color:#73000c;display:flex}.p-message.p-message-error{position:absolute;top:100%;left:0;z-index:1000;border-radius:4px;box-shadow:0 2px 6px #0003;margin:.2rem 0!important}.p-inputgroup-addon{max-height:2.8rem;background:unset;border:unset!important}\n/*!\n * Quill Editor v1.3.7\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n"] }]
1002
1002
  }], ctorParameters: () => [{ type: i1.SmartFormService }, { type: i2.ComponentFactoryService }, { type: i3.DomSanitizer }, { type: i47.ComponentLibrary, decorators: [{
1003
1003
  type: Inject,
1004
1004
  args: [COMPONENT_LIBRARY]
@@ -1049,4 +1049,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
1049
1049
  type: ViewChild,
1050
1050
  args: ['timeInput']
1051
1051
  }] } });
1052
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSS9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBYyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUYsT0FBTyxFQUNMLFlBQVksRUFFWixrQkFBa0IsR0FHbkIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFt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LHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFTaUIsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXO2dCQVd0QixvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTzlCLEtBQUs7c0JBQTlCLFNBQVM7dUJBQUMsYUFBYTtnQkFTRixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBR3BCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBT1osV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNhLFlBQVk7c0JBQWhELFNBQVM7dUJBQUMsd0JBQXdCO2dCQUNPLGlCQUFpQjtzQkFBMUQsU0FBUzt1QkFBQyw2QkFBNkI7Z0JBcUloQixjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0UsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xyXG5pbXBvcnQgeyBNYXRDaGlwSW5wdXRFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoaXBzJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBkZWVwRXF1YWwgfSBmcm9tICdmYXN0LWVxdWFscyc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQ29udGVudENoYW5nZSwgUXVpbGxFZGl0b3JDb21wb25lbnQsIFF1aWxsTW9kdWxlcyB9IGZyb20gJ25neC1xdWlsbCc7XHJcbmltcG9ydCB7IEVkaXRvclRleHRDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvZWRpdG9yJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBJY29uUG9zaXRpb24sXHJcbiAgVWlBY3Rpb24sXHJcbiAgVWlBY3Rpb25CdXR0b25UeXBlLFxyXG4gIFVpQWN0aW9uRGVzY3JpcHRvcixcclxuICBVaUFjdGlvblVwbG9hZERlc2NyaXB0b3IsXHJcbn0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L2FwaSc7XHJcbmltcG9ydCB7IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC9zbWFydC11aS1hY3Rpb24vdWktYWN0aW9uLXRvb2xiYXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBDT01QT05FTlRfTElCUkFSWSxcclxuICBDb21wb25lbnRMaWJyYXJ5LFxyXG59IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC91dGlsaXR5L2NvbXBvbmVudExpYnJhcnknO1xyXG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbixcclxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxyXG4gIFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uRW51bSxcclxufSBmcm9tICcuLi8uLi9hcGkvbW9kZWwvbW9kZWxzJztcclxuaW1wb3J0IHsgU21hcnRGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBTbWFydEJ1dHRvbixcclxuICBTbWFydEZvcm1XaWRnZXQsXHJcbiAgU21hcnRJdGVtLFxyXG4gIFNtYXJ0SXRlbXMsXHJcbiAgU21hcnRNYXRyaXgsXHJcbn0gZnJvbSAnLi4vLi4vc21hcnRmb3JtLmZvcm0tbW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbixcclxuICBTbWFydFZhbGlkYXRvcixcclxuICBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UsXHJcbiAgVmFsdWUsXHJcbn0gZnJvbSAnLi4vLi4vc21hcnRmb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgU21hcnRGaWxlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zbWFydC1maWxlLWVkaXRvci9zbWFydC1maWxlLWVkaXRvci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc21hcnQtbXVsdGktZmlsZS1lZGl0b3Ivc21hcnQtbXVsdGktZmlsZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgU21hcnRTdWJqZWN0IH0gZnJvbSAnLi4vLi4vLi4vc21hcnQtc3ViamVjdC9wcm9qZWN0cyc7XHJcbmV4cG9ydCBjbGFzcyBTbWFydFdpZGdldFNldHRpbmdzIHtcclxuICBwdWJsaWMgc3RhdGljIHVzZVV0YyA9IGZhbHNlO1xyXG59XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc21hcnRmb3Jtd2lkZ2V0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zbWFydGZvcm13aWRnZXQuY29tcG9uZW50LmNzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbWFydGZvcm13aWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBoaWRlUGFzc3dvcmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBzbWFydENvbXBvbmVudDogYW55O1xyXG5cclxuICBlcnJvck1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgZm9ybSE6IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgQElucHV0KCkgd2lkZ2V0SW5zdGFuY2UhOiBTbWFydEZvcm1XaWRnZXQ8YW55PjtcclxuICBASW5wdXQoKSBvbkJsdXI/OiBTdWJqZWN0PGFueT47XHJcbiAgQElucHV0KCkgb25WYWx1ZUNoYW5nZT86IFN1YmplY3Q8YW55PjtcclxuICBASW5wdXQoKSBsYWJlbENvbG9yPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcclxuICBASW5wdXQoKSBibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlITogU3ViamVjdDxTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2U+O1xyXG5cclxuICBAT3V0cHV0KCkgdmFsdWVDbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XHJcbiAgICBldmVudD86IGFueTtcclxuICAgIGtleTogYW55O1xyXG4gIH0+KCk7XHJcblxyXG4gIHNtYXJ0Rm9ybVdpZGdldFR5cGUgPSBTbWFydEZvcm1XaWRnZXRUeXBlO1xyXG5cclxuICBjYXBzT246IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnY2hpcElucHV0JykgY2hpcElucHV0Q2hpbGQ/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICBmaWx0ZXJlZFZhbHVlTGlzdD86IE9ic2VydmFibGU8c3RyaW5nW10gfCB1bmRlZmluZWQ+O1xyXG5cclxuICBoYXNFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVycm9yS2V5Pzogc3RyaW5nO1xyXG5cclxuICBpbmRpY2F0b3JJdGVtcz86IGFueVtdO1xyXG4gIGRlZmF1bHREYXRlPzogRGF0ZTtcclxuICAvLyBjdXN0b21Db21wb25lbnRcclxuICBAVmlld0NoaWxkKCdjdXN0b21Db21wb25lbnQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuICBjdXN0b21Db21wb25lbnRWY1JlZj86IFZpZXdDb250YWluZXJSZWY7XHJcbiAgY3VzdG9tQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPGFueT47XHJcblxyXG4gIGZpbHRlcmVkT3B0aW9ucz86IE9ic2VydmFibGU8U21hcnRJdGVtPGFueT5bXT47XHJcbiAgdG9IaWdobGlnaHQ6IHN0cmluZyA9ICcnO1xyXG5cclxuICBAVmlld0NoaWxkKCdxdWlsbEVkaXRvcicpIHF1aWxsPzogUXVpbGxFZGl0b3JDb21wb25lbnQ7XHJcblxyXG4gIGlzRW50ZXJQcmVzc2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGlzRGF0ZVBpY2tlclJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uID0gU21hcnRXaWRnZXRIaW50UG9zaXRpb25FbnVtO1xyXG5cclxuICAvLyB0b29sYmFyXHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicpIHRvb2xiYXI/OiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oU21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50KVxyXG4gIGNoaWxkcmVuV2lkZ2V0c1FMPzogUXVlcnlMaXN0PFNtYXJ0Zm9ybXdpZGdldENvbXBvbmVudD47XHJcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XHJcbiAgZW1wdHlRdWlsbFRvb2xiYXI6IFF1aWxsTW9kdWxlcyA9IHtcclxuICAgIHRvb2xiYXI6IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NiNFRleHRhcmVhJykgc2I0VGV4dGFyZWEhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoU21hcnRGaWxlRWRpdG9yQ29tcG9uZW50KSBmaWxlVXBsb2FkZXIhOiBTbWFydEZpbGVFZGl0b3JDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZChTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudCkgbXVsdGlGaWxlVXBsb2FkZXI/OiBTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNtYXJ0Rm9ybVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNmU2VydmljZTogQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgcHVibGljIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0ID0gdGhpcy5zZXJ2aWNlLmZpbHRlcldpZGdldHNCeVZpc2liaWxpdHkoXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkJsdXI/LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sTWVzc2FnZXModGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBoYW5kbGUgaW5pdGlhbCBlcnJvciBtZXNzYWdlIGZyb20gc2VydmVyXHJcbiAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIC8vIHRoaXMuZ2V0Q29udHJvbE1lc3NhZ2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5ISk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3JcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3I/LmluZGljYXRvckxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuaW5kaWNhdG9ySXRlbXMgPSBuZXcgQXJyYXk8YW55Pih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvci5pbmRpY2F0b3JMZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdGVQcm9wZXJ0eV0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xyXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUgPVxyXG4gICAgICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5jaGFuZ2VJbmRpY2F0b3JTdGF0dXModmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVIpIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcclxuICAgICAgICB0aGlzLmRlZmF1bHREYXRlID0gbmV3IERhdGUodGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMub25WYWx1ZUNoYW5nZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UgPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMub25WYWx1ZUNoYW5nZSEucGlwZShcclxuICAgICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICAgIG1hcCgodmFsdWUpID0+IHRoaXMuX2ZpbHRlcih2YWx1ZSB8fCAnJykpLFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSKSB7XHJcbiAgICAgIGxldCB2aWRlb0lkID0gdGhpcy5wYXJzZVlvdXR1YmVVcmwodGhpcy53aWRnZXRJbnN0YW5jZS5saW5rISk7XHJcbiAgICAgIGlmICh2aWRlb0lkKSB0aGlzLndpZGdldEluc3RhbmNlLnZpZGVvSWQgPSB2aWRlb0lkO1xyXG4gICAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuXHJcbiAgICAgIHRhZy5zcmMgPSAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vaWZyYW1lX2FwaSc7XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGFnKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZm9ybUNvbnRyb2xzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZmlsdGVyKFxyXG4gICAgICAoa2V5OiBzdHJpbmcpID0+XHJcbiAgICAgICAga2V5ID09PSB0aGlzLndpZGdldEluc3RhbmNlLmtleSB8fCBrZXkuc3RhcnRzV2l0aChgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0uYClcclxuICAgICk7XHJcblxyXG4gICAgZm9ybUNvbnRyb2xzLm1hcCgoa2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTICYmXHJcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U29waGlzdGljYXRlZEV2ZW50S2luZCgpLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh2YWx1ZUNoYW5nZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U29waGlzdGljYXRlZEV2ZW50S2luZCgpOiAnc2VsZWN0aW9uJyB8ICdiYXNpYycge1xyXG4gICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1QgfHxcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXHJcbiAgICAgID8gJ3NlbGVjdGlvbidcclxuICAgICAgOiAnYmFzaWMnO1xyXG4gIH1cclxuXHJcbiAgcGFyc2VZb3V0dWJlVXJsKHVybDogc3RyaW5nKSB7XHJcbiAgICB1cmwucmVwbGFjZSgnL3Nob3J0cy8nLCAnL3dhdGNoP3Y9Jyk7XHJcblxyXG4gICAgdmFyIHJlZ0V4cCA9IC9eLiooKHlvdXR1LmJlXFwvKXwodlxcLyl8KFxcL3VcXC9cXHdcXC8pfChlbWJlZFxcLyl8KHdhdGNoXFw/KSlcXD8/dj89PyhbXiMmP10qKS4qLztcclxuICAgIHZhciBtYXRjaCA9IHVybC5tYXRjaChyZWdFeHApO1xyXG5cclxuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaFs3XS5sZW5ndGggPT0gMTEgPyBtYXRjaFs3XSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgX2hhc0p1c3RDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCBoYXNKdXN0Q2hhbmdlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9oYXNKdXN0Q2hhbmdlZDtcclxuICB9XHJcbiAgc2V0IGhhc0p1c3RDaGFuZ2VkKGhhc0p1c3RDaGFuZ2VkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9oYXNKdXN0Q2hhbmdlZCA9IGhhc0p1c3RDaGFuZ2VkO1xyXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjUwKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX2hhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhc0NyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZGF0ZUlucHV0JykgZGF0ZUlucHV0Q2hpbGQ/OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3RpbWVJbnB1dCcpIHRpbWVJbnB1dENoaWxkPzogRWxlbWVudFJlZjtcclxuXHJcbiAgb25EYXRlUGlja2VyQmx1cihldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZUJsdXJFdmVudCh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIHRoaXMuaGFuZGxlRGF0ZUNoYW5nZWQodGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25UaW1lUGlja2VyQmx1cihldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZUJsdXJFdmVudCh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICAgIHRoaXMuaGFuZGxlVGltZUNoYW5nZWQodGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF0udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQpIHtcclxuICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRSZWYgPSB0aGlzLmNmU2VydmljZS5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRWY1JlZiEsXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5jb21wb25lbnQsXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbnB1dFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5Lk1BVEVSSUFMKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUiB8fFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NT05USF9QSUNLRVJcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCA9ICEhdGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5zb21lKFxyXG4gICAgICAgICAgKHNtYXJ0VmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4gc21hcnRWYWxpZGF0b3IudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHRpbWU7XHJcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcclxuICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSk7XHJcbiAgICAgICAgICBsZXQgaG91ciA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgICAgICAgbGV0IG1pbiA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENNaW51dGVzKCkgOiBkYXRlLmdldE1pbnV0ZXMoKTtcclxuICAgICAgICAgIHRpbWUgPSBTdHJpbmcoaG91cikucGFkU3RhcnQoMiwgJzAnKSArICc6JyArIFN0cmluZyhtaW4pLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gbW9tZW50KGRhdGUpO1xyXG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XTtcclxuICAgICAgICAgIGlmIChkYXRlRm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aW1lID0gJyc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnMpIHtcclxuICAgICAgICAgIHZhbGlkYXRvcnMgPSB0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/Lm1hcCgodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRvcjtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGltZUZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh0aW1lLCB2YWxpZGF0b3JzKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgdGltZUZvcm1Db250cm9sLmRpc2FibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGAke3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYCwgdGltZUZvcm1Db250cm9sKTtcclxuXHJcbiAgICAgICAgdGhpcy5oYXNDcmVhdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoX21vbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0ZUNoYW5nZWQoX21vbWVudCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0aW1lVmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVRpbWVDaGFuZ2VkKHRpbWVWYWx1ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1BJQ0tFUikge1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodGltZVZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRpbWVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGVmYXVsdERhdGUgPSBuZXcgRGF0ZSh0aW1lVmFsdWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGVmYXVsdERhdGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1ggJiZcclxuICAgICAgdGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORyAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5tYXhSb3dzICYmXHJcbiAgICAgIHRoaXMuc2I0VGV4dGFyZWFcclxuICAgICkge1xyXG4gICAgICB2YXIgdGV4dGFyZWEgPSB0aGlzLnNiNFRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGV4dGFyZWEpO1xyXG5cclxuICAgICAgdmFyIG1heExpbmVzID0gdGhpcy53aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcy5tYXhSb3dzO1xyXG4gICAgICB2YXIgbGluZUhlaWdodCA9IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJy0tc2I0LXRleHRhcmVhLWxpbmUtaGVpZ2h0JykpIHx8IDIwO1xyXG5cclxuICAgICAgdmFyIHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XHJcbiAgICAgIHZhciBwYWRkaW5nQm90dG9tID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xyXG5cclxuICAgICAgdmFyIHZlcnRpY2FsRXh0cmFzID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XHJcblxyXG4gICAgICB0ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgIHRleHRhcmVhLnN0eWxlLm1heEhlaWdodCA9IGAke2xpbmVIZWlnaHQgKiBtYXhMaW5lcyArIHZlcnRpY2FsRXh0cmFzfXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiYgdGhpcy5maWxlVXBsb2FkZXIpIHtcclxuICAgICAgdGhpcy50b29sYmFyID0gdGhpcy5maWxlVXBsb2FkZXIudG9vbGJhcjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgIHRoaXMubXVsdGlGaWxlVXBsb2FkZXJcclxuICAgICkge1xyXG4gICAgICB0aGlzLnRvb2xiYXIgPSB0aGlzLm11bHRpRmlsZVVwbG9hZGVyLnRvb2xiYXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlzRGF0ZUZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmRhdGVJbnB1dENoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgaXNUaW1lRm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudGltZUlucHV0Q2hpbGQ/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBkYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXTtcclxuICAgIGNvbnN0IHRpbWVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgdGltZUZvcm1Db250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSAmJlxyXG4gICAgICAhX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUoJycpO1xyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgIXRoaXMuaXNEYXRlUGlja2VyUmVxdWlyZWQgJiZcclxuICAgICAgIXRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcclxuICAgICAgX21vbWVudFxyXG4gICAgKSB7XHJcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgaWYgKHRpbWVGb3JtQ29udHJvbC52YWx1ZSA9PT0gJycpIHtcclxuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5zZXRWYWx1ZShub3cuZ2V0SG91cnMoKSArICc6JyArIG5vdy5nZXRNaW51dGVzKCkpO1xyXG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghX21vbWVudCB8fCBpc0RhdGVGb2N1c2VkIHx8IGlzVGltZUZvY3VzZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0p1c3RDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRpbWVWYWx1ZSA9IHRpbWVGb3JtQ29udHJvbC52YWx1ZSB8fCAnMDA6MDAnO1xyXG4gICAgdGhpcy5oYXNKdXN0Q2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XHJcbiAgICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbCwgX21vbWVudCwgdGltZVZhbHVlKTtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVRpbWVDaGFuZ2VkKHRpbWVWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBpc0ZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRpbWVJbnB1dENoaWxkPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgZGF0ZUZvcm1Db250cm9sID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV07XHJcbiAgICBjb25zdCB0aW1lRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcclxuICAgICAgIXRpbWVWYWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZUZvcm1Db250cm9sLnZhbHVlID8/ICcnKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXHJcbiAgICAgICFkYXRlRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXHJcbiAgICAgIHRpbWVWYWx1ZVxyXG4gICAgKSB7XHJcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIChpc0ZvY3VzZWQpIHtcclxuICAgIC8vICAgcmV0dXJuO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0p1c3RDaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGltZVZhbHVlKSB7XHJcbiAgICAgIGlmICh0aW1lRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XHJcbiAgICAgICAgdGltZUZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBfbW9tZW50ID0gZGF0ZUZvcm1Db250cm9sLnZhbHVlO1xyXG5cclxuICAgIGlmICghX21vbWVudCkge1xyXG4gICAgICBfbW9tZW50ID0gbW9tZW50KCk7IC8vIG9yIG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpIGlmIHlvdSBwcmVmZXJcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xyXG4gICAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2wsIF9tb21lbnQsIHRpbWVWYWx1ZSk7XHJcblxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gZGF0ZUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICB0aGlzLm9uVmFsdWVDaGFuZ2U/Lm5leHQodGhpcy53aWRnZXRJbnN0YW5jZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2w6IGFueSwgX21vbWVudDogYW55LCB0aW1lVmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKF9tb21lbnQpIHtcclxuICAgICAgbGV0IGhvdXIgPSB0aW1lVmFsdWUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gICAgICBsZXQgbWluID0gdGltZVZhbHVlLnN1YnN0cmluZygzLCA1KTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld01vbWVudCA9IG1vbWVudChfbW9tZW50KS5zZXQoe1xyXG4gICAgICAgIGhvdXI6ICtob3VyLFxyXG4gICAgICAgIG1pbnV0ZTogK21pbixcclxuICAgICAgICBzZWNvbmQ6IDAsXHJcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDAsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKG5ld01vbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUaW1lKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzFdLnN1YnN0cmluZygwLCA1KTtcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG9uS2V5ZG93bigpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNFbnRlclByZXNzZWQgPSB0cnVlO1xyXG5cclxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpLnRoZW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRW50ZXJQcmVzc2VkID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNFbnRlclByZXNzZWQpIHtcclxuICAgICAgdGhpcy5oaWRlUGFzc3dvcmQgPSAhdGhpcy5oaWRlUGFzc3dvcmQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXROZ0NsYXNzKCk6IHsgW2NsYXNzTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ0NsYXNzZXModGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSk7XHJcbiAgfVxyXG5cclxuICBnZXRTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHtcclxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZSkge1xyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlID0ge1xyXG4gICAgICAgIGNsYXNzZXNUb0FkZDogW10sXHJcbiAgICAgICAgY2xhc3Nlc1RvUmVtb3ZlOiBbXSxcclxuICAgICAgICBzdHlsZToge30sXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEoJ3dpZHRoJyBpbiB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlLnN0eWxlKSAmJiAnbWluV2lkdGgnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZS5zdHlsZVsnd2lkdGgnXSA9IGAke3RoaXMud2lkZ2V0SW5zdGFuY2UubWluV2lkdGh9cHhgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFNtYXJ0U3R5bGVVdGlsaXR5LmdldE5nU3R5bGVzKHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFiZWxOZ0NsYXNzKCk6IHsgW2NsYXNzTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIGlmICgnbGFiZWxTdHlsZScgaW4gdGhpcy53aWRnZXRJbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdDbGFzc2VzKHRoaXMud2lkZ2V0SW5zdGFuY2UubGFiZWxTdHlsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFiZWxTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHtcclxuICAgIGlmICgnbGFiZWxTdHlsZScgaW4gdGhpcy53aWRnZXRJbnN0YW5jZSkge1xyXG4gICAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdTdHlsZXModGhpcy53aWRnZXRJbnN0YW5jZS5sYWJlbFN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgaGFuZGxlciBmb3IgdGhlIHBvdGVudGlhbGx5IHByZXNlbnQgUXVpbGwgZWRpdG9yLCBlbmZvcmNpbmcgbWF4IGxlbmd0aCBsaW1pdHMgaWZcclxuICAgKiBuZWNlc3NhcnkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gY2hhbmdlIHRoZSB7QGxpbmsgQ29udGVudENoYW5nZX0gdGhlIFF1aWxsIGVkaXRvciBlbWl0c1xyXG4gICAqIEByZXR1cm5zIHtAY29kZSB2b2lkfVxyXG4gICAqL1xyXG4gIG9uUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZChjaGFuZ2U6IENvbnRlbnRDaGFuZ2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxyXG4gICAgLy8gdW5yZW1vdmFibGUgbmV3LWxpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgaXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoICsgMTtcclxuICAgIGlmIChjaGFuZ2UudGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbnNlcnRPcENvdW50OiBudW1iZXIgPSBjaGFuZ2UuZGVsdGEub3BzPy5maWx0ZXIoKGl0KSA9PiAhIWl0Lmluc2VydCkubGVuZ3RoID8/IDA7XHJcbiAgICBpZiAoaW5zZXJ0T3BDb3VudCA+IDApIHtcclxuICAgICAgdGhpcy5xdWlsbD8ucXVpbGxFZGl0b3Iuc2V0Q29udGVudHMoY2hhbmdlLm9sZERlbHRhLCAnc2lsZW50Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblByaW1lUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZChjaGFuZ2U6IEVkaXRvclRleHRDaGFuZ2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gd2UgYXJlIHBlcm1pdHRlZCBhIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSByZXF1ZXN0ZWQ6IFRoZSBxdWlsbCBlZGl0b3IgY29udGFpbnMgYW5cclxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxyXG4gICAgY29uc3QgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCArIDE7XHJcbiAgICBpZiAoY2hhbmdlLnRleHRWYWx1ZS5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgdXNlci1zcGFjZSBjaGFyYWN0ZXJzIGFsbG93ZWQgdG8gYmUgZW50ZXJlZCBpbnRvIHRoZSBRdWlsbFxyXG4gICAqIGVkaXRvci5cclxuICAgKlxyXG4gICAqIDxwPlxyXG4gICAqIFRoZSByZWFsIGxlbmd0aCBvZiB0aGUgZWRpdG9yJ3MgY29udGVudCBtYXkgYmUgbXVjaCBsb25nZXIgLSBhcyBpdCBpcyBwZXJzaXN0ZWQgYXMgYW4gSFRNTFxyXG4gICAqIGRvY3VtZW50IGZyYWdtZW50IGJlaGluZCB0aGUgc2NlbmVzLiBUaGlzIG1ldGhvZCBpcyBjb25jZXJuZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZVxyXG4gICAqIHVzZXIgcGVyY2VpdmVzLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMgdGhlIHtAbGluayBudW1iZXJ9IG9mIHJlbWFpbmluZyBwZXJtaXR0ZWQgY2hhcmFjdGVycyB0aGUgdXNlciBtYXkgaW5wdXQsIG9yIHtAY29kZSAtMX1cclxuICAgKiAgICAgICAgICBpZiB0aGUgbGVld2F5IGlzIG5vdCBpbnRlcnByZXRlZCBpbiB0aGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxyXG4gICAqL1xyXG4gIGdldFJpY2hUZXh0RWRpdG9yTGVuZ3RoTGVld2F5KCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gd2UgYXJlIHBlcm1pdHRlZCBhIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSByZXF1ZXN0ZWQ6IFRoZSBxdWlsbCBlZGl0b3IgY29udGFpbnMgYW5cclxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxyXG4gICAgY29uc3QgbWF4TGVuZ3RoOiBudW1iZXIgPSB0aGlzLndpZGdldEluc3RhbmNlLm1heExlbmd0aCArIDE7XHJcbiAgICBpZiAodGhpcy5xdWlsbCkge1xyXG4gICAgICAvLyB0aGlzIGlzIHRoZSBpbnRlbmRlZCBwYXRoICh1c2VyIGlucHV0KTpcclxuICAgICAgcmV0dXJuIG1heExlbmd0aCAtIHRoaXMucXVpbGwucXVpbGxFZGl0b3IuZ2V0VGV4dCgpLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmYWxsYmFjayB0byB0aGUgcmF3IEhUTUwgY29udGVudDpcclxuICAgIHJldHVybiBtYXhMZW5ndGggLSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIGFkZE9uQmx1ciA9IHRydWU7XHJcbiAgcmVhZG9ubHkgc2VwYXJhdG9yS2V5c0NvZGVzID0gW0VOVEVSLCBDT01NQV0gYXMgY29uc3Q7XHJcbiAgcmVhZG9ubHkgZW1wdHlTZXBhcmF0b3JLZXlzQ29kZXMgPSBbXSBhcyBjb25zdDtcclxuXHJcbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC52YWx1ZSB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKHRoaXMuc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZSkpIHtcclxuICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcclxuICAgICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxyXG4gICAgICAgIGtpbmQ6ICdzZWxlY3Rpb24nLFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcclxuICAgIH1cclxuICAgIC8vIENsZWFyIHRoZSBpbnB1dCB2YWx1ZVxyXG4gICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xyXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmUodmFsdWU6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5pbmRleE9mKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XHJcbiAgICAgICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUsXHJcbiAgICAgICAgICBraW5kOiAnc2VsZWN0aW9uJyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgd2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWUgPSBldmVudC5vcHRpb24udmlld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZSkpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyB8fFxyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcclxuICAgICAgICAgIGtleTogd2lkZ2V0SW5zdGFuY2Uua2V5LFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxyXG4gICAgICAgICAga2luZDogJ3NlbGVjdGlvbicsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgJiZcclxuICAgICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUhLmxlbmd0aCA8IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzKSB8fFxyXG4gICAgICAgICF0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlc1xyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUpIHtcclxuICAgICAgICAgIGxldCB2YWx1ZXMgPSBuZXcgQXJyYXk8T2JqZWN0PigpO1xyXG4gICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IHZhbHVlcztcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0uc2V0VmFsdWUodmFsdWVzKTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLnB1c2godmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXREaXJlY3Rpb24oKTogc3RyaW5nIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cclxuICAgICkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5kaXJlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1yb3cnO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmRpcmVjdGlvbiA9PT0gU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLkNPTCkge1xyXG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1jb2wnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdkaXJlY3Rpb24tcm93JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpOiB0eXBlb2YgU21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBnZXRUeXBlKCk6IHR5cGVvZiBTbWFydEZvcm1XaWRnZXRUeXBlIHtcclxuICAgIHJldHVybiBTbWFydEZvcm1XaWRnZXRUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0OiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHN0cmluZyB7XHJcbiAgICBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGlmICh3aWRnZXQubGFiZWwgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB3aWRnZXQubGFiZWw7XHJcbiAgICB9XHJcbiAgICBsZXQgaXNSZXF1aXJlZCA9IGZhbHNlO1xyXG4gICAgaWYgKFxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlRcclxuICAgICkge1xyXG4gICAgICBpc1JlcXVpcmVkID0gd2lkZ2V0LnZhbGlkYXRvcnM/Lmxlbmd0aCA/IHRoaXMuZmllbGRJc1JlcXVpcmVkKCkgJiYgISF3aWRnZXQuc2hvd0xhYmVsIDogZmFsc2U7XHJcbiAgICB9IGVsc2UgaWYgKHdpZGdldC50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMKSB7XHJcbiAgICAgIGlzUmVxdWlyZWQgPSB3aWRnZXQubWFya0FzUmVxdWlyZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7d2lkZ2V0LmxhYmVsfSR7aXNSZXF1aXJlZCA/ICcgKicgOiAnJ31gO1xyXG4gIH1cclxuXHJcbiAgc2FuaXRpemVIdG1sKHZhbHVlPzogc3RyaW5nKTogU2FmZUh0bWwgfCBudWxsIHtcclxuICAgIGxldCBzYWZlVmFsdWUgPSB2YWx1ZSA/PyAnJztcclxuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChzYWZlVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWVsZElzUmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdmFsdWUgPSBmYWxzZTtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRJTUUgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcclxuICAgICkge1xyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LmZvckVhY2goKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcclxuICAgICAgICBpZiAodmFsaWRhdG9yLnZhbGlkYXRvciA9PSBWYWxpZGF0b3JzLnJlcXVpcmVkKSB2YWx1ZSA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhc0N1c3RvbUVycm9yKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4sIHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpOiBib29sZWFuIHtcclxuICAgIGlmIChcclxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXHJcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXQua2V5XSAmJiB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0uZXJyb3JzKSB7XHJcbiAgICAgICAgbGV0IGhhc0Vycm9yID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldLmVycm9ycyEpLmxlbmd0aFxyXG4gICAgICAgICAgPyB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0/LmRpcnR5IHx8XHJcbiAgICAgICAgICAgICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0/LnRvdWNoZWQgJiZcclxuICAgICAgICAgICAgICB2YWxpZGF0b3IgJiZcclxuICAgICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy5lcnJvcnMpIVt2YWxpZGF0b3IubmFtZV0pXHJcbiAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICh2YWxpZGF0b3IgJiYgaGFzRXJyb3IgJiYgIXRoaXMuZXJyb3JLZXkpIHx8XHJcbiAgICAgICAgICAodmFsaWRhdG9yICYmIGhhc0Vycm9yICYmIHRoaXMuZXJyb3JLZXkgPT09IHZhbGlkYXRvci5uYW1lKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ID0gdmFsaWRhdG9yLm5hbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICghaGFzRXJyb3IgJiYgdmFsaWRhdG9yICYmIHRoaXMuZXJyb3JLZXkgPT09IHZhbGlkYXRvci5uYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmVycm9yS2V5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaGFzRXJyb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEVycm9yTWVzc2FnZSh3aWRnZXRJbnN0YW5jZTogU21hcnRGb3JtV2lkZ2V0PGFueT4pOiBib29sZWFuIHtcclxuICAgIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcclxuICAgIGxldCBlcnJvckljb246IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGxldCBlcnJvckljb25Db2xvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgbGV0IHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3I7XHJcbiAgICBpZiAoXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcclxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXHJcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldICYmIHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgJiZcclxuICAgICAgICAgICFPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5pbmNsdWRlcyh0aGlzLmVycm9yS2V5ISlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JLZXkgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoXHJcbiAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgaW5kZXggPCBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5sZW5ndGg7XHJcbiAgICAgICAgICBpbmRleCsrXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycyEpW2luZGV4XTtcclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbldpZGdldCA9IHdpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LmZpbHRlcihcclxuICAgICAgICAgICAgKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHZhbGlkYXRvci5uYW1lID09PSBlcnJvcktleVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChjdXN0b21WYWxpZGF0b3JPbldpZGdldCAmJiBjdXN0b21WYWxpZGF0b3JPbldpZGdldC5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uZXJyb3JNZXNzYWdlITtcclxuICAgICAgICAgICAgZXJyb3JJY29uID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbjtcclxuICAgICAgICAgICAgZXJyb3JJY29uQ29sb3IgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXS5pY29uQ29sb3I7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uV2lkZ2V0WzBdO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjdXN0b21WYWxpZGF0b3JPbkZvcm0gPSB0aGlzLnNlcnZpY2Uuc21hcnRGb3JtPy52YWxpZGF0b3JzPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25Gb3JtICYmIGN1c3RvbVZhbGlkYXRvck9uRm9ybS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25Gb3JtWzBdLmVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgICAgIHZhbGlkYXRvciA9IGN1c3RvbVZhbGlkYXRvck9uRm9ybVswXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5oYXNDdXN0b21FcnJvcih3aWRnZXRJbnN0YW5jZSwgdmFsaWRhdG9yISkpIHtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IGVycm9yTWVzc2FnZSE7XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gZXJyb3JJY29uO1xyXG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID0gZXJyb3JJY29uQ29sb3I7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh3aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZTtcclxuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb24gPSB3aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvckljb247XHJcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPSB3aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvckNvbG9yO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEluZGljYXRvckl0ZW1DbGFzcyhpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XHJcbiAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvci5pbmRpY2F0b3JWYWx1ZSA+PSBpbmRleCkge1xyXG4gICAgICAgIHJldHVybiBgc21hcnQtaW5kaWNhdG9yLSR7aW5kZXh9YDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5kaWNhdG9yU3RhdHVzTGFiZWxDb2xvcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUpO1xyXG4gICAgaWYgKHZhbHVlID4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvckxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItbGFiZWwtJHt0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItbGFiZWwtJHt2YWx1ZX1gO1xyXG4gIH1cclxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUpO1xyXG4gICAgaWYgKHZhbHVlID4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvckxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JTdGF0dXNMYWJlbHNbXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvckxlbmd0aCAtIDFcclxuICAgICAgXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yU3RhdHVzTGFiZWxzW3ZhbHVlXTtcclxuICB9XHJcblxyXG4gIHVwbG9hZChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgdHlwZSA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxyXG4gICAgICB0eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVJcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgLi4uZXZlbnQudWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBfZmlsZXM6IGV2ZW50LmZpbGVzLFxyXG4gICAgICBwYXJhbTogJ19maWxlcycsXHJcbiAgICB9O1xyXG4gICAgZXZlbnQudWlBY3Rpb24ucGFyYW1zID0gcGFyYW1zO1xyXG5cclxuICAgIHRoaXMuc21hcnRDb21wb25lbnQuZXhlY3V0ZVVpQWN0aW9uKGV2ZW50LnVpQWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbjogVWlBY3Rpb24pOiB2b2lkIHtcclxuICAgIGxldCB0eXBlID0gdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlO1xyXG4gICAgaWYgKHR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnNtYXJ0Q29tcG9uZW50LmV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRCdXR0b25UeXBlKGRlc2NyaXB0b3I6IGFueSk6IHN0cmluZyB7XHJcbiAgICBzd2l0Y2ggKGRlc2NyaXB0b3IudHlwZSkge1xyXG4gICAgICBjYXNlICdOT1JNQUwnOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1idXR0b24nO1xyXG4gICAgICBjYXNlICdGTEFUJzpcclxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtZmxhdC1idXR0b24nO1xyXG4gICAgICBjYXNlICdSQUlTRUQnOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1yYWlzZWQtYnV0dG9uJztcclxuICAgICAgY2FzZSAnU1RST0tFRCc6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLXN0cm9rZWQtYnV0dG9uJztcclxuICAgICAgY2FzZSAnSUNPTic6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWljb24tYnV0dG9uJztcclxuICAgICAgY2FzZSAnTUlOSV9GQUInOlxyXG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1taW5pLWZhYic7XHJcbiAgICAgIGNhc2UgJ0ZBQic6XHJcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWZhYic7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS5sb2coYFVuaGFuZGxlZCBhY3Rpb24gYnV0dG9uIHR5cGUgY2FzZTogJHtkZXNjcmlwdG9yLnR5cGV9YCk7XHJcbiAgICAgICAgcmV0dXJuIGBtYXQtYnV0dG9uYDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzT25seUljb24oZGVzY3JpcHRvcjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkZXNjcmlwdG9yLnR5cGUgPT09ICdJQ09OJyB8fCBkZXNjcmlwdG9yLnR5cGUgPT09ICdNSU5JX0ZBQicgfHwgZGVzY3JpcHRvci50eXBlID09PSAnRkFCJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uQnV0dG9uQ2xpY2tlZChpbnN0YW5jZTogU21hcnRCdXR0b24pOiB2b2lkIHtcclxuICAgIGlmIChpbnN0YW5jZS51aUFjdGlvbikge1xyXG4gICAgICBpbnN0YW5jZS5jYWxsYmFjayhpbnN0YW5jZS51aUFjdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbnN0YW5jZS5jYWxsYmFjayhpbnN0YW5jZS5rZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsdGVyKHZhbHVlOiBJbnB1dEV2ZW50KTogU21hcnRJdGVtPGFueT5bXSB7XHJcbiAgICBsZXQgZmlsdGVyVmFsdWUgPSAodmFsdWUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZTtcclxuICAgIHRoaXMudG9IaWdobGlnaHQgPSBmaWx0ZXJWYWx1ZTtcclxuXHJcbiAgICBpZiAoIWZpbHRlclZhbHVlKSB7XHJcbiAgICAgIGZpbHRlclZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMudG9IaWdobGlnaHQgPSBmaWx0ZXJWYWx1ZTtcclxuICAgIH1cclxuICAgIGZpbHRlclZhbHVlID0gZmlsdGVyVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEICYmXHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XHJcbiAgICApIHtcclxuICAgICAgY29uc3QgcmVzdWx0OiBTbWFydEl0ZW08YW55PltdID0gZmlsdGVyVmFsdWVcclxuICAgICAgICA/IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0LmZpbHRlcigob3B0aW9uOiBTbWFydEl0ZW08YW55PikgPT5cclxuICAgICAgICAgICAgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgOiB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdDtcclxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDAgJiYgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgdmFsdWVzIGFmdGVyIHRoZSBmaWx0ZXIgb3BlcmF0aW9uIGJ1dCB3ZSBmb3VuZCBub25lOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB0aGlzLndpZGdldEluc3RhbmNlLmZpbHRlckVycm9yTWVzc2FnZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyB3ZSBlaXRoZXIgZm91bmQgdmFsdWVzLCBvciB0aGVyZSB3ZXJlIG5vIHZhbHVlcyB0byBiZWdpbiB3aXRoOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuZXJyb3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBkYXRlRmlsdGVyKGQ6IERhdGUgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldE1hdHJpeERpc3BsYXlWYWx1ZShxdWVzdGlvbjogVmFsdWUsIGtleTogc3RyaW5nKSB7XHJcbiAgICAodGhpcy53aWRnZXRJbnN0YW5jZSBhcyBTbWFydE1hdHJpeCkudmFsdWVba2V5XS5maW5kKCh2YWx1ZTogVmFsdWUpID0+IHtcclxuICAgICAgaWYgKHZhbHVlLmNvZGUgPT0gcXVlc3Rpb24uY29kZSkgcmV0dXJuIHF1ZXN0aW9uLmRpc3BsYXlWYWx1ZTtcclxuICAgICAgZWxzZSByZXR1cm4gcXVlc3Rpb24uY29kZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlWWVhck1vbnRoUGlja2VkKHllYXJNb250aFZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLCB5ZWFyTW9udGhWYWx1ZSwgJzAwOjAwJyk7XHJcbiAgfVxyXG5cclxuICBjb21wYXJlSXRlbXMobzE6IGFueSwgbzI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZnVuY3Rpb24gY29udmVydChvYmo6IGFueSk6IGFueSB7XHJcbiAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICByZXR1cm4gb2JqLnJlcGxhY2UoL1xcLnZbMC05XSskLywgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcbiAgICAvLyBjYWxsaW5nIHRoaXMudHJ1bmNhdGVVcmkgZGlkbid0IHdvcmtcclxuICAgIC8vIFRPRE86IHVzZSB3aWRnZXQuc2VsZWN0aW9uLnBhcmFtZXRlciBmb3IgaWdub3JlVXJpVmVyc2lvbiAvIHN0cmljdFVyaUNvbXBhcmlzb247XHJcblxyXG4gICAgbGV0IHYxID0gY29udmVydChvMSk7XHJcbiAgICBsZXQgdjIgPSBjb252ZXJ0KG8yKTtcclxuICAgIHJldHVybiBkZWVwRXF1YWwodjEsIHYyKTtcclxuICB9XHJcblxyXG4gIHRydW5jYXRlVXJpKHVyaTogYW55KTogYW55IHtcclxuICAgIGlmICh1cmkgJiYgdHlwZW9mIHVyaSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgcmV0dXJuIHVyaS5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1cmk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVNYXRyaXhSb3cocXVlc3Rpb246IGFueSk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2cocXVlc3Rpb24pO1xyXG4gICAgKHRoaXMud2lkZ2V0SW5zdGFuY2UgYXMgU21hcnRNYXRyaXgpLmJ1dHRvbj8uY2FsbGJhY2sodGhpcy53aWRnZXRJbnN0YW5jZSwgcXVlc3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgaXNUb29sYmFyUHJlc2VudCgpOiBib29sZWFuIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUCB8fFxyXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSIHx8XHJcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVJcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS50b29sYmFySWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnRvb2xiYXJJZCAhPT0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0Q2hpcHNWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlWyduYW1lJ107XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCdkaXNwbGF5VmFsdWUnIGluIHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlWydkaXNwbGF5VmFsdWUnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBnZXRPcHRpb25zKGl0ZW1zOiBTbWFydEl0ZW1zPGFueT5bXSkge1xyXG4gICAgbGV0IHZhbHVlczogYW55W10gPSBbXTtcclxuICAgIGl0ZW1zLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklURU1fR1JPVVApIHtcclxuICAgICAgICBpdGVtLnZhbHVlTGlzdC5tYXAoKHZhbHVlOiBTbWFydEl0ZW08YW55PikgPT4ge1xyXG4gICAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNKSB7XHJcbiAgICAgICAgdmFsdWVzLnB1c2goaXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgY2xlYXJCdXR0b25EZXNjcmlwdG9yKCk6IFVpQWN0aW9uRGVzY3JpcHRvciB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0aXRsZTogJycsXHJcbiAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5SQUlTRUQsXHJcbiAgICAgIGljb246IHRoaXMuY29tcExpYiA9PT0gQ29tcG9uZW50TGlicmFyeS5QUklNRU5HID8gJ3RpbWVzJyA6ICdjbG9zZScsXHJcbiAgICAgIGljb25Qb3NpdGlvbjogSWNvblBvc2l0aW9uLlBSRSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBjbGVhckZpZWxkKGtleTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS5zZXRWYWx1ZSgnJyk7XHJcbiAgICB0aGlzLm9uQmx1cj8ubmV4dCh0aGlzLndpZGdldEluc3RhbmNlKTtcclxuICB9XHJcblxyXG4gIG9uVGV4dGFyZWFDaGFuZ2UodmFsdWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGEgPSB0aGlzLnNiNFRleHRhcmVhPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0YSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgdGEuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgICB0YS5zdHlsZS5oZWlnaHQgPSBgJHt0YS5zY3JvbGxIZWlnaHR9cHhgO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVCbHVyRXZlbnQoZXZlbnREYXRhOiBhbnkpIHtcclxuICAgIHRoaXMub25CbHVyPy5uZXh0KGV2ZW50RGF0YSk7XHJcbiAgICB0aGlzLmJsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh7XHJcbiAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhLFxyXG4gICAgICBraW5kOiB0aGlzLmdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKSxcclxuICAgICAgdmFsdWU6IHRoaXMuZm9ybS52YWx1ZVt0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xyXG4gIG9uRHJvcERvd25TaG93KCkge1xyXG4gICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xyXG4gIH1cclxuICBvbkRyb3BEb3duSW5wdXQoKSB7XHJcbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmRvcnBkb3duT3BlbmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FmZURyb3BEb3duQmx1cihldmVudDogYW55KSB7XHJcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXHJcbiAgICAvLyBhcyBpdCBcImVhdHNcIiB0aGUgZmlyc3QgY2xpY2tcclxuXHJcbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcpIHtcclxuICAgICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyT3BlbmluZyA9IGZhbHNlO1xyXG4gIG9uQ2FsZW5kYXJTaG93KCkge1xyXG4gICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSB0cnVlO1xyXG4gIH1cclxuICBvbkNhbGVuZGFySW5wdXQoKSB7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyT3BlbmluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2FmZUNhbGVuZGFyQmx1cihldmVudDogYW55KSB7XHJcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXHJcbiAgICAvLyBhcyBpdCBcImVhdHNcIiB0aGUgZmlyc3QgY2xpY2tcclxuXHJcbiAgICBpZiAodGhpcy5jYWxlbmRhck9wZW5pbmcpIHtcclxuICAgICAgdGhpcy5jYWxlbmRhck9wZW5pbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBsZXQgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xyXG5cclxuICAgIGlmIChpc05hTihwYXJzZWQuZ2V0VGltZSgpKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIERhdGU6JywgdmFsdWUpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IERhdGUoXHJcbiAgICAgIHBhcnNlZC5nZXRGdWxsWWVhcigpLFxyXG4gICAgICBwYXJzZWQuZ2V0TW9udGgoKSxcclxuICAgICAgcGFyc2VkLmdldERhdGUoKSxcclxuICAgICAgcGFyc2VkLmdldEhvdXJzKCksXHJcbiAgICAgIHBhcnNlZC5nZXRNaW51dGVzKCksXHJcbiAgICAgIHBhcnNlZC5nZXRTZWNvbmRzKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sTWVzc2FnZXMoY29udHJvbE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tjb250cm9sTmFtZV07XHJcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZvcm0uY29udHJvbHNbY29udHJvbE5hbWVdPy5lcnJvcnMgPz8ge307XHJcblxyXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXMoZXJyb3JzKVxyXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHR5cGVvZiBlcnJvcnNba2V5XSA9PT0gJ3N0cmluZycpXHJcbiAgICAgIC5tYXAoKGtleSkgPT4gKHtcclxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcclxuICAgICAgICBkZXRhaWw6IGVycm9yc1trZXldLFxyXG4gICAgICB9KSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZXJyb3JNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcclxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXHJcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxyXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxyXG4gICAgICApIHtcclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwICYmIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JNZXNzYWdlICE9IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlcy5wdXNoKHtcclxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgICAgICAgICAgIGRldGFpbDogdGhpcy53aWRnZXRJbnN0YW5jZS5zZXJ2ZXJFcnJvck1lc3NhZ2UsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzSHRtbCh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3QodGV4dCk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBwcmltZVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgIGNsYXNzPVwiY29udGFpbmVyXCJcclxuICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Zpc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiB3aWRnZXRJbnN0YW5jZS5pc1Zpc2libGVcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNPTlRBSU5FUlwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8c21hcnRmb3Jtd2lkZ2V0XHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgd2lkZ2V0IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXHJcbiAgICAgICAgICBbZm9ybV09XCJmb3JtXCJcclxuICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJjb250YWluZXItaXRlbVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXQuY3NzQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgW29uQmx1cl09XCJvbkJsdXJcIlxyXG4gICAgICAgICAgW29uVmFsdWVDaGFuZ2VdPVwib25WYWx1ZUNoYW5nZVwiXHJcbiAgICAgICAgICBbc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXT1cInNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVwiXHJcbiAgICAgICAgICBbYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZV09XCJibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgd2lkZ2V0LmtleSB9fVwiXHJcbiAgICAgICAgICBbbGFiZWxDb2xvcl09XCJsYWJlbENvbG9yXCJcclxuICAgICAgICA+PC9zbWFydGZvcm13aWRnZXQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyIHRleHRGaWVsZENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbCBbbmdDbGFzc109XCJ7IGhhc1Rvb2xiYXI6IGlzVG9vbGJhclByZXNlbnQoKSB9XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLm1hc2tcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICB0eXBlPVwie3sgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZCA/IChoaWRlUGFzc3dvcmQgPyAncGFzc3dvcmQnIDogJ3RleHQnKSA6ICcnIH19XCJcclxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHAtaW5wdXRNYXNrXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5tYXNrXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgW21hc2tdPVwid2lkZ2V0SW5zdGFuY2UubWFza1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAob25CbHVyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dEZpZWxkQnV0dG9uc1wiPlxyXG4gICAgICAgICAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXJcclxuICAgICAgICAgICAgICAjdG9vbGJhclxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRleHRGaWVsZFRvb2xiYXJcIlxyXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkUHJvcGVydGllcz8uY2xlYXJhYmxlKSB7XHJcbiAgICAgICAgICAgICAgPHVpLWFjdGlvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2FkZEJhc2ljQ2xhc3Nlc109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbZGVzY3JpcHRvcl09XCJjbGVhckJ1dHRvbkRlc2NyaXB0b3JcIlxyXG4gICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cImNsZWFyRmllbGQod2lkZ2V0SW5zdGFuY2Uua2V5KVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggIT0gMFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXHJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTlVNQkVSXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgaW5wdXRJZD1cIm1pbm1heFwiXHJcbiAgICAgICAgICAgICAgbW9kZT1cImRlY2ltYWxcIlxyXG4gICAgICAgICAgICAgIFttYXhdPVwid2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzID8/IG51bGxcIlxyXG4gICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCIwXCJcclxuICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAob25CbHVyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFRcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxwLWVkaXRvclxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHkgPT0gdHJ1ZSA/ICdkaXNhYmxlZEVkaXRvcicgOiAnJ1wiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFttb2R1bGVzXT1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCA/IGVtcHR5UXVpbGxUb29sYmFyIDogd2lkZ2V0SW5zdGFuY2UucXVpbGxNb2R1bGVzXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwid2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgIFtyZWFkT25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seSA/PyBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgW21heExlbmd0aF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKG9uVGV4dENoYW5nZSk9XCJvblByaW1lUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAob25UZXh0Q2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmltZS1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtbWVzc2FnZXNcclxuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxyXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXHJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU09SVEFCTEVcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICA+PC9saWItc29ydGFibGUtd2lkZ2V0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVJcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICA8cC1jYWxlbmRhclxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbaWNvbkRpc3BsYXldPVwiJ2lucHV0J1wiXHJcbiAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFttaW5EYXRlXT1cIlxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5taW5EYXRlID8/IG51bGwpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbbWF4RGF0ZV09XCJcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWF4RGF0ZSA/PyBudWxsKVxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvblNob3cpPVwib25DYWxlbmRhclNob3coKVwiXHJcbiAgICAgICAgICAgICAgKG9uSW5wdXQpPVwib25DYWxlbmRhcklucHV0KClcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2FmZUNhbGVuZGFyQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAob25DbGVhcik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2xvc2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJ5eS1tbS1kZFwiXHJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFtpY29uRGlzcGxheV09XCInaW5wdXQnXCJcclxuICAgICAgICAgICAgICBbc2hvd0ljb25dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW21pbkRhdGVdPVwiXHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFttYXhEYXRlXT1cIlxyXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5tYXhEYXRlID8/IG51bGwpXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBob3VyRm9ybWF0PVwiMjRcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgKG9uU2hvdyk9XCJvbkNhbGVuZGFyU2hvdygpXCJcclxuICAgICAgICAgICAgICAob25JbnB1dCk9XCJvbkNhbGVuZGFySW5wdXQoKVwiXHJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzYWZlQ2FsZW5kYXJCbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAob25DbG9zZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cInl5LW1tLWRkXCJcclxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgPHAtZHJvcGRvd25cclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9ucyh3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QpXCJcclxuICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmltZS1lcnJvclwiPlxyXG4gICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEVcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJnZXRPcHRpb25zKHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdClcIlxyXG4gICAgICAgICAgICAgIFtjaGVja21hcmtdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChvblBhbmVsU2hvdyk9XCJvbkRyb3BEb3duU2hvdygpXCJcclxuICAgICAgICAgICAgICAob25CbHVyKT1cInNhZmVEcm9wRG93bkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChvblBhbmVsSGlkZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxyXG4gICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNMYWJlbD1cInswfSBlbGVtIGtpdsOhbGFzenR2YVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1tZXNzYWdlc1xyXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXHJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcclxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1hcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCIgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCIgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiPlxyXG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cclxuICAgICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzYjQtdGV4dGFyZWFcIlxyXG4gICAgICAgICAgICAgICNzYjRUZXh0YXJlYVxyXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRhcmVhXHJcbiAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgY29scz1cIjMwXCJcclxuICAgICAgICAgICAgICBbcm93c109XCJ3aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcz8ubWluUm93cyA/PyAxXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIgXCJcclxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVGV4dGFyZWFDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAgIFtmb3JdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW1lc3NhZ2VzXHJcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcclxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxyXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxyXG4gICAgICAgID48L3AtbWVzc2FnZXM+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XHJcbiAgICAgICAgICAgIDxwLWNoaXBzXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyB3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgIFttYXhdPVwiMFwiXHJcbiAgICAgICAgICAgICAgW21heExlbmd0aF09XCIwXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICAob25CbHVyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+IHt7IGdldENoaXBzVmFsdWUoaXRlbSkgfX0gPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLWNoaXBzPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cclxuICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxyXG4gICAgICAgICAgICAjdG9vbGJhclxyXG4gICAgICAgICAgICAqbmdJZj1cImlzVG9vbGJhclByZXNlbnQoKVwiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkXCJcclxuICAgICAgICAgID48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMXCJcclxuICAgICAgICBjbGFzcz1cImxhYmVsIHdpZGdldENvbnRhaW5lclwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXRpdGxlIGxhYmVsQ29udGFpbmVyXCIgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS53aWRnZXREZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgICA8cD57eyB3aWRnZXRJbnN0YW5jZS53aWRnZXREZXNjcmlwdGlvbiB9fTwvcD5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNtYXJ0LWZpbGUtZWRpdG9yXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcclxuICAgICAgICAgICAgICAodXBsb2FkRmlsZXNFdmVudCk9XCJ1cGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxyXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8c21hcnQtbXVsdGktZmlsZS1lZGl0b3JcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAoZmlsZUV2ZW50KT1cImV4ZWN1dGVVaUFjdGlvbigkZXZlbnQudWlBY3Rpb24pXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lciBpbWFnZUNvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcblxyXG4gICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzIS5pbWFnZVwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgIFtpbWFnZVJlc291cmNlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmltYWdlQ3NzID8/ICcnIH19XCJcclxuICAgICAgICAgICAgYWx0PVwiSW1hZ2VcIlxyXG4gICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5UT0dHTEVcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyIHRvZ2dsZS1jb2xcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8bGFiZWwgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiIFtmb3JdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDxwLWlucHV0U3dpdGNoXHJcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxyXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBuYW1lPVwie3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XCJcclxuICAgICAgICAgIChvbkNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudClcIlxyXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXHJcbiAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXHJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWFwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveC1pdGVtLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDxwLWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XHJcbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgY2hlY2tib3ggd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJjaGVja2JveC1zZWN0aW9uXCIgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIj5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjaGVja2JveCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3Q7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjaGVja2JveC5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0taW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgW3NyY109XCJjaGVja2JveC5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8cC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSArICcuJyArIGNoZWNrYm94LmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjaGVja2JveC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cImNoZWNrYm94LmxhYmVsXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcclxuICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcclxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXHJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ESVYpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGNsYXNzPVwic21hcnREaXZcIlxyXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkpXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwod2lkZ2V0SW5zdGFuY2UudmFsdWUpXCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICA+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbn0gQGVsc2Uge1xyXG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXIgbWF0ZXJpYWxcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXZcclxuICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJydcIlxyXG4gICAgICBjbGFzcz1cImNvbnRhaW5lclwiXHJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNtYXJ0Zm9ybXdpZGdldFxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHdpZGdldCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXHJcbiAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0XCJcclxuICAgICAgICAgIGNsYXNzPVwiY29udGFpbmVyLWl0ZW1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0LmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgICAgIFtvbkJsdXJdPVwib25CbHVyXCJcclxuICAgICAgICAgIFtvblZhbHVlQ2hhbmdlXT1cIm9uVmFsdWVDaGFuZ2VcIlxyXG4gICAgICAgICAgW3NvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZV09XCJzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ7eyB3aWRnZXQua2V5IH19XCJcclxuICAgICAgICAgIFtsYWJlbENvbG9yXT1cImxhYmVsQ29sb3JcIlxyXG4gICAgICAgID48L3NtYXJ0Zm9ybXdpZGdldD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKGNhcHNMb2NrKT1cImNhcHNPbiA9ICRldmVudFwiXHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dEZpZWxkIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5pbnB1dG1vZGVdPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlID8gd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAndGV4dCdcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgW3R5cGVdPVwiJ3N0cmluZydcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gKGhpZGVQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpIDogJycgfX1cIlxyXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbktleWRvd24oKVwiXHJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPCEtLSBbbWFza109XCJ3aWRnZXRJbnN0YW5jZS5tYXNrID8/ICcnXCIgLS0+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICcnIH19XCJcclxuICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJ0ZXh0RmllbGRBdXRvXCJcclxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkXCJcclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+e3sgaGlkZVBhc3N3b3JkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5JyB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZXh0RmllbGRBdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyZWRPcHRpb25zIHwgYXN5bmNcIiBbdmFsdWVdPVwib3B0aW9uLmxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcHRpb24ubGFiZWwgfCBoaWdobGlnaHQ6IHRvSGlnaGxpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiICpuZ0lmPVwiY2Fwc09uICYmIHdpZGdldEluc3RhbmNlLmlzUGFzc3dvcmRcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICA8c3BhbiBtYXRQcmVmaXg+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nSWNvbiA/PyAna2V5Ym9hcmRfY2Fwc2xvY2snXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaWNvbiAmJiB3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gPT09ICdQUkUnXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gbWF0U3VmZml4PlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaWNvbiAmJlxyXG4gICAgICAgICAgICAgICghd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uIHx8IHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BPU1QnKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dEZpZWxkQnV0dG9uc1wiPlxyXG4gICAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnRleHRGaWVsZFByb3BlcnRpZXM/LmNsZWFyYWJsZSkge1xyXG4gICAgICAgICAgICAgIDx1aS1hY3Rpb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIFthZGRCYXNpY0NsYXNzZXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JdPVwiY2xlYXJCdXR0b25EZXNjcmlwdG9yXCJcclxuICAgICAgICAgICAgICAgIChhY3Rpb25DbGljayk9XCJjbGVhckZpZWxkKHdpZGdldEluc3RhbmNlLmtleSlcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIG1hdC1idXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJ7eyB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY29sb3IgfX1cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNhbGxiYWNrKHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XHJcbiAgICAgICAgICAgICAgICAgIHNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbigpLlBSRSAmJiB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblxyXG4gICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxyXG4gICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvbkNvbG9yXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgICAgPnt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aFxyXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgICA+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdlxyXG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX05VTUJFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB0ZXh0RmllbGQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCInbnVtYmVyJ1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBbbWluXT1cIndpZGdldEluc3RhbmNlLm1pblZhbHVlcyA/PyBudWxsXCJcclxuICAgICAgICAgICAgW21heF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgPz8gbnVsbFwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxyXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5wcmVmaXggfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2Uuc3VmZml4IH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxyXG4gICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBtYXQtYnV0dG9uXHJcbiAgICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jYWxsYmFjayh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxyXG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFNcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcExpc3QgYXJpYS1sYWJlbD1cInt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hpcC1yb3dcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IHZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAjY2hpcElucHV0XHJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBMaXN0XCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXHJcbiAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiY2hpcEF1dG9cIlxyXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxyXG4gICAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInNlbGVjdGVkKCRldmVudCwgd2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0TG9va3VwIGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiPlxyXG4gICAgICAgICAgICA8bWF0LWNoaXBcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmUodmFsdWUpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGdldENoaXBzVmFsdWUodmFsdWUpIH19XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LWNoaXA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdExvb2t1cFwiXHJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cImVtcHR5U2VwYXJhdG9yS2V5c0NvZGVzXCJcclxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxyXG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXHJcbiAgICAgICAgICAgICN0b29sYmFyXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxyXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9CT1hcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgY2xhc3M9XCJzYjQtdGV4dGFyZWFcIlxyXG4gICAgICAgICAgICAjc2I0VGV4dGFyZWFcclxuICAgICAgICAgICAgY29scz1cIjMwXCJcclxuICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxyXG4gICAgICAgICAgICBbY2RrQXV0b3NpemVNaW5Sb3dzXT1cIndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5taW5Sb3dzID8/IDFcIlxyXG4gICAgICAgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5tYXhSb3dzID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXHJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcclxuICAgICAgICAgICAgPnt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIC0gZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLmxlbmd0aFxyXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtaGludFxyXG4gICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlLmhpbnQgfHwgd2lkZ2V0SW5zdGFuY2UuaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXzJcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBjaGVja2JveC5rZXkgfX1cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNoZWNrYm94LnZhbHVlXCJcclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgcmFkaW8tc2VjdGlvbiB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8taXRlbS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgcmFkaW8gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJhZGlvLWl0ZW0taW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgW3NyY109XCJyYWRpby5pbWFnZVVybFwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcmFkaW8udmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHJhZGlvLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sgcmFkaW8ubGFiZWwgfX1cclxuICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVJcIlxyXG4gICAgICAgIGNsYXNzPVwiZGF0ZVBpY2tlciB3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgW21pbl09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcIlxyXG4gICAgICAgICAgICBbbWF4XT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWF4RGF0ZSA/PyBudWxsKVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgPG1hdC1oaW50PlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgICAgPC9tYXQtaGludD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gPGRpdlxyXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlwiXHJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsXCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50XCJcclxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXHJcbiAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiJGFueShwaWNrZXIpXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgPG5neC1tYXQtZGF0ZXRpbWUtcGlja2VyXHJcbiAgICAgICAgICAjcGlja2VyXHJcbiAgICAgICAgICBbc2hvd1NwaW5uZXJzXT1cInRydWVcIlxyXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcclxuICAgICAgICAgIFtzdGVwSG91cl09XCIxXCJcclxuICAgICAgICAgIFtzdGVwTWludXRlXT1cIjFcIlxyXG4gICAgICAgICAgW3N0ZXBTZWNvbmRdPVwiMTBcIlxyXG4gICAgICAgICAgW3RvdWNoVWldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIidwcmltYXJ5J1wiXHJcbiAgICAgICAgICBbZW5hYmxlTWVyaWRpYW5dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2Rpc2FibGVNaW51dGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW2hpZGVUaW1lXT1cImZhbHNlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC9uZ3gtbWF0LWRhdGV0aW1lLXBpY2tlcj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgIFtuZ3hNYXREYXRldGltZVBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcclxuICAgICAgICAgIChibHVyKT1cIm9uQmx1cj8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XHJcbiAgICAgICAgPC9tYXQtaGludD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUlwiXHJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVBpY2tlckNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCBkYXRlIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICNkYXRlSW5wdXRcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFttaW5dPVwiY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5taW5EYXRlID8/IG51bGwpXCJcclxuICAgICAgICAgICAgICBbbWF4XT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWF4RGF0ZSA/PyBudWxsKVwiXHJcbiAgICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxyXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZVBpY2tlckJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxyXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcclxuICAgICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XHJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDxtYXQtaGludD5cclxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxyXG4gICAgICAgICAgICA8L21hdC1oaW50PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxyXG4gICAgICAgICAgICAqbmdJZj1cImhhc0NyZWF0ZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQgdGltZVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxyXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICN0aW1lSW5wdXRcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxyXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25UaW1lUGlja2VyQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICAgIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXHJcbiAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA/IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIDogJycgfX1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpbm5lck9wdGlvbiBvZiBvcHRpb24udmFsdWVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlubmVyT3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGlubmVyT3B0aW9uLmxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwib3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFXCJcclxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xyXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcclxuICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXHJcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtbGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBtdWx0aXBsZVxyXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50LnZhbHVlKVwiXHJcbiAgICAgICAgICAgIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXHJcbiAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA/IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIDogJycgfX1cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1fR1JPVVBcIlxyXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpbm5lck9wdGlvbiBvZiBvcHRpb24udmFsdWVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImlubmVyT3B0aW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlubmVyT3B0aW9uLmlzRGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaW5uZXJPcHRpb24uaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImlubmVyT3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICAgPnt7IGlubmVyT3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi5pY29uXCJcclxuICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxyXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwib3B0aW9uLmljb25Db2xvclwiXHJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICA+e3sgb3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XHJcbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXHJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxyXG4gICAgICAgICAgICBtYXRTdWZmaXhcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XHJcbiAgICAgICAgPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUxcIlxyXG4gICAgICAgIGNsYXNzPVwibGFiZWwgd2lkZ2V0Q29udGFpbmVyXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWxDb250YWluZXJcIiBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiPlxyXG4gICAgICAgICAgPGg0XHJcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgIDxwPnt7IHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uIH19PC9wPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRJTUVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XHJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xyXG4gICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcclxuICAgICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcclxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB0aW1lIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcclxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbdHlwZV09XCIndGltZSdcIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwiZ2V0VGltZSgpXCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cclxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcclxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cclxuICAgICAgICAgIDxoNFxyXG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXHJcbiAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCAge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIHZhbHVlPVwie3sgd2lkZ2V0SW5zdGFuY2UudmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtsYWJlbFBvc2l0aW9uXT1cIndpZGdldEluc3RhbmNlLnRvZ2dsZUxhYmVsUG9zaXRpb24gPz8gJ2JlZm9yZSdcIlxyXG4gICAgICAgICAgICA+e3sgIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbCA/IHdpZGdldEluc3RhbmNlLmxhYmVsIDogJycgfX08L21hdC1zbGlkZS10b2dnbGVcclxuICAgICAgICAgID48c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcclxuICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBsYWJlbENvbnRhaW5lciB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21hcnRJbmRpY2F0b3Igd2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvckl0ZW1zIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCIgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpbmRpY2F0b3JJdGVtczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbmRpY2F0b3JJdGVtXCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JJdGVtQ2xhc3MoaSlcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxwIFtuZ0NsYXNzXT1cImdldEluZGljYXRvclN0YXR1c0xhYmVsQ29sb3IoKVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbCgpIH19XHJcbiAgICAgICAgICA8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8c21hcnQtZmlsZS1lZGl0b3JcclxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxyXG4gICAgICAgICAgICAodXBsb2FkRmlsZXNFdmVudCk9XCJ1cGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICAgIDxzbWFydC1tdWx0aS1maWxlLWVkaXRvclxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZpbGVFdmVudCk9XCJleGVjdXRlVWlBY3Rpb24oJGV2ZW50LnVpQWN0aW9uKVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyIGltYWdlQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICA8aDRcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuXHJcbiAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLmltYWdlUHJvcGVydGllcz8uaW1hZ2UpIHtcclxuICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS5pbWFnZVByb3BlcnRpZXM/LmltYWdlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuaW1hZ2VDc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcclxuICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cclxuICAgICAgICAgIH0gQGVsc2UgaWYgKHdpZGdldEluc3RhbmNlLnZhbHVlKSB7XHJcbiAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICAgICAgYWx0PVwiSW1hZ2VcIlxyXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWKSB7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2XCJcclxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwoZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpKVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNWR1wiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKHdpZGdldEluc3RhbmNlLnZhbHVlKVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXHJcbiAgICAgICAgPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxoclxyXG4gICAgICAgICAgY2xhc3M9XCJzbWFydERpdmlkZXIge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8aDRcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcclxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LWJ1dHRvblxyXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRCdXR0b25UeXBlKHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcilcIlxyXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5jb2xvclwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrZWQod2lkZ2V0SW5zdGFuY2UpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNPbmx5SWNvbih3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpOyB0aGVuIGljb25Pbmx5OyBlbHNlIHRleHRcIlxyXG4gICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaWNvbk9ubHk+XHJcbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cclxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Db2xvciA/P1xyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGV4dD5cclxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXHJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblBvc2l0aW9uID09PSAnUFJFJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Db2xvciA/P1xyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy50aXRsZSB9fVxyXG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb24gJiZcclxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uUG9zaXRpb24gPT09ICdQT1NUJ1xyXG4gICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxyXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIlxyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Db2xvciA/P1xyXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCJcclxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiYgd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcclxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XHJcbiAgICAgICAgPC9oND5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGVudFwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21Db21wb25lbnQ+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFRcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPGg0ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XHJcbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgICAgPC9oND5cclxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cclxuICAgICAgICAgIDxxdWlsbC1lZGl0b3JcclxuICAgICAgICAgICAgI3F1aWxsRWRpdG9yXHJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcclxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFttb2R1bGVzXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyBlbXB0eVF1aWxsVG9vbGJhciA6IHdpZGdldEluc3RhbmNlLnF1aWxsTW9kdWxlc1wiXHJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcclxuICAgICAgICAgICAgW21heExlbmd0aF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxyXG4gICAgICAgICAgICAob25Db250ZW50Q2hhbmdlZCk9XCJvblJpY2hUZXh0RWRpdG9yQ29udGVudENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+PC9xdWlsbC1lZGl0b3I+XHJcbiAgICAgICAgICA8bWF0LWhpbnRcclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcclxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0NoYXJhY3RlckxpbWl0U3VmZml4ICYmIHdpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXHJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICBhbGlnbj1cImVuZFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwicmljaC10ZXh0LWVkaXRvci1sZWV3YXktY291bnRlclwiXHJcbiAgICAgICAgICAgID57eyBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpIH19PC9tYXQtaGludFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNPUlRBQkxFXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cclxuICAgICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICAgIDwvaDQ+XHJcbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcclxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxyXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXHJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgICA+PC9saWItc29ydGFibGUtd2lkZ2V0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTUFUUklYXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XHJcbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cclxuICAgICAgICA8L2g0PlxyXG4gICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xyXG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxyXG4gICAgICAgIH19PC9tYXQtaGludD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8dGFibGUgY2xhc3M9XCJtYXRyaXhUYWJsZSB3aWRnZXRDb250ZW50XCI+XHJcbiAgICAgICAgPHRyPlxyXG4gICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICA8dGggY2xhc3M9XCJvcHRpb25MYWJlbFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uc1wiPlxyXG4gICAgICAgICAgICB7eyBvcHRpb24uZGlzcGxheVZhbHVlIH19XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBxdWVzdGlvbiBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZS5yb3dzOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICA8dGggY2xhc3M9XCJxdWVzdGlvbkxhYmVsXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbD57eyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgPC90aD5cclxuXHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJzZWxlY3RUZFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uczsgbGV0IGogPSBpbmRleFwiPlxyXG4gICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2UuaXNNdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBxdWVzdGlvbi5jb2RlXCJcclxuICAgICAgICAgICAgICBbbmFtZV09XCIncScgKyBpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24uY29kZVwiPiA8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNNdWx0aXBsZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiXHJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmtleSArICcuZGF0YS4nICsgcXVlc3Rpb24uY29kZSArICcuJyArIG9wdGlvbi5jb2RlXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlWydkYXRhJ11bcXVlc3Rpb24uY29kZV1bb3B0aW9uLmNvZGVdXCJcclxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgID48L21hdC1jaGVja2JveD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZW1vdmVNYXRyaXhSb3cocXVlc3Rpb24pXCJcclxuICAgICAgICAgICAgPjxzbWFydC1pY29uIGljb249XCJjbG9zZVwiPjwvc21hcnQtaWNvblxyXG4gICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XHJcbiAgICAgICAgPGg0XHJcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyB9fVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXHJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPHlvdXR1YmUtcGxheWVyXHJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcclxuICAgICAgICB2aWRlb0lkPVwie3sgd2lkZ2V0SW5zdGFuY2UudmlkZW9JZCB9fVwiXHJcbiAgICAgICAgW3dpZHRoXT1cIndpZGdldEluc3RhbmNlLndpZHRoXCJcclxuICAgICAgICBbaGVpZ2h0XT1cIndpZGdldEluc3RhbmNlLmhlaWdodFwiXHJcbiAgICAgICAgW3N0YXJ0U2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5zdGFydFNlY29uZHNcIlxyXG4gICAgICAgIFtlbmRTZWNvbmRzXT1cIndpZGdldEluc3RhbmNlLmVuZFNlY29uZHNcIlxyXG4gICAgICA+PC95b3V0dWJlLXBsYXllcj5cclxuICAgICAgPG1hdC1oaW50XHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fCB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXHJcbiAgICAgICAgXCJcclxuICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcclxuICAgICAgPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5NT05USF9QSUNLRVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWxcIj5cclxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxyXG4gICAgICAgIDwvaDQ+XHJcbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XHJcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XHJcbiAgICAgICAgfX08L21hdC1oaW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGxpYi1zbWFydC1tb250aC1waWNrZXJcclxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxyXG4gICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXHJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZVllYXJNb250aFBpY2tlZCgkZXZlbnQpXCJcclxuICAgICAgPjwvbGliLXNtYXJ0LW1vbnRoLXBpY2tlcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG59XHJcbiJdfQ==
1052
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LW5nLWNsaWVudC9zcmMvbGliL3NtYXJ0LWZvcm0vd2lkZ2V0cy9zbWFydGZvcm13aWRnZXQvc21hcnRmb3Jtd2lkZ2V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSS9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBYyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUYsT0FBTyxFQUNMLFlBQVksRUFFWixrQkFBa0IsR0FHbkIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUNqQixNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFt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LHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDRyw0QkFBNEI7c0JBQXBDLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFTaUIsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXO2dCQVd0QixvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTzlCLEtBQUs7c0JBQTlCLFNBQVM7dUJBQUMsYUFBYTtnQkFTRixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBR3BCLGlCQUFpQjtzQkFEaEIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBT1osV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNhLFlBQVk7c0JBQWhELFNBQVM7dUJBQUMsd0JBQXdCO2dCQUNPLGlCQUFpQjtzQkFBMUQsU0FBUzt1QkFBQyw2QkFBNkI7Z0JBcUloQixjQUFjO3NCQUFyQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ0UsY0FBYztzQkFBckMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09NTUEsIEVOVEVSIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBkZWVwRXF1YWwgfSBmcm9tICdmYXN0LWVxdWFscyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBDb250ZW50Q2hhbmdlLCBRdWlsbEVkaXRvckNvbXBvbmVudCwgUXVpbGxNb2R1bGVzIH0gZnJvbSAnbmd4LXF1aWxsJztcbmltcG9ydCB7IEVkaXRvclRleHRDaGFuZ2VFdmVudCB9IGZyb20gJ3ByaW1lbmcvZWRpdG9yJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb21wb25lbnRGYWN0b3J5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudC1mYWN0b3J5LXNlcnZpY2UvcHJvamVjdHMnO1xuaW1wb3J0IHtcbiAgSWNvblBvc2l0aW9uLFxuICBVaUFjdGlvbixcbiAgVWlBY3Rpb25CdXR0b25UeXBlLFxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXG4gIFVpQWN0aW9uVXBsb2FkRGVzY3JpcHRvcixcbn0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L2FwaSc7XG5pbXBvcnQgeyBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi92aWV3LWNvbnRleHQvc21hcnQtdWktYWN0aW9uL3VpLWFjdGlvbi10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDT01QT05FTlRfTElCUkFSWSxcbiAgQ29tcG9uZW50TGlicmFyeSxcbn0gZnJvbSAnLi4vLi4vLi4vdmlldy1jb250ZXh0L3V0aWxpdHkvY29tcG9uZW50TGlicmFyeSc7XG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xuaW1wb3J0IHtcbiAgU21hcnRGb3JtV2lkZ2V0RGlyZWN0aW9uLFxuICBTbWFydEZvcm1XaWRnZXRUeXBlLFxuICBTbWFydFdpZGdldEhpbnRQb3NpdGlvbkVudW0sXG59IGZyb20gJy4uLy4uL2FwaS9tb2RlbC9tb2RlbHMnO1xuaW1wb3J0IHsgU21hcnRGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NtYXJ0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFNtYXJ0QnV0dG9uLFxuICBTbWFydEZvcm1XaWRnZXQsXG4gIFNtYXJ0SXRlbSxcbiAgU21hcnRJdGVtcyxcbiAgU21hcnRNYXRyaXgsXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5mb3JtLW1vZGVsJztcbmltcG9ydCB7XG4gIFNtYXJ0Rm9ybVRleHRGaWVsZEJ1dHRvbkljb25Qb3NpdGlvbixcbiAgU21hcnRWYWxpZGF0b3IsXG4gIFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSxcbiAgVmFsdWUsXG59IGZyb20gJy4uLy4uL3NtYXJ0Zm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBTbWFydEZpbGVFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3NtYXJ0LWZpbGUtZWRpdG9yL3NtYXJ0LWZpbGUtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTbWFydE11bHRpRmlsZUVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvc21hcnQtbXVsdGktZmlsZS1lZGl0b3Ivc21hcnQtbXVsdGktZmlsZS1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBTbWFydFN1YmplY3QgfSBmcm9tICcuLi8uLi8uLi9zbWFydC1zdWJqZWN0L3Byb2plY3RzJztcbmV4cG9ydCBjbGFzcyBTbWFydFdpZGdldFNldHRpbmdzIHtcbiAgcHVibGljIHN0YXRpYyB1c2VVdGMgPSBmYWxzZTtcbn1cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NtYXJ0Zm9ybXdpZGdldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbWFydGZvcm13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zbWFydGZvcm13aWRnZXQuY29tcG9uZW50LmNzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgaGlkZVBhc3N3b3JkOiBib29sZWFuID0gdHJ1ZTtcblxuICBzbWFydENvbXBvbmVudDogYW55O1xuXG4gIGVycm9yTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuXG4gIEBJbnB1dCgpIGZvcm0hOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSB3aWRnZXRJbnN0YW5jZSE6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+O1xuICBASW5wdXQoKSBvbkJsdXI/OiBTdWJqZWN0PGFueT47XG4gIEBJbnB1dCgpIG9uVmFsdWVDaGFuZ2U/OiBTdWJqZWN0PGFueT47XG4gIEBJbnB1dCgpIGxhYmVsQ29sb3I/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcbiAgQElucHV0KCkgYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSE6IFN1YmplY3Q8U29waGlzdGljYXRlZFZhbHVlQ2hhbmdlPjtcblxuICBAT3V0cHV0KCkgdmFsdWVDbGVhcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgZXZlbnQ/OiBhbnk7XG4gICAga2V5OiBhbnk7XG4gIH0+KCk7XG5cbiAgc21hcnRGb3JtV2lkZ2V0VHlwZSA9IFNtYXJ0Rm9ybVdpZGdldFR5cGU7XG5cbiAgY2Fwc09uOiBhbnk7XG5cbiAgQFZpZXdDaGlsZCgnY2hpcElucHV0JykgY2hpcElucHV0Q2hpbGQ/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIGZpbHRlcmVkVmFsdWVMaXN0PzogT2JzZXJ2YWJsZTxzdHJpbmdbXSB8IHVuZGVmaW5lZD47XG5cbiAgaGFzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZXJyb3JLZXk/OiBzdHJpbmc7XG5cbiAgaW5kaWNhdG9ySXRlbXM/OiBhbnlbXTtcbiAgZGVmYXVsdERhdGU/OiBEYXRlO1xuICAvLyBjdXN0b21Db21wb25lbnRcbiAgQFZpZXdDaGlsZCgnY3VzdG9tQ29tcG9uZW50JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGN1c3RvbUNvbXBvbmVudFZjUmVmPzogVmlld0NvbnRhaW5lclJlZjtcbiAgY3VzdG9tQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgZmlsdGVyZWRPcHRpb25zPzogT2JzZXJ2YWJsZTxTbWFydEl0ZW08YW55PltdPjtcbiAgdG9IaWdobGlnaHQ6IHN0cmluZyA9ICcnO1xuXG4gIEBWaWV3Q2hpbGQoJ3F1aWxsRWRpdG9yJykgcXVpbGw/OiBRdWlsbEVkaXRvckNvbXBvbmVudDtcblxuICBpc0VudGVyUHJlc3NlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGlzRGF0ZVBpY2tlclJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgU21hcnRXaWRnZXRIaW50UG9zaXRpb24gPSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbkVudW07XG5cbiAgLy8gdG9vbGJhclxuICBAVmlld0NoaWxkKCd0b29sYmFyJykgdG9vbGJhcj86IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudDtcblxuICBAVmlld0NoaWxkcmVuKFNtYXJ0Zm9ybXdpZGdldENvbXBvbmVudClcbiAgY2hpbGRyZW5XaWRnZXRzUUw/OiBRdWVyeUxpc3Q8U21hcnRmb3Jtd2lkZ2V0Q29tcG9uZW50PjtcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XG4gIGVtcHR5UXVpbGxUb29sYmFyOiBRdWlsbE1vZHVsZXMgPSB7XG4gICAgdG9vbGJhcjogZmFsc2UsXG4gIH07XG5cbiAgQFZpZXdDaGlsZCgnc2I0VGV4dGFyZWEnKSBzYjRUZXh0YXJlYSE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoU21hcnRGaWxlRWRpdG9yQ29tcG9uZW50KSBmaWxlVXBsb2FkZXIhOiBTbWFydEZpbGVFZGl0b3JDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoU21hcnRNdWx0aUZpbGVFZGl0b3JDb21wb25lbnQpIG11bHRpRmlsZVVwbG9hZGVyPzogU21hcnRNdWx0aUZpbGVFZGl0b3JDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2ZTZXJ2aWNlOiBDb21wb25lbnRGYWN0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIEBJbmplY3QoQ09NUE9ORU5UX0xJQlJBUlkpIHB1YmxpYyBjb21wTGliOiBDb21wb25lbnRMaWJyYXJ5LFxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XG4gICAgKSB7XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdCA9IHRoaXMuc2VydmljZS5maWx0ZXJXaWRnZXRzQnlWaXNpYmlsaXR5KFxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlTGlzdFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uQmx1cj8ucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRFcnJvck1lc3NhZ2UodGhpcy53aWRnZXRJbnN0YW5jZSk7XG4gICAgICBpZiAodGhpcy5jb21wTGliID09PSB0aGlzLmNvbXBvbmVudExpYnJhcnkuUFJJTUVORykge1xuICAgICAgICB0aGlzLmdldENvbnRyb2xNZXNzYWdlcyh0aGlzLndpZGdldEluc3RhbmNlLmtleSEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIGhhbmRsZSBpbml0aWFsIGVycm9yIG1lc3NhZ2UgZnJvbSBzZXJ2ZXJcbiAgICB0aGlzLmdldEVycm9yTWVzc2FnZSh0aGlzLndpZGdldEluc3RhbmNlKTtcbiAgICAvLyB0aGlzLmdldENvbnRyb2xNZXNzYWdlcyh0aGlzLndpZGdldEluc3RhbmNlLmtleSEpO1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3I/LmluZGljYXRvckxlbmd0aCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckl0ZW1zID0gbmV3IEFycmF5PGFueT4odGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdGVQcm9wZXJ0eV0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUikge1xuICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlID1cbiAgICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmNoYW5nZUluZGljYXRvclN0YXR1cyh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSkge1xuICAgICAgICB0aGlzLmRlZmF1bHREYXRlID0gbmV3IERhdGUodGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTEQgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXG4gICAgKSB7XG4gICAgICBpZiAodGhpcy5vblZhbHVlQ2hhbmdlID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UgPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyZWRPcHRpb25zID0gdGhpcy5vblZhbHVlQ2hhbmdlIS5waXBlKFxuICAgICAgICBzdGFydFdpdGgoJycpLFxuICAgICAgICBtYXAoKHZhbHVlKSA9PiB0aGlzLl9maWx0ZXIodmFsdWUgfHwgJycpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSKSB7XG4gICAgICBsZXQgdmlkZW9JZCA9IHRoaXMucGFyc2VZb3V0dWJlVXJsKHRoaXMud2lkZ2V0SW5zdGFuY2UubGluayEpO1xuICAgICAgaWYgKHZpZGVvSWQpIHRoaXMud2lkZ2V0SW5zdGFuY2UudmlkZW9JZCA9IHZpZGVvSWQ7XG4gICAgICBjb25zdCB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcblxuICAgICAgdGFnLnNyYyA9ICdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGFnKTtcbiAgICB9XG5cbiAgICBsZXQgZm9ybUNvbnRyb2xzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZmlsdGVyKFxuICAgICAgKGtleTogc3RyaW5nKSA9PlxuICAgICAgICBrZXkgPT09IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IHx8IGtleS5zdGFydHNXaXRoKGAke3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS5gKVxuICAgICk7XG5cbiAgICBmb3JtQ29udHJvbHMubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUyAmJlxuICAgICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfTE9PS1VQXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUNoYW5nZTogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlID0ge1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBraW5kOiB0aGlzLmdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLm5leHQodmFsdWVDaGFuZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNvcGhpc3RpY2F0ZWRFdmVudEtpbmQoKTogJ3NlbGVjdGlvbicgfCAnYmFzaWMnIHtcbiAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVCB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVF9NVUxUSVBMRSB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJBRElPX0JVVFRPTlxuICAgICAgPyAnc2VsZWN0aW9uJ1xuICAgICAgOiAnYmFzaWMnO1xuICB9XG5cbiAgcGFyc2VZb3V0dWJlVXJsKHVybDogc3RyaW5nKSB7XG4gICAgdXJsLnJlcGxhY2UoJy9zaG9ydHMvJywgJy93YXRjaD92PScpO1xuXG4gICAgdmFyIHJlZ0V4cCA9IC9eLiooKHlvdXR1LmJlXFwvKXwodlxcLyl8KFxcL3VcXC9cXHdcXC8pfChlbWJlZFxcLyl8KHdhdGNoXFw/KSlcXD8/dj89PyhbXiMmP10qKS4qLztcbiAgICB2YXIgbWF0Y2ggPSB1cmwubWF0Y2gocmVnRXhwKTtcblxuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaFs3XS5sZW5ndGggPT0gMTEgPyBtYXRjaFs3XSA6IGZhbHNlO1xuICB9XG5cbiAgX2hhc0p1c3RDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGhhc0p1c3RDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNKdXN0Q2hhbmdlZDtcbiAgfVxuICBzZXQgaGFzSnVzdENoYW5nZWQoaGFzSnVzdENoYW5nZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9oYXNKdXN0Q2hhbmdlZCA9IGhhc0p1c3RDaGFuZ2VkO1xuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDI1MCkpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5faGFzSnVzdENoYW5nZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhc0NyZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXQnKSBkYXRlSW5wdXRDaGlsZD86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RpbWVJbnB1dCcpIHRpbWVJbnB1dENoaWxkPzogRWxlbWVudFJlZjtcblxuICBvbkRhdGVQaWNrZXJCbHVyKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICAgIHRoaXMuaGFuZGxlRGF0ZUNoYW5nZWQodGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5IV0udmFsdWUpO1xuICB9XG5cbiAgb25UaW1lUGlja2VyQmx1cihldmVudDogYW55KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmhhbmRsZUJsdXJFdmVudCh0aGlzLndpZGdldEluc3RhbmNlKTtcbiAgICB0aGlzLmhhbmRsZVRpbWVDaGFuZ2VkKHRoaXMuZm9ybS5jb250cm9sc1tgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWBdLnZhbHVlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgdGhpcy5jdXN0b21Db21wb25lbnRSZWYgPSB0aGlzLmNmU2VydmljZS5jcmVhdGVDb21wb25lbnQoXG4gICAgICAgIHRoaXMuY3VzdG9tQ29tcG9uZW50VmNSZWYhLFxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLmNvbXBvbmVudCxcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5pbnB1dFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29tcExpYiA9PT0gdGhpcy5jb21wb25lbnRMaWJyYXJ5Lk1BVEVSSUFMKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSIHx8XG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NT05USF9QSUNLRVJcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkID0gISF0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LnNvbWUoXG4gICAgICAgICAgKHNtYXJ0VmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4gc21hcnRWYWxpZGF0b3IudmFsaWRhdG9yID09PSBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHRpbWU7XG4gICAgICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlKTtcbiAgICAgICAgICBsZXQgaG91ciA9IFNtYXJ0V2lkZ2V0U2V0dGluZ3MudXNlVXRjID8gZGF0ZS5nZXRVVENIb3VycygpIDogZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICAgIGxldCBtaW4gPSBTbWFydFdpZGdldFNldHRpbmdzLnVzZVV0YyA/IGRhdGUuZ2V0VVRDTWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgdGltZSA9IFN0cmluZyhob3VyKS5wYWRTdGFydCgyLCAnMCcpICsgJzonICsgU3RyaW5nKG1pbikucGFkU3RhcnQoMiwgJzAnKTtcbiAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gbW9tZW50KGRhdGUpO1xuICAgICAgICAgIGNvbnN0IGRhdGVGb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV07XG4gICAgICAgICAgaWYgKGRhdGVGb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aW1lID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsaWRhdG9yczogVmFsaWRhdG9yRm5bXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzKSB7XG4gICAgICAgICAgdmFsaWRhdG9ycyA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsaWRhdG9ycz8ubWFwKCh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnZhbGlkYXRvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGltZSwgdmFsaWRhdG9ycyk7XG5cbiAgICAgICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCkge1xuICAgICAgICAgIHRpbWVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChgJHt0aGlzLndpZGdldEluc3RhbmNlLmtleX0tdGltZWAsIHRpbWVGb3JtQ29udHJvbCk7XG5cbiAgICAgICAgdGhpcy5oYXNDcmVhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKF9tb21lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2Ake3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5fS10aW1lYF0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0aW1lVmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUaW1lQ2hhbmdlZCh0aW1lVmFsdWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfUElDS0VSKSB7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0aW1lVmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbWVWYWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmRlZmF1bHREYXRlID0gbmV3IERhdGUodGltZVZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVmYXVsdERhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YICYmXG4gICAgICB0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnRleHRCb3hQcm9wZXJ0aWVzPy5tYXhSb3dzICYmXG4gICAgICB0aGlzLnNiNFRleHRhcmVhXG4gICAgKSB7XG4gICAgICB2YXIgdGV4dGFyZWEgPSB0aGlzLnNiNFRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRleHRhcmVhKTtcblxuICAgICAgdmFyIG1heExpbmVzID0gdGhpcy53aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcy5tYXhSb3dzO1xuICAgICAgdmFyIGxpbmVIZWlnaHQgPSBwYXJzZUludChzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNiNC10ZXh0YXJlYS1saW5lLWhlaWdodCcpKSB8fCAyMDtcblxuICAgICAgdmFyIHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KHN0eWxlLnBhZGRpbmdUb3ApIHx8IDA7XG4gICAgICB2YXIgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0JvdHRvbSkgfHwgMDtcblxuICAgICAgdmFyIHZlcnRpY2FsRXh0cmFzID0gcGFkZGluZ1RvcCArIHBhZGRpbmdCb3R0b207XG5cbiAgICAgIHRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRleHRhcmVhLnN0eWxlLm1heEhlaWdodCA9IGAke2xpbmVIZWlnaHQgKiBtYXhMaW5lcyArIHZlcnRpY2FsRXh0cmFzfXB4YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiYgdGhpcy5maWxlVXBsb2FkZXIpIHtcbiAgICAgIHRoaXMudG9vbGJhciA9IHRoaXMuZmlsZVVwbG9hZGVyLnRvb2xiYXI7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcbiAgICAgIHRoaXMubXVsdGlGaWxlVXBsb2FkZXJcbiAgICApIHtcbiAgICAgIHRoaXMudG9vbGJhciA9IHRoaXMubXVsdGlGaWxlVXBsb2FkZXIudG9vbGJhcjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVEYXRlQ2hhbmdlZChfbW9tZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpc0RhdGVGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5kYXRlSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBpc1RpbWVGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXTtcbiAgICBjb25zdCB0aW1lRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXTtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXG4gICAgICB0aW1lRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXG4gICAgICAhX21vbWVudFxuICAgICkge1xuICAgICAgdGltZUZvcm1Db250cm9sLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxuICAgICAgIXRpbWVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcbiAgICAgIF9tb21lbnRcbiAgICApIHtcbiAgICAgIHRpbWVGb3JtQ29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuXG4gICAgICBpZiAodGltZUZvcm1Db250cm9sLnZhbHVlID09PSAnJykge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICB0aW1lRm9ybUNvbnRyb2wuc2V0VmFsdWUobm93LmdldEhvdXJzKCkgKyAnOicgKyBub3cuZ2V0TWludXRlcygpKTtcbiAgICAgICAgdGltZUZvcm1Db250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghX21vbWVudCB8fCBpc0RhdGVGb2N1c2VkIHx8IGlzVGltZUZvY3VzZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNKdXN0Q2hhbmdlZCkge1xuICAgICAgdGhpcy5oYXNKdXN0Q2hhbmdlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpbWVWYWx1ZSA9IHRpbWVGb3JtQ29udHJvbC52YWx1ZSB8fCAnMDA6MDAnO1xuICAgIHRoaXMuaGFzSnVzdENoYW5nZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSKSB7XG4gICAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2wsIF9tb21lbnQsIHRpbWVWYWx1ZSk7XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlID0gZGF0ZUZvcm1Db250cm9sLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRpbWVDaGFuZ2VkKHRpbWVWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaXNGb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50aW1lSW5wdXRDaGlsZD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBkYXRlRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXTtcbiAgICBjb25zdCB0aW1lRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uY29udHJvbHNbYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5rZXl9LXRpbWVgXTtcblxuICAgIGlmIChcbiAgICAgICF0aGlzLmlzRGF0ZVBpY2tlclJlcXVpcmVkICYmXG4gICAgICBkYXRlRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpICYmXG4gICAgICAhdGltZVZhbHVlXG4gICAgKSB7XG4gICAgICBkYXRlRm9ybUNvbnRyb2wucmVtb3ZlVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgIGRhdGVGb3JtQ29udHJvbC5zZXRWYWx1ZShkYXRlRm9ybUNvbnRyb2wudmFsdWUgPz8gJycpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAhdGhpcy5pc0RhdGVQaWNrZXJSZXF1aXJlZCAmJlxuICAgICAgIWRhdGVGb3JtQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkgJiZcbiAgICAgIHRpbWVWYWx1ZVxuICAgICkge1xuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuXG4gICAgLy8gaWYgKGlzRm9jdXNlZCkge1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLmhhc0p1c3RDaGFuZ2VkKSB7XG4gICAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aW1lVmFsdWUpIHtcbiAgICAgIGlmICh0aW1lRm9ybUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgICAgIHRpbWVGb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBfbW9tZW50ID0gZGF0ZUZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgaWYgKCFfbW9tZW50KSB7XG4gICAgICBfbW9tZW50ID0gbW9tZW50KCk7IC8vIG9yIG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpIGlmIHlvdSBwcmVmZXJcbiAgICB9XG5cbiAgICB0aGlzLmhhc0p1c3RDaGFuZ2VkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVIpIHtcbiAgICAgIHRoaXMuc2V0RGF0ZUZvcm1Db250cm9sKGRhdGVGb3JtQ29udHJvbCwgX21vbWVudCwgdGltZVZhbHVlKTtcblxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IGRhdGVGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgIHRoaXMub25WYWx1ZUNoYW5nZT8ubmV4dCh0aGlzLndpZGdldEluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldERhdGVGb3JtQ29udHJvbChkYXRlRm9ybUNvbnRyb2w6IGFueSwgX21vbWVudDogYW55LCB0aW1lVmFsdWU6IHN0cmluZykge1xuICAgIGlmIChfbW9tZW50KSB7XG4gICAgICBsZXQgaG91ciA9IHRpbWVWYWx1ZS5zdWJzdHJpbmcoMCwgMik7XG4gICAgICBsZXQgbWluID0gdGltZVZhbHVlLnN1YnN0cmluZygzLCA1KTtcblxuICAgICAgY29uc3QgbmV3TW9tZW50ID0gbW9tZW50KF9tb21lbnQpLnNldCh7XG4gICAgICAgIGhvdXI6ICtob3VyLFxuICAgICAgICBtaW51dGU6ICttaW4sXG4gICAgICAgIHNlY29uZDogMCxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDAsXG4gICAgICB9KTtcblxuICAgICAgZGF0ZUZvcm1Db250cm9sLnNldFZhbHVlKG5ld01vbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGltZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9USU1FX1BJQ0tFUikge1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzFdLnN1YnN0cmluZygwLCA1KTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBvbktleWRvd24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0VudGVyUHJlc3NlZCA9IHRydWU7XG5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuaXNFbnRlclByZXNzZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRW50ZXJQcmVzc2VkKSB7XG4gICAgICB0aGlzLmhpZGVQYXNzd29yZCA9ICF0aGlzLmhpZGVQYXNzd29yZDtcbiAgICB9XG4gIH1cblxuICBnZXROZ0NsYXNzKCk6IHsgW2NsYXNzTmFtZTogc3RyaW5nXTogYm9vbGVhbiB9IHtcbiAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdDbGFzc2VzKHRoaXMud2lkZ2V0SW5zdGFuY2Uuc3R5bGUpO1xuICB9XG5cbiAgZ2V0U3R5bGUoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfSB7XG4gICAgaWYgKCF0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKSB7XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlID0ge1xuICAgICAgICBjbGFzc2VzVG9BZGQ6IFtdLFxuICAgICAgICBjbGFzc2VzVG9SZW1vdmU6IFtdLFxuICAgICAgICBzdHlsZToge30sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghKCd3aWR0aCcgaW4gdGhpcy53aWRnZXRJbnN0YW5jZS5zdHlsZS5zdHlsZSkgJiYgJ21pbldpZHRoJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlLnN0eWxlWyd3aWR0aCddID0gYCR7dGhpcy53aWRnZXRJbnN0YW5jZS5taW5XaWR0aH1weGA7XG4gICAgfVxuICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ1N0eWxlcyh0aGlzLndpZGdldEluc3RhbmNlLnN0eWxlKTtcbiAgfVxuXG4gIGdldExhYmVsTmdDbGFzcygpOiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gICAgaWYgKCdsYWJlbFN0eWxlJyBpbiB0aGlzLndpZGdldEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gU21hcnRTdHlsZVV0aWxpdHkuZ2V0TmdDbGFzc2VzKHRoaXMud2lkZ2V0SW5zdGFuY2UubGFiZWxTdHlsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgZ2V0TGFiZWxTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9IHtcbiAgICBpZiAoJ2xhYmVsU3R5bGUnIGluIHRoaXMud2lkZ2V0SW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBTbWFydFN0eWxlVXRpbGl0eS5nZXROZ1N0eWxlcyh0aGlzLndpZGdldEluc3RhbmNlLmxhYmVsU3R5bGUpO1xuICAgIH1cblxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgaGFuZGxlciBmb3IgdGhlIHBvdGVudGlhbGx5IHByZXNlbnQgUXVpbGwgZWRpdG9yLCBlbmZvcmNpbmcgbWF4IGxlbmd0aCBsaW1pdHMgaWZcbiAgICogbmVjZXNzYXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gY2hhbmdlIHRoZSB7QGxpbmsgQ29udGVudENoYW5nZX0gdGhlIFF1aWxsIGVkaXRvciBlbWl0c1xuICAgKiBAcmV0dXJucyB7QGNvZGUgdm9pZH1cbiAgICovXG4gIG9uUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZChjaGFuZ2U6IENvbnRlbnRDaGFuZ2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xuICAgIGlmIChjaGFuZ2UudGV4dC5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5zZXJ0T3BDb3VudDogbnVtYmVyID0gY2hhbmdlLmRlbHRhLm9wcz8uZmlsdGVyKChpdCkgPT4gISFpdC5pbnNlcnQpLmxlbmd0aCA/PyAwO1xuICAgIGlmIChpbnNlcnRPcENvdW50ID4gMCkge1xuICAgICAgdGhpcy5xdWlsbD8ucXVpbGxFZGl0b3Iuc2V0Q29udGVudHMoY2hhbmdlLm9sZERlbHRhLCAnc2lsZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgb25QcmltZVJpY2hUZXh0RWRpdG9yQ29udGVudENoYW5nZWQoY2hhbmdlOiBFZGl0b3JUZXh0Q2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gd2UgYXJlIHBlcm1pdHRlZCBhIG51bWJlciBvbmUgZ3JlYXRlciB0aGFuIHRoZSByZXF1ZXN0ZWQ6IFRoZSBxdWlsbCBlZGl0b3IgY29udGFpbnMgYW5cbiAgICAvLyB1bnJlbW92YWJsZSBuZXctbGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiBpdHMgY29udGVudC5cbiAgICBjb25zdCBtYXhMZW5ndGg6IG51bWJlciA9IHRoaXMud2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoICsgMTtcbiAgICBpZiAoY2hhbmdlLnRleHRWYWx1ZS5sZW5ndGggPD0gbWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgdXNlci1zcGFjZSBjaGFyYWN0ZXJzIGFsbG93ZWQgdG8gYmUgZW50ZXJlZCBpbnRvIHRoZSBRdWlsbFxuICAgKiBlZGl0b3IuXG4gICAqXG4gICAqIDxwPlxuICAgKiBUaGUgcmVhbCBsZW5ndGggb2YgdGhlIGVkaXRvcidzIGNvbnRlbnQgbWF5IGJlIG11Y2ggbG9uZ2VyIC0gYXMgaXQgaXMgcGVyc2lzdGVkIGFzIGFuIEhUTUxcbiAgICogZG9jdW1lbnQgZnJhZ21lbnQgYmVoaW5kIHRoZSBzY2VuZXMuIFRoaXMgbWV0aG9kIGlzIGNvbmNlcm5lZCBieSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhlXG4gICAqIHVzZXIgcGVyY2VpdmVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUge0BsaW5rIG51bWJlcn0gb2YgcmVtYWluaW5nIHBlcm1pdHRlZCBjaGFyYWN0ZXJzIHRoZSB1c2VyIG1heSBpbnB1dCwgb3Ige0Bjb2RlIC0xfVxuICAgKiAgICAgICAgICBpZiB0aGUgbGVld2F5IGlzIG5vdCBpbnRlcnByZXRlZCBpbiB0aGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICAgKi9cbiAgZ2V0UmljaFRleHRFZGl0b3JMZW5ndGhMZWV3YXkoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlJJQ0hfVEVYVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvLyB3ZSBhcmUgcGVybWl0dGVkIGEgbnVtYmVyIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJlcXVlc3RlZDogVGhlIHF1aWxsIGVkaXRvciBjb250YWlucyBhblxuICAgIC8vIHVucmVtb3ZhYmxlIG5ldy1saW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIGl0cyBjb250ZW50LlxuICAgIGNvbnN0IG1heExlbmd0aDogbnVtYmVyID0gdGhpcy53aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggKyAxO1xuICAgIGlmICh0aGlzLnF1aWxsKSB7XG4gICAgICAvLyB0aGlzIGlzIHRoZSBpbnRlbmRlZCBwYXRoICh1c2VyIGlucHV0KTpcbiAgICAgIHJldHVybiBtYXhMZW5ndGggLSB0aGlzLnF1aWxsLnF1aWxsRWRpdG9yLmdldFRleHQoKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gZmFsbGJhY2sgdG8gdGhlIHJhdyBIVE1MIGNvbnRlbnQ6XG4gICAgcmV0dXJuIG1heExlbmd0aCAtIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoO1xuICB9XG5cbiAgYWRkT25CbHVyID0gdHJ1ZTtcbiAgcmVhZG9ubHkgc2VwYXJhdG9yS2V5c0NvZGVzID0gW0VOVEVSLCBDT01NQV0gYXMgY29uc3Q7XG4gIHJlYWRvbmx5IGVtcHR5U2VwYXJhdG9yS2V5c0NvZGVzID0gW10gYXMgY29uc3Q7XG5cbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHRoaXMuc2V0VGV4dEZpZWxkQ2hpcHNWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XG4gICAgICAgIGtleTogdGhpcy53aWRnZXRJbnN0YW5jZS5rZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxuICAgICAgICBraW5kOiAnc2VsZWN0aW9uJyxcbiAgICAgIH07XG4gICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgdGhlIGlucHV0IHZhbHVlXG4gICAgZXZlbnQuY2hpcElucHV0IS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybS5jb250cm9sc1t0aGlzLndpZGdldEluc3RhbmNlLmtleV0ubWFya0FzVG91Y2hlZCgpO1xuICB9XG5cbiAgcmVtb3ZlKHZhbHVlOiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTIHx8XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVBcbiAgICApIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5pbmRleE9mKHZhbHVlKTtcblxuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgY29uc3QgdmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSA9IHtcbiAgICAgICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5LFxuICAgICAgICAgIHZhbHVlOiB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxuICAgICAgICAgIGtpbmQ6ICdzZWxlY3Rpb24nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCwgd2lkZ2V0SW5zdGFuY2U6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+KTogdm9pZCB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQub3B0aW9uLnZpZXdWYWx1ZTtcbiAgICBpZiAodGhpcy5zZXRUZXh0RmllbGRDaGlwc1ZhbHVlKHZhbHVlKSkge1xuICAgICAgaWYgKFxuICAgICAgICB3aWRnZXRJbnN0YW5jZS50eXBlID09PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERfQ0hJUFMgfHxcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UgPSB7XG4gICAgICAgICAga2V5OiB3aWRnZXRJbnN0YW5jZS5rZXksXG4gICAgICAgICAgdmFsdWU6IHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlLFxuICAgICAgICAgIGtpbmQ6ICdzZWxlY3Rpb24nLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZS5uZXh0KHZhbHVlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFRleHRGaWVsZENoaXBzVmFsdWUodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9DSElQUykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAodGhpcy53aWRnZXRJbnN0YW5jZS5tYXhWYWx1ZXMgJiZcbiAgICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbHVlIS5sZW5ndGggPCB0aGlzLndpZGdldEluc3RhbmNlLm1heFZhbHVlcykgfHxcbiAgICAgICAgIXRoaXMud2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzXG4gICAgICApIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnZhbHVlKSB7XG4gICAgICAgICAgbGV0IHZhbHVlcyA9IG5ldyBBcnJheTxPYmplY3Q+KCk7XG4gICAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZSA9IHZhbHVlcztcbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXldLnNldFZhbHVlKHZhbHVlcyk7XG4gICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW3RoaXMud2lkZ2V0SW5zdGFuY2Uua2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXREaXJlY3Rpb24oKTogc3RyaW5nIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuUkFESU9fQlVUVE9OXG4gICAgKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLmRpcmVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJ2RpcmVjdGlvbi1yb3cnO1xuICAgIH0gZWxzZSBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5kaXJlY3Rpb24gPT09IFNtYXJ0Rm9ybVdpZGdldERpcmVjdGlvbi5DT0wpIHtcbiAgICAgIHJldHVybiAnZGlyZWN0aW9uLWNvbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnZGlyZWN0aW9uLXJvdyc7XG4gICAgfVxuICB9XG5cbiAgc21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uKCk6IHR5cGVvZiBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24ge1xuICAgIHJldHVybiBTbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb247XG4gIH1cblxuICBnZXRUeXBlKCk6IHR5cGVvZiBTbWFydEZvcm1XaWRnZXRUeXBlIHtcbiAgICByZXR1cm4gU21hcnRGb3JtV2lkZ2V0VHlwZTtcbiAgfVxuXG4gIGdldFdpZGdldExhYmVsKHdpZGdldDogU21hcnRGb3JtV2lkZ2V0PGFueT4pOiBzdHJpbmcge1xuICAgIGlmICh3aWRnZXQudHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgaWYgKHdpZGdldC5sYWJlbCA9PT0gJycpIHtcbiAgICAgIHJldHVybiB3aWRnZXQubGFiZWw7XG4gICAgfVxuICAgIGxldCBpc1JlcXVpcmVkID0gZmFsc2U7XG4gICAgaWYgKFxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRJTUUgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklORElDQVRPUiAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRklMRV9VUExPQURFUiAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UgJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlNWRyAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ESVZJREVSICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT04gJiZcbiAgICAgIHdpZGdldC50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVFxuICAgICkge1xuICAgICAgaXNSZXF1aXJlZCA9IHdpZGdldC52YWxpZGF0b3JzPy5sZW5ndGggPyB0aGlzLmZpZWxkSXNSZXF1aXJlZCgpICYmICEhd2lkZ2V0LnNob3dMYWJlbCA6IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAod2lkZ2V0LnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwpIHtcbiAgICAgIGlzUmVxdWlyZWQgPSB3aWRnZXQubWFya0FzUmVxdWlyZWQgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBgJHt3aWRnZXQubGFiZWx9JHtpc1JlcXVpcmVkID8gJyAqJyA6ICcnfWA7XG4gIH1cblxuICBzYW5pdGl6ZUh0bWwodmFsdWU/OiBzdHJpbmcpOiBTYWZlSHRtbCB8IG51bGwge1xuICAgIGxldCBzYWZlVmFsdWUgPSB2YWx1ZSA/PyAnJztcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoc2FmZVZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmllbGRJc1JlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIGxldCB2YWx1ZSA9IGZhbHNlO1xuICAgIGlmIChcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLlRJTUUgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuU1ZHICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkJVVFRPTiAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXG4gICAgKSB7XG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnZhbGlkYXRvcnM/LmZvckVhY2goKHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3IpID0+IHtcbiAgICAgICAgaWYgKHZhbGlkYXRvci52YWxpZGF0b3IgPT0gVmFsaWRhdG9ycy5yZXF1aXJlZCkgdmFsdWUgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNDdXN0b21FcnJvcih3aWRnZXQ6IFNtYXJ0Rm9ybVdpZGdldDxhbnk+LCB2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSICYmXG4gICAgICB3aWRnZXQudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTCAmJlxuICAgICAgd2lkZ2V0LnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuWU9VVFVCRV9QTEFZRVJcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0gJiYgdGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldLmVycm9ycykge1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0uZXJyb3JzISkubGVuZ3RoXG4gICAgICAgICAgPyB0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0LmtleV0/LmRpcnR5IHx8XG4gICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy50b3VjaGVkICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRvciAmJlxuICAgICAgICAgICAgICAodGhpcy5mb3JtLmNvbnRyb2xzW3dpZGdldC5rZXldPy5lcnJvcnMpIVt2YWxpZGF0b3IubmFtZV0pXG4gICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICh2YWxpZGF0b3IgJiYgaGFzRXJyb3IgJiYgIXRoaXMuZXJyb3JLZXkpIHx8XG4gICAgICAgICAgKHZhbGlkYXRvciAmJiBoYXNFcnJvciAmJiB0aGlzLmVycm9yS2V5ID09PSB2YWxpZGF0b3IubmFtZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9IGVsc2UgaWYgKCFoYXNFcnJvciAmJiB2YWxpZGF0b3IgJiYgdGhpcy5lcnJvcktleSA9PT0gdmFsaWRhdG9yLm5hbWUpIHtcbiAgICAgICAgICB0aGlzLmhhc0Vycm9yID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0RXJyb3JNZXNzYWdlKHdpZGdldEluc3RhbmNlOiBTbWFydEZvcm1XaWRnZXQ8YW55Pik6IGJvb2xlYW4ge1xuICAgIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcbiAgICBsZXQgZXJyb3JJY29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9ySWNvbkNvbG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHZhbGlkYXRvcjogU21hcnRWYWxpZGF0b3I7XG4gICAgaWYgKFxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTEFCRUwgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUiAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTUFHRSAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVIgJiZcbiAgICAgIHdpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXG4gICAgICB3aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJlxuICAgICAgd2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlxuICAgICkge1xuICAgICAgaWYgKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldICYmIHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5lcnJvcktleSAmJlxuICAgICAgICAgICFPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5pbmNsdWRlcyh0aGlzLmVycm9yS2V5ISlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICAgICAgaW5kZXggPCBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS5lcnJvcnMhKS5sZW5ndGg7XG4gICAgICAgICAgaW5kZXgrK1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBlcnJvcktleSA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9sc1t3aWRnZXRJbnN0YW5jZS5rZXldLmVycm9ycyEpW2luZGV4XTtcbiAgICAgICAgICBsZXQgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgPSB3aWRnZXRJbnN0YW5jZS52YWxpZGF0b3JzPy5maWx0ZXIoXG4gICAgICAgICAgICAodmFsaWRhdG9yOiBTbWFydFZhbGlkYXRvcikgPT4gdmFsaWRhdG9yLm5hbWUgPT09IGVycm9yS2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQgJiYgY3VzdG9tVmFsaWRhdG9yT25XaWRnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBjdXN0b21WYWxpZGF0b3JPbldpZGdldFswXS5lcnJvck1lc3NhZ2UhO1xuICAgICAgICAgICAgZXJyb3JJY29uID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbjtcbiAgICAgICAgICAgIGVycm9ySWNvbkNvbG9yID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF0uaWNvbkNvbG9yO1xuICAgICAgICAgICAgdmFsaWRhdG9yID0gY3VzdG9tVmFsaWRhdG9yT25XaWRnZXRbMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGN1c3RvbVZhbGlkYXRvck9uRm9ybSA9IHRoaXMuc2VydmljZS5zbWFydEZvcm0/LnZhbGlkYXRvcnM/LmZpbHRlcihcbiAgICAgICAgICAgICh2YWxpZGF0b3I6IFNtYXJ0VmFsaWRhdG9yKSA9PiB2YWxpZGF0b3IubmFtZSA9PT0gZXJyb3JLZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjdXN0b21WYWxpZGF0b3JPbkZvcm0gJiYgY3VzdG9tVmFsaWRhdG9yT25Gb3JtLmxlbmd0aCkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gY3VzdG9tVmFsaWRhdG9yT25Gb3JtWzBdLmVycm9yTWVzc2FnZSE7XG4gICAgICAgICAgICB2YWxpZGF0b3IgPSBjdXN0b21WYWxpZGF0b3JPbkZvcm1bMF07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaGFzQ3VzdG9tRXJyb3Iod2lkZ2V0SW5zdGFuY2UsIHZhbGlkYXRvciEpKSB7XG4gICAgICAgIHdpZGdldEluc3RhbmNlLmVycm9yID0gZXJyb3JNZXNzYWdlITtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gZXJyb3JJY29uO1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA9IGVycm9ySWNvbkNvbG9yO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZSkge1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZTtcbiAgICAgICAgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uID0gd2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JJY29uO1xuICAgICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA9IHdpZGdldEluc3RhbmNlLnNlcnZlckVycm9yQ29sb3I7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB3aWRnZXRJbnN0YW5jZS5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IuaW5kaWNhdG9yVmFsdWUgPj0gaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGBzbWFydC1pbmRpY2F0b3ItJHtpbmRleH1gO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgbGV0IHZhbHVlID0gTWF0aC5mbG9vcih0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yVmFsdWUpO1xuICAgIGlmICh2YWx1ZSA+IHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gYHNtYXJ0LWluZGljYXRvci1sYWJlbC0ke3RoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxfWA7XG4gICAgfVxuICAgIHJldHVybiBgc21hcnQtaW5kaWNhdG9yLWxhYmVsLSR7dmFsdWV9YDtcbiAgfVxuICBnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSU5ESUNBVE9SKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IodGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclZhbHVlKTtcbiAgICBpZiAodmFsdWUgPiB0aGlzLndpZGdldEluc3RhbmNlLmluZGljYXRvciEuaW5kaWNhdG9yTGVuZ3RoIC0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JTdGF0dXNMYWJlbHNbXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UuaW5kaWNhdG9yIS5pbmRpY2F0b3JMZW5ndGggLSAxXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aWRnZXRJbnN0YW5jZS5pbmRpY2F0b3IhLmluZGljYXRvclN0YXR1c0xhYmVsc1t2YWx1ZV07XG4gIH1cblxuICB1cGxvYWQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCB0eXBlID0gdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSICYmXG4gICAgICB0eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVJcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgLi4uZXZlbnQudWlBY3Rpb24ucGFyYW1zLFxuICAgICAgX2ZpbGVzOiBldmVudC5maWxlcyxcbiAgICAgIHBhcmFtOiAnX2ZpbGVzJyxcbiAgICB9O1xuICAgIGV2ZW50LnVpQWN0aW9uLnBhcmFtcyA9IHBhcmFtcztcblxuICAgIHRoaXMuc21hcnRDb21wb25lbnQuZXhlY3V0ZVVpQWN0aW9uKGV2ZW50LnVpQWN0aW9uKTtcbiAgfVxuXG4gIGV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbjogVWlBY3Rpb24pOiB2b2lkIHtcbiAgICBsZXQgdHlwZSA9IHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZTtcbiAgICBpZiAodHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5NVUxUSV9GSUxFX1VQTE9BREVSKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc21hcnRDb21wb25lbnQuZXhlY3V0ZVVpQWN0aW9uKHVpQWN0aW9uKTtcbiAgfVxuXG4gIGdldEJ1dHRvblR5cGUoZGVzY3JpcHRvcjogYW55KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGRlc2NyaXB0b3IudHlwZSkge1xuICAgICAgY2FzZSAnTk9STUFMJzpcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWJ1dHRvbic7XG4gICAgICBjYXNlICdGTEFUJzpcbiAgICAgICAgcmV0dXJuICdtYXQtbWRjLWZsYXQtYnV0dG9uJztcbiAgICAgIGNhc2UgJ1JBSVNFRCc6XG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1yYWlzZWQtYnV0dG9uJztcbiAgICAgIGNhc2UgJ1NUUk9LRUQnOlxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtc3Ryb2tlZC1idXR0b24nO1xuICAgICAgY2FzZSAnSUNPTic6XG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1pY29uLWJ1dHRvbic7XG4gICAgICBjYXNlICdNSU5JX0ZBQic6XG4gICAgICAgIHJldHVybiAnbWF0LW1kYy1taW5pLWZhYic7XG4gICAgICBjYXNlICdGQUInOlxuICAgICAgICByZXR1cm4gJ21hdC1tZGMtZmFiJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUubG9nKGBVbmhhbmRsZWQgYWN0aW9uIGJ1dHRvbiB0eXBlIGNhc2U6ICR7ZGVzY3JpcHRvci50eXBlfWApO1xuICAgICAgICByZXR1cm4gYG1hdC1idXR0b25gO1xuICAgIH1cbiAgfVxuXG4gIGlzT25seUljb24oZGVzY3JpcHRvcjogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRlc2NyaXB0b3IudHlwZSA9PT0gJ0lDT04nIHx8IGRlc2NyaXB0b3IudHlwZSA9PT0gJ01JTklfRkFCJyB8fCBkZXNjcmlwdG9yLnR5cGUgPT09ICdGQUInXG4gICAgKTtcbiAgfVxuXG4gIG9uQnV0dG9uQ2xpY2tlZChpbnN0YW5jZTogU21hcnRCdXR0b24pOiB2b2lkIHtcbiAgICBpZiAoaW5zdGFuY2UudWlBY3Rpb24pIHtcbiAgICAgIGluc3RhbmNlLmNhbGxiYWNrKGluc3RhbmNlLnVpQWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UuY2FsbGJhY2soaW5zdGFuY2Uua2V5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXIodmFsdWU6IElucHV0RXZlbnQpOiBTbWFydEl0ZW08YW55PltdIHtcbiAgICBsZXQgZmlsdGVyVmFsdWUgPSAodmFsdWUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZTtcbiAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gZmlsdGVyVmFsdWU7XG5cbiAgICBpZiAoIWZpbHRlclZhbHVlKSB7XG4gICAgICBmaWx0ZXJWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy50b0hpZ2hsaWdodCA9IGZpbHRlclZhbHVlO1xuICAgIH1cbiAgICBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCAmJlxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcbiAgICApIHtcbiAgICAgIGNvbnN0IHJlc3VsdDogU21hcnRJdGVtPGFueT5bXSA9IGZpbHRlclZhbHVlXG4gICAgICAgID8gdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QuZmlsdGVyKChvcHRpb246IFNtYXJ0SXRlbTxhbnk+KSA9PlxuICAgICAgICAgICAgb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmlsdGVyVmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICA6IHRoaXMud2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0O1xuICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDAgJiYgdGhpcy53aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIC8vIHRoZXJlIGNvdWxkIGJlIHZhbHVlcyBhZnRlciB0aGUgZmlsdGVyIG9wZXJhdGlvbiBidXQgd2UgZm91bmQgbm9uZTpcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5lcnJvciA9IHRoaXMud2lkZ2V0SW5zdGFuY2UuZmlsdGVyRXJyb3JNZXNzYWdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gd2UgZWl0aGVyIGZvdW5kIHZhbHVlcywgb3IgdGhlcmUgd2VyZSBubyB2YWx1ZXMgdG8gYmVnaW4gd2l0aDpcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZGF0ZUZpbHRlcihkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0TWF0cml4RGlzcGxheVZhbHVlKHF1ZXN0aW9uOiBWYWx1ZSwga2V5OiBzdHJpbmcpIHtcbiAgICAodGhpcy53aWRnZXRJbnN0YW5jZSBhcyBTbWFydE1hdHJpeCkudmFsdWVba2V5XS5maW5kKCh2YWx1ZTogVmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZS5jb2RlID09IHF1ZXN0aW9uLmNvZGUpIHJldHVybiBxdWVzdGlvbi5kaXNwbGF5VmFsdWU7XG4gICAgICBlbHNlIHJldHVybiBxdWVzdGlvbi5jb2RlO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlWWVhck1vbnRoUGlja2VkKHllYXJNb250aFZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnNldERhdGVGb3JtQ29udHJvbCh0aGlzLmZvcm0uY29udHJvbHNbdGhpcy53aWRnZXRJbnN0YW5jZS5rZXkhXSwgeWVhck1vbnRoVmFsdWUsICcwMDowMCcpO1xuICB9XG5cbiAgY29tcGFyZUl0ZW1zKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgICBmdW5jdGlvbiBjb252ZXJ0KG9iajogYW55KTogYW55IHtcbiAgICAgIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIG9iai5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIC8vIGNhbGxpbmcgdGhpcy50cnVuY2F0ZVVyaSBkaWRuJ3Qgd29ya1xuICAgIC8vIFRPRE86IHVzZSB3aWRnZXQuc2VsZWN0aW9uLnBhcmFtZXRlciBmb3IgaWdub3JlVXJpVmVyc2lvbiAvIHN0cmljdFVyaUNvbXBhcmlzb247XG5cbiAgICBsZXQgdjEgPSBjb252ZXJ0KG8xKTtcbiAgICBsZXQgdjIgPSBjb252ZXJ0KG8yKTtcbiAgICByZXR1cm4gZGVlcEVxdWFsKHYxLCB2Mik7XG4gIH1cblxuICB0cnVuY2F0ZVVyaSh1cmk6IGFueSk6IGFueSB7XG4gICAgaWYgKHVyaSAmJiB0eXBlb2YgdXJpID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHVyaS5yZXBsYWNlKC9cXC52WzAtOV0rJC8sICcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHVyaTtcbiAgfVxuXG4gIHJlbW92ZU1hdHJpeFJvdyhxdWVzdGlvbjogYW55KTogdm9pZCB7XG4gICAgY29uc29sZS5sb2cocXVlc3Rpb24pO1xuICAgICh0aGlzLndpZGdldEluc3RhbmNlIGFzIFNtYXJ0TWF0cml4KS5idXR0b24/LmNhbGxiYWNrKHRoaXMud2lkZ2V0SW5zdGFuY2UsIHF1ZXN0aW9uKTtcbiAgfVxuXG4gIGlzVG9vbGJhclByZXNlbnQoKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRCB8fFxuICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlID09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9MT09LVVAgfHxcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgfHxcbiAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSA9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLndpZGdldEluc3RhbmNlLnRvb2xiYXJJZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMud2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkICE9PSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZ2V0Q2hpcHNWYWx1ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGlmICgnbmFtZScgaW4gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlWyduYW1lJ107XG4gICAgICB9XG4gICAgICBpZiAoJ2Rpc3BsYXlWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlWydkaXNwbGF5VmFsdWUnXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGdldE9wdGlvbnMoaXRlbXM6IFNtYXJ0SXRlbXM8YW55PltdKSB7XG4gICAgbGV0IHZhbHVlczogYW55W10gPSBbXTtcbiAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmIChpdGVtLnR5cGUgPT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuSVRFTV9HUk9VUCkge1xuICAgICAgICBpdGVtLnZhbHVlTGlzdC5tYXAoKHZhbHVlOiBTbWFydEl0ZW08YW55PikgPT4ge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JVEVNKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGdldCBjbGVhckJ1dHRvbkRlc2NyaXB0b3IoKTogVWlBY3Rpb25EZXNjcmlwdG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6ICcnLFxuICAgICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICAgIHR5cGU6IFVpQWN0aW9uQnV0dG9uVHlwZS5SQUlTRUQsXG4gICAgICBpY29uOiB0aGlzLmNvbXBMaWIgPT09IENvbXBvbmVudExpYnJhcnkuUFJJTUVORyA/ICd0aW1lcycgOiAnY2xvc2UnLFxuICAgICAgaWNvblBvc2l0aW9uOiBJY29uUG9zaXRpb24uUFJFLFxuICAgIH07XG4gIH1cblxuICBjbGVhckZpZWxkKGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0uc2V0VmFsdWUoJycpO1xuICAgIHRoaXMub25CbHVyPy5uZXh0KHRoaXMud2lkZ2V0SW5zdGFuY2UpO1xuICB9XG5cbiAgb25UZXh0YXJlYUNoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGEgPSB0aGlzLnNiNFRleHRhcmVhPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdGEpIHJldHVybjtcblxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0YS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB0YS5zdHlsZS5oZWlnaHQgPSBgJHt0YS5zY3JvbGxIZWlnaHR9cHhgO1xuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlQmx1ckV2ZW50KGV2ZW50RGF0YTogYW55KSB7XG4gICAgdGhpcy5vbkJsdXI/Lm5leHQoZXZlbnREYXRhKTtcbiAgICB0aGlzLmJsdXJTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UubmV4dCh7XG4gICAgICBrZXk6IHRoaXMud2lkZ2V0SW5zdGFuY2Uua2V5ISxcbiAgICAgIGtpbmQ6IHRoaXMuZ2V0U29waGlzdGljYXRlZEV2ZW50S2luZCgpLFxuICAgICAgdmFsdWU6IHRoaXMuZm9ybS52YWx1ZVt0aGlzLndpZGdldEluc3RhbmNlLmtleSFdLFxuICAgIH0pO1xuICB9XG5cbiAgZG9ycGRvd25PcGVuaW5nID0gdHJ1ZTtcbiAgb25Ecm9wRG93blNob3coKSB7XG4gICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSB0cnVlO1xuICB9XG4gIG9uRHJvcERvd25JbnB1dCgpIHtcbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5kb3JwZG93bk9wZW5pbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzYWZlRHJvcERvd25CbHVyKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBXZSBkbyBub3QgdXNlIHRoZSBmaXJzdCBibHVyIGV2ZW50IGFmdGVyIHRoZSBjYWxlbmRhciBwaWNrZXIgb3BlbnMsXG4gICAgLy8gYXMgaXQgXCJlYXRzXCIgdGhlIGZpcnN0IGNsaWNrXG5cbiAgICBpZiAodGhpcy5kb3JwZG93bk9wZW5pbmcpIHtcbiAgICAgIHRoaXMuZG9ycGRvd25PcGVuaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVCbHVyRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgY2FsZW5kYXJPcGVuaW5nID0gZmFsc2U7XG4gIG9uQ2FsZW5kYXJTaG93KCkge1xuICAgIHRoaXMuY2FsZW5kYXJPcGVuaW5nID0gdHJ1ZTtcbiAgfVxuICBvbkNhbGVuZGFySW5wdXQoKSB7XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJPcGVuaW5nID09IHRydWUpIHtcbiAgICAgIHRoaXMuY2FsZW5kYXJPcGVuaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc2FmZUNhbGVuZGFyQmx1cihldmVudDogYW55KSB7XG4gICAgLy8gV2UgZG8gbm90IHVzZSB0aGUgZmlyc3QgYmx1ciBldmVudCBhZnRlciB0aGUgY2FsZW5kYXIgcGlja2VyIG9wZW5zLFxuICAgIC8vIGFzIGl0IFwiZWF0c1wiIHRoZSBmaXJzdCBjbGlja1xuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJPcGVuaW5nKSB7XG4gICAgICB0aGlzLmNhbGVuZGFyT3BlbmluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlQmx1ckV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIGNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiBEYXRlIHwgbnVsbCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICBsZXQgcGFyc2VkID0gbmV3IERhdGUodmFsdWUpO1xuXG4gICAgaWYgKGlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIERhdGU6JywgdmFsdWUpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgcGFyc2VkLmdldEZ1bGxZZWFyKCksXG4gICAgICBwYXJzZWQuZ2V0TW9udGgoKSxcbiAgICAgIHBhcnNlZC5nZXREYXRlKCksXG4gICAgICBwYXJzZWQuZ2V0SG91cnMoKSxcbiAgICAgIHBhcnNlZC5nZXRNaW51dGVzKCksXG4gICAgICBwYXJzZWQuZ2V0U2Vjb25kcygpXG4gICAgKTtcbiAgfVxuXG4gIGdldENvbnRyb2xNZXNzYWdlcyhjb250cm9sTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tjb250cm9sTmFtZV07XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtLmNvbnRyb2xzW2NvbnRyb2xOYW1lXT8uZXJyb3JzID8/IHt9O1xuXG4gICAgdGhpcy5lcnJvck1lc3NhZ2VzID0gT2JqZWN0LmtleXMoZXJyb3JzKVxuICAgICAgLmZpbHRlcigoa2V5KSA9PiB0eXBlb2YgZXJyb3JzW2tleV0gPT09ICdzdHJpbmcnKVxuICAgICAgLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgZGV0YWlsOiBlcnJvcnNba2V5XSxcbiAgICAgIH0pKTtcblxuICAgIGlmICh0aGlzLmVycm9yTWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVIgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1IgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkZJTEVfVVBMT0FERVIgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLk1VTFRJX0ZJTEVfVVBMT0FERVIgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5TVkcgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLkRJViAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWSURFUiAmJlxuICAgICAgICB0aGlzLndpZGdldEluc3RhbmNlLnR5cGUgIT09IFNtYXJ0Rm9ybVdpZGdldFR5cGUuQlVUVE9OICYmXG4gICAgICAgIHRoaXMud2lkZ2V0SW5zdGFuY2UudHlwZSAhPT0gU21hcnRGb3JtV2lkZ2V0VHlwZS5DT01QT05FTlQgJiZcbiAgICAgICAgdGhpcy53aWRnZXRJbnN0YW5jZS50eXBlICE9PSBTbWFydEZvcm1XaWRnZXRUeXBlLllPVVRVQkVfUExBWUVSXG4gICAgICApIHtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMCAmJiB0aGlzLndpZGdldEluc3RhbmNlLnNlcnZlckVycm9yTWVzc2FnZSAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBkZXRhaWw6IHRoaXMud2lkZ2V0SW5zdGFuY2Uuc2VydmVyRXJyb3JNZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNIdG1sKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAvPFthLXpdW1xcc1xcU10qPi9pLnRlc3QodGV4dCk7XG4gIH1cbn1cbiIsIkBpZiAoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXIgcHJpbWVcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8ZGl2XG4gICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXG4gICAgICBjbGFzcz1cImNvbnRhaW5lclwiXG4gICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzVmlzaWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHdpZGdldEluc3RhbmNlLmlzVmlzaWJsZVwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ09OVEFJTkVSXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0RGlyZWN0aW9uKClcIlxuICAgICAgPlxuICAgICAgICA8c21hcnRmb3Jtd2lkZ2V0XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHdpZGdldCBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIlxuICAgICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRcIlxuICAgICAgICAgIGNsYXNzPVwiY29udGFpbmVyLWl0ZW1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldC5jc3NDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgW29uQmx1cl09XCJvbkJsdXJcIlxuICAgICAgICAgIFtvblZhbHVlQ2hhbmdlXT1cIm9uVmFsdWVDaGFuZ2VcIlxuICAgICAgICAgIFtzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VdPVwic29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcbiAgICAgICAgICBbYmx1clNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZV09XCJibHVyU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXCJcbiAgICAgICAgICBjbGFzcz1cInt7IHdpZGdldC5rZXkgfX1cIlxuICAgICAgICAgIFtsYWJlbENvbG9yXT1cImxhYmVsQ29sb3JcIlxuICAgICAgICA+PC9zbWFydGZvcm13aWRnZXQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfRklFTERcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lciB0ZXh0RmllbGRDb250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsIFtuZ0NsYXNzXT1cInsgaGFzVG9vbGJhcjogaXNUb29sYmFyUHJlc2VudCgpIH1cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5tYXNrXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgdHlwZT1cInt7IHdpZGdldEluc3RhbmNlLmlzUGFzc3dvcmQgPyAoaGlkZVBhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0JykgOiAnJyB9fVwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGV4dFwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8cC1pbnB1dE1hc2tcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5tYXNrXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgW21hc2tdPVwid2lkZ2V0SW5zdGFuY2UubWFza1wiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dEZpZWxkQnV0dG9uc1wiPlxuICAgICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXG4gICAgICAgICAgICAgICN0b29sYmFyXG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS50b29sYmFySWRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cbiAgICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkUHJvcGVydGllcz8uY2xlYXJhYmxlKSB7XG4gICAgICAgICAgICAgIDx1aS1hY3Rpb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhckJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2FkZEJhc2ljQ2xhc3Nlc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2Rlc2NyaXB0b3JdPVwiY2xlYXJCdXR0b25EZXNjcmlwdG9yXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uQ2xpY2spPVwiY2xlYXJGaWVsZCh3aWRnZXRJbnN0YW5jZS5rZXkpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICE9IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9OVU1CRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgICBpbnB1dElkPVwibWlubWF4XCJcbiAgICAgICAgICAgICAgbW9kZT1cImRlY2ltYWxcIlxuICAgICAgICAgICAgICBbbWF4XT1cIndpZGdldEluc3RhbmNlLm1heFZhbHVlcyA/PyBudWxsXCJcbiAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIjBcIlxuICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwiNVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuUklDSF9URVhUXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICAgIDxwLWVkaXRvclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5ID09IHRydWUgPyAnZGlzYWJsZWRFZGl0b3InIDogJydcIlxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbbW9kdWxlc109XCJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkID8gZW1wdHlRdWlsbFRvb2xiYXIgOiB3aWRnZXRJbnN0YW5jZS5xdWlsbE1vZHVsZXNcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIndpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwid2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgKG9uVGV4dENoYW5nZSk9XCJvblByaW1lUmljaFRleHRFZGl0b3JDb250ZW50Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uVGV4dENoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpbWUtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtbWVzc2FnZXNcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TT1JUQUJMRVwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XG4gICAgICAgICAgPGg0ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCIgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCI+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgPjwvbGliLXNvcnRhYmxlLXdpZGdldD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiAhd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxwLWZsb2F0TGFiZWw+XG4gICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFtpY29uRGlzcGxheV09XCInaW5wdXQnXCJcbiAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbWluRGF0ZV09XCJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW21heERhdGVdPVwiXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5tYXhEYXRlID8/IG51bGwpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvblNob3cpPVwib25DYWxlbmRhclNob3coKVwiXG4gICAgICAgICAgICAgIChvbklucHV0KT1cIm9uQ2FsZW5kYXJJbnB1dCgpXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzYWZlQ2FsZW5kYXJCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsb3NlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cInl5LW1tLWRkXCJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbaWNvbkRpc3BsYXldPVwiJ2lucHV0J1wiXG4gICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbbWluRGF0ZV09XCJcbiAgICAgICAgICAgICAgICBjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1pbkRhdGUgPz8gbnVsbClcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW21heERhdGVdPVwiXG4gICAgICAgICAgICAgICAgY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5tYXhEYXRlID8/IG51bGwpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIGhvdXJGb3JtYXQ9XCIyNFwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvblNob3cpPVwib25DYWxlbmRhclNob3coKVwiXG4gICAgICAgICAgICAgIChvbklucHV0KT1cIm9uQ2FsZW5kYXJJbnB1dCgpXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzYWZlQ2FsZW5kYXJCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICAob25DbGVhcik9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsb3NlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgZGF0ZUZvcm1hdD1cInl5LW1tLWRkXCJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtbWVzc2FnZXNcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNFTEVDVFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtvcHRpb25zXT1cImdldE9wdGlvbnMod2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0KVwiXG4gICAgICAgICAgICAgIFtjaGVja21hcmtdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2NvbXBhcmVXaXRoXT1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpbWUtZXJyb3JcIj5cbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvcC1mbG9hdExhYmVsPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1tZXNzYWdlc1xuICAgICAgICAgIGNsYXNzPVwiZmxvYXRpbmctZXJyb3JcIlxuICAgICAgICAgICpuZ0lmPVwiZXJyb3JNZXNzYWdlcyAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCAmJiBlcnJvck1lc3NhZ2VzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFt2YWx1ZV09XCJlcnJvck1lc3NhZ2VzXCJcbiAgICAgICAgICBbY2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgICAgID48L3AtbWVzc2FnZXM+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUX01VTFRJUExFXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICA8cC1mbG9hdExhYmVsPlxuICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2V0T3B0aW9ucyh3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3QpXCJcbiAgICAgICAgICAgICAgW2NoZWNrbWFya109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgKG9uUGFuZWxTaG93KT1cIm9uRHJvcERvd25TaG93KClcIlxuICAgICAgICAgICAgICAob25CbHVyKT1cInNhZmVEcm9wRG93bkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChvbkNsZWFyKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUGFuZWxIaWRlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aCA9PSBudWxsID8gY29tcGFyZUl0ZW1zIDogd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGhcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IGVsZW0ga2l2w6FsYXN6dHZhXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgd2lkZ2V0SW5zdGFuY2UuaXNGbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fTwvbGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L3AtZmxvYXRMYWJlbD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAtbWVzc2FnZXNcbiAgICAgICAgICBjbGFzcz1cImZsb2F0aW5nLWVycm9yXCJcbiAgICAgICAgICAqbmdJZj1cImVycm9yTWVzc2FnZXMgJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggJiYgZXJyb3JNZXNzYWdlcy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZXJyb3JNZXNzYWdlc1wiXG4gICAgICAgICAgW2Nsb3NhYmxlXT1cInRydWVcIlxuICAgICAgICA+PC9wLW1lc3NhZ2VzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5sYWJlbFBvc2l0aW9uQ2xhc3MgPz8gJydcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgIXdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIiBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIiBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCI+XG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBjbGFzcz1cInNiNC10ZXh0YXJlYVwiXG4gICAgICAgICAgICAgICNzYjRUZXh0YXJlYVxuICAgICAgICAgICAgICBwSW5wdXRUZXh0YXJlYVxuICAgICAgICAgICAgICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgY29scz1cIjMwXCJcbiAgICAgICAgICAgICAgW3Jvd3NdPVwid2lkZ2V0SW5zdGFuY2UudGV4dEJveFByb3BlcnRpZXM/Lm1pblJvd3MgPz8gMVwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiIFwiXG4gICAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVGV4dGFyZWFDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiB3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICAgW2Zvcl09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLW1lc3NhZ2VzXG4gICAgICAgICAgY2xhc3M9XCJmbG9hdGluZy1lcnJvclwiXG4gICAgICAgICAgKm5nSWY9XCJlcnJvck1lc3NhZ2VzICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoICYmIGVycm9yTWVzc2FnZXMubGVuZ3RoID4gMFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImVycm9yTWVzc2FnZXNcIlxuICAgICAgICAgIFtjbG9zYWJsZV09XCJ0cnVlXCJcbiAgICAgICAgPjwvcC1tZXNzYWdlcz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxQb3NpdGlvbkNsYXNzID8/ICcnXCJcbiAgICAgID5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmICF3aWRnZXRJbnN0YW5jZS5pc0Zsb2F0TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRJdGVtQ29udGFpbmVyXCI+XG4gICAgICAgICAgPHAtZmxvYXRMYWJlbD5cbiAgICAgICAgICAgIDxwLWNoaXBzXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkID8gd2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgW21heF09XCIwXCJcbiAgICAgICAgICAgICAgW21heExlbmd0aF09XCIwXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cIml0ZW1cIj4ge3sgZ2V0Q2hpcHNWYWx1ZShpdGVtKSB9fSA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLWNoaXBzPlxuICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsICYmIHdpZGdldEluc3RhbmNlLmlzRmxvYXRMYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX08L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLWZsb2F0TGFiZWw+XG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXG4gICAgICAgICAgICAjdG9vbGJhclxuICAgICAgICAgICAgKm5nSWY9XCJpc1Rvb2xiYXJQcmVzZW50KClcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2UudG9vbGJhcklkXCJcbiAgICAgICAgICA+PC9zbWFydC11aS1hY3Rpb24tdG9vbGJhcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxuICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3A+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwid2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGxhaW5UZXh0PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5MQUJFTFwiXG4gICAgICAgIGNsYXNzPVwibGFiZWwgd2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkZ2V0SW5zdGFuY2UubWluV2lkdGggKyAncHgnIH1cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtdGl0bGUgbGFiZWxDb250YWluZXJcIiBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2Uud2lkZ2V0RGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIDxwPnt7IHdpZGdldEluc3RhbmNlLndpZGdldERlc2NyaXB0aW9uIH19PC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0SXRlbUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPHNtYXJ0LWZpbGUtZWRpdG9yXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcbiAgICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHAtb3ZlcmxheVBhbmVsICNvcD5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJ3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNwbGFpblRleHQ+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldEl0ZW1Db250YWluZXJcIj5cbiAgICAgICAgICAgIDxzbWFydC1tdWx0aS1maWxlLWVkaXRvclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZpbGVFdmVudCk9XCJleGVjdXRlVWlBY3Rpb24oJGV2ZW50LnVpQWN0aW9uKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmhpbnRcIlxuICAgICAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h0bWwod2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCA/PyAnJyk7IGVsc2UgcGxhaW5UZXh0XCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwXCI+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLklNQUdFXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgaW1hZ2VDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbCAmJiBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuXG4gICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS5pbWFnZVByb3BlcnRpZXMhLmltYWdlXCJcbiAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICBhbHQ9XCJJbWFnZVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmltYWdlQ3NzID8/ICcnIH19XCJcbiAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVE9HR0xFXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXIgdG9nZ2xlLWNvbFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmxhYmVsUG9zaXRpb25DbGFzcyA/PyAnJ1wiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbCBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCIgW2Zvcl09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIj5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHAtaW5wdXRTd2l0Y2hcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgbmFtZT1cInt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaGludFwiXG4gICAgICAgICAgY2xhc3M9XCJwLWlucHV0Z3JvdXAtYWRkb25cIlxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuQ0hFQ0tfQk9YXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPHAtY2hlY2tib3hcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjYXRibGVPYmplY3RcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwid2lkZ2V0SW5zdGFuY2UubGFiZWxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvcC50b2dnbGUoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImlzSHRtbCh3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0ID8/ICcnKTsgZWxzZSBwbGFpblRleHRcIlxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcFwiPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNIRUNLX0JPWF8yXCJcbiAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hlY2tib3ggb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0OyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0taW1hZ2VcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiY2hlY2tib3guaW1hZ2VVcmxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJjaGVja2JveC52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY2hlY2tib3gubGFiZWxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5oaW50XCJcbiAgICAgICAgICBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwib3AudG9nZ2xlKCRldmVudClcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5mby1jaXJjbGVcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cC1vdmVybGF5UGFuZWwgI29wPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiaXNIdG1sKHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgPz8gJycpOyBlbHNlIHBsYWluVGV4dFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIndpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogcHJlLXdyYXBcIj57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuRElWKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2XCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlNWR1wiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgIDxoNFxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICBjbGFzcz1cImxhYmVsQ29udGFpbmVyIHt7IGxhYmVsQ29sb3IgfX0ge3sgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZUh0bWwod2lkZ2V0SW5zdGFuY2UudmFsdWUpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICA+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59IEBlbHNlIHtcbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lciBtYXRlcmlhbFwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgIDxkaXZcbiAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcbiAgICAgIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogd2lkZ2V0SW5zdGFuY2UuaXNWaXNpYmxlXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DT05UQUlORVJcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxzbWFydGZvcm13aWRnZXRcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgd2lkZ2V0IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXG4gICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldFwiXG4gICAgICAgICAgY2xhc3M9XCJjb250YWluZXItaXRlbVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0LmNzc0NsYXNzID8/ICcnXCJcbiAgICAgICAgICBbb25CbHVyXT1cIm9uQmx1clwiXG4gICAgICAgICAgW29uVmFsdWVDaGFuZ2VdPVwib25WYWx1ZUNoYW5nZVwiXG4gICAgICAgICAgW3NvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZV09XCJzb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2VcIlxuICAgICAgICAgIGNsYXNzPVwie3sgd2lkZ2V0LmtleSB9fVwiXG4gICAgICAgICAgW2xhYmVsQ29sb3JdPVwibGFiZWxDb2xvclwiXG4gICAgICAgID48L3NtYXJ0Zm9ybXdpZGdldD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIChjYXBzTG9jayk9XCJjYXBzT24gPSAkZXZlbnRcIlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB0ZXh0RmllbGQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cblxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2VsZWN0aW9uXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmlucHV0bW9kZV09XCJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlID8gd2lkZ2V0SW5zdGFuY2UuaW5wdXRNb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiAndGV4dCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbdHlwZV09XCInc3RyaW5nJ1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVCbHVyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gKGhpZGVQYXNzd29yZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpIDogJycgfX1cIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25LZXlkb3duKClcIlxuICAgICAgICAgICAgbWF4bGVuZ3RoPVwie3sgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoIH19XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDwhLS0gW21hc2tdPVwid2lkZ2V0SW5zdGFuY2UubWFzayA/PyAnJ1wiIC0tPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW3R5cGVdPVwiJ3N0cmluZydcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5pc1Bhc3N3b3JkID8gJ3Bhc3N3b3JkJyA6ICcnIH19XCJcbiAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwidGV4dEZpZWxkQXV0b1wiXG4gICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbktleWRvd24oKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmlzUGFzc3dvcmRcIlxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IGhpZGVQYXNzd29yZCA/ICd2aXNpYmlsaXR5X29mZicgOiAndmlzaWJpbGl0eScgfX08L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICN0ZXh0RmllbGRBdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucyB8IGFzeW5jXCIgW3ZhbHVlXT1cIm9wdGlvbi5sYWJlbFwiPlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5sYWJlbCB8IGhpZ2hsaWdodDogdG9IaWdobGlnaHRcIj48L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCIgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuY2Fwc0xvY2tXYXJuaW5nIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJjYXBzT24gJiYgd2lkZ2V0SW5zdGFuY2UuaXNQYXNzd29yZFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmNhcHNMb2NrV2FybmluZ0ljb24gPz8gJ2tleWJvYXJkX2NhcHNsb2NrJ1wiXG4gICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pY29uICYmIHdpZGdldEluc3RhbmNlLmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmljb25Db2xvciA/PyAncHJpbWFyeSdcIlxuICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnByZWZpeCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBtYXRTdWZmaXg+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5zdWZmaXggfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmljb24gJiZcbiAgICAgICAgICAgICAgKCF3aWRnZXRJbnN0YW5jZS5pY29uUG9zaXRpb24gfHwgd2lkZ2V0SW5zdGFuY2UuaWNvblBvc2l0aW9uID09PSAnUE9TVCcpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuaWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuaWNvbkNvbG9yID8/ICdwcmltYXJ5J1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0RmllbGRCdXR0b25zXCI+XG4gICAgICAgICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnRleHRGaWVsZFByb3BlcnRpZXM/LmNsZWFyYWJsZSkge1xuICAgICAgICAgICAgICA8dWktYWN0aW9uLWJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJCdXR0b25cIlxuICAgICAgICAgICAgICAgIFthZGRCYXNpY0NsYXNzZXNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtkZXNjcmlwdG9yXT1cImNsZWFyQnV0dG9uRGVzY3JpcHRvclwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbkNsaWNrKT1cImNsZWFyRmllbGQod2lkZ2V0SW5zdGFuY2Uua2V5KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNtYXJ0LXVpLWFjdGlvbi10b29sYmFyXG4gICAgICAgICAgICAjdG9vbGJhclxuICAgICAgICAgICAgKm5nSWY9XCJpc1Rvb2xiYXJQcmVzZW50KClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0RmllbGRUb29sYmFyXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b25cIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cInt7IHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5jb2xvciB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNhbGxiYWNrKHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uaWNvblBvc2l0aW9uID09PVxuICAgICAgICAgICAgICAgICAgc21hcnRGb3JtVGV4dEZpZWxkQnV0dG9uSWNvblBvc2l0aW9uKCkuUFJFICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uQ29sb3JcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0NoYXJhY3RlckxpbWl0U3VmZml4ICYmIHdpZGdldEluc3RhbmNlLm1heExlbmd0aFwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIGFsaWduPVwiZW5kXCJcbiAgICAgICAgICAgID57e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGggLSBmb3JtLmNvbnRyb2xzW3dpZGdldEluc3RhbmNlLmtleV0udmFsdWUubGVuZ3RoXG4gICAgICAgICAgICB9fTwvbWF0LWhpbnRcbiAgICAgICAgICA+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhd2lkZ2V0SW5zdGFuY2U/LmhpbnQgfHxcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcbiAgICAgICAgICBcIlxuICAgICAgICAgID57eyB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0IH19PC9tYXQtaGludFxuICAgICAgICA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuVEVYVF9GSUVMRF9OVU1CRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgdGV4dEZpZWxkIHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgW3R5cGVdPVwiJ251bWJlcidcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICBbbWluXT1cIndpZGdldEluc3RhbmNlLm1pblZhbHVlcyA/PyBudWxsXCJcbiAgICAgICAgICAgIFttYXhdPVwid2lkZ2V0SW5zdGFuY2UubWF4VmFsdWVzID8/IG51bGxcIlxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gbWF0UHJlZml4PlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UucHJlZml4IH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIG1hdFN1ZmZpeD5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLnN1ZmZpeCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmljb25cIiBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5pY29uXCIgbWF0U3VmZml4PlxuICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvblwiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgIG1hdC1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwie3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmNvbG9yIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ3aWRnZXRJbnN0YW5jZS50ZXh0RmllbGRCdXR0b24uY2FsbGJhY2sod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QUkUgJiYgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9zbWFydC1pY29uPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudGV4dEZpZWxkQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uUG9zaXRpb24gPT09XG4gICAgICAgICAgICAgICAgICBzbWFydEZvcm1UZXh0RmllbGRCdXR0b25JY29uUG9zaXRpb24oKS5QT1NUICYmIHdpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnRleHRGaWVsZEJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvc21hcnQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0NISVBTXCJcbiAgICAgICAgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcbiAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1jaGlwLWdyaWQgI2NoaXBMaXN0IGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiPlxuICAgICAgICAgICAgPG1hdC1jaGlwLXJvd1xuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB2YWx1ZSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2NoaXBJbnB1dFxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJ3aWRnZXRJbnN0YW5jZS5pc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJjaGlwQXV0b1wiXG4gICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlQmx1ckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICNjaGlwQXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQsIHdpZGdldEluc3RhbmNlKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5URVhUX0ZJRUxEX0xPT0tVUFwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwTGlzdExvb2t1cCBhcmlhLWxhYmVsPVwie3sgd2lkZ2V0SW5zdGFuY2UubGFiZWwgfX1cIj5cbiAgICAgICAgICAgIDxtYXQtY2hpcFxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid2lkZ2V0SW5zdGFuY2UuaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIChyZW1vdmVkKT1cInJlbW92ZSh2YWx1ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRDaGlwc1ZhbHVlKHZhbHVlKSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdExvb2t1cFwiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJlbXB0eVNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPlxuICAgICAgICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhclxuICAgICAgICAgICAgI3Rvb2xiYXJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNUb29sYmFyUHJlc2VudCgpXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLnRvb2xiYXJJZFwiXG4gICAgICAgICAgPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRFWFRfQk9YXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgY2xhc3M9XCJzYjQtdGV4dGFyZWFcIlxuICAgICAgICAgICAgI3NiNFRleHRhcmVhXG4gICAgICAgICAgICBjb2xzPVwiMzBcIlxuICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgW2Nka0F1dG9zaXplTWluUm93c109XCJ3aWRnZXRJbnN0YW5jZS50ZXh0Qm94UHJvcGVydGllcz8ubWluUm93cyA/PyAxXCJcbiAgICAgICAgICAgIFtjZGtBdXRvc2l6ZU1heFJvd3NdPVwid2lkZ2V0SW5zdGFuY2UudGV4dEJveFByb3BlcnRpZXM/Lm1heFJvd3MgPz8gdW5kZWZpbmVkXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt0eXBlXT1cIidzdHJpbmcnXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwid2lkZ2V0SW5zdGFuY2UuaXNSZWFkb25seVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICAgIG1heGxlbmd0aD1cInt7IHdpZGdldEluc3RhbmNlLm1heExlbmd0aCB9fVwiXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgYWxpZ249XCJlbmRcIlxuICAgICAgICAgICAgPnt7XG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLm1heExlbmd0aCAtIGZvcm0uY29udHJvbHNbd2lkZ2V0SW5zdGFuY2Uua2V5XS52YWx1ZS5sZW5ndGhcbiAgICAgICAgICAgIH19PC9tYXQtaGludFxuICAgICAgICAgID5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1oaW50XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZS5oaW50IHx8IHdpZGdldEluc3RhbmNlLmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxuICAgICAgICAgIFwiXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hcIlxuICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImlucHV0IGNoZWNrYm94IHdpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInJhZGlvTGFiZWxcIiAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwiY2hlY2tib3gtc2VjdGlvblwiIFtuZ0NsYXNzXT1cImdldERpcmVjdGlvbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3gtaXRlbS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5IH19XCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmxhYmVsIH19XG4gICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5DSEVDS19CT1hfMlwiXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cbiAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHRcbiAgICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCBjaGVja2JveCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJyYWRpb0xhYmVsXCIgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cImNoZWNrYm94LXNlY3Rpb25cIiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LWl0ZW0tY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoZWNrYm94IG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNoZWNrYm94LmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC1pdGVtLWltYWdlXCJcbiAgICAgICAgICAgICAgICBbc3JjXT1cImNoZWNrYm94LmltYWdlVXJsXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWNhdGJsZU9iamVjdFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy4nICsgY2hlY2tib3gua2V5IH19XCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY2hlY2tib3gudmFsdWVcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dChjaGVja2JveClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjaGVja2JveC5sYWJlbCB9fVxuICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWVycm9yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SQURJT19CVVRUT05cIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgICBjbGFzcz1cImlucHV0IHJhZGlvLXNlY3Rpb24gd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJ7eyB3aWRnZXRJbnN0YW5jZS5sYWJlbCB9fVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwicmFkaW9MYWJlbFwiICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWl0ZW0tY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IHJhZGlvIG9mIHdpZGdldEluc3RhbmNlLnZhbHVlTGlzdFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJyYWRpby5pbWFnZVVybFwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicmFkaW8taXRlbS1pbWFnZVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJyYWRpby5pbWFnZVVybFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY2F0YmxlT2JqZWN0XCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJhZGlvLnZhbHVlIH19XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXREaXJlY3Rpb24oKVwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KHJhZGlvLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgcmFkaW8ubGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZXJyb3JcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuREFURV9QSUNLRVJcIlxuICAgICAgICBjbGFzcz1cImRhdGVQaWNrZXIgd2lkZ2V0Q29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlciAoY2xvc2VkKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIj48L21hdC1kYXRlcGlja2VyPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICBbbWluXT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWluRGF0ZSA/PyBudWxsKVwiXG4gICAgICAgICAgICBbbWF4XT1cImNvbnZlcnRUb0xvY2FsRGF0ZVRpbWUod2lkZ2V0SW5zdGFuY2UuZGF0ZUZpZWxkUHJvcGVydGllcz8ubWF4RGF0ZSA/PyBudWxsKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZT8ubmV4dCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmRhdGVGb3JtYXRIaW50IH19XG4gICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIDxkaXZcbiAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5EQVRFX1RJTUVfUElDS0VSXCJcbiAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiPlxuICAgICAgICA8aDQgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IHNtYXJ0LWZvcm0td2lkZ2V0LWxhYmVsXCI+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICBjbGFzcz1cImlucHV0IHdpZGdldENvbnRlbnRcIlxuICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJ1wiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCIkYW55KHBpY2tlcilcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgPG5neC1tYXQtZGF0ZXRpbWUtcGlja2VyXG4gICAgICAgICAgI3BpY2tlclxuICAgICAgICAgIFtzaG93U3Bpbm5lcnNdPVwidHJ1ZVwiXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcbiAgICAgICAgICBbc3RlcEhvdXJdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBNaW51dGVdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBTZWNvbmRdPVwiMTBcIlxuICAgICAgICAgIFt0b3VjaFVpXT1cImZhbHNlXCJcbiAgICAgICAgICBbY29sb3JdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgICBbZW5hYmxlTWVyaWRpYW5dPVwiZmFsc2VcIlxuICAgICAgICAgIFtkaXNhYmxlTWludXRlXT1cImZhbHNlXCJcbiAgICAgICAgICBbaGlkZVRpbWVdPVwiZmFsc2VcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmd4LW1hdC1kYXRldGltZS1waWNrZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgW25neE1hdERhdGV0aW1lUGlja2VyRmlsdGVyXT1cIndpZGdldEluc3RhbmNlLmZpbHRlciA/PyBkYXRlRmlsdGVyXCJcbiAgICAgICAgICAoYmx1cik9XCJvbkJsdXI/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgIDxtYXQtaGludD5cbiAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxuICAgICAgICA8L21hdC1oaW50PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj4gLS0+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRBVEVfVElNRV9QSUNLRVJcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlVGltZVBpY2tlckNvbnRhaW5lclwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IGRhdGUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyIChjbG9zZWQpPVwiaGFuZGxlQmx1ckV2ZW50KHdpZGdldEluc3RhbmNlKVwiPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI2RhdGVJbnB1dFxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFttaW5dPVwiY29udmVydFRvTG9jYWxEYXRlVGltZSh3aWRnZXRJbnN0YW5jZS5kYXRlRmllbGRQcm9wZXJ0aWVzPy5taW5EYXRlID8/IG51bGwpXCJcbiAgICAgICAgICAgICAgW21heF09XCJjb252ZXJ0VG9Mb2NhbERhdGVUaW1lKHdpZGdldEluc3RhbmNlLmRhdGVGaWVsZFByb3BlcnRpZXM/Lm1heERhdGUgPz8gbnVsbClcIlxuICAgICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cIndpZGdldEluc3RhbmNlLnZhbHVlXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciB9fVwiXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZVBpY2tlckJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJGaWx0ZXJdPVwid2lkZ2V0SW5zdGFuY2UuZmlsdGVyID8/IGRhdGVGaWx0ZXJcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPG1hdC1oaW50PlxuICAgICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5kYXRlRm9ybWF0SGludCB9fVxuICAgICAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgICAgKm5nSWY9XCJoYXNDcmVhdGVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB0aW1lXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgd2lkdGg6IHdpZGdldEluc3RhbmNlLm1pbldpZHRoICsgJ3B4JyB9XCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgI3RpbWVJbnB1dFxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleSArICctdGltZSdcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLXRpbWUnXCJcbiAgICAgICAgICAgICAgW2lkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0aW1lJ1wiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgfX1cIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvblRpbWVQaWNrZXJCbHVyKCRldmVudClcIlxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU0VMRUNUXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtbGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwid2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1wiXG4gICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlPy5uZXh0KCRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgKGNsb3NlZCk9XCJoYW5kbGVCbHVyRXZlbnQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3aWRnZXRJbnN0YW5jZS5pc0Rpc2FibGVkIVwiXG4gICAgICAgICAgICBbY29tcGFyZVdpdGhdPVwiXG4gICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoID09IG51bGwgPyBjb21wYXJlSXRlbXMgOiB3aWRnZXRJbnN0YW5jZS5jb21wYXJlV2l0aFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgd2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXIgPyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA6ICcnIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWVMaXN0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0Z3JvdXBcbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTV9HUk9VUFwiXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIm9wdGlvbi5sYWJlbFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaW5uZXJPcHRpb24gb2Ygb3B0aW9uLnZhbHVlTGlzdFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaW5uZXJPcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlubmVyT3B0aW9uLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaW5uZXJPcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImlubmVyT3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiaW5uZXJPcHRpb24uaWNvbkNvbG9yXCJcbiAgICAgICAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgICAgICAgICB7eyBpbm5lck9wdGlvbi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtb3B0Z3JvdXA+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24udHlwZSA9PT0gZ2V0VHlwZSgpLklURU1cIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJvcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICBbaWNvbl09XCJvcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICBbY29sb3JdPVwib3B0aW9uLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgPjwvc21hcnQtaWNvblxuICAgICAgICAgICAgICAgID57eyBvcHRpb24ubGFiZWwgfX08L21hdC1vcHRpb25cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0LWVycm9yXCI+XG4gICAgICAgICAgICB7eyB3aWRnZXRJbnN0YW5jZS5lcnJvciB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5lcnJvciAmJiB3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25Db2xvciA/PyAnd2FybidcIlxuICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPG1hdC1oaW50XG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5JTlBVVFxuICAgICAgICAgIFwiXG4gICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TRUxFQ1RfTVVMVElQTEVcIlxuICAgICAgICBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQgd2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJydcIlxuICAgICAgICAgICAgKm5nSWY9XCIhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAoY2xvc2VkKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQhXCJcbiAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY29tcGFyZVdpdGggPT0gbnVsbCA/IGNvbXBhcmVJdGVtcyA6IHdpZGdldEluc3RhbmNlLmNvbXBhcmVXaXRoXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyB3aWRnZXRJbnN0YW5jZS5wbGFjZWhvbGRlciA/IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIDogJycgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiB3aWRnZXRJbnN0YW5jZS52YWx1ZUxpc3RcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRncm91cFxuICAgICAgICAgICAgICAgICpuZ0lmPVwib3B0aW9uLnR5cGUgPT09IGdldFR5cGUoKS5JVEVNX0dST1VQXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwib3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwib3B0aW9uLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpbm5lck9wdGlvbiBvZiBvcHRpb24udmFsdWVMaXN0XCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpbm5lck9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW5uZXJPcHRpb24uaXNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpbm5lck9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaW5uZXJPcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJpbm5lck9wdGlvbi5pY29uQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgPjwvc21hcnQtaWNvblxuICAgICAgICAgICAgICAgICAgPnt7IGlubmVyT3B0aW9uLmxhYmVsIH19PC9tYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1vcHRncm91cD5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi50eXBlID09PSBnZXRUeXBlKCkuSVRFTVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm9wdGlvbi5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIm9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtpY29uXT1cIm9wdGlvbi5pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJvcHRpb24uaWNvbkNvbG9yXCJcbiAgICAgICAgICAgICAgICA+PC9zbWFydC1pY29uXG4gICAgICAgICAgICAgICAgPnt7IG9wdGlvbi5sYWJlbCB9fTwvbWF0LW9wdGlvblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXG4gICAgICAgICAgXCJcbiAgICAgICAgICA+e3sgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dCB9fTwvbWF0LWhpbnRcbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkxBQkVMXCJcbiAgICAgICAgY2xhc3M9XCJsYWJlbCB3aWRnZXRDb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiB3aWRnZXRJbnN0YW5jZS5taW5XaWR0aCArICdweCcgfVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC10aXRsZSBsYWJlbENvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIndpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS53aWRnZXREZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgPHA+e3sgd2lkZ2V0SW5zdGFuY2Uud2lkZ2V0RGVzY3JpcHRpb24gfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5USU1FXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCIgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIj5cbiAgICAgICAgICA8aDRcbiAgICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSBzbWFydC1mb3JtLXdpZGdldC1sYWJlbCB7e1xuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dCB3aWRnZXRDb250ZW50IHRpbWUge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnXCJcbiAgICAgICAgICAgICpuZ0lmPVwiIXdpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbaWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbdHlwZV09XCIndGltZSdcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImdldFRpbWUoKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IHdpZGdldEluc3RhbmNlLnBsYWNlaG9sZGVyIH19XCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUJsdXJFdmVudCh3aWRnZXRJbnN0YW5jZSlcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtZXJyb3JcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldEluc3RhbmNlLmVycm9yIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLmVycm9yICYmIHdpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ3aWRnZXRJbnN0YW5jZS5lcnJvckljb25cIlxuICAgICAgICAgICAgW2NvbG9yXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvbkNvbG9yID8/ICd3YXJuJ1wiXG4gICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLlRPR0dMRVwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgICAgPGg0XG4gICAgICAgICAgICBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWwge3tcbiAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuY3NzTGFiZWxDbGFzcyA/PyAnJ1xuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TGFiZWxOZ0NsYXNzKClcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgICA8L2g0PlxuICAgICAgICAgIDxtYXQtaGludCAqbmdJZj1cIndpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uTEFCRUxcIj57e1xuICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQgIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IHdpZGdldEluc3RhbmNlLmtleSB9fVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgdmFsdWU9XCJ7eyB3aWRnZXRJbnN0YW5jZS52YWx1ZSB9fVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2U/Lm5leHQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbGFiZWxQb3NpdGlvbl09XCJ3aWRnZXRJbnN0YW5jZS50b2dnbGVMYWJlbFBvc2l0aW9uID8/ICdiZWZvcmUnXCJcbiAgICAgICAgICAgID57eyAhd2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsID8gd2lkZ2V0SW5zdGFuY2UubGFiZWwgOiAnJyB9fTwvbWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgID48c3BhbiBjbGFzcz1cIm1hdC1lcnJvclwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UuZXJyb3IgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3IgJiYgd2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uXCJcbiAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLmVycm9ySWNvblwiXG4gICAgICAgICAgICBbY29sb3JdPVwid2lkZ2V0SW5zdGFuY2UuZXJyb3JJY29uQ29sb3IgPz8gJ3dhcm4nXCJcbiAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5JTkRJQ0FUT1JcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJ7eyBsYWJlbENvbG9yIH19IGxhYmVsQ29udGFpbmVyIHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydEluZGljYXRvciB3aWRnZXRDb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImluZGljYXRvckl0ZW1zIHt7IHdpZGdldEluc3RhbmNlLmNzc0NsYXNzID8/ICcnIH19XCIgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGluZGljYXRvckl0ZW1zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpbmRpY2F0b3JJdGVtXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SW5kaWNhdG9ySXRlbUNsYXNzKGkpXCJcbiAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8cCBbbmdDbGFzc109XCJnZXRJbmRpY2F0b3JTdGF0dXNMYWJlbENvbG9yKClcIj5cbiAgICAgICAgICAgIHt7IGdldEluZGljYXRvclN0YXR1c0xhYmVsKCkgfX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5GSUxFX1VQTE9BREVSKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgICA8c21hcnQtZmlsZS1lZGl0b3JcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbd2lkZ2V0SW5zdGFuY2VdPVwid2lkZ2V0SW5zdGFuY2VcIlxuICAgICAgICAgICAgKHVwbG9hZEZpbGVzRXZlbnQpPVwidXBsb2FkKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTVVMVElfRklMRV9VUExPQURFUikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPHNtYXJ0LW11bHRpLWZpbGUtZWRpdG9yXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW3dpZGdldEluc3RhbmNlXT1cIndpZGdldEluc3RhbmNlXCJcbiAgICAgICAgICAgICh1cGxvYWRGaWxlc0V2ZW50KT1cInVwbG9hZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChmaWxlRXZlbnQpPVwiZXhlY3V0ZVVpQWN0aW9uKCRldmVudC51aUFjdGlvbilcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKHdpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuSU1BR0UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRhaW5lciBpbWFnZUNvbnRhaW5lclwiPlxuICAgICAgICAgIDxoNFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWwgJiYgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWxDb250YWluZXIge3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzID8/ICcnIH19XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdldExhYmVsU3R5bGUoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgICAgPC9oND5cblxuICAgICAgICAgIEBpZiAod2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZSkge1xuICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgW2ltYWdlUmVzb3VyY2VdPVwid2lkZ2V0SW5zdGFuY2UuaW1hZ2VQcm9wZXJ0aWVzPy5pbWFnZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgfSBAZWxzZSBpZiAod2lkZ2V0SW5zdGFuY2UudmFsdWUpIHtcbiAgICAgICAgICAgIDxzbWFydC1pY29uXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwid2lkZ2V0SW5zdGFuY2UudmFsdWVcIlxuICAgICAgICAgICAgICBbaW1hZ2VSZXNvdXJjZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwid2lkZ2V0Q29udGVudCB7eyB3aWRnZXRJbnN0YW5jZS5pbWFnZUNzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgICAgIGFsdD1cIkltYWdlXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJ7eyB3aWRnZXRJbnN0YW5jZS5rZXkgfX1cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJnZXROZ0NsYXNzKClcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICAgID48L3NtYXJ0LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmICh3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJzbWFydERpdlwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5TVkdcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtpbm5lckhUTUxdPVwic2FuaXRpemVIdG1sKHdpZGdldEluc3RhbmNlLnZhbHVlKVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkRJVklERVJcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aHJcbiAgICAgICAgICBjbGFzcz1cInNtYXJ0RGl2aWRlciB7eyB3aWRnZXRJbnN0YW5jZS5jc3NDbGFzcyA/PyAnJyB9fVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0TmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRTdHlsZSgpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5CVVRUT05cIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8aDRcbiAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiXG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lciB7eyBsYWJlbENvbG9yIH19IHt7IHdpZGdldEluc3RhbmNlLmNzc0xhYmVsQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldExhYmVsTmdDbGFzcygpXCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJnZXRMYWJlbFN0eWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgZ2V0V2lkZ2V0TGFiZWwod2lkZ2V0SW5zdGFuY2UpIH19XG4gICAgICAgIDwvaDQ+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIndpZGdldENvbnRlbnQge3sgd2lkZ2V0SW5zdGFuY2UuY3NzQ2xhc3MgPz8gJycgfX1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0U3R5bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRlc3RpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ2V0QnV0dG9uVHlwZSh3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpXCJcbiAgICAgICAgICAgIFtjb2xvcl09XCJ3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrZWQod2lkZ2V0SW5zdGFuY2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaXNPbmx5SWNvbih3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3IpOyB0aGVuIGljb25Pbmx5OyBlbHNlIHRleHRcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpY29uT25seT5cbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblwiXG4gICAgICAgICAgICAgICAgW2ljb25dPVwid2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yIS5pY29uIVwiXG4gICAgICAgICAgICAgICAgW2NvbG9yXT1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uQ29sb3IgPz9cbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uY29sb3JcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9zbWFydC1pY29uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGV4dD5cbiAgICAgICAgICAgICAgPHNtYXJ0LWljb25cbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy5pY29uICYmXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb25Qb3NpdGlvbiA9PT0gJ1BSRSdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgICAge3sgd2lkZ2V0SW5zdGFuY2UudWlBY3Rpb25EZXNjcmlwdG9yPy50aXRsZSB9fVxuICAgICAgICAgICAgICA8c21hcnQtaWNvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/Lmljb24gJiZcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvblBvc2l0aW9uID09PSAnUE9TVCdcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtpY29uXT1cIndpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvciEuaWNvbiFcIlxuICAgICAgICAgICAgICAgIFtjb2xvcl09XCJcbiAgICAgICAgICAgICAgICAgIHdpZGdldEluc3RhbmNlLnVpQWN0aW9uRGVzY3JpcHRvcj8uaWNvbkNvbG9yID8/XG4gICAgICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS51aUFjdGlvbkRlc2NyaXB0b3I/LmNvbG9yXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPjwvc21hcnQtaWNvbj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgICAgPGg0XG4gICAgICAgICAgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiXG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS50eXBlID09PSBzbWFydEZvcm1XaWRnZXRUeXBlLkNPTVBPTkVOVCAmJiB3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbUNvbXBvbmVudD48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5SSUNIX1RFWFRcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8cXVpbGwtZWRpdG9yXG4gICAgICAgICAgICAjcXVpbGxFZGl0b3JcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFttb2R1bGVzXT1cIndpZGdldEluc3RhbmNlLmlzRGlzYWJsZWQgPyBlbXB0eVF1aWxsVG9vbGJhciA6IHdpZGdldEluc3RhbmNlLnF1aWxsTW9kdWxlc1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwid2lkZ2V0SW5zdGFuY2UucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW3JlYWRPbmx5XT1cIndpZGdldEluc3RhbmNlLmlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgW21heExlbmd0aF09XCJ3aWRnZXRJbnN0YW5jZS5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgKG9uQ29udGVudENoYW5nZWQpPVwib25SaWNoVGV4dEVkaXRvckNvbnRlbnRDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgID48L3F1aWxsLWVkaXRvcj5cbiAgICAgICAgICA8bWF0LWhpbnRcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICF3aWRnZXRJbnN0YW5jZT8uaGludCB8fFxuICAgICAgICAgICAgICB3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLklOUFVUXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaGludFxuICAgICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93Q2hhcmFjdGVyTGltaXRTdWZmaXggJiYgd2lkZ2V0SW5zdGFuY2UubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgYWxpZ249XCJlbmRcIlxuICAgICAgICAgICAgY2xhc3M9XCJyaWNoLXRleHQtZWRpdG9yLWxlZXdheS1jb3VudGVyXCJcbiAgICAgICAgICAgID57eyBnZXRSaWNoVGV4dEVkaXRvckxlbmd0aExlZXdheSgpIH19PC9tYXQtaGludFxuICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuU09SVEFCTEVcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgICA8aDQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIiBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX1cIj5cbiAgICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgICAgfX08L21hdC1oaW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndpZGdldENvbnRlbnRcIj5cbiAgICAgICAgICA8bGliLXNvcnRhYmxlLXdpZGdldFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXlcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10ZXN0aWRdPVwid2lkZ2V0SW5zdGFuY2Uua2V5XCJcbiAgICAgICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICAgPjwvbGliLXNvcnRhYmxlLXdpZGdldD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5NQVRSSVhcIiBjbGFzcz1cIndpZGdldENvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxhYmVsQ29udGFpbmVyXCI+XG4gICAgICAgIDxoNCAqbmdJZj1cIndpZGdldEluc3RhbmNlLnNob3dMYWJlbFwiIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fVwiPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dGFibGUgY2xhc3M9XCJtYXRyaXhUYWJsZSB3aWRnZXRDb250ZW50XCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgICA8dGggY2xhc3M9XCJvcHRpb25MYWJlbFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uc1wiPlxuICAgICAgICAgICAge3sgb3B0aW9uLmRpc3BsYXlWYWx1ZSB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcXVlc3Rpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUucm93czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDx0aCBjbGFzcz1cInF1ZXN0aW9uTGFiZWxcIj5cbiAgICAgICAgICAgIDxsYWJlbD57eyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgfX08L2xhYmVsPlxuICAgICAgICAgIDwvdGg+XG5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJzZWxlY3RUZFwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygd2lkZ2V0SW5zdGFuY2UudmFsdWUuY29sdW1uczsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ3aWRnZXRJbnN0YW5jZS5rZXkgKyAnLicgKyBxdWVzdGlvbi5jb2RlXCJcbiAgICAgICAgICAgICAgW25hbWVdPVwiJ3EnICsgaVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uIFt2YWx1ZV09XCJvcHRpb24uY29kZVwiPiA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5pc011bHRpcGxlXCI+XG4gICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgd2lkZ2V0SW5zdGFuY2Uua2V5ICsgJy5kYXRhLicgKyBxdWVzdGlvbi5jb2RlICsgJy4nICsgb3B0aW9uLmNvZGVcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ3aWRnZXRJbnN0YW5jZS52YWx1ZVsnZGF0YSddW3F1ZXN0aW9uLmNvZGVdW29wdGlvbi5jb2RlXVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgID48L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIndpZGdldEluc3RhbmNlLmJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlTWF0cml4Um93KHF1ZXN0aW9uKVwiXG4gICAgICAgICAgICA+PHNtYXJ0LWljb24gaWNvbj1cImNsb3NlXCI+PC9zbWFydC1pY29uXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2UudHlwZSA9PT0gc21hcnRGb3JtV2lkZ2V0VHlwZS5ZT1VUVUJFX1BMQVlFUlwiIGNsYXNzPVwid2lkZ2V0Q29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGFiZWxDb250YWluZXJcIj5cbiAgICAgICAgPGg0XG4gICAgICAgICAgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZS5zaG93TGFiZWxcIlxuICAgICAgICAgIGNsYXNzPVwie3sgbGFiZWxDb2xvciB9fSB7eyB3aWRnZXRJbnN0YW5jZS5jc3NMYWJlbENsYXNzIH19XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJnZXRMYWJlbE5nQ2xhc3MoKVwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiZ2V0TGFiZWxTdHlsZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGdldFdpZGdldExhYmVsKHdpZGdldEluc3RhbmNlKSB9fVxuICAgICAgICA8L2g0PlxuICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJ3aWRnZXRJbnN0YW5jZT8uaGludD8ucG9zaXRpb24gPT09IFNtYXJ0V2lkZ2V0SGludFBvc2l0aW9uLkxBQkVMXCI+e3tcbiAgICAgICAgICB3aWRnZXRJbnN0YW5jZS5oaW50Py50ZXh0XG4gICAgICAgIH19PC9tYXQtaGludD5cbiAgICAgIDwvZGl2PlxuICAgICAgPHlvdXR1YmUtcGxheWVyXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldE5nQ2xhc3MoKVwiXG4gICAgICAgIFtuZ1N0eWxlXT1cImdldFN0eWxlKClcIlxuICAgICAgICB2aWRlb0lkPVwie3sgd2lkZ2V0SW5zdGFuY2UudmlkZW9JZCB9fVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXRJbnN0YW5jZS53aWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwid2lkZ2V0SW5zdGFuY2UuaGVpZ2h0XCJcbiAgICAgICAgW3N0YXJ0U2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5zdGFydFNlY29uZHNcIlxuICAgICAgICBbZW5kU2Vjb25kc109XCJ3aWRnZXRJbnN0YW5jZS5lbmRTZWNvbmRzXCJcbiAgICAgID48L3lvdXR1YmUtcGxheWVyPlxuICAgICAgPG1hdC1oaW50XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgIXdpZGdldEluc3RhbmNlPy5oaW50IHx8IHdpZGdldEluc3RhbmNlPy5oaW50Py5wb3NpdGlvbiA9PT0gU21hcnRXaWRnZXRIaW50UG9zaXRpb24uSU5QVVRcbiAgICAgICAgXCJcbiAgICAgICAgPnt7IHdpZGdldEluc3RhbmNlLmhpbnQ/LnRleHQgfX08L21hdC1oaW50XG4gICAgICA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cIndpZGdldEluc3RhbmNlLnR5cGUgPT09IHNtYXJ0Rm9ybVdpZGdldFR5cGUuTU9OVEhfUElDS0VSXCIgY2xhc3M9XCJ3aWRnZXRDb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbENvbnRhaW5lclwiICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2Uuc2hvd0xhYmVsXCI+XG4gICAgICAgIDxoNCBjbGFzcz1cInt7IGxhYmVsQ29sb3IgfX0gc21hcnQtZm9ybS13aWRnZXQtbGFiZWxcIj5cbiAgICAgICAgICB7eyBnZXRXaWRnZXRMYWJlbCh3aWRnZXRJbnN0YW5jZSkgfX1cbiAgICAgICAgPC9oND5cbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwid2lkZ2V0SW5zdGFuY2U/LmhpbnQ/LnBvc2l0aW9uID09PSBTbWFydFdpZGdldEhpbnRQb3NpdGlvbi5MQUJFTFwiPnt7XG4gICAgICAgICAgd2lkZ2V0SW5zdGFuY2UuaGludD8udGV4dFxuICAgICAgICB9fTwvbWF0LWhpbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxsaWItc21hcnQtbW9udGgtcGlja2VyXG4gICAgICAgIFthdHRyLmRhdGEtdGVzdGlkXT1cIndpZGdldEluc3RhbmNlLmtleVwiXG4gICAgICAgIFt3aWRnZXRJbnN0YW5jZV09XCJ3aWRnZXRJbnN0YW5jZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVZZWFyTW9udGhQaWNrZWQoJGV2ZW50KVwiXG4gICAgICA+PC9saWItc21hcnQtbW9udGgtcGlja2VyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbn1cbiJdfQ==