@ukhomeoffice/cop-react-form-renderer 7.3.2-alpha.5 → 8.0.0-alpha

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 (761) hide show
  1. package/README.md +106 -32
  2. package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
  3. package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
  4. package/dist/components/CheckYourAnswers/index.d.ts +2 -0
  5. package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
  6. package/dist/components/CollectionPage/index.d.ts +1 -0
  7. package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
  8. package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
  9. package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
  10. package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
  11. package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
  12. package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
  13. package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
  14. package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
  15. package/dist/components/CollectionSummary/index.d.ts +2 -0
  16. package/dist/components/FormComponent/Collection.d.ts +39 -0
  17. package/dist/components/FormComponent/Container.d.ts +26 -0
  18. package/dist/components/FormComponent/FormComponent.d.ts +39 -0
  19. package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
  20. package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
  21. package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
  22. package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
  23. package/dist/components/FormComponent/helpers/index.d.ts +5 -0
  24. package/dist/components/FormComponent/index.d.ts +2 -0
  25. package/dist/components/FormPage/FormPage.d.ts +36 -0
  26. package/dist/components/FormPage/index.d.ts +2 -0
  27. package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
  28. package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
  29. package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
  30. package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
  31. package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
  32. package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
  33. package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
  34. package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
  35. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
  36. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
  37. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
  38. package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
  39. package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
  40. package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
  41. package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
  42. package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
  43. package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
  44. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
  45. package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
  46. package/dist/components/FormRenderer/index.d.ts +2 -0
  47. package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
  48. package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
  49. package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
  50. package/dist/components/PageActions/ActionButton.d.ts +7 -0
  51. package/dist/components/PageActions/PageActions.d.ts +7 -0
  52. package/dist/components/PageActions/index.d.ts +2 -0
  53. package/dist/components/SummaryList/GroupAction.d.ts +12 -0
  54. package/dist/components/SummaryList/RowAction.d.ts +12 -0
  55. package/dist/components/SummaryList/SummaryList.d.ts +28 -0
  56. package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
  57. package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
  58. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
  59. package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
  60. package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
  61. package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
  62. package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
  63. package/dist/components/SummaryList/helpers/index.d.ts +2 -0
  64. package/dist/components/SummaryList/index.d.ts +2 -0
  65. package/dist/components/TaskList/Task.d.ts +12 -0
  66. package/dist/components/TaskList/TaskList.d.ts +40 -0
  67. package/dist/components/TaskList/TaskState.d.ts +6 -0
  68. package/dist/components/TaskList/index.d.ts +2 -0
  69. package/dist/components/index.d.ts +8 -0
  70. package/dist/context/HooksContext/HooksContext.d.ts +23 -0
  71. package/dist/context/HooksContext/index.d.ts +3 -0
  72. package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
  73. package/dist/context/ValidationContext/index.d.ts +3 -0
  74. package/dist/context/index.d.ts +3 -0
  75. package/dist/hooks/index.d.ts +6 -0
  76. package/dist/hooks/useAxios.d.ts +2 -0
  77. package/dist/hooks/useGetRequest.d.ts +12 -0
  78. package/dist/hooks/useHooks.d.ts +2 -0
  79. package/dist/hooks/useRefData.d.ts +7 -0
  80. package/dist/hooks/useValidation.d.ts +2 -0
  81. package/dist/index.cjs +5 -0
  82. package/dist/index.css +1 -0
  83. package/dist/index.d.ts +6 -0
  84. package/dist/index.js +6124 -81
  85. package/dist/models/CollectionLabels.d.ts +7 -0
  86. package/dist/models/ComponentTypes.d.ts +27 -0
  87. package/dist/models/EventTypes.d.ts +6 -0
  88. package/dist/models/FormPages.d.ts +6 -0
  89. package/dist/models/FormTypes.d.ts +10 -0
  90. package/dist/models/HubFormats.d.ts +5 -0
  91. package/dist/models/PageAction.d.ts +89 -0
  92. package/dist/models/TaskStates.d.ts +39 -0
  93. package/dist/models/index.d.ts +143 -0
  94. package/dist/setupTests.d.ts +14 -0
  95. package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
  96. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
  97. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
  98. package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
  99. package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
  100. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
  101. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
  102. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
  103. package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
  104. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
  105. package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
  106. package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
  107. package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
  108. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
  109. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
  110. package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
  111. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
  112. package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
  113. package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
  114. package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
  115. package/dist/utils/CollectionPage/index.d.ts +13 -0
  116. package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
  117. package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
  118. package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
  119. package/dist/utils/Component/addShowWhen.d.ts +13 -0
  120. package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
  121. package/dist/utils/Component/cleanAttributes.d.ts +14 -0
  122. package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
  123. package/dist/utils/Component/getDefaultValue.d.ts +2 -0
  124. package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
  125. package/dist/utils/Component/index.d.ts +12 -0
  126. package/dist/utils/Component/isEditable.d.ts +3 -0
  127. package/dist/utils/Component/optionIsSelected.d.ts +10 -0
  128. package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
  129. package/dist/utils/Component/showComponent.d.ts +2 -0
  130. package/dist/utils/Condition/index.d.ts +6 -0
  131. package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
  132. package/dist/utils/Condition/meetsCondition.d.ts +14 -0
  133. package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
  134. package/dist/utils/Condition/setupConditions.d.ts +2 -0
  135. package/dist/utils/Container/getEditableComponents.d.ts +7 -0
  136. package/dist/utils/Container/index.d.ts +6 -0
  137. package/dist/utils/Container/setupNesting.d.ts +2 -0
  138. package/dist/utils/Container/showContainer.d.ts +8 -0
  139. package/dist/utils/Data/applyFormula.d.ts +2 -0
  140. package/dist/utils/Data/deleteValues.d.ts +8 -0
  141. package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
  142. package/dist/utils/Data/getDataPath.d.ts +21 -0
  143. package/dist/utils/Data/getOptions.d.ts +2 -0
  144. package/dist/utils/Data/getSourceData.d.ts +17 -0
  145. package/dist/utils/Data/index.d.ts +15 -0
  146. package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
  147. package/dist/utils/Data/refDataToOptions.d.ts +8 -0
  148. package/dist/utils/Data/setDataItem.d.ts +2 -0
  149. package/dist/utils/Data/setupFormData.d.ts +15 -0
  150. package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
  151. package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
  152. package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
  153. package/dist/utils/FormPage/getFormPage.d.ts +9 -0
  154. package/dist/utils/FormPage/getFormPages.d.ts +9 -0
  155. package/dist/utils/FormPage/getPageActions.d.ts +13 -0
  156. package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
  157. package/dist/utils/FormPage/index.d.ts +10 -0
  158. package/dist/utils/FormPage/showFormPage.d.ts +8 -0
  159. package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
  160. package/dist/utils/FormPage/useComponent.d.ts +9 -0
  161. package/dist/utils/Format/formatData.d.ts +8 -0
  162. package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
  163. package/dist/utils/Format/formatDataForForm.d.ts +8 -0
  164. package/dist/utils/Format/formatDataForPage.d.ts +15 -0
  165. package/dist/utils/Format/index.d.ts +7 -0
  166. package/dist/utils/Hub/getFormHub.d.ts +15 -0
  167. package/dist/utils/Hub/index.d.ts +4 -0
  168. package/dist/utils/Meta/constants.d.ts +2 -0
  169. package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
  170. package/dist/utils/Meta/documents/index.d.ts +6 -0
  171. package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
  172. package/dist/utils/Meta/index.d.ts +9 -0
  173. package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
  174. package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
  175. package/dist/utils/Operate/doesContainValue.d.ts +11 -0
  176. package/dist/utils/Operate/getFirstOf.d.ts +2 -0
  177. package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
  178. package/dist/utils/Operate/getLength.d.ts +11 -0
  179. package/dist/utils/Operate/index.d.ts +4 -0
  180. package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
  181. package/dist/utils/Operate/runPageOperations.d.ts +19 -0
  182. package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
  183. package/dist/utils/Operate/shouldRun.d.ts +9 -0
  184. package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
  185. package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
  186. package/dist/utils/Validate/additional/index.d.ts +2 -0
  187. package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
  188. package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
  189. package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
  190. package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
  191. package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
  192. package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
  193. package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
  194. package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
  195. package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
  196. package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
  197. package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
  198. package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
  199. package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
  200. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
  201. package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
  202. package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
  203. package/dist/utils/Validate/additional/utils.d.ts +4 -0
  204. package/dist/utils/Validate/index.d.ts +42 -0
  205. package/dist/utils/Validate/validateCollection.d.ts +9 -0
  206. package/dist/utils/Validate/validateComponent.d.ts +16 -0
  207. package/dist/utils/Validate/validateContainer.d.ts +12 -0
  208. package/dist/utils/Validate/validateDate.d.ts +29 -0
  209. package/dist/utils/Validate/validateEmail.d.ts +13 -0
  210. package/dist/utils/Validate/validateMultifile.d.ts +3 -0
  211. package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
  212. package/dist/utils/Validate/validatePage.d.ts +8 -0
  213. package/dist/utils/Validate/validateRegex.d.ts +13 -0
  214. package/dist/utils/Validate/validateRequired.d.ts +9 -0
  215. package/dist/utils/Validate/validateTextArea.d.ts +13 -0
  216. package/dist/utils/Validate/validateTime.d.ts +20 -0
  217. package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
  218. package/dist/utils/index.d.ts +140 -0
  219. package/package.json +81 -170
  220. package/LICENCE.md +0 -21
  221. package/dist/components/CheckYourAnswers/Answer.js +0 -59
  222. package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
  223. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
  224. package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
  225. package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
  226. package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
  227. package/dist/components/CheckYourAnswers/index.js +0 -10
  228. package/dist/components/CollectionPage/CollectionPage.js +0 -178
  229. package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
  230. package/dist/components/CollectionPage/index.js +0 -10
  231. package/dist/components/CollectionSummary/BannerStrip.js +0 -65
  232. package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
  233. package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
  234. package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
  235. package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
  236. package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
  237. package/dist/components/CollectionSummary/Confirmation.js +0 -65
  238. package/dist/components/CollectionSummary/Confirmation.scss +0 -26
  239. package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
  240. package/dist/components/CollectionSummary/RenderListView.js +0 -162
  241. package/dist/components/CollectionSummary/RenderListView.scss +0 -295
  242. package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
  243. package/dist/components/CollectionSummary/SummaryCard.js +0 -277
  244. package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
  245. package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
  246. package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
  247. package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
  248. package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
  249. package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
  250. package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
  251. package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
  252. package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
  253. package/dist/components/CollectionSummary/index.js +0 -10
  254. package/dist/components/FormComponent/Collection.js +0 -234
  255. package/dist/components/FormComponent/Collection.scss +0 -24
  256. package/dist/components/FormComponent/Collection.test.js +0 -934
  257. package/dist/components/FormComponent/Container.js +0 -130
  258. package/dist/components/FormComponent/Container.scss +0 -15
  259. package/dist/components/FormComponent/Container.test.js +0 -456
  260. package/dist/components/FormComponent/FormComponent.js +0 -238
  261. package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
  262. package/dist/components/FormComponent/FormComponent.test.js +0 -436
  263. package/dist/components/FormComponent/helpers/addLabel.js +0 -25
  264. package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
  265. package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
  266. package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
  267. package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
  268. package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
  269. package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
  270. package/dist/components/FormComponent/helpers/index.js +0 -35
  271. package/dist/components/FormComponent/index.js +0 -10
  272. package/dist/components/FormPage/FormPage.js +0 -212
  273. package/dist/components/FormPage/FormPage.scss +0 -7
  274. package/dist/components/FormPage/FormPage.stories.mdx +0 -157
  275. package/dist/components/FormPage/FormPage.test.js +0 -454
  276. package/dist/components/FormPage/index.js +0 -10
  277. package/dist/components/FormRenderer/FormRenderer.js +0 -426
  278. package/dist/components/FormRenderer/FormRenderer.scss +0 -5
  279. package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
  280. package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
  281. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
  282. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
  283. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
  284. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
  285. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
  286. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
  287. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
  288. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
  289. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
  290. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
  291. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
  292. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
  293. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
  294. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
  295. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
  296. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
  297. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
  298. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
  299. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
  300. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
  301. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
  302. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
  303. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
  304. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
  305. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
  306. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
  307. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
  308. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
  309. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
  310. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
  311. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
  312. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
  313. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
  314. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
  315. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
  316. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
  317. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
  318. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
  319. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
  320. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
  321. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
  322. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
  323. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
  324. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
  325. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
  326. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
  327. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
  328. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
  329. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
  330. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
  331. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
  332. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
  333. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
  334. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
  335. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
  336. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
  337. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
  338. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
  339. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
  340. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
  341. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
  342. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
  343. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
  344. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
  345. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
  346. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
  347. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
  348. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
  349. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
  350. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
  351. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
  352. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
  353. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
  354. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
  355. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
  356. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
  357. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
  358. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
  359. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
  360. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
  361. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
  362. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
  363. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
  364. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
  365. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
  366. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
  367. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
  368. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
  369. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
  370. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
  371. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
  372. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
  373. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
  374. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
  375. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
  376. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
  377. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
  378. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
  379. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
  380. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
  381. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
  382. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
  383. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
  384. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
  385. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
  386. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
  387. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
  388. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
  389. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
  390. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
  391. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
  392. package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
  393. package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
  394. package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
  395. package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
  396. package/dist/components/FormRenderer/handlers/index.js +0 -17
  397. package/dist/components/FormRenderer/handlers/navigate.js +0 -25
  398. package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
  399. package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
  400. package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
  401. package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
  402. package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
  403. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
  404. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
  405. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
  406. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
  407. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
  408. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
  409. package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
  410. package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
  411. package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
  412. package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
  413. package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
  414. package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
  415. package/dist/components/FormRenderer/helpers/getPage.js +0 -27
  416. package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
  417. package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
  418. package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
  419. package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
  420. package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
  421. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
  422. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
  423. package/dist/components/FormRenderer/helpers/index.js +0 -33
  424. package/dist/components/FormRenderer/index.js +0 -10
  425. package/dist/components/FormRenderer/onCYAAction.js +0 -150
  426. package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
  427. package/dist/components/FormRenderer/onPageAction.js +0 -227
  428. package/dist/components/FormRenderer/onPageAction.test.js +0 -960
  429. package/dist/components/FormRenderer/onTaskAction.js +0 -47
  430. package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
  431. package/dist/components/PageActions/ActionButton.js +0 -48
  432. package/dist/components/PageActions/ActionButton.test.js +0 -73
  433. package/dist/components/PageActions/PageActions.js +0 -37
  434. package/dist/components/PageActions/PageActions.stories.mdx +0 -74
  435. package/dist/components/PageActions/PageActions.test.js +0 -106
  436. package/dist/components/PageActions/index.js +0 -10
  437. package/dist/components/SummaryList/GroupAction.js +0 -50
  438. package/dist/components/SummaryList/GroupAction.test.js +0 -86
  439. package/dist/components/SummaryList/RowAction.js +0 -48
  440. package/dist/components/SummaryList/RowAction.test.js +0 -86
  441. package/dist/components/SummaryList/SummaryList.js +0 -128
  442. package/dist/components/SummaryList/SummaryList.scss +0 -79
  443. package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
  444. package/dist/components/SummaryList/SummaryList.test.js +0 -504
  445. package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
  446. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
  447. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
  448. package/dist/components/SummaryList/SummaryListRow.js +0 -58
  449. package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
  450. package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
  451. package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
  452. package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
  453. package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
  454. package/dist/components/SummaryList/helpers/index.js +0 -14
  455. package/dist/components/SummaryList/index.js +0 -10
  456. package/dist/components/TaskList/Task.js +0 -62
  457. package/dist/components/TaskList/Task.test.js +0 -176
  458. package/dist/components/TaskList/TaskList.js +0 -175
  459. package/dist/components/TaskList/TaskList.scss +0 -123
  460. package/dist/components/TaskList/TaskList.stories.mdx +0 -164
  461. package/dist/components/TaskList/TaskList.test.js +0 -535
  462. package/dist/components/TaskList/TaskState.js +0 -37
  463. package/dist/components/TaskList/TaskState.test.js +0 -95
  464. package/dist/components/TaskList/index.js +0 -10
  465. package/dist/components/index.js +0 -56
  466. package/dist/context/HooksContext/HooksContext.js +0 -122
  467. package/dist/context/HooksContext/HooksContext.test.js +0 -45
  468. package/dist/context/HooksContext/index.js +0 -16
  469. package/dist/context/ValidationContext/ValidationContext.js +0 -98
  470. package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
  471. package/dist/context/ValidationContext/index.js +0 -16
  472. package/dist/context/index.js +0 -21
  473. package/dist/hooks/index.js +0 -55
  474. package/dist/hooks/useAxios.js +0 -36
  475. package/dist/hooks/useGetRequest.js +0 -89
  476. package/dist/hooks/useHooks.js +0 -15
  477. package/dist/hooks/useRefData.js +0 -62
  478. package/dist/hooks/useValidation.js +0 -15
  479. package/dist/json/actions.json +0 -17
  480. package/dist/json/actionsNoSave.json +0 -17
  481. package/dist/json/addressDetails.json +0 -149
  482. package/dist/json/areYouACivilServant.json +0 -7
  483. package/dist/json/firstForm.json +0 -94
  484. package/dist/json/grade.json +0 -108
  485. package/dist/json/group.data.json +0 -21
  486. package/dist/json/group.json +0 -402
  487. package/dist/json/groupOfRow.json +0 -137
  488. package/dist/json/groupOfRowData.json +0 -15
  489. package/dist/json/port.json +0 -346
  490. package/dist/json/saveAndContinue.json +0 -98
  491. package/dist/json/sublocation.json +0 -859
  492. package/dist/json/taskList.json +0 -265
  493. package/dist/json/team.json +0 -17351
  494. package/dist/json/terminal.json +0 -81
  495. package/dist/json/userProfile.data.json +0 -21
  496. package/dist/json/userProfile.json +0 -276
  497. package/dist/models/CollectionLabels.js +0 -15
  498. package/dist/models/ComponentTypes.js +0 -58
  499. package/dist/models/EventTypes.js +0 -16
  500. package/dist/models/FormPages.js +0 -16
  501. package/dist/models/FormTypes.js +0 -24
  502. package/dist/models/HubFormats.js +0 -14
  503. package/dist/models/PageAction.js +0 -65
  504. package/dist/models/TaskStates.js +0 -46
  505. package/dist/models/index.js +0 -77
  506. package/dist/setupTests.js +0 -54
  507. package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
  508. package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
  509. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
  510. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
  511. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
  512. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
  513. package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
  514. package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
  515. package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
  516. package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
  517. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
  518. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
  519. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
  520. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
  521. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
  522. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
  523. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
  524. package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
  525. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
  526. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
  527. package/dist/utils/CheckYourAnswers/index.js +0 -15
  528. package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
  529. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
  530. package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
  531. package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
  532. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
  533. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
  534. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
  535. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
  536. package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
  537. package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
  538. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
  539. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
  540. package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
  541. package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
  542. package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
  543. package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
  544. package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
  545. package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
  546. package/dist/utils/CollectionPage/index.js +0 -33
  547. package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
  548. package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
  549. package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
  550. package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
  551. package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
  552. package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
  553. package/dist/utils/Component/addShowWhen.js +0 -43
  554. package/dist/utils/Component/addShowWhen.test.js +0 -217
  555. package/dist/utils/Component/applyToComponentTree.js +0 -68
  556. package/dist/utils/Component/applyToComponentTree.test.js +0 -125
  557. package/dist/utils/Component/cleanAttributes.js +0 -42
  558. package/dist/utils/Component/cleanAttributes.test.js +0 -67
  559. package/dist/utils/Component/elevateNestedComponents.js +0 -58
  560. package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
  561. package/dist/utils/Component/getComponent.js +0 -305
  562. package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
  563. package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
  564. package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
  565. package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
  566. package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
  567. package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
  568. package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
  569. package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
  570. package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
  571. package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
  572. package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
  573. package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
  574. package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
  575. package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
  576. package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
  577. package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
  578. package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
  579. package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
  580. package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
  581. package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
  582. package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
  583. package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
  584. package/dist/utils/Component/getDefaultValue.js +0 -22
  585. package/dist/utils/Component/getDefaultValue.test.js +0 -62
  586. package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
  587. package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
  588. package/dist/utils/Component/index.js +0 -29
  589. package/dist/utils/Component/isEditable.js +0 -13
  590. package/dist/utils/Component/isEditable.test.js +0 -42
  591. package/dist/utils/Component/optionIsSelected.js +0 -25
  592. package/dist/utils/Component/optionIsSelected.test.js +0 -69
  593. package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
  594. package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
  595. package/dist/utils/Component/showComponent.js +0 -25
  596. package/dist/utils/Component/showComponent.test.js +0 -157
  597. package/dist/utils/Component/wrapInFormGroup.js +0 -26
  598. package/dist/utils/Condition/index.js +0 -17
  599. package/dist/utils/Condition/meetsAllConditions.js +0 -44
  600. package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
  601. package/dist/utils/Condition/meetsCondition.js +0 -165
  602. package/dist/utils/Condition/meetsCondition.test.js +0 -899
  603. package/dist/utils/Condition/meetsOneCondition.js +0 -32
  604. package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
  605. package/dist/utils/Condition/setupConditions.js +0 -36
  606. package/dist/utils/Condition/setupConditions.test.js +0 -34
  607. package/dist/utils/Container/getEditableComponents.js +0 -29
  608. package/dist/utils/Container/getEditableComponents.test.js +0 -134
  609. package/dist/utils/Container/index.js +0 -17
  610. package/dist/utils/Container/setupNesting.js +0 -53
  611. package/dist/utils/Container/setupNesting.test.js +0 -143
  612. package/dist/utils/Container/showContainer.js +0 -52
  613. package/dist/utils/Container/showContainer.test.js +0 -179
  614. package/dist/utils/Data/applyFormula.js +0 -90
  615. package/dist/utils/Data/applyFormula.test.js +0 -264
  616. package/dist/utils/Data/deleteValues.js +0 -19
  617. package/dist/utils/Data/deleteValues.test.js +0 -58
  618. package/dist/utils/Data/getAutocompleteSource.js +0 -87
  619. package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
  620. package/dist/utils/Data/getDataPath.js +0 -66
  621. package/dist/utils/Data/getDataPath.test.js +0 -49
  622. package/dist/utils/Data/getOptions.js +0 -86
  623. package/dist/utils/Data/getOptions.test.js +0 -279
  624. package/dist/utils/Data/getSourceData.js +0 -44
  625. package/dist/utils/Data/getSourceData.test.js +0 -158
  626. package/dist/utils/Data/index.js +0 -35
  627. package/dist/utils/Data/nestInRefdataOptions.js +0 -47
  628. package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
  629. package/dist/utils/Data/refDataToOptions.js +0 -44
  630. package/dist/utils/Data/refDataToOptions.test.js +0 -197
  631. package/dist/utils/Data/setDataItem.js +0 -26
  632. package/dist/utils/Data/setDataItem.test.js +0 -136
  633. package/dist/utils/Data/setupFormData.js +0 -49
  634. package/dist/utils/Data/setupFormData.test.js +0 -215
  635. package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
  636. package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
  637. package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
  638. package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
  639. package/dist/utils/FormPage/getConditionalText.js +0 -55
  640. package/dist/utils/FormPage/getConditionalText.test.js +0 -163
  641. package/dist/utils/FormPage/getFormPage.js +0 -54
  642. package/dist/utils/FormPage/getFormPage.test.js +0 -206
  643. package/dist/utils/FormPage/getFormPages.js +0 -30
  644. package/dist/utils/FormPage/getFormPages.test.js +0 -97
  645. package/dist/utils/FormPage/getPageActions.js +0 -58
  646. package/dist/utils/FormPage/getPageActions.test.js +0 -115
  647. package/dist/utils/FormPage/getParagraphFromText.js +0 -21
  648. package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
  649. package/dist/utils/FormPage/index.js +0 -24
  650. package/dist/utils/FormPage/showFormPage.js +0 -52
  651. package/dist/utils/FormPage/showFormPage.test.js +0 -181
  652. package/dist/utils/FormPage/showFormPageCYA.js +0 -23
  653. package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
  654. package/dist/utils/FormPage/useComponent.js +0 -83
  655. package/dist/utils/FormPage/useComponent.test.js +0 -216
  656. package/dist/utils/Format/formatData.js +0 -27
  657. package/dist/utils/Format/formatData.test.js +0 -46
  658. package/dist/utils/Format/formatDataForComponent.js +0 -35
  659. package/dist/utils/Format/formatDataForComponent.test.js +0 -114
  660. package/dist/utils/Format/formatDataForForm.js +0 -27
  661. package/dist/utils/Format/formatDataForForm.test.js +0 -79
  662. package/dist/utils/Format/formatDataForPage.js +0 -31
  663. package/dist/utils/Format/formatDataForPage.test.js +0 -94
  664. package/dist/utils/Format/index.js +0 -21
  665. package/dist/utils/Hub/getFormHub.js +0 -40
  666. package/dist/utils/Hub/getFormHub.test.js +0 -105
  667. package/dist/utils/Hub/index.js +0 -15
  668. package/dist/utils/Meta/constants.js +0 -9
  669. package/dist/utils/Meta/documents/getDocuments.js +0 -15
  670. package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
  671. package/dist/utils/Meta/documents/index.js +0 -19
  672. package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
  673. package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
  674. package/dist/utils/Meta/index.js +0 -17
  675. package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
  676. package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
  677. package/dist/utils/Operate/deleteValueInFormData.js +0 -27
  678. package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
  679. package/dist/utils/Operate/doesContainValue.js +0 -35
  680. package/dist/utils/Operate/doesContainValue.test.js +0 -76
  681. package/dist/utils/Operate/getFirstOf.js +0 -31
  682. package/dist/utils/Operate/getFirstOf.test.js +0 -87
  683. package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
  684. package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
  685. package/dist/utils/Operate/getLength.js +0 -51
  686. package/dist/utils/Operate/getLength.test.js +0 -90
  687. package/dist/utils/Operate/index.js +0 -13
  688. package/dist/utils/Operate/persistValueInFormData.js +0 -40
  689. package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
  690. package/dist/utils/Operate/runPageOperations.js +0 -75
  691. package/dist/utils/Operate/runPageOperations.test.js +0 -105
  692. package/dist/utils/Operate/setValueInFormData.js +0 -22
  693. package/dist/utils/Operate/setValueInFormData.test.js +0 -45
  694. package/dist/utils/Operate/shouldRun.js +0 -57
  695. package/dist/utils/Operate/shouldRun.test.js +0 -65
  696. package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
  697. package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
  698. package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
  699. package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
  700. package/dist/utils/Validate/additional/index.js +0 -74
  701. package/dist/utils/Validate/additional/index.test.js +0 -130
  702. package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
  703. package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
  704. package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
  705. package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
  706. package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
  707. package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
  708. package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
  709. package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
  710. package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
  711. package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
  712. package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
  713. package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
  714. package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
  715. package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
  716. package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
  717. package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
  718. package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
  719. package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
  720. package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
  721. package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
  722. package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
  723. package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
  724. package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
  725. package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
  726. package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
  727. package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
  728. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
  729. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
  730. package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
  731. package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
  732. package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
  733. package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
  734. package/dist/utils/Validate/additional/utils.js +0 -35
  735. package/dist/utils/Validate/index.js +0 -33
  736. package/dist/utils/Validate/validateCollection.js +0 -50
  737. package/dist/utils/Validate/validateCollection.test.js +0 -134
  738. package/dist/utils/Validate/validateComponent.js +0 -126
  739. package/dist/utils/Validate/validateComponent.test.js +0 -435
  740. package/dist/utils/Validate/validateContainer.js +0 -52
  741. package/dist/utils/Validate/validateContainer.test.js +0 -115
  742. package/dist/utils/Validate/validateDate.js +0 -112
  743. package/dist/utils/Validate/validateDate.test.js +0 -133
  744. package/dist/utils/Validate/validateEmail.js +0 -45
  745. package/dist/utils/Validate/validateEmail.test.js +0 -78
  746. package/dist/utils/Validate/validateMultifile.js +0 -29
  747. package/dist/utils/Validate/validateMultifile.test.js +0 -46
  748. package/dist/utils/Validate/validateOnPageLoad.js +0 -24
  749. package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
  750. package/dist/utils/Validate/validatePage.js +0 -56
  751. package/dist/utils/Validate/validatePage.test.js +0 -795
  752. package/dist/utils/Validate/validateRegex.js +0 -41
  753. package/dist/utils/Validate/validateRegex.test.js +0 -43
  754. package/dist/utils/Validate/validateRequired.js +0 -37
  755. package/dist/utils/Validate/validateRequired.test.js +0 -64
  756. package/dist/utils/Validate/validateTextArea.js +0 -36
  757. package/dist/utils/Validate/validateTextArea.test.js +0 -71
  758. package/dist/utils/Validate/validateTime.js +0 -76
  759. package/dist/utils/Validate/validateTime.test.js +0 -116
  760. package/dist/utils/canOverrideFieldRequired.js +0 -23
  761. package/dist/utils/index.js +0 -42
