@piserve-tech/form-submission 1.3.314 → 1.3.316

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 (443) hide show
  1. package/README.md +24 -24
  2. package/ng-package.json +30 -0
  3. package/package.json +33 -46
  4. package/{assets → src/assets}/icons/close-sidebar-mark-icon.svg +3 -3
  5. package/{assets → src/assets}/icons/copy-icon.svg +5 -5
  6. package/{assets → src/assets}/icons/delete-icon.svg +7 -7
  7. package/{assets → src/assets}/icons/delete-no-outline-icon.svg +7 -7
  8. package/src/environment/environment.ts +6 -0
  9. package/src/form-fields/aggregate-function/aggregate-function.component.html +63 -0
  10. package/src/form-fields/aggregate-function/aggregate-function.component.scss +1 -0
  11. package/src/form-fields/aggregate-function/aggregate-function.component.spec.ts +21 -0
  12. package/src/form-fields/aggregate-function/aggregate-function.component.ts +148 -0
  13. package/src/form-fields/check-box-fields/check-box-fields.component.html +81 -0
  14. package/src/form-fields/check-box-fields/check-box-fields.component.scss +28 -0
  15. package/src/form-fields/check-box-fields/check-box-fields.component.spec.ts +21 -0
  16. package/src/form-fields/check-box-fields/check-box-fields.component.ts +538 -0
  17. package/src/form-fields/currency-fields/currency-fields.component.html +85 -0
  18. package/src/form-fields/currency-fields/currency-fields.component.scss +48 -0
  19. package/src/form-fields/currency-fields/currency-fields.component.spec.ts +21 -0
  20. package/src/form-fields/currency-fields/currency-fields.component.ts +589 -0
  21. package/src/form-fields/date-time-fields/date-time-fields.component.html +268 -0
  22. package/src/form-fields/date-time-fields/date-time-fields.component.scss +88 -0
  23. package/src/form-fields/date-time-fields/date-time-fields.component.spec.ts +21 -0
  24. package/src/form-fields/date-time-fields/date-time-fields.component.ts +693 -0
  25. package/src/form-fields/drop-down-fields/drop-down-fields.component.html +77 -0
  26. package/src/form-fields/drop-down-fields/drop-down-fields.component.scss +12 -0
  27. package/src/form-fields/drop-down-fields/drop-down-fields.component.spec.ts +21 -0
  28. package/src/form-fields/drop-down-fields/drop-down-fields.component.ts +698 -0
  29. package/src/form-fields/file-picker-fields/file-picker-fields.component.html +72 -0
  30. package/src/form-fields/file-picker-fields/file-picker-fields.component.scss +33 -0
  31. package/src/form-fields/file-picker-fields/file-picker-fields.component.spec.ts +21 -0
  32. package/src/form-fields/file-picker-fields/file-picker-fields.component.ts +256 -0
  33. package/src/form-fields/form-fields.module.ts +110 -0
  34. package/src/form-fields/hidden-field/hidden-field.component.scss +0 -0
  35. package/src/form-fields/hidden-field/hidden-field.component.spec.ts +21 -0
  36. package/src/form-fields/hidden-field/hidden-field.component.ts +156 -0
  37. package/src/form-fields/iframe-fields/iframe-fields.component.html +31 -0
  38. package/src/form-fields/iframe-fields/iframe-fields.component.scss +0 -0
  39. package/src/form-fields/iframe-fields/iframe-fields.component.spec.ts +21 -0
  40. package/src/form-fields/iframe-fields/iframe-fields.component.ts +225 -0
  41. package/src/form-fields/location-fields/location-fields.component.html +54 -0
  42. package/src/form-fields/location-fields/location-fields.component.scss +22 -0
  43. package/src/form-fields/location-fields/location-fields.component.spec.ts +21 -0
  44. package/src/form-fields/location-fields/location-fields.component.ts +83 -0
  45. package/src/form-fields/mail-fields/mail-fields.component.html +66 -0
  46. package/src/form-fields/mail-fields/mail-fields.component.scss +10 -0
  47. package/src/form-fields/mail-fields/mail-fields.component.spec.ts +21 -0
  48. package/src/form-fields/mail-fields/mail-fields.component.ts +127 -0
  49. package/src/form-fields/mobile-fields/mobile-fields.component.html +97 -0
  50. package/src/form-fields/mobile-fields/mobile-fields.component.scss +52 -0
  51. package/src/form-fields/mobile-fields/mobile-fields.component.spec.ts +21 -0
  52. package/src/form-fields/mobile-fields/mobile-fields.component.ts +310 -0
  53. package/src/form-fields/number-fields/number-fields.component.html +70 -0
  54. package/src/form-fields/number-fields/number-fields.component.scss +17 -0
  55. package/src/form-fields/number-fields/number-fields.component.spec.ts +21 -0
  56. package/src/form-fields/number-fields/number-fields.component.ts +256 -0
  57. package/src/form-fields/password-fields/password-fields.component.html +113 -0
  58. package/src/form-fields/password-fields/password-fields.component.scss +61 -0
  59. package/src/form-fields/password-fields/password-fields.component.spec.ts +21 -0
  60. package/src/form-fields/password-fields/password-fields.component.ts +273 -0
  61. package/src/form-fields/radio-button-fields/radio-button-fields.component.html +82 -0
  62. package/src/form-fields/radio-button-fields/radio-button-fields.component.scss +28 -0
  63. package/src/form-fields/radio-button-fields/radio-button-fields.component.spec.ts +21 -0
  64. package/src/form-fields/radio-button-fields/radio-button-fields.component.ts +391 -0
  65. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.html +67 -0
  66. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.scss +23 -0
  67. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.spec.ts +21 -0
  68. package/src/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.ts +145 -0
  69. package/src/form-fields/section-fields/section-fields.component.html +4 -0
  70. package/src/form-fields/section-fields/section-fields.component.scss +37 -0
  71. package/src/form-fields/section-fields/section-fields.component.spec.ts +21 -0
  72. package/src/form-fields/section-fields/section-fields.component.ts +25 -0
  73. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.html +93 -0
  74. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.scss +52 -0
  75. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.spec.ts +21 -0
  76. package/src/form-fields/selection-matrix-fields/selection-matrix-fields.component.ts +155 -0
  77. package/src/form-fields/signature-fields/signature-fields.component.html +43 -0
  78. package/src/form-fields/signature-fields/signature-fields.component.scss +10 -0
  79. package/src/form-fields/signature-fields/signature-fields.component.spec.ts +21 -0
  80. package/src/form-fields/signature-fields/signature-fields.component.ts +25 -0
  81. package/src/form-fields/slider-fields/slider-fields.component.html +67 -0
  82. package/src/form-fields/slider-fields/slider-fields.component.scss +55 -0
  83. package/src/form-fields/slider-fields/slider-fields.component.spec.ts +21 -0
  84. package/src/form-fields/slider-fields/slider-fields.component.ts +63 -0
  85. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.html +52 -0
  86. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.scss +85 -0
  87. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.spec.ts +21 -0
  88. package/src/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.ts +62 -0
  89. package/src/form-fields/text-area-fields/text-area-fields.component.html +68 -0
  90. package/src/form-fields/text-area-fields/text-area-fields.component.scss +19 -0
  91. package/src/form-fields/text-area-fields/text-area-fields.component.spec.ts +21 -0
  92. package/src/form-fields/text-area-fields/text-area-fields.component.ts +166 -0
  93. package/src/form-fields/text-fields/text-fields.component.html +67 -0
  94. package/src/form-fields/text-fields/text-fields.component.scss +26 -0
  95. package/src/form-fields/text-fields/text-fields.component.spec.ts +21 -0
  96. package/src/form-fields/text-fields/text-fields.component.ts +248 -0
  97. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.html +70 -0
  98. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.scss +112 -0
  99. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.spec.ts +21 -0
  100. package/src/form-fields/toggle-switch-fields/toggle-switch-fields.component.ts +74 -0
  101. package/src/form-fields/url-fields/url-fields.component.html +109 -0
  102. package/src/form-fields/url-fields/url-fields.component.scss +22 -0
  103. package/src/form-fields/url-fields/url-fields.component.spec.ts +21 -0
  104. package/src/form-fields/url-fields/url-fields.component.ts +123 -0
  105. package/src/form-submission/form-submission.module.ts +40 -0
  106. package/src/form-submission/header/header.component.html +6 -0
  107. package/src/form-submission/header/header.component.scss +26 -0
  108. package/src/form-submission/header/header.component.spec.ts +21 -0
  109. package/src/form-submission/header/header.component.ts +12 -0
  110. package/src/form-submission/navigation-tabs/navigation-tabs.component.html +134 -0
  111. package/src/form-submission/navigation-tabs/navigation-tabs.component.scss +200 -0
  112. package/src/form-submission/navigation-tabs/navigation-tabs.component.spec.ts +21 -0
  113. package/src/form-submission/navigation-tabs/navigation-tabs.component.ts +134 -0
  114. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.html +207 -0
  115. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.scss +208 -0
  116. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.spec.ts +21 -0
  117. package/src/form-submission/next-prev-navigation/next-prev-navigation.component.ts +74 -0
  118. package/src/form-submission/save-as-draft/saveDraftModalComponent .ts +60 -0
  119. package/src/form-submission/save-as-draft/saveDraftModalComponent.html +33 -0
  120. package/src/form-submission/save-as-draft/saveDraftModalComponent.scss +195 -0
  121. package/src/form-submission/submission-container/submission-container.component.html +30 -0
  122. package/src/form-submission/submission-container/submission-container.component.scss +67 -0
  123. package/src/form-submission/submission-container/submission-container.component.spec.ts +21 -0
  124. package/src/form-submission/submission-container/submission-container.component.ts +14 -0
  125. package/src/form-submission/submit-form/submit-form.component.html +76 -0
  126. package/src/form-submission/submit-form/submit-form.component.scss +88 -0
  127. package/src/form-submission/submit-form/submit-form.component.spec.ts +21 -0
  128. package/src/form-submission/submit-form/submit-form.component.ts +1953 -0
  129. package/src/lib/form-submission.component.html +15 -0
  130. package/src/lib/form-submission.component.scss +1 -0
  131. package/src/lib/form-submission.component.ts +120 -0
  132. package/src/lib/form-submission.module.ts +31 -0
  133. package/src/lib/form-submission.service.spec.ts +16 -0
  134. package/src/lib/form-submission.service.ts +9 -0
  135. package/src/models/aggregate.model.ts +4 -0
  136. package/{models/answer.model.d.ts → src/models/answer.model.ts} +25 -23
  137. package/src/models/appearance.model.ts +64 -0
  138. package/{models/attachment.model.d.ts → src/models/attachment.model.ts} +6 -6
  139. package/{models/defaultAnswerEntry.model.d.ts → src/models/defaultAnswerEntry.model.ts} +7 -5
  140. package/{models/defaultAnswersModel.model.d.ts → src/models/defaultAnswersModel.model.ts} +5 -4
  141. package/{models/defaultQuestionAnswer.model.d.ts → src/models/defaultQuestionAnswer.model.ts} +6 -6
  142. package/src/models/elementOptionAPI.model.ts +13 -0
  143. package/src/models/elementOptionAPIData.model.ts +5 -0
  144. package/src/models/elementOptionDB.model.ts +9 -0
  145. package/src/models/elementOptionDBCriteria.model.ts +7 -0
  146. package/{models/emitters.model.d.ts → src/models/emitters.model.ts} +8 -8
  147. package/{models/enum/condition.enum.d.ts → src/models/enum/condition.enum.ts} +2 -2
  148. package/src/models/enum/elementType .enum.ts +22 -0
  149. package/src/models/enum/entityType.enum.ts +10 -0
  150. package/{models/formConfiguration.model.d.ts → src/models/formConfiguration.model.ts} +2 -2
  151. package/{models/formElement.model.d.ts → src/models/formElement.model.ts} +22 -22
  152. package/{models/formElementType.model.d.ts → src/models/formElementType.model.ts} +3 -2
  153. package/{models/grid.model.d.ts → src/models/grid.model.ts} +14 -13
  154. package/{models/hiddenField.model.d.ts → src/models/hiddenField.model.ts} +5 -5
  155. package/{models/iFrameProperties.model.d.ts → src/models/iFrameProperties.model.ts} +13 -13
  156. package/src/models/logic.model.ts +11 -0
  157. package/src/models/multifields.model.ts +12 -0
  158. package/{models/option.model.d.ts → src/models/option.model.ts} +5 -5
  159. package/src/models/page.model.ts +7 -0
  160. package/src/models/publicForm.model.ts +19 -0
  161. package/src/models/question.model.ts +27 -0
  162. package/src/models/questionAnswer.model.ts +8 -0
  163. package/src/models/questionGroup.model.ts +12 -0
  164. package/src/models/response.model.ts +9 -0
  165. package/src/models/result.model.ts +5 -0
  166. package/{models/row.model.d.ts → src/models/row.model.ts} +2 -1
  167. package/src/models/scoring.model.ts +10 -0
  168. package/src/models/section.model.ts +6 -0
  169. package/src/models/subForm.model.ts +25 -0
  170. package/src/models/subformConfiguration.model.ts +4 -0
  171. package/src/models/subformPropery.model.ts +8 -0
  172. package/{models/submission.model.d.ts → src/models/submission.model.ts} +16 -14
  173. package/{models/submissionCopyConfig.mopdel.d.ts → src/models/submissionCopyConfig.mopdel.ts} +4 -4
  174. package/{models/terms&condition.model.d.ts → src/models/terms&condition.model.ts} +1 -1
  175. package/src/models/validation.model.ts +48 -0
  176. package/src/models/whenClause.model.ts +7 -0
  177. package/{models/whenClauseCondition.model.d.ts → src/models/whenClauseCondition.model.ts} +6 -6
  178. package/{models/whenClauseElements.model.d.ts → src/models/whenClauseElements.model.ts} +6 -5
  179. package/{public-api.d.ts → src/public-api.ts} +4 -0
  180. package/src/question/card-subform/card-subform.component.html +282 -0
  181. package/src/question/card-subform/card-subform.component.scss +49 -0
  182. package/src/question/card-subform/card-subform.component.spec.ts +21 -0
  183. package/src/question/card-subform/card-subform.component.ts +407 -0
  184. package/src/question/confirm-dialog/confirm-dialog.component.html +32 -0
  185. package/src/question/confirm-dialog/confirm-dialog.component.scss +109 -0
  186. package/src/question/confirm-dialog/confirm-dialog.component.spec.ts +21 -0
  187. package/src/question/confirm-dialog/confirm-dialog.component.ts +24 -0
  188. package/src/question/form-elements/form-elements.component.html +28 -0
  189. package/src/question/form-elements/form-elements.component.scss +0 -0
  190. package/src/question/form-elements/form-elements.component.spec.ts +21 -0
  191. package/src/question/form-elements/form-elements.component.ts +41 -0
  192. package/src/question/inline-multiple-subform/inline-multiple-subform.component.html +321 -0
  193. package/src/question/inline-multiple-subform/inline-multiple-subform.component.scss +78 -0
  194. package/src/question/inline-multiple-subform/inline-multiple-subform.component.spec.ts +21 -0
  195. package/src/question/inline-multiple-subform/inline-multiple-subform.component.ts +425 -0
  196. package/src/question/multifields/multifields.component.html +78 -0
  197. package/src/question/multifields/multifields.component.scss +6 -0
  198. package/src/question/multifields/multifields.component.spec.ts +21 -0
  199. package/src/question/multifields/multifields.component.ts +27 -0
  200. package/src/question/multiple-subform/multiple-subform.component.html +185 -0
  201. package/src/question/multiple-subform/multiple-subform.component.scss +52 -0
  202. package/src/question/multiple-subform/multiple-subform.component.spec.ts +21 -0
  203. package/src/question/multiple-subform/multiple-subform.component.ts +481 -0
  204. package/src/question/question/question.component.html +51 -0
  205. package/src/question/question/question.component.scss +0 -0
  206. package/src/question/question/question.component.spec.ts +21 -0
  207. package/src/question/question/question.component.ts +129 -0
  208. package/src/question/question-group/question-group.component.html +147 -0
  209. package/src/question/question-group/question-group.component.scss +36 -0
  210. package/src/question/question-group/question-group.component.spec.ts +21 -0
  211. package/src/question/question-group/question-group.component.ts +94 -0
  212. package/src/question/question.module.ts +22 -0
  213. package/src/question/recursive-logic/recursive-logic.component.html +33 -0
  214. package/src/question/recursive-logic/recursive-logic.component.scss +0 -0
  215. package/src/question/recursive-logic/recursive-logic.component.spec.ts +21 -0
  216. package/src/question/recursive-logic/recursive-logic.component.ts +29 -0
  217. package/src/question/sub-form/sub-form.component.html +254 -0
  218. package/src/question/sub-form/sub-form.component.scss +83 -0
  219. package/src/question/sub-form/sub-form.component.spec.ts +21 -0
  220. package/src/question/sub-form/sub-form.component.ts +421 -0
  221. package/src/services/aggregate.service.ts +148 -0
  222. package/src/services/countryService.ts +92 -0
  223. package/src/services/data.service.ts +36 -0
  224. package/src/services/element-tracker.service.spec.ts +16 -0
  225. package/src/services/element-tracker.service.ts +24 -0
  226. package/src/services/form-validation.service.ts +151 -0
  227. package/src/services/form.service.spec.ts +16 -0
  228. package/src/services/form.service.ts +407 -0
  229. package/src/services/mapper.service.ts +625 -0
  230. package/src/services/recaptcha.service.spec.ts +16 -0
  231. package/src/services/recaptcha.service.ts +179 -0
  232. package/src/services/score.service.ts +352 -0
  233. package/src/services/subform-copy.service.ts +148 -0
  234. package/src/services/validation.service.spec.ts +16 -0
  235. package/src/services/validation.service.ts +33 -0
  236. package/src/services/whenClause.service.ts +502 -0
  237. package/src/shared/shared.module.ts +58 -0
  238. package/src/styles/shared-style.scss +86 -0
  239. package/src/sub-form/sub-form.module.ts +24 -0
  240. package/src/sub-form/submission-modal/submission-modal.component.html +160 -0
  241. package/src/sub-form/submission-modal/submission-modal.component.scss +54 -0
  242. package/src/sub-form/submission-modal/submission-modal.component.spec.ts +21 -0
  243. package/src/sub-form/submission-modal/submission-modal.component.ts +127 -0
  244. package/tsconfig.lib.json +14 -0
  245. package/tsconfig.lib.prod.json +10 -0
  246. package/tsconfig.spec.json +14 -0
  247. package/environment/environment.d.ts +0 -5
  248. package/esm2022/environment/environment.mjs +0 -6
  249. package/esm2022/form-fields/aggregate-function/aggregate-function.component.mjs +0 -146
  250. package/esm2022/form-fields/check-box-fields/check-box-fields.component.mjs +0 -473
  251. package/esm2022/form-fields/currency-fields/currency-fields.component.mjs +0 -502
  252. package/esm2022/form-fields/date-time-fields/date-time-fields.component.mjs +0 -608
  253. package/esm2022/form-fields/drop-down-fields/drop-down-fields.component.mjs +0 -585
  254. package/esm2022/form-fields/file-picker-fields/file-picker-fields.component.mjs +0 -224
  255. package/esm2022/form-fields/form-fields.module.mjs +0 -174
  256. package/esm2022/form-fields/hidden-field/hidden-field.component.mjs +0 -137
  257. package/esm2022/form-fields/iframe-fields/iframe-fields.component.mjs +0 -198
  258. package/esm2022/form-fields/location-fields/location-fields.component.mjs +0 -85
  259. package/esm2022/form-fields/mail-fields/mail-fields.component.mjs +0 -131
  260. package/esm2022/form-fields/mobile-fields/mobile-fields.component.mjs +0 -270
  261. package/esm2022/form-fields/number-fields/number-fields.component.mjs +0 -242
  262. package/esm2022/form-fields/password-fields/password-fields.component.mjs +0 -257
  263. package/esm2022/form-fields/radio-button-fields/radio-button-fields.component.mjs +0 -346
  264. package/esm2022/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.mjs +0 -148
  265. package/esm2022/form-fields/section-fields/section-fields.component.mjs +0 -29
  266. package/esm2022/form-fields/selection-matrix-fields/selection-matrix-fields.component.mjs +0 -158
  267. package/esm2022/form-fields/signature-fields/signature-fields.component.mjs +0 -32
  268. package/esm2022/form-fields/slider-fields/slider-fields.component.mjs +0 -73
  269. package/esm2022/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.mjs +0 -66
  270. package/esm2022/form-fields/text-area-fields/text-area-fields.component.mjs +0 -159
  271. package/esm2022/form-fields/text-fields/text-fields.component.mjs +0 -245
  272. package/esm2022/form-fields/toggle-switch-fields/toggle-switch-fields.component.mjs +0 -85
  273. package/esm2022/form-fields/url-fields/url-fields.component.mjs +0 -124
  274. package/esm2022/form-submission/form-submission.module.mjs +0 -64
  275. package/esm2022/form-submission/header/header.component.mjs +0 -20
  276. package/esm2022/form-submission/navigation-tabs/navigation-tabs.component.mjs +0 -171
  277. package/esm2022/form-submission/next-prev-navigation/next-prev-navigation.component.mjs +0 -124
  278. package/esm2022/form-submission/save-as-draft/saveDraftModalComponent .mjs +0 -50
  279. package/esm2022/form-submission/submission-container/submission-container.component.mjs +0 -17
  280. package/esm2022/form-submission/submit-form/submit-form.component.mjs +0 -1610
  281. package/esm2022/lib/form-submission.component.mjs +0 -113
  282. package/esm2022/lib/form-submission.module.mjs +0 -56
  283. package/esm2022/lib/form-submission.service.mjs +0 -14
  284. package/esm2022/models/aggregate.model.mjs +0 -2
  285. package/esm2022/models/answer.model.mjs +0 -2
  286. package/esm2022/models/appearance.model.mjs +0 -2
  287. package/esm2022/models/attachment.model.mjs +0 -2
  288. package/esm2022/models/defaultAnswerEntry.model.mjs +0 -2
  289. package/esm2022/models/defaultAnswersModel.model.mjs +0 -2
  290. package/esm2022/models/defaultQuestionAnswer.model.mjs +0 -2
  291. package/esm2022/models/elementOptionAPI.model.mjs +0 -2
  292. package/esm2022/models/elementOptionAPIData.model.mjs +0 -2
  293. package/esm2022/models/elementOptionDB.model.mjs +0 -2
  294. package/esm2022/models/elementOptionDBCriteria.model.mjs +0 -2
  295. package/esm2022/models/emitters.model.mjs +0 -2
  296. package/esm2022/models/enum/condition.enum.mjs +0 -18
  297. package/esm2022/models/enum/elementType .enum.mjs +0 -24
  298. package/esm2022/models/enum/entityType.enum.mjs +0 -12
  299. package/esm2022/models/formConfiguration.model.mjs +0 -2
  300. package/esm2022/models/formElement.model.mjs +0 -2
  301. package/esm2022/models/formElementType.model.mjs +0 -2
  302. package/esm2022/models/grid.model.mjs +0 -2
  303. package/esm2022/models/hiddenField.model.mjs +0 -2
  304. package/esm2022/models/iFrameProperties.model.mjs +0 -2
  305. package/esm2022/models/logic.model.mjs +0 -2
  306. package/esm2022/models/multifields.model.mjs +0 -2
  307. package/esm2022/models/option.model.mjs +0 -2
  308. package/esm2022/models/page.model.mjs +0 -2
  309. package/esm2022/models/publicForm.model.mjs +0 -2
  310. package/esm2022/models/question.model.mjs +0 -2
  311. package/esm2022/models/questionAnswer.model.mjs +0 -2
  312. package/esm2022/models/questionGroup.model.mjs +0 -2
  313. package/esm2022/models/row.model.mjs +0 -2
  314. package/esm2022/models/scoring.model.mjs +0 -2
  315. package/esm2022/models/section.model.mjs +0 -2
  316. package/esm2022/models/subForm.model.mjs +0 -2
  317. package/esm2022/models/subformConfiguration.model.mjs +0 -2
  318. package/esm2022/models/subformPropery.model.mjs +0 -2
  319. package/esm2022/models/submission.model.mjs +0 -2
  320. package/esm2022/models/submissionCopyConfig.mopdel.mjs +0 -2
  321. package/esm2022/models/terms&condition.model.mjs +0 -2
  322. package/esm2022/models/validation.model.mjs +0 -2
  323. package/esm2022/models/whenClause.model.mjs +0 -2
  324. package/esm2022/models/whenClauseCondition.model.mjs +0 -2
  325. package/esm2022/models/whenClauseElements.model.mjs +0 -2
  326. package/esm2022/piserve-tech-form-submission.mjs +0 -5
  327. package/esm2022/public-api.mjs +0 -7
  328. package/esm2022/question/card-subform/card-subform.component.mjs +0 -354
  329. package/esm2022/question/confirm-dialog/confirm-dialog.component.mjs +0 -27
  330. package/esm2022/question/form-elements/form-elements.component.mjs +0 -62
  331. package/esm2022/question/inline-multiple-subform/inline-multiple-subform.component.mjs +0 -384
  332. package/esm2022/question/multifields/multifields.component.mjs +0 -54
  333. package/esm2022/question/multiple-subform/multiple-subform.component.mjs +0 -413
  334. package/esm2022/question/question/question.component.mjs +0 -145
  335. package/esm2022/question/question-group/question-group.component.mjs +0 -102
  336. package/esm2022/question/recursive-logic/recursive-logic.component.mjs +0 -49
  337. package/esm2022/question/sub-form/sub-form.component.mjs +0 -351
  338. package/esm2022/services/aggregate.service.mjs +0 -139
  339. package/esm2022/services/countryService.mjs +0 -89
  340. package/esm2022/services/data.service.mjs +0 -36
  341. package/esm2022/services/element-tracker.service.mjs +0 -27
  342. package/esm2022/services/form-validation.service.mjs +0 -128
  343. package/esm2022/services/form.service.mjs +0 -333
  344. package/esm2022/services/mapper.service.mjs +0 -519
  345. package/esm2022/services/recaptcha.service.mjs +0 -136
  346. package/esm2022/services/score.service.mjs +0 -268
  347. package/esm2022/services/subform-copy.service.mjs +0 -122
  348. package/esm2022/services/validation.service.mjs +0 -35
  349. package/esm2022/services/whenClause.service.mjs +0 -423
  350. package/esm2022/shared/shared.module.mjs +0 -97
  351. package/esm2022/sub-form/submission-modal/submission-modal.component.mjs +0 -133
  352. package/fesm2022/piserve-tech-form-submission.mjs +0 -11658
  353. package/fesm2022/piserve-tech-form-submission.mjs.map +0 -1
  354. package/form-fields/aggregate-function/aggregate-function.component.d.ts +0 -43
  355. package/form-fields/check-box-fields/check-box-fields.component.d.ts +0 -73
  356. package/form-fields/currency-fields/currency-fields.component.d.ts +0 -62
  357. package/form-fields/date-time-fields/date-time-fields.component.d.ts +0 -96
  358. package/form-fields/drop-down-fields/drop-down-fields.component.d.ts +0 -88
  359. package/form-fields/file-picker-fields/file-picker-fields.component.d.ts +0 -72
  360. package/form-fields/form-fields.module.d.ts +0 -40
  361. package/form-fields/hidden-field/hidden-field.component.d.ts +0 -38
  362. package/form-fields/iframe-fields/iframe-fields.component.d.ts +0 -35
  363. package/form-fields/location-fields/location-fields.component.d.ts +0 -29
  364. package/form-fields/mail-fields/mail-fields.component.d.ts +0 -41
  365. package/form-fields/mobile-fields/mobile-fields.component.d.ts +0 -71
  366. package/form-fields/number-fields/number-fields.component.d.ts +0 -53
  367. package/form-fields/password-fields/password-fields.component.d.ts +0 -57
  368. package/form-fields/radio-button-fields/radio-button-fields.component.d.ts +0 -70
  369. package/form-fields/rich-text-editor-fields/rich-text-editor-fields.component.d.ts +0 -46
  370. package/form-fields/section-fields/section-fields.component.d.ts +0 -10
  371. package/form-fields/selection-matrix-fields/selection-matrix-fields.component.d.ts +0 -45
  372. package/form-fields/signature-fields/signature-fields.component.d.ts +0 -13
  373. package/form-fields/slider-fields/slider-fields.component.d.ts +0 -32
  374. package/form-fields/terms-and-condition-fields/terms-and-condition-fields.component.d.ts +0 -26
  375. package/form-fields/text-area-fields/text-area-fields.component.d.ts +0 -49
  376. package/form-fields/text-fields/text-fields.component.d.ts +0 -49
  377. package/form-fields/toggle-switch-fields/toggle-switch-fields.component.d.ts +0 -29
  378. package/form-fields/url-fields/url-fields.component.d.ts +0 -41
  379. package/form-submission/form-submission.module.d.ts +0 -20
  380. package/form-submission/header/header.component.d.ts +0 -7
  381. package/form-submission/navigation-tabs/navigation-tabs.component.d.ts +0 -57
  382. package/form-submission/next-prev-navigation/next-prev-navigation.component.d.ts +0 -46
  383. package/form-submission/save-as-draft/saveDraftModalComponent .d.ts +0 -17
  384. package/form-submission/submission-container/submission-container.component.d.ts +0 -7
  385. package/form-submission/submit-form/submit-form.component.d.ts +0 -237
  386. package/index.d.ts +0 -5
  387. package/lib/form-submission.component.d.ts +0 -30
  388. package/lib/form-submission.module.d.ts +0 -16
  389. package/lib/form-submission.service.d.ts +0 -6
  390. package/models/aggregate.model.d.ts +0 -4
  391. package/models/appearance.model.d.ts +0 -64
  392. package/models/elementOptionAPI.model.d.ts +0 -12
  393. package/models/elementOptionAPIData.model.d.ts +0 -5
  394. package/models/elementOptionDB.model.d.ts +0 -8
  395. package/models/elementOptionDBCriteria.model.d.ts +0 -7
  396. package/models/enum/elementType .enum.d.ts +0 -22
  397. package/models/enum/entityType.enum.d.ts +0 -10
  398. package/models/logic.model.d.ts +0 -9
  399. package/models/multifields.model.d.ts +0 -11
  400. package/models/page.model.d.ts +0 -6
  401. package/models/publicForm.model.d.ts +0 -18
  402. package/models/question.model.d.ts +0 -26
  403. package/models/questionAnswer.model.d.ts +0 -7
  404. package/models/questionGroup.model.d.ts +0 -11
  405. package/models/scoring.model.d.ts +0 -10
  406. package/models/section.model.d.ts +0 -6
  407. package/models/subForm.model.d.ts +0 -24
  408. package/models/subformConfiguration.model.d.ts +0 -4
  409. package/models/subformPropery.model.d.ts +0 -7
  410. package/models/validation.model.d.ts +0 -48
  411. package/models/whenClause.model.d.ts +0 -6
  412. package/question/card-subform/card-subform.component.d.ts +0 -44
  413. package/question/confirm-dialog/confirm-dialog.component.d.ts +0 -12
  414. package/question/form-elements/form-elements.component.d.ts +0 -20
  415. package/question/inline-multiple-subform/inline-multiple-subform.component.d.ts +0 -47
  416. package/question/multifields/multifields.component.d.ts +0 -11
  417. package/question/multiple-subform/multiple-subform.component.d.ts +0 -39
  418. package/question/question/question.component.d.ts +0 -30
  419. package/question/question-group/question-group.component.d.ts +0 -29
  420. package/question/recursive-logic/recursive-logic.component.d.ts +0 -19
  421. package/question/sub-form/sub-form.component.d.ts +0 -70
  422. package/services/aggregate.service.d.ts +0 -29
  423. package/services/countryService.d.ts +0 -21
  424. package/services/data.service.d.ts +0 -19
  425. package/services/element-tracker.service.d.ts +0 -10
  426. package/services/form-validation.service.d.ts +0 -16
  427. package/services/form.service.d.ts +0 -27
  428. package/services/mapper.service.d.ts +0 -31
  429. package/services/recaptcha.service.d.ts +0 -46
  430. package/services/score.service.d.ts +0 -27
  431. package/services/subform-copy.service.d.ts +0 -10
  432. package/services/validation.service.d.ts +0 -14
  433. package/services/whenClause.service.d.ts +0 -45
  434. package/shared/shared.module.d.ts +0 -25
  435. package/sub-form/submission-modal/submission-modal.component.d.ts +0 -31
  436. /package/{assets → src/assets}/fonts/Garamond.woff2 +0 -0
  437. /package/{assets → src/assets}/fonts/Georgia.woff2 +0 -0
  438. /package/{assets → src/assets}/fonts/Poppins.woff2 +0 -0
  439. /package/{assets → src/assets}/fonts/Tahoma.woff2 +0 -0
  440. /package/{assets → src/assets}/fonts/Tajawal.woff2 +0 -0
  441. /package/{assets → src/assets}/fonts/Verdana.woff2 +0 -0
  442. /package/{assets → src/assets}/icons/left_arrow.svg +0 -0
  443. /package/{assets → src/assets}/icons/right_arrow.svg +0 -0
