@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.
- package/README.md +106 -32
- package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
- package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
- package/dist/components/CheckYourAnswers/index.d.ts +2 -0
- package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
- package/dist/components/CollectionPage/index.d.ts +1 -0
- package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
- package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
- package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
- package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
- package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
- package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
- package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
- package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
- package/dist/components/CollectionSummary/index.d.ts +2 -0
- package/dist/components/FormComponent/Collection.d.ts +39 -0
- package/dist/components/FormComponent/Container.d.ts +26 -0
- package/dist/components/FormComponent/FormComponent.d.ts +39 -0
- package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
- package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
- package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
- package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
- package/dist/components/FormComponent/helpers/index.d.ts +5 -0
- package/dist/components/FormComponent/index.d.ts +2 -0
- package/dist/components/FormPage/FormPage.d.ts +36 -0
- package/dist/components/FormPage/index.d.ts +2 -0
- package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
- package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
- package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
- package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
- package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
- package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
- package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
- package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
- package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
- package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
- package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
- package/dist/components/FormRenderer/index.d.ts +2 -0
- package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
- package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
- package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
- package/dist/components/PageActions/ActionButton.d.ts +7 -0
- package/dist/components/PageActions/PageActions.d.ts +7 -0
- package/dist/components/PageActions/index.d.ts +2 -0
- package/dist/components/SummaryList/GroupAction.d.ts +12 -0
- package/dist/components/SummaryList/RowAction.d.ts +12 -0
- package/dist/components/SummaryList/SummaryList.d.ts +28 -0
- package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
- package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
- package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
- package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/index.d.ts +2 -0
- package/dist/components/SummaryList/index.d.ts +2 -0
- package/dist/components/TaskList/Task.d.ts +12 -0
- package/dist/components/TaskList/TaskList.d.ts +40 -0
- package/dist/components/TaskList/TaskState.d.ts +6 -0
- package/dist/components/TaskList/index.d.ts +2 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/context/HooksContext/HooksContext.d.ts +23 -0
- package/dist/context/HooksContext/index.d.ts +3 -0
- package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
- package/dist/context/ValidationContext/index.d.ts +3 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/useAxios.d.ts +2 -0
- package/dist/hooks/useGetRequest.d.ts +12 -0
- package/dist/hooks/useHooks.d.ts +2 -0
- package/dist/hooks/useRefData.d.ts +7 -0
- package/dist/hooks/useValidation.d.ts +2 -0
- package/dist/index.cjs +5 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6124 -81
- package/dist/models/CollectionLabels.d.ts +7 -0
- package/dist/models/ComponentTypes.d.ts +27 -0
- package/dist/models/EventTypes.d.ts +6 -0
- package/dist/models/FormPages.d.ts +6 -0
- package/dist/models/FormTypes.d.ts +10 -0
- package/dist/models/HubFormats.d.ts +5 -0
- package/dist/models/PageAction.d.ts +89 -0
- package/dist/models/TaskStates.d.ts +39 -0
- package/dist/models/index.d.ts +143 -0
- package/dist/setupTests.d.ts +14 -0
- package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
- package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
- package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
- package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
- package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
- package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
- package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
- package/dist/utils/CollectionPage/index.d.ts +13 -0
- package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
- package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
- package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
- package/dist/utils/Component/addShowWhen.d.ts +13 -0
- package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
- package/dist/utils/Component/cleanAttributes.d.ts +14 -0
- package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
- package/dist/utils/Component/getDefaultValue.d.ts +2 -0
- package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
- package/dist/utils/Component/index.d.ts +12 -0
- package/dist/utils/Component/isEditable.d.ts +3 -0
- package/dist/utils/Component/optionIsSelected.d.ts +10 -0
- package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
- package/dist/utils/Component/showComponent.d.ts +2 -0
- package/dist/utils/Condition/index.d.ts +6 -0
- package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
- package/dist/utils/Condition/meetsCondition.d.ts +14 -0
- package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
- package/dist/utils/Condition/setupConditions.d.ts +2 -0
- package/dist/utils/Container/getEditableComponents.d.ts +7 -0
- package/dist/utils/Container/index.d.ts +6 -0
- package/dist/utils/Container/setupNesting.d.ts +2 -0
- package/dist/utils/Container/showContainer.d.ts +8 -0
- package/dist/utils/Data/applyFormula.d.ts +2 -0
- package/dist/utils/Data/deleteValues.d.ts +8 -0
- package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
- package/dist/utils/Data/getDataPath.d.ts +21 -0
- package/dist/utils/Data/getOptions.d.ts +2 -0
- package/dist/utils/Data/getSourceData.d.ts +17 -0
- package/dist/utils/Data/index.d.ts +15 -0
- package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
- package/dist/utils/Data/refDataToOptions.d.ts +8 -0
- package/dist/utils/Data/setDataItem.d.ts +2 -0
- package/dist/utils/Data/setupFormData.d.ts +15 -0
- package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
- package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
- package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
- package/dist/utils/FormPage/getFormPage.d.ts +9 -0
- package/dist/utils/FormPage/getFormPages.d.ts +9 -0
- package/dist/utils/FormPage/getPageActions.d.ts +13 -0
- package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
- package/dist/utils/FormPage/index.d.ts +10 -0
- package/dist/utils/FormPage/showFormPage.d.ts +8 -0
- package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
- package/dist/utils/FormPage/useComponent.d.ts +9 -0
- package/dist/utils/Format/formatData.d.ts +8 -0
- package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
- package/dist/utils/Format/formatDataForForm.d.ts +8 -0
- package/dist/utils/Format/formatDataForPage.d.ts +15 -0
- package/dist/utils/Format/index.d.ts +7 -0
- package/dist/utils/Hub/getFormHub.d.ts +15 -0
- package/dist/utils/Hub/index.d.ts +4 -0
- package/dist/utils/Meta/constants.d.ts +2 -0
- package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
- package/dist/utils/Meta/documents/index.d.ts +6 -0
- package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
- package/dist/utils/Meta/index.d.ts +9 -0
- package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
- package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
- package/dist/utils/Operate/doesContainValue.d.ts +11 -0
- package/dist/utils/Operate/getFirstOf.d.ts +2 -0
- package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
- package/dist/utils/Operate/getLength.d.ts +11 -0
- package/dist/utils/Operate/index.d.ts +4 -0
- package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
- package/dist/utils/Operate/runPageOperations.d.ts +19 -0
- package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
- package/dist/utils/Operate/shouldRun.d.ts +9 -0
- package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
- package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
- package/dist/utils/Validate/additional/index.d.ts +2 -0
- package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
- package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
- package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
- package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
- package/dist/utils/Validate/additional/utils.d.ts +4 -0
- package/dist/utils/Validate/index.d.ts +42 -0
- package/dist/utils/Validate/validateCollection.d.ts +9 -0
- package/dist/utils/Validate/validateComponent.d.ts +16 -0
- package/dist/utils/Validate/validateContainer.d.ts +12 -0
- package/dist/utils/Validate/validateDate.d.ts +29 -0
- package/dist/utils/Validate/validateEmail.d.ts +13 -0
- package/dist/utils/Validate/validateMultifile.d.ts +3 -0
- package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
- package/dist/utils/Validate/validatePage.d.ts +8 -0
- package/dist/utils/Validate/validateRegex.d.ts +13 -0
- package/dist/utils/Validate/validateRequired.d.ts +9 -0
- package/dist/utils/Validate/validateTextArea.d.ts +13 -0
- package/dist/utils/Validate/validateTime.d.ts +20 -0
- package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
- package/dist/utils/index.d.ts +140 -0
- package/package.json +81 -170
- package/LICENCE.md +0 -21
- package/dist/components/CheckYourAnswers/Answer.js +0 -59
- package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
- package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
- package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
- package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
- package/dist/components/CheckYourAnswers/index.js +0 -10
- package/dist/components/CollectionPage/CollectionPage.js +0 -178
- package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
- package/dist/components/CollectionPage/index.js +0 -10
- package/dist/components/CollectionSummary/BannerStrip.js +0 -65
- package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
- package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
- package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
- package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
- package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
- package/dist/components/CollectionSummary/Confirmation.js +0 -65
- package/dist/components/CollectionSummary/Confirmation.scss +0 -26
- package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
- package/dist/components/CollectionSummary/RenderListView.js +0 -162
- package/dist/components/CollectionSummary/RenderListView.scss +0 -295
- package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
- package/dist/components/CollectionSummary/SummaryCard.js +0 -277
- package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
- package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
- package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
- package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
- package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
- package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
- package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
- package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
- package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
- package/dist/components/CollectionSummary/index.js +0 -10
- package/dist/components/FormComponent/Collection.js +0 -234
- package/dist/components/FormComponent/Collection.scss +0 -24
- package/dist/components/FormComponent/Collection.test.js +0 -934
- package/dist/components/FormComponent/Container.js +0 -130
- package/dist/components/FormComponent/Container.scss +0 -15
- package/dist/components/FormComponent/Container.test.js +0 -456
- package/dist/components/FormComponent/FormComponent.js +0 -238
- package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
- package/dist/components/FormComponent/FormComponent.test.js +0 -436
- package/dist/components/FormComponent/helpers/addLabel.js +0 -25
- package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
- package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
- package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
- package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
- package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
- package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
- package/dist/components/FormComponent/helpers/index.js +0 -35
- package/dist/components/FormComponent/index.js +0 -10
- package/dist/components/FormPage/FormPage.js +0 -212
- package/dist/components/FormPage/FormPage.scss +0 -7
- package/dist/components/FormPage/FormPage.stories.mdx +0 -157
- package/dist/components/FormPage/FormPage.test.js +0 -454
- package/dist/components/FormPage/index.js +0 -10
- package/dist/components/FormRenderer/FormRenderer.js +0 -426
- package/dist/components/FormRenderer/FormRenderer.scss +0 -5
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
- package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
- package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
- package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
- package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
- package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
- package/dist/components/FormRenderer/handlers/index.js +0 -17
- package/dist/components/FormRenderer/handlers/navigate.js +0 -25
- package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
- package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
- package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
- package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
- package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
- package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
- package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
- package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
- package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
- package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
- package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
- package/dist/components/FormRenderer/helpers/getPage.js +0 -27
- package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
- package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
- package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
- package/dist/components/FormRenderer/helpers/index.js +0 -33
- package/dist/components/FormRenderer/index.js +0 -10
- package/dist/components/FormRenderer/onCYAAction.js +0 -150
- package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
- package/dist/components/FormRenderer/onPageAction.js +0 -227
- package/dist/components/FormRenderer/onPageAction.test.js +0 -960
- package/dist/components/FormRenderer/onTaskAction.js +0 -47
- package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
- package/dist/components/PageActions/ActionButton.js +0 -48
- package/dist/components/PageActions/ActionButton.test.js +0 -73
- package/dist/components/PageActions/PageActions.js +0 -37
- package/dist/components/PageActions/PageActions.stories.mdx +0 -74
- package/dist/components/PageActions/PageActions.test.js +0 -106
- package/dist/components/PageActions/index.js +0 -10
- package/dist/components/SummaryList/GroupAction.js +0 -50
- package/dist/components/SummaryList/GroupAction.test.js +0 -86
- package/dist/components/SummaryList/RowAction.js +0 -48
- package/dist/components/SummaryList/RowAction.test.js +0 -86
- package/dist/components/SummaryList/SummaryList.js +0 -128
- package/dist/components/SummaryList/SummaryList.scss +0 -79
- package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
- package/dist/components/SummaryList/SummaryList.test.js +0 -504
- package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
- package/dist/components/SummaryList/SummaryListRow.js +0 -58
- package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/index.js +0 -14
- package/dist/components/SummaryList/index.js +0 -10
- package/dist/components/TaskList/Task.js +0 -62
- package/dist/components/TaskList/Task.test.js +0 -176
- package/dist/components/TaskList/TaskList.js +0 -175
- package/dist/components/TaskList/TaskList.scss +0 -123
- package/dist/components/TaskList/TaskList.stories.mdx +0 -164
- package/dist/components/TaskList/TaskList.test.js +0 -535
- package/dist/components/TaskList/TaskState.js +0 -37
- package/dist/components/TaskList/TaskState.test.js +0 -95
- package/dist/components/TaskList/index.js +0 -10
- package/dist/components/index.js +0 -56
- package/dist/context/HooksContext/HooksContext.js +0 -122
- package/dist/context/HooksContext/HooksContext.test.js +0 -45
- package/dist/context/HooksContext/index.js +0 -16
- package/dist/context/ValidationContext/ValidationContext.js +0 -98
- package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
- package/dist/context/ValidationContext/index.js +0 -16
- package/dist/context/index.js +0 -21
- package/dist/hooks/index.js +0 -55
- package/dist/hooks/useAxios.js +0 -36
- package/dist/hooks/useGetRequest.js +0 -89
- package/dist/hooks/useHooks.js +0 -15
- package/dist/hooks/useRefData.js +0 -62
- package/dist/hooks/useValidation.js +0 -15
- package/dist/json/actions.json +0 -17
- package/dist/json/actionsNoSave.json +0 -17
- package/dist/json/addressDetails.json +0 -149
- package/dist/json/areYouACivilServant.json +0 -7
- package/dist/json/firstForm.json +0 -94
- package/dist/json/grade.json +0 -108
- package/dist/json/group.data.json +0 -21
- package/dist/json/group.json +0 -402
- package/dist/json/groupOfRow.json +0 -137
- package/dist/json/groupOfRowData.json +0 -15
- package/dist/json/port.json +0 -346
- package/dist/json/saveAndContinue.json +0 -98
- package/dist/json/sublocation.json +0 -859
- package/dist/json/taskList.json +0 -265
- package/dist/json/team.json +0 -17351
- package/dist/json/terminal.json +0 -81
- package/dist/json/userProfile.data.json +0 -21
- package/dist/json/userProfile.json +0 -276
- package/dist/models/CollectionLabels.js +0 -15
- package/dist/models/ComponentTypes.js +0 -58
- package/dist/models/EventTypes.js +0 -16
- package/dist/models/FormPages.js +0 -16
- package/dist/models/FormTypes.js +0 -24
- package/dist/models/HubFormats.js +0 -14
- package/dist/models/PageAction.js +0 -65
- package/dist/models/TaskStates.js +0 -46
- package/dist/models/index.js +0 -77
- package/dist/setupTests.js +0 -54
- package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
- package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
- package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
- package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
- package/dist/utils/CheckYourAnswers/index.js +0 -15
- package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
- package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
- package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
- package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
- package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
- package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
- package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
- package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
- package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
- package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
- package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
- package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
- package/dist/utils/CollectionPage/index.js +0 -33
- package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
- package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
- package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
- package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
- package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
- package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
- package/dist/utils/Component/addShowWhen.js +0 -43
- package/dist/utils/Component/addShowWhen.test.js +0 -217
- package/dist/utils/Component/applyToComponentTree.js +0 -68
- package/dist/utils/Component/applyToComponentTree.test.js +0 -125
- package/dist/utils/Component/cleanAttributes.js +0 -42
- package/dist/utils/Component/cleanAttributes.test.js +0 -67
- package/dist/utils/Component/elevateNestedComponents.js +0 -58
- package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
- package/dist/utils/Component/getComponent.js +0 -305
- package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
- package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
- package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
- package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
- package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
- package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
- package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
- package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
- package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
- package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
- package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
- package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
- package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
- package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
- package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
- package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
- package/dist/utils/Component/getDefaultValue.js +0 -22
- package/dist/utils/Component/getDefaultValue.test.js +0 -62
- package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
- package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
- package/dist/utils/Component/index.js +0 -29
- package/dist/utils/Component/isEditable.js +0 -13
- package/dist/utils/Component/isEditable.test.js +0 -42
- package/dist/utils/Component/optionIsSelected.js +0 -25
- package/dist/utils/Component/optionIsSelected.test.js +0 -69
- package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
- package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
- package/dist/utils/Component/showComponent.js +0 -25
- package/dist/utils/Component/showComponent.test.js +0 -157
- package/dist/utils/Component/wrapInFormGroup.js +0 -26
- package/dist/utils/Condition/index.js +0 -17
- package/dist/utils/Condition/meetsAllConditions.js +0 -44
- package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
- package/dist/utils/Condition/meetsCondition.js +0 -165
- package/dist/utils/Condition/meetsCondition.test.js +0 -899
- package/dist/utils/Condition/meetsOneCondition.js +0 -32
- package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
- package/dist/utils/Condition/setupConditions.js +0 -36
- package/dist/utils/Condition/setupConditions.test.js +0 -34
- package/dist/utils/Container/getEditableComponents.js +0 -29
- package/dist/utils/Container/getEditableComponents.test.js +0 -134
- package/dist/utils/Container/index.js +0 -17
- package/dist/utils/Container/setupNesting.js +0 -53
- package/dist/utils/Container/setupNesting.test.js +0 -143
- package/dist/utils/Container/showContainer.js +0 -52
- package/dist/utils/Container/showContainer.test.js +0 -179
- package/dist/utils/Data/applyFormula.js +0 -90
- package/dist/utils/Data/applyFormula.test.js +0 -264
- package/dist/utils/Data/deleteValues.js +0 -19
- package/dist/utils/Data/deleteValues.test.js +0 -58
- package/dist/utils/Data/getAutocompleteSource.js +0 -87
- package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
- package/dist/utils/Data/getDataPath.js +0 -66
- package/dist/utils/Data/getDataPath.test.js +0 -49
- package/dist/utils/Data/getOptions.js +0 -86
- package/dist/utils/Data/getOptions.test.js +0 -279
- package/dist/utils/Data/getSourceData.js +0 -44
- package/dist/utils/Data/getSourceData.test.js +0 -158
- package/dist/utils/Data/index.js +0 -35
- package/dist/utils/Data/nestInRefdataOptions.js +0 -47
- package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
- package/dist/utils/Data/refDataToOptions.js +0 -44
- package/dist/utils/Data/refDataToOptions.test.js +0 -197
- package/dist/utils/Data/setDataItem.js +0 -26
- package/dist/utils/Data/setDataItem.test.js +0 -136
- package/dist/utils/Data/setupFormData.js +0 -49
- package/dist/utils/Data/setupFormData.test.js +0 -215
- package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
- package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
- package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
- package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
- package/dist/utils/FormPage/getConditionalText.js +0 -55
- package/dist/utils/FormPage/getConditionalText.test.js +0 -163
- package/dist/utils/FormPage/getFormPage.js +0 -54
- package/dist/utils/FormPage/getFormPage.test.js +0 -206
- package/dist/utils/FormPage/getFormPages.js +0 -30
- package/dist/utils/FormPage/getFormPages.test.js +0 -97
- package/dist/utils/FormPage/getPageActions.js +0 -58
- package/dist/utils/FormPage/getPageActions.test.js +0 -115
- package/dist/utils/FormPage/getParagraphFromText.js +0 -21
- package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
- package/dist/utils/FormPage/index.js +0 -24
- package/dist/utils/FormPage/showFormPage.js +0 -52
- package/dist/utils/FormPage/showFormPage.test.js +0 -181
- package/dist/utils/FormPage/showFormPageCYA.js +0 -23
- package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
- package/dist/utils/FormPage/useComponent.js +0 -83
- package/dist/utils/FormPage/useComponent.test.js +0 -216
- package/dist/utils/Format/formatData.js +0 -27
- package/dist/utils/Format/formatData.test.js +0 -46
- package/dist/utils/Format/formatDataForComponent.js +0 -35
- package/dist/utils/Format/formatDataForComponent.test.js +0 -114
- package/dist/utils/Format/formatDataForForm.js +0 -27
- package/dist/utils/Format/formatDataForForm.test.js +0 -79
- package/dist/utils/Format/formatDataForPage.js +0 -31
- package/dist/utils/Format/formatDataForPage.test.js +0 -94
- package/dist/utils/Format/index.js +0 -21
- package/dist/utils/Hub/getFormHub.js +0 -40
- package/dist/utils/Hub/getFormHub.test.js +0 -105
- package/dist/utils/Hub/index.js +0 -15
- package/dist/utils/Meta/constants.js +0 -9
- package/dist/utils/Meta/documents/getDocuments.js +0 -15
- package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
- package/dist/utils/Meta/documents/index.js +0 -19
- package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
- package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
- package/dist/utils/Meta/index.js +0 -17
- package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
- package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
- package/dist/utils/Operate/deleteValueInFormData.js +0 -27
- package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
- package/dist/utils/Operate/doesContainValue.js +0 -35
- package/dist/utils/Operate/doesContainValue.test.js +0 -76
- package/dist/utils/Operate/getFirstOf.js +0 -31
- package/dist/utils/Operate/getFirstOf.test.js +0 -87
- package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
- package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
- package/dist/utils/Operate/getLength.js +0 -51
- package/dist/utils/Operate/getLength.test.js +0 -90
- package/dist/utils/Operate/index.js +0 -13
- package/dist/utils/Operate/persistValueInFormData.js +0 -40
- package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
- package/dist/utils/Operate/runPageOperations.js +0 -75
- package/dist/utils/Operate/runPageOperations.test.js +0 -105
- package/dist/utils/Operate/setValueInFormData.js +0 -22
- package/dist/utils/Operate/setValueInFormData.test.js +0 -45
- package/dist/utils/Operate/shouldRun.js +0 -57
- package/dist/utils/Operate/shouldRun.test.js +0 -65
- package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
- package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
- package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
- package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
- package/dist/utils/Validate/additional/index.js +0 -74
- package/dist/utils/Validate/additional/index.test.js +0 -130
- package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
- package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
- package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
- package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
- package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
- package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
- package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
- package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
- package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
- package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
- package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
- package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
- package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
- package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
- package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
- package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
- package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
- package/dist/utils/Validate/additional/utils.js +0 -35
- package/dist/utils/Validate/index.js +0 -33
- package/dist/utils/Validate/validateCollection.js +0 -50
- package/dist/utils/Validate/validateCollection.test.js +0 -134
- package/dist/utils/Validate/validateComponent.js +0 -126
- package/dist/utils/Validate/validateComponent.test.js +0 -435
- package/dist/utils/Validate/validateContainer.js +0 -52
- package/dist/utils/Validate/validateContainer.test.js +0 -115
- package/dist/utils/Validate/validateDate.js +0 -112
- package/dist/utils/Validate/validateDate.test.js +0 -133
- package/dist/utils/Validate/validateEmail.js +0 -45
- package/dist/utils/Validate/validateEmail.test.js +0 -78
- package/dist/utils/Validate/validateMultifile.js +0 -29
- package/dist/utils/Validate/validateMultifile.test.js +0 -46
- package/dist/utils/Validate/validateOnPageLoad.js +0 -24
- package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
- package/dist/utils/Validate/validatePage.js +0 -56
- package/dist/utils/Validate/validatePage.test.js +0 -795
- package/dist/utils/Validate/validateRegex.js +0 -41
- package/dist/utils/Validate/validateRegex.test.js +0 -43
- package/dist/utils/Validate/validateRequired.js +0 -37
- package/dist/utils/Validate/validateRequired.test.js +0 -64
- package/dist/utils/Validate/validateTextArea.js +0 -36
- package/dist/utils/Validate/validateTextArea.test.js +0 -71
- package/dist/utils/Validate/validateTime.js +0 -76
- package/dist/utils/Validate/validateTime.test.js +0 -116
- package/dist/utils/canOverrideFieldRequired.js +0 -23
- package/dist/utils/index.js +0 -42
|
@@ -1,1442 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _react = require("@testing-library/react");
|
|
4
|
-
require("@testing-library/jest-dom/extend-expect");
|
|
5
|
-
var _react2 = _interopRequireDefault(require("react"));
|
|
6
|
-
var _copReactComponents = require("@ukhomeoffice/cop-react-components");
|
|
7
|
-
var _testUtils = require("react-dom/test-utils");
|
|
8
|
-
var _setupTests = require("../../setupTests");
|
|
9
|
-
var _SummaryCard = _interopRequireWildcard(require("./SummaryCard"));
|
|
10
|
-
var _BannerStrip = require("./BannerStrip");
|
|
11
|
-
var _SummaryCardValidationContext = _interopRequireDefault(require("./SummaryCardValidationContext"));
|
|
12
|
-
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
-
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); }
|
|
14
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
-
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; }
|
|
16
|
-
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; }
|
|
17
|
-
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; }
|
|
18
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
19
|
-
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.
|
|
20
|
-
// Local imports.
|
|
21
|
-
describe('components.CollectionSummary.SummaryCard', () => {
|
|
22
|
-
const classes = _copReactComponents.Utils.classBuilder(_SummaryCard.DEFAULT_CLASS, [], '');
|
|
23
|
-
const ID = 'summaryCardId';
|
|
24
|
-
const ENTRY = {
|
|
25
|
-
id: '001',
|
|
26
|
-
bannerText: 'A banner',
|
|
27
|
-
titleText: 'A title',
|
|
28
|
-
detailsText: 'Some details',
|
|
29
|
-
index: 0,
|
|
30
|
-
summaryText: 'Full details'
|
|
31
|
-
};
|
|
32
|
-
const checkSetup = container => {
|
|
33
|
-
const cardDiv = container.children[0];
|
|
34
|
-
expect(cardDiv.tagName).toEqual('DIV');
|
|
35
|
-
expect(cardDiv.classList).toContain(_SummaryCard.DEFAULT_CLASS);
|
|
36
|
-
const headerDiv = cardDiv.children[0];
|
|
37
|
-
expect(headerDiv.tagName).toEqual('DIV');
|
|
38
|
-
expect(headerDiv.classList).toContain(classes('header'));
|
|
39
|
-
const headerContentDiv = headerDiv.children[0];
|
|
40
|
-
expect(headerContentDiv.tagName).toEqual('DIV');
|
|
41
|
-
expect(headerContentDiv.classList).toContain(classes('header-content'));
|
|
42
|
-
const headerActionDiv = headerDiv.children[1];
|
|
43
|
-
expect(headerActionDiv.tagName).toEqual('DIV');
|
|
44
|
-
expect(headerActionDiv.className).toContain(classes('header-actions'));
|
|
45
|
-
const bodyDiv = cardDiv.children[1];
|
|
46
|
-
expect(bodyDiv.tagName).toEqual('DIV');
|
|
47
|
-
expect(bodyDiv.classList).toContain(classes('body'));
|
|
48
|
-
return {
|
|
49
|
-
cardDiv,
|
|
50
|
-
headerDiv,
|
|
51
|
-
headerContentDiv,
|
|
52
|
-
headerActionDiv,
|
|
53
|
-
bodyDiv
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
it('should correctly render a SummaryCard component', () => {
|
|
57
|
-
const CONFIG = {
|
|
58
|
-
banners: ['Alpha', 'Bravo'],
|
|
59
|
-
title: 'Title text',
|
|
60
|
-
details: 'Detail text'
|
|
61
|
-
};
|
|
62
|
-
const {
|
|
63
|
-
container
|
|
64
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
65
|
-
id: ID,
|
|
66
|
-
entryData: ENTRY,
|
|
67
|
-
config: CONFIG,
|
|
68
|
-
parentCollectionName: "parent",
|
|
69
|
-
formData: {},
|
|
70
|
-
masterPage: {
|
|
71
|
-
childPages: []
|
|
72
|
-
}
|
|
73
|
-
}));
|
|
74
|
-
const {
|
|
75
|
-
headerContentDiv
|
|
76
|
-
} = checkSetup(container);
|
|
77
|
-
expect(headerContentDiv.children.length).toEqual(3);
|
|
78
|
-
const headerBanners = headerContentDiv.children[0];
|
|
79
|
-
expect(headerBanners.tagName).toEqual('DIV');
|
|
80
|
-
expect(headerBanners.classList).toContain(_BannerStrip.DEFAULT_CLASS);
|
|
81
|
-
const headerTitle = headerContentDiv.children[1];
|
|
82
|
-
expect(headerTitle.tagName).toEqual('H2');
|
|
83
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
84
|
-
expect(headerTitle.textContent).toEqual(CONFIG.title);
|
|
85
|
-
const headerDetails = headerContentDiv.children[2];
|
|
86
|
-
expect(headerDetails.tagName).toEqual('DIV');
|
|
87
|
-
expect(headerDetails.classList).toContain(classes('header-content-detail'));
|
|
88
|
-
expect(headerDetails.textContent).toEqual(CONFIG.details);
|
|
89
|
-
});
|
|
90
|
-
it('should not render a banner if none are supplied', () => {
|
|
91
|
-
const CONFIG = {
|
|
92
|
-
title: 'Title text',
|
|
93
|
-
details: 'Detail text'
|
|
94
|
-
};
|
|
95
|
-
const {
|
|
96
|
-
container
|
|
97
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
98
|
-
id: ID,
|
|
99
|
-
entryData: ENTRY,
|
|
100
|
-
config: CONFIG,
|
|
101
|
-
parentCollectionName: "parent",
|
|
102
|
-
formData: {},
|
|
103
|
-
masterPage: {
|
|
104
|
-
childPages: []
|
|
105
|
-
}
|
|
106
|
-
}));
|
|
107
|
-
const {
|
|
108
|
-
headerContentDiv
|
|
109
|
-
} = checkSetup(container);
|
|
110
|
-
expect(headerContentDiv.children.length).toEqual(2);
|
|
111
|
-
|
|
112
|
-
// The only two children of the content div should be the title
|
|
113
|
-
// and the details.
|
|
114
|
-
|
|
115
|
-
const headerTitle = headerContentDiv.children[0];
|
|
116
|
-
expect(headerTitle.tagName).toEqual('H2');
|
|
117
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
118
|
-
expect(headerTitle.textContent).toEqual(CONFIG.title);
|
|
119
|
-
const headerDetails = headerContentDiv.children[1];
|
|
120
|
-
expect(headerDetails.tagName).toEqual('DIV');
|
|
121
|
-
expect(headerDetails.classList).toContain(classes('header-content-detail'));
|
|
122
|
-
expect(headerDetails.textContent).toEqual(CONFIG.details);
|
|
123
|
-
});
|
|
124
|
-
it('should not render details if none are supplied', () => {
|
|
125
|
-
const CONFIG = {
|
|
126
|
-
banners: ['Alpha', 'Bravo'],
|
|
127
|
-
title: 'Title text'
|
|
128
|
-
};
|
|
129
|
-
const {
|
|
130
|
-
container
|
|
131
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
132
|
-
id: ID,
|
|
133
|
-
entryData: ENTRY,
|
|
134
|
-
config: CONFIG,
|
|
135
|
-
parentCollectionName: "parent",
|
|
136
|
-
formData: {},
|
|
137
|
-
masterPage: {
|
|
138
|
-
childPages: []
|
|
139
|
-
}
|
|
140
|
-
}));
|
|
141
|
-
const {
|
|
142
|
-
headerContentDiv
|
|
143
|
-
} = checkSetup(container);
|
|
144
|
-
expect(headerContentDiv.children.length).toEqual(2);
|
|
145
|
-
const headerBanners = headerContentDiv.children[0];
|
|
146
|
-
expect(headerBanners.tagName).toEqual('DIV');
|
|
147
|
-
expect(headerBanners.classList).toContain(_BannerStrip.DEFAULT_CLASS);
|
|
148
|
-
|
|
149
|
-
// The only two children of the content div should be the banner and
|
|
150
|
-
// the title.
|
|
151
|
-
|
|
152
|
-
const headerTitle = headerContentDiv.children[1];
|
|
153
|
-
expect(headerTitle.tagName).toEqual('H2');
|
|
154
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
155
|
-
expect(headerTitle.textContent).toEqual(CONFIG.title);
|
|
156
|
-
});
|
|
157
|
-
it('should correctly interpolate the title', () => {
|
|
158
|
-
const CONFIG = {
|
|
159
|
-
// eslint-disable-next-line no-template-curly-in-string
|
|
160
|
-
title: '${titleText} that is interpolated'
|
|
161
|
-
};
|
|
162
|
-
const {
|
|
163
|
-
container
|
|
164
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
165
|
-
id: ID,
|
|
166
|
-
entryData: ENTRY,
|
|
167
|
-
config: CONFIG,
|
|
168
|
-
parentCollectionName: "parent",
|
|
169
|
-
formData: {},
|
|
170
|
-
masterPage: {
|
|
171
|
-
childPages: []
|
|
172
|
-
}
|
|
173
|
-
}));
|
|
174
|
-
const {
|
|
175
|
-
headerContentDiv
|
|
176
|
-
} = checkSetup(container);
|
|
177
|
-
const headerTitle = headerContentDiv.children[0];
|
|
178
|
-
expect(headerTitle.tagName).toEqual('H2');
|
|
179
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
180
|
-
expect(headerTitle.textContent).toEqual("".concat(ENTRY.titleText, " that is interpolated"));
|
|
181
|
-
});
|
|
182
|
-
it('should show the correct conditional title', () => {
|
|
183
|
-
const CONFIG = {
|
|
184
|
-
title: [{
|
|
185
|
-
title: 'Title A',
|
|
186
|
-
show_when: {
|
|
187
|
-
field: 'testField',
|
|
188
|
-
op: '=',
|
|
189
|
-
value: '123'
|
|
190
|
-
}
|
|
191
|
-
}, {
|
|
192
|
-
// eslint-disable-next-line no-template-curly-in-string
|
|
193
|
-
title: '${titleText} that is interpolated',
|
|
194
|
-
show_when: {
|
|
195
|
-
field: 'testField',
|
|
196
|
-
op: '=',
|
|
197
|
-
value: '456'
|
|
198
|
-
}
|
|
199
|
-
}]
|
|
200
|
-
};
|
|
201
|
-
const CUSTOM_ENTRY = _objectSpread(_objectSpread({}, ENTRY), {}, {
|
|
202
|
-
testField: '456'
|
|
203
|
-
});
|
|
204
|
-
const {
|
|
205
|
-
container
|
|
206
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
207
|
-
id: ID,
|
|
208
|
-
entryData: CUSTOM_ENTRY,
|
|
209
|
-
config: CONFIG,
|
|
210
|
-
parentCollectionName: "parent",
|
|
211
|
-
formData: {},
|
|
212
|
-
masterPage: {
|
|
213
|
-
childPages: []
|
|
214
|
-
}
|
|
215
|
-
}));
|
|
216
|
-
const {
|
|
217
|
-
headerContentDiv
|
|
218
|
-
} = checkSetup(container);
|
|
219
|
-
const headerTitle = headerContentDiv.children[0];
|
|
220
|
-
expect(headerTitle.tagName).toEqual('H2');
|
|
221
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
222
|
-
expect(headerTitle.textContent).toEqual("".concat(ENTRY.titleText, " that is interpolated"));
|
|
223
|
-
});
|
|
224
|
-
it('should correctly interpolate the details', () => {
|
|
225
|
-
const CONFIG = {
|
|
226
|
-
title: 'Title',
|
|
227
|
-
// eslint-disable-next-line no-template-curly-in-string
|
|
228
|
-
details: '${detailsText} that are interpolated'
|
|
229
|
-
};
|
|
230
|
-
const {
|
|
231
|
-
container
|
|
232
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
233
|
-
id: ID,
|
|
234
|
-
entryData: ENTRY,
|
|
235
|
-
config: CONFIG,
|
|
236
|
-
parentCollectionName: "parent",
|
|
237
|
-
formData: {},
|
|
238
|
-
masterPage: {
|
|
239
|
-
childPages: []
|
|
240
|
-
}
|
|
241
|
-
}));
|
|
242
|
-
const {
|
|
243
|
-
headerContentDiv
|
|
244
|
-
} = checkSetup(container);
|
|
245
|
-
const headerDetails = headerContentDiv.children[1];
|
|
246
|
-
expect(headerDetails.tagName).toEqual('DIV');
|
|
247
|
-
expect(headerDetails.classList).toContain(classes('header-content-detail'));
|
|
248
|
-
expect(headerDetails.textContent).toEqual("".concat(ENTRY.detailsText, " that are interpolated"));
|
|
249
|
-
});
|
|
250
|
-
describe('Change action button', () => {
|
|
251
|
-
let onChangeArgs = [];
|
|
252
|
-
let onChangeCalls = 0;
|
|
253
|
-
const ON_CHANGE = (page, id) => {
|
|
254
|
-
onChangeArgs.push({
|
|
255
|
-
page,
|
|
256
|
-
id
|
|
257
|
-
});
|
|
258
|
-
onChangeCalls += 1;
|
|
259
|
-
};
|
|
260
|
-
beforeEach(() => {
|
|
261
|
-
onChangeArgs = [];
|
|
262
|
-
onChangeCalls = 0;
|
|
263
|
-
});
|
|
264
|
-
it('should render correctly', () => {
|
|
265
|
-
const CONFIG = {
|
|
266
|
-
changeAction: {
|
|
267
|
-
label: 'Change label',
|
|
268
|
-
page: 'testPage',
|
|
269
|
-
aria_label: [{
|
|
270
|
-
text: 'testText'
|
|
271
|
-
}]
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
const {
|
|
275
|
-
container
|
|
276
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
277
|
-
id: ID,
|
|
278
|
-
entryData: ENTRY,
|
|
279
|
-
config: CONFIG,
|
|
280
|
-
onFullEdit: ON_CHANGE,
|
|
281
|
-
parentCollectionName: "parent",
|
|
282
|
-
formData: {},
|
|
283
|
-
masterPage: {
|
|
284
|
-
childPages: []
|
|
285
|
-
}
|
|
286
|
-
}));
|
|
287
|
-
const {
|
|
288
|
-
headerActionDiv
|
|
289
|
-
} = checkSetup(container);
|
|
290
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
291
|
-
const changeButton = headerActionDiv.children[0];
|
|
292
|
-
expect(changeButton.name).toEqual('Change');
|
|
293
|
-
expect(changeButton.tagName).toEqual('BUTTON');
|
|
294
|
-
expect(changeButton.textContent).toEqual(CONFIG.changeAction.label);
|
|
295
|
-
expect(changeButton.getAttribute('aria-label')).toEqual(CONFIG.changeAction.aria_label[0].text);
|
|
296
|
-
_react.fireEvent.click(changeButton, {});
|
|
297
|
-
expect(onChangeCalls).toEqual(1);
|
|
298
|
-
expect(onChangeArgs[0]).toMatchObject({
|
|
299
|
-
page: CONFIG.changeAction.page,
|
|
300
|
-
id: ENTRY.id
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
it('should use the default label when one is not provided', () => {
|
|
304
|
-
const CONFIG = {
|
|
305
|
-
changeAction: {
|
|
306
|
-
page: 'testPage'
|
|
307
|
-
}
|
|
308
|
-
};
|
|
309
|
-
const {
|
|
310
|
-
container
|
|
311
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
312
|
-
id: ID,
|
|
313
|
-
entryData: ENTRY,
|
|
314
|
-
config: CONFIG,
|
|
315
|
-
onFullEdit: ON_CHANGE,
|
|
316
|
-
parentCollectionName: "parent",
|
|
317
|
-
formData: {},
|
|
318
|
-
masterPage: {
|
|
319
|
-
childPages: []
|
|
320
|
-
}
|
|
321
|
-
}));
|
|
322
|
-
const {
|
|
323
|
-
headerActionDiv
|
|
324
|
-
} = checkSetup(container);
|
|
325
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
326
|
-
const changeButton = headerActionDiv.children[0];
|
|
327
|
-
expect(changeButton.tagName).toEqual('BUTTON');
|
|
328
|
-
expect(changeButton.textContent).toEqual(_SummaryCard.DEFAULT_CHANGE_BUTTON_LABEL);
|
|
329
|
-
});
|
|
330
|
-
it('should not render when no config is provided for it', () => {
|
|
331
|
-
const {
|
|
332
|
-
container
|
|
333
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
334
|
-
id: ID,
|
|
335
|
-
entryData: ENTRY,
|
|
336
|
-
config: {},
|
|
337
|
-
onChange: ON_CHANGE,
|
|
338
|
-
parentCollectionName: "parent",
|
|
339
|
-
formData: {},
|
|
340
|
-
masterPage: {
|
|
341
|
-
childPages: []
|
|
342
|
-
}
|
|
343
|
-
}));
|
|
344
|
-
const {
|
|
345
|
-
headerActionDiv
|
|
346
|
-
} = checkSetup(container);
|
|
347
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
348
|
-
});
|
|
349
|
-
it('should not render when onChange is not supplied', () => {
|
|
350
|
-
const CONFIG = {
|
|
351
|
-
changeAction: {
|
|
352
|
-
label: 'Change label',
|
|
353
|
-
page: 'testPage'
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
|
-
const {
|
|
357
|
-
container
|
|
358
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
359
|
-
id: ID,
|
|
360
|
-
entryData: ENTRY,
|
|
361
|
-
config: CONFIG,
|
|
362
|
-
parentCollectionName: "parent",
|
|
363
|
-
formData: {},
|
|
364
|
-
masterPage: {
|
|
365
|
-
childPages: []
|
|
366
|
-
}
|
|
367
|
-
}));
|
|
368
|
-
const {
|
|
369
|
-
headerActionDiv
|
|
370
|
-
} = checkSetup(container);
|
|
371
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
describe('Delete action button', () => {
|
|
375
|
-
let onDeleteArgs = [];
|
|
376
|
-
let onDeleteCalls = 0;
|
|
377
|
-
const ON_DELETE = entry => {
|
|
378
|
-
onDeleteArgs.push(entry);
|
|
379
|
-
onDeleteCalls += 1;
|
|
380
|
-
};
|
|
381
|
-
beforeEach(() => {
|
|
382
|
-
onDeleteArgs = [];
|
|
383
|
-
onDeleteCalls = 0;
|
|
384
|
-
});
|
|
385
|
-
it('should render correctly', () => {
|
|
386
|
-
const CONFIG = {
|
|
387
|
-
deleteAction: {
|
|
388
|
-
label: 'Delete label',
|
|
389
|
-
aria_label: [{
|
|
390
|
-
text: 'testText'
|
|
391
|
-
}]
|
|
392
|
-
}
|
|
393
|
-
};
|
|
394
|
-
const {
|
|
395
|
-
container
|
|
396
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
397
|
-
id: ID,
|
|
398
|
-
entryData: ENTRY,
|
|
399
|
-
config: CONFIG,
|
|
400
|
-
onDelete: ON_DELETE,
|
|
401
|
-
parentCollectionName: "parent",
|
|
402
|
-
formData: {},
|
|
403
|
-
masterPage: {
|
|
404
|
-
childPages: []
|
|
405
|
-
}
|
|
406
|
-
}));
|
|
407
|
-
const {
|
|
408
|
-
headerActionDiv
|
|
409
|
-
} = checkSetup(container);
|
|
410
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
411
|
-
const deleteButton = headerActionDiv.children[0];
|
|
412
|
-
expect(deleteButton.name).toEqual('Delete');
|
|
413
|
-
expect(deleteButton.tagName).toEqual('BUTTON');
|
|
414
|
-
expect(deleteButton.textContent).toEqual(CONFIG.deleteAction.label);
|
|
415
|
-
expect(deleteButton.getAttribute('aria-label')).toEqual(CONFIG.deleteAction.aria_label[0].text);
|
|
416
|
-
_react.fireEvent.click(deleteButton, {});
|
|
417
|
-
expect(onDeleteCalls).toEqual(1);
|
|
418
|
-
expect(onDeleteArgs[0]).toMatchObject(ENTRY);
|
|
419
|
-
});
|
|
420
|
-
it('should use the default label when one is not provided', () => {
|
|
421
|
-
const CONFIG = {
|
|
422
|
-
deleteAction: {}
|
|
423
|
-
};
|
|
424
|
-
const {
|
|
425
|
-
container
|
|
426
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
427
|
-
id: ID,
|
|
428
|
-
entryData: ENTRY,
|
|
429
|
-
config: CONFIG,
|
|
430
|
-
onDelete: ON_DELETE,
|
|
431
|
-
parentCollectionName: "parent",
|
|
432
|
-
formData: {},
|
|
433
|
-
masterPage: {
|
|
434
|
-
childPages: []
|
|
435
|
-
}
|
|
436
|
-
}));
|
|
437
|
-
const {
|
|
438
|
-
headerActionDiv
|
|
439
|
-
} = checkSetup(container);
|
|
440
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
441
|
-
const deleteButton = headerActionDiv.children[0];
|
|
442
|
-
expect(deleteButton.tagName).toEqual('BUTTON');
|
|
443
|
-
expect(deleteButton.textContent).toEqual(_SummaryCard.DEFAULT_DELETE_BUTTON_LABEL);
|
|
444
|
-
});
|
|
445
|
-
it('should not render when no config is provided for it', () => {
|
|
446
|
-
const {
|
|
447
|
-
container
|
|
448
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
449
|
-
id: ID,
|
|
450
|
-
entryData: ENTRY,
|
|
451
|
-
config: {},
|
|
452
|
-
onDelete: ON_DELETE,
|
|
453
|
-
parentCollectionName: "parent",
|
|
454
|
-
formData: {},
|
|
455
|
-
masterPage: {
|
|
456
|
-
childPages: []
|
|
457
|
-
}
|
|
458
|
-
}));
|
|
459
|
-
const {
|
|
460
|
-
headerActionDiv
|
|
461
|
-
} = checkSetup(container);
|
|
462
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
463
|
-
});
|
|
464
|
-
it('should not render when onDelete is not supplied', () => {
|
|
465
|
-
const CONFIG = {
|
|
466
|
-
deleteAction: {
|
|
467
|
-
label: 'Delete label'
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
const {
|
|
471
|
-
container
|
|
472
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
473
|
-
id: ID,
|
|
474
|
-
entryData: ENTRY,
|
|
475
|
-
config: CONFIG,
|
|
476
|
-
parentCollectionName: "parent",
|
|
477
|
-
formData: {},
|
|
478
|
-
masterPage: {
|
|
479
|
-
childPages: []
|
|
480
|
-
}
|
|
481
|
-
}));
|
|
482
|
-
const {
|
|
483
|
-
headerActionDiv
|
|
484
|
-
} = checkSetup(container);
|
|
485
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
486
|
-
});
|
|
487
|
-
it('should correctly render the Details section with entry data', () => {
|
|
488
|
-
const CONFIG = {
|
|
489
|
-
deleteAction: {
|
|
490
|
-
label: 'Delete label'
|
|
491
|
-
}
|
|
492
|
-
};
|
|
493
|
-
const {
|
|
494
|
-
container
|
|
495
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
496
|
-
id: ID,
|
|
497
|
-
entryData: ENTRY,
|
|
498
|
-
config: CONFIG,
|
|
499
|
-
parentCollectionName: "parent",
|
|
500
|
-
formData: {},
|
|
501
|
-
masterPage: {
|
|
502
|
-
childPages: []
|
|
503
|
-
}
|
|
504
|
-
}));
|
|
505
|
-
const detailsSection = container.querySelector('.details');
|
|
506
|
-
expect(detailsSection).not.toBeNull();
|
|
507
|
-
expect(detailsSection.textContent).toContain(ENTRY.summaryText);
|
|
508
|
-
});
|
|
509
|
-
});
|
|
510
|
-
describe('Duplicate action button', () => {
|
|
511
|
-
let onDuplicateArgs = [];
|
|
512
|
-
let onDuplicateCalls = 0;
|
|
513
|
-
const ON_DUPLICATE = entry => {
|
|
514
|
-
onDuplicateArgs.push(entry);
|
|
515
|
-
onDuplicateCalls += 1;
|
|
516
|
-
};
|
|
517
|
-
beforeEach(() => {
|
|
518
|
-
onDuplicateArgs = [];
|
|
519
|
-
onDuplicateCalls = 0;
|
|
520
|
-
});
|
|
521
|
-
it('should render correctly', () => {
|
|
522
|
-
const CONFIG = {
|
|
523
|
-
duplicateAction: {
|
|
524
|
-
label: 'Duplicate label'
|
|
525
|
-
}
|
|
526
|
-
};
|
|
527
|
-
const {
|
|
528
|
-
container
|
|
529
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
530
|
-
id: ID,
|
|
531
|
-
entryData: ENTRY,
|
|
532
|
-
config: CONFIG,
|
|
533
|
-
onDuplicate: ON_DUPLICATE,
|
|
534
|
-
parentCollectionName: "parent",
|
|
535
|
-
formData: {},
|
|
536
|
-
masterPage: {
|
|
537
|
-
childPages: []
|
|
538
|
-
}
|
|
539
|
-
}));
|
|
540
|
-
const {
|
|
541
|
-
headerActionDiv
|
|
542
|
-
} = checkSetup(container);
|
|
543
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
544
|
-
const duplicateButton = headerActionDiv.children[0];
|
|
545
|
-
expect(duplicateButton.name).toEqual('Duplicate');
|
|
546
|
-
expect(duplicateButton.tagName).toEqual('BUTTON');
|
|
547
|
-
expect(duplicateButton.textContent).toEqual(CONFIG.duplicateAction.label);
|
|
548
|
-
_react.fireEvent.click(duplicateButton, {});
|
|
549
|
-
expect(onDuplicateCalls).toEqual(1);
|
|
550
|
-
expect(onDuplicateArgs[0]).toMatchObject(ENTRY);
|
|
551
|
-
});
|
|
552
|
-
it('should use the default label when one is not provided', () => {
|
|
553
|
-
const CONFIG = {
|
|
554
|
-
duplicateAction: {}
|
|
555
|
-
};
|
|
556
|
-
const {
|
|
557
|
-
container
|
|
558
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
559
|
-
id: ID,
|
|
560
|
-
entryData: ENTRY,
|
|
561
|
-
config: CONFIG,
|
|
562
|
-
onDuplicate: ON_DUPLICATE,
|
|
563
|
-
parentCollectionName: "parent",
|
|
564
|
-
formData: {},
|
|
565
|
-
masterPage: {
|
|
566
|
-
childPages: []
|
|
567
|
-
}
|
|
568
|
-
}));
|
|
569
|
-
const {
|
|
570
|
-
headerActionDiv
|
|
571
|
-
} = checkSetup(container);
|
|
572
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
573
|
-
const duplicateButton = headerActionDiv.children[0];
|
|
574
|
-
expect(duplicateButton.tagName).toEqual('BUTTON');
|
|
575
|
-
expect(duplicateButton.textContent).toEqual(_SummaryCard.DEFAULT_DUPLICATE_BUTTON_LABEL);
|
|
576
|
-
});
|
|
577
|
-
it('should not render when no config is provided for it', () => {
|
|
578
|
-
const {
|
|
579
|
-
container
|
|
580
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
581
|
-
id: ID,
|
|
582
|
-
entryData: ENTRY,
|
|
583
|
-
config: {},
|
|
584
|
-
onDuplicate: ON_DUPLICATE,
|
|
585
|
-
parentCollectionName: "parent",
|
|
586
|
-
formData: {},
|
|
587
|
-
masterPage: {
|
|
588
|
-
childPages: []
|
|
589
|
-
}
|
|
590
|
-
}));
|
|
591
|
-
const {
|
|
592
|
-
headerActionDiv
|
|
593
|
-
} = checkSetup(container);
|
|
594
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
595
|
-
});
|
|
596
|
-
it('should not render when onDuplicate is not supplied', () => {
|
|
597
|
-
const CONFIG = {
|
|
598
|
-
duplicateAction: {
|
|
599
|
-
label: 'Duplicate label'
|
|
600
|
-
}
|
|
601
|
-
};
|
|
602
|
-
const {
|
|
603
|
-
container
|
|
604
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
605
|
-
id: ID,
|
|
606
|
-
entryData: ENTRY,
|
|
607
|
-
config: CONFIG,
|
|
608
|
-
parentCollectionName: "parent",
|
|
609
|
-
formData: {},
|
|
610
|
-
masterPage: {
|
|
611
|
-
childPages: []
|
|
612
|
-
}
|
|
613
|
-
}));
|
|
614
|
-
const {
|
|
615
|
-
headerActionDiv
|
|
616
|
-
} = checkSetup(container);
|
|
617
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
618
|
-
});
|
|
619
|
-
it('should focus on the most recently duplicated item', () => {
|
|
620
|
-
const entryData = {
|
|
621
|
-
id: ID,
|
|
622
|
-
isDuplicate: true
|
|
623
|
-
};
|
|
624
|
-
const config = {
|
|
625
|
-
duplicateAction: {
|
|
626
|
-
label: 'Duplicate Label',
|
|
627
|
-
aria_label: 'Duplicate Aria Label'
|
|
628
|
-
}
|
|
629
|
-
};
|
|
630
|
-
const onDuplicate = jest.fn();
|
|
631
|
-
const {
|
|
632
|
-
getByTestId
|
|
633
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
634
|
-
id: ID,
|
|
635
|
-
entryData: entryData,
|
|
636
|
-
config: config,
|
|
637
|
-
onDuplicate: onDuplicate,
|
|
638
|
-
parentCollectionName: "parent",
|
|
639
|
-
pages: [],
|
|
640
|
-
formData: {},
|
|
641
|
-
hideDetails: true,
|
|
642
|
-
masterPage: {
|
|
643
|
-
childPages: []
|
|
644
|
-
}
|
|
645
|
-
}));
|
|
646
|
-
const updatedConfig = {
|
|
647
|
-
focusOn: true,
|
|
648
|
-
quickEdit: true
|
|
649
|
-
};
|
|
650
|
-
|
|
651
|
-
// Rerender the component with updated config
|
|
652
|
-
const {
|
|
653
|
-
getByTestId: getByTestIdRerender
|
|
654
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
655
|
-
id: ID,
|
|
656
|
-
entryData: entryData,
|
|
657
|
-
config: updatedConfig,
|
|
658
|
-
parentCollectionName: "parent",
|
|
659
|
-
pages: [],
|
|
660
|
-
formData: {},
|
|
661
|
-
hideDetails: true,
|
|
662
|
-
masterPage: {
|
|
663
|
-
childPages: []
|
|
664
|
-
}
|
|
665
|
-
}));
|
|
666
|
-
|
|
667
|
-
// check that focus isn't on the initial component
|
|
668
|
-
const initialComponent = getByTestId('duplicate-button');
|
|
669
|
-
expect(initialComponent).toBeInTheDocument();
|
|
670
|
-
expect(initialComponent).not.toHaveFocus();
|
|
671
|
-
|
|
672
|
-
// check that the focus is on the newly duplicated component
|
|
673
|
-
const DuplicatedComponent = getByTestIdRerender('quickedit-button');
|
|
674
|
-
expect(DuplicatedComponent).toBeInTheDocument();
|
|
675
|
-
expect(DuplicatedComponent).toHaveFocus();
|
|
676
|
-
});
|
|
677
|
-
});
|
|
678
|
-
describe('Quick Edit action button', () => {
|
|
679
|
-
const CONFIG = {
|
|
680
|
-
quickEdit: {}
|
|
681
|
-
};
|
|
682
|
-
const PAGES = [{
|
|
683
|
-
id: 'parentPage',
|
|
684
|
-
name: 'parentPage',
|
|
685
|
-
components: [{
|
|
686
|
-
id: 'testText',
|
|
687
|
-
type: 'text',
|
|
688
|
-
label: 'Test text',
|
|
689
|
-
fieldId: 'testText',
|
|
690
|
-
required: true,
|
|
691
|
-
use: 'testText',
|
|
692
|
-
cya_label: 'Test text',
|
|
693
|
-
full_path: 'testText'
|
|
694
|
-
}],
|
|
695
|
-
summaryQuickEdit: ["testText"],
|
|
696
|
-
formData: {
|
|
697
|
-
parents: [{
|
|
698
|
-
id: '1695037579150',
|
|
699
|
-
testText: 'tester',
|
|
700
|
-
testText2: 'test test',
|
|
701
|
-
index: 0
|
|
702
|
-
}]
|
|
703
|
-
}
|
|
704
|
-
}];
|
|
705
|
-
it('should render correctly', () => {
|
|
706
|
-
const {
|
|
707
|
-
container
|
|
708
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
709
|
-
id: ID,
|
|
710
|
-
entryData: ENTRY,
|
|
711
|
-
config: CONFIG,
|
|
712
|
-
parentCollectionName: "parent",
|
|
713
|
-
formData: {},
|
|
714
|
-
masterPage: {
|
|
715
|
-
childPages: PAGES
|
|
716
|
-
}
|
|
717
|
-
}));
|
|
718
|
-
const {
|
|
719
|
-
headerActionDiv
|
|
720
|
-
} = checkSetup(container);
|
|
721
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
722
|
-
|
|
723
|
-
// Shows edit button but no quick edit
|
|
724
|
-
const editButton = headerActionDiv.children[0];
|
|
725
|
-
expect(editButton.name).toEqual('QuickEdit');
|
|
726
|
-
expect(editButton.tagName).toEqual('BUTTON');
|
|
727
|
-
expect(editButton.textContent).toEqual('Quick Edit');
|
|
728
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
729
|
-
|
|
730
|
-
// shows quickedit once clicked
|
|
731
|
-
_react.fireEvent.click(editButton, {});
|
|
732
|
-
expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
|
|
733
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
734
|
-
expect(quickEdit.textContent).toContain('Test text');
|
|
735
|
-
|
|
736
|
-
// quick edit has proper buttons
|
|
737
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
738
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
739
|
-
const cancelButton = quickEditButtons.childNodes[1];
|
|
740
|
-
expect(saveButton.textContent).toContain('Save');
|
|
741
|
-
expect(cancelButton.textContent).toContain('Cancel');
|
|
742
|
-
|
|
743
|
-
// hides quick edit again adfter clicking cancel
|
|
744
|
-
_react.fireEvent.click(cancelButton, {});
|
|
745
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
746
|
-
});
|
|
747
|
-
it('should not render when no config is provided for it', () => {
|
|
748
|
-
const {
|
|
749
|
-
container
|
|
750
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
751
|
-
id: ID,
|
|
752
|
-
entryData: ENTRY,
|
|
753
|
-
config: {},
|
|
754
|
-
parentCollectionName: "parent",
|
|
755
|
-
formData: {},
|
|
756
|
-
masterPage: {
|
|
757
|
-
childPages: PAGES
|
|
758
|
-
}
|
|
759
|
-
}));
|
|
760
|
-
const {
|
|
761
|
-
headerActionDiv
|
|
762
|
-
} = checkSetup(container);
|
|
763
|
-
expect(headerActionDiv.children.length).toEqual(0);
|
|
764
|
-
});
|
|
765
|
-
});
|
|
766
|
-
describe('Quick Edit errors', () => {
|
|
767
|
-
const CUSTOM_ENTRY = {
|
|
768
|
-
id: '123',
|
|
769
|
-
testText: 'value'
|
|
770
|
-
};
|
|
771
|
-
const CONFIG = {
|
|
772
|
-
quickEdit: {}
|
|
773
|
-
};
|
|
774
|
-
const PAGES = [{
|
|
775
|
-
id: 'parentPage',
|
|
776
|
-
name: 'parentPage',
|
|
777
|
-
components: [{
|
|
778
|
-
id: 'testText',
|
|
779
|
-
type: 'text',
|
|
780
|
-
label: 'Test text',
|
|
781
|
-
fieldId: 'testText',
|
|
782
|
-
required: true,
|
|
783
|
-
use: 'testText',
|
|
784
|
-
cya_label: 'Test text',
|
|
785
|
-
full_path: 'testText',
|
|
786
|
-
custom_errors: [{
|
|
787
|
-
type: 'required',
|
|
788
|
-
message: 'Custom error message'
|
|
789
|
-
}]
|
|
790
|
-
}],
|
|
791
|
-
summaryQuickEdit: ["testText"],
|
|
792
|
-
formData: {
|
|
793
|
-
parents: [{
|
|
794
|
-
id: '123',
|
|
795
|
-
index: 0
|
|
796
|
-
}]
|
|
797
|
-
}
|
|
798
|
-
}];
|
|
799
|
-
it('should initally show errors passed in from top-level', () => {
|
|
800
|
-
const TOP_LEVEL_ERRORS = [{
|
|
801
|
-
id: 'testText',
|
|
802
|
-
entryId: '123',
|
|
803
|
-
error: 'top-level error message'
|
|
804
|
-
}];
|
|
805
|
-
const {
|
|
806
|
-
container
|
|
807
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
|
|
808
|
-
entryId: CUSTOM_ENTRY.id,
|
|
809
|
-
topLevelErrors: TOP_LEVEL_ERRORS,
|
|
810
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
811
|
-
id: ID,
|
|
812
|
-
entryData: CUSTOM_ENTRY,
|
|
813
|
-
config: CONFIG,
|
|
814
|
-
parentCollectionName: "parent",
|
|
815
|
-
formData: {},
|
|
816
|
-
masterPage: {
|
|
817
|
-
childPages: PAGES
|
|
818
|
-
}
|
|
819
|
-
})
|
|
820
|
-
}));
|
|
821
|
-
const {
|
|
822
|
-
headerActionDiv
|
|
823
|
-
} = checkSetup(container);
|
|
824
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
825
|
-
|
|
826
|
-
// Shows edit button but no quick edit
|
|
827
|
-
const editButton = headerActionDiv.children[0];
|
|
828
|
-
expect(editButton.tagName).toEqual('BUTTON');
|
|
829
|
-
expect(editButton.textContent).toEqual('Quick Edit');
|
|
830
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
831
|
-
|
|
832
|
-
// shows quickedit once clicked
|
|
833
|
-
_react.fireEvent.click(editButton, {});
|
|
834
|
-
expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
|
|
835
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
836
|
-
expect(quickEdit.textContent).toContain('Test text');
|
|
837
|
-
|
|
838
|
-
// quick edit is showing top-level error
|
|
839
|
-
const errorSummary = quickEdit.childNodes[0];
|
|
840
|
-
expect(errorSummary.textContent).toContain(TOP_LEVEL_ERRORS[0].error);
|
|
841
|
-
});
|
|
842
|
-
it('should only show errors from validation when it happens, ignoring top-level errors', async () => {
|
|
843
|
-
const TOP_LEVEL_ERRORS = [{
|
|
844
|
-
id: 'testText',
|
|
845
|
-
entryId: '123',
|
|
846
|
-
error: 'top-level error message'
|
|
847
|
-
}];
|
|
848
|
-
const {
|
|
849
|
-
container
|
|
850
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
|
|
851
|
-
entryId: CUSTOM_ENTRY.id,
|
|
852
|
-
topLevelErrors: TOP_LEVEL_ERRORS,
|
|
853
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
854
|
-
id: ID,
|
|
855
|
-
entryData: CUSTOM_ENTRY,
|
|
856
|
-
config: CONFIG,
|
|
857
|
-
parentCollectionName: "parent",
|
|
858
|
-
formData: {},
|
|
859
|
-
masterPage: {
|
|
860
|
-
childPages: PAGES
|
|
861
|
-
},
|
|
862
|
-
onQuickEdit: () => {}
|
|
863
|
-
})
|
|
864
|
-
}));
|
|
865
|
-
const {
|
|
866
|
-
headerActionDiv
|
|
867
|
-
} = checkSetup(container);
|
|
868
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
869
|
-
|
|
870
|
-
// Shows edit button but no quick edit
|
|
871
|
-
const editButton = headerActionDiv.children[0];
|
|
872
|
-
expect(editButton.tagName).toEqual('BUTTON');
|
|
873
|
-
expect(editButton.textContent).toEqual('Quick Edit');
|
|
874
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
875
|
-
|
|
876
|
-
// shows quickedit once clicked
|
|
877
|
-
_react.fireEvent.click(editButton, {});
|
|
878
|
-
expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
|
|
879
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
880
|
-
expect(quickEdit.textContent).toContain('Test text');
|
|
881
|
-
|
|
882
|
-
// quick edit is initially showing top-level error
|
|
883
|
-
const errorSummary = quickEdit.childNodes[0];
|
|
884
|
-
expect(errorSummary.textContent).toContain(TOP_LEVEL_ERRORS[0].error);
|
|
885
|
-
|
|
886
|
-
// remove value from required text component
|
|
887
|
-
const component = quickEdit.childNodes[2];
|
|
888
|
-
const componentInput = component.childNodes[3];
|
|
889
|
-
await (0, _testUtils.act)(async () => {
|
|
890
|
-
_react.fireEvent.change(componentInput, {
|
|
891
|
-
target: {
|
|
892
|
-
value: ''
|
|
893
|
-
}
|
|
894
|
-
});
|
|
895
|
-
});
|
|
896
|
-
|
|
897
|
-
// click 'save' to trigger validation, which will fail as the component
|
|
898
|
-
// cleared above is marked as 'required'.
|
|
899
|
-
const quickEditButtons = quickEdit.childNodes[3];
|
|
900
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
901
|
-
expect(saveButton.textContent).toContain('Save');
|
|
902
|
-
await (0, _testUtils.act)(async () => {
|
|
903
|
-
_react.fireEvent.click(saveButton, {});
|
|
904
|
-
});
|
|
905
|
-
|
|
906
|
-
// quick edit should now be showing the errors from validation
|
|
907
|
-
expect(errorSummary.textContent).toContain('Custom error message');
|
|
908
|
-
});
|
|
909
|
-
});
|
|
910
|
-
describe('Quick Edit save changes', () => {
|
|
911
|
-
const CONFIG = {
|
|
912
|
-
quickEdit: {}
|
|
913
|
-
};
|
|
914
|
-
const PAGES = [{
|
|
915
|
-
id: 'parentPage',
|
|
916
|
-
name: 'parentPage',
|
|
917
|
-
components: [{
|
|
918
|
-
id: 'testText',
|
|
919
|
-
type: 'text',
|
|
920
|
-
label: 'Test text',
|
|
921
|
-
fieldId: 'testText',
|
|
922
|
-
required: true,
|
|
923
|
-
use: 'testText',
|
|
924
|
-
cya_label: 'Test text',
|
|
925
|
-
full_path: 'testText',
|
|
926
|
-
"additionalValidation": [{
|
|
927
|
-
"function": "mustBeLongerThan",
|
|
928
|
-
"value": 3,
|
|
929
|
-
message: 'error'
|
|
930
|
-
}]
|
|
931
|
-
}],
|
|
932
|
-
summaryQuickEdit: ["testText"],
|
|
933
|
-
formData: {
|
|
934
|
-
parents: [{
|
|
935
|
-
id: '1695037579150',
|
|
936
|
-
testText: 'tester',
|
|
937
|
-
testText2: 'test test',
|
|
938
|
-
index: 0
|
|
939
|
-
}]
|
|
940
|
-
}
|
|
941
|
-
}];
|
|
942
|
-
it('should render correctly', () => {
|
|
943
|
-
const {
|
|
944
|
-
container
|
|
945
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
946
|
-
id: ID,
|
|
947
|
-
entryData: ENTRY,
|
|
948
|
-
config: CONFIG,
|
|
949
|
-
parentCollectionName: "parent",
|
|
950
|
-
formData: {},
|
|
951
|
-
masterPage: {
|
|
952
|
-
childPages: PAGES
|
|
953
|
-
}
|
|
954
|
-
}));
|
|
955
|
-
const {
|
|
956
|
-
headerActionDiv
|
|
957
|
-
} = checkSetup(container);
|
|
958
|
-
expect(headerActionDiv.children.length).toEqual(1);
|
|
959
|
-
|
|
960
|
-
// Shows edit button but no quick edit
|
|
961
|
-
const editButton = headerActionDiv.children[0];
|
|
962
|
-
expect(editButton.tagName).toEqual('BUTTON');
|
|
963
|
-
expect(editButton.textContent).toEqual('Quick Edit');
|
|
964
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
965
|
-
|
|
966
|
-
// shows quickedit once clicked
|
|
967
|
-
_react.fireEvent.click(editButton, {});
|
|
968
|
-
expect(container.childNodes[0].childNodes.length).toEqual(3); // Quick edit shown
|
|
969
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
970
|
-
expect(quickEdit.textContent).toContain('Test text');
|
|
971
|
-
|
|
972
|
-
// quick edit has proper buttons
|
|
973
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
974
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
975
|
-
const cancelButton = quickEditButtons.childNodes[1];
|
|
976
|
-
expect(saveButton.textContent).toContain('Save');
|
|
977
|
-
expect(cancelButton.textContent).toContain('Cancel');
|
|
978
|
-
|
|
979
|
-
// hides quick edit again adfter clicking cancel
|
|
980
|
-
_react.fireEvent.click(cancelButton, {});
|
|
981
|
-
expect(container.childNodes[0].childNodes.length).toEqual(2); // Quick edit hidden
|
|
982
|
-
});
|
|
983
|
-
it('should not validate or save if nothing has changed', () => {
|
|
984
|
-
const ON_SUBMIT_CALLS = [];
|
|
985
|
-
const hooks = {
|
|
986
|
-
onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
|
|
987
|
-
};
|
|
988
|
-
const {
|
|
989
|
-
container
|
|
990
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
991
|
-
id: ID,
|
|
992
|
-
entryData: ENTRY,
|
|
993
|
-
config: CONFIG,
|
|
994
|
-
parentCollectionName: "parents",
|
|
995
|
-
formData: {},
|
|
996
|
-
masterPage: {
|
|
997
|
-
childPages: PAGES
|
|
998
|
-
}
|
|
999
|
-
}), {
|
|
1000
|
-
hooks
|
|
1001
|
-
});
|
|
1002
|
-
const {
|
|
1003
|
-
headerActionDiv
|
|
1004
|
-
} = checkSetup(container);
|
|
1005
|
-
|
|
1006
|
-
// Shows edit button but no quick edit
|
|
1007
|
-
const editButton = headerActionDiv.children[0];
|
|
1008
|
-
|
|
1009
|
-
// shows quickedit once clicked
|
|
1010
|
-
_react.fireEvent.click(editButton, {});
|
|
1011
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
1012
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
1013
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
1014
|
-
_react.fireEvent.click(saveButton, {});
|
|
1015
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
1016
|
-
});
|
|
1017
|
-
it('should return after local validation if errors are present', async () => {
|
|
1018
|
-
const ON_SUBMIT_CALLS = [];
|
|
1019
|
-
const hooks = {
|
|
1020
|
-
onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
|
|
1021
|
-
};
|
|
1022
|
-
const ON_QUICK_EDIT_CALLS = [];
|
|
1023
|
-
const ON_QUICK_EDIT = _ref => {
|
|
1024
|
-
let {
|
|
1025
|
-
target
|
|
1026
|
-
} = _ref;
|
|
1027
|
-
ON_QUICK_EDIT_CALLS.push(target);
|
|
1028
|
-
};
|
|
1029
|
-
const {
|
|
1030
|
-
container
|
|
1031
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1032
|
-
id: ID,
|
|
1033
|
-
entryData: _objectSpread(_objectSpread({}, ENTRY), {}, {
|
|
1034
|
-
index: 0
|
|
1035
|
-
}),
|
|
1036
|
-
config: CONFIG,
|
|
1037
|
-
parentCollectionName: "parents",
|
|
1038
|
-
onQuickEdit: ON_QUICK_EDIT,
|
|
1039
|
-
formData: {
|
|
1040
|
-
parents: [{
|
|
1041
|
-
testText: 'hello'
|
|
1042
|
-
}]
|
|
1043
|
-
},
|
|
1044
|
-
masterPage: {
|
|
1045
|
-
childPages: PAGES
|
|
1046
|
-
}
|
|
1047
|
-
}), {
|
|
1048
|
-
hooks
|
|
1049
|
-
});
|
|
1050
|
-
const {
|
|
1051
|
-
headerActionDiv
|
|
1052
|
-
} = checkSetup(container);
|
|
1053
|
-
const editButton = headerActionDiv.children[0];
|
|
1054
|
-
_react.fireEvent.click(editButton, {});
|
|
1055
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
1056
|
-
const component = quickEdit.childNodes[1];
|
|
1057
|
-
const componentInput = component.childNodes[2];
|
|
1058
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
1059
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
1060
|
-
// Field has validation to force the length of this field to be greater than 2 so this should fail
|
|
1061
|
-
await (0, _testUtils.act)(async () => {
|
|
1062
|
-
_react.fireEvent.change(componentInput, {
|
|
1063
|
-
target: {
|
|
1064
|
-
value: 'a'
|
|
1065
|
-
}
|
|
1066
|
-
});
|
|
1067
|
-
});
|
|
1068
|
-
await (0, _testUtils.act)(async () => {
|
|
1069
|
-
_react.fireEvent.click(saveButton, {});
|
|
1070
|
-
});
|
|
1071
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
1072
|
-
expect(ON_QUICK_EDIT_CALLS.length).toEqual(0);
|
|
1073
|
-
});
|
|
1074
|
-
it('should run hook validation when local validation is passed', async () => {
|
|
1075
|
-
const ON_SUBMIT_CALLS = [];
|
|
1076
|
-
const hooks = {
|
|
1077
|
-
onSubmit: (type, patch, notRequired, onError) => {
|
|
1078
|
-
ON_SUBMIT_CALLS.push(patch);
|
|
1079
|
-
onError([{
|
|
1080
|
-
error: 'message',
|
|
1081
|
-
id: '0'
|
|
1082
|
-
}]);
|
|
1083
|
-
}
|
|
1084
|
-
};
|
|
1085
|
-
const ON_QUICK_EDIT_CALLS = [];
|
|
1086
|
-
const ON_QUICK_EDIT = _ref2 => {
|
|
1087
|
-
let {
|
|
1088
|
-
target
|
|
1089
|
-
} = _ref2;
|
|
1090
|
-
ON_QUICK_EDIT_CALLS.push(target);
|
|
1091
|
-
};
|
|
1092
|
-
const {
|
|
1093
|
-
container
|
|
1094
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1095
|
-
id: ID,
|
|
1096
|
-
entryData: ENTRY,
|
|
1097
|
-
config: CONFIG,
|
|
1098
|
-
parentCollectionName: "parents",
|
|
1099
|
-
onQuickEdit: ON_QUICK_EDIT,
|
|
1100
|
-
formData: {
|
|
1101
|
-
parents: [{
|
|
1102
|
-
alreadyProvidedField: 'hello'
|
|
1103
|
-
}]
|
|
1104
|
-
},
|
|
1105
|
-
masterPage: {
|
|
1106
|
-
childPages: PAGES
|
|
1107
|
-
}
|
|
1108
|
-
}), {
|
|
1109
|
-
hooks
|
|
1110
|
-
});
|
|
1111
|
-
const {
|
|
1112
|
-
headerActionDiv
|
|
1113
|
-
} = checkSetup(container);
|
|
1114
|
-
const editButton = headerActionDiv.children[0];
|
|
1115
|
-
_react.fireEvent.click(editButton, {});
|
|
1116
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
1117
|
-
|
|
1118
|
-
// Make a change
|
|
1119
|
-
const component = quickEdit.childNodes[1];
|
|
1120
|
-
const componentInput = component.childNodes[2];
|
|
1121
|
-
_react.fireEvent.change(componentInput, {
|
|
1122
|
-
target: {
|
|
1123
|
-
value: 'new value'
|
|
1124
|
-
}
|
|
1125
|
-
});
|
|
1126
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
1127
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
1128
|
-
await (0, _testUtils.act)(async () => {
|
|
1129
|
-
_react.fireEvent.click(saveButton, {});
|
|
1130
|
-
});
|
|
1131
|
-
expect(ON_SUBMIT_CALLS[0]).toMatchObject({
|
|
1132
|
-
testText: 'new value'
|
|
1133
|
-
});
|
|
1134
|
-
expect(ON_QUICK_EDIT_CALLS.length).toEqual(0);
|
|
1135
|
-
});
|
|
1136
|
-
it('should apply changes if no errors are present', async () => {
|
|
1137
|
-
const ON_SUBMIT_CALLS = [];
|
|
1138
|
-
const hooks = {
|
|
1139
|
-
onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
|
|
1140
|
-
};
|
|
1141
|
-
const ON_QUICK_EDIT_CALLS = [];
|
|
1142
|
-
const ON_QUICK_EDIT = _ref3 => {
|
|
1143
|
-
let {
|
|
1144
|
-
target
|
|
1145
|
-
} = _ref3;
|
|
1146
|
-
ON_QUICK_EDIT_CALLS.push(target);
|
|
1147
|
-
};
|
|
1148
|
-
const {
|
|
1149
|
-
container
|
|
1150
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
|
|
1151
|
-
entryId: "id",
|
|
1152
|
-
topLevelErrors: [],
|
|
1153
|
-
clearTopLevelErrorsForCard: () => {},
|
|
1154
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1155
|
-
id: ID,
|
|
1156
|
-
entryData: {
|
|
1157
|
-
index: 0,
|
|
1158
|
-
id: '0'
|
|
1159
|
-
},
|
|
1160
|
-
config: CONFIG,
|
|
1161
|
-
parentCollectionName: "parents",
|
|
1162
|
-
onQuickEdit: ON_QUICK_EDIT,
|
|
1163
|
-
formData: {
|
|
1164
|
-
parents: [{
|
|
1165
|
-
alreadyProvidedField: 'hello'
|
|
1166
|
-
}]
|
|
1167
|
-
},
|
|
1168
|
-
masterPage: {
|
|
1169
|
-
childPages: PAGES
|
|
1170
|
-
}
|
|
1171
|
-
})
|
|
1172
|
-
}), {
|
|
1173
|
-
hooks
|
|
1174
|
-
});
|
|
1175
|
-
const {
|
|
1176
|
-
headerActionDiv
|
|
1177
|
-
} = checkSetup(container);
|
|
1178
|
-
const editButton = headerActionDiv.children[0];
|
|
1179
|
-
_react.fireEvent.click(editButton, {});
|
|
1180
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
1181
|
-
|
|
1182
|
-
// Make a change that will be accepted
|
|
1183
|
-
const component = quickEdit.childNodes[1];
|
|
1184
|
-
const componentInput = component.childNodes[2];
|
|
1185
|
-
_react.fireEvent.change(componentInput, {
|
|
1186
|
-
target: {
|
|
1187
|
-
value: 'new value'
|
|
1188
|
-
}
|
|
1189
|
-
});
|
|
1190
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
1191
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
1192
|
-
await (0, _testUtils.act)(async () => {
|
|
1193
|
-
_react.fireEvent.click(saveButton, {});
|
|
1194
|
-
});
|
|
1195
|
-
expect(ON_QUICK_EDIT_CALLS.length).toEqual(1);
|
|
1196
|
-
expect(ON_QUICK_EDIT_CALLS[0].value[0]).toEqual({
|
|
1197
|
-
alreadyProvidedField: 'hello',
|
|
1198
|
-
testText: 'new value'
|
|
1199
|
-
});
|
|
1200
|
-
});
|
|
1201
|
-
it('should remove the isDuplicate flag on a sucessful quick edit', async () => {
|
|
1202
|
-
const ON_SUBMIT_CALLS = [];
|
|
1203
|
-
const hooks = {
|
|
1204
|
-
onSubmit: (type, patch) => ON_SUBMIT_CALLS.push(patch)
|
|
1205
|
-
};
|
|
1206
|
-
const ON_QUICK_EDIT_CALLS = [];
|
|
1207
|
-
const ON_QUICK_EDIT = _ref4 => {
|
|
1208
|
-
let {
|
|
1209
|
-
target
|
|
1210
|
-
} = _ref4;
|
|
1211
|
-
ON_QUICK_EDIT_CALLS.push(target);
|
|
1212
|
-
};
|
|
1213
|
-
const {
|
|
1214
|
-
container
|
|
1215
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCardValidationContext.default, {
|
|
1216
|
-
entryId: "id",
|
|
1217
|
-
topLevelErrors: [],
|
|
1218
|
-
clearTopLevelErrorsForCard: () => {},
|
|
1219
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1220
|
-
id: ID,
|
|
1221
|
-
entryData: {
|
|
1222
|
-
index: 0,
|
|
1223
|
-
id: '0',
|
|
1224
|
-
isDuplicate: true
|
|
1225
|
-
},
|
|
1226
|
-
config: CONFIG,
|
|
1227
|
-
parentCollectionName: "parents",
|
|
1228
|
-
onQuickEdit: ON_QUICK_EDIT,
|
|
1229
|
-
formData: {
|
|
1230
|
-
parents: [{
|
|
1231
|
-
alreadyProvidedField: 'hello'
|
|
1232
|
-
}]
|
|
1233
|
-
},
|
|
1234
|
-
masterPage: {
|
|
1235
|
-
childPages: PAGES
|
|
1236
|
-
}
|
|
1237
|
-
})
|
|
1238
|
-
}), {
|
|
1239
|
-
hooks
|
|
1240
|
-
});
|
|
1241
|
-
const {
|
|
1242
|
-
headerActionDiv
|
|
1243
|
-
} = checkSetup(container);
|
|
1244
|
-
const editButton = headerActionDiv.children[0];
|
|
1245
|
-
_react.fireEvent.click(editButton, {});
|
|
1246
|
-
const quickEdit = container.childNodes[0].childNodes[1];
|
|
1247
|
-
|
|
1248
|
-
// Make a change that will be accepted
|
|
1249
|
-
const component = quickEdit.childNodes[1];
|
|
1250
|
-
const componentInput = component.childNodes[2];
|
|
1251
|
-
_react.fireEvent.change(componentInput, {
|
|
1252
|
-
target: {
|
|
1253
|
-
value: 'new value'
|
|
1254
|
-
}
|
|
1255
|
-
});
|
|
1256
|
-
const quickEditButtons = quickEdit.childNodes[2];
|
|
1257
|
-
const saveButton = quickEditButtons.childNodes[0];
|
|
1258
|
-
await (0, _testUtils.act)(async () => {
|
|
1259
|
-
_react.fireEvent.click(saveButton, {});
|
|
1260
|
-
});
|
|
1261
|
-
expect(ON_QUICK_EDIT_CALLS.length).toEqual(1);
|
|
1262
|
-
// isDuplicate flag should not be present.
|
|
1263
|
-
expect(ON_QUICK_EDIT_CALLS[0].value[0]).toEqual({
|
|
1264
|
-
alreadyProvidedField: 'hello',
|
|
1265
|
-
testText: 'new value'
|
|
1266
|
-
});
|
|
1267
|
-
});
|
|
1268
|
-
});
|
|
1269
|
-
describe('Details prop behavior', () => {
|
|
1270
|
-
it('should render the provided details', () => {
|
|
1271
|
-
const DETAILS = 'Sample details';
|
|
1272
|
-
const CONFIG = {
|
|
1273
|
-
title: 'Title',
|
|
1274
|
-
details: DETAILS
|
|
1275
|
-
};
|
|
1276
|
-
const {
|
|
1277
|
-
container
|
|
1278
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1279
|
-
id: ID,
|
|
1280
|
-
entryData: ENTRY,
|
|
1281
|
-
config: CONFIG,
|
|
1282
|
-
parentCollectionName: "parent",
|
|
1283
|
-
pages: [],
|
|
1284
|
-
formData: {},
|
|
1285
|
-
masterPage: {
|
|
1286
|
-
childPages: []
|
|
1287
|
-
}
|
|
1288
|
-
}));
|
|
1289
|
-
const {
|
|
1290
|
-
headerContentDiv
|
|
1291
|
-
} = checkSetup(container);
|
|
1292
|
-
const headerDetails = headerContentDiv.children[1];
|
|
1293
|
-
expect(headerDetails.tagName).toEqual('DIV');
|
|
1294
|
-
expect(headerDetails.classList).toContain(classes('header-content-detail'));
|
|
1295
|
-
expect(headerDetails.textContent).toEqual(DETAILS);
|
|
1296
|
-
});
|
|
1297
|
-
it('should render conditional details', () => {
|
|
1298
|
-
const CONFIG = {
|
|
1299
|
-
title: 'Title',
|
|
1300
|
-
details: [{
|
|
1301
|
-
text: 'Details A',
|
|
1302
|
-
show_when: [{
|
|
1303
|
-
field: 'field',
|
|
1304
|
-
op: '!=',
|
|
1305
|
-
value: true
|
|
1306
|
-
}]
|
|
1307
|
-
}, {
|
|
1308
|
-
text: 'Details B',
|
|
1309
|
-
show_when: [{
|
|
1310
|
-
field: 'field',
|
|
1311
|
-
op: '=',
|
|
1312
|
-
value: true
|
|
1313
|
-
}]
|
|
1314
|
-
}]
|
|
1315
|
-
};
|
|
1316
|
-
const {
|
|
1317
|
-
container
|
|
1318
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1319
|
-
id: ID,
|
|
1320
|
-
entryData: _objectSpread(_objectSpread({}, ENTRY), {}, {
|
|
1321
|
-
field: true
|
|
1322
|
-
}),
|
|
1323
|
-
config: CONFIG,
|
|
1324
|
-
parentCollectionName: "parent",
|
|
1325
|
-
pages: [],
|
|
1326
|
-
formData: {},
|
|
1327
|
-
masterPage: {
|
|
1328
|
-
childPages: []
|
|
1329
|
-
}
|
|
1330
|
-
}));
|
|
1331
|
-
const {
|
|
1332
|
-
headerContentDiv
|
|
1333
|
-
} = checkSetup(container);
|
|
1334
|
-
const headerDetails = headerContentDiv.children[1];
|
|
1335
|
-
expect(headerDetails.tagName).toEqual('DIV');
|
|
1336
|
-
expect(headerDetails.classList).toContain(classes('header-content-detail'));
|
|
1337
|
-
expect(headerDetails.textContent).toEqual('Details B');
|
|
1338
|
-
});
|
|
1339
|
-
it('should not render details when they are empty', () => {
|
|
1340
|
-
const CONFIG = {
|
|
1341
|
-
title: 'Title',
|
|
1342
|
-
details: ''
|
|
1343
|
-
};
|
|
1344
|
-
const {
|
|
1345
|
-
container
|
|
1346
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1347
|
-
id: ID,
|
|
1348
|
-
entryData: ENTRY,
|
|
1349
|
-
config: CONFIG,
|
|
1350
|
-
parentCollectionName: "parent",
|
|
1351
|
-
pages: [],
|
|
1352
|
-
formData: {},
|
|
1353
|
-
masterPage: {
|
|
1354
|
-
childPages: []
|
|
1355
|
-
}
|
|
1356
|
-
}));
|
|
1357
|
-
const {
|
|
1358
|
-
headerContentDiv
|
|
1359
|
-
} = checkSetup(container);
|
|
1360
|
-
// If no details are provided, we expect only the header title to be rendered.
|
|
1361
|
-
expect(headerContentDiv.children.length).toEqual(1);
|
|
1362
|
-
const headerTitle = headerContentDiv.children[0];
|
|
1363
|
-
expect(headerTitle.classList).toContain(classes('header-content-title'));
|
|
1364
|
-
});
|
|
1365
|
-
it('should render the interpolated details', () => {
|
|
1366
|
-
const DETAILS = 'Full {label}';
|
|
1367
|
-
const INTERPOLATED_ENTRY = _objectSpread(_objectSpread({}, ENTRY), {}, {
|
|
1368
|
-
label: 'Details'
|
|
1369
|
-
});
|
|
1370
|
-
const CONFIG = {
|
|
1371
|
-
title: 'Title',
|
|
1372
|
-
details: DETAILS
|
|
1373
|
-
};
|
|
1374
|
-
const {
|
|
1375
|
-
container
|
|
1376
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1377
|
-
id: ID,
|
|
1378
|
-
entryData: INTERPOLATED_ENTRY,
|
|
1379
|
-
config: CONFIG,
|
|
1380
|
-
parentCollectionName: "parent",
|
|
1381
|
-
pages: [],
|
|
1382
|
-
formData: {},
|
|
1383
|
-
masterPage: {
|
|
1384
|
-
childPages: []
|
|
1385
|
-
}
|
|
1386
|
-
}));
|
|
1387
|
-
const {
|
|
1388
|
-
headerContentDiv
|
|
1389
|
-
} = checkSetup(container);
|
|
1390
|
-
const headerDetails = headerContentDiv.children[1];
|
|
1391
|
-
const expectedInterpolatedString = _copReactComponents.Utils.interpolateString(DETAILS, INTERPOLATED_ENTRY);
|
|
1392
|
-
expect(headerDetails.textContent).toEqual(expectedInterpolatedString);
|
|
1393
|
-
});
|
|
1394
|
-
it('should not render the details div if config.details is not provided', () => {
|
|
1395
|
-
const CONFIG = {
|
|
1396
|
-
title: 'Title'
|
|
1397
|
-
};
|
|
1398
|
-
const {
|
|
1399
|
-
container
|
|
1400
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1401
|
-
id: ID,
|
|
1402
|
-
entryData: ENTRY,
|
|
1403
|
-
config: CONFIG,
|
|
1404
|
-
parentCollectionName: "parent",
|
|
1405
|
-
pages: [],
|
|
1406
|
-
formData: {},
|
|
1407
|
-
masterPage: {
|
|
1408
|
-
childPages: []
|
|
1409
|
-
}
|
|
1410
|
-
}));
|
|
1411
|
-
const {
|
|
1412
|
-
headerContentDiv
|
|
1413
|
-
} = checkSetup(container);
|
|
1414
|
-
const headerDetails = headerContentDiv.querySelector("#".concat(ID, ".titleDetail"));
|
|
1415
|
-
expect(headerDetails).toBeNull();
|
|
1416
|
-
});
|
|
1417
|
-
it('should not render the entire details section when hideDetails prop is true', () => {
|
|
1418
|
-
const DETAILS = 'Sample details that should not be displayed';
|
|
1419
|
-
const CONFIG = {
|
|
1420
|
-
title: 'Title',
|
|
1421
|
-
details: DETAILS
|
|
1422
|
-
};
|
|
1423
|
-
const {
|
|
1424
|
-
container
|
|
1425
|
-
} = (0, _setupTests.renderWithValidation)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_SummaryCard.default, {
|
|
1426
|
-
id: ID,
|
|
1427
|
-
entryData: ENTRY,
|
|
1428
|
-
config: CONFIG,
|
|
1429
|
-
parentCollectionName: "parent",
|
|
1430
|
-
pages: [],
|
|
1431
|
-
formData: {},
|
|
1432
|
-
hideDetails: true,
|
|
1433
|
-
masterPage: {
|
|
1434
|
-
childPages: []
|
|
1435
|
-
}
|
|
1436
|
-
}));
|
|
1437
|
-
const detailsComponent = container.querySelector('.details');
|
|
1438
|
-
expect(detailsComponent).toBeNull();
|
|
1439
|
-
});
|
|
1440
|
-
});
|
|
1441
|
-
});
|
|
1442
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX3JlYWN0MiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29wUmVhY3RDb21wb25lbnRzIiwiX3Rlc3RVdGlscyIsIl9zZXR1cFRlc3RzIiwiX1N1bW1hcnlDYXJkIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfQmFubmVyU3RyaXAiLCJfU3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dCIsIl9qc3hSdW50aW1lIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl90b1Byb3BlcnR5S2V5IiwidmFsdWUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiZGVzY3JpYmUiLCJjbGFzc2VzIiwiVXRpbHMiLCJjbGFzc0J1aWxkZXIiLCJERUZBVUxUX0NMQVNTIiwiSUQiLCJFTlRSWSIsImlkIiwiYmFubmVyVGV4dCIsInRpdGxlVGV4dCIsImRldGFpbHNUZXh0IiwiaW5kZXgiLCJzdW1tYXJ5VGV4dCIsImNoZWNrU2V0dXAiLCJjb250YWluZXIiLCJjYXJkRGl2IiwiY2hpbGRyZW4iLCJleHBlY3QiLCJ0YWdOYW1lIiwidG9FcXVhbCIsImNsYXNzTGlzdCIsInRvQ29udGFpbiIsImhlYWRlckRpdiIsImhlYWRlckNvbnRlbnREaXYiLCJoZWFkZXJBY3Rpb25EaXYiLCJjbGFzc05hbWUiLCJib2R5RGl2IiwiaXQiLCJDT05GSUciLCJiYW5uZXJzIiwidGl0bGUiLCJkZXRhaWxzIiwicmVuZGVyV2l0aFZhbGlkYXRpb24iLCJqc3giLCJlbnRyeURhdGEiLCJjb25maWciLCJwYXJlbnRDb2xsZWN0aW9uTmFtZSIsImZvcm1EYXRhIiwibWFzdGVyUGFnZSIsImNoaWxkUGFnZXMiLCJoZWFkZXJCYW5uZXJzIiwiREVGQVVMVF9CQU5ORVJfQ0xBU1MiLCJoZWFkZXJUaXRsZSIsInRleHRDb250ZW50IiwiaGVhZGVyRGV0YWlscyIsImNvbmNhdCIsInNob3dfd2hlbiIsImZpZWxkIiwib3AiLCJDVVNUT01fRU5UUlkiLCJ0ZXN0RmllbGQiLCJvbkNoYW5nZUFyZ3MiLCJvbkNoYW5nZUNhbGxzIiwiT05fQ0hBTkdFIiwicGFnZSIsImJlZm9yZUVhY2giLCJjaGFuZ2VBY3Rpb24iLCJsYWJlbCIsImFyaWFfbGFiZWwiLCJ0ZXh0Iiwib25GdWxsRWRpdCIsImNoYW5nZUJ1dHRvbiIsIm5hbWUiLCJnZXRBdHRyaWJ1dGUiLCJmaXJlRXZlbnQiLCJjbGljayIsInRvTWF0Y2hPYmplY3QiLCJERUZBVUxUX0NIQU5HRV9CVVRUT05fTEFCRUwiLCJvbkNoYW5nZSIsIm9uRGVsZXRlQXJncyIsIm9uRGVsZXRlQ2FsbHMiLCJPTl9ERUxFVEUiLCJlbnRyeSIsImRlbGV0ZUFjdGlvbiIsIm9uRGVsZXRlIiwiZGVsZXRlQnV0dG9uIiwiREVGQVVMVF9ERUxFVEVfQlVUVE9OX0xBQkVMIiwiZGV0YWlsc1NlY3Rpb24iLCJxdWVyeVNlbGVjdG9yIiwibm90IiwidG9CZU51bGwiLCJvbkR1cGxpY2F0ZUFyZ3MiLCJvbkR1cGxpY2F0ZUNhbGxzIiwiT05fRFVQTElDQVRFIiwiZHVwbGljYXRlQWN0aW9uIiwib25EdXBsaWNhdGUiLCJkdXBsaWNhdGVCdXR0b24iLCJERUZBVUxUX0RVUExJQ0FURV9CVVRUT05fTEFCRUwiLCJpc0R1cGxpY2F0ZSIsImplc3QiLCJmbiIsImdldEJ5VGVzdElkIiwicGFnZXMiLCJoaWRlRGV0YWlscyIsInVwZGF0ZWRDb25maWciLCJmb2N1c09uIiwicXVpY2tFZGl0IiwiZ2V0QnlUZXN0SWRSZXJlbmRlciIsImluaXRpYWxDb21wb25lbnQiLCJ0b0JlSW5UaGVEb2N1bWVudCIsInRvSGF2ZUZvY3VzIiwiRHVwbGljYXRlZENvbXBvbmVudCIsIlBBR0VTIiwiY29tcG9uZW50cyIsInR5cGUiLCJmaWVsZElkIiwicmVxdWlyZWQiLCJ1c2UiLCJjeWFfbGFiZWwiLCJmdWxsX3BhdGgiLCJzdW1tYXJ5UXVpY2tFZGl0IiwicGFyZW50cyIsInRlc3RUZXh0IiwidGVzdFRleHQyIiwiZWRpdEJ1dHRvbiIsImNoaWxkTm9kZXMiLCJxdWlja0VkaXRCdXR0b25zIiwic2F2ZUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsImN1c3RvbV9lcnJvcnMiLCJtZXNzYWdlIiwiVE9QX0xFVkVMX0VSUk9SUyIsImVudHJ5SWQiLCJlcnJvciIsInRvcExldmVsRXJyb3JzIiwiZXJyb3JTdW1tYXJ5Iiwib25RdWlja0VkaXQiLCJjb21wb25lbnQiLCJjb21wb25lbnRJbnB1dCIsImFjdCIsImNoYW5nZSIsInRhcmdldCIsIk9OX1NVQk1JVF9DQUxMUyIsImhvb2tzIiwib25TdWJtaXQiLCJwYXRjaCIsIk9OX1FVSUNLX0VESVRfQ0FMTFMiLCJPTl9RVUlDS19FRElUIiwiX3JlZiIsIm5vdFJlcXVpcmVkIiwib25FcnJvciIsIl9yZWYyIiwiYWxyZWFkeVByb3ZpZGVkRmllbGQiLCJfcmVmMyIsImNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkIiwiX3JlZjQiLCJERVRBSUxTIiwiSU5URVJQT0xBVEVEX0VOVFJZIiwiZXhwZWN0ZWRJbnRlcnBvbGF0ZWRTdHJpbmciLCJpbnRlcnBvbGF0ZVN0cmluZyIsImRldGFpbHNDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9Db2xsZWN0aW9uU3VtbWFyeS9TdW1tYXJ5Q2FyZC50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdsb2JhbCBpbXBvcnRzLlxuaW1wb3J0IHsgZmlyZUV2ZW50IH0gZnJvbSAnQHRlc3RpbmctbGlicmFyeS9yZWFjdCc7XG5pbXBvcnQgJ0B0ZXN0aW5nLWxpYnJhcnkvamVzdC1kb20vZXh0ZW5kLWV4cGVjdCc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICdAdWtob21lb2ZmaWNlL2NvcC1yZWFjdC1jb21wb25lbnRzJztcbmltcG9ydCB7IGFjdCB9IGZyb20gJ3JlYWN0LWRvbS90ZXN0LXV0aWxzJztcblxuLy8gTG9jYWwgaW1wb3J0cy5cbmltcG9ydCB7IHJlbmRlcldpdGhWYWxpZGF0aW9uIH0gZnJvbSAnLi4vLi4vc2V0dXBUZXN0cyc7XG5pbXBvcnQgU3VtbWFyeUNhcmQsIHtcbiAgREVGQVVMVF9DTEFTUyxcbiAgREVGQVVMVF9DSEFOR0VfQlVUVE9OX0xBQkVMLFxuICBERUZBVUxUX0RFTEVURV9CVVRUT05fTEFCRUwsXG4gIERFRkFVTFRfRFVQTElDQVRFX0JVVFRPTl9MQUJFTFxufSBmcm9tIFwiLi9TdW1tYXJ5Q2FyZFwiO1xuaW1wb3J0IHsgREVGQVVMVF9DTEFTUyBhcyBERUZBVUxUX0JBTk5FUl9DTEFTUyB9IGZyb20gJy4vQmFubmVyU3RyaXAnO1xuaW1wb3J0IFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBmcm9tICcuL1N1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHQnO1xuXG5kZXNjcmliZSgnY29tcG9uZW50cy5Db2xsZWN0aW9uU3VtbWFyeS5TdW1tYXJ5Q2FyZCcsICgpID0+IHtcblxuICBjb25zdCBjbGFzc2VzID0gVXRpbHMuY2xhc3NCdWlsZGVyKERFRkFVTFRfQ0xBU1MsIFtdLCAnJyk7XG4gIGNvbnN0IElEID0gJ3N1bW1hcnlDYXJkSWQnO1xuICBjb25zdCBFTlRSWSA9IHtcbiAgICBpZDogJzAwMScsXG4gICAgYmFubmVyVGV4dDogJ0EgYmFubmVyJyxcbiAgICB0aXRsZVRleHQ6ICdBIHRpdGxlJyxcbiAgICBkZXRhaWxzVGV4dDogJ1NvbWUgZGV0YWlscycsXG4gICAgaW5kZXg6IDAsXG4gICAgc3VtbWFyeVRleHQ6ICdGdWxsIGRldGFpbHMnXG4gIH07XG5cbiAgY29uc3QgY2hlY2tTZXR1cCA9IChjb250YWluZXIpID0+IHtcbiAgICBjb25zdCBjYXJkRGl2ID0gY29udGFpbmVyLmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChjYXJkRGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChjYXJkRGl2LmNsYXNzTGlzdCkudG9Db250YWluKERFRkFVTFRfQ0xBU1MpO1xuICAgIGNvbnN0IGhlYWRlckRpdiA9IGNhcmREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlckRpdi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICBleHBlY3QoaGVhZGVyRGl2LmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlcicpKTtcbiAgICBjb25zdCBoZWFkZXJDb250ZW50RGl2ID0gaGVhZGVyRGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50JykpO1xuICAgIGNvbnN0IGhlYWRlckFjdGlvbkRpdiA9IGhlYWRlckRpdi5jaGlsZHJlblsxXTtcbiAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2xhc3NOYW1lKS50b0NvbnRhaW4oY2xhc3NlcygnaGVhZGVyLWFjdGlvbnMnKSk7XG4gICAgY29uc3QgYm9keURpdiA9IGNhcmREaXYuY2hpbGRyZW5bMV07XG4gICAgZXhwZWN0KGJvZHlEaXYudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgZXhwZWN0KGJvZHlEaXYuY2xhc3NMaXN0KS50b0NvbnRhaW4oY2xhc3NlcygnYm9keScpKTtcbiAgICByZXR1cm4geyBjYXJkRGl2LCBoZWFkZXJEaXYsIGhlYWRlckNvbnRlbnREaXYsIGhlYWRlckFjdGlvbkRpdiwgYm9keURpdiB9O1xuICB9O1xuXG4gIGl0KCdzaG91bGQgY29ycmVjdGx5IHJlbmRlciBhIFN1bW1hcnlDYXJkIGNvbXBvbmVudCcsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBiYW5uZXJzOiBbXG4gICAgICAgICdBbHBoYScsICdCcmF2bydcbiAgICAgIF0sXG4gICAgICB0aXRsZTogJ1RpdGxlIHRleHQnLFxuICAgICAgZGV0YWlsczogJ0RldGFpbCB0ZXh0J1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgZXhwZWN0KGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDMpO1xuXG4gICAgY29uc3QgaGVhZGVyQmFubmVycyA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlckJhbm5lcnMudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgZXhwZWN0KGhlYWRlckJhbm5lcnMuY2xhc3NMaXN0KS50b0NvbnRhaW4oREVGQVVMVF9CQU5ORVJfQ0xBU1MpO1xuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzJdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZGV0YWlscyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHJlbmRlciBhIGJhbm5lciBpZiBub25lIGFyZSBzdXBwbGllZCcsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogJ1RpdGxlIHRleHQnLFxuICAgICAgZGV0YWlsczogJ0RldGFpbCB0ZXh0J1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgZXhwZWN0KGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDIpO1xuXG4gICAgLy8gVGhlIG9ubHkgdHdvIGNoaWxkcmVuIG9mIHRoZSBjb250ZW50IGRpdiBzaG91bGQgYmUgdGhlIHRpdGxlXG4gICAgLy8gYW5kIHRoZSBkZXRhaWxzLlxuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZGV0YWlscyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbm90IHJlbmRlciBkZXRhaWxzIGlmIG5vbmUgYXJlIHN1cHBsaWVkJywgKCkgPT4ge1xuICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgIGJhbm5lcnM6IFtcbiAgICAgICAgJ0FscGhhJywgJ0JyYXZvJ1xuICAgICAgXSxcbiAgICAgIHRpdGxlOiAnVGl0bGUgdGV4dCdcbiAgICB9O1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICApO1xuICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgyKTtcblxuICAgIGNvbnN0IGhlYWRlckJhbm5lcnMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJCYW5uZXJzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJCYW5uZXJzLmNsYXNzTGlzdCkudG9Db250YWluKERFRkFVTFRfQkFOTkVSX0NMQVNTKTtcblxuICAgIC8vIFRoZSBvbmx5IHR3byBjaGlsZHJlbiBvZiB0aGUgY29udGVudCBkaXYgc2hvdWxkIGJlIHRoZSBiYW5uZXIgYW5kXG4gICAgLy8gdGhlIHRpdGxlLlxuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoQ09ORklHLnRpdGxlKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgaW50ZXJwb2xhdGUgdGhlIHRpdGxlJywgKCkgPT4ge1xuICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmdcbiAgICAgIHRpdGxlOiAnJHt0aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkJ1xuICAgIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICk7XG4gICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBoZWFkZXJUaXRsZSA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMF07XG4gICAgZXhwZWN0KGhlYWRlclRpdGxlLnRhZ05hbWUpLnRvRXF1YWwoJ0gyJyk7XG4gICAgZXhwZWN0KGhlYWRlclRpdGxlLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LXRpdGxlJykpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50ZXh0Q29udGVudCkudG9FcXVhbChgJHtFTlRSWS50aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkYCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2hvdyB0aGUgY29ycmVjdCBjb25kaXRpb25hbCB0aXRsZScsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogW1xuICAgICAgICB7XG4gICAgICAgICAgdGl0bGU6ICdUaXRsZSBBJyxcbiAgICAgICAgICBzaG93X3doZW46IHtcbiAgICAgICAgICAgIGZpZWxkOiAndGVzdEZpZWxkJyxcbiAgICAgICAgICAgIG9wOiAnPScsXG4gICAgICAgICAgICB2YWx1ZTogJzEyMydcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZ1xuICAgICAgICAgIHRpdGxlOiAnJHt0aXRsZVRleHR9IHRoYXQgaXMgaW50ZXJwb2xhdGVkJyxcbiAgICAgICAgICBzaG93X3doZW46IHtcbiAgICAgICAgICAgIGZpZWxkOiAndGVzdEZpZWxkJyxcbiAgICAgICAgICAgIG9wOiAnPScsXG4gICAgICAgICAgICB2YWx1ZTogJzQ1NidcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBDVVNUT01fRU5UUlkgPSB7IC4uLkVOVFJZLCB0ZXN0RmllbGQ6ICc0NTYnIH07XG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtDVVNUT01fRU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICApO1xuICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgY29uc3QgaGVhZGVyVGl0bGUgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzBdO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS50YWdOYW1lKS50b0VxdWFsKCdIMicpO1xuICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICBleHBlY3QoaGVhZGVyVGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoYCR7RU5UUlkudGl0bGVUZXh0fSB0aGF0IGlzIGludGVycG9sYXRlZGApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBpbnRlcnBvbGF0ZSB0aGUgZGV0YWlscycsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmdcbiAgICAgIGRldGFpbHM6ICcke2RldGFpbHNUZXh0fSB0aGF0IGFyZSBpbnRlcnBvbGF0ZWQnXG4gICAgfTtcbiAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgKTtcbiAgICBjb25zdCB7IGhlYWRlckNvbnRlbnREaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcblxuICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChgJHtFTlRSWS5kZXRhaWxzVGV4dH0gdGhhdCBhcmUgaW50ZXJwb2xhdGVkYCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDaGFuZ2UgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcbiAgICBsZXQgb25DaGFuZ2VBcmdzID0gW107XG4gICAgbGV0IG9uQ2hhbmdlQ2FsbHMgPSAwO1xuICAgIGNvbnN0IE9OX0NIQU5HRSA9IChwYWdlLCBpZCkgPT4ge1xuICAgICAgb25DaGFuZ2VBcmdzLnB1c2goeyBwYWdlLCBpZCB9KTtcbiAgICAgIG9uQ2hhbmdlQ2FsbHMgKz0gMTtcbiAgICB9O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBvbkNoYW5nZUFyZ3MgPSBbXTtcbiAgICAgIG9uQ2hhbmdlQ2FsbHMgPSAwO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICBjaGFuZ2VBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0NoYW5nZSBsYWJlbCcsXG4gICAgICAgICAgcGFnZTogJ3Rlc3RQYWdlJyxcbiAgICAgICAgICBhcmlhX2xhYmVsOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6ICd0ZXN0VGV4dCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IG9uRnVsbEVkaXQ9e09OX0NIQU5HRX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19Lz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGNoYW5nZUJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24ubmFtZSkudG9FcXVhbCgnQ2hhbmdlJyk7XG4gICAgICBleHBlY3QoY2hhbmdlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGNoYW5nZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuY2hhbmdlQWN0aW9uLmxhYmVsKTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykpLnRvRXF1YWwoQ09ORklHLmNoYW5nZUFjdGlvbi5hcmlhX2xhYmVsWzBdLnRleHQpO1xuXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY2hhbmdlQnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3Qob25DaGFuZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChvbkNoYW5nZUFyZ3NbMF0pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwYWdlOiBDT05GSUcuY2hhbmdlQWN0aW9uLnBhZ2UsXG4gICAgICAgIGlkOiBFTlRSWS5pZFxuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgY2hhbmdlQWN0aW9uOiB7XG4gICAgICAgICAgcGFnZTogJ3Rlc3RQYWdlJ1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBvbkZ1bGxFZGl0PXtPTl9DSEFOR0V9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgY29uc3QgY2hhbmdlQnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGNoYW5nZUJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChjaGFuZ2VCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoREVGQVVMVF9DSEFOR0VfQlVUVE9OX0xBQkVMKTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbm8gY29uZmlnIGlzIHByb3ZpZGVkIGZvciBpdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXt7fX0gb25DaGFuZ2U9e09OX0NIQU5HRX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBvbkNoYW5nZSBpcyBub3Qgc3VwcGxpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGNoYW5nZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnQ2hhbmdlIGxhYmVsJyxcbiAgICAgICAgICBwYWdlOiAndGVzdFBhZ2UnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG5cbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnRGVsZXRlIGFjdGlvbiBidXR0b24nLCAoKSA9PiB7XG5cbiAgICBsZXQgb25EZWxldGVBcmdzID0gW107XG4gICAgbGV0IG9uRGVsZXRlQ2FsbHMgPSAwO1xuICAgIGNvbnN0IE9OX0RFTEVURSA9IChlbnRyeSkgPT4ge1xuICAgICAgb25EZWxldGVBcmdzLnB1c2goZW50cnkpO1xuICAgICAgb25EZWxldGVDYWxscyArPSAxO1xuICAgIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIG9uRGVsZXRlQXJncyA9IFtdO1xuICAgICAgb25EZWxldGVDYWxscyA9IDA7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGRlbGV0ZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIGxhYmVsJyxcbiAgICAgICAgICBhcmlhX2xhYmVsOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRleHQ6ICd0ZXN0VGV4dCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IG9uRGVsZXRlPXtPTl9ERUxFVEV9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgY29uc3QgZGVsZXRlQnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi5uYW1lKS50b0VxdWFsKCdEZWxldGUnKTtcbiAgICAgIGV4cGVjdChkZWxldGVCdXR0b24udGFnTmFtZSkudG9FcXVhbCgnQlVUVE9OJyk7XG4gICAgICBleHBlY3QoZGVsZXRlQnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKENPTkZJRy5kZWxldGVBY3Rpb24ubGFiZWwpO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSkudG9FcXVhbChDT05GSUcuZGVsZXRlQWN0aW9uLmFyaWFfbGFiZWxbMF0udGV4dCk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhkZWxldGVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChvbkRlbGV0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgICAgZXhwZWN0KG9uRGVsZXRlQXJnc1swXSkudG9NYXRjaE9iamVjdChFTlRSWSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZGVsZXRlQWN0aW9uOiB7fVxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gb25EZWxldGU9e09OX0RFTEVURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZGVsZXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGRlbGV0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChERUZBVUxUX0RFTEVURV9CVVRUT05fTEFCRUwpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBubyBjb25maWcgaXMgcHJvdmlkZWQgZm9yIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e3t9fSBvbkRlbGV0ZT17T05fREVMRVRFfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB3aGVuIG9uRGVsZXRlIGlzIG5vdCBzdXBwbGllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZGVsZXRlQWN0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdEZWxldGUgbGFiZWwnLFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSByZW5kZXIgdGhlIERldGFpbHMgc2VjdGlvbiB3aXRoIGVudHJ5IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIGRlbGV0ZUFjdGlvbjoge1xuICAgICAgICAgIGxhYmVsOiAnRGVsZXRlIGxhYmVsJyxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRldGFpbHNTZWN0aW9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5kZXRhaWxzJyk7XG4gICAgICBleHBlY3QoZGV0YWlsc1NlY3Rpb24pLm5vdC50b0JlTnVsbCgpO1xuICAgICAgZXhwZWN0KGRldGFpbHNTZWN0aW9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oRU5UUlkuc3VtbWFyeVRleHQpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdEdXBsaWNhdGUgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcblxuICAgIGxldCBvbkR1cGxpY2F0ZUFyZ3MgPSBbXTtcbiAgICBsZXQgb25EdXBsaWNhdGVDYWxscyA9IDA7XG4gICAgY29uc3QgT05fRFVQTElDQVRFID0gKGVudHJ5KSA9PiB7XG4gICAgICBvbkR1cGxpY2F0ZUFyZ3MucHVzaChlbnRyeSk7XG4gICAgICBvbkR1cGxpY2F0ZUNhbGxzICs9IDE7XG4gICAgfTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgb25EdXBsaWNhdGVBcmdzID0gW107XG4gICAgICBvbkR1cGxpY2F0ZUNhbGxzID0gMDtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZHVwbGljYXRlQWN0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgbGFiZWwnLFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBvbkR1cGxpY2F0ZT17T05fRFVQTElDQVRFfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGNvbnN0IGR1cGxpY2F0ZUJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChkdXBsaWNhdGVCdXR0b24ubmFtZSkudG9FcXVhbCgnRHVwbGljYXRlJyk7XG4gICAgICBleHBlY3QoZHVwbGljYXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGR1cGxpY2F0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChDT05GSUcuZHVwbGljYXRlQWN0aW9uLmxhYmVsKTtcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGR1cGxpY2F0ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KG9uRHVwbGljYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3Qob25EdXBsaWNhdGVBcmdzWzBdKS50b01hdGNoT2JqZWN0KEVOVFJZKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHRoZSBkZWZhdWx0IGxhYmVsIHdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgZHVwbGljYXRlQWN0aW9uOiB7fVxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gb25EdXBsaWNhdGU9e09OX0RVUExJQ0FURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICBjb25zdCBkdXBsaWNhdGVCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZHVwbGljYXRlQnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGR1cGxpY2F0ZUJ1dHRvbi50ZXh0Q29udGVudCkudG9FcXVhbChERUZBVUxUX0RVUExJQ0FURV9CVVRUT05fTEFCRUwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gbm8gY29uZmlnIGlzIHByb3ZpZGVkIGZvciBpdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXt7fX0gb25EdXBsaWNhdGU9e09OX0RVUExJQ0FURX0gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHdoZW4gb25EdXBsaWNhdGUgaXMgbm90IHN1cHBsaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICBkdXBsaWNhdGVBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBsYWJlbCcsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZvY3VzIG9uIHRoZSBtb3N0IHJlY2VudGx5IGR1cGxpY2F0ZWQgaXRlbScsICgpID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5RGF0YSA9IHsgaWQ6IElELCBpc0R1cGxpY2F0ZTogdHJ1ZSB9O1xuICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICBkdXBsaWNhdGVBY3Rpb246IHtcbiAgICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBMYWJlbCcsXG4gICAgICAgICAgYXJpYV9sYWJlbDogJ0R1cGxpY2F0ZSBBcmlhIExhYmVsJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3Qgb25EdXBsaWNhdGUgPSBqZXN0LmZuKCk7XG5cbiAgICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICBpZD17SUR9XG4gICAgICAgICAgZW50cnlEYXRhPXtlbnRyeURhdGF9XG4gICAgICAgICAgY29uZmlnPXtjb25maWd9XG4gICAgICAgICAgb25EdXBsaWNhdGU9e29uRHVwbGljYXRlfVxuICAgICAgICAgIHBhcmVudENvbGxlY3Rpb25OYW1lPVwicGFyZW50XCJcbiAgICAgICAgICBwYWdlcz17W119XG4gICAgICAgICAgZm9ybURhdGE9e3t9fVxuICAgICAgICAgIGhpZGVEZXRhaWxzXG4gICAgICAgICAgbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fVxuICAgICAgICAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcbiAgICAgICAgZm9jdXNPbjogdHJ1ZSxcbiAgICAgICAgcXVpY2tFZGl0OiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgLy8gUmVyZW5kZXIgdGhlIGNvbXBvbmVudCB3aXRoIHVwZGF0ZWQgY29uZmlnXG4gICAgICBjb25zdCB7IGdldEJ5VGVzdElkOiBnZXRCeVRlc3RJZFJlcmVuZGVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17ZW50cnlEYXRhfVxuICAgICAgICAgIGNvbmZpZz17dXBkYXRlZENvbmZpZ31cbiAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT1cInBhcmVudFwiXG4gICAgICAgICAgcGFnZXM9e1tdfVxuICAgICAgICAgIGZvcm1EYXRhPXt7fX1cbiAgICAgICAgICBoaWRlRGV0YWlsc1xuICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG5cbiAgICAgIC8vIGNoZWNrIHRoYXQgZm9jdXMgaXNuJ3Qgb24gdGhlIGluaXRpYWwgY29tcG9uZW50XG4gICAgICBjb25zdCBpbml0aWFsQ29tcG9uZW50ID0gZ2V0QnlUZXN0SWQoJ2R1cGxpY2F0ZS1idXR0b24nKVxuICAgICAgZXhwZWN0KGluaXRpYWxDb21wb25lbnQpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICBleHBlY3QoaW5pdGlhbENvbXBvbmVudCkubm90LnRvSGF2ZUZvY3VzKCk7XG5cbiAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGZvY3VzIGlzIG9uIHRoZSBuZXdseSBkdXBsaWNhdGVkIGNvbXBvbmVudFxuICAgICAgY29uc3QgRHVwbGljYXRlZENvbXBvbmVudCA9IGdldEJ5VGVzdElkUmVyZW5kZXIoJ3F1aWNrZWRpdC1idXR0b24nKTtcbiAgICAgIGV4cGVjdChEdXBsaWNhdGVkQ29tcG9uZW50KS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KER1cGxpY2F0ZWRDb21wb25lbnQpLnRvSGF2ZUZvY3VzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgZGVzY3JpYmUoJ1F1aWNrIEVkaXQgYWN0aW9uIGJ1dHRvbicsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBxdWlja0VkaXQ6IHt9LFxuICAgIH07XG5cbiAgICBjb25zdCBQQUdFUyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdwYXJlbnRQYWdlJyxcbiAgICAgICAgbmFtZTogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmaWVsZElkOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB1c2U6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBjeWFfbGFiZWw6ICdUZXN0IHRleHQnLFxuICAgICAgICAgICAgZnVsbF9wYXRoOiAndGVzdFRleHQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTY5NTAzNzU3OTE1MCcsXG4gICAgICAgICAgICAgIHRlc3RUZXh0OiAndGVzdGVyJyxcbiAgICAgICAgICAgICAgdGVzdFRleHQyOiAndGVzdCB0ZXN0JyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMSk7XG5cbiAgICAgIC8vIFNob3dzIGVkaXQgYnV0dG9uIGJ1dCBubyBxdWljayBlZGl0XG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24ubmFtZSkudG9FcXVhbCgnUXVpY2tFZGl0Jyk7XG4gICAgICBleHBlY3QoZWRpdEJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdRdWljayBFZGl0Jyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFF1aWNrIGVkaXQgaGlkZGVuXG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMyk7IC8vIFF1aWNrIGVkaXQgc2hvd25cbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QocXVpY2tFZGl0LnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1Rlc3QgdGV4dCcpO1xuXG4gICAgICAvLyBxdWljayBlZGl0IGhhcyBwcm9wZXIgYnV0dG9uc1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGV4cGVjdChjYW5jZWxCdXR0b24udGV4dENvbnRlbnQpLnRvQ29udGFpbignQ2FuY2VsJyk7XG5cbiAgICAgIC8vIGhpZGVzIHF1aWNrIGVkaXQgYWdhaW4gYWRmdGVyIGNsaWNraW5nIGNhbmNlbFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbEJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBRdWljayBlZGl0IGhpZGRlblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZW5kZXIgd2hlbiBubyBjb25maWcgaXMgcHJvdmlkZWQgZm9yIGl0JywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e3t9fSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1F1aWNrIEVkaXQgZXJyb3JzJywgKCkgPT4ge1xuXG4gICAgY29uc3QgQ1VTVE9NX0VOVFJZID0ge1xuICAgICAgaWQ6ICcxMjMnLFxuICAgICAgdGVzdFRleHQ6ICd2YWx1ZSdcbiAgICB9O1xuXG4gICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgcXVpY2tFZGl0OiB7fVxuICAgIH07XG5cbiAgICBjb25zdCBQQUdFUyA9IFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdwYXJlbnRQYWdlJyxcbiAgICAgICAgbmFtZTogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICBsYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmaWVsZElkOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB1c2U6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBjeWFfbGFiZWw6ICdUZXN0IHRleHQnLFxuICAgICAgICAgICAgZnVsbF9wYXRoOiAndGVzdFRleHQnLFxuICAgICAgICAgICAgY3VzdG9tX2Vycm9yczogW3tcbiAgICAgICAgICAgICAgdHlwZTogJ3JlcXVpcmVkJyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ0N1c3RvbSBlcnJvciBtZXNzYWdlJ1xuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTIzJyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cbiAgICBpdCgnc2hvdWxkIGluaXRhbGx5IHNob3cgZXJyb3JzIHBhc3NlZCBpbiBmcm9tIHRvcC1sZXZlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IFRPUF9MRVZFTF9FUlJPUlMgPSBbe1xuICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgZW50cnlJZDogJzEyMycsXG4gICAgICAgIGVycm9yOiAndG9wLWxldmVsIGVycm9yIG1lc3NhZ2UnXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBlbnRyeUlkPXtDVVNUT01fRU5UUlkuaWR9IHRvcExldmVsRXJyb3JzPXtUT1BfTEVWRUxfRVJST1JTfSA+XG4gICAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtDVVNUT01fRU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAvLyBTaG93cyBlZGl0IGJ1dHRvbiBidXQgbm8gcXVpY2sgZWRpdFxuICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1F1aWNrIEVkaXQnKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgyKTsgLy8gUXVpY2sgZWRpdCBoaWRkZW5cblxuICAgICAgLy8gc2hvd3MgcXVpY2tlZGl0IG9uY2UgY2xpY2tlZFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8gUXVpY2sgZWRpdCBzaG93blxuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChxdWlja0VkaXQudGV4dENvbnRlbnQpLnRvQ29udGFpbignVGVzdCB0ZXh0Jyk7XG5cbiAgICAgIC8vIHF1aWNrIGVkaXQgaXMgc2hvd2luZyB0b3AtbGV2ZWwgZXJyb3JcbiAgICAgIGNvbnN0IGVycm9yU3VtbWFyeSA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGVycm9yU3VtbWFyeS50ZXh0Q29udGVudCkudG9Db250YWluKFRPUF9MRVZFTF9FUlJPUlNbMF0uZXJyb3IpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG9ubHkgc2hvdyBlcnJvcnMgZnJvbSB2YWxpZGF0aW9uIHdoZW4gaXQgaGFwcGVucywgaWdub3JpbmcgdG9wLWxldmVsIGVycm9ycycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IFRPUF9MRVZFTF9FUlJPUlMgPSBbe1xuICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgZW50cnlJZDogJzEyMycsXG4gICAgICAgIGVycm9yOiAndG9wLWxldmVsIGVycm9yIG1lc3NhZ2UnXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlciBlbnRyeUlkPXtDVVNUT01fRU5UUlkuaWR9IHRvcExldmVsRXJyb3JzPXtUT1BfTEVWRUxfRVJST1JTfSA+XG4gICAgICAgICAgPFN1bW1hcnlDYXJkIFxuICAgICAgICAgICAgaWQ9e0lEfSBcbiAgICAgICAgICAgIGVudHJ5RGF0YT17Q1VTVE9NX0VOVFJZfSBcbiAgICAgICAgICAgIGNvbmZpZz17Q09ORklHfSBcbiAgICAgICAgICAgIHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIFxuICAgICAgICAgICAgZm9ybURhdGE9e3t9fSBcbiAgICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX0gXG4gICAgICAgICAgICBvblF1aWNrRWRpdD17KCkgPT4ge319XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGV4cGVjdChoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW4ubGVuZ3RoKS50b0VxdWFsKDEpO1xuXG4gICAgICAvLyBTaG93cyBlZGl0IGJ1dHRvbiBidXQgbm8gcXVpY2sgZWRpdFxuICAgICAgY29uc3QgZWRpdEJ1dHRvbiA9IGhlYWRlckFjdGlvbkRpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRhZ05hbWUpLnRvRXF1YWwoJ0JVVFRPTicpO1xuICAgICAgZXhwZWN0KGVkaXRCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1F1aWNrIEVkaXQnKTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgyKTsgLy8gUXVpY2sgZWRpdCBoaWRkZW5cblxuICAgICAgLy8gc2hvd3MgcXVpY2tlZGl0IG9uY2UgY2xpY2tlZFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgzKTsgLy8gUXVpY2sgZWRpdCBzaG93blxuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChxdWlja0VkaXQudGV4dENvbnRlbnQpLnRvQ29udGFpbignVGVzdCB0ZXh0Jyk7XG5cbiAgICAgIC8vIHF1aWNrIGVkaXQgaXMgaW5pdGlhbGx5IHNob3dpbmcgdG9wLWxldmVsIGVycm9yXG4gICAgICBjb25zdCBlcnJvclN1bW1hcnkgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChlcnJvclN1bW1hcnkudGV4dENvbnRlbnQpLnRvQ29udGFpbihUT1BfTEVWRUxfRVJST1JTWzBdLmVycm9yKTtcblxuICAgICAgLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVxdWlyZWQgdGV4dCBjb21wb25lbnRcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3QgY29tcG9uZW50SW5wdXQgPSBjb21wb25lbnQuY2hpbGROb2Rlc1szXTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZpcmVFdmVudC5jaGFuZ2UoY29tcG9uZW50SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnJyB9IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGNsaWNrICdzYXZlJyB0byB0cmlnZ2VyIHZhbGlkYXRpb24sIHdoaWNoIHdpbGwgZmFpbCBhcyB0aGUgY29tcG9uZW50XG4gICAgICAvLyBjbGVhcmVkIGFib3ZlIGlzIG1hcmtlZCBhcyAncmVxdWlyZWQnLlxuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzNdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIGZpcmVFdmVudC5jbGljayhzYXZlQnV0dG9uLCB7fSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gcXVpY2sgZWRpdCBzaG91bGQgbm93IGJlIHNob3dpbmcgdGhlIGVycm9ycyBmcm9tIHZhbGlkYXRpb25cbiAgICAgIGV4cGVjdChlcnJvclN1bW1hcnkudGV4dENvbnRlbnQpLnRvQ29udGFpbignQ3VzdG9tIGVycm9yIG1lc3NhZ2UnKTtcbiAgICAgIFxuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdRdWljayBFZGl0IHNhdmUgY2hhbmdlcycsICgpID0+IHtcbiAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICBxdWlja0VkaXQ6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0IFBBR0VTID0gW1xuICAgICAge1xuICAgICAgICBpZDogJ3BhcmVudFBhZ2UnLFxuICAgICAgICBuYW1lOiAncGFyZW50UGFnZScsXG4gICAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3Rlc3RUZXh0JyxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIGxhYmVsOiAnVGVzdCB0ZXh0JyxcbiAgICAgICAgICAgIGZpZWxkSWQ6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIHVzZTogJ3Rlc3RUZXh0JyxcbiAgICAgICAgICAgIGN5YV9sYWJlbDogJ1Rlc3QgdGV4dCcsXG4gICAgICAgICAgICBmdWxsX3BhdGg6ICd0ZXN0VGV4dCcsXG4gICAgICAgICAgICBcImFkZGl0aW9uYWxWYWxpZGF0aW9uXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIjogXCJtdXN0QmVMb25nZXJUaGFuXCIsXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAzLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlcnJvcidcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHN1bW1hcnlRdWlja0VkaXQ6IFtcbiAgICAgICAgICBcInRlc3RUZXh0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICBwYXJlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnMTY5NTAzNzU3OTE1MCcsXG4gICAgICAgICAgICAgIHRlc3RUZXh0OiAndGVzdGVyJyxcbiAgICAgICAgICAgICAgdGVzdFRleHQyOiAndGVzdCB0ZXN0JyxcbiAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG5cblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBQQUdFUyB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcblxuICAgICAgLy8gU2hvd3MgZWRpdCBidXR0b24gYnV0IG5vIHF1aWNrIGVkaXRcbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBleHBlY3QoZWRpdEJ1dHRvbi50YWdOYW1lKS50b0VxdWFsKCdCVVRUT04nKTtcbiAgICAgIGV4cGVjdChlZGl0QnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdRdWljayBFZGl0Jyk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFF1aWNrIGVkaXQgaGlkZGVuXG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMyk7IC8vIFF1aWNrIGVkaXQgc2hvd25cbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QocXVpY2tFZGl0LnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1Rlc3QgdGV4dCcpO1xuXG4gICAgICAvLyBxdWljayBlZGl0IGhhcyBwcm9wZXIgYnV0dG9uc1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChzYXZlQnV0dG9uLnRleHRDb250ZW50KS50b0NvbnRhaW4oJ1NhdmUnKTtcbiAgICAgIGV4cGVjdChjYW5jZWxCdXR0b24udGV4dENvbnRlbnQpLnRvQ29udGFpbignQ2FuY2VsJyk7XG5cbiAgICAgIC8vIGhpZGVzIHF1aWNrIGVkaXQgYWdhaW4gYWRmdGVyIGNsaWNraW5nIGNhbmNlbFxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbEJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBRdWljayBlZGl0IGhpZGRlblxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSBvciBzYXZlIGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnIGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBQQUdFUyB9fSAvPixcbiAgICAgICAgeyBob29rcyB9XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJBY3Rpb25EaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcblxuICAgICAgLy8gU2hvd3MgZWRpdCBidXR0b24gYnV0IG5vIHF1aWNrIGVkaXRcbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG5cbiAgICAgIC8vIHNob3dzIHF1aWNrZWRpdCBvbmNlIGNsaWNrZWRcbiAgICAgIGZpcmVFdmVudC5jbGljayhlZGl0QnV0dG9uLCB7fSk7XG4gICAgICBjb25zdCBxdWlja0VkaXQgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuXG4gICAgICBjb25zdCBxdWlja0VkaXRCdXR0b25zID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBzYXZlQnV0dG9uID0gcXVpY2tFZGl0QnV0dG9ucy5jaGlsZE5vZGVzWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYWZ0ZXIgbG9jYWwgdmFsaWRhdGlvbiBpZiBlcnJvcnMgYXJlIHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17eyAuLi5FTlRSWSwgaW5kZXg6IDAgfX1cbiAgICAgICAgICBjb25maWc9e0NPTkZJR31cbiAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50cydcbiAgICAgICAgICBvblF1aWNrRWRpdD17T05fUVVJQ0tfRURJVH1cbiAgICAgICAgICBmb3JtRGF0YT17eyBwYXJlbnRzOiBbeyB0ZXN0VGV4dDogJ2hlbGxvJyB9XSB9fVxuICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX1cbiAgICAgICAgLz4sXG4gICAgICAgIHsgaG9va3MgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQWN0aW9uRGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG5cbiAgICAgIGNvbnN0IGVkaXRCdXR0b24gPSBoZWFkZXJBY3Rpb25EaXYuY2hpbGRyZW5bMF07XG4gICAgICBmaXJlRXZlbnQuY2xpY2soZWRpdEJ1dHRvbiwge30pO1xuICAgICAgY29uc3QgcXVpY2tFZGl0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgY29uc3QgY29tcG9uZW50ID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMV07XG4gICAgICBjb25zdCBjb21wb25lbnRJbnB1dCA9IGNvbXBvbmVudC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3QgcXVpY2tFZGl0QnV0dG9ucyA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzJdO1xuICAgICAgY29uc3Qgc2F2ZUJ1dHRvbiA9IHF1aWNrRWRpdEJ1dHRvbnMuY2hpbGROb2Rlc1swXTtcbiAgICAgIC8vIEZpZWxkIGhhcyB2YWxpZGF0aW9uIHRvIGZvcmNlIHRoZSBsZW5ndGggb2YgdGhpcyBmaWVsZCB0byBiZSBncmVhdGVyIHRoYW4gMiBzbyB0aGlzIHNob3VsZCBmYWlsXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ2EnIH0gfSk7XG4gICAgICB9KVxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJ1biBob29rIHZhbGlkYXRpb24gd2hlbiBsb2NhbCB2YWxpZGF0aW9uIGlzIHBhc3NlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgaG9va3MgPSB7XG4gICAgICAgIG9uU3VibWl0OiAodHlwZSwgcGF0Y2gsIG5vdFJlcXVpcmVkLCBvbkVycm9yKSA9PiB7XG4gICAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF0Y2gpO1xuICAgICAgICAgIG9uRXJyb3IoW3sgZXJyb3I6ICdtZXNzYWdlJywgaWQ6ICcwJyB9XSk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkXG4gICAgICAgICAgaWQ9e0lEfVxuICAgICAgICAgIGVudHJ5RGF0YT17RU5UUll9XG4gICAgICAgICAgY29uZmlnPXtDT05GSUd9XG4gICAgICAgICAgcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnXG4gICAgICAgICAgb25RdWlja0VkaXQ9e09OX1FVSUNLX0VESVR9XG4gICAgICAgICAgZm9ybURhdGE9e3sgcGFyZW50czogW3sgYWxyZWFkeVByb3ZpZGVkRmllbGQ6ICdoZWxsbycgfV0gfX1cbiAgICAgICAgICBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFBBR0VTIH19XG4gICAgICAgIC8+LFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2VcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHF1aWNrRWRpdC5jaGlsZE5vZGVzWzFdO1xuICAgICAgY29uc3QgY29tcG9uZW50SW5wdXQgPSBjb21wb25lbnQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoY29tcG9uZW50SW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAnbmV3IHZhbHVlJyB9IH0pO1xuXG4gICAgICBjb25zdCBxdWlja0VkaXRCdXR0b25zID0gcXVpY2tFZGl0LmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBzYXZlQnV0dG9uID0gcXVpY2tFZGl0QnV0dG9ucy5jaGlsZE5vZGVzWzBdO1xuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgZmlyZUV2ZW50LmNsaWNrKHNhdmVCdXR0b24sIHt9KTtcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXSkudG9NYXRjaE9iamVjdCh7IHRlc3RUZXh0OiAnbmV3IHZhbHVlJyB9KTtcbiAgICAgIGV4cGVjdChPTl9RVUlDS19FRElUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXBwbHkgY2hhbmdlcyBpZiBubyBlcnJvcnMgYXJlIHByZXNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dFByb3ZpZGVyXG4gICAgICAgICAgZW50cnlJZD0naWQnXG4gICAgICAgICAgdG9wTGV2ZWxFcnJvcnM9e1tdfVxuICAgICAgICAgIGNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkPSB7KCkgPT4ge319XG4gICAgICAgID5cbiAgICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICAgIGlkPXtJRH1cbiAgICAgICAgICAgIGVudHJ5RGF0YT17eyBpbmRleDogMCwgaWQ6ICcwJyB9fVxuICAgICAgICAgICAgY29uZmlnPXtDT05GSUd9XG4gICAgICAgICAgICBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50cydcbiAgICAgICAgICAgIG9uUXVpY2tFZGl0PXtPTl9RVUlDS19FRElUfVxuICAgICAgICAgICAgZm9ybURhdGE9e3sgcGFyZW50czogW3sgYWxyZWFkeVByb3ZpZGVkRmllbGQ6ICdoZWxsbycgfV0gfX1cbiAgICAgICAgICAgIG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogUEFHRVMgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1N1bW1hcnlDYXJkVmFsaWRhdGlvbkNvbnRleHRQcm92aWRlcj5cbiAgICAgICAgLFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFjY2VwdGVkXG4gICAgICBjb25zdCBjb21wb25lbnQgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudElucHV0ID0gY29tcG9uZW50LmNoaWxkTm9kZXNbMl07XG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ25ldyB2YWx1ZScgfSB9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdEJ1dHRvbnMgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBxdWlja0VkaXRCdXR0b25zLmNoaWxkTm9kZXNbMF07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2xpY2soc2F2ZUJ1dHRvbiwge30pO1xuICAgICAgfSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMU1swXS52YWx1ZVswXSkudG9FcXVhbCh7IGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nLCB0ZXN0VGV4dDogJ25ldyB2YWx1ZScgfSk7ICBcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIHRoZSBpc0R1cGxpY2F0ZSBmbGFnIG9uIGEgc3VjZXNzZnVsIHF1aWNrIGVkaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IGhvb2tzID0ge1xuICAgICAgICBvblN1Ym1pdDogKHR5cGUsIHBhdGNoKSA9PiBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXRjaCksXG4gICAgICB9O1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUVVJQ0tfRURJVCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgICAgIE9OX1FVSUNLX0VESVRfQ0FMTFMucHVzaCh0YXJnZXQpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmRWYWxpZGF0aW9uQ29udGV4dFByb3ZpZGVyXG4gICAgICAgICAgZW50cnlJZD0naWQnXG4gICAgICAgICAgdG9wTGV2ZWxFcnJvcnM9e1tdfVxuICAgICAgICAgIGNsZWFyVG9wTGV2ZWxFcnJvcnNGb3JDYXJkPXsoKSA9PiB7IH19XG4gICAgICAgID5cbiAgICAgICAgICA8U3VtbWFyeUNhcmRcbiAgICAgICAgICAgIGlkPXtJRH1cbiAgICAgICAgICAgIGVudHJ5RGF0YT17eyBpbmRleDogMCwgaWQ6ICcwJywgaXNEdXBsaWNhdGU6IHRydWUgfX1cbiAgICAgICAgICAgIGNvbmZpZz17Q09ORklHfVxuICAgICAgICAgICAgcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudHMnXG4gICAgICAgICAgICBvblF1aWNrRWRpdD17T05fUVVJQ0tfRURJVH1cbiAgICAgICAgICAgIGZvcm1EYXRhPXt7IHBhcmVudHM6IFt7IGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nIH1dIH19XG4gICAgICAgICAgICBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFBBR0VTIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdW1tYXJ5Q2FyZFZhbGlkYXRpb25Db250ZXh0UHJvdmlkZXI+LFxuICAgICAgICB7IGhvb2tzIH1cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckFjdGlvbkRpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuXG4gICAgICBjb25zdCBlZGl0QnV0dG9uID0gaGVhZGVyQWN0aW9uRGl2LmNoaWxkcmVuWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGVkaXRCdXR0b24sIHt9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIE1ha2UgYSBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFjY2VwdGVkXG4gICAgICBjb25zdCBjb21wb25lbnQgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1sxXTtcbiAgICAgIGNvbnN0IGNvbXBvbmVudElucHV0ID0gY29tcG9uZW50LmNoaWxkTm9kZXNbMl07XG4gICAgICBmaXJlRXZlbnQuY2hhbmdlKGNvbXBvbmVudElucHV0LCB7IHRhcmdldDogeyB2YWx1ZTogJ25ldyB2YWx1ZScgfSB9KTtcbiAgICAgIGNvbnN0IHF1aWNrRWRpdEJ1dHRvbnMgPSBxdWlja0VkaXQuY2hpbGROb2Rlc1syXTtcbiAgICAgIGNvbnN0IHNhdmVCdXR0b24gPSBxdWlja0VkaXRCdXR0b25zLmNoaWxkTm9kZXNbMF07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICBmaXJlRXZlbnQuY2xpY2soc2F2ZUJ1dHRvbiwge30pO1xuICAgICAgfSk7XG4gICAgICBleHBlY3QoT05fUVVJQ0tfRURJVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICAvLyBpc0R1cGxpY2F0ZSBmbGFnIHNob3VsZCBub3QgYmUgcHJlc2VudC5cbiAgICAgIGV4cGVjdChPTl9RVUlDS19FRElUX0NBTExTWzBdLnZhbHVlWzBdKS50b0VxdWFsKHsgXG4gICAgICAgIGFscmVhZHlQcm92aWRlZEZpZWxkOiAnaGVsbG8nLCBcbiAgICAgICAgdGVzdFRleHQ6ICduZXcgdmFsdWUnIFxuICAgICAgfSk7ICBcbiAgICB9KTtcblxuICB9KTtcbiAgZGVzY3JpYmUoJ0RldGFpbHMgcHJvcCBiZWhhdmlvcicsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHRoZSBwcm92aWRlZCBkZXRhaWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgREVUQUlMUyA9ICdTYW1wbGUgZGV0YWlscyc7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBERVRBSUxTXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0VOVFJZfSBjb25maWc9e0NPTkZJR30gcGFyZW50Q29sbGVjdGlvbk5hbWU9J3BhcmVudCcgcGFnZXM9e1tdfSBmb3JtRGF0YT17e319IG1hc3RlclBhZ2U9e3sgY2hpbGRQYWdlczogW10gfX0gLz5cbiAgICAgICk7XG4gICAgICBjb25zdCB7IGhlYWRlckNvbnRlbnREaXYgfSA9IGNoZWNrU2V0dXAoY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGhlYWRlckRldGFpbHMgPSBoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuWzFdO1xuICAgICAgZXhwZWN0KGhlYWRlckRldGFpbHMudGFnTmFtZSkudG9FcXVhbCgnRElWJyk7XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC1kZXRhaWwnKSk7XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50ZXh0Q29udGVudCkudG9FcXVhbChERVRBSUxTKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGNvbmRpdGlvbmFsIGRldGFpbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogJ0RldGFpbHMgQScsXG4gICAgICAgICAgICBzaG93X3doZW46IFt7IFxuICAgICAgICAgICAgICBmaWVsZDogJ2ZpZWxkJyxcbiAgICAgICAgICAgICAgb3A6ICchPScsXG4gICAgICAgICAgICAgIHZhbHVlOiB0cnVlXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogJ0RldGFpbHMgQicsXG4gICAgICAgICAgICBzaG93X3doZW46IFt7IFxuICAgICAgICAgICAgICBmaWVsZDogJ2ZpZWxkJyxcbiAgICAgICAgICAgICAgb3A6ICc9JyxcbiAgICAgICAgICAgICAgdmFsdWU6IHRydWVcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e3sgLi4uRU5UUlksIGZpZWxkOiB0cnVlIH19IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBwYWdlcz17W119IGZvcm1EYXRhPXt7fX0gbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgaGVhZGVyQ29udGVudERpdiB9ID0gY2hlY2tTZXR1cChjb250YWluZXIpO1xuICAgICAgY29uc3QgaGVhZGVyRGV0YWlscyA9IGhlYWRlckNvbnRlbnREaXYuY2hpbGRyZW5bMV07XG4gICAgICBleHBlY3QoaGVhZGVyRGV0YWlscy50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLmNsYXNzTGlzdCkudG9Db250YWluKGNsYXNzZXMoJ2hlYWRlci1jb250ZW50LWRldGFpbCcpKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRleHRDb250ZW50KS50b0VxdWFsKCdEZXRhaWxzIEInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciBkZXRhaWxzIHdoZW4gdGhleSBhcmUgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiAnJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICAvLyBJZiBubyBkZXRhaWxzIGFyZSBwcm92aWRlZCwgd2UgZXhwZWN0IG9ubHkgdGhlIGhlYWRlciB0aXRsZSB0byBiZSByZW5kZXJlZC5cbiAgICAgIGV4cGVjdChoZWFkZXJDb250ZW50RGl2LmNoaWxkcmVuLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGNvbnN0IGhlYWRlclRpdGxlID0gaGVhZGVyQ29udGVudERpdi5jaGlsZHJlblswXTtcbiAgICAgIGV4cGVjdChoZWFkZXJUaXRsZS5jbGFzc0xpc3QpLnRvQ29udGFpbihjbGFzc2VzKCdoZWFkZXItY29udGVudC10aXRsZScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIHRoZSBpbnRlcnBvbGF0ZWQgZGV0YWlscycsICgpID0+IHtcbiAgICAgIGNvbnN0IERFVEFJTFMgPSAnRnVsbCB7bGFiZWx9JztcbiAgICAgIGNvbnN0IElOVEVSUE9MQVRFRF9FTlRSWSA9IHtcbiAgICAgICAgLi4uRU5UUlksXG4gICAgICAgIGxhYmVsOiAnRGV0YWlscydcbiAgICAgIH07XG4gICAgICBjb25zdCBDT05GSUcgPSB7XG4gICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICBkZXRhaWxzOiBERVRBSUxTXG4gICAgICB9O1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcldpdGhWYWxpZGF0aW9uKFxuICAgICAgICA8U3VtbWFyeUNhcmQgaWQ9e0lEfSBlbnRyeURhdGE9e0lOVEVSUE9MQVRFRF9FTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBoZWFkZXJEZXRhaWxzID0gaGVhZGVyQ29udGVudERpdi5jaGlsZHJlblsxXTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkSW50ZXJwb2xhdGVkU3RyaW5nID0gVXRpbHMuaW50ZXJwb2xhdGVTdHJpbmcoREVUQUlMUywgSU5URVJQT0xBVEVEX0VOVFJZKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzLnRleHRDb250ZW50KS50b0VxdWFsKGV4cGVjdGVkSW50ZXJwb2xhdGVkU3RyaW5nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJlbmRlciB0aGUgZGV0YWlscyBkaXYgaWYgY29uZmlnLmRldGFpbHMgaXMgbm90IHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORklHID0ge1xuICAgICAgICB0aXRsZTogJ1RpdGxlJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXJXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgPFN1bW1hcnlDYXJkIGlkPXtJRH0gZW50cnlEYXRhPXtFTlRSWX0gY29uZmlnPXtDT05GSUd9IHBhcmVudENvbGxlY3Rpb25OYW1lPSdwYXJlbnQnIHBhZ2VzPXtbXX0gZm9ybURhdGE9e3t9fSBtYXN0ZXJQYWdlPXt7IGNoaWxkUGFnZXM6IFtdIH19IC8+XG4gICAgICApO1xuICAgICAgY29uc3QgeyBoZWFkZXJDb250ZW50RGl2IH0gPSBjaGVja1NldHVwKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBoZWFkZXJEZXRhaWxzID0gaGVhZGVyQ29udGVudERpdi5xdWVyeVNlbGVjdG9yKGAjJHtJRH0udGl0bGVEZXRhaWxgKTtcbiAgICAgIGV4cGVjdChoZWFkZXJEZXRhaWxzKS50b0JlTnVsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmVuZGVyIHRoZSBlbnRpcmUgZGV0YWlscyBzZWN0aW9uIHdoZW4gaGlkZURldGFpbHMgcHJvcCBpcyB0cnVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgREVUQUlMUyA9ICdTYW1wbGUgZGV0YWlscyB0aGF0IHNob3VsZCBub3QgYmUgZGlzcGxheWVkJztcbiAgICAgIGNvbnN0IENPTkZJRyA9IHtcbiAgICAgICAgdGl0bGU6ICdUaXRsZScsXG4gICAgICAgIGRldGFpbHM6IERFVEFJTFNcbiAgICAgIH07XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyV2l0aFZhbGlkYXRpb24oXG4gICAgICAgIDxTdW1tYXJ5Q2FyZCBpZD17SUR9IGVudHJ5RGF0YT17RU5UUll9IGNvbmZpZz17Q09ORklHfSBwYXJlbnRDb2xsZWN0aW9uTmFtZT0ncGFyZW50JyBwYWdlcz17W119IGZvcm1EYXRhPXt7fX0gaGlkZURldGFpbHMgbWFzdGVyUGFnZT17eyBjaGlsZFBhZ2VzOiBbXSB9fSAvPlxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGV0YWlsc0NvbXBvbmVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuZGV0YWlscycpO1xuICAgICAgZXhwZWN0KGRldGFpbHNDb21wb25lbnQpLnRvQmVOdWxsKCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUNBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBQSxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsbUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUdBLElBQUFLLFdBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFlBQUEsR0FBQUMsdUJBQUEsQ0FBQVAsT0FBQTtBQU1BLElBQUFRLFlBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLDZCQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFBa0YsSUFBQVUsV0FBQSxHQUFBVixPQUFBO0FBQUEsU0FBQU8sd0JBQUFJLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFOLHVCQUFBLFlBQUFBLENBQUFJLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFNLENBQUEsQ0FBQU8sR0FBQSxDQUFBYixDQUFBLEVBQUFRLENBQUEsZ0JBQUFQLENBQUEsSUFBQUQsQ0FBQSxnQkFBQUMsQ0FBQSxPQUFBYSxjQUFBLENBQUFDLElBQUEsQ0FBQWYsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsSUFBQUQsQ0FBQSxHQUFBVSxNQUFBLENBQUFDLGNBQUEsS0FBQUQsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBQyxDQUFBLE9BQUFNLENBQUEsQ0FBQUssR0FBQSxJQUFBTCxDQUFBLENBQUFNLEdBQUEsSUFBQVAsQ0FBQSxDQUFBRSxDQUFBLEVBQUFQLENBQUEsRUFBQU0sQ0FBQSxJQUFBQyxDQUFBLENBQUFQLENBQUEsSUFBQUQsQ0FBQSxDQUFBQyxDQUFBLFdBQUFPLENBQUEsS0FBQVIsQ0FBQSxFQUFBQyxDQUFBO0FBQUEsU0FBQVYsdUJBQUFTLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsR0FBQUwsQ0FBQSxLQUFBVSxPQUFBLEVBQUFWLENBQUE7QUFBQSxTQUFBbUIsUUFBQW5CLENBQUEsRUFBQUcsQ0FBQSxRQUFBRixDQUFBLEdBQUFlLE1BQUEsQ0FBQUksSUFBQSxDQUFBcEIsQ0FBQSxPQUFBZ0IsTUFBQSxDQUFBSyxxQkFBQSxRQUFBZixDQUFBLEdBQUFVLE1BQUEsQ0FBQUsscUJBQUEsQ0FBQXJCLENBQUEsR0FBQUcsQ0FBQSxLQUFBRyxDQUFBLEdBQUFBLENBQUEsQ0FBQWdCLE1BQUEsV0FBQW5CLENBQUEsV0FBQWEsTUFBQSxDQUFBRSx3QkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxDQUFBLEVBQUFvQixVQUFBLE9BQUF0QixDQUFBLENBQUF1QixJQUFBLENBQUFDLEtBQUEsQ0FBQXhCLENBQUEsRUFBQUssQ0FBQSxZQUFBTCxDQUFBO0FBQUEsU0FBQXlCLGNBQUExQixDQUFBLGFBQUFHLENBQUEsTUFBQUEsQ0FBQSxHQUFBd0IsU0FBQSxDQUFBQyxNQUFBLEVBQUF6QixDQUFBLFVBQUFGLENBQUEsV0FBQTBCLFNBQUEsQ0FBQXhCLENBQUEsSUFBQXdCLFNBQUEsQ0FBQXhCLENBQUEsUUFBQUEsQ0FBQSxPQUFBZ0IsT0FBQSxDQUFBSCxNQUFBLENBQUFmLENBQUEsT0FBQTRCLE9BQUEsV0FBQTFCLENBQUEsSUFBQTJCLGVBQUEsQ0FBQTlCLENBQUEsRUFBQUcsQ0FBQSxFQUFBRixDQUFBLENBQUFFLENBQUEsU0FBQWEsTUFBQSxDQUFBZSx5QkFBQSxHQUFBZixNQUFBLENBQUFnQixnQkFBQSxDQUFBaEMsQ0FBQSxFQUFBZ0IsTUFBQSxDQUFBZSx5QkFBQSxDQUFBOUIsQ0FBQSxLQUFBa0IsT0FBQSxDQUFBSCxNQUFBLENBQUFmLENBQUEsR0FBQTRCLE9BQUEsV0FBQTFCLENBQUEsSUFBQWEsTUFBQSxDQUFBQyxjQUFBLENBQUFqQixDQUFBLEVBQUFHLENBQUEsRUFBQWEsTUFBQSxDQUFBRSx3QkFBQSxDQUFBakIsQ0FBQSxFQUFBRSxDQUFBLGlCQUFBSCxDQUFBO0FBQUEsU0FBQThCLGdCQUFBOUIsQ0FBQSxFQUFBRyxDQUFBLEVBQUFGLENBQUEsWUFBQUUsQ0FBQSxHQUFBOEIsY0FBQSxDQUFBOUIsQ0FBQSxNQUFBSCxDQUFBLEdBQUFnQixNQUFBLENBQUFDLGNBQUEsQ0FBQWpCLENBQUEsRUFBQUcsQ0FBQSxJQUFBK0IsS0FBQSxFQUFBakMsQ0FBQSxFQUFBc0IsVUFBQSxNQUFBWSxZQUFBLE1BQUFDLFFBQUEsVUFBQXBDLENBQUEsQ0FBQUcsQ0FBQSxJQUFBRixDQUFBLEVBQUFELENBQUE7QUFBQSxTQUFBaUMsZUFBQWhDLENBQUEsUUFBQU0sQ0FBQSxHQUFBOEIsWUFBQSxDQUFBcEMsQ0FBQSx1Q0FBQU0sQ0FBQSxHQUFBQSxDQUFBLEdBQUFBLENBQUE7QUFBQSxTQUFBOEIsYUFBQXBDLENBQUEsRUFBQUUsQ0FBQSwyQkFBQUYsQ0FBQSxLQUFBQSxDQUFBLFNBQUFBLENBQUEsTUFBQUQsQ0FBQSxHQUFBQyxDQUFBLENBQUFxQyxNQUFBLENBQUFDLFdBQUEsa0JBQUF2QyxDQUFBLFFBQUFPLENBQUEsR0FBQVAsQ0FBQSxDQUFBZSxJQUFBLENBQUFkLENBQUEsRUFBQUUsQ0FBQSx1Q0FBQUksQ0FBQSxTQUFBQSxDQUFBLFlBQUFpQyxTQUFBLHlFQUFBckMsQ0FBQSxHQUFBc0MsTUFBQSxHQUFBQyxNQUFBLEVBQUF6QyxDQUFBLEtBaEJsRjtBQU9BO0FBV0EwQyxRQUFRLENBQUMsMENBQTBDLEVBQUUsTUFBTTtFQUV6RCxNQUFNQyxPQUFPLEdBQUdDLHlCQUFLLENBQUNDLFlBQVksQ0FBQ0MsMEJBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ3pELE1BQU1DLEVBQUUsR0FBRyxlQUFlO0VBQzFCLE1BQU1DLEtBQUssR0FBRztJQUNaQyxFQUFFLEVBQUUsS0FBSztJQUNUQyxVQUFVLEVBQUUsVUFBVTtJQUN0QkMsU0FBUyxFQUFFLFNBQVM7SUFDcEJDLFdBQVcsRUFBRSxjQUFjO0lBQzNCQyxLQUFLLEVBQUUsQ0FBQztJQUNSQyxXQUFXLEVBQUU7RUFDZixDQUFDO0VBRUQsTUFBTUMsVUFBVSxHQUFJQyxTQUFTLElBQUs7SUFDaEMsTUFBTUMsT0FBTyxHQUFHRCxTQUFTLENBQUNFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDckNDLE1BQU0sQ0FBQ0YsT0FBTyxDQUFDRyxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN0Q0YsTUFBTSxDQUFDRixPQUFPLENBQUNLLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNqQiwwQkFBYSxDQUFDO0lBQ2xELE1BQU1rQixTQUFTLEdBQUdQLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNyQ0MsTUFBTSxDQUFDSyxTQUFTLENBQUNKLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3hDRixNQUFNLENBQUNLLFNBQVMsQ0FBQ0YsU0FBUyxDQUFDLENBQUNDLFNBQVMsQ0FBQ3BCLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxNQUFNc0IsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ04sUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5Q0MsTUFBTSxDQUFDTSxnQkFBZ0IsQ0FBQ0wsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDL0NGLE1BQU0sQ0FBQ00sZ0JBQWdCLENBQUNILFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN2RSxNQUFNdUIsZUFBZSxHQUFHRixTQUFTLENBQUNOLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDN0NDLE1BQU0sQ0FBQ08sZUFBZSxDQUFDTixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM5Q0YsTUFBTSxDQUFDTyxlQUFlLENBQUNDLFNBQVMsQ0FBQyxDQUFDSixTQUFTLENBQUNwQixPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN0RSxNQUFNeUIsT0FBTyxHQUFHWCxPQUFPLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbkNDLE1BQU0sQ0FBQ1MsT0FBTyxDQUFDUixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN0Q0YsTUFBTSxDQUFDUyxPQUFPLENBQUNOLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTztNQUFFYyxPQUFPO01BQUVPLFNBQVM7TUFBRUMsZ0JBQWdCO01BQUVDLGVBQWU7TUFBRUU7SUFBUSxDQUFDO0VBQzNFLENBQUM7RUFFREMsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLE1BQU07SUFDMUQsTUFBTUMsTUFBTSxHQUFHO01BQ2JDLE9BQU8sRUFBRSxDQUNQLE9BQU8sRUFBRSxPQUFPLENBQ2pCO01BQ0RDLEtBQUssRUFBRSxZQUFZO01BQ25CQyxPQUFPLEVBQUU7SUFDWCxDQUFDO0lBQ0QsTUFBTTtNQUFFakI7SUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO01BQUN3QyxFQUFFLEVBQUVGLEVBQUc7TUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07TUFBQzZCLE1BQU0sRUFBRVAsTUFBTztNQUFDUSxvQkFBb0IsRUFBQyxRQUFRO01BQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7TUFBQ0MsVUFBVSxFQUFFO1FBQUVDLFVBQVUsRUFBRTtNQUFHO0lBQUUsQ0FBRSxDQUN0SSxDQUFDO0lBQ0QsTUFBTTtNQUFFaEI7SUFBaUIsQ0FBQyxHQUFHVixVQUFVLENBQUNDLFNBQVMsQ0FBQztJQUNsREcsTUFBTSxDQUFDTSxnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRW5ELE1BQU1xQixhQUFhLEdBQUdqQixnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsREMsTUFBTSxDQUFDdUIsYUFBYSxDQUFDdEIsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUNGLE1BQU0sQ0FBQ3VCLGFBQWEsQ0FBQ3BCLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNvQiwwQkFBb0IsQ0FBQztJQUUvRCxNQUFNQyxXQUFXLEdBQUduQixnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoREMsTUFBTSxDQUFDeUIsV0FBVyxDQUFDeEIsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDekNGLE1BQU0sQ0FBQ3lCLFdBQVcsQ0FBQ3RCLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN4RWdCLE1BQU0sQ0FBQ3lCLFdBQVcsQ0FBQ0MsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUNTLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDO0lBRXJELE1BQU1jLGFBQWEsR0FBR3JCLGdCQUFnQixDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xEQyxNQUFNLENBQUMyQixhQUFhLENBQUMxQixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1Q0YsTUFBTSxDQUFDMkIsYUFBYSxDQUFDeEIsU0FBUyxDQUFDLENBQUNDLFNBQVMsQ0FBQ3BCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNFZ0IsTUFBTSxDQUFDMkIsYUFBYSxDQUFDRCxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQ1MsTUFBTSxDQUFDRyxPQUFPLENBQUM7RUFDM0QsQ0FBQyxDQUFDO0VBRUZKLEVBQUUsQ0FBQyxpREFBaUQsRUFBRSxNQUFNO0lBQzFELE1BQU1DLE1BQU0sR0FBRztNQUNiRSxLQUFLLEVBQUUsWUFBWTtNQUNuQkMsT0FBTyxFQUFFO0lBQ1gsQ0FBQztJQUNELE1BQU07TUFBRWpCO0lBQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztNQUFDd0MsRUFBRSxFQUFFRixFQUFHO01BQUM2QixTQUFTLEVBQUU1QixLQUFNO01BQUM2QixNQUFNLEVBQUVQLE1BQU87TUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtNQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO01BQUNDLFVBQVUsRUFBRTtRQUFFQyxVQUFVLEVBQUU7TUFBRztJQUFFLENBQUUsQ0FDdEksQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQWlCLENBQUMsR0FBR1YsVUFBVSxDQUFDQyxTQUFTLENBQUM7SUFDbERHLE1BQU0sQ0FBQ00sZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQy9CLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQzs7SUFFbkQ7SUFDQTs7SUFFQSxNQUFNdUIsV0FBVyxHQUFHbkIsZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaERDLE1BQU0sQ0FBQ3lCLFdBQVcsQ0FBQ3hCLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDRixNQUFNLENBQUN5QixXQUFXLENBQUN0QixTQUFTLENBQUMsQ0FBQ0MsU0FBUyxDQUFDcEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEVnQixNQUFNLENBQUN5QixXQUFXLENBQUNDLFdBQVcsQ0FBQyxDQUFDeEIsT0FBTyxDQUFDUyxNQUFNLENBQUNFLEtBQUssQ0FBQztJQUVyRCxNQUFNYyxhQUFhLEdBQUdyQixnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsREMsTUFBTSxDQUFDMkIsYUFBYSxDQUFDMUIsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDNUNGLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ3hCLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMzRWdCLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ0QsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUNTLE1BQU0sQ0FBQ0csT0FBTyxDQUFDO0VBQzNELENBQUMsQ0FBQztFQUVGSixFQUFFLENBQUMsZ0RBQWdELEVBQUUsTUFBTTtJQUN6RCxNQUFNQyxNQUFNLEdBQUc7TUFDYkMsT0FBTyxFQUFFLENBQ1AsT0FBTyxFQUFFLE9BQU8sQ0FDakI7TUFDREMsS0FBSyxFQUFFO0lBQ1QsQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztNQUFDd0MsRUFBRSxFQUFFRixFQUFHO01BQUM2QixTQUFTLEVBQUU1QixLQUFNO01BQUM2QixNQUFNLEVBQUVQLE1BQU87TUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtNQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO01BQUNDLFVBQVUsRUFBRTtRQUFFQyxVQUFVLEVBQUU7TUFBRztJQUFFLENBQUUsQ0FDdEksQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQWlCLENBQUMsR0FBR1YsVUFBVSxDQUFDQyxTQUFTLENBQUM7SUFDbERHLE1BQU0sQ0FBQ00sZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQy9CLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVuRCxNQUFNcUIsYUFBYSxHQUFHakIsZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDbERDLE1BQU0sQ0FBQ3VCLGFBQWEsQ0FBQ3RCLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVDRixNQUFNLENBQUN1QixhQUFhLENBQUNwQixTQUFTLENBQUMsQ0FBQ0MsU0FBUyxDQUFDb0IsMEJBQW9CLENBQUM7O0lBRS9EO0lBQ0E7O0lBRUEsTUFBTUMsV0FBVyxHQUFHbkIsZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaERDLE1BQU0sQ0FBQ3lCLFdBQVcsQ0FBQ3hCLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDRixNQUFNLENBQUN5QixXQUFXLENBQUN0QixTQUFTLENBQUMsQ0FBQ0MsU0FBUyxDQUFDcEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEVnQixNQUFNLENBQUN5QixXQUFXLENBQUNDLFdBQVcsQ0FBQyxDQUFDeEIsT0FBTyxDQUFDUyxNQUFNLENBQUNFLEtBQUssQ0FBQztFQUN2RCxDQUFDLENBQUM7RUFFRkgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLE1BQU07SUFDakQsTUFBTUMsTUFBTSxHQUFHO01BQ2I7TUFDQUUsS0FBSyxFQUFFO0lBQ1QsQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztNQUFDd0MsRUFBRSxFQUFFRixFQUFHO01BQUM2QixTQUFTLEVBQUU1QixLQUFNO01BQUM2QixNQUFNLEVBQUVQLE1BQU87TUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtNQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO01BQUNDLFVBQVUsRUFBRTtRQUFFQyxVQUFVLEVBQUU7TUFBRztJQUFFLENBQUUsQ0FDdEksQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQWlCLENBQUMsR0FBR1YsVUFBVSxDQUFDQyxTQUFTLENBQUM7SUFFbEQsTUFBTTRCLFdBQVcsR0FBR25CLGdCQUFnQixDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hEQyxNQUFNLENBQUN5QixXQUFXLENBQUN4QixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQztJQUN6Q0YsTUFBTSxDQUFDeUIsV0FBVyxDQUFDdEIsU0FBUyxDQUFDLENBQUNDLFNBQVMsQ0FBQ3BCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3hFZ0IsTUFBTSxDQUFDeUIsV0FBVyxDQUFDQyxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sSUFBQTBCLE1BQUEsQ0FBSXZDLEtBQUssQ0FBQ0csU0FBUywwQkFBdUIsQ0FBQztFQUNwRixDQUFDLENBQUM7RUFFRmtCLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxNQUFNO0lBQ3BELE1BQU1DLE1BQU0sR0FBRztNQUNiRSxLQUFLLEVBQUUsQ0FDTDtRQUNFQSxLQUFLLEVBQUUsU0FBUztRQUNoQmdCLFNBQVMsRUFBRTtVQUNUQyxLQUFLLEVBQUUsV0FBVztVQUNsQkMsRUFBRSxFQUFFLEdBQUc7VUFDUHpELEtBQUssRUFBRTtRQUNUO01BQ0YsQ0FBQyxFQUNEO1FBQ0U7UUFDQXVDLEtBQUssRUFBRSxtQ0FBbUM7UUFDMUNnQixTQUFTLEVBQUU7VUFDVEMsS0FBSyxFQUFFLFdBQVc7VUFDbEJDLEVBQUUsRUFBRSxHQUFHO1VBQ1B6RCxLQUFLLEVBQUU7UUFDVDtNQUNGLENBQUM7SUFFTCxDQUFDO0lBQ0QsTUFBTTBELFlBQVksR0FBQWxFLGFBQUEsQ0FBQUEsYUFBQSxLQUFRdUIsS0FBSztNQUFFNEMsU0FBUyxFQUFFO0lBQUssRUFBRTtJQUNuRCxNQUFNO01BQUVwQztJQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7TUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztNQUFDNkIsU0FBUyxFQUFFZSxZQUFhO01BQUNkLE1BQU0sRUFBRVAsTUFBTztNQUFDUSxvQkFBb0IsRUFBQyxRQUFRO01BQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7TUFBQ0MsVUFBVSxFQUFFO1FBQUVDLFVBQVUsRUFBRTtNQUFHO0lBQUUsQ0FBRSxDQUM3SSxDQUFDO0lBQ0QsTUFBTTtNQUFFaEI7SUFBaUIsQ0FBQyxHQUFHVixVQUFVLENBQUNDLFNBQVMsQ0FBQztJQUVsRCxNQUFNNEIsV0FBVyxHQUFHbkIsZ0JBQWdCLENBQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDaERDLE1BQU0sQ0FBQ3lCLFdBQVcsQ0FBQ3hCLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3pDRixNQUFNLENBQUN5QixXQUFXLENBQUN0QixTQUFTLENBQUMsQ0FBQ0MsU0FBUyxDQUFDcEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDeEVnQixNQUFNLENBQUN5QixXQUFXLENBQUNDLFdBQVcsQ0FBQyxDQUFDeEIsT0FBTyxJQUFBMEIsTUFBQSxDQUFJdkMsS0FBSyxDQUFDRyxTQUFTLDBCQUF1QixDQUFDO0VBQ3BGLENBQUMsQ0FBQztFQUVGa0IsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLE1BQU07SUFDbkQsTUFBTUMsTUFBTSxHQUFHO01BQ2JFLEtBQUssRUFBRSxPQUFPO01BQ2Q7TUFDQUMsT0FBTyxFQUFFO0lBQ1gsQ0FBQztJQUNELE1BQU07TUFBRWpCO0lBQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztNQUFDd0MsRUFBRSxFQUFFRixFQUFHO01BQUM2QixTQUFTLEVBQUU1QixLQUFNO01BQUM2QixNQUFNLEVBQUVQLE1BQU87TUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtNQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO01BQUNDLFVBQVUsRUFBRTtRQUFFQyxVQUFVLEVBQUU7TUFBRztJQUFFLENBQUUsQ0FDdEksQ0FBQztJQUNELE1BQU07TUFBRWhCO0lBQWlCLENBQUMsR0FBR1YsVUFBVSxDQUFDQyxTQUFTLENBQUM7SUFFbEQsTUFBTThCLGFBQWEsR0FBR3JCLGdCQUFnQixDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2xEQyxNQUFNLENBQUMyQixhQUFhLENBQUMxQixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1Q0YsTUFBTSxDQUFDMkIsYUFBYSxDQUFDeEIsU0FBUyxDQUFDLENBQUNDLFNBQVMsQ0FBQ3BCLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzNFZ0IsTUFBTSxDQUFDMkIsYUFBYSxDQUFDRCxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sSUFBQTBCLE1BQUEsQ0FBSXZDLEtBQUssQ0FBQ0ksV0FBVywyQkFBd0IsQ0FBQztFQUN6RixDQUFDLENBQUM7RUFFRlYsUUFBUSxDQUFDLHNCQUFzQixFQUFFLE1BQU07SUFDckMsSUFBSW1ELFlBQVksR0FBRyxFQUFFO0lBQ3JCLElBQUlDLGFBQWEsR0FBRyxDQUFDO0lBQ3JCLE1BQU1DLFNBQVMsR0FBR0EsQ0FBQ0MsSUFBSSxFQUFFL0MsRUFBRSxLQUFLO01BQzlCNEMsWUFBWSxDQUFDdEUsSUFBSSxDQUFDO1FBQUV5RSxJQUFJO1FBQUUvQztNQUFHLENBQUMsQ0FBQztNQUMvQjZDLGFBQWEsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFREcsVUFBVSxDQUFDLE1BQU07TUFDZkosWUFBWSxHQUFHLEVBQUU7TUFDakJDLGFBQWEsR0FBRyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGekIsRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU07TUFDbEMsTUFBTUMsTUFBTSxHQUFHO1FBQ2I0QixZQUFZLEVBQUU7VUFDWkMsS0FBSyxFQUFFLGNBQWM7VUFDckJILElBQUksRUFBRSxVQUFVO1VBQ2hCSSxVQUFVLEVBQUUsQ0FDVjtZQUNFQyxJQUFJLEVBQUU7VUFDUixDQUFDO1FBRUw7TUFDRixDQUFDO01BRUQsTUFBTTtRQUFFN0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDZ0MsVUFBVSxFQUFFUCxTQUFVO1FBQUNqQixvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBQyxDQUM1SixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU0wQyxZQUFZLEdBQUdyQyxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDaERDLE1BQU0sQ0FBQzRDLFlBQVksQ0FBQ0MsSUFBSSxDQUFDLENBQUMzQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzNDRixNQUFNLENBQUM0QyxZQUFZLENBQUMzQyxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztNQUM5Q0YsTUFBTSxDQUFDNEMsWUFBWSxDQUFDbEIsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUNTLE1BQU0sQ0FBQzRCLFlBQVksQ0FBQ0MsS0FBSyxDQUFDO01BQ25FeEMsTUFBTSxDQUFDNEMsWUFBWSxDQUFDRSxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzVDLE9BQU8sQ0FBQ1MsTUFBTSxDQUFDNEIsWUFBWSxDQUFDRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBQztNQUUvRkssZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDSixZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDakM1QyxNQUFNLENBQUNtQyxhQUFhLENBQUMsQ0FBQ2pDLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDaENGLE1BQU0sQ0FBQ2tDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDZSxhQUFhLENBQUM7UUFDcENaLElBQUksRUFBRTFCLE1BQU0sQ0FBQzRCLFlBQVksQ0FBQ0YsSUFBSTtRQUM5Qi9DLEVBQUUsRUFBRUQsS0FBSyxDQUFDQztNQUNaLENBQUMsQ0FBQztJQUVKLENBQUMsQ0FBQztJQUVGb0IsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLE1BQU07TUFDaEUsTUFBTUMsTUFBTSxHQUFHO1FBQ2I0QixZQUFZLEVBQUU7VUFDWkYsSUFBSSxFQUFFO1FBQ1I7TUFDRixDQUFDO01BRUQsTUFBTTtRQUFFeEM7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDZ0MsVUFBVSxFQUFFUCxTQUFVO1FBQUNqQixvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUM3SixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU0wQyxZQUFZLEdBQUdyQyxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDaERDLE1BQU0sQ0FBQzRDLFlBQVksQ0FBQzNDLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzlDRixNQUFNLENBQUM0QyxZQUFZLENBQUNsQixXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQ2dELHdDQUEyQixDQUFDO0lBRXZFLENBQUMsQ0FBQztJQUVGeEMsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLE1BQU07TUFDOUQsTUFBTTtRQUFFYjtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztRQUFDNkIsU0FBUyxFQUFFNUIsS0FBTTtRQUFDNkIsTUFBTSxFQUFFLENBQUMsQ0FBRTtRQUFDaUMsUUFBUSxFQUFFZixTQUFVO1FBQUNqQixvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN2SixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsaURBQWlELEVBQUUsTUFBTTtNQUMxRCxNQUFNQyxNQUFNLEdBQUc7UUFDYjRCLFlBQVksRUFBRTtVQUNaQyxLQUFLLEVBQUUsY0FBYztVQUNyQkgsSUFBSSxFQUFFO1FBQ1I7TUFDRixDQUFDO01BQ0QsTUFBTTtRQUFFeEM7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN0SSxDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELENBQUMsQ0FBQztFQUVKLENBQUMsQ0FBQztFQUVGbkIsUUFBUSxDQUFDLHNCQUFzQixFQUFFLE1BQU07SUFFckMsSUFBSXFFLFlBQVksR0FBRyxFQUFFO0lBQ3JCLElBQUlDLGFBQWEsR0FBRyxDQUFDO0lBQ3JCLE1BQU1DLFNBQVMsR0FBSUMsS0FBSyxJQUFLO01BQzNCSCxZQUFZLENBQUN4RixJQUFJLENBQUMyRixLQUFLLENBQUM7TUFDeEJGLGFBQWEsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRGYsVUFBVSxDQUFDLE1BQU07TUFDZmMsWUFBWSxHQUFHLEVBQUU7TUFDakJDLGFBQWEsR0FBRyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGM0MsRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU07TUFDbEMsTUFBTUMsTUFBTSxHQUFHO1FBQ2I2QyxZQUFZLEVBQUU7VUFDWmhCLEtBQUssRUFBRSxjQUFjO1VBQ3JCQyxVQUFVLEVBQUUsQ0FDVjtZQUNFQyxJQUFJLEVBQUU7VUFDUixDQUFDO1FBRUw7TUFDRixDQUFDO01BRUQsTUFBTTtRQUFFN0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDOEMsUUFBUSxFQUFFSCxTQUFVO1FBQUNuQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUMzSixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU13RCxZQUFZLEdBQUduRCxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDaERDLE1BQU0sQ0FBQzBELFlBQVksQ0FBQ2IsSUFBSSxDQUFDLENBQUMzQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzNDRixNQUFNLENBQUMwRCxZQUFZLENBQUN6RCxPQUFPLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLFFBQVEsQ0FBQztNQUM5Q0YsTUFBTSxDQUFDMEQsWUFBWSxDQUFDaEMsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUNTLE1BQU0sQ0FBQzZDLFlBQVksQ0FBQ2hCLEtBQUssQ0FBQztNQUNuRXhDLE1BQU0sQ0FBQzBELFlBQVksQ0FBQ1osWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM1QyxPQUFPLENBQUNTLE1BQU0sQ0FBQzZDLFlBQVksQ0FBQ2YsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUM7TUFFL0ZLLGdCQUFTLENBQUNDLEtBQUssQ0FBQ1UsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ2pDMUQsTUFBTSxDQUFDcUQsYUFBYSxDQUFDLENBQUNuRCxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ2hDRixNQUFNLENBQUNvRCxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0gsYUFBYSxDQUFDNUQsS0FBSyxDQUFDO0lBRTlDLENBQUMsQ0FBQztJQUVGcUIsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLE1BQU07TUFDaEUsTUFBTUMsTUFBTSxHQUFHO1FBQ2I2QyxZQUFZLEVBQUUsQ0FBQztNQUNqQixDQUFDO01BRUQsTUFBTTtRQUFFM0Q7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDOEMsUUFBUSxFQUFFSCxTQUFVO1FBQUNuQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUMzSixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU13RCxZQUFZLEdBQUduRCxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDaERDLE1BQU0sQ0FBQzBELFlBQVksQ0FBQ3pELE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzlDRixNQUFNLENBQUMwRCxZQUFZLENBQUNoQyxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQ3lELHdDQUEyQixDQUFDO0lBRXZFLENBQUMsQ0FBQztJQUVGakQsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLE1BQU07TUFDOUQsTUFBTTtRQUFFYjtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztRQUFDNkIsU0FBUyxFQUFFNUIsS0FBTTtRQUFDNkIsTUFBTSxFQUFFLENBQUMsQ0FBRTtRQUFDdUMsUUFBUSxFQUFFSCxTQUFVO1FBQUNuQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN2SixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsaURBQWlELEVBQUUsTUFBTTtNQUMxRCxNQUFNQyxNQUFNLEdBQUc7UUFDYjZDLFlBQVksRUFBRTtVQUNaaEIsS0FBSyxFQUFFO1FBQ1Q7TUFDRixDQUFDO01BQ0QsTUFBTTtRQUFFM0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN0SSxDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRXBELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsNkRBQTZELEVBQUUsTUFBTTtNQUN0RSxNQUFNQyxNQUFNLEdBQUc7UUFDYjZDLFlBQVksRUFBRTtVQUNaaEIsS0FBSyxFQUFFO1FBQ1Q7TUFDRixDQUFDO01BQ0QsTUFBTTtRQUFFM0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN0SSxDQUFDO01BQ0QsTUFBTXNDLGNBQWMsR0FBRy9ELFNBQVMsQ0FBQ2dFLGFBQWEsQ0FBQyxVQUFVLENBQUM7TUFDMUQ3RCxNQUFNLENBQUM0RCxjQUFjLENBQUMsQ0FBQ0UsR0FBRyxDQUFDQyxRQUFRLENBQUMsQ0FBQztNQUNyQy9ELE1BQU0sQ0FBQzRELGNBQWMsQ0FBQ2xDLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDZixLQUFLLENBQUNNLFdBQVcsQ0FBQztJQUNqRSxDQUFDLENBQUM7RUFFSixDQUFDLENBQUM7RUFFRlosUUFBUSxDQUFDLHlCQUF5QixFQUFFLE1BQU07SUFFeEMsSUFBSWlGLGVBQWUsR0FBRyxFQUFFO0lBQ3hCLElBQUlDLGdCQUFnQixHQUFHLENBQUM7SUFDeEIsTUFBTUMsWUFBWSxHQUFJWCxLQUFLLElBQUs7TUFDOUJTLGVBQWUsQ0FBQ3BHLElBQUksQ0FBQzJGLEtBQUssQ0FBQztNQUMzQlUsZ0JBQWdCLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQzQixVQUFVLENBQUMsTUFBTTtNQUNmMEIsZUFBZSxHQUFHLEVBQUU7TUFDcEJDLGdCQUFnQixHQUFHLENBQUM7SUFDdEIsQ0FBQyxDQUFDO0lBRUZ2RCxFQUFFLENBQUMseUJBQXlCLEVBQUUsTUFBTTtNQUNsQyxNQUFNQyxNQUFNLEdBQUc7UUFDYndELGVBQWUsRUFBRTtVQUNmM0IsS0FBSyxFQUFFO1FBQ1Q7TUFDRixDQUFDO01BRUQsTUFBTTtRQUFFM0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDeUQsV0FBVyxFQUFFRixZQUFhO1FBQUMvQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUNqSyxDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU1tRSxlQUFlLEdBQUc5RCxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDbkRDLE1BQU0sQ0FBQ3FFLGVBQWUsQ0FBQ3hCLElBQUksQ0FBQyxDQUFDM0MsT0FBTyxDQUFDLFdBQVcsQ0FBQztNQUNqREYsTUFBTSxDQUFDcUUsZUFBZSxDQUFDcEUsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxRQUFRLENBQUM7TUFDakRGLE1BQU0sQ0FBQ3FFLGVBQWUsQ0FBQzNDLFdBQVcsQ0FBQyxDQUFDeEIsT0FBTyxDQUFDUyxNQUFNLENBQUN3RCxlQUFlLENBQUMzQixLQUFLLENBQUM7TUFFekVPLGdCQUFTLENBQUNDLEtBQUssQ0FBQ3FCLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNwQ3JFLE1BQU0sQ0FBQ2lFLGdCQUFnQixDQUFDLENBQUMvRCxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQ25DRixNQUFNLENBQUNnRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ2YsYUFBYSxDQUFDNUQsS0FBSyxDQUFDO0lBQ2pELENBQUMsQ0FBQztJQUVGcUIsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLE1BQU07TUFDaEUsTUFBTUMsTUFBTSxHQUFHO1FBQ2J3RCxlQUFlLEVBQUUsQ0FBQztNQUNwQixDQUFDO01BRUQsTUFBTTtRQUFFdEU7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDeUQsV0FBVyxFQUFFRixZQUFhO1FBQUMvQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUNqSyxDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BRWxELE1BQU1tRSxlQUFlLEdBQUc5RCxlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDbkRDLE1BQU0sQ0FBQ3FFLGVBQWUsQ0FBQ3BFLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQ2pERixNQUFNLENBQUNxRSxlQUFlLENBQUMzQyxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQ29FLDJDQUE4QixDQUFDO0lBQzdFLENBQUMsQ0FBQztJQUVGNUQsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLE1BQU07TUFDOUQsTUFBTTtRQUFFYjtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztRQUFDNkIsU0FBUyxFQUFFNUIsS0FBTTtRQUFDNkIsTUFBTSxFQUFFLENBQUMsQ0FBRTtRQUFDa0QsV0FBVyxFQUFFRixZQUFhO1FBQUMvQyxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUM3SixDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsb0RBQW9ELEVBQUUsTUFBTTtNQUM3RCxNQUFNQyxNQUFNLEdBQUc7UUFDYndELGVBQWUsRUFBRTtVQUNmM0IsS0FBSyxFQUFFO1FBQ1Q7TUFDRixDQUFDO01BQ0QsTUFBTTtRQUFFM0M7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUNDLFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUN0SSxDQUFDO01BQ0QsTUFBTTtRQUFFZjtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsbURBQW1ELEVBQUUsTUFBTTtNQUM1RCxNQUFNTyxTQUFTLEdBQUc7UUFBRTNCLEVBQUUsRUFBRUYsRUFBRTtRQUFFbUYsV0FBVyxFQUFFO01BQUssQ0FBQztNQUMvQyxNQUFNckQsTUFBTSxHQUFHO1FBQ2JpRCxlQUFlLEVBQUU7VUFDZjNCLEtBQUssRUFBRSxpQkFBaUI7VUFDeEJDLFVBQVUsRUFBRTtRQUNkO01BQ0YsQ0FBQztNQUNELE1BQU0yQixXQUFXLEdBQUdJLElBQUksQ0FBQ0MsRUFBRSxDQUFDLENBQUM7TUFFN0IsTUFBTTtRQUFFQztNQUFZLENBQUMsR0FBRyxJQUFBM0QsZ0NBQW9CLGVBQzFDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFDVndDLEVBQUUsRUFBRUYsRUFBRztRQUNQNkIsU0FBUyxFQUFFQSxTQUFVO1FBQ3JCQyxNQUFNLEVBQUVBLE1BQU87UUFDZmtELFdBQVcsRUFBRUEsV0FBWTtRQUN6QmpELG9CQUFvQixFQUFDLFFBQVE7UUFDN0J3RCxLQUFLLEVBQUUsRUFBRztRQUNWdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUNid0QsV0FBVztRQUNYdkQsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FDaEMsQ0FDSCxDQUFDO01BRUQsTUFBTXVELGFBQWEsR0FBRztRQUNwQkMsT0FBTyxFQUFFLElBQUk7UUFDYkMsU0FBUyxFQUFFO01BQ2IsQ0FBQzs7TUFFRDtNQUNBLE1BQU07UUFBRUwsV0FBVyxFQUFFTTtNQUFvQixDQUFDLEdBQUcsSUFBQWpFLGdDQUFvQixlQUMvRCxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQ1Z3QyxFQUFFLEVBQUVGLEVBQUc7UUFDUDZCLFNBQVMsRUFBRUEsU0FBVTtRQUNyQkMsTUFBTSxFQUFFMkQsYUFBYztRQUN0QjFELG9CQUFvQixFQUFDLFFBQVE7UUFDN0J3RCxLQUFLLEVBQUUsRUFBRztRQUNWdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUNid0QsV0FBVztRQUNYdkQsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FDaEMsQ0FDSCxDQUFDOztNQUVEO01BQ0EsTUFBTTJELGdCQUFnQixHQUFHUCxXQUFXLENBQUMsa0JBQWtCLENBQUM7TUFDeEQxRSxNQUFNLENBQUNpRixnQkFBZ0IsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQzVDbEYsTUFBTSxDQUFDaUYsZ0JBQWdCLENBQUMsQ0FBQ25CLEdBQUcsQ0FBQ3FCLFdBQVcsQ0FBQyxDQUFDOztNQUUxQztNQUNBLE1BQU1DLG1CQUFtQixHQUFHSixtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztNQUNuRWhGLE1BQU0sQ0FBQ29GLG1CQUFtQixDQUFDLENBQUNGLGlCQUFpQixDQUFDLENBQUM7TUFDL0NsRixNQUFNLENBQUNvRixtQkFBbUIsQ0FBQyxDQUFDRCxXQUFXLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFHRnBHLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxNQUFNO0lBQ3pDLE1BQU00QixNQUFNLEdBQUc7TUFDYm9FLFNBQVMsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU1NLEtBQUssR0FBRyxDQUNaO01BQ0UvRixFQUFFLEVBQUUsWUFBWTtNQUNoQnVELElBQUksRUFBRSxZQUFZO01BQ2xCeUMsVUFBVSxFQUFFLENBQ1Y7UUFDRWhHLEVBQUUsRUFBRSxVQUFVO1FBQ2RpRyxJQUFJLEVBQUUsTUFBTTtRQUNaL0MsS0FBSyxFQUFFLFdBQVc7UUFDbEJnRCxPQUFPLEVBQUUsVUFBVTtRQUNuQkMsUUFBUSxFQUFFLElBQUk7UUFDZEMsR0FBRyxFQUFFLFVBQVU7UUFDZkMsU0FBUyxFQUFFLFdBQVc7UUFDdEJDLFNBQVMsRUFBRTtNQUNiLENBQUMsQ0FDRjtNQUNEQyxnQkFBZ0IsRUFBRSxDQUNoQixVQUFVLENBQ1g7TUFDRHpFLFFBQVEsRUFBRTtRQUNSMEUsT0FBTyxFQUFFLENBQ1A7VUFDRXhHLEVBQUUsRUFBRSxlQUFlO1VBQ25CeUcsUUFBUSxFQUFFLFFBQVE7VUFDbEJDLFNBQVMsRUFBRSxXQUFXO1VBQ3RCdEcsS0FBSyxFQUFFO1FBQ1QsQ0FBQztNQUVMO0lBQ0YsQ0FBQyxDQUNGO0lBRURnQixFQUFFLENBQUMseUJBQXlCLEVBQUUsTUFBTTtNQUNsQyxNQUFNO1FBQUViO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztRQUFDd0MsRUFBRSxFQUFFRixFQUFHO1FBQUM2QixTQUFTLEVBQUU1QixLQUFNO1FBQUM2QixNQUFNLEVBQUVQLE1BQU87UUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtRQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO1FBQUNDLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUUrRDtRQUFNO01BQUUsQ0FBRSxDQUN6SSxDQUFDO01BQ0QsTUFBTTtRQUFFOUU7TUFBZ0IsQ0FBQyxHQUFHWCxVQUFVLENBQUNDLFNBQVMsQ0FBQztNQUNqREcsTUFBTSxDQUFDTyxlQUFlLENBQUNSLFFBQVEsQ0FBQy9CLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQzs7TUFFbEQ7TUFDQSxNQUFNK0YsVUFBVSxHQUFHMUYsZUFBZSxDQUFDUixRQUFRLENBQUMsQ0FBQyxDQUFDO01BQzlDQyxNQUFNLENBQUNpRyxVQUFVLENBQUNwRCxJQUFJLENBQUMsQ0FBQzNDLE9BQU8sQ0FBQyxXQUFXLENBQUM7TUFDNUNGLE1BQU0sQ0FBQ2lHLFVBQVUsQ0FBQ2hHLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzVDRixNQUFNLENBQUNpRyxVQUFVLENBQUN2RSxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUM7TUFDcERGLE1BQU0sQ0FBQ0gsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUNsSSxNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUU5RDtNQUNBNkMsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDaUQsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQy9CakcsTUFBTSxDQUFDSCxTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQ2xJLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDOUQsTUFBTTZFLFNBQVMsR0FBR2xGLFNBQVMsQ0FBQ3FHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0EsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUN2RGxHLE1BQU0sQ0FBQytFLFNBQVMsQ0FBQ3JELFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLFdBQVcsQ0FBQzs7TUFFcEQ7TUFDQSxNQUFNK0YsZ0JBQWdCLEdBQUdwQixTQUFTLENBQUNtQixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ2hELE1BQU1FLFVBQVUsR0FBR0QsZ0JBQWdCLENBQUNELFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDakQsTUFBTUcsWUFBWSxHQUFHRixnQkFBZ0IsQ0FBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNuRGxHLE1BQU0sQ0FBQ29HLFVBQVUsQ0FBQzFFLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLE1BQU0sQ0FBQztNQUNoREosTUFBTSxDQUFDcUcsWUFBWSxDQUFDM0UsV0FBVyxDQUFDLENBQUN0QixTQUFTLENBQUMsUUFBUSxDQUFDOztNQUVwRDtNQUNBMkMsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDcUQsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQ2pDckcsTUFBTSxDQUFDSCxTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQ2xJLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDO0lBR0ZRLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxNQUFNO01BQzlELE1BQU07UUFBRWI7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRSxDQUFDLENBQUU7UUFBQ0Msb0JBQW9CLEVBQUMsUUFBUTtRQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO1FBQUNDLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUUrRDtRQUFNO01BQUUsQ0FBRSxDQUNySSxDQUFDO01BQ0QsTUFBTTtRQUFFOUU7TUFBZ0IsQ0FBQyxHQUFHWCxVQUFVLENBQUNDLFNBQVMsQ0FBQztNQUNqREcsTUFBTSxDQUFDTyxlQUFlLENBQUNSLFFBQVEsQ0FBQy9CLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUM7RUFFSixDQUFDLENBQUM7RUFFRm5CLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNO0lBRWxDLE1BQU1pRCxZQUFZLEdBQUc7TUFDbkIxQyxFQUFFLEVBQUUsS0FBSztNQUNUeUcsUUFBUSxFQUFFO0lBQ1osQ0FBQztJQUVELE1BQU1wRixNQUFNLEdBQUc7TUFDYm9FLFNBQVMsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU1NLEtBQUssR0FBRyxDQUNaO01BQ0UvRixFQUFFLEVBQUUsWUFBWTtNQUNoQnVELElBQUksRUFBRSxZQUFZO01BQ2xCeUMsVUFBVSxFQUFFLENBQ1Y7UUFDRWhHLEVBQUUsRUFBRSxVQUFVO1FBQ2RpRyxJQUFJLEVBQUUsTUFBTTtRQUNaL0MsS0FBSyxFQUFFLFdBQVc7UUFDbEJnRCxPQUFPLEVBQUUsVUFBVTtRQUNuQkMsUUFBUSxFQUFFLElBQUk7UUFDZEMsR0FBRyxFQUFFLFVBQVU7UUFDZkMsU0FBUyxFQUFFLFdBQVc7UUFDdEJDLFNBQVMsRUFBRSxVQUFVO1FBQ3JCVSxhQUFhLEVBQUUsQ0FBQztVQUNkZixJQUFJLEVBQUUsVUFBVTtVQUNoQmdCLE9BQU8sRUFBRTtRQUNYLENBQUM7TUFDSCxDQUFDLENBQ0Y7TUFDRFYsZ0JBQWdCLEVBQUUsQ0FDaEIsVUFBVSxDQUNYO01BQ0R6RSxRQUFRLEVBQUU7UUFDUjBFLE9BQU8sRUFBRSxDQUNQO1VBQ0V4RyxFQUFFLEVBQUUsS0FBSztVQUNUSSxLQUFLLEVBQUU7UUFDVCxDQUFDO01BRUw7SUFDRixDQUFDLENBQ0Y7SUFFRGdCLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxNQUFNO01BQy9ELE1BQU04RixnQkFBZ0IsR0FBRyxDQUFDO1FBQ3hCbEgsRUFBRSxFQUFFLFVBQVU7UUFDZG1ILE9BQU8sRUFBRSxLQUFLO1FBQ2RDLEtBQUssRUFBRTtNQUNULENBQUMsQ0FBQztNQUNGLE1BQU07UUFBRTdHO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQzlFLDZCQUFBLENBQUFZLE9BQW9DO1FBQUMySixPQUFPLEVBQUV6RSxZQUFZLENBQUMxQyxFQUFHO1FBQUNxSCxjQUFjLEVBQUVILGdCQUFpQjtRQUFBekcsUUFBQSxlQUMvRixJQUFBNUQsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1VBQUN3QyxFQUFFLEVBQUVGLEVBQUc7VUFBQzZCLFNBQVMsRUFBRWUsWUFBYTtVQUFDZCxNQUFNLEVBQUVQLE1BQU87VUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtVQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO1VBQUNDLFVBQVUsRUFBRTtZQUFFQyxVQUFVLEVBQUUrRDtVQUFNO1FBQUUsQ0FBRTtNQUFDLENBQzNHLENBQ3hDLENBQUM7TUFDRCxNQUFNO1FBQUU5RTtNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDOztNQUVsRDtNQUNBLE1BQU0rRixVQUFVLEdBQUcxRixlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDOUNDLE1BQU0sQ0FBQ2lHLFVBQVUsQ0FBQ2hHLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzVDRixNQUFNLENBQUNpRyxVQUFVLENBQUN2RSxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUM7TUFDcERGLE1BQU0sQ0FBQ0gsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUNsSSxNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUU5RDtNQUNBNkMsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDaUQsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQy9CakcsTUFBTSxDQUFDSCxTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQ2xJLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDOUQsTUFBTTZFLFNBQVMsR0FBR2xGLFNBQVMsQ0FBQ3FHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0EsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUN2RGxHLE1BQU0sQ0FBQytFLFNBQVMsQ0FBQ3JELFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLFdBQVcsQ0FBQzs7TUFFcEQ7TUFDQSxNQUFNd0csWUFBWSxHQUFHN0IsU0FBUyxDQUFDbUIsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUM1Q2xHLE1BQU0sQ0FBQzRHLFlBQVksQ0FBQ2xGLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDb0csZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUNFLEtBQUssQ0FBQztJQUV2RSxDQUFDLENBQUM7SUFFRmhHLEVBQUUsQ0FBQyxvRkFBb0YsRUFBRSxZQUFZO01BQ25HLE1BQU04RixnQkFBZ0IsR0FBRyxDQUFDO1FBQ3hCbEgsRUFBRSxFQUFFLFVBQVU7UUFDZG1ILE9BQU8sRUFBRSxLQUFLO1FBQ2RDLEtBQUssRUFBRTtNQUNULENBQUMsQ0FBQztNQUNGLE1BQU07UUFBRTdHO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQzlFLDZCQUFBLENBQUFZLE9BQW9DO1FBQUMySixPQUFPLEVBQUV6RSxZQUFZLENBQUMxQyxFQUFHO1FBQUNxSCxjQUFjLEVBQUVILGdCQUFpQjtRQUFBekcsUUFBQSxlQUMvRixJQUFBNUQsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1VBQ1Z3QyxFQUFFLEVBQUVGLEVBQUc7VUFDUDZCLFNBQVMsRUFBRWUsWUFBYTtVQUN4QmQsTUFBTSxFQUFFUCxNQUFPO1VBQ2ZRLG9CQUFvQixFQUFDLFFBQVE7VUFDN0JDLFFBQVEsRUFBRSxDQUFDLENBQUU7VUFDYkMsVUFBVSxFQUFFO1lBQUVDLFVBQVUsRUFBRStEO1VBQU0sQ0FBRTtVQUNsQ3dCLFdBQVcsRUFBRUEsQ0FBQSxLQUFNLENBQUM7UUFBRSxDQUN2QjtNQUFDLENBQ2tDLENBQ3hDLENBQUM7TUFDRCxNQUFNO1FBQUV0RztNQUFnQixDQUFDLEdBQUdYLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2pERyxNQUFNLENBQUNPLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDL0IsTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDOztNQUVsRDtNQUNBLE1BQU0rRixVQUFVLEdBQUcxRixlQUFlLENBQUNSLFFBQVEsQ0FBQyxDQUFDLENBQUM7TUFDOUNDLE1BQU0sQ0FBQ2lHLFVBQVUsQ0FBQ2hHLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLENBQUMsUUFBUSxDQUFDO01BQzVDRixNQUFNLENBQUNpRyxVQUFVLENBQUN2RSxXQUFXLENBQUMsQ0FBQ3hCLE9BQU8sQ0FBQyxZQUFZLENBQUM7TUFDcERGLE1BQU0sQ0FBQ0gsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUNsSSxNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztNQUU5RDtNQUNBNkMsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDaUQsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQy9CakcsTUFBTSxDQUFDSCxTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQ2xJLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7TUFDOUQsTUFBTTZFLFNBQVMsR0FBR2xGLFNBQVMsQ0FBQ3FHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0EsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUN2RGxHLE1BQU0sQ0FBQytFLFNBQVMsQ0FBQ3JELFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLFdBQVcsQ0FBQzs7TUFFcEQ7TUFDQSxNQUFNd0csWUFBWSxHQUFHN0IsU0FBUyxDQUFDbUIsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUM1Q2xHLE1BQU0sQ0FBQzRHLFlBQVksQ0FBQ2xGLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDb0csZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUNFLEtBQUssQ0FBQzs7TUFFckU7TUFDQSxNQUFNSSxTQUFTLEdBQUcvQixTQUFTLENBQUNtQixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ3pDLE1BQU1hLGNBQWMsR0FBR0QsU0FBUyxDQUFDWixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQzlDLE1BQU0sSUFBQWMsY0FBRyxFQUFDLFlBQVk7UUFDcEJqRSxnQkFBUyxDQUFDa0UsTUFBTSxDQUFDRixjQUFjLEVBQUU7VUFBRUcsTUFBTSxFQUFFO1lBQUU1SSxLQUFLLEVBQUU7VUFBRztRQUFFLENBQUMsQ0FBQztNQUM3RCxDQUFDLENBQUM7O01BRUY7TUFDQTtNQUNBLE1BQU02SCxnQkFBZ0IsR0FBR3BCLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDaEQsTUFBTUUsVUFBVSxHQUFHRCxnQkFBZ0IsQ0FBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNqRGxHLE1BQU0sQ0FBQ29HLFVBQVUsQ0FBQzFFLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLE1BQU0sQ0FBQztNQUNoRCxNQUFNLElBQUE0RyxjQUFHLEVBQUMsWUFBWTtRQUNwQmpFLGdCQUFTLENBQUNDLEtBQUssQ0FBQ29ELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQyxDQUFDLENBQUM7O01BRUY7TUFDQXBHLE1BQU0sQ0FBQzRHLFlBQVksQ0FBQ2xGLFdBQVcsQ0FBQyxDQUFDdEIsU0FBUyxDQUFDLHNCQUFzQixDQUFDO0lBRXBFLENBQUMsQ0FBQztFQUVKLENBQUMsQ0FBQztFQUVGckIsUUFBUSxDQUFDLHlCQUF5QixFQUFFLE1BQU07SUFDeEMsTUFBTTRCLE1BQU0sR0FBRztNQUNib0UsU0FBUyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTU0sS0FBSyxHQUFHLENBQ1o7TUFDRS9GLEVBQUUsRUFBRSxZQUFZO01BQ2hCdUQsSUFBSSxFQUFFLFlBQVk7TUFDbEJ5QyxVQUFVLEVBQUUsQ0FDVjtRQUNFaEcsRUFBRSxFQUFFLFVBQVU7UUFDZGlHLElBQUksRUFBRSxNQUFNO1FBQ1ovQyxLQUFLLEVBQUUsV0FBVztRQUNsQmdELE9BQU8sRUFBRSxVQUFVO1FBQ25CQyxRQUFRLEVBQUUsSUFBSTtRQUNkQyxHQUFHLEVBQUUsVUFBVTtRQUNmQyxTQUFTLEVBQUUsV0FBVztRQUN0QkMsU0FBUyxFQUFFLFVBQVU7UUFDckIsc0JBQXNCLEVBQUUsQ0FDdEI7VUFDRSxVQUFVLEVBQUUsa0JBQWtCO1VBQzlCLE9BQU8sRUFBRSxDQUFDO1VBQ1ZXLE9BQU8sRUFBRTtRQUNYLENBQUM7TUFFTCxDQUFDLENBQ0Y7TUFDRFYsZ0JBQWdCLEVBQUUsQ0FDaEIsVUFBVSxDQUNYO01BQ0R6RSxRQUFRLEVBQUU7UUFDUjBFLE9BQU8sRUFBRSxDQUNQO1VBQ0V4RyxFQUFFLEVBQUUsZUFBZTtVQUNuQnlHLFFBQVEsRUFBRSxRQUFRO1VBQ2xCQyxTQUFTLEVBQUUsV0FBVztVQUN0QnRHLEtBQUssRUFBRTtRQUNULENBQUM7TUFFTDtJQUNGLENBQUMsQ0FDRjtJQUdEZ0IsRUFBRSxDQUFDLHlCQUF5QixFQUFFLE1BQU07TUFDbEMsTUFBTTtRQUFFYjtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztRQUFDNkIsU0FBUyxFQUFFNUIsS0FBTTtRQUFDNkIsTUFBTSxFQUFFUCxNQUFPO1FBQUNRLG9CQUFvQixFQUFDLFFBQVE7UUFBQ0MsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUFDQyxVQUFVLEVBQUU7VUFBRUMsVUFBVSxFQUFFK0Q7UUFBTTtNQUFFLENBQUUsQ0FDekksQ0FBQztNQUNELE1BQU07UUFBRTlFO01BQWdCLENBQUMsR0FBR1gsVUFBVSxDQUFDQyxTQUFTLENBQUM7TUFDakRHLE1BQU0sQ0FBQ08sZUFBZSxDQUFDUixRQUFRLENBQUMvQixNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUM7O01BRWxEO01BQ0EsTUFBTStGLFVBQVUsR0FBRzFGLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUM5Q0MsTUFBTSxDQUFDaUcsVUFBVSxDQUFDaEcsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxRQUFRLENBQUM7TUFDNUNGLE1BQU0sQ0FBQ2lHLFVBQVUsQ0FBQ3ZFLFdBQVcsQ0FBQyxDQUFDeEIsT0FBTyxDQUFDLFlBQVksQ0FBQztNQUNwREYsTUFBTSxDQUFDSCxTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQ2xJLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O01BRTlEO01BQ0E2QyxnQkFBUyxDQUFDQyxLQUFLLENBQUNpRCxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDL0JqRyxNQUFNLENBQUNILFNBQVMsQ0FBQ3FHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0EsVUFBVSxDQUFDbEksTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUM5RCxNQUFNNkUsU0FBUyxHQUFHbEYsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ3ZEbEcsTUFBTSxDQUFDK0UsU0FBUyxDQUFDckQsV0FBVyxDQUFDLENBQUN0QixTQUFTLENBQUMsV0FBVyxDQUFDOztNQUVwRDtNQUNBLE1BQU0rRixnQkFBZ0IsR0FBR3BCLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDaEQsTUFBTUUsVUFBVSxHQUFHRCxnQkFBZ0IsQ0FBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNqRCxNQUFNRyxZQUFZLEdBQUdGLGdCQUFnQixDQUFDRCxVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ25EbEcsTUFBTSxDQUFDb0csVUFBVSxDQUFDMUUsV0FBVyxDQUFDLENBQUN0QixTQUFTLENBQUMsTUFBTSxDQUFDO01BQ2hESixNQUFNLENBQUNxRyxZQUFZLENBQUMzRSxXQUFXLENBQUMsQ0FBQ3RCLFNBQVMsQ0FBQyxRQUFRLENBQUM7O01BRXBEO01BQ0EyQyxnQkFBUyxDQUFDQyxLQUFLLENBQUNxRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDakNyRyxNQUFNLENBQUNILFNBQVMsQ0FBQ3FHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ0EsVUFBVSxDQUFDbEksTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUM7SUFHRlEsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLE1BQU07TUFDN0QsTUFBTXlHLGVBQWUsR0FBRyxFQUFFO01BQzFCLE1BQU1DLEtBQUssR0FBRztRQUNaQyxRQUFRLEVBQUVBLENBQUM5QixJQUFJLEVBQUUrQixLQUFLLEtBQUtILGVBQWUsQ0FBQ3ZKLElBQUksQ0FBQzBKLEtBQUs7TUFDdkQsQ0FBQztNQUNELE1BQU07UUFBRXpIO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztRQUFDd0MsRUFBRSxFQUFFRixFQUFHO1FBQUM2QixTQUFTLEVBQUU1QixLQUFNO1FBQUM2QixNQUFNLEVBQUVQLE1BQU87UUFBQ1Esb0JBQW9CLEVBQUMsU0FBUztRQUFDQyxRQUFRLEVBQUUsQ0FBQyxDQUFFO1FBQUNDLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUUrRDtRQUFNO01BQUUsQ0FBRSxDQUFDLEVBQ3pJO1FBQUUrQjtNQUFNLENBQ1YsQ0FBQztNQUNELE1BQU07UUFBRTdHO01BQWdCLENBQUMsR0FBR1gsVUFBVSxDQUFDQyxTQUFTLENBQUM7O01BRWpEO01BQ0EsTUFBTW9HLFVBQVUsR0FBRzFGLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDLENBQUMsQ0FBQzs7TUFFOUM7TUFDQWdELGdCQUFTLENBQUNDLEtBQUssQ0FBQ2lELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMvQixNQUFNbEIsU0FBUyxHQUFHbEYsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUMsQ0FBQyxDQUFDO01BRXZELE1BQU1DLGdCQUFnQixHQUFHcEIsU0FBUyxDQUFDbUIsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNoRCxNQUFNRSxVQUFVLEdBQUdELGdCQUFnQixDQUFDRCxVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ2pEbkQsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDb0QsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQy9CcEcsTUFBTSxDQUFDbUgsZUFBZSxDQUFDbkosTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsNERBQTRELEVBQUUsWUFBWTtNQUMzRSxNQUFNeUcsZUFBZSxHQUFHLEVBQUU7TUFDMUIsTUFBTUMsS0FBSyxHQUFHO1FBQ1pDLFFBQVEsRUFBRUEsQ0FBQzlCLElBQUksRUFBRStCLEtBQUssS0FBS0gsZUFBZSxDQUFDdkosSUFBSSxDQUFDMEosS0FBSztNQUN2RCxDQUFDO01BQ0QsTUFBTUMsbUJBQW1CLEdBQUcsRUFBRTtNQUM5QixNQUFNQyxhQUFhLEdBQUdDLElBQUEsSUFBZ0I7UUFBQSxJQUFmO1VBQUVQO1FBQU8sQ0FBQyxHQUFBTyxJQUFBO1FBQy9CRixtQkFBbUIsQ0FBQzNKLElBQUksQ0FBQ3NKLE1BQU0sQ0FBQztNQUNsQyxDQUFDO01BQ0QsTUFBTTtRQUFFckg7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQ1Z3QyxFQUFFLEVBQUVGLEVBQUc7UUFDUDZCLFNBQVMsRUFBQW5ELGFBQUEsQ0FBQUEsYUFBQSxLQUFPdUIsS0FBSztVQUFFSyxLQUFLLEVBQUU7UUFBQyxFQUFHO1FBQ2xDd0IsTUFBTSxFQUFFUCxNQUFPO1FBQ2ZRLG9CQUFvQixFQUFDLFNBQVM7UUFDOUIwRixXQUFXLEVBQUVXLGFBQWM7UUFDM0JwRyxRQUFRLEVBQUU7VUFBRTBFLE9BQU8sRUFBRSxDQUFDO1lBQUVDLFFBQVEsRUFBRTtVQUFRLENBQUM7UUFBRSxDQUFFO1FBQy9DMUUsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRStEO1FBQU07TUFBRSxDQUNuQyxDQUFDLEVBQ0Y7UUFBRStCO01BQU0sQ0FDVixDQUFDO01BQ0QsTUFBTTtRQUFFN0c7TUFBZ0IsQ0FBQyxHQUFHWCxVQUFVLENBQUNDLFNBQVMsQ0FBQztNQUVqRCxNQUFNb0csVUFBVSxHQUFHMUYsZUFBZSxDQUFDUixRQUFRLENBQUMsQ0FBQyxDQUFDO01BQzlDZ0QsZ0JBQVMsQ0FBQ0MsS0FBSyxDQUFDaUQsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO01BQy9CLE1BQU1sQixTQUFTLEdBQUdsRixTQUFTLENBQUNxRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUNBLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFFdkQsTUFBTVksU0FBUyxHQUFHL0IsU0FBUyxDQUFDbUIsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUN6QyxNQUFNYSxjQUFjLEdBQUdELFNBQVMsQ0FBQ1osVUFBVSxDQUFDLENBQUMsQ0FBQztNQUM5QyxNQUFNQyxnQkFBZ0IsR0FBR3BCLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDaEQsTUFBTUUsVUFBVSxHQUFHRCxnQkFBZ0IsQ0FBQ0QsVUFBVSxDQUFDLENBQUMsQ0FBQztNQUNqRDtNQUNBLE1BQU0sSUFBQWMsY0FBRyxFQUFDLFlBQVk7UUFDcEJqRSxnQkFBUyxDQUFDa0UsTUFBTSxDQUFDRixjQUFjLEVBQUU7VUFBRUcsTUFBTSxFQUFFO1lBQUU1SSxLQUFLLEVBQUU7VUFBSTtRQUFFLENBQUMsQ0FBQztNQUM5RCxDQUFDLENBQUM7TUFDRixNQUFNLElBQUEwSSxjQUFHLEVBQUMsWUFBWTtRQUNwQmpFLGdCQUFTLENBQUNDLEtBQUssQ0FBQ29ELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQyxDQUFDLENBQUM7TUFDRnBHLE1BQU0sQ0FBQ21ILGVBQWUsQ0FBQ25KLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQztNQUN6Q0YsTUFBTSxDQUFDdUgsbUJBQW1CLENBQUN2SixNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDO0lBRUZRLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxZQUFZO01BQzNFLE1BQU15RyxlQUFlLEdBQUcsRUFBRTtNQUMxQixNQUFNQyxLQUFLLEdBQUc7UUFDWkMsUUFBUSxFQUFFQSxDQUFDOUIsSUFBSSxFQUFFK0IsS0FBSyxFQUFFSSxXQUFXLEVBQUVDLE9BQU8sS0FBSztVQUMvQ1IsZUFBZSxDQUFDdkosSUFBSSxDQUFDMEosS0FBSyxDQUFDO1VBQzNCSyxPQUFPLENBQUMsQ0FBQztZQUFFakIsS0FBSyxFQUFFLFNBQVM7WUFBRXBILEVBQUUsRUFBRTtVQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDO01BQ0YsQ0FBQztNQUNELE1BQU1pSSxtQkFBbUIsR0FBRyxFQUFFO01BQzlCLE1BQU1DLGFBQWEsR0FBR0ksS0FBQSxJQUFnQjtRQUFBLElBQWY7VUFBRVY7UUFBTyxDQUFDLEdBQUFVLEtBQUE7UUFDL0JMLG1CQUFtQixDQUFDM0osSUFBSSxDQUFDc0osTUFBTSxDQUFDO01BQ2xDLENBQUM7TUFDRCxNQUFNO1FBQUVySDtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFDVndDLEVBQUUsRUFBRUYsRUFBRztRQUNQNkIsU0FBUyxFQUFFNUIsS0FBTTtRQUNqQjZCLE1BQU0sRUFBRVAsTUFBTztRQUNmUSxvQkFBb0IsRUFBQyxTQUFTO1FBQzlCMEYsV0FBVyxFQUFFVyxhQUFjO1FBQzNCcEcsUUFBUSxFQUFFO1VBQUUwRSxPQUFPLEVBQUUsQ0FBQztZQUFFK0Isb0JBQW9CLEVBQUU7VUFBUSxDQUFDO1FBQUUsQ0FBRTtRQUMzRHhHLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUUrRDtRQUFNO01BQUUsQ0FDbkMsQ0FBQyxFQUNGO1FBQUUrQjtNQUFNLENBQ1YsQ0FBQztNQUNELE1BQU07UUFBRTdHO01BQWdCLENBQUMsR0FBR1gsVUFBVSxDQUFDQyxTQUFTLENBQUM7TUFFakQsTUFBTW9HLFVBQVUsR0FBRzFGLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUM5Q2dELGdCQUFTLENBQUNDLEtBQUssQ0FBQ2lELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMvQixNQUFNbEIsU0FBUyxHQUFHbEYsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUMsQ0FBQyxDQUFDOztNQUV2RDtNQUNBLE1BQU1ZLFNBQVMsR0FBRy9CLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDekMsTUFBTWEsY0FBYyxHQUFHRCxTQUFTLENBQUNaLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDOUNuRCxnQkFBUyxDQUFDa0UsTUFBTSxDQUFDRixjQUFjLEVBQUU7UUFBRUcsTUFBTSxFQUFFO1VBQUU1SSxLQUFLLEVBQUU7UUFBWTtNQUFFLENBQUMsQ0FBQztNQUVwRSxNQUFNNkgsZ0JBQWdCLEdBQUdwQixTQUFTLENBQUNtQixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ2hELE1BQU1FLFVBQVUsR0FBR0QsZ0JBQWdCLENBQUNELFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDakQsTUFBTSxJQUFBYyxjQUFHLEVBQUMsWUFBWTtRQUNwQmpFLGdCQUFTLENBQUNDLEtBQUssQ0FBQ29ELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQyxDQUFDLENBQUM7TUFDRnBHLE1BQU0sQ0FBQ21ILGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDbEUsYUFBYSxDQUFDO1FBQUU4QyxRQUFRLEVBQUU7TUFBWSxDQUFDLENBQUM7TUFDbkUvRixNQUFNLENBQUN1SCxtQkFBbUIsQ0FBQ3ZKLE1BQU0sQ0FBQyxDQUFDa0MsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7SUFFRlEsRUFBRSxDQUFDLCtDQUErQyxFQUFFLFlBQVk7TUFDOUQsTUFBTXlHLGVBQWUsR0FBRyxFQUFFO01BQzFCLE1BQU1DLEtBQUssR0FBRztRQUNaQyxRQUFRLEVBQUVBLENBQUM5QixJQUFJLEVBQUUrQixLQUFLLEtBQUtILGVBQWUsQ0FBQ3ZKLElBQUksQ0FBQzBKLEtBQUs7TUFDdkQsQ0FBQztNQUNELE1BQU1DLG1CQUFtQixHQUFHLEVBQUU7TUFDOUIsTUFBTUMsYUFBYSxHQUFHTSxLQUFBLElBQWdCO1FBQUEsSUFBZjtVQUFFWjtRQUFPLENBQUMsR0FBQVksS0FBQTtRQUMvQlAsbUJBQW1CLENBQUMzSixJQUFJLENBQUNzSixNQUFNLENBQUM7TUFDbEMsQ0FBQztNQUVELE1BQU07UUFBRXJIO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQzlFLDZCQUFBLENBQUFZLE9BQW9DO1FBQ25DMkosT0FBTyxFQUFDLElBQUk7UUFDWkUsY0FBYyxFQUFFLEVBQUc7UUFDbkJvQiwwQkFBMEIsRUFBR0EsQ0FBQSxLQUFNLENBQUMsQ0FBRTtRQUFBaEksUUFBQSxlQUV0QyxJQUFBNUQsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1VBQ1Z3QyxFQUFFLEVBQUVGLEVBQUc7VUFDUDZCLFNBQVMsRUFBRTtZQUFFdkIsS0FBSyxFQUFFLENBQUM7WUFBRUosRUFBRSxFQUFFO1VBQUksQ0FBRTtVQUNqQzRCLE1BQU0sRUFBRVAsTUFBTztVQUNmUSxvQkFBb0IsRUFBQyxTQUFTO1VBQzlCMEYsV0FBVyxFQUFFVyxhQUFjO1VBQzNCcEcsUUFBUSxFQUFFO1lBQUUwRSxPQUFPLEVBQUUsQ0FBQztjQUFFK0Isb0JBQW9CLEVBQUU7WUFBUSxDQUFDO1VBQUUsQ0FBRTtVQUMzRHhHLFVBQVUsRUFBRTtZQUFFQyxVQUFVLEVBQUUrRDtVQUFNO1FBQUUsQ0FDbkM7TUFBQyxDQUNrQyxDQUFDLEVBRXZDO1FBQUUrQjtNQUFNLENBQ1YsQ0FBQztNQUNELE1BQU07UUFBRTdHO01BQWdCLENBQUMsR0FBR1gsVUFBVSxDQUFDQyxTQUFTLENBQUM7TUFFakQsTUFBTW9HLFVBQVUsR0FBRzFGLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUM5Q2dELGdCQUFTLENBQUNDLEtBQUssQ0FBQ2lELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMvQixNQUFNbEIsU0FBUyxHQUFHbEYsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUMsQ0FBQyxDQUFDOztNQUV2RDtNQUNBLE1BQU1ZLFNBQVMsR0FBRy9CLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDekMsTUFBTWEsY0FBYyxHQUFHRCxTQUFTLENBQUNaLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDOUNuRCxnQkFBUyxDQUFDa0UsTUFBTSxDQUFDRixjQUFjLEVBQUU7UUFBRUcsTUFBTSxFQUFFO1VBQUU1SSxLQUFLLEVBQUU7UUFBWTtNQUFFLENBQUMsQ0FBQztNQUNwRSxNQUFNNkgsZ0JBQWdCLEdBQUdwQixTQUFTLENBQUNtQixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ2hELE1BQU1FLFVBQVUsR0FBR0QsZ0JBQWdCLENBQUNELFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDakQsTUFBTSxJQUFBYyxjQUFHLEVBQUMsWUFBWTtRQUNwQmpFLGdCQUFTLENBQUNDLEtBQUssQ0FBQ29ELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQyxDQUFDLENBQUM7TUFDRnBHLE1BQU0sQ0FBQ3VILG1CQUFtQixDQUFDdkosTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQzdDRixNQUFNLENBQUN1SCxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQ2pKLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDNEIsT0FBTyxDQUFDO1FBQUUySCxvQkFBb0IsRUFBRSxPQUFPO1FBQUU5QixRQUFRLEVBQUU7TUFBWSxDQUFDLENBQUM7SUFDM0csQ0FBQyxDQUFDO0lBRUZyRixFQUFFLENBQUMsOERBQThELEVBQUUsWUFBWTtNQUM3RSxNQUFNeUcsZUFBZSxHQUFHLEVBQUU7TUFDMUIsTUFBTUMsS0FBSyxHQUFHO1FBQ1pDLFFBQVEsRUFBRUEsQ0FBQzlCLElBQUksRUFBRStCLEtBQUssS0FBS0gsZUFBZSxDQUFDdkosSUFBSSxDQUFDMEosS0FBSztNQUN2RCxDQUFDO01BQ0QsTUFBTUMsbUJBQW1CLEdBQUcsRUFBRTtNQUM5QixNQUFNQyxhQUFhLEdBQUdRLEtBQUEsSUFBZ0I7UUFBQSxJQUFmO1VBQUVkO1FBQU8sQ0FBQyxHQUFBYyxLQUFBO1FBQy9CVCxtQkFBbUIsQ0FBQzNKLElBQUksQ0FBQ3NKLE1BQU0sQ0FBQztNQUNsQyxDQUFDO01BRUQsTUFBTTtRQUFFckg7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDOUUsNkJBQUEsQ0FBQVksT0FBb0M7UUFDbkMySixPQUFPLEVBQUMsSUFBSTtRQUNaRSxjQUFjLEVBQUUsRUFBRztRQUNuQm9CLDBCQUEwQixFQUFFQSxDQUFBLEtBQU0sQ0FBRSxDQUFFO1FBQUFoSSxRQUFBLGVBRXRDLElBQUE1RCxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7VUFDVndDLEVBQUUsRUFBRUYsRUFBRztVQUNQNkIsU0FBUyxFQUFFO1lBQUV2QixLQUFLLEVBQUUsQ0FBQztZQUFFSixFQUFFLEVBQUUsR0FBRztZQUFFaUYsV0FBVyxFQUFFO1VBQUssQ0FBRTtVQUNwRHJELE1BQU0sRUFBRVAsTUFBTztVQUNmUSxvQkFBb0IsRUFBQyxTQUFTO1VBQzlCMEYsV0FBVyxFQUFFVyxhQUFjO1VBQzNCcEcsUUFBUSxFQUFFO1lBQUUwRSxPQUFPLEVBQUUsQ0FBQztjQUFFK0Isb0JBQW9CLEVBQUU7WUFBUSxDQUFDO1VBQUUsQ0FBRTtVQUMzRHhHLFVBQVUsRUFBRTtZQUFFQyxVQUFVLEVBQUUrRDtVQUFNO1FBQUUsQ0FDbkM7TUFBQyxDQUNrQyxDQUFDLEVBQ3ZDO1FBQUUrQjtNQUFNLENBQ1YsQ0FBQztNQUNELE1BQU07UUFBRTdHO01BQWdCLENBQUMsR0FBR1gsVUFBVSxDQUFDQyxTQUFTLENBQUM7TUFFakQsTUFBTW9HLFVBQVUsR0FBRzFGLGVBQWUsQ0FBQ1IsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUM5Q2dELGdCQUFTLENBQUNDLEtBQUssQ0FBQ2lELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMvQixNQUFNbEIsU0FBUyxHQUFHbEYsU0FBUyxDQUFDcUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDQSxVQUFVLENBQUMsQ0FBQyxDQUFDOztNQUV2RDtNQUNBLE1BQU1ZLFNBQVMsR0FBRy9CLFNBQVMsQ0FBQ21CLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDekMsTUFBTWEsY0FBYyxHQUFHRCxTQUFTLENBQUNaLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDOUNuRCxnQkFBUyxDQUFDa0UsTUFBTSxDQUFDRixjQUFjLEVBQUU7UUFBRUcsTUFBTSxFQUFFO1VBQUU1SSxLQUFLLEVBQUU7UUFBWTtNQUFFLENBQUMsQ0FBQztNQUNwRSxNQUFNNkgsZ0JBQWdCLEdBQUdwQixTQUFTLENBQUNtQixVQUFVLENBQUMsQ0FBQyxDQUFDO01BQ2hELE1BQU1FLFVBQVUsR0FBR0QsZ0JBQWdCLENBQUNELFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDakQsTUFBTSxJQUFBYyxjQUFHLEVBQUMsWUFBWTtRQUNwQmpFLGdCQUFTLENBQUNDLEtBQUssQ0FBQ29ELFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztNQUNqQyxDQUFDLENBQUM7TUFDRnBHLE1BQU0sQ0FBQ3VILG1CQUFtQixDQUFDdkosTUFBTSxDQUFDLENBQUNrQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQzdDO01BQ0FGLE1BQU0sQ0FBQ3VILG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDakosS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM0QixPQUFPLENBQUM7UUFDOUMySCxvQkFBb0IsRUFBRSxPQUFPO1FBQzdCOUIsUUFBUSxFQUFFO01BQ1osQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBRUosQ0FBQyxDQUFDO0VBQ0ZoSCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsTUFBTTtJQUV0QzJCLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNO01BQzdDLE1BQU11SCxPQUFPLEdBQUcsZ0JBQWdCO01BQ2hDLE1BQU10SCxNQUFNLEdBQUc7UUFDYkUsS0FBSyxFQUFFLE9BQU87UUFDZEMsT0FBTyxFQUFFbUg7TUFDWCxDQUFDO01BQ0QsTUFBTTtRQUFFcEk7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUN3RCxLQUFLLEVBQUUsRUFBRztRQUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUFDQyxVQUFVLEVBQUU7VUFBRUMsVUFBVSxFQUFFO1FBQUc7TUFBRSxDQUFFLENBQ2pKLENBQUM7TUFDRCxNQUFNO1FBQUVoQjtNQUFpQixDQUFDLEdBQUdWLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2xELE1BQU04QixhQUFhLEdBQUdyQixnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUNsREMsTUFBTSxDQUFDMkIsYUFBYSxDQUFDMUIsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7TUFDNUNGLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ3hCLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztNQUMzRWdCLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ0QsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUMrSCxPQUFPLENBQUM7SUFDcEQsQ0FBQyxDQUFDO0lBRUZ2SCxFQUFFLENBQUMsbUNBQW1DLEVBQUUsTUFBTTtNQUM1QyxNQUFNQyxNQUFNLEdBQUc7UUFDYkUsS0FBSyxFQUFFLE9BQU87UUFDZEMsT0FBTyxFQUFFLENBQ1A7VUFDRTRCLElBQUksRUFBRSxXQUFXO1VBQ2pCYixTQUFTLEVBQUUsQ0FBQztZQUNWQyxLQUFLLEVBQUUsT0FBTztZQUNkQyxFQUFFLEVBQUUsSUFBSTtZQUNSekQsS0FBSyxFQUFFO1VBQ1QsQ0FBQztRQUNILENBQUMsRUFDRDtVQUNFb0UsSUFBSSxFQUFFLFdBQVc7VUFDakJiLFNBQVMsRUFBRSxDQUFDO1lBQ1ZDLEtBQUssRUFBRSxPQUFPO1lBQ2RDLEVBQUUsRUFBRSxHQUFHO1lBQ1B6RCxLQUFLLEVBQUU7VUFDVCxDQUFDO1FBQ0gsQ0FBQztNQUVMLENBQUM7TUFDRCxNQUFNO1FBQUV1QjtNQUFVLENBQUMsR0FBRyxJQUFBa0IsZ0NBQW9CLGVBQ3hDLElBQUE1RSxXQUFBLENBQUE2RSxHQUFBLEVBQUNqRixZQUFBLENBQUFlLE9BQVc7UUFBQ3dDLEVBQUUsRUFBRUYsRUFBRztRQUFDNkIsU0FBUyxFQUFBbkQsYUFBQSxDQUFBQSxhQUFBLEtBQU91QixLQUFLO1VBQUV5QyxLQUFLLEVBQUU7UUFBSSxFQUFHO1FBQUNaLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUN3RCxLQUFLLEVBQUUsRUFBRztRQUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUFDQyxVQUFVLEVBQUU7VUFBRUMsVUFBVSxFQUFFO1FBQUc7TUFBRSxDQUFFLENBQ3JLLENBQUM7TUFDRCxNQUFNO1FBQUVoQjtNQUFpQixDQUFDLEdBQUdWLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2xELE1BQU04QixhQUFhLEdBQUdyQixnQkFBZ0IsQ0FBQ1AsUUFBUSxDQUFDLENBQUMsQ0FBQztNQUNsREMsTUFBTSxDQUFDMkIsYUFBYSxDQUFDMUIsT0FBTyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxLQUFLLENBQUM7TUFDNUNGLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ3hCLFNBQVMsQ0FBQyxDQUFDQyxTQUFTLENBQUNwQixPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztNQUMzRWdCLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ0QsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3hELENBQUMsQ0FBQztJQUVGUSxFQUFFLENBQUMsK0NBQStDLEVBQUUsTUFBTTtNQUN4RCxNQUFNQyxNQUFNLEdBQUc7UUFDYkUsS0FBSyxFQUFFLE9BQU87UUFDZEMsT0FBTyxFQUFFO01BQ1gsQ0FBQztNQUNELE1BQU07UUFBRWpCO01BQVUsQ0FBQyxHQUFHLElBQUFrQixnQ0FBb0IsZUFDeEMsSUFBQTVFLFdBQUEsQ0FBQTZFLEdBQUEsRUFBQ2pGLFlBQUEsQ0FBQWUsT0FBVztRQUFDd0MsRUFBRSxFQUFFRixFQUFHO1FBQUM2QixTQUFTLEVBQUU1QixLQUFNO1FBQUM2QixNQUFNLEVBQUVQLE1BQU87UUFBQ1Esb0JBQW9CLEVBQUMsUUFBUTtRQUFDd0QsS0FBSyxFQUFFLEVBQUc7UUFBQ3ZELFFBQVEsRUFBRSxDQUFDLENBQUU7UUFBQ0MsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUNqSixDQUFDO01BQ0QsTUFBTTtRQUFFaEI7TUFBaUIsQ0FBQyxHQUFHVixVQUFVLENBQUNDLFNBQVMsQ0FBQztNQUNsRDtNQUNBRyxNQUFNLENBQUNNLGdCQUFnQixDQUFDUCxRQUFRLENBQUMvQixNQUFNLENBQUMsQ0FBQ2tDLE9BQU8sQ0FBQyxDQUFDLENBQUM7TUFDbkQsTUFBTXVCLFdBQVcsR0FBR25CLGdCQUFnQixDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ2hEQyxNQUFNLENBQUN5QixXQUFXLENBQUN0QixTQUFTLENBQUMsQ0FBQ0MsU0FBUyxDQUFDcEIsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDMUUsQ0FBQyxDQUFDO0lBRUYwQixFQUFFLENBQUMsd0NBQXdDLEVBQUUsTUFBTTtNQUNqRCxNQUFNdUgsT0FBTyxHQUFHLGNBQWM7TUFDOUIsTUFBTUMsa0JBQWtCLEdBQUFwSyxhQUFBLENBQUFBLGFBQUEsS0FDbkJ1QixLQUFLO1FBQ1JtRCxLQUFLLEVBQUU7TUFBUyxFQUNqQjtNQUNELE1BQU03QixNQUFNLEdBQUc7UUFDYkUsS0FBSyxFQUFFLE9BQU87UUFDZEMsT0FBTyxFQUFFbUg7TUFDWCxDQUFDO01BQ0QsTUFBTTtRQUFFcEk7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRWlILGtCQUFtQjtRQUFDaEgsTUFBTSxFQUFFUCxNQUFPO1FBQUNRLG9CQUFvQixFQUFDLFFBQVE7UUFBQ3dELEtBQUssRUFBRSxFQUFHO1FBQUN2RCxRQUFRLEVBQUUsQ0FBQyxDQUFFO1FBQUNDLFVBQVUsRUFBRTtVQUFFQyxVQUFVLEVBQUU7UUFBRztNQUFFLENBQUUsQ0FDOUosQ0FBQztNQUNELE1BQU07UUFBRWhCO01BQWlCLENBQUMsR0FBR1YsVUFBVSxDQUFDQyxTQUFTLENBQUM7TUFDbEQsTUFBTThCLGFBQWEsR0FBR3JCLGdCQUFnQixDQUFDUCxRQUFRLENBQUMsQ0FBQyxDQUFDO01BQ2xELE1BQU1vSSwwQkFBMEIsR0FBR2xKLHlCQUFLLENBQUNtSixpQkFBaUIsQ0FBQ0gsT0FBTyxFQUFFQyxrQkFBa0IsQ0FBQztNQUN2RmxJLE1BQU0sQ0FBQzJCLGFBQWEsQ0FBQ0QsV0FBVyxDQUFDLENBQUN4QixPQUFPLENBQUNpSSwwQkFBMEIsQ0FBQztJQUN2RSxDQUFDLENBQUM7SUFFRnpILEVBQUUsQ0FBQyxxRUFBcUUsRUFBRSxNQUFNO01BQzlFLE1BQU1DLE1BQU0sR0FBRztRQUNiRSxLQUFLLEVBQUU7TUFDVCxDQUFDO01BQ0QsTUFBTTtRQUFFaEI7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUN3RCxLQUFLLEVBQUUsRUFBRztRQUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUFDQyxVQUFVLEVBQUU7VUFBRUMsVUFBVSxFQUFFO1FBQUc7TUFBRSxDQUFFLENBQ2pKLENBQUM7TUFDRCxNQUFNO1FBQUVoQjtNQUFpQixDQUFDLEdBQUdWLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDO01BQ2xELE1BQU04QixhQUFhLEdBQUdyQixnQkFBZ0IsQ0FBQ3VELGFBQWEsS0FBQWpDLE1BQUEsQ0FBS3hDLEVBQUUsaUJBQWMsQ0FBQztNQUMxRVksTUFBTSxDQUFDMkIsYUFBYSxDQUFDLENBQUNvQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUM7SUFFRnJELEVBQUUsQ0FBQyw0RUFBNEUsRUFBRSxNQUFNO01BQ3JGLE1BQU11SCxPQUFPLEdBQUcsNkNBQTZDO01BQzdELE1BQU10SCxNQUFNLEdBQUc7UUFDYkUsS0FBSyxFQUFFLE9BQU87UUFDZEMsT0FBTyxFQUFFbUg7TUFDWCxDQUFDO01BQ0QsTUFBTTtRQUFFcEk7TUFBVSxDQUFDLEdBQUcsSUFBQWtCLGdDQUFvQixlQUN4QyxJQUFBNUUsV0FBQSxDQUFBNkUsR0FBQSxFQUFDakYsWUFBQSxDQUFBZSxPQUFXO1FBQUN3QyxFQUFFLEVBQUVGLEVBQUc7UUFBQzZCLFNBQVMsRUFBRTVCLEtBQU07UUFBQzZCLE1BQU0sRUFBRVAsTUFBTztRQUFDUSxvQkFBb0IsRUFBQyxRQUFRO1FBQUN3RCxLQUFLLEVBQUUsRUFBRztRQUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBRTtRQUFDd0QsV0FBVztRQUFDdkQsVUFBVSxFQUFFO1VBQUVDLFVBQVUsRUFBRTtRQUFHO01BQUUsQ0FBRSxDQUM3SixDQUFDO01BRUQsTUFBTStHLGdCQUFnQixHQUFHeEksU0FBUyxDQUFDZ0UsYUFBYSxDQUFDLFVBQVUsQ0FBQztNQUM1RDdELE1BQU0sQ0FBQ3FJLGdCQUFnQixDQUFDLENBQUN0RSxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUM7RUFFSixDQUFDLENBQUM7QUFFSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|