@@ -1,799 +0,0 @@
1
- "use strict";
2
-
3
- var _react = require("@testing-library/react");
4
- var _axios = _interopRequireDefault(require("axios"));
5
- var _axiosMockAdapter = _interopRequireDefault(require("axios-mock-adapter"));
6
- var _react2 = _interopRequireDefault(require("react"));
7
- var _reactDom = require("react-dom");
8
- var _testUtils = require("react-dom/test-utils");
9
- var _models = require("../../models");
10
- var _CheckYourAnswers = require("../CheckYourAnswers/CheckYourAnswers");
11
- var _TaskList = require("../TaskList/TaskList");
12
- var _FormRenderer = _interopRequireWildcard(require("./FormRenderer"));
13
- var _areYouACivilServant = _interopRequireDefault(require("../../json/areYouACivilServant.json"));
14
- var _grade = _interopRequireDefault(require("../../json/grade.json"));
15
- var _team = _interopRequireDefault(require("../../json/team.json"));
16
- var _userProfileData = _interopRequireDefault(require("../../json/userProfile.data.json"));
17
- var _userProfile = _interopRequireDefault(require("../../json/userProfile.json"));
18
- var _taskList = _interopRequireDefault(require("../../json/taskList.json"));
19
- var _firstForm = _interopRequireDefault(require("../../json/firstForm.json"));
20
- var _jsxRuntime = require("react/jsx-runtime");
21
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
22
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
24
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
25
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
26
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
27
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // Global imports
28
- // Local imports
29
- // JSON
30
- const setDate = (element, date) => {
31
- const items = element.children;
32
- _react.fireEvent.change(items[0].childNodes[0].childNodes[1], {
33
- target: {
34
- name: 'date-day',
35
- value: date[0]
36
- }
37
- });
38
- _react.fireEvent.change(items[1].childNodes[0].childNodes[1], {
39
- target: {
40
- name: 'date-month',
41
- value: date[1]
42
- }
43
- });
44
- _react.fireEvent.change(items[2].childNodes[0].childNodes[1], {
45
- target: {
46
- name: 'date-year',
47
- value: date[2]
48
- }
49
- });
50
- };
51
- const sleep = ms => new Promise(resolve => {
52
- setTimeout(resolve, ms);
53
- });
54
- describe('components', () => {
55
- describe('FormRenderer', () => {
56
- const mockAxios = new _axiosMockAdapter.default(_axios.default);
57
- let container = null;
58
- const refDataUrl = suffix => "".concat(_userProfileData.default.urls.refData, "/").concat(suffix);
59
- beforeEach(() => {
60
- container = document.createElement('div');
61
- document.body.appendChild(container);
62
- mockAxios.reset();
63
- mockAxios.onGet(refDataUrl('areYouACivilServant')).reply(200, _areYouACivilServant.default);
64
- mockAxios.onGet(refDataUrl('grade')).reply(200, _grade.default);
65
- mockAxios.onGet(refDataUrl('team')).reply(200, _team.default);
66
- });
67
- afterEach(() => {
68
- (0, _reactDom.unmountComponentAtNode)(container);
69
- container.remove();
70
- container = null;
71
- });
72
- const checkForm = formContainer => {
73
- const formWrapper = formContainer;
74
- const form = formWrapper.childNodes[0];
75
- expect(form.tagName).toEqual('DIV');
76
- expect(form.classList).toContain(_FormRenderer.DEFAULT_CLASS);
77
- return form;
78
- };
79
- const getChangeLink = summaryList => {
80
- const [,, actions] = summaryList.childNodes[0].childNodes[0].childNodes;
81
- return actions.childNodes[0];
82
- };
83
- const getContinueButton = page => page.childNodes[page.childNodes.length - 1].childNodes[0].childNodes[0];
84
- const getCancelButton = page => page.childNodes[page.childNodes.length - 1].childNodes[1].childNodes[0];
85
- it('should start on the hub page correctly and display the title', async () => {
86
- await (0, _testUtils.act)(async () => {
87
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
88
- data: _userProfileData.default
89
- })), container);
90
- });
91
- const form = checkForm(container);
92
- expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
93
- const title = form.childNodes[0];
94
- expect(title.tagName).toEqual('H1');
95
- expect(title.textContent).toEqual(_userProfile.default.title);
96
- const hub = form.childNodes[1];
97
- expect(hub.tagName).toEqual('DIV');
98
- expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
99
- });
100
- it('should fire the onFormLoad method passed in the hooks', async () => {
101
- let onFormLoadCalled = false;
102
- const ON_FORM_LOAD = () => {
103
- onFormLoadCalled = true;
104
- };
105
- const HOOKS = {
106
- onFormLoad: ON_FORM_LOAD
107
- };
108
- await (0, _testUtils.act)(async () => {
109
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
110
- data: _userProfileData.default,
111
- hooks: HOOKS
112
- })), container);
113
- });
114
- expect(onFormLoadCalled).toBeTruthy();
115
- });
116
- it('should navigate to the first editable page', async () => {
117
- const ON_PAGE_CHANGE_CALLS = [];
118
- const ON_PAGE_CHANGE = pageId => {
119
- ON_PAGE_CHANGE_CALLS.push(pageId);
120
- };
121
- const HOOKS = {
122
- onPageChange: ON_PAGE_CHANGE
123
- };
124
- await (0, _testUtils.act)(async () => {
125
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
126
- data: _userProfileData.default,
127
- hooks: HOOKS
128
- })), container);
129
- });
130
- const form = checkForm(container);
131
- const hub = form.childNodes[1]; // Hub = CYA
132
- const [,, civilServantList] = hub.childNodes;
133
- const link = getChangeLink(civilServantList);
134
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
135
- _react.fireEvent.click(link, {});
136
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
137
- expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[1].id);
138
-
139
- // The form layout should have changed to the current page.
140
- expect(form.childNodes.length).toEqual(1); // Just the page.
141
- const page = form.childNodes[0];
142
- const pageHeading = page.childNodes[0];
143
- expect(pageHeading.tagName).toEqual('H1');
144
- expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
145
- });
146
- it('should handle a page submission', async () => {
147
- const ON_SUBMIT_CALLS = [];
148
- const ON_SUBMIT = (type, payload, onSuccess, onError, fieldName, fieldValue) => {
149
- ON_SUBMIT_CALLS.push({
150
- type,
151
- payload,
152
- onSuccess,
153
- onError,
154
- fieldName,
155
- fieldValue
156
- });
157
- onSuccess();
158
- };
159
- const HOOKS = {
160
- onSubmit: ON_SUBMIT
161
- };
162
- await (0, _testUtils.act)(async () => {
163
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
164
- data: _userProfileData.default,
165
- hooks: HOOKS,
166
- type: _models.FormTypes.HUB
167
- })), container);
168
- });
169
- const form = checkForm(container);
170
-
171
- // Navigate to the "Are you a civil servant?" page.
172
- const hub = form.childNodes[1]; // Hub = CYA
173
- const [,, civilServantList] = hub.childNodes;
174
- const link = getChangeLink(civilServantList);
175
- _react.fireEvent.click(link, {});
176
-
177
- // Should already be answered "Yes", but select "No, I'm a contractor" option to generate patch
178
- // and then click "Continue".
179
- _react.fireEvent.click(_react.screen.getByText("No, I'm a contractor"));
180
- const page = form.childNodes[0];
181
- const continueButton = getContinueButton(page);
182
- expect(ON_SUBMIT_CALLS.length).toEqual(0);
183
- _react.fireEvent.click(continueButton, {});
184
- expect(ON_SUBMIT_CALLS.length).toEqual(1);
185
- expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
186
- expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('no-contractor');
187
- expect(ON_SUBMIT_CALLS[0].fieldName).toEqual('Are you a civil servant?');
188
- expect(ON_SUBMIT_CALLS[0].fieldValue).toEqual("No, I'm a contractor");
189
-
190
- // And we should be back on the hub.
191
- expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
192
- const title = form.childNodes[0];
193
- expect(title.tagName).toEqual('H1');
194
- expect(title.textContent).toEqual(_userProfile.default.title);
195
- });
196
- it('should handle a page submission error', async () => {
197
- const ON_SUBMIT_CALLS = [];
198
- const ON_SUBMIT = (type, payload, onSuccess, onError) => {
199
- ON_SUBMIT_CALLS.push({
200
- type,
201
- payload,
202
- onSuccess,
203
- onError
204
- });
205
- onError([{
206
- id: 'unknown',
207
- error: 'Something went wrong'
208
- }]);
209
- };
210
- const HOOKS = {
211
- onSubmit: ON_SUBMIT,
212
- onAction: (formData, patch) => ({
213
- formData,
214
- patch
215
- })
216
- };
217
- await (0, _testUtils.act)(async () => {
218
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
219
- data: _userProfileData.default,
220
- hooks: HOOKS
221
- })), container);
222
- });
223
- const form = checkForm(container);
224
-
225
- // Navigate to the "Are you a civil servant?" page.
226
- const hub = form.childNodes[1]; // Hub = CYA
227
- const [,, civilServantList] = hub.childNodes;
228
- const link = getChangeLink(civilServantList);
229
- _react.fireEvent.click(link, {});
230
-
231
- // Should already be answered "Yes", so simply click "Continue".
232
- const page = form.childNodes[0];
233
- const continueButton = getContinueButton(page);
234
- expect(ON_SUBMIT_CALLS.length).toEqual(0);
235
- _react.fireEvent.click(continueButton, {});
236
- expect(ON_SUBMIT_CALLS.length).toEqual(1);
237
- expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
238
- expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('yes');
239
-
240
- // And we should be kept on the same page.
241
- expect(form.childNodes.length).toEqual(1); // Just the page.
242
- const pageHeading = form.childNodes[0].childNodes[1];
243
- expect(pageHeading.tagName).toEqual('H1');
244
- expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
245
- });
246
- it('should handle a page submission once regardless of how many times page action is clicked', async () => {
247
- const ON_PAGE_CHANGE_CALLS = [];
248
- const ON_PAGE_CHANGE = pageId => {
249
- ON_PAGE_CHANGE_CALLS.push(pageId);
250
- };
251
- const ON_SUBMIT_CALLS = [];
252
- const ON_SUBMIT = async (type, payload, onSuccess, onError, fieldName, fieldValue) => {
253
- ON_SUBMIT_CALLS.push({
254
- type,
255
- payload,
256
- onSuccess,
257
- onError,
258
- fieldName,
259
- fieldValue
260
- });
261
-
262
- // mock a delay when submitting to the backend
263
- await sleep(2000);
264
- onSuccess();
265
- };
266
- const HOOKS = {
267
- onSubmit: ON_SUBMIT,
268
- onPageChange: ON_PAGE_CHANGE
269
- };
270
- (0, _testUtils.act)(() => {
271
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _firstForm.default), {}, {
272
- hooks: HOOKS,
273
- type: _models.FormTypes.CYA
274
- })), container);
275
- });
276
- const [,,,,, continueButtonGroup] = container.childNodes[0].childNodes[0].childNodes;
277
-
278
- // go to first question page
279
- const continueFormButton = continueButtonGroup.childNodes[0];
280
- _react.fireEvent.click(continueFormButton);
281
- const innerDiv = container.childNodes[0].childNodes[0];
282
-
283
- // enter a value in the input field
284
- const firstNameInput = innerDiv.childNodes[1].childNodes[2];
285
- const EVENT = {
286
- target: {
287
- name: firstNameInput.id,
288
- value: 'abc'
289
- }
290
- };
291
- _react.fireEvent.change(firstNameInput, EVENT);
292
- const submitButton = innerDiv.childNodes[2].childNodes[0];
293
-
294
- // click on save and continue
295
- _react.fireEvent.click(submitButton);
296
-
297
- // click on save and continue again
298
- _react.fireEvent.click(submitButton);
299
-
300
- // click on save and continue a third time
301
- _react.fireEvent.click(submitButton);
302
-
303
- // only expect one submit call to be made
304
- expect(ON_SUBMIT_CALLS.length).toEqual(1);
305
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
306
- expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SAVE_AND_CONTINUE);
307
- });
308
- it('should handle a page submission repeatedly if ignoreSubmittingFlag is true', async () => {
309
- const ON_PAGE_CHANGE_CALLS = [];
310
- const ON_PAGE_CHANGE = pageId => {
311
- ON_PAGE_CHANGE_CALLS.push(pageId);
312
- };
313
- const ON_SUBMIT_CALLS = [];
314
- const ON_SUBMIT = async (type, payload, onSuccess, onError, fieldName, fieldValue) => {
315
- ON_SUBMIT_CALLS.push({
316
- type,
317
- payload,
318
- onSuccess,
319
- onError,
320
- fieldName,
321
- fieldValue
322
- });
323
-
324
- // mock a delay when submitting to the backend
325
- await sleep(2000);
326
- onSuccess();
327
- };
328
- const HOOKS = {
329
- onSubmit: ON_SUBMIT,
330
- onPageChange: ON_PAGE_CHANGE
331
- };
332
- const formDefinition = _objectSpread({}, _userProfile.default);
333
- formDefinition.pages[1].actions = [{
334
- type: 'saveAndContinue',
335
- page: 'test',
336
- ignoreSubmittingFlag: true
337
- }, {
338
- type: 'cancel'
339
- }];
340
- (0, _testUtils.act)(() => {
341
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, formDefinition), {}, {
342
- data: _userProfileData.default,
343
- hooks: HOOKS
344
- })), container);
345
- });
346
- const form = checkForm(container);
347
-
348
- // Navigate to the "Are you a civil servant?" page.
349
- const hub = form.childNodes[1]; // Hub = CYA
350
- const [,, civilServantList] = hub.childNodes;
351
- const link = getChangeLink(civilServantList);
352
- _react.fireEvent.click(link, {});
353
-
354
- // Should already be answered "Yes", so simply click "Continue".
355
- const page = form.childNodes[0];
356
- const continueButton = getContinueButton(page);
357
- expect(ON_SUBMIT_CALLS.length).toEqual(0);
358
- _react.fireEvent.click(continueButton, {});
359
- expect(ON_SUBMIT_CALLS.length).toEqual(1);
360
- expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SAVE_AND_CONTINUE);
361
-
362
- // click on save and continue
363
- _react.fireEvent.click(continueButton);
364
-
365
- // click on save and continue again
366
- _react.fireEvent.click(continueButton);
367
-
368
- // click on save and continue a third time
369
- _react.fireEvent.click(continueButton);
370
-
371
- // expect all submit calls to be made
372
- expect(ON_SUBMIT_CALLS.length).toEqual(4);
373
- });
374
- it('should handle page navigation', async () => {
375
- const ON_PAGE_CHANGE_CALLS = [];
376
- const ON_PAGE_CHANGE = pageId => {
377
- ON_PAGE_CHANGE_CALLS.push(pageId);
378
- };
379
- const HOOKS = {
380
- onPageChange: ON_PAGE_CHANGE
381
- };
382
- await (0, _testUtils.act)(async () => {
383
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
384
- data: _userProfileData.default,
385
- hooks: HOOKS
386
- })), container);
387
- });
388
- const form = checkForm(container);
389
-
390
- // Navigate to the "Add or change a line manager" page.
391
- const hub = form.childNodes[1]; // Hub = CYA
392
- const [,,,,, lineManagerList] = hub.childNodes;
393
- const link = getChangeLink(lineManagerList);
394
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
395
- _react.fireEvent.click(link, {});
396
- expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id);
397
-
398
- // Should be on the page explaining what changing the line manager means.
399
- const page = form.childNodes[0];
400
- const pageHeading = page.childNodes[0];
401
- expect(pageHeading.tagName).toEqual('H1');
402
- expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title);
403
-
404
- // Now click on the "Continue" button on here.
405
- const continueButton = getContinueButton(page);
406
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
407
- _react.fireEvent.click(continueButton, {});
408
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
409
- expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
410
- const newPageHeading = form.childNodes[0].childNodes[0];
411
- expect(newPageHeading.tagName).toEqual('H1');
412
- expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
413
- });
414
- it('should show no title when hide_title is set to true', async () => {
415
- await (0, _testUtils.act)(async () => {
416
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
417
- data: _userProfileData.default,
418
- hide_title: true
419
- })), container);
420
- });
421
- const form = checkForm(container);
422
- expect(form.childNodes.length).toEqual(1); // Hub page (= CYA)
423
- const hub = form.childNodes[0];
424
- expect(hub.tagName).toEqual('DIV');
425
- expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
426
- });
427
- it('should render a task list', async () => {
428
- await (0, _testUtils.act)(async () => {
429
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread({}, _taskList.default)), container);
430
- });
431
- const taskList = container.childNodes[0].childNodes[1];
432
- expect(taskList.classList).toContain(_TaskList.DEFAULT_CLASS);
433
- });
434
- it('should render a cya page', async () => {
435
- await (0, _testUtils.act)(async () => {
436
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread({}, _firstForm.default)), container);
437
- });
438
- const cya = container.childNodes[0];
439
- expect(cya.classList).toContain('hods-form');
440
- });
441
- it('should load task list with notes', async () => {
442
- const ON_SUBMIT_CALLS = [];
443
- const ON_SUBMIT = (type, payload, onSuccess) => {
444
- ON_SUBMIT_CALLS.push(payload);
445
- onSuccess();
446
- };
447
- const HOOKS = {
448
- onSubmit: ON_SUBMIT
449
- };
450
- const TASK_LIST_WITH_NOTES = JSON.parse(JSON.stringify(_taskList.default));
451
- TASK_LIST_WITH_NOTES.hub.notes = {
452
- title: "test title",
453
- text: "test text",
454
- show_when: [{
455
- "op": "=",
456
- "field": "areYouACivilServant",
457
- "value": "yes"
458
- }]
459
- };
460
- await (0, _testUtils.act)(async () => {
461
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NOTES), {}, {
462
- data: _userProfileData.default,
463
- hooks: HOOKS
464
- })), container);
465
- });
466
- const taskList = container.childNodes[0].childNodes[1];
467
- expect(taskList.childNodes[5].textContent).toEqual("test text");
468
- expect(taskList.childNodes[5].classList).toContain('govuk-textarea');
469
- });
470
- it('should not load task list with notes', async () => {
471
- const ON_SUBMIT_CALLS = [];
472
- const ON_SUBMIT = (type, payload, onSuccess) => {
473
- ON_SUBMIT_CALLS.push(payload);
474
- onSuccess();
475
- };
476
- const HOOKS = {
477
- onSubmit: ON_SUBMIT
478
- };
479
- const TASK_LIST_WITH_NOTES = JSON.parse(JSON.stringify(_taskList.default));
480
- TASK_LIST_WITH_NOTES.hub.notes = {
481
- title: "test title",
482
- text: "test text",
483
- show_when: [{
484
- "op": "!=",
485
- "field": "changeSummary",
486
- "value": undefined
487
- }]
488
- };
489
- await (0, _testUtils.act)(async () => {
490
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NOTES), {}, {
491
- data: _userProfileData.default,
492
- hooks: HOOKS
493
- })), container);
494
- });
495
- const taskList = container.childNodes[0].childNodes[1];
496
- taskList.childNodes.forEach(child => {
497
- // eslint-disable-next-line no-console
498
- console.log("taskList, child = ".concat(JSON.stringify(child.textContent)));
499
- });
500
- expect(taskList.childNodes[5].textContent).not.toEqual("test text");
501
- expect(taskList.childNodes[5].classList).not.toContain('govuk-textarea');
502
- });
503
- it('should handle navigating between task list pages', async () => {
504
- const ON_SUBMIT_CALLS = [];
505
- const ON_SUBMIT = (type, payload, onSuccess) => {
506
- ON_SUBMIT_CALLS.push(payload);
507
- onSuccess();
508
- };
509
- const HOOKS = {
510
- onSubmit: ON_SUBMIT
511
- };
512
- await (0, _testUtils.act)(async () => {
513
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
514
- hooks: HOOKS
515
- })), container);
516
- });
517
- const taskList = container.childNodes[0].childNodes[1];
518
-
519
- // Check statuses are correct
520
- let firstTaskStatus = taskList.childNodes[3].childNodes[0].childNodes[1];
521
- expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label);
522
- let secondTaskStatus = taskList.childNodes[3].childNodes[1].childNodes[1];
523
- expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.CANNOT_START_YET].label);
524
-
525
- // Launch first task
526
- const firstTask = taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0];
527
- expect(firstTask.textContent).toEqual('Date, location and mode details');
528
- _react.fireEvent.click(firstTask, {});
529
-
530
- // Fill first page and navigate
531
- let newPage = container.childNodes[0].childNodes[0];
532
- expect(newPage.childNodes[0].textContent).toEqual('Event Date');
533
- const fieldset = newPage.childNodes[1].childNodes[0];
534
- // child nodes of fieldset are legend and date
535
- setDate(fieldset.children[1], ['7', '7', '2022']);
536
- let continueButton = newPage.childNodes[2].childNodes[0];
537
- _react.fireEvent.click(continueButton, {});
538
-
539
- // Fill second page and navigate
540
- newPage = container.childNodes[0].childNodes[0];
541
- expect(newPage.childNodes[0].textContent).toEqual('Event Mode');
542
- const seaButton = newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0];
543
- expect(seaButton.textContent).toEqual('Sea');
544
- _react.fireEvent.click(seaButton.childNodes[0], {});
545
- continueButton = newPage.childNodes[2].childNodes[0];
546
- _react.fireEvent.click(continueButton, {});
547
-
548
- // Click change to mode on CYA page
549
- const cyaPageChange = container.childNodes[0].childNodes[0];
550
- expect(cyaPageChange.childNodes[0].textContent).toEqual('Check your answers');
551
- const modeChangeLink = cyaPageChange.childNodes[4].childNodes[0].childNodes[0].childNodes[2].childNodes[0];
552
- expect(modeChangeLink.textContent).toEqual('Change Event Mode');
553
- _react.fireEvent.click(modeChangeLink, {});
554
- const changePage = container.childNodes[0].childNodes[0];
555
- expect(changePage.childNodes[0].textContent).toEqual('Event Mode');
556
- // Click on radio for 'Air'
557
- const airButton = changePage.childNodes[1].childNodes[0].childNodes[2].childNodes[1];
558
- expect(airButton.textContent).toEqual('Air');
559
- _react.fireEvent.click(airButton.childNodes[0]);
560
- // Continue again to CYA page
561
- expect(changePage.childNodes[2].childNodes[0].textContent).toEqual('Save and continue');
562
- continueButton = changePage.childNodes[2].childNodes[0];
563
- _react.fireEvent.click(continueButton, {});
564
-
565
- // Continue on from CYA page
566
- const cyaPage = container.childNodes[0].childNodes[0];
567
- expect(cyaPage.childNodes[0].textContent).toEqual('Check your answers');
568
- expect(cyaPage.childNodes[5].childNodes[0].textContent).toEqual('Save and continue');
569
- expect(cyaPage.childNodes[5].childNodes[1].textContent).toEqual('Save and return later');
570
- _react.fireEvent.click(cyaPage.childNodes[5].childNodes[0], {});
571
-
572
- // Should be back at task list
573
- expect(container.childNodes[0].childNodes[0].textContent).toEqual('Task List Form');
574
-
575
- // Check statuses are correct
576
- firstTaskStatus = container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[1];
577
- expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.COMPLETE].label);
578
- secondTaskStatus = container.childNodes[0].childNodes[1].childNodes[3].childNodes[1].childNodes[1];
579
- expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label);
580
-
581
- // Check final data submitted to backend is as expected
582
- const finalSubmit = ON_SUBMIT_CALLS[ON_SUBMIT_CALLS.length - 1];
583
- expect(finalSubmit.date).toEqual('7-7-2022');
584
- expect(finalSubmit.mode).toEqual('air');
585
- expect(finalSubmit.formStatus.tasks['Date, location and mode details'].complete).toEqual(true);
586
- });
587
- it('should go straight to CYA page if a complete task is selected', async () => {
588
- const ON_SUBMIT = (type, payload, onSuccess) => {
589
- onSuccess();
590
- };
591
- const HOOKS = {
592
- onSubmit: ON_SUBMIT
593
- };
594
- await (0, _testUtils.act)(async () => {
595
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
596
- hooks: HOOKS
597
- })), container);
598
- });
599
- const taskList = container.childNodes[0].childNodes[1];
600
-
601
- // Launch first task
602
- _react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
603
-
604
- // Fill first page and navigate
605
- let newPage = container.childNodes[0].childNodes[0];
606
- const fieldset = newPage.childNodes[1].childNodes[0];
607
- setDate(fieldset.children[1], ['7', '7', '2022']);
608
- // child nodes of fieldset are legend and date
609
-
610
- _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
611
-
612
- // Fill second page and navigate
613
- newPage = container.childNodes[0].childNodes[0];
614
- _react.fireEvent.click(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0], {});
615
- _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
616
-
617
- // Continue on from CYA page
618
- _react.fireEvent.click(container.childNodes[0].childNodes[0].childNodes[5].childNodes[0], {});
619
-
620
- // Launch same task again
621
- _react.fireEvent.click(container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
622
-
623
- // Should be at CYA page
624
- expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Check your answers');
625
- });
626
- it('should go to incomplete page when selecting in-progress task', async () => {
627
- const ON_SUBMIT = (type, payload, onSuccess) => {
628
- onSuccess();
629
- };
630
- const HOOKS = {
631
- onSubmit: ON_SUBMIT
632
- };
633
- const DATA = {
634
- "date": "7-7-2022",
635
- "formStatus": {
636
- "tasks": {
637
- "Date, location and mode details": {
638
- "complete": false,
639
- "currentPage": "eventMode"
640
- }
641
- },
642
- "taskPage": "eventMode"
643
- }
644
- };
645
- await (0, _testUtils.act)(async () => {
646
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
647
- hooks: HOOKS,
648
- data: DATA
649
- })), container);
650
- });
651
- const taskList = container.childNodes[0].childNodes[1];
652
-
653
- // Launch first task
654
- _react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
655
-
656
- // Should be at Event Mode page
657
- expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Event Mode');
658
- });
659
- it('should go to the first page of a complete task if noTaskCYAs specified', async () => {
660
- const ON_SUBMIT = (type, payload, onSuccess) => {
661
- onSuccess();
662
- };
663
- const HOOKS = {
664
- onSubmit: ON_SUBMIT
665
- };
666
- const TASK_LIST_WITH_NO_TASK_CYAS = JSON.parse(JSON.stringify(_taskList.default));
667
- TASK_LIST_WITH_NO_TASK_CYAS.hub.noTaskCYAs = true;
668
- TASK_LIST_WITH_NO_TASK_CYAS.pages[1].actions[0] = {
669
- type: 'save',
670
- complete: true
671
- };
672
- await (0, _testUtils.act)(async () => {
673
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NO_TASK_CYAS), {}, {
674
- hooks: HOOKS
675
- })), container);
676
- });
677
- const taskList = container.childNodes[0].childNodes[1];
678
-
679
- // Launch first task
680
- _react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
681
-
682
- // Fill first page and navigate
683
- let newPage = container.childNodes[0].childNodes[0];
684
- const fieldset = newPage.childNodes[1].childNodes[0];
685
- setDate(fieldset.children[1], ['7', '7', '2022']);
686
- _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
687
-
688
- // Fill second page
689
- newPage = container.childNodes[0].childNodes[0];
690
- // expect(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0]).toEqual('');
691
- _react.fireEvent.click(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0], {});
692
- _react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
693
-
694
- // Launch same task again
695
- _react.fireEvent.click(container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
696
-
697
- // Should be on the first page
698
- expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Event Date');
699
- });
700
- it('should handle cancellation from a page', async () => {
701
- const ON_CANCEL_CALLS = [];
702
- const ON_CANCEL = () => {
703
- ON_CANCEL_CALLS.push(undefined);
704
- };
705
- const HOOKS = {
706
- onCancel: ON_CANCEL
707
- };
708
- await (0, _testUtils.act)(async () => {
709
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
710
- data: _userProfileData.default,
711
- hooks: HOOKS
712
- })), container);
713
- });
714
- const form = checkForm(container);
715
-
716
- // Navigate to the "Are you a civil servant?" page.
717
- const hub = form.childNodes[1]; // Hub = CYA
718
- const [,, civilServantList] = hub.childNodes;
719
- const link = getChangeLink(civilServantList);
720
- _react.fireEvent.click(link, {});
721
-
722
- // Should already be answered "Yes", so simply click "Continue".
723
- const page = form.childNodes[0];
724
- const cancel = getCancelButton(page);
725
- expect(ON_CANCEL_CALLS.length).toEqual(0);
726
- _react.fireEvent.click(cancel, {});
727
- expect(ON_CANCEL_CALLS.length).toEqual(1);
728
- });
729
- it('should navigate to a specific page at the beginning of a task if it is set as the firstPage of a task', async () => {
730
- const ON_SUBMIT_CALLS = [];
731
- const ON_SUBMIT = (type, payload, onSuccess) => {
732
- ON_SUBMIT_CALLS.push(payload);
733
- onSuccess();
734
- };
735
- const HOOKS = {
736
- onSubmit: ON_SUBMIT
737
- };
738
- const TASK_LIST_NON_SEQUENTIAL = JSON.parse(JSON.stringify(_taskList.default));
739
- TASK_LIST_NON_SEQUENTIAL.hub.nonSequential = true;
740
- await (0, _testUtils.act)(async () => {
741
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_NON_SEQUENTIAL), {}, {
742
- hooks: HOOKS
743
- })), container);
744
- });
745
- const taskList = container.childNodes[0].childNodes[1];
746
-
747
- // Launch first task of second section
748
- const firstTask = taskList.childNodes[5].childNodes[0].childNodes[0].childNodes[0];
749
- expect(firstTask.textContent).toEqual('People details');
750
- _react.fireEvent.click(firstTask, {});
751
-
752
- // Should be at Surname page
753
- const newPage = container.childNodes[0].childNodes[0];
754
- expect(newPage.childNodes[0].textContent).toEqual('Surname');
755
- });
756
- it('should handle page navigation correctly when hideBlankRows is true', async () => {
757
- const ON_PAGE_CHANGE_CALLS = [];
758
- const ON_PAGE_CHANGE = pageId => {
759
- ON_PAGE_CHANGE_CALLS.push(pageId);
760
- };
761
- const HOOKS = {
762
- onPageChange: ON_PAGE_CHANGE
763
- };
764
- await (0, _testUtils.act)(async () => {
765
- (0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
766
- data: _userProfileData.default,
767
- hooks: HOOKS,
768
- hideBlankRows: true
769
- })), container);
770
- });
771
- const form = checkForm(container);
772
-
773
- // Navigate to the "Add or change a line manager" page.
774
- const hub = form.childNodes[1]; // Hub = CYA
775
- const [,,, lineManagerList] = hub.childNodes;
776
- const link = getChangeLink(lineManagerList);
777
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
778
- _react.fireEvent.click(link, {});
779
- expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id);
780
-
781
- // Should be on the page explaining what changing the line manager means.
782
- const page = form.childNodes[0];
783
- const pageHeading = page.childNodes[0];
784
- expect(pageHeading.tagName).toEqual('H1');
785
- expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title);
786
-
787
- // Now click on the "Continue" button on here.
788
- const continueButton = getContinueButton(page);
789
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
790
- _react.fireEvent.click(continueButton, {});
791
- expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
792
- expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
793
- const newPageHeading = form.childNodes[0].childNodes[0];
794
- expect(newPageHeading.tagName).toEqual('H1');
795
- expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
796
- });
797
- });
798
- });
799
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2F4aW9zIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9heGlvc01vY2tBZGFwdGVyIiwiX3JlYWN0MiIsIl9yZWFjdERvbSIsIl90ZXN0VXRpbHMiLCJfbW9kZWxzIiwiX0NoZWNrWW91ckFuc3dlcnMiLCJfVGFza0xpc3QiLCJfRm9ybVJlbmRlcmVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfYXJlWW91QUNpdmlsU2VydmFudCIsIl9ncmFkZSIsIl90ZWFtIiwiX3VzZXJQcm9maWxlRGF0YSIsIl91c2VyUHJvZmlsZSIsIl90YXNrTGlzdCIsIl9maXJzdEZvcm0iLCJfanN4UnVudGltZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsInNldERhdGUiLCJlbGVtZW50IiwiZGF0ZSIsIml0ZW1zIiwiY2hpbGRyZW4iLCJmaXJlRXZlbnQiLCJjaGFuZ2UiLCJjaGlsZE5vZGVzIiwidGFyZ2V0IiwibmFtZSIsInNsZWVwIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJkZXNjcmliZSIsIm1vY2tBeGlvcyIsIk1vY2tBZGFwdGVyIiwiYXhpb3MiLCJjb250YWluZXIiLCJyZWZEYXRhVXJsIiwic3VmZml4IiwiY29uY2F0IiwiVVNFUl9QUk9GSUxFX0RBVEEiLCJ1cmxzIiwicmVmRGF0YSIsImJlZm9yZUVhY2giLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJyZXNldCIsIm9uR2V0IiwicmVwbHkiLCJDSVZJTF9TRVJWQU5UIiwiR1JBREUiLCJURUFNUyIsImFmdGVyRWFjaCIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJyZW1vdmUiLCJjaGVja0Zvcm0iLCJmb3JtQ29udGFpbmVyIiwiZm9ybVdyYXBwZXIiLCJmb3JtIiwiZXhwZWN0IiwidGFnTmFtZSIsInRvRXF1YWwiLCJjbGFzc0xpc3QiLCJ0b0NvbnRhaW4iLCJERUZBVUxUX0NMQVNTIiwiZ2V0Q2hhbmdlTGluayIsInN1bW1hcnlMaXN0IiwiYWN0aW9ucyIsImdldENvbnRpbnVlQnV0dG9uIiwicGFnZSIsImdldENhbmNlbEJ1dHRvbiIsIml0IiwiYWN0IiwicmVuZGVyIiwianN4IiwiVVNFUl9QUk9GSUxFIiwiZGF0YSIsInRpdGxlIiwidGV4dENvbnRlbnQiLCJodWIiLCJDWUFfREVGQVVMVF9DTEFTUyIsIm9uRm9ybUxvYWRDYWxsZWQiLCJPTl9GT1JNX0xPQUQiLCJIT09LUyIsIm9uRm9ybUxvYWQiLCJob29rcyIsInRvQmVUcnV0aHkiLCJPTl9QQUdFX0NIQU5HRV9DQUxMUyIsIk9OX1BBR0VfQ0hBTkdFIiwicGFnZUlkIiwib25QYWdlQ2hhbmdlIiwiY2l2aWxTZXJ2YW50TGlzdCIsImxpbmsiLCJjbGljayIsInBhZ2VzIiwiaWQiLCJwYWdlSGVhZGluZyIsIk9OX1NVQk1JVF9DQUxMUyIsIk9OX1NVQk1JVCIsInR5cGUiLCJwYXlsb2FkIiwib25TdWNjZXNzIiwib25FcnJvciIsImZpZWxkTmFtZSIsImZpZWxkVmFsdWUiLCJvblN1Ym1pdCIsIkZvcm1UeXBlcyIsIkhVQiIsInNjcmVlbiIsImdldEJ5VGV4dCIsImNvbnRpbnVlQnV0dG9uIiwiUGFnZUFjdGlvbiIsIlRZUEVTIiwiU1VCTUlUIiwiYXJlWW91QUNpdmlsU2VydmFudCIsImVycm9yIiwib25BY3Rpb24iLCJmb3JtRGF0YSIsInBhdGNoIiwiQ1lBIiwiY29udGludWVCdXR0b25Hcm91cCIsImNvbnRpbnVlRm9ybUJ1dHRvbiIsImlubmVyRGl2IiwiZmlyc3ROYW1lSW5wdXQiLCJFVkVOVCIsInN1Ym1pdEJ1dHRvbiIsIlNBVkVfQU5EX0NPTlRJTlVFIiwiZm9ybURlZmluaXRpb24iLCJpZ25vcmVTdWJtaXR0aW5nRmxhZyIsImxpbmVNYW5hZ2VyTGlzdCIsIm5ld1BhZ2VIZWFkaW5nIiwiaGlkZV90aXRsZSIsIlRBU0tfTElTVCIsInRhc2tMaXN0IiwiVEFTS19MSVNUX0RFRkFVTFRfQ0xBU1MiLCJjeWEiLCJUQVNLX0xJU1RfV0lUSF9OT1RFUyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm5vdGVzIiwidGV4dCIsInNob3dfd2hlbiIsInVuZGVmaW5lZCIsImNoaWxkIiwiY29uc29sZSIsImxvZyIsIm5vdCIsImZpcnN0VGFza1N0YXR1cyIsIlRhc2tTdGF0ZXMiLCJERVRBSUxTIiwiTk9UX1NUQVJURUQiLCJsYWJlbCIsInNlY29uZFRhc2tTdGF0dXMiLCJDQU5OT1RfU1RBUlRfWUVUIiwiZmlyc3RUYXNrIiwibmV3UGFnZSIsImZpZWxkc2V0Iiwic2VhQnV0dG9uIiwiY3lhUGFnZUNoYW5nZSIsIm1vZGVDaGFuZ2VMaW5rIiwiY2hhbmdlUGFnZSIsImFpckJ1dHRvbiIsImN5YVBhZ2UiLCJDT01QTEVURSIsImZpbmFsU3VibWl0IiwibW9kZSIsImZvcm1TdGF0dXMiLCJ0YXNrcyIsImNvbXBsZXRlIiwiREFUQSIsIlRBU0tfTElTVF9XSVRIX05PX1RBU0tfQ1lBUyIsIm5vVGFza0NZQXMiLCJPTl9DQU5DRUxfQ0FMTFMiLCJPTl9DQU5DRUwiLCJvbkNhbmNlbCIsImNhbmNlbCIsIlRBU0tfTElTVF9OT05fU0VRVUVOVElBTCIsIm5vblNlcXVlbnRpYWwiLCJoaWRlQmxhbmtSb3dzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRm9ybVJlbmRlcmVyL0Zvcm1SZW5kZXJlci50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdsb2JhbCBpbXBvcnRzXG5pbXBvcnQgeyBmaXJlRXZlbnQsIHNjcmVlbiB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBNb2NrQWRhcHRlciBmcm9tICdheGlvcy1tb2NrLWFkYXB0ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBhY3QgfSBmcm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XG5cbi8vIExvY2FsIGltcG9ydHNcbmltcG9ydCB7IFBhZ2VBY3Rpb24sIFRhc2tTdGF0ZXMsIEZvcm1UeXBlcyB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBERUZBVUxUX0NMQVNTIGFzIENZQV9ERUZBVUxUX0NMQVNTIH0gZnJvbSAnLi4vQ2hlY2tZb3VyQW5zd2Vycy9DaGVja1lvdXJBbnN3ZXJzJztcbmltcG9ydCB7IERFRkFVTFRfQ0xBU1MgYXMgVEFTS19MSVNUX0RFRkFVTFRfQ0xBU1MgfSBmcm9tICcuLi9UYXNrTGlzdC9UYXNrTGlzdCc7XG5pbXBvcnQgRm9ybVJlbmRlcmVyLCB7IERFRkFVTFRfQ0xBU1MgfSBmcm9tICcuL0Zvcm1SZW5kZXJlcic7XG5cbi8vIEpTT05cbmltcG9ydCBDSVZJTF9TRVJWQU5UIGZyb20gJy4uLy4uL2pzb24vYXJlWW91QUNpdmlsU2VydmFudC5qc29uJztcbmltcG9ydCBHUkFERSBmcm9tICcuLi8uLi9qc29uL2dyYWRlLmpzb24nO1xuaW1wb3J0IFRFQU1TIGZyb20gJy4uLy4uL2pzb24vdGVhbS5qc29uJztcbmltcG9ydCBVU0VSX1BST0ZJTEVfREFUQSBmcm9tICcuLi8uLi9qc29uL3VzZXJQcm9maWxlLmRhdGEuanNvbic7XG5pbXBvcnQgVVNFUl9QUk9GSUxFIGZyb20gJy4uLy4uL2pzb24vdXNlclByb2ZpbGUuanNvbic7XG5pbXBvcnQgVEFTS19MSVNUIGZyb20gJy4uLy4uL2pzb24vdGFza0xpc3QuanNvbic7XG5pbXBvcnQgQ1lBIGZyb20gJy4uLy4uL2pzb24vZmlyc3RGb3JtLmpzb24nO1xuXG5jb25zdCBzZXREYXRlID0gKCBlbGVtZW50LCBkYXRlKSA9PiB7XG4gIGNvbnN0IGl0ZW1zID0gZWxlbWVudC5jaGlsZHJlbjtcbiAgZmlyZUV2ZW50LmNoYW5nZShpdGVtc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0sIHtcbiAgICB0YXJnZXQ6IHsgbmFtZTogJ2RhdGUtZGF5JywgdmFsdWU6IGRhdGVbMF0gfSxcbiAgfSk7XG4gIGZpcmVFdmVudC5jaGFuZ2UoaXRlbXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLCB7XG4gICAgdGFyZ2V0OiB7IG5hbWU6ICdkYXRlLW1vbnRoJywgdmFsdWU6IGRhdGVbMV0gfSxcbiAgfSk7XG4gIGZpcmVFdmVudC5jaGFuZ2UoaXRlbXNbMl0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLCB7XG4gICAgdGFyZ2V0OiB7IG5hbWU6ICdkYXRlLXllYXInLCB2YWx1ZTogZGF0ZVsyXSB9LFxuICB9KTtcbn1cblxuY29uc3Qgc2xlZXAgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xufSk7XG5cbmRlc2NyaWJlKCdjb21wb25lbnRzJywgKCkgPT4ge1xuXG4gIGRlc2NyaWJlKCdGb3JtUmVuZGVyZXInLCAoKSA9PiB7XG5cbiAgICBjb25zdCBtb2NrQXhpb3MgPSBuZXcgTW9ja0FkYXB0ZXIoYXhpb3MpO1xuICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuXG4gICAgY29uc3QgcmVmRGF0YVVybCA9IChzdWZmaXgpID0+IFxuICAgICAgYCR7VVNFUl9QUk9GSUxFX0RBVEEudXJscy5yZWZEYXRhfS8ke3N1ZmZpeH1gO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgIG1vY2tBeGlvcy5yZXNldCgpO1xuXG4gICAgICBtb2NrQXhpb3Mub25HZXQocmVmRGF0YVVybCgnYXJlWW91QUNpdmlsU2VydmFudCcpKS5yZXBseSgyMDAsIENJVklMX1NFUlZBTlQpO1xuICAgICAgbW9ja0F4aW9zLm9uR2V0KHJlZkRhdGFVcmwoJ2dyYWRlJykpLnJlcGx5KDIwMCwgR1JBREUpO1xuICAgICAgbW9ja0F4aW9zLm9uR2V0KHJlZkRhdGFVcmwoJ3RlYW0nKSkucmVwbHkoMjAwLCBURUFNUyk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgY29udGFpbmVyID0gbnVsbDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoZWNrRm9ybSA9IChmb3JtQ29udGFpbmVyKSA9PiB7XG4gICAgICBjb25zdCBmb3JtV3JhcHBlciA9IGZvcm1Db250YWluZXI7XG4gICAgICBjb25zdCBmb3JtID0gZm9ybVdyYXBwZXIuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChmb3JtLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgICAgZXhwZWN0KGZvcm0uY2xhc3NMaXN0KS50b0NvbnRhaW4oREVGQVVMVF9DTEFTUyk7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hhbmdlTGluayA9IChzdW1tYXJ5TGlzdCkgPT4ge1xuICAgICAgY29uc3QgWywgLCBhY3Rpb25zXSA9IHN1bW1hcnlMaXN0LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO1xuICAgICAgcmV0dXJuIGFjdGlvbnMuY2hpbGROb2Rlc1swXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29udGludWVCdXR0b24gPSAocGFnZSkgPT4gXG4gICAgICBwYWdlLmNoaWxkTm9kZXNbcGFnZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcblxuICAgIGNvbnN0IGdldENhbmNlbEJ1dHRvbiA9IChwYWdlKSA9PiBcbiAgICAgIHBhZ2UuY2hpbGROb2Rlc1twYWdlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdO1xuXG4gICAgaXQoJ3Nob3VsZCBzdGFydCBvbiB0aGUgaHViIHBhZ2UgY29ycmVjdGx5IGFuZCBkaXNwbGF5IHRoZSB0aXRsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9ybSA9IGNoZWNrRm9ybShjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGZvcm0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFRpdGxlICsgSHViIHBhZ2UgKD0gQ1lBKVxuICAgICAgY29uc3QgdGl0bGUgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QodGl0bGUudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdCh0aXRsZS50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUudGl0bGUpO1xuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KGh1Yi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChodWIuY2xhc3NMaXN0KS50b0NvbnRhaW4oQ1lBX0RFRkFVTFRfQ0xBU1MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaXJlIHRoZSBvbkZvcm1Mb2FkIG1ldGhvZCBwYXNzZWQgaW4gdGhlIGhvb2tzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IG9uRm9ybUxvYWRDYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IE9OX0ZPUk1fTE9BRCA9ICgpID0+IHtcbiAgICAgICAgb25Gb3JtTG9hZENhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uRm9ybUxvYWQ6IE9OX0ZPUk1fTE9BRFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBleHBlY3Qob25Gb3JtTG9hZENhbGxlZCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBuYXZpZ2F0ZSB0byB0aGUgZmlyc3QgZWRpdGFibGUgcGFnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblBhZ2VDaGFuZ2U6IE9OX1BBR0VfQ0hBTkdFXG4gICAgICB9O1xuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlVTRVJfUFJPRklMRX0gZGF0YT17VVNFUl9QUk9GSUxFX0RBVEF9IGhvb2tzPXtIT09LU30gLz4sIGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcm0gPSBjaGVja0Zvcm0oY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGh1YiA9IGZvcm0uY2hpbGROb2Rlc1sxXTsgLy8gSHViID0gQ1lBXG4gICAgICBjb25zdCBbLCAsIGNpdmlsU2VydmFudExpc3RdID0gaHViLmNoaWxkTm9kZXM7XG4gICAgICBjb25zdCBsaW5rID0gZ2V0Q2hhbmdlTGluayhjaXZpbFNlcnZhbnRMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMU1swXSkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbMV0uaWQpO1xuXG4gICAgICAvLyBUaGUgZm9ybSBsYXlvdXQgc2hvdWxkIGhhdmUgY2hhbmdlZCB0byB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgZXhwZWN0KGZvcm0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMSk7IC8vIEp1c3QgdGhlIHBhZ2UuXG4gICAgICBjb25zdCBwYWdlID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgY29uc3QgcGFnZUhlYWRpbmcgPSBwYWdlLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QocGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbMV0udGl0bGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYSBwYWdlIHN1Ym1pc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSkgPT4ge1xuICAgICAgICBPTl9TVUJNSVRfQ0FMTFMucHVzaCh7IHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlIH0pO1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IHR5cGU9e0Zvcm1UeXBlcy5IVUJ9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBidXQgc2VsZWN0IFwiTm8sIEknbSBhIGNvbnRyYWN0b3JcIiBvcHRpb24gdG8gZ2VuZXJhdGUgcGF0Y2hcbiAgICAgIC8vIGFuZCB0aGVuIGNsaWNrIFwiQ29udGludWVcIi5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlUZXh0KFwiTm8sIEknbSBhIGNvbnRyYWN0b3JcIikpO1xuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQpO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXS5wYXlsb2FkLmFyZVlvdUFDaXZpbFNlcnZhbnQpLnRvRXF1YWwoJ25vLWNvbnRyYWN0b3InKTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFNbMF0uZmllbGROYW1lKS50b0VxdWFsKCdBcmUgeW91IGEgY2l2aWwgc2VydmFudD8nKTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFNbMF0uZmllbGRWYWx1ZSkudG9FcXVhbChcIk5vLCBJJ20gYSBjb250cmFjdG9yXCIpO1xuXG4gICAgICAvLyBBbmQgd2Ugc2hvdWxkIGJlIGJhY2sgb24gdGhlIGh1Yi5cbiAgICAgIGV4cGVjdChmb3JtLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBUaXRsZSArIEh1YiBwYWdlICg9IENZQSlcbiAgICAgIGNvbnN0IHRpdGxlID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KHRpdGxlLnRhZ05hbWUpLnRvRXF1YWwoJ0gxJyk7XG4gICAgICBleHBlY3QodGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnRpdGxlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGEgcGFnZSBzdWJtaXNzaW9uIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9TVUJNSVQgPSAodHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yIH0pO1xuICAgICAgICBvbkVycm9yKFt7IGlkOiAndW5rbm93bicsIGVycm9yOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnIH1dKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25BY3Rpb246IChmb3JtRGF0YSwgcGF0Y2gpID0+ICh7IGZvcm1EYXRhLCBwYXRjaCB9KVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQpO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXS5wYXlsb2FkLmFyZVlvdUFDaXZpbFNlcnZhbnQpLnRvRXF1YWwoJ3llcycpO1xuXG4gICAgICAvLyBBbmQgd2Ugc2hvdWxkIGJlIGtlcHQgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgIGV4cGVjdChmb3JtLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDEpOyAvLyBKdXN0IHRoZSBwYWdlLlxuICAgICAgY29uc3QgcGFnZUhlYWRpbmcgPSBmb3JtLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1sxXS50aXRsZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBhIHBhZ2Ugc3VibWlzc2lvbiBvbmNlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGltZXMgcGFnZSBhY3Rpb24gaXMgY2xpY2tlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gYXN5bmMgKHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgfSk7XG5cbiAgICAgICAgLy8gbW9jayBhIGRlbGF5IHdoZW4gc3VibWl0dGluZyB0byB0aGUgYmFja2VuZFxuICAgICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgICBhY3QoICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLkNZQX0gaG9va3M9e0hPT0tTfSB0eXBlPXtGb3JtVHlwZXMuQ1lBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbLCAsICwgLCAsIGNvbnRpbnVlQnV0dG9uR3JvdXBdID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO1xuXG4gICAgICAvLyBnbyB0byBmaXJzdCBxdWVzdGlvbiBwYWdlXG4gICAgICBjb25zdCBjb250aW51ZUZvcm1CdXR0b24gPSBjb250aW51ZUJ1dHRvbkdyb3VwLmNoaWxkTm9kZXNbMF07XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVGb3JtQnV0dG9uKTtcblxuICAgICAgY29uc3QgaW5uZXJEaXYgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuXG4gICAgICAvLyBlbnRlciBhIHZhbHVlIGluIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgY29uc3QgZmlyc3ROYW1lSW5wdXQgPSBpbm5lckRpdi5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBFVkVOVCA9IHsgdGFyZ2V0OiB7IG5hbWU6IGZpcnN0TmFtZUlucHV0LmlkLCB2YWx1ZTogJ2FiYycgfSB9O1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShmaXJzdE5hbWVJbnB1dCwgRVZFTlQpO1xuXG4gICAgICBjb25zdCBzdWJtaXRCdXR0b24gPSBpbm5lckRpdi5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG5cbiAgICAgIC8vIGNsaWNrIG9uIHNhdmUgYW5kIGNvbnRpbnVlXG4gICAgICBmaXJlRXZlbnQuY2xpY2soc3VibWl0QnV0dG9uKTtcblxuICAgICAgLy8gY2xpY2sgb24gc2F2ZSBhbmQgY29udGludWUgYWdhaW5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzdWJtaXRCdXR0b24pOyAgICAgIFxuXG4gICAgICAvLyBjbGljayBvbiBzYXZlIGFuZCBjb250aW51ZSBhIHRoaXJkIHRpbWVcbiAgICAgIGZpcmVFdmVudC5jbGljayhzdWJtaXRCdXR0b24pOyAgXG5cbiAgICAgIC8vIG9ubHkgZXhwZWN0IG9uZSBzdWJtaXQgY2FsbCB0byBiZSBtYWRlXG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9DT05USU5VRSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGEgcGFnZSBzdWJtaXNzaW9uIHJlcGVhdGVkbHkgaWYgaWdub3JlU3VibWl0dGluZ0ZsYWcgaXMgdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gYXN5bmMgKHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgfSk7XG5cbiAgICAgICAgLy8gbW9jayBhIGRlbGF5IHdoZW4gc3VibWl0dGluZyB0byB0aGUgYmFja2VuZFxuICAgICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1EZWZpbml0aW9uID0geyAuLi5VU0VSX1BST0ZJTEUgfTtcbiAgICAgIGZvcm1EZWZpbml0aW9uLnBhZ2VzWzFdLmFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc2F2ZUFuZENvbnRpbnVlJyxcbiAgICAgICAgICBwYWdlOiAndGVzdCcsXG4gICAgICAgICAgaWdub3JlU3VibWl0dGluZ0ZsYWc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY2FuY2VsJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBhY3QoICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLmZvcm1EZWZpbml0aW9ufSBkYXRhPXtVU0VSX1BST0ZJTEVfREFUQX0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9DT05USU5VRSk7XG5cbiAgICAgIC8vIGNsaWNrIG9uIHNhdmUgYW5kIGNvbnRpbnVlXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24pO1xuXG4gICAgICAvLyBjbGljayBvbiBzYXZlIGFuZCBjb250aW51ZSBhZ2FpblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbnRpbnVlQnV0dG9uKTsgICAgICBcblxuICAgICAgLy8gY2xpY2sgb24gc2F2ZSBhbmQgY29udGludWUgYSB0aGlyZCB0aW1lXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24pOyAgXG5cbiAgICAgIC8vIGV4cGVjdCBhbGwgc3VibWl0IGNhbGxzIHRvIGJlIG1hZGVcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDQpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBwYWdlIG5hdmlnYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRV9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUEFHRV9DSEFOR0UgPSAocGFnZUlkKSA9PiB7XG4gICAgICAgIE9OX1BBR0VfQ0hBTkdFX0NBTExTLnB1c2gocGFnZUlkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFkZCBvciBjaGFuZ2UgYSBsaW5lIG1hbmFnZXJcIiBwYWdlLlxuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzFdOyAvLyBIdWIgPSBDWUFcbiAgICAgIGNvbnN0IFssICwgLCAsICwgbGluZU1hbmFnZXJMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsobGluZU1hbmFnZXJMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTWzBdKS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS5pZCk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBvbiB0aGUgcGFnZSBleHBsYWluaW5nIHdoYXQgY2hhbmdpbmcgdGhlIGxpbmUgbWFuYWdlciBtZWFucy5cbiAgICAgIGNvbnN0IHBhZ2UgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBjb25zdCBwYWdlSGVhZGluZyA9IHBhZ2UuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS50aXRsZSk7XG5cbiAgICAgIC8vIE5vdyBjbGljayBvbiB0aGUgXCJDb250aW51ZVwiIGJ1dHRvbiBvbiBoZXJlLlxuICAgICAgY29uc3QgY29udGludWVCdXR0b24gPSBnZXRDb250aW51ZUJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3QoT05fUEFHRV9DSEFOR0VfQ0FMTFNbMV0pLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnBhZ2VzWzVdLmlkKTtcbiAgICAgIGNvbnN0IG5ld1BhZ2VIZWFkaW5nID0gZm9ybS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChuZXdQYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbNV0udGl0bGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaG93IG5vIHRpdGxlIHdoZW4gaGlkZV90aXRsZSBpcyBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBoaWRlX3RpdGxlIC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoZm9ybS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgxKTsgLy8gSHViIHBhZ2UgKD0gQ1lBKVxuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGh1Yi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChodWIuY2xhc3NMaXN0KS50b0NvbnRhaW4oQ1lBX0RFRkFVTFRfQ0xBU1MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgYSB0YXNrIGxpc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGFza0xpc3QgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNsYXNzTGlzdCkudG9Db250YWluKFRBU0tfTElTVF9ERUZBVUxUX0NMQVNTKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGEgY3lhIHBhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uQ1lBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3lhID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY3lhLmNsYXNzTGlzdCkudG9Db250YWluKCdob2RzLWZvcm0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbG9hZCB0YXNrIGxpc3Qgd2l0aCBub3RlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXlsb2FkKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uU3VibWl0OiBPTl9TVUJNSVQsXG4gICAgICB9O1xuICAgICAgY29uc3QgVEFTS19MSVNUX1dJVEhfTk9URVMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFRBU0tfTElTVCkpO1xuICAgICAgVEFTS19MSVNUX1dJVEhfTk9URVMuaHViLm5vdGVzID0ge1xuICAgICAgICB0aXRsZTogXCJ0ZXN0IHRpdGxlXCIsIHRleHQ6IFwidGVzdCB0ZXh0XCIsIHNob3dfd2hlbjogW3tcbiAgICAgICAgICBcIm9wXCI6IFwiPVwiLFxuICAgICAgICAgIFwiZmllbGRcIjogXCJhcmVZb3VBQ2l2aWxTZXJ2YW50XCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiBcInllc1wiXG4gICAgICAgIH1dXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX1dJVEhfTk9URVN9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0udGV4dENvbnRlbnQpLnRvRXF1YWwoXCJ0ZXN0IHRleHRcIik7XG4gICAgICBleHBlY3QodGFza0xpc3QuY2hpbGROb2Rlc1s1XS5jbGFzc0xpc3QpLnRvQ29udGFpbignZ292dWstdGV4dGFyZWEnKVxuXG4gICAgfSk7XG5cblxuICAgIGl0KCdzaG91bGQgbm90IGxvYWQgdGFzayBsaXN0IHdpdGggbm90ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IFRBU0tfTElTVF9XSVRIX05PVEVTID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShUQVNLX0xJU1QpKTtcbiAgICAgIFRBU0tfTElTVF9XSVRIX05PVEVTLmh1Yi5ub3RlcyA9IHtcbiAgICAgICAgdGl0bGU6IFwidGVzdCB0aXRsZVwiLCB0ZXh0OiBcInRlc3QgdGV4dFwiLCBzaG93X3doZW46IFt7XG4gICAgICAgICAgXCJvcFwiOiBcIiE9XCIsXG4gICAgICAgICAgXCJmaWVsZFwiOiBcImNoYW5nZVN1bW1hcnlcIixcbiAgICAgICAgICBcInZhbHVlXCI6IHVuZGVmaW5lZFxuICAgICAgICB9XVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlRBU0tfTElTVF9XSVRIX05PVEVTfSBkYXRhPXtVU0VSX1BST0ZJTEVfREFUQX0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0YXNrTGlzdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIHRhc2tMaXN0LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYHRhc2tMaXN0LCBjaGlsZCA9ICR7SlNPTi5zdHJpbmdpZnkoY2hpbGQudGV4dENvbnRlbnQpfWApO1xuICAgICAgfSlcblxuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0udGV4dENvbnRlbnQpLm5vdC50b0VxdWFsKFwidGVzdCB0ZXh0XCIpO1xuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0uY2xhc3NMaXN0KS5ub3QudG9Db250YWluKCdnb3Z1ay10ZXh0YXJlYScpXG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG5hdmlnYXRpbmcgYmV0d2VlbiB0YXNrIGxpc3QgcGFnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlRBU0tfTElTVH0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0YXNrTGlzdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1c2VzIGFyZSBjb3JyZWN0XG4gICAgICBsZXQgZmlyc3RUYXNrU3RhdHVzID0gdGFza0xpc3QuY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QoZmlyc3RUYXNrU3RhdHVzLnRleHRDb250ZW50KS50b0VxdWFsKFRhc2tTdGF0ZXMuREVUQUlMU1tUYXNrU3RhdGVzLlRZUEVTLk5PVF9TVEFSVEVEXS5sYWJlbCk7XG4gICAgICBsZXQgc2Vjb25kVGFza1N0YXR1cyA9IHRhc2tMaXN0LmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KHNlY29uZFRhc2tTdGF0dXMudGV4dENvbnRlbnQpLnRvRXF1YWwoVGFza1N0YXRlcy5ERVRBSUxTW1Rhc2tTdGF0ZXMuVFlQRVMuQ0FOTk9UX1NUQVJUX1lFVF0ubGFiZWwpO1xuXG4gICAgICAvLyBMYXVuY2ggZmlyc3QgdGFza1xuICAgICAgY29uc3QgZmlyc3RUYXNrID0gdGFza0xpc3QuY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChmaXJzdFRhc2sudGV4dENvbnRlbnQpLnRvRXF1YWwoJ0RhdGUsIGxvY2F0aW9uIGFuZCBtb2RlIGRldGFpbHMnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhmaXJzdFRhc2ssIHt9KTtcblxuICAgICAgLy8gRmlsbCBmaXJzdCBwYWdlIGFuZCBuYXZpZ2F0ZVxuICAgICAgbGV0IG5ld1BhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KG5ld1BhZ2UuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnRXZlbnQgRGF0ZScpO1xuICAgICAgY29uc3QgZmllbGRzZXQgPSBuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXTtcbiAgICAgIC8vIGNoaWxkIG5vZGVzIG9mIGZpZWxkc2V0IGFyZSBsZWdlbmQgYW5kIGRhdGVcbiAgICAgIHNldERhdGUoIGZpZWxkc2V0LmNoaWxkcmVuWzFdLCBbICc3JywgJzcnLCAnMjAyMiddKVxuXG4gICAgICBsZXQgY29udGludWVCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuXG4gICAgICAvLyBGaWxsIHNlY29uZCBwYWdlIGFuZCBuYXZpZ2F0ZVxuICAgICAgbmV3UGFnZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBNb2RlJyk7XG4gICAgICBjb25zdCBzZWFCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3Qoc2VhQnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdTZWEnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhzZWFCdXR0b24uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgY29udGludWVCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuXG4gICAgICAvLyBDbGljayBjaGFuZ2UgdG8gbW9kZSBvbiBDWUEgcGFnZVxuICAgICAgY29uc3QgY3lhUGFnZUNoYW5nZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY3lhUGFnZUNoYW5nZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdDaGVjayB5b3VyIGFuc3dlcnMnKTtcbiAgICAgIGNvbnN0IG1vZGVDaGFuZ2VMaW5rID0gY3lhUGFnZUNoYW5nZS5jaGlsZE5vZGVzWzRdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobW9kZUNoYW5nZUxpbmsudGV4dENvbnRlbnQpLnRvRXF1YWwoJ0NoYW5nZSBFdmVudCBNb2RlJyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobW9kZUNoYW5nZUxpbmssIHt9KTtcblxuICAgICAgY29uc3QgY2hhbmdlUGFnZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY2hhbmdlUGFnZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBNb2RlJyk7XG4gICAgICAvLyBDbGljayBvbiByYWRpbyBmb3IgJ0FpcidcbiAgICAgIGNvbnN0IGFpckJ1dHRvbiA9IGNoYW5nZVBhZ2UuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChhaXJCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ0FpcicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFpckJ1dHRvbi5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIC8vIENvbnRpbnVlIGFnYWluIHRvIENZQSBwYWdlXG4gICAgICBleHBlY3QoY2hhbmdlUGFnZS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIGNvbnRpbnVlJyk7XG4gICAgICBjb250aW51ZUJ1dHRvbiA9IGNoYW5nZVBhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbnRpbnVlQnV0dG9uLCB7fSk7XG5cbiAgICAgIC8vIENvbnRpbnVlIG9uIGZyb20gQ1lBIHBhZ2VcbiAgICAgIGNvbnN0IGN5YVBhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGN5YVBhZ2UuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnQ2hlY2sgeW91ciBhbnN3ZXJzJyk7XG4gICAgICBleHBlY3QoY3lhUGFnZS5jaGlsZE5vZGVzWzVdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIGNvbnRpbnVlJyk7XG4gICAgICBleHBlY3QoY3lhUGFnZS5jaGlsZE5vZGVzWzVdLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIHJldHVybiBsYXRlcicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGN5YVBhZ2UuY2hpbGROb2Rlc1s1XS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBiYWNrIGF0IHRhc2sgbGlzdFxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1Rhc2sgTGlzdCBGb3JtJyk7XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1c2VzIGFyZSBjb3JyZWN0XG4gICAgICBmaXJzdFRhc2tTdGF0dXMgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KGZpcnN0VGFza1N0YXR1cy50ZXh0Q29udGVudCkudG9FcXVhbChUYXNrU3RhdGVzLkRFVEFJTFNbVGFza1N0YXRlcy5UWVBFUy5DT01QTEVURV0ubGFiZWwpO1xuICAgICAgc2Vjb25kVGFza1N0YXR1cyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3Qoc2Vjb25kVGFza1N0YXR1cy50ZXh0Q29udGVudCkudG9FcXVhbChUYXNrU3RhdGVzLkRFVEFJTFNbVGFza1N0YXRlcy5UWVBFUy5OT1RfU1RBUlRFRF0ubGFiZWwpO1xuXG4gICAgICAvLyBDaGVjayBmaW5hbCBkYXRhIHN1Ym1pdHRlZCB0byBiYWNrZW5kIGlzIGFzIGV4cGVjdGVkXG4gICAgICBjb25zdCBmaW5hbFN1Ym1pdCA9IE9OX1NVQk1JVF9DQUxMU1tPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoIC0gMV07XG4gICAgICBleHBlY3QoZmluYWxTdWJtaXQuZGF0ZSkudG9FcXVhbCgnNy03LTIwMjInKTtcbiAgICAgIGV4cGVjdChmaW5hbFN1Ym1pdC5tb2RlKS50b0VxdWFsKCdhaXInKTtcbiAgICAgIGV4cGVjdChmaW5hbFN1Ym1pdC5mb3JtU3RhdHVzLnRhc2tzWydEYXRlLCBsb2NhdGlvbiBhbmQgbW9kZSBkZXRhaWxzJ10uY29tcGxldGUpLnRvRXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdvIHN0cmFpZ2h0IHRvIENZQSBwYWdlIGlmIGEgY29tcGxldGUgdGFzayBpcyBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uU3VibWl0OiBPTl9TVUJNSVQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgZmlyc3QgcGFnZSBhbmQgbmF2aWdhdGVcbiAgICAgIGxldCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGZpZWxkc2V0ID0gbmV3UGFnZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF07XG4gICAgICBzZXREYXRlKCBmaWVsZHNldC5jaGlsZHJlblsxXSwgWyAnNycsICc3JywgJzIwMjInXSlcbiAgICAgIC8vIGNoaWxkIG5vZGVzIG9mIGZpZWxkc2V0IGFyZSBsZWdlbmQgYW5kIGRhdGVcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgc2Vjb25kIHBhZ2UgYW5kIG5hdmlnYXRlXG4gICAgICBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIENvbnRpbnVlIG9uIGZyb20gQ1lBIHBhZ2VcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbNV0uY2hpbGROb2Rlc1swXSwge30pO1xuXG4gICAgICAvLyBMYXVuY2ggc2FtZSB0YXNrIGFnYWluXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBhdCBDWUEgcGFnZVxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnQ2hlY2sgeW91ciBhbnN3ZXJzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdvIHRvIGluY29tcGxldGUgcGFnZSB3aGVuIHNlbGVjdGluZyBpbi1wcm9ncmVzcyB0YXNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IERBVEEgPSB7XCJkYXRlXCI6XCI3LTctMjAyMlwiLFwiZm9ybVN0YXR1c1wiOntcInRhc2tzXCI6e1wiRGF0ZSwgbG9jYXRpb24gYW5kIG1vZGUgZGV0YWlsc1wiOntcImNvbXBsZXRlXCI6ZmFsc2UsXCJjdXJyZW50UGFnZVwiOlwiZXZlbnRNb2RlXCJ9fSxcInRhc2tQYWdlXCI6XCJldmVudE1vZGVcIn19O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSBob29rcz17SE9PS1N9IGRhdGE9e0RBVEF9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBhdCBFdmVudCBNb2RlIHBhZ2VcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ0V2ZW50IE1vZGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ28gdG8gdGhlIGZpcnN0IHBhZ2Ugb2YgYSBjb21wbGV0ZSB0YXNrIGlmIG5vVGFza0NZQXMgc3BlY2lmaWVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgIH07XG4gICAgICBjb25zdCBUQVNLX0xJU1RfV0lUSF9OT19UQVNLX0NZQVMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFRBU0tfTElTVCkpO1xuICAgICAgVEFTS19MSVNUX1dJVEhfTk9fVEFTS19DWUFTLmh1Yi5ub1Rhc2tDWUFzID0gdHJ1ZTtcbiAgICAgIFRBU0tfTElTVF9XSVRIX05PX1RBU0tfQ1lBUy5wYWdlc1sxXS5hY3Rpb25zWzBdID0geyB0eXBlOiAnc2F2ZScsIGNvbXBsZXRlOiB0cnVlIH07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX1dJVEhfTk9fVEFTS19DWUFTfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgZmlyc3QgcGFnZSBhbmQgbmF2aWdhdGVcbiAgICAgIGxldCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGZpZWxkc2V0ID0gbmV3UGFnZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF07XG4gICAgICBzZXREYXRlKCBmaWVsZHNldC5jaGlsZHJlblsxXSwgWyAnNycsICc3JywgJzIwMjInXSlcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgc2Vjb25kIHBhZ2VcbiAgICAgIG5ld1BhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgLy8gZXhwZWN0KG5ld1BhZ2UuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdKS50b0VxdWFsKCcnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIExhdW5jaCBzYW1lIHRhc2sgYWdhaW5cbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0sIHt9KTtcblxuICAgICAgLy8gU2hvdWxkIGJlIG9uIHRoZSBmaXJzdCBwYWdlXG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBEYXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjYW5jZWxsYXRpb24gZnJvbSBhIHBhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9DQU5DRUxfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX0NBTkNFTCA9ICgpID0+IHtcbiAgICAgICAgT05fQ0FOQ0VMX0NBTExTLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25DYW5jZWw6IE9OX0NBTkNFTFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbCA9IGdldENhbmNlbEJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9DQU5DRUxfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbCwge30pO1xuICAgICAgZXhwZWN0KE9OX0NBTkNFTF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5hdmlnYXRlIHRvIGEgc3BlY2lmaWMgcGFnZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgdGFzayBpZiBpdCBpcyBzZXQgYXMgdGhlIGZpcnN0UGFnZSBvZiBhIHRhc2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcblxuICAgICAgY29uc3QgVEFTS19MSVNUX05PTl9TRVFVRU5USUFMID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShUQVNLX0xJU1QpKTtcbiAgICAgIFRBU0tfTElTVF9OT05fU0VRVUVOVElBTC5odWIubm9uU2VxdWVudGlhbCA9IHRydWU7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX05PTl9TRVFVRU5USUFMfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2sgb2Ygc2Vjb25kIHNlY3Rpb25cbiAgICAgIGNvbnN0IGZpcnN0VGFzayA9IHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoZmlyc3RUYXNrLnRleHRDb250ZW50KS50b0VxdWFsKCdQZW9wbGUgZGV0YWlscycpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGZpcnN0VGFzaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYmUgYXQgU3VybmFtZSBwYWdlXG4gICAgICBjb25zdCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChuZXdQYWdlLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1N1cm5hbWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHBhZ2UgbmF2aWdhdGlvbiBjb3JyZWN0bHkgd2hlbiBoaWRlQmxhbmtSb3dzIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRV9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUEFHRV9DSEFOR0UgPSAocGFnZUlkKSA9PiB7XG4gICAgICAgIE9OX1BBR0VfQ0hBTkdFX0NBTExTLnB1c2gocGFnZUlkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IGhpZGVCbGFua1Jvd3MvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9ybSA9IGNoZWNrRm9ybShjb250YWluZXIpO1xuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgXCJBZGQgb3IgY2hhbmdlIGEgbGluZSBtYW5hZ2VyXCIgcGFnZS5cbiAgICAgIGNvbnN0IGh1YiA9IGZvcm0uY2hpbGROb2Rlc1sxXTsgLy8gSHViID0gQ1lBXG4gICAgICBjb25zdCBbLCAsICwgbGluZU1hbmFnZXJMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsobGluZU1hbmFnZXJMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTWzBdKS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS5pZCk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBvbiB0aGUgcGFnZSBleHBsYWluaW5nIHdoYXQgY2hhbmdpbmcgdGhlIGxpbmUgbWFuYWdlciBtZWFucy5cbiAgICAgIGNvbnN0IHBhZ2UgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBjb25zdCBwYWdlSGVhZGluZyA9IHBhZ2UuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS50aXRsZSk7XG5cbiAgICAgIC8vIE5vdyBjbGljayBvbiB0aGUgXCJDb250aW51ZVwiIGJ1dHRvbiBvbiBoZXJlLlxuICAgICAgY29uc3QgY29udGludWVCdXR0b24gPSBnZXRDb250aW51ZUJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3QoT05fUEFHRV9DSEFOR0VfQ0FMTFNbMV0pLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnBhZ2VzWzVdLmlkKTtcbiAgICAgIGNvbnN0IG5ld1BhZ2VIZWFkaW5nID0gZm9ybS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChuZXdQYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJ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