@@ -1,502 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "../../services/validation.service";
4
- import * as i2 from "../../services/element-tracker.service";
5
- import * as i3 from "../../services/aggregate.service";
6
- import * as i4 from "@angular/common";
7
- import * as i5 from "@angular/forms";
8
- export class CurrencyFieldsComponent {
9
- constructor(validationService, tracker, aggregateService) {
10
- this.validationService = validationService;
11
- this.tracker = tracker;
12
- this.aggregateService = aggregateService;
13
- this.question = {};
14
- this.inLine = false;
15
- this.inCard = false;
16
- this.disableEdit = false;
17
- this.answerChange = new EventEmitter();
18
- this.count = 0;
19
- this.required = false;
20
- this.hint = '';
21
- this.placeholder = '';
22
- this.currencySymbol = '';
23
- this.symbolPosition = 'Before the value';
24
- this.showAmountInWords = false;
25
- this.validationFailed = false;
26
- this.validationMessage = '';
27
- this.elementId = '';
28
- this.amountInWordsText = '';
29
- this.defaultCurrency = '';
30
- // 2) typed currency map
31
- this.currencyMap = {
32
- USD: {
33
- codes: ['USD'],
34
- symbols: ['$', 'US$'],
35
- mainUnit: 'Dollars',
36
- subUnit: 'Cents',
37
- decimals: 2,
38
- },
39
- INR: {
40
- codes: ['INR'],
41
- symbols: ['₹', 'Rs', '₨'],
42
- mainUnit: 'Rupees',
43
- subUnit: 'Paisa',
44
- decimals: 2,
45
- },
46
- EUR: {
47
- codes: ['EUR'],
48
- symbols: ['€'],
49
- mainUnit: 'Euros',
50
- subUnit: 'Cents',
51
- decimals: 2,
52
- },
53
- AED: {
54
- codes: ['AED'],
55
- symbols: ['AED', 'د.إ'],
56
- mainUnit: 'Dirhams',
57
- subUnit: 'Fils',
58
- decimals: 2,
59
- },
60
- GBP: {
61
- codes: ['GBP'],
62
- symbols: ['£'],
63
- mainUnit: 'Pounds',
64
- subUnit: 'Pence',
65
- decimals: 2,
66
- },
67
- JPY: {
68
- codes: ['JPY'],
69
- symbols: ['¥'],
70
- mainUnit: 'Yen',
71
- subUnit: '',
72
- decimals: 0,
73
- },
74
- // add more entries as needed
75
- };
76
- }
77
- ngOnInit() {
78
- this.valueAssigned();
79
- }
80
- valueAssigned() {
81
- this.count = this.question.count;
82
- this.required = this.question.required;
83
- this.hint = this.question.hint;
84
- this.defaultCurrency = this.question.formElement?.appearance?.defaultCurrency || '';
85
- this.placeholder = this.question.formElement?.appearance?.placeholder || '';
86
- this.currencySymbol = this.question.formElement?.appearance?.currencySymbol;
87
- this.decimalPrecision =
88
- this.question.formElement?.appearance?.decimalPrecision || 2;
89
- this.symbolPosition =
90
- this.question.formElement?.appearance?.symbolPosition ||
91
- 'Before the value';
92
- this.thousandSeparator =
93
- this.question.formElement?.appearance?.thousandSeparator;
94
- this.min = this.question.formElement.validation.min;
95
- this.max = this.question.formElement.validation.max;
96
- this.showAmountInWords =
97
- this.question.formElement?.appearance?.showAmountInWords;
98
- if (this.question.formElement?.appearance?.currency) {
99
- let userLocaleCureency = this.question.formElement?.appearance?.currency;
100
- if (this.question.formElement.appearance.currencyOption) {
101
- let currencyOption = this.question.formElement.appearance.currencyOption;
102
- if (currencyOption == 'auto') {
103
- if (this.question.formElement.appearance.limitCurrencySymbol &&
104
- this.question.formElement.appearance.limitCurrencySymbol.length > 0) {
105
- this.currencySymbol =
106
- this.question.formElement.appearance.limitCurrencySymbol.includes(userLocaleCureency)
107
- ? userLocaleCureency
108
- : this.question.formElement?.appearance?.currencySymbol;
109
- }
110
- else {
111
- this.currencySymbol = userLocaleCureency;
112
- }
113
- }
114
- else if (currencyOption == 'specific') {
115
- this.currencySymbol =
116
- this.question.formElement?.appearance?.specificCurrencySymbol;
117
- }
118
- }
119
- }
120
- if (!this.currencySymbol &&
121
- this.question.formElement?.appearance?.currencySymbol) {
122
- this.currencySymbol =
123
- this.question.formElement?.appearance?.currencySymbol;
124
- }
125
- if (this.question.formElement?.appearance?.defaultCurrency) {
126
- this.currencySymbol = this.question.formElement?.appearance?.defaultCurrency;
127
- }
128
- if (this.question.answerCurrency) {
129
- this.currencySymbol = this.question.answerCurrency;
130
- }
131
- if (this.question.answer) {
132
- this.initializeAnswer();
133
- }
134
- if (this.showAmountInWords) {
135
- this.amountInWordsText = this.question.amountInWords;
136
- }
137
- if (this.question.childLogics && this.question.answer) {
138
- this.updateChildLogics(this.question);
139
- }
140
- this.aggregateService.setNumberField(this.rowId, this.question.id, this.question.answer);
141
- }
142
- initializeAnswer() {
143
- let value = this.question?.answer;
144
- if (!value)
145
- return;
146
- // check if numeric
147
- if (!isNaN(Number(value))) {
148
- if (this.thousandSeparator) {
149
- const parts = value.split('.');
150
- parts[0] = Number(parts[0]).toLocaleString('en-US'); // adds proper thousand separator
151
- value = parts.join('.');
152
- }
153
- else {
154
- value = value;
155
- }
156
- }
157
- this.enteredAmount = value;
158
- }
159
- preventNumberScroll(event) {
160
- if (document.activeElement === event.target) {
161
- event.preventDefault();
162
- }
163
- }
164
- validateNumber() {
165
- this.validationFailed = false;
166
- this.validationService.clearInvalid(this.buildElementId());
167
- this.validationMessage = '';
168
- let enteredAmount = this.parseCurrencyToNumber(this.enteredAmount);
169
- if (this.required && !enteredAmount) {
170
- this.validationFailed = true;
171
- this.validationMessage = `Please enter a valid amount`;
172
- this.question.validationMessage = `Please enter a valid amount`;
173
- this.question.validation = false;
174
- }
175
- else if ((this.min !== undefined && enteredAmount < this.min) ||
176
- (this.max !== undefined && enteredAmount > this.max)) {
177
- this.validationFailed = true;
178
- // Construct appropriate validation message based on whether min, max, or both are provided
179
- if (this.min !== undefined && this.max !== undefined) {
180
- this.validationMessage = `Please enter a valid amount between ${this.min} and ${this.max}`;
181
- this.question.validationMessage = `Please enter a valid amount between ${this.min} and ${this.max}`;
182
- }
183
- else if (this.min !== undefined) {
184
- this.validationMessage = `Please enter a amount greater than or equal to ${this.min}`;
185
- this.question.validationMessage = `Please enter a amount greater than or equal to ${this.min}`;
186
- }
187
- else if (this.max !== undefined) {
188
- this.validationMessage = `Please enter a amount less than or equal to ${this.max}`;
189
- this.question.validationMessage = `Please enter a amount less than or equal to ${this.max}`;
190
- }
191
- this.question.validation = false;
192
- }
193
- else {
194
- this.question.validation = true;
195
- }
196
- if (this.question.childLogics) {
197
- this.updateChildLogics(this.question);
198
- }
199
- }
200
- validateInput(event) {
201
- this.validationService.clearInvalid(this.buildElementId());
202
- // remove existing commas & currency symbol
203
- let rawValue = (event.target.value || '')
204
- .replace(/,/g, '')
205
- .replace(this.currencySymbol || '', '');
206
- // remove any characters except digits and dot
207
- rawValue = rawValue.replace(/[^\d.]/g, '');
208
- // keep only the first dot (remove any additional dots)
209
- const firstDot = rawValue.indexOf('.');
210
- if (firstDot !== -1) {
211
- // split into before-first-dot and rest, remove additional dots from rest
212
- const before = rawValue.slice(0, firstDot);
213
- const after = rawValue.slice(firstDot + 1).replace(/\./g, '');
214
- rawValue = `${before}.${after}`;
215
- }
216
- // determine decimal precision to enforce (default to 2)
217
- const dp = typeof this.decimalPrecision === 'number' && this.decimalPrecision >= 0
218
- ? this.decimalPrecision
219
- : 2;
220
- // if there's a decimal part, trim it to allowed length
221
- if (rawValue.includes('.')) {
222
- const [intPart, decimalPart = ''] = rawValue.split('.');
223
- const trimmedDecimal = decimalPart.slice(0, dp);
224
- rawValue = trimmedDecimal
225
- ? `${intPart}.${trimmedDecimal}`
226
- : intPart + '.';
227
- }
228
- // format with thousand separator for display
229
- let formattedValue = rawValue;
230
- if (this.thousandSeparator && rawValue) {
231
- const parts = rawValue.split('.');
232
- // handle case where user types ".12" -> parts[0] === ''
233
- const intPartForFormat = parts[0] === '' ? '0' : parts[0];
234
- parts[0] = Number(intPartForFormat).toLocaleString('en-US');
235
- formattedValue = parts.join('.');
236
- // if original had leading '.' (user typed ".12"), restore it visually as ".12"
237
- if (rawValue.startsWith('.') && !formattedValue.startsWith('.')) {
238
- formattedValue = formattedValue.replace(/^0/, '');
239
- }
240
- }
241
- // keep numeric version for backend/calculations
242
- this.question.answer = rawValue;
243
- this.question.currencySymbol = this.currencySymbol;
244
- // update field display
245
- event.target.value = formattedValue;
246
- this.aggregateService.setNumberField(this.rowId, this.question.id, rawValue ? parseFloat(rawValue) : 0);
247
- if (this.question.childLogics) {
248
- this.updateChildLogics(this.question);
249
- }
250
- if (this.showAmountInWords) {
251
- this.amountInWordsText = this.convertAmountToWords(rawValue);
252
- this.question.amountInWords = this.amountInWordsText;
253
- }
254
- this.answerChange.emit({
255
- answer: this.question.answer,
256
- maxPossibleScore: 0,
257
- amountInWords: this.question.amountInWords,
258
- currency: this.currencySymbol
259
- });
260
- this.validateNumber();
261
- }
262
- // 3) convertAmountToWords using CurrencyMeta typing
263
- convertAmountToWords(value) {
264
- if (!value)
265
- return '';
266
- // prefer currencyCode (ISO) if available; fall back to symbol
267
- const currencyCode = this.question?.currencyCode || null;
268
- const currencySymbol = this.question?.currencySymbol || this.currencySymbol || null;
269
- // find currency metadata from map:
270
- let meta;
271
- if (currencyCode) {
272
- meta = this.currencyMap[currencyCode];
273
- }
274
- if (!meta && currencySymbol) {
275
- meta = Object.values(this.currencyMap).find((m) => Array.isArray(m.symbols) && m.symbols.includes(currencySymbol));
276
- }
277
- // use fallback if not found — typed as CurrencyMeta
278
- if (!meta) {
279
- const fallbackName = (currencyCode ||
280
- currencySymbol ||
281
- 'Currency').toString();
282
- meta = {
283
- codes: [currencyCode || fallbackName],
284
- symbols: currencySymbol ? [currencySymbol] : [],
285
- mainUnit: fallbackName,
286
- subUnit: '',
287
- decimals: 2,
288
- };
289
- }
290
- // normalize numeric parts
291
- const normalized = (value || '').toString().replace(/,/g, '');
292
- const [intPartStr = '0', decimalPartStr = ''] = normalized.split('.');
293
- const intPartNum = Number(intPartStr) || 0;
294
- // calculate subunit number robustly:
295
- const dp = typeof meta.decimals === 'number' && meta.decimals >= 0
296
- ? meta.decimals
297
- : 2;
298
- let subUnitNumber = 0;
299
- if (dp > 0 && decimalPartStr) {
300
- const scale = Math.pow(10, dp);
301
- const decDigits = decimalPartStr.replace(/\D/g, '');
302
- // if shorter than dp, multiply; if longer, trim to dp
303
- const trimmed = decDigits.slice(0, dp);
304
- subUnitNumber = Number(trimmed) * Math.pow(10, dp - trimmed.length);
305
- // guard for rounding overflow (e.g., .999 -> 1.00)
306
- if (subUnitNumber >= scale) {
307
- // increment integer part
308
- return this.buildFinalPhrase(intPartNum + 1, 0, meta);
309
- }
310
- }
311
- return this.buildFinalPhrase(intPartNum, subUnitNumber, meta);
312
- }
313
- // 4) buildFinalPhrase accepts CurrencyMeta (or same shape) — typed accordingly
314
- buildFinalPhrase(intNum, subNum, meta) {
315
- const mainWords = this.numberToWords(intNum) || 'Zero';
316
- if (meta.decimals === 0 || !meta.subUnit) {
317
- return `${mainWords} ${meta.mainUnit} Only`;
318
- }
319
- if (!subNum) {
320
- return `${mainWords} ${meta.mainUnit} Only`;
321
- }
322
- const subWords = this.numberToWords(subNum);
323
- return `${mainWords} ${meta.mainUnit} and ${subWords} ${meta.subUnit} Only`;
324
- }
325
- // -------------------------
326
- // NUMBER → WORDS (Up to Crores)
327
- // -------------------------
328
- numberToWords(num) {
329
- if (num === 0)
330
- return 'Zero';
331
- const a = [
332
- '',
333
- 'One',
334
- 'Two',
335
- 'Three',
336
- 'Four',
337
- 'Five',
338
- 'Six',
339
- 'Seven',
340
- 'Eight',
341
- 'Nine',
342
- 'Ten',
343
- 'Eleven',
344
- 'Twelve',
345
- 'Thirteen',
346
- 'Fourteen',
347
- 'Fifteen',
348
- 'Sixteen',
349
- 'Seventeen',
350
- 'Eighteen',
351
- 'Nineteen',
352
- ];
353
- const b = [
354
- '',
355
- '',
356
- 'Twenty',
357
- 'Thirty',
358
- 'Forty',
359
- 'Fifty',
360
- 'Sixty',
361
- 'Seventy',
362
- 'Eighty',
363
- 'Ninety',
364
- ];
365
- const toWords = (n) => {
366
- if (n < 20)
367
- return a[n];
368
- if (n < 100)
369
- return `${b[Math.floor(n / 10)]} ${a[n % 10]}`.trim();
370
- if (n < 1000)
371
- return `${a[Math.floor(n / 100)]} Hundred ${toWords(n % 100)}`.trim();
372
- if (n < 100000)
373
- return `${toWords(Math.floor(n / 1000))} Thousand ${toWords(n % 1000)}`.trim();
374
- if (n < 10000000)
375
- return `${toWords(Math.floor(n / 100000))} Lakh ${toWords(n % 100000)}`.trim();
376
- return `${toWords(Math.floor(n / 10000000))} Crore ${toWords(n % 10000000)}`.trim();
377
- };
378
- return toWords(num);
379
- }
380
- updateChildLogics(question) {
381
- if (question.childLogics && Array.isArray(question.childLogics)) {
382
- question.childLogics.forEach((childLogic) => {
383
- if (this.evaluateCondition(question.answer, childLogic.condition, childLogic.inputValue)) {
384
- childLogic.showLogic = true;
385
- }
386
- else {
387
- childLogic.showLogic = false;
388
- this.clearAnswersRecursively(childLogic);
389
- }
390
- });
391
- }
392
- }
393
- parseCurrencyToNumber(value) {
394
- if (!value)
395
- return 0;
396
- // Remove currency symbol, commas, spaces
397
- const numericString = value
398
- .replace(new RegExp(`\\${this.currencySymbol}`, 'g'), '') // remove symbol
399
- .replace(/,/g, '') // remove thousand separators
400
- .trim();
401
- // Convert to number
402
- const num = parseFloat(numericString);
403
- return isNaN(num) ? 0 : num;
404
- }
405
- clearAnswersRecursively(logic) {
406
- if (!logic || !logic.rows)
407
- return;
408
- logic.rows.forEach((row) => {
409
- row.grid.forEach((item) => {
410
- const element = item.element;
411
- if (item.entityType === 'QUESTION' && element) {
412
- // Clear answer if present
413
- if ('answer' in element) {
414
- element.answer = '';
415
- }
416
- // Recursively clear childLogics if any
417
- if (element.childLogics && element.childLogics.length > 0) {
418
- element.childLogics.forEach((childLogic) => {
419
- this.clearAnswersRecursively(childLogic);
420
- });
421
- }
422
- }
423
- if (item.entityType === 'SUBFORM' && element && element.rows) {
424
- // SUBFORM contains its own rows structure like a form
425
- this.clearAnswersRecursively({ rows: element.rows });
426
- }
427
- });
428
- });
429
- }
430
- evaluateCondition(answer, condition, inputValue) {
431
- switch (condition) {
432
- case '>':
433
- return answer > Number(inputValue);
434
- case '<':
435
- return answer < Number(inputValue);
436
- case '>=':
437
- return answer >= Number(inputValue);
438
- case '<=':
439
- return answer <= Number(inputValue);
440
- case '=':
441
- return answer == inputValue;
442
- case '!=':
443
- return answer != inputValue;
444
- default:
445
- return false;
446
- }
447
- }
448
- handleValidation(isValid, message = 'This field is required') {
449
- if (isValid) {
450
- this.validationService.clearInvalid(this.buildElementId());
451
- }
452
- else {
453
- // this.validationService.setInvalid(this.question.id, message);
454
- }
455
- }
456
- buildElementId() {
457
- return this.inLine || this.inCard
458
- ? `${this.submissionIndex}-${this.question.id}`
459
- : `${this.question.id}`;
460
- }
461
- get isInvalid() {
462
- return !!this.validationService.getErrorMessage(this.buildElementId());
463
- }
464
- get errorMessage() {
465
- return this.validationService.getErrorMessage(this.buildElementId());
466
- }
467
- ngAfterViewInit() {
468
- if (this.inLine || this.inCard) {
469
- this.elementId = `question-${this.submissionIndex}-${this.question.id}`;
470
- }
471
- else {
472
- this.elementId = `question-${this.question.id}`;
473
- }
474
- this.tracker.registerElement(this.elementId);
475
- }
476
- ngOnDestroy() {
477
- if (this.elementId) {
478
- this.tracker.unregisterElement(this.elementId);
479
- }
480
- }
481
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CurrencyFieldsComponent, deps: [{ token: i1.ValidationService }, { token: i2.ElementTrackerService }, { token: i3.AggregationFunctionService }], target: i0.ɵɵFactoryTarget.Component }); }
482
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CurrencyFieldsComponent, selector: "lib-currency-fields", inputs: { question: "question", inLine: "inLine", inCard: "inCard", submissionIndex: "submissionIndex", disableEdit: "disableEdit", rowId: "rowId" }, outputs: { answerChange: "answerChange" }, ngImport: i0, template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label>{{ question.question }}</label\n >&nbsp;\n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n\n <div class=\"currency-input inside\">\n <span *ngIf=\"symbolPosition === 'Before the value'\" class=\"currency-symbol left\">\n {{ currencySymbol }}\n </span>\n\n <input\n type=\"text\"\n class=\"form-control mb-2 height\"\n [placeholder]=\"placeholder\"\n [class.hide-spin-buttons]=\"true\"\n (blur)=\"validateNumber()\"\n [(ngModel)]=\"enteredAmount\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredAmount)\"\n (input)=\"validateInput($event)\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n (wheel)=\"preventNumberScroll($event)\"\n [disabled]=\"disableEdit\"\n />\n\n <span *ngIf=\"symbolPosition === 'After the value'\" class=\"currency-symbol right\">\n {{ currencySymbol }}\n </span>\n\n </div>\n <div *ngIf=\"showAmountInWords && amountInWordsText\" class=\"amount-in-words\">\n {{ amountInWordsText }}\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredAmount)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger error-message\">\n {{ validationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.hide-spin-buttons::-webkit-outer-spin-button,.hide-spin-buttons::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}.currency-input.inside{position:relative}.currency-input.inside input{padding-left:.75rem;padding-right:.75rem}.currency-input.inside .currency-symbol{position:absolute;top:50%;transform:translateY(-50%);color:#444;font-weight:700;pointer-events:none;white-space:nowrap}.currency-input.inside .currency-symbol.left{left:1%}.currency-input.inside .currency-symbol.left+input{padding-left:6ch}.currency-input.inside input+.currency-symbol.right{right:10px;padding-right:4ch}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
483
- }
484
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CurrencyFieldsComponent, decorators: [{
485
- type: Component,
486
- args: [{ selector: 'lib-currency-fields', template: "<div\n [ngClass]=\"{ 'mb-4': !inLine }\"\n class=\"px-3\"\n [id]=\"(inLine || inCard) ? 'question-' + submissionIndex + '-' + question.id : 'question-' + question.id\"\n [attr.name]=\"question.testElementName\"\n>\n <div class=\"input-wrapper mb-2\" *ngIf=\"!inLine\">\n <div *ngIf=\"question.questionNumber\" [innerHTML]=\"question.questionNumber\"></div>\n <span *ngIf=\"question.questionNumber\" class=\"space\"></span>\n <label>{{ question.question }}</label\n >&nbsp;\n <span class=\"text-danger\" *ngIf=\"question?.required\">*</span>\n <div\n class=\"svg-wrapper mb-2 hintIcon\"\n [attr.data-title]=\"hint\"\n *ngIf=\"hint\"\n >\n <svg\n class=\"hintSvg\"\n viewBox=\"0 0 30 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M15 26.25V26.25C8.78625 26.25 3.75 21.2138 3.75 15V15C3.75 8.78625 8.78625 3.75 15 3.75V3.75C21.2138 3.75 26.25 8.78625 26.25 15V15C26.25 21.2138 21.2138 26.25 15 26.25Z\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M15 16.5623V16.2498C15 15.2285 15.6312 14.6748 16.2637 14.2498C16.8812 13.8335 17.5 13.291 17.5 12.291C17.5 10.9098 16.3813 9.79102 15 9.79102C13.6187 9.79102 12.5 10.9098 12.5 12.291\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M14.9988 20C14.8263 20 14.6863 20.14 14.6875 20.3125C14.6875 20.485 14.8275 20.625 15 20.625C15.1725 20.625 15.3125 20.485 15.3125 20.3125C15.3125 20.14 15.1725 20 14.9988 20\"\n stroke=\"#323232\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n\n <div class=\"currency-input inside\">\n <span *ngIf=\"symbolPosition === 'Before the value'\" class=\"currency-symbol left\">\n {{ currencySymbol }}\n </span>\n\n <input\n type=\"text\"\n class=\"form-control mb-2 height\"\n [placeholder]=\"placeholder\"\n [class.hide-spin-buttons]=\"true\"\n (blur)=\"validateNumber()\"\n [(ngModel)]=\"enteredAmount\"\n [class.invalid]=\"validationFailed\"\n [class.invalid-question]=\"isInvalid && (!inLine || !enteredAmount)\"\n (input)=\"validateInput($event)\"\n [attr.min]=\"min\"\n [attr.max]=\"max\"\n (wheel)=\"preventNumberScroll($event)\"\n [disabled]=\"disableEdit\"\n />\n\n <span *ngIf=\"symbolPosition === 'After the value'\" class=\"currency-symbol right\">\n {{ currencySymbol }}\n </span>\n\n </div>\n <div *ngIf=\"showAmountInWords && amountInWordsText\" class=\"amount-in-words\">\n {{ amountInWordsText }}\n </div>\n <div *ngIf=\"isInvalid && (!inLine || !enteredAmount)\" class=\"error-message\">\n {{ errorMessage }}\n </div>\n <div *ngIf=\"validationFailed && !isInvalid\" class=\"text-danger error-message\">\n {{ validationMessage }}\n </div>\n</div>\n", styles: [".input-wrapper{display:flex;align-items:flex-start}.svg-wrapper{margin-inline-start:auto;z-index:999}.hintIcon{position:relative;cursor:pointer}.hintIcon:hover:before{content:attr(data-title);position:absolute;top:calc(100% + 2px);right:0;padding:4px 8px;border-radius:4px;background-color:#1d252d;color:#8e9aa0;font-size:14px;min-width:300px;word-wrap:break-word;word-break:break-word;text-align:center;white-space:normal}.hintIcon:hover:after{content:\"\";position:absolute;top:calc(100% - 26px);left:50%;border:solid transparent;border-width:18px;border-bottom-color:#1d252d;transform:translate(-50%)}.height{height:42px}.invalid{border-color:red}.hintSvg{width:30px;height:30px;fill:none}::ng-deep html lib-formSubmission{font-family:var(--library-font-family)!important;font-size:var(--library-font-size)!important}::ng-deep .timepicker-overlay{z-index:1000!important}::ng-deep .timepicker-backdrop-overlay{z-index:1000!important}.space{width:5px}.error-message{color:#f44336;font-size:.8em;margin-top:4px;padding:0 8px}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.hide-spin-buttons::-webkit-outer-spin-button,.hide-spin-buttons::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.invalid-question{border:2px solid #f44336;border-radius:4px;padding:8px;margin-bottom:4px}.currency-input.inside{position:relative}.currency-input.inside input{padding-left:.75rem;padding-right:.75rem}.currency-input.inside .currency-symbol{position:absolute;top:50%;transform:translateY(-50%);color:#444;font-weight:700;pointer-events:none;white-space:nowrap}.currency-input.inside .currency-symbol.left{left:1%}.currency-input.inside .currency-symbol.left+input{padding-left:6ch}.currency-input.inside input+.currency-symbol.right{right:10px;padding-right:4ch}\n"] }]
487
- }], ctorParameters: function () { return [{ type: i1.ValidationService }, { type: i2.ElementTrackerService }, { type: i3.AggregationFunctionService }]; }, propDecorators: { question: [{
488
- type: Input
489
- }], inLine: [{
490
- type: Input
491
- }], inCard: [{
492
- type: Input
493
- }], submissionIndex: [{
494
- type: Input
495
- }], disableEdit: [{
496
- type: Input
497
- }], answerChange: [{
498
- type: Output
499
- }], rowId: [{
500
- type: Input
501
- }] } });
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0tc3VibWlzc2lvbi9zcmMvZm9ybS1maWVsZHMvY3VycmVuY3ktZmllbGRzL2N1cnJlbmN5LWZpZWxkcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLXN1Ym1pc3Npb24vc3JjL2Zvcm0tZmllbGRzL2N1cnJlbmN5LWZpZWxkcy9jdXJyZW5jeS1maWVsZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWlCdkUsTUFBTSxPQUFPLHVCQUF1QjtJQStCbEMsWUFDVSxpQkFBb0MsRUFDcEMsT0FBOEIsRUFDOUIsZ0JBQTRDO1FBRjVDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsWUFBTyxHQUFQLE9BQU8sQ0FBdUI7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE0QjtRQWpDN0MsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUNuQixXQUFNLEdBQVksS0FBSyxDQUFDO1FBQ3hCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDNUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFLckMsQ0FBQztRQUdMLFVBQUssR0FBVyxDQUFDLENBQUM7UUFDbEIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUMxQixTQUFJLEdBQVcsRUFBRSxDQUFDO1FBQ2xCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBR3pCLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBRTVCLG1CQUFjLEdBQVcsa0JBQWtCLENBQUM7UUFFNUMsc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRW5DLHFCQUFnQixHQUFZLEtBQUss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dUJBQXVCLDRQQ2pCcEMsdW1HQXFGQTs7NEZEcEVhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7cUxBS3RCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFNRSxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudFRyYWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZWxlbWVudC10cmFja2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWdncmVnYXRpb25GdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hZ2dyZWdhdGUuc2VydmljZSc7XG50eXBlIEN1cnJlbmN5TWV0YSA9IHtcbiAgY29kZXM6IHN0cmluZ1tdO1xuICBzeW1ib2xzPzogc3RyaW5nW107XG4gIG1haW5Vbml0OiBzdHJpbmc7XG4gIHN1YlVuaXQ6IHN0cmluZztcbiAgZGVjaW1hbHM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1jdXJyZW5jeS1maWVsZHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3VycmVuY3ktZmllbGRzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5RmllbGRzQ29tcG9uZW50IHtcbiAgQElucHV0KCkgcXVlc3Rpb246IGFueSA9IHt9O1xuICBASW5wdXQoKSBpbkxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaW5DYXJkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pc3Npb25JbmRleCE6IG51bWJlcjtcbiAgQElucHV0KCkgZGlzYWJsZUVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGFuc3dlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIGFuc3dlcjogYW55O1xuICAgIG1heFBvc3NpYmxlU2NvcmU/OiBudW1iZXI7XG4gICAgYW1vdW50SW5Xb3Jkczogc3RyaW5nO1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gIH0+KCk7XG4gIEBJbnB1dCgpIHJvd0lkOiBhbnk7XG5cbiAgY291bnQ6IG51bWJlciA9IDA7XG4gIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG4gIGhpbnQ6IHN0cmluZyA9ICcnO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIG1pbiE6IG51bWJlcjtcbiAgbWF4ITogbnVtYmVyO1xuICBjdXJyZW5jeVN5bWJvbDogc3RyaW5nID0gJyc7XG4gIGRlY2ltYWxQcmVjaXNpb24hOiBudW1iZXI7XG4gIHN5bWJvbFBvc2l0aW9uOiBzdHJpbmcgPSAnQmVmb3JlIHRoZSB2YWx1ZSc7XG4gIHRob3VzYW5kU2VwYXJhdG9yITogYm9vbGVhbjtcbiAgc2hvd0Ftb3VudEluV29yZHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZW50ZXJlZEFtb3VudCE6IHN0cmluZztcbiAgdmFsaWRhdGlvbkZhaWxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgZWxlbWVudElkOiBzdHJpbmcgPSAnJztcbiAgYW1vdW50SW5Xb3Jkc1RleHQ6IHN0cmluZyA9ICcnO1xuICBkZWZhdWx0Q3VycmVuY3k6c3RyaW5nPScnO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHRyYWNrZXI6IEVsZW1lbnRUcmFja2VyU2VydmljZSxcbiAgICBwcml2YXRlIGFnZ3JlZ2F0ZVNlcnZpY2U6IEFnZ3JlZ2F0aW9uRnVuY3Rpb25TZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnZhbHVlQXNzaWduZWQoKTtcbiAgfVxuXG4gIHZhbHVlQXNzaWduZWQoKSB7XG4gICAgdGhpcy5jb3VudCA9IHRoaXMucXVlc3Rpb24uY291bnQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IHRoaXMucXVlc3Rpb24ucmVxdWlyZWQ7XG4gICAgdGhpcy5oaW50ID0gdGhpcy5xdWVzdGlvbi5oaW50O1xuICAgIHRoaXMuZGVmYXVsdEN1cnJlbmN5PXRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmRlZmF1bHRDdXJyZW5jeSB8fCAnJztcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8ucGxhY2Vob2xkZXIgfHwgJyc7XG4gICAgdGhpcy5jdXJyZW5jeVN5bWJvbCA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sO1xuICAgIHRoaXMuZGVjaW1hbFByZWNpc2lvbiA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5kZWNpbWFsUHJlY2lzaW9uIHx8IDI7XG4gICAgdGhpcy5zeW1ib2xQb3NpdGlvbiA9XG4gICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5zeW1ib2xQb3NpdGlvbiB8fFxuICAgICAgJ0JlZm9yZSB0aGUgdmFsdWUnO1xuICAgIHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgPVxuICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8udGhvdXNhbmRTZXBhcmF0b3I7XG4gICAgdGhpcy5taW4gPSB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LnZhbGlkYXRpb24ubWluO1xuICAgIHRoaXMubWF4ID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC52YWxpZGF0aW9uLm1heDtcbiAgICB0aGlzLnNob3dBbW91bnRJbldvcmRzID1cbiAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LnNob3dBbW91bnRJbldvcmRzO1xuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50Py5hcHBlYXJhbmNlPy5jdXJyZW5jeSkge1xuICAgICAgbGV0IHVzZXJMb2NhbGVDdXJlZW5jeSA9IHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5O1xuICAgICAgaWYgKHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jdXJyZW5jeU9wdGlvbikge1xuICAgICAgICBsZXQgY3VycmVuY3lPcHRpb24gPVxuICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5jdXJyZW5jeU9wdGlvbjtcbiAgICAgICAgaWYgKGN1cnJlbmN5T3B0aW9uID09ICdhdXRvJykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQuYXBwZWFyYW5jZS5saW1pdEN1cnJlbmN5U3ltYm9sICYmXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmZvcm1FbGVtZW50LmFwcGVhcmFuY2UubGltaXRDdXJyZW5jeVN5bWJvbC5sZW5ndGggPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudC5hcHBlYXJhbmNlLmxpbWl0Q3VycmVuY3lTeW1ib2wuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgdXNlckxvY2FsZUN1cmVlbmN5XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA/IHVzZXJMb2NhbGVDdXJlZW5jeVxuICAgICAgICAgICAgICAgIDogdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uY3VycmVuY3lTeW1ib2w7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lTeW1ib2wgPSB1c2VyTG9jYWxlQ3VyZWVuY3k7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbmN5T3B0aW9uID09ICdzcGVjaWZpYycpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LnNwZWNpZmljQ3VycmVuY3lTeW1ib2w7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgIXRoaXMuY3VycmVuY3lTeW1ib2wgJiZcbiAgICAgIHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmN1cnJlbmN5U3ltYm9sXG4gICAgKSB7XG4gICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uY3VycmVuY3lTeW1ib2w7XG4gICAgfVxuICAgIGlmKHRoaXMucXVlc3Rpb24uZm9ybUVsZW1lbnQ/LmFwcGVhcmFuY2U/LmRlZmF1bHRDdXJyZW5jeSl7XG4gICAgICB0aGlzLmN1cnJlbmN5U3ltYm9sID0gdGhpcy5xdWVzdGlvbi5mb3JtRWxlbWVudD8uYXBwZWFyYW5jZT8uZGVmYXVsdEN1cnJlbmN5O1xuICAgIH1cbiAgICBpZih0aGlzLnF1ZXN0aW9uLmFuc3dlckN1cnJlbmN5KXtcbiAgICAgIHRoaXMuY3VycmVuY3lTeW1ib2w9dGhpcy5xdWVzdGlvbi5hbnN3ZXJDdXJyZW5jeTtcbiAgICB9XG5cblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmFuc3dlcikge1xuICAgICAgdGhpcy5pbml0aWFsaXplQW5zd2VyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dBbW91bnRJbldvcmRzKSB7XG4gICAgICB0aGlzLmFtb3VudEluV29yZHNUZXh0ID0gdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdWVzdGlvbi5jaGlsZExvZ2ljcyAmJiB0aGlzLnF1ZXN0aW9uLmFuc3dlcikge1xuICAgICAgdGhpcy51cGRhdGVDaGlsZExvZ2ljcyh0aGlzLnF1ZXN0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5hZ2dyZWdhdGVTZXJ2aWNlLnNldE51bWJlckZpZWxkKFxuICAgICAgdGhpcy5yb3dJZCxcbiAgICAgIHRoaXMucXVlc3Rpb24uaWQsXG4gICAgICB0aGlzLnF1ZXN0aW9uLmFuc3dlclxuICAgICk7XG4gIH1cblxuICBpbml0aWFsaXplQW5zd2VyKCkge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMucXVlc3Rpb24/LmFuc3dlcjtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgLy8gY2hlY2sgaWYgbnVtZXJpY1xuICAgIGlmICghaXNOYU4oTnVtYmVyKHZhbHVlKSkpIHtcbiAgICAgIGlmICh0aGlzLnRob3VzYW5kU2VwYXJhdG9yKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgICAgcGFydHNbMF0gPSBOdW1iZXIocGFydHNbMF0pLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpOyAvLyBhZGRzIHByb3BlciB0aG91c2FuZCBzZXBhcmF0b3JcbiAgICAgICAgdmFsdWUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW50ZXJlZEFtb3VudCA9IHZhbHVlO1xuICB9XG5cbiAgcHJldmVudE51bWJlclNjcm9sbChldmVudDogV2hlZWxFdmVudCkge1xuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVOdW1iZXIoKSB7XG4gICAgdGhpcy52YWxpZGF0aW9uRmFpbGVkID0gZmFsc2U7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgbGV0IGVudGVyZWRBbW91bnQgPSB0aGlzLnBhcnNlQ3VycmVuY3lUb051bWJlcih0aGlzLmVudGVyZWRBbW91bnQpO1xuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmICFlbnRlcmVkQW1vdW50KSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25GYWlsZWQgPSB0cnVlO1xuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnRgO1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnRgO1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIGVudGVyZWRBbW91bnQgPCB0aGlzLm1pbikgfHxcbiAgICAgICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmIGVudGVyZWRBbW91bnQgPiB0aGlzLm1heClcbiAgICApIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkZhaWxlZCA9IHRydWU7XG5cbiAgICAgIC8vIENvbnN0cnVjdCBhcHByb3ByaWF0ZSB2YWxpZGF0aW9uIG1lc3NhZ2UgYmFzZWQgb24gd2hldGhlciBtaW4sIG1heCwgb3IgYm90aCBhcmUgcHJvdmlkZWRcbiAgICAgIGlmICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIHRoaXMubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSB2YWxpZCBhbW91bnQgYmV0d2VlbiAke3RoaXMubWlufSBhbmQgJHt0aGlzLm1heH1gO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIHZhbGlkIGFtb3VudCBiZXR3ZWVuICR7dGhpcy5taW59IGFuZCAke3RoaXMubWF4fWA7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSBhbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dGhpcy5taW59YDtcbiAgICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uTWVzc2FnZSA9IGBQbGVhc2UgZW50ZXIgYSBhbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7dGhpcy5taW59YDtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIGFtb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt0aGlzLm1heH1gO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb25NZXNzYWdlID0gYFBsZWFzZSBlbnRlciBhIGFtb3VudCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJHt0aGlzLm1heH1gO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnF1ZXN0aW9uLnZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5xdWVzdGlvbi52YWxpZGF0aW9uID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVlc3Rpb24uY2hpbGRMb2dpY3MpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRMb2dpY3ModGhpcy5xdWVzdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVJbnB1dChldmVudDogYW55KSB7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcblxuICAgIC8vIHJlbW92ZSBleGlzdGluZyBjb21tYXMgJiBjdXJyZW5jeSBzeW1ib2xcbiAgICBsZXQgcmF3VmFsdWU6IHN0cmluZyA9IChldmVudC50YXJnZXQudmFsdWUgfHwgJycpXG4gICAgICAucmVwbGFjZSgvLC9nLCAnJylcbiAgICAgIC5yZXBsYWNlKHRoaXMuY3VycmVuY3lTeW1ib2wgfHwgJycsICcnKTtcblxuICAgIC8vIHJlbW92ZSBhbnkgY2hhcmFjdGVycyBleGNlcHQgZGlnaXRzIGFuZCBkb3RcbiAgICByYXdWYWx1ZSA9IHJhd1ZhbHVlLnJlcGxhY2UoL1teXFxkLl0vZywgJycpO1xuXG4gICAgLy8ga2VlcCBvbmx5IHRoZSBmaXJzdCBkb3QgKHJlbW92ZSBhbnkgYWRkaXRpb25hbCBkb3RzKVxuICAgIGNvbnN0IGZpcnN0RG90ID0gcmF3VmFsdWUuaW5kZXhPZignLicpO1xuICAgIGlmIChmaXJzdERvdCAhPT0gLTEpIHtcbiAgICAgIC8vIHNwbGl0IGludG8gYmVmb3JlLWZpcnN0LWRvdCBhbmQgcmVzdCwgcmVtb3ZlIGFkZGl0aW9uYWwgZG90cyBmcm9tIHJlc3RcbiAgICAgIGNvbnN0IGJlZm9yZSA9IHJhd1ZhbHVlLnNsaWNlKDAsIGZpcnN0RG90KTtcbiAgICAgIGNvbnN0IGFmdGVyID0gcmF3VmFsdWUuc2xpY2UoZmlyc3REb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJycpO1xuICAgICAgcmF3VmFsdWUgPSBgJHtiZWZvcmV9LiR7YWZ0ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyBkZXRlcm1pbmUgZGVjaW1hbCBwcmVjaXNpb24gdG8gZW5mb3JjZSAoZGVmYXVsdCB0byAyKVxuICAgIGNvbnN0IGRwID1cbiAgICAgIHR5cGVvZiB0aGlzLmRlY2ltYWxQcmVjaXNpb24gPT09ICdudW1iZXInICYmIHRoaXMuZGVjaW1hbFByZWNpc2lvbiA+PSAwXG4gICAgICAgID8gdGhpcy5kZWNpbWFsUHJlY2lzaW9uXG4gICAgICAgIDogMjtcblxuICAgIC8vIGlmIHRoZXJlJ3MgYSBkZWNpbWFsIHBhcnQsIHRyaW0gaXQgdG8gYWxsb3dlZCBsZW5ndGhcbiAgICBpZiAocmF3VmFsdWUuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgY29uc3QgW2ludFBhcnQsIGRlY2ltYWxQYXJ0ID0gJyddID0gcmF3VmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IHRyaW1tZWREZWNpbWFsID0gZGVjaW1hbFBhcnQuc2xpY2UoMCwgZHApO1xuICAgICAgcmF3VmFsdWUgPSB0cmltbWVkRGVjaW1hbFxuICAgICAgICA/IGAke2ludFBhcnR9LiR7dHJpbW1lZERlY2ltYWx9YFxuICAgICAgICA6IGludFBhcnQgKyAnLic7XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IHdpdGggdGhvdXNhbmQgc2VwYXJhdG9yIGZvciBkaXNwbGF5XG4gICAgbGV0IGZvcm1hdHRlZFZhbHVlID0gcmF3VmFsdWU7XG4gICAgaWYgKHRoaXMudGhvdXNhbmRTZXBhcmF0b3IgJiYgcmF3VmFsdWUpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gcmF3VmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgIC8vIGhhbmRsZSBjYXNlIHdoZXJlIHVzZXIgdHlwZXMgXCIuMTJcIiAtPiBwYXJ0c1swXSA9PT0gJydcbiAgICAgIGNvbnN0IGludFBhcnRGb3JGb3JtYXQgPSBwYXJ0c1swXSA9PT0gJycgPyAnMCcgOiBwYXJ0c1swXTtcbiAgICAgIHBhcnRzWzBdID0gTnVtYmVyKGludFBhcnRGb3JGb3JtYXQpLnRvTG9jYWxlU3RyaW5nKCdlbi1VUycpO1xuICAgICAgZm9ybWF0dGVkVmFsdWUgPSBwYXJ0cy5qb2luKCcuJyk7XG4gICAgICAvLyBpZiBvcmlnaW5hbCBoYWQgbGVhZGluZyAnLicgKHVzZXIgdHlwZWQgXCIuMTJcIiksIHJlc3RvcmUgaXQgdmlzdWFsbHkgYXMgXCIuMTJcIlxuICAgICAgaWYgKHJhd1ZhbHVlLnN0YXJ0c1dpdGgoJy4nKSAmJiAhZm9ybWF0dGVkVmFsdWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIGZvcm1hdHRlZFZhbHVlID0gZm9ybWF0dGVkVmFsdWUucmVwbGFjZSgvXjAvLCAnJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8ga2VlcCBudW1lcmljIHZlcnNpb24gZm9yIGJhY2tlbmQvY2FsY3VsYXRpb25zXG4gICAgdGhpcy5xdWVzdGlvbi5hbnN3ZXIgPSByYXdWYWx1ZTtcbiAgICB0aGlzLnF1ZXN0aW9uLmN1cnJlbmN5U3ltYm9sID0gdGhpcy5jdXJyZW5jeVN5bWJvbDtcblxuICAgIC8vIHVwZGF0ZSBmaWVsZCBkaXNwbGF5XG4gICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XG5cbiAgICB0aGlzLmFnZ3JlZ2F0ZVNlcnZpY2Uuc2V0TnVtYmVyRmllbGQoXG4gICAgICB0aGlzLnJvd0lkLFxuICAgICAgdGhpcy5xdWVzdGlvbi5pZCxcbiAgICAgIHJhd1ZhbHVlID8gcGFyc2VGbG9hdChyYXdWYWx1ZSkgOiAwXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnF1ZXN0aW9uLmNoaWxkTG9naWNzKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkTG9naWNzKHRoaXMucXVlc3Rpb24pO1xuICAgIH1cbiAgICBpZiAodGhpcy5zaG93QW1vdW50SW5Xb3Jkcykge1xuICAgICAgdGhpcy5hbW91bnRJbldvcmRzVGV4dCA9IHRoaXMuY29udmVydEFtb3VudFRvV29yZHMocmF3VmFsdWUpO1xuICAgICAgdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzID0gdGhpcy5hbW91bnRJbldvcmRzVGV4dDtcbiAgICB9XG5cbiAgICB0aGlzLmFuc3dlckNoYW5nZS5lbWl0KHtcbiAgICAgIGFuc3dlcjogdGhpcy5xdWVzdGlvbi5hbnN3ZXIsXG4gICAgICBtYXhQb3NzaWJsZVNjb3JlOiAwLFxuICAgICAgYW1vdW50SW5Xb3JkczogdGhpcy5xdWVzdGlvbi5hbW91bnRJbldvcmRzLFxuICAgICAgY3VycmVuY3k6IHRoaXMuY3VycmVuY3lTeW1ib2xcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlTnVtYmVyKCk7XG4gIH1cblxuICAvLyAyKSB0eXBlZCBjdXJyZW5jeSBtYXBcbiAgcHJpdmF0ZSBjdXJyZW5jeU1hcDogUmVjb3JkPHN0cmluZywgQ3VycmVuY3lNZXRhPiA9IHtcbiAgICBVU0Q6IHtcbiAgICAgIGNvZGVzOiBbJ1VTRCddLFxuICAgICAgc3ltYm9sczogWyckJywgJ1VTJCddLFxuICAgICAgbWFpblVuaXQ6ICdEb2xsYXJzJyxcbiAgICAgIHN1YlVuaXQ6ICdDZW50cycsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIElOUjoge1xuICAgICAgY29kZXM6IFsnSU5SJ10sXG4gICAgICBzeW1ib2xzOiBbJ+KCuScsICdScycsICfigqgnXSxcbiAgICAgIG1haW5Vbml0OiAnUnVwZWVzJyxcbiAgICAgIHN1YlVuaXQ6ICdQYWlzYScsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIEVVUjoge1xuICAgICAgY29kZXM6IFsnRVVSJ10sXG4gICAgICBzeW1ib2xzOiBbJ+KCrCddLFxuICAgICAgbWFpblVuaXQ6ICdFdXJvcycsXG4gICAgICBzdWJVbml0OiAnQ2VudHMnLFxuICAgICAgZGVjaW1hbHM6IDIsXG4gICAgfSxcbiAgICBBRUQ6IHtcbiAgICAgIGNvZGVzOiBbJ0FFRCddLFxuICAgICAgc3ltYm9sczogWydBRUQnLCAn2K8u2KUnXSxcbiAgICAgIG1haW5Vbml0OiAnRGlyaGFtcycsXG4gICAgICBzdWJVbml0OiAnRmlscycsXG4gICAgICBkZWNpbWFsczogMixcbiAgICB9LFxuICAgIEdCUDoge1xuICAgICAgY29kZXM6IFsnR0JQJ10sXG4gICAgICBzeW1ib2xzOiBbJ8KjJ10sXG4gICAgICBtYWluVW5pdDogJ1BvdW5kcycsXG4gICAgICBzdWJVbml0OiAnUGVuY2UnLFxuICAgICAgZGVjaW1hbHM6IDIsXG4gICAgfSxcbiAgICBKUFk6IHtcbiAgICAgIGNvZGVzOiBbJ0pQWSddLFxuICAgICAgc3ltYm9sczogWyfCpSddLFxuICAgICAgbWFpblVuaXQ6ICdZZW4nLFxuICAgICAgc3ViVW5pdDogJycsXG4gICAgICBkZWNpbWFsczogMCxcbiAgICB9LFxuICAgIC8vIGFkZCBtb3JlIGVudHJpZXMgYXMgbmVlZGVkXG4gIH07XG5cbiAgLy8gMykgY29udmVydEFtb3VudFRvV29yZHMgdXNpbmcgQ3VycmVuY3lNZXRhIHR5cGluZ1xuICBjb252ZXJ0QW1vdW50VG9Xb3Jkcyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XG5cbiAgICAvLyBwcmVmZXIgY3VycmVuY3lDb2RlIChJU08pIGlmIGF2YWlsYWJsZTsgZmFsbCBiYWNrIHRvIHN5bWJvbFxuICAgIGNvbnN0IGN1cnJlbmN5Q29kZSA9IHRoaXMucXVlc3Rpb24/LmN1cnJlbmN5Q29kZSB8fCBudWxsO1xuICAgIGNvbnN0IGN1cnJlbmN5U3ltYm9sID1cbiAgICAgIHRoaXMucXVlc3Rpb24/LmN1cnJlbmN5U3ltYm9sIHx8IHRoaXMuY3VycmVuY3lTeW1ib2wgfHwgbnVsbDtcblxuICAgIC8vIGZpbmQgY3VycmVuY3kgbWV0YWRhdGEgZnJvbSBtYXA6XG4gICAgbGV0IG1ldGE6IEN1cnJlbmN5TWV0YSB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChjdXJyZW5jeUNvZGUpIHtcbiAgICAgIG1ldGEgPSB0aGlzLmN1cnJlbmN5TWFwW2N1cnJlbmN5Q29kZV07XG4gICAgfVxuXG4gICAgaWYgKCFtZXRhICYmIGN1cnJlbmN5U3ltYm9sKSB7XG4gICAgICBtZXRhID0gT2JqZWN0LnZhbHVlcyh0aGlzLmN1cnJlbmN5TWFwKS5maW5kKFxuICAgICAgICAobSkgPT4gQXJyYXkuaXNBcnJheShtLnN5bWJvbHMpICYmIG0uc3ltYm9scy5pbmNsdWRlcyhjdXJyZW5jeVN5bWJvbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gdXNlIGZhbGxiYWNrIGlmIG5vdCBmb3VuZCDigJQgdHlwZWQgYXMgQ3VycmVuY3lNZXRhXG4gICAgaWYgKCFtZXRhKSB7XG4gICAgICBjb25zdCBmYWxsYmFja05hbWUgPSAoXG4gICAgICAgIGN1cnJlbmN5Q29kZSB8fFxuICAgICAgICBjdXJyZW5jeVN5bWJvbCB8fFxuICAgICAgICAnQ3VycmVuY3knXG4gICAgICApLnRvU3RyaW5nKCk7XG4gICAgICBtZXRhID0ge1xuICAgICAgICBjb2RlczogW2N1cnJlbmN5Q29kZSB8fCBmYWxsYmFja05hbWVdLFxuICAgICAgICBzeW1ib2xzOiBjdXJyZW5jeVN5bWJvbCA/IFtjdXJyZW5jeVN5bWJvbF0gOiBbXSxcbiAgICAgICAgbWFpblVuaXQ6IGZhbGxiYWNrTmFtZSxcbiAgICAgICAgc3ViVW5pdDogJycsXG4gICAgICAgIGRlY2ltYWxzOiAyLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBub3JtYWxpemUgbnVtZXJpYyBwYXJ0c1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCkucmVwbGFjZSgvLC9nLCAnJyk7XG4gICAgY29uc3QgW2ludFBhcnRTdHIgPSAnMCcsIGRlY2ltYWxQYXJ0U3RyID0gJyddID0gbm9ybWFsaXplZC5zcGxpdCgnLicpO1xuXG4gICAgY29uc3QgaW50UGFydE51bSA9IE51bWJlcihpbnRQYXJ0U3RyKSB8fCAwO1xuXG4gICAgLy8gY2FsY3VsYXRlIHN1YnVuaXQgbnVtYmVyIHJvYnVzdGx5OlxuICAgIGNvbnN0IGRwID1cbiAgICAgIHR5cGVvZiBtZXRhLmRlY2ltYWxzID09PSAnbnVtYmVyJyAmJiBtZXRhLmRlY2ltYWxzID49IDBcbiAgICAgICAgPyBtZXRhLmRlY2ltYWxzXG4gICAgICAgIDogMjtcbiAgICBsZXQgc3ViVW5pdE51bWJlciA9IDA7XG5cbiAgICBpZiAoZHAgPiAwICYmIGRlY2ltYWxQYXJ0U3RyKSB7XG4gICAgICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDEwLCBkcCk7XG4gICAgICBjb25zdCBkZWNEaWdpdHMgPSBkZWNpbWFsUGFydFN0ci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgLy8gaWYgc2hvcnRlciB0aGFuIGRwLCBtdWx0aXBseTsgaWYgbG9uZ2VyLCB0cmltIHRvIGRwXG4gICAgICBjb25zdCB0cmltbWVkID0gZGVjRGlnaXRzLnNsaWNlKDAsIGRwKTtcbiAgICAgIHN1YlVuaXROdW1iZXIgPSBOdW1iZXIodHJpbW1lZCkgKiBNYXRoLnBvdygxMCwgZHAgLSB0cmltbWVkLmxlbmd0aCk7XG4gICAgICAvLyBndWFyZCBmb3Igcm91bmRpbmcgb3ZlcmZsb3cgKGUuZy4sIC45OTkgLT4gMS4wMClcbiAgICAgIGlmIChzdWJVbml0TnVtYmVyID49IHNjYWxlKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBpbnRlZ2VyIHBhcnRcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGaW5hbFBocmFzZShpbnRQYXJ0TnVtICsgMSwgMCwgbWV0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRGaW5hbFBocmFzZShpbnRQYXJ0TnVtLCBzdWJVbml0TnVtYmVyLCBtZXRhKTtcbiAgfVxuXG4gIC8vIDQpIGJ1aWxkRmluYWxQaHJhc2UgYWNjZXB0cyBDdXJyZW5jeU1ldGEgKG9yIHNhbWUgc2hhcGUpIOKAlCB0eXBlZCBhY2NvcmRpbmdseVxuICBwcml2YXRlIGJ1aWxkRmluYWxQaHJhc2UoXG4gICAgaW50TnVtOiBudW1iZXIsXG4gICAgc3ViTnVtOiBudW1iZXIsXG4gICAgbWV0YTogeyBtYWluVW5pdDogc3RyaW5nOyBzdWJVbml0OiBzdHJpbmc7IGRlY2ltYWxzOiBudW1iZXIgfVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IG1haW5Xb3JkcyA9IHRoaXMubnVtYmVyVG9Xb3JkcyhpbnROdW0pIHx8ICdaZXJvJztcblxuICAgIGlmIChtZXRhLmRlY2ltYWxzID09PSAwIHx8ICFtZXRhLnN1YlVuaXQpIHtcbiAgICAgIHJldHVybiBgJHttYWluV29yZHN9ICR7bWV0YS5tYWluVW5pdH0gT25seWA7XG4gICAgfVxuXG4gICAgaWYgKCFzdWJOdW0pIHtcbiAgICAgIHJldHVybiBgJHttYWluV29yZHN9ICR7bWV0YS5tYWluVW5pdH0gT25seWA7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViV29yZHMgPSB0aGlzLm51bWJlclRvV29yZHMoc3ViTnVtKTtcbiAgICByZXR1cm4gYCR7bWFpbldvcmRzfSAke21ldGEubWFpblVuaXR9IGFuZCAke3N1YldvcmRzfSAke21ldGEuc3ViVW5pdH0gT25seWA7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE5VTUJFUiDihpIgV09SRFMgKFVwIHRvIENyb3JlcylcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBudW1iZXJUb1dvcmRzKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAobnVtID09PSAwKSByZXR1cm4gJ1plcm8nO1xuXG4gICAgY29uc3QgYSA9IFtcbiAgICAgICcnLFxuICAgICAgJ09uZScsXG4gICAgICAnVHdvJyxcbiAgICAgICdUaHJlZScsXG4gICAgICAnRm91cicsXG4gICAgICAnRml2ZScsXG4gICAgICAnU2l4JyxcbiAgICAgICdTZXZlbicsXG4gICAgICAnRWlnaHQnLFxuICAgICAgJ05pbmUnLFxuICAgICAgJ1RlbicsXG4gICAgICAnRWxldmVuJyxcbiAgICAgICdUd2VsdmUnLFxuICAgICAgJ1RoaXJ0ZWVuJyxcbiAgICAgICdGb3VydGVlbicsXG4gICAgICAnRmlmdGVlbicsXG4gICAgICAnU2l4dGVlbicsXG4gICAgICAnU2V2ZW50ZWVuJyxcbiAgICAgICdFaWdodGVlbicsXG4gICAgICAnTmluZXRlZW4nLFxuICAgIF07XG4gICAgY29uc3QgYiA9IFtcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnVHdlbnR5JyxcbiAgICAgICdUaGlydHknLFxuICAgICAgJ0ZvcnR5JyxcbiAgICAgICdGaWZ0eScsXG4gICAgICAnU2l4dHknLFxuICAgICAgJ1NldmVudHknLFxuICAgICAgJ0VpZ2h0eScsXG4gICAgICAnTmluZXR5JyxcbiAgICBdO1xuXG4gICAgY29uc3QgdG9Xb3JkcyA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKG4gPCAyMCkgcmV0dXJuIGFbbl07XG4gICAgICBpZiAobiA8IDEwMCkgcmV0dXJuIGAke2JbTWF0aC5mbG9vcihuIC8gMTApXX0gJHthW24gJSAxMF19YC50cmltKCk7XG4gICAgICBpZiAobiA8IDEwMDApXG4gICAgICAgIHJldHVybiBgJHthW01hdGguZmxvb3IobiAvIDEwMCldfSBIdW5kcmVkICR7dG9Xb3JkcyhuICUgMTAwKX1gLnRyaW0oKTtcbiAgICAgIGlmIChuIDwgMTAwMDAwKVxuICAgICAgICByZXR1cm4gYCR7dG9Xb3JkcyhNYXRoLmZsb29yKG4gLyAxMDAwKSl9IFRob3VzYW5kICR7dG9Xb3JkcyhcbiAgICAgICAgICBuICUgMTAwMFxuICAgICAgICApfWAudHJpbSgpO1xuICAgICAgaWYgKG4gPCAxMDAwMDAwMClcbiAgICAgICAgcmV0dXJuIGAke3RvV29yZHMoTWF0aC5mbG9vcihuIC8gMTAwMDAwKSl9IExha2ggJHt0b1dvcmRzKFxuICAgICAgICAgIG4gJSAxMDAwMDBcbiAgICAgICAgKX1gLnRyaW0oKTtcbiAgICAgIHJldHVybiBgJHt0b1dvcmRzKE1hdGguZmxvb3IobiAvIDEwMDAwMDAwKSl9IENyb3JlICR7dG9Xb3JkcyhcbiAgICAgICAgbiAlIDEwMDAwMDAwXG4gICAgICApfWAudHJpbSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdG9Xb3JkcyhudW0pO1xuICB9XG5cbiAgdXBkYXRlQ2hpbGRMb2dpY3MocXVlc3Rpb246IGFueSkge1xuICAgIGlmIChxdWVzdGlvbi5jaGlsZExvZ2ljcyAmJiBBcnJheS5pc0FycmF5KHF1ZXN0aW9uLmNoaWxkTG9naWNzKSkge1xuICAgICAgcXVlc3Rpb24uY2hpbGRMb2dpY3MuZm9yRWFjaCgoY2hpbGRMb2dpYzogYW55KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmV2YWx1YXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgcXVlc3Rpb24uYW5zd2VyLFxuICAgICAgICAgICAgY2hpbGRMb2dpYy5jb25kaXRpb24sXG4gICAgICAgICAgICBjaGlsZExvZ2ljLmlucHV0VmFsdWVcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGNoaWxkTG9naWMuc2hvd0xvZ2ljID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjaGlsZExvZ2ljLnNob3dMb2dpYyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2xlYXJBbnN3ZXJzUmVjdXJzaXZlbHkoY2hpbGRMb2dpYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlQ3VycmVuY3lUb051bWJlcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gMDtcblxuICAgIC8vIFJlbW92ZSBjdXJyZW5jeSBzeW1ib2wsIGNvbW1hcywgc3BhY2VzXG4gICAgY29uc3QgbnVtZXJpY1N0cmluZyA9IHZhbHVlXG4gICAgICAucmVwbGFjZShuZXcgUmVnRXhwKGBcXFxcJHt0aGlzLmN1cnJlbmN5U3ltYm9sfWAsICdnJyksICcnKSAvLyByZW1vdmUgc3ltYm9sXG4gICAgICAucmVwbGFjZSgvLC9nLCAnJykgLy8gcmVtb3ZlIHRob3VzYW5kIHNlcGFyYXRvcnNcbiAgICAgIC50cmltKCk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIG51bWJlclxuICAgIGNvbnN0IG51bSA9IHBhcnNlRmxvYXQobnVtZXJpY1N0cmluZyk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xuICB9XG5cbiAgY2xlYXJBbnN3ZXJzUmVjdXJzaXZlbHkobG9naWM6IGFueSkge1xuICAgIGlmICghbG9naWMgfHwgIWxvZ2ljLnJvd3MpIHJldHVybjtcblxuICAgIGxvZ2ljLnJvd3MuZm9yRWFjaCgocm93OiBhbnkpID0+IHtcbiAgICAgIHJvdy5ncmlkLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gaXRlbS5lbGVtZW50O1xuXG4gICAgICAgIGlmIChpdGVtLmVudGl0eVR5cGUgPT09ICdRVUVTVElPTicgJiYgZWxlbWVudCkge1xuICAgICAgICAgIC8vIENsZWFyIGFuc3dlciBpZiBwcmVzZW50XG4gICAgICAgICAgaWYgKCdhbnN3ZXInIGluIGVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYW5zd2VyID0gJyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2xlYXIgY2hpbGRMb2dpY3MgaWYgYW55XG4gICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRMb2dpY3MgJiYgZWxlbWVudC5jaGlsZExvZ2ljcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNoaWxkTG9naWNzLmZvckVhY2goKGNoaWxkTG9naWM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNsZWFyQW5zd2Vyc1JlY3Vyc2l2ZWx5KGNoaWxkTG9naWMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0uZW50aXR5VHlwZSA9PT0gJ1NVQkZPUk0nICYmIGVsZW1lbnQgJiYgZWxlbWVudC5yb3dzKSB7XG4gICAgICAgICAgLy8gU1VCRk9STSBjb250YWlucyBpdHMgb3duIHJvd3Mgc3RydWN0dXJlIGxpa2UgYSBmb3JtXG4gICAgICAgICAgdGhpcy5jbGVhckFuc3dlcnNSZWN1cnNpdmVseSh7IHJvd3M6IGVsZW1lbnQucm93cyB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBldmFsdWF0ZUNvbmRpdGlvbihhbnN3ZXI6IGFueSwgY29uZGl0aW9uOiBhbnksIGlucHV0VmFsdWU6IGFueSkge1xuICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA+IE51bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgIGNhc2UgJzwnOlxuICAgICAgICByZXR1cm4gYW5zd2VyIDwgTnVtYmVyKGlucHV0VmFsdWUpO1xuICAgICAgY2FzZSAnPj0nOlxuICAgICAgICByZXR1cm4gYW5zd2VyID49IE51bWJlcihpbnB1dFZhbHVlKTtcbiAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA8PSBOdW1iZXIoaW5wdXRWYWx1ZSk7XG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgcmV0dXJuIGFuc3dlciA9PSBpbnB1dFZhbHVlO1xuICAgICAgY2FzZSAnIT0nOlxuICAgICAgICByZXR1cm4gYW5zd2VyICE9IGlucHV0VmFsdWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVmFsaWRhdGlvbihcbiAgICBpc1ZhbGlkOiBib29sZWFuLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJ1xuICApIHtcbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uU2VydmljZS5jbGVhckludmFsaWQodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy52YWxpZGF0aW9uU2VydmljZS5zZXRJbnZhbGlkKHRoaXMucXVlc3Rpb24uaWQsIG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRFbGVtZW50SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbkxpbmUgfHwgdGhpcy5pbkNhcmRcbiAgICAgID8gYCR7dGhpcy5zdWJtaXNzaW9uSW5kZXh9LSR7dGhpcy5xdWVzdGlvbi5pZH1gXG4gICAgICA6IGAke3RoaXMucXVlc3Rpb24uaWR9YDtcbiAgfVxuXG4gIGdldCBpc0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRFcnJvck1lc3NhZ2UodGhpcy5idWlsZEVsZW1lbnRJZCgpKTtcbiAgfVxuXG4gIGdldCBlcnJvck1lc3NhZ2UoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvblNlcnZpY2UuZ2V0RXJyb3JNZXNzYWdlKHRoaXMuYnVpbGRFbGVtZW50SWQoKSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaW5MaW5lIHx8IHRoaXMuaW5DYXJkKSB7XG4gICAgICB0aGlzLmVsZW1lbnRJZCA9IGBxdWVzdGlvbi0ke3RoaXMuc3VibWlzc2lvbkluZGV4fS0ke3RoaXMucXVlc3Rpb24uaWR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50SWQgPSBgcXVlc3Rpb24tJHt0aGlzLnF1ZXN0aW9uLmlkfWA7XG4gICAgfVxuXG4gICAgdGhpcy50cmFja2VyLnJlZ2lzdGVyRWxlbWVudCh0aGlzLmVsZW1lbnRJZCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50SWQpIHtcbiAgICAgIHRoaXMudHJhY2tlci51bnJlZ2lzdGVyRWxlbWVudCh0aGlzLmVsZW1lbnRJZCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIFtuZ0NsYXNzXT1cInsgJ21iLTQnOiAhaW5MaW5lIH1cIlxuICBjbGFzcz1cInB4LTNcIlxuICBbaWRdPVwiKGluTGluZSB8fCBpbkNhcmQpID8gJ3F1ZXN0aW9uLScgKyBzdWJtaXNzaW9uSW5kZXggKyAnLScgKyBxdWVzdGlvbi5pZCA6ICdxdWVzdGlvbi0nICsgcXVlc3Rpb24uaWRcIlxuICBbYXR0ci5uYW1lXT1cInF1ZXN0aW9uLnRlc3RFbGVtZW50TmFtZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyIG1iLTJcIiAqbmdJZj1cIiFpbkxpbmVcIj5cbiAgICA8ZGl2ICpuZ0lmPVwicXVlc3Rpb24ucXVlc3Rpb25OdW1iZXJcIiBbaW5uZXJIVE1MXT1cInF1ZXN0aW9uLnF1ZXN0aW9uTnVtYmVyXCI+PC9kaXY+XG4gICAgPHNwYW4gKm5nSWY9XCJxdWVzdGlvbi5xdWVzdGlvbk51bWJlclwiIGNsYXNzPVwic3BhY2VcIj48L3NwYW4+XG4gICAgPGxhYmVsPnt7IHF1ZXN0aW9uLnF1ZXN0aW9uIH19PC9sYWJlbFxuICAgID4mbmJzcDtcbiAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJxdWVzdGlvbj8ucmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwic3ZnLXdyYXBwZXIgbWItMiBoaW50SWNvblwiXG4gICAgICBbYXR0ci5kYXRhLXRpdGxlXT1cImhpbnRcIlxuICAgICAgKm5nSWY9XCJoaW50XCJcbiAgICA+XG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzPVwiaGludFN2Z1wiXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMzAgMzBcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgID5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICBjbGlwLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICBkPVwiTTE1IDI2LjI1VjI2LjI1QzguNzg2MjUgMjYuMjUgMy43NSAyMS4yMTM4IDMuNzUgMTVWMTVDMy43NSA4Ljc4NjI1IDguNzg2MjUgMy43NSAxNSAzLjc1VjMuNzVDMjEuMjEzOCAzLjc1IDI2LjI1IDguNzg2MjUgMjYuMjUgMTVWMTVDMjYuMjUgMjEuMjEzOCAyMS4yMTM4IDI2LjI1IDE1IDI2LjI1WlwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNSAxNi41NjIzVjE2LjI0OThDMTUgMTUuMjI4NSAxNS42MzEyIDE0LjY3NDggMTYuMjYzNyAxNC4yNDk4QzE2Ljg4MTIgMTMuODMzNSAxNy41IDEzLjI5MSAxNy41IDEyLjI5MUMxNy41IDEwLjkwOTggMTYuMzgxMyA5Ljc5MTAyIDE1IDkuNzkxMDJDMTMuNjE4NyA5Ljc5MTAyIDEyLjUgMTAuOTA5OCAxMi41IDEyLjI5MVwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgZD1cIk0xNC45OTg4IDIwQzE0LjgyNjMgMjAgMTQuNjg2MyAyMC4xNCAxNC42ODc1IDIwLjMxMjVDMTQuNjg3NSAyMC40ODUgMTQuODI3NSAyMC42MjUgMTUgMjAuNjI1QzE1LjE3MjUgMjAuNjI1IDE1LjMxMjUgMjAuNDg1IDE1LjMxMjUgMjAuMzEyNUMxNS4zMTI1IDIwLjE0IDE1LjE3MjUgMjAgMTQuOTk4OCAyMFwiXG4gICAgICAgICAgc3Ryb2tlPVwiIzMyMzIzMlwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImN1cnJlbmN5LWlucHV0IGluc2lkZVwiPlxuICAgIDxzcGFuICpuZ0lmPVwic3ltYm9sUG9zaXRpb24gPT09ICdCZWZvcmUgdGhlIHZhbHVlJ1wiIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sIGxlZnRcIj5cbiAgICAgIHt7IGN1cnJlbmN5U3ltYm9sIH19XG4gICAgPC9zcGFuPlxuXG4gICAgPGlucHV0XG4gICAgdHlwZT1cInRleHRcIlxuICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG1iLTIgaGVpZ2h0XCJcbiAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtjbGFzcy5oaWRlLXNwaW4tYnV0dG9uc109XCJ0cnVlXCJcbiAgICAoYmx1cik9XCJ2YWxpZGF0ZU51bWJlcigpXCJcbiAgICBbKG5nTW9kZWwpXT1cImVudGVyZWRBbW91bnRcIlxuICAgIFtjbGFzcy5pbnZhbGlkXT1cInZhbGlkYXRpb25GYWlsZWRcIlxuICAgIFtjbGFzcy5pbnZhbGlkLXF1ZXN0aW9uXT1cImlzSW52YWxpZCAmJiAoIWluTGluZSB8fCAhZW50ZXJlZEFtb3VudClcIlxuICAgIChpbnB1dCk9XCJ2YWxpZGF0ZUlucHV0KCRldmVudClcIlxuICAgIFthdHRyLm1pbl09XCJtaW5cIlxuICAgIFthdHRyLm1heF09XCJtYXhcIlxuICAgICh3aGVlbCk9XCJwcmV2ZW50TnVtYmVyU2Nyb2xsKCRldmVudClcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlRWRpdFwiXG4gICAgLz5cblxuICAgIDxzcGFuICpuZ0lmPVwic3ltYm9sUG9zaXRpb24gPT09ICdBZnRlciB0aGUgdmFsdWUnXCIgY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2wgcmlnaHRcIj5cbiAgICAgICAge3sgY3VycmVuY3lTeW1ib2wgfX1cbiAgICA8L3NwYW4+XG5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJzaG93QW1vdW50SW5Xb3JkcyAmJiBhbW91bnRJbldvcmRzVGV4dFwiIGNsYXNzPVwiYW1vdW50LWluLXdvcmRzXCI+XG4gICAge3sgYW1vdW50SW5Xb3Jkc1RleHQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJpc0ludmFsaWQgJiYgKCFpbkxpbmUgfHwgIWVudGVyZWRBbW91bnQpXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgZXJyb3JNZXNzYWdlIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGlvbkZhaWxlZCAmJiAhaXNJbnZhbGlkXCIgY2xhc3M9XCJ0ZXh0LWRhbmdlciBlcnJvci1tZXNzYWdlXCI+XG4gICAge3sgdmFsaWRhdGlvbk1lc3NhZ2UgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==