{"version":3,"sources":["config/constants.ts","config/routes.ts","config/DateFormats/useDatePickerFormat.ts","config/DateFormats/useFormatLocaleDate.ts","components/ActionMenuButton/ActionMenuButton.tsx","components/ActionMenuButtonEllipsis/ActionMenuButtonEllipsis.tsx","api/__mocks__/mockAnnualDfiReportData.ts","api/__mocks__/mockCaseDetailsData.ts","api/__mocks__/mockConsultationData.ts","api/__mocks__/mockRpcResponseData.ts","api/__mocks__/mockStandardPastResponseData.ts","types/ConsultationViewTypes.ts","types/HttpStatusCode.ts","types/KpiCategory.ts","types/Permission.ts","api/__mocks__/mockTeamData.ts","api/__mocks__/mockStandardResponseData.ts","api/__mocks__/mockTrafficMonitorData.ts","api/__mocks__/mockIncomingConsultationsTrafficMonitorData.ts","api/adminUsers/methods/getAdminUsers.ts","api/adminUsers/hooks/useUpdateAdminUser.ts","api/applications/methods/get/getApplicationDocument.ts","api/caseDetails/methods/get/getCaseDetails.ts","api/constants/ApiQueryKeys.ts","api/constants/QueryDefaults.ts","api/caseDetails/hooks/useMapPolygon.ts","api/caseDetails/methods/get/getMapPolygon.ts","api/consultees/hooks/useConsultees.ts","store/organisation/organisation.ts","store/dfiReport/dfiReport.ts","constants/constants.ts","tools/env/env.ts","tools/formatBytes/formatBytes.ts","tools/getB2CLink/getB2CLink.tsx","tools/getFinancialYear/getFinancialYear.ts","tools/isEmailValid.ts","tools/isNameValid.ts","tools/isOverdue/isOverdue.ts","tools/isRpc/isRpc.ts","tools/uniqBy.ts","tools/uppercaseFirstLetter/uppercaseFirstLetter.ts","tools/featureFlag/todisplayFeatureFlagged.tsx","tools/isInspection/isInspection.ts","store/manageConsultees/manageTeams.ts","store/manageConsultees/manageConsultees.ts","store/manageOrganisations/manageOrganisations.ts","store/manageTeam/manageUsers.ts","store/permissions/permissions.ts","store/reports/report.ts","store/response/responseForm.ts","store/response/responseFiles.ts","store/response/responseLateForm.ts","store/search/consultation.ts","store/search/filter.ts","store/search/sort.ts","store/search/searchViewTypeState.ts","store/search/filterArchiveRequestState.ts","store/search/search.ts","store/search/searchViewTabIndexState.ts","store/summary/note.ts","store/summary/requestExtension.ts","store/team/team.ts","store/trafficMonitor/inboundMonitor.ts","store/trafficMonitor/outboundMonitor.ts","store/trafficMonitor/exceptionLogsMonitor.ts","store/trafficMonitor/incomingConsultationsMonitor.ts","store/trafficMonitor/hooks/useIncomingConsultationsTrafficMonitorState.ts","store/trafficMonitor/hooks/useTrafficMonitorState.ts","store/userTable/manageConsulteesUserTable.ts","store/userTable/manageOrganisationUserTable.ts","api/consultees/methods/get/getConsulteeTeams.ts","api/consultees/hooks/useConsulteeTeams.ts","api/consultees/methods/get/getConsulteePermission.ts","api/consultees/methods/get/getConsultees.ts","api/consultees/methods/get/getManageTeamConsultees.ts","api/consultees/methods/get/getPermissions.ts","api/consultees/methods/delete/deleteConsultee.ts","api/consultees/methods/post/inviteConsultee.ts","api/consultees/methods/post/updateConsultee.ts","api/utils/apiError.ts","api/utils/api.ts","api/utils/apiUtility.ts","api/consultees/methods/post/uploadConsultees.ts","api/consultees/hooks/useDeleteConsultee.ts","api/consultees/hooks/useInviteConsultee.ts","api/consultees/hooks/useManageAllTeams.ts","api/consultees/methods/get/getFilterTeams.ts","api/consultees/hooks/useManageConsultees.ts","api/consultees/methods/get/getManageConsultees.ts","api/consultees/hooks/usePermissions.ts","api/consultations/methods/post/addNote.ts","api/consultations/methods/post/assignConsultee.ts","api/consultations/methods/post/requestExtension.ts","api/consultations/hooks/useConsultation.ts","api/consultations/methods/get/getConsultation.ts","api/consultations/hooks/useConsultations.ts","api/consultations/methods/get/getConsultations.ts","api/consultations/hooks/useSortOptions.ts","api/consultations/methods/get/getSortOptions.ts","api/extensionRequests/methods/getExtensionRequestStatuses.ts","api/filters/hooks/useFilterAuthorities.ts","api/filters/hooks/useFilterCategories.ts","api/filters/hooks/useFilterConsultationTypes.ts","api/filters/methods/get/getFilterAuthorities.ts","api/filters/methods/get/getFilterCategories.ts","api/filters/methods/get/getFilterStatuses.ts","api/filters/methods/get/getFilterConsultationTypes.ts","api/parentOrganisations/hooks/useAllParentOrganisations.ts","api/parentOrganisations/hooks/useParentOrganisations.ts","api/parentOrganisations/methods/getAllParentOrganisations.ts","api/parentOrganisations/methods/getParentOrganisation.ts","api/parentOrganisations/methods/getParentOrganisations.ts","api/parentOrganisations/methods/upsertParentOrganisation.ts","api/reports/hooks/useBaseReport.ts","api/reports/hooks/useBaseReportCsv.ts","api/reports/hooks/useExtensionRequestsReportCsv.ts","api/reports/hooks/useLateResponsesReportCsv.ts","api/reports/hooks/useOutstandingResponsesReportCsv.ts","api/reports/hooks/useRespondedOnTimeReportCsv.ts","api/reports/hooks/useRespondedYeartToDateReportCsv.ts","api/reports/methods/get/getDfiAnnualReport.ts","api/reports/methods/get/getDfiAnnualReportDocumentPath.ts","api/reports/methods/get/getDfiAnnualReports.ts","api/reports/methods/get/getExtensionRequestsReport.ts","api/reports/methods/get/getExtensionRequestsReportCsv.ts","api/reports/methods/get/getLateResponsesReport.ts","api/reports/methods/get/getLateResponsesReportCsv.ts","api/reports/methods/get/getRespondedOnTimeReport.ts","api/reports/methods/get/getRespondedOnTimeReportCsv.ts","api/reports/methods/get/getOutstandingResponsesReport.ts","api/reports/methods/get/getOutstandingResponsesReportCsv.ts","api/reports/methods/get/getRespondedYearToDateReport.ts","api/reports/methods/get/getRespondedYearToDateReportCsv.ts","api/reports/methods/get/getStatisticsReport.ts","api/reports/methods/put/updateDfiAnnualReport.ts","api/reports/hooks/useUpdateDfiAnnualReport.ts","api/responses/hooks/useReasonsForLateResponse.ts","api/responses/methods/get/getReasonsForLateResponse.ts","api/responses/methods/get/getResponseDocument.ts","api/responses/methods/get/getResponseTypes.ts","api/responses/methods/post/submitResponse.ts","api/responses/methods/post/updateAnswer.ts","api/responses/hooks/useResponses.ts","api/responses/methods/get/getResponses.ts","api/responses/hooks/useResponseTypes.ts","api/responses/hooks/useSubmitResponse.ts","api/trafficMonitor/hooks/useAuditRequests.ts","api/trafficMonitor/methods/getAuditRequests.ts","api/trafficMonitor/hooks/useIncomingConsultations.ts","api/trafficMonitor/methods/getIncomingConsultations.ts","api/teams/methods/addTeam.ts","api/teams/methods/updateTeam.ts","api/teams/hooks/useGetTeams.ts","api/teams/methods/getTeams.ts","components/AddNote/AddNote.tsx","api/consultations/hooks/useAddNote.ts","hooks/useAssignModal.ts","hooks/useFileDownload.ts","api/applications/hooks/useApplicationDocument.ts","api/responses/hooks/useResponseDocument.ts","hooks/useNavigate.ts","hooks/useNavigation.ts","hooks/useResetSearchState.ts","hooks/useShowViewResponse.ts","hooks/useCanAddNote.ts","components/AddNoteButton/AddNoteButton.tsx","components/AssigneeDetails/AssigneeDetails.tsx","components/AssignModal/AssignModal.tsx","components/AssignModal/hooks/useAssignModalConsultees.ts","api/consultations/hooks/useAssignConsultee.ts","components/AppBar/hooks/useAppBarMenuOptions.ts","components/AppBar/components/AppBarMenu/AppBarMenu.tsx","components/AppBar/components/AppBarMenu/TQAppBarMenu.tsx","components/AppBar/components/Breadcrumb/Breadcrumb.tsx","components/AppBar/hooks/useBreadcrumb.tsx","components/AppBar/components/MobileMenu/MobileMenuDrawerItem.tsx","components/AppBar/components/MobileMenu/MobileMenuDrawerItems.tsx","components/AppBar/components/MobileMenu/MobileMenuDrawer.tsx","components/AppBar/components/MobileMenu/MobileMenu.tsx","assets/logo.svg","assets/tq-logo.svg","styles/NiGlobalStyle.ts","styles/dataTableStyle.ts","styles/colours.ts","styles/TqGlobalStyle.ts","styles/StyledComponents.ts","components/AppBar/AppBar.tsx","hooks/useUpdateEffect.ts","components/CardLayout/CardLayout.tsx","components/CharacterCount/CharacterCount.tsx","components/ConsultationCard/constants.ts","components/ConsultationCard/components/ConsultationCardBody/ConsultationCardBody.tsx","components/ConsultationCard/util/renderCardLabelledValue.tsx","components/ConsultationCard/components/ConsultationCardFooter/ConsultationCardFooter.tsx","components/ConsultationCard/components/ConsultationCardHeader/ConsultationCardHeader.tsx","components/ConsultationCard/components/ConsultationCardMenu/ConsultationCardMenu.tsx","components/ConsultationCard/hooks/useConsultationCardMenuOptions.ts","components/ConsultationCard/components/ConsultationCardSkeleton/ConsultationCardSkeleton.tsx","components/ConsultationCard/ConsultationCard.tsx","components/ConsultationCardLoading/ConsultationCardLoading.tsx","components/ConsultationFilterMultiSelect/ConsultationFilterMultiSelect.tsx","components/ConsultationStatusIndicator/hooks/useConsultationStatuses.ts","components/ConsultationStatusIndicator/hooks/fragments/tqConsultationStatuses.config.ts","components/ConsultationStatusIndicator/hooks/fragments/niConsultationStatuses.config.ts","components/ConsultationStatusIndicator/ConsultationStatusIndicator.tsx","tools/isNearingDeadline/isNearingDeadline.ts","components/DateFilter/DateFilter.tsx","components/DataTablePagination/DataTablePagination.tsx","components/EmptyRecordsCard/EmptyDataCard.tsx","components/ExpandableParagraph/ExpandableParagraph.tsx","components/FileDragDrop/components/FilePreview.tsx","components/FileDragDrop/components/UploadingModal.tsx","components/FileDragDrop/hooks/useFileUpload.ts","components/FileDragDrop/components/FileInformation.tsx","components/FileDragDrop/FileDragDrop.tsx","components/FileDragDrop/hooks/usePreviewFiles.ts","components/FileDragDrop/util.ts","components/EditableTableCell/EditableTableCell.tsx","components/HiddenTableHeaderLabel/hiddenTableHeaderLabel.tsx","components/IsRegisteredDropDown/IsRegisteredCheckbox.tsx","components/IsRegisteredDropDown/IsRegisteredDropDown.tsx","components/Layout/hooks/usePermissions.ts","api/consultees/hooks/useConsulteePermission.ts","components/Layout/Layout.tsx","components/ManageTeam/ManageTeamFilterPermissionSelect.tsx","components/ManageTeam/InviteAdminUserForm.tsx","components/ManageTeam/hooks/useManageTeamRow.ts","api/consultees/hooks/useUpdateConsultee.ts","components/ManageTeam/InviteUserForm.tsx","components/ManageTeam/hooks/UseInviteUserForm.ts","components/ManageTeam/InviteUserModal.tsx","components/ManageTeam/ManageTeamActionMenu.tsx","components/ManageTeam/ManageTeamInviteUser.tsx","components/ManageTeam/ManageTeamUsers.tsx","components/ManageTeam/components/EditTeamRow.tsx","components/ManageTeam/components/ViewTeamRow.tsx","components/ManageTeam/ManageTeamRow.tsx","components/ManageTeam/RemoveUserModal.tsx","components/MobileModal/MobileModal.tsx","components/MobileMoreTab/MobileMoreTab.tsx","components/MobileTabList/MobileTabList.tsx","components/MultiSelect/MultiSelect.tsx","components/MultiSelect/MultiSelectItems.tsx","components/Notes/components/InternalExternalTag/InternalExternalTag.tsx","components/Notes/components/NotesFilterButtons/NotesFilterButtons.tsx","components/Notes/Notes.tsx","components/Notes/components/NotesHeading/NotesHeading.tsx","components/NotesInfoMessage/useNotesInfoText.ts","components/NotesInfoMessage/NotesInfoMessage.tsx","components/NumberBox/NumberBox.tsx","components/PageTitle/PageHeading.tsx","components/PermissionsTableCell/PermissionsTableCell.tsx","components/SearchPlanningApplications/SearchPlanningApplications.tsx","components/SearchText/SearchText.tsx","components/TableCellBadges/TableCellBadges.tsx","components/TableFiltersWithDate/TableFiltersWithDate.tsx","components/TableFiltersWithDate/filterUtils.ts","components/TeamsTableCell/TeamsTableCell.tsx","components/TeamTable/TeamTable.tsx","components/ThemeProvider/getTheme.ts","components/ThemeProvider/ThemeProvider.tsx","components/ToggleButton/ToggleButton.tsx","components/ToggleButtonGroup/ToggleButtonGroup.tsx","components/UploadConsultees/UploadConsultees.tsx","api/consultees/hooks/useUploadConsultees.ts","components/UploadConsultees/UploadConsulteesSummaryModal.tsx","components/UserTable/UserTable.tsx","assets/tq-powered-by-logo.svg","components/AppFooter/components/Copyright.tsx","components/AppFooter/components/TqAppFooter.tsx","assets/white_logo.svg","components/AppFooter/components/authorities/authorityLinkData.tsx","components/AppFooter/components/authorities/authoritiesLogos.tsx","components/AppFooter/components/authorities/NIFooterAuthorities.tsx","components/AppFooter/components/NiAppFooter.tsx","components/AppFooter/AppFooter.tsx","i18n/index.ts","components/AppInsights/AzureAppInsights.tsx","hooks/useGrowthBook/useStickyState.tsx","hooks/useGrowthBook/useGrowthBook.tsx","pages/CaseDetails/components/ApplicationStatusIndicator/hooks/useApplicationStatuses.ts","pages/CaseDetails/components/ApplicationStatusIndicator/ApplicationStatusIndicator.tsx","pages/CaseDetails/components/ApplicationCard/ApplicationCardBody.tsx","pages/CaseDetails/components/ApplicationDetails/hooks/utils.ts","pages/CaseDetails/components/ApplicationDetails/hooks/useApplicationDetailItems.ts","pages/CaseDetails/components/ApplicationDetails/hooks/useApplicationDetails.ts","pages/CaseDetails/components/ApplicationDetails/hooks/getContactDetails.ts","pages/CaseDetails/components/ApplicationDetails/hooks/useImportantDates.ts","pages/CaseDetails/components/ApplicationDetails/ApplicationDetails.tsx","pages/CaseDetails/components/CaseDetailsHeader/CaseDetailsHeader.tsx","pages/CaseDetails/hooks/useDetailsMenuOptions.ts","pages/CaseDetails/components/CaseDetailsSummary/CaseDetailsSummary.tsx","pages/CaseDetails/components/Comments/hooks/useViewComment.ts","pages/CaseDetails/components/Comments/CommentTypeTags.tsx","pages/CaseDetails/components/Comments/CommentsMobileCard.tsx","pages/CaseDetails/components/Comments/Comments.tsx","pages/CaseDetails/components/Comments/hooks/useCommentFilters.ts","pages/CaseDetails/components/DesktopTabList/DesktopTabList.tsx","pages/CaseDetails/util/renderDocumentMenuActionButton.tsx","pages/CaseDetails/components/Documents/DocumentsMobileCard.tsx","pages/CaseDetails/components/Documents/hooks/useDocumentFilters.ts","pages/CaseDetails/components/Documents/Documents.tsx","pages/CaseDetails/hooks/useDocumentMenuOptions.ts","pages/CaseDetails/components/MapWithPolygon/layer-toggle.tsx","pages/CaseDetails/components/MapWithPolygon/empty-layer-data.ts","pages/CaseDetails/components/MapWithPolygon/constants.ts","pages/CaseDetails/components/MapWithPolygon/MapWithPolygon.tsx","pages/CaseDetails/components/MapWithPolygon/types/active-layer.ts","pages/CaseDetails/components/MapWithPolygon/styles.ts","pages/CaseDetails/components/MapDetails/MapDetails.tsx","hooks/useIsVisible.ts","pages/CaseDetails/components/Plans/Plans.tsx","pages/CaseDetails/hooks/usePlansMenuOptions.ts","pages/CaseDetails/components/RelatedCases/components/RelatedApplicationCardHeader.tsx","pages/CaseDetails/components/RelatedCases/components/RelatedApplicationCard.tsx","pages/CaseDetails/components/RelatedCases/AddressDetail.tsx","pages/CaseDetails/components/RelatedCases/RelatedCases.tsx","pages/CaseDetails/hooks/useCaseDetailsFeatures.ts","pages/CaseDetails/hooks/useTabLabels.tsx","pages/CaseDetails/CaseDetails.tsx","api/caseDetails/hooks/useCaseDetails.ts","pages/ConsultationResponse/components/UploadedDocumentCard/UploadedDocumentCard.tsx","pages/ConsultationResponse/components/ArchivedPastResponseCard/ArchivedPastResponseCard.tsx","pages/ConsultationResponse/hooks/useResponseTypeDescription.ts","pages/ConsultationResponse/hooks/fragments/sortAnswers.ts","pages/ConsultationResponse/hooks/useResetResponseFormState.ts","pages/ConsultationResponse/hooks/useResponse.ts","pages/ConsultationResponse/hooks/fragments/getAnswers.ts","pages/ConsultationResponse/hooks/fragments/getPastResponses.ts","pages/ConsultationResponse/hooks/fragments/canSubmitAnswers.ts","pages/ConsultationResponse/hooks/fragments/canSubmitStandard.ts","pages/ConsultationResponse/components/ArchivedConsultationResponse/ArchivedConsultationResponse.tsx","pages/ConsultationResponse/components/RpcOtherResponse/RpcOtherResponseAnswers.tsx","pages/ConsultationResponse/components/RpcOtherResponse/RpcOtherResponse.tsx","pages/ConsultationResponse/components/ArchivedRpcResponses/ArchivedRpcResponses.tsx","pages/ConsultationResponse/components/ResponseMobileCard/ResponseMobileCard.tsx","pages/ConsultationResponse/components/ArchivedResponsesDataTable/ArchivedResponsesDataTable.tsx","pages/ConsultationResponse/components/DesktopResponses/DesktopResponses.tsx","pages/ConsultationResponse/components/MobileResponses/MobileResponses.tsx","pages/ConsultationResponse/components/OpenConsultationResponse/OpenConsultationResponse.tsx","pages/ConsultationResponse/components/PastResponses/PastResponses.tsx","pages/ConsultationResponse/components/ResponseHeader/ResponseHeader.tsx","pages/ConsultationResponse/constants.ts","pages/ConsultationResponse/components/ResponseOverdueForm/ResponseOverdueForm.tsx","pages/ConsultationResponse/components/RpcOtherResponses/RpcOtherResponses.tsx","pages/ConsultationResponse/components/RpcPastResponses/RpcPastResponses.tsx","pages/ConsultationResponse/components/RpcResponse/RpcResponse.tsx","pages/ConsultationResponse/components/RpcResponseAnswers/RpcResponseAnswers.tsx","pages/ConsultationResponse/components/RpcResponseAnswer/RpcResponseAnswer.tsx","api/responses/hooks/useUpdateAnswer.ts","pages/ConsultationResponse/components/StandardResponse/StandardResponse.tsx","pages/ConsultationResponse/components/StandardResponseForm/StandardResponseForm.tsx","pages/ConsultationResponse/ArchivedResponse.tsx","pages/ConsultationResponse/ConsultationResponse.tsx","pages/ConsultationSummary/components/ArchivedConsultationButtons/ArchivedConsultationButtons.tsx","pages/ConsultationSummary/components/TitleDescription/TitleDescription.tsx","pages/ConsultationSummary/components/CaseDetailsCard/CaseDetailsCard.tsx","pages/ConsultationSummary/components/CaseOfficerDetailsCard/CaseOfficerDetailsCard.tsx","pages/ConsultationSummary/components/DesktopSummary/DesktopSummary.tsx","pages/ConsultationSummary/components/MobileSummary/MobileSummary.tsx","pages/ConsultationSummary/components/OpenConsultationButtons/OpenConsultationButtons.tsx","pages/ConsultationSummary/hooks/useSummaryMenuOptions.ts","pages/ConsultationSummary/components/RequestExtensionModal/RequestExtensionModal.tsx","api/consultations/hooks/useRequestExtension.ts","pages/ConsultationSummary/components/SummaryHeader/SummaryHeader.tsx","pages/ConsultationSummary/ConsultationSummary.tsx","pages/Organisations/components/IsRegisteredTableCell.tsx","pages/Organisations/components/OrganisationDetailsPanel.tsx","api/parentOrganisations/hooks/useUpsertParentOrganisation.ts","pages/Organisations/hooks/useMessageProps.ts","pages/Organisations/components/RowEditButtons.tsx","pages/Organisations/components/TeamsPanel/AddTeam.tsx","api/teams/hooks/useAddTeam.ts","pages/Organisations/hooks/useTeamMessageProps.ts","pages/Organisations/components/TeamsPanel/TeamsPanel.tsx","pages/Organisations/hooks/useTeamColumns.tsx","pages/Organisations/components/TeamsPanel/TeamRowEditButtons.tsx","pages/Organisations/hooks/useTeamCanUpdate.ts","api/teams/hooks/useUpdateTeam.ts","pages/Organisations/components/UserPanel/UserDeletionModal.tsx","pages/Organisations/components/UserPanel/UserRowEditButtons.tsx","pages/Organisations/hooks/useUserTableCanUpdate.ts","pages/Organisations/components/UserPanel/UsersPanel.tsx","pages/Organisations/hooks/useUserPanelRecords.ts","pages/Organisations/hooks/useUserTableColumns.tsx","pages/Organisations/ManageOrganisation.tsx","pages/Organisations/CreateOrganisation.tsx","pages/Organisations/EditOrganisation.tsx","api/parentOrganisations/hooks/useParentOrganisation.ts","pages/Home/Home.tsx","pages/Measure/Measure.tsx","pages/Monitor/hooks/useIncomingConsultationsTrafficMonitorColumns.tsx","api/trafficMonitor/methods/postRetryIncomingConsultation.ts","pages/Monitor/hooks/useTrafficMonitorFilters.ts","pages/Monitor/components/RequestDetails.tsx","pages/Monitor/hooks/useExceptionLogsFilters.ts","pages/Monitor/components/GenerateGuidanceList.tsx","pages/Monitor/components/IncomingConsultationsMonitorTable.tsx","api/trafficMonitor/hooks/useExceptionLogs.ts","api/trafficMonitor/methods/getExceptionLogs.ts","pages/Monitor/components/ExceptionLogsMonitorFilters.tsx","api/trafficMonitor/hooks/useExceptionLogDetails.ts","api/trafficMonitor/methods/getExceptionLogDetails.ts","pages/Monitor/components/ExceptionLogMonitorDetails.tsx","pages/Monitor/components/ExceptionLogsMonitorTable.tsx","pages/Monitor/hooks/useExceptionLogsColumns.tsx","pages/Monitor/components/MonitorFilters.tsx","pages/Monitor/components/MonitorTable.tsx","pages/Monitor/hooks/useTrafficMonitorColumns.tsx","pages/Monitor/Monitor.tsx","pages/Errors/ErrorContent.tsx","pages/Errors/PageNotFound.tsx","pages/Errors/UnAuthorised.tsx","pages/Reports/components/reports/AnnualDfiReport/components/CompletionModal.tsx","api/reports/hooks/useSetDataDfiAnnualReportCompleted.ts","pages/Reports/components/reports/AnnualDfiReport/components/CompletionModalContent.tsx","pages/Reports/components/reports/AnnualDfiReport/components/KpiAccordion.tsx","pages/Reports/components/reports/AnnualDfiReport/types/ReviewResponse.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useEditingReviewState.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/fragments/formatKpiData.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/fragments/tqTitles.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/fragments/useTQFormattedDfiReport.ts","pages/Reports/components/reports/TqEnAnnualReport/hooks/useTqEnAgreedExtensionStatsLabels.ts","pages/Reports/components/reports/TqEnAnnualReport/hooks/useTqEnAppealConsultationStatsLabels.ts","pages/Reports/components/reports/TqEnAnnualReport/hooks/useTqEnTimeframeExceededStatsLabels.ts","pages/Reports/components/reports/TqEnAnnualReport/hooks/useTqEnTimelinessResponseStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/fragments/northernIrelandTitles.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useFormattedDfiReport.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/fragments/useNorthernIrelandFormattedDfiReport.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useAgreedExtensionStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useEiaConsultationStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useNonStatutoryTimelinessResponseStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useStatutoryTimelinessResponseStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/hooks/useStatutoryTimeframeExceededStatsLabels.ts","pages/Reports/components/reports/AnnualDfiReport/components/KpiTableCard.tsx","pages/Reports/components/reports/AnnualDfiReport/hooks/useKpiTableRowTranslations.ts","pages/Reports/components/reports/AnnualDfiReport/components/KpiValueCard.tsx","pages/Reports/components/reports/AnnualDfiReport/components/Review/ReviewCardFooter.tsx","pages/Reports/components/reports/AnnualDfiReport/components/Review/ReviewCard.tsx","pages/Reports/components/reports/AnnualDfiReport/hooks/useReviewResponseState.ts","pages/Reports/components/reports/AnnualDfiReport/components/Review/Review.tsx","pages/Reports/components/reports/AnnualDfiReport/components/Review/StaticReviewCard.tsx","pages/Reports/components/reports/AnnualDfiReport/components/StaticExportDfiReport/StaticExportDfiReport.tsx","pages/Reports/components/reports/AnnualDfiReport/components/StaticExportDfiReport/StaticKpiValueCard.tsx","pages/Reports/components/reports/AnnualDfiReport/components/StaticExportDfiReport/wrapStyledHtmlTemplate.ts","pages/Reports/components/reports/AnnualDfiReport/AnnualDfiReport.tsx","api/reports/hooks/useDfiAnnualReport.ts","pages/Reports/components/reports/AnnualDfiReport/CompleteDfiReport.tsx","api/reports/hooks/useDfiAnnualReportPdf.ts","pages/Reports/components/reports/AnnualDfiReport/DraftDfiReport.tsx","pages/Reports/utils/reportUtils.ts","pages/Reports/hooks/useReportColumns.ts","pages/Reports/hooks/useReportFilters.ts","api/filters/hooks/useFilterStatusesAll.ts","api/extensionRequests/hooks/useExtensionRequestStatuses.ts","pages/Reports/hooks/useReports.ts","pages/Reports/components/reports/ExtensionRequestsReport/hooks/useExtensionRequestsColumns.ts","pages/Reports/components/reports/ExtensionRequestsReport/hooks/useExtensionRequestsFilters.ts","pages/Reports/components/reports/ExtensionRequestsReport/ExtensionRequestsReport.tsx","api/reports/hooks/useExtensionRequestsReport.ts","pages/Reports/components/reports/ExtensionRequestsReport/ExtensionRequestsReportMobile.tsx","pages/Reports/components/reports/LateResponsesReport/hooks/useLateResponseColumns.ts","pages/Reports/components/reports/LateResponsesReport/hooks/useLateResponseFilters.ts","pages/Reports/components/reports/LateResponsesReport/LateResponsesReport.tsx","api/reports/hooks/useLateResponsesReport.ts","pages/Reports/components/reports/LateResponsesReport/LateResponsesReportMobile.tsx","pages/Reports/components/reports/OutstandingResponsesReport/hooks/useOutstandingResponseColumns.ts","pages/Reports/components/reports/OutstandingResponsesReport/hooks/useOutstandingResponseFilters.ts","pages/Reports/components/reports/OutstandingResponsesReport/OutstandingResponsesReport.tsx","api/reports/hooks/useOutstandingResponsesReport.ts","pages/Reports/components/reports/OutstandingResponsesReport/OutstandingResponsesReportMobile.tsx","pages/Reports/components/reports/RespondedOnTimeReport/hooks/useRespondedOnTimeColumns.ts","pages/Reports/components/reports/RespondedOnTimeReport/hooks/useRespondedOnTimeFilters.ts","pages/Reports/components/reports/RespondedOnTimeReport/RespondedOnTimeReport.tsx","api/reports/hooks/useRespondedOnTimeReport.ts","pages/Reports/components/reports/RespondedOnTimeReport/RespondedOnTimeReportMobile.tsx","pages/Reports/components/reports/RespondedYearToDateReport/hooks/useRespondedYearToDateColumns.ts","pages/Reports/components/reports/RespondedYearToDateReport/hooks/useRespondedYearToDateFilters.ts","pages/Reports/components/reports/RespondedYearToDateReport/RespondedYearToDateReport.tsx","api/reports/hooks/useRespondedYearToDateReport.ts","pages/Reports/components/reports/RespondedYearToDateReport/RespondedYearToDateReportMobile.tsx","pages/Reports/components/BaseReport/BaseReport.tsx","pages/Reports/components/MobileReportFiltersModal/MobileReportFiltersModal.tsx","pages/Reports/components/MobileReportFiltersModal/MobileReportModal.tsx","pages/Reports/components/ReportCard/ReportCard.tsx","pages/Reports/components/ReportDates/ReportDates.tsx","pages/Reports/components/ReportFilters/ReportFilters.tsx","pages/Reports/components/ReportFiscalYear/StatusIndicator.tsx","pages/Reports/components/ReportFiscalYear/ReportFiscalYear.tsx","api/reports/hooks/useDfiAnnualReports.ts","pages/Reports/components/ReportModal/ReportModal.tsx","pages/Reports/components/ReportModalContent/ReportModalContent.tsx","pages/Reports/components/ReportModalContentSwitch/ReportModalContentSwitch.tsx","pages/Reports/Report.tsx","pages/Reports/Reports.tsx","pages/Search/components/ConsultationAssigneeFilter/ConsultationAssigneeFilter.tsx","pages/Search/components/ConsultationAuthorityFilter/ConsultationAuthorityFilter.tsx","pages/Search/components/ConsultationCategoryFilter/ConsultationCategoryFilter.tsx","pages/Search/Search.styles.tsx","pages/Search/components/ConsultationDateFilter/ConsultationDateFilter.tsx","pages/Search/components/ConsultationShow/ConsultationShow.tsx","pages/Search/components/ConsultationSort/ConsultationSort.tsx","pages/Search/components/ConsultationStatusFilter/ConsultationStatusFilter.tsx","api/filters/hooks/useFilterStatuses.ts","pages/Search/components/ConsultationTypeFilter/ConsultationTypeFilter.tsx","pages/Search/components/ConsultationViewType/ConsultationViewType.tsx","pages/Search/components/ConsultationViewTypeMobile/ConsultationViewTypeMobile.tsx","pages/Search/components/ConsultationTeamFilter/ConsultationTeamFilter.tsx","pages/Search/components/SideFilter/SideFilter.tsx","hooks/useClearAllFilters.ts","pages/Search/components/FilterModal/FilterModal.tsx","pages/Search/components/StatisticsBar/StatisticsChartDisplay.tsx","pages/Search/components/StatisticsBar/StatisticsBar.tsx","api/reports/hooks/useStatisticsReport.ts","pages/Search/components/StatisticsChart/StatisticsChart.tsx","pages/Search/components/TopFilter/TopFilter.tsx","pages/Search/Search.tsx","pages/ManageAdminUsers/hooks/useGetAdminUsersRecords.ts","api/adminUsers/hooks/useGetAdminUsers.ts","components/TQAdminProvider/TQAdminProvider.tsx","pages/ManageAdminUsers/ManageAdminUsers.tsx","pages/ManageConsultees/components/Organisations/components/OrganisationFilters.tsx","pages/ManageConsultees/components/Organisations/hooks/useGetManageOrganisationRecords.ts","pages/ManageConsultees/components/Organisations/ManageOrganisations.tsx","pages/ManageConsultees/components/Organisations/hooks/useManangeOrganisationColumns.tsx","pages/ManageConsultees/hooks/useGetManageTeamRecords.ts","pages/ManageConsultees/styles/styles.ts","pages/ManageConsultees/components/Teams/components/TeamFilters.tsx","pages/ManageConsultees/components/Teams/ManageTeams.tsx","pages/ManageConsultees/components/Teams/hooks/useManageTeamColumns.tsx","pages/ManageConsultees/components/Users/components/UsersFilters.tsx","pages/ManageConsultees/components/Users/ManageUsers.tsx","pages/ManageConsultees/components/Users/hooks/useManageUsersColumns.tsx","pages/ManageConsultees/ManageConsultees.tsx","pages/ManageConsultees/hooks/useManageTabLabels.ts","pages/ManageTeam/hooks/useGetManageTeamConsulteeRecords.ts","api/consultees/hooks/useManageTeamConsultees.ts","components/ConsulteeAdminProvider/ConsulteeAdminProvider.tsx","pages/ManageTeam/ManageTeam.tsx","App.tsx","Root.tsx","config/documentConfig.ts","useInitMsal.ts","index.tsx"],"names":["BANNER_TIMEOUT","PUBLIC_REGISTER_APPLICATION_URL","concat","process","TERMS_CONDITIONS_URL","ROUTES","DatePickerFormats","useLocaleDatePickerFormat","t","useTranslation","useCallback","dateFormat","datepickerFormat","placeHolderText","datePickerPlaceHolderText","StandardDateFormats","defaultValues","date","dateAndTime","fileNameSuffix","useFormatLocaleDate","dateValue","format","returnFormat","parsedFormat","formatDate","ActionMenuButton","_ref","options","consultationId","documentRequest","label","small","darkContrast","tvs","useThemedValueSwitch","isMobile","useIsMobile","buttonWidth","menuButtonTQStyles","tq","height","borderColor","color","_active","border","bgColor","tqMenuButtonComponent","UnderlineButton","Button","_jsxs","Menu","children","_jsx","MenuButton","fontSize","minWidth","role","ni","rightIcon","FaChevronDown","variant","size","COLOURS","blue","borderWidth","sx","as","MenuList","mt","overflowX","width","map","option","MenuItem","lineHeight","onClick","_option$onClick","call","iconRight","Flex","justifyContent","alignItems","w","icon","Icon","gridGap","ActionMenuButtonEllipsis","ariaLabel","Box","IconButton","FaEllipsisH","event","stopPropagation","position","right","whiteSpace","mr","Date","MOCK_CASE_DETAILS_PLANS","id","name","datePublished","documentType","drawingNumber","description","MOCK_CASE_DETAILS_DOCUMENT","sensitive","MOCK_CASE_DETAILS_DOCUMENTS","MOCK_CASE_DETAILS_COMMENTS","commentOrder","type","isPetition","isGroup","documents","MOCK_CASE_DETAILS_ADDRESS","address","relatedApplicationId","postcode","ward","authority","MOCK_CASE_DETAILS_APPLICATION","planningApplicationReferenceNo","applicationStatus","applicationType","easting","northing","planningPortalReference","applicantsName","dateReceived","decisionDate","permissionExpiryDate","dateValidated","applicationDecisionType","applicationDevelopmentType","districtElectoralArea","wardName","latestNeighbourConsultationDate","neighbourConsultationExpiryDate","standardConsultationDate","standardConsultationExpiry","dateLastAdvertised","latestAdvertisementExpiryDate","committeeDate","applicationCalledInDate","departmentReferralDate","agentsName","agentsCompany","agentsPhoneNumber","agentsEmailAddress","caseOfficeName","caseOfficerContactNumber","proposalText","plans","comments","MOCK_CONSULTATION_CARD","status","consultationType","category","assigneeId","assignee","reference","summaryDescription","requestedDate","deadlineDate","getFullYear","hasAnyResponses","isArchived","MOCK_CONSULTATION","lastVisitedDate","lastVisitedConsulteeId","lastVisitedBy","reasonForConsultation","uprn","caseOfficerName","caseOfficerContactEmail","hasExtensionRequest","lastRespondedDate","lastRespondedConsulteeId","lastRespondedBy","notes","noteDate","noteText","noteType","consulteeName","questions","questionNumber","text","defaultAnswer","consultationMapConstraintDetails","constraintCode","constraintName","enabled","tenantId","MOCK_CONSULTATION_RPC","MOCK_RPC_RESPONSE_ANSWERS","consulteeId","question","answer","dateCreated","dateModified","organisation","MOCK_RPC_PAST_RESPONSE_ANSWERS","MOCK_RPC_OTHER_RESPONSE_ANSWERS","MOCK_RPC_RESPONSE","response","responseTypeId","responseType","referenceNumber","answers","ConsultationViewTypes","HttpStatusCode","KpiCategory","Permission","Admin","Consultee","TQAdmin","MOCK_RESPONSE_PAST_RESPONSE_DOCUMENT","responseId","MOCK_RESPONSE_PAST_RESPONSE","submittedDate","MOCK_RESPONSE_ANSWER","questionId","approved","organisationName","email","mockHttpCodes","MOCK_TRAFFIC_DATA","JSON","stringify","msg","fact1","fact2","fact3","fact4","fact5","fact6","fact7","fact8","fact9","fact10","fact11","fact12","fact13","fact14","fact15","fact16","fact17","fact18","fact19","Array","slice","fill","undefined","_item","i","returnHttpCode","Math","floor","random","addDays","httpCode","direction","apiCall","detail","getAdminUsers","apiGet","getApplicationDocument","request","documentId","getCaseDetails","API_QUERY_KEYS","getAuditRequests","getConsultation","getConsultations","getConsulteePermission","getConsultees","getConsulteeTeams","getDfiAnnualReport","getTqEnAnnualReport","getDfiAnnualReports","getFilterAuthorities","getFilterCategories","getFilterConsultationTypes","getFilterStatuses","getExtensionRequestStatuses","getExtensionRequestsReport","getMap","getManageTeamConsultees","getAllTeams","getParentOrganisation","getParentOrganisations","getAllParentOrganisations","getPermissions","getReasonsForLateResponse","getResponseTypes","getResponses","getStatisticsReport","getLateResponsesReport","getOutstandingResponsesReport","getRespondedOnTimeReport","getRespondedYearToDateReport","getTQAdmins","getManageConsultees","getTeams","getIncomingConsultations","getSortOptions","getExceptionLogs","getExceptionLogDetails","QueryDefaults","staleTime","PermissionsQueryDefaults","useMapPolygon","useQuery","then","_response$geoJson","_response$geoJson$fea","geoJson","features","length","toString","getMapPolygon","useConsultees","organisationRequestState","atom","key","default","organisationIdState","organisationState","organisationCreatedState","useResetOrganisationState","useRecoilTransaction_UNSTABLE","reset","dfiReportBestPracticeResponseIsEditingState","dfiReportInfoOnLateResponseIsEditingState","dfiReportInfoOnLateResponseState","dfiReportBestPracticeResponseState","dfiReportIsEditingState","selector","get","dfiReportUpdateValuesState","_ref2","reportYear","annualDfiReportYearState","infoOnLateResponse","bestPracticeResponse","EMAIL_REGEX","NAME_REGEX","MAX_FILE_SIZE","baseApiUrl","b2cScope","b2cAuthority","b2cPolicySignIn","formatBytes","bytes","decimals","arguments","dm","max","log","parseFloat","pow","toFixed","B2C_FLOWS","editProfile","passwordReset","passwordResetEmail","getB2CLink","flow","state","flowId","b2cState","redirectUri","window","location","origin","encodeURIComponent","replace","getFinancialYear","now","year","getMonth","isEmailValid","emailAddress","_emailAddress$match$l","_emailAddress$match","Boolean","match","isNameValid","_name$match$length","_name$match","isOverdue","consultation","setHours","isRpc","uniqBy","arr","predicate","isArray","cb","o","filter","item","reduce","has","set","Map","values","upperCaseFirstLetter","str","charAt","toUpperCase","ToDisplayFeatureFlagged","flagName","featureToBeDisabled","isFeatureEnabled","useFeatureIsOn","featureFlag","useFeatureValue","toDisplay","isInspection","manageTeamPageSizeState","manageTeamPageNumberState","manageTeamSearchState","manageTeamOrganisationFilterState","manageTeamSortByDescendingFilterState","manageTeamSortByColumnFilterState","manageTeamsRequestState","_get","sortByDesc","sortByColumn","startsWith","nameOrEmailSearchText","pageNumber","pageSize","sortByValue","sortBy","manageConsulteeActiveTab","manageConsulteePageSizeState","manageConsulteePageNumberState","manageConsulteeSearchState","manageConsulteeOrganisationFilterState","manageConsulteeRegistrationFilterState","manageConsulteeSortByDescendingFilterState","manageConsulteeSortByColumnFilterState","manageConsulteesRequestState","filteredByOption","manageConsulteeUploadState","manageUserDeleteState","manageUserToDeleteState","manageOrganisationsPageSizeState","manageOrganisationsPageNumberState","manageOrganisationsPaginationState","mangeOrganisationsSearchState","mangeOrganisationsOrderByColumnState","mangeOrganisationsOrderByDescendingState","organisationsRequestState","orderByColumn","orderByDescending","removeUserState","showRemoveUserModalState","showInviteUserModalState","manageUsersPageSizeState","manageUsersPageNumberState","manageUsersSearchState","manageUsersFilterTeamState","manageUsersFilterPermissionState","inviteEmailState","inviteNameState","inviteTeamsState","invitePermissionState","inviteRequestState","teamIds","team","value","permissionId","useResetInviteUserState","consulteeIdState","consulteeNameState","consulteeEmailState","consulteeOrganisationIdsState","consulteeParentOrganisationIdsState","isAdminState","isConsulteeState","isTQAdminState","hasPermissionState","isAdminOrConsulteeState","permissionValuesState","_ref3","consulteeOrganisationIds","openReportModalState","openReportModalMobileState","reportState","reportStartDateState","reportEndDateState","reportFiltersState","reportTextState","reportOrderByColumnState","reportOrderByDescendingState","reportPageSizeState","reportPageNumberState","reportDataState","reportPaginationState","reportSortByState","desc","reportRequestState","report","startDate","endDate","hasDateFilter","toISOString","forEach","selectedItems","selected","approveResponseState","responseTypeIdIsConsultedInErrorState","responseTypeIdState","responseDetailState","responseFilesState","responseSupportingFilesState","responseUploadRequiredState","useResponseFilesState","responseDetail","responseFiles","supportingFiles","requiredFiles","reasonForLateReasonIsOtherState","reasonForLateResponseIdState","reasonForLateResponseDetailState","reasonForLateResponseState","reasonForLateReasonIsOther","reasonForLateResponseId","reasonForLateResponseDetail","selectedConsultationIdsState","consultationIdsToAssignState","consultationAtoms","filterConsultationTypeState","filterStatusState","filterAssigneeState","filterAuthorityState","filterCategoryState","filterDateFromState","filterDateToState","filterTeamState","filterAtoms","searchSortState","searchViewTypeState","Open","filterArchiveRequestState","archive","Archived","searchAssignedToMeState","searchTextState","searchPageNumberState","searchPageSizeState","searchAtoms","searchRequestState","dateFrom","dateTo","assignedToMe","assigneeIds","authorityIds","categoryIds","statusIds","typeIds","searchText","sortOptionId","statisticsRequestState","searchViewTabIndexState","showAddNoteState","showRequestExtensionState","teamPageSizeState","teamPageNumberState","teamSortByDescendingFilterState","teamSortByColumnFilterState","teamSearchState","teamEditingRowIdState","teamEditingRowTeamNameState","teamEditingRowEmailState","teamEditingRowBackofficeCodeState","teamsGetRequestState","teamUpdateRequestState","teamName","backOfficeTeamName","trafficMonitorFiltersState","trafficMonitorStartDateState","trafficMonitorEndDateState","trafficMonitorOrderByColumnState","trafficMonitorOrderByDescendingState","trafficMonitorPageSizeState","trafficMonitorPageNumberState","trafficMonitorDirectionState","trafficMonitorTextSearchState","trafficMonitorSortByState","trafficMonitorDataState","trafficMonitorPaginationState","trafficMonitorRequestState","_get$toISOString","_get$toISOString2","_get$filter$0$selecte","_get$filter$","_get$filter$$selected","_get$filter$0$selecte2","_get$filter$2","_get$filter$2$selecte","_get$filter$0$selecte3","_get$filter$3","_get$filter$3$selecte","keyword","x","isSearchText","outboundTrafficMonitorFiltersState","outboundTrafficMonitorStartDateState","outboundTrafficMonitorEndDateState","outboundTrafficMonitorOrderByColumnState","outboundTrafficMonitorOrderByDescendingState","outboundTrafficMonitorPageSizeState","outboundTrafficMonitorPageNumberState","outboundTrafficMonitorDirectionState","outboundTrafficMonitorTextSearchState","outboundTrafficMonitorDataState","outboundTrafficMonitorPaginationState","outboundTrafficMonitorSortByState","outboundTrafficMonitorRequestState","exceptionLogsDetailsModalState","exceptionLogsDetailsState","exceptionLogsFiltersState","exceptionLogsStartDateState","exceptionLogsEndDateState","exceptionLogsOrderByColumnState","exceptionLogsOrderByDescendingState","exceptionLogsPageSizeState","exceptionLogsPageNumberState","exceptionLogsTextSearchState","exceptionLogsSortByState","exceptionLogsRequestState","exceptionLogType","sortOrder","incomingConsultationsTrafficMonitorFiltersState","incomingConsultationsByReferenceNumberState","incomingConsultationsTrafficMonitorOrderByColumnState","incomingConsultationsTrafficMonitorOrderByDescendingState","incomingConsultationsTrafficMonitorPageSizeState","incomingConsultationsTrafficMonitorPageNumberState","incomingConsultationsTrafficMonitorSortByState","incomingConsultationsTrafficMonitorRequestState","statusValue","applicationReferenceNumberValue","UseIncomingConsultationsTrafficMonitorState","filterState","pageNumberState","pageSizeState","sortByState","orderByColumnState","orderByDescendingState","requestState","UseTrafficMonitorState","callDirection","useState","startDateState","endDateState","directionState","textSearchState","resultsDataState","paginationState","manageConsulteesUserTableEditingRowState","manageOrganisationUserTableEditingRowState","manageOrganisationUserTableNameInputState","manageOrganisationUserTableEmailInputState","manageOrganisationUserTablePermissionState","manageOrganisationUserTableTeamsState","manageOrganisationUserTableIsRegisteredState","manageOrganisationUserTableRequestState","userName","teams","isRegistered","useConsulteeTeams","deleteConsultee","apiDelete","inviteConsultee","apiPost","updateConsultee","handleError","async","res","json","error","Promise","reject","catch","errors","title","traceId","statusText","pca","DEFAULT_API_FETCH_OPTIONS","headers","FORM_API_FETCH_OPTIONS","url","params","queryParams","toQueryParams","apiFetch","apiGetFile","apiFetchBlob","body","method","apiPut","apiFetchForm","init","_FORM_API_FETCH_OPTIO","_init$headers","token","getToken","fetch","Authorization","ok","getBody","_DEFAULT_API_FETCH_OP","_init$headers2","_DEFAULT_API_FETCH_OP2","_init$headers3","blob","paginationInfo","parsePaginationHeader","data","isValidJson","parse","resolve","allAccounts","getAllAccounts","setActiveAccount","getTokenWithRedirectFallback","signInPolicyPath","impersonatePolicyPath","_res$headers","paginationHeader","searchParams","URLSearchParams","Object","entries","arrayValue","append","from","keys","sortValueLabel","a","b","uploadConsultees","useDeleteConsultee","queryClient","useQueryClient","useMutation","onSuccess","invalidateQueries","queryKey","useInviteConsultee","useManageAllTeams","parentOrganisationId","getFilterTeams","useManageConsultees","useRecoilValue","setPageNumber","useSetRecoilState","_data$paginationInfo","totalCount","consultees","items","usePermissions","addNote","assignConsultee","requestExtension","useConsultation","useConsultations","consultations","useSortOptions","sortOptions","onError","useFilterAuthorities","useFilterCategories","useFilterConsultationTypes","useAllParentOrganisations","useParentOrganisations","setManageOrganisationsPagination","parentOrganisations","upsertParentOrganisation","useBaseReport","apiQueryKey","reportMethod","setReportData","setReportPagination","pagedResults","useBaseReportCsv","allItemsRequest","formatLocaleDate","link","document","createElement","href","URL","createObjectURL","download","header","click","useExtensionRequestsReportCsv","getExtensionRequestsReportCsv","useLateResponsesReportCsv","getLateResponsesReportCsv","useOutstandingResponsesReportCsv","getOutstandingResponsesReportCsv","useRespondedOnTimeReportCsv","getRespondedOnTimeReportCsv","useRespondedYearToDateReportCsv","getRespondedYearToDateReportCsv","getDfiAnnualReportDocumentPath","updateDfiAnnualReport","useUpdateDfiAnnualReport","useReasonsForLateResponse","getResponseDocument","submitResponse","updateAnswer","useResponses","useResponseTypes","useSubmitResponse","useAuditRequests","setPageNumberState","setData","setPagination","_data$auditRequests$i","_data$auditRequests","auditRequests","useIncomingConsultations","incomingConsultations","err","addTeam","updateTeam","useGetTeams","organisationId","StyledAlert","props","isNI","Alert","p","bg","AlertIcon","h","AlertDescription","AddNote","_t$toString","_t$toString2","useParams","mutate","useAddNote","showAddNote","setShowAddNote","useRecoilState","noteTypeId","setNoteTypeId","setNoteText","noteAddState","setNoteAddState","handleCancel","setTimeout","_Fragment","VisuallyHidden","FormProvider","Form","onValidSubmit","handleSubmit","mb","ValidatedRadioGroup","onChange","validation","required","message","Grid","gap","Radio","ValidatedTextArea","placeholder","maxLength","target","Text","gridAutoFlow","Divider","my","useAssignModal","banner","useBanner","selectedConsultationIds","consultationIdsToAssign","setConsultationIdsToAssign","resetSelectedConsultationIds","useResetRecoilState","resetConsultationIdsToAssign","consultationIdsToHighlight","setConsultationIdsToHighlight","showAssignButton","showAssignModal","isConsultationHighlighted","includes","handleAssignSelected","handleAssignConsultation","handleClose","duration","onCloseComplete","useFileDownload","downloadApplicationDocumentApi","downloadResponseDocumentApi","openFileInNewTab","path","open","openMeasuringToolInNewTab","split","queryString","indexOf","partEncodedQueryString","substring","downloadFile","filename","openResponseDocument","documentUri","openApplicationDocument","downloadApplicationDocument","_documentRequest$file","fileName","applicationReferenceNumber","openMeasuringTool","useNavigate","navigate","useNavigateRR","navigateBack","navigateToHome","navigateToPageNotFound","navigateToUnauthorised","navigateToDashboard","navigateToReports","navigateToManageTeam","navigateToTrafficMonitor","navigateToManageConsultees","navigateToCreateOrganisation","navigateToManageAdminTeam","navigateToErrorPage","NOT_FOUND","BAD_REQUEST","FORBIDDEN","UNAUTHORIZED","navigateToReport","reportName","navigateToSummary","navigateToResponse","navigateToArchivedResponse","navigateToDetails","navigateToB2CEditProfile","navigateToB2CChangePassword","navigateToOrganisation","navigateToTeam","navigateToTeamUsers","useNavigation","detailsResponsePageRegEx","getConsultationId","matches","matchAll","m","isHomePage","isSearchPage","isReportsPage","isReportPage","isSummaryPage","isCaseDetailsPage","isResponsePage","isArchivedResponsePage","isManageTeamPage","isMonitorPage","isCreateOrganisationPage","isManageOrganisationPage","isConsultationPage","isBreadcrumbPage","isLoginPage","useResetSearchState","useShowViewResponse","ARCHIVED_STATUSES","useCanAddNote","AddNoteButton","buttonProps","canAddNote","FaStickyNote","base","lg","toggleAddNote","AssigneeDetails","topPadding","showFooter","showLastResponded","lastUpdated","lastUpdatedDate","lastUpdatedConsultee","mobileLastVisited","HStack","FormLabel","display","textTransform","desktopLastVisited","fontWeight","px","toLowerCase","gridTemplateColumnsStyle","Card","textAlign","FormControl","templateColumns","templateRows","gridRowGap","pos","div","d","ConsultationStatusIndicator","top","screenReaderLabel","flexWrap","deadline","getTime","currentDateTime","daysRemaining","ceil","getDaysRemaining","backgroundColor","gray","GridItem","pr","xl","AssignModal","isOpen","onClose","useAssignModalConsultees","_consultationData$con","_consultationData$con2","consultationData","consulteeData","consulteeList","selectedConsulteeIds","consultee","sort","disabled","useAssignConsultee","content","ModalHeader","FaUserCircle","ModalCloseButton","ModalBody","overflow","_consultees$find","find","consultationIds","ValidatedSelect","AttentionMessage","MobileModal","ModalFooter","isFullWidth","form","Modal","ModalOverlay","ModalContent","useAppBarMenuOptions","isAdmin","isTQAdmin","instance","useMsal","manageTeam","changePassword","logOut","logout","postLogoutRedirectUri","MdLogout","trafficMonitor","manageTQUsers","manageConsultees","menuOptions","splice","AppBarMenu","resetSearch","isAdminOrConsultee","getActiveColors","isActive","goToDashboard","TQAppBarMenu","active","Breadcrumb","hasPermission","navigationLabel","handleNavigateClick","useBreadcrumb","py","LinkButton","leftIcon","FaChevronLeft","MobileMenuDrawerItem","minHeight","white","borderBottom","neutral","_hover","_focus","outline","borderRadius","MobileMenuDrawerItems","isAuthenticated","useIsAuthenticated","VStack","divider","StackDivider","spacing","overflowY","loginRedirect","scopes","MdLogin","MobileMenuDrawer","Drawer","placement","DrawerOverlay","DrawerContent","tqc","FaTimes","MobileMenu","onOpen","useDisclosure","FaBars","zIndex","boxShadow","NiGlobalStyle","createGlobalStyle","_templateObject","_taggedTemplateLiteral","dataTableStyle","borderCollapse","outlineStyle","borderTop","CUSTOM_COLOURS","CUSTOM_TQ_COLOURS","TqGlobalStyle","filterFormControlStyle","flex","flexDirection","filterSelectStyle","ml","AppBar","isTQ","headerRef","useRef","pathname","useLocation","useUpdateEffect","deps","firstRender","React","useEffect","current","focus","tabIndex","ref","maxH","Container","className","isDisabled","_disabled","pointerEvents","Image","src","tqLogo","logo","alt","CardLayout","heading","rest","Heading","CharacterCount","_value$length","maxCount","CHECKBOX_SIZE","CARD_LEFT_PADDING_SIZE","CARD_RIGHT_PADDING_SIZE","ROW_TEMPLATE_COLUMNS_DESKTOP","ConsultationCardBody","DetailsCardBody","ExpandableParagraph","maxCharacters","xs","sm","md","renderCardLabelledValue","boxProps","nowrap","span","ConsultationCardFooter","_consultation$assigne","isHighlighted","defaultFooterColor","rpcFooterColor","DetailsCardFooter","gridTemplate","Typography","justifySelf","FIRST_ROW_DESKTOP_TEMPLATE","FIRST_ROW_MOBILE_TEMPLATE","MOBILE_LABEL_LAYOUT","gridTemplateColumns","ConsultationCardHeader","setSelectedConsultationIds","DetailsCardHeader","Checkbox","gridArea","isChecked","checked","e","ConsultationCardMenu","justifyItems","showViewResponse","FaClipboardList","push","FaCommentDots","FaUser","FaIdCard","useConsultationCardMenuOptions","ConsultationCardSkeleton","DetailsCard","Skeleton","background","ConsultationCard","defaultCardStyles","highlightedCardStyles","green","cursor","ConsultationCardLoading","_","index","left","transform","Spinner","ConsultationFilterMultiSelect","stylingProps","setSelectedItems","MultiSelect","handleSelect","selectedValue","selectedItem","handleRemoveSelection","isInModal","STANDARD_WIDTH","useConsultationStatuses","New","badgeProps","Active","FaClock","Update","Resubmission","Overdue","Responded","Closed","Withdrawn","Determined","tqConsultationStatusesConfig","black","yellow","red","Extended","niConsultationStatusesConfig","_consultation$status","parentBadgeProps","daysTillDeadline","isNearingDeadline","Badge","DateFilter","_endDate$getFullYear","_startDate$getFullYea","groupTitle","initialStartDate","initialEndDate","onSetStartDate","onSetEndDate","onSubmit","fromDateLabel","toDateLabel","epoch","setStartDate","setEndDate","datePickerFormat","handleDateChange","dateType","mode","isRequired","DatePicker","placeholderText","minDate","maxDate","yearDropDownFromTo","popperModifiers","preventOverflow","DataTablePagination","tableRef","tableScrollHeaderOffset","setPageSize","setPage","newPageNumber","_paginationInfo$total","totalPages","scrollTo","offsetTop","maxPages","TablePagination","pageCount","pageIndex","previousPage","nextPage","gotoPage","page","pageOptions","EmptyDataCard","showLessText","showMoreText","showButton","expanded","onExpanded","originalText","setOriginalText","truncatedText","setTruncatedText","isExpanded","setIsExpanded","maxCharactersBeforeTruncation","useBreakpointValue","showMore","showLess","buttonText","originalTextLength","newText","renderText","textToRender","maxWidth","Link","prevIsExpanded","FilePreview","uploadedFile","onRemoveFile","alignContent","FileIcon","fileType","file","uploadedDate","FaTrash","UploadingModal","uploadingFiles","progress","isCentered","mx","Progress","colorScheme","percent","bytesUploaded","totalBytes","documentStoreTenantId","DEFAULT_PROGRESS","StyledList","styled","ul","FileInformation","FileDragDrop","multiple","groupingReference","setUploadedFiles","showFileInfoMessage","dragDropProps","previewFiles","setPreviewFiles","concatPreviewFiles","usePreviewFiles","files","previousFiles","newFiles","uploadFile","deleteFile","onUploadComplete","onUploadFailed","client","useDocumentStore","setProgress","setFiles","overwriteExistingFile","uploadRequest","metadata","MimeType","totalSize","currentFile","getTotalBytes","uploadOptions","onUploadPercentageChange","percentage","Error","uri","useFileUpload","uploadedFiles","childNodes","removeFile","existingFiles","f","DragDrop","FaCloudUploadAlt","EditableTableCell","rowValue","editingState","valueState","rowIndex","errorMessage","validator","dataTestId","currentEditRowIndex","setRecoilValue","setValue","isInputInvalid","setIsInputInvalid","isInvalid","htmlFor","Input","onBlur","onBlurHandler","FormErrorMessage","flexGrow","hiddenTableHeaderLabel","labelText","style","IsRegisteredCheckbox","recoilState","inputId","defaultValue","setIsRegistered","IsRegisteredDropDown","Select","isConsultee","isLoading","setConsulteeId","setName","setEmail","setOrganisationIds","setParentOrganisationIds","setIsAdmin","setIsConsultee","setIsTQAdmin","organisationIds","parentOrganisationIds","permission","useConsulteePermission","hasPageViewPermissions","setHasPageViewPermissions","isFetchingPermissions","setIsFetchingPermissions","tqAdminPermissionRequired","Layout","layoutTopPadding","useLayoutEffect","documentElement","handleKeyDown","_event$key","tagName","preventDefault","mainElement","getElementById","hasAttribute","setAttribute","addEventListener","removeEventListener","pt","Center","AnimatedSpinner","AppFooter","ManageTeamFilterPermissionSelect","_permissionData$permi","_permissionData$permi2","permissionState","includeAllOption","includePermissionDetails","permissionData","setPermission","mountedRef","permissionOptions","selectablePermissions","permissions","selectedPermission","permissionDetails","Number","opt","InviteAdminUserForm","pageType","teamsLabel","permissionLabel","fieldId","useManageTeamRow","isUpdatingConsultee","useUpdateConsultee","updateUser","user","onFailure","onUpdateConsultee","isUpdatingUser","InviteUserForm","teamOptions","emailIsInvalid","nameIsInvalid","canSubmit","onUpdateEmail","emailOnBlur","onUpdateName","nameOnBlur","onSendInvite","inviteName","inviteEmail","setEmailIsInvalid","setNameIsInvalid","setCanSubmit","setInviteEmail","setInviteName","inviteTeams","invitePermission","setInvitePermission","inviteRequest","setShowInviteUserModal","resetInviteState","isManageAdminUsersPage","_adminPermissionId","isNumeric","UseInviteUserForm","Stack","InviteUserModal","handleInvite","ManageTeamActionMenu","onEdit","onRemove","onResendInvite","FaEdit","FaEnvelope","FaUserTimes","ManageTeamInviteUser","showInviteUserModal","ManageTeamUsers","applicationUsers","showRemoveUserModal","resetShowRemoveUserModal","removeUserData","resetRemoveUserState","resetShowInviteUserModal","currentPage","ApplicationUsersPage","columnWidths","getTableHeaderBackground","getTableHeaderBorderColour","transparent","getGridGap","getTableHeaderBottomMargin","ManageTeamRow","RemoveUserModal","EditTeamRow","_data$permission","setEditable","setTeams","setUserName","_data$permission2","_data$teams","sortNumbers","permissionChanged","existingTeamValues","r","selectedTeamValues","u","acceptedInviteChanged","teamChanged","userNameChanged","hasChanged","showSuccessBanner","showFailedBanner","selectedTeam","existingTeams","teamToRemove","v","onUpdateUser","_teams$map","teamDetail","ViewTeamRow","setShowManageTeamRemoveUserModal","setRemoveUser","getBaseTemplateAreas","getLgTemplateAreas","templateAreas","TableCellBadges","alignSelf","onEditItem","onRemoveItem","_data$permission$valu","_data$teams$map","isEditable","handleRemove","contentProps","boxSizing","MobileMoreTab","closeOnSelect","borderBottomColor","clipPath","MobileTabList","activeTabIndex","tabLabels","onChangeActiveTab","TabList","pb","Tab","TabText","allowMultiSelect","controlShouldRenderValue","menuPortalTarget","menuZIndex","some","sitem","MultiSelectItems","float","pl","TiTimes","isTruncated","InternalExternalTag","niStyle","external","internal","tqStyle","NotesFilterButtons","activeFilter","onChangeActiveFilter","ToggleButtonGroup","ToggleButton","Notes","loading","maxNotesBeforePaging","setActiveFilter","filteredNotes","note","sortedNotes","sortNotes","noteA","noteB","pagedNotes","SkeletonText","noOfLines","activityFeedStyle","maxHeight","ActivityFeed","_note$consulteeName","ActivityItem","wordBreak","NotesHeading","notesInfoText","useNotesInfoText","Tooltip","hasArrow","FaInfoCircle","NotesInfoMessage","notesInfo","NumberBox","PageHeading","mobileHeading","h1","marginBottom","PermissionsTableCell","setPermissionsSate","SearchPlanningApplications","_incomingConsultation","_incomingConsultation2","_incomingConsultation3","_incomingConsultation4","_incomingConsultation5","_incomingConsultation6","_incomingConsultation7","incomingConsultationsData","refetchData","SearchText","searchState","recordCount","HiRefresh","hideSearchInfo","onChanged","setText","setSearchText","handleSearch","totalCountText","SearchInput","inputid","onSearch","searchOnCharacterCount","SearchInputField","SearchInputButton","TableFiltersWithDate","filters","onSetSelectedFilters","collapsible","showDateFilter","showFilters","setShowFilters","handleFilterChanged","callback","_filter$items","_newFilters$find$sele","newFilters","newFilter","handleFilterRemoval","FaSlidersH","prevShow","FaChevronUp","TeamsTableCell","teamState","setTeamsState","TeamTable","columns","pagination","sortByColumnState","sortByDescendingState","resetEditingState","setOrderBy","orderByValue","setOrderByValue","setSortBy","DataTable","disableSortRemove","disablePagination","enableOverflowScrollingContainer","onStateChange","_state$sortBy","_state$sortBy$","_state$sortBy2","_state$sortBy2$","newOrderBy","newOrderByValue","manualSortBy","tableLayout","padding","getTheme","locale","ApplyGlobalStyle","ThemeProvider","PP2ThemeProvider","activeStyles","inactiveStyles","styles","gridProps","buttons","Children","child","cloneElement","gridAutoColumns","UploadConsultees","showModal","setShowModal","FileUpload","accept","maxFiles","formData","FormData","handleChange","FaUpload","UploadConsulteesSummaryModal","uploadResponse","_uploadResponse$detai","success","fail","details","listStyle","paddingLeft","row","UserTable","users","Copyright","flexBasis","letterSpacing","TQPoweredByLogo","objectFit","TqAppFooter","footerMenu","FaLinkedinIn","FaFacebookF","FaTwitter","transparentize","gridColumnGap","subMenu","textDecoration","textUnderlineOffset","altText","NIFooterAuthorities","authorityLinkData","NiAppFooter","subMenuTitle","subMenuItems","mdlg","itemIndex","i18n","use","Backend","initReactI18next","backend","loadPath","react","useSuspense","lng","load","fallbackLng","ns","defaultNS","interpolation","escapeValue","lowerCaseLng","reactPlugin","ReactPlugin","ApplicationInsights","config","connectionString","enableAutoRouteTracking","enableCorsCorrelation","enableRequestHeaderTracking","enableResponseHeaderTracking","enableAjaxPerfTracking","isBrowserLinkTrackingEnabled","extensions","loadAppInsights","withAITracking","AppInsightsContext","Provider","isFunction","growthbook","GrowthBook","enableDevMode","trackingCallback","useGrowthBook","TenantID","growthBookStickyData","setGrowthBookStickyData","session","setStorage","storageValue","sessionStorage","localStorage","setItem","stickyValue","getItem","newValue","removeItem","useStickyState","parsedData","setFeatures","setAttributes","tenantID","getStatusItem","colour","bgColour","UnknownStatusItem","ApplicationStatusIndicator","separateLabel","statuses","useApplicationStatuses","Valid","Revoked","applicationStatusText","ApplicationCardBody","relatedCase","textExpanded","toggleClick","showExpanded","getSafeString","getDetail","getDetails","renderFormattedDate","application","_consultation$address","_application$applicat","_application$applicat2","pacReference","useApplicationDetails","dataItemsToDisplay","applicationDetails","useApplicationDetailItems","contactDetails","getContactDetails","importantDates","useImportantDates","finalApplicationDetails","itemsNotToDisplay","shouldDisplayDataItem","dataItemName","toLocaleLowerCase","ApplicationDetails","columnLayout","getRenderListConfig","addLabelColons","zebraRows","accessibleTextForEmptyValue","accordionPanelPadding","Accordion","allowMultiple","defaultIndex","AccordionItem","AccordionHeader","AccordionIconButton","AccordionPanel","ListRow","listItemColumns","renderListRows","CaseDetailsHeader","consultationSummary","respond","viewResponse","dashboard","FaListUl","useDetailsMenuOptions","actionButton","CaseDetailsSummary","_caseDetails$applicat","_caseDetails$applicat2","_caseDetails$applicat3","caseDetails","warning","applicationReference","maxW","useViewComment","comment","_comment$documents","Tag","CommentTypeTags","CommentsMobileCard","onViewComment","renderValue","Comments","filtersInGroup","controlLabel","filterModalHeader","filterOptions","column","groupSortOptions","useCommentFilters","filterColumnLayout","commentColumns","accessor","Cell","cellProps","marginRight","FaUsers","disableSortBy","Header","original","_original$documents","ResponsiveDataTable","initialState","DesktopTabList","_caseDetails$applicat4","_caseDetails$applicat5","_caseDetails$applicat6","badgeCount","count","badge","_caseDetails$applicat7","_caseDetails$applicat8","_caseDetails$applicat9","_caseDetails$applicat10","_caseDetails$applicat11","_caseDetails$applicat12","_caseDetails$applicat13","_caseDetails$applicat14","_caseDetails$applicat15","_caseDetails$applicat16","_caseDetails$applicat17","_caseDetails$applicat18","_caseDetails$applicat19","_caseDetails$applicat20","_caseDetails$applicat21","_caseDetails$applicat22","_caseDetails$applicat23","_caseDetails$applicat24","_caseDetails$applicat25","alignRight","renderDocumentMenuActionButton","DocumentsMobileCard","useDocumentFilters","isDocuments","SearchInputProps","doc","Documents","useDocumentMenuOptions","FaEye","FaDownload","LayerToggle","handleOnChange","activeLayer","displayOptions","setDisplayViewOptions","toggleElements","RadioGroup","ActiveLayer","SATELLITE","MAP","s","EMPTY_LAYER_DATA","layerPadding","MapWithPolygon","displayLayerToggle","mapHeight","setActiveLayer","fitFeature","useMapActions","_geoJson$features","_geoJson$features$","polygonLayerId","maxZoom","applicationPolygonLayer","Geometry","drawShape","Shape","Polygon","minZoom","drawStyle","enabledLayers","useMemo","View","StyledControlBar","ControlBar","bottom","marginInline","LayerSwitcher","enableLayers","hidden","ResetPosition","Zoom","ScaleLine","MapDetails","toast","useToast","isVisible","isIntersecting","setIntersecting","observer","IntersectionObserver","entry","observe","disconnect","useIsVisible","showMap","setShowMap","polygonData","constraints","constraint","handleDownloadSpatialClick","downloadGeoJSON","Blob","replaceAll","exportOptions","eastingNorthing","handleTileLoadError","toastOptions","mapOverrides","defaultCenter","defaultZoom","MapProvider","apiUrl","apiKey","onTileLoadError","overrides","StyledMapCss","margin","gridColumn","Plans","usePlansMenuOptions","measurementTool","measuringToolOption","plan","RelatedApplicationCardHeader","_relatedCase$singleLi","_relatedCase$address","arn","relatedApplicationReferenceNumber","singleLineOfAddress","RelatedApplicationCard","_relatedCase$relatedA","AddressDetail","relatedAddress","bodyRows","RelatedCases","_caseDetails$relatedA","applications","setApplications","addresses","setAddresses","relatedApplications","relatedAddresses","enableInfiniteScroll","infiniteScrollPageSize","render","SimpleGrid","useCaseDetailsFeatures","rpc","useTabLabels","CaseDetails","isError","isLoadingError","isRefetchError","setTabIndex","tabPanelStyle","showSpinner","Tabs","isManual","TabPanels","minH","TabPanel","UploadedDocumentCard","uploadedDocuments","order","FaFile","ArchivedPastResponseCard","_response$response","reasonForLateResponse","supportingDocuments","useResponseTypeDescription","getResponseTypeDescription","_responseDescriptions","responseDescriptions","No response","Content","Advice","Standing advice","Consulted in error","More information required","Supportive","Unsupportive","For comment","For information","No comment","Consultation not required","sortAnswers","answerA","answerB","_answerA$id","_answerB$id","useResetResponseFormState","resetResponseTypeIdIsConsultedInError","resetResponseTypeId","resetResponseDetail","resetReasonForLateReasonIsOther","resetReasonForLateResponseId","resetReasonForLateResponseDetail","resetResponseFiles","resetSupportingFiles","resetForm","useResponse","responseTypeIdIsConsultedInError","isLoadingConsultation","responsesData","isLoadingResponse","submitResponseApi","isRpcResponse","isInspectionResponse","isOverdueResponse","isRespondedStatus","responses","resp","isRpcInspection","canSubmitIfLateResponse","filterResponses","_responses$filter$fla","flatMap","submittedAnswers","otherSubmittedAnswers","otherResponses","pastAnswers","_answer$organisation","getAnswers","_answer$consulteeId","_answer$consulteeName","_answer$question","_answer$answer","_answer$approved","_answer$questionNumbe","dateApproved","pastResponses","getPastResponses","typeFunc","_resp$response","typeDefinition","responseDate","canSubmitAnswers","allAnswersApproved","every","canSubmitStandard","otherAnswers","buildResponseRequest","_response$consultatio","_response$id","_responseFiles$map","_supportingFiles$map","ArchivedConsultationResponse","isInitialLoading","MobileResponses","DesktopResponses","RpcOtherResponseAnswers","showAnswer","setShowAnswer","handleShowAnswer","borderBottomRadius","FaChevronRight","RpcOtherResponse","ArchivedRpcResponses","ResponseMobileCard","ArchivedResponsesDataTable","isShowingNotes","setIsShowingNotes","notesSection","grow","OpenConsultationResponse","isRpcOrInspection","marginLeft","RpcResponse","StandardResponse","RpcPastResponses","PastResponses","hideTypeDefinition","RpcOtherResponses","srOnly","_response$document","FaFileWord","flexShrink","handleOpenDocument","pastResponse","_pastResponse$documen","renderMobile","renderDesktop","ResponseHeader","contentWidth","ResponseOverdueForm","isConsultationOverdue","setReasonForLateResponseId","setReasonForLateResponseDetail","responseLateReasonIsOther","setResponseLateReasonIsOther","lateReasonsData","_lateReasonsData$reas","reasonsForLateResponse","hideLabelColon","RpcResponseAnswers","showEdit","_answer$id","RpcResponseAnswer","isApprovingResponse","setIsApprovingResponse","isEditing","setIsEditing","editedAnswer","setEditedAnswer","approveAnswer","answerUpdated","useUpdateAnswer","saveAnswer","answerId","lastEdited","borderTopRadius","gridRow","handleSave","handleEdit","handleApprove","uploadRequired","setUploadRequired","setUploadRequiredState","setResponseFiles","setSupportingFiles","verticalAlign","StandardResponseForm","_responseTypesData$re","responseTypesData","setResponseTypeIdIsConsultedInError","selectedResponseTypeId","setSelectedResponseTypeId","setResponseDetail","responseTypes","responseTypeDescription","_responseTypesData$re2","getSummaryTitle","getSummaryRequiredStatus","_responseTypesData$re3","chosenResponse","parseInt","documentsRequired","ArchivedResponse","ConsultationResponse","ArchivedConsultationButtons","TitleDescription","CaseDetailsCard","footerRows","CaseOfficerDetailsCard","rowDirection","rows","DesktopSummary","showNotes","setShowNotes","MobileSummary","OpenConsultationButtons","setShowRequestExtension","useSummaryMenuOptions","RequestExtensionModal","showRequestExtension","useRequestExtension","reason","extensionReason","handleRequestExtension","SummaryHeader","ConsultationSummary","setShowSpinner","IsRegisteredTableCell","isRegisteredState","isRegisteredRowValue","OrganisationDetailsPanel","_organisation$organis","_organisation$email","latestSubmit","submitDisabled","setSubmitDisabled","upsertResult","useUpsertParentOrganisation","setUpdateSuccessRequest","setUpdatedOrganisationId","setNewOrganisation","variables","newOrg","messageProps","useMessageProps","latestOrganisationRequest","messagePropsMap","idle","messageTitle","messageStatus","duplicateName","organisationNameExists","_errors","_errors$OrganisationN","OrganisationName","currentTarget","RowEditButtons","submit","handleDelete","hideDelete","editing","setEditing","AddTeam","addTeamRequest","SetAddTeamRequest","setIsDisabled","teamEmailDisabled","setTeamEmailDisabled","setTeamName","teamNameInvalid","setTeamNameInvalid","teamEmail","setTeamEmail","teamEmailInvalid","setTeamEmailInvalid","backOfficeCode","setBackOfficeCode","backOfficeCodeInvalid","setBackOfficeCodeInvalid","teamMutation","isSuccess","onSettled","useAddTeam","addTeamMessageProps","useTeamMessageProps","payload","messagePropsLookup","setMessageProps","errorMessageMapping","property","errMsg","responseError","messageErrors","isFormInvalidExcludingEmail","emptyForm","_addTeamMessageProps$","attentionMessageDescription","errmsg","idx","TeamsPanel","infoMsg","disableEmail","handleNameValidation","handleEmailValidation","TeamRowEditButtons","emailRequired","useTeamColumns","teamsData","refetchOnMount","updateRequest","disableUpdate","canUpdate","setCanUpdate","backofficeCode","isValidString","useTeamCanUpdate","useUpdateTeam","teamId","handleUpdate","UserDeletionModal","userToDelete","handleConfirm","FaExclamationCircle","Trans","i18nKey","defaults","components","bold","UserRowEditButtons","useUserTableCanUpdate","setUserToDelete","updateUserRequest","useUpdateAdminUser","UsersPanel","_consulteesQuery$cons","_consulteesQuery$pagi","consulteesQuery","allTeams","organisations","useUserPanelRecords","permissionName","useUserTableColumns","ManageOrganisation","newOrganisation","getDefaultIndex","endsWith","CreateOrganisation","resetState","EditOrganisation","setOrganisationId","setOrganisation","useParentOrganisation","resetOrganisation","resetRegistrationFilter","Home","FaExternalLinkAlt","Measure","viewerDiv","decodeURIComponent","WebViewer","initialDoc","enableMeasurement","disabledElements","licenseKey","UI","setToolbarGroup","useIncomingConsultationsTrafficMonitorColumns","isRefreshing","disableButton","setDisabledButton","handleRetry","incomingConsultationId","topicName","FaCheckCircle","FaTimesCircle","createFilterOptionItem","RequestDetails","setIsOpen","isInboundDirection","formatJsonString","jsonString","dataObj","scrollBehavior","FaFileAlt","responseJson","useExceptionLogsFilters","exceptionLogTypes","createFilterOptionItemWithDefaultValues","GenerateGuidanceList","guidanceDefinitions","IncomingConsultationsMonitorTable","setIsRefreshing","incomingConsultationsByReferenceNumber","fetchStatus","refetch","networkMode","setOrderByColumn","setOrderByDescending","handleRefetch","finally","_state$sortBy$0$desc","useExceptionLogs","exceptions","ExceptionLogsMonitorFilters","monitorFilters","setMonitorFilters","monitorStartDate","setMonitorStartDate","monitorEndDate","setMonitorEndDate","useExceptionLogDetails","exceptionId","ExceptionLogMonitorDetails","_detailsRequest$excep","_detailsRequest$id","detailsRequest","exceptionDetails","setExceptionDetails","_exceptionDetails","_exceptionDetails$mes","_exceptionDetails$sta","stackTrace","getModalBody","ExceptionLogsMonitorTable","_exceptionsRequestDat","_exceptionsRequestDat2","exceptionsRequestData","useExceptionLogsColumns","exLogFilter","setDetails","exceptionType","isModalOpen","newOrderByColumn","newOrderByDescending","MonitorFilters","MonitorTable","callTypes","useTrafficMonitorFilters","useTrafficMonitorColumns","results","Monitor","tabLabel","ErrorContent","FaCogs","PageNotFound","UnAuthorised","CompletionModal","updateDfiReportStoreValues","updateDfiAnnualMutate","setDfiReportQueryDataCompleted","useSetDataDfiAnnualReportCompleted","setQueryData","dateCompleted","submitReport","metrics","statutoryTimelinessResponseStats","lateResponseStatItems","statutoryTimeframeExceededStats","agreedExtensionStats","nonStatutoryTimelinessResponseStats","eiaConsultationStats","tqEnTimelinessResponseStats","tqEnTimeframeExceededStats","tqEnAgreedExtensionStats","tqEnAppealConsultationStats","htmlBody","renderToStaticMarkup","StaticExportDfiReport","completed","html","WrapStyledHtmlTemplate","CompletionModalContent","FaExclamationTriangle","KpiAccordion","kpiData","titles","getDataTestId","trimEnd","h3","KpiTableCard","lateResponses","KpiValueCard","kpiValues","ReviewResponse","useEditingReviewState","bestPracticeResponseIsEditing","infoOnLateResponseIsEditing","BestPracticeResponse","formatKpiData","labels","tqEnTitles","timelinessResponseStats","timeframeExceededStats","outstandingResponseStats","totalAppealConsultationsReceived","averageDaysTakenToRespondToAppealConsultations","useTQFormattedDfiReport","reportResponse","tqEnAgreedExtensionStatsLabels","useTqEnAgreedExtensionStatsLabels","totalConsultationsWithExtensionsTimeframe","totalConsultationResponsesWithinExtensionTimeframe","totalConsultationsWithExtensionsTimeframeExtended1To7Days","percentageConsultationsWithExtensionsTimeframeExtended1To7Days","totalConsultationsWithExtensionsTimeframeExtended8To14Days","percentageConsultationsWithExtensionsTimeframeExtended8To14Days","totalConsultationsWithExtensionsTimeframeExtended15To21Days","percentageConsultationsWithExtensionsTimeframeExtended15To21Days","totalConsultationsWithExtensionsTimeframeExtended22To28Days","percentageConsultationsWithExtensionsTimeframeExtended22To28Days","totalConsultationsWithExtensionsTimeframeExtended29PlusDays","percentageConsultationsWithExtensionsTimeframeExtended29PlusDays","tqEnAppealConsultationStatsLabels","useTqEnAppealConsultationStatsLabels","totalEiaConsultationsReceived","averageDaysTakenToRespondToEiaConsultations","tqEnTimeframeExceededStatsLabels","useTqEnTimeframeExceededStatsLabels","totalConsultationsWithLateResponses","submittedWithin1To7DaysAfterDeadline","percentageConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline","submittedWithin8To14DaysAfterDeadline","percentageConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline","submittedWithin15To28DaysAfterDeadline","percentageConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline","submittedOver29DaysAfterDeadline","percentageConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline","tqEnTimelinessResponseStatsLabels","useTqEnTimelinessResponseStatsLabels","totalConsultationRequestsReceived","totalConsultationsRespondedInAgreedTimeframe","percentageConsultationsRespondedInAgreedTimeframe","totalConsultationsWithResponsesWithin21Days","percentageConsultationsWithResponsesWithin21Days","totalConsultationsRespondedLate","percentageConsultationsRespondedLate","totalConsultationsWithOutstandingResponses","averageDaysTakenToRespondRequests","formattedReport","tqEnMetrics","tqFormattedReport","tqTitles","northernIrelandTitles","useFormattedDfiReport","useNorthernIrelandFormattedDfiReport","agreedExtensionStatsLabels","useAgreedExtensionStatsLabels","eiaConsultationStatsLabels","useEiaConsultationStatsLabels","nonStatutoryTimelinessResponseStatsLabels","useNonStatutoryTimelinessResponseStatsLabels","statutoryTimeframeExceededStatsLabels","useStatutoryTimeframeExceededStatsLabels","statutoryTimelinessResponseStatsLabels","useStatutoryTimelinessResponseStatsLabels","formattedMetrics","totalStatutoryConsultationsWithExtensionsTimeframe","totalStatutoryConsultationResponsesWithinExtensionTimeframe","totalStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days","percentageStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days","totalStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days","percentageStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days","totalStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days","percentageStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days","totalStatutoryConsultationsWithExtensionsTimeframeExtended22To28Days","totalStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays","percentageStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays","totalStatutoryConsultationsWithLateResponses","percentageStatutoryConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline","percentageStatutoryConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline","percentageStatutoryConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline","percentageStatutoryConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline","translatedResponses","resourceIssues","extensionRequest","techIssuesInternal","techIssuesExternal","additionalInformationRequired","ROW_TEXT_LOOKUP","lateResponseReason","useKpiTableRowTranslations","translatedResponsesText","ReviewCardFooter","idReference","ReviewCard","useReviewResponseState","setIsSuccess","InfoOnLateResponse","Review","StaticReviewCard","dfiReport","pageBreakCards","StaticKpiValueCard","tableRows","array","chunks","chunk","sliceArrayIntoChunks","kpiValue","AnnualDfiReport","useDfiAnnualReport","setInitiativesResponse","setIssuesResponse","organisationNameHeading","parentOrganisationName","fyStartDay","fyEndDay","tqEnAnnualReportLabel","AnnualDfiReportLabel","CompleteDfiReport","DraftDfiReport","downloadReportPdf","useDfiAnnualReportPdf","modalOpen","setModalOpen","createFilterItem","createColumnItem","columnItem","createColumnItemDate","useReportColumns","consultationRequestDate","consultationStatus","consulteeResponseDueDate","dateConsultationRespondedTo","extensionRequestDate","extensionRequestReason","extensionRequestResponse","extensionResponseDate","otherReason","useReportFilters","authoritiesData","categoriesData","consultationStatusesData","consultationTypesData","extensionRequestStatusesData","reasonsForLateResponseData","authorities","consultationCategoryIds","categories","consultationStatusIds","consultationTypeIds","consultationTypes","extensionRequestStatusIds","lateResponseReasonIds","responseTypeIds","reports","useReports","annualReport","annualDfi","visibleOnMobile","extensionRequests","useExtensionRequestsColumns","useLateResponseColumns","outstandingResponses","useOutstandingResponseColumns","respondedOnTime","useRespondedOnTimeColumns","respondedYearToDate","useRespondedYearToDateColumns","useExtensionRequestsFilters","ExtensionRequestsReport","exportCsv","BaseReport","ExtensionRequestsReportMobile","MobileReportModal","useLateResponseFilters","LateResponsesReport","LateResponsesReportMobile","useOutstandingResponseFilters","OutstandingResponsesReport","OutstandingResponsesReportMobile","useRespondedOnTimeFilters","RespondedOnTimeReport","RespondedOnTimeReportMobile","useRespondedYearToDateFilters","RespondedYearToDateReport","RespondedYearToDateReportMobile","setReport","reportData","reportPagination","reportSortBy","setReportOrderByColumn","setReportOrderByDescending","currentReport","ReportDates","ReportFilters","MobileReportFiltersModal","hasFromDateValue","resetIsOpen","handleCloseClick","borderBottomWidth","ReportCard","runReport","FaArrowRight","reportStartDate","setReportStartDate","reportEndDate","setReportEndDate","reportFilters","setReportFilters","_filters","StatusIndicator","complete","ReportFiscalYear","_response$listDfiAnnu","annualDfiReportYear","setAnnualDfiReportYear","financialYear","setFinancialYear","selectedOption","listDfiAnnualReportItems","ReportModal","ReportModalContentSwitch","ReportModalContent","titleText","subTitleText","FaCalendarAlt","Report","Reports","setReportName","setOpenReportModal","setOpenReportMobileModal","resetDfiReportYear","resetStartDate","resetEndDate","resetReportFilters","ConsultationAssigneeFilter","_consulteeData$consul","ConsultationAuthorityFilter","authorityData","ConsultationCategoryFilter","categoryData","selectedFilterTypes","isRpcOnly","TitleContainer","ConsultationDateFilter","_dateTo$getFullYear","_dateFrom$getFullYear","setDateFrom","setDateTo","ConsultationShow","setAssignedToMe","Switch","orientation","ConsultationSort","_data$sortOptions","setSort","ConsultationStatusFilter","statusesData","useFilterStatuses","consultationTypeCounts","ConsultationTypeFilter","typeData","consultationsData","orderPosition","getTypeCount","consultationTypeId","_consultationTypeCoun","_consultationTypeCoun2","_consultationTypeCoun3","consultationTypeCount","toggleSelectedType","activeType","CheckboxGroup","ConsultationViewType","viewFilterItems","viewType","setViewType","ConsultationViewTypeMobile","toggleViewType","currentViewType","ConsultationTeamFilter","_teamData$teams","teamData","SideFilter","clearAllFilters","opacity","FilterModal","modalProps","StatisticsChartDisplay","statisticsResponse","reportKeys","currentItems","jump","prev","next","maxPage","usePagination","itemsPerPage","customPaginationPrev","iconPrev","IconDoubleChevronLeft","customPaginationNext","iconNext","IconDoubleChevronRight","StatisticsChart","statistics","ResponsivePagination","paginationWithDots","customPaginationNavigatePrevious","customPaginationNavigateNext","onNumberClick","onPrevClick","onNextClick","StatisticsBar","useStatisticsReport","showStatistics","setShowStatistics","FaChartBar","isTQArchived","respondedCount","onTrackCount","respondedPercentage","onTrackPercentage","badgeColour","closedCount","overdueCount","closedPercentage","overduePercentage","withdrawnCount","nearingDeadlineCount","withdrawnPercentage","nearingDeadlinePercentage","StatisticsTq","determinedCount","determinedPercentage","finalStats","statistic","minW","round","renderStat","PieChart","Pie","cx","cy","innerRadius","outerRadius","paddingAngle","startAngle","endAngle","isAnimationActive","dataKey","TopFilter","_consultationsData$co","_consultationsData$co2","_consultationsData$co3","_consultationsData$pa","_consultationsData$pa2","_consultationsData$co4","_consultationsData$co5","_consultationsData$co6","_consultationsData$pa3","_consultationsData$pa4","areOptionsVisible","setAreOptionsVisible","isFilterModalVisible","setIsFilterModalVisible","gridDominantSecondarySurface","Search","listStyleType","useGetAdminUsersRecords","_ApplicationUsers$adm","ApplicationUsers","adminUsers","userData","TQAdminProvider","ManageAdminUsers","OrganisationFilters","searchMatchCount","useGetManageOrganisationRecords","_organisationSearch$p","_organisationSearch$p2","organisationSearch","ManageOrganisations","_data$parentOrganisat","useManageOrganisationColumns","_props$row","_props$row$original","orderBy","useGetManageTeamRecords","_teamsResponse$teams$","_teamsResponse$teams","_teams$length","teamsResponse","filterContainerStyle","tabPanelsStyle","TeamFilters","_parentOrganisations$","organisationFilter","setOrganisationFilter","selectedId","orgName","selectedOrg","org","handleOrganisationChange","ManageTeams","useManageTeamColumns","UsersFilters","isRegisteredOptions","ManageUsers","_data$consultees$item","_data$consultees","_data$paginationInfo$","_data$consultees$item2","_data$consultees2","useManageUsersColumns","_original$teams$","ManageConsultees","useManageTabLabels","resetManageConsulteesRequest","resetCreatedOrganisationId","resetCreatedOrganisationRequest","activeTab","setActiveTab","FaPlus","handleAddOrganisationClick","useGetManageTeamConsulteeRecords","_ApplicationUsers$con","teamFilter","permissionFilter","ConsulteeAdminProvider","isConsulteeAdmin","ManageTeam","setTeamFilter","App","Routes","Route","element","QueryClient","documentStoreClient","DocumentStoreClient","documentStore","baseUrl","applicationApi","Root","initializePca","initialize","navigationClient","RouterNavigationClient","setNavigationClient","addEventCallback","eventType","EventType","LOGOUT_START","HANDLE_REDIRECT_END","growthBook","RecoilRoot","TqAuthProvider","acquireTokenRequest","QueryClientProvider","DocumentStoreProvider","GrowthBookProvider","AzureAppInsights","getDefaultConfiguration","PublicClientApplication","ReactDOM","StrictMode","BrowserRouter"],"mappings":"sPAAO,MAAMA,EAAiB,IACjBC,EAA+B,GAAAC,OAAMC,gEAAyC,oBAC9EC,EAAoB,GAAAF,OAAMC,sFCF1BE,EACL,IADKA,EAEH,UAFGA,EAGF,WAHEA,EAIH,gBAJGA,EAKG,oBALHA,EAMF,4BANEA,EAOD,6BAPCA,EAQO,yCARPA,EASF,kCATEA,EAUF,WAVEA,EAWC,cAXDA,EAYO,oBAZPA,EAaO,oBAbPA,EAcS,uBAdTA,EAeO,qBAfPA,EAgBW,4BAhBXA,EAiBG,gBAjBHA,EAkBG,kB,aCfT,IAAKC,EAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,oCAAjBA,EAAiB,sDAAjBA,CAAiB,MAUtB,MAAMC,EAA4BA,KACvC,MAAM,EAAEC,GAAMC,YAAe,gBAE7B,OAAOC,uBAAY,KACV,CACLC,WAAYH,EAAEF,EAAkBM,iBAAkB,eAClDC,gBAAiBL,EAAEF,EAAkBQ,0BAA2B,kBAEjE,CAACN,GALGE,EAKE,E,WChBJ,IAAKK,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,gCAAnBA,EAAmB,YAAnBA,EAAmB,0BAAnBA,CAAmB,MAQxB,MAAMC,EAA6B,CACxCC,KAAM,cACNC,YAAa,oBACbC,eAAgB,eAQLC,EAAsBA,KACjC,MAAM,EAAEZ,GAAMC,YAAe,gBAE7B,OAAOC,uBACL,CAACW,EAAsCC,KACrC,MAAMC,EAAqB,OAAND,QAAM,IAANA,IAAUP,EAAoBE,KAEnD,IAAIO,EAAehB,EAAEe,EAAcP,EAAcO,IAKjD,MAJqB,KAAjBC,IACFA,EAAeR,EAAcC,MAGxBQ,aAAWJ,EAAWG,EAAa,GAE5C,CAAChB,GACF,E,kCCXI,MAAMkB,EAAoDC,IAO1D,IAP2D,QAChEC,EAAO,eACPC,EAAc,gBACdC,EAAe,MACfC,EAAK,MACLC,EAAK,aACLC,GACDN,EACC,MAAM,EAAEnB,GAAMC,YAAe,SACvB,IAAEyB,GAAQC,cAEVC,EAAWC,cACXC,EAAcA,IACdF,EAAiB,kBACdJ,EAAQ,QAAU,QAGrBO,EAAqBL,EAAI,CAC7BM,GAAI,CACFC,OAAQ,OACRC,YAAa,OACbC,MAAO,QACPC,QAAS,CACPC,OAAQ,OACRF,MAAO,QACPG,QAAS,cAKTC,EAAwBd,EAAee,KAAkBC,IAE/D,OACEC,eAACC,IAAI,CAAAC,SAAA,CACHC,cAACC,IAAU,CACTC,SAAS,KACTC,SAAUlB,IACVmB,KAAMvB,EAAI,CAAEwB,GAAI,WAChBC,UAAWN,cAACO,IAAa,IACzBC,QAAS3B,EAAI,CAAEM,GAAI,YAAakB,GAAI,cACpCI,KAAM5B,EAAI,CAAEwB,GAAI1B,EAAQ,KAAO,OAC/BU,YAAaqB,IAAQC,KAAK,KAC1BC,YAAa/B,EAAI,CAAEwB,GAAI1B,EAAQ,EAAI,IACnCW,MAAOT,EAAI,CAAEM,GAAIuB,IAAQC,KAAK,KAAMN,GAAIK,IAAQC,KAAK,OACrDvB,OAAQP,EAAI,CAAEM,GAAI,OAAQkB,GAAI1B,EAAQ,OAAS,SAC/CkC,GAAIhC,EAAI,CAAEM,GAAIP,EAAeM,EAAqB,CAAC,IACnD4B,GAAIjC,EAAI,CAAEM,GAAIA,IAAMO,EAAuBW,GAAIA,IAAMT,MAAUG,SAEzD,OAALrB,QAAK,IAALA,IAASvB,EAAE,UAAW,aAEzB6C,cAACe,KAAQ,CACPC,GAAI,EACJC,UAAWpC,EAAI,CAAEwB,GAAI,WACrBF,SAAUlB,IACViC,MAAOjC,IAAcc,SAEpBxB,EAAQ4C,KAAKC,GACZpB,cAACqB,KAAQ,CAEPC,WAAYzC,EAAI,CAAEwB,GAAI1B,EAAQ,EAAI,IAClC4C,QAASA,KAAA,IAAAC,EAAA,OAAMJ,EAAOG,UAAyB,QAAlBC,EAAIJ,EAAOG,eAAO,IAAAC,OAAA,EAAdA,EAAAC,KAAAL,EAAiB5C,EAAgBC,GAAgB,EAACsB,SAElFqB,EAAOM,UACN7B,eAAC8B,IAAI,CAACC,eAAe,gBAAgBC,WAAW,SAASC,EAAE,OAAM/B,SAAA,CAC9DqB,EAAO1C,MACP0C,EAAOW,MAAQ/B,cAACgC,IAAI,CAAClB,GAAIM,EAAOW,UAGnClC,eAAC8B,IAAI,CAACM,QAAS,EAAGJ,WAAW,SAAQ9B,SAAA,CAClCqB,EAAOW,MAAQ/B,cAACgC,IAAI,CAAClB,GAAIM,EAAOW,OAChCX,EAAO1C,UAZP0C,EAAO1C,aAkBb,EChFEwD,EAAoE5D,IAK1E,IAL2E,QAChFC,EAAO,eACPC,EAAc,gBACdC,EAAe,UACf0D,GACD7D,EACC,MAAM,EAAEnB,GAAMC,YAAe,WACvB,IAAEyB,GAAQC,eAEhB,OACEkB,cAACoC,IAAG,CAAClB,MAAO,EAAG9B,OAAQ,EAAEW,SACvBF,eAACC,IAAI,CAAAC,SAAA,CACHC,cAACC,IAAU,CACT,aAAqB,OAATkC,QAAS,IAATA,IAAahF,EAAE,2BAA4B,kBACvDqD,QAAQ,OACRM,GAAIuB,IACJN,KAAM/B,cAACsC,IAAW,IAClBlD,OAAO,OACPc,SAAUrB,EAAI,CAAEM,GAAI,YACpBoC,QAAUgB,GAAUA,EAAMC,oBAE5BxC,cAACe,KAAQ,CAACC,GAAI,EAAGyB,SAAS,WAAWC,MAAM,QAAO3C,SAC/CxB,EAAQ4C,KAAKC,GACZvB,eAACwB,KAAQ,CAEPsB,WAAW,SACXpB,QAAUgB,IAAW,IAADf,EAClBe,EAAMC,kBACQ,QAAdhB,EAAAJ,EAAOG,eAAO,IAAAC,GAAdA,EAAAC,KAAAL,EAAiB5C,EAAgBC,EAAgB,EACjDsB,SAAA,CAEFC,cAACgC,IAAI,CAACY,GAAI,EAAG9B,GAAIM,EAAOW,OACvBX,EAAO1C,QARH0C,EAAO1C,eAahB,E,YClDW,IAAImE,KAAK,cAKT,IAAIA,KAAK,cAKT,IAAIA,KAAK,cAoDd,IAAIA,KAAK,cA0ER,IAAIA,KAAK,cACV,IAAIA,KAAK,cAlJlB,MCWMC,EAAsC,CACjD,CACEC,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,UACdC,cAAe,UACfC,YAAa,yBAEf,CACEL,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,OACdC,cAAe,IACfC,YAAa,KAEf,CACEL,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,OACdC,cAAe,UACfC,YAAa,sBAEf,CACEL,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,UACdC,cAAe,SACfC,YAAa,KAEf,CACEL,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,UACdC,cAAe,UACfC,YAAa,kCAIXC,EAAuC,CAC3CN,GAAI,EACJC,KAAM,GACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,WACdE,YAAa,wBACbE,WAAW,GAGAC,EAA0C,CACrDF,EACA,CACEN,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,cACxBK,aAAc,cACdE,YAAa,IACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,qBACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,IACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,gCACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,gCACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,WACdE,YAAa,gCACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,gCACbE,WAAW,GAEb,CACEP,GAAI,EACJC,KAAM,aACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,gCACbE,WAAW,GAEb,CACEP,GAAI,GACJC,KAAM,cACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,kBACdE,YAAa,SACbE,WAAW,GAEb,CACEP,GAAI,GACJC,KAAM,cACNC,cAAe,IAAIJ,KAAK,aACxBK,aAAc,UACdE,YAAa,gCACbE,WAAW,IAIFE,EAAwC,CACnD,CACEC,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,IAEb,CACEJ,aAAc,GACdT,KAAM,qBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,qBACNC,cAAe,IAAIJ,KAAK,aACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,IAEd,CACEI,aAAc,GACdT,KAAM,kBACNC,cAAe,IAAIJ,KAAK,cACxBa,KAAM,UACNC,YAAY,EACZC,SAAS,EACTC,UAAW,CAACR,KAIHS,GAA6C,CACxDC,QACE,sJACFC,qBAAsB,EACtBC,SAAU,WACVC,KAAM,gBACNC,UAAW,iBAOAC,GAAqD,CAChEL,QAASD,GACTO,+BAAgC,mBAChCC,kBAAmB,QACnBC,gBAAiB,gCACjBC,QAAS,OACTC,SAAU,OACVC,wBAAyB,aACzBC,eAAgB,gBAChBC,aAAc,IAAI/B,KAAK,cACvBgC,aAAc,IAAIhC,KAAK,cACvBiC,qBAAsB,IAAIjC,KAAK,cAC/BkC,cAAe,IAAIlC,KAAK,cACxBmC,wBAAyB,UACzBC,2BAA4B,OAC5BC,sBAAuB,SACvBC,SAAU,QACVC,gCAAiC,IAAIvC,KAAK,cAC1CwC,gCAAiC,IAAIxC,KAAK,cAC1CyC,yBAA0B,IAAIzC,KAAK,cACnC0C,2BAA4B,IAAI1C,KAAK,cACrC2C,mBAAoB,IAAI3C,KAAK,cAC7B4C,8BAA+B,IAAI5C,KAAK,cACxC6C,cAAe,IAAI7C,KAAK,cACxB8C,wBAAyB,IAAI9C,KAAK,cAClC+C,uBAAwB,IAAI/C,KAAK,cACjCgD,WAAY,mBACZC,cAAe,cACfC,kBAAmB,eACnBC,mBAAoB,iBACpBC,eAAgB,gBAChBC,yBAA0B,KAC1B5C,WAAW,EACX6C,aACE,8YACFC,MAAOtD,EACPe,UAAWN,EACX8C,SAAU7C,GCxRC8C,IDiSK,IAAIzD,KAAK,cACT,IAAIA,KAAK,cClS6B,CACtDE,GAAI,EACJwD,OAAQ,SACRC,iBAAkB,YAClBC,SAAU,yBACVC,WAAY,EACZC,SAAU,YACVxC,UAAW,wCACXJ,QAAS,+DACT6C,UAAW,mBACXC,mBACE,iyBACFC,cAAe,IAAIjE,KAAK,cACxBkE,aAAc,IAAIlE,KAAK,GAADhG,QAAI,IAAIgG,MAAOmE,cAAgB,EAAC,WACtDC,iBAAiB,EACjBC,YAAY,IAwCDC,GAAkC,IAC1Cb,GACHc,gBAAiB,IAAIvE,KAAK,cAC1BwE,uBAAwB,GACxBC,cAAe,eACfC,sBAAuB,GACvBV,mBAAoBP,GAAuBO,mBAC3CW,KAAM,eACNC,gBAAiB,eACjBvB,yBAA0B,eAC1BwB,wBAAyB,oBACzBC,qBAAqB,EACrBV,iBAAiB,EACjBW,kBAAmB,IAAI/E,KAAK,uBAC5BgF,yBAA0B,GAC1BC,gBAAiB,eACjBZ,YAAY,EACZa,MAAO,CACL,CACEhF,GAAI,EACJiF,SAAU,IAAInF,KAAK,uBACnBoF,SAAU,uBACVC,SAAU,WACVC,cAAe,eAGnBC,UAAW,CACT,CACErF,GAAI,EACJsF,eAAgB,EAChBC,KAAM,wEACNC,cACE,uMAGNC,iCAAkC,CAjEgB,CAClDC,eAAgB,eAChBC,eAAgB,mBAChBtF,YAAa,oCACbuF,SAAS,EACT5F,GAAI,KACJ6F,SAAU,0CAwFCC,GAAsC,IAC9C1B,GACHpE,GAAI,EACJyD,iBAAkB,OCxHPsC,ID8HG,IAAIjG,KAAK,cAMT,IAAIA,KAAK,cCpI8C,CACrE,CACEE,GAAI,EACJgG,YAAa,EACbZ,cAAe,YACfE,eAAgB,EAChBW,SAAU,wEACVC,OAAQ,cACRC,YAAa,IAAIrG,KAAK,cACtBsG,aAAc,IAAItG,KAAK,cACvBuG,aAAc,CACZrG,GAAI,IAGR,CACEA,GAAI,EACJgG,YAAa,EACbZ,cAAe,YACfE,eAAgB,EAChBW,SAAU,sDACVC,OAAQ,cACRC,YAAa,IAAIrG,KAAK,cACtBsG,aAAc,IAAItG,KAAK,cACvBuG,aAAc,CACZrG,GAAI,MAKGsG,GAA+D,CAC1E,IACKP,GAA0B,GAC7BG,OAAQ,oBAEV,IACKH,GAA0B,GAC7BG,OAAQ,oBAEV,IACKH,GAA0B,GAC7BC,YAAa,EACbZ,cAAe,kBACfc,OAAQ,uBAEV,IACKH,GAA0B,GAC7BC,YAAa,EACbZ,cAAe,kBACfc,OAAQ,wBAICK,GAAgE,CAC3E,IACKR,GAA0B,GAC7BG,OAAQ,sBACRF,YAAa,EACbZ,cAAe,+BACfiB,aAAc,CAAErG,GAAI,IAEtB,IACK+F,GAA0B,GAC7BG,OAAQ,sBACRF,YAAa,EACbZ,cAAe,+BACfiB,aAAc,CAAErG,GAAI,KAIXwG,GAA0C,CACrDxG,GAAI,EACJvE,eAAgB,EAChBuK,YAAa,EACbS,SAAU,gBACVC,eAAgB,EAChBC,aAAc,MACdR,YAAa,IAAIrG,KAAK,cACtB8G,gBAAiB,QACjB9F,UAAW,GACX+F,QAASd,IAOM,IAAIjG,KAAK,cAQT,IAAIA,KAAK,cC7FX,IAAIA,KAAK,cACR,IAAIA,KAAK,cAQV,IAAIA,KAAK,cACR,IAAIA,KAAK,cAQT,IAAIA,KAAK,cCxBlB,IAAKgH,GAAqB,SAArBA,GAAqB,OAArBA,IAAqB,eAArBA,IAAqB,uBAArBA,CAAqB,MCAjC,IAIKC,GAAc,SAAdA,GAAc,OAAdA,IAAc,yBAAdA,IAAc,+CAAdA,IAAc,6BAAdA,IAAc,aAAdA,IAAc,uBAAdA,IAAc,yBAAdA,IAAc,mEAAdA,IAAc,6BAAdA,IAAc,mCAAdA,IAAc,uCAAdA,IAAc,iCAAdA,IAAc,yCAAdA,IAAc,uBAAdA,IAAc,yCAAdA,IAAc,2CAAdA,IAAc,mBAAdA,IAAc,2BAAdA,IAAc,iCAAdA,IAAc,2BAAdA,IAAc,iCAAdA,IAAc,6CAAdA,IAAc,6CAAdA,IAAc,+BAAdA,IAAc,iCAAdA,IAAc,yCAAdA,IAAc,2BAAdA,IAAc,2BAAdA,IAAc,6CAAdA,IAAc,qCAAdA,IAAc,mEAAdA,IAAc,uCAAdA,IAAc,yBAAdA,IAAc,iBAAdA,IAAc,uCAAdA,IAAc,+CAAdA,IAAc,2CAAdA,IAAc,iCAAdA,IAAc,qDAAdA,IAAc,mDAAdA,IAAc,6CAAdA,IAAc,mCAAdA,IAAc,+CAAdA,IAAc,iDAAdA,IAAc,qBAAdA,IAAc,2CAAdA,IAAc,yCAAdA,IAAc,mDAAdA,IAAc,2CAAdA,IAAc,uEAAdA,IAAc,mEAAdA,IAAc,mDAAdA,IAAc,uCAAdA,IAAc,+BAAdA,IAAc,+CAAdA,IAAc,uCAAdA,IAAc,6DAAdA,IAAc,uDAAdA,IAAc,iDAAdA,IAAc,mCAAdA,IAAc,iCAAdA,IAAc,uEAAdA,CAAc,EAAdA,IAAc,IAuXJA,MC3XR,IAAKC,GAAW,SAAXA,GAAW,OAAXA,EAAW,oEAAXA,EAAW,8CAAXA,EAAW,kEAAXA,EAAW,4CAAXA,EAAW,oDAAXA,EAAW,4CAAXA,EAAW,0EAAXA,CAAW,MCEXC,GAAU,SAAVA,GAAU,OAAVA,EAAU,cAAVA,EAAU,mBAAVA,EAAU,sBAAVA,CAAU,MC6DXA,GAAWC,MAIXD,GAAWE,UAIXF,GAAWG,QAOXH,GAAWC,MAIXD,GAAWE,UAIXF,GAAWG,QA9Ef,MCFMC,GAAuC,CAClDrH,GAAI,EACJsH,WAAY,EACZrH,KAAM,+BACNkG,YAAa,IAAIrG,KAAK,cACtBsG,aAAc,IAAItG,KAAK,cACvB2G,UAAU,GAGCc,GAAoD,CAC/DvH,GAAI,EACJvE,eAAgB,EAChBuK,YAAa,EACbS,SAAU,gBACVC,eAAgB,EAChBC,aAAc,qBACdR,YAAa,IAAIrG,KAAK,cACtB8G,gBAAiB,QACjBY,cAAe,IAAI1H,KAAK,cACxBgB,UAAW,CAACuG,IACZR,QAAS,IA6BEY,GAA+D,CAC1EzH,GAAI,EACJsH,WAAY,EACZtB,YAAa,EACbZ,cAAe,eACfsC,WAAY,EACZzB,SAAU,gCACVC,OAAQ,4BACRyB,UAAU,EACVrC,eAAgB,IAChBa,YAAa,IAAIrG,KAAK,cACtBuG,aDzDA,CAAEuB,iBAAkB,iBAAkB5H,GAAI,EAAG6H,MAAO,mBCoEvC,IAAI/H,KAAK,cACP,IAAIA,KAAK,c,cC1E1B,MAAMgI,GAAgB,CAAC,IAAK,IAAK,IAAK,KAgDhCC,IA1CsBC,KAAKC,UAC/B,CACEC,IAAK,CACHlI,GAAI,IACJmI,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,oBAGZ,KACA,GAKM,IAAIvJ,KAW8B,IAAIwJ,MAAM,IACjDC,MAAM,GACNC,UAAKC,GACLrL,KAAI,CAACsL,EAAOC,KACX,MAAMC,EAjDD9B,GAAc+B,KAAKC,MAAsB,EAAhBD,KAAKE,WAkDnC,MAAO,CACL/J,GAAI2J,EACJ9O,KAAMmP,aAAQ,IAAIlK,KAAQ,EAAI6J,GAC9BM,SAAUL,EACVpG,OAAQoG,EAAiB,IAAM,UAAY,OAC3CM,UAAWP,EAAI,IAAM,EAAI,UAAY,WACrCQ,QAAS,SAAWR,EACpBrI,+BAAgC,WAAaqI,EAC7CS,OAAQpC,KAAKC,UACX,CACEC,IAAK,CACHlI,GAAI2J,EACJxB,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,MAAO,iBACPC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,kBACRC,OAAQ,oBAGZ,KACA,GAEH,KAoBMtB,GAAkBwB,MAAM,EAAG,GC5GrB,IAAIzJ,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,KAUL,IAAIA,KACH,IAAIA,K,cClHf,MAAMuK,GAAgBA,IAC3BC,GAA8B,c,cCEzB,MCFMC,GACXC,GAEAF,GAAM,yBAAAxQ,OAA0D0Q,EAAQC,aCH7DC,GAAkBjP,GAC7B6O,GAAM,iBAAAxQ,OAA0C2B,EAAc,gBCJnDkP,GAAiB,CAC5BJ,uBAAwB,yBACxBK,iBAAkB,mBAClBF,eAAgB,iBAChBG,gBAAiB,kBACjBC,iBAAkB,mBAClBC,uBAAwB,yBACxBC,cAAe,gBACfC,kBAAmB,oBACnBC,mBAAoB,qBACpBC,oBAAqB,sBACrBC,oBAAqB,sBACrBC,qBAAsB,uBACtBC,oBAAqB,sBACrBC,2BAA4B,6BAC5BC,kBAAmB,oBACnBC,4BAA6B,8BAC7BC,2BAA4B,6BAC5BC,OAAQ,SACRC,wBAAyB,0BACzBC,YAAa,cACbC,sBAAuB,wBACvBC,uBAAwB,yBACxBC,0BAA2B,4BAC3BC,eAAgB,iBAChBC,0BAA2B,4BAC3BC,iBAAkB,mBAClBC,aAAc,eACdC,oBAAqB,sBACrBC,uBAAwB,yBACxBC,8BAA+B,gCAC/BC,yBAA0B,2BAC1BC,6BAA8B,+BAC9BC,YAAa,cACbC,oBAAqB,sBACrBC,SAAU,WACVC,yBAA0B,2BAC1BC,eAAgB,iBAChBC,iBAAkB,mBAClBC,uBAAwB,0BCvCbC,GAAgB,CAE3BC,UAAW,KAGAC,GAA2B,CAEtCD,UAAW,KCAAE,GAAiB3R,GAC5B4R,aACE,CAAC1C,GAAegB,OAAQlQ,IACxB,ICN0BA,IAC5B6O,GAAM,iBAAAxQ,OAAsC2B,EAAc,aAAY6R,MAAM7G,IAAc,IAAD8G,EAAAC,EAIvF,OAHY,OAAR/G,QAAQ,IAARA,GAAiB,QAAT8G,EAAR9G,EAAUgH,eAAO,IAAAF,GAAU,QAAVC,EAAjBD,EAAmBG,gBAAQ,IAAAF,GAA3BA,EAA6BG,SAAWlH,EAASgH,QAAQC,SAAS,GAAG1N,KACvEyG,EAASgH,QAAQC,SAAS,GAAG1N,GAAKvE,EAAemS,YAE5CnH,CAAQ,IDCToH,CAAcpS,IACpBwR,IEPSa,GAAgBA,IAC3BT,aAAS,CAAC1C,GAAeK,eAAgBA,GAAeiC,ICA7Cc,GAA2BC,YAAkD,CACxFC,IAAK,sBACLC,aAASzE,IAGE0E,GAAsBH,YAAyB,CAC1DC,IAAK,iBACLC,aAASzE,IAGE2E,GAAoBJ,YAA+B,CAC9DC,IAAK,eACLC,aAASzE,IAGE4E,GAA2BL,YAA+B,CACrEC,IAAK,sBACLC,aAASzE,IAGE6E,GAA4BA,IACvCC,aAA8BhT,IAAA,IAAC,MAAEiT,GAAOjT,EAAA,MAAK,KAC3CiT,EAAMT,IACNS,EAAML,IACNK,EAAMJ,GAAkB,CACzB,IC1BUK,GAA8CT,YAAc,CACvEC,IAAK,yCACLC,SAAS,IAGEQ,GAA4CV,YAAc,CACrEC,IAAK,uCACLC,SAAS,IAGES,GAAmCX,YAAa,CAC3DC,IAAK,8BACLC,QAAS,KAQEU,IALoCZ,YAAa,CAC5DC,IAAK,+BACLC,QAAS,KAGuCF,YAAa,CAC7DC,IAAK,gCACLC,QAAS,MAQEW,IALsCb,YAAa,CAC9DC,IAAK,iCACLC,QAAS,KAG4BY,YAAkB,CACvDb,IAAK,qBACLc,IAAKxT,IAAA,IAAC,IAAEwT,GAAKxT,EAAA,OACXwT,EAAIL,KACJK,EAAIN,GAA4C,KAGvCO,GAA6BF,YAAS,CACjDb,IAAK,wBACLc,IAAKE,IAAc,IAAb,IAAEF,GAAKE,EACX,MAAO,CACLC,WAAYH,EAAII,IAChBC,mBAAoBL,EAAIJ,IACxBU,qBAAsBN,EAAIH,IAC3B,IC/CQU,GACX,8GAEWC,GAAa,aAEbC,GAAgB,ICJhBC,GAAa1V,wDACb8L,GAAW9L,uCAEX2V,GAAW3V,2FACX4V,GAAe5V,iFACf6V,GAAkB7V,kCCPlB8V,GAAc,SAACC,GAAyC,IAA1BC,EAAQC,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,GAAAA,UAAA,GAAG,EACpD,GAAc,IAAVF,EAAa,MAAO,UAExB,MACMG,EAAKpG,KAAKqG,IAAIH,EAAU,GAExBpG,EAAIE,KAAKC,MAAMD,KAAKsG,IAAIL,GAASjG,KAAKsG,IAHlC,OAKV,OAAOC,YAAYN,EAAQjG,KAAKwG,IALtB,KAK6B1G,IAAI2G,QAAQL,IAAO,IAH5C,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAGItG,EACxE,ECTa4G,GAAY,CACvBC,YAAazW,gCACb0W,cAAe1W,kCACf2W,mBAAoB3W,yCAYT4W,GAAaA,CAACC,EAA8BC,KACvD,MAAMC,EAASP,GAAUK,GACnBG,EAAgB,OAALF,QAAK,IAALA,IAASC,EAEpBE,EAAW,GAAAlX,OAAMmX,OAAOC,SAASC,OAAM,KAAArX,OAblB,IAuB3B,MARa,GAAAA,OACXC,iFAAmC,6BAAAD,OACTgX,EAAM,eAAAhX,OAChCC,uCAAmC,qCAAAD,OACDsX,mBAClCJ,GACD,+CAAAlX,OAA8CiX,EAAQ,YAExCM,QAAQ,KAAM,IAAIA,QAAQ,KAAM,GAAG,EC7BvCC,GAAmBA,KAC9B,MAAMC,EAAM,IAAIzR,KACV0R,EAAOD,EAAItN,cACjB,OAAOsN,EAAIE,WAAa,EAAID,EAAOA,EAAO,CAAC,ECDhCE,GAAgBC,IAAmC,IAADC,EAAAC,EAC7D,OAAOC,QAAQH,KAAyD,QAAxCC,EAAgC,QAAhCC,EAACF,EAAaI,MAAMzC,WAAY,IAAAuC,OAAA,EAA/BA,EAAiClE,cAAM,IAAAiE,IAAI,GAAK,CAAC,ECDvEI,GAAe/R,IAA2B,IAADgS,EAAAC,EACpD,OAAOJ,QAAQ7R,KAAwC,QAA/BgS,EAAuB,QAAvBC,EAACjS,EAAK8R,MAAMxC,WAAW,IAAA2C,OAAA,EAAtBA,EAAwBvE,cAAM,IAAAsE,IAAI,GAAK,CAAC,ECDtDE,GACXC,GAEyB,aAAb,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,WACA,OAAZ4O,QAAY,IAAZA,KAAcjO,eACA,OAAZiO,QAAY,IAAZA,MAAcpO,eAChB,IAAIlE,KAAKsS,EAAapO,cAAcqO,SAAS,EAAG,EAAG,EAAG,IACpD,IAAIvS,MAAOuS,SAAS,EAAG,EAAG,EAAG,GCPtBC,GAASF,GACe,SAAvB,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc3O,kBCHH8O,GAASA,CAAIC,EAAeC,KACvC,IAAKnJ,MAAMoJ,QAAQF,GACjB,MAAO,GAGT,MAAMG,EAA0B,oBAAdF,EAA2BA,EAAaG,GAASA,EAAEH,GAerE,MAAO,IAbeD,EACnBK,QAAQC,GAAYA,IACpBC,QAAO,CAAC3U,EAAK0U,KACZ,MAAM7E,EAAM0E,EAAGG,GAEf,OAAK7E,EAIE7P,EAAI4U,IAAI/E,GAAO7P,EAAMA,EAAI6U,IAAIhF,EAAK6E,GAHhC1U,CAGqC,GAC7C,IAAI8U,KACNC,SAEsB,ECpBdC,GAAwBC,GAC5BA,EAAI1F,OAAM,GAAA7T,OAAMuZ,EAAIC,OAAO,GAAGC,eAAazZ,OAAGuZ,EAAI9J,MAAM,IAAO8J,ECC3DG,GAA0BA,CACrCC,EACAC,KAEA,MAAMC,EAAmBC,YAAeH,GAClCI,EAAcC,YAAgBL,GAAU,GAExCM,EAAYJ,GAAoBE,EAEtC,OAAOH,GAAuBK,EAAYA,CAAS,ECTxCC,GACX5B,GAC+C,gBAAvB,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc3O,kBCAfwQ,GAA0BjG,YAAa,CAClDC,IAAK,qBACLC,QAAS,KAGEgG,GAA4BlG,YAAa,CACpDC,IAAK,uBACLC,QAAS,IAGEiG,GAAwBnG,YAAa,CAChDC,IAAK,mBACLC,QAAS,KAGEkG,GAAoCpG,YAAa,CAC5DC,IAAK,+BACLC,QAAS,KAGEmG,GAAwCrG,YAA0B,CAC7EC,IAAK,wCACLC,aAASzE,IAGE6K,GAAoCtG,YAAa,CAC5DC,IAAK,oCACLC,QAAS,KAGEqG,GAA0BzF,YAA0B,CAC/Db,IAAK,0BACLc,IAAKxT,IAAc,IAADiZ,EAAA,IAAZ,IAAEzF,GAAKxT,EACX,MAAMkZ,EAAa1F,EAAIsF,IACvB,IAAIK,EAAe3F,EAAIuF,IAQvB,OANII,IACFA,EAAeA,EAAaC,WAAW,QACnCD,EACA,OAAStB,GAAqBsB,IAG7B,CACLE,sBAAiD,QAA5BJ,EAAEzF,EAAIoF,WAAsB,IAAAK,IAAI,KACrD5M,iBAAkBmH,EAAIqF,IACtBS,WAAY9F,EAAImF,IAChBY,SAAU/F,EAAIkF,OACVS,GAAgB,CAClBK,YAAaL,EACbM,OAAQP,EAAa,aAAe,aAEvC,ICnDQQ,GAA2BjH,YAAa,CACnDC,IAAK,2BACLC,QAAS,IAEEgH,GAA+BlH,YAAa,CACvDC,IAAK,0BACLC,QAAS,KAGEiH,GAAiCnH,YAAa,CACzDC,IAAK,4BACLC,QAAS,IAGEkH,GAA6BpH,YAAa,CACrDC,IAAK,wBACLC,QAAS,KAGEmH,GAAyCrH,YAAa,CACjEC,IAAK,oCACLC,QAAS,KAGEoH,GAAyCtH,YAAa,CACjEC,IAAK,oCACLC,QAAS,eAGEqH,GAA6CvH,YAA0B,CAClFC,IAAK,6CACLC,aAASzE,IAGE+L,GAAyCxH,YAAa,CACjEC,IAAK,yCACLC,QAAS,KAGEuH,GAA+B3G,YAAqC,CAC/Eb,IAAK,+BACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAMkZ,EAAa1F,EAAIwG,IACjBb,EAAe3F,EAAIyG,IACnBZ,EAAwB7F,EAAIqG,IAElC,MAAO,IACDR,GAAyB,CAAEA,4BAC3B7F,EAAIsG,KAA2C,CACjDzN,iBAAkBmH,EAAIsG,KAExBK,iBAAkB3G,EAAIuG,IACtBT,WAAY9F,EAAIoG,IAChBL,SAAU/F,EAAImG,OACVR,GAAgB,CAClBK,YAAaL,EACbM,OAAQP,EAAa,aAAe,aAEvC,IAeQkB,GAA6B3H,YAAc,CACtDC,IAAK,6BACLC,SAAS,IAGE0H,GAAwB5H,YAAc,CACjDC,IAAK,6BACLC,SAAS,IAGE2H,GAA0B7H,YAA4B,CACjEC,IAAK,0BACLC,aAASzE,ICpFEqM,GAAmC9H,YAAa,CAC3DC,IAAK,8BACLC,QAAS,KAGE6H,GAAqC/H,YAAa,CAC7DC,IAAK,gCACLC,QAAS,IAGE8H,GAAqChI,YAAiC,CACjFC,IAAK,gCACLC,aAASzE,IAGEwM,GAAgCjI,YAAa,CACxDC,IAAK,2BACLC,QAAS,KAGEgI,GAAuClI,YAAa,CAC/DC,IAAK,kCACLC,QAAS,KAGEiI,GAA2CnI,YAA0B,CAChFC,IAAK,sCACLC,aAASzE,IAGE2M,GAA4BtH,YAAwC,CAC/Eb,IAAK,uBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAImH,IACpBtB,EAAwB7F,EAAIkH,IAYlC,MAV+C,CAC7CnB,SAAU/F,EAAI+G,IACdjB,WAAY9F,EAAIgH,OACZM,GAAiB,CACnBA,gBACAC,kBAAmBvH,EAAIoH,QAErBvB,GAAyB,CAAEA,yBAGnB,IC9CL2B,GAAkBvI,YAAkC,CAC/DC,IAAK,aACLC,aAASzE,IAGE+M,GAA2BxI,YAAc,CACpDC,IAAK,sBACLC,SAAS,IAGEuI,GAA2BzI,YAAc,CACpDC,IAAK,sBACLC,SAAS,IAGEwI,GAA2B1I,YAAa,CACnDC,IAAK,sBACLC,QAAS,KAGEyI,GAA6B3I,YAAa,CACrDC,IAAK,wBACLC,QAAS,IAGE0I,GAAyB5I,YAAa,CACjDC,IAAK,oBACLC,QAAS,KAGE2I,GAA6B7I,YAAa,CACrDC,IAAK,wBACLC,QAAS,IAGE4I,GAAmC9I,YAAa,CAC3DC,IAAK,8BACLC,QAAS,IAaE6I,IAVqC/I,YAAa,CAC7DC,IAAK,gCACLC,QAAS,IAGuCF,YAAa,CAC7DC,IAAK,4CACLC,QAAS,IAGqBF,YAAa,CAC3CC,IAAK,mBACLC,QAAS,MAGE8I,GAAkBhJ,YAAa,CAC1CC,IAAK,kBACLC,QAAS,KAGE+I,GAAmBjJ,YAA2B,CACzDC,IAAK,cACLC,QAAS,KAGEgJ,GAAwBlJ,YAAa,CAChDC,IAAK,wBACLC,QAAS,IAGEiJ,GAAqBrI,YAAiC,CACjEb,IAAK,eACLc,IAAKxT,IAAA,IAAC,IAAEwT,GAAKxT,EAAA,MAAM,CACjB0E,KAAM8O,EAAIiI,IACVnP,MAAOkH,EAAIgI,IACXK,QAASrI,EAAIkI,IAAkB7Y,KAAKiZ,GAASA,EAAKC,QAClDC,aAAcxI,EAAImI,IACnB,IAGUM,GAA0BA,IACrCjJ,aAA8BU,IAAA,IAAC,MAAET,GAAOS,EAAA,MAAK,KAC3CT,EAAMwI,IACNxI,EAAMuI,IACNvI,EAAMyI,IACNzI,EAAM0I,GAAsB,CAC7B,ICzFUO,GAAmBzJ,YAAa,CAC3CC,IAAK,cACLC,QAAS,IAGEwJ,GAAqB1J,YAAa,CAC7CC,IAAK,gBACLC,QAAS,KAGEyJ,GAAsB3J,YAAa,CAC9CC,IAAK,iBACLC,QAAS,KAGE0J,GAAgC5J,YAAe,CAC1DC,IAAK,2BACLC,QAAS,KAGE2J,GAAsC7J,YAAe,CAChEC,IAAK,iCACLC,QAAS,KAGE4J,GAAe9J,YAAc,CACxCC,IAAK,UACLC,SAAS,IAGE6J,GAAmB/J,YAAc,CAC5CC,IAAK,cACLC,SAAS,IAGE8J,GAAiBhK,YAAc,CAC1CC,IAAK,YACLC,SAAS,IAGE+J,GAAqBnJ,YAAkB,CAClDb,IAAK,gBACLc,IAAKxT,IAAA,IAAC,IAAEwT,GAAKxT,EAAA,OAAKwT,EAAI+I,KAAiB/I,EAAIgJ,KAAqBhJ,EAAIiJ,GAAe,IAGxEE,GAA0BpJ,YAAkB,CACvDb,IAAK,qBACLc,IAAKE,IAAA,IAAC,IAAEF,GAAKE,EAAA,OAAKF,EAAI+I,KAAiB/I,EAAIgJ,GAAiB,IAGjDI,GAAwBrJ,YAAS,CAC5Cb,IAAK,yBACLc,IAAKqJ,IAAc,IAAb,IAAErJ,GAAKqJ,EACX,MAAO,CACLpS,YAAa+I,EAAI0I,IACjBrS,cAAe2J,EAAI2I,IACnBW,yBAA0BtJ,EAAI6I,IAC/B,ICpDQU,GAAuBtK,YAAc,CAChDC,IAAK,kBACLC,SAAS,IAGEqK,GAA6BvK,YAAc,CACtDC,IAAK,wBACLC,SAAS,IAGEsK,GAAcxK,YAAyB,CAClDC,IAAK,SACLC,aAASzE,IAGEgP,GAAuBzK,YAAuB,CACzDC,IAAK,kBACLC,aAASzE,IAGEiP,GAAqB1K,YAAW,CAC3CC,IAAK,gBACLC,QAAS,IAAIpO,OAGF6Y,GAAqB3K,YAAqB,CACrDC,IAAK,gBACLC,QAAS,KAGE0K,GAAkB5K,YAAa,CAC1CC,IAAK,kBACLC,QAAS,KAGEiB,GAA2BnB,YAAa,CACnDC,IAAK,sBACLC,QAASoD,OAQEuH,IAL4B7K,YAAa,CACpDC,IAAK,uBACLC,QAASoD,OAG6BtD,YAAyB,CAC/DC,IAAK,sBACLC,aAASzE,KAGEqP,GAA+B9K,YAAc,CACxDC,IAAK,0BACLC,SAAS,IAGE6K,GAAsB/K,YAAa,CAC9CC,IAAK,iBACLC,QAAS,KAGE8K,GAAwBhL,YAAa,CAChDC,IAAK,mBACLC,QAAS,IAGE+K,GAAkBjL,YAA+B,CAC5DC,IAAK,aACLC,aAASzE,IAGEyP,GAAwBlL,YAAiC,CACpEC,IAAK,mBACLC,aAASzE,IAGE0P,GAAoBrK,YAAoC,CACnEb,IAAK,eACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAI8J,IACpBvC,EAAoBvH,EAAI+J,IAC9B,OAAOzC,EAAgB,CAAC,CAAErW,GAAIqW,EAAe+C,KAAM9C,IAAuB,EAAE,IAInE+C,GAAqBvK,YAA2B,CAC3Db,IAAK,gBACLc,IAAKE,IAAc,IAAb,IAAEF,GAAKE,EACX,MAAMqK,EAASvK,EAAIyJ,IACbe,EAAYxK,EAAI0J,IAChBe,EAAUzK,EAAI2J,IACdrC,EAAgBtH,EAAI8J,IAEpBrO,EAA4B,IACtB,OAAN8O,QAAM,IAANA,KAAQG,eAAiBF,EAAY,CAAEA,UAAWA,EAAUG,eAAkB,SAC7EJ,GAAgB,OAANA,QAAM,IAANA,KAAQG,cAAgB,CAAED,QAASA,EAAQE,eAAkB,KAC5E5E,SAAU/F,EAAIgK,IACdlE,WAAY9F,EAAIiK,OACZ3C,EACA,CACEA,cAAejD,GAAqBiD,GACpCC,kBAAmBvH,EAAI+J,KAEzB,MAON,OAJA/J,EAAI4J,IAAoBgB,SAAS9G,IAC/BrI,EAAQqI,EAAO5S,MAAQ4S,EAAO+G,cAAcxb,KAAKyb,GAAaA,EAASvC,OAAM,IAGxE9M,CAAO,IClHLsP,GAAuB9L,YAAc,CAChDC,IAAK,kBACLC,SAAS,IAGE6L,GAAwC/L,YAAc,CACjEC,IAAK,mCACLC,SAAS,IAGE8L,GAAsBhM,YAAyB,CAC1DC,IAAK,iBACLC,aAASzE,IAGEwQ,GAAsBjM,YAAyB,CAC1DC,IAAK,iBACLC,aAASzE,ICdEyQ,GAAqBlM,YAAiC,CACjEC,IAAK,gBACLC,aAASzE,IAGE0Q,GAA+BnM,YAAiC,CAC3EC,IAAK,0BACLC,aAASzE,IAGE2Q,GAA8BpM,YAA0B,CACnEC,IAAK,iBACLC,SAAS,IAGEmM,GAAwBvL,YAAS,CAC5Cb,IAAK,qBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAO,CACLmL,eAAgBqI,EAAIiL,IACpBM,eAAgBvL,EAAIkL,IACpBM,cAAexL,EAAImL,IACnBM,gBAAiBzL,EAAIoL,IACrBM,cAAe1L,EAAIqL,IACpB,IC3BQM,GAAkC1M,YAAc,CAC3DC,IAAK,4BACLC,SAAS,IAGEyM,GAA+B3M,YAAyB,CACnEC,IAAK,0BACLC,aAASzE,IAGEmR,GAAmC5M,YAAyB,CACvEC,IAAK,8BACLC,aAASzE,IAGEoR,GAA6B/L,YAAS,CACjDb,IAAK,6BACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAO,CACLuf,2BAA4B/L,EAAI2L,IAChCK,wBAAyBhM,EAAI4L,IAC7BK,4BAA6BjM,EAAI6L,IAClC,ICtBQK,GAA+BjN,YAAe,CACzDC,IAAK,0BACLC,QAAS,KAGEgN,GAA+BlN,YAAe,CACzDC,IAAK,0BACLC,QAAS,KAGEiN,GAAoB,CAACF,GAA8BC,ICTnDE,GAA8BpN,YAA2B,CACpEC,IAAK,yBACLC,QAAS,KAGEmN,GAAoBrN,YAA2B,CAC1DC,IAAK,eACLC,QAAS,KAGEoN,GAAsBtN,YAA2B,CAC5DC,IAAK,iBACLC,QAAS,KAGEqN,GAAuBvN,YAA2B,CAC7DC,IAAK,kBACLC,QAAS,KAGEsN,GAAsBxN,YAA2B,CAC5DC,IAAK,iBACLC,QAAS,KAGEuN,GAAsBzN,YAAuB,CACxDC,IAAK,iBACLC,aAASzE,IAGEiS,GAAoB1N,YAAuB,CACtDC,IAAK,eACLC,aAASzE,IAGEkS,GAAkB3N,YAA2B,CACxDC,IAAK,aACLC,QAAS,KAGE0N,GAAc,CACzBR,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,ICjDWE,GAAkB7N,YAAa,CAC1CC,IAAK,aACLC,QAAS,ICDE4N,GAAsB9N,YAAa,CAC9CC,IAAK,iBACLC,QAASpH,GAAsBiV,OCApBC,GAA4BlN,YAAmC,CAC1Eb,IAAK,uBACLc,IAAKxT,IAAA,IAAC,IAAEwT,GAAKxT,EAAA,MAAM,CACjB0gB,QAASlN,EAAI+M,MAAyBhV,GAAsBoV,SAC7D,ICQUC,GAA0BnO,YAAc,CACnDC,IAAK,qBACLC,SAAS,IAGEkO,GAAkBpO,YAAa,CAC1CC,IAAK,aACLC,QAAS,KAGEmO,GAAwBrO,YAAa,CAChDC,IAAK,mBACLC,QAAS,IAGEoO,GAAsBtO,YAAa,CAC9CC,IAAK,iBACLC,QAAS,KAGEqO,GAAc,CACzBT,GACAK,GACAC,GACAC,GACAC,IAGWE,GAAqB1N,YAAkC,CAClEb,IAAK,gBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAMkhB,EAAW1N,EAAI0M,IACfiB,EAAS3N,EAAI2M,IAEnB,MAAO,IACF3M,EAAIiN,IACPW,aAAc5N,EAAIoN,IAClBS,YAAa7N,EAAIuM,IAAqBld,KAAKwF,GAAaA,EAAS0T,QACjEuF,aAAc9N,EAAIwM,IAAsBnd,KAAKgD,GAAcA,EAAUkW,QACrEwF,YAAa/N,EAAIyM,IAAqBpd,KAAKsF,GAAaA,EAAS4T,QACjEyF,UAAWhO,EAAIsM,IAAmBjd,KAAKoF,GAAWA,EAAO8T,QACzDF,QAASrI,EAAI4M,IAAiBvd,KAAKiZ,GAASA,EAAKC,WAC7CmF,EAAW,CAAEA,SAAUA,EAAS/C,eAAkB,QAClDgD,EAAS,CAAEA,OAAQA,EAAOhD,eAAkB,KAChDsD,QAASjO,EAAIqM,IAA6Bhd,KAAKuC,GAASA,EAAK2W,WACzDvI,EAAIqN,IAAmB,CAAEa,WAAYlO,EAAIqN,KAAqB,KAClEc,aAAcnO,EAAI8M,IAClB/G,SAAU/F,EAAIuN,IACdzH,WAAY9F,EAAIsN,IACjB,IAIQc,GAAyBrO,YAA+B,CACnEb,IAAK,oBACLc,IAAKE,IAAA,IAAC,IAAEF,GAAKE,EAAA,MAAM,IACdF,EAAIiN,IACPe,UAAWhO,EAAIsM,IAAmBjd,KAAKoF,GAAWA,EAAO8T,QAC1D,ICzEU8F,GAA0BpP,YAAa,CAClDC,IAAK,qBACLC,QAAS,ICFEmP,GAAmBrP,YAAc,CAC5CC,IAAK,cACLC,SAAS,ICFEoP,GAA4BtP,YAAc,CACrDC,IAAK,uBACLC,SAAS,ICDEqP,GAAoBvP,YAAa,CAC5CC,IAAK,oBACLC,QAAS,KAGEsP,GAAsBxP,YAAa,CAC9CC,IAAK,sBACLC,QAAS,IAGEuP,GAAkCzP,YAA0B,CACvEC,IAAK,kCACLC,aAASzE,IAGEiU,GAA8B1P,YAAa,CACtDC,IAAK,8BACLC,QAAS,KAGEyP,GAAkB3P,YAAa,CAC1CC,IAAK,kBACLC,QAAS,KAGE0P,GAAwB5P,YAAyB,CAC5DC,IAAK,wBACLC,aAASzE,IAGEoU,GAA8B7P,YAAa,CACtDC,IAAK,8BACLC,QAAS,KAGE4P,GAA2B9P,YAAa,CACnDC,IAAK,2BACLC,QAAS,KAGE6P,GAAoC/P,YAAa,CAC5DC,IAAK,oCACLC,QAAS,KAGE8P,GAAuBlP,YAA0B,CAC5Db,IAAK,kBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAMkZ,EAAa1F,EAAI0O,IACjB/I,EAAe3F,EAAI2O,IAEzB,MAAO,CACL5I,SAAU/F,EAAIwO,IACd1I,WAAY9F,EAAIyO,IAChB5I,sBAAuB7F,EAAI4O,IAC3B/V,iBAAkB,MACd8M,GAAgB,CAClBK,YAAaL,EACbM,OAAQP,EAAa,aAAe,aAEvC,IAIQwJ,GAAyBnP,YAA4B,CAChEb,IAAK,yBACLc,IAAKE,IAAc,IAAb,IAAEF,GAAKE,EAOX,MANmC,CACjCjP,GAAI,EACJke,SAAUnP,EAAI8O,IACdM,mBAAoBpP,EAAIgP,IACxBlW,MAAOkH,EAAI+O,IAEC,ICrELM,GAA6BpQ,YAAqB,CAC7DC,IAAK,wBACLC,QAAS,KAGEmQ,GAA+BrQ,YAAW,CACrDC,IAAK,0BACLC,QAASlE,aAAQ,IAAIlK,MAAS,KAGnBwe,GAA6BtQ,YAAW,CACnDC,IAAK,wBACLC,QAAS,IAAIpO,OAGFye,GAAmCvQ,YAAyB,CACvEC,IAAK,8BACLC,aAASzE,IAGE+U,GAAuCxQ,YAAc,CAChEC,IAAK,kCACLC,SAAS,IAGEuQ,GAA8BzQ,YAAa,CACtDC,IAAK,yBACLC,QAAS,KAGEwQ,GAAgC1Q,YAAa,CACxDC,IAAK,2BACLC,QAAS,IAGEyQ,GAA+B3Q,YAAa,CACvDC,IAAK,+BACLC,QAAS,YAGE0Q,GAAgC5Q,YAAa,CACxDC,IAAK,gCACLC,QAAS,KAGE2Q,GAA4B/P,YAAsC,CAC7Eb,IAAK,uBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAIwP,IACpBjI,EAAoBvH,EAAIyP,IAC9B,OAAOnI,EAAgB,CAAC,CAAErW,GAAIqW,EAAe+C,KAAM9C,IAAuB,EAAE,IAInEwI,GAA0B9Q,YAAiC,CACtEC,IAAK,0BACLC,aAASzE,IAGEsV,GAAgC/Q,YAAiC,CAC5EC,IAAK,gCACLC,aAASzE,IAGEuV,GAA6BlQ,YAAkC,CAC1Eb,IAAK,uBACLc,IAAKE,IAAc,IAADgQ,EAAAzK,EAAA0K,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAAZ,IAAE5Q,GAAKE,EACX,MAAMwF,EAAa1F,EAAIyP,IACjB9J,EAAe3F,EAAIwP,IAEnB/T,EAAU,CACdoV,QAAS7Q,EAAI6P,IACbrF,UAA2D,QAAlD0F,EAAmC,QAAnCzK,EAAEzF,EAAIsP,WAA6B,IAAA7J,OAAA,EAAjCA,EAAmCkF,qBAAa,IAAAuF,IAAI,GAC/DzF,QAAsD,QAA/C0F,EAAEnQ,EAAIuP,IAA4B5E,qBAAa,IAAAwF,IAAI,GAC1D/U,QAE6B,QAFtBgV,EACiE,QADjEC,EACLrQ,EAAIqP,IAA4BvL,QAAQgN,GAAiB,YAAXA,EAAE5f,OAAoB,UAAE,IAAAmf,GAClD,QADkDC,EAAtED,EACIxF,cAAc,UAAE,IAAAyF,OADkD,EAAtEA,EACsB/H,aAAK,IAAA6H,IAAI,GACjC3b,OAEW,QAFL8b,EACiE,QADjEC,EACJxQ,EAAIqP,IAA4BvL,QAAQgN,GAAiB,WAAXA,EAAE5f,OAAmB,UAAE,IAAAsf,GAAkB,QAAlBC,EAArED,EAAuE3F,cAAc,UAAE,IAAA4F,OAAlB,EAArEA,EACIlI,aAAK,IAAAgI,IAAI,GACfrV,SAE6B,QAFrBwV,EACiE,QADjEC,EACN3Q,EAAIqP,IAA4BvL,QAAQgN,GAAiB,aAAXA,EAAE5f,OAAqB,UAAE,IAAAyf,GACnD,QADmDC,EAAvED,EACI9F,cAAc,UAAE,IAAA+F,OADmD,EAAvEA,EACsBrI,aAAK,IAAAmI,IAAI,GACjC3K,SAAU/F,EAAI0P,IACd5J,WAAY9F,EAAI2P,OACZhK,GAAgB,CAClBK,YAAaL,EACbM,OAAQP,EAAa,aAAe,cAUxC,OANA1F,EAAIqP,IAA4BzE,SAAS9G,IAClCA,EAAOiN,eACVtV,EAAQqI,EAAO5S,MAAQ4S,EAAO+G,cAAcxb,KAAKyb,GAAaA,EAASvC,QACzE,IAGK9M,CAAO,IClGLuV,GAAqC/R,YAAqB,CACrEC,IAAK,gCACLC,QAAS,KAGE8R,GAAuChS,YAAW,CAC7DC,IAAK,kCACLC,QAASlE,aAAQ,IAAIlK,MAAS,KAGnBmgB,GAAqCjS,YAAW,CAC3DC,IAAK,gCACLC,QAAS,IAAIpO,OAGFogB,GAA2ClS,YAAyB,CAC/EC,IAAK,sCACLC,aAASzE,IAGE0W,GAA+CnS,YAAc,CACxEC,IAAK,0CACLC,SAAS,IAGEkS,GAAsCpS,YAAa,CAC9DC,IAAK,iCACLC,QAAS,KAGEmS,GAAwCrS,YAAa,CAChEC,IAAK,mCACLC,QAAS,IAGEoS,GAAuCtS,YAAa,CAC/DC,IAAK,uCACLC,QAAS,YAGEqS,GAAwCvS,YAAa,CAChEC,IAAK,wCACLC,QAAS,KAGEsS,GAAkCxS,YAAiC,CAC9EC,IAAK,kCACLC,aAASzE,IAGEgX,GAAwCzS,YAAiC,CACpFC,IAAK,wCACLC,aAASzE,IAGEiX,GAAoC5R,YAAsC,CACrFb,IAAK,+BACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAImR,IACpB5J,EAAoBvH,EAAIoR,IAC9B,OAAO9J,EAAgB,CAAC,CAAErW,GAAIqW,EAAe+C,KAAM9C,IAAuB,EAAE,IAInEqK,GAAqC7R,YAAkC,CAClFb,IAAK,+BACLc,IAAKE,IAAc,IAADgQ,EAAAzK,EAAA0K,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAAZ,IAAE5Q,GAAKE,EACX,MAAMwF,EAAa1F,EAAIoR,IACjBzL,EAAe3F,EAAImR,IAEnB1V,EAAU,CACdoV,QAAS7Q,EAAIwR,IACbhH,UAAmE,QAA1D0F,EAA2C,QAA3CzK,EAAEzF,EAAIiR,WAAqC,IAAAxL,OAAA,EAAzCA,EAA2CkF,qBAAa,IAAAuF,IAAI,GACvEzF,QAA8D,QAAvD0F,EAAEnQ,EAAIkR,IAAoCvG,qBAAa,IAAAwF,IAAI,GAClE/U,QAE6B,QAFtBgV,EACyE,QADzEC,EACLrQ,EAAIgR,IAAoClN,QAAQgN,GAAiB,YAAXA,EAAE5f,OAAoB,UAAE,IAAAmf,GAC1D,QAD0DC,EAA9ED,EACIxF,cAAc,UAAE,IAAAyF,OAD0D,EAA9EA,EACsB/H,aAAK,IAAA6H,IAAI,GACjC3b,OAE6B,QAFvB8b,EACyE,QADzEC,EACJxQ,EAAIgR,IAAoClN,QAAQgN,GAAiB,WAAXA,EAAE5f,OAAmB,UAAE,IAAAsf,GACzD,QADyDC,EAA7ED,EACI3F,cAAc,UAAE,IAAA4F,OADyD,EAA7EA,EACsBlI,aAAK,IAAAgI,IAAI,GACjCrV,SAE6B,QAFrBwV,EACyE,QADzEC,EACN3Q,EAAIgR,IAAoClN,QAAQgN,GAAiB,aAAXA,EAAE5f,OAAqB,UAAE,IAAAyf,GAC3D,QAD2DC,EAA/ED,EACI9F,cAAc,UAAE,IAAA+F,OAD2D,EAA/EA,EACsBrI,aAAK,IAAAmI,IAAI,GACjC3K,SAAU/F,EAAIqR,IACdvL,WAAY9F,EAAIsR,OACZ3L,GAAgB,CAClBK,YAAaL,EACbM,OAAQP,EAAa,aAAe,cAUxC,OANA1F,EAAIgR,IAAoCpG,SAAS9G,IAC1CA,EAAOiN,eACVtV,EAAQqI,EAAO5S,MAAQ4S,EAAO+G,cAAcxb,KAAKyb,GAAaA,EAASvC,QACzE,IAGK9M,CAAO,IC/FLoW,GAAiC5S,YAAc,CAC1DC,IAAK,iCACLC,SAAS,IAGE2S,GAA4B7S,YAA6C,CACpFC,IAAK,4BACLC,aAASzE,IAGEqX,GAA4B9S,YAAqB,CAC5DC,IAAK,uBACLC,QAAS,KAGE6S,GAA8B/S,YAAW,CACpDC,IAAK,yBACLC,QAASlE,aAAQ,IAAIlK,MAAS,KAGnBkhB,GAA4BhT,YAAW,CAClDC,IAAK,uBACLC,QAAS,IAAIpO,OAGFmhB,GAAkCjT,YAAyB,CACtEC,IAAK,6BACLC,aAASzE,IAGEyX,GAAsClT,YAAc,CAC/DC,IAAK,iCACLC,SAAS,IAGEiT,GAA6BnT,YAAa,CACrDC,IAAK,wBACLC,QAAS,KAGEkT,GAA+BpT,YAAa,CACvDC,IAAK,0BACLC,QAAS,IAGEmT,GAA+BrT,YAAa,CACvDC,IAAK,+BACLC,QAAS,KAGEoT,GAA2BxS,YAAsC,CAC5Eb,IAAK,sBACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAIkS,IACpB3K,EAAoBvH,EAAImS,IAC9B,OAAO7K,EAAgB,CAAC,CAAErW,GAAIqW,EAAe+C,KAAM9C,IAAuB,EAAE,IAInEiL,GAA4BzS,YAAkC,CACzEb,IAAK,uBACLc,IAAKE,IAAc,IAADgQ,EAAAzK,EAAA0K,EAAAC,EAAAC,EAAAC,EAAA,IAAZ,IAAEtQ,GAAKE,EACX,MAAMwF,EAAa1F,EAAImS,IACjBxM,EAAe3F,EAAIkS,IAEzB,MAAO,CACLrB,QAAS7Q,EAAIsS,IACb9H,UAA0D,QAAjD0F,EAAkC,QAAlCzK,EAAEzF,EAAIgS,WAA4B,IAAAvM,OAAA,EAAhCA,EAAkCkF,qBAAa,IAAAuF,IAAI,GAC9DzF,QAAqD,QAA9C0F,EAAEnQ,EAAIiS,IAA2BtH,qBAAa,IAAAwF,IAAI,GACzDsC,iBAE6B,QAFbrC,EACgE,QADhEC,EACdrQ,EAAI+R,IAA2BjO,QAAQgN,GAAiB,qBAAXA,EAAE5f,OAA6B,UAAE,IAAAmf,GAC1D,QAD0DC,EAA9ED,EACIxF,cAAc,UAAE,IAAAyF,OAD0D,EAA9EA,EACsB/H,aAAK,IAAA6H,IAAI,wBACjCrK,SAAU/F,EAAIoS,IACdtM,WAAY9F,EAAIqS,OACZ1M,GAAgB,CAClBM,OAAQN,EACR+M,UAAWhN,EAAa,aAAe,aAE1C,IChFQiN,GAAkD1T,YAAqB,CAClFC,IAAK,6CACLC,QAAS,KAGEyT,GAA8C3T,YAAa,CACtEC,IAAK,yCACLC,QAAS,KAGE0T,GAAwD5T,YAAyB,CAC5FC,IAAK,mDACLC,aAASzE,IAGEoY,GAA4D7T,YAAc,CACrFC,IAAK,uDACLC,SAAS,IAGE4T,GAAmD9T,YAAa,CAC3EC,IAAK,8CACLC,QAAS,KAGE6T,GAAqD/T,YAAa,CAC7EC,IAAK,gDACLC,QAAS,IAGE8T,GAAiDlT,YAE5D,CACAb,IAAK,4CACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAM8a,EAAgBtH,EAAI6S,IACpBtL,EAAoBvH,EAAI8S,IAC9B,OAAOxL,EAAgB,CAAC,CAAErW,GAAIqW,EAAe+C,KAAM9C,IAAuB,EAAE,IAInE2L,GACXnT,YAA0C,CACxCb,IAAK,+BACLc,IAAKE,IAAc,IAADmQ,EAAAC,EAAA,IAAZ,IAAEtQ,GAAKE,EACX,MAAMwF,EAAa1F,EAAI8S,IACjBnN,EAAe3F,EAAI6S,IACnBM,EAEF,QAFa9C,EAAGrQ,EAAI2S,IAAiD7O,QACtEgN,GAAiB,WAAXA,EAAE5f,OACT,UAAE,IAAAmf,GAAkB,QAAlBC,EAFgBD,EAEdxF,cAAc,UAAE,IAAAyF,OAAlB,EAFgBA,EAEI/H,MAClB6K,EAAkCpT,EAAI4S,IAEtCnX,EAAU,CACdqK,WAAY9F,EAAIgT,IAChBjN,SAAU/F,EAAI+S,OACVpN,GAAgB,CAClB2B,cAAe3B,EACfM,OAAQP,EAAa,aAAe,gBAElCyN,GAAe,CACjB1e,OAAmB,OAAX0e,QAAW,IAAXA,IAAe,OAErBC,GAAmC,CACrC7gB,+BAAgC6gB,IAQpC,OAJApT,EAAI2S,IAAiD/H,SAAS9G,IAC5DrI,EAAQqI,EAAO5S,MAAQ4S,EAAO+G,cAAcxb,KAAKyb,GAAaA,EAASvC,OAAM,IAGxE9M,CAAO,ICrDP4X,GACXA,KACS,CACLC,YAAaX,GACbY,gBAAiBP,GACjBQ,cAAeT,GACfU,YAAaR,GACbS,mBAAoBb,GACpBc,uBAAwBb,GACxBc,aAAcV,KCiBPW,GAAyB,WAEF,IADlC1Y,EAAwB8F,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,GAAAA,UAAA,GAAG,UAE3B,MAAO6S,GAAiBC,mBAAS5Y,GAiEjC,MAAO,CACLyY,aA/DkB,YAAlBE,EACI7D,GACA2B,GA8DJ0B,YA3DkB,YAAlBQ,EACIzE,GACA2B,GA0DJyC,YAvDkB,YAAlBK,EACIhE,GACA6B,GAsDJ4B,gBAzCkB,YAAlBO,EACInE,GACA2B,GAwCJkC,cArCkB,YAAlBM,EACIpE,GACA2B,GAoCJ2C,eAjCkB,YAAlBF,EACIxE,GACA2B,GAgCJgD,aA7BkB,YAAlBH,EACIvE,GACA2B,GA4BJgD,eAzBkB,YAAlBJ,EACIlE,GACA2B,GAwBJmC,mBAxDkB,YAAlBI,EACItE,GACA2B,GAuDJwC,uBApDkB,YAAlBG,EACIrE,GACA2B,GAmDJ+C,gBAvBkB,YAAlBL,EACIjE,GACA2B,GAsBJ4C,iBAnBkB,YAAlBN,EAA8B/D,GAA0B0B,GAoBxD4C,gBAjBkB,YAAlBP,EACI9D,GACA0B,GAiBR,ECnIa4C,GAA2CrV,YAAyB,CAC/EC,IAAK,sCACLC,aAASzE,ICAE6Z,GAA6CtV,YAAyB,CACjFC,IAAK,wCACLC,aAASzE,IAGE8Z,GAA4CvV,YAAa,CACpEC,IAAK,uCACLC,QAAS,KAGEsV,GAA6CxV,YAAa,CACrEC,IAAK,wCACLC,QAAS,KAGEuV,GAA6CzV,YAAa,CACrEC,IAAK,wCACLC,QAAS,IAGEwV,GAAwC1V,YAA2B,CAC9EC,IAAK,mCACLC,QAAS,KAGEyV,GAA+C3V,YAAa,CACvEC,IAAK,0CACLC,QAAS,UAGE0V,GAA0C9U,YAAiC,CACtFb,IAAK,qCACLc,IAAKxT,IAAc,IAAb,IAAEwT,GAAKxT,EACX,MAAO,CACLsoB,SAAU9U,EAAIwU,IACdO,MAAO/U,EAAI2U,IAAuCtlB,KAAKiZ,GAASA,EAAKC,QACrEC,aAAcxI,EAAI0U,IAClBM,aAAoE,SAAtDhV,EAAI4U,IACnB,ICvCQ1Y,GAAoBA,IAC/BX,GAAkC,mBCCvB0Z,GAAoBA,IAC/B3W,aAAS,CAAC1C,GAAeM,mBAAoBA,GAAmBgC,ICJrDlC,GAAyBA,IACpCT,GAAuC,wBCD5BU,GAAgBA,IAC3BV,GAA8B,cCDnBsB,GAA0BA,IACrCtB,GAAwC,gCCA7B2B,GAAiBA,IAC5B3B,GAA+B,eCDpB2Z,GAAmBje,GAC9Bke,GAAS,QAAApqB,OAAsBkM,EAAW,YCD/Bme,GACX3Z,GAEA4Z,GAAyD,kBAAmB5Z,GCFjE6Z,GAAmB7Z,GAC9B4Z,GAAO,SAAAtqB,OAA+C0Q,EAAQxK,GAAE,SAASwK,GCH9D8Z,GAAcC,SACDC,EAAIC,OAAOnX,MAAMoX,GAAUC,QAAQC,OAAOF,KAC3CG,QAAQvX,MAAK,IAClCkX,EAAIjf,OAAO+H,MAAMoX,GACfC,QAAQC,OAAO,CACbF,QACAI,OAAQ,CAACJ,GACTlhB,OAAQghB,EAAIhhB,OACZuhB,MAAO,GACPC,QAAS,GACTrkB,KAAM6jB,EAAIS,iBCClB,IAAIC,GACG,MAIMC,GAAyD,CACpEC,QAAS,CACP,YAAY,GAADtrB,OAAK+L,IAChB,eAAgB,qBAIPwf,GAAsD,CACjED,QAAS,CACP,YAAY,GAADtrB,OAAK+L,MAIPyE,GAASA,CACpBgb,EACAC,KAEA,MAAMC,EAAcC,GAAcF,GAClC,OAAOG,GAAoBF,EAAW,GAAA1rB,OAAMwrB,EAAG,KAAAxrB,OAAI0rB,GAAgBF,EAAI,EAG5DK,GAAaA,CAAiBL,EAAaC,KACtD,MAAMC,EAAcC,GAAcF,GAClC,OAAOK,GAAcJ,EAAiB,GAAA1rB,OAAMwrB,EAAG,KAAAxrB,OAAI0rB,GAAhBF,EAA8B,EAGtDlB,GAAUA,CAAmBkB,EAAaO,IAC9CH,GAAoBJ,EAAK,CAC9BQ,OAAQ,OACRD,KAAMA,EAAO7d,KAAKC,UAAU4d,GAAQ,OAc3BE,GAASA,CAAmBT,EAAaO,IAC7CH,GAAoBJ,EAAK,CAC9BQ,OAAQ,MACRD,KAAMA,EAAO7d,KAAKC,UAAU4d,GAAQ,OAI3B3B,GAAwBoB,GAC5BI,GAAoBJ,EAAK,CAC9BQ,OAAQ,WAICE,GAAezB,MAC1Be,EACAW,KACwB,IAADC,EAAAC,EACvB,MAAMC,QAAcC,KACpB,OAAOC,MAAM,GAADxsB,OAAI2V,IAAU3V,OAAGwrB,GAAO,IAC/BW,EACHb,QAAS,IAC4B,QAAnCc,EAA0B,OAAtBb,SAAsB,IAAtBA,QAAsB,EAAtBA,GAAwBD,eAAO,IAAAc,IAAI,CAAC,KACvB,QAAjBC,EAAQ,OAAJF,QAAI,IAAJA,OAAI,EAAJA,EAAMb,eAAO,IAAAe,IAAI,CAAC,KAClBC,EAAQ,CAAEG,cAAc,UAADzsB,OAAYssB,IAAY,CAAC,KAGrD9Y,MAAMkX,GACDA,EAAIgC,GACCC,GAAQjC,GAEVF,GAAuBE,KAE/BK,OAAOH,GACCC,QAAQC,OAAO,6BAAD9qB,OAA8B4qB,KACnD,EAGOgB,GAAWnB,MACtBe,EACAW,KACwB,IAADS,EAAAC,EACvB,MAAMP,QAAcC,KACpB,OAAOC,MAAM,GAADxsB,OAAI2V,IAAU3V,OAAGwrB,GAAO,IAC/BW,EACHb,QAAS,IAC+B,QAAtCsB,EAA6B,OAAzBvB,SAAyB,IAAzBA,QAAyB,EAAzBA,GAA2BC,eAAO,IAAAsB,IAAI,CAAC,KAC1B,QAAjBC,EAAQ,OAAJV,QAAI,IAAJA,OAAI,EAAJA,EAAMb,eAAO,IAAAuB,IAAI,CAAC,KAClBP,EAAQ,CAAEG,cAAc,UAADzsB,OAAYssB,IAAY,CAAC,KAGrD9Y,MAAMkX,GACDA,EAAIgC,GACCC,GAAQjC,GAEVF,GAAuBE,KAE/BK,OAAOH,GACCC,QAAQC,OAAOF,IACtB,EAGOkB,GAAerB,MAC1Be,EACAW,KACmB,IAADW,EAAAC,EAClB,MAAMT,QAAcC,KACpB,OAAOC,MAAM,GAADxsB,OAAI2V,IAAU3V,OAAGwrB,GAAO,IAC/BW,EACHb,QAAS,CACP,eAAgB,4BACsB,QAAtCwB,EAA6B,OAAzBzB,SAAyB,IAAzBA,QAAyB,EAAzBA,GAA2BC,eAAO,IAAAwB,IAAI,CAAC,KAC1B,QAAjBC,EAAQ,OAAJZ,QAAI,IAAJA,OAAI,EAAJA,EAAMb,eAAO,IAAAyB,IAAI,CAAC,KAClBT,EAAQ,CAAEG,cAAc,UAADzsB,OAAYssB,IAAY,CAAC,KAGrD9Y,MAAMkX,GACDA,EAAIgC,GACChC,EAAIsC,OAENxC,GAAkBE,KAE1BK,OAAOH,GACCC,QAAQC,OAAO,6BAAD9qB,OAA8B4qB,KACnD,EAGA+B,GAAcjC,IAClB,MAAMuC,EAAiBC,GAAsBxC,GAU7C,OATwBA,EAAIjf,OAAO+H,MAAM2Z,GACnCC,GAAYD,GACP,IACFjf,KAAKmf,MAAMF,MACVF,GAAkB,CAAEA,mBAGrBpC,QAAQyC,QAAQH,KAEFpC,OAAM,IAAMF,QAAQC,OAAO,CAAC,IAAG,EAGlDsC,GAAe3hB,IACnB,GAAoB,kBAATA,EACT,OAAO,EAET,IAEE,MAAuB,kBADVyC,KAAKmf,MAAM5hB,EAE1B,CAAE,MAAOmf,GACP,OAAO,CACT,GAGW2B,GAAW9B,UACtB,IAAKW,GAAK,OACV,MAAMmC,EAAcnC,GAAIoC,iBAExB,OADApC,GAAIqC,iBAAiBF,EAAY1Z,OAAS,EAAI0Z,EAAY,GAAK,MAC3DA,EAAY1Z,OAAS,EAChB6Z,YAA6BtC,GAAKxV,GAAU,CACjDtO,UAAWuO,GACX8X,iBAAkB7X,GAClB8X,sBjD7K8B3tB,yCiDyKlC,CAMA,EAGIitB,GAAyBxC,IAAmB,IAADmD,EAC/C,MAAMC,EAA8B,QAAdD,EAAGnD,EAAIY,eAAO,IAAAuC,OAAA,EAAXA,EAAa5Y,IAAI,gBAC1C,OAAO6Y,EAAmB5f,KAAKmf,MAAMS,GAAoB,IAAI,EAGzDnC,GAAoBF,IACxB,IAAKA,EACH,OAAO,KAGT,MAAMsC,EAAe,IAAIC,gBACzB,IAAK,MAAO7Z,EAAKqJ,KAAUyQ,OAAOC,QAAQzC,GACxC,GAAIjc,MAAMoJ,QAAQ4E,GAChB,IAAK,MAAM2Q,KAAc3Q,EACvBuQ,EAAaK,OAAOja,EAAKga,QAG3BJ,EAAaK,OAAOja,EAAKqJ,GAG7B,OAAOhO,MAAM6e,KAAKN,EAAaO,QAAQza,OAASka,EAAaja,WAAa,IAAI,EC5MnEya,GAAiBA,CAACC,EAAuBC,IACpDD,EAAE3sB,MAAQ4sB,EAAE5sB,MAAQ,GAAK,ECAd6sB,GAAoBhe,GFoDxBwb,GEnDQ,wBFmDqB,CAClCF,OAAQ,OACRD,KErD2Erb,ICElEie,GAAqBA,KAChC,MAAMC,EAAcC,cACpB,OAAOC,aAAY3E,GAAiB,CAClC4E,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeK,iBAC1D0d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiB,2BAC1D8c,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAegC,uBAC1D+b,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAe+B,cAAe,GAE3E,ECTSsc,GAAqBA,KAKhC,MAAMN,EAAcC,cACpB,OAAOC,aAAYzE,GAAiB,CAClC0E,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeK,iBAC1D0d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAegC,uBAC1D+b,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiB,0BAA2B,GAEvF,ECZSqd,GACXze,GAEA6C,aACE,CAAC1C,GAAekB,YAAarB,IAC7B,ICNFA,IAEc,OAAPA,QAAO,IAAPA,KAAS0e,qBACZ5e,GAA4D,WAAYE,GACxEma,QAAQC,SDEJuE,CAAe3e,IACrByC,IEDSmc,GACXxhB,IAEA,IAAI4C,EAAU6e,YAAe5T,IAC7B,MAAM6T,EAAgBC,YAAkBpU,IAIxC,OAFIvN,IAAkB4C,EAAU,IAAKA,EAAS5C,qBAEvCyF,aACL,CAAC1C,GAAegC,oBAAqBnC,IACrC,ICjBFA,IAEAF,GAAgE,mBAAoBE,GDe5EmC,CAAoBnC,IAC1B,IACKyC,GACH4b,UAAY5B,IAAuC,IAADuC,GACxC,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAAuC,KAA9B,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMyC,WAAWC,MAAMhc,SACjE2b,EAAc,EAChB,GAGL,EE1BUM,GAAiBA,IAC5Bvc,aAAS,CAAC1C,GAAesB,gBAAiBA,GAAgBgB,ICF/C4c,GAAWrf,GACtB4Z,GAAO,iBAAAtqB,OACY0Q,EAAQ/O,eAAc,UACvC+O,GCFSsf,GAAmBtf,GAC9B4Z,GAA6C,gCAAiC5Z,GCFnEuf,GACXvf,GAEA4Z,GAAO,iBAAAtqB,OACY0Q,EAAQ/O,eAAc,qBACvC+O,GCHSwf,GAAmBhqB,GAC9BqN,aAAS,CAAC1C,GAAeE,gBAAiB7K,IAAK,ICHjBA,IAC9BsK,GAAM,iBAAAxQ,OAAgCkG,IDEe6K,CAAgB7K,IAAKiN,IEK/Dgd,GAAmBA,KAC9B,MAAMzf,EAAU6e,YAAe7M,IACzB8M,EAAgBC,YAAkBlN,IACxC,OAAOhP,aACL,CAAC1C,GAAeG,iBAAkBN,IAClC,ICZFA,IAEAF,GAA0D,gBAAiBE,GDUnEM,CAAiBN,IACvB,IACKyC,GACH4b,UAAY5B,IAAoC,IAADuC,GACrC,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAA0C,KAAjC,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMiD,cAAcP,MAAMhc,SACpE2b,EAAc,EAChB,GAGL,EErBUa,GAAiBA,IACrB9c,aAAS,CAAC1C,GAAemC,iBAAiB,ICDjDxC,GAA+B,gBDC0C,IACpE2C,GACH4b,UAAY5B,GACC,OAAJA,QAAI,IAAJA,OAAI,EAAJA,EAAMmD,YAEfC,QAAU3F,IACR,GAAIA,EACF,MAAO,EACT,IEVOjZ,GAA8BA,IACzCnB,GAA4C,4BCKjCggB,GAAuBA,IAClCjd,aAAS,CAAC1C,GAAeU,sBAAuBA,GAAsB4B,ICD3Dsd,GAAsBA,IACjCld,aAAS,CAAC1C,GAAeW,qBAAsBA,GAAqB2B,ICLzDud,GAA6BA,IACxCnd,aACE,CAAC1C,GAAeY,4BAChBA,GACA0B,ICNS5B,GAAuBA,IAClCf,GAAqC,eCD1BgB,GAAsBA,IACjChB,GAAoC,0BCDzBkB,GACXhB,GAEAF,GAA4D,uBAAwBE,GCHzEe,GAA6BA,IACxCjB,GAA+B,qBCCpBmgB,GACXA,IACSpd,aACL,CAAC1C,GAAeqB,4BAChB,IAAMA,MACN,IACKiB,KCAEyd,GAAyBA,KACpC,MAAMlgB,EAAU6e,YAAejT,IACzBkT,EAAgBC,YAAkBxT,IAClC4U,EAAmCpB,YACvCvT,IAGF,OAAO3I,aACL,CAAC1C,GAAeoB,uBAAwBvB,IACxC,IAAMuB,GAAuBvB,IAC7B,IACKyC,GACH4b,UAAY5B,IAA0C,IAADuC,GAE7C,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GACQ,KAAvC,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAM2D,oBAAoBjB,MAAMhc,SAEhC2b,EAAc,GAEhBqB,EAAiC1D,EAAKF,eAAe,GAG1D,EC9BU/a,GAA4BA,IACvC1B,GAA0C,0BCA/BwB,GACXtB,GAEAF,GAAM,6BAAAxQ,OACyB0Q,EAAQxK,IACrCwK,GCLSuB,GACXvB,GAEAF,GACE,4BACAE,GCNSqgB,GACXrgB,GAEAA,EAAQ0e,qBACJnD,GAAM,6BAAAjsB,OACyB0Q,EAAQ0e,sBACrC1e,GAEF4Z,GACE,4BACA5Z,GCDKsgB,GAAgBA,CAC3BC,EACAC,KAEA,MAAMxgB,EAAU6e,YAAehQ,IACzBiQ,EAAgBC,YAAkBvQ,IAClCiS,EAAgB1B,YAAkBtQ,IAClCiS,EAAsB3B,YAAkBrQ,IAC9C,OAAO7L,aAAS,CAAC0d,EAAavgB,IAAU,IAAMwgB,EAAaxgB,IAAU,IAChEyC,GACH4b,UAAY5B,IAA0B,IAADuC,GAC3B,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAAyC,KAAhC,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMkE,aAAaxB,MAAMhc,SACnE2b,EAAc,GAEhB2B,EAAchE,EAAKkE,aAAaxB,OAChCuB,EAAoBjE,EAAKF,eAAe,GAE1C,ECtBSqE,GACXJ,IAEA,MAAM1R,EAAS+P,YAAe7Q,IAExB6S,EAAkB,IADRhC,YAAehQ,IACOxE,WAAY,EAAGC,SAAU,KAEzDwW,EAAmBtwB,IAEzB,OAAO4tB,cAAY,IAAMoC,EAAaK,IAAkB,CACtDxC,UAAY5B,IACV,MAAMsE,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAOC,IAAIC,gBAAgB3E,GAChCsE,EAAKM,SAAQ,GAAA/xB,OAAY,OAANwf,QAAM,IAANA,OAAM,EAANA,EAAQwS,OAAM,OAAAhyB,OAAMwxB,EACrC,IAAIxrB,KACJnF,EAAoBI,gBACrB,QACDwwB,EAAKQ,OAAO,GAEd,ECtBSC,GAAgCA,IAC3CZ,GAAiBa,ICDNC,GAA4BA,IACvCd,GAAiBe,ICDNC,GAAmCA,IAC9ChB,GAAiBiB,ICDNC,GAA8BA,IACzClB,GAAiBmB,ICDNC,GAAkCA,IAC7CpB,GAAiBqB,ICFNvhB,GAAsBgE,GACjC5E,GAAM,qBAAAxQ,OAAyCoV,ICDpCwd,GACXxd,GAEA5E,GAAM,qBAAAxQ,OACiBoV,EAAU,0BCJtB9D,GAAsBA,IACjCd,GAA2B,qBCDhBoB,GACXlB,GAEAF,GAAyC,4BAA6BE,GCJ3DyhB,GAAiCzhB,GAC5Cmb,GAAW,gCAAiCnb,GCAjC8B,GAA0B9B,GACrCF,GAAyC,wBAAyBE,GCFvD2hB,GAA6B3hB,GACxCmb,GAAW,4BAA6Bnb,GCA7BgC,GAA4BhC,GACvCF,GAAyC,0BAA2BE,GCFzD+hB,GAA+B/hB,GAC1Cmb,GAAW,8BAA+Bnb,GCA/B+B,GACX/B,GAEAF,GAAyC,+BAAgCE,GCJ9D6hB,GAAoC7hB,GAC/Cmb,GAAW,mCAAoCnb,GCApCiC,GACXjC,GAEAF,GAAyC,uBAAwBE,GCJtDiiB,GAAmCjiB,GAC9Cmb,GAAW,2BAA4Bnb,GCA5B6B,GACX7B,GAEAF,GAA+C,gBAAiBE,GCFrDmiB,GAAyBniB,GACpCub,GAAM,qBAAAjsB,OACiB0Q,EAAQ0E,YAC7B1E,GCASoiB,GAA2BA,KAKtC,MAAMlE,EAAcC,cACpB,OAAOC,aAAY+D,GAAuB,CACxC9D,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeO,sBAC1Dwd,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeS,sBAAuB,EAEnFif,QAASA,KACP3B,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeO,qBAAsB,GAElF,ECZS2hB,GACXA,IACExf,aACE,CAAC1C,GAAeuB,2BAChBA,GACAe,ICXOf,GAA4BA,IACvC5B,GAA0C,0BCD/BwiB,GACXtiB,GAEAF,GAAM,iBAAAxQ,OACa0Q,EAAQ/O,eAAc,cAAA3B,OAAa0Q,EAAQlD,WAAU,cAAAxN,OAAa0Q,EAAQC,aCJlF0B,GAAmBA,IAC9B7B,GAAiC,iBCDtByiB,GACXviB,GAEO4Z,GAAO,iBAAAtqB,OACK0Q,EAAQ/O,eAAc,oBACvC+O,GCLSwiB,GAAgBxiB,GACpB4Z,GAAO,iBAAAtqB,OACK0Q,EAAQ/O,eAAc,YACvC+O,GCFSyiB,GACXxxB,GAEA4R,aACE,CAAC1C,GAAeyB,aAAc3Q,IAC9B,ICNyBA,IAC3B6O,GAAM,iBAAAxQ,OAAwC2B,EAAc,eDKpD2Q,CAAa3Q,IACnBwR,IEDSigB,GAAmBA,IAC9B7f,aAAS,CAAC1C,GAAewB,kBAAmBA,GAAkBc,ICJnDkgB,GAAoBA,KAK/B,MAAMzE,EAAcC,cACpB,OAAOC,aAAYmE,GAAgB,CACjClE,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeE,mBAC1D6d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeG,oBAC1D4d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeD,kBAC1Dge,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeyB,eAAgB,GAE5E,ECVSghB,GACXljB,IAEA,MAAM,aAAEyY,EAAY,gBAAEL,EAAe,iBAAEa,EAAgB,gBAAEC,GACvDR,GAAuB1Y,GACnBmjB,EAAqB9D,YAAkBjH,GACvCgL,EAAU/D,YAAkBpG,GAC5BoK,EAAgBhE,YAAkBnG,GAElC5Y,EAAU,IADG6e,YAAe1G,GACDzY,aACjC,OAAOmD,aACL,CAAC1C,GAAeC,iBAAkBJ,IAClC,ICjBFA,IAEAF,GAA0D,eAAgBE,GDelEI,CAAiBJ,IACvB,CACE0C,UAAW,IACX2b,UAAY5B,IAAoC,IAADuC,EAAAgE,EAAAC,GACrC,OAAJxG,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAA0C,KAAjC,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMyG,cAAc/D,MAAMhc,SACpE0f,EAAmB,GAErBC,EAAkC,QAA3BE,EAAK,OAAJvG,QAAI,IAAJA,GAAmB,QAAfwG,EAAJxG,EAAMyG,qBAAa,IAAAD,OAAf,EAAJA,EAAqB9D,aAAK,IAAA6D,IAAI,IACtCD,EAAkB,OAAJtG,QAAI,IAAJA,OAAI,EAAJA,EAAMF,eAAe,GAGxC,EEtBU4G,GACXnyB,IAEA,MAAM,aAAEmnB,EAAY,gBAAEL,GAAoBF,KACpCiL,EAAqB9D,YAAkBjH,GAEvC9X,EAAU,IADG6e,YAAe1G,IAGlC,OAAOtV,aACL,CAAC1C,GAAekC,yBAA0BrC,IAC1C,ICbFA,IAEAF,GACE,8BACAE,GDSMqC,CAAyBrC,IAC/B,IACKyC,MACAzR,EACHqtB,UAAY5B,IAA4C,IAADuC,GAE/C,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GACU,KAAzC,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAM2G,sBAAsBjE,MAAMhc,SAElC0f,EAAmB,EACrB,EAEFhD,QAAUwD,IAAY,CACpBA,SAGL,EElCUC,GAAWtjB,GACtB4Z,GAAyC,cAAe5Z,GCD7CujB,GAAcvjB,GACzBub,GAAM,eAAAjsB,OAAuD0Q,EAAQxK,IAAMwK,GCGhEwjB,GAAcA,CACzBrL,EACAL,EACA2L,EACAzyB,KAEA,IAAIgP,EAAU6e,YAAe1G,GAC7B,MAAM2G,EAAgBC,YAAkBjH,GAMxC,OAJI2L,IACFzjB,EAAU,CAAEyjB,oBAAmBzjB,IAG1B6C,aACL,CAAC1C,GAAeiC,SAAUpC,IAC1B,ICnBqBA,IAChBF,GAA0C,cAAeE,GDkBxDoC,CAASpC,IACf,IACKyC,MACAzR,EACHqtB,UAAY5B,IAA4B,IAADuC,GAC7B,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAAkC,KAAzB,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMnD,MAAM6F,MAAMhc,SAC5D2b,EAAc,EAChB,EAEFe,QAASA,QAEZ,EEAG6D,GAA2CC,IAC/C,MAAM,OAAE3qB,EAAM,YAAEnD,GAAgB8tB,GAC1B,IAAEryB,EAAG,KAAEsyB,GAASryB,eAEtB,OACEe,eAACuxB,IAAK,CACJ7qB,OAAQA,EACR1F,GAAI,CACF,sCAAuC,CACrCwwB,EAAGxyB,EAAI,CAAEM,GAAI,YAEfmyB,GAAIzyB,EAAI,CAAEM,GAAI,aACVgyB,EAAO,CAAE3xB,OAAQ,QAAW,CAAC,GACjCO,SAAA,CAEFC,cAACuxB,IAAS,CAACzvB,EAAE,UAAU0vB,EAAE,UAAU5uB,GAAG,WACtC5C,cAACyxB,IAAgB,CAACnwB,WAAW,UAAUpB,SAAUrB,EAAI,CAAEM,GAAI,aAAcY,SACtEqD,MAEG,EAICsuB,GAAoBA,KAAO,IAADC,EAAAC,EACrC,MAEM,EAAEz0B,GAAMC,YAAe,UACvB,IAAEyB,GAAQC,eAEViK,EAAcqjB,YAAe5R,KAC7B,GAAEzX,GAAO8uB,eACPC,OAAQlF,GCzDQmF,MACxB,MAAMtG,EAAcC,cACpB,OAAOC,aAAYiB,GAAS,CAC1BhB,UAAWA,IACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeE,oBAC5D,EDoD0BmkB,IAErBC,EAAaC,GAAkBC,YAAe9R,KAC9C+R,EAAYC,GAAiBvM,mBAAS,IACtC5d,EAAUoqB,GAAexM,mBAAS,KAClCyM,EAAcC,GAAmB1M,oBAAS,GAE3C2M,EAAeA,KACnBP,GAAe,GACfG,EAAc,GACdC,EAAY,IACZE,GAAgB,GAChBE,YAAW,IAAMF,GAAgB,IAAQ,IAAK,EAehD,OACE1yB,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGuyB,GAAgBtyB,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,gBAAiB,gBACpD60B,GACChyB,cAAC4yB,IAAY,CAAA7yB,SACXF,eAACgzB,IAAI,CAAC9vB,GAAG,gBAAgB+vB,cAjBZC,KACnBnG,EACE,CACEpuB,iBAAoB,OAAFuE,QAAE,IAAFA,IAAM,GACxBgG,cACAopB,YAAaA,EACblqB,YAEF,CAAE2jB,UAAW4G,GACd,EAQ0DzyB,SAAA,CACnDC,cAACoC,IAAG,CACFvB,GAAI,CACF,OAAQ,CACNmyB,GAAIn0B,EAAI,CAAEM,GAAI,cAEhBY,SAEFF,eAACozB,IAAmB,CAClBlwB,GAAG,aACHsX,MAAO8X,EACPe,SAAW7Y,GAAkB+X,GAAe/X,GAC5C,aAAYld,EAAE,kBAAmB,kCACjCuB,MAAOvB,EAAE,kBAAmB,kCAC5Bg2B,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,2BAA4B,+BAEzC4C,SAAA,CAEFF,eAACyzB,IAAI,CAACtyB,GAAG,UAAUgyB,GAAG,UAAUO,IAAI,OAAMxzB,SAAA,CACxCC,cAACwzB,KAAK,CACJzwB,GAAG,WACH,cAAY,aACZsX,MAAuC,QAAlCsX,EAAEx0B,EAAE,cAAe,KAAKwT,kBAAU,IAAAghB,IAAI,IAAI5xB,SAE9C5C,EAAE,qBAAsB,cAE3B6C,cAACwzB,KAAK,CACJ,cAAY,aACZzwB,GAAG,WACHsX,MAAuC,QAAlCuX,EAAEz0B,EAAE,cAAe,KAAKwT,kBAAU,IAAAihB,IAAI,IAAI7xB,SAE9C5C,EAAE,qBAAsB,kBAUZ,IAAfg1B,GAAmC,IAAfA,IACpBnyB,cAACixB,GAAW,CACV1qB,OAAO,OACPnD,YAAajG,EACX,oBACA,yDAIW,IAAfg1B,GAAmC,IAAfA,IACpBnyB,cAACixB,GAAW,CACV1qB,OAAO,UACPnD,YAAajG,EACX,oBACA,8DAMV6C,cAACoC,IAAG,CACFvB,GAAI,CACF,uBAAwB,CACtBmyB,GAAIn0B,EAAI,CAAEM,GAAI,KAGhB,oCAAqC,CACnCe,SAAUrB,EAAI,CAAEM,GAAI,aACpB6B,GAAInC,EAAI,CAAEM,GAAI,cACd6zB,GAAIn0B,EAAI,CAAEM,GAAI,cAGlB4D,GAAG,oBAAmBhD,SAEtBC,cAACyzB,IAAiB,CAChB,cAAY,eACZ1wB,GAAG,WACH2wB,YAAav2B,EAAE,wBAAyB,wBACxCuB,MAAOvB,EAAE,kBAAmB,aAC5Bw2B,UA1HY,IA2HZT,SAAW3wB,IACT8vB,EAAY9vB,EAAMqxB,OAAOvZ,MAAM,EAEjC8Y,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,2BAA4B,gCAK/C0C,eAACg0B,KAAI,CAACpzB,KAAK,KAAKO,IAAK,EAAEjB,SAAA,CACZ,OAARkI,QAAQ,IAARA,OAAQ,EAARA,EAAUyI,OAAO,OAvIJ,IAuI2B,iBAE3C7Q,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAGjB,GAAInC,EAAI,CAAEM,GAAI,WAAa,QAAQY,SAAA,CACzEC,cAACJ,IAAM,CACLY,QAAS3B,EAAI,CAAEM,GAAI,aAAe,YAClCsB,KAAK,KACLc,QAASixB,EAAazyB,SAErB5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAACY,QAAQ,UAAUkD,KAAK,SAASjD,KAAK,KAAIV,SAC9C5C,EAAE,qBAAsB,eAI7B6C,cAAC+zB,IAAO,CAACC,GAAIn1B,EAAI,CAAEM,GAAI,WAAa,YAIzC,EEhMM80B,GAAiBA,KAC5B,MAAM,EAAE92B,GAAMC,YAAe,gBACvB82B,EAASC,eAETC,EAA0BhI,YAAepO,KACxCqW,EAAyBC,GAA8BpC,YAC5DjU,IAGIsW,EAA+BC,YAAoBxW,IACnDyW,EAA+BD,YAAoBvW,KAElDyW,EAA4BC,GAAiC9O,mBAAmB,IAEjF+O,IAAqBR,EAAwB1jB,OAqCnD,MAAO,CACLmkB,kBArCwBR,EAAwB3jB,OAsChDkkB,mBACAE,0BArCiCt2B,GACjCk2B,EAA2BK,SAASv2B,GAqCpCw2B,qBAnC2BA,IAAMV,EAA2BF,GAoC5Da,yBAlCgCz2B,GAChC81B,EAA2B,CAAC91B,IAkC5B02B,YAhCmB/sB,IACfA,IACFwsB,EAA8B,IAAIN,IAClCH,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAM,GAADjrB,OACgC,IAAnCw3B,EAAwB3jB,OACpBvT,EAAE,wBAAyB,yCAC3BA,EAAE,yBAA0B,0CAAyC,KAAAN,OACvEsL,GACJgtB,SAAUx4B,EACVy4B,gBAAiBA,IAAMT,EAA8B,OAGzDJ,IACAE,GAA8B,EAkB9BpN,YAfkBA,IAClB6M,EAAO,CACLnxB,GAAI,iCACJ+kB,MAAO3qB,EAAE,6BAA8B,kCACvCg4B,SAAUx4B,EACV4J,OAAQ,UAWX,ECxDU8uB,GAAkBA,KAC7B,MAAQvD,OAAQwD,GCZb3J,aAAYre,KDaPwkB,OAAQyD,GEbb5J,aAAYkE,IFkET2F,EAAoBC,IACpBA,GACFzhB,OAAO0hB,KAAKD,EAAM,SACpB,EAGIE,EAA4BA,CAACn3B,EAAwBi3B,KACzD,GAAIA,EAAM,CACR,MAAMpN,EAAMoN,EAAKG,MAAM,KAAK,GACtBC,EAAcJ,EAAKG,MAAM,KAAK,GACpC,IAAKC,IAAgD,IAAjCA,EAAYC,QAAQ,QACtC,OAEF,MAAMC,EAAyBF,EAC5BD,MAAM,QAAQ,GACd/4B,OAAO,QACPA,OAAOsX,mBAAmB0hB,EAAYD,MAAM,QAAQ,GAAGI,UAAU,KACpEhiB,OAAO0hB,KAAK,GAAD74B,OACNmX,OAAOC,SAASC,OAAM,kBAAArX,OAAiB2B,EAAc,aAAA3B,OAAYsX,mBAClEkU,EAAIxrB,OAAO,KAAKA,OAAOk5B,KAEzB,SAEJ,GAGIE,EAAeA,CAACR,EAAcS,KAClC7M,MAAMoM,GACHplB,MAAM7G,GAAaA,EAASqgB,SAC5BxZ,MAAMwZ,IACL,MAAMyE,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAOC,IAAIC,gBAAgB9E,GAChCyE,EAAKM,SAAWsH,EAChB5H,EAAKQ,OAAO,GACZ,EAGN,MAAO,CACLqH,qBAzF4B13B,IACvBA,GAIL82B,EAA4B92B,EAAiB,CAC3CmtB,UAAYpiB,GAAagsB,EAAiBhsB,EAAS4sB,cACnD,EAmFFC,wBA/EA53B,IAEKA,GAIL62B,EAA+B72B,EAAiB,CAC9CmtB,UAAYpiB,GAAagsB,EAAiBhsB,EAAS4sB,cACnD,EAwEFE,4BApEA73B,IAEKA,GAIL62B,EAA+B72B,EAAiB,CAC9CmtB,UAAYpiB,IAAQ,IAAA+sB,EAAA,OAClBN,EACEzsB,EAAS4sB,YACgB,QADLG,EACL,OAAf93B,QAAe,IAAfA,OAAe,EAAfA,EAAiB+3B,gBAAQ,IAAAD,IAAA,GAAA15B,OAAO4B,EAAgBg4B,2BAA0B,QAC3E,GACH,EAyDFC,kBAtDwBA,CACxBl4B,EACAC,KAEKD,GAAmBC,GAIxB62B,EAA+B72B,EAAiB,CAC9CmtB,UAAYpiB,GAAamsB,EAA0Bn3B,EAAgBgL,EAAS4sB,cAC5E,EA6CH,EGvFUO,GAAcA,KACzB,MAAMC,EAAWC,cAEXC,EAAez5B,uBAAY,IAAMu5B,GAAU,IAAI,CAACA,IAChDG,EAAiB15B,uBAAY,IAAMu5B,EAAS,MAAM,CAACA,IACnDI,EAAyB35B,uBAAY,IAAMu5B,EAAS55B,IAAsB,CAAC45B,IAC3EK,EAAyB55B,uBAAY,IAAMu5B,EAAS55B,IAAsB,CAAC45B,IAC3EM,EAAsB75B,uBAAY,IAAMu5B,EAAS55B,IAAgB,CAAC45B,IAClEO,EAAoB95B,uBAAY,IAAMu5B,EAAS55B,IAAiB,CAAC45B,IACjEQ,EAAuB/5B,uBAAY,IAAMu5B,EAAS55B,IAAoB,CAAC45B,IACvES,EAA2Bh6B,uBAAY,IAAMu5B,EAAS55B,IAAiB,CAAC45B,IACxEU,EAA6Bj6B,uBACjC,IAAMu5B,EAAS55B,IACf,CAAC45B,IAEGW,EAA+Bl6B,uBACnC,IAAMu5B,EAAS55B,IACf,CAAC45B,IAEGY,EAA4Bn6B,uBAChC,IAAMu5B,EAAS55B,IACf,CAAC45B,IAqDH,MAAO,CACLE,eACAC,iBACAC,yBACAS,oBApB2BhQ,KAEzBA,GACCA,EAAMlhB,SAAWuD,GAAe4tB,WAC/BjQ,EAAMlhB,SAAWuD,GAAe6tB,aAElCX,KAGCvP,GAASA,EAAMlhB,SAAWuD,GAAe8tB,WAC1CnQ,EAAMlhB,SAAWuD,GAAe+tB,eAEhCZ,GACF,EAQAC,sBACAC,oBACAW,iBAzDwBC,GAAuBnB,EAAS,WAAD/5B,OAAYk7B,IA0DnEC,kBAxDyBx5B,GACzBo4B,EAAS,iBAAD/5B,OAAkB2B,IAwD1By5B,mBAtD0Bz5B,GAC1Bo4B,EAAS,iBAAD/5B,OAAkB2B,EAAc,cAsDxC05B,2BApDiCA,CAAC15B,EAAwB6L,IAC1DusB,EAAS,iBAAD/5B,OAAkB2B,EAAc,cAAA3B,OAAawN,IAoDrD8tB,kBAlDyB35B,GACzBo4B,EAAS,iBAAD/5B,OAAkB2B,EAAc,aAkDxC44B,uBACAI,4BACAY,yBAlD+BA,KAC/BpkB,OAAOC,SAASwa,KAAO/a,GAAW,cAAc,EAkDhD2kB,4BA/CkCA,KAClCrkB,OAAOC,SAASwa,KAAO/a,GAAW,gBAAgB,EA+ClD2jB,2BACAC,6BACAgB,uBA9C8BtH,IAC9B4F,EAAS,kBAAD/5B,OAAmBm0B,GAAiB,EA8C5CuH,eA3CsBvH,IACtB4F,EAAS,kBAAD/5B,OAAmBm0B,EAAc,UAAS,EA2ClDwH,oBAxC2BxH,IAC3B4F,EAAS,kBAAD/5B,OAAmBm0B,EAAc,UAAS,EAwClDuG,+BACD,EC5GUkB,GAAiBhD,IAC5B,MAMMiD,EACJ,kEAcIl6B,EALoBm6B,MACxB,MAAMC,EAAUvsB,MAAM6e,KAAKuK,EAAKoD,SAASH,IAA4BI,GAAMA,EAAE,KAC7E,OAA0B,IAAnBF,EAAQloB,QAAgBkoB,EAAQ,QAAKpsB,CAAS,EAGhCmsB,GACjBI,IAAetD,EAAK3gB,MAtBJ,UAuBhBkkB,IAAiBvD,EAAK3gB,MApBJ,iBAqBlBmkB,IAAkBxD,EAAK3gB,MAvBJ,iBAwBnBokB,IAAiBzD,EAAK3gB,MAvBJ,wBAwBlBqkB,IAAkB1D,EAAK3gB,MAtBJ,kCAuBnBskB,IAAsB3D,EAAK3gB,MAtBR,sCAuBnBukB,IAAmB5D,EAAK3gB,MApBJ,uCAqBpBwkB,IAA2B7D,EAAK3gB,MApBJ,8CAqB5BykB,IAAqB9D,EAAK3gB,MApBJ,oBAqBtB0kB,IAAkB/D,EAAK3gB,MApBJ,iBAqBnB2kB,IAA6BhE,EAAK3gB,MApBJ,6BAqB9B4kB,IAA6BjE,EAAK3gB,MApBV,gDAuC9B,MAAO,CACLtW,iBACAu6B,aACAC,eACAC,gBACAC,eACAC,gBACAC,oBACAC,iBACAC,yBACAK,mBA1BAX,GACAG,GACAC,GACAC,GACAC,EAuBAM,iBArBAT,GACAF,GACAG,GACAC,GACAC,GACAJ,GACAK,GACAE,GACAC,EAcAH,mBACAC,gBACAC,2BACAC,2BACAG,cAlCoBpE,EAAK3gB,MApBJ,cAuDtB,ECrFUglB,GAAsBA,IACjCxoB,aAA8BhT,IAAA,IAAC,MAAEiT,GAAOjT,EAAA,MAAK,KAC3CwsB,OAAO5U,OAAOgI,IAAmBxB,SAAS3L,GAASQ,EAAMR,KACzD+Z,OAAO5U,OAAOyI,IAAajC,SAAS3L,GAASQ,EAAMR,KACnD+Z,OAAO5U,OAAOoJ,IAAa5C,SAAS3L,GAASQ,EAAMR,KACnDQ,EAAMqN,GAAgB,CACvB,ICRUmb,GACX5kB,KAIIA,KACA,CAAC,YAAa,SAAU,cAAc4f,SAAS5f,EAAa5O,SAC5D4O,EAAalO,iBCRb+yB,GAAoB,CAAC,aAAc,YAAa,UACzCC,GAAiB9kB,IAC5B,GAC0B,qBAAjBA,GACU,OAAjBA,GACA2V,OAAOK,KAAKhW,GAAczE,OAAS,EACnC,CACA,MAAM,OAAEnK,EAAM,WAAEW,GAAeiO,GAAgB,CAAC,EAEhD,QAASjO,GAAcX,GAAUyzB,GAAkBjF,SAAS5f,EAAa5O,QAC3E,CACA,OAAO,CAAK,ECGD2zB,GAA8C57B,IAGpD,IAHqD,aAC1D6W,KACGglB,GACJ77B,EACC,MAAM,EAAEnB,GAAMC,YAAe,SACvBg9B,EAAaH,GAAc9kB,GAG3BpW,EAAWC,eACX,IAAEH,GAAQC,cAEVmzB,EAAiB3F,YAAkBlM,IAIzC,OAAOga,EACLp6B,cAACJ,IAAM,CACLa,KAAM1B,EAAW,KAAO,KACxBoB,SAAS,OACTG,UAAWN,cAACq6B,IAAY,IACxBn5B,MAAO,CAAEo5B,KAAM,OAAQC,GAAI17B,EAAI,CAAEM,GAAI,aAAe,UACpDqB,QAAQ,YACRe,QATkBi5B,IAAMvI,GAAe,MAUnCkI,EAAWp6B,SAEd5C,EAAE,WAAY,cAEf,IAAI,ECbGs9B,GAAkDn8B,IAGxD,IAHyD,WAC9Do8B,GAAa,EAAI,WACjBC,GAAa,GACdr8B,EACC,MAAMS,EAAWC,eACX,GAAE+D,GAAO8uB,eACP7H,KAAM7U,GAAiB4X,KAAoB,OAAFhqB,QAAE,IAAFA,IAAM,KACjD,EAAE5F,GAAMC,YAAe,qBACvB,IAAEyB,GAAQC,eACViK,EAAcqjB,YAAe5R,IAI7B6T,EAAmBtwB,IAqBnB68B,GAAgC,OAAZzlB,QAAY,IAAZA,OAAY,EAAZA,EAAcjO,cAA0B,OAAZiO,QAAY,IAAZA,OAAY,EAAZA,EAAcvN,mBAC9DizB,EAAcD,EAChB,CACEh9B,KAAkB,OAAZuX,QAAY,IAAZA,OAAY,EAAZA,EAAcvN,kBACpBmB,YAAyB,OAAZoM,QAAY,IAAZA,OAAY,EAAZA,EAActN,yBAC3BM,cAA2B,OAAZgN,QAAY,IAAZA,OAAY,EAAZA,EAAcrN,iBAE/B,CACElK,KAAkB,OAAZuX,QAAY,IAAZA,OAAY,EAAZA,EAAc/N,gBACpB2B,YAAyB,OAAZoM,QAAY,IAAZA,OAAY,EAAZA,EAAc9N,uBAC3Bc,cAA2B,OAAZgN,QAAY,IAAZA,OAAY,EAAZA,EAAc7N,eAG7BwzB,EAAkBzM,EAAiBwM,EAAYj9B,KAAMF,EAAoBG,aAEzEk9B,EACJF,EAAY9xB,cAAgBA,EAAW,GAAAlM,OAChCg+B,EAAY1yB,cAAa,MAAAtL,OAAKM,EAAE,WAAY,OAAM,KACrD09B,EAAY1yB,cAEZ6yB,EACJn7B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACi7B,IAAM,CAACr4B,GAAG,MAAK7C,SACdC,cAACoC,IAAG,CAAArC,SAAE+6B,MAEPD,EAAY1yB,eACXtI,eAACo7B,IAAM,CAAAl7B,SAAA,CACLF,eAACq7B,IAAS,CACRC,QAAQ,SACRnI,GAAI,EACJoI,cAAe,CAAEd,KAAM,aAAcC,GAAI,SACzCx3B,GAAG,SAAQhD,SAAA,CAEV5C,EAAE,KAAM,MAAM,OAEjB6C,cAACoC,IAAG,CAAArC,SAAEg7B,UAMRM,EACJx7B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACG+6B,EACAD,EAAY1yB,eACXtI,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAACk5B,WAAW,OAAOC,GAAI,EAAGz6B,GAAG,OAAMf,SACpC5C,EAAE,KAAM,MAAMq+B,gBAEhBT,QAMHU,EAA2B58B,EAAI,CACnCM,GAAI,CAAEm7B,KAAM,MAAOC,GAAI,YACvBl6B,GAAI,CAAEi6B,KAAM,MAAOC,GAAI,eAGzB,OACEv6B,cAAC07B,IAAI,CAAC16B,GAAI05B,EAAa,EAAI,EAAGiB,UAAU,OAAO,cAAY,mBAAkB57B,SAC3EF,eAAC+7B,IAAW,CAAA77B,SAAA,CACVF,eAACyzB,IAAI,CACHuI,gBAAiB,CAAEvB,KAAM,MAAOC,GAAI,WACpCuB,aAAa,UACbhI,aAAc,CAAEwG,KAAM,QAASC,GAAI,UACnCwB,WAAW,OACXC,IAAI,WACJ3K,EAAGxyB,EAAI,CAAEM,GAAI,IAAKkB,GAAI,MACtBQ,GAAI,CACFo7B,IAAK,CACHC,EAAGr9B,EAAI,CAAEM,GAAI,SACb8C,QAASpD,EAAI,CAAEM,GAAI,aAErBY,SAAA,CAEFC,cAACm8B,GAA2B,CAC1B15B,SAAS,WACTC,MAAM,IACN05B,IAAI,IACJjnB,aAAcA,EACdknB,kBAAiB,GAAAx/B,OAAKM,EAAE,sBAAuB,uBAAsB,MAAAN,OACvD,OAAZsY,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,UAGlB1G,eAACyzB,IAAI,CAACuI,gBAAiBJ,EAAyB17B,SAAA,CAC9CF,eAACq7B,IAAS,CAACn4B,GAAG,gBAAgBH,GAAI/D,EAAI,CAAEM,GAAI,MAAQ6zB,GAAI,EAAEjzB,SAAA,CACvD5C,EAAE,gBAAiB,YAAY,OAElC6C,cAAA,QAAAD,SAAmB,OAAZoV,QAAY,IAAZA,OAAY,EAAZA,EAAcxO,cAGvB9G,eAACyzB,IAAI,CAACuI,gBAAiBJ,EAAyB17B,SAAA,CAC9CF,eAACq7B,IAAS,CAACn4B,GAAG,iBAAiBH,GAAI/D,EAAI,CAAEM,GAAI,MAAQ6zB,GAAI,EAAEjzB,SAAA,CACxD66B,EACGz9B,EAAE,YAAa,aACfA,EAAE,eAAgB,gBAAgB,OAGxC6C,cAACoC,IAAG,CAAC+4B,QAAQ,cAAcmB,SAAS,OAAMv8B,SACvChB,EAAWi8B,EAAoBK,OAIpCx7B,eAACyzB,IAAI,CAAC1wB,GAAI,CAAE03B,KAAM,EAAGC,GAAI,SAAWsB,gBAAiBJ,EAAyB17B,SAAA,CAC5EF,eAACq7B,IAAS,CAACn4B,GAAG,gBAAgBiwB,GAAI,EAAGpwB,GAAI/D,EAAI,CAAEM,GAAI,MAAOY,SAAA,CACvD5C,EAAE,iBAAkB,aAAa,OAEpC6C,cAAA,QAAAD,SAAOsuB,EAA6B,OAAZlZ,QAAY,IAAZA,OAAY,EAAZA,EAAcrO,oBAGxCjH,eAACyzB,IAAI,CAACuI,gBAAiBJ,EAAyB17B,SAAA,CAC9CF,eAACq7B,IAAS,CAACn4B,GAAG,eAAeiwB,GAAI,EAAGpwB,GAAI/D,EAAI,CAAEM,GAAI,MAAOY,SAAA,CACtD5C,EAAE,WAAY,YAAY,OAE7B0C,eAAA,QAAAE,SAAA,CACGsuB,EAA6B,OAAZlZ,QAAY,IAAZA,OAAY,EAAZA,EAAcpO,cAxIlBw1B,KACxB,IAAKA,EAAU,OAEf,MAAMx1B,EAAe,IAAIlE,KAAK05B,GAC9B,GAAiB,OAAZx1B,QAAY,IAAZA,MAAcy1B,QAAS,OAE5B,MAAMC,GAAkB,IAAI55B,MAAO25B,UAC7BE,EAAgB9vB,KAAK+vB,MACxB51B,EAAay1B,UAAYC,GAAe,OAE3C,OAAOC,EAAgB,EAAC,KAAA7/B,OACf6/B,EAAa,KAAA7/B,OACE,IAAlB6/B,EACIv/B,EAAE,gBAAiB,iBACnBA,EAAE,iBAAkB,kBAAiB,UAE3CqP,CAAS,EAyHFowB,CAA6B,OAAZznB,QAAY,IAAZA,OAAY,EAAZA,EAAcpO,uBAKrC4zB,GACC96B,eAACyzB,IAAI,CACHjC,EAAG,EACHpvB,QAAS,CAAEq4B,KAAM,IAAKC,GAAI,KAC1BsB,gBAAiB,CACfvB,KAAM,MACNC,GAAI,iBAENsC,gBA1JDxnB,GAAMF,GAAgBzU,IAAQC,KAAK,KAAOD,IAAQo8B,KAAK,KA0JX/8B,SAAA,CAE3CF,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACq7B,IAAS,CAACC,QAAS,CAAEb,KAAM,QAASC,GAAI,UAAYyC,GAAI,EAAGhK,GAAI,EAAEjzB,SAAA,CAC/D5C,EAAE,UAAW,WAAW,OAEd,OAAZgY,QAAY,IAAZA,OAAY,EAAZA,EAAcpR,WAEjBlE,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACq7B,IAAS,CAACC,QAAQ,SAAS6B,GAAI,EAAGhK,GAAI,EAAEjzB,SAAA,CACtC5C,EAAE,YAAa,aAAa,OAElB,OAAZgY,QAAY,IAAZA,OAAY,EAAZA,EAAcvO,aAEjB/G,eAACk9B,IAAQ,CAACpB,UAAW,CAAErB,KAAM,OAAQ2C,GAAI,SAAUl9B,SAAA,CACjDF,eAACq7B,IAAS,CAACC,QAAQ,SAAS6B,GAAI,EAAGhK,GAAI,EAAEjzB,SAAA,CACtC5C,EAAE,oBAAqB,qBAAqB,OAElC,OAAZgY,QAAY,IAAZA,OAAY,EAAZA,EAAc3O,2BAKlB,ECvLE02B,GAA0C5+B,IAA0B,IAAzB,OAAE6+B,EAAM,QAAEC,GAAS9+B,EACzE,MAAM,EAAEnB,GAAMC,YAAe,gBACvB2B,EAAWC,eACX,wBAAEq1B,EAAuB,WAAE5H,GCzBK4Q,MAAuC,IAADC,EAAAC,EAC5E,MAAM,EAAEpgC,GAAMC,YAAe,gBAEvBi3B,EAA0BjI,YAAenO,KAEvC+L,KAAMwT,GAAqBxQ,MAC3BhD,KAAMyT,GAAkB5sB,KAE1B6sB,EAA6B,OAAbD,QAAa,IAAbA,OAAa,EAAbA,EAAehR,WACrC,IAAKiR,EACH,MAAO,CAAEjR,WAAY,GAAI4H,2BAG3B,MAAMsJ,EAAuC,OAAhBH,QAAgB,IAAhBA,GAA+B,QAAfF,EAAhBE,EAAkBvQ,qBAAa,IAAAqQ,GAAO,QAAPC,EAA/BD,EAAiC5Q,aAAK,IAAA6Q,OAAtB,EAAhBA,EACzB3nB,QAAQT,GAAiBkf,EAAwBU,SAAS5f,EAAapS,MACxE5B,KAAKgU,GAAiBA,EAAazO,aAetC,MAAO,CACL+lB,WAAY,IAdaiR,EACxB9nB,QAAQgoB,GAAkC,OAApBD,QAAoB,IAApBA,OAAoB,EAApBA,EAAsB5I,SAAS6I,EAAUvjB,SAC/DwjB,KAAKzS,IACLjqB,KAAKy8B,IAAS,CACbvjB,MAAOujB,EAAUvjB,MACjB3b,MAAM,GAAD7B,OAAK+gC,EAAUl/B,MAAK,MAAA7B,OAAKM,EAAE,kBAAmB,YAAW,KAC9D2gC,UAAU,SAGUJ,EACrB9nB,QAAQgoB,KAAmC,OAApBD,QAAoB,IAApBA,KAAsB5I,SAAS6I,EAAUvjB,UAChEwjB,KAAKzS,KAINiJ,0BACD,EDR+CgJ,IAC1C,YAAEhW,GAAgB4M,MAChBnC,OAAQjF,GEhCgBkR,MAKhC,MAAMtS,EAAcC,cACpB,OAAOC,aAAYkB,GAAiB,CAClCjB,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeG,oBAC1D4d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeE,mBAC1D6d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeD,iBAAkB,GAE9E,EFoBkCswB,GAE9BvL,EAAeA,KACnB4K,GAAS,EAgBLY,EACJn+B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,eAAgB,gBAAgB4C,SAAA,CACzDF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACk+B,KAAY,CAAC5+B,MAAOoB,IAAQC,KAAK,OAClCX,cAAA,QAAAD,SAAO5C,EAAE,gBAAiB,4BAE5B6C,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAACC,SAAS,UAASt+B,SAAA,CAC3BC,cAAC4yB,IAAY,CAAA7yB,SACXC,cAAC6yB,IAAI,CACH9vB,GAAG,8BACH+vB,cAAe9gB,IAAA,IAAC,YAAEjJ,GAAaiJ,EAAA,MA1BXjJ,KAAyB,IAADu1B,EACpD,MAAMn2B,EAEL,QAFkBm2B,EAAG7R,EAAW8R,MAC9BX,GAAcA,EAAUvjB,QAAUtR,WACpC,IAAAu1B,OAAA,EAFqBA,EAEnB5/B,MACHmuB,EACE,CACE2R,gBAAiBnK,EACjBtrB,eAEF,CAAE6iB,UAAWA,IAAMwR,EAAQj1B,GAAgBilB,QAAS/F,GACrD,EAgB2C2N,CAAqBjsB,EAAY,EAAChJ,SAEtEC,cAACy+B,IAAe,CACd17B,GAAG,cACH,cAAY,mBACZrE,MACE21B,EAAwB3jB,OAAS,EAC7BvT,EACE,6CACA,oDAEFA,EACE,0CACA,kDAGRu2B,YAAav2B,EAAE,+BAAgC,sBAC/Cg2B,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,2BAA4B,+BAEzC4C,SAED0sB,EAAWtrB,KAAKC,GAEbpB,cAAA,UAA2Bqa,MAAOjZ,EAAOiZ,MAAOyjB,SAAU18B,EAAO08B,SAAS/9B,SACvEqB,EAAO1C,OADG0C,EAAOiZ,eAQ9Bra,cAAC0+B,IAAgB,CACfn4B,OAAO,OACP/F,QAAQ,SACRsnB,MACEuM,EAAwB3jB,OAAS,EAC7BvT,EACE,kDACA,wDAEFA,EACE,+CACA,sDAGR6D,GAAI,UAMZ,OAAOjC,EACLiB,cAACoC,IAAG,CAAC,cAAY,eAAcrC,SAC7BF,eAAC8+B,GAAW,CAACxB,OAAQA,EAAQC,QAAS5K,EAAc,cAAY,eAAczyB,SAAA,CAC3Ei+B,EACDh+B,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CAACi/B,aAAW,EAACn7B,KAAK,SAASo7B,KAAK,8BAA6B/+B,SACjE5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAASixB,EAAazyB,SAC1D5C,EAAE,qBAAsB,sBAOnC6C,cAACoC,IAAG,CAAC,cAAY,eAAcrC,SAC7BF,eAACk/B,KAAK,CAAC5B,OAAQA,EAAQC,QAAS5K,EAAazyB,SAAA,CAC3CC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACVi+B,EACDh+B,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAASixB,EAAazyB,SAC9C5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAAC8D,KAAK,SAASo7B,KAAK,8BAA6B/+B,SACrD5C,EAAE,qBAAsB,wBAOtC,E,uBGvJI,MAAM+hC,GAAuBA,KAClC,MAAM,EAAE/hC,GAAMC,YAAe,WACvB+hC,EAAU/S,YAAevR,IACzBukB,EAAYhT,YAAerR,KAC3B,SAAEskB,GAAaC,gBACf,qBACJlI,EAAoB,0BACpBI,EAAyB,4BACzBa,EAA2B,yBAC3BhB,EAAwB,2BACxBC,GACEX,KAEE4I,EAAa,CACjB7gC,MAAOvB,EAAE,cAAe,eACxBoE,QAAS61B,GAGLoI,EAAiB,CACrB9gC,MAAOvB,EAAE,kBAAmB,mBAC5BoE,QAAS82B,GAGLoH,EAAS,CACb/gC,MAAOvB,EAAE,UAAW,WACpBoE,QAAS+lB,gBACD+X,EAASK,OAAO,CACpBC,sBAAuB,KACvB,EAEJ59B,KAAM69B,KACNl+B,WAAW,GAGPm+B,EAAiB,CACrBnhC,MAAOvB,EAAE,kBAAmB,mBAC5BoE,QAAS81B,GAGLyI,EAAgB,CACpBphC,MAAOvB,EAAE,kBAAmB,mBAC5BoE,QAASi2B,GAGLuI,EAAmB,CACvBrhC,MAAOvB,EAAE,oBAAqB,qBAC9BoE,QAAS+1B,GAGL0I,EAA4B,CAACR,EAAgBC,GAKnD,OAHIL,GAAWY,EAAYC,OAAO,EAAG,EAAGH,EAAeC,EAAkBF,GACrEV,GAASa,EAAYC,OAAO,EAAG,EAAGV,GAE/BS,CAAW,EChDPE,GAAwC5hC,IAAmB,IAAlB,SAAE2V,GAAU3V,EAChE,MAAM,EAAEnB,GAAMC,YAAe,YACvB,oBAAE85B,EAAmB,kBAAEC,GAAsBR,MAC7C,cAAEsC,EAAa,mBAAEU,GAAuBlB,GAAcxkB,GACtD1V,EAAU2gC,KACViB,EAAcrG,KAEdsG,EAAqBhU,YAAenR,IAEpColB,EAAmBC,IAAiB,CACxC7gC,QAAS6gC,EAAW5/B,IAAQC,KAAK,UAAO6L,EACxClN,MAAOghC,EAAW,QAAU5/B,IAAQC,KAAK,OAQ3C,OACEd,eAAC8B,IAAI,CAACM,QAAS,EAAGJ,WAAW,SAAS,cAAY,aAAY9B,SAAA,CAC3DqgC,GACCvgC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACJ,IAAM,CACLY,QAASm5B,EAAqB,UAAY,cACtC0G,EAAgB1G,GACpBl5B,KAAK,KACLP,SAAS,KACTqB,QAdYg/B,KACpBJ,IACAjJ,GAAqB,EAYUn3B,SAEtB5C,EAAE,uBAAwB,mBAE7B6C,cAACJ,IAAM,CACLY,QAASy4B,EAAgB,UAAY,cACjCoH,EAAgBpH,GACpBx4B,KAAK,KACLP,SAAS,KACTqB,QAAS41B,EAAkBp3B,SAE1B5C,EAAE,iBAAkB,aACb,OAGd6C,cAAC3B,EAAgB,CACfK,MAAOvB,EAAE,iBAAkB,kBAC3BoB,QAASA,EACTI,OAAK,MAEF,ECjDE6hC,GAA4CliC,IAAmB,IAAlB,SAAE2V,GAAU3V,EACpE,MAAM,EAAEnB,GAAMC,YAAe,YACvB,oBAAE85B,EAAmB,kBAAEC,GAAsBR,MAC7C,cAAEsC,EAAa,mBAAEU,GAAuBlB,GAAcxkB,GACtD1V,EAAU2gC,KACViB,EAAcrG,KAEdsG,EAAqBhU,YAAenR,IAO1C,OACEpb,eAAC8B,IAAI,CAACM,QAAS,EAAGJ,WAAW,SAAQ9B,SAAA,CAClCqgC,GACCvgC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACL,KAAe,CACdL,MAAM,QACNghC,SAAU3G,EACVl5B,KAAK,KACLP,SAAS,KACTugC,QAAM,EACNl/B,QAfYg/B,KACpBJ,IACAjJ,GAAqB,EAaUn3B,SAEtB5C,EAAE,uBAAwB,mBAE7B6C,cAACL,KAAe,CACdL,MAAM,QACNghC,SAAUrH,EACVx4B,KAAK,KACLP,SAAS,KACTqB,QAAS41B,EAAkBp3B,SAE1B5C,EAAE,iBAAkB,aACJ,OAGvB6C,cAAC3B,EAAgB,CACfK,MAAOvB,EAAE,iBAAkB,kBAC3BoB,QAASA,EACTI,OAAK,EACLC,cAAY,MAET,EC/CE8hC,GAAwCpiC,IAAmB,IAAlB,SAAE2V,GAAU3V,EAChE,MAAMqiC,EAAgBvU,YAAepR,KAC/B,gBAAE4lB,EAAe,oBAAEC,GCLG5sB,KAC5B,MAAM,EAAE9W,GAAMC,YAAe,eACvB,oBACJ85B,EAAmB,kBACnBc,EAAiB,mBACjBC,EAAkB,kBAClBd,EAAiB,2BACjBG,GACEX,MACE,eACJn4B,EAAc,cACdy6B,EAAa,aACbC,EAAY,cACZC,EAAa,eACbE,EAAc,uBACdC,EAAsB,kBACtBF,EAAiB,iBACjBG,EAAgB,yBAChBE,EAAwB,yBACxBC,GACEjB,GAAcxkB,GAuClB,MAAO,CACL2sB,gBAtCsBA,IAClBzH,GAAiBF,GAAiBM,EAC7Bp8B,EAAE,YAAa,aAEpBk8B,GAAkBD,EACbj8B,EAAE,UAAW,WAElBm8B,EACKn8B,EAAE,WAAY,YAEnB+7B,EACK/7B,EAAE,UAAW,oBAElBs8B,GAA4BC,EACvBv8B,EAAE,oBAAqB,qBAEzB,GAuBP0jC,oBApB0BA,IACtB1H,GAAiBF,GAAiBM,EAC7BrC,KAEJmC,GAAkBD,IAAsB56B,EACpCw5B,EAAkBx5B,GAEvB86B,GAA0B96B,EACrBy5B,EAAmBz5B,GAExB06B,EACK/B,IAELsC,GAA4BC,EACvBpC,SADT,EAQD,EDzDgDwJ,CAAc7sB,GAE/D,OAAO0sB,EACL3gC,cAACoC,IAAG,CAAClB,MAAM,OAAO6/B,GAAI,CAAEzG,KAAM,EAAGC,GAAI,GAAIx6B,SACvCC,cAACghC,IAAU,CAACC,SAAUjhC,cAACkhC,IAAa,IAAK3/B,QAASs/B,EAAoB9gC,SACnE6gC,QAIL5gC,cAAA0yB,WAAA,GACD,EEdUyO,GAAkD7iC,IAIxD,IAJyD,QAC9DiD,EAAO,UACPjB,EAAS,KACTgI,GACDhK,EACC,OACE0B,cAACoC,IAAG,CACFhD,OAAO,OACPgiC,UAAU,OACVlgC,MAAM,OACN27B,gBAAiBn8B,IAAQ2gC,MACzBC,aAAa,OACbhiC,MAAOoB,IAAQC,KAAK,KACpBpB,QAAS,CAAEs9B,gBAAiBn8B,IAAQ6gC,QAAQ,IAC5CC,OAAQ,CAAE3E,gBAAiBn8B,IAAQ2gC,OACnCI,OAAQ,CACNC,QAAS,OACTriC,YAAa,cACbw9B,gBAAiBn8B,IAAQ6gC,QAAQ,IAEnChgC,QAASA,EAAQxB,SAEjBF,eAACD,IAAM,CACLY,QAAQ,WACRsB,EAAE,OACF0vB,EAAE,OACF+J,GAAG,OACHoG,aAAc,EACdniC,OAAO,OACP87B,WAAW,WACXp7B,SAAS,KACTi7B,QAAQ,OACRt5B,WAAW,SACXD,eAAe,gBAAe7B,SAAA,CAE9BC,cAACoC,IAAG,CAAArC,SAAEuI,IACLhI,MAEC,ECnCGshC,GAAsDtjC,IAAkB,IAAjB,QAAE8+B,GAAS9+B,EAC7E,MAAM,EAAEnB,GAAMC,YAAe,eACvB+hC,EAAU/S,YAAevR,IACzB8lB,EAAgBvU,YAAepR,IAC/B6mB,EAAkBC,gBAClB,SAAEzC,GAAaC,gBACf,oBAAEpI,EAAmB,kBAAEC,EAAiB,qBAAEC,GAAyBT,KAEzE,OACE92B,eAACkiC,KAAM,CACLC,QAAShiC,cAACiiC,KAAY,IACtB5iC,YAAaqB,IAAQo8B,KAAK,KAC1BoF,QAAS,EACTC,UAAU,OAAMpiC,SAAA,CAEf4gC,GACC9gC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACmhC,GAAoB,CACnB5/B,QAASA,KACP21B,IACO,OAAPkG,QAAO,IAAPA,MAAW,EAEb90B,KAAMnL,EAAE,eAAgB,mBAG1B6C,cAACmhC,GAAoB,CACnB5/B,QAASA,KACP41B,IACO,OAAPiG,QAAO,IAAPA,MAAW,EAEb90B,KAAMnL,EAAE,UAAW,gBAKxBgiC,GACCn/B,cAACmhC,GAAoB,CACnB5/B,QAASA,KACP61B,IACO,OAAPgG,QAAO,IAAPA,MAAW,EAEb90B,KAAMnL,EAAE,cAAe,iBAI1B0kC,EACC7hC,cAACmhC,GAAoB,CACnB5/B,QAAS+lB,gBACD+X,EAASK,OAAO,CACpBC,sBAAuB,KACvB,EAEJr/B,UAAWN,cAAC4/B,KAAQ,CAAC,aAAYziC,EAAE,cAAe,kBAClDmL,KAAMnL,EAAE,SAAU,aAGpB6C,cAACmhC,GAAoB,CACnB5/B,QAAS+lB,gBACD+X,EAAS+C,cAAc,CAC3BC,OAAQ,CAACvlC,6FACT,EAEJwD,UAAWN,cAACsiC,KAAO,CAAC,aAAYnlC,EAAE,aAAc,iBAChDmL,KAAMnL,EAAE,QAAS,cAGd,E,YCrEN,MAAMolC,GAAiDjkC,IAA0B,IAAzB,OAAE6+B,EAAM,QAAEC,GAAS9+B,EAChF,MAAM,EAAEnB,GAAMC,YAAe,eAE7B,OACEyC,eAAC2iC,IAAM,CAAC/hC,KAAK,KAAK08B,SAAUA,EAAQsF,UAAU,QAAQrF,QAASA,IAAa,OAAPA,QAAO,IAAPA,OAAO,EAAPA,IAAYr9B,SAAA,CAC/EC,cAAC0iC,IAAa,IACd7iC,eAAC8iC,IAAa,CAAC7gC,EAAE,MAAM,aAAY3E,EAAE,yBAA0B,eAAe4C,SAAA,CAC5EF,eAAC8B,IAAI,CACHE,WAAW,SACXD,eAAe,gBACf0/B,aAAY,aAAAzkC,OAAe6D,IAAQC,KAAK,MACxC6wB,EAAE,OACF+J,GAAI,EAAEx7B,SAAA,CAENC,cAAC4iC,KAAIvR,EAAC,CAACnxB,SAAS,KAAIH,SAClBC,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,qBAG9B6C,cAACqC,IAAU,CACTN,KAAM/B,cAAC6iC,IAAO,IACd,aAAY1lC,EAAE,2BAA4B,4BAC1CoE,QAAS67B,OAGbp9B,cAAC4hC,GAAqB,CAACxE,QAASA,SAE3B,EC3BA0F,GAAuBA,KAClC,MAAM,OAAE3F,EAAM,OAAE4F,EAAM,QAAE3F,GAAY4F,eAC9B,EAAE7lC,GAAMC,YAAe,eAE7B,OACEyC,eAACuC,IAAG,CAACm5B,GAAI,EAAEx7B,SAAA,CACTC,cAACqC,IAAU,CACTd,QAASwhC,EACThhC,KAAM/B,cAACijC,IAAM,IACbnhC,EAAG,GACH0vB,EAAG,GACH/xB,QAAQ,cACRH,MAAOoB,IAAQC,KAAK,KACpBghC,aAAa,UACbH,OAAQ,CAAE3E,gBAAiB,QAC3Bt9B,QAAS,CAAEs9B,gBAAiB,QAC5B4E,OAAQ,CACNC,QAAS,OACTriC,YAAaqB,IAAQC,KAAK,MAE5B,aAAYxD,EAAE,+BAAgC,gCAC9C0D,GAAI,CACF,sBAAuB,CACrBqiC,OAAQ,MAEV,QAAS,CAAEphC,EAAG,EAAG0vB,EAAG,GAEpB,UAAW,CACT2R,UAAW,0BAIjBnjC,cAACuiC,GAAgB,CAACpF,OAAQA,EAAQC,QAASA,MACvC,EC1CK,I,GAAA,OAA0B,iCCA1B,OAA0B,oC,0BCkH1BgG,OA5GOC,aAAiBC,QAAAC,aAAA,i+DAFT,OAiBR7iC,IAAQC,KAAK,KACjBD,IAAQC,KAAK,KACpBD,IAAQC,KAAK,MCTT6iC,OAXmB,CAChC,UAAW,CAAE3G,gBAAiBn8B,IAAQC,KAAK,MAC3C,aAAc,CAAE8iC,eAAgB,SAChC,qBAAsB,CACpBC,aAAc,OACdlkC,OAAO,aAAD3C,OAAe6D,IAAQo8B,KAAK,MAClC6G,UAAW,QAEbhC,aAAc,GCXT,MAAMiC,GACC,UADDA,GAEE,UAFFA,GAGM,UAHNA,GAIA,UAJAA,GAKH,UAGGC,GAIF,UAJEA,GASC,UATDA,GAUC,UAVDA,GAYC,UAZDA,GAaO,UAbPA,GAcM,UAdNA,GAeM,UAfNA,GAgBK,U,OCRHC,OAXOT,aAAiBC,QAAAC,aAAA,oLAQ1BM,ICbN,MAAME,GAAyB,CACpC5I,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAC7ByJ,KAAM,WACNC,cAAe,CAAE3J,KAAM,MAAOC,GAAI,UAClC14B,WAAY,SACZD,eAAgB,OAGLsiC,GAAoB,CAC/BC,GAAI,CAAE7J,KAAM,SAAUC,GAAI,GAC1ByJ,KAAM,CAAE1J,KAAM,UAAWC,GAAI,UCWlB6J,GAAgC9lC,IAAoC,IAAnC,SAAE2V,EAAQ,gBAAE4tB,GAAiBvjC,EACzE,MAAM,EAAEnB,GAAMC,YAAe,YACvB,KAAEinC,EAAI,IAAExlC,GAAQC,eAEhB,oBAAEo4B,EAAmB,eAAEH,EAAc,yBAAEM,GAA6BV,KACpE53B,EAAWC,eACX,WAAE+5B,EAAU,iBAAEa,GAAqBnB,GAAcxkB,GACjDksB,EAAcrG,KACdsF,EAAYhT,YAAerR,IAC3BupB,EAAYC,iBAA8B,OAC1C,SAAEC,GAAaC,cAmBrB,MC7C6BC,EAAChvB,EAAoBivB,KAClD,MAAMC,EAAcC,IAAMN,QAAO,GAEjCO,qBAAU,KACR,GAAKF,EAAYG,QAKjB,OAAOrvB,IAJLkvB,EAAYG,SAAU,CAIb,GAEVJ,EAAK,ED8BRD,EAAgB,KACdJ,EAAUS,SAAWT,EAAUS,QAAQC,OAAO,GAC7C,CAACR,IAGF3kC,eAACyzB,IAAI,CACH7wB,SAAS,QACT25B,IAAK,EACL8G,OAAQ,EACRhiC,MAAM,OACN+jC,UAAW,EACXC,IAAKZ,EACL7C,OAAQ,CAAEC,QAAS,QACnB,cAAY,cAAa3hC,SAAA,CAEzBC,cAACoC,IAAG,CACF2+B,GAAIliC,EAAI,CAAEwB,GAAI,EAAGlB,GAAI,IACrBgmC,KAAMtmC,EAAI,CAAEwB,GAAI,GAAIlB,GAAI,MACxBmiC,aAAcziC,EAAI,CAAEwB,GAAG,aAADxD,OAAe6D,IAAQC,KAAK,QAClD2wB,GAAIzyB,EAAI,CAAEM,GAAI0kC,GAA8BxjC,GAAIK,IAAQ2gC,QAASthC,SAEjEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAAC8B,IAAI,CAACC,eAAe,gBAAgBC,WAAW,SAAQ9B,SAAA,CACpDhB,GAAa66B,EAqBb55B,cAAC0gC,GAAU,CAACzsB,SAAUA,IApBtBjU,cAACghC,IAAU,CACTD,GAAG,IACHvgC,QAAQ,YACRe,QAxCQg/B,KACfsB,EAIDzC,EACF/H,KAEA8I,IACAjJ,KAPAH,GAQF,EA+BYsO,UAAU,iBACVC,WAAYzmC,EAAI,CAAEM,IAAI,IACtB0B,GAAI,CACF0kC,UAAW,CACTC,cAAe,SAEjBzlC,SAEFC,cAACylC,IAAK,CACJvkC,MAAO,CAAEo5B,KAAM,IAAK2C,GAAI,KACxB79B,OAAQ,CAAEk7B,KAAM,GAAI2C,GAAI,IACxByI,IAAK7mC,EAAI,CAAEM,GAAIwmC,GAAQtlC,GAAIulC,KAC3BC,IAAK1oC,EAAE,WAAY,2BAMvB47B,IACCh6B,GACD8iC,IACCwC,EACCrkC,cAACwgC,GAAY,CAACvsB,SAAUA,IAExBjU,cAACkgC,GAAU,CAACjsB,SAAUA,MAExB8kB,GAAch6B,GAAY8iC,GAAmB7hC,cAAC8iC,GAAU,WAI/DlJ,IAAqB76B,GAAY8iC,GAChC7hC,cAACoC,IAAG,CACFy6B,gBAAiBn8B,IAAQ2gC,MACzBC,aAAc,CAAEhH,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAErEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCC,cAAC0gC,GAAU,CAACzsB,SAAUA,UAIvB,EExGE6xB,GAAwCxnC,IAAqC,IAApC,QAAEynC,EAAO,SAAEhmC,KAAaimC,GAAM1nC,EAClF,OACE0B,cAAC07B,IAAI,CAAA37B,SACHF,eAACyzB,IAAI,CAAAvzB,SAAA,CACHC,cAACimC,IAAO,CACNxlC,KAAK,KACL4wB,EAAG,EACHiQ,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCD,gBAAiBn8B,IAAQo8B,KAAK,KAAK/8B,SAElCgmC,IAEH/lC,cAACoC,IAAG,CAACivB,EAAG,KAAO2U,EAAIjmC,SAChBA,QAGA,EClBEmmC,GAAgD5nC,IAA0B,IAAD6nC,EAAA,IAAxB,MAAE9rB,EAAK,SAAE+rB,GAAU9nC,EAC/E,MAAM,EAAEnB,GAAMC,YAAe,mBAC7B,OACEyC,eAACuC,IAAG,CAACpB,IAAK,EAAGgyB,GAAI,EAAEjzB,SAAA,CACH,QADGomC,EACX,OAAL9rB,QAAK,IAALA,OAAK,EAALA,EAAO3J,cAAM,IAAAy1B,IAAI,EAAE,IAAEhpC,EAAE,KAAM,MAAM,IAAEipC,EAAS,IAAEjpC,EAAE,aAAc,gBAC7D,E,aCXH,MAAMkpC,GAAgBnE,aAAQ,GACxBoE,GAAyBpE,aAAQ,GACjCqE,GAA0BrE,aAAQ,GAClCsE,GAA+B,cCI/BC,GAAwDnoC,IAAuB,IAAtB,aAAE6W,GAAc7W,EACpF,OAAO+W,GAAMF,GAAgB,KAC3BnV,cAAC0mC,IAAe,CAAA3mC,SACdC,cAACoC,IAAG,CACF+hC,GAAI,CAAE7J,KAAM,EAAGC,GAAI+L,IACnBtJ,GAAI,CAAE1C,KAAM,EAAGC,GAAI2H,aAAQ,IAC3BlhC,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GAAIx6B,SAEvBC,cAAC2mC,GAAmB,CAACC,cAAe,CAAEtM,KAAM,GAAIuM,GAAI,GAAIC,GAAI,GAAIC,GAAI,GAAIxM,GAAI,KAAMx6B,SAC/EoV,EAAatO,wBAIrB,E,cClBI,MAAMmgC,GAA0BA,CACrCtoC,EACA2b,EACA4sB,EACAC,IAEArnC,eAACuC,IAAG,IAAM6kC,GAAY,CAAC,EAAClnC,SAAA,CACtBF,eAAA,UAAAE,SAAA,CAASrB,EAAM,OAAW,IAC1BsB,cAAC4iC,KAAIuE,KAAI,CAACxkC,WAAYukC,EAAS,SAAW,QAAQnnC,SAAEsa,OCE3C+sB,GAA0D9oC,IAGhE,IAAD+oC,EAAA,IAHkE,aACtElyB,EAAY,cACZmyB,GACDhpC,EACC,MAAM,EAAEnB,GAAMC,YAAe,sBACvB,IAAEyB,GAAQC,eAEVyoC,EAAqB1oC,EAAI,CAAEM,GAAI,WAAauB,IAAQo8B,KAAK,MACzD0K,EAAiB3oC,EAAI,CAAEM,GAAI,WAAauB,IAAQC,KAAK,MAU3D,OACEX,cAACynC,IAAiB,CAChB5K,gBATEyK,EACK,QAGFjyB,GAAMF,GAAgBqyB,EAAiBD,EAM5CvK,GAAIuJ,GACJxF,GAAI,EACJ,cAAY,2BAA0BhhC,SAEtCF,eAACyzB,IAAI,CACH6Q,GAAI,CAAE7J,UAAM9tB,EAAW+tB,GAAI+L,IAC3BoB,aAAc,CACZpN,UAAM9tB,EACN+tB,GAAIllB,GAAMF,GAAa,uBAAAtY,OACI2pC,IAA4B,8BAAA3pC,OACrB2pC,KAEpC5kC,eAAe,gBACf06B,SAAS,SACTr6B,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAE3BinC,GAAwB7pC,EAAE,WAAY,YAAkC,QAAvBkqC,EAAElyB,EAAaxO,gBAAQ,IAAA0gC,IAAI,KAE5EL,GACC7pC,EAAE,mBAAoB,qBACtBgY,EAAa3O,kBAEd6O,GAAMF,GAAgB,KACrBtV,eAAC8nC,KAAU,CAACC,YAAa,CAAEtN,KAAM,aAAcC,GAAI,YAAax6B,SAAA,CAC9DC,cAAA,UAAAD,SAAS5C,EAAE,WAAY,cAAqB,KAAE6C,cAAA,QAAAD,SAAOoV,EAAa1O,kBAItD,ECpClBohC,GAA0B,wCAAAhrC,OAE5BwpC,GAAa,eAAAxpC,OAAcqlC,aAAQ,IAEjC4F,GAAyB,qDAAAjrC,OAG3BwpC,GAAa,UAAAxpC,OAASqlC,aAAQ,IAE5B6F,GAAgC,CACpC5M,QAAS,OACTrH,aAAc,SACdkU,oBAAqB,cAGVC,GAA0D3pC,IAAuB,IAAtB,aAAE6W,GAAc7W,EACtF,MAAM,EAAEnB,GAAMC,YAAe,sBACvB,kBAAE46B,GAAsBrB,MACxB,IAAE93B,GAAQC,eACVuvB,EAAmBtwB,IAEnBgB,EAAWC,eACVo1B,EAAyB8T,GAA8BhW,YAC5DlU,IAcF,OACEne,eAACsoC,IAAiB,CAChBhN,QAAQ,QACR6B,GAAIuJ,GACJ1lC,GAAIhC,EACF,CACEM,GAAI,CACFkyB,EAAG,EACH0P,GAAI,IAGR,CAAC,GACDhhC,SAAA,CAEFF,eAACyzB,IAAI,CACHoU,aAAc,CAAEpN,KAAMwN,GAA2BvN,GAAIsN,IACrDG,oBAAmB,GAAAnrC,OAAKypC,GAAsB,eAAAzpC,OAAcqlC,aAAQ,IACpEpO,aAAa,SACbjyB,WAAW,SAAQ9B,SAAA,CAEnBC,cAACooC,IAAQ,CACPpnC,IAAK,EACLqnC,SAAS,WACThuB,MAAOlF,EAAapS,GACpBulC,UAAWlU,EAAwBW,SAAS5f,EAAapS,IACzDmwB,SApCqB3wB,IAC3B,MAAM/D,GAAkB+D,EAAMqxB,OAAOvZ,MACjC9X,EAAMqxB,OAAO2U,QACfL,EAA2B,IAAI9T,EAAyB51B,IAExD0pC,EACE9T,EAAwBxe,QAAQ7S,GAAOA,IAAOvE,IAElD,EA6BM+C,QAAUgB,GAAUA,EAAMC,kBAC1B,aAAYrF,EAAE,6BAA8B,8BAC5C,cAAY,+BAGd6C,cAACghC,IAAU,CACTqH,SAAS,OACTrnC,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GACnBz4B,EAAE,cACF65B,UAAU,OACVp6B,QAAUinC,IACRA,EAAEhmC,kBACFw1B,EAAkB7iB,EAAapS,GAAG,EAClChD,SAEDoV,EAAapR,UAGhB/D,cAACm8B,GAA2B,CAC1BkM,SAAS,SACTT,YAAa,CAAEtN,KAAM,QAASC,GAAI,OAClC33B,GAAI,EACJuS,aAAcA,EACdknB,kBAAiB,GAAAx/B,OAAKM,EAAE,sBAAuB,uBAAsB,MAAAN,OACvD,OAAZsY,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,UAIlBvG,cAACyoC,GAAoB,CAACtzB,aAAcA,OAEtCtV,eAACyzB,IAAI,CACH6Q,GAAI,CAAE7J,KAAM,QAASC,GAAI+L,IACzBtlC,GAAI,EACJiB,QAAS,EACT6xB,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjCyN,oBAAqB,CAAE1N,KAAM,OAAQC,GAAIiM,IACzC5kC,eAAe,gBACfC,WAAW,QAAO9B,SAAA,CAElBC,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAA,UAAAD,SAASoV,EAAahR,cAEvB6iC,GACC7pC,EAAE,YAAa,aACfgY,EAAavO,UACb7H,EAAWgpC,GAAsB,CAAC,GAEpCloC,eAACyzB,IAAI,CACHzxB,WAAY,CAAEy4B,KAAM,QAASC,GAAI,OACjC34B,eAAgB,CAAE04B,KAAM,iBACxBr4B,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GACxBqN,YAAa,CAAEtN,KAAM,aAAcC,GAAI,YACvCmO,aAAc7pC,EAAI,CAAEM,GAAI,OAAS,IAAIY,SAAA,CAEpCinC,GACC7pC,EAAE,YAAa,aACfkxB,EAAiBlZ,EAAarO,eAC9B/H,EAAWgpC,GAAsB,CAAC,GAClC,GAEDf,GACC7pC,EAAE,WAAY,YACdkxB,EAAiBlZ,EAAapO,cAC9BhI,EAAWgpC,GAAsB,CAAC,GAClC,WAIY,EClJXU,GAA4DnqC,IAElE,IAFmE,aACxE6W,GACD7W,EACC,MAAM,EAAEnB,GAAMC,YAAe,qBACvBmB,ECTN4W,KAEA,MAAM,EAAEhY,GAAMC,YAAe,sBAEvB,kBAAE46B,EAAiB,mBAAEC,EAAkB,kBAAEE,GAAsBxB,MAC/D,yBAAE1B,GAA6BhB,KAC/B0U,EAAmB5O,GAAoB5kB,GAEvC5W,EAAwB,CAC5B,CACEG,MAAOvB,EAAE,uBAAwB,wBACjCoE,QAAU/C,GAAmBA,GAAkBw5B,EAAkBx5B,GACjEuD,KAAM6mC,MAkCV,OA9BIzzB,EAAajO,WACXyhC,GACFpqC,EAAQsqC,KAAK,CACXnqC,MAAOvB,EAAE,gBAAiB,iBAC1BoE,QAAU/C,GAAmBA,GAAkBy5B,EAAmBz5B,GAClEuD,KAAM+mC,MAIVvqC,EAAQsqC,KACN,CACEnqC,MAAOvB,EAAE,UAAW,WACpBoE,QAAU/C,GAAmBA,GAAkBy5B,EAAmBz5B,GAClEuD,KAAM+mC,KAER,CACEpqC,MAAOvB,EAAE,SAAU,UACnBoE,QAAU/C,GACRA,GAAkBy2B,EAAyBz2B,GAC7CuD,KAAMgnC,OAKZxqC,EAAQsqC,KAAK,CACXnqC,MAAOvB,EAAE,eAAgB,gBACzBoE,QAAU/C,GAAmBA,GAAkB25B,EAAkB35B,GACjEuD,KAAMinC,MAGDzqC,CAAO,EDrCE0qC,CAA+B9zB,GAE/C,OACEnV,cAACkC,EAAwB,CACvB3D,QAASA,EACTC,eAA4B,OAAZ2W,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,GAC9BZ,UAAWhF,EAAE,yBAA0B,6BACvC,EEXO+rC,GAAqCA,KAChD,MAAM,EAAE/rC,GAAMC,YAAe,qBAE7B,OACEyC,eAACspC,IAAW,CAAC,aAAYhsC,EAAE,uBAAwB,wBAAyB61B,GAAI,EAAEjzB,SAAA,CAChFC,cAACmoC,IAAiB,CAAApoC,SAChBF,eAAC8B,IAAI,CAACT,MAAM,OAAOF,GAAI,EAAEjB,SAAA,CACvBC,cAACopC,KACC,CACA5X,EAAE,UACF1vB,EAAE,OACF6/B,aAAc,IAEhB3hC,cAACopC,KAAQ,CAACjF,GAAI,EAAGjjC,MAAM,MAAMygC,aAAc,IAC3C3hC,cAACopC,KAAQ,CAACxB,YAAY,WAAWzD,GAAG,OAAOjjC,MAAM,MAAMygC,aAAc,IACrE3hC,cAACopC,KAAQ,CAACjF,GAAI,EAAGjjC,MAAM,KAAKygC,aAAc,SAG9C9hC,eAAC6mC,IAAe,CAAA3mC,SAAA,CACdF,eAAC8B,IAAI,CAACwiC,GAAI,GAAGpkC,SAAA,CACXC,cAACopC,KAAQ,CAACloC,MAAM,MAAM9B,OAAQ,EAAGuiC,aAAc,IAC/C3hC,cAACopC,KAAQ,CAACloC,MAAM,MAAMijC,GAAI,GAAI/kC,OAAQ,EAAGuiC,aAAc,IACvD3hC,cAACopC,KAAQ,CAACxB,YAAY,WAAW1mC,MAAM,MAAMijC,GAAG,OAAO/kC,OAAQ,EAAGuiC,aAAc,OAElF9hC,eAAC8B,IAAI,CAACX,GAAI,EAAGmjC,GAAI,GAAGpkC,SAAA,CAClBC,cAACopC,KAAQ,CAACloC,MAAM,MAAM9B,OAAQ,EAAGuiC,aAAc,IAC/C3hC,cAACopC,KAAQ,CAACjF,GAAG,OAAOyD,YAAY,MAAM1mC,MAAM,MAAM9B,OAAQ,EAAGuiC,aAAc,UAG/E3hC,cAACynC,IAAiB,CAAC4B,WAAY3oC,IAAQo8B,KAAK,SAChC,EC9BLwM,GAAoDhrC,IAG1D,IAH2D,aAChE6W,EAAY,cACZmyB,GACDhpC,EACC,MAAM,kBAAE05B,GAAsBrB,MACxB,IAAE93B,GAAQC,eACVyqC,EAAoB1qC,EAAI,CAC5BM,GAAI,CACFK,OAAQ,YACRH,YAAa,WACbgqC,WAAY,SAEdhpC,GAAI,CACFb,OAAQ,YACRH,YAAaqB,IAAQo8B,KAAK,KAC1BuM,WAAY,WAGVG,EAAwB3qC,EAAI,CAChCM,GAAI,CACFK,OAAQ,YACRH,YAAa,YACbgqC,WAAY,aAEdhpC,GAAI,CACFb,OAAQ,YACRH,YAAaqB,IAAQ+oC,MAAM,KAC3BJ,WAAY3oC,IAAQ6gC,QAAQ,OAIhC,OACE1hC,eAACspC,IAAW,CACVroC,GAAG,KACH1B,OAAO,cACP,cAAY,oBACZsqC,OAAO,UACP/H,aAAc9iC,EAAI,CAAEM,GAAI,UAAWkB,GAAI,YACvCkB,QAASA,IAAMy2B,EAAkB7iB,EAAapS,IAC9ClC,GAAIymC,EAAgBkC,EAAwBD,EAAkBxpC,SAAA,CAE9DC,cAACioC,GAAsB,CAAC9yB,aAAcA,IACtCnV,cAACymC,GAAoB,CAACtxB,aAAcA,IACpCnV,cAAConC,GAAsB,CAACjyB,aAAcA,EAAcmyB,cAAeA,MACvD,ECjDLqC,GAAoCA,KAC/C,MAAM,EAAExsC,GAAMC,YAAe,qBAE7B,OACEyC,eAACuC,IAAG,CAACK,SAAS,WAAU1C,SAAA,CACrBsM,MAAM6e,KAAK7e,MAHc,IAGe8e,QAAQhqB,KAAI,CAACyoC,EAAGC,IACvD7pC,cAACkpC,GAAwB,GAAMW,KAEjChqC,eAACuC,IAAG,CACFK,SAAS,WACTygC,OAAQ,EACR9G,IAAI,MACJ0N,KAAK,MACLtqC,OAAO,YACPH,YAAaqB,IAAQo8B,KAAK,KAC1BiN,UAAW,CAAEzP,KAAM,uBAAwBC,GAAI,wBAC/C8O,WAAY3oC,IAAQ2gC,MACpBngC,MAAM,QACN8xB,GAAI,EACJ+N,GAAI,GACJpF,UAAU,SACVwH,UAAU,qCAAoCpjC,SAAA,CAE9CC,cAAC2nC,KAAU,CAAC3U,GAAI,EAAEjzB,SAChBC,cAAA,MAAAD,SAAK5C,EAAE,UAAW,eAEpB6C,cAACgqC,KAAO,CAACvpC,KAAK,KAAKnB,MAAOoB,IAAQC,KAAK,YAErC,ECnBGspC,GAET3rC,IAAiE,IAAhE,MAAEI,EAAK,SAAEo/B,GAAW,EAAK,MAAEpR,EAAK,MAAE9Y,KAAUs2B,GAAc5rC,EAC7D,MAAMS,EAAWC,eACV2d,EAAewtB,GAAoBjY,YAAete,GAiBzD,OACE5T,cAACoqC,GAAW,CACVtM,SAAUA,EACVp/B,MAAK,GAAA7B,OAAK6B,EAAK,KACfguB,MAAOA,EACP/P,cAAeA,EACf0tB,aArBkBhwB,IACpB,MAAMiwB,EAAqB,OAAL5d,QAAK,IAALA,OAAK,EAALA,EAAO6R,MAAM1oB,GAASA,EAAKwE,SAAWA,IAEzDiwB,IACD3tB,EAAc4hB,MAAMgM,GAAiBA,EAAalwB,SAAWA,KAI/D8vB,EAAiB,IAAIxtB,EAAe2tB,GAAe,EAcjDE,sBAX2BnwB,IAC7B8vB,EAAiBxtB,EAAc/G,QAAQC,GAASA,EAAKwE,QAAUA,IAAO,EAWpEowB,UAAW1rC,KACPmrC,GACJ,ECxCOQ,GAAiBxI,aAAQ,MAEzByI,GAA2BtG,IACtC,MAAM,EAAElnC,GAAMC,YAAe,uBAC7B,OAAOinC,ECLoClnC,KACpC,CACLytC,IAAK,CACHlsC,MAAOvB,EAAE,MAAO,OAChB0tC,WAAY,CACVvrC,MAAO,YACPG,QAAS,QACTyB,MAAOwpC,GACPlrC,OAAQ,cAGZsrC,OAAQ,CACNpsC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CACVvrC,MAAO,QACPG,QAAS,WACTyB,MAAOwpC,KAGX,2BAA4B,CAC1BhsC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CAAEprC,QAAS,aAAcyB,MAAOwpC,IAC5C3oC,KAAMgpC,KAERC,OAAQ,CACNtsC,MAAOvB,EAAE,UAAW,UACpB0tC,WAAY,CACVprC,QAAS,aACTyB,MAAOwpC,KAGXO,aAAc,CACZvsC,MAAOvB,EAAE,eAAgB,gBACzB0tC,WAAY,CACVprC,QAAS,aAGb,sBAAuB,CACrBf,MAAOvB,EAAE,sBAAuB,uBAChC0tC,WAAY,CACVvrC,MAAO,QACPG,QAAS,aAGb,oBAAqB,CACnBf,MAAOvB,EAAE,oBAAqB,qBAC9B0tC,WAAY,CACVprC,QAAS,YAGb,oBAAqB,CACnBf,MAAOvB,EAAE,mBAAoB,qBAC7B0tC,WAAY,CACVprC,QAASmkC,KAGbsH,QAAS,CACPxsC,MAAOvB,EAAE,UAAW,WACpB0tC,WAAY,CACVprC,QAAS,UACTyB,MAAOwpC,KAGX,oBAAqB,CACnBhsC,MAAOvB,EAAE,oBAAqB,qBAC9B0tC,WAAY,CACVprC,QAAS,YAGb0rC,UAAW,CACTzsC,MAAOvB,EAAE,YAAa,aACtB0tC,WAAY,CACVvrC,MAAO,QACPG,QAAS,YACTyB,MAAOwpC,KAGXU,OAAQ,CACN1sC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CAAEprC,QAAS,WAAYyB,MAAOwpC,KAE5CW,UAAW,CACT3sC,MAAOvB,EAAE,YAAa,aACtB0tC,WAAY,CACVprC,QAASokC,KAGb,qBAAsB,CACpBnlC,MAAOvB,EAAE,qBAAsB,sBAC/B0tC,WAAY,CACVprC,QAAS,YAGb6rC,WAAY,CACV5sC,MAAOvB,EAAE,aAAc,cACvB0tC,WAAY,CACVprC,QAAS,WACTyB,MAAOwpC,OD5FCa,CAA6BpuC,GEHAA,KACpC,CACLytC,IAAK,CACHlsC,MAAOvB,EAAE,MAAO,OAChB0tC,WAAY,CACVvrC,MAAOoB,IAAQ8qC,MACf/rC,QAASmkC,GACT1iC,MAAOwpC,KAGXI,OAAQ,CACNpsC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CAAEprC,QAASiB,IAAQC,KAAK,KAAMO,MAAOwpC,KAEnD,2BAA4B,CAC1BhsC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CAAEprC,QAASiB,IAAQ+qC,OAAO,KAAMvqC,MAAOwpC,IACnD3oC,KAAMgpC,KAER,kBAAmB,CACjBrsC,MAAOvB,EAAE,kBAAmB,mBAC5B0tC,WAAY,CACVprC,QAASiB,IAAQC,KAAK,KACtBO,MAAOghC,aAAQ,MAGnB,kBAAmB,CACjBxjC,MAAOvB,EAAE,kBAAmB,mBAC5B0tC,WAAY,CACVprC,QAASmkC,GACT1iC,MAAOghC,aAAQ,MAGnB,sBAAuB,CACrBxjC,MAAOvB,EAAE,sBAAuB,uBAChC0tC,WAAY,CACVvrC,MAAOoB,IAAQ8qC,MACf/rC,QAASiB,IAAQo8B,KAAK,KACtB57B,MAAOghC,aAAQ,MAGnB,oBAAqB,CACnBxjC,MAAOvB,EAAE,oBAAqB,qBAC9B0tC,WAAY,CACVprC,QAASiB,IAAQgrC,IAAI,KACrBxqC,MAAOghC,aAAQ,MAGnByJ,SAAU,CACRjtC,MAAOvB,EAAE,WAAY,YACrB0tC,WAAY,CACVprC,QAASmkC,GACT1iC,MAAOwpC,KAGXQ,QAAS,CACPxsC,MAAOvB,EAAE,UAAW,WACpB0tC,WAAY,CACVprC,QAASiB,IAAQgrC,IAAI,KACrBxqC,MAAOwpC,IAET3oC,KAAMgpC,KAER,oBAAqB,CACnBrsC,MAAOvB,EAAE,oBAAqB,qBAC9B0tC,WAAY,CACVvrC,MAAOoB,IAAQ2gC,MACf5hC,QAASiB,IAAQgrC,IAAI,KACrBxqC,MAAOghC,aAAQ,MAGnBiJ,UAAW,CACTzsC,MAAOvB,EAAE,YAAa,aACtB0tC,WAAY,CACVvrC,MAAOoB,IAAQ8qC,MACf/rC,QAASiB,IAAQ6gC,QAAQ,IACzBrgC,MAAOwpC,KAGXU,OAAQ,CACN1sC,MAAOvB,EAAE,SAAU,UACnB0tC,WAAY,CAAEprC,QAASiB,IAAQo8B,KAAK,KAAM57B,MAAOwpC,KAEnDW,UAAW,CACT3sC,MAAOvB,EAAE,YAAa,aACtB0tC,WAAY,CACVvrC,MAAOoB,IAAQ8qC,MACf/rC,QAASiB,IAAQo8B,KAAK,KACtB57B,MAAOwpC,KAGX,qBAAsB,CACpBhsC,MAAOvB,EAAE,qBAAsB,sBAC/B0tC,WAAY,CACVprC,QAASiB,IAAQgrC,IAAI,KACrBxqC,MAAOghC,aAAQ,MAGnBoJ,WAAY,CACV5sC,MAAOvB,EAAE,aAAc,cACvB0tC,WAAY,CACVvrC,MAAOoB,IAAQ8qC,MACf/rC,QAASiB,IAAQo8B,KAAK,KACtB57B,MAAOwpC,OFpGmCkB,CAA6BzuC,EAAE,EGOpEg/B,GAA8D79B,IAIpE,IAADutC,EAAA,IAJsE,aAC1E12B,EAAY,kBACZknB,KACGyP,GACJxtC,EACC,MAAM,KAAE+lC,GAASvlC,eACjB,IAAIyH,EAAS2O,GAAUC,GAAgB,UAAgC,QAAvB02B,EAAe,OAAZ12B,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,cAAM,IAAAslC,IAAI,MCrB3E12B,KAEA,QAAqB3I,IAAjB2I,EAA4B,OAAO,EACvC,QAAmC3I,KAAnB,OAAZ2I,QAAY,IAAZA,OAAY,EAAZA,EAAcpO,cAA4B,OAAO,EAErD,MAAMglC,GACH,IAAIlpC,KAAKsS,EAAapO,cAAcy1B,WAAY,IAAI35B,MAAO25B,WAAS,MAGvE,MAAyC,QAAlCrnB,EAAa3O,iBAChBulC,GAAoB,GAAKA,EAAmB,EAC5CA,GAAoB,GAAKA,EAAmB,CAAC,EDY7CC,CAAkB72B,IAA0C,YAAb,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,UACnDA,EAAS,4BAEX,MAAM,MAAE7H,EAAK,WAAEmsC,EAAU,KAAE9oC,GAAS4oC,GAAwBtG,GAAM99B,GAElE,OACE1G,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACosC,IAAK,CACJ9Q,QAAQ,OACRt5B,WAAW,SACXD,eAAe,SACf1B,SAAS,KACT0C,GAAI,EACJ,cAAaiS,QAAQwnB,MACjBwO,KACAiB,EAAgB/rC,SAAA,CAEnBrB,EACAqD,GAAQ/B,cAACgC,IAAI,CAACmiC,GAAI,EAAGrjC,GAAIiB,OAE3Bs6B,EAAoBr8B,cAAC2yB,KAAc,CAAA5yB,SAAEs8B,IAAsC,OAC3E,EE3BM6P,GAAwC5tC,IAS9C,IAAD6tC,EAAAC,EAAA,IATgD,WACpDC,EAAU,iBACVC,EAAgB,eAChBC,EAAc,eACdC,EAAc,aACdC,EAAY,SACZC,EAAQ,cACRC,EAAyB,YACzBC,GACDtuC,EACC,MAAM,EAAEnB,GAAMC,YAAe,UACvB2B,EAAWC,cAEX6tC,EAAQ,IAAIhqC,KAAK,cACjByR,EAAM,IAAIzR,MAETyZ,EAAWwwB,GAAgBjnB,mBAChB,OAAhBymB,QAAgB,IAAhBA,IAAoBv/B,aAAQ,IAAIlK,MAAS,KAEpC0Z,EAASwwB,GAAclnB,mBAA6B,OAAd0mB,QAAc,IAAdA,IAAkB,IAAI1pC,MAC7DmqC,EAAmB9vC,IAEnB+vC,EAAmBA,CAACrvC,EAAkCsvC,KAC1D,GAAItvC,IAAS6X,aAAQ7X,GACnB,OAAQsvC,GACN,IAAK,OACHJ,EAAalvC,GACb4uC,GAAkBA,EAAe5uC,GACjC,MACF,IAAK,KACHmvC,EAAWnvC,GACX6uC,GAAgBA,EAAa7uC,GAGnC,EASF,OACEiC,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACdssC,GAA6B,KAAfA,GACbrsC,cAAA,KAAAD,SACEC,cAAA,UAAAD,SAASssC,MAGbrsC,cAAC4yB,IAAY,CAACua,KAAK,WAAUptC,SAC3BC,cAAC6yB,IAAI,CAAC9vB,GAAG,oBAAoB+vB,cAddC,KACnByZ,GAAkBA,EAAelwB,GACjCmwB,GAAgBA,EAAalwB,GACrB,OAARmwB,QAAQ,IAARA,MAAY,EAWiD3sC,SACvDF,eAAC8B,IAAI,CAACM,QAAS,EAAElC,SAAA,CACfF,eAAC+7B,IAAW,CAACwR,WAAYruC,EAASgB,SAAA,CAChCF,eAACq7B,IAAS,CAACn4B,GAAG,kBAAiBhD,SAAA,CACf,OAAb4sC,QAAa,IAAbA,IAAiBxvC,EAAE,wBAAyB,QAAQ,OAEvD6C,cAACqtC,IAAU,CACT,kBAAgB,kBAChB/vC,WAAY0vC,EAAiB1vC,WAC7BgwC,gBAAiBN,EAAiBxvC,gBAClC+vC,QAASV,EACTW,QAAgB,OAAPjxB,QAAO,IAAPA,IAAWjI,EACpBm5B,mBAAoB,CAClBZ,EAAM7lC,cACgB,QADHmlC,EACZ,OAAP5vB,QAAO,IAAPA,OAAO,EAAPA,EAASvV,qBAAa,IAAAmlC,IAAI73B,EAAItN,eAEhCksB,SAAWt1B,GAAkBqvC,EAAiBrvC,EAAc,QAC5Dgf,SAAUN,EACVoxB,gBAAiB,CACfC,gBAAiB,CACfhlC,SAAS,IAGbmhC,KAAM,EACNhoC,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,cAG3B16B,eAAC+7B,IAAW,CAAA77B,SAAA,CACVF,eAACq7B,IAAS,CAACn4B,GAAG,gBAAehD,SAAA,CACf,OAAX6sC,QAAW,IAAXA,IAAezvC,EAAE,sBAAuB,MAAM,IAAE,OAEnD6C,cAACqtC,IAAU,CACT,kBAAgB,gBAChB/vC,WAAY0vC,EAAiB1vC,WAC7BgwC,gBAAiBN,EAAiBxvC,gBAClC+vC,QAAkB,OAATjxB,QAAS,IAATA,IAAauwB,EACtBW,QAASl5B,EACTm5B,mBAAoB,CACM,QADNrB,EACT,OAAT9vB,QAAS,IAATA,OAAS,EAATA,EAAWtV,qBAAa,IAAAolC,IAAIS,EAAM7lC,cAClCsN,EAAItN,eAENksB,SAAWt1B,GAAkBqvC,EAAiBrvC,EAAc,MAC5Dgf,SAAUL,EACVmxB,gBAAiB,CACfC,gBAAiB,CACfhlC,SAAS,IAGbmhC,KAAM,EACNhoC,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,uBAM5B,EChHEqT,GAAuDtvC,IAM7D,IAN8D,eACnEwrB,EAAc,gBACdzE,EAAe,cACfC,EAAa,SACbuoB,EAAQ,wBACRC,GACDxvC,EACC,MAAOsZ,EAAYyU,GAAiB6F,YAAe7M,IAC5CxN,EAAUk2B,GAAe7b,YAAe5M,GAEzC0oB,EAAWC,IAA2B,IAADC,EAEvCD,IAAkBr2B,GAClBq2B,GAAiB,GACjBA,IAA4C,QAA/BC,EAAmB,OAAdpkB,QAAc,IAAdA,OAAc,EAAdA,EAAgBqkB,kBAAU,IAAAD,IAAI,KAEhD7hB,EAAc4hB,GACF,OAARJ,QAAQ,IAARA,KAAU9I,SACZ/wB,OAAOo6B,SAAS,CAAEhS,IAAKyR,EAAS9I,QAAQsJ,UAAYP,IAExD,EAWIQ,GAAiC,OAAdxkB,QAAc,IAAdA,OAAc,EAAdA,EAAgBqkB,aAAc,EAEvD,OACEnuC,cAAA0yB,WAAA,CAAA3yB,SACG+pB,GAAkBA,EAAe0C,YAAc,IAC9CxsB,cAACuuC,KAAe,CACdC,UAAWF,EACXG,UAAW72B,EAAa,EACxBC,SAAUA,EACVk2B,YAAaA,EACbW,aAjBaA,IAAMV,EAAQp2B,EAAa,GAkBxC+2B,SAnBSA,IAAMX,EAAQp2B,EAAa,GAoBpCg3B,SAjBUv0B,IAChB,MAAMw0B,EAAwB,kBAAVx0B,EAAqBA,EAAQA,EAAMzC,GACvDo2B,EAAQa,EAAO,EAAE,EAgBXC,YAAa,MAGhB,ECtDMC,GAAiDzwC,IAAkB,IAAjB,QAAE+0B,GAAS/0B,EACxE,OACE0B,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAC07B,IAAI,CAACrK,EAAG,CAAEiJ,KAAM,EAAGyM,GAAI,GAAKvnC,OAAQ,EAAGm8B,UAAU,SAAQ57B,SACvDszB,KAEF,ECAMsT,GAA8DroC,IAQpE,IARqE,cAC1EsoC,EAAa,SACb7mC,EAAQ,aACRivC,EAAY,aACZC,EAAY,WACZC,GAAa,EAAI,SACjBC,GAAW,EAAK,WAChBC,GACD9wC,EACC,MAAM,IAAEO,GAAQC,gBACTuwC,EAAcC,GAAmBzpB,mBAAiB,OAAR9lB,QAAQ,IAARA,OAAQ,EAARA,EAAU4Q,aACpD4+B,EAAeC,GAAoB3pB,mBAASwpB,IAC5CI,EAAYC,GAAiB7pB,mBAASspB,IAEvC,EAAEhyC,GAAMC,YAAe,6BACvBuyC,EAAgCC,aAAmBhJ,IAAkB,GAErEt+B,EAAOmnC,EAAaJ,EAAeE,EAAgB,MACnDM,EAAuB,OAAZZ,QAAY,IAAZA,IAAgB9xC,EAAE,YAAa,aAC1C2yC,EAAuB,OAAZd,QAAY,IAAZA,IAAgB7xC,EAAE,YAAa,aAC1C4yC,EAAaN,EAAaK,EAAWD,EACrCG,GAAiC,OAAZX,QAAY,IAAZA,OAAY,EAAZA,EAAc3+B,SAAU,EAOnDo0B,qBAAU,KACR,MAAMmL,EAAkB,OAARlwC,QAAQ,IAARA,OAAQ,EAARA,EAAU4Q,WAC1B2+B,EAAgBW,GAChBT,EAAwB,OAAPS,QAAO,IAAPA,OAAO,EAAPA,EAAS3jC,MAAM,EAAGqjC,IACnCD,EAAcP,EAAS,GACtB,CAACpvC,EAAU4vC,EAA+BR,IAE7C,MAAMe,EAAcC,GAClBnwC,cAACoC,IAAG,CAACguC,SAAS,MAAMztC,WAAW,SAASzC,SAAS,KAAIH,SAClDowC,IAIL,OAAIH,GAAsBL,EACjBO,EAAWb,GAIlBxvC,eAAC8B,IAAI,CACHC,eAAe,gBACfC,WAAY,CAAEy4B,KAAM,QAASC,GAAI,UACjC0J,cAAe,CAAE3J,KAAM,SAAUC,GAAI,OAAQx6B,SAAA,CAE5CmwC,EAAW5nC,GACX4mC,GACClvC,cAACqwC,IAAI,CACH9uC,QAAUinC,IACRA,EAAEhmC,kBA/BVktC,GAAeY,IAAoBA,IACzB,OAAVlB,QAAU,IAAVA,MA+B+B,EAEzBzT,UAAW,CAAErB,KAAM,SAAUC,GAAI,WACjCr6B,SAAUrB,EAAI,CAAEM,GAAI,WAAa,UACjC60B,GAAI,CAAEsG,KAAM,EAAGC,GAAI,GAAIx6B,SAEtBgwC,MAGA,E,cC7DJ,MAAMQ,GAA0CjyC,IAAqC,IAApC,aAAEkyC,EAAY,aAAEC,GAAcnyC,EACpF,MAAM,EAAEnB,GAAMC,YAAe,gBACvBixB,EAAmBtwB,IAEzB,OACE8B,eAAC67B,IAAI,CACHrK,EAAG,EACH2C,GAAI,EACJmH,QAAS,CAAEb,KAAM,OAAQyM,GAAI,QAC7B2J,aAAa,SACbzuC,QAAS,CAAEq4B,KAAM,EAAGyM,GAAI,GACxBnlC,eAAe,gBAAe7B,SAAA,CAE9BF,eAACuC,IAAG,CAAC+4B,QAAS,CAAEb,KAAM,OAAQyM,GAAI,QAAU9kC,QAAS,EAAElC,SAAA,CACrDF,eAAA,UAAAE,SAAA,CAAS5C,EAAE,WAAY,YAAY,OACnC0C,eAAC+iC,KAAIuE,KAAI,CAAChM,QAAQ,OAAOt5B,WAAW,SAAQ9B,SAAA,CAC1CC,cAAC2nC,KAAU,CAACznC,SAAS,SAAS0C,GAAI,EAAE7C,SAClCC,cAAC2wC,KAAQ,CAACC,SAAUJ,EAAaK,KAAKntC,SAExC1D,cAAC4iC,KAAIuE,KAAI,CAAApnC,SAAEywC,EAAaK,KAAK7tC,aAGjCnD,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfF,eAAA,UAAAE,SAAA,CAAS5C,EAAE,OAAQ,QAAQ,OAC3B6C,cAAC2nC,KAAU,CAAA5nC,SAAE6S,GAAY49B,EAAaK,KAAKpwC,WAE7CZ,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfF,eAAA,UAAAE,SAAA,CAAS5C,EAAE,WAAY,YAAY,OACnC6C,cAAC2nC,KAAU,CAAA5nC,SACRsuB,EAAiBmiB,EAAaM,aAAcpzC,EAAoBG,kBAGrEgC,eAACyzB,IAAI,CACHrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,IACxBh5B,QAASA,IAAkB,OAAZkvC,QAAY,IAAZA,OAAY,EAAZA,EAAeD,GAC9B3vC,GAAI,CAAE6oC,OAAQ,WAAY3pC,SAAA,CAE1BC,cAACqwC,IAAI,CAAAtwC,SAAE5C,EAAE,SAAU,YACnB6C,cAAC+wC,IAAO,CAACzxC,MAAOoB,IAAQC,KAAK,YAE1B,ECtCEqwC,GAAgD1yC,IAGtD,IAHuD,eAC5D2yC,EAAc,SACdC,GACD5yC,EACC,MAAM,EAAEnB,GAAMC,YAAe,eAE7B,OACEyC,eAACk/B,KAAK,CAAC5B,SAAU8T,EAAgB7T,QAASA,IAAM,KAAM+T,YAAU,EAAApxC,SAAA,CAC9DC,cAACg/B,KAAY,IACbh/B,cAACi/B,KAAY,CAACmS,GAAI,CAAE9W,KAAM,GAAIC,GAAI,GAAIx6B,SACpCC,cAACo+B,KAAS,CAAAr+B,SACRF,eAACyzB,IAAI,CAACyN,GAAI,GAAGhhC,SAAA,CACXC,cAAC2nC,KAAU,CAAC,cAAY,OAAOhM,UAAU,SAAS3I,GAAI,GAAGjzB,SACvDC,cAAA,MAAAD,SAAK5C,EAAE,sBAAuB,8BAEhC6C,cAACqxC,KAAQ,CACP,cAAY,OACZC,YAAY,UACZ3P,aAAc,EACdtnB,MAAO62B,EAASK,UAElB1xC,eAAC8nC,KAAU,CAAC,cAAY,OAAOxM,QAAQ,OAAOv5B,eAAe,gBAAe7B,SAAA,CAC1EF,eAAC+iC,KAAIvR,EAAC,CAAAtxB,SAAA,CACH5C,EAAE,WAAY,YAAY,IAAE+zC,EAASK,QAAQ,OAEhD1xC,eAAC+iC,KAAIvR,EAAC,CAAAtxB,SAAA,CACH6S,GAAYs+B,EAASM,eAAe,IAAEr0C,EAAE,KAAM,MAAO,IACrDyV,GAAYs+B,EAASO,2BAM1B,EC5CNC,GAAwB50C,uCAOxB60C,GAAuC,CAC3CJ,QAAS,EACTC,cAAe,EACfC,WAAY,G,OCXd,MAAMG,GAAaC,KAAOC,GAAExO,QAAAC,aAAA,0IAYfwO,GAA4BA,KACvC,MAAM,EAAE50C,GAAMC,YAAe,eAC7B,OACE4C,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPuhB,MAAO3qB,EAAE,oBAAqB,2BAC9BiG,YACEvD,eAAC+xC,GAAU,CAAA7xC,SAAA,CACTF,eAAA,MAAAE,SAAA,CACG5C,EAAE,+BAAgC,sBAAsB,KAAG,IAC3DoV,GAAwB,QAG3B1S,eAAA,MAAAE,SAAA,CACG5C,EAAE,kCAAmC,iBAAiB,MvLzBrC,GuLyByD,IAC1EA,EAAE,mCAAoC,eAEzC0C,eAAA,MAAAE,SAAA,CACG5C,EAAE,mCAAoC,gBAAgB,MtLxBnCL,sHsL4B1BgF,EAAE,OACFujC,UAAU,2BACV,ECxBO2M,GAAqE1zC,IAO3E,IAP4E,SACjFyB,EAAQ,SACRkyC,EAAQ,kBACRC,EAAiB,iBACjBC,EAAgB,oBAChBC,GAAsB,KACnBC,GACJ/zC,EACC,MAAM,EAAEnB,GAAMC,YAAe,eACvB82B,EAASC,gBAET,aAAEme,EAAY,gBAAEC,EAAe,mBAAEC,GCZVC,MAC7B,MAAOH,EAAcC,GAAmB1sB,qBAElC2sB,EAA2En1C,uBAC9Eq1C,GACCH,GAAiBI,IACf,MAAMC,EAA4B,oBAAVF,EAA4B,OAALA,QAAK,IAALA,OAAK,EAALA,EAAQC,GAAiBD,EACxE,OAAKE,EACE,IAAKD,GAAiB,MAAQC,GADfD,CACwB,KAElD,IAGF,MAAO,CACLL,eACAC,kBACAC,qBACD,EDL6DC,IAExD,MAAEC,EAAK,SAAExB,EAAQ,WAAE2B,EAAU,WAAEC,GFAVx0C,KAGmB,IAHlB,iBAC5By0C,EAAgB,eAChBC,GACmB10C,EACnB,MAAM20C,EAASC,eAERhC,EAAUiC,GAAettB,mBAA6B8rB,KACtDe,EAAOU,GAAYvtB,qBAyD1B,MAAO,CACLgtB,WAxDiBvrB,eACjBupB,EACAqB,GAEmB,IADnBmB,EAAqBtgC,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,IAAAA,UAAA,GAErBqgC,EAAS,CAACvC,IAEV,MAAMyC,EAAsC,CAC1C5B,yBACAb,OACAqB,oBACAqB,SAAU,CAAEC,SAAU3C,EAAKntC,MAC3B2vC,yBAGI5B,EIxDoBiB,IAC5BA,EAAM58B,QAAO,CAAC29B,EAAWC,IAAgBD,EAAYC,EAAYjzC,MAAM,GJuDlDkzC,CAAc,CAAC9C,IAE5B+C,EAAgB,CACpBC,yBAA2BC,IACzBX,EAAY,CACV5B,QAASuC,EACTtC,cAAeC,GAAcqC,EAAa,KAC1CrC,WAAYA,GACZ,GAIN,IACE,GAAIA,EAAal/B,GACf,MAAM,IAAIwhC,MAEZZ,EAAYxB,IACZ,MAAMqC,QAAYf,EAAOJ,WAAWS,EAAeM,GACnDR,OAAS5mC,GACO,OAAhBumC,QAAgB,IAAhBA,KAAmB,CAAC,CAAElC,OAAMmD,MAAKlD,aAAc,IAAIjuC,QACnDswC,EAAYxB,GACd,CAAE,MAAO/gB,GACPwiB,OAAS5mC,GACT2mC,EAAYxB,IACE,OAAdqB,QAAc,IAAdA,MACF,CACF,EAgBEF,WAdkBkB,GAClB3qB,MAAM,GAADxsB,OAAIC,6EAAkC,uBAAuB,CAChE+rB,OAAQ,SACRV,QAAS,CACP,eAAgB,oBAElBS,KAAM7d,KAAKC,UAAU,CACnB0mC,yBACAsC,UAOJtB,QACAxB,WACD,EErEmD+C,CAAc,CAChElB,iBAAmBmB,IACbjC,EACFO,EAAmB0B,GAEnB3B,EAAgB2B,GAElBhgB,EAAO,CACLnxB,GAAI,uBACJ+kB,MAAO3qB,EAAE,sBAAuB,kCAChCg4B,SAAUx4B,GACV,EAEJq2C,eAAgBA,KACd9e,EAAO,CACLnxB,GAAI,4BACJ+kB,MAAO3qB,EAAE,oBAAqB,2BAC9BiG,YAAajG,EACX,gCACA,+CAEFg4B,SAAUx4B,EACV4J,OAAQ,SACR,IAIA4tC,EAAap0C,GACjBF,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAAC+iC,KAAIuE,KAAI,CAAChM,QAAS,CAAEb,KAAM,OAAQC,GAAI,WAAYx6B,SAAA,CAChD5C,EAAE,yBAA0B,2BAC7B6C,cAAC4iC,KAAIuE,KAAI,CAAC7nC,MAAOoB,IAAQC,KAAK,KAAM26B,WAAW,WAAW6I,GAAI,IAAIpkC,SAC/D5C,EAAE,SAAU,eAGjB6C,cAAC4iC,KAAIuE,KAAI,CAAChM,QAAS,CAAEb,KAAM,UAAWC,GAAI,QAASx6B,SAChD5C,EAAE,mBAAoB,sBACb,OAMhB,OAFA2nC,qBAAU,IAAsB,OAAhBqN,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAmBG,IAAe,CAACA,EAAcH,IAG/DtyC,eAAC+iC,KAAI3G,IAAG,CAACj7B,GAAI,EAAEjB,SAAA,CACA,OAAZuyC,QAAY,IAAZA,OAAY,EAAZA,EAAcnxC,KAAK0vC,GAClB7wC,cAACuwC,GAAW,CAEVC,aAAcK,EACdJ,aAAe2D,GACbtB,EAAWjC,EAAKmD,KAAK3jC,MAAK,IACxBkiC,GAAiB8B,GACF,OAAbA,QAAa,IAAbA,OAAa,EAAbA,EAAez+B,QAAQ0+B,GAAMA,EAAEN,MAAQI,EAAWJ,WALnDnD,EAAKmD,QAYX9B,IAAsBD,GAAyB,OAAZK,QAAY,IAAZA,KAAc5hC,OAWhD,KAVF7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACu0C,IAAQ,CACPxyC,KAAM/B,cAACw0C,IAAgB,IACvBthB,SAAW2d,GAASgC,EAAWhC,EAAK,GAAIqB,GAAmB,MACvDG,EAAatyC,SAEhBo0C,IAEF/B,GAAuBpyC,cAAC+xC,GAAe,OAI5C/xC,cAACgxC,GAAc,CAACC,eAAgByB,EAAOxB,SAAUA,MACzC,EGtFDuD,GAAsDn2C,IAY5D,IAZ6D,SAClEo2C,EAAQ,aACRC,EAAY,WACZC,EAAU,SACVC,EAAQ,KACRnxC,EAAI,MACJhF,EAAK,YACLg1B,EAAW,aACXohB,EAAY,UACZC,EAAS,SACTjX,GAAW,EAAK,WAChBkX,EAAa,IACd12C,EACC,MAAM22C,EAAsB7oB,YAAeuoB,GACrCO,EAAiB5oB,YAAkBsoB,IAClCv6B,EAAO86B,GAAYtvB,mBAAiB6uB,IACpCU,EAAgBC,GAAqBxvB,oBAAkB,GAqB9D,OAVAif,qBAAU,KACJmQ,IAAwBJ,GACd,OAARH,QAAQ,IAARA,KAAUhkC,SACZwkC,EAAeR,GACfS,EAAST,GACLK,GAAWM,GAAmBN,EAAUL,IAEhD,GACC,CAACA,EAAUO,EAAqBJ,EAAUK,EAAgBH,IAEtDE,IAAwBJ,EAC7Bh1C,eAAC+7B,IAAW,CACV16B,MAAM,OACNo0C,UAAWF,IAAmBtX,EAC9Br7B,SAAS,WACT25B,IAAK,EAAEr8B,SAAA,CAEPF,eAACq7B,IAAS,CAACqa,QAAO,GAAA14C,OAAK6G,EAAI,UAAS3D,SAAA,CAAErB,EAAM,OAC5CsB,cAACw1C,IAAK,CACJzyC,GAAE,GAAAlG,OAAK6G,EAAI,UACXA,KAAMA,EACNxC,MAAM,OACNmZ,MAAOA,EACP6Y,SAhCiBsV,IACrB2M,EAAS3M,EAAE5U,OAAOvZ,MAAM,EAgCpBo7B,OA7BgBC,KACpBR,EAAe76B,GACX06B,GAAWM,GAAmBN,EAAU16B,GAAO,EA4B/C2Y,GAAI,EACJU,YAAaA,EACboK,SAAUA,EACV,cAAakX,IAEfh1C,cAAC21C,IAAgB,CAACv1C,KAAK,QAAQw1C,SAAU,EAAE71C,SACxC+0C,OAIL90C,cAAC6zB,KAAI,CAAA9zB,SAAE20C,GACR,EChFUmB,GAA0BC,GACrC91C,cAAA,QAAM+1C,MAAO,CAAE70C,MAAO,EAAG9B,OAAQ,EAAGqD,SAAU,WAAYqnC,KAAM,WAAY/pC,SACzE+1C,ICOQE,GAA4D13C,IAKlE,IALmE,MACxEI,EAAK,YACLu3C,EAAW,QACXC,EAAO,aACPC,GACD73C,EACC,MAAOwoB,EAAcsvB,GAAmBlkB,YAAe+jB,GAMvD,OAJAnR,qBAAU,KACJqR,GAAcC,EAAgBD,EAAa,GAC9C,CAACC,EAAiBD,IAGnBt2C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACk7B,IAAS,CAACqa,QAASW,EAASljB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SACxDrB,IAEHsB,cAACooC,IAAQ,CACPE,UAA0C,SAA/BxhB,EAAa0U,cACxBtI,SAAUA,IACRkjB,EAA+C,SAA/BtvB,EAAa0U,cAA2B,QAAU,YAGrE,ECtBM6a,GAA4D/3C,IAMlE,IANmE,QACxEC,EAAO,MACPG,EAAK,YACLu3C,EAAW,QACXC,EAAO,aACPC,GACD73C,EACC,MAAOwoB,EAAcsvB,GAAmBlkB,YAAe+jB,GAMvD,OAJAnR,qBAAU,KACJqR,GAAcC,EAAgBD,EAAa,GAC9C,CAACC,EAAiBD,IAGnBt2C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACk7B,IAAS,CAACqa,QAASW,EAASljB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SACxDrB,IAEHsB,cAACs2C,KAAM,CACLJ,QAASA,EACThjB,SAAW7Y,GAAU+7B,EAAgB/7B,GACrC87B,aAA0B,OAAZA,QAAY,IAAZA,IAAgBrvB,EAC9BjmB,GAAIqjC,GACJ,aAAW,gBAAenkC,SAEzBxB,EAAQ4C,KAAKC,GACZpB,cAAA,UAA2Bqa,MAAOjZ,EAAOiZ,MAAMta,SAC5CqB,EAAO1C,OADG0C,EAAOiZ,aAKvB,ECtBMsS,GAAiBA,KAC5B,MAAM1Y,EAAWwwB,cACX5C,EAAkBC,eAClBrW,EAAcC,cAEdiV,EAAgBvU,YAAepR,IAC/BokB,EAAYhT,YAAerR,IAC3BokB,EAAU/S,YAAevR,IACzB07B,EAAcnqB,YAAetR,IAC7BslB,EAAqBhU,YAAenR,KAEpC,oBAAEic,EAAmB,yBAAEG,GAA6BV,MAEpD,UAAE6f,GCZR3U,KAEA,MAAM4U,EAAiBnqB,YAAkB9R,IACnCk8B,EAAUpqB,YAAkB7R,IAC5Bk8B,EAAWrqB,YAAkB5R,IAC7Bk8B,EAAqBtqB,YAAkB3R,IACvCk8B,EAA2BvqB,YAAkB1R,IAC7Ck8B,EAAaxqB,YAAkBzR,IAC/Bk8B,EAAiBzqB,YAAkBxR,IACnCk8B,EAAe1qB,YAAkBvR,IAEvC,OAAO3K,aAAS,CAAC1C,GAAeI,wBAAyBA,GAAwB,IAC5EoC,GACH0b,UAAUpiB,GACRitC,EAAejtC,EAAST,aACxB2tC,EAAQltC,EAASxG,MACjB2zC,EAASntC,EAASoB,OAClBgsC,EAAmBptC,EAASytC,iBAC5BJ,EAAyBrtC,EAAS0tC,uBAClCJ,EAAWttC,EAAS2tC,aAAentC,GAAWC,OAC9C8sC,EAAevtC,EAAS2tC,aAAentC,GAAWE,WAClD8sC,EAAaxtC,EAAS2tC,aAAentC,GAAWG,QAClD,EACAxB,QAASk5B,GACT,EDZoBuV,CAAuBvV,IAEvC,WAAE9I,EAAU,cAAES,EAAa,iBAAED,EAAgB,yBAAEE,GACnDhB,GAAcxkB,EAASuwB,WAElB6S,EAAwBC,GAA6BzxB,oBAAkB,IACvE0xB,EAAuBC,GAA4B3xB,oBAAkB,GA+C5E,OA7CAif,qBAAU,KACJjD,IAAoBlB,GACtBlV,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeI,yBAA0B,GACrF,CAAC+zB,EAAiBlB,EAAelV,IAEpCqZ,qBAAU,KACJ/L,GAAc4H,IACZvB,EAAW/H,IACN+I,GAAoBlJ,IAC/B,GACC,CACDyJ,EACA5H,EACAqG,EACAgB,EACAlJ,EACAG,IAGFyN,qBAAU,KACR,MAAM2S,EAA4Bje,GAAiBC,EAGpC6d,IAAXlY,IACKD,GAAoCsY,EACpClB,GACoBkB,IALGle,EAMDR,IAAe8I,GAAgB,GAC7D,CACDrI,EACAD,EACA6F,EACAD,EACAoX,EACAxd,EACA8I,EACApI,IAGFqL,qBAAU,KACR0S,EACEhB,IAAe7V,GAAiBkB,GAAqBlB,GAAiB5H,EACvE,GACA,CAACyd,EAAW7V,EAAekB,EAAiB9I,IAExC,CACLse,yBACAE,wBACD,EEhFUG,GAAmBp5C,IAAmB,IAAlB,SAAEyB,GAAUzB,EAC3C,MAAM,EAAEnB,GAAMC,YAAe,UACvB6W,EAAWwwB,cACX5C,EAAkBC,gBAElB,uBAAEuV,EAAsB,sBAAEE,GAA0B5qB,MAEpD,iBAAEiN,EAAgB,WAAEb,EAAU,YAAEc,GAAgBpB,GAAcxkB,EAASuwB,WACvE,eAAEzN,GAAmBJ,KACrBghB,EAAmB/d,EAAmB,IAAM,GAuClD,OArCAge,2BAAgB,IAAMrpB,SAASspB,gBAAgBzJ,SAAS,EAAG,IAAI,CAACn6B,EAASuwB,WAEzEoT,2BAAgB,KACV/d,GAAegI,GAAiB9K,GAAgB,GACnD,CAAC8K,EAAiB9I,EAAYhC,EAAgB8C,IAEjDiL,qBAAU,KACR,MAAMgT,EAAiBv1C,IAA0B,IAADw1C,EAE9C,GAAiC,OAApB,QAATA,EAAAx1C,EAAMyO,WAAG,IAAA+mC,OAAA,EAATA,EAAWvc,gBAGVj5B,EAAMqxB,OAAuBokB,SACY,UAAzCz1C,EAAMqxB,OAAuBokB,SACY,aAAzCz1C,EAAMqxB,OAAuBokB,QAC9B,CACAz1C,EAAM01C,iBAEN,MAAMC,EAAc3pB,SAAS4pB,eAAe,QAExCD,IACGA,EAAYE,aAAa,aAC5BF,EAAYG,aAAa,WAAY,MAEvCH,EAAYlT,QAEhB,CACF,EAKF,OAFAzW,SAAS+pB,iBAAiB,UAAWR,GAE9B,KACLvpB,SAASgqB,oBAAoB,UAAWT,EAAc,CACvD,GACA,IAGDj4C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACokC,GAAM,CAACnwB,SAAUA,EAASuwB,SAAU3C,gBAAiBA,IACtD7hC,cAACoC,IAAG,CACFo2C,GAAI,CAAEle,KAAM,GAAIC,GAAIod,GACpBvG,GAAI,CAAE9W,KAAM,EAAGC,GAAI,GACnB6G,UAAU,sBAAqBrhC,SAE/BC,cAACoC,IAAG,CAACW,GAAG,OAAO/B,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GAAIx6B,SACnCs3C,EACCt3C,EAEAC,cAACy4C,IAAM,CAAA14C,SACJw3C,EACCv3C,cAAC04C,IAAe,CAACj4C,KAAK,OAEtBT,cAACoC,IAAG,CACFK,SAAS,WACT25B,IAAK,CAAE9B,KAAM,OAAQ2C,GAAG,GAADpgC,OAAK,GAAK86C,EAAgB,OAAO53C,SAExDC,cAAC0+B,IAAgB,CACfn4B,OAAO,QACPnD,YAAajG,EACX,gBACA,2DAShB6C,cAAC24C,GAAS,MACT,E,aC1EA,MAAMC,GACXt6C,IAQO,IAADu6C,EAAAC,EAAA,IARL,gBACCC,EAAe,iBACfC,GAAmB,EAAK,yBACxBC,GAA2B,EAAK,QAChC/C,EAAO,SACPpY,GAAW,EAAK,GAChBj9B,KACGmlC,GACJ1nC,EACC,MAAM,EAAEnB,GAAMC,YAAe,gBACrB4sB,KAAMkvB,GAAmBvsB,MAC1BwqB,EAAYgC,GAAiBjnB,YAAe6mB,GAC7CK,EAAa7U,kBAAO,GAE1BO,qBAAU,IACD,KACLsU,EAAWrU,SAAU,CAAK,GAE3B,IAEH,MAAMsU,EAAiD,CACrD,CAACrvC,GAAWC,OAAQ,CAClB9M,EAAE,qBAAsB,wBACxBA,EAAE,qBAAsB,qCACxBA,EAAE,qBAAsB,qCACxBA,EAAE,qBAAsB,wCAE1B,CAAC6M,GAAWE,WAAY,CACtB/M,EAAE,yBAA0B,qCAC5BA,EAAE,yBAA0B,yCAI1Bm8C,EAAsC,OAAdJ,QAAc,IAAdA,GAA2B,QAAbL,EAAdK,EAAgBK,mBAAW,IAAAV,OAAb,EAAdA,EAA6BjjC,QAAQD,GAAkB,IAAZA,EAAE0E,QAErEm/B,EAAmC,OAAdN,QAAc,IAAdA,GAA2B,QAAbJ,EAAdI,EAAgBK,mBAAW,IAAAT,OAAb,EAAdA,EAA6Bva,MACrD5oB,GAAMA,EAAE0E,QAAU88B,IAGfsC,EAAoBD,EACtBH,EAAoC,OAAlBG,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoB96C,YACtC8N,EAeJ,OACE3M,eAAA,OAAK,cAAY,mBAAkBE,SAAA,CAChCq5C,EAAWrU,QACVllC,eAACy2C,MAAM,CACLJ,QAASA,EACT77B,MAAO88B,EACPjkB,SAAW7Y,GAnBGA,KACpB,MAAMiwB,EAAqC,OAArBgP,QAAqB,IAArBA,OAAqB,EAArBA,EAAuB/a,MAAM1oB,GAASA,EAAKwE,SAAWA,IAEzE++B,EAAWrU,SACXuF,GACDoP,OAAOr/B,MAA6B,OAAlBm/B,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoBn/B,QAKxC8+B,EAAcO,OAAOr/B,GAAO,EASDgwB,CAAahwB,GAClCxZ,GAAIA,EACJi9B,SAAUA,EACV,aAAW,gCACPkI,EAAIjmC,SAAA,CAEPi5C,EACCh5C,cAAA,UAAkBqa,MAAO,EAAEta,SACxB5C,EAAE,MAAO,QADA,OAIZ6C,cAAA,UAAqBqa,MAAO,EAAEta,SAC3B5C,EAAE,yBAA0B,eADnB,UAKQ,OAArBm8C,QAAqB,IAArBA,OAAqB,EAArBA,EAAuBn4C,KAAKw4C,GAC3B35C,cAAA,UAAwBqa,MAAOs/B,EAAIt/B,MAAMta,SACtC45C,EAAIj7C,OADMi7C,EAAIt/B,YAKnB,KACH4+B,GAA4BQ,GAAqBD,EAChD35C,eAAC8B,KAAI,CAACX,GAAI,EAAGiM,UAAU,SAAQlN,SAAA,CAC7BF,eAACg0B,MAAI,CAACyH,WAAW,OAAMv7B,SAAA,CACpBy5C,EAAmB96C,MAAM,IAAEvB,EAAE,sBAAuB,OAAO,OAE7Ds8C,EAAkBt4C,KAAKkwB,GACtBxxB,eAACg0B,MAAI,CAAA9zB,SAAA,CAA0B,KAAGsxB,IAAC,GAAAx0B,OAArBw0B,EAAC,KAAAx0B,OAAIw0B,EAAE3gB,cAGvB,OACA,ECnGCkpC,GAA0Dt7C,IAMhE,IANiE,SACtEu7C,EAAQ,WACRC,EAAU,MACVptB,EAAK,SACLoR,EAAQ,gBACRic,GACDz7C,EACC,OACE0B,cAAA0yB,WAAA,CAAA3yB,SACgB,kBAAb85C,GACCh6C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC47B,IAAW,CAAC16B,MAAM,OAAMnB,SACvBC,cAACiqC,GAA6B,CAC5B,cAAY,aACZ+P,QAAQ,QACRt7C,MAAOo7C,EACPptB,MAAOA,EACP9Y,MAAOoG,GACP8jB,SAAUA,MAGdj+B,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAACqa,QAAQ,oBAAmBx1C,SAAA,CAAEg6C,EAAgB,OACxD/5C,cAAC44C,GAAgC,CAC/BG,gBAAiB9+B,GACjBg/B,0BAAwB,EACxB/C,QAAQ,oBACRpY,SAAUA,WAKjB,ECnCMmc,GAAmBA,KAC9B,MAAQnoB,OAAQ1K,EAAiBovB,UAAW0D,GCPZC,MAKhC,MAAM1uB,EAAcC,cACpB,OAAOC,aAAYvE,GAAiB,CAClCwE,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeK,iBAC1D0d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiB,2BAC1D8c,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAe+B,cAAe,GAE3E,EDLkE0qC,GAwBpE,MAAO,CACLC,WARiBA,CACjBjb,EACAkb,EACAzuB,EACA0uB,IAnBwBC,EACxBvwB,EACA4B,EACA0uB,KAEAlzB,EAAgB4C,EAAM,CACpB4B,UAAWA,KACTA,GAAW,EAEbwB,QAASA,KACPktB,GAAW,GAEb,EAQCC,CAAkBF,EAAMzuB,EAAW0uB,GAItCE,eAAgBN,EACjB,EExBUO,GAAsDn8C,IAK5D,IAL6D,WAClEyxC,EAAU,SACV8J,EAAQ,YACRa,EAAW,SACX5c,GAAW,GACZx/B,EACC,MAAM,EAAEnB,GAAMC,YAAe,gBACvB,eACJu9C,EAAc,cACdC,EAAa,UACbC,EAAS,cACTC,EAAa,YACbC,EAAW,aACXC,EAAY,WACZC,EAAU,aACVC,EAAY,WACZC,EAAU,YACVC,GCb6B98C,KAEuB,IAADu6C,EAAAC,EAAA,IAFrB,SAChCe,GACuBv7C,EACvB,MAAQ0rB,KAAMkvB,GAAmBvsB,MAC1BguB,EAAgBU,GAAqBx1B,oBAAkB,IACvD+0B,EAAeU,GAAoBz1B,oBAAkB,IACrDg1B,EAAWU,GAAgB11B,oBAAkB,IAC7Cu1B,EAAaI,GAAkBtpB,YAAepY,KAC9CqhC,EAAYM,GAAiBvpB,YAAenY,KAC5C2hC,GAAexpB,YAAelY,KAC9B2hC,EAAkBC,GAAuB1pB,YAAejY,IACzD4hC,EAAgBzvB,YAAelS,IAC/B4hC,EAAyBxvB,YAAkB9S,KAEzCsY,OAAQ5K,GAAoB6E,KAC9BgwB,EAAmBxhC,KACnByhC,EAAsC,kBAAbnC,EACzBoC,EAAmC,OAAd/C,QAAc,IAAdA,GAA2B,QAAbL,EAAdK,EAAgBK,mBAAW,IAAAV,GAErD,QAFqDC,EAA3BD,EAA6Bta,MACrD5oB,GAAMA,EAAEjX,QAAUsL,GAAWG,iBAC/B,IAAA2uC,OAFwC,EAAdA,EAExBz+B,MA6DH,OA3DAyqB,qBAAU,KACJkX,GAA0BC,GAC5BL,EAAoBK,EACtB,IAGFnX,qBAAU,KAENyW,EADES,EAEAjnC,GAAYomC,IAAe1mC,GAAa2mC,IAAgBc,aAAUP,GAIlE5mC,GAAYomC,IACV1mC,GAAa2mC,IACbM,EAAYhrC,OAAS,GACrBwrC,aAAUP,IACVA,EAAmB,EAEzB,GACC,CACDM,EACAd,EACAC,EACAO,EACAD,EACAM,EACAnC,IAgCK,CACLc,iBACAC,gBACAC,YACAC,cAjCqBtS,IACrB,MAAMnuB,EAAQmuB,EAAE5U,OAAOvZ,MACT,KAAVA,GAAcghC,GAAkB,GACpCG,EAAenhC,EAAM,EA+BrB0gC,YA5BkBA,KACE,KAAhBK,GAAoBC,GAAmB5mC,GAAa2mC,GAAa,EA4BrEJ,aAzBoBxS,IAEN,KADAA,EAAE5U,OAAOvZ,OACLihC,GAAiB,GACnCG,EAAcjT,EAAE5U,OAAOvZ,MAAM,EAuB7B4gC,WApBiBA,KACE,KAAfE,GAAmBG,GAAkBvmC,GAAYomC,GAAY,EAoBjED,aAjBmBA,KACF,eAAbrB,EACF3yB,EAAgB20B,EAAe,CAC7BjwB,UAAWA,KACTmwB,GAAkB,IAGjBD,GAAuB,EAAK,EAWnCX,aACAC,cACAM,cACAC,mBACD,ED/EGQ,CAAkB,CAAEtC,aACxB,OACE75C,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAC4yB,IAAY,CAAA7yB,SACXC,cAAC6yB,IAAI,CAAC9vB,GAAG,0BAA0B+vB,cAAeooB,EAAan7C,SAC7DF,eAACu8C,KAAK,CAACla,QAAS,CAAE5H,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACjCF,eAACu8C,KAAK,CAACla,QAAS,EAAGhhC,MAAM,OAAO+L,UAAW,CAAEqtB,KAAM,SAAUC,GAAI,OAAQx6B,SAAA,CACvEF,eAAC+7B,IAAW,CAAC16B,MAAM,OAAOo0C,UAAWsF,EAAc76C,SAAA,CACjDF,eAACq7B,IAAS,CAACqa,QAAQ,cAAax1C,SAAA,CAAE5C,EAAE,aAAc,QAAQ,OAC1D6C,cAACw1C,IAAK,CACJzyC,GAAG,cACHW,KAAK,OACLxC,MAAM,OACNmZ,MAAO8gC,EACPjoB,SAAU8nB,EACVvF,OAAQwF,EACRjoB,GAAI,EACJU,YAAav2B,EAAE,wBAAyB,aACxC2gC,SAAUA,IAEZ99B,cAAC21C,IAAgB,CAACv1C,KAAK,QAAQ,cAAY,eAAcL,SACtD5C,EAAE,aAAc,sCAGrB0C,eAAC+7B,IAAW,CAAC16B,MAAM,OAAOo0C,UAAWqF,EAAe56C,SAAA,CAClDF,eAACq7B,IAAS,CAACqa,QAAQ,eAAcx1C,SAAA,CAAE5C,EAAE,cAAe,SAAS,OAC7D6C,cAACw1C,IAAK,CACJzyC,GAAG,eACHW,KAAK,QACLxC,MAAM,OACNmZ,MAAO+gC,EACPloB,SAAU4nB,EACVrF,OAAQsF,EACR/nB,GAAI,EACJU,YAAav2B,EAAE,oBAAqB,sBACpC2gC,SAAUA,IAEZ99B,cAAC21C,IAAgB,CAACv1C,KAAK,QAAQ,cAAY,gBAAeL,SACvD5C,EAAE,cAAe,2CAGtB6C,cAAC45C,GAAmB,CAClBC,SAAUA,EACVC,WAAY38C,EAAE,cAAe,WAC7BuvB,MAAOguB,EACP5c,SAAUA,EACVic,gBAAiB58C,EAAE,mBAAoB,oBAG3C6C,cAAC2B,IAAI,CAACC,eAAgB,CAAE04B,KAAM,SAAUC,GAAI,YAAax6B,SACvDC,cAAC47B,IAAW,CAAC16B,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,SAAUx6B,SAChDC,cAACJ,IAAM,CACLoB,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,WACnBsE,aAAW,EACXn7B,KAAK,SACL0sC,SAAU,CAAE9V,KAAM,OAAQC,GAAI,SAC9B+K,YAAauV,EACbtf,GAAI,EACJwF,GAAI,EAAEhhC,SAELgwC,gBAOZ,EEnEMsM,GAAkD/9C,IAAkB,IAAjB,QAAE8+B,GAAS9+B,EACzE,MAAM,EAAEnB,GAAMC,YAAe,qBACvB2B,EAAWC,eACT8yB,OAAQ5K,GAAoB6E,KAE9BovB,EAAa/uB,YAAerS,IAC5BqhC,EAAchvB,YAAetS,IAC7B+hC,EAAgBzvB,YAAelS,IAC/B6hC,EAAmBxhC,KAEnB2Z,EAASC,eACTmoB,EAAeA,KACnBp1B,EAAgB20B,EAAe,CAC7BjwB,UAAWA,KACTmwB,IACA3e,IACAlJ,EAAO,CACLnxB,GAAI,qBACJ+kB,MAAO3qB,EAAE,4BAA6B,gBACtCg4B,SAAUx4B,GACV,EAEJywB,QAASA,KACP8G,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAO3qB,EAAE,2BAA4B,gDACrCg4B,SAAUx4B,EACV4J,OAAQ,SACR,GAEJ,EAGEy3B,EACJn+B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAAl+B,SAAA,CACVF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACk+B,KAAY,CAAC5+B,MAAOoB,IAAQC,KAAK,OAClCX,cAAA,QAAAD,SAAO5C,EAAE,sBAAuB,oBAElC6C,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAAC,aAAW,yBAAyBC,SAAS,UAASt+B,SAAA,CAC/DC,cAAC4iC,KAAIvR,EAAC,CAAC2B,GAAG,OAAMjzB,SACb5C,EAAE,mBAAoB,iDAEzB6C,cAAA,QAAAD,SAAOo7C,EAAa,KAAOC,EAAc,YAK/C,OAAOr8C,EACLc,eAAC8+B,GAAW,CACV,aAAYxhC,EAAE,kCAAmC,sBACjDggC,QAAM,EACNC,QAASA,EAAQr9B,SAAA,CAEhBi+B,EACDh+B,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CAACi/B,aAAW,EAACn7B,KAAK,SAASnC,QAAS+6C,EAAav8C,SACrD5C,EAAE,mBAAoB,YAEzB6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAAS67B,EAAQr9B,SACrD5C,EAAE,cAAe,oBAM1B0C,eAACk/B,KAAK,CAAC5B,QAAM,EAACC,QAASA,EAAS,cAAY,oBAAmBr9B,SAAA,CAC7DC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CACX,cAAY,4BACZ,aAAY9hC,EAAE,kCAAmC,sBAAsB4C,SAAA,CAEtEi+B,EACDh+B,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAAS67B,EAAQr9B,SACzC5C,EAAE,cAAe,YAEpB6C,cAACJ,IAAM,CAAC8D,KAAK,SAASnC,QAAS+6C,EAAav8C,SACzC5C,EAAE,mBAAoB,sBAMlC,EC9GUo/C,GAA4Dj+C,IAIlE,IAJmE,OACxEk+C,EAAM,SACNC,EAAQ,eACRC,GACDp+C,EACC,MAAM,EAAEnB,GAAMC,YAAe,eAEvBmB,EAAwB,CAC5B,CACEG,MAAOvB,EAAE,OAAQ,QACjBoE,QAASi7C,EACTz6C,KAAM46C,KAER,CACEj+C,MAAOvB,EAAE,gBAAiB,iBAC1B4E,KAAM66C,IACNr7C,QAASm7C,GAEX,CACEh+C,MAAOvB,EAAE,cAAe,eACxBoE,QAASk7C,EACT16C,KAAM86C,OAIV,OACE78C,cAACkC,EAAwB,CACvB3D,QAASA,EACT4D,UAAWhF,EAAE,0BAA2B,6BACxC,EClCO2/C,GAA4Dx+C,IAMlE,IANmE,MACxEwpB,EAAQ,cAAa,WACrBioB,EAAa,SAAQ,YACrB2K,EAAc,GAAE,SAChB5c,GAAW,EAAK,SAChB+b,EAAW,cACZv7C,EACC,MAAMw9C,EAAyBxvB,YAAkB9S,IAC3CujC,EAAsB3wB,YAAe5S,IAI3C,OACE3Z,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAAC67B,IAAI,CAAC1H,GAAI,EAAG3C,EAAG,EAAG,cAAY,oCAAmCtxB,SAAA,CAC/D+nB,GACC9nB,cAACimC,IAAO,CAAC/lC,SAAS,UAAU8yB,GAAI,EAAEjzB,SAC/B+nB,IAGL9nB,cAACy6C,GAAc,CACb1K,WAAYA,EACZ8J,SAAUA,EACVa,YAAaA,EACb5c,SAAUA,OAGbif,GAAuB/8C,cAACq8C,GAAe,CAACjf,QAjB7BA,IAAM0e,GAAuB,OAkBxC,ECbMkB,GAAkD1+C,IAGxD,IAHyD,iBAC9D2+C,EAAgB,QAChB9d,GAAU,GACX7gC,EACC,MAAM,EAAEnB,GAAMC,YAAe,eACvB2B,EAAWC,cACX4Y,EAAawU,YAAe1S,IAC5B7B,EAAWuU,YAAe3S,IAC1ByjC,EAAsB9wB,YAAe7S,IACrC4jC,EAA2B3oB,YAAoBjb,IAC/C6jC,EAAiBhxB,YAAe9S,IAChC+jC,EAAuB7oB,YAAoBlb,IAC3CgkC,EAA2B9oB,YAAoBhb,IAE/Cq0B,EAAWtJ,iBAAO,MAQlBza,EAAiBzsB,uBAAY,KAC1B,CACLwa,WACA0lC,YAAa3lC,EACb4U,WAAYywB,EAAiBvsC,OAC7By9B,WAAYvhC,KAAK+vB,KAAKsgB,EAAiBvsC,OAASmH,MAEjD,CAAColC,EAAkBrlC,EAAYC,IAE5B2lC,EAAuBngD,uBAAY,IAChC4/C,EAAiB3wC,OAAOsL,EAAa,GAAKC,EAAUD,EAAaC,IACvE,CAAColC,EAAkBrlC,EAAYC,IAE5B4lC,EAAete,EAAU,kBAAoB,yBAC7Cue,EAA2Bve,EAAUz+B,IAAQC,KAAK,KAAOD,IAAQo8B,KAAK,KACtE6gB,EAA6Bxe,EAAUz+B,IAAQk9C,YAAcl9C,IAAQo8B,KAAK,KAC1E+gB,EAAa1e,EAAU,CAAE7E,KAAM,GAAM,CAAEA,KAAM,EAAGC,GAAI,GACpDujB,EAA6B3e,EAAU,EAAI,EAEjD,OACEt/B,eAAA6yB,WAAA,CAAA3yB,SAAA,EACIhB,GACAc,eAACyzB,IAAI,CACHN,GAAI8qB,EACJ9V,oBAAqByV,EACrBpsB,EAAE,cACFC,GAAIosB,EACJl+C,OAAM,aAAA3C,OAAe8gD,GAA6B59C,SAAA,CAElDC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,aAAc,UACpC6C,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,cAAe,YACnCgiC,GACAt/B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,aAAc,UACpC6C,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,mBAAoB,oBAG9C6C,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,mBAAoB,4BAG9C6C,cAACszB,IAAI,CAACrxB,QAAS47C,EAAY3Y,IAAK2I,EAAS9tC,SACtCy9C,IAAuBr8C,KAAK6oB,GAC3BhqB,cAAC+9C,GAAa,CACZ5e,QAASA,EAETnV,KAAMA,EACNyzB,aAAcA,GAFTzzB,EAAKpf,WAMhB5K,cAAC4tC,GAAmB,CAClB9jB,eAAgBA,IAChBzE,gBAAiB3L,GACjB4L,cAAe7L,GACfo0B,SAAUA,EACVC,wBAAyB,MAE1BoP,GACCl9C,cAACg+C,GAAe,CAACZ,eAAgBA,EAAgBhgB,QAhEvCA,KACdigB,IACAF,IACAG,GAA0B,MA+DvB,EC3EMW,GAA4C3/C,IAIlD,IAAD4/C,EAAA,IAJoD,KACxDl0B,EAAI,QACJmV,GAAU,EAAK,YACfgf,GACD7/C,EACC,MAAQ0rB,KAAM0wB,GAAgB3zB,MACxB,EAAE5pB,GAAMC,YAAe,eACvB82B,EAASC,gBACPnK,KAAMkvB,GAAmBvsB,MAE1B7F,EAAcsvB,GAAmBvR,IAAMhf,SAASmE,EAAKlD,eACrD+zB,EAAWU,GAAgB1W,IAAMhf,UAAS,IAC1CgB,EAAOu3B,GAAYvZ,IAAMhf,SAAmC,OAAJmE,QAAI,IAAJA,OAAI,EAAJA,EAAMnD,QAC9DD,EAAUy3B,GAAexZ,IAAMhf,SAAqB,OAAJmE,QAAI,IAAJA,OAAI,EAAJA,EAAMhnB,OACtDm0C,EAAYgC,GAAiBtU,IAAMhf,SAAqB,OAAJmE,QAAI,IAAJA,GAAgB,QAAZk0B,EAAJl0B,EAAMmtB,kBAAU,IAAA+G,OAAZ,EAAJA,EAAkB7jC,QAEvE,WAAE+/B,EAAU,eAAEI,GAAmBP,KAEvCnV,qBAAU,KAAO,IAADwZ,EAAAC,EACd,MAAMC,EAAcA,CAACnzB,EAAWC,IAAcD,EAAIC,EAE5CmzB,GAAwB,OAAJz0B,QAAI,IAAJA,GAAgB,QAAZs0B,EAAJt0B,EAAMmtB,kBAAU,IAAAmH,OAAZ,EAAJA,EAAkBjkC,SAAU88B,EAChDuH,EAAyB,OAAJ10B,QAAI,IAAJA,GAAW,QAAPu0B,EAAJv0B,EAAMnD,aAAK,IAAA03B,OAAP,EAAJA,EAAap9C,KAAKw9C,GAA0BA,EAAEtkC,QACnEukC,EAA0B,OAAL/3B,QAAK,IAALA,OAAK,EAALA,EAAO1lB,KAAK09C,GAAMA,EAAExkC,QACzCykC,GAA4B,OAAJ90B,QAAI,IAAJA,OAAI,EAAJA,EAAMlD,gBAAiBA,EAC/Ci4B,GACc,OAAlBL,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoBpyC,QAAQuxB,KAAK2gB,GAAa7tC,eAC5B,OAAlBiuC,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoBtyC,QAAQuxB,KAAK2gB,GAAa7tC,YAC1CquC,EAAkBp4B,IAAaoD,EAAKhnB,KAEpCi8C,EACJR,GAAqBM,GAAeC,GAAmBF,EAEzDvD,EAAapc,EAAU8f,EAAaA,GAA6B,IAAf9H,KAAsBtwB,EAAMnW,OAAO,GACpF,CAACsZ,EAAMpD,EAAUC,EAAOswB,EAAYhY,EAASrY,IAEhD,MAwBMo4B,EAAoBA,KACxBf,GAAY,GACZjqB,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAO3qB,EAAE,eAAgB,gBACzBg4B,SAAUx4B,GACV,EAGJ,SAASwiD,IACPjrB,EAAO,CACLnxB,GAAI,+BACJ+kB,MAAO3qB,EAAE,sBAAuB,4CAChCg4B,SAAUx4B,EACV4J,OAAQ,SAEZ,CAEA,OACEvG,cAAC07B,IAAI,CAACrK,EAAG,EAAG7xB,OAAO,IAAIq9B,gBAAgB,UAAS98B,SAC9CC,cAAC4yB,IAAY,CAAA7yB,SACXC,cAAC6yB,IAAI,CAAC9vB,GAAG,+BAA8BhD,SACrCF,eAAC8B,IAAI,CAACsL,UAAW,CAAEqtB,KAAM,SAAUC,GAAI,OAAS34B,eAAe,gBAAe7B,SAAA,CAC5EF,eAACu8C,KAAK,CAACla,QAAS,EAAGhhC,MAAM,OAAO+L,UAAW,CAAEqtB,KAAM,SAAUC,GAAI,OAAQx6B,SAAA,CACvEF,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAACqa,QAAQ,OAAMx1C,SAAA,CAAE5C,EAAE,aAAc,QAAQ,OACnD6C,cAACw1C,IAAK,CACJzyC,GAAG,OACHW,KAAK,OACLxC,MAAM,OACNi1C,aAAcnsB,EAAKhnB,KACnBtE,MAAOvB,EAAE,aAAc,QACvB61B,GAAI,EACJma,KAAK,SACLzZ,YAAav2B,EAAE,mBAAoB,QACnC+1B,SAAW3wB,GAAU87C,EAAY97C,EAAMqxB,OAAOvZ,YAGlDxa,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAACqa,QAAQ,QAAOx1C,SAAA,CAAE5C,EAAE,cAAe,SAAS,OACtD6C,cAACw1C,IAAK,CACJzyC,GAAG,QACHW,KAAK,QACLxC,MAAM,OACNi1C,aAAcnsB,EAAKpf,MACnBlM,MAAOvB,EAAE,cAAe,SACxBmoC,YAAU,EACVtS,GAAI,EACJma,KAAK,SACLzZ,YAAav2B,EAAE,oBAAqB,4BAGtCgiC,GACAt/B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC47B,IAAW,CAAC16B,MAAM,OAAMnB,SACvBC,cAACoqC,GAAW,CACV4P,QAAQ,QACRt7C,MAAK,GAAA7B,OAAKM,EAAE,cAAe,WAAU,KACrCuvB,MAAkB,OAAXguB,QAAW,IAAXA,OAAW,EAAXA,EAAa7zB,MACpBlK,cAAekK,EACfwjB,aApFDC,IACjB,MAAM8U,EAA0B,OAAX1E,QAAW,IAAXA,OAAW,EAAXA,EAAa7zB,MAAM0X,MAAMogB,GAAMA,EAAEtkC,QAAUq/B,OAAOpP,KAEnE8U,IAAiBv4B,EAAM1lB,KAAKwU,GAAMA,EAAEjX,QAAOq2B,SAASqqB,EAAa1gD,QACnE0/C,GAAUiB,GAAkB,IAAIA,EAAeD,IACjD,EAgFkB5U,sBA7EEF,IACpB,MAAMgV,EAAez4B,EAAM0X,MAAMogB,GAAMA,EAAEtkC,QAAUiwB,IACnD8T,GAAUiB,GAAkBA,EAAczpC,QAAQ2pC,GAAMA,EAAEllC,SAAsB,OAAZilC,QAAY,IAAZA,OAAY,EAAZA,EAAcjlC,UAAO,MA8E3Exa,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAACqa,QAAQ,kBAAiBx1C,SAAA,CACjC5C,EAAE,mBAAoB,eAAe,OAExC6C,cAACs2C,KAAM,CACLj8B,MAAO88B,EACPjkB,SAAW7Y,GAAU8+B,EAAcO,OAAOr/B,IAC1C,aAAW,6BAA4Bta,SAExB,OAAdm5C,QAAc,IAAdA,OAAc,EAAdA,EAAgBK,YAAYp4C,KAAKw4C,GAChC35C,cAAA,UAAwBqa,MAAOs/B,EAAIt/B,MAAMta,SACtC45C,EAAIj7C,OADMi7C,EAAIt/B,iBAQ3Bxa,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAAAn7B,SAAA,CAAE5C,EAAE,mBAAoB,uBAAuB,OACzD6C,cAACooC,IAAQ,CACP,cAAY,mBACZrlC,GAAG,aACH7B,MAAM,OACNonC,UAAWxhB,EACXpoB,MAAOvB,EAAE,mBAAoB,uBAC7BmoC,YAAanG,EACbjM,SAAW3wB,GACT6zC,EAAgB7zC,EAAMqxB,OAAO2U,SAE/BvV,GAAI,UAIVhzB,cAACoC,IAAG,CAAClB,MAAO,GAAI9B,OAAQ,IACxBS,eAAC+7B,IAAW,CAAA77B,SAAA,CACVC,cAACJ,IAAM,CACLoB,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,WACnBsE,aAAW,EACXuR,SAAU,CAAE9V,KAAM,OAAQC,GAAI,SAC9B+K,YAAauV,EACbrE,UAAWgE,EACXj5C,QArHOi+C,KAAO,IAADC,EACzB,MAAMpF,EAAO,CACXt3C,GAAIinB,EAAKjnB,GACTuX,aAAco/B,OAAOvC,GACrBtwB,MAAmD,QAA9C44B,EAAO,OAAL54B,QAAK,IAALA,OAAK,EAALA,EAAO1lB,KAAKu+C,GAAeA,EAAWrlC,eAAM,IAAAolC,IAAI,GACvD74B,WACAE,aAA0B,OAAZA,QAAY,IAAZA,MAEhBszB,EAAWjb,EAASkb,EAAM6E,EAAmBC,EAAiB,EA8GlD5jB,GAAI,EACJwF,GAAI,EAAEhhC,SAEL5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CACLoB,GAAI,CAAEs5B,KAAM,UAAWC,GAAI,QAC3BsE,aAAW,EACXr+B,QAAQ,YACR4vC,SAAU,CAAE9V,KAAM,OAAQC,GAAI,SAC9Bh5B,QAASA,KACP48C,GAAY,EAAM,EAEpB5iB,GAAI,EACJwF,GAAI,EAAEhhC,SAEL5C,EAAE,qBAAsB,uBAM9B,ECrMEwiD,GAA4CrhD,IAKlD,IAADggD,EAAA,IALoD,KACxDt0B,EAAI,aACJyzB,EAAY,QACZte,GAAU,EAAK,YACfgf,GACD7/C,EACC,MAAM41B,EAASC,gBACPrC,OAAQ5K,GAAoB6E,MAC9B,EAAE5uB,GAAMC,YAAe,eACvB2B,EAAWC,cAEX4gD,EAAmCtzB,YAAkB/S,IACrDsmC,EAAgBvzB,YAAkBhT,IAuClCwmC,EAAuB3gB,EAAO,gHAM9B4gB,EAAqB5gB,EAAO,+EAIlC,OACEt/B,eAACyzB,IAAI,CACH0sB,cAAe,CACb1lB,KAAMwlB,EACNvlB,GAAIwlB,GAEN/X,oBAAqB,CAAE1N,KAAM,cAAeC,GAAIkjB,GAChD57C,WAAW,WACXwvB,EAAG,CACDiJ,KAAM,6BACNC,GAAI,6BAENjJ,GAAI5wB,IAAQo8B,KAAK,KACjBt9B,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAa,SAAQ5hC,SAAA,CAErBC,cAAC6zB,KAAI,CAACwU,SAAS,OAAO5nC,KAAK,KAAK66B,WAAW,OAAOtI,GAAI,CAAEsH,KAAM,OAAQC,GAAI,GAAIx6B,SAC3EiqB,EAAKhnB,OAERhD,cAAC6zB,KAAI,CAACwU,SAAS,QAAQ5nC,KAAK,KAAK66B,WAAW,OAAOtI,GAAI,CAAEsH,KAAM,OAAQC,GAAI,GAAIx6B,SAC5EiqB,EAAKpf,SAENu0B,GACAt/B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACigD,GAAe,CAACvzB,MAAO1C,EAAKnD,QAC7B7mB,cAAC6zB,KAAI,CACHwU,SAAS,cACT5nC,KAAK,KACL66B,WAAW,OACXsM,YAAa,CAAEtN,KAAM,MAAOC,GAAI,SAAUx6B,SAE1B,QAF0Bu+C,EAEzCt0B,EAAKmtB,kBAAU,IAAAmH,OAAA,EAAfA,EAAiB5/C,WAIxBmB,eAACo7B,IAAM,CACLoN,SAAS,aACTrV,GAAI,CAAEsH,KAAM,OAAQC,GAAI,GACxBqN,YAAa,CAAEtN,KAAM,MAAOC,GAAI,SAAUx6B,SAAA,CAEzChB,GAAYiB,cAAC6zB,KAAI,CAACpzB,KAAK,KAAIV,SAAE5C,EAAE,mBAAoB,gBACpD6C,cAAC6zB,KAAI,CAACpzB,KAAK,KAAK66B,WAAW,OAAOH,QAAQ,SAAQp7B,SAC/CiqB,EAAKlD,aAAe,MAAQ,UAGjC9mB,cAACoC,IAAG,CAACimC,SAAS,OAAOT,YAAY,MAAMsY,UAAU,WAAUngD,SACzDC,cAACu8C,GAAoB,CACnBC,OA9FW2D,KACjBhC,GAAY,EAAK,EA8FX1B,SA3Fa2D,KACnBR,GAAiC,GACjCC,EAAc71B,EAAK,EA0Fb0yB,eAvFeA,KAAO,IAAD2D,EAAAnC,EAAAoC,EAAA/B,EAC3Br3B,EACE,CACElkB,KAAMgnB,EAAKhnB,KACX4H,MAAOof,EAAKpf,MACZ0P,aAAoC,QAAxB+lC,EAAiB,QAAjBnC,EAAEl0B,EAAKmtB,kBAAU,IAAA+G,OAAA,EAAfA,EAAiB7jC,aAAK,IAAAgmC,IAAI,EACxClmC,QAA0E,QAAnEmmC,EAAY,QAAZ/B,EAAEv0B,EAAKnD,aAAK,IAAA03B,OAAA,EAAVA,EAAYp9C,KAAKqI,GAAiCA,EAAS6Q,eAAM,IAAAimC,IAAI,IAEhF,CACE10B,UAAWA,KACTsI,EAAO,CACLnxB,GAAI,+BACJ+kB,MAAO3qB,EAAE,sBAAuB,eAChCg4B,SAAUx4B,GACV,EAEJywB,QAASA,KACP8G,EAAO,CACLnxB,GAAI,4BACJ+kB,MAAO3qB,EAAE,qBAAsB,8CAC/Bg4B,SAAUx4B,EACV4J,OAAQ,SACR,GAGP,QAiEM,EC3HEw3C,GAA8Cz/C,IAIpD,IAJqD,KAC1D0rB,EAAI,aACJyzB,EAAY,QACZte,GAAU,GACX7gC,EACC,MAAOiiD,EAAYpC,GAAetZ,IAAMhf,UAAS,GAEjD,OAAO06B,EACLvgD,cAACi+C,GAAW,CAACj0B,KAAMA,EAAMmV,QAASA,EAASgf,YAAaA,IAExDn+C,cAAC2/C,GAAW,CACV31B,KAAMA,EACNmV,QAASA,EACTse,aAAcA,EACdU,YAAaA,GAEhB,ECCUH,GAAkD1/C,IAGxD,IAHyD,eAC9D8+C,EAAc,QACdhgB,GACD9+B,EACC,MAAM,EAAEnB,GAAMC,YAAe,qBACvB2B,EAAWC,cACXk1B,EAASC,gBACPrC,OAAQ9K,GAAoBwE,KAE9BnE,EAAcA,KAClB+V,IACAlJ,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAO3qB,EAAE,6BAA8B,6CACvCg4B,SAAUx4B,EACV4J,OAAQ,SACR,EAGEi6C,EAAeA,KACD,OAAdpD,QAAc,IAAdA,KAAgBr6C,GAClBikB,EAAgBo2B,EAAer6C,GAAI,CACjC6oB,UAAWA,KACTwR,IACAlJ,EAAO,CACLnxB,GAAI,6BACJ+kB,MAAO3qB,EAAE,sBAAuB,gBAChCg4B,SAAUx4B,EACV4J,OAAQ,WACR,EAEJ6mB,QAASA,KACP/F,GAAa,IAIjBA,GACF,EAGI2W,EACJn+B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAAl+B,SAAA,CACVF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACk+B,KAAY,CAAC5+B,MAAOoB,IAAQC,KAAK,OAClCX,cAAA,QAAAD,SAAO5C,EAAE,sBAAuB,oBAElC6C,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAAC,aAAW,yBAAyBC,SAAS,UAASt+B,SAAA,CAC/DC,cAAC4iC,KAAIvR,EAAC,CAAC2B,GAAG,OAAMjzB,SACb5C,EAAE,mBAAoB,iDAEzB6C,cAAA,QAAAD,UAAqB,OAAdq9C,QAAc,IAAdA,OAAc,EAAdA,EAAgBp6C,MAAO,MAAqB,OAAdo6C,QAAc,IAAdA,OAAc,EAAdA,EAAgBxyC,OAAQ,YAKnE,OAAO7L,EACLc,eAAC8+B,GAAW,CAAC,aAAW,oBAAoBxB,QAAM,EAACC,QAASA,EAAQr9B,SAAA,CACjEi+B,EACDh+B,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CAACY,QAAQ,SAASq+B,aAAW,EAACn7B,KAAK,SAASnC,QAASi/C,EAAazgD,SACtE5C,EAAE,mBAAoB,YAEzB6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAAS67B,EAAQr9B,SACrD5C,EAAE,cAAe,oBAM1B0C,eAACk/B,KAAK,CAAC5B,QAAM,EAACC,QAASA,EAAQr9B,SAAA,CAC7BC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAC,aAAW,oBAAmBl/B,SAAA,CACzCi+B,EACDh+B,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAAS67B,EAAQr9B,SACzC5C,EAAE,cAAe,YAEpB6C,cAACJ,IAAM,CAACY,QAAQ,SAASkD,KAAK,SAASnC,QAASi/C,EAAazgD,SAC1D5C,EAAE,mBAAoB,sBAMlC,EC7GUwhC,GAA0CrgC,IAAA,IAAC,OACtD6+B,EAAM,QACNC,EAAO,SACPr9B,KAEG0gD,GACJniD,EAAA,OACC0B,cAAC++B,KAAK,CAAC5B,OAAQA,EAAQC,QAASA,EAAS38B,KAAK,OAAMV,SAClDC,cAACi/B,KAAY,CACXnG,EAAG,EACH53B,MAAM,QACNf,SAAS,QACTugD,UAAU,gBACND,EAAY1gD,SAEfA,KAEG,ECjBG4gD,GAAiCriD,IAA6B,IAA5B,SAAEyB,EAAQ,SAAEugC,GAAUhiC,EACnE,MAAM,EAAEnB,GAAMC,YAAe,QAC7B,OACEyC,eAACC,IAAI,CAACU,QAAQ,UAAUogD,eAAa,EAAA7gD,SAAA,CACnCF,eAACI,IAAU,CACTO,QAAQ,MACRK,GAAI,CACFzB,OAAQ,SACR8B,MAAO,MACPf,SAAU,MACV0gD,kBAAmBvgB,EAAW5/B,IAAQC,KAAK,UAAO6L,EAClDm1B,aAAc,IACdrQ,GAAI,WACJ,UAAW,CACTwvB,SAAU,4BACVzX,WAAY,yBACZ/pC,MAAO,uBAGXwB,GAAIlB,IAAOG,SAAA,CAEV5C,EAAE,OAAQ,QAAQ,SAErB6C,cAACe,KAAQ,CAAAhB,SAAEA,MACN,ECtBEghD,GAA8CziD,IAIpD,IAJqD,eAC1D0iD,EAAc,UACdC,EAAS,kBACTC,GACD5iD,EACC,OACEuB,eAACshD,KAAO,CAAC7hD,MAAOoB,IAAQC,KAAK,KAAMyvC,SAAS,QAAQgR,GAAI,EAAErhD,SAAA,CACxDC,cAACqhD,KAAG,CAAC/hD,MAAOoB,IAAQC,KAAK,KAAMY,QAASA,IAAM2/C,EAAkB,GAAGnhD,SACjEC,cAACshD,KAAO,CAACphD,SAAS,KAAIH,SAAEkhD,EAAU,OAEpCjhD,cAACqhD,KAAG,CAAC9/C,QAASA,IAAM2/C,EAAkB,GAAGnhD,SACvCC,cAACshD,KAAO,CAACphD,SAAS,KAAIH,SAAEkhD,EAAU,OAEnCA,EAAUvwC,OAAS,GAClB1Q,cAAC2gD,GAAa,CAACrgB,SAAU0gB,EAAiB,EAAEjhD,SACzCkhD,EAAU30C,MAAM,GAAGnL,KAAI,CAACzC,EAAOmrC,IAC9B7pC,cAACqB,KAAQ,CAEPE,QAASA,IAAM2/C,EAAkBrX,EAAQ,GACzChpC,GAAI,CACFpB,QAASuhD,IAAmBnX,EAAQ,EAAInpC,IAAQC,KAAK,UAAO6L,EAC5DlN,MAAO0hD,IAAmBnX,EAAQ,EAAInpC,IAAQ2gC,WAAQ70B,EACtD,UAAW,CACT/M,QAAS,cAEXM,SAEDrB,GAVIA,SAeL,ECxBD0rC,GAAsD9rC,IAW5D,IAX6D,MAClEI,EAAK,MACLguB,EAAK,cACL/P,EAAa,aACb0tB,EAAY,sBACZG,EAAqB,QACrBwP,EAAO,UACPvP,EAAS,iBACT8W,GAAmB,EAAI,SACvBzjB,GAAW,KACRoM,GACJ5rC,EACC,MAAM,EAAEnB,GAAMC,YAAe,gBAa7B,OACEyC,eAACyzB,KAAI,IAAK4W,EAAYnqC,SAAA,CACpBC,cAACk7B,KAAS,CAACqa,QAASyE,EAAQj6C,SAAErB,IAC9BsB,cAACs2C,MAAM,CACLxY,SAAUA,EACVoY,QAAS8D,EACT,aAAYt7C,EACZkE,GAAI,EACJ1B,MAAM,OACNgyB,SAAUmX,EACVmX,0BAA0B,EAC1BC,iBAAkBhX,EAAY,KAAOlc,SAAS3F,KAC9C8K,YAtBA6tB,GAAiC,OAAb5kC,QAAa,IAAbA,KAAejM,OAC/B,GAAN7T,OAAuB,OAAb8f,QAAa,IAAbA,OAAa,EAAbA,EAAejM,OAAM,KAAA7T,OAAIM,EAAE,WAAY,aAC/B,OAAbwf,QAAa,IAAbA,KAAejM,OAASiM,EAAc,GAAGje,MAAK,KAAA7B,OAAQM,EAAE,SAAU,UAAS,MAqB9EukD,WAAYjX,OAAYj+B,EAAY,EAAEzM,SAErC2sB,GACCA,EAAMvrB,KAAKyU,IACT5V,qBAAA,UAA2Bqa,MAAOzE,EAAOyE,MAAOyjB,UAtBlCjoB,EAsB2DD,OArB3DpJ,IAAlBmQ,GACGA,EAAcglC,MAAMC,GAAUA,EAAMvnC,QAAUxE,EAAKwE,SAoB+Bta,SAC9E6V,EAAOlX,OADGkX,EAAOyE,OAtBNxE,KAyBf,MAEJ0rC,GAAoB5kC,GACnB3c,cAAC6hD,GAAgB,CAACllC,cAAeA,EAAepb,QAASipC,MAEtD,E,cCzDJ,MAAMqX,GAAgDvjD,IAAiC,IAAhC,cAAEqe,EAAa,QAAEpb,GAASjD,EACtF,OACE0B,cAACoC,IAAG,CAAC+4B,QAAQ,SAAS,cAAY,qBAAoBp7B,SACtC,OAAb4c,QAAa,IAAbA,OAAa,EAAbA,EAAexb,KAAKyU,GACnB5V,cAACJ,IAAM,CACL,cAAY,mBAEZkiD,MAAM,OACN9gD,GAAI,EACJ4B,GAAI,EACJm+B,GAAI,EACJ/D,GAAI,EACJ+kB,GAAI,EACJ5hD,SAAS,kBACTf,OAAQ,EACRoB,QAAQ,YACRonC,YAAY,OACZ1nC,SAAS,SACTI,UAAWN,cAACgiD,KAAO,IACnBzgD,QAASA,IAAMA,EAAQqU,EAAOyE,OAAOta,SAErCC,cAAC6zB,KAAI,CACHv0B,MAAOoB,IAAQ8qC,MACftrC,SAAS,UACTo7B,WAAW,iBACX2mB,aAAW,EACX7R,SAAS,QACT3vC,KAAK,KAAIV,SAER6V,EAAOlX,SAvBLkX,EAAOyE,UA2BZ,ECnCG6nC,GAA0D5jD,IAAmB,IAAlB,SAAE4J,GAAU5J,EAClF,MAAM,EAAEnB,GAAMC,YAAe,UACvB,IAAEyB,GAAQC,eAEVJ,EACS,aAAbwJ,EAA0B/K,EAAE,WAAY,YAAcA,EAAE,WAAY,YAEhEglD,EAAU,CACdC,SAAU,CACR3iD,QAASiB,IAAQ6gC,QAAQ,GACzBjiC,MAAOoB,IAAQ8qC,OAEjB6W,SAAU,CACR5iD,QAASiB,IAAQ6gC,QAAQ,IACzBjiC,MAAOoB,IAAQ8qC,QAIb8W,EAAU,CACdF,SAAU,CACR3iD,QAASokC,GACTvkC,MAAO,SAET+iD,SAAU,CACR5iD,QAAS,YACTH,MAAO,UAILkB,EAAuB,aAAb0H,EAA0B,WAAa,WAEvD,OACElI,cAACisC,IAAK,CACJ9Q,QAAQ,OACRv5B,eAAe,SACf1B,SAAS,KACT4B,EAAE,OACF0vB,EAAE,OACF/xB,QAASZ,EAAI,CAAEM,GAAImjD,EAAQ9hD,GAASf,SAAW0iD,EAAQ3hD,GAASf,SAChEH,MAAOT,EAAI,CAAEM,GAAImjD,EAAQ9hD,GAASlB,OAAS6iD,EAAQ3hD,GAASlB,OAAOS,SAElErB,GACK,ECzCC6jD,GAAwDjkD,IAG9D,IAH+D,aACpEkkD,EAAY,qBACZC,GACDnkD,EACC,MAAM,EAAEnB,GAAMC,YAAe,UACvB,IAAEyB,GAAQC,eAChB,OACEkB,cAACo8C,KAAK,CAACnvC,UAAU,MAAMi1B,QAAS,EAAEniC,SAChCF,eAAC6iD,GAAiB,CAACroC,MAAOmoC,EAAcvgD,QAAS,EAAElC,SAAA,CACjDC,cAAC2iD,GAAY,CACXtxB,EAAGxyB,EAAI,CAAEM,GAAI,qBACbkb,MAAM,MACN9Y,QAASA,IAAMkhD,EAAqB,OACpCjiD,QAAQ,WAAUT,SAEjB5C,EAAE,MAAO,SAEZ6C,cAAC2iD,GAAY,CACXtxB,EAAGxyB,EAAI,CAAEM,GAAI,sBACbkb,MAAM,WACN7Z,QAAQ,WACRe,QAASA,IAAMkhD,EAAqB,YAAY1iD,SAE/C5C,EAAE,WAAY,cAEjB6C,cAAC2iD,GAAY,CACXtxB,EAAGxyB,EAAI,CAAEM,GAAI,YACbkb,MAAM,WACN7Z,QAAQ,WACRe,QAASA,IAAMkhD,EAAqB,YAAY1iD,SAE/C5C,EAAE,WAAY,kBAGb,ECpBCylD,GAA8BtkD,IAAmD,IAAlD,MAAEyJ,EAAK,QAAE86C,EAAO,qBAAEC,EAAuB,GAAGxkD,EACtF,MAAM,EAAEnB,GAAMC,YAAe,UACvB,IAAEyB,GAAQC,eACT0jD,EAAcO,GAAmBl9B,mBAAsB,OACxDwI,EAAmBtwB,KAElB0xC,EAAYC,GAAiB7pB,oBAAS,GACvCm9B,GACC,OAALj7C,QAAK,IAALA,OAAK,EAALA,EAAO6N,QAAQqtC,GAASA,EAAK/6C,WAAas6C,GAAiC,QAAjBA,MAA2B,GAKjFU,EAA2B,OAAbF,QAAa,IAAbA,OAAa,EAAbA,EAAenlB,MAHjBslB,CAACC,EAAyBC,IAC1CD,EAAMp7C,SAAWq7C,EAAMr7C,UAAY,EAAI,IAInCs7C,EAAwB,OAAXJ,QAAW,IAAXA,OAAW,EAAXA,EAAa52C,MAC9B,EACAmjC,EAAayT,EAAYxyC,OAAS,EAAIoyC,GAGlC/jD,EAAWC,cAEjB,GAAI6jD,EACF,OAAO7iD,cAACujD,KAAY,CAAC/xB,EAAG,IAAKgyB,UAAW,KAE1C,GAAU,OAALz7C,QAAK,IAALA,MAAO2I,OACV,OAAO1Q,cAAC0+B,IAAgB,CAAC5W,MAAO3qB,EAAE,WAAY,wBAAyBqD,QAAQ,WAIjF,MAAMijD,EAAoB1kD,EACtB,CACEK,OAAQ,OACRskD,UAAW,aAEbl3C,EAEJ,OACE3M,eAACu8C,KAAK,CAACla,QAAS,EAAEniC,SAAA,CAChBC,cAACuiD,GAAkB,CAACC,aAAcA,EAAcC,qBAAsBM,IAC1D,OAAVO,QAAU,IAAVA,KAAY5yC,QAA2B,aAAjB8xC,EAKpB,KAJFxiD,cAAC0+B,IAAgB,CACf5W,MAAO3qB,EAAE,mBAAoB,iCAC7BqD,QAAQ,WAGA,OAAV8iD,QAAU,IAAVA,KAAY5yC,QAA2B,aAAjB8xC,EAKpB,KAJFxiD,cAAC0+B,IAAgB,CACf5W,MAAO3qB,EAAE,mBAAoB,iCAC7BqD,QAAQ,WAGD,OAAV8iD,QAAU,IAAVA,KAAY5yC,OACX1Q,cAAC2jD,IAAY,CAAC5d,QAAQ,GAAGllC,GAAI4iD,EAAkB1jD,SAClC,OAAVujD,QAAU,IAAVA,OAAU,EAAVA,EAAYniD,KAAK8hD,IAAI,IAAAW,EAAA,OACpB5jD,cAAC6jD,IAAY,CAAA9jD,SACXF,eAACuC,IAAG,CAAC,cAAY,OAAOguC,SAAS,OAAOnL,SAAU,EAAEllC,SAAA,CAClDF,eAACu8C,KAAK,CAACnvC,UAAU,MAAMrL,eAAe,gBAAe7B,SAAA,CACnDC,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAA,MAAI+1C,MAAO,CAAE71C,SAAU,QAASH,SACX,QADW6jD,EAC7BX,EAAK96C,qBAAa,IAAAy7C,IAAIX,EAAKx7C,oBAGhCzH,cAACkiD,GAAmB,CAACh6C,SAAU+6C,EAAK/6C,cAEtClI,cAAC2nC,KAAU,CAACxM,QAAQ,SAAQp7B,SAC1BC,cAAA,MAAI+1C,MAAO,CAAE71C,SAAU,YAAaH,SACjCsuB,EAAiB40B,EAAKj7C,SAAUtK,EAAoBG,iBAGzDmC,cAAC2nC,KAAU,CAAC3mC,GAAI,EAAG8iD,UAAU,aAAY/jD,SACvCC,cAAA,KAAAD,SAAIkjD,EAAKh7C,iBAEP,GAAApL,OAlBcomD,EAAKlgD,IAmBZ,MAGjB,MACF0sC,GAAcuT,EAActyC,OAAS4yC,EAAW5yC,OAChD1Q,cAAColC,IAAS,CAAC/T,EAAG,EAAEtxB,SACdC,cAACoC,IAAG,CACFgvC,GAAIvyC,EAAI,CAAEM,GAAI,aACd6zB,GAAIn0B,EAAI,CAAEM,GAAI,aACdkyB,EAAGxyB,EAAI,CAAEM,GAAI,YACbM,QAASZ,EAAI,CAAEM,GAAI,YACnB4iD,GAAIljD,EAAI,CAAEwB,GAAI,IAAKN,SAEnBC,cAACqwC,IAAI,CACH5wC,QAASZ,EAAI,CAAEM,GAAI,UACnBG,MAAOT,EAAI,CAAEM,GAAI,aACjBkyB,EAAGxyB,EAAI,CAAEM,GAAI,uBACboC,QAASA,IAAMmuC,GAAc,GAAM3vC,SAElC5C,EAAE,YAAa,mBAIpB,OACE,EC9GC4mD,GAA4CzlD,IAAuB,IAAtB,aAAE6W,GAAc7W,EACxE,MAAM,EAAEnB,GAAMC,YAAe,SACvBg9B,EAAaH,GAAc9kB,GAC3B6uC,EAAgBC,MAChB,IAAEplD,GAAQC,eAEhB,OACEkB,cAAA0yB,WAAA,CAAA3yB,SACGq6B,EACCv6B,eAAC8B,IAAI,CAACM,QAAS,EAAGJ,WAAW,SAAS6nC,OAAO,UAAS3pC,SAAA,CACpDC,cAACimC,IAAO,CAACrjC,GAAG,UAAUnC,KAAK,KAAIV,SAC5B5C,EAAE,QAAS,WAEd6C,cAACkkD,KAAO,CACNxlD,MAAOslD,EACPG,UAAQ,EACR1hB,UAAU,QACV4G,WAAY3oC,IAAQC,KAAK,KACzBO,MAAM,QACNmwB,EAAG,EACHnxB,SAAS,OACTyhC,aAAc,EACdniC,OAAM,aAAA3C,OAAe6D,IAAQC,KAAK,MAAOZ,SAEzCC,cAACqC,IAAU,CACTjD,OAAO,UACP8B,MAAM,UACN,aAAY/D,EAAE,gBAAiB,iBAC/B4E,KACE/B,cAACokD,IAAY,CACX9kD,MAAOT,EAAI,CAAEM,GAAI,YAAcuB,IAAQC,KAAK,MAC5CT,SAAS,mBAOnBF,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,QAAS,YAEhC,ECnDM8mD,GAAmBA,KAC9B,MAAM,EAAE9mD,GAAMC,YAAe,SAC7B,OAAOD,EACL,qBACA,wQACD,ECGUknD,GAAmD/lD,IAAuB,IAAtB,aAAE6W,GAAc7W,EAC/E,MAAM87B,EAAaH,GAAc9kB,GAC3BmvC,EAAYL,KAClB,OAAO7pB,EACLp6B,cAAC0+B,IAAgB,CAACl+B,QAAQ,WAAW4C,YAAakhD,EAAWtxB,GAAI,IAC/D,IAAI,ECPGuxB,GAAsCjmD,IAAgB,IAAf,MAAEI,GAAOJ,EAC3D,OACE0B,cAAC2B,IAAI,CACH6vB,EAAG,EACH1vB,EAAG,EACHc,GAAI,EACJ1C,SAAS,KACT0B,eAAe,SACfC,WAAW,SACXigD,MAAM,OACNngB,aAAa,MACbriC,MAAOoB,IAAQ2gC,MACfxE,gBAAiBn8B,IAAQ8qC,MAAMzrC,SAE9BrB,GACI,ECZE8lD,GAA0ClmD,IAAiC,IAAhC,QAAEynC,EAAO,cAAE0e,GAAenmD,EAChF,MAAMS,EAAWC,cAEjB,OACEgB,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAI8hB,GAAE,CAACplD,MAAM,QAAQqlD,aAAc,EAAE5kD,SACnChB,GAAwB,OAAb0lD,QAAa,IAAbA,IAA2B1e,KAE9B,ECHJ6e,GAA4DtmD,IAMlE,IANmE,SACxEo2C,EAAQ,aACRC,EAAY,gBACZoE,EAAe,SACflE,EAAQ,MACRn2C,GACDJ,EACC,MAAM22C,EAAsB7oB,YAAeuoB,GACrCkQ,EAAqBv4B,YAAkBysB,IACrC/uB,KAAMkvB,GAAmBvsB,KAWjC,OATAmY,qBAAU,KACR,GAAImQ,IAAwBJ,EAAU,CACpC,MAAMsB,EAA6B,OAAd+C,QAAc,IAAdA,OAAc,EAAdA,EAAgBK,YAAYhb,MAC9C4Y,GAAeA,EAAWz4C,QAAUg2C,IAEnCyB,GAAc0O,EAAmB1O,EAAa97B,MACpD,IACC,CAACq6B,EAAUwE,EAAgB2L,EAAoB5P,EAAqBJ,IAEhEI,IAAwBJ,EAC7Bh1C,eAAC+7B,IAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,IAAS,CAACqa,QAAQ,mBAAkBx1C,SAAA,CAAErB,EAAM,OAC7CsB,cAAC44C,GAAgC,CAC/BG,gBAAiBA,EACjB7C,QAAQ,wBAIZl2C,cAAC6zB,KAAI,CAAA9zB,SAAE20C,GACR,E,cChCH,MAWaoQ,GAAwExmD,IAG9E,IAADymD,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAHgF,0BACpFC,EAAyB,YACzBC,GACDjnD,EACC,MAAM,EAAEnB,GAAMC,YAAe,mBAE7B,OACE4C,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACyzB,IAAI,CACHrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GACxBie,GAAI,EACJ4I,GAAI,EACJ7lB,GAAI,EACJ6V,GAAI,CAAE9W,MAAO,EAAGyM,GAAI,GACpBnlC,eAAgB,CAAE04B,KAAM,SAAUC,GAAI,SACtCmN,aAAc,CACZpN,KAvBW,4DAwBXC,GA5BY,gDA8Bdl7B,YAAaqB,IAAQo8B,KAAK,KAC1Bl8B,YAAa,EACb+gC,aAAc,EACd9E,gBAAiBn8B,IAAQo8B,KAAK,KAAK/8B,SAAA,CAEnCC,cAACk7B,IAAS,CAACn4B,GAAG,kBAAkBslC,SAAS,OAAMtoC,SAC5C5C,EAAE,+BAAgC,uCAErC0C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAACimC,SAAS,aAAannC,MAAO,IAAInB,SACpCC,cAACwlD,GAAU,CACTC,YAAa/gC,GACb4oB,gBAAiBnwC,EAAE,4BAA6B,wBAChDuoD,YACiE,QADtDX,EACgB,OAAzBO,QAAyB,IAAzBA,GAAgD,QAAvBN,EAAzBM,EAA2B30B,6BAAqB,IAAAq0B,GAAO,QAAPC,EAAhDD,EAAkDt4B,aAAK,IAAAu4B,OAA9B,EAAzBA,EAAyDv0C,cAAM,IAAAq0C,IAAI,EAErEv4B,WAAiE,QAAvD04B,EAA2B,OAAzBI,QAAyB,IAAzBA,GAAyC,QAAhBH,EAAzBG,EAA2Bx7B,sBAAc,IAAAq7B,OAAhB,EAAzBA,EAA2C34B,kBAAU,IAAA04B,IAAI,MAGzEllD,cAACoC,IAAG,CAACimC,SAAS,gBAAgBzlC,GAAI,IAAI7C,SACpCC,cAACJ,IAAM,CACL,cAAY,gBACZi/B,aAAW,EACXr+B,QAAQ,YACRF,UAAWN,cAAC2lD,KAAS,IACrBzkD,MAAO,IACPK,QAASA,IAAMgkD,GAAeA,IAC9BznB,WAAoC,OAAzBwnB,QAAyB,IAAzBA,GAAgD,QAAvBF,EAAzBE,EAA2B30B,6BAAqB,IAAAy0B,GAAO,QAAPC,EAAhDD,EAAkD14B,aAAK,IAAA24B,GAAvDA,EAAyD30C,QAAO3Q,SAE1E5C,EAAE,gBAAiB,4BAK3B,ECrDMqoD,GAAwClnD,IAQ9C,IAR+C,YACpDmnD,EAAW,gBACXnY,EAAe,YACfoY,EAAW,WACXl5B,EAAU,eACVo5B,GAAiB,EAAK,UACtBC,KACG30B,GACJ5yB,EACC,MAAM,MAAEI,EAAK,MAAEwC,GAAUgwB,GACnB,EAAE/zB,GAAMC,YAAe,kBAEtBkL,EAAMw9C,GAAWjgC,mBAAiB,KAClC7F,EAAY+lC,GAAiB7zB,YAAeuzB,GAEnD3gB,qBAAU,IAAMghB,EAAQ9lC,IAAa,CAAC8lC,EAAS9lC,IAE/C,MAAMgmC,EAAgB3rC,IACpByrC,EAAQzrC,GACR0rC,EAAc1rC,GACVwrC,GACFA,EAAUxrC,EACZ,EAOI4rC,EAAiBz5B,GAAcA,EAAa,EAAC,GAAA3vB,OAAMM,EAAE,KAAM,MAAK,KAAAN,OAAI2vB,EAAU,KAAM,GAE1F,OACExsB,cAACoC,IAAG,CAACN,EAAGZ,EAAMnB,SACZF,eAAC+7B,IAAW,CAAA77B,SAAA,CACTrB,GAASsB,cAACk7B,IAAS,CAACqa,QAAS,cAAcx1C,SAAErB,IAC9CmB,eAACqmD,KAAW,CACVC,QAAS,cACT,aAAYhpD,EAAE,sBAAuB,uBACrC,cAAY,cACZm4C,UAbiB,IAAhBoQ,KAAuB1lC,EAcxB8H,MAAO3qB,EAAE,oBAAqB,UAC9Bkd,MAAO/R,EACP4qB,SAAW3wB,GAAUujD,EAASvjD,EAAwCqxB,OAAOvZ,OAC7E+rC,SAAW/rC,GAAU2rC,EAAkB,OAAL3rC,QAAK,IAALA,IAAS,IAC3CgsC,uBAAwB,IAAKtmD,SAAA,CAE7BC,cAACsmD,KAAgB,CACf,aAAYnpD,EAAE,mBAAoB,eAClCu2B,YAA4B,OAAf4Z,QAAe,IAAfA,IAAmBnwC,EAAE,mBAAoB,uBACtDw2B,UAAW,KAEb3zB,cAACumD,KAAiB,CAChB,cAAY,qBACZ,aAAYppD,EAAE,gBAAiB,sBAGlC6iB,EACCngB,eAACo7B,IAAM,CAACj6B,GAAI,EAAGa,WAAW,QAAO9B,SAAA,EAC7B6lD,IAA8B,OAAXF,QAAW,IAAXA,IAAe,IAAM,EACxC1lD,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAA,UAAAD,SAAA,GAAAlD,OACMM,EAAE,UAAW,WAAU,KAAAN,OAAI6oD,EAAW,KAAA7oD,OACxB,IAAhB6oD,EACIvoD,EAAE,gBAAiB,iBACnBA,EAAE,iBAAkB,kBAAiB,KAAAN,OACvCopD,GAAcppD,OAAGM,EAAE,MAAO,OAAM,MAAAN,OAAKmjB,EAAU,SAGrD,KACJhgB,cAACghC,IAAU,CACTqH,SAAS,OACTrnC,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GACnBh5B,QAASA,IAAMykD,EAAa,IAC5BrjD,WAAW,SAAQ5C,SAElB5C,EAAE,eAAgB,qBAGrB,SAEF,EC9FG8iD,GAAkD3hD,IAAgB,IAAf,MAAEouB,GAAOpuB,EACvE,OACE0B,cAAC2B,IAAI,CAAC0mC,SAAS,OAAOpE,cAAc,SAASpiC,WAAW,aAAY9B,SAC5D,OAAL2sB,QAAK,IAALA,OAAK,EAALA,EAAOvrB,KAAK0U,GACX7V,cAACisC,IAAK,CAEJjZ,GAAG,SACH1B,GAAI5wB,IAAQC,KAAK,KACjBrB,MAAOoB,IAAQ8qC,MACf3qC,GAAI,CACF,iBAAkB,CAChBmyB,GAAI,IAENjzB,SAED8V,EAAKnX,OAVDmX,EAAKwE,UAaT,ECJEmsC,GAA4DloD,IAYlE,IAZmE,QACxEmoD,EAAO,qBACPC,EAAoB,gBACpBzgC,EAAe,YACf0gC,EAAW,eACXC,EAAc,iBACdta,EAAgB,eAChBC,EAAc,eACdC,EAAc,aACdC,EAAY,cACZE,EAAyB,YACzBC,GACDtuC,EACC,MAAM,EAAEnB,GAAMC,YAAe,YACtBypD,EAAaC,GAAkBjhC,oBAAU8gC,GAE1Ctc,EAAeA,CAACz0B,EAAkCyE,KCvCvB0sC,EACjCN,EACA7wC,EACAyE,EACA2sC,KACU,IAADC,EAAAC,EACT,IAAKtxC,GAA6B,IAAnB6wC,EAAQ/1C,OAAc,OACrC,MAAM45B,EAA4B,QAAf2c,EAAGrxC,EAAO8W,aAAK,IAAAu6B,OAAA,EAAZA,EAAc1oB,MAAM1oB,GAA4BA,EAAKwE,QAAUA,IACrF,IACIzE,EAAOiN,eAAiBynB,GAC1B10B,EAAO+G,cAAc4hB,MAClBgM,GAAoCA,EAAalwB,QAAUA,IAG9D,OAGF,MAAM8sC,EAAap8C,KAAKmf,MAAMnf,KAAKC,UAAUy7C,IACxC7wC,EAAO2rC,mBACV4F,EAAW5oB,MACR6oB,GAA4BA,EAAUv4B,SAAWjZ,EAAOiZ,SACzDlS,cAAgB,IAIJ,QAFhBuqC,EAAAC,EACG5oB,MAAM6oB,GAA4BA,EAAUv4B,SAAWjZ,EAAOiZ,SAC9DlS,qBAAa,IAAAuqC,GAFhBA,EAEkBre,KAAKjzB,EAAOiN,aAAexI,EAAQiwB,GAErD0c,EAASG,EAAW,EDalBJ,CAAoBN,EAAS7wC,EAAQyE,EAAOqsC,EAAqB,EAG7Dlc,EAAwBA,CAAC50B,EAAsByE,KCbpBgtC,EACjCZ,EACA7wC,EACAyE,EACA2sC,KAEA,IAAKpxC,GAA6B,IAAnB6wC,EAAQ/1C,SAAiB2J,EAAO,OAC/C,MAAM8sC,EAAap8C,KAAKmf,MAAMnf,KAAKC,UAAUy7C,IACxC7wC,EAAO2rC,iBAKV4F,EAAW5oB,MACR6oB,GAA4BA,EAAUv4B,SAAWjZ,EAAOiZ,SACzDlS,cAAgB/G,EAAO+G,cAAc/G,QACpCC,GAA4BA,EAAKwE,QAAUA,IAP9C8sC,EAAW5oB,MACR6oB,GAA4BA,EAAUv4B,SAAWjZ,EAAOiZ,SACzDlS,cAAgB,GAQpBqqC,EAASG,EAAW,EDLlBE,CAAoBZ,EAAS7wC,EAAQyE,EAAOqsC,EAAqB,EAGnE,OACE7mD,eAACyzB,IAAI,CACHrxB,QAAS,EACTzC,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OACtD6E,aAAc,EACdtQ,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAClB,cAAY,gBAAex6B,SAAA,CAE1B4mD,GACC9mD,eAAC8B,IAAI,CAACC,eAAe,gBAAe7B,SAAA,CAClCF,eAAC8B,IAAI,CAACE,WAAW,SAASI,QAAS,EAAElC,SAAA,CACnCC,cAACsnD,IAAU,CAACpnD,SAAU,GAAIZ,MAAOoB,IAAQC,KAAK,OAC9CX,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAA,UAAAD,SAAS5C,EAAE,UAAW,kBAG1B6C,cAACqwC,IAAI,CAAC9uC,QAASA,IAAMulD,GAAgBS,IAAcA,IAAUxnD,SAC3DC,cAAA,UAAAD,SACEF,eAAC8B,IAAI,CAACM,QAAS,EAAGJ,WAAW,SAAQ9B,SAAA,CACnCC,cAAC2nC,KAAU,CAACznC,SAAS,KAAIH,SACtB8mD,EAAc1pD,EAAE,eAAgB,QAAUA,EAAE,eAAgB,UAE/D6C,cAAC2nC,KAAU,CAAA5nC,SAAE8mD,EAAc7mD,cAACwnD,IAAW,IAAMxnD,cAACO,IAAa,gBAOpEsmD,GACChnD,eAAC8B,IAAI,CAAC26B,SAAS,OAAOz6B,WAAW,QAAO9B,SAAA,CACtCF,eAAC8B,IAAI,CAACqiC,KAAK,WAAW/hC,QAAQ,YAAYm/C,GAAI,EAAErhD,SAAA,CAC9CC,cAACoC,IAAG,CACFN,EAAG,CACDw4B,KAAM,0BACNC,GAAI,2BACJx6B,SAEFC,cAACwlD,GAAU,CACT9mD,MAAOvB,EACL,yCACA,oCAEFmwC,gBAAiBnwC,EAAE,qBAAsB,UACzCyoD,gBAAc,EACdH,YAAax/B,EACb4/B,UAAYv9C,GACV+hC,EACEoc,EAAQloB,MAAM3b,GAAMA,EAAEC,eACtBva,OAKPs+C,GAAkBpa,GAAkBC,GACnCzsC,cAACksC,GAAU,CACTK,eAAgBA,EAChBD,iBAAkBA,EAClBG,aAAcA,EACdD,eAAgBA,EAChBG,cAAeA,EACfC,YAAaA,OAInB5sC,cAAC2B,IAAI,CAACqiC,KAAK,WAAW/hC,QAAQ,YAAYJ,WAAW,QAAO9B,SACzD0mD,EACE7wC,QAAQgN,IAAOA,EAAEC,eACjB1hB,KAAKyU,GACJ5V,cAACoqC,GAAW,CACVtoC,EAAG,CACDw4B,KAAM,OACNC,GAAI,2BAENgnB,iBAAkB3rC,EAAO2rC,iBAEzB7iD,MAAOkX,EAAOiZ,OACdnC,MAAO9W,EAAO8W,MACd/P,cAAe/G,EAAO+G,cACtB0tB,aAAehwB,GAAUgwB,EAAaz0B,EAAQyE,GAC9CmwB,sBAAwBnwB,GAAUmwB,EAAsB50B,EAAQyE,GAChE2/B,QAASpkC,EAAO5S,KAAKoR,QAAQ,MAAO,MAN/BwB,EAAO5S,eAYnB,EEvHEykD,GAAgDnpD,IAOtD,IAPuD,SAC5Do2C,EAAQ,aACRC,EAAY,UACZ+S,EAAS,SACT7S,EAAQ,MACRn2C,EAAK,QACLH,GACDD,EACC,MAAM22C,EAAsB7oB,YAAeuoB,GACrCgT,EAAgBr7B,YAAkBo7B,GAQxC,OANA5iB,qBAAU,KACJmQ,IAAwBJ,GACtBH,EAAShkC,QAAQi3C,EAAcjT,EACrC,GACC,CAACA,EAAUO,EAAqBJ,EAAU8S,IAEtC1S,IAAwBJ,EAC7B70C,cAAC47B,IAAW,CAAC16B,MAAM,OAAMnB,SACvBC,cAACiqC,GAA6B,CAC5B+P,QAAQ,QACRt7C,MAAOA,EACPguB,MAAOnuB,EACPqV,MAAO8zC,MAIX1nD,cAACigD,GAAe,CAACvzB,MAAOgoB,GACzB,EClBUkT,GAAsCtpD,IAS5C,IAT6C,MAClDuoB,EAAK,QACLghC,EAAO,WACPC,EAAU,gBACVziC,EAAe,cACfC,EAAa,kBACbyiC,EAAiB,sBACjBC,EAAqB,aACrBrT,GACDr2C,EACC,MAAM,EAAEnB,GAAMC,YAAe,uBAEvBywC,EAAWtJ,iBAAO,MAClB0jB,EAAoBzzB,YAAoBmgB,GACxC98B,EAAWuU,YAAe9G,GAC1B1N,EAAawU,YAAe/G,IAE3BhM,EAAmB6uC,GAAch2B,YAAe81B,IAChDG,EAAcC,GAAmBl2B,YAAe61B,IAChDhwC,EAAQswC,GAAaxiC,mBAA8B,CACxD,CACE9iB,GAAIolD,EACJhsC,KAAM9C,KAsBV,OAJAyrB,qBAAU,KACRmjB,GAAmB,GAClB,CAACpwC,EAAUD,EAAYqwC,IAGxBpoD,eAACuC,IAAG,CAACvB,GAAI2iC,GAAezjC,SAAA,CACtBC,cAACsoD,IAAS,CACRvlD,GAAG,YACH8kD,QAASA,EACT79B,KAAMnD,EACN0hC,mBAAmB,EACnBC,mBAAmB,EACnBC,kCAAkC,EAClCC,cA3BqB90C,IAAmC,IAAD+0C,EAAAC,EAAAC,EAAAC,EAE3D,GADAb,KACKr0C,EAAM6yC,QAAQ/1C,SAAWkD,EAAMmE,OAAOrH,OAAQ,OACnD,MAAMq4C,EAAyB,QAAfJ,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmBzsC,KAChC6sC,EAA8B,QAAfH,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB/lD,GACvC6Q,EAAMmE,SAAWA,GACnBswC,EAAUz0C,EAAMmE,QAEdixC,IACFd,EAAWa,GACXX,EAAgBY,GAClB,EAiBIvoD,KAAK,KACLkC,WAAW,SACXoV,OAAQA,EACRkxC,cAAc,EACdlT,MAAO,CAAEmT,YAAa,WAEN,IAAjBriC,EAAMnW,QACL1Q,cAACoC,IAAG,CAAC+mD,QAAS,EAAEppD,SACdC,cAAC0+B,IAAgB,CACfx9B,MAAM,OACNqF,OAAQ,OACRuhB,MAAO3qB,EAAE,gBAAiB,WAC1BqD,QAAQ,aAIdR,cAAC4tC,GAAmB,CAClB9jB,eAAgBg+B,EAChBziC,gBAAiBA,EACjBC,cAAeA,EACfuoB,SAAUA,EACVC,wBAAyB,QAEvB,ECtGGsb,GAAYC,IACvB,OAAQA,GACN,QACA,IAAK,UACH,MAAO,UACT,IAAK,UACL,IAAK,QACL,IAAK,mBACL,IAAK,KACH,OAAOA,EACX,ECLIC,GAAmBA,KACvB,MAAM,KAAEjlB,GAASvlC,eAEjB,OAAOulC,EAAOrkC,cAAC8jC,GAAa,IAAM9jC,cAACojC,GAAa,GAAG,EAGxCmmB,GAA0BjrD,IAAmB,IAAlB,SAAEyB,GAAUzB,EAClD,OACEuB,eAAC2pD,KAAgB,CAACH,OAAQD,GrODTtsD,oBqOCyBiD,SAAA,CACxCC,cAACspD,GAAgB,IAChBvpD,IACgB,ECVV4iD,GAA4CrkD,IAIlD,IAJmD,SACxDyB,EAAQ,OACR0gC,KACGtG,GACJ77B,EACC,MAAM,IAAEO,GAAQC,eAQV2qD,EAA4B,CAChChqD,QAASZ,EAAI,CAAEM,GAAI,YAAcuB,IAAQC,KAAK,MAC9CrB,MAAOoB,IAAQ8qC,MACf3qC,GAAI,CACF,SAAU,CACRpB,QAASZ,EAAI,CAAEwB,GAAIK,IAAQC,KAAK,OAChCrB,MAAOoB,IAAQ8qC,MACf9J,QAAS,OACTliC,OAAQ,UAIRkqD,EAA8B,CAClCjqD,QAASZ,EAAI,CAAEM,GAAI,YAAcuB,IAAQo8B,KAAK,MAC9Cx9B,MAAOT,EAAI,CAAEM,GAAI,cAGbwqD,EAASlpB,EAASgpB,EAAeC,EAEvC,OACE1pD,cAACJ,IAAM,CAzBP8pC,OAAQ,UACR0G,SAAU,OACVjwC,SAAU,kBACV0+B,aAAa,KAsBiB8qB,KAAYxvB,EAAWp6B,SAClDA,GACM,ECnCA2iD,GAAsDpkD,IAI5D,IAJ6D,SAClEyB,EAAQ,MACRsa,KACGuvC,GACJtrD,EACC,MAAMurD,EAAUhlB,IAAMilB,SAAS3oD,IAAIpB,GAAWgqD,GAC5CllB,IAAMmlB,aAAaD,EAAO,IAAKA,EAAM74B,MAAOuP,OAAQspB,EAAM74B,MAAM7W,QAAUA,MAG5E,OACEra,cAACszB,IAAI,CAAC22B,gBAAgB,MAAMn2B,aAAa,SAAS5yB,MAAM,UAAW0oD,EAAS7pD,SACzE8pD,GACI,ECXEK,GAA6BA,KACxC,MAAM,EAAE/sD,GAAMC,YAAe,sBAErB00B,OAAQvG,EAAkBvB,KAAMxgB,GCHjCmiB,aAAYJ,KDIZ4+B,EAAWC,GAAgBl4B,YAAexZ,IAkBjD,OANAosB,qBAAU,KACJt7B,GACF4gD,GAAa,EACf,GACC,CAAC5gD,EAAU4gD,IAGZvqD,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACqqD,IAAU,CACTC,OAAO,OACPC,SAAU,EACVtY,UAAU,EACV/e,SAAW2d,GAtBK6B,KACpB,MAAM8X,EAAW,IAAIC,SACrBD,EAASv/B,OAAO,eAAgBynB,EAAM,IACtCnnB,EAAiBi/B,EAAS,EAmBFE,CAAa7Z,GAAM9wC,SAEvCC,cAACJ,IAAM,CAACoB,GAAI,EAAGV,UAAWN,cAAC2qD,KAAQ,IAAKnqD,QAAQ,YAAWT,SACxD5C,EAAE,aAAc,mBAGpBgtD,GACCnqD,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAC4qD,GAA4B,CAC3BztB,OAAQgtB,EACR/sB,QA1BUlI,KAClBk1B,GAAa,EAAM,EA0BXS,eAAgBrhD,QAIrB,EE3BMohD,GAA4EtsD,IAIlF,IAADwsD,EAAA,IAJoF,OACxF3tB,EAAM,eACN0tB,EAAc,QACdztB,GACD9+B,EACC,MAAM,EAAEnB,GAAMC,YAAe,gCAEvBo1B,EAAeA,KACnB4K,GAAS,EAGX,OACEv9B,eAACk/B,KAAK,CAAC5B,OAAQA,EAAQC,QAAS5K,EAAazyB,SAAA,CAC3CC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACXF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,eAAgB,kBAAkB4C,SAAA,CAC3DF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACk+B,KAAY,CAAC5+B,MAAOoB,IAAQC,KAAK,OAClCX,cAAA,QAAAD,SAAO5C,EAAE,gBAAiB,uBAE5B6C,cAACm+B,KAAgB,OAEnBn+B,cAACo+B,KAAS,CAACC,SAAS,UAASt+B,SAC3BC,cAAC4yB,IAAY,CAAA7yB,SACV8qD,GACChrD,eAAA,OAAAE,SAAA,CACEC,cAAC0+B,IAAgB,CACf5W,MAAK,mCAAAjrB,OAAqCguD,EAAeE,SACzDxkD,OAAO,UACP/F,QAAQ,SACRQ,GAAI,IAEmB,IAAxB6pD,EAAeG,MACdnrD,eAAA,OAAAE,SAAA,CACEC,cAAC0+B,IAAgB,CACf5W,MAAK,6BAAAjrB,OAA+BguD,EAAeG,MACnDzkD,OAAO,QACP/F,QAAQ,SACRQ,GAAI,IAENhB,cAAA,OAAK+1C,MAAO,CAAE1X,SAAU,OAAQqlB,UAAW,QAASxjD,SAAU,QAASH,SACtD,OAAd8qD,QAAc,IAAdA,GAAuB,QAATC,EAAdD,EAAgBI,eAAO,IAAAH,OAAT,EAAdA,EAAyB3pD,KAAI,CAACgM,EAAQ08B,IAEnChqC,eAAA,MAAgBk2C,MAAO,CAAEmV,UAAW,OAAQC,YAAa,QAASprD,SAAA,CAChEC,cAAA,KAAAD,SAAA,GAAAlD,OAAOM,EAAE,MAAO,OAAM,OAAAN,OAAMsQ,EAAOi+C,OAAU,KAC7CvrD,eAAA,KAAAE,SAAA,CAAG,IAAC,GAAAlD,OAAIM,EAAE,iBAAkB,uBAAyB,GAAAN,OACjDsQ,EAAOkmB,WAHJwW,iBAc3BhqC,eAAC++B,KAAW,CAACh9B,eAAe,MAAK7B,SAAA,CAC/BC,cAACszB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,IACrCjC,cAACJ,IAAM,CAAC2B,QAASixB,EAAazyB,SAAE5C,EAAE,qBAAsB,mBAGtD,EC/DCkuD,GAAsC/sD,IAO5C,IAP6C,eAClDwrB,EAAc,MACdwhC,EAAK,QACLzD,EAAO,gBACPxiC,EAAe,cACfC,EAAa,aACbqvB,GACDr2C,EACC,MAAMuvC,EAAWtJ,iBAAO,OACjBlrB,EAAmB6uC,GAAch2B,YACtC5Z,KAEK6vC,EAAcC,GAAmBl2B,YACtC3Z,IAEI0vC,EAAoBzzB,YAAoBmgB,GACxC98B,EAAWuU,YAAe9G,GAC1B1N,EAAawU,YAAe/G,IAE3BtN,EAAQswC,GAAaxiC,mBAAmC,CAC7D,CACE9iB,GAAIolD,EACJhsC,KAAM9C,KAsBV,OAJAyrB,qBAAU,KACRmjB,GAAmB,GAClB,CAACpwC,EAAUD,EAAYqwC,IAGxBpoD,eAACuC,IAAG,CAACvB,GAAI2iC,GAAezjC,SAAA,CACtBC,cAACsoD,IAAS,CACRvlD,GAAG,aACH8kD,QAASA,EACT79B,KAAW,OAALshC,QAAK,IAALA,IAAS,GACf/C,mBAAmB,EACnBC,mBAAmB,EACnBC,kCAAkC,EAClCC,cA3BqB90C,IAAkC,IAAD+0C,EAAAC,EAAAC,EAAAC,EAE1D,GADAb,KACKr0C,EAAMmE,OAAOrH,OAAQ,OAC1B,MAAMq4C,EAAyB,QAAfJ,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmBzsC,KAChC6sC,EAA8B,QAAfH,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB/lD,GACvC6Q,EAAMmE,SAAWA,GACnBswC,EAAUz0C,EAAMmE,QAEdixC,IACFd,EAAWa,GACXX,EAAgBY,GAClB,EAiBIvoD,KAAK,KACLkC,WAAW,SACXoV,OAAQA,EACR+rC,UAAU,aACVa,aAAc,EACdsE,cAAc,IAEhBjpD,cAAC4tC,GAAmB,CAClB9jB,eAAgBA,EAChBzE,gBAAiBA,EACjBC,cAAeA,EACfuoB,SAAUA,EACVC,wBAAyB,QAEvB,E,aC5FK,OAA0B,+CCelC,MAAMyd,GAAsBA,KACjC,MAAM,EAAEpuD,GAAMC,YAAe,WAEvB,KAAEinC,EAAI,IAAExlC,GAAQC,eAEtB,OACEkB,cAACoC,IAAG,CACFvB,GAAI,CACF23C,GAAI35C,EAAI,CAAEM,GAAI,OAAQkB,GAAI,CAAEi6B,KAAM,WAAYyM,GAAI,SAAUxM,GAAI,cAChE6mB,GAAIviD,EAAI,CAAEM,GAAI,UAAWkB,GAAI,CAAEi6B,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,cAChEsC,gBAAiBh+B,EAAI,CAAEM,GAAI0kC,GAA8BxjC,GAAI,cAC7DN,SAEFC,cAAColC,IAAS,CAAArlC,SACRF,eAAC8B,IAAI,CACH26B,SAAU,CAAEhC,KAAM,OAAQC,GAAI,UAC9B34B,eAAgB,CACd04B,KAAMz7B,EAAI,CAAEM,GAAI,gBAAiBkB,GAAI,eACrCk6B,GAAI17B,EAAI,CAAEwB,GAAI,YAEhBwB,WAAY,SAAS9B,SAAA,CAErBC,cAAC2nC,KAAU,CACT9mC,GAAI,CACF2qD,UAAW,CAAElxB,KAAM,OAAQC,GAAI,OAC/B14B,WAAY,SACZmxB,GAAI,CAAEsH,KAAM,UAAWyM,GAAI,UAAWxM,GAAI,GAC1Cr6B,SAAU,CAAEo6B,KAAM,KAAMyM,GAAI,MAC5BzlC,WAAY,QACZmqD,cAAe,SACfnsD,MAAO,SACPS,SAEDskC,EACC,wHAEAxkC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACG5C,EACC,YACA,8EACC,IAAG,GAAAN,QACF,IAAIgG,MAAOmE,cAAa,uBAIlChH,cAAC2B,IAAI,CACH6pD,UAAW,CAAElxB,KAAM,OAAQC,GAAI,QAC/B34B,eAAgB,CAAE04B,KAAM,aAAcC,GAAI,UAAWx6B,SAErDC,cAACqwC,IAAI,CACH5hB,KAAK,+BACLmF,OAAO,SACPuQ,GAAI,CAAE5J,GAAI,QACV15B,GAAI,CACFrB,OAAQ,YACRH,YAAa,cACb87B,QAAS,eACTsG,OAAQ,CACNjiC,OAAQ,YACRH,YAAa,WACbsiC,aAAc,MACdwB,UAAW,wBAEbpjC,SAEFC,cAACylC,IAAK,CACJC,IAAKgmB,GACL5pD,EAAG,CAAEw4B,KAAM,SAAUyM,GAAI,WACzBvV,EAAG,CAAE8I,KAAM,SAAUyM,GAAI,UACzBlB,IAAK1oC,EAAE,cAAe,uBACtBwuD,UAAU,sBAMhB,ECpEGC,GAAwBA,KACnC,MAAM,EAAEzuD,GAAMC,YAAe,UACvB2B,EAAWC,cAEX6sD,EAAa,CACjB1uD,EAAE,wCAAyC,yCAC3CA,EAAE,0BAA2B,2BAC7BA,EAAE,gBAAiB,iBACnBA,EAAE,uBAAwB,gCAC1BA,EAAE,OAAQ,QACVA,EAAE,aAAc,eAGlB,OACE0C,eAAC+iC,KAAI3G,IAAG,CAACn7B,GAAG,SAASukC,UAAU,aAAYtlC,SAAA,CACzCC,cAACoC,IAAG,CAACo2C,GAAI,OAAQ3b,gBAAgB,UAAS98B,SACxCF,eAACulC,IAAS,CAAArlC,SAAA,CACRF,eAAC8B,IAAI,CACH26B,SAAU,CAAEhC,KAAM,OAAQC,GAAI,UAC9B34B,eAAgB,gBAChBC,WAAY,SAAS9B,SAAA,CAErBC,cAACylC,IAAK,CACJC,IAAKC,GACL7jC,EAAG,UACH0vB,EAAG,UACHqU,IAAK1oC,EAAE,WAAY,wBAErB0C,eAACyzB,IAAI,CAACQ,aAAc,SAAU7xB,QAAS,OAAQJ,WAAW,SAAQ9B,SAAA,CAChEC,cAAC8rD,IAAY,CAACzmB,UAAU,yBACxBrlC,cAAC+rD,IAAW,CAAC1mB,UAAU,mBACvBrlC,cAACgsD,KAAS,CAAC3mB,UAAU,yBAGzBrlC,cAAC+zB,IAAO,CACNlzB,GAAI,CACFxB,YAAa4sD,aAAe,WAAYltD,EAAW,GAAM,IACzDi0B,GAAI,OACJhyB,GAAI,YAGRnB,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC2nC,KAAU,CACT9mC,GAAI,CACFy6B,WAAY,IACZmwB,cAAe,WACfvrD,SAAU,OACVoB,WAAY,SACZhC,MAAO,QACP0zB,GAAI,WACJjzB,SAED5C,EAAE,eAAgB,kBAErB6C,cAAC4iC,KAAI3G,IAAG,CACNjJ,GAAI,EACJmI,QAAS,OACTmB,SAAU,OACVz6B,WAAW,SACXuuC,SAAU,CAAE7V,GAAI,OAChB2xB,cAAe,UACfrrD,GAAI,CACF,2BAA4B,CAC1BV,SAAU,YAEZ,2BAA4B,CAC1BA,SAAU,YAEZJ,SAED8rD,EAAW1qD,KAAI,CAACgrD,EAASppD,IAEtB/C,cAAC+hC,KAAM,CAAUlgC,WAAW,OAAOwjC,UAAU,aAAYtlC,SACvDC,cAACqwC,IAAI,CAEHxvC,GAAI,CACFmyB,GAAI,UACJ1zB,MAAO,QACPY,SAAU,OACVurD,cAAe,EACfjsD,OAAQ,YACR87B,WAAY,SACZ8wB,eAAgB,OAChBjxB,QAAS,eACT97B,YAAa,cACbgtD,oBAAqB,MACrBnrD,MAAO,cACPsgC,OAAQ,CACNliC,MAAO,QACP8sD,eAAgB,aAElB,oBAAqB,CACnB9sD,MAAOukC,GACPuoB,eAAgB,YAChBvvB,gBAAgB,GAADhgC,OAAK6D,IAAQC,KAAK,QAEnCZ,SAEDosD,GAxBIppD,IAFIA,UAiCrB/C,cAAC+zB,IAAO,CACNlzB,GAAI,CACFxB,YAAa4sD,aAAe,WAAYltD,EAAW,GAAM,IACzDiC,GAAI,eAMZhB,cAACurD,GAAS,MACF,EC1IC,WAA0B,uCCE1B,QACb,CACEe,QAAS,cACT1mB,KCHA,65YDIAnX,KAAM,wCACNvtB,MAAO,CAAEo5B,KAAM,UAAWyM,GAAI,WAAYxM,GAAI,YAC9Cn7B,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,WAE7C,CACE+xB,QAAS,YACT1mB,KCTI,qsLDUJnX,KAAM,uCACNvtB,MAAO,CAAEo5B,KAAM,OAAQyM,GAAI,OAAQxM,GAAI,UACvCn7B,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,WAE7C,CACE+xB,QAAS,cACT1mB,KCdA,qwSDeAnX,KAAM,+CACNvtB,MAAO,CAAEo5B,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,QAC1Cn7B,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,WAE7C,CACE+xB,QAAS,UACT1mB,KCPA,qwcDQAnX,KAAM,kCACNvtB,MAAO,CAAEo5B,KAAM,SAAUyM,GAAI,WAC7B3nC,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,WAEjC,CACEulB,QAAS,gBACT1mB,KC1BA,69RD2BAnX,KAAM,4CACNvtB,MAAO,CAAEo5B,KAAM,OAAQyM,GAAI,QAASxM,GAAI,WACxCn7B,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,SAAUxM,GAAI,WAE/C,CACE+xB,QAAS,aACT1mB,KC/BA,i7SDgCAnX,KAAM,iCACNvtB,MAAO,CAAEo5B,KAAM,UAAWyM,GAAI,UAAWxM,GAAI,WAC7Cn7B,OAAQ,CAAEk7B,KAAM,UAAWyM,GAAI,SAAUxM,GAAI,YAE/C,CACE+xB,QAAS,iBACT1mB,KCpCA,61SDqCAnX,KAAM,kCACNvtB,MAAO,CAAEo5B,KAAM,OAAQyM,GAAI,QAASxM,GAAI,YACxCn7B,OAAQ,CAAEk7B,KAAM,SAAUyM,GAAI,YAEhC,CACEulB,QAAS,YACT1mB,KC1CI,q9MD2CJnX,KAAM,yCACNvtB,MAAO,CAAEo5B,KAAM,OAAQyM,GAAI,UAAWxM,GAAI,WAC1Cn7B,OAAQ,CAAEk7B,KAAM,SAAUyM,GAAI,SAAUxM,GAAI,YAE9C,CACE+xB,QAAS,uBACT1mB,KC/CA,i/YDgDAnX,KAAM,uCACNvtB,MAAO,CAAEo5B,KAAM,SAAUC,GAAI,WAC7Bn7B,OAAQ,CAAEk7B,KAAM,SAAUyM,GAAI,YAEhC,CACEulB,QAAS,aACT1mB,KCpDA,6mVDqDAnX,KAAM,mCACNvtB,MAAO,CAAEo5B,KAAM,UAAWyM,GAAI,UAAWxM,GAAI,QAC7Cn7B,OAAQ,CAAEk7B,KAAM,OAAQyM,GAAI,YAE9B,CACEulB,QAAS,WACT1mB,KC1DG,qhWD2DHnX,KAAM,wCACNvtB,MAAO,CAAEo5B,KAAM,UAAWyM,GAAI,WAAYxM,GAAI,YAC9Cn7B,OAAQ,CAAEk7B,KAAM,OAAQyM,GAAI,OAAQxM,GAAI,aE1ErC,MAAMgyB,GAAgCA,IAEzCvsD,cAACszB,IAAI,CACH0U,oBAAqB,CACnB1N,KAAM,iBACNyM,GAAI,iBACJxM,GAAI,kBAEN2xB,cAAe,CAAE5xB,KAAM,OAAQC,GAAI,WACnCwB,WAAY,CAAEzB,KAAM,WAAYyM,GAAI,SAAUxM,GAAI,YAClD14B,WAAW,SACX6mC,aAAa,SAAQ3oC,SAEpBysD,GAAkBrrD,KAAI,CAAC0U,EAAMg0B,IAC5B7pC,cAACqwC,IAAI,CAEH5hB,KAAM5Y,EAAK4Y,KACXmF,OAAO,SACPp0B,OAAO,YACPH,YAAY,cACZ87B,QAAQ,eACR9J,EAAE,QACFmQ,OAAQ,CAAElQ,GAAI,aACd/xB,QAAS,CAAE+xB,GAAI,aACfmQ,OAAQ,CACNjiC,OAAQ,YACRH,YAAa,WACbsiC,aAAc,MACdwB,UAAW,uBACXpjC,SAEFC,cAACylC,IAAK,CACJC,IAAK7vB,EAAK+vB,KACV9jC,EAAG,IAAK+T,EAAK3U,OACbswB,EAAG,IAAK3b,EAAKzW,QACbusD,UAAU,UACV9lB,IAAKhwB,EAAKy2C,WArBPziB,OCEF4iB,GAAwBA,KACnC,MAAM,EAAEtvD,GAAMC,YAAe,UACvB2B,EAAWC,cAYX6sD,EAAa,CAVK,CACtB,CAAC1uD,EAAE,eAAgB,iBAAkB,CACnC,CAACA,EAAE,wCAAyC,0CAC1C,0FACF,CAACA,EAAE,aAAc,eACf,2DACF,CAACA,EAAE,uBAAwB,yBAA0BJ,KAMzD,OACE8C,eAAC+iC,KAAI3G,IAAG,CAACn7B,GAAG,SAASukC,UAAU,aAAYtlC,SAAA,CACzCC,cAACoC,IAAG,CACFo2C,GAAI,CAAEle,KAAM,UAAWyM,GAAI,OAAQxM,GAAI,WACvC6mB,GAAI,CAAE9mB,KAAM,UAAWyM,GAAI,WAC3BlK,gBAAgB,WAAU98B,SAE1BF,eAACulC,IAAS,CAAArlC,SAAA,CACRC,cAACqwC,IAAI,CACH5hB,KAAK,IACLmF,OAAO,SACP9L,MAAM,KACNjnB,GAAI,CACFrB,OAAQ,YACRH,YAAa,cACb87B,QAAS,eACTsG,OAAQ,CACNjiC,OAAQ,YACRH,YAAa,WACbsiC,aAAc,MACdwB,UAAW,wBAEbpjC,SAEFC,cAACylC,IAAK,CACJC,IAAKE,GACL9jC,EAAG,CAAEw4B,KAAM,QAASyM,GAAI,UAAWxM,GAAI,SACvC/I,EAAG,CAAE8I,KAAM,SAAUyM,GAAI,UACzBlB,IAAK1oC,EAAE,WAAY,0BAGvB6C,cAAC+zB,IAAO,CACNlzB,GAAI,CACFxB,YAAa4sD,aAAe,WAAYltD,EAAW,GAAM,IACzDi0B,GAAI,UAGRhzB,cAAA0yB,WAAA,CAAA3yB,SACG8rD,EAAW1qD,KAAI,CAACgrD,EAASppD,KACxB,MAAM2pD,EAAe5hC,OAAOK,KAAKghC,GAAS,GACpCQ,EAAe7hC,OAAO5U,OAAOi2C,GAAS,GAC5C,OACEtsD,eAACkiC,KAAM,CAAUlgC,WAAW,OAAM9B,SAAA,CAChCC,cAAC2nC,KAAU,CACT9mC,GAAI,CACFy6B,WAAY,IACZmwB,cAAe,WACfvrD,SAAU,OACVoB,WAAY,SACZhC,MAAO,QACP0zB,GAAI,WACJjzB,SAED2sD,IAEH1sD,cAACszB,IAAI,CACHQ,aAAc,CAAEwG,KAAM,MAAOyM,GAAI,UACjCiB,oBAAqB,CAAE1N,KAAM,OAAQyM,GAAI,0BACzC9kC,QAAS,CAAE6kC,GAAI,IAAKC,GAAI,WAAY6lB,KAAM,WAC1C/qD,WAAW,SACXmxB,GAAI,EAAEjzB,SAEL+qB,OAAOC,QAAQ4hC,GAAcxrD,KAAI,CAAA7C,EAAeuuD,KAAS,IAAtB77C,EAAKqJ,GAAM/b,EAAA,OAC7C0B,cAACqwC,IAAI,CAEH5hB,KAAMpU,EACNuZ,OAAO,SACP9L,MAAO9W,EACPnQ,GAAI,CACFs6B,QAAS,eACTnI,GAAI,SACJy4B,cAAe,SACfnwB,WAAY,SACZh8B,MAAO,WACPE,OAAQ,YACRH,YAAa,cACbmiC,OAAQ,CACNliC,MAAO,QACP8sD,eAAgB,aAElB3qB,OAAQ,CACNV,GAAI,EACJY,aAAc,SACdtiC,YAAa,WACb8jC,UAAU,uBAEZ5jC,QAAS,CACPD,MAAO,aAETS,SAEDiR,GA3BI67C,EA4BA,QAlDA9pD,EAqDJ,WAOnB/C,cAACoC,IAAG,CACFvB,GAAI,CACF23C,GAAI,CAAEle,KAAM,OAAQC,GAAI,UACxB6mB,GAAI,CAAE9mB,KAAM,SAAUyM,GAAI,WAAYxM,GAAI,QAC1C8O,WAAY,WACZtpC,SAEFF,eAACulC,IAAS,CAAArlC,SAAA,CACRC,cAAC2nC,KAAU,CACT9mC,GAAI,CACFvB,MAAO,WACP0zB,GAAI,CAAEsH,KAAM,OAAQyM,GAAI,OAAQxM,GAAI,QACpCe,WAAY,IACZmwB,cAAe,YACf1rD,SAED5C,EAAE,4BAA6B,+BAElC6C,cAACusD,GAAmB,SAIxBvsD,cAACurD,GAAS,MACF,EC5JD5S,GAAsBA,KACjC,MAAM,KAAEtU,GAASvlC,eAEjB,OAAOulC,EAAOrkC,cAAC4rD,GAAW,IAAM5rD,cAACysD,GAAW,GAAG,E,kCCJjDK,KACGC,IAAIC,MACJD,IAAIE,MACJjkC,KAAK,CACJkkC,QAAS,CACPC,SAAU,gCAEZC,MAAO,CACLC,aAAa,GAEfC,IrPAwBxwD,aqPCxBywD,KAAM,MACNC,aAAa,EACbC,GAAI,CAAC,SAAU,QACfC,UAAW,SACXC,cAAe,CACbC,aAAa,GAEfC,cAAc,IAGHf,GAAI,EAAJA,I,wCCjBf,MAAMgB,GAAc,IAAIC,KACJ,IAAIC,KAAoB,CAC1CC,OAAQ,CACNC,iBtPAFpxD,mPsPCEqxD,yBAAyB,EACzBC,uBAAuB,EACvBC,6BAA6B,EAC7BC,8BAA8B,EAC9BC,wBAAwB,EACxBC,8BAA8B,EAC9BC,WAAY,CAACX,OAILY,kBAQGC,oBAAeb,IANKxvD,IAAmB,IAAlB,SAAEyB,GAAUzB,EAC9C,OACE0B,cAAC4uD,KAAmBC,SAAQ,CAACx0C,MAAOyzC,GAAY/tD,SAAEA,GAAuC,ICzB7F,SAAS+uD,GAAWz0C,GAClB,MAAwB,oBAAVA,CAChB,CCCA,MAAM00C,GAAa,IAAIC,IAAW,CAEhCC,eAAe,EAEfC,iBAAkBA,SAGPC,GAAgBA,KAC3B,MACMC,EAAWxmD,IACVymD,EAAsBC,GDSxB,SACLnZ,EACAnlC,EACAu+C,GAEA,MAAMC,EAAanyD,uBAChBoyD,KACEF,EAAUv7C,OAAO07C,eAAiB17C,OAAO27C,cAAcC,QACtD5+C,EACAjG,KAAKC,UAAUykD,GAChB,GAEH,CAACz+C,EAAKu+C,KAGDl1C,EAAO86B,GAAYtvB,oBAAY,KACpC,MAAMgqC,GAAeN,EAAUv7C,OAAO07C,eAAiB17C,OAAO27C,cAAcG,QAAQ9+C,GACpF,IACE,OAAoB,OAAhB6+C,EACEf,GAAW3Y,IACbqZ,EAAWrZ,KACJA,MAETqZ,EAAWrZ,GACJA,GAEFprC,KAAKmf,MAAM2lC,EACpB,CAAE,MAAOrnB,GACP,OAAIsmB,GAAW3Y,IACbqZ,EAAWrZ,KACJA,MAETqZ,EAAWrZ,GACJA,EACT,KAeF,MAAO,CAAC97B,EAZgBhd,uBACrB0yD,IACC5a,EAAS4a,GACTP,EAAWO,EAAS,GAEtB,CAAC5a,EAAUqa,IAGanyD,uBAAY,MACnCkyD,EAAUv7C,OAAO07C,eAAiB17C,OAAO27C,cAAcK,WAAWh/C,EAAI,GACtE,CAACA,EAAKu+C,IAGX,CC3D0DU,CACtD,GAHyB,sBAKzB,GAuCF,OAhCA5mC,MxPT2BvsB,qFwPUxBuT,MAAMkX,GAAQA,EAAIC,SAClBnX,MAAMmX,IAC4C,IAA7CsD,OAAOK,KAAKkkC,GAAsB3+C,QACpC4+C,EAAwB9nC,EAC1B,IAEDI,OAAM,KACL0nC,EAAwB,GAAG,IAQ/BxqB,qBAAU,KACR,GAAIuqB,EAAsB,CACxB,MAAMa,EAAanlD,KAAKmf,MAAMnf,KAAKC,UAAUqkD,IAC7CN,GAAWoB,YAAYD,EAAWz/C,SACpC,IACC,CAAC4+C,IAKJvqB,qBAAU,KACRiqB,GAAWqB,cAAc,CACvBC,SAAUjB,GACV,GACD,CAACA,IAEGL,EAAU,ECxCbuB,GAAgBA,CACpBxa,EACAya,EACAC,EACAtvD,KAEO,CACLxC,MAAOo3C,EACPjL,WAAY,CACVvrC,MAAa,OAANixD,QAAM,IAANA,IAAU,UACjB9wD,QAAiB,OAAR+wD,QAAQ,IAARA,IAAY,UACrBtvD,MAAY,OAALA,QAAK,IAALA,IAASwpC,MAKTA,GAAiBxI,aAAQ,MAEzBuuB,GAAoBA,KAC/B,MAAM,EAAEtzD,GAAMC,YAAe,sBAC7B,OAAOkzD,GACLnzD,EAAE,gBAAiB,iBACnBuD,IAAQ8qC,MACR9qC,IAAQ2gC,MACRqJ,GACD,EC9BUgmB,GAA6DpyD,IAInE,IAJoE,OACzEiI,EAAM,cACNoqD,GAAgB,KACb7kB,GACJxtC,EACC,MAAMsyD,ED4B8BC,MACpC,MAAM,EAAE1zD,GAAMC,YAAe,sBAE7B,MAAO,CACL0zD,MAAOR,GAAcnzD,EAAE,QAAS,SAAUuD,IAAQ8qC,MAAO9qC,IAAQC,KAAK,MACtE,oBAAqB2vD,GACnBnzD,EAAE,oBAAqB,0BACvBqP,EACA9L,IAAQC,KAAK,KACbuhC,aAAQ,KAEV,2BAA4BouB,GAC1BnzD,EAAE,2BAA4B,iCAC9BqP,EACA9L,IAAQC,KAAK,KACbuhC,aAAQ,KAEV,sBAAuBouB,GACrBnzD,EAAE,sBAAuB,uBACzBuD,IAAQ8qC,MACR5H,GACA1B,aAAQ,KAEV,mBAAoBouB,GAClBnzD,EAAE,mBAAoB,oBACtBuD,IAAQ8qC,MACR5H,GACA1B,aAAQ,KAEV,2BAA4BouB,GAC1BnzD,EAAE,2BAA4B,iCAC9BqP,EACAo3B,GACA1B,aAAQ,KAEVoJ,WAAYglB,GACVnzD,EAAE,aAAc,mBAChBqP,EACAo3B,IAEF,qBAAsB0sB,GACpBnzD,EAAE,qBAAsB,2BACxBqP,EACA9L,IAAQ+qC,OAAO,KACfvJ,aAAQ,KAEV,yCAA0CouB,GACxCnzD,EAAE,uCAAwC,+CAC1CqP,EACA9L,IAAQ+qC,OAAO,KACfvJ,aAAQ,KAEV,4BAA6BouB,GAC3BnzD,EAAE,0BAA2B,kCAC7BqP,EACA9L,IAAQ+qC,OAAO,KACfvJ,aAAQ,KAEV,8BAA+BouB,GAC7BnzD,EAAE,8BAA+B,oCACjCqP,EACA9L,IAAQ+qC,OAAO,KACfvJ,aAAQ,KAEV6uB,QAAST,GAAcnzD,EAAE,UAAW,gBAAYqP,EAAWo3B,IAC3DyH,UAAWilB,GACTnzD,EAAE,YAAa,kBACfqP,EACAo3B,IAEH,EClGgBitB,IACX,EAAE1zD,GAAMC,YAAe,gBAcvBkH,GAXJ0sD,EAW6CzqD,EANzCukB,OAAOK,KAAKylC,GAAU96B,QAAQk7B,IAA0B,EACnDJ,EAASI,GAEX,IAAKP,KAAqB/xD,MAAOsyD,IARxCA,MAaF,OACEhxD,cAAA0yB,WAAA,CAAA3yB,SACG4wD,EACC9wD,eAACo7B,IAAM,CAAAl7B,SAAA,CACLC,cAACisC,IAAK,CACJ,cAAY,8BACR3nC,EAAkBumC,cAClBiB,EACJhqC,EAAG,EACH0vB,EAAG,IAGLxxB,cAAA,UAAQ,cAAY,OAAMD,SAAEuE,EAAkB5F,QAC9CmB,eAAC8yB,KAAc,CAAA5yB,SAAA,CACZ5C,EAAE,qBAAsB,sBAAsB,KAAGmH,EAAkB5F,YAIxEmB,eAACosC,IAAK,CACJ,cAAY,2BACZ9Q,QAAQ,OACRt5B,WAAW,SACXD,eAAe,SACf1B,SAAS,KACTsxB,EAAG,KACCltB,EAAkBumC,cAClBiB,EAAgB/rC,SAAA,CAEpBC,cAAA,UAAQ,cAAY,OAAMD,SAAEuE,EAAkB5F,QAC9CmB,eAAC8yB,KAAc,CAAA5yB,SAAA,CACZ5C,EAAE,qBAAsB,sBAAsB,KAAGmH,EAAkB5F,aAIzE,ECpDMuyD,GAA0D3yD,IAKhE,IALiE,YACtE4yD,EAAW,aACXC,EAAY,YACZC,EAAW,aACXC,GAAe,GAChB/yD,EACC,MAAMS,EAAWC,cACjB,OACEa,eAAC6mC,IAAe,CAAA3mC,SAAA,CACdC,cAACoC,IAAG,CAACpB,GAAI,EAAEjB,SACRsxD,EACCrxD,cAAC2mC,GAAmB,CAClBuI,YAAanwC,EACb6nC,cAAe,CAAEtM,KAAM,GAAIuM,GAAI,GAAItM,GAAI,IACvC4U,SAAUgiB,EACV/hB,WAAYgiB,EAAYrxD,SAEvBmxD,EAAY/qD,eAGfnG,cAACoC,IAAG,CAACO,WAAW,SAASzC,SAAS,KAAIH,SACnCmxD,EAAY/qD,iBAIlBpH,IAAuB,OAAXmyD,QAAW,IAAXA,OAAW,EAAXA,EAAa5sD,oBACxBtE,cAAC0wD,GAA0B,CAAC1vD,GAAI,EAAGuF,OAAQ2qD,EAAY5sD,sBAEzC,EC5CTgtD,GAAiBj3C,GAChB,OAALA,QAAK,IAALA,IAAS,ICoBZk3C,GAAYA,CAAC7yD,EAAe2b,KACzB,CAAE3b,QAAO2b,MAAOA,IAGnBm3C,GAAaA,CACjBr0D,EACAknC,EACAlvB,EACAs8C,EACApjC,EAIAqjC,KACI,IAADC,EAAAC,EAAAC,EACH,MAAO,CACLN,GACEp0D,EAAE,wBAAyB,yBAEvBm0D,GADJjtB,EAC8B,OAAZlvB,QAAY,IAAZA,OAAY,EAAZA,EAAcvO,UACH,OAAX8qD,QAAW,IAAXA,OAAW,EAAXA,EAAahtD,0BAEjC6sD,GACEp0D,EAAE,uBAAwB,wBAC1Bs0D,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa9sD,eAEnC2sD,GACEp0D,EAAE,sBAAuB,uBACd,OAAXu0D,QAAW,IAAXA,KAAa7sD,aAAewpB,EAA4B,OAAXqjC,QAAW,IAAXA,OAAW,EAAXA,EAAa7sD,cAAgB,KAE5E0sD,GAAUp0D,EAAE,UAAW,WAAiC,QAAvBw0D,EAAc,OAAZx8C,QAAY,IAAZA,OAAY,EAAZA,EAAcpR,eAAO,IAAA4tD,IAAI,IAC5DJ,GACEp0D,EAAE,SAAU,UACZm0D,GAAwD,QAA3CM,EAAY,OAAXF,QAAW,IAAXA,GAA8B,QAAnBG,EAAXH,EAAaptD,yBAAiB,IAAAutD,OAAnB,EAAXA,EAAgClhD,kBAAU,IAAAihD,IAAI,KAE9DL,GAAUp0D,EAAE,WAAY,YAAam0D,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa1sD,0BAChEusD,GACEltB,EAAOlnC,EAAE,eAAgB,gBAAkBA,EAAE,YAAa,aAC9C,OAAZgY,QAAY,IAAZA,OAAY,EAAZA,EAAchR,WAEhBotD,GACEp0D,EAAE,0BAA2B,iCAC7Bm0D,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAaxsD,wBAE7BqsD,GACEp0D,EAAE,iBAAkB,kBACpBm0D,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa/sD,iBAE7B4sD,GACc,OAAZp8C,QAAY,IAAZA,KAAc28C,aAAe30D,EAAE,gBAAiB,iBAAmB,GACvD,OAAZgY,QAAY,IAAZA,KAAc28C,aAAeR,GAA0B,OAAZn8C,QAAY,IAAZA,OAAY,EAAZA,EAAc28C,cAAgB,IAE5E,EC1DUC,GAAwBA,CACnCL,EACAv8C,EACA68C,KAEA,MAAM,EAAE70D,GAAMC,YAAe,qBACvB,KAAEinC,GAASvlC,eACjB,IAAImzD,EDhBmC,SACvC90D,GAIoB,IAHpBknC,EAAItxB,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,IAAAA,UAAA,GACJ2+C,EAAiC3+C,UAAArC,OAAA,EAAAqC,UAAA,QAAAvG,EACjC2I,EAA2BpC,UAAArC,OAAA,EAAAqC,UAAA,QAAAvG,EAE3B,MAAM6hB,EAAmBtwB,IAIzB,OAAQoX,EAEJq8C,GAAWr0D,EAAGknC,EAAMlvB,GALKkF,GAC3BA,EAAQgU,EAAiBhU,GAAS,KAIuBgU,EAAkBqjC,GADzE,EAEN,CCG2BQ,CAA0B/0D,EAAGknC,EAAMqtB,EAAav8C,GACzE,MAAMg9C,EClByBC,EAC/Bj1D,EACAu0D,EACAv8C,IACmB,CACnB,CACEzW,MAAOvB,EAAE,aAAc,cACvBkd,MAAOi3C,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa7rD,aAEpC,CACEnH,MAAOvB,EAAE,gBAAiB,iBAC1Bkd,MAAOi3C,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa5rD,gBAEpC,CACEpH,MAAOvB,EAAE,qBAAsB,sBAC/Bkd,MAAOi3C,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa3rD,oBAEpC,CACErH,MAAOvB,EAAE,sBAAuB,uBAChCkd,MAAOi3C,GAAyB,OAAXI,QAAW,IAAXA,OAAW,EAAXA,EAAa1rD,qBAEpC,CACEtH,MAAOvB,EAAE,4BAA6B,+BACtCkd,MAAOi3C,GAA0B,OAAZn8C,QAAY,IAAZA,OAAY,EAAZA,EAAc1N,kBAErC,CACE/I,MAAOvB,EAAE,gCAAiC,mCAC1Ckd,MAAOi3C,GAA0B,OAAZn8C,QAAY,IAAZA,OAAY,EAAZA,EAAcjP,4BDTdksD,CAAkBj1D,EAAGu0D,EAAav8C,GACnDk9C,EEnByBC,EAC/Bn1D,EACAu0D,KAEA,MAAMrjC,EAAmBtwB,IACnB0zD,EAAuBp3C,GAC3BA,EAAQgU,EAAiBhU,GAAS,IACpC,MAAO,CACL,CACE3b,MAAOvB,EAAE,uBAAwB,wBACjCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa9sD,eAE1C,CACElG,MAAOvB,EAAE,wBAAyB,yBAClCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa3sD,gBAE1C,CACErG,MAAOvB,EAAE,8BAA+B,+BACxCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAatsD,kCAE1C,CACE1G,MAAOvB,EAAE,gCAAiC,iCAC1Ckd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAarsD,kCAE1C,CACE3G,MAAOvB,EAAE,wBAAyB,yBAClCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAapsD,2BAE1C,CACE5G,MAAOvB,EAAE,+BAAgC,gCACzCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAansD,6BAE1C,CACE7G,MAAOvB,EAAE,uBAAwB,wBACjCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAalsD,qBAE1C,CACE9G,MAAOvB,EAAE,4BAA6B,oCACtCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAajsD,gCAE1C,CACE/G,MAAOvB,EAAE,kBAAmB,mBAC5Bkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa7sD,eAE1C,CACEnG,MAAOvB,EAAE,oBAAqB,qBAC9Bkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa5sD,uBAE1C,CACEpG,MAAOvB,EAAE,YAAa,aACtBkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAahsD,gBAE1C,CACEhH,MAAOvB,EAAE,oCAAqC,qCAC9Ckd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa/rD,0BAE1C,CACEjH,MAAOvB,EAAE,sBAAuB,uBAChCkd,MAAOo3C,EAA+B,OAAXC,QAAW,IAAXA,OAAW,EAAXA,EAAa9rD,yBAE3C,EFzCsB0sD,CAAkBn1D,EAAGu0D,GAE5C,IAAIa,EAA0C,IAAIN,GAElD,QAA2BzlD,IAAvBwlD,EAAkC,CACpC,MAAMQ,EAAoBR,EACvBp8C,QAAQC,IAAUA,EAAK48C,wBACvBtxD,KAAK0U,GAASA,EAAK68C,aAAal3B,gBAEnC+2B,EAA0BN,EAAmBr8C,QAC1CC,IAAU28C,EAAkBz9B,SAASlf,EAAKnX,MAAMi0D,uBAEnDV,EAAqBM,CACvB,CAEA,MAAO,CAAEN,qBAAoBI,iBAAgBF,iBAAgB,EGZlDS,GAA6Ct0D,IAInD,IAJoD,aACzD6W,EAAY,YACZu8C,EAAW,mBACXM,GACD1zD,EACC,MAAM,EAAEnB,GAAMC,YAAe,qBACvB,IAAEyB,GAAQC,eAEV+zD,EADW7zD,cACe,UAAY,cACtC,mBAAEizD,EAAkB,eAAEI,EAAc,eAAEF,GAAmBJ,GAC7DL,EACAv8C,EACA68C,GAGF,IAAK78C,EAEH,OAAOnV,cAACopC,KAAQ,IAGlB,MAAM0pB,EAAsBA,KACnB,CACLzhC,EAAG,MACH0hC,gBAAgB,EAChBC,WAAW,EACXC,4BAA6B91D,EAAE,WAAY,cAMzC+1D,EAAwBr0D,EAC5B,CACEM,GAAI,CACFkyB,EAAG,IAGP,CACE0P,GAAI,IAIR,OACElhC,eAACszD,IAAS,CAACC,eAAa,EAACC,aAAc,CAAC,GAAGtzD,SAAA,CACzCF,eAACyzD,IAAa,CAACtgC,GAAI,EAAEjzB,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAACoC,IAAG,CAAC4hC,KAAK,IAAIrI,UAAU,OAAM57B,SAC3B5C,EAAE,sBAAuB,yBAE5B6C,cAACwzD,IAAmB,CAAC,cAAY,8CAGrCxzD,cAACyzD,IAAc,CAAC5yD,GAAIqyD,EAAsBnzD,SACxCC,cAAC47B,IAAW,CAAA77B,SACVC,cAAC0zD,IAAO,CAACC,gBAAiBd,EAAczhB,GAAI,EA1BpC,EA0BgD,GAAGrxC,SACxD6zD,aAAe3B,EAAoBa,cAK5CjzD,eAACyzD,IAAa,CAACtgC,GAAI,EAAEjzB,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAACoC,IAAG,CAAC4hC,KAAK,IAAIrI,UAAU,OAAM57B,SAC3B5C,EAAE,kBAAmB,qBAExB6C,cAACwzD,IAAmB,CAAC,cAAY,0CAGrCxzD,cAACyzD,IAAc,CAAC5yD,GAAIqyD,EAAsBnzD,SACxCC,cAAC47B,IAAW,CAAA77B,SACVC,cAAC0zD,IAAO,CAACC,gBAAiBd,EAAczhB,GAAI,EA3CpC,EA2CgD,GAAGrxC,SACxD6zD,aAAezB,EAAgBW,cAKxCjzD,eAACyzD,IAAa,CAACtgC,GAAI,EAAEjzB,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAACoC,IAAG,CAAC4hC,KAAK,IAAIrI,UAAU,OAAM57B,SAC3B5C,EAAE,kBAAmB,qBAExB6C,cAACwzD,IAAmB,CAAC,cAAY,0CAGrCxzD,cAACyzD,IAAc,CAAC5yD,GAAIqyD,EAAsBnzD,SACxCC,cAAC47B,IAAW,CAAA77B,SACVC,cAAC0zD,IAAO,CAACC,gBAAiBd,EAAczhB,GAAI,EA5DpC,EA4DgD,GAAGrxC,SACxD6zD,aAAevB,EAAgBS,gBAK9B,EC7GHe,GAAkDv1D,IAAuB,IAAtB,aAAE6W,GAAc7W,EAC9E,MAAM,EAAEnB,GAAMC,YAAe,uBACvBmB,ECRN4W,KAEA,MAAM,EAAEhY,GAAMC,YAAe,mBAEvB,oBAAE85B,EAAmB,kBAAEc,EAAiB,mBAAEC,GAAuBtB,KACjEgS,EAAmB5O,GAAoB5kB,GAEvC2+C,EAAkC,CACtCp1D,MAAOvB,EAAE,uBAAwB,wBACjCoE,QAAU/C,GAAmBA,GAAkBw5B,EAAkBx5B,GACjEuD,KAAMinC,KAGF+qB,EAAsB,CAC1Br1D,MAAOvB,EAAE,UAAW,WACpBoE,QAAU/C,GAAmBA,GAAkBy5B,EAAmBz5B,GAClEuD,KAAMgnC,MAGFirB,EAA2B,CAC/Bt1D,MAAOvB,EAAE,gBAAiB,iBAC1BoE,QAAU/C,GAAmBA,GAAkBy5B,EAAmBz5B,GAClEuD,KAAMgnC,MAGFkrB,EAAwB,CAC5Bv1D,MAAOvB,EAAE,YAAa,aACtBoE,QAASA,IAAM21B,IACfn1B,KAAMmyD,KAGR,OAAmB,OAAZ/+C,QAAY,IAAZA,KAAcjO,WACjByhC,EACE,CAACmrB,EAAqBE,EAAcC,GACpC,CAACH,EAAqBG,GACxB,CAACH,EAAqBC,EAASE,EAAU,ED3B7BE,CAAsBh/C,GAChCpW,EAAWC,cACXo1D,EACJp0D,cAAC3B,EAAgB,CAACG,eAA4B,OAAZ2W,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,GAAIxE,QAASA,IAE/D,OACEsB,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo7B,IAAM,CAACr5B,eAAe,gBAAgBsgC,QAAS,EAAEniC,SAAA,CAChDC,cAACwkD,GAAW,CACVze,QACc,OAAZ5wB,QAAY,IAAZA,KAAcjO,WACV/J,EAAE,wBAAyB,2BAC3BA,EAAE,eAAgB,mBAGxB4B,GAAYq1D,KAEhBp0D,cAACy6B,GAAe,CAACC,YAAY,EAAOC,YAAY,IAC/C57B,GAAYiB,cAACoC,IAAG,CAACpB,GAAI,EAAEjB,SAAEq0D,MACzB,EEZMC,GAAiD/1D,IAIvD,IAADg2D,EAAAC,EAAAC,EAAA,IAJyD,aAC7Dr/C,EAAY,YACZs/C,EAAW,MACXp/C,GACD/W,EACC,MAAM,EAAEnB,GAAMC,YAAe,iBACvB,IAAEyB,EAAG,KAAEwlC,GAASvlC,eAEhBC,EAAWC,cAEXuH,EAASkuD,IAA0B,OAAXA,QAAW,IAAXA,GAAwB,QAAbH,EAAXG,EAAa/C,mBAAW,IAAA4C,OAAb,EAAXA,EAA0BhwD,oBACtDtE,cAAC0wD,GAA0B,CACzBnqD,OAAQkuD,EAAY/C,YAAYptD,kBAChCqsD,eAAa,IAIXxqD,EAA2B,OAAZgP,QAAY,IAAZA,KAActO,mBACjChH,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAKuyB,GAAIn0B,EAAI,CAAEM,GAAI,IAAKY,SACnC5C,EAAE,uBAAwB,0BAE7B6C,cAACoC,IAAG,CACFvB,GACEwjC,EACI,CACE/S,GAAI,UACJD,EAAG,iBAEL,CAAC,EACNtxB,SAEDC,cAAC2mC,GAAmB,CAClBC,cAAe,CAAEtM,KAAM,IAAKuM,GAAI,IAAKC,GAAI,IAAKC,GAAI,IAAKxM,GAAI,IAAK0C,GAAI,KAAMl9B,SAEzEoV,EAAatO,0BAIlB,KAEE6tD,EACJ10D,cAAC0+B,IAAgB,CACfn4B,OAAO,UACPuhB,MAAO3qB,EAAE,2BACTiG,YAAajG,EACX,4BACA,qJAKAw3D,EACJ90D,eAAComC,IAAO,CAACxlC,KAAK,KAAIV,SAAA,CACf5C,EAAE,wBAAyB,yBAAyB,KAAe,OAAZgY,QAAY,IAAZA,OAAY,EAAZA,EAAcvO,aAI1E,OAAO7H,EACLc,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAc,OAAZoV,QAAY,IAAZA,OAAY,EAAZA,EAAcpR,UAClC/D,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAc,OAAZoV,QAAY,IAAZA,OAAY,EAAZA,EAAcvO,YAClC5G,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAa,OAAX00D,QAAW,IAAXA,GAAwB,QAAbF,EAAXE,EAAa/C,mBAAW,IAAA6C,OAAb,EAAXA,EAA0BhwD,mBAC5C8Q,GAAS9O,GACT8O,GAASlP,EACVuuD,KAGH70D,eAACyzB,IAAI,CAACrxB,QAASpD,EAAI,CAAEM,GAAI,EAAGkB,GAAI,IAAKN,SAAA,CACnCF,eAACo7B,IAAM,CAACr5B,eAAe,gBAAgBC,WAAYhD,EAAI,CAAEM,GAAI,eAAgBY,SAAA,CAC3EC,cAACimC,IAAO,CAACxlC,KAAK,KAAKm0D,KAAM/1D,EAAI,CAAEM,GAAI,UAAWY,SAC/B,OAAZoV,QAAY,IAAZA,OAAY,EAAZA,EAAcpR,UAEhBsR,EAAQs/C,EAAuBpuD,KAElC1G,eAACo7B,IAAM,CAACr5B,eAAe,gBAAe7B,SAAA,CACpCC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAa,OAAX00D,QAAW,IAAXA,GAAwB,QAAbD,EAAXC,EAAa/C,mBAAW,IAAA8C,OAAb,EAAXA,EAA0BjwD,mBAC5C8Q,GAASs/C,MAEXt/C,GAASlP,GAAgBnG,cAACoC,IAAG,CAAArC,SAAEoG,IAChCuuD,IAEJ,ECpGUG,GAAiBA,KAI5B,MAAM,wBAAEx+B,GAA4BhB,KACpC,OAAOh4B,uBACL,CAACy3D,EAAkB3/C,KAAiC,IAAD4/C,EAC5C5/C,IACY,QAAjB4/C,EAAAD,EAAQjxD,iBAAS,IAAAkxD,GAAjBA,EAAmBr4C,SAAQpe,IAAmB,IAAlB,GAAEyE,EAAE,KAAEC,GAAM1E,EACtC+3B,EAAwB,CACtB7oB,WAAYzK,EACZyzB,SAAUxzB,EACVyzB,2BAA4BthB,EAAavO,WACzC,IACF,GAGJ,GACD,ECZGouD,GAAgB12D,IAAA,IAAC,SAAEyB,GAAUzB,EAAA,OACjC0B,cAACisC,IAAK,CACJ9Q,QAAQ,OACRv5B,eAAe,SACf1B,SAAS,KACT4B,EAAE,OACF0vB,EAAE,OACFlyB,MAAM,QACNu9B,gBAAiBn8B,IAAQC,KAAK,KAAKZ,SAElCA,GACK,EAEGk1D,GAAkDjjD,IAAkB,IAAjB,QAAE8iD,GAAS9iD,EACzE,MAAM,WAAErO,EAAU,KAAED,GAASoxD,GAEvB,EAAE33D,GAAMC,YAAe,gBAE7B,OACEyC,eAACo7B,IAAM,CAAAl7B,SAAA,CACJ4D,EAAa3D,cAACg1D,GAAG,CAAAj1D,SAAE5C,EAAE,WAAY,cAAqB,KACvD6C,cAACg1D,GAAG,CAAAj1D,SAAE2D,MACC,ECnBAwxD,GAAwD52D,IAG9D,IAADy2D,EAAA,IAHgE,aACpE5/C,EAAY,QACZ2/C,GACDx2D,EACC,MAAM,EAAEnB,GAAMC,YAAe,yBACvBixB,EAAmBtwB,IAEnBo3D,EAAgBN,KACtB,OACE70D,cAAC07B,IAAI,CAAC55B,EAAE,OAAOuvB,EAAG,EAAG,cAAY,sBAAqBtxB,SACpDF,eAACo7B,IAAM,CAACp5B,WAAW,QAAQD,eAAe,gBAAe7B,SAAA,CACvDF,eAAC6zD,IAAO,CAACxyD,MAAM,MAAMyyD,gBAAgB,UAAS5zD,SAAA,CAC3C6zD,aACC,CACE,CACEl1D,MAAOvB,EAAE,YAAa,aACtBkd,MAAOgU,EAAiBymC,EAAQ7xD,gBAElC,CACEvE,MAAOvB,EAAE,OAAQ,QACjBkd,MAAOy6C,EAAQ9xD,OAGnB,CAAEgwB,GAAI,IAEP4gC,aAAe,CACd,CACEl1D,MAAOvB,EAAE,OAAQ,QACjBi4D,YAAaA,IAAMp1D,cAACi1D,GAAe,CAACH,QAASA,WAI3C,OAAPA,QAAO,IAAPA,GAAkB,QAAXC,EAAPD,EAASjxD,iBAAS,IAAAkxD,OAAX,EAAPA,EAAoBrkD,SACnB1Q,cAACJ,IAAM,CACLY,QAAQ,YACRC,KAAK,KACLc,QAASA,IAAM4zD,EAAcL,EAAS3/C,GAAcpV,SAEnD5C,EAAE,OAAQ,cAIZ,EC5BEk4D,GAAoC/2D,IAAiC,IAAhC,aAAE6W,EAAY,SAAE9O,GAAU/H,EAC1E,MAAM,EAAEnB,GAAMC,YAAe,yBAEvB2B,EAAWC,cACXqvB,EAAmBtwB,IACnB0oD,EC1B0BpgD,KAChC,MAAM,EAAElJ,GAAMC,YAAe,yBAEvB2B,EAAWC,eAEjB,MAAO,CACL,CACE0E,KAAM,QACN4xD,eAAgB,CACd,CACE5xD,KAAM,SACN6xD,aAAa,GAAD14D,OAAKM,EAAE,eAAgB,gBAAe,KAClDq4D,kBAAmBr4D,EAAE,kBAAmB,mBACxCs4D,cAAe,CACb,CACEC,OAAQ,OACRh3D,MAAOvB,EAAE,MAAO,WAEfmY,GAAe,OAARjP,QAAQ,IAARA,IAAY,IAAKyuD,GAAYA,EAAQpxD,OAAMvC,KAAK2zD,IAAO,CAC/DY,OAAQ,OACRr7C,MAAOy6C,EAAQpxD,KACfhF,MAAOo2D,EAAQpxD,WAIrB,CACEA,KAAM,OACN6xD,aAAa,GAAD14D,OAAKkC,EAAW5B,EAAE,OAAQ,QAAUA,EAAE,UAAW,WAAU,KACvEw4D,iBAAkB,CAChB,CACEj3D,MAAOvB,EAAE,iBAAkB,kBAC3BoB,QAAS,CACP,CACEm3D,OAAQ,gBACRh3D,MAAOvB,EAAE,wBAAyB,UAClCgf,MAAM,GAER,CACEu5C,OAAQ,gBACRh3D,MAAOvB,EAAE,wBAAyB,UAClCgf,MAAM,SAQrB,EDtBey5C,CAAkBvvD,GAC5BwvD,EAAqB92D,EAAW,OAAS,UACzCo2D,EAAgBN,KAChBiB,EAA8C,CAClD,CACEC,SAAU,UACVC,KAAOC,GACLj2D,cAACoC,IAAG,CACF9C,MAAOoB,IAAQo8B,KAAK,KACpBojB,UAAU,aACVgW,YAAa,EACb/6B,QAAQ,cACRj7B,SAAU,GAAGH,SAEZk2D,EAAU57C,MAAQra,cAACm2D,KAAO,IAAMn2D,cAAC+oC,KAAM,MAG5CqtB,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,iBAAkB,aACzD+D,MAAO,IAET,CACE60D,SAAU,OACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,EAAG/6B,QAAQ,cAAap7B,SAC9Dk2D,EAAU57C,UAIjB+7C,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,cAAe,QAC/B+D,MAAO,QAET,CACE60D,SAAU,gBACVC,KAAOC,GAAiC5nC,EAAiB4nC,EAAU57C,OACnEg8C,OAAQA,IAAMl5D,EAAE,iBAAkB,kBAClC+D,MAAO,QAET,CACE60D,SAAU,OACVC,KAAMhkD,IAAA,IAAGo5C,KAAK,SAAEkL,IAAgCtkD,EAAA,OAC9ChS,cAACi1D,GAAe,CAACH,QAASwB,GAAY,EAExCF,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,cAAe,QAC/B+D,MAAO,QAET,CACE60D,SAAU,YACVC,KAAM76C,IAAA,IAAAo7C,EAAA,IAAGnL,KAAK,SAAEkL,IAAgCn7C,EAAA,OACtC,OAARm7C,QAAQ,IAARA,GAAmB,QAAXC,EAARD,EAAUzyD,iBAAS,IAAA0yD,GAAnBA,EAAqB7lD,OACnB1Q,cAACJ,IAAM,CACLukC,GAAG,OACH1jC,KAAK,KACLD,QAAQ,YACRe,QAASA,IAAM4zD,EAAcmB,EAAUnhD,GAAcpV,SAEpD5C,EAAE,OAAQ,UAEX,IAAI,EACVi5D,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,aAAc,SACrD+D,MAAO,MAGX,OACErB,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGhB,GACCiB,cAAC2nC,KAAU,CAACyJ,GAAI,EAAGpe,GAAI,EAAEjzB,SACvBC,cAAA,MAAAD,SAAK5C,EAAE,WAAY,gBAGb,OAARkJ,QAAQ,IAARA,KAAUqK,OAGV1Q,cAACw2D,KAAmB,CAClB96B,KAAOo5B,GACL90D,cAACk1D,GAAkB,CAACJ,QAASA,EAAS3/C,aAAcA,IAEtD0gD,mBAAoBA,EACpBpP,QAASA,EACThmD,KAAK,KACLg2D,aAAc,CACZ1+C,OAAQ,CACN,CACEhV,GAAI,gBACJoZ,MAAM,KAIZ0rC,QAASiO,EACT9rC,KAAM3jB,IAlBRrG,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,cAAe,6BAqB1C,EErHMu5D,GAAgDp4D,IAItD,IAADg2D,EAAAC,EAAAC,EAAAmC,EAAAC,EAAAC,EAAA,IAJwD,UAC5D5V,EAAS,YACTwT,EAAW,MACXp/C,GACD/W,EACC,MAAM,IAAEO,EAAG,KAAEwlC,GAASvlC,eAChBg4D,EAAa,eAACC,EAAKhkD,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,GAAAA,UAAA,GAAG,EAAC,OAAuBgkD,GAASA,EAAQ,GAAK,MAAQA,CAAK,EACjFC,EAASj3D,GACTskC,EAEArkC,cAACisC,IAAK,CAACtK,aAAa,MAAMpG,GAAG,SAAQx7B,SAClCA,IAGAC,cAACisC,IAAK,CAAAlsC,SAAEA,IAEjB,OACEF,eAACshD,KAAO,CACN7hD,MAAOoB,IAAQC,KAAK,KACpBE,GAAI,CACF,aAAc,CACZsjC,GAAI,GAEN,oCAAqC,CACnCvhC,GAAI/D,EAAI,CAAEM,GAAI,aAEhB,qCAAsC,CACpC0hD,kBAAmBhiD,EAAI,CAAEM,GAAI,kBAE/BY,SAAA,CAEFC,cAACqhD,KAAG,CAAC/hD,MAAOoB,IAAQC,KAAK,KAAKZ,SAC5BC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAEkhD,EAAU,OAEnC5rC,EACCrV,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACwhD,KAAG,CACF,gBAAAxkD,OAAei6D,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAbH,EAAXG,EAAa/C,mBAAW,IAAA4C,GAAW,QAAXC,EAAxBD,EAA0BzwD,iBAAS,IAAA0wD,OAAxB,EAAXA,EAAqC7jD,QAAO,KAAA7T,OACpEokD,EAAU,IACTlhD,SAAA,CAEHC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAEkhD,EAAU,OACpB,OAAXwT,QAAW,IAAXA,GAAwB,QAAbD,EAAXC,EAAa/C,mBAAW,IAAA8C,GAAW,QAAXmC,EAAxBnC,EAA0B3wD,iBAAS,IAAA8yD,IAAnCA,EAAqCjmD,SACtCsmD,EAAMF,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAbmC,EAAXnC,EAAa/C,mBAAW,IAAAkF,GAAW,QAAXC,EAAxBD,EAA0B/yD,iBAAS,IAAAgzD,OAAxB,EAAXA,EAAqCnmD,cAI5D1Q,cAAA0yB,WAAA,CAAA3yB,SACGkhD,EAAU9/C,KAAI,CAAC0U,EAAMg0B,KAAW,IAADotB,EAQmCC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAc3CC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAcGC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAnCzB,MAAa,QAATtiD,GAA2B,kBAATA,EAElB7V,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAE8V,KADhBg0B,GAKD,cAATh0B,GAAmC,OAAX4+C,QAAW,IAAXA,GAAwB,QAAbwC,EAAXxC,EAAa/C,mBAAW,IAAAuF,GAAxBA,EAA0BpzD,UAElDhE,eAACwhD,KAAG,CAEF,gBAAAxkD,OAAei6D,EACF,OAAXrC,QAAW,IAAXA,GAAwB,QAAbyC,EAAXzC,EAAa/C,mBAAW,IAAAwF,GAAW,QAAXC,EAAxBD,EAA0BrzD,iBAAS,IAAAszD,OAAxB,EAAXA,EAAqCzmD,QACtC,KAAA7T,OAAIgZ,GAAO9V,SAAA,CAEZC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAE8V,MACV,OAAX4+C,QAAW,IAAXA,GAAwB,QAAb2C,EAAX3C,EAAa/C,mBAAW,IAAA0F,GAAW,QAAXC,EAAxBD,EAA0BvzD,iBAAS,IAAAwzD,IAAnCA,EAAqC3mD,SACtCsmD,EAAMF,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAb6C,EAAX7C,EAAa/C,mBAAW,IAAA4F,GAAW,QAAXC,EAAxBD,EAA0BzzD,iBAAS,IAAA0zD,OAAxB,EAAXA,EAAqC7mD,WAPnDm5B,GAWE,UAATh0B,EAEAhW,eAACwhD,KAAG,CAEF,gBAAAxkD,OAAei6D,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAb+C,EAAX/C,EAAa/C,mBAAW,IAAA8F,GAAO,QAAPC,EAAxBD,EAA0BpxD,aAAK,IAAAqxD,OAApB,EAAXA,EAAiC/mD,QAAO,KAAA7T,OAChEokD,EAAU,IACTlhD,SAAA,CAEHC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAE8V,MACV,OAAX4+C,QAAW,IAAXA,GAAwB,QAAbiD,EAAXjD,EAAa/C,mBAAW,IAAAgG,GAAO,QAAPC,EAAxBD,EAA0BtxD,aAAK,IAAAuxD,IAA/BA,EAAiCjnD,SAClCsmD,EAAMF,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAbmD,EAAXnD,EAAa/C,mBAAW,IAAAkG,GAAO,QAAPC,EAAxBD,EAA0BxxD,aAAK,IAAAyxD,OAApB,EAAXA,EAAiCnnD,WAP/Cm5B,GAWE,aAATh0B,EAEAhW,eAACwhD,KAAG,CAEF+W,YAAY,EACZ,gBAAAv7D,OAAei6D,EACF,OAAXrC,QAAW,IAAXA,GAAwB,QAAbqD,EAAXrD,EAAa/C,mBAAW,IAAAoG,GAAU,QAAVC,EAAxBD,EAA0BzxD,gBAAQ,IAAA0xD,OAAvB,EAAXA,EAAoCrnD,QACrC,KAAA7T,OAAIgZ,GAAO9V,SAAA,CAEZC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAE8V,MACV,OAAX4+C,QAAW,IAAXA,GAAwB,QAAbuD,EAAXvD,EAAa/C,mBAAW,IAAAsG,GAAU,QAAVC,EAAxBD,EAA0B3xD,gBAAQ,IAAA4xD,IAAlCA,EAAoCvnD,SACrCsmD,EAAMF,EAAsB,OAAXrC,QAAW,IAAXA,GAAwB,QAAbyD,EAAXzD,EAAa/C,mBAAW,IAAAwG,GAAU,QAAVC,EAAxBD,EAA0B7xD,gBAAQ,IAAA8xD,OAAvB,EAAXA,EAAoCznD,WARlDm5B,QAHX,CAcA,QAIE,EC5GDwuB,GAAiCA,CAC5CljD,EACA5W,EACAgwB,IAEAvuB,cAAA0yB,WAAA,CAAA3yB,SACGoV,GACCnV,cAACkC,EAAwB,CACvB,cAAY,uBACZ1D,eAA4B,OAAZ2W,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,GAC9BtE,gBAAiB,CACfg4B,2BAA4BthB,EAAavO,UACzC4G,WAAY+gB,EAASxrB,GACrByzB,SAAUjI,EAASvrB,MAErBzE,QAASA,MCNJ+5D,GAA0Dh6D,IAIhE,IAJiE,aACtE6W,EAAY,SACZoZ,EAAQ,QACRhwB,GACDD,EACC,MAAM,EAAEnB,GAAMC,YAAe,0BACvBixB,EAAmBtwB,IAEzB,OACEiC,cAAC07B,IAAI,CAACx6B,MAAM,OAAO6/B,GAAI,EAAGxF,GAAI,EAAEx7B,SAC9BF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfF,eAACo7B,IAAM,CAACr5B,eAAe,gBAAe7B,SAAA,CACpCC,cAACqwC,IAAI,CAACnwC,SAAS,OAAMH,SAAEwuB,EAASrrB,eAC/Bm1D,GAA+BljD,EAAc5W,EAASgwB,MAEhD,OAARA,QAAQ,IAARA,KAAUjrB,UACTtD,cAACisC,IAAK,CAACxsC,QAASiB,IAAQC,KAAK,KAAMrB,MAAM,QAAQi8B,GAAI,EAAGr6B,MAAM,cAAanB,SACxE5C,EAAE,YAAa,eAEhB,KACHy2D,aAAe,CACd,CACEl1D,MAAOvB,EAAE,YAAa,aACtBkd,MAAOgU,EAAiBE,EAAStrB,gBAEnC,CACEvE,MAAOvB,EAAE,iBAAkB,kBAC3Bkd,MAAOkU,EAASprB,eAAiB,KAEnC,CACEzE,MAAOvB,EAAE,uBAAwB,wBACjCkd,MAAOkU,EAASnrB,aAAe,WAtBDmrB,EAASxrB,GA0BxC,EC3CEw1D,GAAqBA,CAChC10D,EACA20D,KAEA,MAAM,EAAEr7D,GAAMC,YAAe,0BAEvB2B,EAAWC,eAEjB,MAAO,CACL,CACE0E,KAAM,SACN+0D,iBAAkB,CAChB/kC,YAAav2B,EAAE,eAAgB,oBAC/B,aAAcA,EACZ,4BACA,2EAIN,CACEuG,KAAM,QACN4xD,eAAgB,CACd,CACE5xD,KAAM,SACN6xD,aAAa,GAAD14D,OAAKM,EAAE,gBAAiB,iBAAgB,KACpDq4D,kBAAmBgD,EACfr7D,EAAE,mBAAoB,oBACtBA,EAAE,eAAgB,gBACtBs4D,cAAe,CACb,CACEC,OAAQ,eACRh3D,MAAOvB,EAAE,MAAO,WAEfmY,GAAgB,OAATzR,QAAS,IAATA,IAAa,IAAK60D,GAAQA,EAAIx1D,eAAc/B,KAAKu3D,IAAG,CAC5DhD,OAAQ,eACRr7C,MAAOq+C,EAAIx1D,aACXxE,MAAOg6D,EAAIx1D,mBAIjB,CACEQ,KAAM,OACN6xD,aAAa,GAAD14D,OAAKkC,EAAW5B,EAAE,OAAQ,QAAUA,EAAE,UAAW,WAAU,KACvEw4D,iBAAkB,CAChB,CACEj3D,MAAOvB,EAAE,iBAAkB,kBAC3BoB,QAAS,CACP,CACEm3D,OAAQ,gBACRh3D,MAAOvB,EAAE,wBAAyB,UAClCgf,MAAM,GAER,CACEu5C,OAAQ,gBACRh3D,MAAOvB,EAAE,wBAAyB,UAClCgf,MAAM,KAIZ,CACEzd,MAAOvB,EAAE,gBAAiB,iBAC1BoB,QAAS,CACP,CACEm3D,OAAQ,eACRh3D,MAAOvB,EAAE,uBAAwB,UACjCgf,MAAM,GAER,CACEu5C,OAAQ,eACRh3D,MAAOvB,EAAE,uBAAwB,UACjCgf,MAAM,SAQrB,ECjEUw8C,GAAsCr6D,IAAkC,IAAjC,aAAE6W,EAAY,UAAEtR,GAAWvF,EAC7E,MAAM,EAAEnB,GAAMC,YAAe,0BACvBmB,ECf8Bq6D,MACpC,MAAM,EAAEz7D,GAAMC,YAAe,uBACvB,4BAAEk5B,EAA2B,wBAAED,GAA4BhB,KAEjE,MAAO,CACL,CACE32B,MAAOvB,EAAE,cAAe,QACxB4E,KAAM82D,IACNt3D,QAASA,CAAC4T,EAAc1W,IAAoB43B,EAAwB53B,IAEtE,CACEC,MAAOvB,EAAE,kBAAmB,iBAC5B4E,KAAM+2D,IACNv3D,QAASA,CAAC4T,EAAc1W,IAAoB63B,EAA4B73B,IAE3E,EDAem6D,GAEV75D,EAAWC,cACXqvB,EAAmBtwB,IACnB0oD,EAAU8R,GAAmB10D,GAAW,GACxCgyD,EAAqB92D,EAAW,OAAS,UAQ/C,OACEc,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGhB,GACCiB,cAAC2nC,KAAU,CAACyJ,GAAI,EAAGpe,GAAI,EAAEjzB,SACvBC,cAAA,MAAAD,SAAK5C,EAAE,YAAa,iBAGd,OAAT0G,QAAS,IAATA,KAAW6M,OACV1Q,cAACw2D,KAAmB,CAClB96B,KAAO0vB,GACLprD,cAACs4D,GAAmB,CAClBnjD,aAAcA,EACdoZ,SAAU68B,EACV7sD,QAASA,IAGbs3D,mBAAoBA,EACpBpP,QAASA,EACTgQ,aAAc,CACZ1+C,OAAQ,CACN,CACEhV,GAAI,gBACJoZ,MAAM,KAIZ6N,KAAMnmB,EACNgkD,QAAS,CACP,CACEkO,SAAU,gBACVC,KAAOC,GAAiC5nC,EAAiB4nC,EAAU57C,OACnEg8C,OAAQA,IAAMl5D,EAAE,iBAAkB,kBAClC+D,MAAO,KAET,CACE60D,SAAU,eACVC,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC+D,MAAO,QAET,CACE60D,SAAU,cACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,uBAAwB,wBACxC+D,MAAO,QAET,CACE60D,SAAU,YACVC,KAAOC,GACLA,EAAU57C,OAtDtBra,cAACisC,IAAK,CAAC3sC,MAAOoB,IAAQ8qC,MAAO/rC,QAASiB,IAAQC,KAAK,KAAKZ,SACtDC,cAAA,UAAAD,SAAS5C,EAAE,YAAa,iBAsDhBi5D,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,kBAAmB,iBAC1D+D,MAAO,IAET,CACE60D,SAAU,UACVC,KAAOC,GACLoC,GAA+BljD,EAAc5W,EAAS03D,EAAU7K,IAAIkL,UACtEF,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,gBAAiB,YACxD+D,MAAO,OAKblB,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,eAAgB,8BAE3C,E,kCExFA,MAAM47D,GAAyDz6D,IAG/D,IAHgE,eACrE06D,EAAc,YACdC,GACD36D,EACC,MAAO46D,EAAgBC,GAAyBtzC,oBAAS,GAEnD9mB,EAAWC,cAEXo6D,EACJp5D,cAACq5D,KAAU,CACTnmC,SAAW7Y,GAAU2+C,EAAe3+C,GACpCA,MAAO4+C,EAAYl5D,SAEnBF,eAACu8C,KAAK,CAACnvC,UAAW,CAAC,SAAU,OAAQi1B,QAAS,OAAOniC,SAAA,CACnDC,cAACwzB,KAAK,CAACnZ,MAAOi/C,GAAYC,UAAUx5D,SAAC,mBACrCC,cAACwzB,KAAK,CAACnZ,MAAOi/C,GAAYE,IAAIz5D,SAAC,kBAK/BgC,EAAOm3D,EAAiBl5D,cAACwnD,IAAW,IAAMxnD,cAACO,IAAa,IAE9D,OACEP,cAAA0yB,WAAA,CAAA3yB,SACGhB,EACCc,eAACuC,IAAG,CACFkvB,GAAG,QACH+T,UAAU,eACVxkC,GAAI,CACF8gC,aAAc,MACdwnB,QAAS+P,EAAiB,OAAS,UACnCn5D,SAAA,CAEFC,cAACJ,IAAM,CACLY,QAAQ,WACRF,UAAWyB,EACXR,QAASA,IAAM43D,GAAuBM,IAAOA,IAC7C54D,GAAI,CACFV,SAAU,mBACVgpD,QAAS,IACTvnD,eAAgB,QAChBpC,OAAQ,QACRF,MAAO,qBACP0zB,GAAIkmC,EAAiB,SAAW,QAChC,UAAW,CACT/1B,UAAW,SAEb,UAAW,CACTkG,WAAY,SAEd,WAAY,CACVA,WAAY,UAEdtpC,SACH,iBAGAm5D,GAAkBE,KAGrBp5D,cAACoC,IAAG,CACFkvB,GAAG,QACH+T,UAAU,eACVxkC,GAAI,CACFsoD,QAAS,aACTxnB,aAAc,MACdl/B,SAAU,WACVC,MAAO,MACP05B,IAAK,MACL2N,UAAW,oBACXhqC,SAEDq5D,KAGJ,ECxFMM,GAAmB,CAC9Bh2D,KAAM,oBACN+M,SAAU,ICDCkpD,GAAe,CAAC,GAAI,GAAI,GAAI,ICoB5BC,GAAmDt7D,IAIzD,IAJ0D,QAC/DkS,EAAO,mBACPqpD,EAAkB,UAClBC,EAAY,SACbx7D,EACC,MAAO26D,EAAac,GAAkBl0C,mBAAsByzC,GAAYE,MAElE,WAAEQ,GAAeC,eAEvBn1B,qBAAU,KAAO,IAADo1B,EAAAC,EACd,MAAMC,EAAwB,OAAP5pD,QAAO,IAAPA,GAAiB,QAAV0pD,EAAP1pD,EAASC,gBAAQ,IAAAypD,GAAK,QAALC,EAAjBD,EAAoB,UAAE,IAAAC,OAAf,EAAPA,EAAwBp3D,GAC3Cq3D,GACFJ,EAAWI,EAAgB,CAAEjR,QAASwQ,GAAcU,QDjCnC,ICkCnB,GACC,CAAC7pD,EAASwpD,IAEb,MAAMM,EACJt6D,cAACu6D,KAAQ,CAEPx3D,GAAG,4BACHrE,MAAM,4BACNsrB,KAAa,OAAPxZ,QAAO,IAAPA,IAAWkpD,GACjBc,UAAWC,KAAMC,QACjBC,QAAS,EACTN,QD7CiB,GC8CjBn3B,OAAQ,IACR6S,MAAO6kB,MARH,6BAYFC,EAAgBC,mBACpB,IAAM,CAAC,CAAEl0D,UDlDe,UCkDUu0B,QAAS89B,IAAgBK,GAAYE,OACvE,CAACP,IAGH,OACEj5D,cAAC4iC,KAAI3G,IAAG,CAAC8Z,MAAO,CAAE70C,MAAO,OAAQ9B,OAAQ06D,GAAa,cAAY,gBAAe/5D,SAC/EF,eAACoW,KAAG,CAAAlW,SAAA,CACFC,cAAC+6D,KAAI,IACL/6D,cAACg7D,GAAgB,CAACj4D,GAAG,qBAAoBhD,SACvCC,cAACi7D,KAAU,CAAAl7D,SACTF,eAAC+iC,KAAI3G,IAAG,CACNY,gBAAgB,QAChBp6B,SAAS,WACTy4D,OAAO,OACPpxB,KAAK,IACLpnC,MAAM,IACNtD,OAAO,OACP8B,MAAM,MACNi6D,aAAa,OACbx5B,aAAa,MACbwB,UAAU,8BAA6BpjC,SAAA,CAEvCC,cAACo7D,KAAa,CAACC,aAAcR,EAAeS,QAAM,EAAAv7D,SAC/C,CAACu6D,KAGJt6D,cAACu7D,KAAa,IACdv7D,cAACw7D,KAAI,IAELx7D,cAACy7D,KAAS,IACT5B,GACC75D,cAAC+4D,GAAW,CAACE,YAAaA,EAAaD,eAAgBe,eAMzD,ECzFP,IAAKT,GAAW,SAAXA,GAAW,OAAXA,EAAW,UAAXA,EAAW,sBAAXA,CAAW,M,OCEhB,MAAM0B,GAAmBnpB,KAAO5V,IAAGqH,QAAAC,aAAA,g0ECqC7Bm4B,GAAwCp9D,IAK9C,IAADk2D,EAAAmC,EAAAC,EAAAC,EAAA,IALgD,qBACpDlC,EAAoB,YACpBF,EAAW,aACXt/C,EAAY,MACZE,GACD/W,EACC,MAAM,EAAEnB,GAAMC,YAAe,oBACvBu+D,EAAQC,eACR78D,EAAWC,eACX,KAAEqlC,GAASvlC,eAEXomC,EAAMX,iBAAO,MACbs3B,ECjDqB32B,KAC3B,MAAO42B,EAAgBC,GAAmBl2C,oBAAS,GAYnD,OAVAif,qBAAU,KACR,GAAO,OAAHI,QAAG,IAAHA,KAAKH,QAAS,CAChB,MAAMi3B,EAAW,IAAIC,sBAAqB39D,IAAA,IAAE49D,GAAM59D,EAAA,OAChDy9D,EAAgBG,EAAMJ,eAAe,IAGvC,OADAE,EAASG,QAAQj3B,EAAIH,SACd,IAAMi3B,EAASI,YACxB,IACC,CAACl3B,IAEG42B,CAAc,EDoCHO,CAAan3B,IACxBo3B,EAASC,GAAc12C,oBAAS,IAEjC,GAAE9iB,GAAO8uB,eACP7H,KAAMwyC,GAAgBrsD,KAAkB,OAAFpN,QAAE,IAAFA,IAAM,IAE9C05D,EACJtnD,GACAG,GACEH,EAAa3M,kCACZk0D,GAAeA,EAAWj0D,iBAG/Bq8B,qBAAU,KACJ+2B,GAAapH,GACf8H,GAAW,EACb,GACC,CAACV,EAAWpH,IAEf,MAAMkI,EAA6BA,KAClB,OAAXH,QAAW,IAAXA,KAAahsD,SA5CGosD,EAAC1mC,EAAkB1O,KACzC,MAAMa,EAAMrU,OAAO0a,IAAIC,gBACrB,IAAIkuC,KAAK,CAAC9xD,KAAKC,UAAUwc,IAAQ,CAC/B9jB,KAAM,6BAGJ4qB,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAOpG,EACZiG,EAAK+pB,aAAa,WAAW,GAADx7C,OAAKq5B,EAAS4mC,WAAW,IAAK,KAAI,UAC9DxuC,EAAKQ,OAAO,EAoCR8tC,CAAgBjI,GAAwB,UAAW6H,EAAYhsD,QACjE,EASIusD,EAAgBA,IACpBl9D,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAKuyB,GAAI,EAAEjzB,SACtB5C,EAAE,2BAA4B,8BAEjC6C,cAACJ,IAAM,CACLozB,GAAI,EACJ5zB,OAAQ,EACR2iD,GAAI,EACJngD,eAAe,aACfpB,QAAQ,YACRF,UAAWN,cAAC84D,IAAU,IACtBv3D,QAASo7D,EAA2B58D,SAEnC5C,EAAE,wBAAyB,8BAK5B6/D,EAAkBA,KAAA,IAAA1I,EAAAC,EAAA,OACtB10D,eAACo7B,IAAM,CACLr5B,eAAgB,CAAE04B,KAAM,SAAUC,GAAI,SACtC14B,WAAY,CAAEy4B,KAAM,SAAUC,GAAI,SAClCv5B,GAAI,EACJgyB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAEvBF,eAACuC,IAAG,CAACQ,GAAI,GAAG7C,SAAA,CACVF,eAAA,UAAAE,SAAA,CAAS5C,EAAE,UAAW,WAAW,OACjC6C,cAAC2nC,KAAU,CAACxM,QAAQ,SAASgJ,GAAI,EAAEpkC,SACrB,OAAX00D,QAAW,IAAXA,GAAwB,QAAbH,EAAXG,EAAa/C,mBAAW,IAAA4C,OAAb,EAAXA,EAA0B9vD,aAG/B3E,eAACuC,IAAG,CAAArC,SAAA,CACFF,eAAA,UAAAE,SAAA,CAAS5C,EAAE,WAAY,YAAY,OACnC6C,cAAC2nC,KAAU,CAACxM,QAAQ,SAASgJ,GAAI,EAAEpkC,SACrB,OAAX00D,QAAW,IAAXA,GAAwB,QAAbF,EAAXE,EAAa/C,mBAAW,IAAA6C,OAAb,EAAXA,EAA0B9vD,gBAGxB,EAGLw4D,EAAsB5/D,uBACzBmrC,IACC,MAAM00B,EAAe,CACnBn6D,GAAI,kBACJ+kB,MAAO3qB,EAAE,kBAAmB,wBAG9B,OAAiB,MAAbqrC,EAAEjiC,QAA+B,MAAbiiC,EAAEjiC,OACjBo1D,EAAM,IACRuB,EACH95D,YAAajG,EACX,YAAY,qGAMXw+D,EAAM,IACRuB,EACH95D,YAAajG,EACX,gBACA,kEAEF,GAEJ,CAACw+D,EAAOx+D,IAUJggE,EAAe,CACnBC,cANyC,CACR,QADQ5I,EAC9B,OAAXC,QAAW,IAAXA,GAAwB,QAAbkC,EAAXlC,EAAa/C,mBAAW,IAAAiF,OAAb,EAAXA,EAA0BnyD,eAAO,IAAAgwD,IAAI,EACH,QADIoC,EAC3B,OAAXnC,QAAW,IAAXA,GAAwB,QAAboC,EAAXpC,EAAa/C,mBAAW,IAAAmF,OAAb,EAAXA,EAA0BpyD,gBAAQ,IAAAmyD,IAAI,GAKtCyG,YAAa,IAuFf,OACEx9D,eAACyzB,IAAI,CACH4R,IAAKA,EACLpR,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjC0vB,gBAAgB,UAChBhoD,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAE5BF,eAACuC,IAAG,CAAArC,SAAA,EACAhB,GAlLNiB,cAACimC,IAAO,CAACxlC,KAAK,KAAKuyB,GAAI,EAAEjzB,SACtB5C,EAAE,gBAAiB,mBAkLN,OAAXq/D,QAAW,IAAXA,KAAahsD,QAtElB3Q,eAACuC,IAAG,CACF+4B,QAAQ,OACR8I,cAAe,SACfriC,eAAgB,eAChBE,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBvH,GAAI,CAAEsH,KAAM,GAAIC,GAAI,GACpB15B,GAAI,CACF,0BAA2B,CACzBipC,KAAM,OAER,sBAAuB,CACrB,iBAAkB,QAEpB,kBAAmB,CACjB,UAAW,MAEb/pC,SAAA,CAEDu8D,GACCt8D,cAACs9D,KAAW,CACVC,OtRrMgBzgE,0DsRsMhB0gE,OtRrMgB1gE,mEsRsMhB2gE,gBAAiBR,EACjBS,UAAWP,EAAap9D,SAExBC,cAACoC,IAAG,CAACvB,GAAI,CAAE88D,aAhDD,iYAgDgB59D,SACxBC,cAAC45D,GAAc,CAACppD,QAAoB,OAAXgsD,QAAW,IAAXA,OAAW,EAAXA,EAAahsD,QAASqpD,oBAAkB,QAItE96D,GACCiB,cAAC2B,IAAI,CACHC,eAAe,SACfC,WAAW,SACXyvB,GAAI5wB,IAAQo8B,KAAK,KACjBtL,EAAE,OACFwB,GAAI,EAAEjzB,SAELi9D,SAOPn9D,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPuhB,MAAO3qB,EAAE,sBAAuB,8BAChCqD,QAAQ,SACRlB,MAAOoB,IAAQ8qC,MACfxY,GAAI,IAELj0B,GACCiB,cAAC2B,IAAI,CAACC,eAAe,QAAQoxB,GAAI,EAAEjzB,SAChCi9D,YAiBLn9D,eAACuC,IAAG,CAACw7D,OAAQ,iBAAiB79D,SAAA,CAC3BhB,EACCg+D,IAEAl9D,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGg9D,KACC14B,GACAxkC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAKuzB,GAAI,EAAEj0B,SACtB5C,EAAE,qBAAsB,wBAE1B6/D,WAKP3nD,GACAxV,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAKuyB,GAAI,EAAG6qC,WAAY,CAAEvjC,KAAM,aAAcC,GAAI,KAAMx6B,SACnE5C,EAAE,cAAe,iBAEpB0C,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACb08D,GAAsC,IAAvBA,EAAY/rD,OAG3B1Q,cAAC0+B,IAAgB,CACf1L,GAAI,EACJ5vB,YAAajG,EACX,sCACA,uDANJ6C,cAACoC,IAAG,CAAArC,SAAE5C,EAAE,yBAA0B,wBAUxB,OAAXs/D,QAAW,IAAXA,OAAW,EAAXA,EAAat7D,KAAI,CAACu7D,EAAY7yB,IAC7B7pC,cAACoC,IAAG,CAAa2+B,GAAI,EAAGxF,GAAI,EAAGsB,gBAAiBn8B,IAAQC,KAAK,KAAKZ,SAChEC,cAAC2nC,KAAU,CAACxM,QAAQ,eAAcp7B,SAAE28D,EAAWt5D,eADvCymC,gBAQf,EEtREi0B,GAA8Bx/D,IAA8B,IAA7B,aAAE6W,EAAY,MAAE/O,GAAO9H,EACjE,MAAM,EAAEnB,GAAMC,YAAe,sBACvBmB,ECjB2Bw/D,MACjC,MAAM,EAAE5gE,GAAMC,YAAe,sBACvB4gE,EAAkBnnD,YAAgB,sCAAsC,IACxE,4BAAEyf,EAA2B,wBAAED,EAAuB,kBAAEK,GAC5DrB,KAEI2K,EAAc,CAClB,CACEthC,MAAOvB,EAAE,cAAe,QACxB4E,KAAM82D,IACNt3D,QAASA,CACP4T,EACA1W,IACG43B,EAAwB53B,IAE/B,CACEC,MAAOvB,EAAE,kBAAmB,iBAC5B4E,KAAM+2D,IACNv3D,QAASA,CACP4T,EACA1W,IACG63B,EAA4B73B,KAIrC,IAAKu/D,EAAiB,CACpB,MAAMC,EAAsB,CAC1Bv/D,MAAOvB,EAAE,wBAAyB,kBAClC4E,KAAM46C,IACNp7C,QAASA,CACP4T,EACA1W,IACGi4B,EAAkBvhB,EAAc1W,IAEvCuhC,EAAYC,OAAO,EAAG,EAAGg+B,EAC3B,CAEA,OAAOj+B,CAAW,EDpBF+9B,IACV,KAAE5sC,GAASryB,eACXC,EAAWC,cACXqvB,EAAmBtwB,IACnB0oD,EAAU8R,GAAmBnyD,GAAO,GACpCyvD,EAAqB92D,EAAW,OAAS,UAE/C,OACEc,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGhB,GACCiB,cAAC2nC,KAAU,CAACyJ,GAAI,EAAGpe,GAAI,EAAEjzB,SACvBC,cAAA,MAAAD,SAAK5C,EAAE,QAAS,aAGb,OAALiJ,QAAK,IAALA,KAAOsK,OAGP7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGoxB,GACCnxB,cAAC0+B,IAAgB,CACfn4B,OAAO,OACP/F,QAAQ,SACRwyB,GAAI,EACJlL,MAAO3qB,EACL,+BACA,2HAIN6C,cAACw2D,KAAmB,CAClB/1D,KAAK,KACLi7B,KAAOwiC,GACLl+D,cAACs4D,GAAmB,CAElBnjD,aAAcA,EACdoZ,SAAU2vC,EACV3/D,QAASA,GAHJ2/D,EAAKn7D,IAMd8yD,mBAAoBA,EACpBpP,QAASA,EACTgQ,aAAc,CACZ1+C,OAAQ,CACN,CACEhV,GAAI,gBACJoZ,MAAM,KAIZ6N,KAAM5jB,EACNyhD,QAAS,CACP,CACEkO,SAAU,gBACVC,KAAOC,GAAiC5nC,EAAiB4nC,EAAU57C,OACnEg8C,OAAQA,IAAMl5D,EAAE,iBAAkB,kBAClC+D,MAAO,KAET,CACE60D,SAAU,eACVC,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC+D,MAAO,QAET,CACE60D,SAAU,gBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,iBAAkB,kBAClC+D,MAAO,QAET,CACE60D,SAAU,cACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,uBAAwB,wBACxC+D,MAAO,QAET,CACE60D,SAAU,UACVC,KAAOC,GACLoC,GACEljD,EACA5W,EACA03D,EAAU7K,IAAIkL,UAElBF,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,gBAAiB,YACxD+D,MAAO,UAtEflB,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,mBAAoB,0BA4E/C,EEzGMghE,GAA4E7/D,IAElF,IAAD8/D,EAAAC,EAAA,IAFoF,YACxFnN,GACD5yD,EAQC,OACE0B,cAACmoC,IAAiB,CAAChN,QAAQ,QAAQimB,GAAI,EAAErhD,SACvCC,cAACszB,IAAI,CACHrxB,QAAS,EACTylC,aAXkB,wCAYlBM,oBAAmB,UACnBlU,aAAa,SACblyB,eAAe,gBAAe7B,SAE9BC,cAACqwC,IAAI,CACHzc,OAAO,SACPnF,MAdsB6vC,EAcgB,OAAXpN,QAAW,IAAXA,OAAW,EAAXA,EAAaqN,kCAdP,GAAA1hE,OACpCD,GAA+BC,OAAM,OAAHyhE,QAAG,IAAHA,OAAG,EAAHA,EAAKxB,WAAW,IAAK,OAcpDz0B,SAAS,OAAMtoC,SAEkB,QAFlBq+D,EAEH,OAAXlN,QAAW,IAAXA,OAAW,EAAXA,EAAasN,2BAAmB,IAAAJ,IAAe,OAAXlN,QAAW,IAAXA,GAAoB,QAATmN,EAAXnN,EAAantD,eAAO,IAAAs6D,OAAT,EAAXA,EAAsBt6D,cAjBrCu6D,KAoBR,ECrBXG,GAAgEngE,IAEtE,IAADogE,EAAA,IAFwE,YAC5ExN,GACD5yD,EACC,MAAM,EAAEnB,GAAMC,YAAe,wBACvBixB,EAAmBtwB,IAEzB,OACE8B,eAACspC,IAAW,CAAC,cAAY,mBAAmBO,OAAO,UAAS3pC,SAAA,CAC1DC,cAACm+D,GAA4B,CAACjN,YAAaA,IAC3ClxD,cAACixD,GAAmB,CAClBC,YAAaA,EACbC,cAAc,EACdC,YAAaA,OACbC,cAAc,IAEhBrxD,cAACynC,IAAiB,CAChB5K,gBAAiBn8B,IAAQo8B,KAAK,KAC9BiE,GAAI,EACJ,cAAY,0BACZ7gC,SAAS,KAAIH,SAEbF,eAACyzB,IAAI,CACHQ,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjCt4B,QAAS,EACTL,eAAe,gBAAe7B,SAAA,CAE9BC,cAAC2B,IAAI,CAACE,WAAW,QAAO9B,SACrBinC,GACC7pC,EAAE,wBAAyB,yBACkB,QADMuhE,EACnDxN,EAAYqN,yCAAiC,IAAAG,IAAI,OAGrD1+D,cAAC2B,IAAI,CAACE,WAAY,CAAEy4B,KAAM,QAASC,GAAI,OAAQx6B,SAC5CinC,GACC7pC,EAAE,WAAY,YACdkxB,EAAiB6iC,EAAYtsD,wBAKzB,EC5CL+5D,GAA8CrgE,IAAyB,IAAxB,eAAEsgE,GAAgBtgE,EAC5E,MAAM,EAAEnB,GAAMC,YAAe,wBAEvBy1D,EADW7zD,cACe,UAAY,UACtC6/D,EAAW,CACf,CACEngE,MAAOvB,EAAE,gBAAiB,WAC1Bkd,MAAOukD,EAAe76D,SAExB,CACErF,MAAOvB,EAAE,iBAAkB,YAC3Bkd,MAAOukD,EAAe36D,UAExB,CACEvF,MAAOvB,EAAE,kBAAmB,aAC5Bkd,MAAOukD,EAAez6D,YAG1B,OACEnE,cAACoC,IAAG,CAAC2+B,GAAI,EAAGxF,GAAI,EAAG6lB,GAAI,EAAG9f,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MAAO/8B,SACvEC,cAAC0zD,IAAO,CAACC,gBAAiBd,EAAa9yD,SACpC6zD,aAAeiL,EAAU,CAAE3+D,SAAU,UAEpC,ECvBG4+D,GAA2CxgE,IAAsB,IAADygE,EAAA,IAApB,YAAEtK,GAAan2D,EACtE,MAAM,EAAEnB,GAAMC,YAAe,wBACvB2B,EAAWC,eACVggE,EAAcC,GAAmBp5C,mBAAuC,KACxEq5C,EAAWC,GAAgBt5C,mBAA4B,IAS9D,OAPAif,qBAAU,KACO,OAAX2vB,QAAW,IAAXA,KAAa2K,sBACfH,EAAgBxK,EAAY2K,qBAC5BD,EAAa1K,EAAY4K,kBAC3B,GACC,CAAC5K,IAGF50D,eAAA6yB,WAAA,CAAA3yB,SAAA,CACGhB,GACCiB,cAAC0+B,IAAgB,CACf1L,GAAI,EACJ5vB,YAAajG,EACX,wBACA,sEAIN0C,eAACyzB,IAAI,CACHQ,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjC0vB,gBAAiB,CAAE3vB,KAAM,QAASC,GAAI,OACtCt4B,QAAS,EAAElC,SAAA,CAEXC,cAAC8lC,GAAU,CAACC,QAAS5oC,EAAE,gBAAiB,iBAAiB4C,SAC3C,OAAX00D,QAAW,IAAXA,GAAgC,QAArBsK,EAAXtK,EAAa2K,2BAAmB,IAAAL,GAAhCA,EAAkCruD,OACjC7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,EACIhB,GACAiB,cAAC0+B,IAAgB,CACft7B,YAAajG,EACX,wBACA,sEAIN6C,cAACsoD,IAAS,CACRT,QAAS,GACT79B,KAAM,GACNs1C,sBAAoB,EACpBC,uBAAwB,EACxBC,OAAQA,IACNx/D,cAACszB,IAAI,CAACrxB,QAAS,EAAGjB,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GAAIx6B,SACtCi/D,EAAa79D,KACZ,CAACuwD,EAAyC7nB,IAEtC7pC,cAACy+D,GAAsB,CAErBvN,YAAaQ,EACbP,cAAc,GAFTtnB,YAYrB7pC,cAAC+uC,GAAa,CACZ1b,QAASl2B,EACP,kCACA,yCAKR0C,eAACkiC,KAAM,CAACviC,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAAQ6E,aAAc,EAAE5hC,SAAA,CAChEC,cAACoC,IAAG,CACFm5B,GAAI,EACJwF,GAAI,EACJvP,EAAG,GACH8J,WAAW,OACXx5B,EAAE,OACFw/B,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MAAO/8B,SAE9C5C,EAAE,oBAAqB,uBAE1B6C,cAACsoD,IAAS,CACRT,QAAS,GACT79B,KAAM,GACNs1C,sBAAoB,EACpBC,uBAAwB,EACxBC,OAAQA,IACNx/D,cAACy/D,KAAU,CAACv9B,QAAQ,IAAIhhC,MAAM,OAAMnB,SACjCm/D,EAAU/9D,KAAI,CAAC4C,EAA0B8lC,IAEtC7pC,cAACoC,IAAG,CAEFg/C,GAAI,EACJ3hD,QAASoqC,EAAQ,IAAM,EAAInpC,IAAQ2gC,MAAQ3gC,IAAQo8B,KAAK,KAAK/8B,SAE5DgE,GAAW/D,cAAC2+D,GAAa,CAACC,eAAgB76D,KAJtC8lC,WAWN,OAATq1B,QAAS,IAATA,KAAWxuD,SACX1Q,cAAC+uC,GAAa,CACZ1b,QAASl2B,EAAE,+BAAgC,4CAKlD,ECvHMuiE,GAA0BC,IACrC,MAAM1e,ECFqB5rC,KAC3B,MAAM,EAAElY,GAAMC,YAAe,qBAC7B,OAAOiY,EACH,CAAClY,EAAE,MAAO,OAAQA,EAAE,YAAa,cACjC,CACEA,EAAE,UAAW,WACbA,EAAE,MAAO,OACTA,EAAE,gBAAiB,iBACnBA,EAAE,YAAa,aACfA,EAAE,QAAS,SACXA,EAAE,WAAY,YACf,EDTayiE,CAAaD,GAc/B,OAZE9oD,YAAgB,mCAAmC,KACX,IAAxCoqC,EAAUnrB,QAAQ,kBAElBmrB,EAAUhhB,OAAOghB,EAAUnrB,QAAQ,iBAAkB,GAGrDjf,YAAgB,8BAA8B,KACX,IAAnCoqC,EAAUnrB,QAAQ,aAElBmrB,EAAUhhB,OAAOghB,EAAUnrB,QAAQ,YAAa,GAG3CmrB,CAAS,EEeL4e,GAAwBA,KAAO,IAADvL,EAAAC,EAAAC,EACzC,MAAM,GAAEzxD,GAAO8uB,eACP7H,KAAM7U,EAAY,MAAEsS,EAAK,QAAEq4C,GAAY/yC,KAAoB,OAAFhqB,QAAE,IAAFA,IAAM,KAErEinB,KAAMyqC,EAAW,UACjBje,EAAS,eACTupB,EAAc,eACdC,IClCFxhE,IDmCuB,OAAFuE,QAAE,IAAFA,IAAM,GCjC3BqN,aACE,CAAC1C,GAAeD,eAAgBjP,IAChC,IAAMiP,GAAejP,IACrBwR,KALFxR,MDoCA,MAAM,oBAAEi5B,GAAwBd,KAC1BgpC,EAAMtqD,GAAMF,GACZpW,EAAWC,cACXiiD,EAAYye,GAAuBC,IAClC16B,EAAUg7B,GAAep6C,mBAAS,GACnCq6C,EAAgB,CACpB1gE,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OACtDvB,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnBwG,GAAI,CAAEzG,KAAM,EAAGC,GAAI,IAEf4lC,EAAc3pB,GAAaupB,GAAkBC,EAQnD,OANAl7B,qBAAU,KACJg7B,GAAWr4C,GACbgQ,EAAoBhQ,EACtB,GACC,CAACq4C,EAASr4C,EAAOgQ,IAEb0oC,EACLngE,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAAC04C,IAAe,CAACj4C,KAAK,SAGxBT,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAI,GAAGjzB,SAAA,CACvBC,cAAC6zD,GAAiB,CAAC1+C,aAAcA,IACjCnV,cAACq0D,GAAkB,CACjBl/C,aAAcA,EACds/C,YAAaA,EACbp/C,MAAOsqD,IAET9/D,eAACugE,KAAI,CACHv2B,MAAO9qC,EAAWkmC,OAAWz4B,EAC7BhM,QAASzB,EAAW,OAAS,WAC7BsyB,EAAG,EACH2B,GAAI,GACJoe,GAAI,CAAE9W,MAAO,EAAGC,GAAI,GACpB8lC,UAAU,EAAKtgE,SAAA,CAEdhB,EACCiB,cAAC+gD,GAAa,CACZC,eAAgB/b,EAChBic,kBAAmB+e,EACnBhf,UAAWA,IAGbjhD,cAAC02D,GAAc,CAACzV,UAAWA,EAAWwT,YAAaA,EAAap/C,MAAOsqD,IAEzE9/D,eAACygE,KAAS,CACRtsC,GAAI,CAAEsG,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,EAAGyM,GAAI,SACvB1V,EAAG,CAAEiJ,KAAM,EAAGyM,GAAI,SAClBw5B,KAAM,CAAEjmC,UAAM9tB,EAAWu6B,GAAI,KAC7BznC,MAAOoB,IAAQ8qC,MACfnN,SAAU,CAAE/D,KAAM,SAAUC,GAAI,QAASx6B,SAAA,EAEvC4/D,GACA3/D,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAAC4yD,GAAkB,CACjBz9C,aAAcA,EACdu8C,YAAwB,OAAX+C,QAAW,IAAXA,OAAW,EAAXA,EAAa/C,YAC1BM,mBAA+B,OAAXyC,QAAW,IAAXA,OAAW,EAAXA,EAAazC,uBAIvChyD,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAAC07D,GAAU,CACT/G,qBAAkC,OAAZx/C,QAAY,IAAZA,OAAY,EAAZA,EAAcvO,UACpCuO,aAAcA,EACds/C,YAAaA,EACbp/C,MAAOsqD,MAGVppD,GAAwB,mCAAmC,KAAUopD,GACpE3/D,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAAC8+D,GAAY,CAACrK,YAAaA,MAG/Bz0D,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAAC24D,GAAS,CACRxjD,aAAcA,EACdtR,UAAsB,OAAX4wD,QAAW,IAAXA,GAAwB,QAAbH,EAAXG,EAAa/C,mBAAW,IAAA4C,OAAb,EAAXA,EAA0BzwD,eAGvC87D,GACA3/D,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAAC89D,GAAK,CAAC3oD,aAAcA,EAAc/O,MAAkB,OAAXquD,QAAW,IAAXA,GAAwB,QAAbF,EAAXE,EAAa/C,mBAAW,IAAA6C,OAAb,EAAXA,EAA0BnuD,UAGvEmQ,GAAwB,8BAA8B,KAAUopD,GAC/D3/D,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAACq1D,GAAQ,CACPhvD,SAAqB,OAAXouD,QAAW,IAAXA,GAAwB,QAAbD,EAAXC,EAAa/C,mBAAW,IAAA8C,OAAb,EAAXA,EAA0BnuD,SACpC8O,aAAcA,gBAQ7B,EE/HUsrD,GAA4DniE,IAIlE,IAJmE,kBACxEoiE,EAAiB,eACjBliE,EAAc,WACd6L,GACD/L,EACC,MAAM,EAAEnB,GAAMC,YAAe,sBACvB,qBAAE+4B,GAAyBd,KAC3BhH,EAAmBtwB,IAEzB,OAAK2iE,EAKH1gE,cAACszB,IAAI,CAACrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAIx6B,SAC/B2gE,EAAkBv/D,KAAKotB,GACtBvuB,cAAC07B,IAAI,CAEHH,GAAI,CAAEjB,KAAM,UAAWC,GAAI,UAC3BwG,GAAI,CAAEzG,KAAM,UAAWC,GAAI,WAAYx6B,SAEvCF,eAAC8B,IAAI,CAAC26B,SAAU,CAAEhC,KAAM,OAAQC,GAAI,UAAWx6B,SAAA,CAC7CC,cAAC2B,IAAI,CAACE,WAAW,SAAQ9B,SACvBF,eAACq7B,IAAS,CAAClI,GAAG,IAAIpwB,GAAI,CAAE03B,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACtC5C,EAAE,WAAY,YAAY,SAG/B0C,eAAC8B,IAAI,CACHX,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,GACnBvH,GAAI,CAAEsH,KAAM,EAAGC,GAAI,GACnB14B,WAAW,SACXmiC,KAAM,CAAE1J,KAAM,WAAYC,GAAI,WAC9BomC,MAAO,CAAErmC,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAE1BC,cAAC4gE,IAAM,CAACthE,MAAOoB,IAAQC,KAAK,OAC5BX,cAAC6zB,KAAI,CAACsQ,GAAI,EAAEpkC,SAAEwuB,EAASvrB,UAEzBnD,eAAC8B,IAAI,CAACE,WAAW,SAASmiC,KAAK,UAAU28B,MAAO,CAAErmC,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACjEF,eAACq7B,IAAS,CAAClI,GAAG,IAAIpwB,GAAI,CAAE03B,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACtC5C,EAAE,WAAY,YAAY,OAE5BkxB,EAAiBE,EAASplB,aAAczL,EAAoBG,gBAE/DmC,cAAC2B,IAAI,CAACE,WAAW,SAASD,eAAe,WAAWoiC,KAAK,UAASjkC,SAChEC,cAACJ,IAAM,CACLa,KAAK,KACLD,QAAQ,YACRe,QAASA,IACP40B,EAAqB,CACnB33B,eAAgBA,EAChB6L,WAAYA,EACZmD,WAAY+gB,EAASxrB,KAExBhD,SAEA5C,EAAE,OAAQ,gBAtCZoxB,EAASxrB,QAPb/C,cAACujD,KAAY,GAmDb,ECjEEsd,GAAoEviE,IAG1E,IAADwiE,EAAA,IAH4E,SAChFt3D,EAAQ,aACR2L,GACD7W,EACC,MAAM,EAAEnB,GAAMC,YAAe,yBAE7B,OAAKoM,EAKH3J,eAAC67B,IAAI,CACHqF,GAAI,CAAEzG,KAAM,EAAGC,GAAI,GACnBgB,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAAA,CAE/DC,cAACk7B,IAAS,CAAClI,GAAI,EAAEjzB,SAAE5C,EAAE,gBAAiB,mBACtC6C,cAAA,QAAAD,SAAOyJ,EAAS9F,SACI,QAAlBo9D,EAACt3D,EAASA,gBAAQ,IAAAs3D,IAAjBA,EAAmBpwD,SACpB7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACk7B,IAAS,CAACl6B,GAAI,EAAGgyB,GAAI,EAAEjzB,SACrB5C,EAAE,UAAW,aAEhB6C,cAAA,KAAAD,SAAIyJ,EAASA,gBAGdA,EAASu3D,uBACVlhE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACk7B,IAAS,CAACl6B,GAAI,EAAGgyB,GAAI,EAAEjzB,SACrB5C,EAAE,2BAA4B,8BAEjC0C,eAAA,KAAAE,SAAA,CACGyJ,EAASu3D,sBACTv3D,EAASuU,6BAA2B,MAAAlhB,OAC7B2M,EAASuU,sCAKnBvU,EAAS+kB,YAAc/kB,EAASw3D,oBAAoBtwD,SAAW1Q,cAAC+zB,IAAO,CAACC,GAAI,MAE7ExqB,EAAS+kB,WAAwB,OAAZpZ,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,KACpClD,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACk7B,IAAS,CAAClI,GAAI,EAAEjzB,SAAE5C,EAAE,oBAAqB,uBAC1C6C,cAACygE,GAAoB,CACnBC,kBAAmB,CAACl3D,EAAS+kB,UAC7BlkB,WAAYb,EAASzG,GACrBvE,eAAgB2W,EAAapS,UAKhCyG,EAASw3D,oBAAoBtwD,SAAsB,OAAZyE,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,KACtDlD,eAACuC,IAAG,CAACpB,GAAI,EAAEjB,SAAA,CACTC,cAACk7B,IAAS,CAACl6B,GAAI,EAAGgyB,GAAI,EAAEjzB,SACrB5C,EAAE,gCAAiC,mCAEtC6C,cAACygE,GAAoB,CACnBC,kBAAmBl3D,EAASw3D,oBAC5B32D,WAAYb,EAASzG,GACrBvE,eAAgB2W,EAAapS,WArD9B/C,cAACujD,KAAY,GAyDb,ECtEE0d,GAA6BA,KACxC,MAAM,EAAE9jE,GAAMC,YAAe,yBAiE7B,MAAO,CACL8jE,2BA/DAx3D,IACwB,IAADy3D,EACvB,MAAMC,EAAiE,CACrE,cAAeC,IACblkE,EAAE,wCAAyC,0CAC7CmkE,QAASA,IACPnkE,EACE,oCACA,0IAEJokE,OAAQA,IACNpkE,EACE,mCACA,kLAEJ,kBAAmBqkE,IACjBrkE,EACE,4CACA,sHAEJ,qBAAsBskE,IACpBtkE,EACE,+CACA,8FAEJ,4BAA6BukE,IAC3BvkE,EACE,sDACA,0EAEJwkE,WAAYA,IACVxkE,EACE,uCACA,gJAEJykE,aAAcA,IACZzkE,EACE,yCACA,oJAEJ,cAAe0kE,IACb1kE,EACE,wCACA,qEAEJ,kBAAmB2kE,IACjB3kE,EACE,4CACA,0EAEJ,aAAc4kE,IACZ5kE,EAAE,uCAAwC,yCAC5C,4BAA6B6kE,IAC3B7kE,EACE,yCACA,gEAEJ,GAAI,IAAM,IAEZ,OAAOuM,EAAiD,QAArCy3D,EAAGC,EAAqB13D,UAAa,IAAAy3D,OAAA,EAAlCA,EAAA1/D,KAAA2/D,GAAyC,EAAE,EAKlE,EC/DUa,GAAcA,CACzBC,EACAC,KACY,IAADC,EAAAC,EACX,OAAIH,EAAQ75D,eAAiB85D,EAAQ95D,eAAuB,EACxD65D,EAAQ75D,eAAiB85D,EAAQ95D,gBAAwB,GAC1C,QAAZ+5D,EAAQ,OAAPF,QAAO,IAAPA,OAAO,EAAPA,EAASn/D,UAAE,IAAAq/D,IAAI,IAAiB,QAAhBC,EAAY,OAAPF,QAAO,IAAPA,OAAO,EAAPA,EAASp/D,UAAE,IAAAs/D,IAAI,GAAK,GAAK,CAAC,ECA5CC,GAA4BA,KACvC,MAAMC,EAAwC/tC,YAC5C1X,IAEI0lD,EAAsBhuC,YAAoBzX,IAC1C0lD,EAAsBjuC,YAAoBxX,IAC1C0lD,EAAkCluC,YAAoB/W,IACtDklD,EAA+BnuC,YAAoB9W,IACnDklD,EAAmCpuC,YACvC7W,IAEIklD,EAAqBruC,YAAoBvX,IACzC6lD,EAAuBtuC,YAAoBtX,IAajD,MAAO,CACL6lD,UAZgBA,KAChBR,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GAAsB,EAKvB,ECbUE,GAAexkE,IAC1B,MAAM,EAAErB,GAAMC,YAAe,0BACvB,2BAAE8jE,GAA+BD,KACjC/sC,EAASC,gBACT,oBAAE+C,GAAwBP,MAE1B,YAAE5tB,EAAW,cAAEZ,EAAa,yBAAEiT,GAClCgR,YAAelR,IACX+nD,EAAmC72C,YACvCtP,KAEI,eAAErT,EAAc,eAAE4T,EAAc,cAAEC,EAAa,gBAAEC,EAAe,cAAEC,GACtE4O,YAAehP,KAEX,2BAAES,EAA0B,wBAAEC,EAAuB,4BAAEC,GAC3DqO,YAAexO,KAEX,UAAEmlD,GAAcT,MAEdt4C,KAAM7U,EAAcqhC,UAAW0sB,GACrCn2C,GAAgBvuB,IACVwrB,KAAMm5C,EAAe3sB,UAAW4sB,GAAsBpzC,GAAaxxB,IACnEszB,OAAQuxC,GAAsBnzC,KAEhCozC,EAAgBjuD,GAAMF,GACtBouD,EAAuBxsD,GAAa5B,GACpCquD,EAAoBtuD,GAAUC,GAC9BsuD,EAA6C,eAAb,OAAZtuD,QAAY,IAAZA,OAAY,EAAZA,EAAc5O,QAClCiD,EAAwB,OAAb25D,QAAa,IAAbA,OAAa,EAAbA,EAAeO,UAAUnlC,MACvColC,IAAUA,EAAKp5D,eAAiBo5D,EAAKnlE,iBAAmBA,IAErDolE,EAAkBN,GAAiBC,EACnCM,GACHL,KACE1lD,KACCD,KAAgCE,GA+ChC+lD,EAAmBJ,IAA+D,IAADK,EACrF,OAIsB,QAJtBA,EACW,OAATL,QAAS,IAATA,OAAS,EAATA,EACI9tD,QAAQ+tD,GAASA,EAAKp5D,gBACvBy5D,SAASL,GAASA,EAAK/5D,UACvBi0B,KAAKokC,WAAY,IAAA8B,IAAI,EAAE,EAIxBE,EAAmBL,EAAkBE,EAA6B,OAAbX,QAAa,IAAbA,OAAa,EAAbA,EAAeO,WAAa,KAEjFQ,EAAwBN,EAC1BE,EAA6B,OAAbX,QAAa,IAAbA,OAAa,EAAbA,EAAegB,gBAC/B,KAEEC,EAA8B,OAAhBH,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBruD,QAAQ3M,IAAM,IAAAo7D,EAAA,OAClDjpD,EAAyB2Z,SAA4B,QAApBsvC,EAACp7D,EAAOG,oBAAY,IAAAi7D,OAAA,EAAnBA,EAAqBthE,GAAG,IAGtD6G,EAAUuL,ECjHQmvD,EACxBnvD,EACA3L,EACAT,EACAZ,IAEAgN,EAAa/M,UAAUjH,KAAK6H,IAAc,IAADu7D,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACvC,MAAM37D,EAAiB,OAARO,QAAQ,IAARA,OAAQ,EAARA,EAAUI,QAAQ20B,MAAMlT,GAAMA,EAAE5gB,aAAezB,EAASjG,KACvE,MAAO,CACLA,GAAU,OAANkG,QAAM,IAANA,OAAM,EAANA,EAAQlG,GACZsH,WAAoB,OAARb,QAAQ,IAARA,OAAQ,EAARA,EAAUzG,GACtBgG,YAAgC,QAArBw7D,EAAQ,OAANt7D,QAAM,IAANA,OAAM,EAANA,EAAQF,mBAAW,IAAAw7D,IAAIx7D,EACpCZ,cAAoC,QAAvBq8D,EAAQ,OAANv7D,QAAM,IAANA,OAAM,EAANA,EAAQd,qBAAa,IAAAq8D,IAAIr8D,EACxCsC,WAAYzB,EAASjG,GACrBiG,SAA0B,QAAlBy7D,EAAQ,OAANx7D,QAAM,IAANA,OAAM,EAANA,EAAQD,gBAAQ,IAAAy7D,IAAIz7D,EAASV,KACvCW,OAAsB,QAAhBy7D,EAAQ,OAANz7D,QAAM,IAANA,OAAM,EAANA,EAAQA,cAAM,IAAAy7D,IAAI17D,EAAST,cACnCmC,SAA0B,QAAlBi6D,EAAQ,OAAN17D,QAAM,IAANA,OAAM,EAANA,EAAQyB,gBAAQ,IAAAi6D,KAC1Bt8D,eAAsC,QAAxBu8D,EAAQ,OAAN37D,QAAM,IAANA,OAAM,EAANA,EAAQZ,sBAAc,IAAAu8D,IAAI57D,EAASX,eACnDa,YAAmB,OAAND,QAAM,IAANA,OAAM,EAANA,EAAQC,YACrBC,aAAoB,OAANF,QAAM,IAANA,OAAM,EAANA,EAAQE,aACtB07D,aAAoB,OAAN57D,QAAM,IAANA,OAAM,EAANA,EAAQ47D,aACtBz7D,aAAoB,OAANH,QAAM,IAANA,OAAM,EAANA,EAAQG,aACvB,ID4FCk7D,CAAWnvD,EAAc3L,EAAUT,EAAaZ,GAChD,GAEE28D,EErIwBC,EAC9B5B,EACA6B,IAEO7B,EACHA,EAAcO,UACX9tD,QAAQ+tD,GAASA,EAAKp5D,gBACtBpJ,KAAKwiE,IAAI,IAAAsB,EAAA,MAAM,CACdliE,GAAI4gE,EAAK5gE,GACTW,KAAMigE,EAAKj6D,aACXw7D,eAAgBF,EAASrB,EAAKj6D,cAC9By7D,aAAcxB,EAAKp5D,cACnBf,SAAuB,QAAfy7D,EAAEtB,EAAKn6D,gBAAQ,IAAAy7D,IAAI,GAC3BlE,sBAAuB4C,EAAK5C,sBAC5BhjD,4BAA6B4lD,EAAK5lD,4BAClCwQ,SAAUo1C,EAAK9/D,UAAU06B,MAAMm6B,GAAQA,EAAIlvD,WAC3Cw3D,oBAAqB2C,EAAK9/D,UAAU+R,QAAQ8iD,IAASA,EAAIlvD,WAC1D,IACH,GFmHkBu7D,CAAiB5B,EAAejC,GAEhDrmB,EACJ1lC,IAAiBmuD,GAAiBC,GG3HN6B,EAC9B3B,EACAtuD,EACA0uD,EACAj6D,KAEA,MAAMy7D,EACJlwD,EAAa/M,UAAUsI,SAAW9G,EAAQ8G,QAC1C9G,EAAQ07D,OAAOr8D,GAAWA,EAAOyB,WAEnC,OAAOm5D,GAA2BwB,IAAuB5B,CAAiB,EHkHpE2B,CAAiB3B,EAAmBtuD,EAAc0uD,EAAyBj6D,GIzHlD27D,EAC/B9B,EACAI,EACAp6D,EACAw5D,EACA5lD,EACAC,EACAE,IAEAqmD,IACCJ,KACCh6D,KACAw5D,KAAsC5lD,MACvCG,KAA+B,OAAbF,QAAa,IAAbA,MAAe5M,SJ6G5B60D,CACE9B,EACAI,EACAp6D,EACAw5D,EACA5lD,EACAC,EACAE,GAGR,MAAO,CACLg5B,UAAW0sB,GAAyBE,IAAsBjuD,IAAiBguD,EAC3E35D,WACAs7D,gBACAl7D,QAAgB,OAAPA,QAAO,IAAPA,IAAW,GACpBw6D,YAAwB,OAAXA,QAAW,IAAXA,IAAe,GAC5BoB,aAAmC,OAArBtB,QAAqB,IAArBA,IAAyB,GACvCrpB,YACAgpB,0BACA/zC,eArEqBA,KAChBtmB,GACL65D,EAzB2BoC,MAAO,IAADC,EAAAC,EAAAC,EAAAC,EACjC,MAAO,CACLrnE,eAAwC,QAA1BknE,EAAU,OAARl8D,QAAQ,IAARA,OAAQ,EAARA,EAAUhL,sBAAc,IAAAknE,IAAI,EAC5Cr7D,WAAwB,QAAds7D,EAAU,OAARn8D,QAAQ,IAARA,OAAQ,EAARA,EAAUzG,UAAE,IAAA4iE,IAAI,EAC5Bl8D,iBACA4T,iBACAS,0BACAC,8BACAla,UAAW,IAKN,QAJH+hE,EAAiB,OAAbtoD,QAAa,IAAbA,OAAa,EAAbA,EAAenc,KAAK0vC,IAAI,CAC1B7tC,KAAM6tC,EAAKA,KAAK7tC,KAChByyB,KAAMob,EAAKmD,IACXxqC,UAAU,aACT,IAAAo8D,IAAI,MAKJ,QAJHC,EAAmB,OAAftoD,QAAe,IAAfA,OAAe,EAAfA,EAAiBpc,KAAK0vC,IAAI,CAC5B7tC,KAAM6tC,EAAKA,KAAK7tC,KAChByyB,KAAMob,EAAKmD,IACXxqC,UAAU,aACT,IAAAq8D,IAAI,IAEV,EAKiBJ,GAAwB,CACxC75C,UAAWA,KACTm3C,IACA7uC,EAAO,CACLnxB,GAAI,yBACJ+kB,MAAO3qB,EAAE,qBAAsB,mCAC/Bg4B,SAAUx4B,IAEZu6B,GAAqB,EAEvB9J,QAASA,IACP8G,EAAO,CACLnxB,GAAI,gCACJ+kB,MAAO3qB,EAAE,6BAA8B,8BACvCg4B,SAAUx4B,EACV4J,OAAQ,WAEZ,EAmDFw8D,YACD,EK1JU+C,GAAyCA,KACpD,MAAM,GAAE/iE,GAAO8uB,cACTrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IACvBinB,KAAM7U,EAAY,UAAEqhC,EAAS,iBAAEuvB,GAAqBh5C,GAAgBvuB,IACtE,cAAEsmE,EAAa,aAAEU,EAAY,YAAEpB,GAAgBpB,GAAYxkE,GAIjE,OAFiBQ,cAIbgB,cAACgmE,GAAe,CACdlB,cAAeA,EACfU,aAAcA,EACdpB,YAAaA,EACbjvD,aAAcA,EACdqhC,UAAWuvB,GAAoBvvB,IAKjCx2C,cAACimE,GAAgB,CACfnB,cAAeA,EACfV,YAAaA,EACboB,aAAcA,EACdrwD,aAAcA,EACdqhC,UAAWuvB,GAAoBvvB,GAGrC,ECtBW0vB,GAA2D5nE,IAAiB,IAAhB,OAAE2K,GAAQ3K,EACjF,MAAM,EAAEnB,GAAMC,YAAe,0BACtB+oE,EAAYC,GAAiBvgD,oBAAS,GACvCwgD,EAAmBA,KACvBD,GAAeD,EAAW,EAEtB93C,EAAmBtwB,IAEzB,OACE8B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACuC,IAAG,CACFy6B,gBAAiBn8B,IAAQo8B,KAAK,KAC9BwE,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCwpC,mBAAoB,EACpB3kC,aAAc,EACdtQ,EAAG,EAAEtxB,SAAA,CAELC,cAACoC,IAAG,CAAC+4B,QAAQ,SAASv4B,GAAI,EAAE7C,SAC1BC,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,gBAE9B6C,cAACukD,GAAS,CAAC7lD,MAAOuK,EAAOZ,iBACzBrI,cAACszB,IAAI,CAACuI,gBAAiB,CAAEvB,KAAM,MAAOC,GAAI,WAAYx6B,SACpDC,cAAC2nC,KAAU,CAAC5G,GAAI,EAAEhhC,SAAEkJ,EAAOD,gBAG/BnJ,eAACuC,IAAG,CAACy6B,gBAAiB,CAAEtC,GAAI75B,IAAQo8B,KAAK,MAAQ6E,aAAc,EAAGtQ,EAAG,EAAG2B,GAAI,EAAEjzB,SAAA,CAC5EC,cAACoC,IAAG,CAAC+4B,QAAQ,SAASv4B,GAAI,EAAE7C,SAC1BF,eAACD,IAAM,CACLkiD,MAAM,QACN3mB,QAAS,CAAEb,KAAM,QAASC,GAAI,QAC9B95B,KAAK,KACL27B,IAAK,EACL57B,QAAQ,WACR+6B,GAAI,EACJj7B,UAAWN,cAACumE,IAAc,CAACxwB,MAAO,CAAE5a,QAAS,YAC7C55B,QAAS8kE,EAAiBtmE,SAAA,EAExBomE,GAAchpE,EAAE,cAAe,eAChCgpE,GAAchpE,EAAE,cAAe,oBAGpC0C,eAACyzB,IAAI,CAACuI,gBAAiB,CAAEvB,KAAM,MAAOC,GAAI,WAAYx6B,SAAA,CACpDF,eAACuC,IAAG,CAAC4wB,GAAI,EAAG6J,gBAAiB,CAAEtC,GAAI75B,IAAQo8B,KAAK,MAAQ6E,aAAc,EAAE5hC,SAAA,CACtEF,eAACg0B,KAAI,CAACsH,QAAS,eAAgBv4B,GAAI,GAAG7C,SAAA,CACpCF,eAACq7B,IAAS,CAAC4mB,MAAM,OAAO9kB,GAAI,EAAEj9B,SAAA,CAC3B5C,EAAE,iBAAkB,aAAa,OAEnCkxB,EAAiBplB,EAAOC,gBAE3BrJ,eAACg0B,KAAI,CAACsH,QAAS,eAAep7B,SAAA,CAC5BF,eAACq7B,IAAS,CAAC4mB,MAAM,OAAO9kB,GAAI,EAAEj9B,SAAA,CAC3B5C,EAAE,UAAW,MAAM,OAErB8L,EAAOd,oBAGZtI,eAACD,IAAM,CACLu7B,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAC7B95B,KAAK,KACLD,QAAQ,WACRe,QAAS8kE,EAAiBtmE,SAAA,EAExBomE,GAAchpE,EAAE,cAAe,eAChCgpE,GAAchpE,EAAE,cAAe,wBAIrCgpE,GACCnmE,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACuC,IAAG,CAACm5B,GAAI,EAAGvI,GAAI,EAAEjzB,SAAA,CAChBC,cAAA,UAAAD,SAAS5C,EAAE,SAAU,YACrB6C,cAAC2nC,KAAU,CAAC6Q,GAAI,EAAEz4C,SAAEkJ,EAAOA,gBAIhC,EC5EMu9D,GAAoDloE,IAAiB,IAAhB,OAAE2K,GAAQ3K,EAC1E,MAAM,EAAEnB,GAAMC,YAAe,0BACtB+oE,EAAYC,GAAiBvgD,oBAAS,GACvCwI,EAAmBtwB,IACnBsoE,EAAmBA,KACvBD,GAAeD,EAAW,EAE5B,OACEtmE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACuC,IAAG,CAACy6B,gBAAiBn8B,IAAQo8B,KAAK,KAAM6E,aAAc,EAAGtQ,EAAG,EAAG2B,GAAI,EAAEjzB,SAAA,CACpEF,eAACuC,IAAG,CAAC+4B,QAAQ,SAASv4B,GAAI,EAAE7C,SAAA,CAC1BF,eAACD,IAAM,CACLkiD,MAAM,QACN3mB,QAAS,CAAEb,KAAM,QAASC,GAAI,QAC9B95B,KAAK,KACLD,QAAQ,WACRe,QAAS8kE,EAAiBtmE,SAAA,EAExBomE,GAAchpE,EAAE,cAAe,eAChCgpE,GAAchpE,EAAE,cAAe,kBAElC6C,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,iBAE9B6C,cAACukD,GAAS,CAAC7lD,MAAOuK,EAAOZ,iBACzBxI,eAACyzB,IAAI,CAACuI,gBAAiB,CAAEvB,KAAM,MAAOC,GAAI,WAAYx6B,SAAA,CACpDC,cAAC2nC,KAAU,CAAC5G,GAAI,EAAEhhC,SAAEkJ,EAAOD,WAC3BnJ,eAACD,IAAM,CACLu7B,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAC7B95B,KAAK,KACLD,QAAQ,WACRe,QAAS8kE,EAAiBtmE,SAAA,EAExBomE,GAAchpE,EAAE,cAAe,eAChCgpE,GAAchpE,EAAE,cAAe,wBAIrCgpE,GACCtmE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACuC,IAAG,CAACm5B,GAAI,EAAGvI,GAAI,EAAEjzB,SAAA,CAChBC,cAAA,UAAAD,SAAS5C,EAAE,SAAU,YACrB6C,cAAC2nC,KAAU,CAAC6Q,GAAI,EAAEz4C,SAAEkJ,EAAOA,YAE7BpJ,eAACuC,IAAG,CAACm5B,GAAI,EAAGwF,GAAI,EAAG/N,GAAI,EAAG6J,gBAAiBn8B,IAAQo8B,KAAK,KAAM6E,aAAc,EAAE5hC,SAAA,CAC5EF,eAACq7B,IAAS,CAAC4mB,MAAM,OAAO9kB,GAAI,EAAEj9B,SAAA,CAC3B5C,EAAE,aAAc,SAAS,OAE3BkxB,EAAiBplB,EAAOC,qBAI9B,ECvDMu9D,GAGRnoE,IAAoC,IAAnC,aAAEknE,EAAY,YAAEpB,GAAa9lE,EACjC,MAAM,EAAEnB,GAAMC,YAAe,yBAC7B,OACE4C,cAAA0yB,WAAA,CAAA3yB,SACEF,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACuC,IAAG,CACFivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAClB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAAA,CAE/DC,cAACoC,IAAG,CAACivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAK6mB,GAAI,CAAE9mB,KAAM,EAAGC,GAAI,GAAIx6B,SACjDC,cAAA,MAAAD,SACEC,cAAA,UAAAD,SAAS5C,EAAE,kCAAmC,gCAGlD0C,eAACuC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACzBqkE,EAAYjjE,KAAK8H,GAChBjJ,cAACkmE,GAAuB,CAAiBj9D,OAAQA,GAAnBA,EAAOlG,QAE1B,OAAXqhE,QAAW,IAAXA,KAAa1zD,SACb1Q,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SACzB5C,EAAE,2BAA4B,mCAKvC0C,eAACuC,IAAG,CACFivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAClB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OACtD6G,UAAW,IAAI5jC,SAAA,CAEfC,cAACoC,IAAG,CAACivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAK6mB,GAAI,CAAE9mB,KAAM,EAAGC,GAAI,GAAIx6B,SACjDC,cAAA,MAAAD,SACEC,cAAA,UAAAD,SACG5C,EAAE,+BAAgC,sCAIzC0C,eAACuC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACzBylE,EAAarkE,KAAK8H,GACjBjJ,cAACwmE,GAAgB,CAAiBv9D,OAAQA,GAAnBA,EAAOlG,QAElB,OAAZyiE,QAAY,IAAZA,KAAc90D,SACd1Q,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SACzB5C,EAAE,2BAA4B,uCAMxC,ECtDMupE,GAETpoE,IAAuC,IAAtC,KAAEoF,EAAI,SAAE8F,EAAQ,aAAE27D,GAAc7mE,EACnC,MAAM,EAAEnB,GAAMC,YAAe,yBACvBixB,EAAmBtwB,IACzB,OACE8B,eAACkiC,KAAM,CAELjhC,GAAI46B,IACJwG,QAAS,EACThhC,MAAM,OACNW,WAAW,aACX05B,GAAI,EACJid,GAAI,EACJ4I,GAAI,EAAErhD,SAAA,CAENF,eAAC8B,IAAI,CAACT,MAAM,OAAMnB,SAAA,CAChBF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACimC,IAAO,CAACxlC,KAAK,MAAMK,GAAG,KAAIf,SACxB5C,EAAE,gBAAiB,mBAEtB6C,cAAC6zB,KAAI,CAAA9zB,SAAE2D,OAET1D,cAACJ,IAAM,CAACY,QAAQ,YAAYC,KAAK,KAAK0jC,GAAG,OAAMpkC,SAC5C5C,EAAE,gBAAiB,sBAGxB0C,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACimC,IAAO,CAACxlC,KAAK,MAAMK,GAAG,KAAIf,SACxB5C,EAAE,UAAW,aAEhB6C,cAAC6zB,KAAI,CAAA9zB,SAAEyJ,OAET3J,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACimC,IAAO,CAACxlC,KAAK,MAAMK,GAAG,KAAIf,SACxB5C,EAAE,gBAAiB,mBAEtB6C,cAAC6zB,KAAI,CAAA9zB,SAAEsuB,EAAiB82C,UA9BrBzhE,EAAOkJ,KAAKE,SAAS6D,SAAS,IAAIrE,MAAM,GAgCtC,EC9BAq6D,GAAwEroE,IAG9E,IAH+E,eACpFE,EAAc,cACdsmE,GACDxmE,EACC,MAAM,EAAEnB,GAAMC,YAAe,0BACvB,2BAAE86B,GAA+BvB,KACjCtI,EAAmBtwB,IAEzB,OACEiC,cAACw2D,KAAmB,CAClBxsC,KAAM86C,EACNre,QAAS,GACTgQ,aAAc,CACZ1+C,OAAQ,CACN,CACEhV,GAAI,eACJoZ,MAAM,KAIZuf,KAAO0vB,GACLprD,cAAC0mE,GAAkB,CACjB3jE,GAAIqoD,EAAIroD,GACRW,KAAM0nD,EAAI1nD,KACV8F,SAAU4hD,EAAI5hD,SACd27D,aAAc/Z,EAAI+Z,eAGtBtd,QAAS,CACP,CACEkO,SAAU,OACVK,eAAe,EACfJ,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC+D,MAAO,SAET,CACE60D,SAAU,eACVC,KAAOC,GAAiC5nC,EAAiB4nC,EAAU57C,OACnEg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC+D,MAAO,SAET,CACE60D,SAAU,WACVK,eAAe,EACfJ,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,UAAW,WAC3B+D,MAAO,QAET,CACE60D,SAAU,KACVC,KAAMhkD,IAAA,IAAGo5C,KAAK,SAAEkL,IAAqCtkD,EAAA,OACnDhS,cAACJ,IAAM,CACLY,QAAQ,YACRC,KAAK,KACLc,QAASA,IACP/C,GAAkB05B,EAA2B15B,EAAgB83D,EAASvzD,IACvEhD,SAEA5C,EAAE,gBAAiB,kBACb,EAEXi5D,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,aAAc,SACrD+D,MAAO,MAGX,ECxEO+kE,GAMR3nE,IAA4E,IAA3E,UAAEk4C,EAAS,cAAEsuB,EAAa,aAAE3vD,EAAY,YAAEivD,EAAW,aAAEoB,GAAclnE,EACzE,MAAM,EAAEnB,GAAMC,YAAe,0BACtBwpE,EAAgBC,GAAqBhhD,oBAAS,GAC/C9d,GAAoB,OAAZoN,QAAY,IAAZA,OAAY,EAAZA,EAAcpN,QAAS,GAE/B++D,EACJjnE,eAACuC,IAAG,CAAClB,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,SAAUx6B,SAAA,CACxCC,cAAC2B,IAAI,CAACC,eAAe,gBAAgBC,WAAW,SAASm7B,GAAI,CAAE1C,KAAM,EAAGC,GAAI,GAAIx6B,SAC9EF,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC+jD,GAAY,IAEb/jD,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAMslE,GAAkB,GAAO9mE,SACzD5C,EAAE,OAAQ,eAIjB6C,cAACoC,IAAG,CAAC5C,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAAQ97B,GAAI,EAAGqwB,EAAG,EAAEtxB,SACzDC,cAAC4iD,GAAK,CAAC76C,MAAOA,EAAO86C,QAASrM,SAI9B8sB,EAAgBjuD,GAAMF,GAC5B,OACEtV,eAAC8B,IAAI,CACHsiC,cAAc,MACdriC,eAAe,gBACfK,QAAS,EACTjB,GAAI,EACJ,cAAY,6BAA4BjB,SAAA,CAExCF,eAAC8B,IAAI,CAAColE,KAAM,EAAG9iC,cAAc,SAAQlkC,SAAA,CACnCF,eAAC8B,IAAI,CACHC,eAAe,gBACfC,WAAW,WACXm7B,GAAI,CAAE1C,KAAM,EAAGC,GAAI,GACnBvH,GAAI,EAAEjzB,SAAA,CAENC,cAACimC,IAAO,CAACxlC,KAAK,KAAKK,GAAG,KAAIf,SACvB5C,EAAE,YAAa,gBAGhBypE,GACA5mE,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAMslE,GAAkB,GAAM9mE,SACxD5C,EAAE,aAAc,mBAItBmmE,EACCtjE,cAACymE,GAAoB,CAACrC,YAAaA,EAAaoB,aAAcA,IAE9DxlE,cAAC2mE,GAA0B,CACzBnoE,eAA4B,OAAZ2W,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,GAC9B+hE,cAAeA,OAIpB8B,GAAkBE,IACd,EChEEd,GAMR1nE,IAA4E,IAA3E,UAAEk4C,EAAS,cAAEsuB,EAAa,aAAE3vD,EAAY,YAAEivD,EAAW,aAAEoB,GAAclnE,EACzE,MAAM,EAAEnB,GAAMC,YAAe,yBACvBkmE,EAAgBjuD,GAAMF,GACtBpN,GAAoB,OAAZoN,QAAY,IAAZA,OAAY,EAAZA,EAAcpN,QAAS,GACrC,OACElI,eAACugE,KAAI,CAAC5/D,QAAQ,OAAO6wB,EAAG,EAAG+f,IAAK,EAAG,cAAY,4BAA2BrxC,SAAA,CACxEF,eAACshD,KAAO,CAAAphD,SAAA,CACNC,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,YAAa,iBAE3B6C,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,QAAS,gBAGzB0C,eAACygE,KAAS,CAACv/B,GAAI,EAAEhhC,SAAA,CACfC,cAACwgE,KAAQ,CAACz/B,GAAI,EAAGvhC,OAAQ,EAAEO,SACxBujE,EACCtjE,cAACymE,GAAoB,CAACrC,YAAaA,EAAaoB,aAAcA,IAE9DxlE,cAAC2mE,GAA0B,CACzBnoE,eAA4B,OAAZ2W,QAAY,IAAZA,OAAY,EAAZA,EAAcpS,GAC9B+hE,cAAeA,MAIrBjlE,eAAC2gE,KAAQ,CAACz/B,GAAI,EAAGvhC,OAAQ,EAAEO,SAAA,CACzBC,cAACqkD,GAAgB,IAEjBrkD,cAACoC,IAAG,CAACpB,GAAI,EAAEjB,SACTC,cAAC4iD,GAAK,CAAC76C,MAAOA,EAAO86C,QAASrM,cAI/B,ECbEwwB,GAAqCA,KAChD,MAAM,EAAE7pE,GAAMC,YAAe,0BACvB,kBAAE46B,GAAsBrB,MAExB,GAAE5zB,GAAO8uB,cACTrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IACvBinB,KAAM7U,EAAY,UAAEqhC,GAAczpB,GAAgBvuB,GACpDO,EAAWC,eAEV4nE,EAAgBC,GAAqBhhD,oBAAS,IAC/C,UAAEg1B,EAAS,eAAE/qB,GAAmBkzC,GAAYxkE,GAE5CyoE,EAAoB5xD,GAAMF,IAAiB4B,GAAa5B,GAExD2xD,EACJjnE,eAACuC,IAAG,CAAClB,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,SAAUx6B,SAAA,CACxCC,cAAC2B,IAAI,CAACC,eAAe,gBAAgBC,WAAW,SAAS05B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAC7EhB,EACCc,eAACkiC,KAAM,CAACG,QAAS,EAAEniC,SAAA,CACjBC,cAACqkD,GAAgB,CAAClvC,aAAcA,IAChCnV,cAACk6B,GAAa,CAAC/kB,aAAcA,OAG/BtV,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC+jD,GAAY,CAAC5uC,aAAcA,IAC5BnV,cAACk6B,GAAa,CAAC/kB,aAAcA,IAC7BnV,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAMslE,GAAkB,GAAO9mE,SACzD5C,EAAE,OAAQ,eAKnB0C,eAACuC,IAAG,CAAC5C,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAAQ97B,GAAI,EAAGqwB,EAAG,EAAEtxB,SAAA,CACzDC,cAAC0xB,GAAO,IACR1xB,cAAC4iD,GAAK,CAAC76C,MAAmB,OAAZoN,QAAY,IAAZA,OAAY,EAAZA,EAAcpN,MAAO86C,QAASrM,UAKlD,OAAIA,EAEAx2C,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAAC04C,IAAe,CAACj4C,KAAK,SAM1BZ,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAAC8B,IAAI,CAACM,QAAS2kE,EAAiB,EAAI,EAAG,cAAY,6BAA4B7mE,SAAA,CAC7EC,cAAC4yB,IAAY,CAAA7yB,SACXC,cAAC6yB,IAAI,CAACkjB,MAAO,CAAE70C,MAAO,QAASnB,SAC7BC,cAACszB,IAAI,CAACpyB,MAAM,OAAOmwB,EAAG,EAAEtxB,SACtBF,eAACugE,KAAI,CAAC5/D,QAASzB,EAAW,OAAS,WAAYsyB,EAAG,EAAG+f,GAAI,CAAE9W,MAAO,EAAGC,GAAI,GAAIx6B,SAAA,CAC3EF,eAACshD,KAAO,CAAAphD,SAAA,CACNC,cAACqhD,KAAG,CACFv/C,EAAG,CAAEw4B,KAAM,MAAOC,GAAI,QACtB33B,GAAI,CAAE03B,KAAM,EAAGC,GAAI,GACnBr6B,SAAU,CAAEo6B,KAAM,QAASC,GAAI,IAAKx6B,SAEpCC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,cAAe,mBAE7B6C,cAACqhD,KAAG,CAACv/C,EAAG,CAAEw4B,KAAM,MAAOC,GAAI,QAAUr6B,SAAU,CAAEo6B,KAAM,QAASC,GAAI,IAAKx6B,SACvEC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,iBAAkB,sBAE/B4B,GACCiB,cAACqhD,KAAG,CAACv/C,EAAG,CAAEw4B,KAAM,MAAOC,GAAI,KAAOr6B,SAAU,CAAEo6B,KAAM,QAASC,GAAI,IAAKx6B,SACpEC,cAACshD,KAAO,CAAC//C,QAASA,IAAMslE,GAAkB,GAAM9mE,SAC7C5C,EAAE,QAAS,cAIhB4B,GACAiB,cAACoC,IAAG,CACF2zC,MAAO,CACLmxB,WAAY,OACZhnB,UAAW,SACXgW,YAAa,MACbn2D,UAEA6mE,GACA5mE,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAMslE,GAAkB,GAAM9mE,SACxD5C,EAAE,aAAc,qBAM3B0C,eAACygE,KAAS,CAAAvgE,SAAA,CACRC,cAACwgE,KAAQ,CACP,cAAY,wBACZz/B,GAAI,EACJxF,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAE9DoV,IACE8xD,EACCjnE,cAACmnE,GAAW,CAAChyD,aAAcA,IAE3BnV,cAAConE,GAAgB,CAACjyD,aAAcA,OAGtCnV,cAACwgE,KAAQ,CACP,cAAY,2BACZz/B,GAAI,CAAEzG,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAE9DoV,IACE8xD,EACCjnE,cAACqnE,GAAgB,CAAClyD,aAAcA,IAEhCnV,cAACsnE,GAAa,CACZnyD,aAAcA,EACdoyD,mBAAoBX,OAI3B7nE,GACCiB,cAACwgE,KAAQ,CAAChhE,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SACtE6mE,EAAiBE,EAAe,UAItCG,IAAsBL,GAAkB5mE,cAACwnE,GAAiB,aAKlEZ,IAAmB7nE,GAAYiB,cAACoC,IAAG,CAAArC,SAAE+mE,OAEvC/nE,EACCc,eAACuC,IAAG,CAAC02B,EAAG,CAAEwB,KAAM,QAASC,GAAI,GAAIx6B,SAAA,CAC/BC,cAACJ,IAAM,CACLozB,GAAI,EACJ9yB,SAAS,KACTM,QAAQ,UACRsB,EAAE,OACF3B,SAAS,QACTmlC,YAAauV,EACbt5C,QAASuuB,EAAe/vB,SAEvB5C,EAAE,SAAU,YAEf6C,cAACJ,IAAM,CACLM,SAAS,KACTM,QAAQ,YACRsB,EAAE,OACF3B,SAAS,QACToB,QAASA,IAAM4T,GAAgB6iB,EAAkB7iB,EAAapS,IAAIhD,SAEjE5C,EAAE,kBAAmB,gBAI1B6C,cAACJ,IAAM,CAAC6nE,QAAM,EAACniC,YAAauV,EAAWt5C,QAASuuB,EAAe/vB,SAC5D5C,EAAE,kBAAmB,uBAGzB,ECvKMmqE,GAA6ChpE,IAGnD,IAHoD,aACzD6W,EAAY,mBACZoyD,GAAqB,GACtBjpE,EACC,MAAM,EAAEnB,GAAMC,YAAe,0BAEvB,IAAEyB,GAAQC,eACVC,EAAWC,eACX,cAAE8lE,GAAkB9B,GAAY7tD,EAAapS,KAC7C,qBAAEozB,GAAyBd,KAC3BhH,EAAmBtwB,IAEnBy4B,EAAYhtB,IAAsB,IAAAk+D,EAAA,OACtC7nE,eAACo7B,IAAM,CAACiH,QAAS,EAAGrgC,WAAW,aAAY9B,SAAA,CACzCC,cAAC2nE,IAAU,CACTroE,MAAOoB,IAAQC,KAAK,KACpBo1C,MAAO,CAAE6xB,WAAY,EAAG1mE,MAAO,OAAQ9B,OAAQ,UAEjDY,cAAC6zB,KAAI,CAAC3zB,SAAS,KAAKo7B,WAAW,SAASH,QAAQ,OAAMp7B,SACpDC,cAAA,QAAM+1C,MAAO,CAAEmxB,WAAY,MAAOU,WAAY,GAAI7nE,SAAmB,QAAnB2nE,EAAEl+D,EAAS+kB,gBAAQ,IAAAm5C,OAAA,EAAjBA,EAAmB1kE,WAElE,EAGL6kE,EAAsBC,IAA0B,IAAAC,EAAA,OAC/B,QAArBA,EAAAD,EAAav5C,gBAAQ,IAAAw5C,OAAA,EAArBA,EAAuBhlE,KACvBozB,EAAqB,CACnB33B,eAAgB2W,EAAapS,GAC7BsH,WAAYy9D,EAAa/kE,GACzByK,WAAYs6D,EAAav5C,SAASxrB,IAClC,EAEEilE,EAA4B,OAAblD,QAAa,IAAbA,KAAep0D,OAClC1Q,cAAA0yB,WAAA,CAAA3yB,SACG+kE,EAAc3jE,KAAK2mE,GAClBjoE,eAACyzB,IAAI,CACHrxB,QAAS,EACT46B,gBAAiBn8B,IAAQo8B,KAAK,KAC9Bt9B,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAc,EACd3N,GAAI,EACJ3C,EAAG,EAAEtxB,SAAA,CAGLF,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACJ,IAAM,CACLa,KAAK,KACLD,QAAQ,YACRshD,MAAM,QACNvgD,QAASA,IAAMsmE,EAAmBC,GAAc/nE,SAE/C5C,EAAE,oBAAqB,UAE1B6C,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,sBAE7B2qE,EAAapkE,QAEhB7D,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAAA,UAAAD,SAAS5C,EAAE,oBAAqB,uBAChC6C,cAAA,YAEDw2B,EAASsxC,MAEZjoE,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,mBAC5B6C,cAAA,YAEDquB,EAAiBy5C,EAAa3C,mBA5B5B2C,EAAa/kE,QAkCxB/C,cAACoC,IAAG,CAACivB,EAAG,EAAEtxB,SACRC,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,uBAAwB,8BAIhD8qE,EACJjoE,cAAA0yB,WAAA,CAAA3yB,SACgB,OAAb+kE,QAAa,IAAbA,KAAep0D,OACd1Q,cAACsoD,IAAS,CACR7nD,KAAK,KACLI,GAAI,CACFmzB,GAAIn1B,EAAI,CAAEM,GAAI,IACd6zB,GAAIn0B,EAAI,CAAEM,GAAI,KAEhBqpD,mBAAiB,EACjBD,mBAAiB,EACjBkO,aAAc,CACZ1+C,OAAQ,CACN,CACEhV,GAAI,eACJoZ,MAAM,KAIZ6N,KAAM86C,EACNjd,QAAS,CACP,CACEkO,SAAU,OACVM,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjCi5D,eAAe,EACfl1D,MAAO,QAELqmE,EACA,GACA,CACE,CACExR,SAAU,iBACVM,OAAQA,IAAMl5D,EAAE,2BAA4B,4BAC5Ci5D,eAAe,EACfl1D,MAAO,SAGf,CACE60D,SAAU,eACVM,OAAQA,IAAMl5D,EAAE,oBAAqB,qBACrCi5D,eAAe,EACfl1D,MAAO,IACP80D,KAAOC,GACLz/B,EAASy/B,EAAU7K,IAAIkL,WAE3B,CACEP,SAAU,eACVM,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC64D,KAAOC,GAAiC5nC,EAAiB4nC,EAAU57C,OACnEnZ,MAAO,KAET,CACE60D,SAAU,aACVK,eAAe,EACfC,OAAQA,IAAMxgB,GAAuB14C,EAAE,iBAAkB,gBACzD+D,MAAO,IACP80D,KAAOC,GACLj2D,cAACJ,IAAM,CACLkiD,MAAM,QACNrhD,KAAK,KACLD,QAAQ,YACRe,QAASA,IAAMsmE,EAAmB5R,EAAU7K,IAAIkL,UAAUv2D,SAEzD5C,EAAE,oBAAqB,cAOlC6C,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,uBAAwB,8BAKxD,OAAO4B,EAAWipE,EAAeC,CAAa,ECxKnCC,GAAgD5pE,IAAuB,IAAtB,aAAE6W,GAAc7W,EAC5E,MAAM,EAAEnB,GAAMC,YAAe,mBACvB2B,EAAWC,cACXqvB,EAAmBtwB,KACnB,GAAEgF,GAAO8uB,cACTrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IACzB,UAAE83C,EAAS,eAAE/qB,GAAmBkzC,GAAYxkE,GAE5C0wC,EAAa/5B,IAAiBA,EAAajO,WAEjD,OACErH,eAACuC,IAAG,CAAC,cAAY,wBAAuBrC,SAAA,CACrChB,EACCiB,cAACoC,IAAG,CAAArC,SACFC,cAACwkD,GAAW,CACVze,QACc,OAAZ5wB,QAAY,IAAZA,KAAcjO,WACV/J,EACE,wCACA,oCAEFA,EAAE,wBAAyB,6BAKrC0C,eAACo7B,IAAM,CAACr5B,eAAe,gBAAgBK,QAAS,EAAElC,SAAA,CAChDC,cAACwkD,GAAW,CACVze,QACc,OAAZ5wB,QAAY,IAAZA,KAAcjO,WACV/J,EACE,iCACA,sDACA,CAAEgoE,aAAc92C,EAA6B,OAAZlZ,QAAY,IAAZA,OAAY,EAAZA,EAAc/N,mBAEjDjK,EAAE,wBAAyB,2BAIlC+xC,GACClvC,cAACJ,IAAM,CACLM,SAAS,KACTM,QAAQ,UACR8kC,YAAauV,EACbt5C,QAASuuB,EAAe/vB,SAEvB5C,EAAE,SAAU,eAKrB6C,cAACy6B,GAAe,MACZ,EClEG0tC,GAAe,ICqBfC,GAA2D9pE,IAAuB,IAAtB,aAAE6W,GAAc7W,EACvF,MAAM,EAAEnB,GAAMC,YAAe,yBACvBirE,EAAwBnzD,GAAUC,IAEjC2I,EAAyBwqD,GAA8Bp2C,YAC5DxU,KAEKqjD,EAAuBwH,GAAkCr2C,YAC9DvU,KAEK6qD,EAA2BC,GAAgCv2C,YAChEzU,KAGMuM,KAAM0+C,GAAoB94C,KASlC,OAPAkV,qBAAU,KAAO,IAAD6jC,EACdF,EACE3qD,KACiB,OAAf4qD,QAAe,IAAfA,GAAwE,QAAzDC,EAAfD,EAAiBE,uBAAuBrqC,MAAMogB,GAAkB,UAAZA,EAAEjgD,eAAkB,IAAAiqE,OAAzD,EAAfA,EAA0EtuD,OAC7E,GACA,CAACquD,EAAiB5qD,EAAyB2qD,IAG5CzoE,cAAA0yB,WAAA,CAAA3yB,SACGsoE,GACCroE,cAAC4yB,IAAY,CAACua,KAAK,WAAUptC,SAC3BC,cAAC6yB,IAAI,CAAC9vB,GAAG,wBAAuBhD,SAC9BF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAAC0+B,IAAgB,CACf1L,GAAI,EACJzsB,OAAO,UACPuhB,MAAO3qB,EACL,6BACA,sEAEFqD,QAAQ,SACRsB,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI4tC,MAEhCnoE,cAACy+B,IAAe,CACd17B,GAAG,0BACH,aAAY5F,EAAE,oCAAqC,wBACnDg5C,aAAqC,OAAvBr4B,QAAuB,IAAvBA,OAAuB,EAAvBA,EAAyBnN,WACvCk4D,gBAAgB,EAChBnqE,MAAOvB,EAAE,8BAA+B,4BACxCyF,GAAI,EACJswB,SAAW7Y,GAAkBiuD,GAA4BjuD,GACzDqZ,YAAW,KAAA72B,OAAOM,EAAE,SAAU,UAAS,MACvC4jC,GAAI,EACJ5N,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EACP,+BACA,0CAIN2E,EAAG,CAAEw4B,KAAM,OAAQC,GDjFC,KCiF0Bx6B,SAE9B,OAAf2oE,QAAe,IAAfA,OAAe,EAAfA,EAAiBE,uBAAuBznE,KAAKyU,GAC5C5V,cAAA,UAA2Bqa,MAAOzE,EAAOyE,MAAMta,SAC5C6V,EAAOlX,OADGkX,EAAOyE,WAKvBmuD,GACC3oE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACyzB,IAAiB,CAChBqL,KAAK,wBACL/7B,GAAG,iBACH8lE,gBAAgB,EAChBnqE,MAAOvB,EACL,6BACA,uDAEFgwC,KAAK,WACLzZ,YAAav2B,EAAE,mCAAoC,qBACnD+1B,SAAW3wB,GACTgmE,EAA+BhmE,EAAMqxB,OAAOvZ,OAE9C,cAAY,0BACZ8Y,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EACP,sCACA,0CAGJw2B,UAAW,CACTtZ,MAAO,IACPgZ,QAASl2B,EACP,oCACA,2CAIN2E,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI4tC,MAEhCnoE,cAACkmC,GAAc,CAAC7rB,MAAO0mD,EAAuB36B,SAAU,iBAOnE,ECzHMohC,GAA8BA,KACzC,MAAM,EAAErqE,GAAMC,YAAe,0BAEvB,GAAE2F,GAAO8uB,eACT,aAAE2zC,GAAiBxC,KAAgB,OAAFjgE,QAAE,IAAFA,IAAM,IAE7C,OACElD,eAACuC,IAAG,CACFpB,GAAI,GACJqwB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAClB/6B,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OAAS/8B,SAAA,CAE/DC,cAACoC,IAAG,CAACivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAK6mB,GAAI,CAAE9mB,KAAM,EAAGC,GAAI,GAAIx6B,SACjDC,cAAA,MAAAD,SACEC,cAAA,UAAAD,SAAS5C,EAAE,+BAAgC,sCAG/C0C,eAACuC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACzBylE,EAAarkE,KAAK8H,GACjBjJ,cAACwmE,GAAgB,CAAiBv9D,OAAQA,GAAnBA,EAAOlG,QAE7ByiE,GAAwC,IAAxBA,EAAa90D,SAC9B1Q,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAC1BC,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,uBAAwB,mCAIpD,EC7BGkqE,GAAwD/oE,IAAuB,IAAtB,aAAE6W,GAAc7W,EACpF,MAAM,EAAEnB,GAAMC,YAAe,0BAEvB,YAAEgnE,GAAgBpB,GAAY7tD,EAAapS,IAEjD,OACElD,eAACuC,IAAG,CAACo2C,GAAI,CAAEle,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAC1BC,cAACoC,IAAG,CAACg/C,GAAI,EAAG/vB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAIx6B,SAChCC,cAAA,MAAAD,SACEC,cAAA,UAAAD,SAAS5C,EAAE,qBAAsB,4BAGxB,OAAXinE,QAAW,IAAXA,KAAa1zD,OAKb1Q,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAK6mB,GAAI,EAAErhD,SACjCC,cAAC8oE,GAAkB,CAACl/D,QAASw6D,EAAa2E,UAAU,MALtD/oE,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GAAIx6B,SAC1BC,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,uBAAwB,gCAOlD,ECrBGgqE,GAAmD7oE,IAAuB,IAAtB,aAAE6W,GAAc7W,EAC/E,MAAM,EAAEnB,GAAMC,YAAe,0BAEvB,QAAEwM,GAAYo5D,GAAY7tD,EAAapS,IAE7C,OACElD,eAACuC,IAAG,CAACpB,GAAI,EAAEjB,SAAA,CACTC,cAACoC,IAAG,CAACm5B,GAAI,EAAEx7B,SACTC,cAACooE,GAAmB,CAACjzD,aAAcA,MAErCnV,cAACoC,IAAG,CAAC2+B,GAAI,EAAGxF,GAAI,CAAEjB,KAAM,EAAGwM,GAAI,GAAI/mC,SACjCC,cAAA,MAAAD,SACEC,cAAA,UAAAD,SAAS5C,EAAE,mBAAoB,0BAGnC6C,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGwM,GAAI,GAAK9T,GAAI,EAAEjzB,SAChC5C,EACC,wBACA,uFAGJ6C,cAACoC,IAAG,CAACm5B,GAAI,CAAEjB,KAAM,EAAGwM,GAAI,GAAK9T,GAAI,EAAEjzB,SACjCC,cAAC8oE,GAAkB,CAACl/D,QAASA,EAASm/D,UAAQ,QAE5C,ECtBGD,GAAqDxqE,IAA4B,IAA3B,QAAEsL,EAAO,SAAEm/D,GAAUzqE,EACtF,OACE0B,cAAA0yB,WAAA,CAAA3yB,SACG6J,EAAQzI,KAAK8H,IAAM,IAAA+/D,EAAA,OAClBhpE,cAACipE,GAAiB,CAEhBhgE,OAAQA,EACR8/D,SAAUA,GAFI,QAEKC,EAFd//D,EAAOlG,UAAE,IAAAimE,IAAI//D,EAAOwB,WAGzB,KAEH,ECQMw+D,GAAmD3qE,IAA2B,IAA1B,OAAE2K,EAAM,SAAE8/D,GAAUzqE,EACnF,MAAM,EAAEnB,GAAMC,YAAe,0BAEvB,GAAE2F,GAAO8uB,cACTrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IAEzB,wBAAE8gE,GAA4Bb,GAAYxkE,IAEzC0qE,EAAqBC,GAA0Bj3C,YAAerV,IAC/DiB,EAA0BsO,YAAe1O,IACzCK,EAA8BqO,YAAezO,KAE5CyrD,EAAWC,GAAgBxjD,oBAAS,IACpCyjD,EAAcC,GAAmB1jD,mBAAS5c,EAAOA,SAIhD6oB,OAAQ03C,GCtChBC,KAEA,MAAMh+C,EAAcC,cACpB,OAAOC,aAAYoE,GAAc,CAC/BnE,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeE,mBAC1D6d,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeD,kBAC1Dge,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeyB,gBAC1Ds6D,GAAe,GAEjB,ED4BgCC,EAFZD,IAAYN,GAAuB,KAGnD96C,EAAmBtwB,IA8BzB+mC,qBAAU,KACRqkC,GAAuB,EAAM,GAC5B,CAAClgE,EAAOyB,SAAUy+D,IAErB,MAAMQ,EAAcj/D,IAClB8+D,EAAc,CACZhrE,iBACA6L,WAAYpB,EAAOoB,WACnByT,0BACAC,8BACAtT,WAAYxB,EAAOwB,WACnBzB,SAAUC,EAAOD,SACjB4gE,SAAU3gE,EAAOlG,GACjBkG,OAAQqgE,EACR5+D,aAEFy+D,GAAuB,EAAK,EAqBxBU,EACJd,GAAY9/D,EAAOE,aACjBtJ,eAACuC,IAAG,CAAClC,SAAS,KAAKZ,MA7CjB2J,EAAOyB,SACFhK,IAAQo8B,KAAK,KAEfssC,EAAY1oE,IAAQ8qC,MAAQ9qC,IAAQC,KAAK,KA0CGZ,SAAA,CAC9C5C,EAAE,cAAe,eAAe,IAAEkxB,EAAiBplB,EAAOE,cAAe,IACzEhM,EAAE,KAAM,MAAMq+B,cAAc,IAAEvyB,EAAOd,iBAEtC,KAEN,OACEnI,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACyzB,IAAI,CACH,cAAY,cAEZqO,aAAc,EACd9E,gBAvEA5zB,EAAOyB,SACFhK,IAAQ6gC,QAAQ,IAElB6nC,EAAY1oE,IAAQC,KAAK,KAAO,QAqEnCnB,OAAM,aAAA3C,OA/ENoM,EAAOyB,SACFhK,IAAQ+oC,MAAM,KAEhB2/B,EAAY,QAAU1oE,IAAQo8B,KAAK,MA6EtC9J,GAAI,EAAEjzB,SAAA,CAENF,eAACk9B,IAAQ,CACP,cAAY,uBACZ+sC,gBAAiB,EACjBjtC,gBAvEF5zB,EAAOyB,UAGJ0+D,EAFE,QAEoB1oE,IAAQo8B,KAAK,KAqEpCzL,EAAG,EAAEtxB,SAAA,CAELC,cAACoC,IAAG,CAAC+4B,QAAS,SAAUv4B,GAAI,EAAE7C,SAC5BC,cAAA,UAAAD,SAAS5C,EAAE,WAAY,gBAEzB6C,cAACukD,GAAS,CAAC7lD,MAAOuK,EAAOZ,iBACzBrI,cAAC2nC,KAAU,CAAC5G,GAAI,EAAEhhC,SAAEkJ,EAAOD,cAE7BhJ,cAAC+8B,IAAQ,CACP,cAAY,qBACZF,gBAAiB5zB,EAAOyB,SAAWhK,IAAQ6gC,QAAQ,IAAM,QACzDhG,GAAI,EACJwF,GAAI,CAAEzG,KAAM,EAAGC,GAAI,GAAIx6B,SAEtBqpE,EACCppE,cAAC4yB,IAAY,CAAA7yB,SACXC,cAACyzB,IAAiB,CAChB,cAAY,4BACZ0iB,aAAcmzB,EACdvmE,GAAG,aACHrE,MAAOvB,EAAE,oBAAqB,UAC9BgwC,KAAK,WACLja,SAAW3wB,GACTgnE,EAAgBhnE,EAAMqxB,OAAOvZ,OAE/BqZ,YAAav2B,EAAE,0BAA2B,0BAC1Cg2B,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,6BAA8B,qCAMjD0C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CACF+4B,QAAS,CAAEb,KAAM,QAASC,GAAI,UAC9B33B,GAAI,EACJ5B,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,SAAUx6B,SAE7BC,cAAA,UAAAD,SAAS5C,EAAE,SAAU,cAEvB6C,cAAC2nC,KAAU,CAAC5G,GAAI,EAAGoE,KAAM,IAAKlkC,UAAU,OAAMlB,SAC3CupE,IAEHtpE,cAACoC,IAAG,CAAC+4B,QAAS,CAAEb,KAAM,QAASC,GAAI,QAAUvH,GAAI,EAAEjzB,SAChD8pE,SAKRd,GACC/oE,cAAC+8B,IAAQ,CACP,cAAY,qBACZupC,mBAAoB,EACpB3iC,UAAS,aAAA9mC,OAAe6D,IAAQo8B,KAAK,MACrCvB,GAAI,CAAEjB,KAAM,EAAGwM,GAAI,GACnB/F,GAAI,CAAEzG,KAAM,EAAGwM,GAAI,GAAI/mC,SAEvBF,eAACyzB,IAAI,CACHjC,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAClBzG,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjCz4B,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvB34B,eAAgB,CAAE04B,KAAM,QAASC,GAAI,iBACrC14B,WAAW,SACXI,QAAS,EAAElC,SAAA,CAEXC,cAAC+8B,IAAQ,CAAC5B,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAAUx6B,SAAE8pE,IACnD7pE,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAACszB,IAAI,CACHQ,aAAc,CAAEwG,KAAM,MAAOC,GAAI,UACjCz4B,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvB34B,eAAgB,CAAE04B,KAAM,QAASC,GAAI,iBACrCt4B,QAAS,EAAElC,SAEVqpE,EACCvpE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACJ,IAAM,CACLM,SAAS,KACTM,QAAQ,YACRupE,QAAS,CAAEzvC,KAAM,EAAGC,GAAI,GACxBz4B,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBh5B,QAnHDixB,KACnB62C,GAAa,GACbE,EAAgBtgE,EAAOA,OAAO,EAiHYlJ,SAErB5C,EAAE,SAAU,YAEf6C,cAACJ,IAAM,CACLM,SAAS,KACTM,QAAQ,UACRsB,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBuD,UAAW+lC,EACXtiE,QAvHHyoE,KACjBL,GAAW,GACXN,GAAa,EAAM,EAqHqBtpE,SAEnB5C,EAAE,OAAQ,aAIf0C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACJ,IAAM,CACLU,UAAWN,cAAC28C,IAAM,IAClBz8C,SAAS,KACTM,QAAQ,YACRsB,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBh5B,QA5IH0oE,KACjBZ,GAAa,EAAK,EA2IsBtpE,SAEnB5C,EAAE,OAAQ,WAEX8L,EAAOyB,WAAa0+D,GACpBppE,cAACJ,IAAM,CACLM,SAAS,KACTM,QAAQ,UACRsB,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBuD,UAAW+lC,GAA2BqF,EACtC3nE,QA1JF2oE,KACpBP,GAAW,EAAK,EAyJ6B5pE,SAEtB5C,EAAE,iBAAkB,kCA9HlC8L,EAAOlG,KAyIb,EEnPMqkE,GAAwD9oE,IAAuB,IAAtB,aAAE6W,GAAc7W,EACpF,MAAM,EAAEnB,GAAMC,YAAe,0BACtB+sE,EAAgBC,GAAqBvkD,oBAAS,IAG/C,SAAErc,EAAQ,UAAEgtC,GAAcwsB,GAAY7tD,EAAapS,KACjD+uB,OAAQhC,GAAmBI,KAE7Bm6C,EAAyB/9C,YAAkBnP,IAC3CmtD,EAAmBh+C,YAAkBrP,IACrCstD,EAAqBj+C,YAAkBpP,IAc7C,OAZA4nB,qBAAU,KACH0R,GAAchtC,GACjBsmB,EAAe,CACbtxB,eAAgB2W,EAAapS,IAEjC,GACC,CAACyzC,EAAWhtC,EAAUsmB,EAAgB3a,EAAapS,KAEtD+hC,qBAAU,KACRulC,EAAuBF,EAAe,GACrC,CAACE,EAAwBF,IAG1BtqE,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACuC,IAAG,CACFm5B,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnBwG,GAAI,CAAEzG,KAAM,EAAGC,GAAI,GACnBie,GAAI,CAAEle,KAAM,EAAGC,GAAI,IACnB6mB,GAAI,CAAE9mB,KAAM,QAASC,GAAI,GACzB+G,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxC+gC,WAAY,CAAEvjC,KAAM,aAAcC,GAAI,KACtC8D,SAAS,UAASt+B,SAAA,CAElBF,eAACuC,IAAG,CAACg/C,GAAI,CAAE9mB,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAC1BC,cAACukD,GAAS,CAAC7lD,MAAO,IAClBsB,cAAC2nC,KAAU,CAACxM,QAAQ,SAASqvC,cAAc,SAAStqE,SAlCpC,GAkC8DH,SAC5EC,cAAA,UAAAD,SAAS5C,EAAE,oBAAqB,4BAGpC6C,cAACyqE,GAAoB,CACnBt1D,aAAcA,EACdi1D,kBAAmBA,OAGvBpqE,cAACoC,IAAG,CAACg/C,GAAI,EAAG/vB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAKv5B,GAAI,EAAEjB,SACvCC,cAAC+xC,GAAe,MAElBlyC,eAACuC,IAAG,CAACivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,QAAU+G,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MAAQ9I,GAAI,EAAEj0B,SAAA,CACrFC,cAACukD,GAAS,CAAC7lD,MAAO,IAClBsB,cAAC2nC,KAAU,CAACxM,QAAQ,SAASqvC,cAAc,SAAStqE,SAhDlC,GAgD4DH,SAC5EC,cAAA,UAAAD,SAAS5C,EAAE,kBAAmB,uBAE/BgtE,GACCtqE,eAAA,QAAMk2C,MAAO,CAAE70C,MAAO,cAAegmE,WAAY,OAAQnnE,SAAA,CACvDC,cAAA,QACEqlC,UAAU,4BACVjlC,KAAK,eACL,cAAY,OACZ21C,MAAO,CAAEz2C,MAAM,GAADzC,OAAK6D,IAAQgrC,IAAI,OAAS3rC,SACzC,MAGDC,cAAA,QAAMqlC,UAAU,uBAAsBtlC,SAAC,gBAG3CC,cAACoC,IAAG,CAAC4xB,GAAI,EAAEj0B,SACTC,cAACgyC,GAAY,CACX3M,UAAU,aACVriC,KAAK,uBACLsuB,GAAI,CAAEgJ,KAAM55B,IAAQC,KAAK,KAAMomC,GAAIrmC,IAAQo8B,KAAK,MAChDt9B,OAAQ,CACN86B,KAAK,cAADz9B,OAAgB6D,IAAQC,KAAK,MACjComC,GAAG,aAADlqC,OAAe6D,IAAQo8B,KAAK,OAEhCoV,kBAA2B,OAAR1oC,QAAQ,IAARA,OAAQ,EAARA,EAAUG,gBAC7BwoC,iBAAkBm4B,EAClBxoE,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI,KAC9BgwB,ShU3FkB,GgU4FlBnY,qBAAqB,SAI3BvyC,eAACuC,IAAG,CAACivB,EAAG,CAAEiJ,KAAM,EAAGC,GAAI,GAAKvG,GAAI,EAAEj0B,SAAA,CAChCC,cAACukD,GAAS,CAAC7lD,MAAO,IAClBsB,cAAC2nC,KAAU,CAACxM,QAAQ,SAASqvC,cAAc,SAAStqE,SApFlC,GAoF4DH,SAC5EC,cAAA,UAAAD,SACG5C,EAAE,8BAA+B,8CAGtC6C,cAACoC,IAAG,CAAC4xB,GAAI,EAAEj0B,SACTC,cAACgyC,GAAY,CACXE,kBAA2B,OAAR1oC,QAAQ,IAARA,OAAQ,EAARA,EAAUG,gBAC7BsoC,UAAQ,EACRE,iBAAkBo4B,EAClBzoE,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI,KAC9B6X,qBAAqB,WAI1B,ECpGMq4B,GAA4DnsE,IAGlE,IAADosE,EAAA,IAHoE,aACxEv1D,EAAY,kBACZi1D,GACD9rE,EACC,MAAM,EAAEnB,GAAMC,YAAe,0BACvB,2BAAE8jE,GAA+BD,MAC/Bj3C,KAAM2gD,GAAsB16C,MAE7BgzC,EAAkC2H,GACvC14C,YAAepV,KACV+tD,EAAwBC,GAC7B54C,YAAenV,KACVM,EAAgB0tD,GAAqB74C,YAAelV,KACrD,UAAE+lD,GAAcT,KAEtBx9B,qBACE,KACEi+B,GAAW,GAGb,IAGF,MAAMr5D,EAAemhE,EACA,OAAjBF,QAAiB,IAAjBA,GAAsF,QAArED,EAAjBC,EAAmBK,cAAczsC,MAAM76B,GAASA,EAAK2W,QAAUwwD,WAAuB,IAAAH,OAArE,EAAjBA,EACIhsE,WACJ8N,EAEEy+D,EAA0B/J,EAA2Bx3D,GAE3Do7B,qBAAU,KAAO,IAADomC,EACdN,EACEC,KACmB,OAAjBF,QAAiB,IAAjBA,GAA8E,QAA7DO,EAAjBP,EAAmBK,cAAczsC,MAAMogB,GAAkB,uBAAZA,EAAEjgD,eAA+B,IAAAwsE,OAA7D,EAAjBA,EAAgF7wD,OACnF,GACA,CAACswD,EAAmBE,EAAwBD,IAE/C,MAAMO,EAAkBlI,EACpB9lE,EAAE,2BAA4B,WAC9BA,EAAE,4BAA6B,sBAE7BiuE,EAA2BnI,EAC7B,CACE7vC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,6BAA8B,yBAG7C,KAaJ,OACE0C,eAAC+yB,IAAY,CAACua,KAAK,WAAUptC,SAAA,CAC3BC,cAACoC,IAAG,CAACg/C,GAAI,EAAErhD,SACR5C,EACC,4BACA,iKAGJ6C,cAACy+B,IAAe,CACd17B,GAAG,0BACH,aAAY5F,EAAE,6BAA8B,iBAC5C0rE,gBAAgB,EAChBnqE,MAAOvB,EAAE,uBAAwB,4BACjCyF,GAAI,EACJswB,SAAW7Y,GAzBOA,KAAmB,IAADgxD,EACxCP,GAA2BzwD,GAC3B,MAAMixD,EAAkC,OAAjBX,QAAiB,IAAjBA,GAEtB,QAFuCU,EAAjBV,EAAmBK,cAAczsC,MACrDiK,GAAMA,EAAEnuB,QAAUkxD,SAASlxD,YAC7B,IAAAgxD,OAFuC,EAAjBA,EAEpBG,uBAEoBh/D,IAAnB8+D,GACFlB,GAAqBA,EAAkBkB,EACzC,EAiBiCtS,CAAe3+C,GAC5CqZ,YAAW,KAAA72B,OAAOM,EAAE,SAAU,UAAS,MACvC4jC,GAAI,EACJ5N,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,+BAAgC,mCAG/Ckd,MAAOwwD,EACP/oE,EAAG,CAAEw4B,KAAM,OAAQC,GT3GS,KS2GkBx6B,SAE5B,OAAjB4qE,QAAiB,IAAjBA,OAAiB,EAAjBA,EAAmBK,cAAc7pE,KAAKyU,GACrC5V,cAAA,UAA2Bqa,MAAOzE,EAAOyE,MAAMta,SAC5C6V,EAAOlX,OADGkX,EAAOyE,WAKvBwwD,GACC7qE,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPuhB,MAAK,GAAAjrB,OAAK6M,EAAY,KAAA7M,OAAIM,EAAE,iCAAkC,eAC9DiG,YAAa6nE,EACbj4C,GAAI,EACJlxB,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI4tC,IAC9B9iC,UAAU,4BAGdxlC,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACyzB,IAAiB,CAChB1wB,GAAG,0BACH8lE,gBAAgB,EAChBnqE,MAAOysE,EACPh+B,KAAK,WACLpM,GAAI,EACJrN,YAAav2B,EAAE,gBAAiB,sBAChC+1B,SAAW3wB,GACTwoE,EAAkBxoE,EAAMqxB,OAAOvZ,OAEjC8Y,WAAY,IACPi4C,EACHz3C,UAAW,CACTtZ,MAAO,IACPgZ,QAASl2B,EAAE,0BAA2B,2CAG1C2E,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI4tC,MAEhCnoE,cAACkmC,GAAc,CAAC7rB,MAAOgD,EAAgB+oB,SAAU,SAEnDpmC,cAACooE,GAAmB,CAACjzD,aAAcA,MACtB,EC9INs2D,GAA6BA,KACxC,MAAM,GAAE1oE,EAAE,WAAEsH,GAAewnB,cACrBrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IACvBinB,KAAM7U,GAAiB4X,GAAgBvuB,IACzC,cAAEsmE,GAAkB9B,GAAYxkE,GAEhCgL,EAAWs7D,EAAcvmC,MAAMogB,GAAMA,EAAE57C,OAAmB,OAAVsH,QAAU,IAAVA,IAAc,KAEpE,OACErK,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAI,GAAGjzB,SAAA,CACvBC,cAACkoE,GAAc,CAAC/yD,aAAcA,IAC9BnV,cAAC6gE,GAAwB,CAACr3D,SAAUA,EAAU2L,aAAcA,QAEpD,ECTHu2D,GAAiCA,KAC5C,MAAM,GAAE3oE,GAAO8uB,cACTrzB,IAAqB,OAAFuE,QAAE,IAAFA,IAAM,IACvBinB,KAAM7U,EAAY,MAAEsS,EAAK,QAAEq4C,GAAY/yC,IAAiBvuB,IAC1D,oBAAEi5B,GAAwBd,KAQhC,OANAmO,qBAAU,KACJg7B,GAAWr4C,GACbgQ,EAAoBhQ,EACtB,GACC,CAACq4C,EAASr4C,EAAOgQ,IAGlBz3B,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAI,GAAGjzB,SAAA,CACvBC,cAACkoE,GAAc,CAAC/yD,aAAcA,IACjB,OAAZA,QAAY,IAAZA,KAAcjO,WACblH,cAAC8lE,GAA4B,IAE7B9lE,cAACgnE,GAAwB,QAGnB,ECvBH2E,GAA0ErtE,IAEhF,IAFiF,aACtF6W,GACD7W,EACC,MAAM,EAAEnB,GAAMC,YAAe,mBACvB,kBAAE+6B,EAAiB,mBAAEF,GAAuBtB,KAC5C53B,EAAWC,cACX2pC,EAAmB5O,GAAoB5kB,GAE7C,OACEtV,eAACyzB,IAAI,CACH,cAAY,gCACZQ,aAAa,SACb7xB,QAAS,EACTH,EAAG/C,EAAW,OAAS,UAAUgB,SAAA,CAEjCC,cAACJ,IAAM,CACLO,SAAS,QACTK,QAAQ,WACRe,QAASA,IAAM4T,GAAgBgjB,EAAkBhjB,EAAapS,IAAIhD,SAEjE5C,EAAE,oBAAqB,uBAEzBwrC,GACC3oC,cAACJ,IAAM,CACLO,SAAS,QACTK,QAAQ,YACRe,QAASA,IAAM4T,GAAgB8iB,EAAmB9iB,EAAapS,IAAIhD,SAElE5C,EAAE,gBAAiB,qBAGnB,EClCEyuE,GAAoDttE,IAA6B,IAA5B,MAAEwpB,EAAK,YAAE1kB,GAAa9E,EACtF,MAAM,IAAEO,GAAQC,eAChB,OACEe,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAACimC,IAAO,CACNnlC,GAAG,KACHL,KAAK,KACL6gC,aAAcziC,EAAI,CAAEM,GAAI,QAAS,aAADtC,OAAe6D,IAAQo8B,KAAK,OAC5DiE,GAAIliC,EAAI,CAAEM,GAAI,GAAK,GACnBo8B,GAAI18B,EAAI,CAAEM,GAAI,CAAEm7B,KAAM,IAAO,CAAEA,KAAM,EAAGyM,GAAI,IAC5C/T,GAAG,UACHkJ,EAAE,eAAcn8B,SAEf+nB,IAEH9nB,cAAC6zB,KAAI,CAACkN,GAAIliC,EAAI,CAAEM,GAAI,GAAK,GAAIo8B,GAAI18B,EAAI,CAAEM,GAAI,CAAEm7B,KAAM,IAAO,CAAEA,KAAM,EAAGyM,GAAI,IAAKhnC,SAC3EqD,MAEC,ECNGyoE,GAAkDvtE,IAAuB,IAAtB,aAAE6W,GAAc7W,EAC9E,MAAM,EAAEnB,GAAMC,YAAe,sBACvB,IAAEyB,GAAQC,eACV60D,EAAkB/jB,aAAmB,CAAEtV,KAAM,UAAWC,GAAI,YAClE,IAAKplB,EACH,OAAOnV,cAACujD,KAAY,IAEtB,MAAMsb,EAAW,CACf,CACEngE,MAAOvB,EAAE,YAAa,aACtBkd,MAAOlF,EAAavO,WAEtB,CACElI,MAAOvB,EAAE,YAAa,aACtBkd,MAAOlF,EAAahR,WAEtB,CACEzF,MAAOvB,EAAE,UAAW,WACpBkd,MAAOlF,EAAapR,SAEtB,CACErF,MAAOvB,EAAE,WAAY,YACrBkd,MAAOlF,EAAa1O,UAEtB,CACE/H,MAAOvB,EAAE,mBAAoB,qBAC7Bkd,MAAOlF,EAAa3O,mBAIlBslE,EAAa,CACjB,CACEptE,MAAOvB,EAAE,cAAe,gBACxBkd,MAAOlF,EAAatO,qBAWxB,MAPsC,QAAlCsO,EAAa3O,kBACfslE,EAAWjjC,KAAK,CACdnqC,MAAOvB,EAAE,0BAA2B,4BACpCkd,MAAOlF,EAAa5N,wBAKtB1H,eAACspC,IAAW,CACVhG,UAAU,OACV,cAAY,oBACZqV,GAAI35C,EAAI,CAAEM,GAAI,CAAEm7B,KAAM,SAAY,CAAEA,KAAM,EAAGC,GAAI,IAAKx6B,SAAA,CAEtDC,cAAC0mC,IAAe,CAACqb,GAAIljD,EAAI,CAAEM,GAAI,WAAa,GAAI69B,GAAIn+B,EAAI,CAAEM,GAAI,WAAa,GAAGY,SAC5EC,cAAC0zD,IAAO,CACN7yD,GAAI,CAAE,YAAa,CAAE4qD,cAAe,WACpCkI,gBAAiBA,EAAgB5zD,SAEhC6zD,aAAeiL,EAAU,CACxB9L,gBAAgB,EAChB1hC,EAAGxyB,EAAI,CAAEM,GAAI,GAAK,GAClB8C,QAAS,aAIoB,QAAlCkT,EAAa3O,kBACZxG,cAACynC,IAAiB,CAChBlM,GAAI18B,EAAI,CAAEM,GAAI,WAAa,GAC3B4hC,GAAIliC,EAAI,CAAEM,GAAI,WAAa,GAC3BkqC,WAAYxqC,EAAI,CAAEM,GAAI,WAAauB,IAAQo8B,KAAK,MAChDj8B,GAAI,CACF,6BAA8B,CAC5BmyB,GAAI,SAENjzB,SAED+rE,EAAW3qE,KAAI,CAACw9C,EAAGjyC,IAClB1M,cAAC4rE,GAAgB,CAAS9jD,MAAO62B,EAAEjgD,MAAO0E,YAAau7C,EAAEtkC,OAAlC3N,SAIjB,EClFLq/D,GAAgEztE,IAEtE,IAFuE,aAC5E6W,GACD7W,EACC,MAAM,EAAEnB,GAAMC,YAAe,yBACvB,IAAEyB,GAAQC,eACV60D,EAAkB/jB,aAAmB,CAAEtV,KAAM,UAAWC,GAAI,YAC5DyxC,EAAyCp8B,aAAmB,CAChEtV,KAAM,WACNyM,GAAI,eAGN,IAAK5xB,EACH,OAAOnV,cAACujD,KAAY,CAACC,UAAW,IAElC,MAAMyoB,EAAuB,CAC3B,CACEvtE,MAAOvB,EAAE,OAAQ,QACjBkd,MAAOlF,EAAa1N,iBAEtB,CACE/I,MAAOvB,EAAE,iBAAkB,kBAC3Bkd,MAAOlF,EAAajP,0BAEtB,CACExH,MAAOvB,EAAE,gBAAiB,iBAC1Bkd,MAAOlF,EAAazN,0BAGxB,OACE1H,cAAC07B,IAAI,CAACqF,GAAIliC,EAAI,CAAEM,GAAI,WAAa,GAAIo8B,GAAI18B,EAAI,CAAEM,GAAI,WAAa,GAAGY,SACjEC,cAAC0zD,IAAO,CACN7yD,GAAI,CACF,YAAa,CACX4qD,cAAe,UAEjB,0BAA2B,CACzBz4B,GAAIn0B,EAAI,CAAEM,GAAI,aAGlBw0D,gBAAiBA,EAAgB5zD,SAEhC6zD,aAAeqY,EAAM,CACpBD,eACAjZ,gBAAgB,EAChB1hC,EAAGxyB,EAAI,CAAEM,GAAI,GAAK,GAClB8C,QAAS,eAGR,EC5CEiqE,GAAgD5tE,IAAkC,IAAjC,aAAE6W,EAAY,UAAEqhC,GAAWl4C,EACvF,MAAO6tE,EAAWC,GAAgBvmD,oBAAkB,IAC9C,EAAE1oB,GAAMC,YAAe,mBACvB,IAAEyB,GAAQC,eAUhB,OARAgmC,qBAAU,MACP0R,GACDrhC,IACoC,SAAvB,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc3O,mBAA0C,OAAZ2O,QAAY,IAAZA,KAAcjO,YACvDklE,GAAa,GACbA,GAAa,EAAK,GACrB,CAAC51B,EAAWrhC,EAAci3D,IAG3BvsE,eAAC8B,IAAI,CAACsiC,cAAc,MAAMriC,eAAe,gBAAgBK,QAAS,EAAElC,SAAA,CAClEF,eAAC8B,IAAI,CAAColE,KAAM,EAAG9iC,cAAc,SAAQlkC,SAAA,CACnCF,eAAC8B,IAAI,CACHqxB,GAAIn0B,EAAI,CAAEM,GAAI,YAAc,GAC5B6B,GAAInC,EAAI,CAAEM,GAAI,GAAK,GACnByC,eAAe,gBACfC,WAAW,WACXm7B,GAAI,CAAE1C,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CAEvBC,cAAC2nC,KAAU,CAAA5nC,SACTC,cAACimC,IAAO,CAAAlmC,SAAE5C,EAAE,eAAgB,qBAE5BgvE,IACC31B,GACDrhC,GACmC,SAAvB,OAAZA,QAAY,IAAZA,OAAY,EAAZA,EAAc3O,mBACZxG,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAM6qE,GAAa,GAAMrsE,SACnD5C,EAAE,aAAc,mBAIzB6C,cAAC6rE,GAAe,CAAC12D,aAAcA,IAC/BnV,cAAC2nC,KAAU,CAAC3mC,GAAInC,EAAI,CAAEM,GAAI,YAAc,GAAI6zB,GAAIn0B,EAAI,CAAEM,GAAI,YAAc,GAAGY,SACzEC,cAACimC,IAAO,CAAAlmC,SAAE5C,EAAE,uBAAwB,4BAEtC6C,cAAC+rE,GAAsB,CAAC52D,aAAcA,OAEvCg3D,GACCtsE,eAACuC,IAAG,CAACjC,SAAU,IAAKiwC,SAAU,IAAIrwC,SAAA,CAChCF,eAAC8B,IAAI,CACHC,eAAe,gBACfC,WAAW,WACXm7B,GAAIn+B,EAAI,CAAEM,GAAI,GAAK,CAAEm7B,KAAM,EAAGC,GAAI,IAClCvH,GAAIn0B,EAAI,CAAEM,GAAI,YAAc,GAAGY,SAAA,CAE/BC,cAAC+jD,GAAY,CAAC5uC,aAAcA,IAC5BnV,cAACk6B,GAAa,CAAC/kB,aAAcA,IAC5Bg3D,IAAyB,OAAZh3D,QAAY,IAAZA,OAAY,EAAZA,EAAcjO,aAC1BlH,cAACqwC,IAAI,CAACnwC,SAAS,KAAKqB,QAASA,IAAM6qE,GAAa,GAAOrsE,SACpD5C,EAAE,OAAQ,aAIjB0C,eAAC67B,IAAI,CAACrK,EAAGxyB,EAAI,CAAEM,GAAI,WAAa,GAAI6B,GAAInC,EAAI,CAAEM,GAAI,GAAK,GAAGY,SAAA,CACxDC,cAAC0xB,GAAO,IACR1xB,cAAC4iD,GAAK,CAAC76C,MAAmB,OAAZoN,QAAY,IAAZA,OAAY,EAAZA,EAAcpN,MAAO86C,QAASrM,YAI7C,EC5DE61B,GAA8C/tE,IAAkC,IAAjC,aAAE6W,EAAY,UAAEqhC,GAAWl4C,EACrF,MAAM,EAAEnB,GAAMC,YAAe,kBACvBg9B,EAAaH,GAAc9kB,GACjC,OACEtV,eAACugE,KAAI,CAAC5/D,QAAQ,OAAO6wB,EAAG,EAAG+f,IAAK,EAAErxC,SAAA,CAChCF,eAACshD,KAAO,CAAAphD,SAAA,CACNC,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,eAAgB,oBAE9B6C,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAAAvhD,SAAE5C,EAAE,QAAS,gBAGzB0C,eAACygE,KAAS,CAACv/B,GAAI,EAAEhhC,SAAA,CACfF,eAAC2gE,KAAQ,CAACz/B,GAAI,EAAGvhC,OAAQ,EAAEO,SAAA,CACzBC,cAAC6rE,GAAe,CAAC12D,aAAcA,IAC/BnV,cAAC2nC,KAAU,CAAC3mC,GAAI,EAAGgyB,GAAI,EAAEjzB,SACvBC,cAAA,MAAAD,SAAK5C,EAAE,uBAAwB,4BAEjC6C,cAAC+rE,GAAsB,CAAC52D,aAAcA,OAExCtV,eAAC2gE,KAAQ,CAACz/B,GAAI,EAAGvhC,OAAQ,EAAEO,SAAA,CACxBq6B,GACCv6B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACqkD,GAAgB,CAAClvC,aAAcA,IAChCnV,cAACk6B,GAAa,CAAC/kB,aAAcA,IAC7BnV,cAAC+zB,IAAO,CAACC,GAAI,OAGjBh0B,cAAC0xB,GAAO,IACR1xB,cAACoC,IAAG,CAACpB,GAAI,EAAEjB,SACTC,cAAC4iD,GAAK,CAAC76C,MAAmB,OAAZoN,QAAY,IAAZA,OAAY,EAAZA,EAAcpN,MAAO86C,QAASrM,cAI7C,EC7CE81B,GAAkEhuE,IAExE,IAFyE,aAC9E6W,GACD7W,EACC,MAAM,EAAEnB,GAAMC,YAAe,kBACvBmB,ECTN4W,KAEA,MAAM,EAAEhY,GAAMC,YAAe,wBAEvB2L,EAAcqjB,YAAe5R,KAE7B,kBAAE2d,GAAsBxB,MACxB,yBAAE1B,GAA6BhB,KAC/Bs4C,EAA0BjgD,YAAkBjM,IAE5C9hB,EAAwB,CAC5B,CACEG,MAAOvB,EAAE,eAAgB,gBACzBoE,QAAU/C,GAAmBA,GAAkB25B,EAAkB35B,GACjEuD,KAAMinC,KAER,CACEtqC,MAAOvB,EAAE,SAAU,UACnBoE,QAAU/C,GAAmBA,GAAkBy2B,EAAyBz2B,GACxEuD,KAAMgnC,OAkBV,OAbE5zB,IACCA,EAAaxN,qBACU,wBAAxBwN,EAAa5O,QACb4O,EAAazO,aAAeqC,GACM,QAAlCoM,EAAa3O,kBAEbjI,EAAQsqC,KAAK,CACXnqC,MAAOvB,EAAE,oBAAqB,qBAC9BoE,QAASA,IAAMgrE,GAAwB,GACvCxqE,KAAMgpC,MAIHxsC,CAAO,ED5BEiuE,CAAsBr3D,IAChC,mBAAE8iB,GAAuBtB,KACzB53B,EAAWC,cAEjB,OACEa,eAACyzB,IAAI,CACH,cAAY,4BACZQ,aAAa,SACbkU,oBAAoB,UACpB/lC,QAAS,EACTH,EAAG/C,EAAW,OAAS,UAAUgB,SAAA,CAEjCC,cAACoC,IAAG,CAAArC,SACFC,cAAC3B,EAAgB,CAACG,eAAgB2W,EAAapS,GAAIxE,QAASA,MAE9DyB,cAACJ,IAAM,CACLO,SAAS,QACToB,QAASA,IAAM4T,GAAgB8iB,EAAmB9iB,EAAapS,IAAIhD,SAElE5C,EAAE,UAAW,eAEX,EELEsvE,GAA8DnuE,IAEpE,IAFqE,eAC1EE,GACDF,EACC,MAAM,EAAEnB,GAAMC,YAAe,2BACvB2B,EAAWC,eACV0tE,EAAsBH,GAA2Br6C,YACtD7R,IAGI6T,EAASC,gBACPrC,OAAQhF,EAAgB,UAAE0pB,GCtCDm2B,MAKjC,MAAMlhD,EAAcC,cACpB,OAAOC,aAAYmB,GAAkB,CACnClB,UAAWA,IACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeE,oBAC5D,ED6B8C++D,GAE1Cz3C,EAAcA,KAClBq3C,GAAwB,EAAM,EA6B1BvuC,EACJn+B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,0BAA2B,2BAA2B4C,SAAA,CAC/EF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACk+B,KAAY,CAAC5+B,MAAOoB,IAAQC,KAAK,OAClCX,cAAA,QAAAD,SAAO5C,EAAE,oBAAqB,0BAEhC6C,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAACC,SAAS,OAAMt+B,SAAA,CACxBC,cAAC4yB,IAAY,CAACua,KAAK,WAAUptC,SAC3BC,cAAC6yB,IAAI,CACH9vB,GAAG,+BACH+vB,cAAe9gB,IAAA,IAAC,OAAE46D,GAAQ56D,EAAA,MAvCJ46D,KAC9B9/C,EACE,CACEtuB,iBACAquE,gBAAiBD,GAEnB,CACEhhD,UAAWA,KACTsI,EAAO,CACLnxB,GAAI,2BACJ+kB,MAAO3qB,EAAE,yBAA0B,mCACnCg4B,SAAUx4B,IAEZu4B,GAAa,EAEf9H,QAASA,IACP8G,EAAO,CACLnxB,GAAI,kCACJ+kB,MAAO3qB,EAAE,2BAA4B,4BACrCg4B,SAAUx4B,EACV4J,OAAQ,WAGf,EAgBsCumE,CAAuBF,EAAO,EAAC7sE,SAE9DC,cAACyzB,IAAiB,CAChB,cAAY,2BACZ1wB,GAAG,SACHrE,MAAOvB,EACL,oBACA,sDAEFgwC,KAAK,WACLha,WAAY,CACVC,SAAU,CACR/Y,OAAO,EACPgZ,QAASl2B,EAAE,6BAA8B,wBAE3Cw2B,UAAW,CACTtZ,MAAO,IACPgZ,QAASl2B,EACP,2BACA,iDAOZ6C,cAAC0+B,IAAgB,CACfn4B,OAAO,OACP/F,QAAQ,SACRsnB,MAAO3qB,EACL,sBACA,kEAEF6D,GAAI,UAMZ,OAAOjC,EACLc,eAAC8+B,GAAW,CAACxB,OAAQuvC,EAAsBtvC,QAASlI,EAAYn1B,SAAA,CAC7Di+B,EAEDh+B,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CACLk+B,SAAU0Y,EACV3X,aAAW,EACXn7B,KAAK,SACLo7B,KAAK,+BAA8B/+B,SAElC5C,EAAE,2BAA4B,kBAEjC6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAAS2zB,EAAYn1B,SACzD5C,EAAE,qBAAsB,oBAMjC0C,eAACk/B,KAAK,CAAC5B,OAAQuvC,EAAsBtvC,QAASlI,EAAYn1B,SAAA,CACxDC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACVi+B,EAEDh+B,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAAS2zB,EAAYn1B,SAC7C5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAACk+B,SAAU0Y,EAAW9yC,KAAK,SAASo7B,KAAK,+BAA8B/+B,SAC3E5C,EAAE,2BAA4B,4BAM1C,EE7JU4vE,GAA0BA,KACrC,MAAM,EAAE5vE,GAAMC,YAAe,mBACvB,GAAE2F,GAAO8uB,eACP7H,KAAM7U,GAAiB4X,KAAoB,OAAFhqB,QAAE,IAAFA,IAAM,IAEvD,OACElD,eAAC8B,IAAI,CACHsiC,cAAe,CAAE3J,KAAM,SAAUC,GAAI,OACrC34B,eAAgB,CAAE04B,KAAM,QAASC,GAAI,iBACrCt4B,QAAS,EAAElC,SAAA,CAEXC,cAACwkD,GAAW,CACVze,QACc,OAAZ5wB,QAAY,IAAZA,KAAcjO,WACV/J,EAAE,gCAAiC,mCACnCA,EAAE,uBAAwB,0BAGjCgY,IACc,OAAZA,QAAY,IAAZA,KAAcjO,WACblH,cAAC2rE,GAA2B,CAACx2D,aAAcA,IAE3CnV,cAACssE,GAAuB,CAACn3D,aAAcA,OAEtC,ECjBE63D,GAAgCA,KAC3C,MAAM,GAAEjqE,GAAO8uB,cACT9yB,EAAWC,eAEfgrB,KAAM7U,EAAY,MAClBsS,EAAK,QACLq4C,EAAO,UACPtpB,EAAS,eACTupB,EAAc,eACdC,GACEjzC,KAAoB,OAAFhqB,QAAE,IAAFA,IAAM,KACtB,gBAAE8xB,EAAe,YAAEK,GAAgBjB,MACnC,oBAAEwD,GAAwBd,MAEzBwpC,EAAa8M,GAAkBpnD,oBAAS,GAW/C,OAVAif,qBAAU,KACRmoC,EAAez2B,GAAaupB,GAAkBC,EAAe,GAC5D,CAACxpB,EAAWupB,EAAgBC,IAE/Bl7B,qBAAU,KACJg7B,GAAWr4C,GACbgQ,EAAoBhQ,EACtB,GACC,CAACq4C,EAASr4C,EAAOgQ,IAEb0oC,EACLngE,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAAC04C,IAAe,CAACj4C,KAAK,SAGxBZ,eAACulC,IAAS,CAACpS,GAAI,GAAIuI,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SAAA,CAC/CF,eAACuC,IAAG,CAAC4xB,GAAI,EAAEj0B,SAAA,CACTC,cAAC+sE,GAAa,IACd/sE,cAACy6B,GAAe,CAACE,YAAY,OAE9B57B,EACCiB,cAACqsE,GAAa,CAACl3D,aAAcA,EAAcqhC,UAAWA,IAEtDx2C,cAACksE,GAAc,CAAC/2D,aAAcA,EAAcqhC,UAAWA,IAEzDx2C,cAACk9B,GAAW,CAACC,OAAQtI,EAAiBuI,QAASlI,IAC9C/f,GAAgBnV,cAACysE,GAAqB,CAACjuE,eAAgB2W,EAAapS,OAExE,EC3CUmqE,GAA8D5uE,IAOpE,IAPqE,SAC1Eo2C,EAAQ,aACRC,EAAY,kBACZw4B,EAAiB,SACjBt4B,EAAQ,MACRn2C,EAAK,qBACL0uE,GACD9uE,EAEC,OAD4B8tB,YAAeuoB,KACZE,EAC7B70C,cAAC47B,IAAW,CAAC16B,MAAM,OAAMnB,SACvBC,cAACg2C,GAAoB,CACnBC,YAAak3B,EACbzuE,MAAOA,EACPw3C,QAAQ,sBACRC,aAAci3B,EAAuB,OAAS,YAIlDptE,cAAC6zB,KAAI,CAAA9zB,SAAE20C,GACR,ECXU24B,GAAoE/uE,IAE1E,IAADgvE,EAAAC,EAAA,IAF4E,aAChFnkE,GACD9K,EACC,MAAM,EAAEnB,GAAMC,YAAe,uBACvBowE,EAAephD,YAAetb,IAC9BkgB,EAAiB5E,YAAelb,KAE/BlO,EAAM0zC,GAAW7wB,mBAA+C,QAAvCynD,EAAqB,OAAZlkE,QAAY,IAAZA,OAAY,EAAZA,EAAcuB,wBAAgB,IAAA2iE,IAAI,KACpE1yB,EAAeU,GAAoBz1B,oBAAkB,IACrDjb,EAAO+rC,GAAY9wB,mBAAoC,QAA5B0nD,EAAqB,OAAZnkE,QAAY,IAAZA,OAAY,EAAZA,EAAcwB,aAAK,IAAA2iE,IAAI,KAC3D5yB,EAAgBU,GAAqBx1B,oBAAkB,IACvD4nD,EAAgBC,GAAqB7nD,oBAAkB,IAEtDiM,OAAQ67C,EAAY,OAAEpnE,EAAM,MAAEkhB,EAAK,UAAE+uB,GCxBJo3B,MAKzC,MAAMC,EAA0BvhD,YAAkBxb,IAC5Cg9D,EAA2BxhD,YAAkBpb,IAC7C68D,EAAqBzhD,YAAkBlb,IACvCqa,EAAcC,cACpB,OAAOC,aAAYiC,GAA0B,CAC3ChC,UAAWA,CAAC5B,EAAMgkD,KAChBviD,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeqB,6BAC1D0c,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeoB,0BAC1D++D,EAAwBG,GACxBF,EAAyB9jD,EAAKjnB,IAC9B,MAAMkrE,EAAuB,CAC3BlrE,GAAIinB,EAAKjnB,GACT4H,iBAAkBqjE,EAAUrjE,iBAC5BC,MAAOojE,EAAUpjE,OAEnBmjE,EAAmBE,EAAO,GAE5B,EDEyDL,GACrDM,EE3BuBC,EAC7B5nE,EACAkhB,EACAuJ,EACAo9C,KAEA,MAAM,EAAEjxE,GAAMC,YAAe,uBACvBixE,EAAkBvT,mBAAQ,KAC8B,CAC1DwT,KAAM,CACJC,aACEv9C,GAA2C,OAAzBo9C,QAAyB,IAAzBA,KAA2BniD,qBACzC,GACA9uB,EACE,eACA,sFAERqxE,cAAe,QAEjB/mD,MAAO,CACL8mD,aACEv9C,GAA2C,OAAzBo9C,QAAyB,IAAzBA,KAA2BniD,qBACzC9uB,EACE,uBACA,4DAEFA,EAAE,gBAAiB,4DACzBqxE,cAAe,SAEjBC,cAAe,CACbF,aAAcpxE,EACZ,yBACA,8EAEFqxE,cAAe,SAEjBzjB,QAAS,CACPwjB,aAAuC,OAAzBH,QAAyB,IAAzBA,KAA2BniD,qBACrC9uB,EAAE,yBAA0B,mDAC5BA,EAAE,kBAAmB,mDACzBqxE,cAAe,cAKlB,CAACrxE,EAAG6zB,EAAgBo9C,IAEvB,OAAOtT,mBAAQ,IAOE,YAAXv0D,EACK8nE,EAAgBC,KAPMI,MAAgB,IAADC,EAAAC,EAI5C,SAHyB,OAALnnD,QAAK,IAALA,GAA2B,QAAtBknD,EAALlnD,EAAqBI,cAAM,IAAA8mD,GAAkB,QAAlBC,EAA5BD,EAA8BE,wBAAgB,IAAAD,OAAxC,EAANA,EAAgDrwC,MAAM3b,GACvEA,EAAEmS,SAAS,qBAEM,EAIV25C,GACFL,EAAgBI,cAEhBJ,EAAgB9nE,IAExB,CAACkhB,EAAOlhB,EAAQ8nE,GAAiB,EFlCfF,CAAgB5nE,EAAQkhB,EAAOuJ,EAAgBw8C,GAwBpE1oC,qBAAU,KACS4oC,EAAJ,KAAT1qE,IACmB43C,GAAiBD,GAAe,GACtD,CAACC,EAAeD,EAAgB33C,EAAM4H,IAEzCk6B,qBAAU,KACJ0oC,GAAgBxqE,IAASwqE,EAAa7iE,kBAAoBC,IAAU4iE,EAAa5iE,OACnF8iE,GAAkB,EAAK,GACxB,CAACF,EAAcE,EAAmB1qE,EAAM4H,IAW3C,OACE/K,eAACkiC,KAAM,CAACxO,IAAK,EAAG6tB,GAAI,EAAErhD,SAAA,CACpBF,eAAC8B,IAAI,CAACT,MAAM,OAAOqyB,IAAK,EAAExzB,SAAA,CACxBF,eAAC+7B,IAAW,CAAC0Z,UAAWsF,EAAehF,SAAU,EAAE71C,SAAA,CACjDC,cAACk7B,IAAS,CAAAn7B,SAAA,GAAAlD,OAAKM,EAAE,mBAAoB,qBAAoB,OACzD6C,cAACw1C,IAAK,CACJn7B,MAAOrX,EACPkwB,SA9CgBsV,IACxBkO,EAAQlO,EAAEsmC,cAAcz0D,MAAM,EA8CtBo7B,OA3CcjN,IACtB8S,IAA8B9S,EAAEsmC,cAAcz0D,MAPH3J,OAAS,GAOC,EA2C7CgjB,YAAav2B,EAAE,yBAA0B,QACzC,cAAY,4BAEd6C,cAAC21C,IAAgB,CAAA51C,SACd5C,EAAE,mBAAoB,oDAG3B0C,eAAC+7B,IAAW,CAAC0Z,UAAWqF,EAAgB/E,SAAU,EAAE71C,SAAA,CAClDC,cAACk7B,IAAS,CAAAn7B,SAAA,GAAAlD,OAAKM,EAAE,oBAAqB,sBAAqB,OAC3D6C,cAACw1C,IAAK,CACJn7B,MAAOzP,EACPsoB,SAnDiBsV,IACzB,MAAMnuB,EAAQmuB,EAAEsmC,cAAcz0D,MAC9Bs8B,EAASt8B,GACK,KAAVA,GAAcghC,GAAkB,EAAM,EAiDlC5F,OA9CejN,IACvB,MAAMnuB,EAAQmuB,EAAEsmC,cAAcz0D,MACZghC,EAAJ,KAAVhhC,IACoB5F,GAAa4F,GAAO,EA4CpCqZ,YAAav2B,EAAE,0BAA2B,SAC1C,cAAY,6BAEd6C,cAAC21C,IAAgB,CAAA51C,SACd5C,EAAE,oBAAqB,8CAI9B0C,eAAC8B,IAAI,CACHT,MAAM,OACNU,eAA4B,OAAZssE,QAAY,IAAZA,KAAcK,aAAe,gBAAkB,WAAWxuE,SAAA,CAE7D,OAAZmuE,QAAY,IAAZA,KAAcK,aACbvuE,cAAC0+B,IAAgB,CACfx9B,MAAM,cACNqF,OAAQ2nE,EAAaM,cACrB1mD,MAAOomD,EAAaK,aACpB/tE,QAAQ,WAER,KACJR,cAACJ,IAAM,CAAC42C,UAAWA,EAAW1Y,SAAU2vC,EAAgBlsE,QAnDzCwxB,KAMnB46C,EALgB,CACdhjE,iBAAkB3H,EAClB4H,MAAOA,EACPqhB,qBAAsB+E,GAEH,EA6C6DjxB,SAC3EixB,EACG7zB,EAAE,qBAAsB,uBACxBA,EAAE,qBAAsB,8BAGzB,EGnHA4xE,GAAgDzwE,IAQtD,IARuD,SAC5Du2C,EAAQ,MACR3zC,EAAK,aACLyzC,EAAY,OACZq6B,EAAM,aACNC,EAAY,SACZnxC,EAAQ,WACRoxC,GACD5wE,EACC,MAAM,EAAEnB,GAAMC,YAAe,wBACtB+xE,EAASC,GAAcl9C,YAAeyiB,GAU7C,OAAOw6B,IAAYt6B,EACjBh1C,eAACkiC,KAAM,CAAC7gC,MAAK,GAAArE,OAAKqE,EAAQ,GAAE,MAAKnB,SAAA,CAC/BC,cAACJ,IAAM,CACLk+B,SAAUA,EACVv8B,QAASytE,EACTvuE,KAAK,KACLN,SAAQ,GAAAtD,OAAKqE,EAAQ,GAAE,iBAAgBnB,SAEtC5C,EAAE,SAAU,YAEf6C,cAACJ,IAAM,CACLa,KAAK,KACLN,SAAS,mBACTe,MAAM,OACNV,QAAQ,YACRe,QAnBeixB,KACnB48C,OAAW5iE,EAAU,EAkBKzM,SAErB5C,EAAE,SAAU,eAIjB0C,eAAC8B,IAAI,CAAC4xB,IAAK,EAAExzB,SAAA,EACTmvE,GACAlvE,cAACJ,IAAM,CAACY,QAAQ,YAAYC,KAAK,KAAKc,QAAS0tE,EAAalvE,SACzD5C,EAAE,SAAU,YAGjB6C,cAACJ,IAAM,CAACY,QAAQ,YAAYC,KAAK,KAAKc,QAnCvB0oE,KACjBmF,EAAWv6B,EAAS,EAkCwC90C,SACvD5C,EAAE,OAAQ,YAGhB,ECxCUkyE,GAAkC/wE,IAAuB,IAAtB,aAAE8K,GAAc9K,EAC9D,MAAM,EAAEnB,GAAMC,YAAe,uBACvB82B,EAASC,gBAERm7C,EAAgBC,GAAqB1pD,sBACrC4nD,EAAgBC,GAAqB7nD,oBAAkB,IACvDyf,EAAYkqC,GAAiB3pD,oBAAkB,IAC/C4pD,EAAmBC,GAAwB7pD,oBAAkB,IAC7D5E,EAAU0uD,GAAe9pD,mBAAiB,KAC1C+pD,EAAiBC,GAAsBhqD,oBAAkB,IACzDiqD,EAAWC,GAAgBlqD,mBAAiB,KAC5CmqD,EAAkBC,GAAuBpqD,oBAAkB,IAC3DqqD,EAAgBC,GAAqBtqD,mBAAiB,KACtDuqD,EAAuBC,GAA4BxqD,oBAAkB,GAEtE9Q,EAAesF,GAAkBA,EAAM3J,OAAS,GAE9CohB,OAAQw+C,EAAY,OAAE/pE,EAAM,MAAEkhB,EAAK,QAAEq4C,EAAO,UAAEyQ,EAAS,MAAEh/D,GClCjEhT,KAEA,MAAMktB,EAAcC,cACpB,OAAOC,aAAYkF,GAAS,CAC1B2/C,UAAWA,KACT/kD,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiB,2BAC1D8c,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiC,YAC1D8b,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAekB,cAAe,KAExErQ,GACH,EDwByEkyE,GAErEC,EExC2BC,EACjCpqE,EACAkhB,EACAmpD,KAEA,MAAM,EAAEzzE,GAAMC,YAAe,uBAEvByzE,EAAqB/V,mBAAQ,KAC2B,CAC1DwT,KAAM,CACJC,aAAcpxE,EAAE,oBAAqB,IACrCqxE,cAAe,QAEjB/mD,MAAO,CACL8mD,aAAcpxE,EACZ,qBACA,oDAEFqxE,cAAe,SAEjBzjB,QAAS,CACPwjB,aAAcpxE,EACZ,+BACA,2CAEFqxE,cAAe,cAKlB,CAACrxE,KAEG+wE,EAAc4C,GAAmBjrD,mBAAuBgrD,EAAmBvC,MAmDlF,OAjDAxpC,qBAAU,KACR,MAAMisC,EAAsBA,CAACC,EAAkBC,KAC7C,OAAQD,GACN,IAAK,WACH,OAAO7zE,EAAE,kCAAmC8zE,GAC9C,IAAK,qBACH,OAAO9zE,EAAE,wCAAyC8zE,GACpD,QACE,OAAOA,EACX,EAGF,GAAe,YAAX1qE,EAAsB,CACxB,MAAM2qE,EAAgBzpD,EAChB4L,EAAUw9C,EAAmBtqE,GACnC,GAAiB,OAAb2qE,QAAa,IAAbA,KAAerpD,QAAqB,UAAXthB,EAAoB,CAC/C,MAAMshB,EAAmB,GACzB,IAAK,MAAM+I,KAAOsgD,EAAcrpD,OAAQ,CACtC,MAAMopD,EAASF,EAAoBngD,EAAKsgD,EAAcrpD,OAAO+I,GAAK,IAClE/I,EAAOghB,KAAKooC,EACd,CACA59C,EAAQ89C,cAAgBtpD,CAC1B,CAEe,YAAXthB,GAA+B,OAAPqqE,QAAO,IAAPA,KAAS3vD,WACnCoS,EAAQk7C,aAAY,GAAA1xE,OAAMM,EAAE,OAAQ,QAAO,KAAAN,OAAI+zE,EAAQ3vD,SAAQ,KAAApkB,OAAIM,EACjE,qBACA,sBACD,MAID+wE,EAAaM,gBAAkBn7C,EAAQm7C,eACvCN,EAAaK,eAAiBl7C,EAAQk7C,cAEtCuC,EAAgBz9C,EAEpB,IACC,CACD9sB,EACAkhB,EACAopD,EACAC,EACA3zE,EACAyzE,EACA1C,EAAaM,cACbN,EAAaK,eAGRL,CAAY,EF3CSyC,CAAoBpqE,EAAQkhB,EAAO6nD,GAE/DxqC,qBAAU,KACQ,OAAZ17B,QAAY,IAAZA,KAAcrG,KAChBysE,GAAc,GACV/6D,GAAarL,EAAawB,QAC5BmlE,EAAa,IACbL,GAAqB,GACrBO,GAAoB,IAEpBP,GAAqB,GAEzB,GACC,CAACtmE,IAEJ07B,qBAAU,KACR,MAAMssC,GAA+Br8D,EAAYkM,KAAclM,EAAYm7D,GAEzExC,EADE+B,EACgB2B,EAEAA,IAAgC38D,GAAaq7D,GACjE,GACC,CAAC7uD,EAAUivD,EAAgBT,EAAmBK,IAEjD,MAAMuB,EAAYpwD,EAAW6uD,EAAYI,IAAmB,GAE5DprC,qBAAU,KACJusC,IACFxB,GAAmB,GACnBQ,GAAyB,GACzBJ,GAAoB,GACtB,GACC,CAACoB,IAEJvsC,qBAAU,KAAO,IAADwsC,EACd,MAAMC,EACJvxE,cAAA0yB,WAAA,CAAA3yB,SACoC,QADpCuxE,EACGZ,EAAoBS,qBAAa,IAAAG,OAAA,EAAjCA,EAAmCnwE,KAAI,CAACqwE,EAAQC,IAC/CzxE,cAAA,MAAAD,SAAeyxE,GAANC,QAMZ3R,IAAWyQ,GAC2B,YAAtCG,EAAoBlC,eACmB,UAAtCkC,EAAoBlC,gBAEtBt6C,EAAO,CACLnxB,GAAI,qBACJ+kB,MAAO4oD,EAAoBnC,aAC3BhoE,OAAQmqE,EAAoBlC,cAC5BprE,YAAamuE,EACbp8C,SAAUx4B,IAEZ4U,IACF,GACC,CACDm/D,EACApB,EACAxP,EACAyQ,EACApzE,EACAmzE,EACAp8C,EACA3iB,IAgDF,OACEvR,cAAC07B,IAAI,CAAC1H,GAAI,EAAG3C,EAAG,EAAEtxB,SAChBF,eAACo7B,IAAM,CAAC/5B,MAAM,OAAOghC,QAAS,EAAGrgC,WAAW,QAAO9B,SAAA,CACjDF,eAAC8B,IAAI,CAACT,MAAM,OAAOqyB,IAAK,EAAExzB,SAAA,CACxBF,eAAC+7B,IAAW,CACV0J,WAAYA,EACZgQ,UAAWs6B,IAAoBtqC,EAC/BsQ,SAAU,EAAE71C,SAAA,CAEZC,cAACk7B,IAAS,CAACqa,QAAQ,aAAYx1C,SAAA,GAAAlD,OAAKM,EAAE,YAAa,aAAY,OAC/D6C,cAACw1C,IAAK,CACJzyC,GAAG,aACH+6B,SAAUwH,EACVjrB,MAAO4G,EACPiS,SA3DkBsV,IAC5BmnC,EAAYnnC,EAAEsmC,cAAcz0D,MAAM,EA2DxBo7B,OAxDgBjN,IACrB6oC,GAAWxB,GAAoB96D,EAAYyzB,EAAEsmC,cAAcz0D,OAAO,EAwD7DqZ,YAAav2B,EAAE,wBAAyB,QACxC,cAAY,oBAEd6C,cAAC21C,IAAgB,CAAA51C,SACd5C,EAAE,wBAAyB,2CAGhC0C,eAAC+7B,IAAW,CACV0J,WAAYA,EACZgQ,UAAW86B,IAA0B9qC,EACrCsQ,SAAU,EAAE71C,SAAA,CAEZC,cAACk7B,IAAS,CAACqa,QAAQ,aAAYx1C,SAAA,GAAAlD,OACzBM,EAAE,sBAAuB,uBAAsB,OAErD6C,cAACw1C,IAAK,CACJzyC,GAAG,aACH+6B,SAAUwH,EACVjrB,MAAO61D,EACPh9C,SAxEwBsV,IAClC2nC,EAAkB3nC,EAAEsmC,cAAcz0D,MAAM,EAwE9Bo7B,OArEsBjN,IAC3B6oC,GAAWhB,GAA0Bt7D,EAAYyzB,EAAEsmC,cAAcz0D,OAAO,EAqEnEqZ,YAAav2B,EAAE,8BAA+B,oBAC9C,cAAY,8BAEd6C,cAAC21C,IAAgB,CAAA51C,SACd5C,EACC,kCACA,qDAIN0C,eAAC+7B,IAAW,CACV0Z,UAAW06B,IAAqBP,EAChCnqC,WAAYmqC,EACZ75B,SAAU,EAAE71C,SAAA,CAEZC,cAACk7B,IAAS,CAACqa,QAAQ,cAAax1C,SAAA,GAAAlD,OAAKM,EAAE,aAAc,cAAa,OAClE6C,cAACw1C,IAAK,CACJzyC,GAAG,cACH+6B,SAAU2xC,EACVp1D,MAAOy1D,EACP58C,SAtFmBsV,IAC7BunC,EAAavnC,EAAEsmC,cAAcz0D,MAAM,EAsFzBo7B,OAnFiBjN,IACtB6oC,GAAWpB,GAAqBx7D,GAAa+zB,EAAEsmC,cAAcz0D,OAAO,EAmF/DqZ,YAAav2B,EAAE,yBAA0B,iBACzC,cAAY,qBAEd6C,cAAC21C,IAAgB,CAAA51C,SACd5C,EAAE,yBAA0B,8CAInC6C,cAACoC,IAAG,CAAC4hC,KAAM,EAAGwU,GAAI,EAAEz4C,SAClBC,cAACJ,IAAM,CACLk+B,SAAU2vC,EACVlsE,QArFWwxB,KACnB,GAAI3pB,EAAc,CAChB,MAAMmE,EAA0B,CAC9ByjB,eAAgB5nB,EAAarG,GAC7Bke,SAAUA,EACV6uD,UAAWA,EACX5uD,mBAAoBgvD,GAEtBX,EAAkBhiE,GAClB+iE,EAAa/iE,EAAS,CACpBqe,UAAWA,KAff+jD,EAAY,IACZQ,EAAkB,SAClBJ,EAAa,MAeb,GA0EQ,cAAY,mBAAkBhwE,SAE7B5C,EAAE,WAAY,oBAIhB,EGpNEu0E,GAAwCpzE,IAAuB,IAAtB,aAAE8K,GAAc9K,EACpE,MAAM,EAAEnB,GAAMC,YAAe,uBACvBu0E,EAAUx0E,EACd,oBACA,wDAEI4B,EAAWC,cAEX6oD,EChBuB+pB,KAC7B,MAAM,EAAEz0E,GAAMC,YAAe,uBAGvBy0E,EAAwBx3D,GACrBA,EAAM3J,OAAS,EAGlBohE,EAAyBz3D,GACtB5F,GAAa4F,GAGtB,OAAOygD,mBACL,IAAM,CACJ,CACE/E,SAAU,WACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,YAAa,aAC7B64D,KAAO9kC,GACLlxB,cAACy0C,GAAiB,CAChBE,aAAch0B,GACdk0B,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAASr1C,SAC7B2zB,WAAYh0B,GACZliB,MAAOvB,EAAE,YAAa,aACtBu2B,YAAav2B,EAAE,wBAAyB,QACxC23C,aAAc33C,EAAE,wBAAyB,sCACzCuG,KAAK,OACLo6B,UAAU,EACViX,UAAW88B,EACX78B,WAAW,qBAGf9zC,MAAO,KAET,CACE60D,SAAU,iBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,kBAAmB,oBACnC64D,KAAO9kC,GACLlxB,cAACy0C,GAAiB,CAChBE,aAAch0B,GACdk0B,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAAS4Z,eAC7Bt7B,WAAY9zB,GACZpiB,MAAOvB,EAAE,kBAAmB,oBAC5Bu2B,YAAav2B,EAAE,8BAA+B,oBAC9C23C,aAAc33C,EACZ,kCACA,gDAEFuG,KAAK,OACLo6B,UAAU,EACViX,UAAW88B,EACX78B,WAAW,qBAGf9zC,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,aAAc,cAC9B64D,KAAO9kC,GACLlxB,cAACy0C,GAAiB,CAChBE,aAAch0B,GACdk0B,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAAS1rD,MAC7BgqC,WAAY/zB,GACZniB,MAAOvB,EAAE,aAAc,cACvBu2B,YAAav2B,EAAE,yBAA0B,iBACzC23C,aAAc33C,EAAE,yBAA0B,sCAC1CuG,KAAK,QACLo6B,SAAU8zC,EACV78B,UAAW+8B,EACX98B,WAAW,sBAGf9zC,MAAO,QAET,CACE60D,SAAU,YACVC,KAAO9kC,GACLlxB,cAAC+xE,GAAkB,IAAK7gD,EAAOhwB,MAAO,IAAK8wE,eAAgBJ,IAE7Dvb,OAAQA,IAAMr2D,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,eAAgB,WACjD+D,MApFQ,IAqFRk1D,eAAe,KAGnB,CAACwb,EAAcz0E,GAChB,ED3Ee80E,GAA6B,OAAZ7oE,QAAY,IAAZA,MAAcwB,SAEvCof,KAAMkoD,GAAcnhD,GAC1BhQ,GACAR,GACY,OAAZnX,QAAY,IAAZA,OAAY,EAAZA,EAAcrG,GACd,CACE4F,UAAWS,EACX+oE,gBAAgB,IAIpB,OACEtyE,eAACkiC,KAAM,CAACqf,GAAI,EAAG5I,GAAI,EAAG32C,WAAW,UAAS9B,SAAA,EACtCqJ,GACApJ,cAAC0+B,IAAgB,CAACx9B,MAAM,OAAOqF,OAAQ,UAAWuhB,MAAO6pD,EAASnxE,QAAQ,WAE5ER,cAACqvE,GAAO,CAACjmE,aAAcA,IACvBpJ,cAACoC,IAAG,CAACuiD,aAAc,EAAGzjD,MAAOnC,EAAW,OAAS,MAAMgB,SACrDC,cAACwlD,GAAU,CACTlgB,YAAal8B,EACbq8C,YAAa/kC,GACb4sB,gBAAiBnwC,EAAE,qBAAsB,2BACzCuoD,aAAsB,OAATwsB,QAAS,IAATA,OAAS,EAATA,EAAWrrD,MAAM6F,MAAMhc,SAAU,EAC9C8b,YAAqB,OAAT0lD,QAAS,IAATA,OAAS,EAATA,EAAWpoD,eAAe0C,aAAc,MAGxDxsB,cAAC4nD,GAAS,CACR/gC,OAAgB,OAATqrD,QAAS,IAATA,OAAS,EAATA,EAAWrrD,MAAM6F,QAAS,GACjCo7B,YAAqB,OAAToqB,QAAS,IAATA,OAAS,EAATA,EAAWpoD,sBAAkBtd,EACzC6Y,gBAAiB9E,GACjB+E,cAAehF,GACfunC,QAASA,EACTE,kBAAmBtnC,GACnBunC,sBAAuBxnC,GACvBm0B,aAAch0B,OAET,EEjDAoxD,GAAwDzzE,IAI9D,IAJ+D,cACpE0zE,EAAa,IACb5mB,EAAG,MACHlqD,GACD5C,EACC,MAAM,EAAEnB,GAAMC,YAAe,uBACvB82B,EAASC,eACTi+C,EAAgBhmD,YAAepL,IAC/BinC,EAAoBzzB,YAAoB7T,IACxC0xD,ECjByBL,KAC/B,MAAOM,EAAWC,GAAgB1sD,oBAAkB,GAE9C7iB,EAAOopB,YAAexL,IACtBhW,EAAQwhB,YAAevL,IACvB2xD,EAAiBpmD,YAAetL,IAEhC2xD,EAAiBp4D,GACdA,EAAM3J,OAAS,EAaxB,OAVAo0B,qBAAU,KAENytC,EADEP,EAEAS,EAAczvE,IAASyvE,EAAcD,IAAmB/9D,GAAa7J,GAG1D6nE,EAAczvE,IAASyvE,EAAcD,GACpD,GACC,CAACxvE,EAAM4H,EAAO2nE,EAAcP,EAAeQ,KAEtCF,CAAS,EDJKI,CAAiBV,IAE/BlgD,OAAQhB,GE3BW6hD,MAK3B,MAAMlnD,EAAcC,cACpB,OAAOC,aAAYmF,GAAY,CAC7B0/C,UAAWA,KACT/kD,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiB,2BAC1D8c,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeiC,YAC1D8b,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAekB,cAAe,GAE3E,EFe6B+jE,IACvBC,OAAQ7vE,GAAOqoD,EAAIkL,SA2B3B,OACEt2D,cAAC+uE,GAAc,CACb7tE,MAAOA,EACP2zC,SAAUuW,EAAIvhB,MACd8K,aAAch0B,GACdmd,SAAUu0C,EACVrD,OA/BiB6D,KACnB/hD,EACE,IAAKshD,EAAervE,MACpB,CACE6oB,UAAWA,KACTsI,EAAO,CACLnxB,GAAI,yBACJ+kB,MAAO3qB,EAAE,sBAAuB,yBAChCg4B,SAAUx4B,IAEZsrD,GAAmB,EAErB76B,QAASA,KACP8G,EAAO,CACLnxB,GAAI,sBACJ+kB,MAAO3qB,EAAE,mBAAoB,oDAC7Bg4B,SAAUx4B,EACV4J,OAAQ,UAEV0hD,GAAmB,GAGxB,EAUCinB,YAAU,GACV,E,cGvCC,MAAM4D,GAAsDx0E,IAI5D,IAJ6D,OAClE6+B,EAAM,aACN41C,EAAY,QACZ31C,GACD9+B,EACC,MAAM,EAAEnB,GAAMC,YAAe,uBACrB00B,OAAQ9K,GAAoBwE,KAC9B0I,EAASC,eAET3B,EAAeA,KACnB4K,GAAS,EAiBL41C,EAAgBA,KAChBD,GACF/rD,EAA4B,OAAZ+rD,QAAY,IAAZA,OAAY,EAAZA,EAAchqE,YAAa,CACzC6iB,UAAWA,KACTwR,IACAlJ,EAAO,CACLnxB,GAAI,6BACJ+kB,MAAO3qB,EACL,8BACA,kDACA,CACEgL,cAA2B,OAAZ4qE,QAAY,IAAZA,OAAY,EAAZA,EAAc5qE,gBAGjCgtB,SAAUx4B,EACV4J,OAAQ,WACR,EAEJ6mB,QAASA,KA/BbgQ,IACAlJ,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAO3qB,EACL,6BACA,4DACA,CAAEgL,cAA2B,OAAZ4qE,QAAY,IAAZA,OAAY,EAAZA,EAAc5qE,gBAEjCgtB,SAAUx4B,EACV4J,OAAQ,SAuBS,GAEf,EAGN,OACE1G,eAACk/B,KAAK,CAAC5B,OAAQA,EAAQC,QAASA,IAAM5K,IAAezyB,SAAA,CACnDC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACXF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,oBAAqB,eAAe4C,SAAA,CAC7DF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACizE,IAAmB,CAAC3zE,MAAOoB,IAAQgrC,IAAI,OACxC1rC,cAAA,QAAAD,SAAO5C,EAAE,qBAAsB,oBAEjC6C,cAACm+B,KAAgB,OAEnBn+B,cAACo+B,KAAS,CAACC,SAAS,UAASt+B,SAC3BC,cAAC4yB,IAAY,CAAA7yB,SACVgzE,GACC/yE,cAAA,KAAG+C,GAAG,mBAAkBhD,SACtBC,cAACkzE,KAAK,CACJC,QAAQ,wBACRC,SAAS,wSACTl9D,OAAQ,CACN/N,cAAc,GAADtL,OAAiB,OAAZk2E,QAAY,IAAZA,OAAY,EAAZA,EAAc5qE,eAChCyC,MAAM,GAAD/N,OAAiB,OAAZk2E,QAAY,IAAZA,OAAY,EAAZA,EAAcnoE,QAE1ByoE,WAAY,CAAEC,KAAMtzE,cAAA,sBAM9BH,eAAC++B,KAAW,CAACh9B,eAAe,MAAK7B,SAAA,CAC/BC,cAACszB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,IACrCjC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAASA,IAAMixB,IAAezyB,SACtD5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAACY,QAAQ,SAASe,QAASA,IAAMyxE,IAAgBjzE,SACrD5C,EAAE,sBAAuB,qBAI1B,EC5FCo2E,GAAyDriD,IACpE,MAAMmhD,ECX6BmB,MACnC,MAAOlB,EAAWC,GAAgB1sD,oBAAkB,IAC5CmE,KAAMkvB,GAAmBvsB,KAC3B3pB,EAAOopB,YAAe9F,IACtB1b,EAAQwhB,YAAe7F,IACvBjM,EAAe8R,YAAe5F,IAC9BrM,EAAUiS,YAAe3F,IAQ/B,OANAqe,qBAAU,KACRytC,EACEx9D,GAAY/R,IAASk5C,aAAU5hC,IAAiBA,EAAe,GAAKH,EAAQzJ,OAAS,EACtF,GACA,CAAC1N,EAAM4H,EAAO0P,EAAcH,EAASo4D,EAAcr5B,KAE9Co5B,CAAS,EDHKkB,IAEhB,EAAEr2E,GAAMC,YAAe,uBACvB82B,EAASC,eACTi2B,EAAe99B,YAAkB3T,IACjC86D,EAAkBnnD,YAAkB1T,IACpC86D,EAAoBtnD,YAAezF,IACnCshC,EAAoBzzB,YAAoBnO,KAEtCyL,OAAQsoB,GxW7BgBu5B,MAKhC,MAAMloD,EAAcC,cACpB,OAAOC,aAAYvE,GAAiB,CAClCwE,UAAWA,KACTH,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAe+B,eAC1Dgc,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAegC,sBAAuB,GAEnF,EwWkB6BikE,IAEvBrd,SAAU14B,EAAS,MAAEiM,GAAU3Y,EAAMk6B,KACrCriD,YAAahG,GAAOmuB,EAAMk6B,IAAIkL,SAgCtC,OACEt2D,cAAC+uE,GAAc,CACb7tE,MAAOgwB,EAAMhwB,MACbyzC,aAActuB,GACdwuB,SAAUhL,EACV/L,SAAUu0C,EACVrD,OA/BiB6D,KACnBz4B,EACE,IAAKs5B,EAAmB3wE,MACxB,CACE6oB,UAAWA,KACTsI,EAAO,CACLnxB,GAAI,qBACJ+kB,MAAO3qB,EAAE,sBAAuB,yBAChCg4B,SAAUx4B,IAEZsrD,GAAmB,EAErB76B,QAASA,KACP8G,EAAO,CACLnxB,GAAI,0BACJ+kB,MAAO3qB,EAAE,qBAAsB,oDAC/Bg4B,SAAUx4B,EACV4J,OAAQ,UAEV0hD,GAAmB,GAGxB,EAUCgnB,aArCiBA,KACnBwE,EAAgB71C,GAChBwsB,GAAa,EAAK,GAoChB,EErDOwpB,GAAuCt1E,IAAuB,IAAtB,aAAE8K,GAAc9K,EACnE,MAAM,EAAEnB,GAAMC,YAAe,uBACvB2B,EAAWC,eACVmrD,EAAWC,GAAgBl4B,YAAevZ,IAC3Co6D,EAAe3mD,YAAexT,KAE9B,YAAE8sC,EAAW,WAAEl5B,EAAU,YAAEkuB,EAAW,MAAE4Q,EAAK,eAAExhC,GClBrD1gB,KACiC,IAADyqE,EAAAC,EAChC,MAAQ9pD,KAAM+pD,GAAoB5nD,GAAgC,OAAZ/iB,QAAY,IAAZA,OAAY,EAAZA,EAAcuB,mBAC5Dqf,KAAMgqD,GAAahoD,GAAkB,CAC3CC,qBAAkC,OAAZ7iB,QAAY,IAAZA,OAAY,EAAZA,EAAcrG,KAGhC23C,EAAsB,OAARs5B,QAAQ,IAARA,OAAQ,EAARA,EAAUC,cAE9B,OAAKv5B,EAOE,CACL4Q,MAAsB,OAAfyoB,QAAe,IAAfA,OAAe,EAAfA,EAAiBtnD,WAAWC,MACnCguB,YAAaA,EACbgL,YAAqD,QAA1CmuB,EAAiB,OAAfE,QAAe,IAAfA,OAAe,EAAfA,EAAiBtnD,WAAWC,MAAMhc,cAAM,IAAAmjE,IAAI,EACzDrnD,WAAsD,QAA5CsnD,EAAiB,OAAfC,QAAe,IAAfA,OAAe,EAAfA,EAAiBjqD,eAAe0C,kBAAU,IAAAsnD,IAAI,EAC1DhqD,eAA+B,OAAfiqD,QAAe,IAAfA,OAAe,EAAfA,EAAiBjqD,gBAX1B,CACL47B,YAAa,EACbl5B,WAAY,EAUf,EDHC0nD,CAAoB9qE,GAMhBy+C,EEnBNnN,KAEA,MAAM,EAAEv9C,GAAMC,YAAe,uBAW7B,OAAO09D,mBACL,IAAM,CACJ,CACE/E,SAAU,gBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,OAAQ,QACxB64D,KAAO9kC,GACLlxB,cAACy0C,GAAiB,CAChBE,aAActuB,GACdwuB,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAASnuD,cAC7BysC,WAAYtuB,GACZ5nB,MAAOvB,EAAE,mBAAoB,QAC7Bu2B,YAAav2B,EAAE,yBAA0B,aACzCuG,KAAK,SAGTxC,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,QAAS,SACzB64D,KAAO9kC,GAAyClxB,cAAA0yB,WAAA,CAAA3yB,SAAGmxB,EAAMk6B,IAAIkL,SAAS1rD,QACtE1J,MAAO,KAET,CACE60D,SAAU,iBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,aAAc,cAC9B64D,KAAO9kC,GACLlxB,cAAC4kD,GAAoB,CACnBjQ,aAActuB,GACd0yB,gBAAiBvyB,GACjBquB,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAAS6d,eAC7Bz1E,MAAOvB,EAAE,yBAA0B,gBAGvC+D,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,QAAS,WACzB64D,KAAO9kC,IACLlxB,qBAACynD,GAAc,CACb9S,aAActuB,GACdqhC,UAAWjhC,GACXloB,QAAoB,OAAXm8C,QAAW,IAAXA,IAAe,GACxB7F,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,UA5DyB7tB,EA4DgB,OAALqK,QAAK,IAALA,OAAK,EAALA,EAAOk6B,IAAIkL,SAASzvC,MA3DzDA,EAAM1lB,KAAKiZ,IACT,CACLC,MAAOD,EAAKw4D,OACZl0E,MAAO0b,EAAK6G,cAyDRviB,MAAOvB,EAAE,oBAAqB,aA7DL0pB,KA+D5B,EACD3lB,MAAO,KAET,CACE60D,SAAU,eACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,gBAAiB,cACjC64D,KAAO9kC,GACLlxB,cAACktE,GAAqB,CACpBv4B,aAActuB,GACd8mD,kBAAmBzmD,GACnB0mD,qBAAsBl8C,EAAMk6B,IAAIkL,SAASxvC,aACzC+tB,SAAU3jB,EAAMk6B,IAAIvhB,MACpB6K,SAAUxjB,EAAMk6B,IAAIkL,SAASxvC,aAAe,MAAQ,KACpDpoB,MAAO,KAGXwC,MAAO,KAET,CACE60D,SAAU,KACVK,eAAe,EACfJ,KAAO9kC,GACLlxB,cAACuzE,GAAkB,IACbriD,EACJhwB,MAAO,IACPyzC,aAActuB,KAGlBgwC,OAAQA,IAAMr2D,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,gBAAiB,YAClD+D,MAAO,OAGX,CAACw5C,EAAav9C,GACf,EFlFei3E,CAAoB15B,GAEpC,OACE76C,eAACkiC,KAAM,CAACqf,GAAI,EAAG5I,GAAI,EAAG32C,WAAW,UAAS9B,SAAA,GAC3B,OAAX26C,QAAW,IAAXA,KAAahqC,SACb1Q,cAAC0+B,IAAgB,CACf1L,GAAI,EACJzsB,OAAO,UACPuhB,MAAO3qB,EACL,sBACA,8EAEFqD,QAAQ,WAGZR,cAAC88C,GAAoB,CACnBhf,WAAsB,OAAX4c,QAAW,IAAXA,KAAahqC,QACxBq/B,WAAY5yC,EAAE,kBAAmB,YACjCu9C,YAAaA,EACbb,SAAS,qBAEX75C,cAACoC,IAAG,CAACuiD,aAAc,EAAGzjD,MAAOnC,EAAW,OAAS,MAAMgB,SACrDC,cAACwlD,GAAU,CACToY,OAAQ,EACRnY,YAAattC,GACbm1B,gBAAiBnwC,EAAE,qBAAsB,wBACzCuoD,YAAaA,EACbl5B,WAAYA,MAGhBxsB,cAACqrD,GAAS,CACRvhC,eAAgBA,EAChBwhC,MAAOA,EACPzD,QAASA,EACTxiC,gBAAiBnN,GACjBoN,cAAerN,GACf08B,aAActuB,MAEdilC,GACAtrD,cAAC2B,IAAI,CAAC45B,GAAI,EAAEx7B,SACVC,cAAC0+B,IAAgB,CACf1L,GAAI,EACJzsB,OAAO,OACPuhB,MAAO3qB,EAAE,2BAA4B,WACrCqD,QAAQ,aAKZR,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAC8yE,GAAiB,CAChB31C,OAAQgtB,EACR/sB,QAxDUlI,KAClBk1B,GAAa,EAAM,EAwDX2oB,aAAcA,QAIb,EGtEAsB,GAAwD/1E,IAAuB,IAAtB,aAAE8K,GAAc9K,EAOpF,MAAM,EAAEnB,GAAMC,YAAe,uBACvB6W,EAAWwwB,cACX6vC,EAAkBloD,YAAehb,IAavC,OACEvR,eAACulC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SAAA,CACvCC,cAACwkD,GAAW,CACVze,QACc,OAAZ38B,QAAY,IAAZA,KAAcuB,iBAAgB,GAAA9N,OACvBM,EAAE,SAAU,UAAS,KAAAN,OAAIuM,EAAauB,kBACzCxN,EAAE,mBAAoB,wCAG9B0C,eAACszD,IAAS,CAACC,eAAa,EAACC,aApBLkhB,MACtB,IAAIlhB,EAAe,EAOnB,OANIp/C,EAASuwB,SAASgwC,SAAS,WAC7BnhB,EAAe,GAEbp/C,EAASuwB,SAASgwC,SAAS,WAC7BnhB,EAAe,GAEV,CAACA,EAAa,EAYoBkhB,GAAkBx0E,SAAA,CACvDF,eAACyzD,IAAa,CAACt/B,GAAI,EAAEj0B,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAAC4iC,KAAI3G,IAAG,CAAC+H,KAAK,IAAIrI,UAAU,OAAM57B,SAC/B5C,EAAE,uBAAwB,0BAE7B6C,cAACwzD,IAAmB,SAGxBxzD,cAACyzD,IAAc,CAAA1zD,SACbC,cAACqtE,GAAwB,CAACjkE,aAAcA,SAG5CvJ,eAACyzD,IAAa,CAACt/B,GAAI,EAAEj0B,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAAC4iC,KAAI3G,IAAG,CAAC+H,KAAK,IAAIrI,UAAU,OAAM57B,SAC/B5C,EAAE,QAAS,WAEd6C,cAACwzD,IAAmB,SAGxBxzD,cAACyzD,IAAc,CAAA1zD,SACbC,cAAC0xE,GAAU,CAACtoE,aAA0B,OAAZA,QAAY,IAAZA,IAAgBkrE,SAG9Cz0E,eAACyzD,IAAa,CAACt/B,GAAI,EAAEj0B,SAAA,CACnBC,cAAA,MAAAD,SACEF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAAC4iC,KAAI3G,IAAG,CAAC+H,KAAK,IAAIrI,UAAU,OAAM57B,SAC/B5C,EAAE,QAAS,WAEd6C,cAACwzD,IAAmB,SAGxBxzD,cAACyzD,IAAc,CAAA1zD,SACbC,cAAC4zE,GAAU,CAACxqE,aAA0B,OAAZA,QAAY,IAAZA,IAAgBkrE,cAItC,EC5FHG,GAA+BA,KAC1C,MAAMC,EAAarjE,KAMnB,OAJAyzB,qBAAU,KACR4vC,GAAY,GACX,CAACA,IAEG10E,cAACq0E,GAAkB,GAAG,ECAlBM,GAA6BA,KACxC,MAAM,GAAE5xE,GAAO8uB,cACT+iD,EAAoBtoD,YAAkBpb,KACpC8Y,KAAM5gB,GCDsBrG,KACpC,MAAM8xE,EAAkBvoD,YAAkBnb,IACpC5D,EAAwC,CAAExK,MAChD,OAAOqN,aACL,CAAC1C,GAAemB,sBAAuBtB,IACvC,IAAMsB,GAAsBtB,IAC5B,IACKyC,GACH4b,UAAY5B,IACV6qD,EAAgB7qD,EAAK,GAG1B,EDX8B8qD,GAA0B,OAAF/xE,QAAE,IAAFA,IAAM,IACvDgyE,EAAoB1jE,KACpB2jE,EAA0BxgD,YAAoBnc,IAQpD,OANAysB,qBAAU,KACRiwC,IACAC,IACAJ,IAAsB,OAAF7xE,QAAE,IAAFA,IAAM,GAAG,GAC5B,CAAC6xE,EAAmB7xE,EAAIgyE,EAAmBC,IAEvCh1E,cAAA0yB,WAAA,CAAA3yB,SAAGqJ,GAAgBpJ,cAACq0E,GAAkB,CAACjrE,aAAcA,KAAoB,EEhBrE6rE,GAAiBA,KAC5B,MAAM,EAAE93E,GAAMC,YAAe,QACvB2B,EAAWC,eACX,SAAEqgC,GAAaC,eAErB,OACEt/B,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACuC,IAAG,CAAC+4B,QAAQ,OAAOl5B,QAAS,EAAElC,SAAA,CAC7BC,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPnD,YAAajG,EACX,kBACA,yFAGJ6C,cAACJ,IAAM,CACL2B,QAAS+lB,gBACD+X,EAAS+C,cAAc,CAC3BC,OAAQ,CAACvlC,6FACT,EAEJ8qC,YAAY,SACZtnC,UAAWN,cAACk1E,IAAiB,IAC7BpzE,EAAG/C,EAAW,OAAS,UAAUgB,SAEhC5C,EAAE,SAAU,gBAGP,E,yBC/BhB,MAEag4E,GAAoBA,KAC/B,MAAM,KAAE1/C,GAAS5D,cACXujD,EAAY7wC,iBAAuB,MA+BzC,OA7BAO,qBAAU,KACR,MAAMlM,EAAc,OAAJnD,QAAI,IAAJA,OAAI,EAAJA,EAAM3gB,MACpB,uEAEIuT,EAAMuQ,EAAO,GAAA/7B,OACZw4E,mBAAmBz8C,EAAQ,IAAG,QAAA/7B,OAAO+7B,EAAQ,GAAE,QAAA/7B,OAAO+7B,EAAQ,GAAE,QAAA/7B,OACjE+7B,EAAQ,GAAE,QAAA/7B,OACL+7B,EAAQ,GAAE,SAAA/7B,OAAQ+7B,EAAQ,IACjCnD,EAEJ6/C,KACE,CACE7/C,KAAM,gBACN8/C,WAAYltD,EACZmtD,mBAAmB,EACnBC,iBAAkB,CAChB,UACA,oBACA,mBACA,2BAEFC,WA3BoB54E,IA6BtBs4E,EAAUrwC,SACV10B,MAAMgvB,IACNA,EAASs2C,GAAGC,gBAAgB,uBAAuB,GACnD,GACD,CAACngD,IAGFz1B,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCC,cAACoC,IAAG,CACF8iC,IAAKkwC,EACL3yE,SAAS,WACTvB,MAAM,QACN9B,OAAQ,CACNk7B,KAAM,qBACNC,GAAI,qBACJ0C,GAAI,sBAENb,IAAK,CAAE9B,KAAM,OAAQC,GAAI,OAAQ0C,GAAI,QACrC6M,KAAM,KAEE,EC5CH+rC,GACXC,IAEA,MAAOC,EAAeC,GAAqBnwD,oBAAS,IAC9C,EAAE1oB,GAAMC,YAAe,mBACvB82B,EAASC,eACT9F,EAAmBtwB,IAEzB+mC,qBAAU,KACJgxC,GAAgBC,GAClBC,GAAmBD,EACrB,GACC,CAACA,EAAeD,IAEnB,MAAMG,EAAc3uD,UAClB0uD,GAAmBD,GACnB,MAAMvsE,QCnBR+D,EDmBuD,CACnDxK,GAAImzE,EACJC,UAAW,gCCnBfhvD,GAAO,qBAEL5Z,IAJFA,MDuBE2mB,EAAO,CACLnxB,GAAI,eACJ+kB,MAAOte,EAASof,MAChB,EAGJ,MAAO,CACL,CACEmtC,SAAU,KACVC,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,aAAc,cAC9B+D,MAAO,IAET,CACE60D,SAAU,YACVC,KAAOC,GAAiCA,EAAU57C,MAClDg8C,OAAQA,IAAMl5D,EAAE,aAAc,cAC9Bi5D,eAAe,EACfl1D,MAAO,KAET,CACE60D,SAAU,cACVC,KAAOC,GAAsD,MAApBA,EAAU57C,MAAgB,MAAQ,SAC3Eg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjCi5D,eAAe,EACfl1D,MAAO,IAET,CACE60D,SAAU,gBACVC,KAAOC,GACLA,EAAU57C,MAAQ,EACM,IAApB47C,EAAU57C,MACR,aACA47C,EAAU57C,MAAQ,aACpB,OACNg8C,OAAQA,IAAMl5D,EAAE,qBAAsB,sBACtCi5D,eAAe,EACfl1D,MAAO,KAET,CACE60D,SAAU,iBACVC,KAAOC,GACLp2D,eAACo7B,IAAM,CAAAl7B,SAAA,CACLC,cAACoC,IAAG,CACF9C,MAA2B,cAApB22D,EAAU57C,MAAwB3Z,IAAQ+oC,MAAM,KAAO/oC,IAAQgrC,IAAI,KAC1EwqB,YAAa,EACbh2D,SAAU,GACVoB,WAAY,GAAGvB,SAEM,cAApBk2D,EAAU57C,MAAwBra,cAACo2E,IAAa,IAAMp2E,cAACq2E,IAAa,MAEvEr2E,cAACoC,IAAG,CAAArC,SAAEk2D,EAAU57C,WAGpBg8C,OAAQA,IAAMl5D,EAAE,gBAAiB,UACjCi5D,eAAe,EACfl1D,MAAO,KAET,CACE60D,SAAU,cACVC,KAAOC,GACL5nC,EAAiB4nC,EAAU57C,MAAO3c,EAAoBG,aAAa29B,cACrE66B,OAAQA,IAAMl5D,EAAE,uBAAwB,wBACxC+D,MAAO,KAET,CACE60D,SAAU,QACVC,KAAM13D,IAAA,IAAG8sD,KAAK,SAAEkL,IAA6Ch4D,EAAA,OAC3D0B,cAACJ,IAAM,CACLukC,GAAG,OACH1jC,KAAK,KACLD,QAAQ,YACRe,QAASA,IAAM00E,EAAY3f,EAASvzD,IACpC+6B,SAAUi4C,EAAch2E,SAEvB5C,EAAE,cAAe,UACX,EAEX+D,MAAO,GACPk1D,eAAe,GAElB,EExCUkgB,GAAyBA,CACpCrpE,EACAjK,EACA6rB,EACAnC,EACA60B,EACA1+B,KAEO,CACL7f,OACA6rB,SACAnC,MAAY,OAALA,QAAK,IAALA,IAAS,GAChB/P,cAAe,GACf4kC,iBAAkC,OAAhBA,QAAgB,IAAhBA,KAClB1+B,aAA0B,OAAZA,QAAY,IAAZA,OC7DL0zD,GAAgDj4E,IAAkB,IAAjB,QAAE2sD,GAAS3sD,EACvE,MAAM,EAAEnB,GAAMC,YAAe,oBACtB+/B,EAAQq5C,GAAa3wD,oBAAS,GAO/B4wD,EAA2C,YAAtBxrB,EAAQh+C,UAE7BypE,EAAoBC,IACxB,IACE,MAAMC,EAAU7rE,KAAKmf,MAAMysD,GAC3B,OAAO5rE,KAAKC,UAAU4rE,EAAS,KAAM,EACvC,CAAE,MACA,OAAOD,CACT,GAGF,OACE92E,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACghC,IAAU,CAACmD,GAAG,OAAO1jC,KAAK,KAAKD,QAAQ,YAAYe,QAASA,IAAMi1E,GAAU,GAAMz2E,SAChF5C,EAAE,eAAgB,kBAErB0C,eAACk/B,KAAK,CAAC3B,QAASA,IAAMo5C,GAAU,GAAQr5C,OAAQA,EAAQ05C,eAAe,SAAQ92E,SAAA,CAC7EC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACXF,eAACo+B,KAAW,CAAAl+B,SAAA,CACVF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAAC82E,IAAS,CAACx3E,MAAOoB,IAAQC,KAAK,OAC/BX,cAAA,QAAAD,SAAO5C,EAAE,eAAgB,qBAE3B6C,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAAC/M,EAAE,eAActxB,SAAA,CACzBC,cAACoC,IAAG,CACFkvB,GAAI5wB,IAAQo8B,KAAK,KACjB6G,UAAS,aAAA9mC,OAAe6D,IAAQo8B,KAAK,MACrCwE,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCvB,GAAI,EACJwF,GAAI,EAAEhhC,SAENC,cAAA,KAAAD,SAAA,GAAAlD,OAAOM,EAAE,MAAO,OAAM,MAAAN,OAAKouD,EAAQsS,YAErCv9D,cAACoC,IAAG,CACFovB,EAAC,QAAA30B,OA1CO,iBA0Cc,OAAAA,OAzCR,YAyC+B,OAAAA,OAxC/B,WAwCsD,OAAAA,OAvCrD,OAuC6E,OAAAA,OAtC9E,YAsCqG,KACnHwhC,SAAS,OAAMt+B,SAEfF,eAACuC,IAAG,CAAC4wB,GAAI,EAAEjzB,SAAA,CACR02E,GACC52E,eAAA,OAAAE,SAAA,CACEC,cAAC2nC,KAAU,CAACpM,GAAI,EAAGwF,GAAI,EAAG//B,GAAI,EAAEjB,SAC9BC,cAAA,MAAAD,SAAK5C,EAAE,gBAAiB,oBAE1B6C,cAACoC,IAAG,CACFgvC,GAAI,EACJ/f,EAAG,EACH7xB,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClCuB,SAAS,OACT,cAAY,gBAAet+B,SAE3BC,cAAA,OAAAD,SAAM22E,EAAiBzrB,EAAQ8rB,qBAIrC/2E,cAAC2nC,KAAU,CAACpM,GAAI,EAAGwF,GAAI,EAAG//B,GAAI,EAAEjB,SAC9BC,cAAA,MAAAD,SAAK5C,EAAE,cAAe,kBAExB6C,cAACoC,IAAG,CACFgvC,GAAI,EACJ/f,EAAG,EACH7xB,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClCuB,SAAS,OACT,cAAY,cAAat+B,SAEzBC,cAAA,OAAAD,SAAM22E,EAAiBzrB,EAAQ99C,oBAKvCnN,cAAC4+B,KAAW,CAAA7+B,SACVC,cAACJ,IAAM,CAAC2B,QAASA,IAAMi1E,GAAU,GAAOz2E,SAAC,oBAI9C,EC3GMi3E,GAA0BA,KACrC,MAAM,EAAE75E,GAAMC,YAAe,mBACvB65E,EAAoB,CACxB,CACE58D,MAAO,wBACP3b,MAAOvB,EAAE,uBAAwB,0BAEnC,CACEkd,MAAO,oBACP3b,MAAOvB,EAAE,mBAAoB,sBAE/B,CACEkd,MAAO,qBACP3b,MAAOvB,EAAE,oBAAqB,uBAEhC,CACEkd,MAAO,oBACP3b,MAAOvB,EAAE,mBAAoB,uBAIjC,MAAO,CACL+5E,GACE,UACA/5E,EAAE,UAAW,yCACbqP,GACA,GACA,GAEF0qE,GACE,mBACA/5E,EAAE,iBAAkB,kBACpB,IAAI85E,IACJ,GACA,EACA,CAAC,CAAE58D,MAAO,wBAAyB3b,MAAO,2BAE7C,EAGUw4E,GAA0CA,CACrDl0E,EACA6rB,EACAnC,EACA60B,EACA1+B,EACAlG,KAEO,CACL3Z,OACA6rB,SACAnC,MAAY,OAALA,QAAK,IAALA,IAAS,GAChB/P,cAA4B,OAAbA,QAAa,IAAbA,IAAiB,GAChC4kC,iBAAkC,OAAhBA,QAAgB,IAAhBA,KAClB1+B,aAA0B,OAAZA,QAAY,IAAZA,OCtDLs0D,GAAiCA,KAC5C,MAAM,EAAEh6E,GAAMC,YAAe,mBAEvBg6E,EAAsB,CAC1Bj6E,EACE,yEACA,0EAEFA,EAAE,6BAA8B,8BAChCA,EACE,uDACA,wDAEFA,EACE,uEACA,wEAEFA,EACE,kEACA,oEAIJ,OACE6C,cAAA,MAAAD,SACGq3E,EAAoBj2E,KAAKqnC,GAEtBxoC,cAAA,MAAI+1C,MAAO,CAAE71C,SAAU,OAAQykD,aAAc,OAAQ5kD,SACnDC,cAAA,QACE+1C,MAAO,CACL71C,SAAU,OACVsqE,cAAe,SACf/e,cAAe,SACfnqD,WAAY,QACZvB,SAEDyoC,KATsDA,MAc5D,ECnBI6uC,GAA8CA,KAAO,IAADtyB,EAAAC,EAAAC,EAC/D,MAAM,EAAE9nD,GAAMC,YAAe,oBACtB04E,EAAcwB,GAAmBzxD,oBAAS,GAE3C0xD,EAAyCnrD,YAC7C1H,KAIAsF,KAAMs7B,EAAyB,UAC/B9O,EAAS,iBACTuvB,EAAgB,MAChBt+C,EAAK,OACLlhB,EAAM,YACNixE,EAAW,QACXC,GACE/mD,GAAyB,CAC3B/nB,UAAW4uE,EACXG,YAAa,YAGT,gBAAEryD,EAAe,cAAEC,EAAa,mBAAEE,EAAkB,uBAAEC,GAC1DN,KACI0iC,EAAUguB,GAA8CC,GACxDjoC,EAAWtJ,iBAAO,MAClBozC,EAAmBrrD,YAAkB9G,GACrCoyD,EAAuBtrD,YAAkB7G,GAsB/C,OACEzlB,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAC9CF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPuhB,MAAK,GAAAjrB,OAAKM,EAAE,iCAAkC,aAC9CiG,YAAapD,cAACm3E,GAAoB,IAClCr1E,EAAE,OACFsuC,SAAU,CAAE9V,KAAM,OAAQC,GAAI,gBAC9B8K,UAAU,4BAEZrlC,cAAC8kD,GAA0B,CACzBQ,0BAA2BA,EAC3BC,YAxBYsyB,KACpBJ,IACGpnE,MAAK,KACJinE,GAAgB,EAAK,IAEtBQ,SAAQ,KACPR,GAAgB,EAAM,GACtB,IAmBGvR,GAAoBvvB,EACnBx2C,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAACgqC,KAAO,MAEPutC,EASD9vD,IACA69B,GACW,YAAX/+C,GACgB,WAAhBixE,EACFx3E,cAAC0+B,IAAgB,CACfn4B,OAAO,QACPysB,GAAI,EACJ5vB,YAAajG,EACX,0BACA,sDAGwB,OAAzBmoD,QAAyB,IAAzBA,GAAgD,QAAvBP,EAAzBO,EAA2B30B,6BAAqB,IAAAo0B,GAAO,QAAPC,EAAhDD,EAAkDr4B,aAAK,IAAAs4B,GAAvDA,EAAyDt0C,OAO5D7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAAC8iC,IAAK2I,EAAUxP,SAAS,SAAQt+B,SACnCC,cAACsoD,IAAS,CACRT,QAASA,EACT79B,KAA+B,OAAzBs7B,QAAyB,IAAzBA,GAAgD,QAAvBL,EAAzBK,EAA2B30B,6BAAqB,IAAAs0B,OAAvB,EAAzBA,EAAkDv4B,MACxD67B,mBAAiB,EACjBC,mBAAiB,EACjBC,kCAAgC,EAChCC,cA5EW90C,IAAmC,IAAD+0C,EAAAC,EAAAmvB,EAAAlvB,EAAAC,EAC3D,MAAM1vC,EAA4B,QAAfuvC,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB7lD,GACnCsW,EAA2C,QAA1B0+D,EAAe,QAAflvB,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB3sC,YAAI,IAAA47D,KAE7C3+D,IACFu+D,EAAiBv+D,GACjBw+D,EAAqBv+D,GACvB,EAsEc5Y,KAAK,KACLI,GAAI,CACF,6BAA8B,CAC5BV,SAAU,UAGdwC,WAAW,SACXyzD,eAAe,MAGnBp2D,cAACoC,IAAG,CAACuiD,aAAc,GAAG5kD,SACpBC,cAAC4tC,GAAmB,CAClB9jB,eAAyC,OAAzBw7B,QAAyB,IAAzBA,OAAyB,EAAzBA,EAA2Bx7B,eAC3CzE,gBAAiBA,EACjBC,cAAeA,EACfuoB,SAAUA,EACVC,wBAAyB,WA/B/B9tC,cAAC0+B,IAAgB,CACfn4B,OAAO,UACPysB,GAAI,EACJ5vB,YAAajG,EAAE,2BAA4B,sBAxB7C6C,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPysB,GAAI,EACJ5vB,YAAajG,EACX,6BACA,mHAsDT,ECjJM66E,GACXz5E,IAEA,MAAM6xB,EAAqB9D,YAAkBnI,IAEvC5W,EAAU,IADG6e,YAAe9H,KAGlC,OAAOlU,aACL,CAAC1C,GAAeoC,iBAAkBvC,IAClC,ICbFA,IAEAF,GAA0D,aAAcE,GDWhEuC,CAAiBvC,IACvB,IACKyC,MACAzR,EACHqtB,UAAY5B,IAAoC,IAADuC,GACrC,OAAJvC,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,YAAa,GAAuC,KAA9B,OAAJxC,QAAI,IAAJA,OAAI,EAAJA,EAAMiuD,WAAWvrD,MAAMhc,SACjE0f,EAAmB,EACrB,EAEFhD,QAAUwD,IAAY,CACpBA,SAGL,EEZUsnD,GAA0E55E,IAGhF,IAHiF,QACtFmoD,EAAO,YACPE,GAAc,GACfroD,EACC,MAAO65E,EAAgBC,GAAqBlmD,YAAerO,KACpDw0D,EAAkBC,GAAuBpmD,YAAepO,KACxDy0D,EAAgBC,GAAqBtmD,YAAenO,KACrD,EAAE5mB,GAAMC,YAAe,WAO7B,OALA0nC,qBAAU,KACRszC,EAAkB3xB,EAAQ,GAEzB,IAGDzmD,cAACwmD,GAAoB,CACnBC,QAAS0xB,EACTzxB,qBAAsB0xB,EACtBzxB,YAAaA,EACbC,gBAAgB,EAChBra,eAAgBgsC,EAChBjsC,iBAAkB+rC,EAClB5rC,aAAc+rC,EACdhsC,eAAgB8rC,EAChB3rC,cAAexvC,EAAE,wBAAyB,cAC1CyvC,YAAazvC,EAAE,sBAAuB,YACtC8oB,gBAAiB7B,IACjB,ECxCOq0D,GAAyBA,CACpClrE,EACAhP,IAEO6R,aACL,CAAC1C,GAAeqC,uBAAwBxC,IACxC,ICPFA,IAEAF,GAAM,cAAAxQ,OACU0Q,EAAQgX,iBAAgB,KAAA1nB,OAAI0Q,EAAQmrE,YAAW,MDIvD3oE,CAAuBxC,IAC7B,IACKyC,MACAzR,EACHqtB,UAAY5B,GAAyCA,EACrDoD,QAAUwD,IAAY,CACpBA,UEKK+nD,GAAuCA,KAAO,IAADC,EAAAC,EACxD,MAAM,EAAE17E,GAAMC,YAAe,oBACtB+/B,EAAQq5C,GAAatkD,YAAevO,IACrCm1D,EAAiB1sD,YAAexI,KAC/Bm1D,EAAkBC,GAAuBnzD,sBAOxCmE,KAAMivD,GAAsBR,GAAuB,CACzDl0D,iBAAkD,QAAlCq0D,EAAgB,OAAdE,QAAc,IAAdA,OAAc,EAAdA,EAAgBv0D,wBAAgB,IAAAq0D,IAAI,wBACtDF,YAA+B,QAApBG,EAAgB,OAAdC,QAAc,IAAdA,OAAc,EAAdA,EAAgB/1E,UAAE,IAAA81E,IAAI,IAG/BnC,EAAoBC,IACxB,IACE,MAAMC,EAAU7rE,KAAKmf,MAAMysD,GAC3B,OAAO5rE,KAAKC,UAAU4rE,EAAS,KAAM,EACvC,CAAE,MACA,OAAOD,CACT,GAGF7xC,qBAAU,KACJg0C,GAAkB37C,GACpB67C,EAAoBC,EACtB,GACC,CAACA,EAAmBH,EAAgB37C,IAEvC,MAAMtO,EACJhvB,eAACo+B,KAAW,CAAAl+B,SAAA,CACVF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAAC82E,IAAS,CAACx3E,MAAOoB,IAAQC,KAAK,OAC/BX,cAAA,QAAAD,SAAO5C,EAAE,oBAAqB,0BAEhC6C,cAACm+B,KAAgB,OAwErB,OACEn+B,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACk/B,KAAK,CAAC3B,QAASA,IAAMo5C,GAAU,GAAQr5C,OAAQA,EAAQ05C,eAAe,SAAQ92E,SAAA,CAC7EC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAC/+B,SAAS,WAAUH,SAAA,CAC9B8uB,EAzET,WAAyB,IAADqqD,EAAAC,EACtB,OACEt5E,eAACu+B,KAAS,CAAC/M,EAAE,eAActxB,SAAA,CACzBC,cAACoC,IAAG,CACFkvB,GAAI5wB,IAAQo8B,KAAK,KACjB6G,UAAS,aAAA9mC,OAAe6D,IAAQo8B,KAAK,MACrCwE,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCvB,GAAI,EACJwF,GAAI,EAAEhhC,SAENF,eAACyzB,IAAI,CAACuI,gBAAgB,iBAAiB55B,QAAS,EAAElC,SAAA,CAChDF,eAAA,KAAAE,SAAA,CACG5C,EAAE,eAAgB,MAAM,KAAmB,OAAhB47E,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBh2E,MAEhDlD,eAAA,KAAAE,SAAA,CACG5C,EAAE,qBAAsB,QAAQ,KAAmB,OAAhB47E,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBx0D,oBAExD1kB,eAAA,KAAAE,SAAA,CACG5C,EAAE,+BAAgC,gCAAgC,IAAE,IACpD,OAAhB47E,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkB10E,kCAErBxE,eAAA,KAAAE,SAAA,CACG5C,EAAE,OAAQ,eAAe,KAAmB,OAAhB47E,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBn7E,QAEjDiC,eAAA,KAAAE,SAAA,CACG5C,EAAE,WAAY,aAAa,KAAmB,OAAhB47E,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBviD,iBAIvDx2B,cAACoC,IAAG,CACFovB,EAAC,QAAA30B,OAlEW,iBAkEU,OAAAA,OAjEJ,YAiE2B,OAAAA,OAhE3B,WAgEkD,OAAAA,OA/DjD,OA+DyE,OAAAA,OA9D1E,YA8DiG,KACnHwhC,SAAS,OAAMt+B,SAEfF,eAACuC,IAAG,CAAC4wB,GAAI,EAAEjzB,SAAA,CAEPF,eAAA,OAAAE,SAAA,CACEC,cAAC2nC,KAAU,CAACpM,GAAI,EAAGwF,GAAI,EAAG//B,GAAI,EAAEjB,SAC9BC,cAAA,MAAAD,SAAK5C,EAAE,UAAW,eAEpB6C,cAACoC,IAAG,CACFgvC,GAAI,EACJ/f,EAAG,EACH7xB,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClCuB,SAAS,OACT,cAAY,UAASt+B,SAErBC,cAAA,OAAAD,SAAM22E,EAA0C,QAA1BwC,EAAiB,OAAhBH,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkB1lD,eAAO,IAAA6lD,IAAI,WAI1Dl5E,cAAC2nC,KAAU,CAACpM,GAAI,EAAGwF,GAAI,EAAG//B,GAAI,EAAEjB,SAC9BC,cAAA,MAAAD,SAAK5C,EAAE,aAAc,mBAEvB6C,cAACoC,IAAG,CACFgvC,GAAI,EACJ/f,EAAG,EACH7xB,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClCuB,SAAS,OACT,cAAY,aAAYt+B,SAExBC,cAAA,OAAAD,SAAM22E,EAA6C,QAA7ByC,EAAiB,OAAhBJ,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBK,kBAAU,IAAAD,IAAI,eAMnE,CAQSE,GACDr5E,cAAC4+B,KAAW,CAAA7+B,SACVC,cAACJ,IAAM,CAAC2B,QAASA,IAAMi1E,GAAU,GAAOz2E,SAAC,mBAI9C,EC3HMu5E,GAAsCA,KAAO,IAADC,EAAAC,EACvD,MAAM,EAAEr8E,GAAMC,YAAe,oBAErB4sB,KAAMyvD,EAAqB,UAAEjjC,GAAcwhC,KAC7CvxB,EAAUuwB,KACVnvB,EChB+B6xB,MACrC,MAAM,EAAEv8E,GAAMC,YAAe,mBACvBixB,EAAmBtwB,IACnB6X,EAASohE,KAA0Bz4C,MACtCo7C,GAAqC,qBAArBA,EAAY32E,OAEzBwzE,EAAYlqD,YAAkB3I,IAC9Bi2D,EAAattD,YAAkB1I,IAErC,MAAO,CACL,CACEmyC,SAAU,OACVC,KAAOC,GACL5nC,EAAiB4nC,EAAU57C,MAAO3c,EAAoBG,aAAa29B,cACrE46B,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,wBAAyB,eACzC+D,MAAO,KAET,CACE60D,SAAU,iCACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,IAAK/6B,QAAQ,cAAap7B,SAChEk2D,EAAU57C,UAIjBg8C,OAAQA,IAAMl5D,EAAE,cAAe,gCAC/B+D,MAAO,KAET,CACE60D,SAAU,mBACVC,KAAOC,IACL,MAAM4jB,EAAsB,OAANjkE,QAAM,IAANA,OAAM,EAANA,EAAQ8W,MAAM6R,MAAM76B,GAASA,EAAK2W,QAAU47C,EAAU57C,QAC5E,OACEra,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,GAAI/6B,QAAQ,cAAap7B,SAClD,OAAb85E,QAAa,IAAbA,OAAa,EAAbA,EAAen7E,SAEjB,EAGP03D,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,wBAAyB,kBACzC+D,MAAO,KAET,CACE60D,SAAU,UACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SAAGk2D,EAAU57C,MAAM2b,UAAU,EAAG,IAAIn5B,OAAO,SAE7Cu5D,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,iBAAkB,WAClC+D,MAAO,KAET,CACE60D,SAAU,YACVC,KAAM13D,IAAA,IAAG8sD,KAAK,SAAEkL,IAAqCh4D,EAAA,OACnD0B,cAACghC,IAAU,CACTmD,GAAG,OACH1jC,KAAK,KACLD,QAAQ,YACRe,QAASA,KACPq4E,EAAWtjB,GACXkgB,GAAU,EAAK,EACfz2E,SAED5C,EAAE,eAAgB,iBACR,EAEfk5D,OAAQA,IAAMl5D,EAAE,gBAAiB,WACjC+D,MAAO,GACPk1D,eAAe,GAElB,ED1DesjB,GACV7rC,EAAWtJ,iBAAO,MAClBxsB,EAASqU,YAAe/H,IACxBszD,EAAmBrrD,YAAkBtI,IACrC4zD,EAAuBtrD,YAAkBrI,IACzC61D,EAAc1tD,YAAezI,IAYnC,OACE9jB,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAC9CF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACoC,IAAG,CAAArC,SACFC,cAACszB,IAAI,CAACrxB,QAAS,EAAElC,SACfC,cAACk4E,GAA2B,CAACzxB,QAASA,QAGzCjQ,EACCx2C,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAACgqC,KAAO,MAEc,OAArByvC,QAAqB,IAArBA,GAAiC,QAAZF,EAArBE,EAAuBxB,kBAAU,IAAAsB,GAAjCA,EAAmC7sD,MAAMhc,OAG5C7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAAC8iC,IAAK2I,EAAUxP,SAAS,SAAQt+B,SACnCC,cAACsoD,IAAS,CACRT,QAASA,EACT79B,KAA2B,OAArByvD,QAAqB,IAArBA,GAAiC,QAAZD,EAArBC,EAAuBxB,kBAAU,IAAAuB,OAAZ,EAArBA,EAAmC9sD,MACzC67B,mBAAiB,EACjBC,mBAAiB,EACjBC,kCAAgC,EAChCC,cAlCW90C,IAAmC,IAAD+0C,EAAAC,EAAAmvB,EAAAlvB,EAAAC,EAC3D,MAAMixB,EAA+B,QAAfpxB,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB7lD,GACtCi3E,EAA8C,QAA1BjC,EAAe,QAAflvB,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB3sC,YAAI,IAAA47D,KAEhDgC,IACFpC,EAAiBoC,GACjBnC,EAAqBoC,GACvB,EA4Bcv5E,KAAK,KACLsX,OAAQA,EACRlX,GAAI,CACF,6BAA8B,CAC5BV,SAAU,UAGdwC,WAAW,aAGf3C,cAACoC,IAAG,CAAArC,SACFC,cAAC4tC,GAAmB,CAClB9jB,eAAqC,OAArB2vD,QAAqB,IAArBA,OAAqB,EAArBA,EAAuB3vD,eACvCzE,gBAAiBlB,GACjBmB,cAAepB,GACf2pB,SAAUA,EACVC,wBAAyB,WA3B/B9tC,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,UAAW,2BAkC1C28E,GAAe95E,cAAC24E,GAA0B,MAC1C,EE7EMsB,GAAgD37E,IAItD,IAJuD,UAC5D2O,EAAS,QACTw5C,EAAO,YACPE,GAAc,GACfroD,EACC,MAAM,YAAE8mB,EAAW,eAAEU,EAAc,aAAEC,EAAY,gBAAEE,GACjDN,GAAuB1Y,IAClBkrE,EAAgBC,GAAqBlmD,YAAe9M,IACpDizD,EAAkBC,GAAuBpmD,YAAepM,IACxDyyD,EAAgBC,GAAqBtmD,YAAenM,IACrD,EAAE5oB,GAAMC,YAAe,WAM7B,OALA0nC,qBAAU,KACRszC,EAAkB3xB,EAAQ,GAEzB,IAGDzmD,cAACwmD,GAAoB,CACnBC,QAAS0xB,EACTzxB,qBAAsB0xB,EACtBzxB,YAAaA,EACbC,gBAAgB,EAChBra,eAAgBgsC,EAChBjsC,iBAAkB+rC,EAClB5rC,aAAc+rC,EACdhsC,eAAgB8rC,EAChBryD,gBAAiBA,EACjB0mB,cAAexvC,EAAE,wBAAyB,cAC1CyvC,YAAazvC,EAAE,sBAAuB,aACtC,EClBO+8E,GAA4C57E,IAAwB,IAAvB,cAAEsnB,GAAetnB,EACzE,MAAM,EAAEnB,GAAMC,YAAe,oBAEvB,UAAEo5C,GAAcrmB,GAAiBvK,IACjC,gBACJP,EAAe,cACfC,EAAa,YACbC,EAAW,mBACXC,EAAkB,uBAClBC,EAAsB,iBACtBS,EAAgB,gBAChBC,GACER,GAAuBC,GACrB6gC,EdnCiCx5C,KACvC,MAAM,EAAE9P,GAAMC,YAAe,mBAKvB+8E,EACU,YAAdltE,EACI,CACE,CACEoN,MAAO,6BACP3b,MAAOvB,EAAE,6BAA8B,iCAEzC,CACEkd,MAAO,wBACP3b,MAAOvB,EAAE,wBAAyB,4BAEpC,CACEkd,MAAO,yBACP3b,MAAOvB,EAAE,yBAA0B,8BAGvC,CACE,CACEkd,MAAO,2BACP3b,MAAOvB,EAAE,2BAA4B,+BAEvC,CACEkd,MAAO,2BACP3b,MAAOvB,EAAE,2BAA4B,+BAEvC,CACEkd,MAAO,+BACP3b,MAAOvB,EAAE,+BAAgC,oCAInD,MAAO,CACLm5E,GACErpE,EACA,UACA9P,EAAE,UAAW,yCACbqP,GACA,GACA,GAEF8pE,GAAuBrpE,EAAW,WAAY9P,EAAE,gBAAiB,YAAa,IACzEg9E,IAEL7D,GAAuBrpE,EAAW,WAAY9P,EAAE,cAAe,UAAW,CACxE,CACEkd,MAAO,UACP3b,MAAOvB,EAAE,UAAW,YAEtB,CACEkd,MAAO,OACP3b,MAAOvB,EAAE,OAAQ,WAGrBm5E,GAAuBrpE,EAAW,YAAa9P,EAAE,gBAAiB,aAAc,IAzDhE,CAChB,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACrF,IAAK,IAAK,IAAK,IAAK,KAwDLgE,KAAK6L,IAAQ,CACxBqN,MAAOrN,EACPtO,MAAOsO,EAAS2D,iBAGrB,Ec9BeypE,CAAyBx0D,GACnCiiC,EC9BgCwyB,MACtC,MAAM,EAAEl9E,GAAMC,YAAe,mBACvBixB,EAAmBtwB,IAEzB,MAAO,CACL,CACEg4D,SAAU,OACVC,KAAOC,GACL5nC,EAAiB4nC,EAAU57C,MAAO3c,EAAoBG,aAAa29B,cACrE46B,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,wBAAyB,uBACzC+D,MAAO,KAET,CACE60D,SAAU,iCACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,IAAK/6B,QAAQ,cAAap7B,SAChEk2D,EAAU57C,UAIjBg8C,OAAQA,IAAMl5D,EAAE,cAAe,gCAC/B+D,MAAO,KAET,CACE60D,SAAU,UACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,GAAI/6B,QAAQ,cAAap7B,SAC/Dk2D,EAAU57C,UAIjB+7C,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,kBAAmB,oBACnC+D,MAAO,QAET,CACE60D,SAAU,SACVC,KAAOC,GACLp2D,eAACo7B,IAAM,CAAAl7B,SAAA,CACLC,cAACoC,IAAG,CACF9C,MAA2B,YAApB22D,EAAU57C,MAAsB3Z,IAAQ+oC,MAAM,KAAO/oC,IAAQgrC,IAAI,KACxEwqB,YAAa,EACbh2D,SAAU,GACVoB,WAAY,GAAGvB,SAEM,YAApBk2D,EAAU57C,MAAsBra,cAACo2E,IAAa,IAAMp2E,cAACq2E,IAAa,MAErEr2E,cAACoC,IAAG,CAAArC,SACmB,YAApBk2D,EAAU57C,MAAsBld,EAAE,UAAW,WAAaA,EAAE,OAAQ,aAI3Ek5D,OAAQA,IAAMl5D,EAAE,gBAAiB,UACjC+D,MAAO,KAET,CACE60D,SAAU,WACVC,KAAOC,GACLj2D,cAAA0yB,WAAA,CAAA3yB,SACEC,cAACoC,IAAG,CAAC89C,UAAU,aAAagW,YAAa,EAAG/6B,QAAQ,cAAap7B,SAC9Dk2D,EAAU57C,UAIjBg8C,OAAQA,IAAMl5D,EAAE,kBAAmB,aACnC+D,MAAO,KAET,CACE60D,SAAU,YACVC,KAAM13D,IAAA,IAAG8sD,KAAK,SAAEkL,IAAqCh4D,EAAA,OACnD0B,cAACu2E,GAAc,CAACtrB,QAASqL,GAAY,EAEvCD,OAAQA,IAAMl5D,EAAE,gBAAiB,WACjC+D,MAAO,IACPk1D,eAAe,GAElB,EDjDeikB,GACVxsC,EAAWtJ,iBAAO,MAClBxsB,EAASqU,YAAe7G,GACxB+0D,EAAUluD,YAAelG,GACzB4D,EAAiBsC,YAAejG,GAChCwxD,EAAmBrrD,YAAkB9G,GACrCoyD,EAAuBtrD,YAAkB7G,GAY/C,OACEzlB,cAAA0yB,WAAA,CAAA3yB,SACEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAC9CF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACoC,IAAG,CAAArC,SACFC,cAACszB,IAAI,CAACrxB,QAAS,EAAElC,SACfC,cAACi6E,GAAc,CAACxzB,QAASA,EAASx5C,UAAW2Y,QAG9B,YAAlBA,GACC5lB,cAAC0+B,IAAgB,CACf1K,GAAI,EACJztB,OAAO,OACPuhB,MAAO3qB,EACL,4BACA,gEAEFqD,QAAQ,WAGXg2C,EACCx2C,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAACgqC,KAAO,MAEA,OAAPswC,QAAO,IAAPA,KAAS5pE,OAGZ7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAAC8iC,IAAK2I,EAAUxP,SAAS,SAAQt+B,SACnCC,cAACsoD,IAAS,CACRT,QAASA,EACT79B,KAAMswD,EACN/xB,mBAAiB,EACjBC,mBAAiB,EACjBC,kCAAgC,EAChCC,cA7CW90C,IAAmC,IAAD+0C,EAAAC,EAAAmvB,EAAAlvB,EAAAC,EAC3D,MAAMixB,EAA+B,QAAfpxB,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB7lD,GACtCi3E,EAA8C,QAA1BjC,EAAe,QAAflvB,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB3sC,YAAI,IAAA47D,KAEhDgC,IACFpC,EAAiBoC,GACjBnC,EAAqBoC,GACvB,EAuCcv5E,KAAK,KACLsX,OAAQA,EACRlX,GAAI,CACF,6BAA8B,CAC5BV,SAAU,UAGdwC,WAAW,aAGf3C,cAACoC,IAAG,CAACuiD,aAAc,GAAG5kD,SACpBC,cAAC4tC,GAAmB,CAClB9jB,eAAgBA,EAChBzE,gBAAiBA,EACjBC,cAAeA,EACfuoB,SAAUA,EACVC,wBAAyB,WA3B/B9tC,cAAC+uC,GAAa,CAAC1b,QAASl2B,EAAE,UAAW,4BAkC1C,EEhGMo9E,GAAoBA,KAC/B,MAAM,EAAEp9E,GAAMC,YAAe,mBACvB6jD,EAAY,CAChB9jD,EAAE,gBAAiB,iBACnBA,EAAE,iBAAkB,kBACpBA,EAAE,yBAA0B,0BAC5BA,EAAE,aAAc,eAGZ+iE,EAAgB,CACpB1gE,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OACtDvB,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnBwG,GAAI,CAAEzG,KAAM,EAAGC,GAAI,IAGrB,OACE16B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCC,cAACwkD,GAAW,CAACze,QAAS5oC,EAAE,kBAAmB,uBAE7C6C,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACugE,KAAI,CAAC5/D,QAAQ,WAAW6wB,EAAG,EAAGrwB,GAAI,EAAGgyB,GAAI,GAAIoe,GAAI,CAAE9W,MAAO,EAAGC,GAAI,GAAK8lC,UAAU,EAAKtgE,SAAA,CACpFC,cAACmhD,KAAO,CAAC7hD,MAAOoB,IAAQC,KAAK,KAAME,GAAI,CAAE,aAAc,CAAEsjC,GAAI,IAAMpkC,SAChEkhD,EAAU9/C,KAAKq5E,GACdx6E,cAACqhD,KAAG,CAAAthD,SACFC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAEy6E,KADhBA,OAKd36E,eAACygE,KAAS,CACRtsC,GAAI,CAAEsG,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,EAAGyM,GAAI,SACvB1V,EAAG,CAAEiJ,KAAM,EAAGyM,GAAI,SAClBw5B,KAAM,CAAEjmC,UAAM9tB,EAAWu6B,GAAI,KAC7BznC,MAAOoB,IAAQ8qC,MACfnN,SAAU,CAAE/D,KAAM,SAAUC,GAAI,QAASx6B,SAAA,CAEzCC,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAACk6E,GAAY,CAACt0D,cAAc,cAE9B5lB,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAACk6E,GAAY,CAACt0D,cAAc,eAE9B5lB,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAACq3E,GAAiC,MAEpCr3E,cAACwgE,KAAQ,IAAKN,EAAangE,SACzBC,cAACs5E,GAAyB,gBAKjC,ECnEMmB,GAAiEn8E,IAGvE,IAHwE,MAC7EwpB,EAAK,YACL1kB,GACD9E,EACC,OACE0B,cAAColC,IAAS,CAACtjC,EAAG,CAAEw4B,KAAM,OAAQyM,GAAI,OAAQhnC,SACxCC,cAAC07B,IAAI,CAACrK,EAAG,CAAEiJ,KAAM,EAAGyM,GAAI,IAAM5D,UAAU,OAAMpjC,SAC5CF,eAACkiC,KAAM,CAAC5G,QAAQ,OAAOl5B,QAAS,CAAEq4B,KAAM,EAAGyM,GAAI,GAAIhnC,SAAA,CACjDF,eAACo7B,IAAM,CAAAl7B,SAAA,CACLC,cAAC06E,IAAM,CAACj6E,KAAM,GAAInB,MAAOoB,IAAQC,KAAK,OACtCX,cAACimC,IAAO,CAAAlmC,SAAE+nB,OAEZ9nB,cAAC0+B,IAAgB,CAACn4B,OAAO,OAAOnD,YAAaA,UAGvC,EChBHu3E,GAAyBA,KACpC,MAAM,EAAEx9E,GAAMC,YAAe,UAE7B,OACE4C,cAACy6E,GAAY,CACX3yD,MAAO3qB,EAAE,uBAAwB,uBACjCiG,YAAajG,EACX,yBACA,wDAEY,ECVPy9E,GAAyBA,KACpC,MAAM,EAAEz9E,GAAMC,YAAe,UAE7B,OACE4C,cAACy6E,GAAY,CACX3yD,MAAO3qB,EAAE,sBAAuB,gBAChCiG,YAAajG,EAAE,wBAAyB,gDAC1B,E,cCuBb,MAAM09E,GAAkDv8E,IAKxD,IALyD,OAC9D6+B,EAAM,QACNC,EAAO,OACP/gB,EAAM,QACN0pB,GACDznC,EACC,MAAM,EAAEnB,GAAMC,YAAe,2BACvB82B,EAASC,eACTp1B,EAAWC,eAEX,KAAEqlC,GAASvlC,eAEXg8E,EAA6B1uD,YAAera,KAC1C+f,OAAQipD,EAAqB,UAAEvkC,GAAc7mB,KAC/CqrD,EC3C0CC,MAGhD,MAAMxvD,EAAcC,cAEpB,OAAQrP,IACNoP,EAAYyvD,aAAa,CAACxtE,GAAeO,oBAAqB,IACzDoO,EACH8+D,cAAe,IAAIt4E,MACnB,CACH,EDiCsCo4E,GAEjCzoD,EAAeA,KACnB4K,GAAS,EAGLg+C,EAAeA,KACnB,MAAMC,EAA4B,CAChCC,iCAAkCj/D,EAAOi/D,iCACzCC,sBAAuBl/D,EAAOk/D,sBAC9BC,gCAAiCn/D,EAAOm/D,gCACxCC,qBAAsBp/D,EAAOo/D,qBAC7BC,oCAAqCr/D,EAAOq/D,oCAC5CC,qBAAsBt/D,EAAOs/D,qBAC7BC,4BAA6Bv/D,EAAOu/D,4BACpCC,2BAA4Bx/D,EAAOw/D,2BACnCC,yBAA0Bz/D,EAAOy/D,yBACjCC,4BAA6B1/D,EAAO0/D,6BAGlC13C,IACFg3C,EAAQC,iCAAmCD,EAAQO,4BACnDP,EAAQG,gCAAkCH,EAAQQ,2BAClDR,EAAQI,qBAAuBJ,EAAQS,yBACvCT,EAAQM,qBAAuBN,EAAQU,6BAGzC,MAAMC,EAAWC,gCACfj8E,cAACupD,GAAa,CAAAxpD,SACZC,cAACk8E,GAAqB,CAACn2C,QAASA,EAAS1pB,OAAQA,OAI/C2N,EAA+B,IAChC8wD,EACHqB,WAAW,EACXd,QAAStwE,KAAKC,UAAUqwE,GACxBe,KAAMC,GAAuBL,IAG/BjB,EAAsB/wD,EAAM,CAC1B4B,UAAWA,KACTsI,EAAO,CACLnxB,GAAI,mCACJ+kB,MAAO3qB,EAAE,mBAAoB,mBAC7Bg4B,SAAUx4B,IAGZq+E,EAA+B3+D,GAE/B+gB,GAAS,EAEXhQ,QAASA,KACP8G,EAAO,CACLnxB,GAAI,gCACJ+kB,MAAO3qB,EAAE,2BAA4B,+CACrCg4B,SAAUx4B,EACV4J,OAAQ,UAEV62B,GAAS,GAEX,EAGJ,OAAOr+B,EACLc,eAAC8+B,GAAW,CAACxB,OAAQA,EAAQC,QAAS5K,EAAazyB,SAAA,CACjDC,cAACs8E,GAAsB,CAAC9lC,UAAWA,IACnCx2C,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CAACi/B,aAAW,EAACt9B,QAAS65E,EAAct9C,SAAU0Y,EAAUz2C,SAC5D5C,EAAE,uBAAwB,cAE7B6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAASixB,EAAcsL,SAAU0Y,EAAUz2C,SAC/E5C,EAAE,qBAAsB,oBAMjC0C,eAACk/B,KAAK,CAAC5B,OAAQA,EAAQC,QAAS5K,EAAazyB,SAAA,CAC3CC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACXC,cAACs8E,GAAsB,CAAC9lC,UAAWA,IACnCx2C,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAASixB,EAAcsL,SAAU0Y,EAAUz2C,SACnE5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAAC2B,QAAS65E,EAAct9C,SAAU0Y,EAAUz2C,SAChD5C,EAAE,uBAAwB,wBAMtC,EE7HUm/E,GAAgEh+E,IAEtE,IAFuE,UAC5Ek4C,GACDl4C,EACC,MAAM,EAAEnB,GAAMC,YAAe,2BAE7B,OACEyC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,0BAA2B,2BAA2B4C,SAAA,CAC/EF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACu8E,IAAqB,CAACj9E,MAAOoB,IAAQC,KAAK,OAC3CX,cAAA,QAAAD,SAAO5C,EAAE,kBAAmB,wBAE9B6C,cAACm+B,KAAgB,OAEnBn+B,cAACo+B,KAAS,CAACC,SAAS,UAAUhN,EAAE,eAActxB,SAC5CC,cAACoC,IAAG,CACFkvB,GAAI5wB,IAAQo8B,KAAK,KACjB6G,UAAS,aAAA9mC,OAAe6D,IAAQo8B,KAAK,MACrCwE,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCvB,GAAI,EACJwF,GAAI,EAAEhhC,SAELy2C,EACCx2C,cAAC2B,IAAI,CAACC,eAAe,SAAQ7B,SAC3BC,cAACgqC,KAAO,MAGVhqC,cAAA,KAAAD,SACG5C,EACC,gCACA,4GAMT,ECnCMq/E,GAA4Cl+E,IAA0B,IAAzB,QAAEm+E,EAAO,OAAEC,GAAQp+E,EAC3E,MAAMq+E,EAAiB3rE,GAQd,cAPO0rE,EAAO1rE,GACjB0rE,EAAO1rE,GACJwqB,cACAshC,WAAW,UAAW,KACtB8f,UACA9f,WAAW,IAAK,KACnB,IAIN,YAAgBtwD,IAAZiwE,EAEAz8E,cAACmzD,IAAS,CAACC,eAAa,EAACC,aAAc,CAAC,GAAIryD,GAAI,EAAEjB,SAC/C+qB,OAAOC,QAAQ0xD,GAASt7E,KACvB6Q,IAAA,IAAEhB,EAAKqJ,GAAMrI,EAAA,QACTqI,EAAM3J,QACN7Q,eAACyzD,IAAa,CAAWtyD,GAAI,EAAG,cAAa27E,EAAc3rE,GAAKjR,SAAA,CAC9DF,eAAC0zD,IAAe,CAAAxzD,SAAA,CACdC,cAAC2nC,KAAU,CAAC3D,KAAK,IAAIrI,UAAU,OAAM57B,SACnCC,cAAC4iC,KAAIi6C,GAAE,CAACl4B,aAAc,EAAE5kD,SAAE28E,EAAO1rE,OAEnChR,cAACwzD,IAAmB,OAEtBxzD,cAACyzD,IAAc,CAACxyD,UAAU,OAAMlB,SAC5BiR,IAAwBjH,GAAYwxE,sBACpCv7E,cAAC88E,GAAY,CAACC,cAAe1iE,IAE7Bra,cAACg9E,GAAY,CAACC,UAAW5iE,QAXXrJ,EAerB,MAKF,IACT,EC1DK,IAAKksE,GAAc,SAAdA,GAAc,OAAdA,EAAc,4CAAdA,EAAc,wCAAdA,CAAc,MCQnB,MAAMC,GACXzzE,IAEA,MAAM0zE,EAAgClrD,YACpC1gB,IAGI6rE,EAA8BnrD,YAClCzgB,IAGF,OAAO/H,IAAiBwzE,GAAeI,qBACnCF,EACAC,CAA2B,ECnBpBE,GAAgBA,CAC3Bd,EACAe,IAEO1yD,OAAOC,QAAQ0xD,GAASt7E,KAAI7C,IAAA,IAAE0S,EAAKqJ,GAAM/b,EAAA,MAAM,CACpDI,MAAO8+E,EAAOxsE,GACdqJ,MAAOA,EACR,ICPUojE,GAActgF,IAClB,CACLugF,wBAAyBvgF,EACvB,2BACA,wCAEFo+E,sBAAuBp+E,EAAE,sBAAuB,kBAChDwgF,uBAAwBxgF,EAAE,0BAA2B,uCACrDs+E,qBAAsBt+E,EAAE,oBAAqB,kCAC7CygF,yBAA0BzgF,EACxB,uCACA,mCAEF0gF,iCAAkC1gF,EAChC,2CACA,wCAEF2gF,+CAAgD3gF,EAC9C,6DACA,qECPO4gF,GAA0BA,CACrCC,EACA7gF,KAMA,MAAM8gF,ECpByCC,MAC/C,MAAM,EAAE/gF,GAAMC,YAAe,6CAqD7B,MAnD+D,CAC7D+gF,0CAA2ChhF,EACzC,qDACA,qEAEFihF,mDAAoDjhF,EAClD,+DACA,wFAEFkhF,0DAA2DlhF,EACzD,0EACA,0FAEFmhF,+DAAgEnhF,EAC9D,+EACA,wFAEFohF,2DAA4DphF,EAC1D,2EACA,2FAEFqhF,gEAAiErhF,EAC/D,gFACA,yFAEFshF,4DAA6DthF,EAC3D,4EACA,4FAEFuhF,iEAAkEvhF,EAChE,iFACA,0FAEFwhF,4DAA6DxhF,EAC3D,4EACA,4FAEFyhF,iEAAkEzhF,EAChE,iFACA,0FAEF0hF,4DAA6D1hF,EAC3D,2EACA,kGAEF2hF,iEAAkE3hF,EAChE,gFACA,gGAIiC,EDlCE+gF,GAEjCa,EEtB4CC,MAClD,MAAM,EAAE7hF,GAAMC,YAAe,gDAa7B,MAXkE,CAChE6hF,8BAA+B9hF,EAC7B,wCACA,iDAEF+hF,4CAA6C/hF,EAC3C,0DACA,mEAIoC,EFQE6hF,GAEpCG,EGxB2CC,MACjD,MAAM,EAAEjiF,GAAMC,YAAe,+CAyC7B,MAvCiE,CAC/DiiF,oCAAqCliF,EACnC,+CACA,qDAEFmiF,qCAAsCniF,EACpC,2FACA,yGAEFoiF,6EAA8EpiF,EAC5E,gGACA,uGAEFqiF,sCAAuCriF,EACrC,4FACA,0GAEFsiF,8EAA+EtiF,EAC7E,iGACA,wGAEFuiF,uCAAwCviF,EACtC,6FACA,2GAEFwiF,+EAAgFxiF,EAC9E,kGACA,yGAEFyiF,iCAAkCziF,EAChC,qFACA,sGAEF0iF,yEAA0E1iF,EACxE,0FACA,oGAImC,EHlBEiiF,GAEnCU,EI1B4CC,MAClD,MAAM,EAAE5iF,GAAMC,YAAe,+CAyC7B,MAvCkE,CAChE4iF,kCAAmC7iF,EACjC,4CACA,kDAEF8iF,6CAA8C9iF,EAC5C,yDACA,8GAEF+iF,kDAAmD/iF,EACjD,8DACA,4GAEFgjF,4CAA6ChjF,EAC3C,yDACA,iGAEFijF,iDAAkDjjF,EAChD,8DACA,+FAEFkjF,gCAAiCljF,EAC/B,0CACA,4DAEFmjF,qCAAsCnjF,EACpC,+CACA,0DAEFojF,2CAA4CpjF,EAC1C,sDACA,4DAEFqjF,kCAAmCrjF,EACjC,8CACA,2EAIoC,EJhBE4iF,IAEpC,KAAE17C,GAASvlC,cAEjB,IAAI2hF,EACAC,EAwDJ,OAtDIr8C,GAAQ25C,GAAkB,gCAAiCA,IAC7DyC,EAAkB,IACbzC,EACH1C,iCAAkCiC,GAChCS,EAAepC,4BACfkE,GAEFvE,sBAAuByC,EAAezC,sBACtCC,gCAAiC+B,GAC/BS,EAAenC,2BACfsD,GAEF1D,qBAAsB8B,GACpBS,EAAelC,yBACfmC,GAEFL,yBAA0BL,GACxB,CACEgD,2CACEvC,EAAepC,4BACZ2E,4CAEPT,GAEFb,8BAA+B1B,GAC7B,CACE0B,8BACEjB,EAAejC,4BAA4B8B,kCAE/CkB,GAEFG,4CAA6C3B,GAC3C,CACE2B,4CACElB,EAAejC,4BACZ+B,gDAEPiB,GAEFrD,oCAAqC,MAGvCgF,EAAc,CACZhD,wBAAyB+C,EAAgBnF,iCACzCC,sBAAuBkF,EAAgBlF,sBACvCoC,uBAAwB8C,EAAgBjF,gCACxCC,qBAAsBgF,EAAgBhF,qBACtCmC,yBAA0B6C,EAAgB7C,yBAC1CC,iCAAkC4C,EAAgBxB,8BAClDnB,+CACE2C,EAAgBvB,8CAIf,CACLyB,kBAAmBF,EACnBC,YAAaA,EACbE,SAAUv8C,EAAOo5C,GAAWtgF,QAAKqP,EAClC,EK3FUq0E,GAAyB1jF,IAC7B,CACLs+E,qBAAsBt+E,EAAE,oBAAqB,kCAC7C+hF,4CAA6C/hF,EAC3C,qDACA,gEAEFo+E,sBAAuBp+E,EAAE,iBAAkB,4CAC3Cu+E,oCAAqCv+E,EACnC,oCACA,yDAEFygF,yBAA0BzgF,EACxB,kCACA,mCAEFq+E,gCAAiCr+E,EAC/B,+BACA,iDAEFm+E,iCAAkCn+E,EAChC,gCACA,kEAEF8hF,8BAA+B9hF,EAC7B,mCACA,gDCtBO2jF,GACX9C,IAKI,IAAD1/E,EAAA0T,EACH,MAAM,EAAE7U,GAAMC,YAAe,sBAEvB,gBAAEqjF,EAAe,QAAEpF,EAAO,OAAEqB,GCAgBqE,EAClD/C,EACA7gF,KAMA,MAAM6jF,EAA6BC,KAE7BC,EAA6BC,KAE7BC,EACJC,KAEIC,EAAwCC,KAExCC,EAAyCC,KAE/C,IAAIhB,EACAiB,EAEJ,MAAM,KAAEvwD,GAASryB,cA2DjB,OAzDIqyB,GAAQ6sD,GAAkB,qCAAsCA,IAClEyC,EAAkB,IACbzC,EACH1C,iCAAkCiC,GAChCS,EAAe1C,iCACfkG,GAEFjG,sBAAuByC,EAAezC,sBACtCC,gCAAiC+B,GAC/BS,EAAexC,gCACf8F,GAEF7F,qBAAsB8B,GACpBS,EAAevC,qBACfuF,GAEFpD,yBAA0BL,GACxB,CACEgD,2CACEvC,EAAe1C,iCACZiF,4CAEPiB,GAEFvC,8BAA+B1B,GAC7B,CACE0B,8BACEjB,EAAerC,qBAAqBsD,+BAExCiC,GAEFhC,4CAA6C3B,GAC3C,CACE2B,4CACElB,EAAerC,qBAAqBuD,6CAExCgC,GAEFxF,oCAAqC6B,GACnCS,EAAetC,oCACf0F,IAIJM,EAAmB,CACjBpG,iCAAkCmF,EAAgBnF,iCAClDC,sBAAuBkF,EAAgBlF,sBACvCC,gCAAiCiF,EAAgBjF,gCACjDC,qBAAsBgF,EAAgBhF,qBACtCmC,yBAA0B6C,EAAgB7C,yBAC1CqB,8BAA+BwB,EAAgBxB,8BAC/CC,4CACEuB,EAAgBvB,4CAClBxD,oCAAqC+E,EAAgB/E,sCAIlD,CACL+E,gBAAiBA,EACjBpF,QAASqG,EACThF,OAAQmE,GAAsB1jF,GAC/B,EDrF4C4jF,CAC3C/C,EACA7gF,IAGI,kBAAEwjF,EAAiB,YAAED,EAAW,SAAEE,GAAa7C,GACnDC,EACA7gF,GAGF,MAAO,CACLkf,OAAyB,OAAjBskE,QAAiB,IAAjBA,IAAqBF,EAC7B/D,OAA0B,QAApBp+E,EAAU,OAARsiF,QAAQ,IAARA,IAAYlE,SAAM,IAAAp+E,IAAI,CAAC,EAC/B+8E,QAA+B,QAAxBrpE,EAAa,OAAX0uE,QAAW,IAAXA,IAAerF,SAAO,IAAArpE,IAAI,CAAC,EACrC,EE3BUivE,GAAgCA,KAC3C,MAAM,EAAE9jF,GAAMC,YAAe,4CAqD7B,MAnD2D,CACzDukF,mDAAoDxkF,EAClD,0DACA,+EAEFykF,4DAA6DzkF,EAC3D,oEACA,kGAEF0kF,mEAAoE1kF,EAClE,+EACA,oGAEF2kF,wEAAyE3kF,EACvE,oFACA,kGAEF4kF,oEAAqE5kF,EACnE,gFACA,qGAEF6kF,yEAA0E7kF,EACxE,qFACA,mGAEF8kF,qEAAsE9kF,EACpE,iFACA,sGAEF+kF,0EAA2E/kF,EACzE,sFACA,oGAEFglF,qEAAsEhlF,EACpE,iFACA,sGAEFyhF,iEAAkEzhF,EAChE,4EACA,oGAEFilF,qEAAsEjlF,EACpE,gFACA,4GAEFklF,0EAA2EllF,EACzE,qFACA,0GAI6B,ECtDtBgkF,GAAgCA,KAC3C,MAAM,EAAEhkF,GAAMC,YAAe,4CAa7B,MAX2D,CACzD6hF,8BAA+B9hF,EAC7B,mCACA,8CAEF+hF,4CAA6C/hF,EAC3C,qDACA,gEAI6B,ECdtBkkF,GAA+CA,KAC1D,MAAM,EAAElkF,GAAMC,YAAe,4DAwC7B,MAtC0E,CACxE4iF,kCAAmC7iF,EACjC,qDACA,gEAEF8iF,6CAA8C9iF,EAC5C,kEACA,oFAEF+iF,kDAAmD/iF,EACjD,uEACA,kFAEFgjF,4CAA6ChjF,EAC3C,kEACA,uGAEFijF,iDAAkDjjF,EAChD,uEACA,wGAEFkjF,gCAAiCljF,EAC/B,mDACA,iEAEFmjF,qCAAsCnjF,EACpC,wDACA,+DAEFojF,2CAA4CpjF,EAC1C,+DACA,0EAEFqjF,kCAAmCrjF,EACjC,uDACA,yFAG4C,ECzCrCskF,GAA4CA,KACvD,MAAM,EAAEtkF,GAAMC,YAAe,wDAyC7B,MAvCuE,CACrE4iF,kCAAmC7iF,EACjC,uCACA,4DAEF8iF,6CAA8C9iF,EAC5C,oDACA,wHAEF+iF,kDAAmD/iF,EACjD,yDACA,sHAEFgjF,4CAA6ChjF,EAC3C,oDACA,2GAEFijF,iDAAkDjjF,EAChD,yDACA,yGAEFkjF,gCAAiCljF,EAC/B,qCACA,sEAEFmjF,qCAAsCnjF,EACpC,0CACA,oEAEFojF,2CAA4CpjF,EAC1C,iDACA,sEAEFqjF,kCAAmCrjF,EACjC,yCACA,qFAIyC,EC1ClCokF,GAA2CA,KACtD,MAAM,EAAEpkF,GAAMC,YAAe,wDAyC7B,MAvCsE,CACpEklF,6CAA8CnlF,EAC5C,oDACA,+DAEFmiF,qCAAsCniF,EACpC,gGACA,mHAEFolF,sFAAuFplF,EACrF,qGACA,iHAEFqiF,sCAAuCriF,EACrC,iGACA,oHAEFqlF,uFAAwFrlF,EACtF,sGACA,kHAEFuiF,uCAAwCviF,EACtC,kGACA,qHAEFslF,wFAAyFtlF,EACvF,uGACA,mHAEFyiF,iCAAkCziF,EAChC,0FACA,gHAEFulF,kFAAmFvlF,EACjF,+FACA,8GAIwC,ECjCjC2/E,GAA4Cx+E,IAAwB,IAAvB,cAAEy+E,GAAez+E,EACzE,MAAM,EAAEnB,GAAMC,YAAe,qBACvBulF,ECPN5F,KAEA,MAAM,KAAE14C,GAASvlC,gBACX,EAAE3B,GAAMC,YAAeinC,EAAO,qBAAuB,qBAErDu+C,EAAiBv+C,EAAO,oBAAsB,kBAC9Cw+C,EAAmBx+C,EAAO,2BAA6B,4BACvDy+C,EAAqBz+C,EACvB,6CACA,6CACE0+C,EAAqB1+C,EACvB,6CACA,6CACE2+C,EAAgC3+C,EAClC,kCACA,qDAEE4+C,EAA0C,CAC9C,CAACL,GAAiBzlF,EAAEknC,EAAO,oBAAsB,kBAAmBu+C,GACpE,sBAAyBzlF,EAAE,sBAAuB,uBAClD,CAAC0lF,GAAmB1lF,EAClBknC,EAAO,2BAA6B,4BACpCw+C,GAEF,CAACC,GAAqB3lF,EACpBknC,EACI,2CACA,2CACJy+C,GAEF,CAACC,GAAqB5lF,EACpBknC,EACI,2CACA,2CACJ0+C,GAEF,yBAA4B5lF,EAAE,yBAA0B,0BACxD,CAAC6lF,GAAgC7lF,EAC/BknC,EACI,kCACA,qDACJ2+C,GAEF,MAAW7lF,EAAE,QAAS,UAGxB,OAAO4/E,EAAc57E,KAAKiqD,IACjB,IAAKA,EAAK83B,mBAAoBD,EAAgB73B,EAAI83B,uBACzD,EDzC0BC,CAA2BpG,IAEjD,KAAE14C,GAASvlC,eAEXskF,EAA0B/+C,EAC5BlnC,EAAE,qBAAsB,6DACxBA,EACE,gBACA,uEAGN,OACE6C,cAACsoD,IAAS,CACRt+B,KAAyB,OAAnB24D,QAAmB,IAAnBA,IAAuB,GAC7B96B,QAAS,CACP,CACEwO,OAAQ+sB,EACRrtB,SAAU,qBACV70D,MAAO,QAET,CACEm1D,OAAQA,IAAMl5D,EAAE,SAAU,UAC1B44D,SAAU,0BACV70D,MAAO,eAET,CACEm1D,OAAQA,IAAMl5D,EAAE,oBAAqB,4CACrC44D,SAAU,+BACV70D,MAAO,cACP80D,KAAOC,GAAiCA,EAAU57C,MAAQ,MAG9D5Z,KAAK,KACL8nD,mBAAiB,EACjBC,mBAAiB,GACjB,EErCOw0B,GAA4C1+E,IAAoB,IAAnB,UAAE2+E,GAAW3+E,EACrE,MAAMS,EAAWC,cAEjB,OACEgB,cAACszB,IAAI,CACHrxB,QAAS,EACT6xB,aAAc/0B,EAAW,MAAQ,QACjCi1B,GAAI,EACJgU,oBAAqBjpC,EAAW,MAAQ,iBACxCsmC,UAAU,aAAYtlC,SAEZ,OAATk9E,QAAS,IAATA,OAAS,EAATA,EAAW97E,KAAI6Q,IAAA,IAAC,MAAEtT,EAAK,MAAE2b,GAAOrI,EAAA,OAC/BnS,eAACyzB,IAAI,CAAarxB,QAAS,EAAGojC,UAAU,YAAWtlC,SAAA,CACjDC,cAACoC,IAAG,CAAClC,SAAS,OAAOoB,WAAW,OAAO+jC,UAAU,iBAAgBtlC,SAC/DC,cAAA,UAAAD,SAASsa,MAEXra,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAAAtxB,SAAErB,QALDA,EAOJ,KAEJ,ECpBE2kF,GAAoD/kF,IAG1D,IAH2D,YAChEglF,EAAW,UACX9sC,GACDl4C,EACC,MAAM,EAAEnB,GAAMC,YAAe,sBAEtBgsE,EAAWC,GAAgB8T,GAAsBmG,GAExD,OACEtjF,cAAA0yB,WAAA,CAAA3yB,SACGqpE,EACCppE,cAAC2B,IAAI,CAACC,eAAe,WAAU7B,SAC7BF,eAAC8B,IAAI,CAACM,QAAS,EAAElC,SAAA,CACfC,cAACJ,IAAM,CACL,iBAAA/C,OAAgBymF,EAAW,kBAC3BpjF,SAAS,KACTM,QAAQ,YACRs9B,SAAU0Y,EACV10C,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBh5B,QAASA,IAAM8nE,GAAa,GAAOtpE,SAElC5C,EAAE,SAAU,YAEf6C,cAACJ,IAAM,CACL,iBAAA/C,OAAgBymF,EAAW,gBAC3BpjF,SAAS,KACTM,QAAQ,UACRkD,KAAK,SACLo6B,SAAU0Y,EACV1X,KAAI,cAAAjiC,OAAgBymF,EAAW,SAC/BxhF,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SAAUx6B,SAEhC5C,EAAE,OAAQ,eAKjB6C,cAAC2B,IAAI,CAACC,eAAe,WAAU7B,SAC7BC,cAACJ,IAAM,CACL,iBAAA/C,OAAgBymF,EAAW,gBAC3BpjF,SAAS,KACTM,QAAQ,YACRsB,EAAG,CAAEw4B,KAAM,OAAQC,GAAI,SACvBh5B,QAASA,IAAM8nE,GAAa,GAAMtpE,SAEjC5C,EAAE,OAAQ,aAIhB,ECtCMomF,GAAwCjlF,IAAgC,IAA/B,SAAE0K,EAAQ,YAAEs6E,GAAahlF,EAC7E,MAAM,EAAEnB,GAAMC,YAAe,qBAEvB09E,EAA6B1uD,YAAera,KAE3Cq3D,EAAWC,GAAgB8T,GAAsBmG,IACjD95E,GCvBPE,KAEA,MAAM0I,EAAuB8f,YAAevgB,IAEtCQ,EAAqB+f,YAAexgB,IAE1C,OAAOhI,IAAiBwzE,GAAeI,qBACnClrE,EACAD,CAAkB,EDeHqxE,CAAuBF,IAElCxxD,OAAQipD,EAAqB,UAAEvkC,GAAc7mB,MAE9C25C,EAAcC,GAAmB1jD,mBAAiBrc,IAClD+mE,EAAWkT,GAAgB59D,oBAAkB,GA6CpD,OANAif,qBAAU,KACHskC,GACHG,EAAgB//D,EAClB,GACC,CAAC4/D,EAAW5/D,IAGbxJ,cAAA0yB,WAAA,CAAA3yB,SACEF,eAACyzB,IAAI,CACHqO,aAAc,EACd9E,gBA9CAusC,EAAkB1oE,IAAQC,KAAK,KAC5B4vE,EAAY7vE,IAAQ6gC,QAAQ,IAAM7gC,IAAQo8B,KAAK,KA8ClDt9B,OAAM,aAAA3C,OA1CH0zE,EAAY7vE,IAAQ+oC,MAAM,KAAO,SA2CpC,sCAAA5sC,OAAqCymF,GACrCrhF,QAAS,EACTs5B,GAAI,EACJid,GAAI,EACJ4I,GAAI,EAAErhD,SAAA,CAENC,cAAC+8B,IAAQ,CAAC+sC,gBAAiB,EAAE/pE,SAC3BC,cAACimC,IAAO,CAACxlC,KAAK,IAAIK,GAAG,KAAIf,SACtBiJ,MAGLhJ,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAACoC,IAAG,CAACivB,EAAG,EAAGwL,gBAAiBn8B,IAAQ2gC,MAAMthC,SACvCqpE,EACCppE,cAAC4yB,IAAY,CAAA7yB,SACXC,cAAC6yB,IAAI,CAAC9vB,GAAE,cAAAlG,OAAgBymF,EAAW,SAASxwD,cAvDrCC,KACnB,IAAIxlB,EAAkC,CACpC4uE,WAAW,KACRrB,GAGDxR,GACEga,IAAgBpG,GAAeI,uBACjC/vE,EAAU,IAAKA,EAAS6E,qBAAsBk3D,IAE5Cga,IAAgBpG,GAAewG,qBACjCn2E,EAAU,IAAKA,EAAS4E,mBAAoBm3D,IAE9CyR,EAAsBxtE,EAAS,CAC7Bqe,UAAWA,KACTy9C,GAAa,GACboa,GAAa,GACbhxD,YAAW,IAAMgxD,GAAa,IAAQ9mF,EAAe,EAEvDywB,QAASA,KACPi8C,GAAa,EAAM,KAIvBA,GAAa,EACf,EA8BoFtpE,SACtEC,cAACyzB,IAAiB,CAChB,sCAAA52B,OAAqCymF,EAAW,aAChDntC,aAAcmzB,EACdvmE,GAAG,eACHrE,MAAOvB,EAAE,sBAAuB,YAChCgwC,KAAK,WACLja,SAAW3wB,GACTgnE,EAAgBhnE,EAAMqxB,OAAOvZ,OAE/BqZ,YAAav2B,EAAE,4BAA6B,4BAC5Cg2B,WAAY,CACVQ,UAAW,CACTtZ,MAAO,IACPgZ,QAASl2B,EACP,2BACA,iDAQZ0C,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAACpB,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,SAAUx6B,SAChCC,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,qBAE9B6C,cAAC2nC,KAAU,CAAC5G,GAAI,EAAG+iB,UAAU,aAAY/jD,SACvCC,cAAA,KAAAD,SAAIyJ,aAMdxJ,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAACqjF,GAAgB,CAACC,YAAaA,EAAa9sC,UAAWA,UAG1D,EEnIMmtC,GAAmBA,KAC9B,MAAM,EAAExmF,GAAMC,YAAe,qBAE7B,OACEyC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,SAAU,YAChC6C,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAAAtxB,SACH5C,EACC,0BACA,sZAIN0C,eAACyzB,IAAI,CAACrxB,QAAS,EAAGjB,GAAI,EAAEjB,SAAA,CACtBC,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAACujF,GAAU,CACTv6E,SAAU7L,EACR,wBACA,kOAEFmmF,YAAapG,GAAeI,yBAGhCt9E,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAACujF,GAAU,CACTv6E,SAAU7L,EACR,wBACA,8JAEFmmF,YAAapG,GAAewG,4BAIjC,EChCME,GAAoDtlF,IAA6B,IAA5B,SAAE0K,EAAQ,SAAEQ,GAAUlL,EACtF,MAAM,EAAEnB,GAAMC,YAAe,qBAE7B,OACEyC,eAACyzB,IAAI,CACHqO,aAAc,EACd9E,gBAAiBn8B,IAAQo8B,KAAK,KAC9B76B,QAAS,EACTs5B,GAAI,EACJid,GAAI,EACJ4I,GAAI,EACJ/b,UAAU,cAAatlC,SAAA,CAEvBC,cAAC+8B,IAAQ,CAAC+sC,gBAAiB,EAAE/pE,SAC3BC,cAACimC,IAAO,CAACxlC,KAAK,IAAIK,GAAG,KAAIf,SACtBiJ,MAGLnJ,eAACk9B,IAAQ,CAAC1L,EAAG,EAAGwL,gBAAiBn8B,IAAQ2gC,MAAOgE,UAAU,uBAAsBtlC,SAAA,CAC9EC,cAACoC,IAAG,CAACpB,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,SAAUx6B,SAChCC,cAAA,UAAAD,SAAS5C,EAAE,gBAAiB,qBAE9B6C,cAAC2nC,KAAU,CAAC5G,GAAI,EAAG+iB,UAAU,aAAY/jD,SACvCC,cAAA,KAAAD,SAAIyJ,WAGH,ECdE0yE,GAA6D59E,IAGnE,IAHoE,QACzEynC,EAAO,OACP1pB,GACD/d,EACC,MAAM,EAAEnB,GAAMC,YAAe,+BAErBif,OAAQwnE,EAAS,OAAEnH,EAAQrB,QAASoB,GAAYqE,GAAsBzkE,GAExEynE,EAAsD,CAC1D,wBACA,uBACA,gCACA,mCAGIz1D,EAAmBtwB,IACzB,YAAgByO,IAAZiwE,EAEA58E,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAA,UAAAD,SACEC,cAACwkD,GAAW,CAACze,QAASA,MAExB/lC,cAAA,WAASqlC,UAAU,YAAWtlC,SAC3B+qB,OAAOC,QAAQ0xD,GAASt7E,KAAI6Q,IAAA,IAAEhB,EAAKqJ,GAAMrI,EAAA,OACxCnS,eAAA,OAEEwlC,UACEy+C,EAAe/uD,SAAS/jB,GACpB,6BACA,WACLjR,SAAA,CAEDC,cAAC2nC,KAAU,CAAC3D,KAAK,IAAIrI,UAAU,OAAO0J,UAAU,kBAAiBtlC,SAC/DC,cAAC4iC,KAAIi6C,GAAE,CAACl4B,aAAc,EAAE5kD,SAAE28E,EAAO1rE,OAEnChR,cAAA,OAAKqlC,UAAU,mBAAkBtlC,SAC7BiR,IAAwBjH,GAAYwxE,sBACpCv7E,cAAC88E,GAAY,CAACC,cAAe1iE,IAE7Bra,cAAC+jF,GAAkB,CAAC9G,UAAW5iE,QAd9BrJ,EAiBD,MAGVnR,eAAA,WAASwlC,UAAU,iBAAgBtlC,SAAA,CACjCC,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,SAAU,YAChC6C,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAAAtxB,SACH5C,EACC,0BACA,sZAIN0C,eAACyzB,IAAI,CAAC+R,UAAU,eAActlC,SAAA,CAC5BC,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAAC4jF,GAAgB,CACf56E,SAAU7L,EACR,wBACA,kOAEFqM,SAAmB,OAATq6E,QAAS,IAATA,OAAS,EAATA,EAAWzxE,yBAGzBpS,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAAC4jF,GAAgB,CACf56E,SAAU7L,EACR,wBACA,8JAEFqM,SAAmB,OAATq6E,QAAS,IAATA,OAAS,EAATA,EAAW1xE,6BAK7BnS,cAAC+zB,IAAO,IACR/zB,cAAA,UAAAD,SACEC,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAACgU,UAAU,YAAWtlC,SAAA,GAAAlD,OAAKM,EAC/B,mBACA,oBACD,MAAAN,OAAKwxB,EAAiB,IAAIxrB,gBAM5B,IACT,EC5FWkhF,GAAwDzlF,IAAoB,IAAnB,UAAE2+E,GAAW3+E,EACjF,MAAM0lF,EAZsBC,KAC5B,MAAMC,EAAS,GAEf,IAAK,IAAIx3E,EAAI,EAAGA,EAAIu3E,EAAMvzE,OAAQhE,GAAK,EAAG,CACxC,MAAMy3E,EAAQF,EAAM33E,MAAMI,EAAGA,EAAI,GACjCw3E,EAAOr7C,KAAKs7C,EACd,CAEA,OAAOD,CAAM,EAIKE,CAAqBnH,GAEvC,OACEj9E,cAAA,OAAKqlC,UAAU,aAAYtlC,SACzBC,cAAA,SAAOqlC,UAAU,YAAWtlC,SAC1BC,cAAA,SAAOqlC,UAAU,YAAWtlC,SACzBikF,EAAU7iF,KAAI,CAACiqD,EAAK1+C,IACnB1M,cAAA,MAAIqlC,UAAU,SAAQtlC,SACnBqrD,EAAIjqD,KAAKkjF,GACRrkF,cAAA,MAAIqlC,UAAU,SAAQtlC,SACpBF,eAAA,OAAKwlC,UAAU,YAAWtlC,SAAA,CACxBC,cAAA,OAAKqlC,UAAU,iBAAgBtlC,SAC7BC,cAAA,UAAAD,SAASskF,EAAShqE,UAEpBra,cAAA,KAAAD,SAAIskF,EAAS3lF,YALW2lF,EAAS3lF,UAFbgO,UAe9B,EC1CG2vE,GAA0BzzD,GAAY,usJAAA/rB,OAwN7C+rB,EAAI,0BC/MG07D,GAA4BA,KACvC,MAAM,EAAEnnF,GAAMC,YAAe,qBAEvB6U,EAAama,YAAela,KAE1B8X,KAAM3N,GCHkBkoE,MAChC,MAAMtyE,EAAama,YAAela,IAC5BsyE,EAAyBl4D,YAAkB3a,IAC3C8yE,EAAoBn4D,YAAkB5a,IAE5C,OAAOtB,aACL,CAAC1C,GAAeO,mBAAoBgE,IACpC,IAAMhE,GAAmBgE,IACzB,IACKjC,GACH4b,UAAY5B,IACVw6D,EAAuBx6D,EAAK5X,sBAC5BqyE,EAAkBz6D,EAAK7X,mBAAmB,GAG/C,EDZwBoyE,IAEnB,KAAElgD,GAASvlC,eAEX4lF,EAAgC,OAANroE,QAAM,IAANA,KAAQsoE,uBAAsB,IAAA9nF,OACtDM,EAAE,MAAO,OAAM,KAAAN,OAAU,OAANwf,QAAM,IAANA,OAAM,EAANA,EAAQsoE,wBAC/B,GAEEC,EAAU,GAAA/nF,OAAMM,EAAE,eAAgB,aAAY,KAAAN,OAAIoV,GAClD4yE,EAAQ,GAAAhoF,OAAMM,EAAE,aAAc,gBAAe,KAAAN,OAAIoV,EAAa,GAC9D6yE,EAAqB,GAAAjoF,OAAMM,EAAE,qBAAsB,kBACnD4nF,EAAoB,GAAAloF,OAAMM,EAAE,oBAAqB,sBAEjD4oC,EAAO,GAAAlpC,OACXwnC,EAAOygD,EAAwBC,EAAoB,KAAAloF,OACjD+nF,EAAU,KAAA/nF,OAAIgoF,EAAQ,KAAAhoF,OAAI6nF,GAE9B,OACE1kF,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAC7Csc,IACEA,EAAO8+D,cACNn7E,cAACglF,GAAiB,CAACj/C,QAASA,EAAS1pB,OAAQA,IAE7Crc,cAACilF,GAAc,CAACl/C,QAASA,EAAS1pB,OAAQA,MAEpC,EEVH2oE,GAAsD1mF,IAA0B,IAAzB,QAAEynC,EAAO,OAAE1pB,GAAQ/d,EACrF,MAAMS,EAAWC,eACX,EAAE7B,GAAMC,YAAe,+BACvB,KAAEinC,GAASvlC,gBAETgzB,OAAQozD,EAAiB,UAAE1uC,GC1BnChgB,KAEA,MAAMvkB,EAAama,YAAela,IAClC,OAAOyZ,cAAY,IAAM8D,GAA+Bxd,IAAa,CACnE2Z,UAAY5B,IACV,MAAMsE,EAAOC,SAASC,cAAc,KACpCF,EAAKG,KAAOzE,EAAKoM,YACjB9H,EAAKsF,OAAS,SACdtF,EAAKM,SAAQ,GAAA/xB,OAAM25B,EAASsmC,WAAW,IAAK,KAAI,QAChDxuC,EAAKQ,OAAO,GAEd,EDe+Cq2D,CAC/C9gD,EAAI,GAAAxnC,OACGM,EAAE,yBAA0B,iBAAgB,KAAAN,OAAIwf,EAAOpK,YAAU,GAAApV,OACjEM,EAAE,oBAAqB,qBAAoB,KAAAN,OAAIwf,EAAOpK,cAGzD,OAAEyqE,EAAQrB,QAASoB,GAAYqE,GAAsBzkE,GAErDgS,EAAmBtwB,IAEzB,OACE8B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACwkD,GAAW,CAACze,QAASA,IACtB/lC,cAAC2B,IAAI,CACHC,eAAe,WACfC,WAAW,SACXoiC,cAAellC,EAAW,SAAW,MAAMgB,SAE3CC,cAACJ,IAAM,CACL42C,UAAWA,EACX1Y,UAAWzhB,EAAOoZ,KAClBh1B,KAAK,KACLD,QAAQ,YACRsB,EAAG/C,EAAW,OAAS,UACvBwC,QAAS2jF,EAAkBnlF,SAE1B5C,EAAE,kBAAmB,0BAI5B6C,cAACw8E,GAAY,CAACC,QAASA,EAASC,OAAQA,IACxC18E,cAAC+zB,IAAO,CAACC,GAAI,EAAG30B,YAAaqB,IAAQo8B,KAAK,OAC1C98B,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAE5C,EAAE,SAAU,YAChC6C,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAAAtxB,SACH5C,EACC,0BACA,sZAIN0C,eAACyzB,IAAI,CAACrxB,QAAS,EAAGjB,GAAI,EAAEjB,SAAA,CACtBC,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAAC4jF,GAAgB,CACf56E,SAAU7L,EACR,wBACA,kOAEFqM,SAAU6S,EAAOjK,yBAGrBpS,cAAC+8B,IAAQ,CAAAh9B,SACPC,cAAC4jF,GAAgB,CACf56E,SAAU7L,EACR,wBACA,8JAEFqM,SAAU6S,EAAOjK,4BAIvBpS,cAAC+zB,IAAO,CAACC,GAAI,EAAG30B,YAAaqB,IAAQo8B,KAAK,OAC1C98B,cAAC2nC,KAAU,CAACroC,MAAOoB,IAAQo8B,KAAK,KAAK/8B,SACnCC,cAAC4iC,KAAIvR,EAAC,CAACnxB,SAAU,sBAAsBH,SAAA,GAAAlD,OAAKM,EAC1C,sBACA,uBACD,KAAAN,OAAIwxB,EAAiBhS,EAAO8+D,sBAE9B,EEnFM8J,GAAgD3mF,IAA0B,IAAzB,QAAEynC,EAAO,OAAE1pB,GAAQ/d,EAC/E,MAAMS,EAAWC,eAEVomF,EAAWC,GAAgBx/D,oBAAkB,IAE9C,EAAE1oB,GAAMC,YAAe,2BAEvBgsE,EAAYh9C,YAAexa,IAC3BK,EAAama,YAAela,KAE5B,OAAEwqE,EAAQrB,QAASoB,GAAYqE,GAAsBzkE,GAGrDgS,EAAmBtwB,IAEzB,OACE8B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACwkD,GAAW,CAACze,QAASA,IACtB/lC,cAAC0+B,IAAgB,CACfn4B,OAAO,OACPrF,MAAOnC,EAAW,QAAU,cAC5B+oB,MAAK,GAAAjrB,OAAKM,EAAE,yBAA0B,wCAAuC,KAAAN,OAC3EoV,EAAa,GAEfzR,QAAQ,cAGX6b,GAAUrc,cAACw8E,GAAY,CAACC,QAASA,EAASC,OAAQA,IACnD18E,cAAC+zB,IAAO,CAACC,GAAI,EAAG30B,YAAaqB,IAAQo8B,KAAK,OAC1C98B,cAAC2jF,GAAM,IACP3jF,cAAC+zB,IAAO,CAACC,GAAI,EAAG30B,YAAaqB,IAAQo8B,KAAK,OAC1Cj9B,eAAC8B,IAAI,CACHC,eACEya,EAAOlT,cAAgBkT,EAAOlU,cAAgB,gBAAkB,WACjEpI,SAAA,CAEAsc,EAAOlT,cAAgBkT,EAAOlU,eAC7BnI,cAAC2nC,KAAU,CAACroC,MAAOoB,IAAQo8B,KAAK,KAAK/8B,SACnCC,cAAC4iC,KAAIvR,EAAC,CAACnxB,SAAU,sBAAsBH,SAAA,GAAAlD,OACjCM,EAAE,cAAe,eAAc,KAAAN,OAAIwxB,EACrChS,EAAOlT,cACR,KAAAtM,OAAIM,EAAE,KAAM,MAAMq+B,cAAa,KAAA3+B,OAAIwf,EAAOlU,mBAIjDnI,cAACJ,IAAM,CAACk+B,SAAUsrC,EAAW7nE,QAASA,IAAM8jF,GAAa,GAAMtlF,SAC5D5C,EAAE,WAAY,iBAGnB6C,cAAC66E,GAAe,CACd19C,OAAQioD,EACRhoD,QAxCclI,IAAMmwD,GAAa,GAyCjChpE,OAAQA,EACR0pB,QAASA,MAEV,ECvEMu/C,GAAmBA,CAC9BtiF,EACA6rB,EACAnC,EACA60B,EACA1+B,KAEO,CACL7f,OACA6rB,SACAnC,MAAY,OAALA,QAAK,IAALA,IAAS,GAChB/P,cAAe,GACf4kC,iBAAkC,OAAhBA,QAAgB,IAAhBA,KAClB1+B,aAA0B,OAAZA,QAAY,IAAZA,OAIL0iE,GAAmB,SAC9B3vE,EACAiZ,GAKkC,IADlCR,EAA6Ctb,UAAArC,OAAA,EAAAqC,UAAA,QAAAvG,EAE7C,MAAMg5E,EAA2C,CAC/CzvB,SAAUngD,EACVwgD,gBANSrjD,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,IAAAA,UAAA,IAOTsjD,OAAQA,IAAMxnC,EACd3tB,MATG6R,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,GAAAA,UAAA,GAAG,QAkBR,OAhBMA,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,IAAAA,UAAA,KAWJyyE,EAAWxvB,KAAQC,GACV5nC,EAAmBA,EAAiB4nC,EAAU57C,OAAS47C,EAAU57C,OAIrEmrE,CACT,EAEaC,GAAuB,SAClC7vE,EACAiZ,EACAR,GAEkB,OAElBk3D,GAAiB3vE,EAAQiZ,EAHpB9b,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,GAAAA,UAAA,GAAG,UACGA,UAAArC,OAAA,QAAAlE,IAAAuG,UAAA,KAAAA,UAAA,IAE0C,EAAMsb,EAAkB,EC7BlEq3D,GAAmBA,KAC9B,MAAM,EAAEvoF,GAAMC,YAAe,WACvBixB,EAAmBtwB,IAEnBoG,EAAYohF,GAAiB,YAAapoF,EAAE,YAAa,cAyD/D,MAAO,CACLw3D,qBAzD2B4wB,GAC3B,uBACApoF,EAAE,wBAAyB,0BAwD3BgH,YACAsC,SAvDe8+E,GAAiB,WAAYpoF,EAAE,WAAY,aAwD1DwoF,wBAvD8BF,GAC9B,0BACAtoF,EAAE,4BAA6B,6BAC/BkxB,GAqDAu3D,mBAnDyBL,GACzB,qBACApoF,EAAE,sBAAuB,wBAkDzBqJ,iBAhDuB++E,GACvB,mBACApoF,EAAE,oBAAqB,sBA+CvB0oF,yBA7C+BJ,GAC/B,2BACAtoF,EAAE,8BAA+B,+BACjCkxB,GA2CAy3D,4BAzCkCL,GAClC,8BACAtoF,EAAE,iCAAkC,kCACpCkxB,GAuCA03D,qBArC2BN,GAC3B,uBACAtoF,EAAE,yBAA0B,4BAC5BkxB,GAmCA23D,uBAjC6BT,GAC7B,yBACApoF,EAAE,2BAA4B,yBAgC9B8oF,yBA9B+BV,GAC/B,2BACApoF,EAAE,6BAA8B,iCA6BhC+oF,sBA3B4BT,GAC5B,wBACAtoF,EAAE,0BAA2B,qCAC7BkxB,GAyBA60D,mBAtByBqC,GACzB,qBACApoF,EAAE,uBAAwB,yBAqB1BgpF,YAlBkBZ,GAAiB,cAAepoF,EAAE,eAAgB,iBAmBpEuM,aAjBmB67E,GAAiB,eAAgBpoF,EAAE,gBAAiB,kBAkBxE,EC7EUipF,GAAmBA,KAC9B,MAAM,EAAEjpF,GAAMC,YAAe,YACrB4sB,KAAMq8D,GAAoBh5D,MAC1BrD,KAAMs8D,GAAmBh5D,MACzBtD,KAAMu8D,GClBdn2E,aAAS,CAAC1C,GAAea,oBAAoB,IAAMA,MAAqByB,KDmBhEga,KAAMw8D,GAA0Bj5D,MAChCvD,KAAMy8D,GEnBZr2E,aACE,CAAC1C,GAAec,6BAChBA,GACAwB,KFiBIga,KAAM08D,GAA+B92D,MACrC5F,KAAM2gD,GAAsB16C,KAsCpC,MAAO,CACLrQ,aArCmB0lE,GACnB,eACAnoF,EAAE,YAAa,aACA,OAAfkpF,QAAe,IAAfA,OAAe,EAAfA,EAAiBM,aAmCjBC,wBAjC8BtB,GAC9B,0BACAnoF,EAAE,WAAY,YACA,OAAdmpF,QAAc,IAAdA,OAAc,EAAdA,EAAgBO,YA+BhBC,sBA7B4BxB,GAC5B,wBACAnoF,EAAE,sBAAuB,uBACD,OAAxBopF,QAAwB,IAAxBA,OAAwB,EAAxBA,EAA0B31B,UA2B1Bm2B,oBAzB0BzB,GAC1B,sBACAnoF,EAAE,oBAAqB,qBACF,OAArBqpF,QAAqB,IAArBA,OAAqB,EAArBA,EAAuBQ,mBAuBvBC,0BArBgC3B,GAChC,4BACAnoF,EAAE,2BAA4B,4BACF,OAA5BspF,QAA4B,IAA5BA,OAA4B,EAA5BA,EAA8B71B,UAmB9Bs2B,sBAjB4B5B,GAC5B,wBACAnoF,EAAE,uBAAwB,wBACA,OAA1BupF,QAA0B,IAA1BA,OAA0B,EAA1BA,EAA4B9d,wBAe5Bue,gBAbsB7B,GACtB,kBACAnoF,EAAE,gBAAiB,iBACF,OAAjBwtE,QAAiB,IAAjBA,OAAiB,EAAjBA,EAAmBK,eAWpB,EGjEI,IAAKoc,GAAO,SAAPA,GAAO,OAAPA,EAAO,4BAAPA,EAAO,sBAAPA,EAAO,sCAAPA,EAAO,8BAAPA,EAAO,4CAAPA,EAAO,kCAAPA,EAAO,0CAAPA,CAAO,MAUZ,MAAMC,GAAaA,KACxB,MAAM,EAAElqF,GAAMC,YAAe,YACvB,KAAEinC,GAASvlC,eAiFjB,MAAO,CA/EyB,CAC9BkE,KAAMqhC,EAAO+iD,GAAQE,aAAeF,GAAQG,UAC5C14D,OAAQwV,EACJlnC,EAAE,qBAAsB,iBACxBA,EAAE,oBAAqB,qBAC3BiG,YAAaihC,EACTlnC,EACE,iCACA,sDAEFA,EACE,gCACA,0DAEN0qD,QAAS,GACTrrC,eAAe,EACfgrE,iBAAiB,GAGqB,CACtCxkF,KAAMokF,GAAQK,kBACd54D,OAAQ1xB,EAAE,4BAA6B,6BACvCiG,YAAajG,EACX,wCACA,6FAEF0qD,QAAS6/B,KACTlrE,eAAe,EACfgrE,iBAAiB,GAGiB,CAClCxkF,KAAMokF,GAAQrK,cACdluD,OAAQ1xB,EAAE,uBAAwB,yBAClCiG,YAAajG,EACX,mCACA,oFAEF0qD,QAAS8/B,KACTnrE,eAAe,EACfgrE,iBAAiB,GAGwB,CACzCxkF,KAAMokF,GAAQQ,qBACd/4D,OAAQ1xB,EAAE,+BAAgC,gCAC1CiG,YAAajG,EACX,2CACA,gEAEF0qD,QAASggC,KACTrrE,eAAe,EACfgrE,iBAAiB,GAGmB,CACpCxkF,KAAMokF,GAAQU,gBACdj5D,OAAQ1xB,EAAE,2BAA4B,4BACtCiG,YAAajG,EACX,uCACA,2EAEF0qD,QAASkgC,KACTvrE,eAAe,EACfgrE,iBAAiB,GAGuB,CACxCxkF,KAAMokF,GAAQY,oBACdn5D,OAAQ1xB,EAAE,gCAAiC,mCAC3CiG,YAAajG,EACX,4CACA,0FAEF0qD,QAASogC,KACTzrE,eAAe,EACfgrE,iBAAiB,GAUlB,EC9GUE,GAA8BA,KACzC,MAAM,iBACJlhF,EAAgB,qBAChBmuD,EAAoB,UACpBxwD,EAAS,SACTsC,EAAQ,wBACRk/E,EAAuB,yBACvBE,EAAwB,qBACxBE,EAAoB,sBACpBG,EAAqB,4BACrBJ,EAA2B,uBAC3BE,EAAsB,yBACtBC,GACEP,KAEJ,MAAO,CACLl/E,EACAmuD,EACAxwD,EACAsC,EACAk/E,EACAE,EACAE,EACAG,EACAJ,EACAE,EACAC,EACD,EC3BUiC,GAA8BA,KACzC,MAAM,oBACJnB,EAAmB,aACnBnnE,EAAY,wBACZgnE,EAAuB,0BACvBK,GACEb,KAEJ,MAAO,CACLW,EACAnnE,EACAgnE,EACAK,EACD,ECVUkB,GAAoCA,KCA/Ct6D,GAAcngB,GAAee,2BAA4BA,IDEzD,MAAMg4C,EAAUyhC,MACRp2D,OAAQs2D,GAAcr5D,KAE9B,OAAO/uB,cAACqoF,GAAU,CAAC5hC,QAASA,EAAS2hC,UAAWA,GAAa,EELlDE,GAA0CA,KACrD,MAAM7hC,EAAUyhC,MACRp2D,OAAQs2D,GAAcr5D,KAE9B,OAAO/uB,cAACuoF,GAAiB,CAAC9hC,QAASA,EAAS2hC,UAAWA,GAAa,ECPzDT,GAAyBA,KACpC,MAAM,iBACJnhF,EAAgB,qBAChBmuD,EAAoB,UACpBxwD,EAAS,SACTsC,EAAQ,wBACRk/E,EAAuB,yBACvBE,EAAwB,4BACxBC,EAA2B,mBAC3B5C,EAAkB,YAClBiD,EAAW,aACXz8E,GACEg8E,KAEJ,MAAO,CACLl/E,EACAmuD,EACAxwD,EACAsC,EACAk/E,EACAE,EACAC,EACA5C,EACAiD,EACAz8E,EACD,ECzBU8+E,GAAyBA,KACpC,MAAM,oBACJzB,EAAmB,aACnBnnE,EAAY,wBACZgnE,EAAuB,sBACvBM,EAAqB,gBACrBC,GACEf,KAEJ,MAAO,CACLW,EACAnnE,EACAgnE,EACAM,EACAC,EACD,ECZUsB,GAAgCA,KCA3C56D,GAAcngB,GAAe2B,uBAAwBA,IDErD,MAAMo3C,EAAU+hC,MACR12D,OAAQs2D,GAAcn5D,KAE9B,OAAOjvB,cAACqoF,GAAU,CAAC5hC,QAASA,EAAS2hC,UAAWA,GAAa,EELlDM,GAAsCA,KACjD,MAAMjiC,EAAU+hC,MACR12D,OAAQs2D,GAAcn5D,KAE9B,OAAOjvB,cAACuoF,GAAiB,CAAC9hC,QAASA,EAAS2hC,UAAWA,GAAa,ECPzDP,GAAgCA,KAC3C,MAAM,iBACJrhF,EAAgB,qBAChBmuD,EAAoB,UACpBxwD,EAAS,SACTsC,EAAQ,wBACRk/E,EAAuB,yBACvBE,EAAwB,mBACxBD,GACEF,KAEJ,MAAO,CACLl/E,EACAmuD,EACAxwD,EACAsC,EACAk/E,EACAE,EACAD,EACD,ECnBU+C,GAAgCA,KAC3C,MAAM,oBAAE5B,EAAmB,aAAEnnE,EAAY,wBAAEgnE,EAAuB,sBAAEE,GAClEV,KAEF,MAAO,CAACW,EAAqBnnE,EAAcgnE,EAAyBE,EAAsB,ECD/E8B,GAAuCA,KCAlD/6D,GAAcngB,GAAe4B,8BAA+BA,IDE5D,MAAMm3C,EAAUkiC,MACR72D,OAAQs2D,GAAcj5D,KAE9B,OAAOnvB,cAACqoF,GAAU,CAAC5hC,QAASA,EAAS2hC,UAAWA,GAAa,EELlDS,GAA6CA,KACxD,MAAMpiC,EAAUkiC,MACR72D,OAAQs2D,GAAcj5D,KAE9B,OAAOnvB,cAACuoF,GAAiB,CAAC9hC,QAASA,EAAS2hC,UAAWA,GAAa,ECPzDL,GAA4BA,KACvC,MAAM,iBACJvhF,EAAgB,qBAChBmuD,EAAoB,UACpBxwD,EAAS,SACTsC,EAAQ,wBACRk/E,EAAuB,yBACvBE,EAAwB,4BACxBC,EAA2B,aAC3Bp8E,GACEg8E,KAEJ,MAAO,CACLl/E,EACAmuD,EACAxwD,EACAsC,EACAk/E,EACAE,EACAC,EACAp8E,EACD,ECrBUo/E,GAA4BA,KACvC,MAAM,oBAAE/B,EAAmB,aAAEnnE,EAAY,wBAAEgnE,EAAuB,gBAAEO,GAClEf,KAEF,MAAO,CAACW,EAAqBnnE,EAAcgnE,EAAyBO,EAAgB,ECDzE4B,GAAkCA,KCA7Cl7D,GAAcngB,GAAe6B,yBAA0BA,IDEvD,MAAMk3C,EAAUqiC,MACRh3D,OAAQs2D,GAAc/4D,KAE9B,OAAOrvB,cAACqoF,GAAU,CAAC5hC,QAASA,EAAS2hC,UAAWA,GAAa,EELlDY,GAAwCA,KACnD,MAAMviC,EAAUqiC,MACRh3D,OAAQs2D,GAAc/4D,KAE9B,OAAOrvB,cAACuoF,GAAiB,CAAC9hC,QAASA,EAAS2hC,UAAWA,GAAa,ECPzDH,GAAgCA,KAC3C,MAAM,iBACJzhF,EAAgB,qBAChBmuD,EAAoB,UACpBxwD,EAAS,SACTsC,EAAQ,wBACRk/E,EAAuB,yBACvBE,EAAwB,4BACxBC,EAA2B,aAC3Bp8E,GACEg8E,KAEJ,MAAO,CACLl/E,EACAmuD,EACAxwD,EACAsC,EACAk/E,EACAE,EACAC,EACAp8E,EACD,ECrBUu/E,GAAgCA,KAC3C,MAAM,oBAAElC,EAAmB,aAAEnnE,EAAY,wBAAEgnE,EAAuB,gBAAEO,GAClEf,KAEF,MAAO,CAACW,EAAqBnnE,EAAcgnE,EAAyBO,EAAgB,ECDzE+B,GAAsCA,KCAjDr7D,GAAcngB,GAAe8B,6BAA8BA,IDE3D,MAAMi3C,EAAUwiC,MACRn3D,OAAQs2D,GAAc74D,KAE9B,OAAOvvB,cAACqoF,GAAU,CAAC5hC,QAASA,EAAS2hC,UAAWA,GAAa,EELlDe,GAA4CA,KACvD,MAAM1iC,EAAUwiC,MACRn3D,OAAQs2D,GAAc74D,KAE9B,OAAOvvB,cAACuoF,GAAiB,CAAC9hC,QAASA,EAAS2hC,UAAWA,GAAa,ECkBzDC,GAAwC/pF,IAA6B,IAA5B,QAAEmoD,EAAO,UAAE2hC,GAAW9pF,EAC1E,MAAM,EAAEnB,GAAMC,YAAe,WACvB,KAAE4F,GAAS6uB,cACXu1D,EAAUC,KACVx5C,EAAWtJ,iBAAO,OAEjBloB,EAAQ+sE,GAAal3D,YAAe3W,IACrC8tE,EAAaj9D,YAAepQ,IAC5BstE,EAAmBl9D,YAAenQ,IAClCstE,EAAen9D,YAAelQ,IAC9BstE,EAAyBl9D,YAAkB1Q,IAC3C6tE,EAA6Bn9D,YAAkBzQ,IAErDipB,qBAAU,KACR,IAAKzoB,GAAUrZ,EAAM,CACnB,MAAM0mF,EAAgBtC,EAAQ7oD,MAAM3b,GAAMA,EAAE5f,OAASA,IACjD0mF,GACFN,EAAUM,EAEd,IACC,CAACtC,EAAS/qE,EAAQ+sE,EAAWpmF,IAYhC,OACEhD,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAC7Csc,GACCxc,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACoC,IAAG,CAAArC,SACFF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfF,eAAC8B,IAAI,CAACC,eAAe,gBAAe7B,SAAA,CAClCC,cAACwkD,GAAW,CAACze,QAAS1pB,EAAOwS,SAC7B7uB,cAACJ,IAAM,CACLa,KAAK,KACLqB,EAAE,QACFtB,QAAQ,YACRe,QAASA,IAAM6mF,EAAU,CAAC,GAAGroF,SAE5B5C,EAAE,SAAU,mBAGjB6C,cAAA,KAAAD,SAAIsc,EAAOjZ,iBAEZiZ,EAAOG,eACN3c,eAAC8B,IAAI,CACHC,eAAe,gBACfpC,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAc,EACdtQ,EAAG,EACHrwB,GAAI,EAAEjB,SAAA,CAENC,cAAC2pF,GAAW,IACZ3pF,cAACJ,IAAM,CAAC8D,KAAK,SAASo7B,KAAK,oBAAmB/+B,SAC3C5C,EAAE,gBAAiB,sBAI1B6C,cAAC4pF,GAAa,CAACnjC,QAASA,SAG5BzmD,cAACoC,IAAG,CAAC8iC,IAAK2I,EAAUxP,SAAS,SAAQt+B,SACnCC,cAACsoD,IAAS,CACR3lD,WAAW,SACX8lD,kCAAgC,EAChCz+B,KAAgB,OAAVq/D,QAAU,IAAVA,IAAc,GACpBxhC,QAASxrC,EAAOwrC,QAChBa,cArDe90C,IAAmC,IAAD+0C,EAAAC,EAAAmvB,EAAAlvB,EAAAC,EAC3D,MAAMixB,EAA+B,QAAfpxB,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB7lD,GACtCi3E,EAA8C,QAA1BjC,EAAe,QAAflvB,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB3sC,YAAI,IAAA47D,KAEhDgC,IACFyP,EAAuBzP,GACvB0P,EAA2BzP,GAC7B,EA+CUv5E,KAAK,KACLsX,OAAQwxE,EACRhhC,mBAAiB,EACjBC,mBAAiB,EACjBS,cAAY,EACZpoD,GAAI,CACF,6BAA8B,CAC5BV,SAAU,cAKlBH,cAACoC,IAAG,CAAArC,SACFC,cAAC4tC,GAAmB,CAClB9jB,eAAgBw/D,EAChBjkE,gBAAiBtJ,GACjBuJ,cAAexJ,GACf+xB,SAAUA,EACVC,wBAAyB,YAKvB,ECpHH+7C,GAA8DvrF,IAEpE,IAFqE,WAC1Ey5B,GACDz5B,EACC,OAAQy5B,GACN,KAAKqvD,GAAQK,kBACX,OAAOznF,cAACsoF,GAA6B,IACvC,KAAKlB,GAAQrK,cACX,OAAO/8E,cAAC0oF,GAAyB,IACnC,KAAKtB,GAAQQ,qBACX,OAAO5nF,cAAC6oF,GAAgC,IAC1C,KAAKzB,GAAQU,gBACX,OAAO9nF,cAACgpF,GAA2B,IACrC,KAAK5B,GAAQY,oBACX,OAAOhoF,cAACmpF,GAA+B,IACzC,QACE,OAAOnpF,cAAA0yB,WAAA,IACX,ECGW61D,GAAsDjqF,IAG5D,IAH6D,QAClEmoD,EAAO,UACP2hC,GACD9pF,EACC,MAAM,EAAEnB,GAAMC,YAAe,YACvB,KAAE4F,GAAS6uB,cACXu1D,EAAUC,MAEThrE,EAAQ+sE,GAAal3D,YAAe3W,IACrCuuE,EAAmB19D,YAAe5Q,IAClC2hB,EAAS/Q,YAAe9Q,IACxByuE,EAAcv1D,YAAoBlZ,IAExCwpB,qBAAU,KACR,IAAKzoB,GAAUrZ,EAAM,CACnB,MAAM0mF,EAAgBtC,EAAQ7oD,MAAM3b,GAAMA,EAAE5f,OAASA,IACjD0mF,GACFN,EAAUM,EAEd,IACC,CAACtC,EAAS/qE,EAAQ+sE,EAAWpmF,IAEhC,MAAMgnF,EAAmBA,KACvBD,GAAa,EAGf,OACElqF,eAAC8+B,GAAW,CAACxB,OAAQA,EAAQC,QAAS4sD,EAAiBjqF,SAAA,CACrDF,eAACo+B,KAAW,CAAAl+B,SAAA,CACT5C,EAAE,mBAAoB,oBACvB6C,cAACm+B,KAAgB,OAEnBn+B,cAACo+B,KAAS,CACR,aAAYjhC,EAAE,yBAA0B,0BACxC8D,UAAU,SAAQlB,SAEjBsc,GACCxc,eAACkiC,KAAM,CACLlgC,WAAW,aACXqgC,QAAS,EACTF,QACEhiC,cAACoC,IAAG,CACFN,EAAE,QACF0vB,EAAE,MACFF,GAAI5wB,IAAQo8B,KAAK,KACjBqH,GAAI,CAAE7J,KAAM,mBAAoByM,GAAI,oBACpCkjD,kBAAmB,iBAEtBlqF,SAAA,CAEDF,eAACyzB,IAAI,CAAC8tB,GAAI,EAAGn/C,QAAS,EAAElC,SAAA,CACtBC,cAAC6zB,KAAI,CAAA9zB,SACFsc,EAAOG,cACJrf,EACE,6BACA,8GAEFA,EACE,wBACA,+FAGR6C,cAAC6zB,KAAI,CAAA9zB,SACF5C,EACC,oBACA,6DAKN0C,eAACyzB,IAAI,CAACyN,GAAI,EAAG9+B,QAAS,EAAElC,SAAA,CACtBC,cAAC6zB,KAAI,CAAA9zB,SAAE5C,EAAE,kBAAmB,qBAC5B6C,cAACimC,IAAO,CAACxlC,KAAK,KAAIV,SAAEsc,EAAOwS,YAG5BxS,EAAOG,eACNxc,cAACoC,IAAG,CAAC2+B,GAAI,EAAEhhC,SACTC,cAAC2pF,GAAW,MAIhB3pF,cAACoC,IAAG,CAAC2+B,GAAI,EAAGj/B,EAAE,OAAM/B,SAClBC,cAAC4pF,GAAa,CAACnjC,QAASA,EAASE,aAAa,WAMtD3mD,cAAC4+B,KAAW,CAACtN,GAAI5wB,IAAQo8B,KAAK,KAAK/8B,SACjCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CACLi/B,aAAW,EACXn7B,KAAK,SACLo7B,KAAK,oBACLwG,YAAawkD,EACbvoF,QAASA,IAAM6mF,EAAU,CAAC,GAAGroF,SAE5B5C,EAAE,SAAU,gBAEf6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAASyoF,EAAiBjqF,SAC9D5C,EAAE,SAAU,mBAIP,ECxHL+sF,GAAwC5rF,IAA4B,IAA3B,OAAE+d,EAAM,UAAE8tE,GAAW7rF,EACzE,MAAM,EAAEnB,GAAMC,YAAe,WACvB2B,EAAWC,cAEjB,OACEgB,cAACoC,IAAG,CACF5C,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAc,EACdtQ,EAAG,EACH8R,UAAU,oCACV,cAAa9mB,EAAOwS,OAAO2M,cAAcpnB,QAAQ,IAAK,KAAO,QAAQrU,SAErEC,cAACoC,IAAG,CAAChD,OAAO,QAAOW,SACjBF,eAACyzB,IAAI,CAACl0B,OAAO,OAAMW,SAAA,CACjBF,eAACuC,IAAG,CAAArC,SAAA,CACFC,cAAC2nC,KAAU,CAAA5nC,SACTC,cAAA,MAAAD,SAAKsc,EAAOwS,WAEd7uB,cAAC2nC,KAAU,CAACznC,SAAS,KAAKoB,WAAW,OAAON,GAAI,EAAEjB,SAC/Csc,EAAOjZ,iBAGZpD,cAACJ,IAAM,CACLa,KAAM1B,EAAW,KAAO,KACxByB,QAAQ,YACR0/C,UAAU,MACV5/C,UAAWN,cAACoqF,IAAY,IACxB7oF,QAAS4oF,EAAUpqF,SAElB5C,EAAE,aAAc,sBAInB,ECpCGwsF,GAAyCrrF,IAAmB,IAAlB,SAAEouC,GAAUpuC,EACjE,MAAM,EAAEnB,GAAMC,YAAe,WAEtBitF,EAAiBC,GAAsBp4D,YAAe1W,KACtD+uE,EAAeC,GAAoBt4D,YAAezW,IAEzD,OACEzb,cAACksC,GAAU,CACTI,iBAAkB+9C,EAClB99C,eAAgBg+C,EAChB/9C,eAAgB89C,EAChB79C,aAAc+9C,EACdn+C,WAAYlvC,EAAE,6BAA8B,8BAC5CuvC,SAAUA,GACV,ECbOk9C,GAA8CtrF,IAGpD,IAHqD,QAC1DmoD,EAAO,YACPE,GAAc,GACfroD,EACC,MAAOmsF,EAAeC,GAAoBx4D,YAAexW,IAMzD,OALAopB,qBAAU,KACR4lD,EAAiBjkC,EAAQ,GAExB,IAGDzmD,cAACwmD,GAAoB,CACnBC,QAASgkC,EACT/jC,qBAAuBikC,GAAaD,EAAiBC,GACrDhkC,YAAaA,EACbC,gBAAgB,EAChB3gC,gBAAiBtK,IACjB,ECpBOivE,GAA6CtsF,IAAmB,IAAlB,SAAEusF,GAAUvsF,EACrE,MAAM,EAAEnB,GAAMC,YAAe,UAE7B,OACE4C,cAACisC,KAAK,CACJ9Q,QAAQ,OACRt5B,WAAW,SACXD,eAAe,SACf1B,SAAS,KACT0C,GAAI,EACJ1B,MAAM,WACN9B,OAAO,OACPkyB,GAAIu5D,EAAWnqF,IAAQ6gC,QAAQ,IAAM7gC,IAAQ+qC,OAAO,KACpDnsC,MAAOoB,IAAQ8qC,MAAM,KAAKzrC,SAEzB8qF,EAAW1tF,EAAE,WAAY,YAAcA,EAAE,QAAS,UAC7C,ECFC2tF,GAA8CxsF,IAAmB,IAADysF,EAAA,IAAjB,SAAEr+C,GAAUpuC,EACtE,MAAM,EAAEnB,GAAMC,YAAe,UACvBquB,EAAcC,eAEbs/D,EAAqBC,GAA0B/4D,YACpDhgB,KAGKg5E,EAAeC,GAAoBtlE,mBAAiBmlE,IAEnDhhE,KAAMxgB,GC3Bd4G,aAAS,CAAC1C,GAAeS,qBAAsBA,GAAqB6B,IDuCpE,OAAOxG,EACLxJ,cAAC4yB,IAAY,CAACua,KAAK,WAAUptC,SAC3BC,cAAC6yB,IAAI,CAAC9vB,GAAG,oBAAoB+vB,cAZZC,KACnBk4D,EAAuBC,GACvBz/D,EAAYI,kBAAkB,CAAEC,SAAU,CAACpe,GAAeO,sBAClD,OAARy+B,QAAQ,IAARA,MAAY,EAS+C3sC,SACvDF,eAAC+7B,KAAW,CAAC16B,MAAM,OAAMnB,SAAA,CACvBF,eAACq7B,KAAS,CAACn4B,GAAG,yBAAyBwyC,QAAQ,2BAA0Bx1C,SAAA,CACtE5C,EAAE,iBAAkB,kBAAkB,OAEzC6C,cAACs2C,MAAM,CACLpjB,SAZYk4D,IACpBD,GAAkBC,EAAe,EAYzB,kBAAgB,yBAChBl1C,QAAQ,2BACR77B,MAAO6wE,EACPppF,EAAE,QACF,aAAW,wBAAuB/B,SAEA,QAFAgrF,EAEjCvhF,EAAS6hF,gCAAwB,IAAAN,OAAA,EAAjCA,EAAmC5pF,KAAKkb,GACvCrc,cAAA,UAAgCqa,MAAOgC,EAAOpK,WAAWlS,SACvDF,eAAC8B,KAAI,CAACC,eAAe,gBAAgB2xB,IAAK,EAAExzB,SAAA,CAC1CC,cAAC2nC,MAAU,CAAA5nC,SACTC,cAAC4iC,KAAIvR,EAAC,CAAAtxB,SAAA,GAAAlD,OACAM,EAAE,UAAW,aAAY,KAAAN,OAAIwf,EAAOpK,WAAU,KAAApV,OAAIM,EACpD,WACA,kBACD,KAAAN,OAAIwf,EAAOpK,WAAa,OAG7BjS,cAAC4qF,GAAe,CAACC,WAAYxuE,EAAO8+D,oBAV3B9+D,EAAOpK,uBAmB9BjS,cAACgqC,MAAO,GACT,EE/DUshD,GAAwBA,KACnC,MAAM,EAAEnuF,GAAMC,YAAe,gBAEvBif,EAAS+P,YAAe7Q,IACxBxc,EAAWC,eACX,iBAAE84B,GAAqBnB,KAEvBwG,EAAS/Q,YAAe/Q,IACxB0uE,EAAcv1D,YAAoBnZ,IAElC6Z,EAAcA,IAAM60D,IAEpBh3D,EAAeA,KACf1W,IACF0tE,IACAjyD,EAAiBzb,EAAOrZ,MAC1B,EAGF,OAAOjE,EACLc,eAAC8+B,GAAW,CAACxB,OAAQA,EAAQC,QAASlI,EAAYn1B,SAAA,CAC/Csc,GAAUrc,cAACurF,GAAwB,CAACx4D,aAAcA,EAAc1W,OAAQA,IACzErc,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACyzB,IAAI,CAACrxB,QAAS,EAAGH,EAAE,OAAM/B,SAAA,CACxBC,cAACJ,IAAM,CAACi/B,aAAW,EAACn7B,KAAK,SAASo7B,KAAK,oBAAmB/+B,SACvD5C,EAAE,yBAA0B,gBAE/B6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAAS2zB,EAAYn1B,SACzD5C,EAAE,qBAAsB,oBAMjC0C,eAACk/B,KAAK,CAAC5B,OAAQA,EAAQC,QAASlI,EAAYn1B,SAAA,CAC1CC,cAACg/B,KAAY,IACbn/B,eAACo/B,KAAY,CAAAl/B,SAAA,CACVsc,GAAUrc,cAACurF,GAAwB,CAACx4D,aAAcA,EAAc1W,OAAQA,IAEzErc,cAAC4+B,KAAW,CAACh9B,eAAe,MAAK7B,SAC/BF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAACJ,IAAM,CAACY,QAAQ,WAAWe,QAAS2zB,EAAYn1B,SAC7C5C,EAAE,qBAAsB,YAE3B6C,cAACJ,IAAM,CAAC8D,KAAK,SAASo7B,KAAK,oBAAmB/+B,SAC3C5C,EAAE,yBAA0B,0BAMxC,EC1DUquF,GAAwDltF,IAI9D,IAJ+D,UACpEmtF,EAAS,aACTC,EAAY,SACZ3rF,GACDzB,EACC,MAAM,EAAEnB,GAAMC,YAAe,gBAE7B,OACEyC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEF,eAACo+B,KAAW,CAAC,aAAY9gC,EAAE,eAAgB,gBAAgB4C,SAAA,CACzDF,eAACyzB,IAAI,CAACQ,aAAa,SAAS7xB,QAAS,EAAElC,SAAA,CACrCC,cAAC2rF,IAAa,CAACrsF,MAAOoB,IAAQC,KAAK,OACnCX,cAAA,QAAAD,SAAO0rF,OAETzrF,cAACm+B,KAAgB,OAEnBt+B,eAACu+B,KAAS,CAACC,SAAS,UAAUhN,EAAE,eAActxB,SAAA,CAC5CC,cAACoC,IAAG,CACFkvB,GAAI5wB,IAAQo8B,KAAK,KACjB6G,UAAS,aAAA9mC,OAAe6D,IAAQo8B,KAAK,MACrCwE,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCvB,GAAI,EACJwF,GAAI,EAAEhhC,SAENC,cAAA,KAAAD,SAAI2rF,MAEN1rF,cAACszB,IAAI,CAAC1xB,eAAe,SAASC,WAAW,SAASk/B,GAAI,EAAEhhC,SACrDA,SAGJ,EC7BMwrF,GAAoEjtF,IAG1E,IAH2E,aAChFy0B,EAAY,OACZ1W,GACD/d,EACC,MAAM,EAAEnB,GAAMC,YAAe,gBAE7B,OAAOif,EAAOrZ,OAASokF,GAAQG,UAC7BvnF,cAACwrF,GAAkB,CACjBC,UAAWtuF,EAAE,wBAAyB,yBACtCuuF,aAAcvuF,EAAE,yBAA0B,8CAA8C4C,SAExFC,cAAC8qF,GAAgB,CAACp+C,SAAU3Z,MAG9B/yB,cAACwrF,GAAkB,CACjBC,UAAWtuF,EAAE,oBAAqB,qBAClCuuF,aAAcvuF,EAAE,eAAgB,wDAAwD4C,SAExFC,cAAC2pF,GAAW,CAACj9C,SAAU3Z,KAE1B,EClBU64D,GAAmBA,KAC9B,MAAM,KAAE5oF,GAAS6uB,eACX,KAAEwS,GAASvlC,eAIjB,OAAQkE,GACN,KAHwBqhC,EAAO+iD,GAAQE,aAAeF,GAAQG,UAI5D,OAAOvnF,cAACskF,GAAe,IACzB,KAAK8C,GAAQK,kBACX,OAAOznF,cAACmoF,GAAuB,IACjC,KAAKf,GAAQrK,cACX,OAAO/8E,cAACyoF,GAAmB,IAC7B,KAAKrB,GAAQQ,qBACX,OAAO5nF,cAAC4oF,GAA0B,IACpC,KAAKxB,GAAQU,gBACX,OAAO9nF,cAAC+oF,GAAqB,IAC/B,KAAK3B,GAAQY,oBACX,OAAOhoF,cAACkpF,GAAyB,IACnC,QACE,OAAOlpF,cAAA0yB,WAAA,IACX,ECdWm5D,GAAoBA,KAC/B,MAAM,EAAE1uF,GAAMC,YAAe,WAEvBgqF,EAAUC,MACV,iBAAEvvD,GAAqBnB,KACvB53B,EAAWC,eAEV+4B,EAAY+zD,GAAiBjmE,mBAAS,IACvCkmE,EAAqBz/D,YAAkBjR,IACvC2wE,EAA2B1/D,YAAkBhR,IAC7C8tE,EAAY98D,YAAkB/Q,IAC9B0wE,EAAqBz3D,YAAoBtiB,IACzCg6E,EAAiB13D,YAAoBhZ,IACrC2wE,EAAe33D,YAAoB/Y,IACnC2wE,EAAqB53D,YAAoB9Y,IAkB/C,OACE7b,eAACulC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAKjK,GAAI,EAAEjzB,SAAA,CAC9CF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACwkD,GAAW,CAACze,QAAS5oC,EAAE,gBAAiB,uBACzC6C,cAAA,KAAAD,SAAI5C,EAAE,kBAAmB,yDACzB6C,cAAC2B,IAAI,CAAC26B,SAAS,OAAOt7B,GAAI,EAAGiB,QAAS,EAAElC,SACrCqnF,EACExxE,QAAQyG,IAAYtd,GAAYsd,EAAOmrE,kBACvCrmF,KAAKkb,GACJrc,cAACoC,IAAG,CAEFN,EAAG,CACDw4B,KAAM,OACNC,GAAI,0BACJ0C,GAAI,2BACJl9B,SAEFC,cAACkqF,GAAU,CAAC7tE,OAAQA,EAAQ8tE,UAAWA,IAjClC9tE,KACjByvE,EAAczvE,EAAOrZ,MACrBipF,IACAC,IACAC,IACAC,IACAhD,EAAU/sE,GACNtd,EACFitF,GAAyB,GAChB3vE,EAAOG,cAChBuvE,GAAmB,GAEnBj0D,EAAuB,OAANzb,QAAM,IAANA,OAAM,EAANA,EAAQrZ,KAC3B,EAoByDmnF,CAAU9tE,MAPlDA,EAAOwS,eAYtB7uB,cAACsrF,GAAW,IACZtrF,cAAC6pF,GAAwB,CAAC9xD,WAAYA,MAC5B,ECpEHs0D,GAAkD/tF,IAA0B,IAADguF,EAAA,OAAnBpiD,GAAc5rC,EACjF,MAAM,EAAEnB,GAAMC,YAAe,UACvBsiB,EAAe0M,YAAelN,KAC5B8K,KAAMyT,GAAkB5sB,KAChC,OACE7Q,cAAA0yB,WAAA,CAAA3yB,UACI2f,GACA1f,cAACiqC,GAA6B,CAC5BvrC,MAAOvB,EAAE,iBAAkB,YAC3BuvB,MAAgC,QAA3B4/D,EAAe,OAAb7uD,QAAa,IAAbA,OAAa,EAAbA,EAAehR,kBAAU,IAAA6/D,IAAI,GACpC14E,MAAOyK,MACH6rB,KAGP,ECfMqiD,GAAwCA,KACnD,MAAM,EAAEpvF,GAAMC,YAAe,WACrB4sB,KAAMwiE,GAAkBn/D,MAC1B,KAAEgX,GAASvlC,cAEjB,OACEkB,cAACiqC,GAA6B,CAC5BvrC,MACE2lC,EAAOlnC,EAAE,qBAAsB,gBAAkBA,EAAE,kBAAmB,aAExEuvB,MAAoB,OAAb8/D,QAAa,IAAbA,OAAa,EAAbA,EAAe7F,YACtB/yE,MAAO0K,IACP,ECZOmuE,GAAuCA,KAClD,MAAM,EAAEtvF,GAAMC,YAAe,WAErB4sB,KAAM0iE,GAAiBp/D,KAEzBq/D,EAAsBvgE,YAAejO,IACrCyuE,EAC4B,KAAb,OAAnBD,QAAmB,IAAnBA,OAAmB,EAAnBA,EAAqBj8E,SAAiD,QAAjCi8E,EAAoB,GAAGjuF,MAE9D,OACEsB,cAAA0yB,WAAA,CAAA3yB,UACI6sF,GACA5sF,cAACiqC,GAA6B,CAC5BvrC,MAAOvB,EAAE,iBAAkB,YAC3BuvB,MAAmB,OAAZggE,QAAY,IAAZA,OAAY,EAAZA,EAAc7F,WACrBjzE,MAAO2K,MAGV,E,OCxBA,MAAMsuE,GAAiBh7C,KAAO5V,IAAGqH,QAAAC,aAAA,mHCc3BupD,GAAmCA,KAAO,IAADC,EAAAC,EACpD,MAAM,EAAE7vF,GAAMC,YAAe,WAEtBoiB,EAAUytE,GAAe/6D,YAAe1T,KACxCiB,EAAQytE,GAAah7D,YAAezT,IAErCwuB,EAAmBA,CAACrvC,EAAkCsvC,KAC1D,GAAItvC,IAAS6X,aAAQ7X,GACnB,OAAQsvC,GACN,IAAK,OACH+/C,EAAYrvF,GACZ,MACF,IAAK,KACHsvF,EAAUtvF,GAGhB,EAGIivC,EAAQ,IAAIhqC,KAAK,cACjByR,EAAM,IAAIzR,KACVmqC,EAAmB9vC,IAEzB,OACE8C,cAACszB,IAAI,CAAAvzB,SACHF,eAAC+7B,IAAW,CAAA77B,SAAA,CACVC,cAAC6sF,GAAc,CAAC,cAAY,OAAO,gBAAc,IAAG9sF,SACjD5C,EAAE,mBAAoB,gBAEzB0C,eAACyzB,IAAI,CAACrxB,QAAS,EAAGpB,GAAI,CAAE,4BAA6B,CAAEs6B,QAAS,UAAYp7B,SAAA,CAC1EF,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACq7B,IAAS,CAACn4B,GAAG,kBAAiBhD,SAAA,CAAE5C,EAAE,wBAAyB,QAAQ,OACpE6C,cAACqtC,IAAU,CACT,kBAAgB,kBAChB/vC,WAAY0vC,EAAiB1vC,WAC7BgwC,gBAAiBN,EAAiBxvC,gBAClC+vC,QAASV,EACTW,QAAe,OAAN/tB,QAAM,IAANA,IAAUnL,EACnBm5B,mBAAoB,CAClBZ,EAAM7lC,cACe,QADF+lF,EACb,OAANttE,QAAM,IAANA,OAAM,EAANA,EAAQzY,qBAAa,IAAA+lF,IAAIz4E,EAAItN,eAE/BksB,SAAWt1B,GAAkBqvC,EAAiBrvC,EAAc,QAC5Dgf,SAAU4C,OAGd3f,eAACk9B,IAAQ,CAAAh9B,SAAA,CACPF,eAACq7B,IAAS,CAACn4B,GAAG,gBAAehD,SAAA,CAAE5C,EAAE,sBAAuB,MAAM,QAC9D6C,cAACqtC,IAAU,CACT,kBAAgB,gBAChB/vC,WAAY0vC,EAAiB1vC,WAC7BgwC,gBAAiBN,EAAiBxvC,gBAClC+vC,QAAiB,OAAR/tB,QAAQ,IAARA,IAAYqtB,EACrBW,QAASl5B,EACTm5B,mBAAoB,CACK,QADLu/C,EACV,OAARxtE,QAAQ,IAARA,OAAQ,EAARA,EAAUxY,qBAAa,IAAAgmF,IAAIngD,EAAM7lC,cACjCsN,EAAItN,eAENksB,SAAWt1B,GAAkBqvC,EAAiBrvC,EAAc,MAC5Dgf,SAAU6C,cAKb,ECxEE0tE,GAA8Dj8D,IACzE,MAAM,EAAE/zB,GAAMC,YAAe,kBACtBsiB,EAAc0tE,GAAmBl7D,YAAehT,IAEvD,OACErf,eAAC+7B,IAAW,IAAK1K,EAAKnxB,SAAA,CACpBC,cAACk7B,IAAS,CAACiJ,GAAI,EAAGphC,GAAG,sBAAqBhD,SACvC5C,EAAE,aAAc,UAEnB0C,eAAC8B,IAAI,CAACsiC,cAAc,MAAKlkC,SAAA,CACvBC,cAACqtF,KAAM,CACLhoD,UAAW3lB,EAAe,UAAY,YACtC,aAAY,gDACZtgB,OAAO,OACPw+D,OAAO,aACP,cAAY,mBACZtsB,YAAY,QACZvuC,GAAG,YACHulC,UAAW5oB,EACX4tE,YAAY,WACZh8D,GAAG,QACHqQ,aAAc,GACdzO,SAAWsV,GAAqC4kD,EAAgB5kD,EAAE5U,OAAO2U,WAE3E1oC,eAAC8B,IAAI,CAACw5B,QAAQ,cAAct5B,WAAW,OAAOoiC,cAAc,SAAQlkC,SAAA,CAClEC,cAACk7B,IAAS,CACRn4B,GAAG,sBACH,cAAY,sBACZ66D,OAAQ,EACRroB,QAAQ,YACRr1C,SAAS,KACToB,WAAW,OACXg6B,WAAY5b,EAAe,SAAW,MAAM3f,SAE3C5C,EAAE,gBAAiB,SAEtB6C,cAACk7B,IAAS,CACRn4B,GAAG,uBACH,cAAY,uBACZ66D,OAAQ,EACRroB,QAAQ,YACRr1C,SAAS,KACToB,WAAW,OACXg6B,WAAY5b,EAAe,MAAQ,SACnC/c,WAAW,SAAQ5C,SAElB5C,EAAE,YAAa,4BAIV,ECjDLowF,GAA8Dr8D,IAAW,IAADs8D,EACnF,MAAM,EAAErwF,GAAMC,YAAe,kBAEvB,KAAE4sB,GAASkD,MAEV2Q,EAAM4vD,GAAWv7D,YAAetT,IAEvC,OACE/e,eAAC+7B,IAAW,IAAK1K,EAAKnxB,SAAA,CACpBC,cAACk7B,IAAS,CAACn4B,GAAG,gBAAehD,SAAE5C,EAAE,gBAAiB,aAClD6C,cAACs2C,KAAM,CACL,kBAAgB,gBAChB,cAAY,cACZ1zC,GAAI,EACJ1B,MAAM,OACNmZ,MAAOwjB,EACP3K,SAAW7Y,GAAkBozE,GAASpzE,GACtCqnC,WAAY,EAAE3hD,SAEbiqB,IACK,OAAJA,QAAI,IAAJA,GAAiB,QAAbwjE,EAAJxjE,EAAMmD,mBAAW,IAAAqgE,OAAb,EAAJA,EAAmBrsF,KAAKyU,GACtB5V,cAAA,UAA2Bqa,MAAOzE,EAAOyE,MAAMta,SAC5C6V,EAAOlX,OADGkX,EAAOyE,cAKd,EC5BLqzE,GAAqCA,KAChD,MAAM,EAAEvwF,GAAMC,YAAe,WAErB4sB,KAAM2jE,GCCiBC,MAC/B,MAAMrgF,EAAU6e,YAAerN,IAC/B,OAAO3O,aACL,CAAC1C,GAAea,kBAAmBhB,IACnC,IAAMgB,GAAkBhB,IACxByC,GACD,EDP8B49E,GAE/B,OACE5tF,cAACiqC,GAA6B,CAC5BvrC,MAAOvB,EAAE,eAAgB,UACzBuvB,MAAmB,OAAZihE,QAAY,IAAZA,OAAY,EAAZA,EAAc/8B,SACrBh9C,MAAOwK,IACP,EECN,IAAIyvE,GAEG,MAAMC,GAAmCA,KAC9C,MAAM,EAAE3wF,GAAMC,YAAe,WACvB,IAAEyB,GAAQC,gBAET6d,EAAewtB,GAAoBjY,YAAe/T,KAEjD6L,KAAM+jE,GAAaxgE,MACnBvD,KAAMgkE,GAAsBhhE,KAE9Bg6D,GAA4B,OAAR+G,QAAQ,IAARA,OAAQ,EAARA,EAAU/G,oBAAqB,GAEzDA,EAAkBnpD,MAAK,CAACxS,EAAGC,SACD9e,IAApB6e,EAAE4iE,oBAAmDzhF,IAApB8e,EAAE2iE,cAC9B5iE,EAAE4iE,cAAgB3iE,EAAE2iE,cAGtB,IAGLD,IACFH,GAAyBG,EAAkBH,wBAG7C,MAAMK,EAAgBC,IAA0B,IAAAC,EAAAC,EAAAC,EAAA,OAItC,QAJsCF,EACxB,QADwBC,EAC9CR,UAAsB,IAAAQ,GAGrB,QAHqBC,EAAtBD,EAAwB9vD,MACrBgwD,GACCA,EAAsBJ,qBAAuBA,WAChD,IAAAG,OAHqB,EAAtBA,EAGGv3B,aAAK,IAAAq3B,IAAI,CAAC,EAETI,EAAsBjsF,IAC1B,MAAMksF,EAAqB,OAARV,QAAQ,IAARA,OAAQ,EAARA,EAAU/G,kBAAkBzoD,MAC5C3b,GAAMA,EAAEvI,SAAW9X,EAAMqxB,OAAOvZ,QAEnC8vB,EACE5nC,EAAMqxB,OAAO2U,SAAWkmD,EACpB,IAAI9xE,EAAc/G,QAAQlS,GAASA,EAAK2W,SAAW9X,EAAMqxB,OAAOvZ,QAAQo0E,GACxE9xE,EAAc/G,QAAQlS,GAASA,EAAK2W,SAAW9X,EAAMqxB,OAAOvZ,QACjE,EAGH,OACEra,cAACszB,IAAI,CAAAvzB,SACHF,eAAC+7B,IAAW,CAAA77B,SAAA,CACVF,eAACq7B,IAAS,CAACn4B,GAAG,aAAYhD,SAAA,CAAE5C,EAAE,oBAAqB,qBAAqB,OACxE6C,cAAC0uF,IAAa,CACZ,kBAAgB,aAChBr0E,MAAoB,OAAbsC,QAAa,IAAbA,OAAa,EAAbA,EAAexb,KAAKuC,GAASA,EAAK2W,QAAOta,SAE/CinF,EAAkB7lF,KAAKyU,GACtB5V,cAACoC,IAAG,CAEFk/B,aAAa,YACbjiC,YAAaR,EAAI,CAAEwB,GAAIK,IAAQo8B,KAAK,KAAM39B,GAAI,aAC9CiyC,IAAK,EACL7V,GAAI,EAAEx7B,SAENF,eAACuoC,IAAQ,CACPpU,GAAI,EACJ10B,MAAOT,EAAI,CAAEwB,GAAIK,IAAQC,KAAK,KAAMxB,GAAI,aACxCkb,MAAOzE,EAAOyE,MACd6Y,SAAUs7D,EAAmBzuF,SAAA,CAE7BC,cAAC2nC,KAAU,CAAC7mC,GAAG,SAASw6B,WAAYz8B,EAAI,CAAEM,GAAI,QAASY,SACpD6V,EAAOlX,QAEVmB,eAAC8nC,KAAU,CACTxM,QAAQ,eACRgJ,GAAI,EACJ7kC,MAAOT,EAAI,CAAEwB,GAAIK,IAAQ8qC,MAAOrsC,GAAI,aACpCm8B,WAAYz8B,EAAI,CAAEM,GAAI,QAASY,SAAA,CAChC,IACGmuF,EAAat4E,EAAOyE,OAAO,WArB5BzE,EAAOyE,eA4Bf,ECzFEs0E,GAAkEz9D,IAC7E,MAAM,EAAE/zB,GAAMC,YAAe,iBACvBwxF,EAAwC,CAC5C,CACEv0E,MAAOxQ,GAAsBiV,KAC7BpgB,MAAOvB,EAAE,qBAAsB,uBAEjC,CACEkd,MAAOxQ,GAAsBoV,SAC7BvgB,MAAOvB,EAAE,yBAA0B,6BAGhC0xF,EAAUC,GAAe58D,YAAerT,IAE/C,OACEhf,eAAC+7B,IAAW,IAAK1K,EAAKnxB,SAAA,CACpBC,cAACk7B,IAAS,CAACn4B,GAAG,kBAAiBhD,SAAE5C,EAAE,aAAc,UACjD6C,cAACs2C,KAAM,CACL,kBAAgB,kBAChB,cAAY,cACZ1zC,GAAI,EACJ8wB,YAAW,KAAA72B,OAAOM,EAAE,SAAU,UAAS,MACvC+D,MAAM,OACNmZ,MAAOw0E,EAASl+E,WAChBuiB,SAAW7Y,GAAkBy0E,GAAaz0E,GAC1CqnC,WAAY,EAAE3hD,SAEb6uF,EAAgBztF,KAAKyU,GACpB5V,cAAA,UAA2Bqa,MAAOzE,EAAOyE,MAAM1J,WAAW5Q,SACvD6V,EAAOlX,OADGkX,EAAOyE,aAKZ,ECjCL00E,GAAuCA,KAClD,MAAM,EAAE5xF,GAAMC,YAAe,iBACvB2B,EAAWC,eAEV6vF,EAAUC,GAAe58D,YAAerT,IAS/C,OACE7e,cAAA0yB,WAAA,CAAA3yB,SACGhB,GACCiB,cAACqwC,IAAI,CAAC9uC,QAVWytF,IACrBF,GAAaG,GACXA,IAAoBplF,GAAsBiV,KACtCjV,GAAsBoV,SACtBpV,GAAsBiV,OAMO5e,SAAS,KAAIH,SACzC8uF,IAAahlF,GAAsBiV,KAChC3hB,EAAE,qBAAsB,sBACxBA,EAAE,iBAAkB,qBAG3B,ECxBM+xF,GAAmCA,KAAO,IAADC,EACpD,MAAM,EAAEhyF,GAAMC,YAAe,WAErB4sB,KAAMolE,GAAaroE,KAE3B,OACE/mB,cAAA0yB,WAAA,CAAA3yB,SACW,OAARqvF,QAAQ,IAARA,GAAe,QAAPD,EAARC,EAAUvoE,aAAK,IAAAsoE,GAAfA,EAAiBz+E,QAAU0+E,EAASvoE,MAAMnW,OAAS,EAClD1Q,cAACiqC,GAA6B,CAC5BvrC,MAAOvB,EAAE,aAAc,QACvBuvB,MAAe,OAAR0iE,QAAQ,IAARA,OAAQ,EAARA,EAAUvoE,MACjBjT,MAAO8K,KAEP,MACH,ECGM2wE,GAA2D/wF,IAGjE,IAHkE,UACvEk4C,KACGtM,GACJ5rC,EACC,MAAM,EAAEnB,GAAMC,YAAe,WACvB,IAAEyB,GAAQC,eAEVwwF,EC1BNh+E,aAA8BhT,IAAA,IAAC,MAAEiT,GAAOjT,EAAA,MAAK,KAC3CwsB,OAAO5U,OAAOyI,IAAajC,SAAS3L,GAASQ,EAAMR,IAAM,CAC1D,ID0BD,OACElR,eAACuC,IAAG,IAAK8nC,EAAcznC,SAAS,WAAU1C,SAAA,CACxCF,eAACyzB,IAAI,CAAClzB,KAAK,SAAS,kBAAgB,uBAAuB6B,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAIx6B,SAAA,CACrFF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAIn0B,EAAI,CAAEwB,GAAI,EAAGlB,GAAI,IAAKY,SAAA,CAC1CC,cAACimC,IAAO,CAACljC,GAAG,uBAAuBtC,KAAK,KAAIV,SACzC5C,EAAE,iBAAkB,oBAEvB6C,cAACghC,IAAU,CAACz/B,QAAS+tF,EAAgBvvF,SACnCC,cAAA,UAAAD,SAAS5C,EAAE,oBAAqB,4BAGpC0C,eAAC+7B,IAAW,CAAA77B,SAAA,CACVC,cAAC8tF,GAAsB,IACvB9tF,cAAC0tF,GAAwB,IACzB1tF,cAACqsF,GAA0B,IAC3BrsF,cAAC+zB,IAAO,CACNqd,IAAK,EACLpwC,GAAI,EACJE,MAAK,iBAAArE,OAAmBqlC,aAAQ,IAAG,KACnC7iC,YAAaqB,IAAQo8B,KAAK,OAE5B98B,cAAC8sF,GAAsB,IACvB9sF,cAAC+zB,IAAO,CACNqd,IAAK,EACLpwC,GAAI,EACJE,MAAK,iBAAArE,OAAmBqlC,aAAQ,IAAG,KACnC7iC,YAAaqB,IAAQo8B,KAAK,OAE5B98B,cAACusF,GAA2B,IAC5BvsF,cAACysF,GAA0B,IAC3BzsF,cAACkvF,GAAsB,UAG1B14C,EACCx2C,cAACoC,IAAG,CACFK,SAAS,WACT+uB,EAAE,OACF6X,WAAY3oC,IAAQo8B,KAAK,KACzByyD,QAAS,GACTztF,EAAE,OACFohC,OAAQ,EACR9G,IAAK,EACL0N,KAAM,IAEN,OACA,EE7DG0lD,GAA0ClxF,IAAwB,OAAlBmxF,GAAYnxF,EACvE,MAAM,EAAEnB,GAAMC,YAAe,gBAC7B,OACE4C,cAACoC,IAAG,CAAC,cAAY,eAAcrC,SAC7BF,eAAC8+B,GAAW,IAAK8wD,EAAU1vF,SAAA,CACzBF,eAACo+B,KAAW,CACV,aAAY9gC,EAAE,6BAA8B,8BAA8B4C,SAAA,CAEzE5C,EAAE,uBAAwB,wBAC3B6C,cAACm+B,KAAgB,OAEnBn+B,cAACo+B,KAAS,CAAAr+B,SACRC,cAACqvF,GAAU,MAEbrvF,cAAC4+B,KAAW,CAAA7+B,SACVF,eAACkiC,KAAM,CAAC7gC,MAAM,OAAMnB,SAAA,CAClBC,cAACJ,IAAM,CAACi/B,aAAW,EAAA9+B,SAAE5C,EAAE,gBAAiB,mBACxC6C,cAACJ,IAAM,CAACi/B,aAAW,EAACr+B,QAAQ,WAAWe,QAASkuF,EAAWryD,QAAQr9B,SAChE5C,EAAE,SAAU,qBAKjB,EC1BGuyF,GAGRpxF,IAAoC,IAAnC,MAAE4C,EAAK,mBAAEyuF,GAAoBrxF,EACjC,MAAM,KAAE+lC,GAASvlC,cACX8wF,EAAa9kE,OAAOK,KAAKwkE,EAAmBtG,aAE5C,aAAEwG,EAAY,KAAEC,EAAI,KAAEC,EAAI,KAAEC,EAAI,YAAEzyC,EAAW,QAAE0yC,GAAYC,aAAc,CAC7ExjE,MAAO5B,OAAOC,QAAQ6kE,GACtBO,aAHmB,IAKfC,EAAuB,CAC3BC,SAAUrwF,cAACswF,IAAqB,IAChC1uF,eAAgB,YAGZ2uF,EAAuB,CAC3BC,SAAUxwF,cAACywF,IAAsB,IACjC7uF,eAAgB,cA8BlB,OACE/B,eAAA6yB,WAAA,CAAA3yB,SAAA,CACG8vF,EAAa1uF,KAAI6Q,IAAA,IAAEhB,EAAK8W,GAAM9V,EAAA,OAC7BhS,cAACoC,IAAG,CAAWN,EAAGZ,EAAMnB,SACtBC,cAAC0wF,GAAe,CAACC,WAAYhB,EAAmBtG,WAAWvhE,GAAQA,MAAOA,KADlE9W,EAEJ,KAENqzB,GACArkC,cAAC4wF,KAAoB,CACnBvrD,UAAU,kCACVztB,WAAY2lC,EACZ/O,UAAWyhD,EACXp4E,SAtDa,EAuDbg5E,oBAAoB,EACpBC,iCAAkCV,EAClCW,6BAA8BR,EAC9BzmE,eAAgB,CACdknE,cAAgBxoD,IACdsnD,EAAKp2C,OAAOlR,EAAEsmC,cAAcz0D,OAAO,EAGrC42E,YAAaA,KACXlB,GAAM,EAGRmB,YAAaA,KACXlB,GAAM,EAGRnvF,GAAIwjC,EAxDa,CACzB,qBAAsB,CACpBziC,eAAgB,UAGlB,6BAA8B,CAC5BoiC,KAAM,EAEN,WAAY,CACVpiC,eAAgB,UAGlB,UAAW,CACToiC,KAAM,EACNoN,GAAI,WAIR,yBAA0B,CACxBpN,KAAM,EAEN,WAAY,CACVpiC,eAAgB,YAkCoB,CAAC,OAItC,ECzEMuvF,GAA0BA,KACrC,MAAM,IAAEtyF,GAAQC,gBACV,EAAE3B,GAAMC,YAAe,sBACvB,kBAAE+5B,GAAsBR,KACxB53B,EAAWC,eACTgrB,KAAM2lE,GCpBmByB,MACjC,MAAM7jF,EAAU6e,YAAelM,IAC/B,OAAO9P,aACL,CAAC1C,GAAe0B,oBAAqB7B,IACrC,IAAM6B,GAAoB7B,IAC1ByC,GACD,EDcoCohF,IAE9BC,EAAgBC,GAAqBzrE,oBAAS,GAMrD,OAAO9mB,EACLc,eAACyzB,KAAI,CAACrxB,QAAS,EAAGjB,GAAI,EAAEjB,SAAA,CACtBC,cAACJ,KAAM,CAACY,QAAQ,YAAYe,QAAS41B,EAAkBp3B,SACpD5C,EAAE,eAAgB,kBAEpBwyF,GACC3vF,cAAC0vF,GAAsB,CAACC,mBAAoBA,OAIhD9vF,eAACyzB,KAAI,CACH9zB,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAc,EACdvhC,KAAK,SACL,kBAAgB,oBAAmBL,SAAA,CAEnCF,eAAC8B,KAAI,CAACC,eAAe,gBAAgB25B,GAAI,EAAGwF,GAAI,EAAEhhC,SAAA,CAChDF,eAAC8B,KAAI,CAACE,WAAW,SAAQ9B,SAAA,CACvBC,cAACoC,KAAG,CACFQ,GAAI/D,EAAI,CAAEM,GAAI,UAAY,GAC1BG,MAAOT,EAAI,CAAEM,GAAI,YAAcuB,IAAQC,KAAK,MAC5C26B,WAAW,OACXp7B,SAAS,OAAMH,SAEfC,cAACuxF,IAAU,MAGbvxF,cAACimC,KAAO,CAACxlC,KAAK,KAAKsC,GAAG,oBAAmBhD,SACtC5C,EAAE,oBAAqB,uBAGzBk0F,GACCrxF,cAACJ,KAAM,CACLukC,GAAItlC,EAAI,CAAEM,GAAI,YAAc,GAC5Bo8B,GAAI,EACJn8B,OAAQ8iC,aAAQ,GAChB/hC,SAAS,mBACTe,MAAOrC,EAAI,CAAEM,GAAI,aACjBqB,QAAQ,YACRonC,YAAY,OACZ1nC,SAAS,KACTqB,QAAS41B,EAAkBp3B,SAE1B5C,EAAE,eAAgB,qBAIzB6C,cAACqwC,KAAI,CAAC9uC,QApDmDinC,IAC7DA,EAAEyP,iBACFq5C,GAAmB/pC,IAAcA,GAAS,EAkDN94B,KAAK,IAAG1uB,SACtCC,cAAA,UAAAD,SACEF,eAAC8B,KAAI,CAACM,QAASpD,EAAI,CAAEM,GAAI,GAAK,GAAI0C,WAAW,SAAQ9B,SAAA,CACnDC,cAAC2nC,MAAU,CAACznC,SAAS,KAAIH,SACtBsxF,EAAiBl0F,EAAE,kBAAmB,QAAUA,EAAE,kBAAmB,UAExE6C,cAAC2nC,MAAU,CAAA5nC,SAAEsxF,EAAiBrxF,cAACwnD,IAAW,IAAMxnD,cAACO,IAAa,gBAKrE8wF,GACCrxF,cAAC2B,KAAI,CAAC26B,SAAS,OAAOf,GAAI,EAAG6lB,GAAIiwC,EAAiB,EAAI,EAAGpvF,QAAS,EAAElC,SACjE4vF,GACC3vF,cAAC0vF,GAAsB,CACrBxuF,MAAO,0BACPyuF,mBAAoBA,QAM/B,E,kCEjFI,MAAMe,GAAkDpyF,IAA4B,IAA3B,WAAEqyF,EAAU,MAAE7oE,GAAOxpB,EACnF,MAAM,EAAEnB,GAAMC,YAAe,sBACvB,IAAEyB,EAAG,KAAEwlC,GAASvlC,gBACf+vF,GAAY38D,YAAerT,IAC5B2yE,EAAentD,GAAQwqD,IAAahlF,GAAsBoV,SAE1D+K,EAAoB,CACxB,CACEhnB,KAAMwuF,EAAer0F,EAAE,YAAa,aAAeA,EAAE,WAAY,YACjEkd,MAAOm3E,EAAeb,EAAWc,eAAiBd,EAAWe,aAC7D59C,WAAY09C,EAAeb,EAAWgB,oBAAsBhB,EAAWiB,kBACvErhC,OAAQlsB,EAAOR,GAAmCD,GAClDiuD,YAAanxF,IAAQ2gC,OAEvB,CACEr+B,KAAMwuF,EAAer0F,EAAE,SAAU,UAAYA,EAAE,UAAW,WAC1Dkd,MAAOm3E,EAAeb,EAAWmB,YAAcnB,EAAWoB,aAC1Dj+C,WAAY09C,EAAeb,EAAWqB,iBAAmBrB,EAAWsB,kBACpE1hC,OAAQlsB,EAAOR,GAAoCnjC,IAAQgrC,IAAI,KAC/DmmD,YAAanxF,IAAQ2gC,OAEvB,CACEr+B,KAAMwuF,EACFr0F,EAAE,YAAa,aACfA,EAAE,mBAAoB,oBAC1Bkd,MAAOm3E,EAAeb,EAAWuB,eAAiBvB,EAAWwB,qBAC7Dr+C,WAAY09C,EACRb,EAAWyB,oBACXzB,EAAW0B,0BACf9hC,OAAQlsB,EAAOR,GAAoCnjC,IAAQ+qC,OAAO,KAClEomD,YAAanxF,IAAQ2gC,QAInBixD,EAAe,CACnB,CACEtvF,KAAM7F,EAAE,aAAc,cACtBkd,MAAOs2E,EAAW4B,gBAClBz+C,WAAY68C,EAAW6B,qBACvBjiC,OAAQ1sB,GACRguD,YAAanxF,IAAQ2gC,QAInBoxD,EAAazoE,EAAKntB,OAAO20F,EAAec,EAAe,IAqC7D,OACEtyF,cAACoC,IAAG,CACF5C,OAAM,aAAA3C,OAAe6D,IAAQo8B,KAAK,MAClC6E,aAAc9iC,EAAI,CAAEM,GAAI,OAAS,GACjCkyB,EAAGxyB,EAAI,CAAEM,GAAI,WAAa,GAC1BgkC,UAAWtkC,EAAI,CAAEM,GAAI,QAAU,qCAAqCY,SAEpEF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACoC,IAAG,CACFijC,UAAU,eACVxI,gBAAiBh+B,EAAI,CAAEM,GAAI,UAAYuB,IAAQC,KAAK,MACpD46B,GAAI18B,EAAI,CAAEM,GAAI,UAAY,GAC1B4hC,GAAIliC,EAAI,CAAEM,GAAI,GAAK,GAAGY,SAEtBC,cAAC2nC,KAAU,CAACznC,SAAS,KAAKo7B,WAAW,OAAMv7B,SACxC+nB,MAGLjoB,eAAC8B,IAAI,CAACM,QAAS,EAAElC,SAAA,CACfC,cAACszB,IAAI,CAAC+R,UAAU,kBAAkBvjC,EAAE,qBAAqBD,WAAW,QAAO9B,SACxE0yF,EAAWtxF,KAAKuxF,GAvDPA,IAClB7yF,eAAC8B,IAAI,CACH0jC,UAAU,mBAEV/D,aAAY,aAAAzkC,OAAe6D,IAAQo8B,KAAK,MACxCvB,GAAI18B,EAAI,CAAEM,GAAI,UAAY,GAC1B4hC,GAAI,EACJj/B,EAAE,OACFF,eAAe,gBACfC,WAAW,SAAQ9B,SAAA,CAEnBF,eAAC8nC,KAAU,CAACtC,UAAU,oBAAoBnlC,SAAS,KAAIH,SAAA,CACpD2yF,EAAU1vF,KAAK,IAACnD,eAAA,UAAAE,SAAA,CAAQ,IAAE2yF,EAAUr4E,MAAM,UAE7Cxa,eAAC8B,IAAI,CACH0jC,UAAU,mCACVzjC,eAAe,SACfC,WAAW,SACX2vB,EAAE,OACF1vB,EAAGjD,EAAI,CAAEM,GAAI,QAAU,QACvBwzF,KAAK,OACL91D,gBAAiB61D,EAAUniC,OAC3BjxD,MAAOozF,EAAUb,YACjBv2D,WAAYz8B,EAAI,CAAEM,GAAI,UAAY,UAAUY,SAAA,CAE5CC,cAAC2nC,KAAU,CAACtC,UAAU,yBAAyBnlC,SAAS,KAAIH,SACzD6M,KAAKgmF,MAAMF,EAAU5+C,cAExB9zC,cAAC2nC,KAAU,CAACtC,UAAU,gCAAgCnlC,SAAS,KAAKikC,GAAG,MAAKpkC,SAAC,WAGxE,GAAAlD,OA5BC61F,EAAU1vF,OAoDmB6vF,CAAWH,OAE5C7yF,eAACuC,IAAG,CAACK,SAAS,WAAU1C,SAAA,CACtBC,cAAC2B,IAAI,CACH0jC,UAAU,yBACV5iC,SAAS,WACTX,EAAE,OACF1C,OAAQ,IACRwC,eAAe,SACfC,WAAW,SAAQ9B,SAEnBF,eAACyzB,IAAI,CAAC+R,UAAU,oBAAmBtlC,SAAA,CACjCF,eAAC8B,IAAI,CAAA5B,SAAA,CAAE5C,EAAE,OAAQ,QAAQ,OACzB6C,cAAC2B,IAAI,CAACC,eAAe,SAAS1B,SAAS,KAAIH,SACzCC,cAAA,UAAAD,SAAS4wF,EAAWnkE,oBAI1BxsB,cAAC8yF,KAAQ,CAAC5xF,MAAO,IAAK9B,OAAQ,IAAIW,SAChCC,cAAC+yF,KAAG,CACF/oE,KAAMyoE,EACNO,GAAI,GACJC,GAAI,GACJC,YAAa,GACbC,YAAa,GACbC,aAAc,EACdC,WAAY,IACZC,UAAW,IACXC,mBAAmB,EACnBC,QAAQ,QAAOzzF,SAEd0yF,EAAWtxF,KAAKuxF,GACf1yF,cAACg2D,KAAI,CAAsBzpD,KAAMmmF,EAAUniC,QAAhCmiC,EAAU1vF,sBAO7B,ECpIGywF,GAAsBA,KAAO,IAADC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACvC,MAAM,EAAEh3F,GAAMC,YAAe,kBACrB4sB,KAAMgkE,GAAsBhhE,KAE9BjuB,EAAWC,eAEVo1F,EAAmBC,GAAwBxuE,oBAAS,IACpDyuE,EAAsBC,GAA2B1uE,oBAAS,IAC3D,KAAEwe,GAASvlC,cAEjB,IAAI01F,EAA+B,CACjCn1F,YAAaqB,IAAQo8B,KAAK,KAC1Bl8B,YAAa,EACb+gC,aAAc,EACd9E,gBAAiBn8B,IAAQo8B,KAAK,MAYhC,OATIuH,IACFmwD,EAA+B,CAC7Bn1F,YAAa,WACbuB,YAAa,EACb+gC,aAAc,EACd9E,gBAAiB,YAKnBh9B,eAACyzB,IAAI,CACHrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,IACxBie,GAAI,EACJ4I,GAAI,EACJ7lB,GAAI,EACJ6V,GAAI,CAAE9W,MAAO,EAAGyM,GAAI,GACpBnlC,eAAgB,CAAE04B,KAAM,SAAUC,GAAI,SACtCmN,aAAc,CACZpN,KAAM85D,EA1Ce,iFANR,0DAiDb75D,GAtDc,2DAwDhBl7B,YAAam1F,EAA6Bn1F,YAC1CuB,YAAa4zF,EAA6B5zF,YAC1C+gC,aAAc6yD,EAA6B7yD,aAC3C9E,gBAAiB23D,EAA6B33D,gBAAgB98B,SAAA,CAE7DhB,EACCc,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACoC,IAAG,CAACimC,SAAS,SAAQtoC,SACpBC,cAACwlD,GAAU,CACTC,YAAatmC,GACbmuB,gBAAiBnwC,EAAE,4BAA6B,wBAChDuoD,YAA4D,QAAjDguC,EAAmB,OAAjB1F,QAAiB,IAAjBA,GAAgC,QAAf2F,EAAjB3F,EAAmB/gE,qBAAa,IAAA0mE,GAAO,QAAPC,EAAhCD,EAAkCjnE,aAAK,IAAAknE,OAAtB,EAAjBA,EAAyCljF,cAAM,IAAAgjF,IAAI,EAChElnE,WAAyD,QAA/CqnE,EAAmB,OAAjB7F,QAAiB,IAAjBA,GAAiC,QAAhB8F,EAAjB9F,EAAmBlkE,sBAAc,IAAAgqE,OAAhB,EAAjBA,EAAmCtnE,kBAAU,IAAAqnE,IAAI,MAGjE7zF,cAACJ,IAAM,CACLyoC,SAAS,SACTloC,SAAS,QACToB,QAASA,IAAMgzF,GAAwB,GACvCj0F,UAAWN,cAACsnD,IAAU,IAAIvnD,SAEzB5C,EAAE,SAAU,YAEf6C,cAACJ,IAAM,CACLyoC,SAAS,gBACT7nC,QAAQ,WACRL,SAAS,OACTG,UAAW8zF,EAAoBp0F,cAACwnD,IAAW,IAAMxnD,cAACO,IAAa,IAC/DgB,QAASA,IAAM8yF,GAAsB90C,IAAOA,IAAGx/C,SAE9Cq0F,EACGj3F,EAAE,eAAgB,gBAClBA,EAAE,eAAgB,kBAEvBi3F,GACCv0F,eAACo7B,IAAM,CAACiH,QAAS,EAAGmG,SAAS,YAAWtoC,SAAA,CACtCC,cAACmtF,GAAgB,CAACrrF,EAAE,MAAMkiC,KAAK,aAC/BhkC,cAACutF,GAAgB,CAACzrF,EAAE,MAAMkiC,KAAK,mBAKrCnkC,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAAC2uF,GAAoB,CAACtmD,SAAS,SAC/BroC,cAACmtF,GAAgB,CAAC9kD,SAAS,SAC3BroC,cAACoC,IAAG,CAACimC,SAAS,SAASrnC,GAAI,EAAEjB,SAC3BC,cAACwlD,GAAU,CACTC,YAAatmC,GACbmuB,gBAAiBnwC,EAAE,4BAA6B,wBAChDuoD,YAA4D,QAAjDquC,EAAmB,OAAjB/F,QAAiB,IAAjBA,GAAgC,QAAfgG,EAAjBhG,EAAmB/gE,qBAAa,IAAA+mE,GAAO,QAAPC,EAAhCD,EAAkCtnE,aAAK,IAAAunE,OAAtB,EAAjBA,EAAyCvjF,cAAM,IAAAqjF,IAAI,EAChEvnE,WAAyD,QAA/C0nE,EAAmB,OAAjBlG,QAAiB,IAAjBA,GAAiC,QAAhBmG,EAAjBnG,EAAmBlkE,sBAAc,IAAAqqE,OAAhB,EAAjBA,EAAmC3nE,kBAAU,IAAA0nE,IAAI,MAGjEl0F,cAACutF,GAAgB,CAACllD,SAAS,YAI/BroC,cAACwvF,GAAW,CACVryD,OAAQm3D,EACRl3D,QAASA,IAAMm3D,GAAyBh1C,IAAOA,QAE5C,ECzFEk1C,GAAmBA,KAAO,IAADf,EAAAC,EAAAC,EAAAG,EAAAC,EAAAC,EACpC,MAAM,IAAEp1F,GAAQC,gBACV,EAAE3B,GAAMC,YAAe,WACrB4sB,KAAMgkE,EAAiB,UAAEx3C,GAAcxpB,KACzC6gB,EAAWtJ,iBAAO,MAElBxlC,EAAWC,eACV6vF,GAAY38D,YAAerT,KAC3BomB,EAAUg7B,GAAe/tC,YAAe/R,KAEzC,gBACJ0U,EAAe,iBACfD,EAAgB,0BAChBE,EAAyB,qBACzBE,EAAoB,YACpBE,GACEjB,KAEE+J,EACJn+B,eAACyzB,IAAI,CAAC0U,oBAAqB,CAAE1N,KAAM,OAAQC,GAAI,cAAgBt4B,QAAS,EAAGf,MAAM,OAAMnB,SAAA,CACrFC,cAACqvF,GAAU,CACT74C,UAAWA,EACXrb,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAC7BgB,GAAI,EACJwF,GAAI,EACJY,aAAc,EACdniC,OAAO,aACPH,YAAaR,EAAI,CAAEwB,GAAIK,IAAQo8B,KAAK,KAAM39B,GAAI,aAC9CC,OAAO,cACPyB,GAAI,CAAEsiC,UAAWtkC,EAAI,CAAEwB,GAAI,QAASlB,GAAI,0CAE1CU,eAACyzB,IAAI,CAACrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAKn7B,OAAO,cAAaW,SAAA,CACpD60B,GACC50B,cAACJ,IAAM,CACLY,QAAQ,YACRonC,YAAY,OACZtnC,UAAWN,cAAC+oC,KAAM,IAClB7nC,MAAOnC,EAAW,OAAS,UAC3BwC,QAASyzB,EAAqBj1B,SAE7B5C,EAAE,kBAAmB,qBAG1B0C,eAACyzB,IAAI,CAAAvzB,SAAA,CACFy2C,GAAax2C,cAAC2pC,GAAuB,MAClB,OAAjBqkD,QAAiB,IAAjBA,GAAgC,QAAf0F,EAAjB1F,EAAmB/gE,qBAAa,IAAAymE,GAAO,QAAPC,EAAhCD,EAAkChnE,aAAK,IAAAinE,IAAvCA,EAAyCjjF,SAC1C7Q,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACszB,IAAI,CACHrxB,QAAS,EACTijC,IAAK2I,EACL,aAAY1wC,EAAE,qBAAsB,sBACpCu3F,cAAc,OACd5zF,GAAG,KACHV,KAAK,OAAML,SAEO,OAAjBiuF,QAAiB,IAAjBA,GAAgC,QAAf4F,EAAjB5F,EAAmB/gE,qBAAa,IAAA2mE,GAAO,QAAPG,EAAhCH,EAAkClnE,aAAK,IAAAqnE,OAAtB,EAAjBA,EAAyC5yF,KAAKgU,GAC7CnV,cAACspC,GAAgB,CAEfn0B,aAAcA,EACdmyB,cAAexS,EAA0B3f,EAAapS,KAFjDoS,EAAapS,QAMvBirF,EAAkBlkE,gBACjB9pB,cAAC4tC,GAAmB,CAClB9jB,eAAgBkkE,EAAkBlkE,eAClCzE,gBAAiBjG,GACjBkG,cAAejG,GACfwuB,SAAUA,EACVC,wBAAyB/uC,EAAW,GAAK,UAM/Cy3C,KAA+B,OAAjBw3C,QAAiB,IAAjBA,GAAgC,QAAfgG,EAAjBhG,EAAmB/gE,qBAAa,IAAA+mE,GAAO,QAAPC,EAAhCD,EAAkCtnE,aAAK,IAAAunE,GAAvCA,EAAyCvjF,SACvD1Q,cAAC0+B,IAAgB,CACfn4B,OAAO,OACP/F,QAAQ,SACRsnB,MAAO3qB,EACL,4BACA,uHASd,OACE0C,eAACulC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SAAA,CACvCF,eAACyzB,IAAI,CAACrxB,QAAS,CAAEq4B,KAAM,EAAGC,GAAI,GAAKvH,GAAI,EAAEjzB,SAAA,CACtC8uF,IAAahlF,GAAsBiV,KAClC9e,cAACwkD,GAAW,CACVze,QAAS5oC,EAAE,uBAAwB,kCACnCsnD,cAAetnD,EAAE,8BAA+B,wBAGlD6C,cAACwkD,GAAW,CACVze,QAAS5oC,EAAE,2BAA4B,sCACvCsnD,cAAetnD,EAAE,kCAAmC,4BAGvD4B,EACCc,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAAC+uF,GAA0B,IAC3BlvF,eAACugE,KAAI,CAACv2B,MAAO5E,EAAUzkC,QAAQ,OAAOU,MAAM,QAAQkwC,IAAK,EAAGpe,GAAI,GAAGjzB,SAAA,CACjEC,cAAC+gD,GAAa,CACZC,eAAgB/b,EAChBic,kBAAmB+e,EACnBhf,UAAW,CACT9jD,EAAE,qBAAsB,iBACxBA,EAAE,kBAAmB,wBAGzB0C,eAACygE,KAAS,CAAAvgE,SAAA,CACRC,cAACwgE,KAAQ,CAAChoB,GAAI,EAAGjd,GAAI,EAAGr6B,MAAM,QAAQ4oC,KAAM,EAAE/pC,SAC5CF,eAACyzB,IAAI,CAACrxB,QAAS,EAAElC,SAAA,CACfC,cAACyzF,GAAS,IACTz1D,OAGLh+B,cAACwgE,KAAQ,CAACjlC,GAAI,EAAEx7B,SACdC,cAACmxF,GAAa,eAMtBtxF,eAAA6yB,WAAA,CAAA3yB,SAAA,CACEC,cAACmxF,GAAa,IACdnxF,cAACyzF,GAAS,IACTz1D,QAIPh+B,cAACk9B,GAAW,CAACC,OAAQtI,EAAiBuI,QAASlI,MACrC,ECxKHy/D,GAA0BA,KAAsC,IAADC,EAC1E,MAAQ5qE,KAAM6qE,GCLdzkF,aAAS,CAAC1C,GAAe+B,aAAcrC,GAAe4C,IDMhDgQ,EAAaoM,YAAezS,IAC5B2xC,EAAoC,QAA/BspC,EAAmB,OAAhBC,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBC,kBAAU,IAAAF,IAAI,GACxCpoE,EAAa8+B,EAAM56C,OASzB,MAAO,CACLqkF,SARezpC,EAAM11C,QACpB+oC,IACE3+B,GACD2+B,EAAE37C,KAAKw4B,cAAczG,SAAS/U,EAAWwb,gBACzCmjB,EAAE/zC,MAAM4wB,cAAczG,SAAS/U,EAAWwb,iBAK5ChP,aACD,EEtBUwoE,GAA4B12F,IAAmB,IAAlB,SAAEyB,GAAUzB,EAEpD,OADkB8tB,YAAerR,IACd/a,cAAA0yB,WAAA,CAAA3yB,SAAGA,IAAeC,cAAC46E,GAAY,GAAG,ECI1Cqa,GAA6BA,KACxC,MAAM,EAAE93F,GAAMC,YAAe,cACvB,SAAE23F,EAAQ,WAAEvoE,GAAemoE,KAEjC,OACE30F,cAACg1F,GAAe,CAAAj1F,SACdC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAG,OAAMjzB,SAAA,CACzBC,cAACwkD,GAAW,CAACze,QAAS5oC,EAAE,kBAAmB,6BAC3C6C,cAAC88C,GAAoB,CACnBh1B,MAAO3qB,EAAE,qBAAsB,qBAC/B4yC,WAAY5yC,EAAE,mBAAoB,eAClC08C,SAAS,kBAEX75C,cAAC2B,IAAI,CACHoB,GAAG,eACH7B,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,OAC3BvH,GAAI,CAAEsH,KAAM,UAAWC,GAAI,QAC3BlJ,EAAG,CAAEiJ,KAAM,UAAWC,GAAI,GAC1B0J,cAAe,CAAE3J,KAAM,SAAUC,GAAI,OACrCjJ,GAAI,CAAEgJ,KAAM55B,IAAQo8B,KAAK,KAAMvC,GAAI75B,IAAQ2gC,OAAQthC,SAEnDF,eAAC+7B,IAAW,CAACoI,KAAK,WAAUjkC,SAAA,CAC1BF,eAACq7B,IAAS,CAACC,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAAUx6B,SAAA,CAC/C5C,EAAE,eAAgB,UAAU,OAE/B6C,cAACwlD,GAAU,CACTC,YAAa9rC,GACb2zB,gBAAiBnwC,EAAE,qBAAsB,eACzCuoD,YAAaqvC,EAASrkF,OACtB8b,WAAYA,SAIlBxsB,cAACg9C,GAAe,CAACC,iBAAkB83C,EAAU51D,SAAS,UAG1C,ECvCT+1D,GAAgCA,KAC3C,MAAM,EAAE/3F,GAAMC,YAAe,sBACvB,iBAAE+3F,EAAgB,WAAE3oE,GCJmB4oE,MAA8C,IAADC,EAAAC,EAC1F,MAAQtrE,KAAMurE,GAAuB9nE,KAKrC,MAAO,CACL0nE,iBAJ2E,QAAvDE,EAAqB,OAAlBE,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoB5nE,oBAAoBjB,MAAMhc,cAAM,IAAA2kF,IAAI,EAK/E7oE,WAJ8D,QAAhD8oE,EAAqB,OAAlBC,QAAkB,IAAlBA,OAAkB,EAAlBA,EAAoBzrE,eAAe0C,kBAAU,IAAA8oE,IAAI,EAKnE,EDLwCF,GAEzC,OACEp1F,cAAC2B,IAAI,CACHoB,GAAG,eACH7B,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,OAC3BvH,GAAI,CAAEsH,KAAM,UAAWC,GAAI,GAC3BlJ,EAAG,CAAEiJ,KAAM,UAAWC,GAAI,GAC1B0J,cAAe,CAAE3J,KAAM,SAAUC,GAAI,OACrCjJ,GAAI,CAAEgJ,KAAM55B,IAAQo8B,KAAK,KAAMvC,GAAI75B,IAAQ2gC,OAAQthC,SAEnDC,cAAC47B,IAAW,CAACoI,KAAK,WAAUjkC,SAC1BC,cAACwlD,GAAU,CACTC,YAAazsC,GACbs0B,gBAAiBnwC,EAAE,qBAAsB,2BACzCuoD,YAAayvC,EACb3oE,WAAYA,OAGX,EEZEgpE,GAAgCA,KAAO,IAADC,EACjD,MAAM,KAAEzrE,GAASyD,KACXogB,EAAWtJ,iBAAO,MAClBsjB,ECboC6tC,MAC1C,MAAM,EAAEv4F,GAAMC,YAAe,sBACvB,uBAAEk7B,GAA2B3B,KACnC,MAAO,CACL,CACEo/B,SAAU,mBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,oBAAqB,qBACrC+D,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,QAAS,SACzB+D,MAAO,QAET,CACE60D,SAAU,KACVC,KAAO9kC,GACLlxB,cAACJ,IAAM,CACLY,QAAQ,YACRC,KAAK,KACLc,QAASA,KAAA,IAAAo0F,EAAAC,EAAA,OAAMt9D,EAAgC,QAAVq9D,EAACzkE,EAAMk6B,WAAG,IAAAuqC,GAAU,QAAVC,EAATD,EAAWr/B,gBAAQ,IAAAs/B,OAAV,EAATA,EAAqB7yF,GAAG,EAAChD,SAE9D5C,EAAE,SAAU,YAGjBk5D,OAAQA,IAAMr2D,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,gBAAiB,YAClD+D,MAAO,IACPk1D,eAAe,GAElB,EDlBes/B,IACTG,EAAS3tC,GAAch2B,YAAejZ,KACtCkvC,EAAcC,GAAmBl2B,YACtChZ,KAEKnB,EAAQswC,GAAaxiC,mBAA8B,CACxD,CACE9iB,GAAI8yF,EACJ15E,KAAMgsC,KAiBV,OACEnoD,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAG,OAAOhyB,GAAG,OAAMjB,SAAA,CACnCC,cAACk1F,GAAmB,IACpBr1F,eAACuC,IAAG,CAACvB,GAAI2iC,GAAezjC,SAAA,CACtBC,cAACsoD,IAAS,CACRT,QAASA,EACT79B,KAAqC,QAAjCyrE,EAAM,OAAJzrE,QAAI,IAAJA,OAAI,EAAJA,EAAM2D,oBAAoBjB,aAAK,IAAA+oE,IAAI,GACzC/sC,cArBiB90C,IAAqC,IAAD+0C,EAAAC,EAAAmvB,EAAAlvB,EAAAC,EAC7D,IAAKl1C,EAAM6yC,QAAQ/1C,SAAWkD,EAAMmE,OAAOrH,OAAQ,OACnD,MAAMs4C,EAA8B,QAAfL,EAAG/0C,EAAMmE,cAAM,IAAA4wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB7lD,GACrCi3E,EAA8C,QAA1BjC,EAAe,QAAflvB,EAAGj1C,EAAMmE,cAAM,IAAA8wC,GAAK,QAALC,EAAZD,EAAe,UAAE,IAAAC,OAAL,EAAZA,EAAmB3sC,YAAI,IAAA47D,KAChDnkE,EAAMmE,SAAWA,GACnBswC,EAAUz0C,EAAMmE,QAEdixC,IACFd,EAAWc,GACXZ,EAAgB4xB,GAClB,EAYQzxB,mBAAmB,EACnBC,mBAAmB,EACnBC,kCAAkC,EAClChoD,KAAK,KACLkC,WAAW,SACXoV,OAAQA,EACRkxC,cAAc,IAEhBjpD,cAAC4tC,GAAmB,CAClB9jB,eAAoB,OAAJE,QAAI,IAAJA,OAAI,EAAJA,EAAMF,eACtBzE,gBAAiBvM,GACjBwM,cAAezM,GACfg1B,SAAUA,EACVC,wBAAyB,aAIrB,EE9DHgoD,GAA0BA,KAAsC,IAADC,EAAAC,EAAAC,EAC1E,MAAQjsE,KAAMksE,GAAkBnlE,GAC9BzZ,GACAL,IAGI4P,EAAmC,QAA9BkvE,EAAgB,OAAbG,QAAa,IAAbA,GAAoB,QAAPF,EAAbE,EAAervE,aAAK,IAAAmvE,OAAP,EAAbA,EAAsBtpE,aAAK,IAAAqpE,IAAI,GAG7C,MAAO,CACL/rE,KAAMnD,EACN2F,WAJ8B,QAAhBypE,EAAQ,OAALpvE,QAAK,IAALA,OAAK,EAALA,EAAOnW,cAAM,IAAAulF,IAAI,EAKlCnsE,eAA6B,OAAbosE,QAAa,IAAbA,OAAa,EAAbA,EAAepsE,eAChC,ECrBUqsE,GAAuB,CAClCj1F,MAAO,CAAEo5B,KAAM,OAAQC,GAAI,OAC3BvH,GAAI,CAAEsH,KAAM,UAAWC,GAAI,QAC3BlJ,EAAG,CAAEiJ,KAAM,UAAWC,GAAI,GAC1B0J,cAAe,CAAE3J,KAAM,SAAUC,GAAI,OACrCjJ,GAAI,CAAEgJ,KAAM55B,IAAQo8B,KAAK,KAAMvC,GAAI75B,IAAQ2gC,QAGhC+0D,GAAiB,CAC5BpiE,GAAI,CAAEsG,KAAM,EAAGC,GAAI,GACnB/6B,OAAQ,CAAE86B,KAAM,EAAGyM,GAAI,SACvB1V,EAAG,CAAEiJ,KAAM,EAAGyM,GAAI,SAClBw5B,KAAM,CAAEjmC,UAAM9tB,EAAWu6B,GAAI,KAC7BznC,MAAO,CAAEg7B,KAAM55B,IAAQ8qC,OACvBnN,SAAU,CAAE/D,KAAM,SAAUC,GAAI,SAGrB2lC,GAAgB,CAC3B1gE,OAAQ,CAAE86B,KAAM,OAAQC,GAAG,aAAD19B,OAAe6D,IAAQo8B,KAAK,OACtDvB,GAAI,CAAEjB,KAAM,EAAGC,GAAI,GACnBwG,GAAI,CAAEzG,KAAM,EAAGC,GAAI,ICVR87D,GAAwBA,KAAO,IAADC,EACzC,MAAM,EAAEn5F,GAAMC,YAAe,sBACvB,KAAE4sB,EAAI,WAAEwC,GAAespE,MACrB9rE,KAAM2D,GAAwBH,MAC/B+oE,EAAoBC,GAAyBtkE,YAClD/a,IAEI88D,EAAwD,QAA3CqiB,EAAsB,OAAnB3oE,QAAmB,IAAnBA,OAAmB,EAAnBA,EAAqBA,2BAAmB,IAAA2oE,IAAI,GAUlE,OACEz2F,eAACo7B,IAAM,CAACl4B,GAAG,cAAclC,GAAIs1F,GAAsBt0F,WAAW,WAAU9B,SAAA,CACtEF,eAAC+7B,IAAW,CAACoI,KAAK,WAAUjkC,SAAA,CAC1BF,eAACq7B,IAAS,CAACC,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAAUx6B,SAAA,CAC/C5C,EAAE,eAAgB,UAAU,OAE/B6C,cAACwlD,GAAU,CACTC,YAAavuC,GACbo2B,gBAAiBnwC,EAAE,qBAAsB,2BACzCuoD,YAAa17B,EAAKtZ,OAClB8b,WAAYA,OAGhB3sB,eAAC+7B,IAAW,CACVwV,GAAI,CAAE9W,KAAM,EAAGC,GAAI,WACnBvG,GAAI,CAAEsG,KAAM,OAAQC,GAAI,GACxB15B,GAAIkjC,GAAuBhkC,SAAA,CAE3BF,eAACq7B,IAAS,CAACqa,QAAQ,OAAOviB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SAAA,CACrD5C,EAAE,qBAAsB,gBAAgB,OAE3C0C,eAACy2C,KAAM,CACLJ,QAAQ,OACRhjB,SAAW7Y,GA/Beo8E,KAChC,IAAIC,EAAU,GACd,MAAMC,EAAc1iB,EAAc11C,MAAMq4D,GAAQA,EAAIv8E,QAAUo8E,IAE1DE,IAAaD,EAAUC,EAAYj4F,OACvC83F,EAAsBE,EAAQ,EA0BHG,CAAyBn9C,OAAOr/B,IACrD87B,aAAcogD,EAAmB5lF,WACjC9P,GAAIqjC,GACJ,aAAW,kCAAiCnkC,SAAA,CAE5CC,cAAA,UAAkBqa,MAAO,EAAEta,SACxB5C,EAAE,MAAO,QADA,OAGE,OAAb82E,QAAa,IAAbA,OAAa,EAAbA,EAAe9yE,KAAKy1F,GACnB52F,cAAA,UAAwBqa,MAAOu8E,EAAIv8E,MAAMta,SACtC62F,EAAIl4F,OADMk4F,EAAIv8E,iBAMhB,ECnDAy8E,GAAwBA,KACnC,MAAM,KAAE9sE,EAAI,eAAEF,GAAmBgsE,KAC3BjuC,ECT4BkvC,MAClC,MAAM,EAAE55F,GAAMC,YAAe,iBACvB,eAAEm7B,GAAmB5B,KAE3B,MAAO,CACL,CACEo/B,SAAU,WACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,YAAa,aAC7B+D,MAAO,KAET,CACE60D,SAAU,iBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,mBAAoB,oBACpC+D,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,aAAc,cAC9B+D,MAAO,QAET,CACE60D,SAAU,mBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,eAAgB,gBAChC+D,MAAO,KAET,CACE60D,SAAU,YACVC,KAAM13D,IAAA,IAAG8sD,KAAK,SAAEkL,IAA6Bh4D,EAAA,OAC3C0B,cAACJ,IAAM,CACLY,QAAQ,YACRC,KAAK,KACLc,QAASA,IAAMg3B,EAAe+9B,EAAStlC,gBAAgBjxB,SAEtD5C,EAAE,SAAU,WACN,EAEXk5D,OAAQA,IAAMr2D,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,gBAAiB,YAClD+D,MAAO,IACPk1D,eAAe,GAElB,EDnCe2gC,GAEhB,OACE/2F,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAG,OAAMjzB,SAAA,CACzBC,cAACq2F,GAAW,IACZr2F,cAAC4nD,GAAS,CACR/gC,MAAOmD,EACP89B,WAAYh+B,EACZzE,gBAAiBpO,GACjBqO,cAAetO,GACf6wC,QAASA,EACTE,kBAAmB1wC,GACnB2wC,sBAAuB5wC,GACvBu9B,aAAch0B,SAGR,EEdHq2E,GAAkD14F,IAGxD,IAADg4F,EAAA,IAH0D,WAC9D7pE,EAAU,WACVD,GACDluB,EACC,MAAM,EAAEnB,GAAMC,YAAe,sBACrB4sB,KAAM2D,GAAwBH,KAChCymD,EAAwD,QAA3CqiB,EAAsB,OAAnB3oE,QAAmB,IAAnBA,OAAmB,EAAnBA,EAAqBA,2BAAmB,IAAA2oE,IAAI,GAC5DE,EAAwBlqE,YAAkBlU,IAE1C6+E,EAA4C,CAChD,CAAE58E,MAAO,aAAc3b,MAAOvB,EAAE,MAAO,QACvC,CAAEkd,MAAO,aAAc3b,MAAOvB,EAAE,MAAO,QACvC,CAAEkd,MAAO,gBAAiB3b,MAAOvB,EAAE,KAAM,QAG3C,OACE0C,eAACkiC,KAAM,CACLh/B,GAAG,cACHlC,GAAI,IAAKs1F,GAAsBj1F,MAAO,OAAQ8xB,GAAI,GAClD/wB,QAAS,EACTJ,WAAW,WAAU9B,SAAA,CAErBC,cAAC47B,IAAW,CACVoI,KAAK,WACLhjC,GAAI,CAAEs5B,KAAM,EAAGC,GAAI,UACnB33B,GAAI,CAAE03B,KAAM,EAAGC,GAAI,WAAYx6B,SAE/BC,cAACwlD,GAAU,CACTC,YAAattC,GACbm1B,gBAAiBnwC,EAAE,qBAAsB,2BACzCuoD,YAAaj5B,EAAW/b,OACxB8b,WAAYA,MAGhB3sB,eAAC+7B,IAAW,CACVoI,KAAK,WACLoN,GAAI,CAAE9W,KAAM,EAAGC,GAAI,WACnBvG,GAAI,CAAEsG,KAAM,OAAQC,GAAI,GAAIx6B,SAAA,CAE5BF,eAACq7B,IAAS,CAACqa,QAAQ,eAAeviB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SAAA,CAC7D5C,EAAE,qBAAsB,gBAAgB,OAE3C0C,eAACy2C,KAAM,CACLJ,QAAQ,eACRhjB,SAAW7Y,GAAUm8E,EAAgC,QAAVn8E,EAAkB,GAAKA,GAClE87B,aAAa,MACbt1C,GAAIqjC,GACJ,aAAW,kCAAiCnkC,SAAA,CAE5CC,cAAA,UAAkBqa,MAAM,MAAKta,SAC1B5C,EAAE,MAAO,QADA,OAGX82E,EAAc9yE,KAAKy1F,GAClB52F,cAAA,UAAwBqa,MAAOu8E,EAAIl4F,MAAMqB,SACtC62F,EAAIl4F,OADMk4F,EAAIv8E,eAMvBra,cAAC47B,IAAW,CAACoI,KAAK,UAAUoN,GAAI,CAAE9W,KAAM,EAAGC,GAAI,WAAavG,GAAI,CAAEsG,KAAM,OAAQC,GAAI,GAAIx6B,SACtFC,cAACq2C,GAAoB,CACnBH,QAAQ,gBACRD,YAAa59B,GACb9Z,QAAS04F,EACTv4F,MAAK,GAAA7B,OAAKM,EAAE,sBAAuB,iBAAgB,SAGvD6C,cAACkqD,GAAgB,MACV,EC5EAgtC,GAAwBA,KAAO,IAADC,EAAAC,EAAAC,EAAA9qE,EAAA+qE,EAAAC,EACzC,MAAM,KAAEvtE,GAASmC,KAEX07B,ECR6B2vC,MACnC,MAAM,EAAEr6F,GAAMC,YAAe,iBACvB,oBAAEo7B,GAAwB7B,KAEhC,MAAO,CACL,CACEo/B,SAAU,gBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,OAAQ,QACxB+D,MAAO,KAET,CACE60D,SAAU,QACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,QAAS,SACzB+D,MAAO,KAET,CACE60D,SAAU,4BACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,eAAgB,gBAChC+D,MAAO,KAET,CACE60D,SAAU,iBACVK,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,cAAe,eAC/B+D,MAAO,KAET,CACE6B,GAAI,eACJgzD,SAAW75B,GACFA,EAAEpV,aAAe,MAAQ,KAElCsvC,eAAe,EACfC,OAAQA,IAAMl5D,EAAE,gBAAiB,iBACjC+D,MAAO,KAET,CACE60D,SAAU,YACVK,eAAe,EACfC,OAAQA,IAAMr2D,cAAC2yB,KAAc,CAAA5yB,SAAE5C,EAAE,gBAAiB,YAClD+D,MAAO,IACP80D,KAAM13D,IAAA,IAAG8sD,KAAK,SAAEkL,IAAkCh4D,EAAA,OAChD0B,cAACJ,IAAM,CACLY,QAAQ,YACRC,KAAK,KACLc,QAASA,KAAA,IAAAk2F,EAAA,OACC,OAARnhC,QAAQ,IAARA,GAAkB,QAAVmhC,EAARnhC,EAAUzvC,MAAM,UAAE,IAAA4wE,OAAV,EAARA,EAAoBzmE,iBACpBwH,EAAoB89B,EAASzvC,MAAM,GAAGmK,eAAe,EACtDjxB,SAEA5C,EAAE,SAAU,WACN,GAGd,EDhDeq6F,GAEhB,OACEx3F,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAG,OAAMjzB,SAAA,CACzBC,cAACg3F,GAAY,CACXvqE,WAAmC,QAAzB0qE,EAAM,OAAJntE,QAAI,IAAJA,GAAgB,QAAZotE,EAAJptE,EAAMyC,kBAAU,IAAA2qE,OAAZ,EAAJA,EAAkB1qE,aAAK,IAAAyqE,IAAI,GACvC3qE,WAA4C,QAAlC6qE,EAAM,OAAJrtE,QAAI,IAAJA,GAAoB,QAAhBuC,EAAJvC,EAAMF,sBAAc,IAAAyC,OAAhB,EAAJA,EAAsBC,kBAAU,IAAA6qE,IAAI,IAElDr3F,cAACqrD,GAAS,CACRxD,QAASA,EACTyD,MAA8B,QAAzBgsC,EAAM,OAAJttE,QAAI,IAAJA,GAAgB,QAAZutE,EAAJvtE,EAAMyC,kBAAU,IAAA8qE,OAAZ,EAAJA,EAAkB7qE,aAAK,IAAA4qE,IAAI,GAClCxtE,eAAoB,OAAJE,QAAI,IAAJA,OAAI,EAAJA,EAAMF,eACtBzE,gBAAiBnN,GACjBoN,cAAerN,GACf08B,aAAcvuB,SAGR,EEJHsxE,GAA6BA,KAOxC,MAAM,EAAEv6F,GAAMC,YAAe,qBACvB6jD,ECpC0B02C,MAChC,MAAM,EAAEx6F,GAAMC,YAAe,qBAC7B,MAAO,CAACD,EAAE,gBAAiB,iBAAkBA,EAAE,QAAS,SAAUA,EAAE,QAAS,SAAS,EDkCpEw6F,IACZ,6BAAEpgE,GAAiCZ,KACnCihE,Eze2BNtmF,aAA8BU,IAAA,IAAC,MAAET,GAAOS,EAAA,MAAK,KAC3CT,EAAM4G,IACN5G,EAAM6G,IACN7G,EAAM8G,IACN9G,EAAM2G,IACN3G,EAAM0G,IACN1G,EAAM+G,IACN/G,EAAMgH,GAAuC,CAC9C,IyelCKs/E,EAA6BrjE,YAAoBtjB,IACjD4mF,EAAkCtjE,YAAoB1jB,KACrDinF,EAAWC,GAAgB9lE,YAAela,IASjD,OACEnY,eAACulC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SAAA,CACvCF,eAAC8B,IAAI,CAACC,eAAe,gBAAe7B,SAAA,CAClCC,cAACwkD,GAAW,CAACze,QAAS5oC,EAAE,oBAAqB,uBAC7C6C,cAACJ,IAAM,CACLU,UAAWN,cAACi4F,IAAM,IAClB12F,QAb2B22F,KACjCL,IACAC,IACAvgE,IACAqgE,GAA8B,EAUxBp3F,QAAQ,YAAWT,SAElB5C,EAAE,+BAAgC,6BAGvC0C,eAACugE,KAAI,CACH/M,aAAc0kC,EACdv3F,QAAQ,WACR6wB,EAAG,EACHrwB,GAAI,EACJgyB,GAAI,GACJoe,GAAI,CAAE9W,MAAO,EAAGC,GAAI,GACpB8lC,UAAU,EAAKtgE,SAAA,CAEfC,cAACmhD,KAAO,CAAC7hD,MAAOoB,IAAQC,KAAK,KAAME,GAAI,CAAE,aAAc,CAAEsjC,GAAI,IAAMpkC,SAChEkhD,EAAU9/C,KAAI,CAACq5E,EAAU3wC,IACxB7pC,cAACqhD,KAAG,CAEFhnC,MAAOwvB,EACPtoC,QAAUinC,GACRwvD,EAAat+C,OAAOlR,EAAEsmC,cAAcz0D,QACrCta,SAEDC,cAACshD,KAAO,CAACphD,SAAU,GAAGH,SAAEy6E,KANnBA,OAUX36E,eAACygE,KAAS,IAAK81B,GAAcr2F,SAAA,CAC3BC,cAACwgE,KAAQ,IAAKN,GAAangE,SACzBC,cAACw1F,GAAmB,MAEtBx1F,cAACwgE,KAAQ,IAAKN,GAAangE,SACzBC,cAAC82F,GAAW,MAEd92F,cAACwgE,KAAQ,IAAKN,GAAangE,SACzBC,cAACk3F,GAAW,cAIR,EEnFHiB,GAAmCA,KAA+C,IAADC,EAC5F,MAAQpuE,KAAM6qE,GCLZzkF,aAAS,CAAC1C,GAAeiB,yBAA0BA,GAAyBqB,IDMxEqoF,EAAajsE,YAAexS,IAC5B0+E,EAAmBlsE,YAAevS,IAClCmG,EAAaoM,YAAezS,IAE5B2xC,EAAoC,QAA/B8sC,EAAmB,OAAhBvD,QAAgB,IAAhBA,OAAgB,EAAhBA,EAAkBpoE,kBAAU,IAAA2rE,IAAI,GACxC5rE,EAAa8+B,EAAM56C,OAkBzB,MAAO,CACLqkF,SAjBezpC,EACd11C,QAAQ+oC,GACQ,IAAf05C,EAAmB15C,EAAIA,EAAE93B,MAAM1lB,KAAKyhB,GAAMA,EAAEvI,QAAO0a,SAAS2kB,OAAO2+C,MAEpEziF,QAAQ+oC,GACc,IAArB25C,GAA0B35C,EAAExH,WACxBwH,EAAExH,WAAW98B,QAAUq/B,OAAO4+C,GAC9B35C,IAEL/oC,QACE+oC,IACE3+B,GACD2+B,EAAE37C,KAAKw4B,cAAczG,SAAS/U,EAAWwb,gBACzCmjB,EAAE/zC,MAAM4wB,cAAczG,SAAS/U,EAAWwb,iBAK9ChP,aACD,EEtCU+rE,GAAmCj6F,IAAmB,IAAlB,SAAEyB,GAAUzB,EAC3D,MAAMk6F,EAAmBpsE,YAAevR,IAClCukB,EAAYhT,YAAerR,IACjC,OAAOy9E,GAAoBp5D,EAAYp/B,cAAA0yB,WAAA,CAAA3yB,SAAGA,IAAeC,cAAC46E,GAAY,GAAG,ECe9D6d,GAAuBA,KAOlC,MAAM,EAAEt7F,GAAMC,YAAe,gBACrB4sB,KAAM0wB,GAAgB3zB,MACxB,SAAEguE,EAAQ,WAAEvoE,GAAe2rE,MAE1BE,EAAYK,GAAiBxmE,YAAetY,IAEnD,OACE5Z,cAACu4F,GAAsB,CAAAx4F,SACrBC,cAAColC,IAAS,CAAC7J,GAAI,CAAEjB,KAAM,EAAGC,GAAI,EAAG0C,GAAI,GAAIl9B,SACvCF,eAACyzB,IAAI,CAACrxB,QAAS,EAAG+wB,GAAG,OAAMjzB,SAAA,CACzBC,cAACwkD,GAAW,CAACze,QAAS5oC,EAAE,cAAe,iBACvC6C,cAAA,KAAAD,SACG5C,EACC,sBACA,wEAGJ6C,cAAC88C,GAAoB,CACnB/M,WAAY5yC,EAAE,mBAAoB,eAClC2qB,MAAO3qB,EAAE,cAAe,eACxBu9C,YAAwB,OAAXA,QAAW,IAAXA,OAAW,EAAXA,EAAa7zB,MAC1BgzB,SAAS,eAEXh6C,eAACo7B,IAAM,CAACh5B,QAAS,EAAGc,GAAG,cAAclC,GAAIs1F,GAAqBp2F,SAAA,CAC5DF,eAAC+7B,IAAW,CAAC/6B,GAAIkjC,GAAuBhkC,SAAA,CACtCF,eAACq7B,IAAS,CAACC,QAAS,CAAEb,KAAM,OAAQC,GAAI,SAAUx6B,SAAA,CAC/C5C,EAAE,eAAgB,UAAU,OAE/B6C,cAACwlD,GAAU,CACTC,YAAa9rC,GACb2zB,gBAAiBnwC,EAAE,qBAAsB,eACzCuoD,YAAaqvC,EAASrkF,OACtB8b,WAAYA,OAGhB3sB,eAAC+7B,IAAW,CAAC/6B,GAAIkjC,GAAuBhkC,SAAA,CACtCF,eAACq7B,IAAS,CAACqa,QAAQ,OAAOviB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SAAA,CACrD5C,EAAE,aAAc,QAAQ,OAE3B0C,eAACy2C,KAAM,CACLJ,QAAQ,OACRhjB,SAAW7Y,GAAUq+E,EAAch/C,OAAOr/B,IAC1C87B,aAAckiD,EAAW1nF,WACzB9P,GAAIqjC,GACJ,aAAW,0BAAyBnkC,SAAA,CAEpCC,cAAA,UAAkBqa,MAAO,EAAEta,SACxB5C,EAAE,MAAO,QADA,OAGA,OAAXu9C,QAAW,IAAXA,OAAW,EAAXA,EAAa7zB,MAAM1lB,KAAKiZ,GACvBpa,cAAA,UAAyBqa,MAAOD,EAAKC,MAAMta,SACxCqa,EAAK1b,OADK0b,EAAKC,eAMxBxa,eAAC+7B,IAAW,CAAC/6B,GAAIkjC,GAAuBhkC,SAAA,CACtCF,eAACq7B,IAAS,CAACqa,QAAQ,iBAAiBviB,GAAI,CAAEsH,KAAM,EAAGC,GAAI,UAAWx6B,SAAA,CAC/D5C,EAAE,mBAAoB,eAAe,OAGxC6C,cAAC44C,GAAgC,CAC/BG,gBAAiBl/B,GACjBm/B,kBAAgB,EAChBn4C,GAAIqjC,GACJgS,QAAQ,yBAIdl2C,cAACg9C,GAAe,CAACC,iBAAkB83C,UAGhB,EC/EhB4D,GAAgBA,IAEzB94F,eAAC+4F,IAAM,CAAA74F,SAAA,CACLC,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAa87F,QAAS94F,cAACi1E,GAAI,MACxCj1E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAe87F,QAAS94F,cAACy0F,GAAM,MAC5Cz0F,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAgB87F,QAAS94F,cAAC6rF,GAAO,MAC9C7rF,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAe87F,QAAS94F,cAAC4rF,GAAM,MAC5C5rF,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAqB87F,QAAS94F,cAACgtE,GAAmB,MAC/DhtE,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAgB87F,QAAS94F,cAAC6/D,GAAW,MAClD7/D,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAiB87F,QAAS94F,cAAC0rE,GAAoB,MAC5D1rE,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAyB87F,QAAS94F,cAACyrE,GAAgB,MAChEzrE,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAgB87F,QAAS94F,cAACm1E,GAAO,MAC9Cn1E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAgB87F,QAAS94F,cAACu6E,GAAO,MAC9Cv6E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAmB87F,QAAS94F,cAACy4F,GAAU,MACpDz4F,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAyB87F,QAAS94F,cAACi1F,GAAgB,MAChEj1F,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAyB87F,QAAS94F,cAAC03F,GAAgB,MAChE13F,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAA2B87F,QAAS94F,cAACy0E,GAAkB,MACpEz0E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAyB87F,QAAS94F,cAAC20E,GAAgB,MAChE30E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAA6B87F,QAAS94F,cAAC20E,GAAgB,MACpE30E,cAAC64F,IAAK,CAACpjE,KAAMz4B,EAAqB87F,QAAS94F,cAAC46E,GAAY,MACxD56E,cAAC64F,IAAK,CAACpjE,KAAK,IAAIqjE,QAAS94F,cAAC26E,GAAY,SCrBtClvD,GAAc,IAAIstE,IAClBC,GAAsB,IAAIC,ICrB0B,CACxDC,cAAe,CACbC,QAASr8F,8EAEXs8F,eAAgB,CACdD,QAASr8F,2DDkBAu8F,GAAO/6F,IAA8D,IAA7D,IAAE2pB,GAAuC3pB,EAC5D,MAAMs4B,EAAWD,cACX2iE,EAAgBj8F,uBAAYiqB,gBAC1BW,EAAIsxE,aACV,MAAMC,EAAmB,IAAIC,IAAuB7iE,GACpD3O,EAAIyxE,oBAAoBF,GACxBvxE,EAAI0xE,kBAAiBryE,UACf+L,EAAQumE,YAAcC,IAAUC,cAClCnqC,aAAaC,QAAQ,SAAU,QAE7Bv8B,EAAQumE,YAAcC,IAAUE,qBACE,IAAhC9xE,EAAIoC,iBAAiB3Z,QACvB6Z,YAA6BtC,EAAKxV,GAAU,CAC1CtO,UAAWuO,GACX8X,iBAAkB7X,GAClB8X,sBAAuB,KACtB7C,OAAMN,UAEFqoC,aAAaG,QAAQ,iBAClB7nC,EAAIma,cAAc,CACtBC,OAAQ,CAACvlC,8FAGb6yD,aAAaK,WAAW,SAAS,GAGvC,I5cpCJ/nC,G4csCSA,CAAI,GACV,CAAC2O,EAAU3O,IAEd6c,qBAAU,KACRw0D,GAAe,GACd,CAACA,IAEJ,MAAMU,EAAa7qC,KACnB,OACEnvD,cAACi6F,IAAU,CAAAl6F,SACTC,cAACk6F,IAAc,CACbC,oBAAqB,CACnB93D,OAAQ,CAAC5vB,IACTtO,UAAWuO,GAAe,IAAMC,IAElC0sB,SAAUpX,EAAIloB,SAEdC,cAACo6F,IAAmB,CAACnnD,OAAQxnB,GAAY1rB,SACvCC,cAACq6F,IAAqB,CAACpnD,OAAQ+lD,GAAoBj5F,SACjDC,cAACs6F,IAAkB,CAACvrC,WAAYirC,EAAWj6F,SACzCC,cAACupD,GAAa,CAAAxpD,SACZC,cAACu6F,GAAgB,CAAAx6F,SACfC,cAAC03C,GAAM,CAAA33C,SACLC,cAAC24F,GAAG,mBAQP,E,uBEhFjB,MAAM1qC,GAASusC,YACb9nF,GACAC,G/fFyB7V,uCEEE,I6fWhBmrB,GAAM,IAAIwyE,KAAwBxsC,ICX/CysC,IAASl7B,OACPx/D,cAAC6kC,IAAM81D,WAAU,CAAA56F,SACfC,cAAC46F,KAAa,CAAA76F,SACZC,cAACq5F,GAAI,CAACpxE,IAAKA,SAGfsG,SAAS4pB,eAAe,Q","file":"static/js/main.4ef9fe09.chunk.js","sourcesContent":["export const BANNER_TIMEOUT = 5000;\r\nexport const PUBLIC_REGISTER_APPLICATION_URL = `${process.env.REACT_APP_PUBLIC_REGISTER_URL}application/arn/`;\r\nexport const TERMS_CONDITIONS_URL = `${process.env.REACT_APP_TERMSCONDITIONS_URL}`;\r\n","export const ROUTES = {\r\n HOME: '/',\r\n SEARCH: '/search',\r\n REPORTS: '/reports',\r\n REPORT: '/report/:name',\r\n CONSULTATION: '/consultation/:id',\r\n DETAILS: '/consultation/:id/details',\r\n RESPONSE: '/consultation/:id/response',\r\n ARCHIVEDRESPONSE: '/consultation/:id/response/:responseId',\r\n MEASURE: '/consultation/:id/measure/:path',\r\n MONITOR: '/monitor',\r\n MANAGETEAM: '/manageteam',\r\n MANAGEADMINUSERS: '/manageadminusers',\r\n MANAGECONSULTEES: '/manageconsultees',\r\n CREATEORGANISATION: '/create_organisation',\r\n EDITORGANISATION: '/organisations/:id',\r\n EDITORGANISATIONPATH: '/organisations/:id/:path?',\r\n UNAUTHORISED: '/unauthorised',\r\n PAGENOTFOUND: '/page-not-found',\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport enum DatePickerFormats {\r\n datepickerFormat = 'datepickerFormat',\r\n datePickerPlaceHolderText = 'datePickerPlaceHolderText',\r\n}\r\n\r\nexport type LocaleDatePickerFormatResult = {\r\n dateFormat: string;\r\n placeHolderText: string;\r\n};\r\n\r\nexport const useLocaleDatePickerFormat = (): LocaleDatePickerFormatResult => {\r\n const { t } = useTranslation('_dateFormats');\r\n\r\n return useCallback((): LocaleDatePickerFormatResult => {\r\n return {\r\n dateFormat: t(DatePickerFormats.datepickerFormat, 'dd MMM yyyy'),\r\n placeHolderText: t(DatePickerFormats.datePickerPlaceHolderText, 'DD MMM YYYY'),\r\n };\r\n }, [t])();\r\n};\r\n","import { useCallback } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { formatDate } from '@tq/ui-components';\r\n\r\n// should these be read from the JSON file?\r\nexport enum StandardDateFormats {\r\n fileNameSuffix = 'fileNameSuffix',\r\n date = 'date',\r\n dateAndTime = 'dateAndTime',\r\n}\r\n\r\ntype DateFormats = Record;\r\n\r\nexport const defaultValues: DateFormats = {\r\n date: 'dd MMM yyyy',\r\n dateAndTime: 'dd MMM yyyy HH:mm',\r\n fileNameSuffix: 'dd MMM yyyy',\r\n};\r\n\r\nexport type FormatLocaleDateReturnType = (\r\n dateValue: Date | string | undefined,\r\n format?: StandardDateFormats\r\n) => string;\r\n\r\nexport const useFormatLocaleDate = (): FormatLocaleDateReturnType => {\r\n const { t } = useTranslation('_dateFormats');\r\n\r\n return useCallback(\r\n (dateValue: Date | string | undefined, format?: StandardDateFormats) => {\r\n const returnFormat = format ?? StandardDateFormats.date;\r\n\r\n let parsedFormat = t(returnFormat, defaultValues[returnFormat]);\r\n if (parsedFormat === '') {\r\n parsedFormat = defaultValues.date;\r\n }\r\n\r\n return formatDate(dateValue, parsedFormat);\r\n },\r\n [t]\r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaChevronDown } from 'react-icons/fa';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Button,\r\n Flex,\r\n Icon,\r\n Menu,\r\n MenuButton,\r\n MenuItem,\r\n MenuList,\r\n UnderlineButton,\r\n} from '@tq/ui-components';\r\n\r\nimport { GetApplicationDocumentRequest } from 'api';\r\nimport { useIsMobile, useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\nimport { MenuOption } from 'types';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport interface ActionMenuButtonProps {\r\n options: MenuOption[];\r\n consultationId?: number;\r\n documentRequest?: GetApplicationDocumentRequest;\r\n label?: string;\r\n small?: boolean;\r\n darkContrast?: boolean;\r\n}\r\n\r\nexport const ActionMenuButton: React.FC = ({\r\n options,\r\n consultationId,\r\n documentRequest,\r\n label,\r\n small,\r\n darkContrast,\r\n}) => {\r\n const { t } = useTranslation('home');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const isMobile = useIsMobile();\r\n const buttonWidth = (): string => {\r\n if (isMobile) return '100% !important';\r\n return small ? '194px' : '248px';\r\n };\r\n\r\n const menuButtonTQStyles = tvs({\r\n tq: {\r\n height: '52px',\r\n borderColor: 'none',\r\n color: 'white',\r\n _active: {\r\n border: 'none',\r\n color: 'white',\r\n bgColor: '#0E3D44',\r\n },\r\n },\r\n });\r\n\r\n const tqMenuButtonComponent = darkContrast ? UnderlineButton : Button;\r\n\r\n return (\r\n \r\n }\r\n variant={tvs({ tq: 'secondary', ni: 'secondary' })}\r\n size={tvs({ ni: small ? 'sm' : 'md' })}\r\n borderColor={COLOURS.blue[600]}\r\n borderWidth={tvs({ ni: small ? 0 : 1 })}\r\n color={tvs({ tq: COLOURS.blue[600], ni: COLOURS.blue[600] })}\r\n height={tvs({ tq: '44px', ni: small ? '32px' : '44px' })}\r\n sx={tvs({ tq: darkContrast ? menuButtonTQStyles : {} })}\r\n as={tvs({ tq: () => tqMenuButtonComponent, ni: () => Button })}\r\n >\r\n {label ?? t('actions', 'Actions')}\r\n \r\n \r\n {options.map((option) => (\r\n option.onClick && option.onClick?.(consultationId, documentRequest)}\r\n >\r\n {option.iconRight ? (\r\n \r\n {option.label}\r\n {option.icon && }\r\n \r\n ) : (\r\n \r\n {option.icon && }\r\n {option.label}\r\n \r\n )}\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaEllipsisH } from 'react-icons/fa';\r\n\r\nimport {\r\n Box,\r\n Icon,\r\n IconButton,\r\n Menu,\r\n MenuButton,\r\n MenuItem,\r\n MenuList,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport { GetApplicationDocumentRequest } from 'api';\r\nimport { MenuOption } from 'types';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport interface ActionMenuButtonEllipsisProps {\r\n options: MenuOption[];\r\n consultationId?: number;\r\n documentRequest?: GetApplicationDocumentRequest;\r\n ariaLabel?: string;\r\n}\r\nexport const ActionMenuButtonEllipsis: React.FC = ({\r\n options,\r\n consultationId,\r\n documentRequest,\r\n ariaLabel,\r\n}) => {\r\n const { t } = useTranslation('action');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n return (\r\n \r\n \r\n }\r\n height='100%'\r\n fontSize={tvs({ tq: '1.25rem' })}\r\n onClick={(event) => event.stopPropagation()}\r\n />\r\n \r\n {options.map((option) => (\r\n {\r\n event.stopPropagation();\r\n option.onClick?.(consultationId, documentRequest);\r\n }}\r\n >\r\n \r\n {option.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { DfiReportsResponse, DfiReportResponse, KpiLateResponse } from 'types';\r\n\r\nexport const MOCK_DFI_ANNUAL_REPORTS_DATA: DfiReportsResponse = {\r\n listDfiAnnualReportItems: [\r\n {\r\n id: 1,\r\n reportYear: 2022,\r\n },\r\n {\r\n id: 2,\r\n reportYear: 2021,\r\n dateCompleted: new Date('2022-06-10'),\r\n },\r\n {\r\n id: 3,\r\n reportYear: 2020,\r\n dateCompleted: new Date('2021-07-01'),\r\n },\r\n {\r\n id: 4,\r\n reportYear: 2019,\r\n dateCompleted: new Date('2020-05-27'),\r\n },\r\n ],\r\n};\r\n\r\nexport const MOCK_LATE_RESPONSE_ITEMS_STATS: KpiLateResponse[] = [\r\n {\r\n lateResponseReason: 'Resource issues',\r\n lateResponseReasonCount: 30,\r\n lateResponseReasonPercentage: 38,\r\n },\r\n {\r\n lateResponseReason: 'High volume of work',\r\n lateResponseReasonCount: 10,\r\n lateResponseReasonPercentage: 13,\r\n },\r\n {\r\n lateResponseReason: 'Extension request refused',\r\n lateResponseReasonCount: 4,\r\n lateResponseReasonPercentage: 5,\r\n },\r\n {\r\n lateResponseReason: 'Tech issues - internal to the organisation',\r\n lateResponseReasonCount: 8,\r\n lateResponseReasonPercentage: 10,\r\n },\r\n {\r\n lateResponseReason: 'Tech issues - external to the organisation',\r\n lateResponseReasonCount: 12,\r\n lateResponseReasonPercentage: 15,\r\n },\r\n {\r\n lateResponseReason: 'Complexity of the case',\r\n lateResponseReasonCount: 11,\r\n lateResponseReasonPercentage: 14,\r\n },\r\n {\r\n lateResponseReason: 'Additional information required after consultation',\r\n lateResponseReasonCount: 3,\r\n lateResponseReasonPercentage: 4,\r\n },\r\n {\r\n lateResponseReason: 'Other',\r\n lateResponseReasonCount: 1,\r\n lateResponseReasonPercentage: 1,\r\n },\r\n];\r\n\r\nexport const MOCK_DRAFT_DFI_ANNUAL_REPORT_RESPONSE_DATA: DfiReportResponse = {\r\n reportYear: 2022,\r\n parentOrganisationName: 'Organisation 1',\r\n consulteeName: 'Bill Zuma',\r\n dateModified: new Date('2022-06-10'),\r\n infoOnLateResponse:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.',\r\n bestPracticeResponse:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.',\r\n statutoryTimelinessResponseStats: {\r\n totalConsultationRequestsReceived: 500,\r\n totalConsultationsRespondedInAgreedTimeframe: 400,\r\n percentageConsultationsRespondedInAgreedTimeframe: 80,\r\n totalConsultationsWithResponsesWithin21Days: 300,\r\n percentageConsultationsWithResponsesWithin21Days: 60,\r\n totalConsultationsRespondedLate: 100,\r\n percentageConsultationsRespondedLate: 20,\r\n totalConsultationsWithOutstandingResponses: 10,\r\n averageDaysTakenToRespondRequests: 2,\r\n },\r\n\r\n lateResponseStatItems: MOCK_LATE_RESPONSE_ITEMS_STATS,\r\n\r\n statutoryTimeframeExceededStats: {\r\n totalStatutoryConsultationsWithLateResponses: 10,\r\n totalStatutoryConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline: 10,\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline: 10,\r\n totalStatutoryConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline: 10,\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline: 10,\r\n totalStatutoryConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline: 10,\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline: 10,\r\n totalStatutoryConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline: 10,\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline: 10,\r\n totalStatutoryLateResponses: 8,\r\n totalStatutoryLateResponsesSubmitted1to7DaysPostDeadline: 5,\r\n totalStatutoryWithOutstandingResponses: 3,\r\n },\r\n\r\n agreedExtensionStats: {\r\n totalStatutoryConsultationsWithExtensionsTimeframe: 10,\r\n totalStatutoryConsultationResponsesWithinExtensionTimeframe: 10,\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days: 10,\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days: 10,\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days: 10,\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days: 10,\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days: 10,\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days: 10,\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended22To28Days: 10,\r\n percentageConsultationsWithExtensionsTimeframeExtended22To28Days: 10,\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays: 10,\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays: 10,\r\n },\r\n\r\n nonStatutoryTimelinessResponseStats: {\r\n totalConsultationRequestsReceived: 500,\r\n totalConsultationsRespondedInAgreedTimeframe: 400,\r\n percentageConsultationsRespondedInAgreedTimeframe: 80,\r\n totalConsultationsWithResponsesWithin21Days: 300,\r\n percentageConsultationsWithResponsesWithin21Days: 60,\r\n totalConsultationsRespondedLate: 100,\r\n percentageConsultationsRespondedLate: 20,\r\n totalConsultationsWithOutstandingResponses: 10,\r\n averageDaysTakenToRespondRequests: 2,\r\n },\r\n\r\n eiaConsultationStats: {\r\n totalEiaConsultationsReceived: 5,\r\n averageDaysTakenToRespondToEiaConsultations: 3,\r\n },\r\n\r\n tqEnTimelinessResponseStats: {},\r\n tqEnTimeframeExceededStats: {},\r\n tqEnAgreedExtensionStats: {},\r\n tqEnAppealConsultationStats: {},\r\n};\r\n\r\nexport const MOCK_COMPLETED_DFI_ANNUAL_REPORT_RESPONSE_DATA: DfiReportResponse = {\r\n ...MOCK_DRAFT_DFI_ANNUAL_REPORT_RESPONSE_DATA,\r\n dateCompleted: new Date('2022-07-01'),\r\n dateModified: new Date('2022-07-01'),\r\n path: 'https://placeholder-blob-url.co.uk',\r\n};\r\n\r\nexport const MOCK_KPI_TITLES: Record = {\r\n agreedExtensionStats: 'Breakdown of Agreed Extensions',\r\n averageDaysTakenToRespondToEiaConsultations:\r\n 'Average number of days taken to respond to EIA consultations',\r\n lateResponseStatItems: 'Late Responses (statutory consultations)',\r\n nonStatutoryTimelinessResponseStats: 'Timeliness of responses (non-statutory consultations)',\r\n outstandingResponseStats: 'Number of outstanding responses',\r\n statutoryTimeframeExceededStats: 'Statutory Timeframe Exceeded – Breakdown',\r\n statutoryTimelinessResponseStats:\r\n 'Timeliness of Consultation Responses (statutory consultations)',\r\n totalEiaConsultationsReceived: 'Total number of EIA consultations received',\r\n};\r\n\r\nexport const MOCK_KPI_METRICS: Record = {\r\n statutoryTimelinessResponseStats: [\r\n { label: 'Total number of statutory consultation requests received', value: 8 },\r\n {\r\n label:\r\n 'Total number of statutory consultation requests responded to with a substantive response within the agreed timeframe',\r\n value: 1,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultation requests responded to with a substantive response within the agreed timeframe',\r\n value: 12,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultation requests responded to with a substantive response within 21 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultation requests responded to with a substantive response within 21 days',\r\n value: 0,\r\n },\r\n { label: 'Total number of statutory consultations with late responses issued', value: 2 },\r\n { label: 'Percentage of statutory consultations with late responses issued', value: 25 },\r\n { label: 'Total number of statutory consultations with outstanding responses', value: 8 },\r\n {\r\n label:\r\n 'Average number of days taken to make a substantive response to statutory requests',\r\n value: 0,\r\n },\r\n ],\r\n lateResponseStatItems: [\r\n {\r\n lateResponseReason: 'Resource issues',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n {\r\n lateResponseReason: 'High volume of work',\r\n lateResponseReasonCount: 1,\r\n lateResponseReasonPercentage: 50,\r\n },\r\n {\r\n lateResponseReason: 'Extension request refused',\r\n lateResponseReasonCount: 1,\r\n lateResponseReasonPercentage: 50,\r\n },\r\n {\r\n lateResponseReason: 'Tech issues - internal to the organisation',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n {\r\n lateResponseReason: 'Tech issues - external to the organisation',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n {\r\n lateResponseReason: 'Complexity of the case',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n {\r\n lateResponseReason: 'Additional information required after consultation',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n {\r\n lateResponseReason: 'Other',\r\n lateResponseReasonCount: 0,\r\n lateResponseReasonPercentage: 0,\r\n },\r\n ],\r\n statutoryTimeframeExceededStats: [\r\n { label: 'Total number of statutory consultations with late responses', value: 2 },\r\n { value: 0 },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with late responses submitted within 1-7 days after the agreed deadline',\r\n value: 0,\r\n },\r\n { value: 0 },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with late responses submitted within 8-14 days after the agreed deadline',\r\n value: 0,\r\n },\r\n { value: 0 },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with late responses submitted within 15-28 days after the agreed deadline',\r\n value: 0,\r\n },\r\n { value: 1 },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with late responses submitted over 29 days after the agreed deadline',\r\n value: 50,\r\n },\r\n ],\r\n agreedExtensionStats: [\r\n {\r\n label: 'Total number of statutory consultations with agreed extensions of timeframe',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultation responses returned within an agreed extension timeframe',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 1-7 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 1-7 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 8-14 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 8-14 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 15-21 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 15-21 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 22-28 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 22-28 days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 29 days and over',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 29 days and over',\r\n value: 0,\r\n },\r\n ],\r\n outstandingResponseStats: [\r\n { label: 'Total number of statutory consultations with outstanding responses', value: 8 },\r\n ],\r\n totalEiaConsultationsReceived: [\r\n { label: 'Total number of EIA consultations received', value: 0 },\r\n ],\r\n averageDaysTakenToRespondToEiaConsultations: [\r\n { label: 'Average number of days taken to respond to EIA consultations', value: 0 },\r\n ],\r\n nonStatutoryTimelinessResponseStats: [\r\n { label: 'Total number of non-statutory consultation requests received', value: 12 },\r\n {\r\n label:\r\n 'Total number of non-statutory consultations responded to in the agreed timeframe',\r\n value: 0,\r\n },\r\n {\r\n label: 'Percentage of non-statutory consultations responded to in the agreed timeframe',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Total number of non-statutory consultations with substantive responses made within 21 calendar days',\r\n value: 0,\r\n },\r\n {\r\n label:\r\n 'Percentage of of non-statutory consultations with substantive responses made within 21 calendar days',\r\n value: 0,\r\n },\r\n { label: 'Total number of non-statutory consultations responded to late', value: 0 },\r\n { label: 'Percentage of non-statutory consultations responded to late', value: 0 },\r\n {\r\n label: 'Total number of non-statutory consultations with outstanding responses',\r\n value: 12,\r\n },\r\n {\r\n label:\r\n 'Average number of days taken to make a substantive response to non statutory requests',\r\n value: 0,\r\n },\r\n ],\r\n};\r\n","import {\r\n GetCaseDetailsResponse,\r\n Comment,\r\n Document,\r\n AddressResponse,\r\n ApplicationResponse,\r\n RelatedApplicationResponse,\r\n} from 'types';\r\nimport { GetApplicationDocumentResponse } from '../applications';\r\nimport { GetResponseDocumentResponse } from '../responses';\r\nimport { MapGeoJsonResponse } from '@tq/ui-components';\r\nimport { EMPTY_LAYER_DATA } from '../../test-util/setup/emptyLayerData';\r\n\r\nexport const MOCK_CASE_DETAILS_PLANS: Document[] = [\r\n {\r\n id: 1,\r\n name: '',\r\n datePublished: new Date('2021-04-21'),\r\n documentType: 'Drawing',\r\n drawingNumber: '29FKM48',\r\n description: 'Side view alterations',\r\n },\r\n {\r\n id: 2,\r\n name: '',\r\n datePublished: new Date('2021-03-30'),\r\n documentType: 'Plan',\r\n drawingNumber: '-',\r\n description: '-',\r\n },\r\n {\r\n id: 3,\r\n name: '',\r\n datePublished: new Date('2021-01-08'),\r\n documentType: 'Plan',\r\n drawingNumber: 'GLSJ348',\r\n description: 'Planning layout v2',\r\n },\r\n {\r\n id: 4,\r\n name: '',\r\n datePublished: new Date('2020-09-05'),\r\n documentType: 'Drawing',\r\n drawingNumber: '4K4MSK',\r\n description: '-',\r\n },\r\n {\r\n id: 5,\r\n name: '',\r\n datePublished: new Date('2019-08-04'),\r\n documentType: 'Drawing',\r\n drawingNumber: 'GLSJ348',\r\n description: 'Chimney extension suggestions',\r\n },\r\n];\r\n\r\nconst MOCK_CASE_DETAILS_DOCUMENT: Document = {\r\n id: 1,\r\n name: '',\r\n datePublished: new Date('2021-04-21'),\r\n documentType: 'Decision',\r\n description: 'Side view alterations',\r\n sensitive: true,\r\n};\r\n\r\nexport const MOCK_CASE_DETAILS_DOCUMENTS: Document[] = [\r\n MOCK_CASE_DETAILS_DOCUMENT,\r\n {\r\n id: 2,\r\n name: 'document 2',\r\n datePublished: new Date('2021-03-30'),\r\n documentType: 'Certificate',\r\n description: '-',\r\n sensitive: false,\r\n },\r\n {\r\n id: 3,\r\n name: 'document 3',\r\n datePublished: new Date('2021-01-8'),\r\n documentType: 'Minor Amendment',\r\n description: 'Planning layout v2',\r\n sensitive: true,\r\n },\r\n {\r\n id: 4,\r\n name: 'document 4',\r\n datePublished: new Date('2020-09-5'),\r\n documentType: 'Minor Amendment',\r\n description: '-',\r\n sensitive: false,\r\n },\r\n {\r\n id: 5,\r\n name: 'document 5',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Minor Amendment',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n {\r\n id: 6,\r\n name: 'document 6',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Legal Agreement',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n {\r\n id: 7,\r\n name: 'document 7',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Decision',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n {\r\n id: 8,\r\n name: 'document 8',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Minor Amendment',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n {\r\n id: 9,\r\n name: 'document 9',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Minor Amendment',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n {\r\n id: 10,\r\n name: 'document 10',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Minor Amendment',\r\n description: '4K4MSK',\r\n sensitive: true,\r\n },\r\n {\r\n id: 11,\r\n name: 'document 11',\r\n datePublished: new Date('2019-08-4'),\r\n documentType: 'Drawing',\r\n description: 'Chimney extension suggestions',\r\n sensitive: true,\r\n },\r\n];\r\n\r\nexport const MOCK_CASE_DETAILS_COMMENTS: Comment[] = [\r\n {\r\n commentOrder: 11,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-08-4'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: false,\r\n documents: [],\r\n },\r\n {\r\n commentOrder: 12,\r\n name: 'The Village People',\r\n datePublished: new Date('2019-08-3'),\r\n type: 'Support',\r\n isPetition: true,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 13,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-08-2'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 14,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-08-1'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 15,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-07-4'),\r\n type: 'Support',\r\n isPetition: true,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 16,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-07-3'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 17,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-07-2'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: true,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 18,\r\n name: 'The Village People',\r\n datePublished: new Date('2019-07-1'),\r\n type: 'Support',\r\n isPetition: false,\r\n isGroup: false,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n {\r\n commentOrder: 19,\r\n name: 'Benjamin Connor',\r\n datePublished: new Date('2019-06-30'),\r\n type: 'Neutral',\r\n isPetition: false,\r\n isGroup: false,\r\n documents: [MOCK_CASE_DETAILS_DOCUMENT],\r\n },\r\n];\r\n\r\nexport const MOCK_CASE_DETAILS_ADDRESS: AddressResponse = {\r\n address:\r\n 'Plots 1 2 12 12 12 12 12 12 1212 and 13 of previously approved residential development lands to the rear of 108 Coleraine Road Portsteward BT55 7JR',\r\n relatedApplicationId: 1,\r\n postcode: 'BT55 7JR',\r\n ward: 'Templepatrick',\r\n authority: 'Templepatrick',\r\n};\r\n\r\nexport const MOCK_GEO_JSON: MapGeoJsonResponse = {\r\n geoJson: EMPTY_LAYER_DATA,\r\n};\r\n\r\nexport const MOCK_CASE_DETAILS_APPLICATION: ApplicationResponse = {\r\n address: MOCK_CASE_DETAILS_ADDRESS,\r\n planningApplicationReferenceNo: 'LA01/2020/1353/F',\r\n applicationStatus: 'Valid',\r\n applicationType: 'Household planning permission',\r\n easting: 111222,\r\n northing: 222111,\r\n planningPortalReference: '1234567890',\r\n applicantsName: 'Bruce Banner2',\r\n dateReceived: new Date('2022-01-01'),\r\n decisionDate: new Date('2022-01-02'),\r\n permissionExpiryDate: new Date('2022-01-03'),\r\n dateValidated: new Date('2022-01-05'),\r\n applicationDecisionType: 'Granted',\r\n applicationDevelopmentType: 'Base',\r\n districtElectoralArea: 'Planet',\r\n wardName: 'Earth',\r\n latestNeighbourConsultationDate: new Date('2022-01-06'),\r\n neighbourConsultationExpiryDate: new Date('2022-01-07'),\r\n standardConsultationDate: new Date('2022-01-08'),\r\n standardConsultationExpiry: new Date('2022-01-09'),\r\n dateLastAdvertised: new Date('2022-01-10'),\r\n latestAdvertisementExpiryDate: new Date('2022-01-11'),\r\n committeeDate: new Date('2022-01-12'),\r\n applicationCalledInDate: new Date('2022-01-13'),\r\n departmentReferralDate: new Date('2022-01-14'),\r\n agentsName: 'Natasha Romanoff',\r\n agentsCompany: 'S.H.I.E.L.D',\r\n agentsPhoneNumber: '111-111-1111',\r\n agentsEmailAddress: 'nat@shield.org',\r\n caseOfficeName: 'Carol Danvers',\r\n caseOfficerContactNumber: 'NA',\r\n sensitive: true,\r\n proposalText:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ut ipsum et justo efficitur facilisis quis ut mauris. Phasellus faucibus pharetra felis. Nam aliquam non dolor vitae laoreet. Vivamus a euismod lectus. Sed faucibus vehicula odio ut scelerisque. Mauris faucibus blandit neque ut facilisis. Sed eu diam ac magna blandit interdum sed quis sapien. Vivamus blandit fermentum egestas.',\r\n plans: MOCK_CASE_DETAILS_PLANS,\r\n documents: MOCK_CASE_DETAILS_DOCUMENTS,\r\n comments: MOCK_CASE_DETAILS_COMMENTS,\r\n};\r\n\r\nexport const MOCK_RELATED_APPLICATIONS: RelatedApplicationResponse[] = [\r\n {\r\n ...MOCK_CASE_DETAILS_APPLICATION,\r\n address: MOCK_CASE_DETAILS_ADDRESS,\r\n relatedApplicationReferenceNumber: 'LA01/2020/2353/G1',\r\n applicationReferenceNumber: 'LA01/2020/2353/G2',\r\n dateReceived: new Date('2022-01-03'),\r\n decisionDate: new Date('2022-01-04'),\r\n proposalText:\r\n '123 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur ut ipsum et justo efficitur facilisis quis ut mauris. Phasellus faucibus pharetra felis. Nam aliquam non dolor vitae laoreet. Vivamus a euismod lectus. Sed faucibus vehicula odio ut scelerisque. Mauris faucibus blandit neque ut facilisis. Sed eu diam ac magna blandit interdum sed quis sapien. Vivamus blandit fermentum egestas.',\r\n singleLineOfAddress:\r\n 'Plots 1 2 12 12 12 12 12 12 1212 and 13, 108 Coleraine Road Portsteward BT55 7JR',\r\n },\r\n];\r\n\r\nexport const MOCK_RELATED_ADDRESSES: AddressResponse[] = [MOCK_CASE_DETAILS_ADDRESS];\r\n\r\nexport const MOCK_CASE_DETAILS: GetCaseDetailsResponse = {\r\n application: MOCK_CASE_DETAILS_APPLICATION,\r\n dataItemsToDisplay: [],\r\n relatedApplications: MOCK_RELATED_APPLICATIONS,\r\n relatedAddresses: MOCK_RELATED_ADDRESSES,\r\n};\r\n\r\nexport const MOCK_APPLICATION_DOCUMENT: GetApplicationDocumentResponse = {\r\n documentId: 1,\r\n applicationReferenceNumber: 'LA01/2020/2353/G',\r\n documentUri: '/1.pdf',\r\n};\r\n\r\nexport const MOCK_RESPONSE_DOCUMENT: GetResponseDocumentResponse = {\r\n consultationId: 1,\r\n responseId: 1,\r\n documentId: 1,\r\n documentUri: '/1.pdf',\r\n};\r\n","import { Consultation, ConsultationCard, PagedList } from '../../types';\r\nimport { MapConstraintDetail } from '../../types/MapConstraintDetail';\r\n\r\nexport const MOCK_CONSULTATION_CARD: ConsultationCard = {\r\n id: 1,\r\n status: 'Closed',\r\n consultationType: 'Statutory',\r\n category: 'Regionally significant',\r\n assigneeId: 1,\r\n assignee: 'Bill Zuma',\r\n authority: 'Antrim and newtonabey borough council',\r\n address: 'Land off Rugby Road and Coventry Road, Newtonabbey, BT32 7JN',\r\n reference: 'LA09/2021/0613/F',\r\n summaryDescription:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin ullamcorper ut ipsum ut iaculis. Donec iaculis ligula quis augue vulputate, et tincidunt tellus rutrum. Vivamus in pellentesque lacus, sit amet dapibus sapien. Curabitur efficitur laoreet nibh non dignissim. Suspendisse aliquet et nisl id bibendum. Fusce finibus, lorem vel accumsan venenatis, quam nunc scelerisque mauris, et placerat nunc enim tempus lacus. Nulla ultricies odio non aliquam elementum. Nullam eget tempor tortor. Donec tincidunt pellentesque sapien, sed feugiat dolor sodales et. Donec ornare sollicitudin maximus. Quisque consequat efficitur arcu, a sodales ligula ultrices eu. In at mauris id est imperdiet vulputate tristique eget massa. Curabitur id auctor quam. Sed scelerisque libero et odio accumsan fermentum.',\r\n requestedDate: new Date('2022-01-01'),\r\n deadlineDate: new Date(`${new Date().getFullYear() + 1}-12-31`),\r\n hasAnyResponses: true,\r\n isArchived: false,\r\n};\r\n\r\nexport const MOCK_CONSULTATION_CARD_RPC: ConsultationCard = {\r\n ...MOCK_CONSULTATION_CARD,\r\n address: 'Rathfriland Baptist Church Loughbrickland Road Rathfriland Down BT34 5BY',\r\n consultationType: 'RPC',\r\n id: 2,\r\n};\r\n\r\nexport const MOCK_CONSTRAINT: MapConstraintDetail = {\r\n constraintCode: 'VenTestCode1',\r\n constraintName: 'Ven Constraint 1',\r\n description: 'Affected Constraint Description 1',\r\n enabled: true,\r\n id: 1081,\r\n tenantId: 'cfb86436-414d-4459-9545-93eec37615a2',\r\n};\r\n\r\nexport const MOCK_SORT_OPTIONS = {\r\n sortOptions: [\r\n {\r\n value: '1',\r\n label: 'Date requested',\r\n },\r\n {\r\n value: '2',\r\n label: 'Furthest deadline',\r\n },\r\n {\r\n value: '3',\r\n label: 'Nearest deadline',\r\n },\r\n {\r\n value: '4',\r\n label: 'Date requested',\r\n },\r\n ],\r\n};\r\n\r\nexport const MOCK_CONSULTATION: Consultation = {\r\n ...MOCK_CONSULTATION_CARD,\r\n lastVisitedDate: new Date('2022-01-15'),\r\n lastVisitedConsulteeId: 11,\r\n lastVisitedBy: 'Sophie Jones',\r\n reasonForConsultation: '',\r\n summaryDescription: MOCK_CONSULTATION_CARD.summaryDescription,\r\n uprn: '123456789012',\r\n caseOfficerName: 'Bruce Banner',\r\n caseOfficerContactNumber: '07777 123456',\r\n caseOfficerContactEmail: 'email@example.com',\r\n hasExtensionRequest: false,\r\n hasAnyResponses: true,\r\n lastRespondedDate: new Date('2022-01-15 01:00:00'),\r\n lastRespondedConsulteeId: 11,\r\n lastRespondedBy: 'Sophie Jones',\r\n isArchived: false,\r\n notes: [\r\n {\r\n id: 1,\r\n noteDate: new Date('2029-12-31 01:00:00'),\r\n noteText: 'Case details updated',\r\n noteType: 'Internal',\r\n consulteeName: 'Ted Barnes',\r\n },\r\n ],\r\n questions: [\r\n {\r\n id: 1,\r\n questionNumber: 2,\r\n text: 'Are there any proposals for road works which may affect the property?',\r\n defaultAnswer:\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tincidunt rutrum rhoncus. Aliquam nec volutpat nisi. Nulla facilisi. Nunc sed leo quis augue accumsan aliquet sit amet vel tellus 1',\r\n },\r\n ],\r\n consultationMapConstraintDetails: [MOCK_CONSTRAINT],\r\n};\r\n\r\nexport const MOCK_CONSULTATION_WITHOUT_CONSTRAINTS: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n consultationMapConstraintDetails: [],\r\n};\r\n\r\nexport const MOCK_CONSULTATION_WITHOUT_NOTES: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n notes: [],\r\n questions: [],\r\n};\r\n\r\nexport const MOCK_CONSULTATION_HAS_EXTENSION_REQUEST: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n hasExtensionRequest: true,\r\n};\r\n\r\nexport const MOCK_CONSULTATION_ASSIGNED_ANOTHER: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n assigneeId: 100,\r\n};\r\n\r\nexport const MOCK_CONSULTATION_ARCHIVED: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n isArchived: true,\r\n};\r\n\r\nexport const MOCK_CONSULTATION_RPC: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n id: 2,\r\n consultationType: 'RPC',\r\n};\r\n\r\nexport const MOCK_CONSULTATION_OVERDUE: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n status: 'Overdue',\r\n deadlineDate: new Date('2022-01-01'),\r\n};\r\n\r\nexport const MOCK_CONSULTATION_RPC_OVERDUE: Consultation = {\r\n ...MOCK_CONSULTATION_RPC,\r\n status: 'Overdue',\r\n deadlineDate: new Date('2022-01-01'),\r\n};\r\n\r\nexport const MOCK_CONSULTATION_WITH_ASSIGNEE_VISITOR_MATCH: Consultation = {\r\n ...MOCK_CONSULTATION,\r\n lastVisitedConsulteeId: 1,\r\n lastVisitedBy: 'Bill Zuma',\r\n};\r\n\r\nexport const MOCK_CONSULTATIONS: PagedList = {\r\n items: [MOCK_CONSULTATION_CARD, MOCK_CONSULTATION_CARD_RPC],\r\n};\r\n\r\nexport const MOCK_CONSULTATIONS_PAGE1: PagedList = {\r\n items: [\r\n MOCK_CONSULTATION_CARD,\r\n MOCK_CONSULTATION_CARD_RPC,\r\n MOCK_CONSULTATION_CARD,\r\n MOCK_CONSULTATION_CARD_RPC,\r\n MOCK_CONSULTATION_CARD,\r\n MOCK_CONSULTATION_CARD_RPC,\r\n MOCK_CONSULTATION_CARD,\r\n MOCK_CONSULTATION_CARD_RPC,\r\n MOCK_CONSULTATION_CARD,\r\n MOCK_CONSULTATION_CARD_RPC,\r\n ],\r\n};\r\n\r\nexport const MOCK_CONSULTATIONS_PAGE2: PagedList = {\r\n items: [MOCK_CONSULTATION_CARD, MOCK_CONSULTATION_CARD_RPC],\r\n};\r\n\r\nexport const MOCK_CONSULTATIONS_NONE: PagedList = {\r\n items: [],\r\n};\r\n","import { ConsultationResponse, ConsultationResponseAnswer } from 'types';\r\n\r\nexport const MOCK_RPC_PAST_RESPONSE_SUMMARY_CONTENT =\r\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tincidunt rutrum rhoncus.';\r\n\r\nexport const MOCK_RPC_RESPONSE_ANSWERS: ConsultationResponseAnswer[] = [\r\n {\r\n id: 1,\r\n consulteeId: 1,\r\n consulteeName: 'Bill Zuma',\r\n questionNumber: 1,\r\n question: 'Are there any proposals for road works which may affect the property?',\r\n answer: 'My answer 1',\r\n dateCreated: new Date('2022-02-02'),\r\n dateModified: new Date('2022-02-02'),\r\n organisation: {\r\n id: 1,\r\n },\r\n } as ConsultationResponseAnswer,\r\n {\r\n id: 2,\r\n consulteeId: 1,\r\n consulteeName: 'Bill Zuma',\r\n questionNumber: 2,\r\n question: 'Is the road adjoining the property maintainable by?',\r\n answer: 'My answer 2',\r\n dateCreated: new Date('2022-02-02'),\r\n dateModified: new Date('2022-02-02'),\r\n organisation: {\r\n id: 1,\r\n },\r\n } as ConsultationResponseAnswer,\r\n];\r\n\r\nexport const MOCK_RPC_PAST_RESPONSE_ANSWERS: ConsultationResponseAnswer[] = [\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[0],\r\n answer: 'My past answer 1',\r\n },\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[1],\r\n answer: 'My past answer 2',\r\n },\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[0],\r\n consulteeId: 2,\r\n consulteeName: 'Other consultee',\r\n answer: 'Other past answer 1',\r\n },\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[1],\r\n consulteeId: 2,\r\n consulteeName: 'Other consultee',\r\n answer: 'Other past answer 2',\r\n },\r\n];\r\n\r\nexport const MOCK_RPC_OTHER_RESPONSE_ANSWERS: ConsultationResponseAnswer[] = [\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[0],\r\n answer: 'Other past answer 1',\r\n consulteeId: 3,\r\n consulteeName: 'Other organisation consultee',\r\n organisation: { id: 2 },\r\n } as ConsultationResponseAnswer,\r\n {\r\n ...MOCK_RPC_RESPONSE_ANSWERS[1],\r\n answer: 'Other past answer 2',\r\n consulteeId: 3,\r\n consulteeName: 'Other organisation consultee',\r\n organisation: { id: 2 },\r\n } as ConsultationResponseAnswer,\r\n];\r\n\r\nexport const MOCK_RPC_RESPONSE: ConsultationResponse = {\r\n id: 1,\r\n consultationId: 2,\r\n consulteeId: 1,\r\n response: 'Test response',\r\n responseTypeId: 1,\r\n responseType: 'RPC',\r\n dateCreated: new Date('2022-02-02'),\r\n referenceNumber: 'CHR-1',\r\n documents: [],\r\n answers: MOCK_RPC_RESPONSE_ANSWERS,\r\n};\r\n\r\nexport const MOCK_RPC_PAST_RESPONSE: ConsultationResponse = {\r\n ...MOCK_RPC_RESPONSE,\r\n id: 2,\r\n referenceNumber: 'CHR-2',\r\n submittedDate: new Date('2022-02-02'),\r\n answers: MOCK_RPC_PAST_RESPONSE_ANSWERS,\r\n};\r\n\r\nexport const MOCK_RPC_OTHER_ORGANISATION_RESPONSE: ConsultationResponse = {\r\n ...MOCK_RPC_RESPONSE,\r\n id: 3,\r\n referenceNumber: 'CHR-3',\r\n submittedDate: new Date('2022-02-02'),\r\n answers: MOCK_RPC_OTHER_RESPONSE_ANSWERS,\r\n};\r\n\r\nexport const MOCK_RPC_RESPONSES = [\r\n MOCK_RPC_RESPONSE,\r\n MOCK_RPC_PAST_RESPONSE,\r\n MOCK_RPC_OTHER_ORGANISATION_RESPONSE,\r\n];\r\n","import { PastResponse } from 'types';\r\n\r\nexport const MOCK_RESPONSE_STANDARD_PAST_RESPONSE_DOCUMENT = {\r\n id: 1,\r\n responseId: 1,\r\n name: 'uploaded response document.doc',\r\n dateCreated: new Date('2021-06-06'),\r\n dateModified: new Date('2021-06-06'),\r\n response: true,\r\n};\r\n\r\nexport const MOCK_RESPONSE_PAST_RESPONSE_SUPPORTINGDOCUMENT = {\r\n id: 1,\r\n responseId: 1,\r\n name: 'uploaded response supporting documents.doc',\r\n dateCreated: new Date('2021-06-06'),\r\n dateModified: new Date('2021-06-06'),\r\n response: true,\r\n};\r\n\r\nexport const MOCK_RESPONSE_STANDARD_PAST_RESPONSE: PastResponse = {\r\n id: 1,\r\n type: '1',\r\n typeDefinition: 'Non-Statutory',\r\n responseDate: new Date('2022-02-02'),\r\n response: 'Test response',\r\n reasonForLateResponse: 'None',\r\n reasonForLateResponseDetail: 'None',\r\n document: MOCK_RESPONSE_STANDARD_PAST_RESPONSE_DOCUMENT,\r\n supportingDocuments: [MOCK_RESPONSE_PAST_RESPONSE_SUPPORTINGDOCUMENT],\r\n};\r\n","export enum ConsultationViewTypes {\r\n Open = 1,\r\n Archived = 2,\r\n}\r\n","/**\r\n * Hypertext Transfer Protocol (HTTP) response status codes.\r\n * @see {@link https://en.wikipedia.org/wiki/List_of_HTTP_status_codes}\r\n */\r\nenum HttpStatusCode {\r\n /**\r\n * The server has received the request headers and the client should proceed to send the request body\r\n * (in the case of a request for which a body needs to be sent; for example, a POST request).\r\n * Sending a large request body to a server after a request has been rejected for inappropriate headers would be inefficient.\r\n * To have a server check the request's headers, a client must send Expect: 100-continue as a header in its initial request\r\n * and receive a 100 Continue status code in response before sending the body. The response 417 Expectation Failed indicates the request should not be continued.\r\n */\r\n CONTINUE = 100,\r\n\r\n /**\r\n * The requester has asked the server to switch protocols and the server has agreed to do so.\r\n */\r\n SWITCHING_PROTOCOLS = 101,\r\n\r\n /**\r\n * A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request.\r\n * This code indicates that the server has received and is processing the request, but no response is available yet.\r\n * This prevents the client from timing out and assuming the request was lost.\r\n */\r\n PROCESSING = 102,\r\n\r\n /**\r\n * Standard response for successful HTTP requests.\r\n * The actual response will depend on the request method used.\r\n * In a GET request, the response will contain an entity corresponding to the requested resource.\r\n * In a POST request, the response will contain an entity describing or containing the result of the action.\r\n */\r\n OK = 200,\r\n\r\n /**\r\n * The request has been fulfilled, resulting in the creation of a new resource.\r\n */\r\n CREATED = 201,\r\n\r\n /**\r\n * The request has been accepted for processing, but the processing has not been completed.\r\n * The request might or might not be eventually acted upon, and may be disallowed when processing occurs.\r\n */\r\n ACCEPTED = 202,\r\n\r\n /**\r\n * SINCE HTTP/1.1\r\n * The server is a transforming proxy that received a 200 OK from its origin,\r\n * but is returning a modified version of the origin's response.\r\n */\r\n NON_AUTHORITATIVE_INFORMATION = 203,\r\n\r\n /**\r\n * The server successfully processed the request and is not returning any content.\r\n */\r\n NO_CONTENT = 204,\r\n\r\n /**\r\n * The server successfully processed the request, but is not returning any content.\r\n * Unlike a 204 response, this response requires that the requester reset the document view.\r\n */\r\n RESET_CONTENT = 205,\r\n\r\n /**\r\n * The server is delivering only part of the resource (byte serving) due to a range header sent by the client.\r\n * The range header is used by HTTP clients to enable resuming of interrupted downloads,\r\n * or split a download into multiple simultaneous streams.\r\n */\r\n PARTIAL_CONTENT = 206,\r\n\r\n /**\r\n * The message body that follows is an XML message and can contain a number of separate response codes,\r\n * depending on how many sub-requests were made.\r\n */\r\n MULTI_STATUS = 207,\r\n\r\n /**\r\n * The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response,\r\n * and are not being included again.\r\n */\r\n ALREADY_REPORTED = 208,\r\n\r\n /**\r\n * The server has fulfilled a request for the resource,\r\n * and the response is a representation of the result of one or more instance-manipulations applied to the current instance.\r\n */\r\n IM_USED = 226,\r\n\r\n /**\r\n * Indicates multiple options for the resource from which the client may choose (via agent-driven content negotiation).\r\n * For example, this code could be used to present multiple video format options,\r\n * to list files with different filename extensions, or to suggest word-sense disambiguation.\r\n */\r\n MULTIPLE_CHOICES = 300,\r\n\r\n /**\r\n * This and all future requests should be directed to the given URI.\r\n */\r\n MOVED_PERMANENTLY = 301,\r\n\r\n /**\r\n * This is an example of industry practice contradicting the standard.\r\n * The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect\r\n * (the original describing phrase was \"Moved Temporarily\"), but popular browsers implemented 302\r\n * with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307\r\n * to distinguish between the two behaviours. However, some Web applications and frameworks\r\n * use the 302 status code as if it were the 303.\r\n */\r\n FOUND = 302,\r\n\r\n /**\r\n * SINCE HTTP/1.1\r\n * The response to the request can be found under another URI using a GET method.\r\n * When received in response to a POST (or PUT/DELETE), the client should presume that\r\n * the server has received the data and should issue a redirect with a separate GET message.\r\n */\r\n SEE_OTHER = 303,\r\n\r\n /**\r\n * Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.\r\n * In such case, there is no need to retransmit the resource since the client still has a previously-downloaded copy.\r\n */\r\n NOT_MODIFIED = 304,\r\n\r\n /**\r\n * SINCE HTTP/1.1\r\n * The requested resource is available only through a proxy, the address for which is provided in the response.\r\n * Many HTTP clients (such as Mozilla and Internet Explorer) do not correctly handle responses with this status code, primarily for security reasons.\r\n */\r\n USE_PROXY = 305,\r\n\r\n /**\r\n * No longer used. Originally meant \"Subsequent requests should use the specified proxy.\"\r\n */\r\n SWITCH_PROXY = 306,\r\n\r\n /**\r\n * SINCE HTTP/1.1\r\n * In this case, the request should be repeated with another URI; however, future requests should still use the original URI.\r\n * In contrast to how 302 was historically implemented, the request method is not allowed to be changed when reissuing the original request.\r\n * For example, a POST request should be repeated using another POST request.\r\n */\r\n TEMPORARY_REDIRECT = 307,\r\n\r\n /**\r\n * The request and all future requests should be repeated using another URI.\r\n * 307 and 308 parallel the behaviors of 302 and 301, but do not allow the HTTP method to change.\r\n * So, for example, submitting a form to a permanently redirected resource may continue smoothly.\r\n */\r\n PERMANENT_REDIRECT = 308,\r\n\r\n /**\r\n * The server cannot or will not process the request due to an apparent client error\r\n * (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing).\r\n */\r\n BAD_REQUEST = 400,\r\n\r\n /**\r\n * Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet\r\n * been provided. The response must include a WWW-Authenticate header field containing a challenge applicable to the\r\n * requested resource. See Basic access authentication and Digest access authentication. 401 semantically means\r\n * \"unauthenticated\",i.e. the user does not have the necessary credentials.\r\n */\r\n UNAUTHORIZED = 401,\r\n\r\n /**\r\n * Reserved for future use. The original intention was that this code might be used as part of some form of digital\r\n * cash or micro payment scheme, but that has not happened, and this code is not usually used.\r\n * Google Developers API uses this status if a particular developer has exceeded the daily limit on requests.\r\n */\r\n PAYMENT_REQUIRED = 402,\r\n\r\n /**\r\n * The request was valid, but the server is refusing action.\r\n * The user might not have the necessary permissions for a resource.\r\n */\r\n FORBIDDEN = 403,\r\n\r\n /**\r\n * The requested resource could not be found but may be available in the future.\r\n * Subsequent requests by the client are permissible.\r\n */\r\n NOT_FOUND = 404,\r\n\r\n /**\r\n * A request method is not supported for the requested resource;\r\n * for example, a GET request on a form that requires data to be presented via POST, or a PUT request on a read-only resource.\r\n */\r\n METHOD_NOT_ALLOWED = 405,\r\n\r\n /**\r\n * The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.\r\n */\r\n NOT_ACCEPTABLE = 406,\r\n\r\n /**\r\n * The client must first authenticate itself with the proxy.\r\n */\r\n PROXY_AUTHENTICATION_REQUIRED = 407,\r\n\r\n /**\r\n * The server timed out waiting for the request.\r\n * According to HTTP specifications:\r\n * \"The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.\"\r\n */\r\n REQUEST_TIMEOUT = 408,\r\n\r\n /**\r\n * Indicates that the request could not be processed because of conflict in the request,\r\n * such as an edit conflict between multiple simultaneous updates.\r\n */\r\n CONFLICT = 409,\r\n\r\n /**\r\n * Indicates that the resource requested is no longer available and will not be available again.\r\n * This should be used when a resource has been intentionally removed and the resource should be purged.\r\n * Upon receiving a 410 status code, the client should not request the resource in the future.\r\n * Clients such as search engines should remove the resource from their indices.\r\n * Most use cases do not require clients and search engines to purge the resource, and a \"404 Not Found\" may be used instead.\r\n */\r\n GONE = 410,\r\n\r\n /**\r\n * The request did not specify the length of its content, which is required by the requested resource.\r\n */\r\n LENGTH_REQUIRED = 411,\r\n\r\n /**\r\n * The server does not meet one of the preconditions that the requester put on the request.\r\n */\r\n PRECONDITION_FAILED = 412,\r\n\r\n /**\r\n * The request is larger than the server is willing or able to process. Previously called \"Request Entity Too Large\".\r\n */\r\n PAYLOAD_TOO_LARGE = 413,\r\n\r\n /**\r\n * The URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request,\r\n * in which case it should be converted to a POST request.\r\n * Called \"Request-URI Too Long\" previously.\r\n */\r\n URI_TOO_LONG = 414,\r\n\r\n /**\r\n * The request entity has a media type which the server or resource does not support.\r\n * For example, the client uploads an image as image/svg+xml, but the server requires that images use a different format.\r\n */\r\n UNSUPPORTED_MEDIA_TYPE = 415,\r\n\r\n /**\r\n * The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.\r\n * For example, if the client asked for a part of the file that lies beyond the end of the file.\r\n * Called \"Requested Range Not Satisfiable\" previously.\r\n */\r\n RANGE_NOT_SATISFIABLE = 416,\r\n\r\n /**\r\n * The server cannot meet the requirements of the Expect request-header field.\r\n */\r\n EXPECTATION_FAILED = 417,\r\n\r\n /**\r\n * This code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol,\r\n * and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by\r\n * teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, including Google.com.\r\n */\r\n I_AM_A_TEAPOT = 418,\r\n\r\n /**\r\n * The request was directed at a server that is not able to produce a response (for example because a connection reuse).\r\n */\r\n MISDIRECTED_REQUEST = 421,\r\n\r\n /**\r\n * The request was well-formed but was unable to be followed due to semantic errors.\r\n */\r\n UNPROCESSABLE_ENTITY = 422,\r\n\r\n /**\r\n * The resource that is being accessed is locked.\r\n */\r\n LOCKED = 423,\r\n\r\n /**\r\n * The request failed due to failure of a previous request (e.g., a PROPPATCH).\r\n */\r\n FAILED_DEPENDENCY = 424,\r\n\r\n /**\r\n * The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.\r\n */\r\n UPGRADE_REQUIRED = 426,\r\n\r\n /**\r\n * The origin server requires the request to be conditional.\r\n * Intended to prevent \"the 'lost update' problem, where a client\r\n * GETs a resource's state, modifies it, and PUTs it back to the server,\r\n * when meanwhile a third party has modified the state on the server, leading to a conflict.\"\r\n */\r\n PRECONDITION_REQUIRED = 428,\r\n\r\n /**\r\n * The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes.\r\n */\r\n TOO_MANY_REQUESTS = 429,\r\n\r\n /**\r\n * The server is unwilling to process the request because either an individual header field,\r\n * or all the header fields collectively, are too large.\r\n */\r\n REQUEST_HEADER_FIELDS_TOO_LARGE = 431,\r\n\r\n /**\r\n * A server operator has received a legal demand to deny access to a resource or to a set of resources\r\n * that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451.\r\n */\r\n UNAVAILABLE_FOR_LEGAL_REASONS = 451,\r\n\r\n /**\r\n * A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.\r\n */\r\n INTERNAL_SERVER_ERROR = 500,\r\n\r\n /**\r\n * The server either does not recognize the request method, or it lacks the ability to fulfill the request.\r\n * Usually this implies future availability (e.g., a new feature of a web-service API).\r\n */\r\n NOT_IMPLEMENTED = 501,\r\n\r\n /**\r\n * The server was acting as a gateway or proxy and received an invalid response from the upstream server.\r\n */\r\n BAD_GATEWAY = 502,\r\n\r\n /**\r\n * The server is currently unavailable (because it is overloaded or down for maintenance).\r\n * Generally, this is a temporary state.\r\n */\r\n SERVICE_UNAVAILABLE = 503,\r\n\r\n /**\r\n * The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.\r\n */\r\n GATEWAY_TIMEOUT = 504,\r\n\r\n /**\r\n * The server does not support the HTTP protocol version used in the request\r\n */\r\n HTTP_VERSION_NOT_SUPPORTED = 505,\r\n\r\n /**\r\n * Transparent content negotiation for the request results in a circular reference.\r\n */\r\n VARIANT_ALSO_NEGOTIATES = 506,\r\n\r\n /**\r\n * The server is unable to store the representation needed to complete the request.\r\n */\r\n INSUFFICIENT_STORAGE = 507,\r\n\r\n /**\r\n * The server detected an infinite loop while processing the request.\r\n */\r\n LOOP_DETECTED = 508,\r\n\r\n /**\r\n * Further extensions to the request are required for the server to fulfill it.\r\n */\r\n NOT_EXTENDED = 510,\r\n\r\n /**\r\n * The client needs to authenticate to gain network access.\r\n * Intended for use by intercepting proxies used to control access to the network (e.g., \"captive portals\" used\r\n * to require agreement to Terms of Service before granting full Internet access via a Wi-Fi hotspot).\r\n */\r\n NETWORK_AUTHENTICATION_REQUIRED = 511,\r\n}\r\n\r\nexport default HttpStatusCode;\r\n","export enum KpiCategory {\r\n statutoryTimelinessResponseStats = 'statutoryTimelinessResponseStats',\r\n lateResponseStatItems = 'lateResponseStatItems',\r\n statutoryTimeframeExceededStats = 'statutoryTimeframeExceededStats',\r\n agreedExtensionStats = 'agreedExtensionStats',\r\n outstandingResponseStats = 'outstandingResponseStats',\r\n eiaConsultationStats = 'eiaConsultationStats',\r\n nonStatutoryTimelinessResponseStats = 'nonStatutoryTimelinessResponseStats',\r\n}\r\n","import { ValueLabelResponse } from './ValueLabelResponse';\r\n\r\nexport enum Permission {\r\n Admin = 'Admin',\r\n TQAdmin = 'TQ Admin',\r\n Consultee = 'Consultee',\r\n}\r\n\r\nexport type ExtendedPermissionType = ValueLabelResponse & { permissions?: string[] };\r\n","import { ApplicationUser, Organisation, Permission, Team, ValueLabelResponse } from 'types';\r\nimport {\r\n AddTeamResponse,\r\n GetAllTeamsResponse,\r\n GetTeamsResponse,\r\n UpdateTeamResponse,\r\n} from 'api';\r\n\r\nexport const MOCK_ORGANISATIONS: Organisation[] = [\r\n { organisationName: 'Organisation 1', id: 1, email: 'email1@org.org' },\r\n { organisationName: 'Organisation 2', id: 2, email: 'email2@org.org' },\r\n { organisationName: 'Organisation 3', id: 3, email: 'email3@org.org' },\r\n { organisationName: 'Organisation 4', id: 4, email: 'email4@org.org' },\r\n];\r\n\r\nexport const MOCK_TEAMS_DATA: Team[] = [\r\n {\r\n teamName: 'Team 1',\r\n teamId: 1,\r\n email: 'email1@Team.org',\r\n organisationId: 1,\r\n organisationName: 'Organisation 1',\r\n backOfficeCode: 'MGC-1',\r\n tenantId: '1',\r\n },\r\n {\r\n teamName: 'Team 2',\r\n teamId: 2,\r\n email: 'email2@Team.org',\r\n organisationId: 2,\r\n organisationName: 'Organisation 2',\r\n backOfficeCode: 'MGC-2',\r\n tenantId: '1',\r\n },\r\n {\r\n teamName: 'Team 3',\r\n teamId: 3,\r\n email: 'email3@Team.org',\r\n organisationId: 3,\r\n organisationName: 'Organisation 3',\r\n backOfficeCode: 'MGC-3',\r\n tenantId: '1b',\r\n },\r\n {\r\n teamName: 'Team 4',\r\n teamId: 4,\r\n email: 'email4@Team.org',\r\n organisationId: 4,\r\n organisationName: 'Organisation 4',\r\n backOfficeCode: 'MGC-4',\r\n tenantId: '1a',\r\n },\r\n];\r\n\r\nexport const MOCK_TEAM_OPTIONS: ValueLabelResponse[] = [\r\n { label: 'Belfast city team', value: 0 },\r\n { label: 'RPC', value: 1 },\r\n { label: 'Planning committee', value: 2 },\r\n { label: 'Subject Matter Experts', value: 3 },\r\n];\r\n\r\nexport const MOCK_PERMISSIONS: ValueLabelResponse[] = [\r\n {\r\n label: Permission.Admin,\r\n value: 1,\r\n },\r\n {\r\n label: Permission.Consultee,\r\n value: 2,\r\n },\r\n {\r\n label: Permission.TQAdmin,\r\n value: 3,\r\n },\r\n];\r\n\r\nexport const MOCK_PERMISSIONS_NEW_TENANT: ValueLabelResponse[] = [\r\n {\r\n label: Permission.Admin,\r\n value: 4,\r\n },\r\n {\r\n label: Permission.Consultee,\r\n value: 5,\r\n },\r\n {\r\n label: Permission.TQAdmin,\r\n value: 6,\r\n },\r\n];\r\n\r\nexport const MOCK_USER_DATA: ApplicationUser[] = [\r\n {\r\n id: 10000001,\r\n name: 'name1',\r\n email: 'user1@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[0]],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000002,\r\n name: 'name2',\r\n email: 'user2@email.com',\r\n teams: [\r\n MOCK_TEAM_OPTIONS[0],\r\n MOCK_TEAM_OPTIONS[1],\r\n MOCK_TEAM_OPTIONS[2],\r\n MOCK_TEAM_OPTIONS[3],\r\n ],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000003,\r\n name: 'name3',\r\n email: 'user3@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[0]],\r\n permission: MOCK_PERMISSIONS[1],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000004,\r\n name: 'name4',\r\n email: 'user4@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[1], MOCK_TEAM_OPTIONS[2]],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000005,\r\n name: 'name5',\r\n email: 'user5@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[3]],\r\n permission: MOCK_PERMISSIONS[1],\r\n isRegistered: false,\r\n },\r\n {\r\n id: 10000006,\r\n name: 'name6',\r\n email: 'user6@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[0]],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000007,\r\n name: 'name7',\r\n email: 'user7@email.com',\r\n teams: [\r\n MOCK_TEAM_OPTIONS[0],\r\n MOCK_TEAM_OPTIONS[1],\r\n MOCK_TEAM_OPTIONS[2],\r\n MOCK_TEAM_OPTIONS[3],\r\n ],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000008,\r\n name: 'name8',\r\n email: 'user8@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[0]],\r\n permission: MOCK_PERMISSIONS[1],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000009,\r\n name: 'name9',\r\n email: 'user9@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[1], MOCK_TEAM_OPTIONS[2]],\r\n permission: MOCK_PERMISSIONS[0],\r\n isRegistered: true,\r\n },\r\n {\r\n id: 10000010,\r\n name: 'name10',\r\n email: 'user10@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[3]],\r\n permission: MOCK_PERMISSIONS[1],\r\n isRegistered: false,\r\n },\r\n {\r\n id: 10000011,\r\n name: 'name11',\r\n email: 'user11@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[3]],\r\n permission: MOCK_PERMISSIONS[1],\r\n isRegistered: false,\r\n },\r\n];\r\n\r\nexport const MOCK_USER_ADMIN_DATA: ApplicationUser[] = [\r\n {\r\n id: 10000001,\r\n name: 'name admin1',\r\n email: 'user-admin1@email.com',\r\n teams: [MOCK_TEAM_OPTIONS[0]],\r\n permission: MOCK_PERMISSIONS[2],\r\n isRegistered: true,\r\n },\r\n];\r\n\r\nexport const MOCK_ALL_TEAMS_RESPONSE: GetAllTeamsResponse = {\r\n organisations: MOCK_TEAM_OPTIONS,\r\n};\r\n\r\nexport const MOCK_ADD_TEAM_RESPONSE: AddTeamResponse = {\r\n teamId: 1,\r\n};\r\n\r\nexport const MOCK_UPDATE_TEAM_RESPONSE: UpdateTeamResponse = {\r\n id: 1,\r\n};\r\n\r\nconst paginationInfo = {\r\n currentPage: 1,\r\n pageSize: 10,\r\n totalCount: 4,\r\n totalPages: 1,\r\n};\r\n\r\nexport const MOCK_GET_TEAMS_RESPONSE: GetTeamsResponse = {\r\n teams: {\r\n items: MOCK_TEAMS_DATA,\r\n },\r\n paginationInfo,\r\n};\r\n","import { ConsultationResponse } from 'types';\r\nimport { GetResponsesResponse } from '../responses';\r\nimport { GetResponsesConsultationResponse } from '../responses/types/GetResponsesConsultationResponse';\r\nimport { GetResponsesConsultationResponseAnswer } from '../responses/types/GetResponsesConsultationResponseAnswer';\r\nimport { MOCK_ORGANISATIONS } from './mockTeamData';\r\n\r\nexport const MOCK_RESPONSE_PAST_RESPONSE_DOCUMENT = {\r\n id: 1,\r\n responseId: 1,\r\n name: 'content response details.doc',\r\n dateCreated: new Date('2021-06-06'),\r\n dateModified: new Date('2021-06-06'),\r\n response: true,\r\n};\r\n\r\nexport const MOCK_RESPONSE_PAST_RESPONSE: ConsultationResponse = {\r\n id: 1,\r\n consultationId: 1,\r\n consulteeId: 1,\r\n response: 'Test response',\r\n responseTypeId: 1,\r\n responseType: 'Consulted in error',\r\n dateCreated: new Date('2022-02-02'),\r\n referenceNumber: 'CHR-1',\r\n submittedDate: new Date('2022-02-02'),\r\n documents: [MOCK_RESPONSE_PAST_RESPONSE_DOCUMENT],\r\n answers: [],\r\n};\r\n\r\nexport const MOCK_RESPONSE_PAST_RESPONSES: ConsultationResponse[] = [\r\n MOCK_RESPONSE_PAST_RESPONSE,\r\n {\r\n ...MOCK_RESPONSE_PAST_RESPONSE,\r\n id: 2,\r\n referenceNumber: 'CHR-2',\r\n },\r\n {\r\n ...MOCK_RESPONSE_PAST_RESPONSE,\r\n id: 3,\r\n referenceNumber: 'CHR-3',\r\n },\r\n {\r\n ...MOCK_RESPONSE_PAST_RESPONSE,\r\n id: 4,\r\n referenceNumber: 'CHR-4',\r\n },\r\n {\r\n ...MOCK_RESPONSE_PAST_RESPONSE,\r\n id: 5,\r\n referenceNumber: 'CHR-5',\r\n submittedDate: undefined,\r\n documents: [],\r\n },\r\n];\r\n\r\nexport const MOCK_RESPONSE_ANSWER: GetResponsesConsultationResponseAnswer = {\r\n id: 1,\r\n responseId: 2,\r\n consulteeId: 1,\r\n consulteeName: 'Tom Kazansky',\r\n questionId: 1,\r\n question: 'You can be my wingman anytime',\r\n answer: 'Because you are dangerous',\r\n approved: true,\r\n questionNumber: 101,\r\n dateCreated: new Date('2022-02-02'),\r\n organisation: MOCK_ORGANISATIONS[0],\r\n};\r\n\r\nexport const MOCK_CONSULTATION_RESPONSE: GetResponsesConsultationResponse = {\r\n id: 11,\r\n consultationId: 1,\r\n consulteeId: 1,\r\n responseTypeId: 1,\r\n responseType: 'Consulted in error',\r\n response: 'Test response other answer',\r\n referenceNumber: 'CHR-1',\r\n dateCreated: new Date('2022-02-02'),\r\n submittedDate: new Date('2022-02-02'),\r\n documents: [MOCK_RESPONSE_PAST_RESPONSE_DOCUMENT],\r\n answers: [MOCK_RESPONSE_ANSWER],\r\n};\r\n\r\nexport const MOCK_RESPONSES_RESPONSE: GetResponsesResponse = {\r\n responses: [],\r\n otherResponses: [MOCK_CONSULTATION_RESPONSE],\r\n};\r\n\r\nexport const MOCK_RESPONSES_RESPONSE_WITH_PAST: GetResponsesResponse = {\r\n responses: MOCK_RESPONSE_PAST_RESPONSES as GetResponsesConsultationResponse[],\r\n otherResponses: [MOCK_CONSULTATION_RESPONSE],\r\n};\r\n\r\nexport const EMPTY_MOCK_RESPONSES_RESPONSE: GetResponsesResponse = {\r\n responses: [],\r\n otherResponses: [],\r\n};\r\n","import { AuditRequest } from 'types';\r\nimport { GetAuditRequestsResponse } from 'api';\r\nimport { addDays } from 'date-fns';\r\n\r\nconst mockHttpCodes = [200, 401, 404, 500];\r\n\r\nconst getRandomCode = (): number => {\r\n return mockHttpCodes[Math.floor(Math.random() * 3)];\r\n};\r\n\r\nconst formattedJsonString = JSON.stringify(\r\n {\r\n msg: {\r\n id: 999,\r\n fact1: 'fact 1 details',\r\n fact2: 'fact 2 details',\r\n fact3: 'fact 3 details',\r\n fact4: 'fact 4 details',\r\n fact5: 'fact 5 details',\r\n fact6: 'fact 6 details',\r\n fact7: 'fact 7 details',\r\n fact8: 'fact 8 details',\r\n fact9: 'fact 9 details',\r\n fact10: 'fact 10 details',\r\n fact11: 'fact 11 details',\r\n fact12: 'fact 12 details',\r\n fact13: 'fact 13 details',\r\n fact14: 'fact 14 details',\r\n fact15: 'fact 15 details',\r\n fact16: 'fact 16 details',\r\n fact17: 'fact 17 details',\r\n fact18: 'fact 18 details',\r\n fact19: 'fact 19 details',\r\n },\r\n },\r\n null,\r\n 2\r\n);\r\n\r\nexport const MOCK_SINGLE_REQUEST: AuditRequest = {\r\n id: 999,\r\n date: new Date(),\r\n httpCode: 200,\r\n status: 'Success',\r\n direction: 'Inbound',\r\n apiCall: '/call/test-data',\r\n apiUrl: '/call/test-data?query1=20',\r\n detail: formattedJsonString,\r\n responseJson: formattedJsonString,\r\n planningApplicationReferenceNo: '',\r\n};\r\n\r\nconst MOCK_TRAFFIC_DATA: AuditRequest[] = new Array(10)\r\n .slice(1)\r\n .fill(undefined)\r\n .map((_item, i: number) => {\r\n const returnHttpCode = getRandomCode();\r\n return {\r\n id: i,\r\n date: addDays(new Date(), 0 - i),\r\n httpCode: returnHttpCode,\r\n status: returnHttpCode < 300 ? 'Success' : 'Fail',\r\n direction: i % 2 === 0 ? 'Inbound' : 'Outbound',\r\n apiCall: '/call/' + i,\r\n planningApplicationReferenceNo: 'PA/2020/' + i,\r\n detail: JSON.stringify(\r\n {\r\n msg: {\r\n id: i,\r\n fact1: 'fact 1 details',\r\n fact2: 'fact 2 details',\r\n fact3: 'fact 3 details',\r\n fact4: 'fact 4 details',\r\n fact5: 'fact 5 details',\r\n fact6: 'fact 6 details',\r\n fact7: 'fact 7 details',\r\n fact8: 'fact 8 details',\r\n fact9: 'fact 9 details',\r\n fact10: 'fact 10 details',\r\n fact11: 'fact 11 details',\r\n fact12: 'fact 12 details',\r\n fact13: 'fact 13 details',\r\n fact14: 'fact 14 details',\r\n fact15: 'fact 15 details',\r\n fact16: 'fact 16 details',\r\n fact17: 'fact 17 details',\r\n fact18: 'fact 18 details',\r\n fact19: 'fact 19 details',\r\n },\r\n },\r\n null,\r\n 2\r\n ),\r\n } as AuditRequest;\r\n });\r\n\r\nconst paginationInfo = {\r\n currentPage: 1,\r\n pageSize: 10,\r\n totalCount: 14,\r\n totalPages: 2,\r\n};\r\n\r\nexport const MOCK_AUDIT_REQUEST_RESPONSE: GetAuditRequestsResponse = {\r\n paginationInfo,\r\n auditRequests: {\r\n items: MOCK_TRAFFIC_DATA,\r\n },\r\n};\r\n\r\nexport const MOCK_AUDIT_SEARCH_REQUEST_RESPONSE: GetAuditRequestsResponse = {\r\n paginationInfo,\r\n auditRequests: {\r\n items: MOCK_TRAFFIC_DATA.slice(1, 1),\r\n },\r\n};\r\n","import { IncomingConsultation } from 'types';\r\nimport { GetIncomingConsultationsResponse } from 'api';\r\n\r\nconst MOCK_TRAFFIC_DATA: IncomingConsultation[] = [\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 2,\r\n id: 519,\r\n incomingStatus: 'Created',\r\n incomingStatusId: 1,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test1',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 1,\r\n id: 520,\r\n incomingStatus: 'Processed',\r\n incomingStatusId: 2,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'U',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test2',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 4,\r\n id: 521,\r\n incomingStatus: 'Error',\r\n incomingStatusId: 3,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test3',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 5,\r\n id: 522,\r\n incomingStatus: 'Error',\r\n incomingStatusId: 3,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test4',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 2,\r\n id: 523,\r\n incomingStatus: 'Created',\r\n incomingStatusId: 1,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'U',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test5',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 0,\r\n id: 524,\r\n incomingStatus: 'Created',\r\n incomingStatusId: 1,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'U',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test6',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 0,\r\n id: 525,\r\n incomingStatus: 'Error',\r\n incomingStatusId: 3,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'U',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test7',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 3,\r\n id: 526,\r\n incomingStatus: 'Created',\r\n incomingStatusId: 1,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test8',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 8,\r\n id: 527,\r\n incomingStatus: 'Created',\r\n incomingStatusId: 1,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test9',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 6,\r\n id: 528,\r\n incomingStatus: 'Processed',\r\n incomingStatusId: 2,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'N',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test10',\r\n },\r\n {\r\n dateCreated: new Date(),\r\n dateReceived: new Date(),\r\n documentCount: 2,\r\n id: 529,\r\n incomingStatus: 'Processed',\r\n incomingStatusId: 2,\r\n messageId: '4da4eb93-07b7-4017-b227-bdbc158117c5',\r\n newOrUpdate: 'U',\r\n planningApplicationReferenceNo: 'Ref/Inbound/Test11',\r\n },\r\n];\r\n\r\nconst paginationInfo = {\r\n currentPage: 1,\r\n pageSize: 10,\r\n totalCount: 11,\r\n totalPages: 2,\r\n};\r\n\r\nexport const MOCK_INCOMING_CONSULTATIONS_RESPONSE: GetIncomingConsultationsResponse = {\r\n paginationInfo,\r\n incomingConsultations: {\r\n items: MOCK_TRAFFIC_DATA,\r\n },\r\n};\r\n","import { apiGet, GetAdminUsersResponse } from 'api';\r\n\r\nexport const getAdminUsers = (): Promise =>\r\n apiGet('adminusers');\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, updateConsultee } from 'api';\r\nimport { UpdateAdminUserRequest } from '../types';\r\n\r\nexport const useUpdateAdminUser = (): UseMutationResult<\r\n unknown,\r\n unknown,\r\n UpdateAdminUserRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(updateConsultee, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getTQAdmins] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageConsultees] });\r\n },\r\n });\r\n};\r\n","import { apiGet } from 'api';\r\nimport { GetApplicationDocumentRequest, GetApplicationDocumentResponse } from '../../types';\r\n\r\nexport const getApplicationDocument = (\r\n request: GetApplicationDocumentRequest\r\n): Promise =>\r\n apiGet(`applications/document/${request.documentId}`);\r\n","import { apiGet } from 'api';\r\nimport { GetCaseDetailsResponse } from 'types';\r\n\r\nexport const getCaseDetails = (consultationId: number): Promise =>\r\n apiGet(`consultations/${consultationId}/casedetail`);\r\n","export const API_QUERY_KEYS = {\r\n getApplicationDocument: 'getApplicationDocument',\r\n getAuditRequests: 'getAuditRequests',\r\n getCaseDetails: 'getCaseDetails',\r\n getConsultation: 'getConsultation',\r\n getConsultations: 'getConsultations',\r\n getConsulteePermission: 'getConsulteePermission',\r\n getConsultees: 'getConsultees',\r\n getConsulteeTeams: 'getConsulteeTeams',\r\n getDfiAnnualReport: 'getDfiAnnualReport',\r\n getTqEnAnnualReport: 'getTqEnAnnualReport',\r\n getDfiAnnualReports: 'getDfiAnnualReports',\r\n getFilterAuthorities: 'getFilterAuthorities',\r\n getFilterCategories: 'getFilterCategories',\r\n getFilterConsultationTypes: 'getFilterConsultationTypes',\r\n getFilterStatuses: 'getFilterStatuses',\r\n getExtensionRequestStatuses: 'getExtensionRequestStatuses',\r\n getExtensionRequestsReport: 'getExtensionRequestsReport',\r\n getMap: 'getMap',\r\n getManageTeamConsultees: 'getManageTeamConsultees',\r\n getAllTeams: 'getAllTeams',\r\n getParentOrganisation: 'getParentOrganisation',\r\n getParentOrganisations: 'getParentOrganisations',\r\n getAllParentOrganisations: 'getAllParentOrganisations',\r\n getPermissions: 'getPermissions',\r\n getReasonsForLateResponse: 'getReasonsForLateResponse',\r\n getResponseTypes: 'getResponseTypes',\r\n getResponses: 'getResponses',\r\n getStatisticsReport: 'getStatisticsReport',\r\n getLateResponsesReport: 'getLateResponsesReport',\r\n getOutstandingResponsesReport: 'getOutstandingResponsesReport',\r\n getRespondedOnTimeReport: 'getRespondedOnTimeReport',\r\n getRespondedYearToDateReport: 'getRespondedYearToDateReport',\r\n getTQAdmins: 'getTQAdmins',\r\n getManageConsultees: 'getManageConsultees',\r\n getTeams: 'getTeams',\r\n getIncomingConsultations: 'getIncomingConsultations',\r\n getSortOptions: 'getSortOptions',\r\n getExceptionLogs: 'getExceptionLogs',\r\n getExceptionLogDetails: 'getExceptionLogDetails',\r\n};\r\n","export const QueryDefaults = {\r\n // 1 minute before data is refreshed, unless invalidated to say it's changed\r\n staleTime: 60000,\r\n};\r\n\r\nexport const PermissionsQueryDefaults = {\r\n // 15 minutes\r\n staleTime: 900000,\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { MapGeoJsonResponse } from '@tq/ui-components/dist/components/map';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { getMapPolygon } from '../methods';\r\nimport { QueryDefaults } from '../../constants';\r\n\r\nexport const useMapPolygon = (consultationId: number): UseQueryResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getMap, consultationId],\r\n () => getMapPolygon(consultationId),\r\n QueryDefaults\r\n );\r\n","import { MapGeoJsonResponse } from '@tq/ui-components/dist/components/map';\r\n\r\nimport { apiGet } from 'api';\r\n\r\nexport const getMapPolygon = (consultationId: number): Promise =>\r\n apiGet(`consultations/${consultationId}/polygon`).then((response) => {\r\n if (response?.geoJson?.features?.length && !response.geoJson.features[0].id) {\r\n response.geoJson.features[0].id = consultationId.toString();\r\n }\r\n return response;\r\n });\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getConsultees, GetConsulteesResponse, QueryDefaults } from 'api';\r\n\r\nexport const useConsultees = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getConsultees], getConsultees, QueryDefaults);\r\n","import { atom, useRecoilTransaction_UNSTABLE } from 'recoil';\r\n\r\nimport { UpsertParentOrganisationRequest } from 'api';\r\nimport { Organisation } from 'types';\r\n\r\nexport const organisationRequestState = atom({\r\n key: 'organisationRequest',\r\n default: undefined,\r\n});\r\n\r\nexport const organisationIdState = atom({\r\n key: 'organisationId',\r\n default: undefined,\r\n});\r\n\r\nexport const organisationState = atom({\r\n key: 'organisation',\r\n default: undefined,\r\n});\r\n\r\nexport const organisationCreatedState = atom({\r\n key: 'organisationCreated',\r\n default: undefined,\r\n});\r\n\r\nexport const useResetOrganisationState = (): (() => void) =>\r\n useRecoilTransaction_UNSTABLE(({ reset }) => () => {\r\n reset(organisationRequestState);\r\n reset(organisationIdState);\r\n reset(organisationState);\r\n });\r\n","import { atom, selector } from 'recoil';\r\n\r\nimport { annualDfiReportYearState } from 'store';\r\n\r\nexport const dfiReportBestPracticeResponseIsEditingState = atom({\r\n key: 'dfiReportBestPracticeResponseIsEditing',\r\n default: false,\r\n});\r\n\r\nexport const dfiReportInfoOnLateResponseIsEditingState = atom({\r\n key: 'dfiReportInfoOnLateResponseIsEditing',\r\n default: false,\r\n});\r\n\r\nexport const dfiReportInfoOnLateResponseState = atom({\r\n key: 'dfiReportInfoOnLateResponse',\r\n default: '',\r\n});\r\n\r\nexport const tqEnReportInfoOnLateResponseState = atom({\r\n key: 'tqEnReportInfoOnLateResponse',\r\n default: '',\r\n});\r\n\r\nexport const dfiReportBestPracticeResponseState = atom({\r\n key: 'dfiReportBestPracticeResponse',\r\n default: '',\r\n});\r\n\r\nexport const tqEnReportBestPracticeResponseState = atom({\r\n key: 'tqEnReportBestPracticeResponse',\r\n default: '',\r\n});\r\n\r\nexport const dfiReportIsEditingState = selector({\r\n key: 'dfiReportIsEditing',\r\n get: ({ get }) =>\r\n get(dfiReportInfoOnLateResponseIsEditingState) ||\r\n get(dfiReportBestPracticeResponseIsEditingState),\r\n});\r\n\r\nexport const dfiReportUpdateValuesState = selector({\r\n key: 'dfiReportUpdateValues',\r\n get: ({ get }) => {\r\n return {\r\n reportYear: get(annualDfiReportYearState),\r\n infoOnLateResponse: get(dfiReportInfoOnLateResponseState),\r\n bestPracticeResponse: get(dfiReportBestPracticeResponseState),\r\n };\r\n },\r\n});\r\n","/* eslint-disable no-useless-escape */\r\nexport const EMAIL_REGEX =\r\n /^([a-z0-9!#$%&*+\\-\\/=?^_`'’{|}~.]{0,128}[a-z0-9]{1,128}@[a-z0-9\\-.]{0,128}[a-z0-9]\\.[a-z0-9]{2,63})?$/i;\r\n\r\nexport const NAME_REGEX = /[a-z]{2,}/i;\r\n\r\nexport const MAX_FILE_SIZE = 20000000;\r\n\r\nexport const MAX_FILE_COUNT = 25;\r\n\r\nexport const ALLOWED_FILE_TYPES =\r\n 'pdf,bmp,png,gif,jpg,jpeg,plt,doc,docx,xls,xlsx,rtf,txt,csv,avi,mov,mp4,mpg,mpeg,wmv,gml,tif,tiff,zip,xml,json';\r\n","import { ALLOWED_FILE_TYPES } from '../../constants';\r\n\r\nexport const baseApiUrl = process.env.REACT_APP_CONSULTEE_HUB_API || '';\r\nexport const tenantId = process.env.REACT_APP_PP_TENANT_ID || '';\r\nexport const b2cClientId = process.env.REACT_APP_B2C_CLIENT_ID || '';\r\nexport const b2cScope = process.env.REACT_APP_B2C_SCOPE || '';\r\nexport const b2cAuthority = process.env.REACT_APP_B2C_AUTHORITY || '';\r\nexport const b2cPolicySignIn = process.env.REACT_APP_B2C_POLICY_SIGN_IN || '';\r\nexport const b2cPolicyImpersonate = process.env.REACT_APP_B2C_POLICY_IMPERSONATE || '';\r\nexport const mapsApiUrl = process.env.REACT_APP_WEB_MAPS_API_URL || '';\r\nexport const mapsApiKey = process.env.REACT_APP_WEB_MAPS_API_KEY || '';\r\nexport const appInsightsConnectionString =\r\n process.env.REACT_APP_APP_INSIGHTS_CONNECTION_STRING || '';\r\nexport const allowedFileTypes = process.env.REACT_APP_ALLOWED_FILE_TYPES || ALLOWED_FILE_TYPES;\r\nexport const theme = process.env.REACT_APP_THEME || 'northern-ireland';\r\nexport const languageCode = process.env.REACT_APP_LANGCODE || 'en-gb-x-ni';\r\nexport const growthBookUrl = process.env.REACT_APP_GROWTHBOOK_URL || '';\r\n","export const formatBytes = (bytes: number, decimals = 2): string => {\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = Math.max(decimals, 0);\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n};\r\n","export const B2C_FLOWS = {\r\n editProfile: process.env.REACT_APP_B2C_POLICY_EDIT_PROFILE,\r\n passwordReset: process.env.REACT_APP_B2C_POLICY_PASSWORD_RESET,\r\n passwordResetEmail: process.env.REACT_APP_B2C_POLICY_PASSWORD_RESET_EMAIL,\r\n};\r\n\r\nexport const REDIRECT_PATH = '';\r\n\r\n/**\r\n * Generates a URL to a specific B2c flow.\r\n *\r\n * @param flow - Open for extension, currently handling change password and edit profile.\r\n * @param state - Optional that will default to the flowId.\r\n * @returns string - URL to the B2C flow.\r\n */\r\nexport const getB2CLink = (flow: keyof typeof B2C_FLOWS, state?: string): string => {\r\n const flowId = B2C_FLOWS[flow];\r\n const b2cState = state ?? flowId;\r\n\r\n const redirectUri = `${window.location.origin}/${REDIRECT_PATH}`;\r\n\r\n const b2cLink = `${\r\n process.env.REACT_APP_B2C_AUTHORITY\r\n }/oauth2/v2.0/authorize?p=${flowId}&client_id=${\r\n process.env.REACT_APP_B2C_CLIENT_ID\r\n }&nonce=defaultNonce&redirect_uri=${encodeURIComponent(\r\n redirectUri\r\n )}&scope=openid&response_type=id_token&state=${b2cState}&lang=en`;\r\n\r\n return b2cLink.replace(/'/g, '').replace(/;/g, '');\r\n};\r\n","export const getFinancialYear = (): number => {\r\n const now = new Date();\r\n const year = now.getFullYear();\r\n return now.getMonth() > 2 ? year : year - 1;\r\n};\r\n","import { EMAIL_REGEX } from '../constants';\r\n\r\nexport const isEmailValid = (emailAddress: string): boolean => {\r\n return Boolean(emailAddress) && (emailAddress.match(EMAIL_REGEX)?.length ?? 0) > 0;\r\n};\r\n","import { NAME_REGEX } from '../constants';\r\n\r\nexport const isNameValid = (name: string): boolean => {\r\n return Boolean(name) && (name.match(NAME_REGEX)?.length ?? 0) > 0;\r\n};\r\n","import { ConsultationCard, Consultation } from 'types';\r\n\r\nexport const isOverdue = (\r\n consultation: Consultation | ConsultationCard | undefined\r\n): boolean =>\r\n consultation?.status === 'Overdue' ||\r\n (!consultation?.isArchived &&\r\n !!consultation?.deadlineDate &&\r\n new Date(consultation.deadlineDate).setHours(0, 0, 0, 0) <\r\n new Date().setHours(0, 0, 0, 0));\r\n","import { ConsultationCard, Consultation } from 'types';\r\n\r\nexport const isRpc = (consultation: Consultation | ConsultationCard | undefined): boolean =>\r\n consultation?.consultationType === 'RPC';\r\n","export const uniqBy = (arr: Array, predicate: (o: T) => string): Array => {\r\n if (!Array.isArray(arr)) {\r\n return [];\r\n }\r\n\r\n const cb = typeof predicate === 'function' ? predicate : (o: T) => o[predicate];\r\n\r\n const pickedObjects = arr\r\n .filter((item: T) => item)\r\n .reduce((map, item) => {\r\n const key = cb(item);\r\n\r\n if (!key) {\r\n return map;\r\n }\r\n\r\n return map.has(key) ? map : map.set(key, item);\r\n }, new Map())\r\n .values();\r\n\r\n return [...pickedObjects];\r\n};\r\n","export const upperCaseFirstLetter = (str: string): string => {\r\n return str.length ? `${str.charAt(0).toUpperCase()}${str.slice(1)}` : str;\r\n};\r\n","import { useFeatureValue, useFeatureIsOn } from '@growthbook/growthbook-react';\r\n\r\nexport const ToDisplayFeatureFlagged = (\r\n flagName: string,\r\n featureToBeDisabled: boolean\r\n): boolean => {\r\n const isFeatureEnabled = useFeatureIsOn(flagName);\r\n const featureFlag = useFeatureValue(flagName, false);\r\n\r\n const toDisplay = isFeatureEnabled && featureFlag;\r\n\r\n return featureToBeDisabled ? !toDisplay : toDisplay;\r\n};\r\n","import { ConsultationCard, Consultation } from 'types';\r\n\r\nexport const isInspection = (\r\n consultation: Consultation | ConsultationCard | undefined\r\n): boolean => consultation?.consultationType === 'Inspection';\r\n","import { atom, selector } from 'recoil';\r\nimport { GetTeamsRequest } from 'api';\r\nimport { upperCaseFirstLetter } from 'tools';\r\n\r\nexport const manageTeamPageSizeState = atom({\r\n key: 'manageTeamPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const manageTeamPageNumberState = atom({\r\n key: 'manageTeamPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const manageTeamSearchState = atom({\r\n key: 'manageTeamSearch',\r\n default: '',\r\n});\r\n\r\nexport const manageTeamOrganisationFilterState = atom({\r\n key: 'manageTeamOrganisationFilter',\r\n default: '',\r\n});\r\n\r\nexport const manageTeamSortByDescendingFilterState = atom({\r\n key: 'manageTeamSortByDescendingFilterState',\r\n default: undefined,\r\n});\r\n\r\nexport const manageTeamSortByColumnFilterState = atom({\r\n key: 'manageTeamSortByColumnFilterState',\r\n default: '',\r\n});\r\n\r\nexport const manageTeamsRequestState = selector({\r\n key: 'manageTeamSearchRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(manageTeamSortByDescendingFilterState);\r\n let sortByColumn = get(manageTeamSortByColumnFilterState);\r\n\r\n if (sortByColumn) {\r\n sortByColumn = sortByColumn.startsWith('team')\r\n ? sortByColumn\r\n : 'team' + upperCaseFirstLetter(sortByColumn);\r\n }\r\n\r\n return {\r\n nameOrEmailSearchText: get(manageTeamSearchState) ?? null,\r\n organisationName: get(manageTeamOrganisationFilterState),\r\n pageNumber: get(manageTeamPageNumberState),\r\n pageSize: get(manageTeamPageSizeState),\r\n ...(sortByColumn && {\r\n sortByValue: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n };\r\n },\r\n});\r\n","import { atom, selector, useRecoilTransaction_UNSTABLE } from 'recoil';\r\nimport { GetManageConsulteesRequest } from 'api';\r\nimport { Consultee } from 'types';\r\n\r\nexport const manageConsulteeActiveTab = atom({\r\n key: 'manageConsulteeActiveTab',\r\n default: 0,\r\n});\r\nexport const manageConsulteePageSizeState = atom({\r\n key: 'manageConsulteePageSize',\r\n default: 10,\r\n});\r\n\r\nexport const manageConsulteePageNumberState = atom({\r\n key: 'manageConsulteePageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const manageConsulteeSearchState = atom({\r\n key: 'manageConsulteeSearch',\r\n default: '',\r\n});\r\n\r\nexport const manageConsulteeOrganisationFilterState = atom({\r\n key: 'manageConsulteeOrganisationFilter',\r\n default: '',\r\n});\r\n\r\nexport const manageConsulteeRegistrationFilterState = atom({\r\n key: 'manageConsulteeRegistrationFilter',\r\n default: 'NotDeleted',\r\n});\r\n\r\nexport const manageConsulteeSortByDescendingFilterState = atom({\r\n key: 'manageConsulteeSortByDescendingFilterState',\r\n default: undefined,\r\n});\r\n\r\nexport const manageConsulteeSortByColumnFilterState = atom({\r\n key: 'manageConsulteeSortByColumnFilterState',\r\n default: '',\r\n});\r\n\r\nexport const manageConsulteesRequestState = selector({\r\n key: 'manageConsulteeSearchRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(manageConsulteeSortByDescendingFilterState);\r\n const sortByColumn = get(manageConsulteeSortByColumnFilterState);\r\n const nameOrEmailSearchText = get(manageConsulteeSearchState);\r\n\r\n return {\r\n ...(nameOrEmailSearchText && { nameOrEmailSearchText }),\r\n ...(get(manageConsulteeOrganisationFilterState) && {\r\n organisationName: get(manageConsulteeOrganisationFilterState),\r\n }),\r\n filteredByOption: get(manageConsulteeRegistrationFilterState),\r\n pageNumber: get(manageConsulteePageNumberState),\r\n pageSize: get(manageConsulteePageSizeState),\r\n ...(sortByColumn && {\r\n sortByValue: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n };\r\n },\r\n});\r\n\r\nexport const useResetGetConsulteeRequestState = (): (() => void) =>\r\n useRecoilTransaction_UNSTABLE(({ reset }) => () => {\r\n reset(manageConsulteeSearchState);\r\n reset(manageConsulteeOrganisationFilterState);\r\n reset(manageConsulteeRegistrationFilterState);\r\n reset(manageConsulteePageNumberState);\r\n reset(manageConsulteePageSizeState);\r\n reset(manageConsulteeSortByDescendingFilterState);\r\n reset(manageConsulteeSortByColumnFilterState);\r\n });\r\n\r\nexport const manageConsulteeUploadState = atom({\r\n key: 'manageConsulteeUploadState',\r\n default: false,\r\n});\r\n\r\nexport const manageUserDeleteState = atom({\r\n key: 'manageConsulteeDeleteState',\r\n default: false,\r\n});\r\n\r\nexport const manageUserToDeleteState = atom({\r\n key: 'manageUserToDeleteState',\r\n default: undefined,\r\n});\r\n","import { atom, selector } from 'recoil';\r\n\r\nimport { GetParentOrganisationsRequest } from 'api';\r\nimport { PaginationInfo } from 'types';\r\n\r\nexport const manageOrganisationsPageSizeState = atom({\r\n key: 'manageOrganisationsPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const manageOrganisationsPageNumberState = atom({\r\n key: 'manageOrganisationsPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const manageOrganisationsPaginationState = atom({\r\n key: 'manageOrganisationsPagination',\r\n default: undefined,\r\n});\r\n\r\nexport const mangeOrganisationsSearchState = atom({\r\n key: 'mangeOrganisationsSearch',\r\n default: '',\r\n});\r\n\r\nexport const mangeOrganisationsOrderByColumnState = atom({\r\n key: 'mangeOrganisationsOrderByColumn',\r\n default: '',\r\n});\r\n\r\nexport const mangeOrganisationsOrderByDescendingState = atom({\r\n key: 'mangeOrganisationsOrderByDescending',\r\n default: undefined,\r\n});\r\n\r\nexport const organisationsRequestState = selector({\r\n key: 'organisationsRequest',\r\n get: ({ get }) => {\r\n const orderByColumn = get(mangeOrganisationsOrderByColumnState);\r\n const nameOrEmailSearchText = get(mangeOrganisationsSearchState);\r\n\r\n const request: GetParentOrganisationsRequest = {\r\n pageSize: get(manageOrganisationsPageSizeState),\r\n pageNumber: get(manageOrganisationsPageNumberState),\r\n ...(orderByColumn && {\r\n orderByColumn,\r\n orderByDescending: get(mangeOrganisationsOrderByDescendingState),\r\n }),\r\n ...(nameOrEmailSearchText && { nameOrEmailSearchText }),\r\n };\r\n\r\n return request;\r\n },\r\n});\r\n","import { atom, selector, useRecoilTransaction_UNSTABLE } from 'recoil';\r\n\r\nimport { InviteConsulteeRequest } from 'api';\r\nimport { ValueLabelResponse, ApplicationUser } from 'types';\r\n\r\nexport const removeUserState = atom({\r\n key: 'removeUser',\r\n default: undefined,\r\n});\r\n\r\nexport const showRemoveUserModalState = atom({\r\n key: 'showRemoveUserModal',\r\n default: false,\r\n});\r\n\r\nexport const showInviteUserModalState = atom({\r\n key: 'showInviteUserModal',\r\n default: false,\r\n});\r\n\r\nexport const manageUsersPageSizeState = atom({\r\n key: 'manageUsersPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const manageUsersPageNumberState = atom({\r\n key: 'manageUsersPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const manageUsersSearchState = atom({\r\n key: 'manageUsersSearch',\r\n default: '',\r\n});\r\n\r\nexport const manageUsersFilterTeamState = atom({\r\n key: 'manageUsersFilterTeam',\r\n default: 0,\r\n});\r\n\r\nexport const manageUsersFilterPermissionState = atom({\r\n key: 'manageUsersFilterPermission',\r\n default: 0,\r\n});\r\n\r\nexport const manageUsersOrganisationFilterState = atom({\r\n key: 'manageUsersFilterOrganisation',\r\n default: 0,\r\n});\r\n\r\nexport const manageUsersIsRegisteredFilterState = atom({\r\n key: 'manageUsersIsRegisteredFilterOrganisation',\r\n default: 0,\r\n});\r\n\r\nexport const inviteEmailState = atom({\r\n key: 'inviteEmailField',\r\n default: '',\r\n});\r\n\r\nexport const inviteNameState = atom({\r\n key: 'inviteNameField',\r\n default: '',\r\n});\r\n\r\nexport const inviteTeamsState = atom({\r\n key: 'inviteTeams',\r\n default: [],\r\n});\r\n\r\nexport const invitePermissionState = atom({\r\n key: 'invitePermissionField',\r\n default: 0,\r\n});\r\n\r\nexport const inviteRequestState = selector({\r\n key: 'inviteFields',\r\n get: ({ get }) => ({\r\n name: get(inviteNameState),\r\n email: get(inviteEmailState),\r\n teamIds: get(inviteTeamsState).map((team) => team.value),\r\n permissionId: get(invitePermissionState),\r\n }),\r\n});\r\n\r\nexport const useResetInviteUserState = (): (() => void) =>\r\n useRecoilTransaction_UNSTABLE(({ reset }) => () => {\r\n reset(inviteNameState);\r\n reset(inviteEmailState);\r\n reset(inviteTeamsState);\r\n reset(invitePermissionState);\r\n });\r\n","import { atom, selector } from 'recoil';\r\n\r\nexport const consulteeIdState = atom({\r\n key: 'consulteeId',\r\n default: 0,\r\n});\r\n\r\nexport const consulteeNameState = atom({\r\n key: 'consulteeName',\r\n default: '',\r\n});\r\n\r\nexport const consulteeEmailState = atom({\r\n key: 'consulteeEmail',\r\n default: '',\r\n});\r\n\r\nexport const consulteeOrganisationIdsState = atom({\r\n key: 'consulteeOrganisationIds',\r\n default: [],\r\n});\r\n\r\nexport const consulteeParentOrganisationIdsState = atom({\r\n key: 'consulteeParentOrganisationIds',\r\n default: [],\r\n});\r\n\r\nexport const isAdminState = atom({\r\n key: 'isAdmin',\r\n default: false,\r\n});\r\n\r\nexport const isConsulteeState = atom({\r\n key: 'isConsultee',\r\n default: false,\r\n});\r\n\r\nexport const isTQAdminState = atom({\r\n key: 'isTQAdmin',\r\n default: false,\r\n});\r\n\r\nexport const hasPermissionState = selector({\r\n key: 'hasPermission',\r\n get: ({ get }) => get(isAdminState) || get(isConsulteeState) || get(isTQAdminState),\r\n});\r\n\r\nexport const isAdminOrConsulteeState = selector({\r\n key: 'isAdminOrConsultee',\r\n get: ({ get }) => get(isAdminState) || get(isConsulteeState),\r\n});\r\n\r\nexport const permissionValuesState = selector({\r\n key: 'permissionValuesValues',\r\n get: ({ get }) => {\r\n return {\r\n consulteeId: get(consulteeIdState),\r\n consulteeName: get(consulteeNameState),\r\n consulteeOrganisationIds: get(consulteeOrganisationIdsState),\r\n };\r\n },\r\n});\r\n","import { SortingRule } from 'react-table';\r\nimport { atom, selector } from 'recoil';\r\n\r\nimport { GetReportRequest } from 'api';\r\nimport { upperCaseFirstLetter, getFinancialYear } from 'tools';\r\nimport { PaginationInfo, Report, ReportData, ReportFilter } from 'types';\r\n\r\nexport const openReportModalState = atom({\r\n key: 'openReportModal',\r\n default: false,\r\n});\r\n\r\nexport const openReportModalMobileState = atom({\r\n key: 'openReportModalMobile',\r\n default: false,\r\n});\r\n\r\nexport const reportState = atom({\r\n key: 'report',\r\n default: undefined,\r\n});\r\n\r\nexport const reportStartDateState = atom({\r\n key: 'reportStartDate',\r\n default: undefined,\r\n});\r\n\r\nexport const reportEndDateState = atom({\r\n key: 'reportEndDate',\r\n default: new Date(),\r\n});\r\n\r\nexport const reportFiltersState = atom({\r\n key: 'reportFilters',\r\n default: [],\r\n});\r\n\r\nexport const reportTextState = atom({\r\n key: 'reportTextState',\r\n default: '',\r\n});\r\n\r\nexport const annualDfiReportYearState = atom({\r\n key: 'annualDfiReportYear',\r\n default: getFinancialYear(),\r\n});\r\n\r\nexport const tqEnAnnualReportYearState = atom({\r\n key: 'tqEnAnnualReportYear',\r\n default: getFinancialYear(),\r\n});\r\n\r\nexport const reportOrderByColumnState = atom({\r\n key: 'reportOrderByColumn',\r\n default: undefined,\r\n});\r\n\r\nexport const reportOrderByDescendingState = atom({\r\n key: 'reportOrderByDescending',\r\n default: false,\r\n});\r\n\r\nexport const reportPageSizeState = atom({\r\n key: 'reportPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const reportPageNumberState = atom({\r\n key: 'reportPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const reportDataState = atom({\r\n key: 'reportData',\r\n default: undefined,\r\n});\r\n\r\nexport const reportPaginationState = atom({\r\n key: 'reportPagination',\r\n default: undefined,\r\n});\r\n\r\nexport const reportSortByState = selector[]>({\r\n key: 'reportSortBy',\r\n get: ({ get }) => {\r\n const orderByColumn = get(reportOrderByColumnState);\r\n const orderByDescending = get(reportOrderByDescendingState);\r\n return orderByColumn ? [{ id: orderByColumn, desc: orderByDescending }] : [];\r\n },\r\n});\r\n\r\nexport const reportRequestState = selector({\r\n key: 'reportRequest',\r\n get: ({ get }) => {\r\n const report = get(reportState);\r\n const startDate = get(reportStartDateState);\r\n const endDate = get(reportEndDateState);\r\n const orderByColumn = get(reportOrderByColumnState);\r\n\r\n const request: GetReportRequest = {\r\n ...(report?.hasDateFilter && startDate ? { startDate: startDate.toISOString() } : null),\r\n ...(!report || report?.hasDateFilter ? { endDate: endDate.toISOString() } : null),\r\n pageSize: get(reportPageSizeState),\r\n pageNumber: get(reportPageNumberState),\r\n ...(orderByColumn\r\n ? {\r\n orderByColumn: upperCaseFirstLetter(orderByColumn),\r\n orderByDescending: get(reportOrderByDescendingState),\r\n }\r\n : null),\r\n };\r\n\r\n get(reportFiltersState).forEach((filter) => {\r\n request[filter.name] = filter.selectedItems.map((selected) => selected.value);\r\n });\r\n\r\n return request;\r\n },\r\n});\r\n","import { atom } from 'recoil';\r\n\r\nexport const approveResponseState = atom({\r\n key: 'approveResponse',\r\n default: false,\r\n});\r\n\r\nexport const responseTypeIdIsConsultedInErrorState = atom({\r\n key: 'responseTypeIdIsConsultedInError',\r\n default: false,\r\n});\r\n\r\nexport const responseTypeIdState = atom({\r\n key: 'responseTypeId',\r\n default: undefined,\r\n});\r\n\r\nexport const responseDetailState = atom({\r\n key: 'responseDetail',\r\n default: undefined,\r\n});\r\n","import { atom, selector } from 'recoil';\r\n\r\nimport { UploadedFile } from 'types';\r\nimport { responseDetailState, responseTypeIdState } from './responseForm';\r\n\r\nexport const responseFilesState = atom({\r\n key: 'responseFiles',\r\n default: undefined,\r\n});\r\n\r\nexport const responseSupportingFilesState = atom({\r\n key: 'responseSupportingFiles',\r\n default: undefined,\r\n});\r\n\r\nexport const responseUploadRequiredState = atom({\r\n key: 'uploadRequired',\r\n default: true,\r\n});\r\n\r\nexport const useResponseFilesState = selector({\r\n key: 'responseFilesState',\r\n get: ({ get }) => {\r\n return {\r\n responseTypeId: get(responseTypeIdState),\r\n responseDetail: get(responseDetailState),\r\n responseFiles: get(responseFilesState),\r\n supportingFiles: get(responseSupportingFilesState),\r\n requiredFiles: get(responseUploadRequiredState),\r\n };\r\n },\r\n});\r\n","import { atom, selector } from 'recoil';\r\n\r\nexport const reasonForLateReasonIsOtherState = atom({\r\n key: 'responseLateReasonIsOther',\r\n default: false,\r\n});\r\n\r\nexport const reasonForLateResponseIdState = atom({\r\n key: 'reasonForLateResponseId',\r\n default: undefined,\r\n});\r\n\r\nexport const reasonForLateResponseDetailState = atom({\r\n key: 'reasonForLateResponseDetail',\r\n default: undefined,\r\n});\r\n\r\nexport const reasonForLateResponseState = selector({\r\n key: 'reasonForLateResponseState',\r\n get: ({ get }) => {\r\n return {\r\n reasonForLateReasonIsOther: get(reasonForLateReasonIsOtherState),\r\n reasonForLateResponseId: get(reasonForLateResponseIdState),\r\n reasonForLateResponseDetail: get(reasonForLateResponseDetailState),\r\n };\r\n },\r\n});\r\n","import { atom } from 'recoil';\r\n\r\nexport const selectedConsultationIdsState = atom({\r\n key: 'selectedConsultationIds',\r\n default: [],\r\n});\r\n\r\nexport const consultationIdsToAssignState = atom({\r\n key: 'consultationIdsToAssign',\r\n default: [],\r\n});\r\n\r\nexport const consultationAtoms = [selectedConsultationIdsState, consultationIdsToAssignState];\r\n","import { atom } from 'recoil';\r\nimport { ValueLabelResponse } from 'types';\r\n\r\nexport const filterConsultationTypeState = atom({\r\n key: 'filterConsultationType',\r\n default: [],\r\n});\r\n\r\nexport const filterStatusState = atom({\r\n key: 'filterStatus',\r\n default: [],\r\n});\r\n\r\nexport const filterAssigneeState = atom({\r\n key: 'filterAssignee',\r\n default: [],\r\n});\r\n\r\nexport const filterAuthorityState = atom({\r\n key: 'filterAuthority',\r\n default: [],\r\n});\r\n\r\nexport const filterCategoryState = atom({\r\n key: 'filterCategory',\r\n default: [],\r\n});\r\n\r\nexport const filterDateFromState = atom({\r\n key: 'filterDateFrom',\r\n default: undefined,\r\n});\r\n\r\nexport const filterDateToState = atom({\r\n key: 'filterDateTo',\r\n default: undefined,\r\n});\r\n\r\nexport const filterTeamState = atom({\r\n key: 'filterTeam',\r\n default: [],\r\n});\r\n\r\nexport const filterAtoms = [\r\n filterConsultationTypeState,\r\n filterStatusState,\r\n filterAssigneeState,\r\n filterAuthorityState,\r\n filterCategoryState,\r\n filterDateFromState,\r\n filterDateToState,\r\n filterTeamState,\r\n];\r\n","import { atom } from 'recoil';\r\n\r\nexport const searchSortState = atom({\r\n key: 'searchSort',\r\n default: 3,\r\n});\r\n","import { atom } from 'recoil';\r\nimport { ConsultationViewTypes } from '../../types';\r\n\r\nexport const searchViewTypeState = atom({\r\n key: 'searchViewType',\r\n default: ConsultationViewTypes.Open,\r\n});\r\n","import { selector } from 'recoil';\r\nimport { GetFilterStatusesRequest } from '../../api';\r\nimport { ConsultationViewTypes } from '../../types';\r\nimport { searchViewTypeState } from './searchViewTypeState';\r\n\r\nexport const filterArchiveRequestState = selector({\r\n key: 'filterArchiveRequest',\r\n get: ({ get }) => ({\r\n archive: get(searchViewTypeState) === ConsultationViewTypes.Archived,\r\n }),\r\n});\r\n","import { atom, selector } from 'recoil';\r\n\r\nimport { GetConsultationsRequest, GetStatisticsRequest } from 'api';\r\nimport {\r\n filterAssigneeState,\r\n filterAuthorityState,\r\n filterCategoryState,\r\n filterConsultationTypeState,\r\n filterDateFromState,\r\n filterDateToState,\r\n filterStatusState,\r\n filterTeamState,\r\n} from './filter';\r\nimport { searchSortState } from './sort';\r\nimport { filterArchiveRequestState } from './filterArchiveRequestState';\r\nimport { searchViewTypeState } from './searchViewTypeState';\r\n\r\nexport const searchAssignedToMeState = atom({\r\n key: 'searchAssignedToMe',\r\n default: true,\r\n});\r\n\r\nexport const searchTextState = atom({\r\n key: 'searchText',\r\n default: '',\r\n});\r\n\r\nexport const searchPageNumberState = atom({\r\n key: 'searchPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const searchPageSizeState = atom({\r\n key: 'searchPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const searchAtoms = [\r\n searchViewTypeState,\r\n searchAssignedToMeState,\r\n searchTextState,\r\n searchPageNumberState,\r\n searchPageSizeState,\r\n];\r\n\r\nexport const searchRequestState = selector({\r\n key: 'searchRequest',\r\n get: ({ get }) => {\r\n const dateFrom = get(filterDateFromState);\r\n const dateTo = get(filterDateToState);\r\n\r\n return {\r\n ...get(filterArchiveRequestState),\r\n assignedToMe: get(searchAssignedToMeState),\r\n assigneeIds: get(filterAssigneeState).map((assignee) => assignee.value),\r\n authorityIds: get(filterAuthorityState).map((authority) => authority.value),\r\n categoryIds: get(filterCategoryState).map((category) => category.value),\r\n statusIds: get(filterStatusState).map((status) => status.value),\r\n teamIds: get(filterTeamState).map((team) => team.value),\r\n ...(dateFrom ? { dateFrom: dateFrom.toISOString() } : null),\r\n ...(dateTo ? { dateTo: dateTo.toISOString() } : null),\r\n typeIds: get(filterConsultationTypeState).map((type) => type.value),\r\n ...(get(searchTextState) ? { searchText: get(searchTextState) } : null),\r\n sortOptionId: get(searchSortState),\r\n pageSize: get(searchPageSizeState),\r\n pageNumber: get(searchPageNumberState),\r\n };\r\n },\r\n});\r\n\r\nexport const statisticsRequestState = selector({\r\n key: 'statisticsRequest',\r\n get: ({ get }) => ({\r\n ...get(filterArchiveRequestState),\r\n statusIds: get(filterStatusState).map((status) => status.value),\r\n }),\r\n});\r\n","import { atom } from 'recoil';\r\n\r\nexport const searchViewTabIndexState = atom({\r\n key: 'searchViewTabIndex',\r\n default: 0,\r\n});\r\n","import { atom } from 'recoil';\r\n\r\nexport const showAddNoteState = atom({\r\n key: 'showAddNote',\r\n default: false,\r\n});\r\n","import { atom } from 'recoil';\r\n\r\nexport const showRequestExtensionState = atom({\r\n key: 'showRequestExtension',\r\n default: false,\r\n});\r\n","import { UpdateTeamRequest, GetTeamsRequest } from 'api';\r\nimport { atom, selector } from 'recoil';\r\n\r\nexport const teamPageSizeState = atom({\r\n key: 'teamPageSizeState',\r\n default: 10,\r\n});\r\n\r\nexport const teamPageNumberState = atom({\r\n key: 'teamPageNumberState',\r\n default: 1,\r\n});\r\n\r\nexport const teamSortByDescendingFilterState = atom({\r\n key: 'teamSortByDescendingFilterState',\r\n default: undefined,\r\n});\r\n\r\nexport const teamSortByColumnFilterState = atom({\r\n key: 'teamSortByColumnFilterState',\r\n default: '',\r\n});\r\n\r\nexport const teamSearchState = atom({\r\n key: 'teamSearchState',\r\n default: '',\r\n});\r\n\r\nexport const teamEditingRowIdState = atom({\r\n key: 'teamEditingRowIdState',\r\n default: undefined,\r\n});\r\n\r\nexport const teamEditingRowTeamNameState = atom({\r\n key: 'teamEditingRowTeamNameState',\r\n default: '',\r\n});\r\n\r\nexport const teamEditingRowEmailState = atom({\r\n key: 'teamEditingRowEmailState',\r\n default: '',\r\n});\r\n\r\nexport const teamEditingRowBackofficeCodeState = atom({\r\n key: 'teamEditingRowBackofficeCodeState',\r\n default: '',\r\n});\r\n\r\nexport const teamsGetRequestState = selector({\r\n key: 'teamsGetRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(teamSortByDescendingFilterState);\r\n const sortByColumn = get(teamSortByColumnFilterState);\r\n\r\n return {\r\n pageSize: get(teamPageSizeState),\r\n pageNumber: get(teamPageNumberState),\r\n nameOrEmailSearchText: get(teamSearchState),\r\n organisationName: '',\r\n ...(sortByColumn && {\r\n sortByValue: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n };\r\n },\r\n});\r\n\r\nexport const teamUpdateRequestState = selector({\r\n key: 'teamUpdateRequestState',\r\n get: ({ get }) => {\r\n const request: UpdateTeamRequest = {\r\n id: 0,\r\n teamName: get(teamEditingRowTeamNameState),\r\n backOfficeTeamName: get(teamEditingRowBackofficeCodeState),\r\n email: get(teamEditingRowEmailState),\r\n };\r\n return request;\r\n },\r\n});\r\n","import { SortingRule } from 'react-table';\r\nimport { atom, selector } from 'recoil';\r\nimport { addDays } from 'date-fns';\r\n\r\nimport { AuditRequest, FilterOption, PaginationInfo } from '../../types';\r\nimport { GetAuditRequestsRequest } from '../../api';\r\n\r\nexport const trafficMonitorFiltersState = atom({\r\n key: 'trafficMonitorFilters',\r\n default: [],\r\n});\r\n\r\nexport const trafficMonitorStartDateState = atom({\r\n key: 'trafficMonitorStartDate',\r\n default: addDays(new Date(), -7),\r\n});\r\n\r\nexport const trafficMonitorEndDateState = atom({\r\n key: 'trafficMonitorEndDate',\r\n default: new Date(),\r\n});\r\n\r\nexport const trafficMonitorOrderByColumnState = atom({\r\n key: 'trafficMonitorOrderByColumn',\r\n default: undefined,\r\n});\r\n\r\nexport const trafficMonitorOrderByDescendingState = atom({\r\n key: 'trafficMonitorOrderByDescending',\r\n default: false,\r\n});\r\n\r\nexport const trafficMonitorPageSizeState = atom({\r\n key: 'trafficMonitorPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const trafficMonitorPageNumberState = atom({\r\n key: 'trafficMonitorPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const trafficMonitorDirectionState = atom({\r\n key: 'trafficMonitorDirectionState',\r\n default: 'Inbound',\r\n});\r\n\r\nexport const trafficMonitorTextSearchState = atom({\r\n key: 'trafficMonitorTextSearchState',\r\n default: '',\r\n});\r\n\r\nexport const trafficMonitorSortByState = selector[]>({\r\n key: 'trafficMonitorSortBy',\r\n get: ({ get }) => {\r\n const orderByColumn = get(trafficMonitorOrderByColumnState);\r\n const orderByDescending = get(trafficMonitorOrderByDescendingState);\r\n return orderByColumn ? [{ id: orderByColumn, desc: orderByDescending }] : [];\r\n },\r\n});\r\n\r\nexport const trafficMonitorDataState = atom({\r\n key: 'trafficMonitorDataState',\r\n default: undefined,\r\n});\r\n\r\nexport const trafficMonitorPaginationState = atom({\r\n key: 'trafficMonitorPaginationState',\r\n default: undefined,\r\n});\r\n\r\nexport const trafficMonitorRequestState = selector({\r\n key: 'auditRequestsRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(trafficMonitorOrderByDescendingState);\r\n const sortByColumn = get(trafficMonitorOrderByColumnState);\r\n\r\n const request = {\r\n keyword: get(trafficMonitorTextSearchState),\r\n startDate: get(trafficMonitorStartDateState)?.toISOString() ?? '',\r\n endDate: get(trafficMonitorEndDateState).toISOString() ?? '',\r\n apiCall:\r\n get(trafficMonitorFiltersState).filter((x) => x.name === 'apiCall')[0]\r\n ?.selectedItems[0]?.value ?? '',\r\n status:\r\n get(trafficMonitorFiltersState).filter((x) => x.name === 'status')[0]?.selectedItems[0]\r\n ?.value ?? '',\r\n httpCode:\r\n get(trafficMonitorFiltersState).filter((x) => x.name === 'httpCode')[0]\r\n ?.selectedItems[0]?.value ?? '',\r\n pageSize: get(trafficMonitorPageSizeState),\r\n pageNumber: get(trafficMonitorPageNumberState),\r\n ...(sortByColumn && {\r\n sortByValue: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n } as unknown as GetAuditRequestsRequest;\r\n\r\n get(trafficMonitorFiltersState).forEach((filter) => {\r\n if (!filter.isSearchText) {\r\n request[filter.name] = filter.selectedItems.map((selected) => selected.value);\r\n }\r\n });\r\n\r\n return request;\r\n },\r\n});\r\n","import { SortingRule } from 'react-table';\r\nimport { atom, selector } from 'recoil';\r\nimport { addDays } from 'date-fns';\r\nimport { AuditRequest, FilterOption, PaginationInfo } from '../../types';\r\nimport { GetAuditRequestsRequest } from '../../api';\r\n\r\nexport const outboundTrafficMonitorFiltersState = atom({\r\n key: 'outboundTrafficMonitorFilters',\r\n default: [],\r\n});\r\n\r\nexport const outboundTrafficMonitorStartDateState = atom({\r\n key: 'outboundTrafficMonitorStartDate',\r\n default: addDays(new Date(), -7),\r\n});\r\n\r\nexport const outboundTrafficMonitorEndDateState = atom({\r\n key: 'outboundTrafficMonitorEndDate',\r\n default: new Date(),\r\n});\r\n\r\nexport const outboundTrafficMonitorOrderByColumnState = atom({\r\n key: 'outboundTrafficMonitorOrderByColumn',\r\n default: undefined,\r\n});\r\n\r\nexport const outboundTrafficMonitorOrderByDescendingState = atom({\r\n key: 'outboundTrafficMonitorOrderByDescending',\r\n default: false,\r\n});\r\n\r\nexport const outboundTrafficMonitorPageSizeState = atom({\r\n key: 'outboundTrafficMonitorPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const outboundTrafficMonitorPageNumberState = atom({\r\n key: 'outboundTrafficMonitorPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const outboundTrafficMonitorDirectionState = atom({\r\n key: 'outboundTrafficMonitorDirectionState',\r\n default: 'Inbound',\r\n});\r\n\r\nexport const outboundTrafficMonitorTextSearchState = atom({\r\n key: 'outboundTrafficMonitorTextSearchState',\r\n default: '',\r\n});\r\n\r\nexport const outboundTrafficMonitorDataState = atom({\r\n key: 'outboundTrafficMonitorDataState',\r\n default: undefined,\r\n});\r\n\r\nexport const outboundTrafficMonitorPaginationState = atom({\r\n key: 'outboundTrafficMonitorPaginationState',\r\n default: undefined,\r\n});\r\n\r\nexport const outboundTrafficMonitorSortByState = selector[]>({\r\n key: 'outboundTrafficMonitorSortBy',\r\n get: ({ get }) => {\r\n const orderByColumn = get(outboundTrafficMonitorOrderByColumnState);\r\n const orderByDescending = get(outboundTrafficMonitorOrderByDescendingState);\r\n return orderByColumn ? [{ id: orderByColumn, desc: orderByDescending }] : [];\r\n },\r\n});\r\n\r\nexport const outboundTrafficMonitorRequestState = selector({\r\n key: 'outBoundAuditRequestsRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(outboundTrafficMonitorOrderByDescendingState);\r\n const sortByColumn = get(outboundTrafficMonitorOrderByColumnState);\r\n\r\n const request = {\r\n keyword: get(outboundTrafficMonitorTextSearchState),\r\n startDate: get(outboundTrafficMonitorStartDateState)?.toISOString() ?? '',\r\n endDate: get(outboundTrafficMonitorEndDateState).toISOString() ?? '',\r\n apiCall:\r\n get(outboundTrafficMonitorFiltersState).filter((x) => x.name === 'apiCall')[0]\r\n ?.selectedItems[0]?.value ?? '',\r\n status:\r\n get(outboundTrafficMonitorFiltersState).filter((x) => x.name === 'status')[0]\r\n ?.selectedItems[0]?.value ?? '',\r\n httpCode:\r\n get(outboundTrafficMonitorFiltersState).filter((x) => x.name === 'httpCode')[0]\r\n ?.selectedItems[0]?.value ?? '',\r\n pageSize: get(outboundTrafficMonitorPageSizeState),\r\n pageNumber: get(outboundTrafficMonitorPageNumberState),\r\n ...(sortByColumn && {\r\n sortByValue: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n } as unknown as GetAuditRequestsRequest;\r\n\r\n get(outboundTrafficMonitorFiltersState).forEach((filter) => {\r\n if (!filter.isSearchText) {\r\n request[filter.name] = filter.selectedItems.map((selected) => selected.value);\r\n }\r\n });\r\n\r\n return request;\r\n },\r\n});\r\n","import { SortingRule } from 'react-table';\r\nimport { atom, selector } from 'recoil';\r\n\r\nimport { GetExceptionLogsRequest } from 'api';\r\nimport { FilterOption } from 'types';\r\nimport { addDays } from 'date-fns';\r\nimport { ExceptionLog, ExceptionLogDetailsRequest } from 'types/ExceptionLog';\r\n\r\nexport const exceptionLogsDetailsModalState = atom({\r\n key: 'exceptionLogsDetailsModalState',\r\n default: false,\r\n});\r\n\r\nexport const exceptionLogsDetailsState = atom({\r\n key: 'exceptionLogsDetailsState',\r\n default: undefined,\r\n});\r\n\r\nexport const exceptionLogsFiltersState = atom({\r\n key: 'exceptionLogsFilters',\r\n default: [],\r\n});\r\n\r\nexport const exceptionLogsStartDateState = atom({\r\n key: 'exceptionLogsStartDate',\r\n default: addDays(new Date(), -7),\r\n});\r\n\r\nexport const exceptionLogsEndDateState = atom({\r\n key: 'exceptionLogsEndDate',\r\n default: new Date(),\r\n});\r\n\r\nexport const exceptionLogsOrderByColumnState = atom({\r\n key: 'exceptionLogsOrderByColumn',\r\n default: undefined,\r\n});\r\n\r\nexport const exceptionLogsOrderByDescendingState = atom({\r\n key: 'exceptionLogsOrderByDescending',\r\n default: false,\r\n});\r\n\r\nexport const exceptionLogsPageSizeState = atom({\r\n key: 'exceptionLogsPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const exceptionLogsPageNumberState = atom({\r\n key: 'exceptionLogsPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const exceptionLogsTextSearchState = atom({\r\n key: 'exceptionLogsTextSearchState',\r\n default: '',\r\n});\r\n\r\nexport const exceptionLogsSortByState = selector[]>({\r\n key: 'exceptionLogsSortBy',\r\n get: ({ get }) => {\r\n const orderByColumn = get(exceptionLogsOrderByColumnState);\r\n const orderByDescending = get(exceptionLogsOrderByDescendingState);\r\n return orderByColumn ? [{ id: orderByColumn, desc: orderByDescending }] : [];\r\n },\r\n});\r\n\r\nexport const exceptionLogsRequestState = selector({\r\n key: 'exceptionLogsRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(exceptionLogsOrderByDescendingState);\r\n const sortByColumn = get(exceptionLogsOrderByColumnState);\r\n\r\n return {\r\n keyword: get(exceptionLogsTextSearchState),\r\n startDate: get(exceptionLogsStartDateState)?.toISOString() ?? '',\r\n endDate: get(exceptionLogsEndDateState).toISOString() ?? '',\r\n exceptionLogType:\r\n get(exceptionLogsFiltersState).filter((x) => x.name === 'exceptionLogType')[0]\r\n ?.selectedItems[0]?.value ?? 'ConsultationException',\r\n pageSize: get(exceptionLogsPageSizeState),\r\n pageNumber: get(exceptionLogsPageNumberState),\r\n ...(sortByColumn && {\r\n sortBy: sortByColumn,\r\n sortOrder: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n } as unknown as GetExceptionLogsRequest;\r\n },\r\n});\r\n","import { SortingRule } from 'react-table';\r\nimport { atom, selector } from 'recoil';\r\n\r\nimport { GetIncomingConsultationsRequest } from 'api';\r\nimport { FilterOption, IncomingConsultation } from 'types';\r\n\r\nexport const incomingConsultationsTrafficMonitorFiltersState = atom({\r\n key: 'incomingConsultationsTrafficMonitorFilters',\r\n default: [],\r\n});\r\n\r\nexport const incomingConsultationsByReferenceNumberState = atom({\r\n key: 'incomingConsultationsByReferenceNumber',\r\n default: '',\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorOrderByColumnState = atom({\r\n key: 'incomingConsultationsTrafficMonitorOrderByColumn',\r\n default: undefined,\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorOrderByDescendingState = atom({\r\n key: 'incomingConsultationsTrafficMonitorOrderByDescending',\r\n default: false,\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorPageSizeState = atom({\r\n key: 'incomingConsultationsTrafficMonitorPageSize',\r\n default: 10,\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorPageNumberState = atom({\r\n key: 'incomingConsultationsTrafficMonitorPageNumber',\r\n default: 1,\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorSortByState = selector<\r\n SortingRule[]\r\n>({\r\n key: 'incomingConsultationsTrafficMonitorSortBy',\r\n get: ({ get }) => {\r\n const orderByColumn = get(incomingConsultationsTrafficMonitorOrderByColumnState);\r\n const orderByDescending = get(incomingConsultationsTrafficMonitorOrderByDescendingState);\r\n return orderByColumn ? [{ id: orderByColumn, desc: orderByDescending }] : [];\r\n },\r\n});\r\n\r\nexport const incomingConsultationsTrafficMonitorRequestState =\r\n selector({\r\n key: 'incomingConsultationsRequest',\r\n get: ({ get }) => {\r\n const sortByDesc = get(incomingConsultationsTrafficMonitorOrderByDescendingState);\r\n const sortByColumn = get(incomingConsultationsTrafficMonitorOrderByColumnState);\r\n const statusValue = get(incomingConsultationsTrafficMonitorFiltersState).filter(\r\n (x) => x.name === 'status'\r\n )[0]?.selectedItems[0]?.value;\r\n const applicationReferenceNumberValue = get(incomingConsultationsByReferenceNumberState);\r\n\r\n const request = {\r\n pageNumber: get(incomingConsultationsTrafficMonitorPageNumberState),\r\n pageSize: get(incomingConsultationsTrafficMonitorPageSizeState),\r\n ...(sortByColumn && {\r\n orderByColumn: sortByColumn,\r\n sortBy: sortByDesc ? 'Descending' : 'Ascending',\r\n }),\r\n ...(statusValue && {\r\n status: statusValue ?? '',\r\n }),\r\n ...(applicationReferenceNumberValue && {\r\n planningApplicationReferenceNo: applicationReferenceNumberValue,\r\n }),\r\n } as unknown as GetIncomingConsultationsRequest;\r\n\r\n get(incomingConsultationsTrafficMonitorFiltersState).forEach((filter) => {\r\n request[filter.name] = filter.selectedItems.map((selected) => selected.value);\r\n });\r\n\r\n return request;\r\n },\r\n });\r\n","import { FilterOption, IncomingConsultation } from '../../../types';\r\nimport { RecoilState, RecoilValueReadOnly } from 'recoil';\r\nimport {\r\n incomingConsultationsTrafficMonitorFiltersState,\r\n incomingConsultationsTrafficMonitorPageNumberState,\r\n incomingConsultationsTrafficMonitorPageSizeState,\r\n incomingConsultationsTrafficMonitorSortByState,\r\n incomingConsultationsTrafficMonitorOrderByColumnState,\r\n incomingConsultationsTrafficMonitorOrderByDescendingState,\r\n incomingConsultationsTrafficMonitorRequestState,\r\n} from '../../../store';\r\nimport { GetIncomingConsultationsRequest } from '../../../api';\r\nimport { SortingRule } from 'react-table';\r\n\r\nexport type UseIncomingConsultationsTrafficMonitorStateReturn = {\r\n filterState: RecoilState;\r\n pageNumberState: RecoilState;\r\n pageSizeState: RecoilState;\r\n sortByState: RecoilValueReadOnly[]>;\r\n orderByColumnState: RecoilState;\r\n orderByDescendingState: RecoilState;\r\n requestState: RecoilValueReadOnly;\r\n};\r\n\r\nexport const UseIncomingConsultationsTrafficMonitorState =\r\n (): UseIncomingConsultationsTrafficMonitorStateReturn => {\r\n return {\r\n filterState: incomingConsultationsTrafficMonitorFiltersState,\r\n pageNumberState: incomingConsultationsTrafficMonitorPageNumberState,\r\n pageSizeState: incomingConsultationsTrafficMonitorPageSizeState,\r\n sortByState: incomingConsultationsTrafficMonitorSortByState,\r\n orderByColumnState: incomingConsultationsTrafficMonitorOrderByColumnState,\r\n orderByDescendingState: incomingConsultationsTrafficMonitorOrderByDescendingState,\r\n requestState: incomingConsultationsTrafficMonitorRequestState,\r\n };\r\n };\r\n","import { AuditRequest, CallDirection, FilterOption, PaginationInfo } from '../../../types';\r\nimport { RecoilState, RecoilValueReadOnly } from 'recoil';\r\nimport {\r\n outboundTrafficMonitorDataState,\r\n outboundTrafficMonitorDirectionState,\r\n outboundTrafficMonitorEndDateState,\r\n outboundTrafficMonitorFiltersState,\r\n outboundTrafficMonitorOrderByColumnState,\r\n outboundTrafficMonitorOrderByDescendingState,\r\n outboundTrafficMonitorPageNumberState,\r\n outboundTrafficMonitorPageSizeState,\r\n outboundTrafficMonitorPaginationState,\r\n outboundTrafficMonitorRequestState,\r\n outboundTrafficMonitorSortByState,\r\n outboundTrafficMonitorStartDateState,\r\n outboundTrafficMonitorTextSearchState,\r\n trafficMonitorDataState,\r\n trafficMonitorDirectionState,\r\n trafficMonitorEndDateState,\r\n trafficMonitorFiltersState,\r\n trafficMonitorOrderByColumnState,\r\n trafficMonitorOrderByDescendingState,\r\n trafficMonitorPageNumberState,\r\n trafficMonitorPageSizeState,\r\n trafficMonitorPaginationState,\r\n trafficMonitorRequestState,\r\n trafficMonitorSortByState,\r\n trafficMonitorStartDateState,\r\n trafficMonitorTextSearchState,\r\n} from '../../../store';\r\nimport { useState } from 'react';\r\nimport { GetAuditRequestsRequest } from '../../../api';\r\nimport { SortingRule } from 'react-table';\r\n\r\nexport type UseTrafficMonitorStateReturn = {\r\n requestState: RecoilValueReadOnly;\r\n filterState: RecoilState;\r\n sortByState: RecoilValueReadOnly[]>;\r\n pageNumberState: RecoilState;\r\n pageSizeState: RecoilState;\r\n startDateState: RecoilState;\r\n endDateState: RecoilState;\r\n directionState: RecoilState;\r\n orderByColumnState: RecoilState;\r\n orderByDescendingState: RecoilState;\r\n textSearchState: RecoilState;\r\n resultsDataState: RecoilState;\r\n paginationState: RecoilState;\r\n};\r\n\r\nexport const UseTrafficMonitorState = (\r\n direction: CallDirection = 'Inbound'\r\n): UseTrafficMonitorStateReturn => {\r\n const [callDirection] = useState(direction);\r\n\r\n const requestState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorRequestState\r\n : outboundTrafficMonitorRequestState;\r\n\r\n const filterState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorFiltersState\r\n : outboundTrafficMonitorFiltersState;\r\n\r\n const sortByState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorSortByState\r\n : outboundTrafficMonitorSortByState;\r\n\r\n const orderByColumnState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorOrderByColumnState\r\n : outboundTrafficMonitorOrderByColumnState;\r\n\r\n const orderByDescendingState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorOrderByDescendingState\r\n : outboundTrafficMonitorOrderByDescendingState;\r\n\r\n const pageNumberState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorPageNumberState\r\n : outboundTrafficMonitorPageNumberState;\r\n\r\n const pageSizeState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorPageSizeState\r\n : outboundTrafficMonitorPageSizeState;\r\n\r\n const startDateState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorStartDateState\r\n : outboundTrafficMonitorStartDateState;\r\n\r\n const endDateState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorEndDateState\r\n : outboundTrafficMonitorEndDateState;\r\n\r\n const directionState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorDirectionState\r\n : outboundTrafficMonitorDirectionState;\r\n\r\n const textSearchState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorTextSearchState\r\n : outboundTrafficMonitorTextSearchState;\r\n\r\n const resultsDataState =\r\n callDirection === 'Inbound' ? trafficMonitorDataState : outboundTrafficMonitorDataState;\r\n\r\n const paginationState =\r\n callDirection === 'Inbound'\r\n ? trafficMonitorPaginationState\r\n : outboundTrafficMonitorPaginationState;\r\n\r\n return {\r\n requestState,\r\n filterState,\r\n sortByState,\r\n pageNumberState,\r\n pageSizeState,\r\n startDateState,\r\n endDateState,\r\n directionState,\r\n orderByColumnState,\r\n orderByDescendingState,\r\n textSearchState,\r\n resultsDataState,\r\n paginationState,\r\n };\r\n};\r\n","import { atom } from 'recoil';\r\n\r\nexport const manageConsulteesUserTableEditingRowState = atom({\r\n key: 'manageConsulteesUserTableEditingRow',\r\n default: undefined,\r\n});\r\n","import { atom, selector } from 'recoil';\r\nimport { ValueLabelResponse } from 'types';\r\nimport { UpdateAdminUserRequest } from 'api';\r\n\r\nexport const manageOrganisationUserTableEditingRowState = atom({\r\n key: 'manageOrganisationUserTableEditingRow',\r\n default: undefined,\r\n});\r\n\r\nexport const manageOrganisationUserTableNameInputState = atom({\r\n key: 'manageOrganisationUserTableNameInput',\r\n default: '',\r\n});\r\n\r\nexport const manageOrganisationUserTableEmailInputState = atom({\r\n key: 'manageOrganisationUserTableEmailInput',\r\n default: '',\r\n});\r\n\r\nexport const manageOrganisationUserTablePermissionState = atom({\r\n key: 'manageOrganisationUserTablePermission',\r\n default: 0,\r\n});\r\n\r\nexport const manageOrganisationUserTableTeamsState = atom({\r\n key: 'manageOrganisationUserTableTeams',\r\n default: [],\r\n});\r\n\r\nexport const manageOrganisationUserTableIsRegisteredState = atom({\r\n key: 'manageOrganisationUserTableIsRegistered',\r\n default: 'false',\r\n});\r\n\r\nexport const manageOrganisationUserTableRequestState = selector({\r\n key: 'manageOrganisationUserTableRequest',\r\n get: ({ get }) => {\r\n return {\r\n userName: get(manageOrganisationUserTableNameInputState),\r\n teams: get(manageOrganisationUserTableTeamsState).map((team) => team.value),\r\n permissionId: get(manageOrganisationUserTablePermissionState),\r\n isRegistered: get(manageOrganisationUserTableIsRegisteredState) === 'true',\r\n } as unknown as UpdateAdminUserRequest;\r\n },\r\n});\r\n","import { apiGet } from 'api';\r\nimport { GetConsulteeTeamsResponse } from '../../types';\r\n\r\nexport const getConsulteeTeams = (): Promise =>\r\n apiGet('consultee/teams');\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, GetConsulteeTeamsResponse, QueryDefaults } from 'api';\r\nimport { getConsulteeTeams } from '../methods/get/getConsulteeTeams';\r\n\r\nexport const useConsulteeTeams = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getConsulteeTeams], getConsulteeTeams, QueryDefaults);\r\n","import { apiGet, GetConsulteePermissionResponse } from 'api';\r\n\r\nexport const getConsulteePermission = (): Promise =>\r\n apiGet('consultee/permission');\r\n","import { apiGet, GetConsulteesResponse } from 'api';\r\n\r\nexport const getConsultees = (): Promise =>\r\n apiGet('consultees');\r\n","import { apiGet, GetManageTeamConsulteesResponse } from 'api';\r\n\r\nexport const getManageTeamConsultees = (): Promise =>\r\n apiGet('parentOrganisationConsultees');\r\n","import { apiGet } from 'api';\r\nimport { GetPermissionsResponse } from '../../types';\r\n\r\nexport const getPermissions = (): Promise =>\r\n apiGet('permissions');\r\n","import { apiDelete } from 'api';\r\nimport { EmptyObject } from 'types';\r\n\r\nexport const deleteConsultee = (consulteeId: number): Promise =>\r\n apiDelete(`user/${consulteeId}/delete`);\r\n","import { apiPost } from 'api';\r\nimport { InviteConsulteeRequest, InviteConsulteeResponse } from '../../types';\r\n\r\nexport const inviteConsultee = (\r\n request: InviteConsulteeRequest\r\n): Promise =>\r\n apiPost('inviteconsultee', request);\r\n","import { apiPost } from 'api';\r\nimport { UpdateConsulteeRequest } from '../../types';\r\nimport { EmptyObject } from 'types';\r\n\r\nexport const updateConsultee = (request: UpdateConsulteeRequest): Promise =>\r\n apiPost(`users/${request.id}/edit`, request);\r\n","import { HttpError } from '../../types';\r\n\r\nexport const handleError = async (res: Response): Promise => {\r\n const responsePromise = res.json().then((error) => Promise.reject(error as HttpError));\r\n return responsePromise.catch().then(() =>\r\n res.text().then((error) =>\r\n Promise.reject({\r\n error,\r\n errors: [error],\r\n status: res.status,\r\n title: '',\r\n traceId: '',\r\n type: res.statusText,\r\n } as unknown as HttpError)\r\n )\r\n );\r\n};\r\n","import { IPublicClientApplication } from '@azure/msal-browser';\r\nimport { getTokenWithRedirectFallback } from '@tq/auth-components';\r\n\r\nimport {\r\n b2cAuthority,\r\n b2cPolicyImpersonate,\r\n b2cPolicySignIn,\r\n b2cScope,\r\n baseApiUrl,\r\n tenantId,\r\n} from '../../tools';\r\nimport { handleError } from './apiError';\r\n\r\nlet pca: IPublicClientApplication;\r\nexport const setPca = (publicClientApplication: IPublicClientApplication): void => {\r\n pca = publicClientApplication;\r\n};\r\n\r\nexport const DEFAULT_API_FETCH_OPTIONS: Parameters[1] = {\r\n headers: {\r\n 'TQ-Tenant': `${tenantId}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n};\r\n\r\nexport const FORM_API_FETCH_OPTIONS: Parameters[1] = {\r\n headers: {\r\n 'TQ-Tenant': `${tenantId}`,\r\n },\r\n};\r\n\r\nexport const apiGet = (\r\n url: string,\r\n params?: TParams\r\n): Promise => {\r\n const queryParams = toQueryParams(params);\r\n return apiFetch(queryParams ? `${url}?${queryParams}` : url);\r\n};\r\n\r\nexport const apiGetFile = (url: string, params?: TParams): Promise => {\r\n const queryParams = toQueryParams(params);\r\n return apiFetchBlob(!queryParams ? url : `${url}?${queryParams}`);\r\n};\r\n\r\nexport const apiPost = (url: string, body?: TBody): Promise => {\r\n return apiFetch(url, {\r\n method: 'POST',\r\n body: body ? JSON.stringify(body) : null,\r\n });\r\n};\r\n\r\nexport const apiFormDataPost = (\r\n url: string,\r\n form: FormData\r\n): Promise => {\r\n return apiFetchForm(url, {\r\n method: 'POST',\r\n body: form,\r\n });\r\n};\r\n\r\nexport const apiPut = (url: string, body?: TBody): Promise => {\r\n return apiFetch(url, {\r\n method: 'PUT',\r\n body: body ? JSON.stringify(body) : null,\r\n });\r\n};\r\n\r\nexport const apiDelete = (url: string): Promise => {\r\n return apiFetch(url, {\r\n method: 'DELETE',\r\n });\r\n};\r\n\r\nexport const apiFetchForm = async (\r\n url: Request | string,\r\n init?: RequestInit | undefined\r\n): Promise => {\r\n const token = await getToken();\r\n return fetch(`${baseApiUrl}${url}`, {\r\n ...init,\r\n headers: {\r\n ...(FORM_API_FETCH_OPTIONS?.headers ?? {}),\r\n ...(init?.headers ?? {}),\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n })\r\n .then((res) => {\r\n if (res.ok) {\r\n return getBody(res) as unknown as TResponse;\r\n }\r\n return handleError(res);\r\n })\r\n .catch((error) => {\r\n return Promise.reject(`An unknown error occured: ${error}`);\r\n });\r\n};\r\n\r\nexport const apiFetch = async (\r\n url: Request | string,\r\n init?: RequestInit | undefined\r\n): Promise => {\r\n const token = await getToken();\r\n return fetch(`${baseApiUrl}${url}`, {\r\n ...init,\r\n headers: {\r\n ...(DEFAULT_API_FETCH_OPTIONS?.headers ?? {}),\r\n ...(init?.headers ?? {}),\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n })\r\n .then((res) => {\r\n if (res.ok) {\r\n return getBody(res) as unknown as TResponse;\r\n }\r\n return handleError(res);\r\n })\r\n .catch((error) => {\r\n return Promise.reject(error);\r\n });\r\n};\r\n\r\nexport const apiFetchBlob = async (\r\n url: Request | string,\r\n init?: RequestInit | undefined\r\n): Promise => {\r\n const token = await getToken();\r\n return fetch(`${baseApiUrl}${url}`, {\r\n ...init,\r\n headers: {\r\n 'content-type': 'text/csv;charset=UTF-8',\r\n ...(DEFAULT_API_FETCH_OPTIONS?.headers ?? {}),\r\n ...(init?.headers ?? {}),\r\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n },\r\n })\r\n .then((res) => {\r\n if (res.ok) {\r\n return res.blob();\r\n }\r\n return handleError(res);\r\n })\r\n .catch((error) => {\r\n return Promise.reject(`An unknown error occured: ${error}`);\r\n });\r\n};\r\n\r\nconst getBody = (res: Response): Promise => {\r\n const paginationInfo = parsePaginationHeader(res);\r\n const responsePromise = res.text().then((data) => {\r\n if (isValidJson(data)) {\r\n return {\r\n ...JSON.parse(data),\r\n ...(paginationInfo && { paginationInfo }),\r\n };\r\n }\r\n return Promise.resolve(data);\r\n });\r\n return responsePromise.catch(() => Promise.reject({}));\r\n};\r\n\r\nconst isValidJson = (text: string): boolean => {\r\n if (typeof text !== 'string') {\r\n return false;\r\n }\r\n try {\r\n const json = JSON.parse(text);\r\n return typeof json === 'object';\r\n } catch (error) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const getToken = async (): Promise => {\r\n if (!pca) return undefined;\r\n const allAccounts = pca.getAllAccounts();\r\n pca.setActiveAccount(allAccounts.length > 0 ? allAccounts[0] : null);\r\n if (allAccounts.length > 0) {\r\n return getTokenWithRedirectFallback(pca, b2cScope, {\r\n authority: b2cAuthority,\r\n signInPolicyPath: b2cPolicySignIn,\r\n impersonatePolicyPath: b2cPolicyImpersonate,\r\n });\r\n }\r\n};\r\n\r\nconst parsePaginationHeader = (res: Response) => {\r\n const paginationHeader = res.headers?.get('x-pagination');\r\n return paginationHeader ? JSON.parse(paginationHeader) : null;\r\n};\r\n\r\nconst toQueryParams = (params: T): string | null => {\r\n if (!params) {\r\n return null;\r\n }\r\n\r\n const searchParams = new URLSearchParams();\r\n for (const [key, value] of Object.entries(params)) {\r\n if (Array.isArray(value)) {\r\n for (const arrayValue of value) {\r\n searchParams.append(key, arrayValue);\r\n }\r\n } else {\r\n searchParams.append(key, value);\r\n }\r\n }\r\n return Array.from(searchParams.keys()).length ? searchParams.toString() : null;\r\n};\r\n","import { ValueLabelResponse } from 'types';\r\n\r\nexport const sortValueLabel = (a: ValueLabelResponse, b: ValueLabelResponse): number =>\r\n a.label > b.label ? 1 : -1;\r\n","import { apiFormDataPost } from '../../../utils';\r\nimport { UploadConsulteesResponse } from '../../types';\r\n\r\nexport const uploadConsultees = (request: FormData): Promise =>\r\n apiFormDataPost(`admin/consulteeupload`, request);\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from '../../../api';\r\nimport { deleteConsultee } from '../methods';\r\nimport { EmptyObject } from '../../../types';\r\n\r\nexport const useDeleteConsultee = (): UseMutationResult => {\r\n const queryClient = useQueryClient();\r\n return useMutation(deleteConsultee, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageTeamConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getTQAdmins] });\r\n },\r\n });\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { inviteConsultee } from '../methods';\r\nimport { InviteConsulteeRequest, InviteConsulteeResponse } from '../types';\r\n\r\nexport const useInviteConsultee = (): UseMutationResult<\r\n InviteConsulteeResponse,\r\n unknown,\r\n InviteConsulteeRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(inviteConsultee, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageTeamConsultees] });\r\n },\r\n });\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { GetConsulteeTeamsRequest } from 'types';\r\nimport { API_QUERY_KEYS, getFilterTeams, QueryDefaults } from 'api';\r\nimport { GetAllTeamsResponse } from '../types';\r\n\r\nexport const useManageAllTeams = (\r\n request?: GetConsulteeTeamsRequest\r\n): QueryObserverResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getAllTeams, request],\r\n () => getFilterTeams(request),\r\n QueryDefaults\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetConsulteeTeamsResponse } from '../../types';\r\nimport { GetConsulteeTeamsRequest } from 'types';\r\n\r\nexport const getFilterTeams = (\r\n request?: GetConsulteeTeamsRequest\r\n): Promise => {\r\n return request?.parentOrganisationId\r\n ? apiGet('allteams', request)\r\n : Promise.reject();\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useSetRecoilState, useRecoilValue } from 'recoil';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getManageConsultees,\r\n GetManageConsulteesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\nimport { manageConsulteePageNumberState, manageConsulteesRequestState } from 'store';\r\n\r\nexport const useManageConsultees = (\r\n organisationName?: string\r\n): UseQueryResult => {\r\n let request = useRecoilValue(manageConsulteesRequestState);\r\n const setPageNumber = useSetRecoilState(manageConsulteePageNumberState);\r\n\r\n if (organisationName) request = { ...request, organisationName };\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getManageConsultees, request],\r\n () => getManageConsultees(request),\r\n {\r\n ...QueryDefaults,\r\n onSuccess: (data: GetManageConsulteesResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.consultees.items.length === 0) {\r\n setPageNumber(1);\r\n }\r\n },\r\n }\r\n );\r\n};\r\n","import { apiGet, GetManageConsulteesResponse } from 'api';\r\nimport { GetManageConsulteesRequest } from '../../types';\r\n\r\nexport const getManageConsultees = (\r\n request: GetManageConsulteesRequest\r\n): Promise =>\r\n apiGet('admin/consultees', request);\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getPermissions, GetPermissionsResponse, QueryDefaults } from 'api';\r\n\r\nexport const usePermissions = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getPermissions], getPermissions, QueryDefaults);\r\n","import { apiPost } from 'api';\r\nimport { AddNoteRequest, AddNoteResponse } from '../../types';\r\n\r\nexport const addNote = (request: AddNoteRequest): Promise =>\r\n apiPost(\r\n `consultations/${request.consultationId}/notes`,\r\n request\r\n );\r\n","import { apiPost } from 'api';\r\nimport { EmptyObject } from 'types';\r\nimport { AssignConsulteeRequest } from '../../types';\r\n\r\nexport const assignConsultee = (request: AssignConsulteeRequest): Promise =>\r\n apiPost('consultations/updateconsultee', request);\r\n","import { apiPost } from 'api';\r\nimport { RequestExtensionRequest, RequestExtensionResponse } from '../../types';\r\n\r\nexport const requestExtension = (\r\n request: RequestExtensionRequest\r\n): Promise =>\r\n apiPost(\r\n `consultations/${request.consultationId}/requestextension`,\r\n request\r\n );\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getConsultation, QueryDefaults } from 'api';\r\nimport { Consultation } from 'types';\r\n\r\nexport const useConsultation = (id: number): UseQueryResult =>\r\n useQuery([API_QUERY_KEYS.getConsultation, id], () => getConsultation(id), QueryDefaults);\r\n","import { apiGet } from 'api';\r\nimport { Consultation } from 'types';\r\n\r\nexport const getConsultation = (id: number): Promise =>\r\n apiGet(`consultations/${id}`);\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getConsultations,\r\n GetConsultationsResponse,\r\n QueryDefaults,\r\n} from 'api';\r\nimport { searchPageNumberState, searchRequestState } from 'store';\r\n\r\nexport const useConsultations = (): UseQueryResult => {\r\n const request = useRecoilValue(searchRequestState);\r\n const setPageNumber = useSetRecoilState(searchPageNumberState);\r\n return useQuery(\r\n [API_QUERY_KEYS.getConsultations, request],\r\n () => getConsultations(request),\r\n {\r\n ...QueryDefaults,\r\n onSuccess: (data: GetConsultationsResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.consultations.items.length === 0) {\r\n setPageNumber(1);\r\n }\r\n },\r\n }\r\n );\r\n};\r\n","import { apiGet } from 'api';\r\nimport { GetConsultationsRequest, GetConsultationsResponse } from '../../types';\r\n\r\nexport const getConsultations = (\r\n request: GetConsultationsRequest\r\n): Promise =>\r\n apiGet('consultations', request);\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, GetSortOptionsResponse, QueryDefaults, getSortOptions } from 'api';\r\n\r\nexport const useSortOptions = (): UseQueryResult => {\r\n return useQuery([API_QUERY_KEYS.getSortOptions], () => getSortOptions(), {\r\n ...QueryDefaults,\r\n onSuccess: (data: GetSortOptionsResponse) => {\r\n return data?.sortOptions;\r\n },\r\n onError: (error: unknown) => {\r\n if (error) {\r\n return [];\r\n }\r\n },\r\n });\r\n};\r\n","import { apiGet } from 'api';\r\nimport { GetSortOptionsResponse } from '../../types';\r\n\r\nexport const getSortOptions = (): Promise =>\r\n apiGet('sortoptions');\r\n","import { apiGet } from 'api';\r\nimport { GetExtensionRequestStatusesResponse } from '../types';\r\n\r\nexport const getExtensionRequestStatuses = (): Promise =>\r\n apiGet('extensionrequeststatuses');\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getFilterAuthorities,\r\n GetFilterAuthoritiesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useFilterAuthorities = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getFilterAuthorities], getFilterAuthorities, QueryDefaults);\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getFilterCategories,\r\n GetFilterCategoriesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useFilterCategories = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getFilterCategories], getFilterCategories, QueryDefaults);\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getFilterConsultationTypes, GetFilterTypesResponse } from 'api';\r\nimport { QueryDefaults } from '../../constants/QueryDefaults';\r\n\r\nexport const useFilterConsultationTypes = (): QueryObserverResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getFilterConsultationTypes],\r\n getFilterConsultationTypes,\r\n QueryDefaults\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetFilterAuthoritiesResponse } from '../../types';\r\n\r\nexport const getFilterAuthorities = (): Promise =>\r\n apiGet('authorities');\r\n","import { apiGet } from 'api';\r\nimport { GetFilterCategoriesResponse } from '../../types';\r\n\r\nexport const getFilterCategories = (): Promise =>\r\n apiGet('consultationcategories');\r\n","import { apiGet } from 'api';\r\nimport { GetFilterStatusesRequest, GetFilterStatusesResponse } from '../../types';\r\n\r\nexport const getFilterStatuses = (\r\n request?: GetFilterStatusesRequest\r\n): Promise =>\r\n apiGet('consultationstatuses', request);\r\n","import { apiGet } from 'api';\r\nimport { GetFilterTypesResponse } from '../../types';\r\n\r\nexport const getFilterConsultationTypes = (): Promise =>\r\n apiGet('consultationtypes');\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getAllParentOrganisations, QueryDefaults } from 'api';\r\nimport { GetAllParentOrganisationsResponse } from 'types';\r\n\r\nexport const useAllParentOrganisations =\r\n (): UseQueryResult => {\r\n return useQuery(\r\n [API_QUERY_KEYS.getAllParentOrganisations],\r\n () => getAllParentOrganisations(),\r\n {\r\n ...QueryDefaults,\r\n }\r\n );\r\n };\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { API_QUERY_KEYS, QueryDefaults, getParentOrganisations } from 'api';\r\nimport {\r\n manageOrganisationsPaginationState,\r\n organisationsRequestState,\r\n manageOrganisationsPageNumberState,\r\n} from 'store';\r\nimport { GetParentOrganisationsResponse } from 'types';\r\n\r\nexport const useParentOrganisations = (): UseQueryResult => {\r\n const request = useRecoilValue(organisationsRequestState);\r\n const setPageNumber = useSetRecoilState(manageOrganisationsPageNumberState);\r\n const setManageOrganisationsPagination = useSetRecoilState(\r\n manageOrganisationsPaginationState\r\n );\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getParentOrganisations, request],\r\n () => getParentOrganisations(request),\r\n {\r\n ...QueryDefaults,\r\n onSuccess: (data: GetParentOrganisationsResponse) => {\r\n if (\r\n data?.paginationInfo?.totalCount > 0 &&\r\n data?.parentOrganisations.items.length === 0\r\n ) {\r\n setPageNumber(1);\r\n }\r\n setManageOrganisationsPagination(data.paginationInfo);\r\n },\r\n }\r\n );\r\n};\r\n","import { apiGet } from 'api';\r\nimport { GetAllParentOrganisationsResponse } from 'types';\r\n\r\nexport const getAllParentOrganisations = (): Promise =>\r\n apiGet('allparentorganisations');\r\n","import { apiGet } from 'api';\r\nimport { Organisation } from 'types';\r\nimport { GetParentOrganisationRequest } from '../';\r\n\r\nexport const getParentOrganisation = (\r\n request: GetParentOrganisationRequest\r\n): Promise =>\r\n apiGet(\r\n `admin/parentorganisations/${request.id}`,\r\n request\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetParentOrganisationsResponse } from 'types';\r\nimport { GetParentOrganisationsRequest } from '../';\r\n\r\nexport const getParentOrganisations = (\r\n request: GetParentOrganisationsRequest\r\n): Promise =>\r\n apiGet(\r\n 'admin/parentorganisations',\r\n request\r\n );\r\n","import { apiPost, apiPut } from 'api';\r\nimport { UpsertParentOrganisationRequest, UpsertParentOrganisationResponse } from '..';\r\n\r\nexport const upsertParentOrganisation = (\r\n request: UpsertParentOrganisationRequest\r\n): Promise =>\r\n request.parentOrganisationId\r\n ? apiPut(\r\n `admin/parentorganisations/${request.parentOrganisationId}`,\r\n request\r\n )\r\n : apiPost(\r\n 'admin/parentorganisations',\r\n request\r\n );\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { GetReportRequest, QueryDefaults } from '../../../api';\r\nimport {\r\n reportDataState,\r\n reportPageNumberState,\r\n reportPaginationState,\r\n reportRequestState,\r\n} from '../../../store';\r\nimport { ReportResponse } from '../../../types';\r\n\r\nexport const useBaseReport = (\r\n apiQueryKey: string,\r\n reportMethod: (request: GetReportRequest) => Promise\r\n): UseQueryResult => {\r\n const request = useRecoilValue(reportRequestState);\r\n const setPageNumber = useSetRecoilState(reportPageNumberState);\r\n const setReportData = useSetRecoilState(reportDataState);\r\n const setReportPagination = useSetRecoilState(reportPaginationState);\r\n return useQuery([apiQueryKey, request], () => reportMethod(request), {\r\n ...QueryDefaults,\r\n onSuccess: (data: ReportResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.pagedResults.items.length === 0) {\r\n setPageNumber(1);\r\n }\r\n setReportData(data.pagedResults.items);\r\n setReportPagination(data.paginationInfo);\r\n },\r\n });\r\n};\r\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { GetReportRequest } from 'api';\r\nimport { reportRequestState, reportState } from 'store';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\n\r\nexport const useBaseReportCsv = (\r\n reportMethod: (request: GetReportRequest) => Promise\r\n): UseMutationResult => {\r\n const report = useRecoilValue(reportState);\r\n const request = useRecoilValue(reportRequestState);\r\n const allItemsRequest = { ...request, pageNumber: 1, pageSize: 10000 };\r\n\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return useMutation(() => reportMethod(allItemsRequest), {\r\n onSuccess: (data: Blob) => {\r\n const link = document.createElement('a');\r\n link.href = URL.createObjectURL(data);\r\n link.download = `${report?.header} - ${formatLocaleDate(\r\n new Date(),\r\n StandardDateFormats.fileNameSuffix\r\n )}.csv`;\r\n link.click();\r\n },\r\n });\r\n};\r\n","import { UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { getExtensionRequestsReportCsv, useBaseReportCsv } from 'api';\r\n\r\nexport const useExtensionRequestsReportCsv = (): UseMutationResult =>\r\n useBaseReportCsv(getExtensionRequestsReportCsv);\r\n","import { UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { getLateResponsesReportCsv, useBaseReportCsv } from 'api';\r\n\r\nexport const useLateResponsesReportCsv = (): UseMutationResult =>\r\n useBaseReportCsv(getLateResponsesReportCsv);\r\n","import { UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { getOutstandingResponsesReportCsv, useBaseReportCsv } from 'api';\r\n\r\nexport const useOutstandingResponsesReportCsv = (): UseMutationResult =>\r\n useBaseReportCsv(getOutstandingResponsesReportCsv);\r\n","import { UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { getRespondedOnTimeReportCsv, useBaseReportCsv } from 'api';\r\n\r\nexport const useRespondedOnTimeReportCsv = (): UseMutationResult =>\r\n useBaseReportCsv(getRespondedOnTimeReportCsv);\r\n","import { UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { getRespondedYearToDateReportCsv, useBaseReportCsv } from 'api';\r\n\r\nexport const useRespondedYearToDateReportCsv = (): UseMutationResult =>\r\n useBaseReportCsv(getRespondedYearToDateReportCsv);\r\n","import { apiGet } from 'api';\r\nimport { DfiReportResponse } from 'types';\r\n\r\nexport const getDfiAnnualReport = (reportYear: number): Promise =>\r\n apiGet(`reports/dfiAnnual/${reportYear}`);\r\n","import { apiGet } from 'api';\r\nimport { DfiReportDocumentPathResponse } from 'types';\r\n\r\nexport const getDfiAnnualReportDocumentPath = (\r\n reportYear: number\r\n): Promise =>\r\n apiGet(\r\n `reports/dfiAnnual/${reportYear}/sasTokenDocumentPath`\r\n );\r\n","import { apiGet } from 'api';\r\nimport { DfiReportsResponse } from 'types';\r\n\r\nexport const getDfiAnnualReports = (): Promise =>\r\n apiGet('reports/dfiAnnual');\r\n","import { apiGet, GetReportRequest } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const getExtensionRequestsReport = (\r\n request: GetReportRequest\r\n): Promise =>\r\n apiGet('reports/extensionrequests', request);\r\n","import { apiGetFile, GetReportRequest } from 'api';\r\n\r\nexport const getExtensionRequestsReportCsv = (request: GetReportRequest): Promise =>\r\n apiGetFile('reports/extensionrequests/csv', request);\r\n","import { apiGet, GetReportRequest } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const getLateResponsesReport = (request: GetReportRequest): Promise =>\r\n apiGet('reports/lateresponses', request);\r\n","import { apiGetFile, GetReportRequest } from 'api';\r\n\r\nexport const getLateResponsesReportCsv = (request: GetReportRequest): Promise =>\r\n apiGetFile('reports/lateresponses/csv', request);\r\n","import { apiGet, GetReportRequest } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const getRespondedOnTimeReport = (request: GetReportRequest): Promise =>\r\n apiGet('reports/respondedontime', request);\r\n","import { apiGetFile, GetReportRequest } from 'api';\r\n\r\nexport const getRespondedOnTimeReportCsv = (request: GetReportRequest): Promise =>\r\n apiGetFile('reports/respondedontime/csv', request);\r\n","import { apiGet, GetReportRequest } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const getOutstandingResponsesReport = (\r\n request: GetReportRequest\r\n): Promise =>\r\n apiGet('reports/outstandingresponses', request);\r\n","import { apiGetFile, GetReportRequest } from 'api';\r\n\r\nexport const getOutstandingResponsesReportCsv = (request: GetReportRequest): Promise =>\r\n apiGetFile('reports/outstandingresponses/csv', request);\r\n","import { apiGet, GetReportRequest } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const getRespondedYearToDateReport = (\r\n request: GetReportRequest\r\n): Promise =>\r\n apiGet('reports/respondedytd', request);\r\n","import { apiGetFile, GetReportRequest } from 'api';\r\n\r\nexport const getRespondedYearToDateReportCsv = (request: GetReportRequest): Promise =>\r\n apiGetFile('reports/respondedytd/csv', request);\r\n","import { apiGet, GetStatisticsRequest } from 'api';\r\nimport { StatisticsReport } from 'types';\r\n\r\nexport const getStatisticsReport = (\r\n request: GetStatisticsRequest\r\n): Promise =>\r\n apiGet('reports/stats', request);\r\n","import { apiPut } from '../../../utils';\r\nimport { UpdateDfiReportRequest } from '../../types';\r\nimport { EmptyObject } from '../../../../types';\r\n\r\nexport const updateDfiAnnualReport = (request: UpdateDfiReportRequest): Promise =>\r\n apiPut(\r\n `reports/dfiAnnual/${request.reportYear}`,\r\n request\r\n );\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { EmptyObject } from 'types';\r\nimport { updateDfiAnnualReport } from '../methods';\r\nimport { UpdateDfiReportRequest } from '../types';\r\n\r\nexport const useUpdateDfiAnnualReport = (): UseMutationResult<\r\n EmptyObject,\r\n unknown,\r\n UpdateDfiReportRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(updateDfiAnnualReport, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getDfiAnnualReport] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getDfiAnnualReports] });\r\n },\r\n onError: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getDfiAnnualReport] });\r\n },\r\n });\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getReasonsForLateResponse,\r\n GetReasonsForLateResponseResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useReasonsForLateResponse =\r\n (): QueryObserverResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getReasonsForLateResponse],\r\n getReasonsForLateResponse,\r\n QueryDefaults\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetReasonsForLateResponseResponse } from '../../types';\r\n\r\nexport const getReasonsForLateResponse = (): Promise =>\r\n apiGet('reasonsforlateresponse');\r\n","import { apiGet } from 'api';\r\nimport { GetResponseDocumentRequest, GetResponseDocumentResponse } from '../../types';\r\n\r\nexport const getResponseDocument = (\r\n request: GetResponseDocumentRequest\r\n): Promise =>\r\n apiGet(\r\n `consultations/${request.consultationId}/response/${request.responseId}/document/${request.documentId}`\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetResponseTypesResponse } from '../../types';\r\n\r\nexport const getResponseTypes = (): Promise =>\r\n apiGet('responsetypes');\r\n","import { apiPost } from 'api';\r\nimport { SubmitResponseResponse, SubmitResponseRequest } from '../../types';\r\n\r\nexport const submitResponse = (\r\n request: SubmitResponseRequest\r\n): Promise => {\r\n return apiPost(\r\n `consultations/${request.consultationId}/response/submit`,\r\n request\r\n );\r\n};\r\n","import { apiPost } from 'api';\r\nimport { UpdateAnswerResponse, UpdateAnswerRequest } from '../../types';\r\n\r\nexport const updateAnswer = (request: UpdateAnswerRequest): Promise => {\r\n return apiPost(\r\n `consultations/${request.consultationId}/answers`,\r\n request\r\n );\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getResponses, GetResponsesResponse, QueryDefaults } from 'api';\r\n\r\nexport const useResponses = (\r\n consultationId: number\r\n): QueryObserverResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getResponses, consultationId],\r\n () => getResponses(consultationId),\r\n QueryDefaults\r\n );\r\n","import { apiGet } from 'api';\r\nimport { GetResponsesResponse } from '../../types';\r\n\r\nexport const getResponses = (consultationId: number): Promise =>\r\n apiGet(`consultations/${consultationId}/responses`);\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getResponseTypes,\r\n GetResponseTypesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useResponseTypes = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getResponseTypes], getResponseTypes, QueryDefaults);\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { submitResponse } from '../methods';\r\nimport { SubmitResponseRequest, SubmitResponseResponse } from '../types';\r\n\r\nexport const useSubmitResponse = (): UseMutationResult<\r\n SubmitResponseResponse,\r\n unknown,\r\n SubmitResponseRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(submitResponse, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultation] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultations] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getCaseDetails] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getResponses] });\r\n },\r\n });\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { GetAuditRequestsRequest, GetAuditRequestsResponse } from '../fragments';\r\nimport { getAuditRequests } from '../methods';\r\nimport { API_QUERY_KEYS } from '../../constants';\r\nimport { CallDirection } from '../../../types';\r\nimport { UseTrafficMonitorState } from '../../../store';\r\n\r\nexport const useAuditRequests = (\r\n direction: CallDirection\r\n): QueryObserverResult => {\r\n const { requestState, pageNumberState, resultsDataState, paginationState } =\r\n UseTrafficMonitorState(direction);\r\n const setPageNumberState = useSetRecoilState(pageNumberState);\r\n const setData = useSetRecoilState(resultsDataState);\r\n const setPagination = useSetRecoilState(paginationState);\r\n const stateValue = useRecoilValue(requestState);\r\n const request = { ...stateValue, direction } as unknown as GetAuditRequestsRequest;\r\n return useQuery(\r\n [API_QUERY_KEYS.getAuditRequests, request],\r\n () => getAuditRequests(request),\r\n {\r\n staleTime: 2000,\r\n onSuccess: (data: GetAuditRequestsResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.auditRequests.items.length === 0) {\r\n setPageNumberState(1);\r\n }\r\n setData(data?.auditRequests?.items ?? []);\r\n setPagination(data?.paginationInfo);\r\n },\r\n }\r\n );\r\n};\r\n","import { apiGet } from '../../utils';\r\nimport { GetAuditRequestsRequest, GetAuditRequestsResponse } from '../fragments';\r\n\r\nexport const getAuditRequests = (\r\n request: GetAuditRequestsRequest\r\n): Promise =>\r\n apiGet('auditrequest', request);\r\n","import { QueryObserverResult, useQuery, UseQueryOptions } from '@tanstack/react-query';\r\nimport { API_QUERY_KEYS, QueryDefaults } from '../../../api';\r\nimport {\r\n GetIncomingConsultationsRequest,\r\n GetIncomingConsultationsResponse,\r\n} from '../fragments';\r\nimport { getIncomingConsultations } from '../methods';\r\nimport { UseIncomingConsultationsTrafficMonitorState } from '../../../store';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nexport const useIncomingConsultations = (\r\n options?: UseQueryOptions\r\n): QueryObserverResult => {\r\n const { requestState, pageNumberState } = UseIncomingConsultationsTrafficMonitorState();\r\n const setPageNumberState = useSetRecoilState(pageNumberState);\r\n const stateValue = useRecoilValue(requestState);\r\n const request = { ...stateValue } as unknown as GetIncomingConsultationsRequest;\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getIncomingConsultations, request],\r\n () => getIncomingConsultations(request),\r\n {\r\n ...QueryDefaults,\r\n ...options,\r\n onSuccess: (data: GetIncomingConsultationsResponse) => {\r\n if (\r\n data?.paginationInfo?.totalCount > 0 &&\r\n data?.incomingConsultations.items.length === 0\r\n ) {\r\n setPageNumberState(1);\r\n }\r\n },\r\n onError: (err: unknown) => ({\r\n err,\r\n }),\r\n }\r\n );\r\n};\r\n","import { apiGet } from 'api';\r\nimport {\r\n GetIncomingConsultationsRequest,\r\n GetIncomingConsultationsResponse,\r\n} from '../fragments';\r\n\r\nexport const getIncomingConsultations = (\r\n request: GetIncomingConsultationsRequest\r\n): Promise =>\r\n apiGet(\r\n 'admin/incomingconsultations',\r\n request\r\n );\r\n","import { AddTeamRequest, AddTeamResponse, apiPost } from 'api';\r\n\r\nexport const addTeam = (request: AddTeamRequest): Promise =>\r\n apiPost('admin/teams', request);\r\n","import { UpdateTeamRequest, UpdateTeamResponse, apiPut } from 'api';\r\n\r\nexport const updateTeam = (request: UpdateTeamRequest): Promise =>\r\n apiPut(`admin/teams/${request.id}`, request);\r\n","import { QueryObserverResult, useQuery, UseQueryOptions } from '@tanstack/react-query';\r\nimport { RecoilState, RecoilValueReadOnly, useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { API_QUERY_KEYS, GetTeamsRequest, GetTeamsResponse, QueryDefaults } from 'api';\r\nimport { getTeams } from '../methods';\r\n\r\nexport const useGetTeams = (\r\n requestState: RecoilValueReadOnly,\r\n pageNumberState: RecoilState,\r\n organisationId?: number,\r\n options?: UseQueryOptions\r\n): QueryObserverResult => {\r\n let request = useRecoilValue(requestState);\r\n const setPageNumber = useSetRecoilState(pageNumberState);\r\n\r\n if (organisationId) {\r\n request = { organisationId, ...request };\r\n }\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getTeams, request],\r\n () => getTeams(request),\r\n {\r\n ...QueryDefaults,\r\n ...options,\r\n onSuccess: (data: GetTeamsResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.teams.items.length === 0) {\r\n setPageNumber(1);\r\n }\r\n },\r\n onError: () => {},\r\n }\r\n );\r\n};\r\n","import { apiGet, GetTeamsRequest, GetTeamsResponse } from 'api';\r\n\r\nexport const getTeams = (request?: GetTeamsRequest): Promise => {\r\n return apiGet('admin/teams', request);\r\n};\r\n","import React, { ChangeEvent, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useRecoilState, useRecoilValue } from 'recoil';\r\nimport {\r\n Form,\r\n FormProvider,\r\n ValidatedRadioGroup,\r\n ValidatedTextArea,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n Alert,\r\n AlertDescription,\r\n AlertIcon,\r\n Box,\r\n Button,\r\n Divider,\r\n Grid,\r\n Radio,\r\n Text,\r\n useThemedValueSwitch,\r\n VisuallyHidden,\r\n} from '@tq/ui-components';\r\n\r\nimport { useAddNote } from 'api';\r\nimport { consulteeIdState, showAddNoteState } from 'store';\r\n\r\ntype StyledAlertProps = {\r\n status: 'info' | 'warning';\r\n description: string;\r\n};\r\n\r\nconst StyledAlert: React.FC = (props) => {\r\n const { status, description } = props;\r\n const { tvs, isNI } = useThemedValueSwitch();\r\n\r\n return (\r\n \r\n \r\n \r\n {description}\r\n \r\n \r\n );\r\n};\r\n\r\nexport const AddNote: React.FC = () => {\r\n const noteTextMaxLength = 250;\r\n\r\n const { t } = useTranslation('notes');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const consulteeId = useRecoilValue(consulteeIdState);\r\n const { id } = useParams();\r\n const { mutate: addNote } = useAddNote();\r\n\r\n const [showAddNote, setShowAddNote] = useRecoilState(showAddNoteState);\r\n const [noteTypeId, setNoteTypeId] = useState(0);\r\n const [noteText, setNoteText] = useState('');\r\n const [noteAddState, setNoteAddState] = useState(false);\r\n\r\n const handleCancel = () => {\r\n setShowAddNote(false);\r\n setNoteTypeId(0);\r\n setNoteText('');\r\n setNoteAddState(true);\r\n setTimeout(() => setNoteAddState(false), 5000);\r\n };\r\n\r\n const handleSubmit = () => {\r\n addNote(\r\n {\r\n consultationId: +(id ?? 0),\r\n consulteeId,\r\n noteTypeId: +noteTypeId,\r\n noteText,\r\n },\r\n { onSuccess: handleCancel }\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {noteAddState && {t('note_add_text', 'Note added')}}\r\n {showAddNote && (\r\n \r\n
\r\n div': {\r\n mb: tvs({ tq: '1.25rem' }),\r\n },\r\n }}\r\n >\r\n setNoteTypeId(+value)}\r\n aria-label={t('note_type_label', 'Select who will see this note:')}\r\n label={t('note_type_label', 'Select who will see this note:')}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t('note_type_required_error', 'Please select a note type'),\r\n },\r\n }}\r\n >\r\n \r\n \r\n {t('internal_radioText', 'Internal')}\r\n \r\n \r\n {t('external_radioText', 'External')}\r\n \r\n \r\n {/*\r\n * Changed the AttentionMessage to an Alert (inside StyledAlert) because although it worked fine for NI\r\n * For TQ, there were some items that could not be reached using AttentionMessage\r\n * So using the Alert instead which allows you to directly access the Icon, Title and Description\r\n * to style them. This was useful for the TQ theme\r\n * Have tested NI to ensure it still looks the same.\r\n */}\r\n {(noteTypeId === 1 || noteTypeId === 5) && (\r\n \r\n )}\r\n {(noteTypeId === 2 || noteTypeId === 6) && (\r\n \r\n )}\r\n \r\n \r\n \r\n ) => {\r\n setNoteText(event.target.value);\r\n }}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t('note_text_required_error', 'Please enter note text'),\r\n },\r\n }}\r\n >\r\n \r\n \r\n {noteText?.length} of {noteTextMaxLength} characters\r\n \r\n \r\n \r\n {t('cancel_button_text', 'Cancel')}\r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n )}\r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from '../../../api';\r\nimport { addNote } from '../methods';\r\nimport { AddNoteRequest, AddNoteResponse } from '../types';\r\n\r\nexport const useAddNote = (): UseMutationResult => {\r\n const queryClient = useQueryClient();\r\n return useMutation(addNote, {\r\n onSuccess: () =>\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultation] }),\r\n });\r\n};\r\n","import { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil';\r\nimport { useBanner } from '@tq/ui-components';\r\n\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { consultationIdsToAssignState, selectedConsultationIdsState } from 'store';\r\n\r\ntype UseAssignModalReturnProps = {\r\n isConsultationHighlighted: (consultationId: number) => boolean;\r\n handleClose: (consulteeName?: string) => void;\r\n handleError: () => void;\r\n showAssignButton: boolean;\r\n showAssignModal: boolean;\r\n handleAssignSelected: () => void;\r\n handleAssignConsultation: (consultationId: number) => void;\r\n};\r\n\r\nexport const useAssignModal = (): UseAssignModalReturnProps => {\r\n const { t } = useTranslation('assign_modal');\r\n const banner = useBanner();\r\n\r\n const selectedConsultationIds = useRecoilValue(selectedConsultationIdsState);\r\n const [consultationIdsToAssign, setConsultationIdsToAssign] = useRecoilState(\r\n consultationIdsToAssignState\r\n );\r\n\r\n const resetSelectedConsultationIds = useResetRecoilState(selectedConsultationIdsState);\r\n const resetConsultationIdsToAssign = useResetRecoilState(consultationIdsToAssignState);\r\n\r\n const [consultationIdsToHighlight, setConsultationIdsToHighlight] = useState([]);\r\n\r\n const showAssignButton = !!selectedConsultationIds.length;\r\n const showAssignModal = !!consultationIdsToAssign.length;\r\n\r\n const isConsultationHighlighted = (consultationId: number) =>\r\n consultationIdsToHighlight.includes(consultationId);\r\n\r\n const handleAssignSelected = () => setConsultationIdsToAssign(selectedConsultationIds);\r\n\r\n const handleAssignConsultation = (consultationId: number) =>\r\n setConsultationIdsToAssign([consultationId]);\r\n\r\n const handleClose = (consulteeName?: string) => {\r\n if (consulteeName) {\r\n setConsultationIdsToHighlight([...consultationIdsToAssign]);\r\n banner({\r\n id: 'assign-consultee-banner',\r\n title: `${\r\n consultationIdsToAssign.length === 1\r\n ? t('consultation_assigned', 'Consultation successfully assigned to')\r\n : t('consultations_assigned', 'Consultations successfully assigned to')\r\n } ${consulteeName}`,\r\n duration: BANNER_TIMEOUT,\r\n onCloseComplete: () => setConsultationIdsToHighlight([]),\r\n });\r\n }\r\n resetSelectedConsultationIds();\r\n resetConsultationIdsToAssign();\r\n };\r\n\r\n const handleError = () =>\r\n banner({\r\n id: 'assign-consultee-failed-banner',\r\n title: t('consultation_assign_failed', 'Consultation assignment failed'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n\r\n return {\r\n showAssignModal,\r\n showAssignButton,\r\n isConsultationHighlighted,\r\n handleAssignSelected,\r\n handleAssignConsultation,\r\n handleClose,\r\n handleError,\r\n };\r\n};\r\n","import {\r\n GetApplicationDocumentRequest,\r\n GetResponseDocumentRequest,\r\n useApplicationDocument,\r\n useResponseDocument,\r\n} from 'api';\r\n\r\nexport type useDocumentDownloadReturn = {\r\n openResponseDocument: (documentRequest: GetResponseDocumentRequest | undefined) => void;\r\n openApplicationDocument: (\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => void;\r\n downloadApplicationDocument: (\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => void;\r\n openMeasuringTool: (\r\n consultationId: number | undefined,\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => void;\r\n};\r\n\r\nexport const useFileDownload = (): useDocumentDownloadReturn => {\r\n const { mutate: downloadApplicationDocumentApi } = useApplicationDocument();\r\n const { mutate: downloadResponseDocumentApi } = useResponseDocument();\r\n\r\n const openResponseDocument = (documentRequest: GetResponseDocumentRequest | undefined) => {\r\n if (!documentRequest) {\r\n return;\r\n }\r\n\r\n downloadResponseDocumentApi(documentRequest, {\r\n onSuccess: (response) => openFileInNewTab(response.documentUri),\r\n });\r\n };\r\n\r\n const openApplicationDocument = (\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => {\r\n if (!documentRequest) {\r\n return;\r\n }\r\n\r\n downloadApplicationDocumentApi(documentRequest, {\r\n onSuccess: (response) => openFileInNewTab(response.documentUri),\r\n });\r\n };\r\n\r\n const downloadApplicationDocument = (\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => {\r\n if (!documentRequest) {\r\n return;\r\n }\r\n\r\n downloadApplicationDocumentApi(documentRequest, {\r\n onSuccess: (response) =>\r\n downloadFile(\r\n response.documentUri,\r\n documentRequest?.fileName ?? `${documentRequest.applicationReferenceNumber}.pdf`\r\n ),\r\n });\r\n };\r\n\r\n const openMeasuringTool = (\r\n consultationId: number | undefined,\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => {\r\n if (!consultationId || !documentRequest) {\r\n return;\r\n }\r\n\r\n downloadApplicationDocumentApi(documentRequest, {\r\n onSuccess: (response) => openMeasuringToolInNewTab(consultationId, response.documentUri),\r\n });\r\n };\r\n\r\n const openFileInNewTab = (path: string): void => {\r\n if (path) {\r\n window.open(path, '_blank');\r\n }\r\n };\r\n\r\n const openMeasuringToolInNewTab = (consultationId: number, path: string) => {\r\n if (path) {\r\n const url = path.split('?')[0];\r\n const queryString = path.split('?')[1];\r\n if (!queryString || queryString.indexOf('sig=') === -1) {\r\n return;\r\n }\r\n const partEncodedQueryString = queryString\r\n .split('sig=')[0]\r\n .concat('sig=')\r\n .concat(encodeURIComponent(queryString.split('sig=')[1].substring(0)));\r\n window.open(\r\n `${window.location.origin}/consultation/${consultationId}/measure/${encodeURIComponent(\r\n url.concat('?').concat(partEncodedQueryString)\r\n )}`,\r\n '_blank'\r\n );\r\n }\r\n };\r\n\r\n const downloadFile = (path: string, filename: string) => {\r\n fetch(path)\r\n .then((response) => response.blob())\r\n .then((blob) => {\r\n const link = document.createElement('a');\r\n link.href = URL.createObjectURL(blob);\r\n link.download = filename;\r\n link.click();\r\n });\r\n };\r\n\r\n return {\r\n openResponseDocument,\r\n openApplicationDocument,\r\n downloadApplicationDocument,\r\n openMeasuringTool,\r\n };\r\n};\r\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { GetApplicationDocumentRequest } from 'api';\r\nimport { getApplicationDocument } from '../methods';\r\nimport { GetApplicationDocumentResponse } from '../types';\r\n\r\nexport const useApplicationDocument = (): UseMutationResult<\r\n GetApplicationDocumentResponse,\r\n unknown,\r\n GetApplicationDocumentRequest\r\n> => useMutation(getApplicationDocument);\r\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\r\n\r\nimport { GetResponseDocumentRequest } from 'api';\r\nimport { getResponseDocument } from '../methods';\r\nimport { GetResponseDocumentResponse } from '../types';\r\n\r\nexport const useResponseDocument = (): UseMutationResult<\r\n GetResponseDocumentResponse,\r\n unknown,\r\n GetResponseDocumentRequest\r\n> => useMutation(getResponseDocument);\r\n","import { useCallback } from 'react';\r\nimport { useNavigate as useNavigateRR } from 'react-router-dom';\r\nimport { getB2CLink } from 'tools/getB2CLink/getB2CLink';\r\nimport { ROUTES } from '../config';\r\nimport { HttpError } from '../types';\r\nimport HttpStatusCode from '../types/HttpStatusCode';\r\n\r\nexport type UseNavigateReturn = {\r\n navigateBack: () => void;\r\n navigateToHome: () => void;\r\n navigateToPageNotFound: () => void;\r\n navigateToErrorPage: (error: HttpError) => void;\r\n navigateToDashboard: () => void;\r\n navigateToReports: () => void;\r\n navigateToReport: (reportName: string) => void;\r\n navigateToSummary: (consultationId: number) => void;\r\n navigateToResponse: (consultationId: number) => void;\r\n navigateToArchivedResponse: (consultationId: number, responseId: number) => void;\r\n navigateToDetails: (consultationId: number) => void;\r\n navigateToManageTeam: () => void;\r\n navigateToManageAdminTeam: () => void;\r\n navigateToB2CEditProfile: () => void;\r\n navigateToB2CChangePassword: () => void;\r\n navigateToTrafficMonitor: () => void;\r\n navigateToManageConsultees: () => void;\r\n navigateToOrganisation: (organisationId: number) => void;\r\n navigateToTeam: (organisationId: number) => void;\r\n navigateToTeamUsers: (organisationId: number) => void;\r\n navigateToCreateOrganisation: () => void;\r\n};\r\n\r\nexport const useNavigate = (): UseNavigateReturn => {\r\n const navigate = useNavigateRR();\r\n\r\n const navigateBack = useCallback(() => navigate(-1), [navigate]);\r\n const navigateToHome = useCallback(() => navigate('/'), [navigate]);\r\n const navigateToPageNotFound = useCallback(() => navigate(ROUTES.PAGENOTFOUND), [navigate]);\r\n const navigateToUnauthorised = useCallback(() => navigate(ROUTES.UNAUTHORISED), [navigate]);\r\n const navigateToDashboard = useCallback(() => navigate(ROUTES.SEARCH), [navigate]);\r\n const navigateToReports = useCallback(() => navigate(ROUTES.REPORTS), [navigate]);\r\n const navigateToManageTeam = useCallback(() => navigate(ROUTES.MANAGETEAM), [navigate]);\r\n const navigateToTrafficMonitor = useCallback(() => navigate(ROUTES.MONITOR), [navigate]);\r\n const navigateToManageConsultees = useCallback(\r\n () => navigate(ROUTES.MANAGECONSULTEES),\r\n [navigate]\r\n );\r\n const navigateToCreateOrganisation = useCallback(\r\n () => navigate(ROUTES.CREATEORGANISATION),\r\n [navigate]\r\n );\r\n const navigateToManageAdminTeam = useCallback(\r\n () => navigate(ROUTES.MANAGEADMINUSERS),\r\n [navigate]\r\n );\r\n\r\n const navigateToReport = (reportName: string) => navigate(`/report/${reportName}`);\r\n\r\n const navigateToSummary = (consultationId: number) =>\r\n navigate(`/consultation/${consultationId}`);\r\n\r\n const navigateToResponse = (consultationId: number) =>\r\n navigate(`/consultation/${consultationId}/response`);\r\n\r\n const navigateToArchivedResponse = (consultationId: number, responseId: number) =>\r\n navigate(`/consultation/${consultationId}/response/${responseId}`);\r\n\r\n const navigateToDetails = (consultationId: number) =>\r\n navigate(`/consultation/${consultationId}/details`);\r\n\r\n const navigateToB2CEditProfile = () => {\r\n window.location.href = getB2CLink('editProfile');\r\n };\r\n\r\n const navigateToB2CChangePassword = () => {\r\n window.location.href = getB2CLink('passwordReset');\r\n };\r\n\r\n const navigateToOrganisation = (organisationId: number) => {\r\n navigate(`/organisations/${organisationId}`);\r\n };\r\n\r\n const navigateToTeam = (organisationId: number) => {\r\n navigate(`/organisations/${organisationId}/teams`);\r\n };\r\n\r\n const navigateToTeamUsers = (organisationId: number) => {\r\n navigate(`/organisations/${organisationId}/users`);\r\n };\r\n\r\n const navigateToErrorPage = (error: HttpError) => {\r\n if (\r\n error &&\r\n (error.status === HttpStatusCode.NOT_FOUND ||\r\n error.status === HttpStatusCode.BAD_REQUEST)\r\n ) {\r\n navigateToPageNotFound();\r\n }\r\n if (\r\n (error && error.status === HttpStatusCode.FORBIDDEN) ||\r\n error.status === HttpStatusCode.UNAUTHORIZED\r\n ) {\r\n navigateToUnauthorised();\r\n }\r\n };\r\n\r\n return {\r\n navigateBack,\r\n navigateToHome,\r\n navigateToPageNotFound,\r\n navigateToErrorPage,\r\n navigateToDashboard,\r\n navigateToReports,\r\n navigateToReport,\r\n navigateToSummary,\r\n navigateToResponse,\r\n navigateToArchivedResponse,\r\n navigateToDetails,\r\n navigateToManageTeam,\r\n navigateToManageAdminTeam,\r\n navigateToB2CEditProfile,\r\n navigateToB2CChangePassword,\r\n navigateToTrafficMonitor,\r\n navigateToManageConsultees,\r\n navigateToOrganisation,\r\n navigateToTeam,\r\n navigateToTeamUsers,\r\n navigateToCreateOrganisation,\r\n };\r\n};\r\n","export type useNavigationReturn = {\r\n consultationId: number | undefined;\r\n isHomePage: boolean;\r\n isSearchPage: boolean;\r\n isReportsPage: boolean;\r\n isReportPage: boolean;\r\n isSummaryPage: boolean;\r\n isCaseDetailsPage: boolean;\r\n isResponsePage: boolean;\r\n isArchivedResponsePage: boolean;\r\n isConsultationPage: boolean;\r\n isBreadcrumbPage: boolean;\r\n isManageTeamPage: boolean;\r\n isMonitorPage: boolean;\r\n isCreateOrganisationPage: boolean;\r\n isManageOrganisationPage: boolean;\r\n isLoginPage: boolean;\r\n};\r\n\r\nexport const useNavigation = (path: string): useNavigationReturn => {\r\n const homePageRegEx = /^\\/$/gi;\r\n const reportsPageRegEx = /^\\/reports$/gi;\r\n const reportPageRegEx = /^\\/report\\/[a-z]*$/gi;\r\n const searchPageRegEx = /^\\/search?$/gi;\r\n const summaryPageRegEx = /^\\/consultation\\/(\\d*)(\\/)*$/gi;\r\n const detailsPageRegEx = /^\\/consultation\\/(\\d*)\\/details$/gi;\r\n const detailsResponsePageRegEx =\r\n /^\\/consultation\\/(\\d+)(\\/)*((response|details)((\\/)*(\\d*)))*$/gi;\r\n const responsePageRegEx = /^\\/consultation\\/(\\d*)\\/response$/gi;\r\n const archivedResponsePageRegEx = /^\\/consultation\\/(\\d*)\\/response\\/(\\d*)$/gi;\r\n const manageTeamPageRegEx = /^\\/manageteam$/gi;\r\n const monitorPageRegEx = /^\\/monitor$/gi;\r\n const createOrganisationPageRegex = /^\\/create_organisation$/gi;\r\n const organisationPageRegex = /^\\/organisations\\/(\\d*)(\\/teams|\\/users)*$/gi;\r\n const loginPageRegex = /^\\/login/gi;\r\n\r\n const getConsultationId = (): number | undefined => {\r\n const matches = Array.from(path.matchAll(detailsResponsePageRegEx), (m) => m[1]);\r\n return matches.length === 1 ? +matches[0] : undefined;\r\n };\r\n\r\n const consultationId = getConsultationId();\r\n const isHomePage = !!path.match(homePageRegEx);\r\n const isSearchPage = !!path.match(searchPageRegEx);\r\n const isReportsPage = !!path.match(reportsPageRegEx);\r\n const isReportPage = !!path.match(reportPageRegEx);\r\n const isSummaryPage = !!path.match(summaryPageRegEx);\r\n const isCaseDetailsPage = !!path.match(detailsPageRegEx);\r\n const isResponsePage = !!path.match(responsePageRegEx);\r\n const isArchivedResponsePage = !!path.match(archivedResponsePageRegEx);\r\n const isManageTeamPage = !!path.match(manageTeamPageRegEx);\r\n const isMonitorPage = !!path.match(monitorPageRegEx);\r\n const isCreateOrganisationPage = !!path.match(createOrganisationPageRegex);\r\n const isManageOrganisationPage = !!path.match(organisationPageRegex);\r\n const isLoginPage = !!path.match(loginPageRegex);\r\n const isConsultationPage =\r\n isSearchPage ||\r\n isSummaryPage ||\r\n isCaseDetailsPage ||\r\n isResponsePage ||\r\n isArchivedResponsePage;\r\n const isBreadcrumbPage =\r\n isSummaryPage ||\r\n isReportsPage ||\r\n isCaseDetailsPage ||\r\n isResponsePage ||\r\n isArchivedResponsePage ||\r\n isReportPage ||\r\n isManageTeamPage ||\r\n isCreateOrganisationPage ||\r\n isManageOrganisationPage;\r\n\r\n return {\r\n consultationId,\r\n isHomePage,\r\n isSearchPage,\r\n isReportsPage,\r\n isReportPage,\r\n isSummaryPage,\r\n isCaseDetailsPage,\r\n isResponsePage,\r\n isArchivedResponsePage,\r\n isConsultationPage,\r\n isBreadcrumbPage,\r\n isManageTeamPage,\r\n isMonitorPage,\r\n isCreateOrganisationPage,\r\n isManageOrganisationPage,\r\n isLoginPage,\r\n };\r\n};\r\n","import { useRecoilTransaction_UNSTABLE } from 'recoil';\r\n\r\nimport { consultationAtoms, filterAtoms, searchAtoms, searchSortState } from 'store';\r\n\r\nexport const useResetSearchState = (): (() => void) =>\r\n useRecoilTransaction_UNSTABLE(({ reset }) => () => {\r\n Object.values(consultationAtoms).forEach((atom) => reset(atom));\r\n Object.values(filterAtoms).forEach((atom) => reset(atom));\r\n Object.values(searchAtoms).forEach((atom) => reset(atom));\r\n reset(searchSortState);\r\n });\r\n","import { Consultation, ConsultationCard } from 'types';\r\n\r\nexport const useShowViewResponse = (\r\n consultation: Consultation | ConsultationCard | undefined\r\n): boolean => {\r\n // If a consultation is withdrawn, closed or determined and no response was submitted the view response option will not be available.\r\n return (\r\n !!consultation &&\r\n (!['Withdrawn', 'Closed', 'Determined'].includes(consultation.status) ||\r\n consultation.hasAnyResponses)\r\n );\r\n};\r\n","import { Consultation } from 'types';\r\nconst ARCHIVED_STATUSES = ['Determined', 'Withdrawn', 'Closed'];\r\nexport const useCanAddNote = (consultation?: Consultation): boolean => {\r\n if (\r\n typeof consultation !== 'undefined' &&\r\n consultation !== null &&\r\n Object.keys(consultation).length > 0\r\n ) {\r\n const { status, isArchived } = consultation || {};\r\n // Hide if a consultation is archived and withdrawn, closed or determined.\r\n return !(isArchived && status && ARCHIVED_STATUSES.includes(consultation.status));\r\n }\r\n return false;\r\n};\r\n","import React from 'react';\r\nimport { FaStickyNote } from 'react-icons/fa';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSetRecoilState } from 'recoil';\r\nimport { Button, ButtonProps } from '@tq/ui-components';\r\nimport { useIsMobile, useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useCanAddNote } from 'hooks';\r\nimport { showAddNoteState } from 'store';\r\nimport { Consultation } from 'types';\r\n\r\nexport type AddNoteButtonProps = ButtonProps & {\r\n consultation?: Consultation;\r\n};\r\n\r\nexport const AddNoteButton: React.FC = ({\r\n consultation,\r\n ...buttonProps\r\n}) => {\r\n const { t } = useTranslation('notes');\r\n const canAddNote = useCanAddNote(consultation);\r\n\r\n // This is required because the component lib does not allow breakpoints for size\r\n const isMobile = useIsMobile();\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const setShowAddNote = useSetRecoilState(showAddNoteState);\r\n\r\n const toggleAddNote = () => setShowAddNote(true);\r\n\r\n return canAddNote ? (\r\n }\r\n width={{ base: '100%', lg: tvs({ tq: '10.375rem' }, '170px') }}\r\n variant='secondary'\r\n onClick={toggleAddNote}\r\n {...buttonProps}\r\n >\r\n {t('add_note', 'Add note')}\r\n \r\n ) : null;\r\n};\r\n","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport {\r\n Box,\r\n Card,\r\n FormControl,\r\n FormLabel,\r\n Grid,\r\n GridItem,\r\n HStack,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { ConsultationStatusIndicator } from 'components';\r\nimport { consulteeIdState } from 'store';\r\nimport { isRpc } from 'tools';\r\n\r\nimport { StandardDateFormats, useFormatLocaleDate } from 'config';\r\n\r\nexport type AssigneeDetailsProps = {\r\n topPadding?: boolean;\r\n showFooter?: boolean;\r\n};\r\n\r\nexport const AssigneeDetails: React.FC = ({\r\n topPadding = true,\r\n showFooter = true,\r\n}) => {\r\n const isMobile = useIsMobile();\r\n const { id } = useParams();\r\n const { data: consultation } = useConsultation(+(id ?? 0));\r\n const { t } = useTranslation('assignee_details');\r\n const { tvs } = useThemedValueSwitch();\r\n const consulteeId = useRecoilValue(consulteeIdState);\r\n const addressBackgroundColour = () => {\r\n return isRpc(consultation) ? COLOURS.blue[100] : COLOURS.gray[200];\r\n };\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const getDaysRemaining = (deadline: Date | undefined): string | undefined => {\r\n if (!deadline) return undefined;\r\n\r\n const deadlineDate = new Date(deadline);\r\n if (!deadlineDate?.getTime) return undefined;\r\n\r\n const currentDateTime = new Date().getTime();\r\n const daysRemaining = Math.ceil(\r\n (deadlineDate.getTime() - currentDateTime) / (1000 * 3600 * 24)\r\n );\r\n return daysRemaining > 0\r\n ? ` (${daysRemaining} ${\r\n daysRemaining === 1\r\n ? t('day_remaining', 'day remaining')\r\n : t('days_remaining', 'days remaining')\r\n })`\r\n : undefined;\r\n };\r\n\r\n const showLastResponded = consultation?.isArchived && consultation?.lastRespondedDate;\r\n const lastUpdated = showLastResponded\r\n ? {\r\n date: consultation?.lastRespondedDate,\r\n consulteeId: consultation?.lastRespondedConsulteeId,\r\n consulteeName: consultation?.lastRespondedBy,\r\n }\r\n : {\r\n date: consultation?.lastVisitedDate,\r\n consulteeId: consultation?.lastVisitedConsulteeId,\r\n consulteeName: consultation?.lastVisitedBy,\r\n };\r\n\r\n const lastUpdatedDate = formatLocaleDate(lastUpdated.date, StandardDateFormats.dateAndTime);\r\n\r\n const lastUpdatedConsultee =\r\n lastUpdated.consulteeId === consulteeId\r\n ? `${lastUpdated.consulteeName} (${t('you_text', 'You')})`\r\n : lastUpdated.consulteeName;\r\n\r\n const mobileLastVisited = (\r\n <>\r\n \r\n {lastUpdatedDate}\r\n \r\n {lastUpdated.consulteeName && (\r\n \r\n \r\n {t('by', 'By')}:\r\n \r\n {lastUpdatedConsultee}\r\n \r\n )}\r\n \r\n );\r\n\r\n const desktopLastVisited = (\r\n <>\r\n {lastUpdatedDate}\r\n {lastUpdated.consulteeName && (\r\n <>\r\n \r\n {t('by', 'By').toLowerCase()}\r\n \r\n {lastUpdatedConsultee}\r\n \r\n )}\r\n \r\n );\r\n\r\n const gridTemplateColumnsStyle = tvs({\r\n tq: { base: '1fr', lg: 'auto 1fr' },\r\n ni: { base: '1fr', lg: '100px 1fr' },\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('assignee_name', 'Assignee')}:\r\n \r\n {consultation?.assignee}\r\n \r\n\r\n \r\n \r\n {showLastResponded\r\n ? t('responded', 'Responded')\r\n : t('last_visited', 'Last visited')}\r\n :\r\n \r\n \r\n {isMobile ? mobileLastVisited : desktopLastVisited}\r\n \r\n \r\n\r\n \r\n \r\n {t('Date_requested', 'Requested')}:\r\n \r\n {formatLocaleDate(consultation?.requestedDate)}\r\n \r\n\r\n \r\n \r\n {t('deadline', 'Deadline')}:\r\n \r\n \r\n {formatLocaleDate(consultation?.deadlineDate)}\r\n {getDaysRemaining(consultation?.deadlineDate)}\r\n \r\n \r\n \r\n\r\n {showFooter && (\r\n \r\n \r\n \r\n {t('address', 'Address')}:\r\n \r\n {consultation?.address}\r\n \r\n \r\n \r\n {t('reference', 'Reference')}:\r\n \r\n {consultation?.reference}\r\n \r\n \r\n \r\n {t('consultation_type', 'Consultation type')}:\r\n \r\n {consultation?.consultationType}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUserCircle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Form,\r\n FormProvider,\r\n ValidatedSelect,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useAssignConsultee } from 'api';\r\nimport { MobileModal } from 'components';\r\nimport { useAssignModal } from 'hooks';\r\nimport { useAssignModalConsultees } from './hooks';\r\n\r\ntype AssignModalProps = {\r\n isOpen: boolean;\r\n onClose: (consulteeName?: string) => void;\r\n};\r\n\r\nexport const AssignModal: React.FC = ({ isOpen, onClose }) => {\r\n const { t } = useTranslation('assign_modal');\r\n const isMobile = useIsMobile();\r\n const { consultationIdsToAssign, consultees } = useAssignModalConsultees();\r\n const { handleError } = useAssignModal();\r\n const { mutate: assignConsultee } = useAssignConsultee();\r\n\r\n const handleCancel = () => {\r\n onClose();\r\n };\r\n\r\n const handleAssignSelected = (consulteeId: number) => {\r\n const consulteeName = consultees.find(\r\n (consultee) => consultee.value === consulteeId\r\n )?.label;\r\n assignConsultee(\r\n {\r\n consultationIds: consultationIdsToAssign,\r\n consulteeId,\r\n },\r\n { onSuccess: () => onClose(consulteeName), onError: handleError }\r\n );\r\n };\r\n\r\n const content = (\r\n <>\r\n \r\n \r\n \r\n {t('assign_header', 'Assign consultation')}\r\n \r\n \r\n \r\n \r\n \r\n handleAssignSelected(consulteeId)}\r\n >\r\n 1\r\n ? t(\r\n 'select_consultee_label_multiple_work_items',\r\n 'Select a consultee to assign these work items to'\r\n )\r\n : t(\r\n 'select_consultee_label_single_work_item',\r\n 'Select a consultee to assign this work item to'\r\n )\r\n }\r\n placeholder={t('choose_consultee_placeholder', 'Choose a consultee')}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t('consultee_required_error', 'Please select a consultee'),\r\n },\r\n }}\r\n >\r\n {consultees.map((option) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n 1\r\n ? t(\r\n 'assign_notification_message_multiple_work_items',\r\n 'The assignee will be notified about these work items'\r\n )\r\n : t(\r\n 'assign_notification_message_single_work_item',\r\n 'The assignee will be notified about this work item'\r\n )\r\n }\r\n mt={8}\r\n />\r\n \r\n \r\n );\r\n\r\n return isMobile ? (\r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { sortValueLabel, useConsultations, useConsultees } from 'api';\r\nimport { consultationIdsToAssignState } from 'store';\r\nimport { ValueLabelResponse } from 'types';\r\n\r\nexport type useAssignModalConsulteesReturn = {\r\n consultees: ValueLabelResponse[];\r\n consultationIdsToAssign: number[];\r\n};\r\n\r\nexport const useAssignModalConsultees = (): useAssignModalConsulteesReturn => {\r\n const { t } = useTranslation('assign_modal');\r\n\r\n const consultationIdsToAssign = useRecoilValue(consultationIdsToAssignState);\r\n\r\n const { data: consultationData } = useConsultations();\r\n const { data: consulteeData } = useConsultees();\r\n\r\n const consulteeList = consulteeData?.consultees;\r\n if (!consulteeList) {\r\n return { consultees: [], consultationIdsToAssign };\r\n }\r\n\r\n const selectedConsulteeIds = consultationData?.consultations?.items\r\n ?.filter((consultation) => consultationIdsToAssign.includes(consultation.id))\r\n .map((consultation) => consultation.assigneeId);\r\n\r\n const selectedConsultees = consulteeList\r\n .filter((consultee) => selectedConsulteeIds?.includes(consultee.value))\r\n .sort(sortValueLabel)\r\n .map((consultee) => ({\r\n value: consultee.value,\r\n label: `${consultee.label} (${t('assigned_suffix', 'Assigned')})`,\r\n disabled: true,\r\n }));\r\n\r\n const otherConsultees = consulteeList\r\n .filter((consultee) => !selectedConsulteeIds?.includes(consultee.value))\r\n .sort(sortValueLabel);\r\n\r\n return {\r\n consultees: [...selectedConsultees, ...otherConsultees],\r\n consultationIdsToAssign,\r\n };\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { EmptyObject } from 'types';\r\nimport { assignConsultee } from '../methods';\r\nimport { AssignConsulteeRequest } from '../types';\r\n\r\nexport const useAssignConsultee = (): UseMutationResult<\r\n EmptyObject,\r\n unknown,\r\n AssignConsulteeRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(assignConsultee, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultations] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultation] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getCaseDetails] });\r\n },\r\n });\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { MdLogout } from 'react-icons/md';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useMsal } from '@azure/msal-react';\r\n\r\nimport { useNavigate } from 'hooks';\r\nimport { isAdminState, isTQAdminState } from 'store';\r\nimport { MenuOption } from 'types';\r\n\r\nexport const useAppBarMenuOptions = (): MenuOption[] => {\r\n const { t } = useTranslation('app_bar');\r\n const isAdmin = useRecoilValue(isAdminState);\r\n const isTQAdmin = useRecoilValue(isTQAdminState);\r\n const { instance } = useMsal();\r\n const {\r\n navigateToManageTeam,\r\n navigateToManageAdminTeam,\r\n navigateToB2CChangePassword,\r\n navigateToTrafficMonitor,\r\n navigateToManageConsultees,\r\n } = useNavigate();\r\n\r\n const manageTeam = {\r\n label: t('manage_team', 'Manage team'),\r\n onClick: navigateToManageTeam,\r\n };\r\n\r\n const changePassword = {\r\n label: t('change_password', 'Change password'),\r\n onClick: navigateToB2CChangePassword,\r\n };\r\n\r\n const logOut = {\r\n label: t('log_out', 'Log out'),\r\n onClick: async () => {\r\n await instance.logout({\r\n postLogoutRedirectUri: '/',\r\n });\r\n },\r\n icon: MdLogout,\r\n iconRight: true,\r\n };\r\n\r\n const trafficMonitor = {\r\n label: t('traffic_monitor', 'Traffic monitor'),\r\n onClick: navigateToTrafficMonitor,\r\n };\r\n\r\n const manageTQUsers = {\r\n label: t('manage_tq_users', 'Manage TQ users'),\r\n onClick: navigateToManageAdminTeam,\r\n };\r\n\r\n const manageConsultees = {\r\n label: t('manage_consultees', 'Manage consultees'),\r\n onClick: navigateToManageConsultees,\r\n };\r\n\r\n const menuOptions: MenuOption[] = [changePassword, logOut];\r\n\r\n if (isTQAdmin) menuOptions.splice(0, 0, manageTQUsers, manageConsultees, trafficMonitor);\r\n if (isAdmin) menuOptions.splice(0, 0, manageTeam);\r\n\r\n return menuOptions;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Button, Flex } from '@tq/ui-components';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { ActionMenuButton } from 'components';\r\nimport { useNavigate, useNavigation, useResetSearchState } from 'hooks';\r\nimport { useAppBarMenuOptions } from '../../hooks';\r\nimport { isAdminOrConsulteeState } from 'store';\r\n\r\nexport type AppBarMenuProps = {\r\n location: string;\r\n};\r\n\r\nexport const AppBarMenu: React.FC = ({ location }) => {\r\n const { t } = useTranslation('app_bar');\r\n const { navigateToDashboard, navigateToReports } = useNavigate();\r\n const { isReportsPage, isConsultationPage } = useNavigation(location);\r\n const options = useAppBarMenuOptions();\r\n const resetSearch = useResetSearchState();\r\n\r\n const isAdminOrConsultee = useRecoilValue(isAdminOrConsulteeState);\r\n\r\n const getActiveColors = (isActive: boolean) => ({\r\n bgColor: isActive ? COLOURS.blue[700] : undefined,\r\n color: isActive ? 'white' : COLOURS.blue[600],\r\n });\r\n\r\n const goToDashboard = () => {\r\n resetSearch();\r\n navigateToDashboard();\r\n };\r\n\r\n return (\r\n \r\n {isAdminOrConsultee && (\r\n <>\r\n \r\n {t('consultations_button', 'Consultations')}\r\n \r\n \r\n {t('reports_button', 'Reports')}\r\n {' '}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { UnderlineButton, Flex } from '@tq/ui-components';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { ActionMenuButton } from 'components';\r\nimport { useNavigate, useNavigation, useResetSearchState } from 'hooks';\r\nimport { useAppBarMenuOptions } from '../../hooks';\r\nimport { isAdminOrConsulteeState } from 'store';\r\n\r\nexport type TQAppBarMenuProps = {\r\n location: string;\r\n};\r\n\r\nexport const TQAppBarMenu: React.FC = ({ location }) => {\r\n const { t } = useTranslation('app_bar');\r\n const { navigateToDashboard, navigateToReports } = useNavigate();\r\n const { isReportsPage, isConsultationPage } = useNavigation(location);\r\n const options = useAppBarMenuOptions();\r\n const resetSearch = useResetSearchState();\r\n\r\n const isAdminOrConsultee = useRecoilValue(isAdminOrConsulteeState);\r\n\r\n const goToDashboard = () => {\r\n resetSearch();\r\n navigateToDashboard();\r\n };\r\n\r\n return (\r\n \r\n {isAdminOrConsultee && (\r\n <>\r\n \r\n {t('consultations_button', 'Consultations')}\r\n \r\n \r\n {t('reports_button', 'Reports')}\r\n {' '}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaChevronLeft } from 'react-icons/fa';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { Box, LinkButton } from '@tq/ui-components';\r\n\r\nimport { hasPermissionState } from 'store';\r\nimport { useBreadcrumb } from '../../hooks';\r\n\r\nexport type BreadcrumbProps = {\r\n location: string;\r\n};\r\n\r\nexport const Breadcrumb: React.FC = ({ location }) => {\r\n const hasPermission = useRecoilValue(hasPermissionState);\r\n const { navigationLabel, handleNavigateClick } = useBreadcrumb(location);\r\n\r\n return hasPermission ? (\r\n \r\n } onClick={handleNavigateClick}>\r\n {navigationLabel()}\r\n \r\n \r\n ) : (\r\n <>\r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport { useNavigate, useNavigation } from 'hooks';\r\n\r\ntype useBreadcrumbReturn = {\r\n navigationLabel: () => string;\r\n handleNavigateClick: () => void;\r\n};\r\n\r\nexport const useBreadcrumb = (location: string): useBreadcrumbReturn => {\r\n const { t } = useTranslation('breadcrumb');\r\n const {\r\n navigateToDashboard,\r\n navigateToSummary,\r\n navigateToResponse,\r\n navigateToReports,\r\n navigateToManageConsultees,\r\n } = useNavigate();\r\n const {\r\n consultationId,\r\n isReportsPage,\r\n isReportPage,\r\n isSummaryPage,\r\n isResponsePage,\r\n isArchivedResponsePage,\r\n isCaseDetailsPage,\r\n isManageTeamPage,\r\n isCreateOrganisationPage,\r\n isManageOrganisationPage,\r\n } = useNavigation(location);\r\n\r\n const navigationLabel = (): string => {\r\n if (isSummaryPage || isReportsPage || isManageTeamPage) {\r\n return t('dashboard', 'Dashboard');\r\n }\r\n if (isResponsePage || isCaseDetailsPage) {\r\n return t('summary', 'Summary');\r\n }\r\n if (isArchivedResponsePage) {\r\n return t('response', 'Response');\r\n }\r\n if (isReportPage) {\r\n return t('reports', 'Report selection');\r\n }\r\n if (isCreateOrganisationPage || isManageOrganisationPage) {\r\n return t('manage_consultees', 'Manage consultees');\r\n }\r\n return '';\r\n };\r\n\r\n const handleNavigateClick = () => {\r\n if (isSummaryPage || isReportsPage || isManageTeamPage) {\r\n return navigateToDashboard();\r\n }\r\n if ((isResponsePage || isCaseDetailsPage) && consultationId) {\r\n return navigateToSummary(consultationId);\r\n }\r\n if (isArchivedResponsePage && consultationId) {\r\n return navigateToResponse(consultationId);\r\n }\r\n if (isReportPage) {\r\n return navigateToReports();\r\n }\r\n if (isCreateOrganisationPage || isManageOrganisationPage) {\r\n return navigateToManageConsultees();\r\n }\r\n };\r\n\r\n return {\r\n navigationLabel,\r\n handleNavigateClick,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button } from '@tq/ui-components';\r\n\r\ntype DrawerItemProps = {\r\n onClick: () => void;\r\n rightIcon?: React.ReactElement;\r\n text: string;\r\n};\r\n\r\nexport const MobileMenuDrawerItem: React.FC = ({\r\n onClick,\r\n rightIcon,\r\n text,\r\n}) => {\r\n return (\r\n \r\n \r\n {text}\r\n {rightIcon}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { MdLogin, MdLogout } from 'react-icons/md';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useMsal, useIsAuthenticated } from '@azure/msal-react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { StackDivider, VStack } from '@tq/ui-components';\r\nimport { UseDisclosureProps } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useNavigate } from 'hooks';\r\nimport { hasPermissionState, isAdminState } from 'store';\r\nimport { MobileMenuDrawerItem } from './MobileMenuDrawerItem';\r\n\r\nexport const MobileMenuDrawerItems: React.FC = ({ onClose }) => {\r\n const { t } = useTranslation('mobile_menu');\r\n const isAdmin = useRecoilValue(isAdminState);\r\n const hasPermission = useRecoilValue(hasPermissionState);\r\n const isAuthenticated = useIsAuthenticated();\r\n const { instance } = useMsal();\r\n const { navigateToDashboard, navigateToReports, navigateToManageTeam } = useNavigate();\r\n\r\n return (\r\n }\r\n borderColor={COLOURS.gray[250]}\r\n spacing={0}\r\n overflowY='auto'\r\n >\r\n {hasPermission && (\r\n <>\r\n {\r\n navigateToDashboard();\r\n onClose?.();\r\n }}\r\n text={t('consultation', 'Consultations')}\r\n />\r\n\r\n {\r\n navigateToReports();\r\n onClose?.();\r\n }}\r\n text={t('reports', 'Reports')}\r\n />\r\n \r\n )}\r\n\r\n {isAdmin && (\r\n {\r\n navigateToManageTeam();\r\n onClose?.();\r\n }}\r\n text={t('manage_team', 'Manage team')}\r\n />\r\n )}\r\n\r\n {isAuthenticated ? (\r\n {\r\n await instance.logout({\r\n postLogoutRedirectUri: '/',\r\n });\r\n }}\r\n rightIcon={}\r\n text={t('logout', 'Log out')}\r\n />\r\n ) : (\r\n {\r\n await instance.loginRedirect({\r\n scopes: [process.env.REACT_APP_B2C_SCOPE || ''],\r\n });\r\n }}\r\n rightIcon={}\r\n text={t('login', 'Log in')}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaTimes } from 'react-icons/fa';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Drawer, DrawerContent, DrawerOverlay, Flex, IconButton } from '@tq/ui-components';\r\nimport { UseDisclosureProps } from '@tq/ui-components/dist/hooks';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { MobileMenuDrawerItems } from './MobileMenuDrawerItems';\r\n\r\nexport const MobileMenuDrawer: React.FC = ({ isOpen, onClose }) => {\r\n const { t } = useTranslation('mobile_menu');\r\n\r\n return (\r\n onClose?.()}>\r\n \r\n \r\n \r\n \r\n {t('consultee_hub', 'Consultee Hub')}\r\n \r\n\r\n }\r\n aria-label={t('close_mobile_menu_button', 'Close drawer menu button')}\r\n onClick={onClose}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaBars } from 'react-icons/fa';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, IconButton } from '@tq/ui-components';\r\nimport { useDisclosure } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { MobileMenuDrawer } from './MobileMenuDrawer';\r\n\r\nexport const MobileMenu: React.FC = () => {\r\n const { isOpen, onOpen, onClose } = useDisclosure();\r\n const { t } = useTranslation('mobile_menu');\r\n\r\n return (\r\n \r\n }\r\n w={11}\r\n h={10}\r\n bgColor='transparent'\r\n color={COLOURS.blue[600]}\r\n borderRadius='0.25rem'\r\n _hover={{ backgroundColor: 'none' }}\r\n _active={{ backgroundColor: 'none' }}\r\n _focus={{\r\n outline: 'none',\r\n borderColor: COLOURS.blue[200],\r\n }}\r\n aria-label={t('mobile_hamburger_menu_button', 'Mobile Hamburger Menu Button')}\r\n sx={{\r\n '& div:first-of-type': {\r\n zIndex: '11',\r\n },\r\n '& svg': { w: 7, h: 7 },\r\n\r\n '&:focus': {\r\n boxShadow: '0 0 3px 2px #4CAAF0',\r\n },\r\n }}\r\n />\r\n \r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/logo.69b69bef.svg\";","export default __webpack_public_path__ + \"static/media/tq-logo.6f87ce8e.svg\";","import { createGlobalStyle } from 'styled-components';\r\nimport 'normalize.css';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nconst ROOT_FONT_SIZE_PIXELS = '16px';\r\n\r\nconst NiGlobalStyle = createGlobalStyle`\r\n\t:root {\r\n\t\tfont-size: ${ROOT_FONT_SIZE_PIXELS};\r\n\t}\r\n\r\n\t.tqc-date-picker__calendar-icon {\r\n\t z-index: 1;\r\n\t}\r\n\t\r\n\t.react-datepicker-popper {\r\n z-index: 3 !important;\r\n }\r\n\t\r\n\t.tqc-menu__menu-button:active,\r\n\t.tqc-menu__menu-button[data-active] {\r\n\t\tbackground-color: ${COLOURS.blue[100]};\r\n\t\tborder-color: ${COLOURS.blue[600]};\r\n\t\tcolor: ${COLOURS.blue[600]};\r\n\t}\r\n\t\r\n .tqc-button__icon {\r\n right: 0.7rem;\r\n }\r\n \r\n\t.tqc-form-control label + span {\r\n\t display: flex;\r\n\t}\r\n\t\r\n\t.label__required-indicator {\r\n\t margin-left: 0.25rem;\r\n\t margin-right: 0.125rem;\r\n\t}\r\n \r\n .chakra-table {\r\n th, td {\r\n padding-top: 0.5rem !important;\r\n padding-bottom: 0.5rem !important;\r\n letter-spacing: 0;\r\n }\r\n }\r\n \r\n .tqc-menu__menu-list button {\r\n padding-top: 8px;\r\n padding-bottom: 8px;\r\n line-height: 24px;\r\n }\r\n \r\n .tqc-tabs__tab-panels {\r\n overflow: auto;\r\n }\r\n \r\n \r\n \r\n .tqc-menu__menu-button + div {\r\n z-index: 2;\r\n }\r\n\r\n /* Mobile up to tablet styling for statistics */\r\n @media all and (max-width: 768px) {\r\n .recharts-wrapper, .recharts-wrapper svg {\r\n height: 110px !important;\r\n width: 110px !important;\r\n }\r\n\r\n .chart-header {\r\n padding: 0.25rem 0.7rem;\r\n }\r\n\r\n .chart-container {\r\n width: calc(100% - 112px);\r\n }\r\n\r\n .chart-centre-container {\r\n height: 110px; \r\n }\r\n\r\n .chart-centre-text {\r\n line-height: 1.1rem;\r\n font-size: 0.9rem; \r\n }\r\n\r\n .stat-legend-title, .stat-legend-percentage, .stat-legend-percentage-symbol {\r\n font-size: 0.75rem;\r\n }\r\n \r\n .stat-legend-line {\r\n padding: 0.3rem 0.5rem; \r\n } \r\n }\r\n\r\n /* Smaller mobile styling for statistics */\r\n @media all and (max-width: 374px) {\r\n .stat-legend-title {\r\n font-size: 0.65rem;\r\n } \r\n \r\n .stat-legend-percentage, .stat-legend-percentage-symbol {\r\n font-size: 0.65rem;\r\n } \r\n \r\n .stat-legend-percentage-container {\r\n width: 34px;\r\n min-width: 34px\r\n } \r\n }\r\n \r\n`;\r\n\r\nexport default NiGlobalStyle;\r\n","import { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { CSSObject } from '@tq/ui-components/dist/styled-system';\r\n\r\nconst dataTableStyle: CSSObject = {\r\n '.tqc-th': { backgroundColor: COLOURS.blue[150] },\r\n '.tqc-tbody': { borderCollapse: 'unset' },\r\n '.tqc-tbody .tqc-tr': {\r\n outlineStyle: 'none',\r\n border: `1px solid ${COLOURS.gray[400]}`,\r\n borderTop: 'none',\r\n },\r\n borderRadius: 0,\r\n};\r\n\r\nexport default dataTableStyle;\r\n","export const CUSTOM_COLOURS = {\r\n lightGreen: '#B3E264',\r\n mediumGreen: '#01B723',\r\n mediumWCAGGreen: '#00830F',\r\n darkGreen: '#37761D',\r\n purple: '#864898',\r\n};\r\n\r\nexport const CUSTOM_TQ_COLOURS = {\r\n // these colours are in the component library but we could not pass\r\n // blue.275 into the chart library. It required a hexdec\r\n green950: '#1D581C',\r\n blue275: '#0D4E8A',\r\n\r\n // these colours are not in the component library for TQ and will be refactored when\r\n // the colour palette work is done\r\n blue66B3E3: '#66B3E3',\r\n blueA0C8DB: '#A0C8DB',\r\n grey777E86: '#777E86',\r\n greyF4F8F8: '#F4F8F8',\r\n blue072C4D: '#072C4D',\r\n lightGreenBDC549: '#BDC459',\r\n darkGreen2B8022: '#2B8022',\r\n lightBlue4CAAF0: '#4CAAF0',\r\n darkBlue0D4E8A: '#0D4E8A',\r\n};\r\n","import { createGlobalStyle } from 'styled-components';\r\nimport 'normalize.css';\r\n\r\nimport { CUSTOM_TQ_COLOURS } from './colours';\r\n\r\nconst TqGlobalStyle = createGlobalStyle`\r\n .footer-fa-icon {\r\n width: 45px;\r\n height: 45px;\r\n border-radius: 3px;\r\n line-height: 20px;\r\n padding: 16px;\r\n background: white;\r\n color: ${CUSTOM_TQ_COLOURS.blue072C4D};\r\n }`;\r\n\r\nexport default TqGlobalStyle;\r\n","export const filterFormControlStyle = {\r\n display: { base: 'flex', lg: 'block' },\r\n flex: '1 1 100%',\r\n flexDirection: { base: 'row', lg: 'column' },\r\n alignItems: 'center',\r\n justifyContent: 'end',\r\n};\r\n\r\nexport const filterSelectStyle = {\r\n ml: { base: '0.5rem', lg: 0 },\r\n flex: { base: '0 1 62%', lg: 'unset' },\r\n};\r\n","import React, { useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Container, Flex, Grid, Image, LinkButton } from '@tq/ui-components';\r\nimport { useIsMobile, useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { AppBarMenu } from 'components';\r\nimport { isTQAdminState } from 'store';\r\nimport { useNavigate, useNavigation, useResetSearchState, useUpdateEffect } from 'hooks';\r\nimport { Breadcrumb, MobileMenu, TQAppBarMenu } from './components';\r\nimport logo from 'assets/logo.svg';\r\nimport tqLogo from 'assets/tq-logo.svg';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { CUSTOM_TQ_COLOURS } from 'styles';\r\n\r\nexport type AppBarProps = {\r\n location: string;\r\n isAuthenticated: boolean;\r\n};\r\n\r\nexport const AppBar: React.FC = ({ location, isAuthenticated }) => {\r\n const { t } = useTranslation('app_bar');\r\n const { isTQ, tvs } = useThemedValueSwitch();\r\n\r\n const { navigateToDashboard, navigateToHome, navigateToTrafficMonitor } = useNavigate();\r\n const isMobile = useIsMobile();\r\n const { isHomePage, isBreadcrumbPage } = useNavigation(location);\r\n const resetSearch = useResetSearchState();\r\n const isTQAdmin = useRecoilValue(isTQAdminState);\r\n const headerRef = useRef(null);\r\n const { pathname } = useLocation();\r\n\r\n const goToDashboard = () => {\r\n if (!isAuthenticated) {\r\n navigateToHome();\r\n return;\r\n }\r\n if (isTQAdmin) {\r\n navigateToTrafficMonitor();\r\n } else {\r\n resetSearch();\r\n navigateToDashboard();\r\n }\r\n };\r\n\r\n useUpdateEffect(() => {\r\n headerRef.current && headerRef.current.focus();\r\n }, [pathname]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {!isMobile || !isBreadcrumbPage ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n )}\r\n {!isHomePage &&\r\n !isMobile &&\r\n isAuthenticated &&\r\n (isTQ ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n {!isHomePage && isMobile && isAuthenticated && }\r\n \r\n \r\n \r\n {isBreadcrumbPage && !isMobile && isAuthenticated && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { useEffect, EffectCallback, DependencyList } from 'react';\r\n\r\n/**\r\n * Modified verion of useEffect that will only run after the first render.\r\n */\r\nexport const useUpdateEffect = (cb: EffectCallback, deps?: DependencyList): void => {\r\n const firstRender = React.useRef(false);\r\n\r\n useEffect(() => {\r\n if (!firstRender.current) {\r\n firstRender.current = true;\r\n return;\r\n }\r\n\r\n return cb();\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps);\r\n};\r\n","import React from 'react';\r\nimport { Box, Card, Grid, Heading } from '@tq/ui-components';\r\n\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport type CardLayoutProps = {\r\n heading: string;\r\n [key: string]: unknown;\r\n};\r\n\r\nexport const CardLayout: React.FC = ({ heading, children, ...rest }) => {\r\n return (\r\n \r\n \r\n \r\n {heading}\r\n \r\n \r\n {children}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box } from '@tq/ui-components';\r\n\r\nexport type CharacterCountProps = {\r\n value: string | undefined;\r\n maxCount: number;\r\n};\r\nexport const CharacterCount: React.FC = ({ value, maxCount }) => {\r\n const { t } = useTranslation('character_count');\r\n return (\r\n \r\n {value?.length ?? 0} {t('of', 'of')} {maxCount} {t('characters', 'characters')}\r\n \r\n );\r\n};\r\n","import { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\n\r\nexport const CHECKBOX_SIZE = spacing(8);\r\nexport const CARD_LEFT_PADDING_SIZE = spacing(9);\r\nexport const CARD_RIGHT_PADDING_SIZE = spacing(8);\r\nexport const ROW_TEMPLATE_COLUMNS_DESKTOP = '1fr 1fr 1fr';\r\n","import React from 'react';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\nimport { DetailsCardBody, Box } from '@tq/ui-components';\r\n\r\nimport { ExpandableParagraph } from 'components';\r\nimport { isRpc } from 'tools';\r\nimport { CARD_LEFT_PADDING_SIZE } from '../../constants';\r\nimport { ConsultationCardProps } from '../../types';\r\n\r\nexport const ConsultationCardBody: React.FC = ({ consultation }) => {\r\n return isRpc(consultation) ? null : (\r\n \r\n \r\n \r\n {consultation.summaryDescription}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, BoxProps } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system/system';\r\n\r\nexport const renderCardLabelledValue = (\r\n label: string,\r\n value?: string,\r\n boxProps?: BoxProps,\r\n nowrap?: boolean\r\n): React.ReactElement => (\r\n \r\n {label}:{' '}\r\n {value}\r\n \r\n);\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { DetailsCardFooter, Grid, Typography, useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport { isRpc } from 'tools';\r\nimport {\r\n CARD_LEFT_PADDING_SIZE,\r\n ROW_TEMPLATE_COLUMNS_DESKTOP,\r\n CARD_RIGHT_PADDING_SIZE,\r\n} from '../../constants';\r\nimport { renderCardLabelledValue } from '../../util';\r\nimport { ConsultationCardProps } from '../../types';\r\n\r\nexport const ConsultationCardFooter: React.FC = ({\r\n consultation,\r\n isHighlighted,\r\n}) => {\r\n const { t } = useTranslation('consultation_card');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const defaultFooterColor = tvs({ tq: 'grey.50' }, COLOURS.gray[200]);\r\n const rpcFooterColor = tvs({ tq: 'blue.50' }, COLOURS.blue[100]);\r\n\r\n const backgroundColour = () => {\r\n if (isHighlighted) {\r\n return 'unset';\r\n }\r\n\r\n return isRpc(consultation) ? rpcFooterColor : defaultFooterColor;\r\n };\r\n\r\n return (\r\n \r\n \r\n {renderCardLabelledValue(t('assignee', 'Assignee'), consultation.assignee ?? '-')}\r\n\r\n {renderCardLabelledValue(\r\n t('consultationType', 'Consultation type'),\r\n consultation.consultationType\r\n )}\r\n {isRpc(consultation) ? null : (\r\n \r\n {t('category', 'Category')}: {consultation.category}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\nimport {\r\n BoxProps,\r\n Checkbox,\r\n DetailsCardHeader,\r\n Grid,\r\n Typography,\r\n LinkButton,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { ConsultationCardMenu, ConsultationStatusIndicator } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport { selectedConsultationIdsState } from 'store';\r\nimport {\r\n CARD_LEFT_PADDING_SIZE,\r\n CARD_RIGHT_PADDING_SIZE,\r\n CHECKBOX_SIZE,\r\n ROW_TEMPLATE_COLUMNS_DESKTOP,\r\n} from '../../constants';\r\nimport { ConsultationCardProps } from '../../types';\r\nimport { renderCardLabelledValue } from '../../util';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nconst FIRST_ROW_DESKTOP_TEMPLATE = `\r\n\"checkbox link status ellipsis\"\r\n/ ${CHECKBOX_SIZE} auto auto ${spacing(5)}`;\r\n\r\nconst FIRST_ROW_MOBILE_TEMPLATE = `\r\n\"checkbox status ellipsis\"\r\n\"link link link\"\r\n/ ${CHECKBOX_SIZE} auto ${spacing(5)}`;\r\n\r\nconst MOBILE_LABEL_LAYOUT: BoxProps = {\r\n display: 'grid',\r\n gridAutoFlow: 'column',\r\n gridTemplateColumns: '120px auto',\r\n};\r\n\r\nexport const ConsultationCardHeader: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('consultation_card');\r\n const { navigateToSummary } = useNavigate();\r\n const { tvs } = useThemedValueSwitch();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const isMobile = useIsMobile();\r\n const [selectedConsultationIds, setSelectedConsultationIds] = useRecoilState(\r\n selectedConsultationIdsState\r\n );\r\n\r\n const handleSelectChanged = (event: React.ChangeEvent) => {\r\n const consultationId = +event.target.value;\r\n if (event.target.checked) {\r\n setSelectedConsultationIds([...selectedConsultationIds, consultationId]);\r\n } else {\r\n setSelectedConsultationIds(\r\n selectedConsultationIds.filter((id) => id !== consultationId)\r\n );\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n event.stopPropagation()}\r\n aria-label={t('consultation_card_checkbox', 'Consultation card checkbox')}\r\n data-testid='consultation-card-checkbox'\r\n />\r\n\r\n {\r\n e.stopPropagation();\r\n navigateToSummary(consultation.id);\r\n }}\r\n >\r\n {consultation.address}\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n {consultation.authority}\r\n \r\n {renderCardLabelledValue(\r\n t('reference', 'Reference'),\r\n consultation.reference,\r\n isMobile ? MOBILE_LABEL_LAYOUT : {}\r\n )}\r\n \r\n {renderCardLabelledValue(\r\n t('requested', 'Requested'),\r\n formatLocaleDate(consultation.requestedDate),\r\n isMobile ? MOBILE_LABEL_LAYOUT : {},\r\n true\r\n )}\r\n {renderCardLabelledValue(\r\n t('deadline', 'Deadline'),\r\n formatLocaleDate(consultation.deadlineDate),\r\n isMobile ? MOBILE_LABEL_LAYOUT : {},\r\n true\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { ConsultationCard } from 'types';\r\n\r\nimport { useConsultationCardMenuOptions } from '../../hooks';\r\nimport { ActionMenuButtonEllipsis } from 'components';\r\n\r\ntype ConsultationCardMenuProps = {\r\n consultation: ConsultationCard;\r\n};\r\n\r\nexport const ConsultationCardMenu: React.FC = ({\r\n consultation,\r\n}) => {\r\n const { t } = useTranslation('consultation_card');\r\n const options = useConsultationCardMenuOptions(consultation);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FaClipboardList, FaCommentDots, FaIdCard, FaUser } from 'react-icons/fa';\r\n\r\nimport { useAssignModal, useNavigate, useShowViewResponse } from 'hooks';\r\nimport { ConsultationCard, MenuOption } from 'types';\r\n\r\nexport const useConsultationCardMenuOptions = (\r\n consultation: ConsultationCard\r\n): MenuOption[] => {\r\n const { t } = useTranslation('consultation_card');\r\n\r\n const { navigateToSummary, navigateToResponse, navigateToDetails } = useNavigate();\r\n const { handleAssignConsultation } = useAssignModal();\r\n const showViewResponse = useShowViewResponse(consultation);\r\n\r\n const options: MenuOption[] = [\r\n {\r\n label: t('consultation_summary', 'Consultation summary'),\r\n onClick: (consultationId) => consultationId && navigateToSummary(consultationId),\r\n icon: FaClipboardList,\r\n },\r\n ];\r\n\r\n if (consultation.isArchived) {\r\n if (showViewResponse) {\r\n options.push({\r\n label: t('view_response', 'View response'),\r\n onClick: (consultationId) => consultationId && navigateToResponse(consultationId),\r\n icon: FaCommentDots,\r\n });\r\n }\r\n } else {\r\n options.push(\r\n {\r\n label: t('respond', 'Respond'),\r\n onClick: (consultationId) => consultationId && navigateToResponse(consultationId),\r\n icon: FaCommentDots,\r\n },\r\n {\r\n label: t('assign', 'Assign'),\r\n onClick: (consultationId) =>\r\n consultationId && handleAssignConsultation(consultationId),\r\n icon: FaUser,\r\n }\r\n );\r\n }\r\n\r\n options.push({\r\n label: t('case_details', 'Case details'),\r\n onClick: (consultationId) => consultationId && navigateToDetails(consultationId),\r\n icon: FaIdCard,\r\n });\r\n\r\n return options;\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n DetailsCard,\r\n DetailsCardBody,\r\n DetailsCardHeader,\r\n DetailsCardFooter,\r\n Skeleton,\r\n Flex,\r\n} from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const ConsultationCardSkeleton: React.FC = () => {\r\n const { t } = useTranslation('consultation_card');\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { DetailsCard, useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport {\r\n ConsultationCardBody,\r\n ConsultationCardFooter,\r\n ConsultationCardHeader,\r\n} from './components';\r\nimport { ConsultationCardProps } from './types';\r\nimport { useNavigate } from '../../hooks';\r\n\r\nexport const ConsultationCard: React.FC = ({\r\n consultation,\r\n isHighlighted,\r\n}) => {\r\n const { navigateToSummary } = useNavigate();\r\n const { tvs } = useThemedValueSwitch();\r\n const defaultCardStyles = tvs({\r\n tq: {\r\n border: '1px solid',\r\n borderColor: 'grey.300',\r\n background: 'white',\r\n },\r\n ni: {\r\n border: '1px solid',\r\n borderColor: COLOURS.gray[200],\r\n background: 'unset',\r\n },\r\n });\r\n const highlightedCardStyles = tvs({\r\n tq: {\r\n border: '2px solid',\r\n borderColor: 'green.500',\r\n background: 'green.900',\r\n },\r\n ni: {\r\n border: '2px solid',\r\n borderColor: COLOURS.green[500],\r\n background: COLOURS.neutral[11],\r\n },\r\n });\r\n\r\n return (\r\n navigateToSummary(consultation.id)}\r\n sx={isHighlighted ? highlightedCardStyles : defaultCardStyles}\r\n >\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { ConsultationCardSkeleton } from 'components';\r\nimport { Box, Spinner, Typography } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const ConsultationCardLoading: React.FC = () => {\r\n const { t } = useTranslation('consultation_card');\r\n const defaultSelectionCount = 10;\r\n return (\r\n \r\n {Array.from(Array(defaultSelectionCount).keys()).map((_, index) => (\r\n \r\n ))}\r\n \r\n \r\n

{t('loading', 'Loading')}

\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\nimport { GridProps } from '@tq/ui-components';\r\n\r\nimport { MultiSelect } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { ValueLabelResponse } from 'types';\r\n\r\nexport type ConsultationFilterMultiSelectProps = {\r\n label: string;\r\n items?: ValueLabelResponse[];\r\n state: RecoilState;\r\n fieldId?: string;\r\n disabled?: boolean;\r\n};\r\n\r\nexport const ConsultationFilterMultiSelect: React.FC<\r\n ConsultationFilterMultiSelectProps & GridProps\r\n> = ({ label, disabled = false, items, state, ...stylingProps }) => {\r\n const isMobile = useIsMobile();\r\n const [selectedItems, setSelectedItems] = useRecoilState(state);\r\n\r\n const handleSelect = (value: string) => {\r\n const selectedValue = items?.find((item) => item.value === +value);\r\n if (\r\n !selectedValue ||\r\n selectedItems.find((selectedItem) => selectedItem.value === +value)\r\n ) {\r\n return;\r\n }\r\n setSelectedItems([...selectedItems, selectedValue]);\r\n };\r\n\r\n const handleRemoveSelection = (value: number | string) => {\r\n setSelectedItems(selectedItems.filter((item) => item.value !== value));\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\n\r\nimport { UseConsultationStatusReturn } from './fragments/useConsultationStatusReturn';\r\nimport { tqConsultationStatusesConfig } from './fragments/tqConsultationStatuses.config';\r\nimport { niConsultationStatusesConfig } from './fragments/niConsultationStatuses.config';\r\n\r\nexport const STANDARD_WIDTH = spacing(24.5);\r\n\r\nexport const useConsultationStatuses = (isTQ: boolean): UseConsultationStatusReturn => {\r\n const { t } = useTranslation('consultation_status');\r\n return isTQ ? tqConsultationStatusesConfig(t) : niConsultationStatusesConfig(t);\r\n};\r\n","import { TFunction } from 'i18next';\r\nimport { FaClock } from 'react-icons/fa';\r\nimport { CUSTOM_COLOURS, CUSTOM_TQ_COLOURS } from '../../../../styles';\r\nimport { STANDARD_WIDTH } from '../useConsultationStatuses';\r\nimport { UseConsultationStatusReturn } from './useConsultationStatusReturn';\r\n\r\nexport const tqConsultationStatusesConfig = (t: TFunction): UseConsultationStatusReturn => {\r\n return {\r\n New: {\r\n label: t('new', 'New'),\r\n badgeProps: {\r\n color: 'green.500',\r\n bgColor: 'white',\r\n width: STANDARD_WIDTH,\r\n border: 'solid 2px',\r\n },\r\n },\r\n Active: {\r\n label: t('active', 'Active'),\r\n badgeProps: {\r\n color: 'white',\r\n bgColor: 'blue.275',\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n 'Active isNearingDeadline': {\r\n label: t('active', 'Active'),\r\n badgeProps: { bgColor: 'orange.550', width: STANDARD_WIDTH },\r\n icon: FaClock,\r\n },\r\n Update: {\r\n label: t('updated', 'Update'),\r\n badgeProps: {\r\n bgColor: 'purple.600',\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n Resubmission: {\r\n label: t('resubmission', 'Resubmission'),\r\n badgeProps: {\r\n bgColor: 'blue.300',\r\n },\r\n },\r\n 'Extension requested': {\r\n label: t('extension_requested', 'Extension requested'),\r\n badgeProps: {\r\n color: 'black',\r\n bgColor: 'grey.450',\r\n },\r\n },\r\n 'Extension refused': {\r\n label: t('extension_refused', 'Extension refused'),\r\n badgeProps: {\r\n bgColor: 'red.850',\r\n },\r\n },\r\n 'Extension granted': {\r\n label: t('extended_granted', 'Extension granted'),\r\n badgeProps: {\r\n bgColor: CUSTOM_COLOURS.darkGreen,\r\n },\r\n },\r\n Overdue: {\r\n label: t('overdue', 'Overdue'),\r\n badgeProps: {\r\n bgColor: 'red.850',\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n 'Response rejected': {\r\n label: t('response_rejected', 'Response rejected'),\r\n badgeProps: {\r\n bgColor: 'red.400',\r\n },\r\n },\r\n Responded: {\r\n label: t('responded', 'Responded'),\r\n badgeProps: {\r\n color: 'black',\r\n bgColor: 'green.900',\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n Closed: {\r\n label: t('closed', 'Closed'),\r\n badgeProps: { bgColor: 'grey.950', width: STANDARD_WIDTH },\r\n },\r\n Withdrawn: {\r\n label: t('withdrawn', 'Withdrawn'),\r\n badgeProps: {\r\n bgColor: CUSTOM_TQ_COLOURS.grey777E86,\r\n },\r\n },\r\n 'Consulted in error': {\r\n label: t('consulted_in_error', 'Consulted in error'),\r\n badgeProps: {\r\n bgColor: 'red.400',\r\n },\r\n },\r\n Determined: {\r\n label: t('determined', 'Determined'),\r\n badgeProps: {\r\n bgColor: 'grey.950',\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n };\r\n};\r\n","import { spacing } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { TFunction } from 'i18next';\r\nimport { FaClock } from 'react-icons/fa';\r\nimport { CUSTOM_COLOURS } from '../../../../styles';\r\nimport { STANDARD_WIDTH } from '../useConsultationStatuses';\r\nimport { UseConsultationStatusReturn } from './useConsultationStatusReturn';\r\n\r\nexport const niConsultationStatusesConfig = (t: TFunction): UseConsultationStatusReturn => {\r\n return {\r\n New: {\r\n label: t('new', 'New'),\r\n badgeProps: {\r\n color: COLOURS.black,\r\n bgColor: CUSTOM_COLOURS.lightGreen,\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n Active: {\r\n label: t('active', 'Active'),\r\n badgeProps: { bgColor: COLOURS.blue[600], width: STANDARD_WIDTH },\r\n },\r\n 'Active isNearingDeadline': {\r\n label: t('active', 'Active'),\r\n badgeProps: { bgColor: COLOURS.yellow[500], width: STANDARD_WIDTH },\r\n icon: FaClock,\r\n },\r\n 'New information': {\r\n label: t('new_information', 'New information'),\r\n badgeProps: {\r\n bgColor: COLOURS.blue[900],\r\n width: spacing(32),\r\n },\r\n },\r\n 'Re-consultation': {\r\n label: t('re_consultation', 'Re-consultation'),\r\n badgeProps: {\r\n bgColor: CUSTOM_COLOURS.purple,\r\n width: spacing(31),\r\n },\r\n },\r\n 'Extension requested': {\r\n label: t('extension_requested', 'Extension requested'),\r\n badgeProps: {\r\n color: COLOURS.black,\r\n bgColor: COLOURS.gray[300],\r\n width: spacing(40),\r\n },\r\n },\r\n 'Extension refused': {\r\n label: t('extension_refused', 'Extension refused'),\r\n badgeProps: {\r\n bgColor: COLOURS.red[700],\r\n width: spacing(37),\r\n },\r\n },\r\n Extended: {\r\n label: t('extended', 'Extended'),\r\n badgeProps: {\r\n bgColor: CUSTOM_COLOURS.darkGreen,\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n Overdue: {\r\n label: t('overdue', 'Overdue'),\r\n badgeProps: {\r\n bgColor: COLOURS.red[700],\r\n width: STANDARD_WIDTH,\r\n },\r\n icon: FaClock,\r\n },\r\n 'Response rejected': {\r\n label: t('response_rejected', 'Response rejected'),\r\n badgeProps: {\r\n color: COLOURS.white,\r\n bgColor: COLOURS.red[700],\r\n width: spacing(35),\r\n },\r\n },\r\n Responded: {\r\n label: t('responded', 'Responded'),\r\n badgeProps: {\r\n color: COLOURS.black,\r\n bgColor: COLOURS.neutral[10],\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n Closed: {\r\n label: t('closed', 'Closed'),\r\n badgeProps: { bgColor: COLOURS.gray[900], width: STANDARD_WIDTH },\r\n },\r\n Withdrawn: {\r\n label: t('withdrawn', 'Withdrawn'),\r\n badgeProps: {\r\n color: COLOURS.black,\r\n bgColor: COLOURS.gray[600],\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n 'Consulted in error': {\r\n label: t('consulted_in_error', 'Consulted in error'),\r\n badgeProps: {\r\n bgColor: COLOURS.red[700],\r\n width: spacing(34),\r\n },\r\n },\r\n Determined: {\r\n label: t('determined', 'Determined'),\r\n badgeProps: {\r\n color: COLOURS.black,\r\n bgColor: COLOURS.gray[200],\r\n width: STANDARD_WIDTH,\r\n },\r\n },\r\n };\r\n};\r\n","import {\r\n Badge,\r\n BadgeProps,\r\n Icon,\r\n useThemedValueSwitch,\r\n VisuallyHidden,\r\n} from '@tq/ui-components';\r\nimport React from 'react';\r\n\r\nimport { useConsultationStatuses } from './hooks';\r\nimport { Consultation, ConsultationCard } from 'types';\r\nimport { isOverdue, isNearingDeadline } from '../../tools';\r\n\r\nexport interface StatusIndicatorProps extends BadgeProps {\r\n consultation: Consultation | ConsultationCard | undefined;\r\n screenReaderLabel?: string;\r\n}\r\n\r\nexport const ConsultationStatusIndicator: React.FC = ({\r\n consultation,\r\n screenReaderLabel,\r\n ...parentBadgeProps\r\n}) => {\r\n const { isTQ } = useThemedValueSwitch();\r\n let status = isOverdue(consultation) ? 'Overdue' : consultation?.status ?? 'New';\r\n\r\n if (isNearingDeadline(consultation) && consultation?.status === 'Active')\r\n status = 'Active isNearingDeadline';\r\n\r\n const { label, badgeProps, icon } = useConsultationStatuses(isTQ)[status];\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n {icon && }\r\n \r\n {screenReaderLabel ? {screenReaderLabel} : null}\r\n \r\n );\r\n};\r\n","import { ConsultationCard, Consultation } from 'types';\r\n\r\nexport const isNearingDeadline = (\r\n consultation: Consultation | ConsultationCard | undefined\r\n): boolean => {\r\n if (consultation === undefined) return false;\r\n if (consultation?.deadlineDate === undefined) return false;\r\n\r\n const daysTillDeadline =\r\n (new Date(consultation.deadlineDate).getTime() - new Date().getTime()) /\r\n (1000 * 60 * 60 * 24);\r\n\r\n return consultation.consultationType === 'RPC'\r\n ? daysTillDeadline <= 2 && daysTillDeadline > 0\r\n : daysTillDeadline <= 5 && daysTillDeadline > 0;\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Form, FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport { DatePicker, Flex, FormControl, FormLabel, Grid, isArray } from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { addDays } from 'date-fns';\r\nimport { useLocaleDatePickerFormat } from 'config/DateFormats/useDatePickerFormat';\r\n\r\ntype DateFilterProps = {\r\n groupTitle?: string;\r\n initialStartDate?: Date;\r\n initialEndDate?: Date;\r\n onSetStartDate: (date: Date) => void;\r\n onSetEndDate: (date: Date) => void;\r\n onSubmit?: () => void;\r\n fromDateLabel?: string;\r\n toDateLabel?: string;\r\n};\r\n\r\nexport const DateFilter: React.FC = ({\r\n groupTitle,\r\n initialStartDate,\r\n initialEndDate,\r\n onSetStartDate,\r\n onSetEndDate,\r\n onSubmit,\r\n fromDateLabel = undefined,\r\n toDateLabel = undefined,\r\n}) => {\r\n const { t } = useTranslation('filter');\r\n const isMobile = useIsMobile();\r\n\r\n const epoch = new Date('1970-01-01');\r\n const now = new Date();\r\n\r\n const [startDate, setStartDate] = useState(\r\n initialStartDate ?? addDays(new Date(), -7)\r\n );\r\n const [endDate, setEndDate] = useState(initialEndDate ?? new Date());\r\n const datePickerFormat = useLocaleDatePickerFormat();\r\n\r\n const handleDateChange = (date: Date | [Date, Date] | null, dateType: 'to' | 'from') => {\r\n if (date && !isArray(date)) {\r\n switch (dateType) {\r\n case 'from':\r\n setStartDate(date);\r\n onSetStartDate && onSetStartDate(date);\r\n break;\r\n case 'to':\r\n setEndDate(date);\r\n onSetEndDate && onSetEndDate(date);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const handleSubmit = () => {\r\n onSetStartDate && onSetStartDate(startDate);\r\n onSetEndDate && onSetEndDate(endDate);\r\n onSubmit?.();\r\n };\r\n\r\n return (\r\n \r\n {groupTitle && groupTitle !== '' && (\r\n

\r\n {groupTitle}\r\n

\r\n )}\r\n \r\n
\r\n \r\n \r\n \r\n {fromDateLabel ?? t('date_range_from_title', 'From')}:\r\n \r\n handleDateChange(date as Date, 'from')}\r\n selected={startDate}\r\n popperModifiers={{\r\n preventOverflow: {\r\n enabled: true,\r\n },\r\n }}\r\n left={0}\r\n w={{ base: '100%', lg: '180px' }}\r\n />\r\n \r\n \r\n \r\n {toDateLabel ?? t('date_range_to_title', 'To')}:{' '}\r\n \r\n handleDateChange(date as Date, 'to')}\r\n selected={endDate}\r\n popperModifiers={{\r\n preventOverflow: {\r\n enabled: true,\r\n },\r\n }}\r\n left={0}\r\n w={{ base: '100%', lg: '180px' }}\r\n />\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n","import React, { RefObject } from 'react';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\nimport { TablePagination } from '@tq/ui-components';\r\n\r\nimport { PaginationInfo } from 'types';\r\n\r\ntype ReportPaginationProps = {\r\n paginationInfo: PaginationInfo | undefined;\r\n pageNumberState: RecoilState;\r\n pageSizeState: RecoilState;\r\n tableRef: RefObject;\r\n tableScrollHeaderOffset: number;\r\n};\r\n\r\nexport const DataTablePagination: React.FC = ({\r\n paginationInfo,\r\n pageNumberState,\r\n pageSizeState,\r\n tableRef,\r\n tableScrollHeaderOffset,\r\n}) => {\r\n const [pageNumber, setPageNumber] = useRecoilState(pageNumberState);\r\n const [pageSize, setPageSize] = useRecoilState(pageSizeState);\r\n\r\n const setPage = (newPageNumber: number) => {\r\n if (\r\n newPageNumber !== pageNumber &&\r\n newPageNumber >= 1 &&\r\n newPageNumber <= (paginationInfo?.totalPages ?? 1)\r\n ) {\r\n setPageNumber(newPageNumber);\r\n if (tableRef?.current) {\r\n window.scrollTo({ top: tableRef.current.offsetTop - tableScrollHeaderOffset });\r\n }\r\n }\r\n };\r\n\r\n const nextPage = () => setPage(pageNumber + 1);\r\n const previousPage = () => setPage(pageNumber - 1);\r\n\r\n const gotoPage = (value: ((pageIndex: number) => number) | number) => {\r\n const page = typeof value === 'number' ? value : value(pageNumber);\r\n setPage(page + 1);\r\n };\r\n\r\n const maxPages: number = paginationInfo?.totalPages || 0;\r\n\r\n return (\r\n <>\r\n {paginationInfo && paginationInfo.totalCount >= 11 && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Card } from '@tq/ui-components';\r\n\r\nexport type EmptyRecordsCardProps = {\r\n message: string;\r\n};\r\n\r\nexport const EmptyDataCard: React.FC = ({ message }) => {\r\n return (\r\n <>\r\n \r\n {message}\r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { ResponsiveObject } from '@tq/ui-components/dist/styled-system/utils';\r\nimport { Box, Flex, Link, useBreakpointValue, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport type CardExpandableParagraphProps = {\r\n maxCharacters: ResponsiveObject;\r\n showMoreText?: string;\r\n showLessText?: string;\r\n showButton?: boolean;\r\n expanded?: boolean;\r\n onExpanded?: () => void;\r\n};\r\nexport const ExpandableParagraph: React.FC = ({\r\n maxCharacters,\r\n children,\r\n showLessText,\r\n showMoreText,\r\n showButton = true,\r\n expanded = false,\r\n onExpanded,\r\n}) => {\r\n const { tvs } = useThemedValueSwitch();\r\n const [originalText, setOriginalText] = useState(children?.toString());\r\n const [truncatedText, setTruncatedText] = useState(originalText);\r\n const [isExpanded, setIsExpanded] = useState(expanded);\r\n\r\n const { t } = useTranslation('card_expandable_paragraph');\r\n const maxCharactersBeforeTruncation = useBreakpointValue(maxCharacters) || 50;\r\n\r\n const text = isExpanded ? originalText : truncatedText + '...';\r\n const showMore = showMoreText ?? t('show_more', 'Show more');\r\n const showLess = showLessText ?? t('show_less', 'Show less');\r\n const buttonText = isExpanded ? showLess : showMore;\r\n const originalTextLength = originalText?.length || 0;\r\n\r\n const handleExpandedChanged = () => {\r\n setIsExpanded((prevIsExpanded) => !prevIsExpanded);\r\n onExpanded?.();\r\n };\r\n\r\n useEffect(() => {\r\n const newText = children?.toString();\r\n setOriginalText(newText);\r\n setTruncatedText(newText?.slice(0, maxCharactersBeforeTruncation));\r\n setIsExpanded(expanded);\r\n }, [children, maxCharactersBeforeTruncation, expanded]);\r\n\r\n const renderText = (textToRender?: string) => (\r\n \r\n {textToRender}\r\n \r\n );\r\n\r\n if (originalTextLength <= maxCharactersBeforeTruncation) {\r\n return renderText(originalText);\r\n }\r\n\r\n return (\r\n \r\n {renderText(text)}\r\n {showButton && (\r\n {\r\n e.stopPropagation();\r\n handleExpandedChanged();\r\n }}\r\n textAlign={{ base: 'center', lg: 'initial' }}\r\n fontSize={tvs({ tq: '.875rem' }, '.75rem')}\r\n my={{ base: 4, lg: 0 }}\r\n >\r\n {buttonText}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaTrash } from 'react-icons/fa';\r\n\r\nimport { Card, Link, HStack as Grid, Typography, Box } from '@tq/ui-components';\r\nimport { FileIcon } from '@tq/ui-components/dist/components/forms-engine/components/FileUpload/components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { formatBytes } from 'tools';\r\nimport { UploadedFile } from 'types';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\n\r\nexport interface FilePreviewProps {\r\n uploadedFile: UploadedFile;\r\n onRemoveFile?: (uploadedFile: UploadedFile) => void;\r\n}\r\nexport const FilePreview: React.FC = ({ uploadedFile, onRemoveFile }) => {\r\n const { t } = useTranslation('file_preview');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n \r\n \r\n {t('document', 'Document')}:\r\n \r\n \r\n \r\n \r\n {uploadedFile.file.name}\r\n \r\n \r\n \r\n {t('size', 'Size')}:\r\n {formatBytes(uploadedFile.file.size)}\r\n \r\n \r\n {t('uploaded', 'Uploaded')}:\r\n \r\n {formatLocaleDate(uploadedFile.uploadedDate, StandardDateFormats.dateAndTime)}\r\n \r\n \r\n onRemoveFile?.(uploadedFile)}\r\n sx={{ cursor: 'pointer' }}\r\n >\r\n {t('remove', 'Remove')}\r\n \r\n \r\n \r\n );\r\n};\r\n","import {\r\n Modal,\r\n ModalBody,\r\n ModalContent,\r\n ModalOverlay,\r\n Progress,\r\n Grid,\r\n Typography,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { formatBytes } from 'tools';\r\nimport { FileUploadProgress } from '../types';\r\n\r\nexport type UploadingModalProps = {\r\n uploadingFiles?: File[];\r\n progress: FileUploadProgress;\r\n};\r\nexport const UploadingModal: React.FC = ({\r\n uploadingFiles,\r\n progress,\r\n}) => {\r\n const { t } = useTranslation('file_upload');\r\n\r\n return (\r\n null} isCentered>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useState } from 'react';\r\nimport { StorageUploadRequest, useDocumentStore } from '@tq/document-store-js-client';\r\n\r\nimport { UploadedFile } from 'types';\r\nimport { FileUploadProgress } from '../types';\r\nimport { getTotalBytes } from '../util';\r\nimport { MAX_FILE_SIZE } from '../../../constants';\r\n\r\nconst documentStoreTenantId = process.env.REACT_APP_DOCUMENT_STORE_TENANT_ID as string;\r\n\r\nexport interface UseFileUploadProps {\r\n onUploadComplete?: (uploadedFiles: UploadedFile[]) => void;\r\n onUploadFailed?: () => void;\r\n}\r\n\r\nconst DEFAULT_PROGRESS: FileUploadProgress = {\r\n percent: 0,\r\n bytesUploaded: 0,\r\n totalBytes: 0,\r\n};\r\n\r\nexport interface UseFileUploadReturn {\r\n uploadFile: (\r\n file: File,\r\n groupingReference: string,\r\n overwriteExistingFile: boolean\r\n ) => Promise;\r\n deleteFile: (url: string) => Promise;\r\n files: File[] | undefined;\r\n progress: FileUploadProgress;\r\n}\r\n\r\nexport const useFileUpload = ({\r\n onUploadComplete,\r\n onUploadFailed,\r\n}: UseFileUploadProps): UseFileUploadReturn => {\r\n const client = useDocumentStore();\r\n\r\n const [progress, setProgress] = useState(DEFAULT_PROGRESS);\r\n const [files, setFiles] = useState();\r\n\r\n const uploadFile = async (\r\n file: File,\r\n groupingReference: string,\r\n overwriteExistingFile = false\r\n ): Promise => {\r\n setFiles([file]);\r\n\r\n const uploadRequest: StorageUploadRequest = {\r\n documentStoreTenantId,\r\n file,\r\n groupingReference,\r\n metadata: { MimeType: file.type },\r\n overwriteExistingFile,\r\n };\r\n\r\n const totalBytes = getTotalBytes([file]);\r\n\r\n const uploadOptions = {\r\n onUploadPercentageChange: (percentage: number) => {\r\n setProgress({\r\n percent: percentage,\r\n bytesUploaded: totalBytes * (percentage / 100),\r\n totalBytes: totalBytes,\r\n });\r\n },\r\n };\r\n\r\n try {\r\n if (totalBytes > MAX_FILE_SIZE) {\r\n throw new Error();\r\n }\r\n setProgress(DEFAULT_PROGRESS);\r\n const uri = await client.uploadFile(uploadRequest, uploadOptions);\r\n setFiles(undefined);\r\n onUploadComplete?.([{ file, uri, uploadedDate: new Date() }]);\r\n setProgress(DEFAULT_PROGRESS);\r\n } catch (err) {\r\n setFiles(undefined);\r\n setProgress(DEFAULT_PROGRESS);\r\n onUploadFailed?.();\r\n }\r\n };\r\n\r\n const deleteFile = (uri: string): Promise =>\r\n fetch(`${process.env.REACT_APP_PP_DOC_STORE}delete-from-storage`, {\r\n method: 'DELETE',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n documentStoreTenantId,\r\n uri,\r\n }),\r\n });\r\n\r\n return {\r\n uploadFile,\r\n deleteFile,\r\n files,\r\n progress,\r\n };\r\n};\r\n","import { AttentionMessage } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport styled from 'styled-components';\r\nimport { MAX_FILE_COUNT, MAX_FILE_SIZE } from '../../../constants';\r\nimport { allowedFileTypes } from '../../../tools';\r\n\r\nconst StyledList = styled.ul`\r\n list-style: none;\r\n\r\n li {\r\n padding-block: 0.5rem;\r\n }\r\n li:before {\r\n content: '-';\r\n padding-right: 4px;\r\n }\r\n`;\r\n\r\nexport const FileInformation: React.FC = () => {\r\n const { t } = useTranslation('file_upload');\r\n return (\r\n \r\n
  • \r\n {t('upload_documents_max_size_of', 'a max file size of')} :{' '}\r\n {MAX_FILE_SIZE / 1000000}\r\n MB\r\n
  • \r\n
  • \r\n {t('upload_documents_max_number_pre', 'a maximum of ')} : {MAX_FILE_COUNT}{' '}\r\n {t('upload_documents_max_number_post', 'in total')}\r\n
  • \r\n
  • \r\n {t('upload_documents_allowed_list_of', 'of file type')} : {allowedFileTypes}\r\n
  • \r\n \r\n }\r\n w='100%'\r\n className='attention-message-small'\r\n />\r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaCloudUploadAlt } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { FileDragDrop as DragDrop, FileDragDropProps, useBanner } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { UploadedFile } from 'types';\r\nimport { FilePreview, UploadingModal } from './components';\r\nimport { SetPreviewFiles, useFileUpload, usePreviewFiles } from './hooks';\r\nimport { FileInformation } from './components/FileInformation';\r\n\r\nexport type FileDragDropExtraProps = {\r\n groupingReference: string | undefined;\r\n setUploadedFiles?: SetPreviewFiles;\r\n showFileInfoMessage?: boolean;\r\n};\r\n\r\nexport const FileDragDrop: React.FC = ({\r\n children,\r\n multiple,\r\n groupingReference,\r\n setUploadedFiles,\r\n showFileInfoMessage = false,\r\n ...dragDropProps\r\n}) => {\r\n const { t } = useTranslation('file_upload');\r\n const banner = useBanner();\r\n\r\n const { previewFiles, setPreviewFiles, concatPreviewFiles } = usePreviewFiles();\r\n\r\n const { files, progress, uploadFile, deleteFile } = useFileUpload({\r\n onUploadComplete: (uploadedFiles: UploadedFile[]) => {\r\n if (multiple) {\r\n concatPreviewFiles(uploadedFiles);\r\n } else {\r\n setPreviewFiles(uploadedFiles);\r\n }\r\n banner({\r\n id: 'file-uploaded-banner',\r\n title: t('file_upload_success', 'Document uploaded successfully'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n },\r\n onUploadFailed: () => {\r\n banner({\r\n id: 'file-upload-failed-banner',\r\n title: t('file_upload_error', 'Document upload failed.'),\r\n description: t(\r\n 'file_upload_error_description',\r\n 'Please check the document size and/or type.'\r\n ),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n },\r\n });\r\n\r\n const childNodes = children || (\r\n <>\r\n \r\n {t('drag_and_drop_files_or', 'Drag and drop files or ')}\r\n \r\n {t('browse', 'Browse')}\r\n \r\n \r\n \r\n {t('tap_to_add_files', 'Tap to add files')}\r\n {' '}\r\n \r\n );\r\n\r\n useEffect(() => setUploadedFiles?.(previewFiles), [previewFiles, setUploadedFiles]);\r\n\r\n return (\r\n \r\n {previewFiles?.map((file) => (\r\n \r\n deleteFile(file.uri).then(() =>\r\n setPreviewFiles((existingFiles) =>\r\n existingFiles?.filter((f) => f.uri !== removeFile.uri)\r\n )\r\n )\r\n }\r\n />\r\n ))}\r\n\r\n {!!groupingReference && (multiple || !previewFiles?.length) ? (\r\n <>\r\n }\r\n onChange={(file) => uploadFile(file[0], groupingReference, true)}\r\n {...dragDropProps}\r\n >\r\n {childNodes}\r\n \r\n {showFileInfoMessage && }\r\n \r\n ) : null}\r\n\r\n \r\n \r\n );\r\n};\r\n","import { Dispatch, SetStateAction, useCallback, useState } from 'react';\r\n\r\nimport { UploadedFile } from 'types';\r\n\r\ntype PreviewFiles = UploadedFile[] | undefined;\r\n\r\nexport type SetPreviewFiles = Dispatch>;\r\n\r\nexport type UsePreviewFilesProps = {\r\n uploadedFilesChanged?: (uploadedFiles: UploadedFile[]) => void;\r\n};\r\n\r\nexport type UsePreviewFilesReturn = {\r\n previewFiles: PreviewFiles;\r\n setPreviewFiles: SetPreviewFiles;\r\n concatPreviewFiles: SetPreviewFiles;\r\n};\r\n\r\nexport const usePreviewFiles = (): UsePreviewFilesReturn => {\r\n const [previewFiles, setPreviewFiles] = useState();\r\n\r\n const concatPreviewFiles: Dispatch> = useCallback(\r\n (files) =>\r\n setPreviewFiles((previousFiles) => {\r\n const newFiles = typeof files === 'function' ? files?.(previousFiles) : files;\r\n if (!newFiles) return previousFiles;\r\n return [...(previousFiles || []), ...newFiles];\r\n }),\r\n []\r\n );\r\n\r\n return {\r\n previewFiles,\r\n setPreviewFiles,\r\n concatPreviewFiles,\r\n };\r\n};\r\n","export const getTotalBytes = (files: File[]): number =>\r\n files.reduce((totalSize, currentFile) => totalSize + currentFile.size, 0);\r\n","import React, { useState, useEffect } from 'react';\r\n\r\nimport { useRecoilValue, RecoilState, useSetRecoilState } from 'recoil';\r\nimport { Text, FormLabel, FormControl, FormErrorMessage, Input } from '@tq/ui-components';\r\n\r\ninterface EditableTableCellProps {\r\n rowValue: string;\r\n editingState: RecoilState;\r\n valueState: RecoilState;\r\n rowIndex: number;\r\n type: 'text' | 'email';\r\n label: string;\r\n placeholder: string;\r\n errorMessage?: string;\r\n validator?: (value: string) => boolean;\r\n disabled?: boolean;\r\n dataTestId?: string;\r\n}\r\n\r\nexport const EditableTableCell: React.FC = ({\r\n rowValue,\r\n editingState,\r\n valueState,\r\n rowIndex,\r\n type,\r\n label,\r\n placeholder,\r\n errorMessage,\r\n validator,\r\n disabled = false,\r\n dataTestId = '',\r\n}) => {\r\n const currentEditRowIndex = useRecoilValue(editingState);\r\n const setRecoilValue = useSetRecoilState(valueState);\r\n const [value, setValue] = useState(rowValue);\r\n const [isInputInvalid, setIsInputInvalid] = useState(false);\r\n\r\n const onUpdateValue = (e: React.ChangeEvent) => {\r\n setValue(e.target.value);\r\n };\r\n\r\n const onBlurHandler = () => {\r\n setRecoilValue(value);\r\n if (validator) setIsInputInvalid(!validator(value));\r\n };\r\n\r\n useEffect(() => {\r\n if (currentEditRowIndex === rowIndex) {\r\n if (rowValue?.length) {\r\n setRecoilValue(rowValue);\r\n setValue(rowValue);\r\n if (validator) setIsInputInvalid(!validator(rowValue));\r\n }\r\n }\r\n }, [rowValue, currentEditRowIndex, rowIndex, setRecoilValue, validator]);\r\n\r\n return currentEditRowIndex === rowIndex ? (\r\n \r\n {label}:\r\n \r\n \r\n {errorMessage}\r\n \r\n \r\n ) : (\r\n {rowValue}\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport const hiddenTableHeaderLabel = (labelText: string): JSX.Element => (\r\n \r\n {labelText}\r\n \r\n);\r\n","import React, { useEffect } from 'react';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\nimport { Checkbox, FormLabel } from '@tq/ui-components';\r\n\r\nexport type IsRegisteredCheckboxProps = {\r\n defaultValue?: string;\r\n label: string;\r\n recoilState: RecoilState;\r\n inputId: string;\r\n};\r\n\r\nexport const IsRegisteredCheckbox: React.FC = ({\r\n label,\r\n recoilState,\r\n inputId,\r\n defaultValue,\r\n}) => {\r\n const [isRegistered, setIsRegistered] = useRecoilState(recoilState);\r\n\r\n useEffect(() => {\r\n if (defaultValue) setIsRegistered(defaultValue);\r\n }, [setIsRegistered, defaultValue]);\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n \r\n \r\n setIsRegistered(isRegistered.toLowerCase() === 'true' ? 'false' : 'true')\r\n }\r\n />\r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useRecoilState } from 'recoil';\r\nimport { FormLabel, Select } from '@tq/ui-components';\r\n\r\nimport { filterSelectStyle } from 'styles';\r\nimport { IsRegisteredCheckboxProps } from './IsRegisteredCheckbox';\r\nimport { ValueLabel } from '../../types';\r\n\r\ntype IsRegisteredDropDownProps = IsRegisteredCheckboxProps & {\r\n options: ValueLabel[];\r\n};\r\n\r\nexport const IsRegisteredDropDown: React.FC = ({\r\n options,\r\n label,\r\n recoilState,\r\n inputId,\r\n defaultValue,\r\n}) => {\r\n const [isRegistered, setIsRegistered] = useRecoilState(recoilState);\r\n\r\n useEffect(() => {\r\n if (defaultValue) setIsRegistered(defaultValue);\r\n }, [setIsRegistered, defaultValue]);\r\n\r\n return (\r\n <>\r\n \r\n {label}\r\n \r\n setIsRegistered(value)}\r\n defaultValue={defaultValue ?? isRegistered}\r\n sx={filterSelectStyle}\r\n aria-label='Is registered'\r\n >\r\n {options.map((option) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import { useEffect, useState } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useIsAuthenticated } from '@azure/msal-react';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { useConsulteePermission, API_QUERY_KEYS } from 'api';\r\nimport { useNavigate, useNavigation } from 'hooks';\r\nimport {\r\n hasPermissionState,\r\n isAdminOrConsulteeState,\r\n isTQAdminState,\r\n isAdminState,\r\n isConsulteeState,\r\n} from 'store';\r\n\r\ntype usePermissionsReturn = {\r\n hasPageViewPermissions: boolean;\r\n isFetchingPermissions: boolean;\r\n};\r\n\r\nexport const usePermissions = (): usePermissionsReturn => {\r\n const location = useLocation();\r\n const isAuthenticated = useIsAuthenticated();\r\n const queryClient = useQueryClient();\r\n\r\n const hasPermission = useRecoilValue(hasPermissionState);\r\n const isTQAdmin = useRecoilValue(isTQAdminState);\r\n const isAdmin = useRecoilValue(isAdminState);\r\n const isConsultee = useRecoilValue(isConsulteeState);\r\n const isAdminOrConsultee = useRecoilValue(isAdminOrConsulteeState);\r\n\r\n const { navigateToDashboard, navigateToTrafficMonitor } = useNavigate();\r\n\r\n const { isLoading } = useConsulteePermission(isAuthenticated);\r\n\r\n const { isHomePage, isMonitorPage, isManageTeamPage, isCreateOrganisationPage } =\r\n useNavigation(location.pathname);\r\n\r\n const [hasPageViewPermissions, setHasPageViewPermissions] = useState(false);\r\n const [isFetchingPermissions, setIsFetchingPermissions] = useState(true);\r\n\r\n useEffect(() => {\r\n if (isAuthenticated && !hasPermission)\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsulteePermission] });\r\n }, [isAuthenticated, hasPermission, queryClient]);\r\n\r\n useEffect(() => {\r\n if (isHomePage && hasPermission) {\r\n if (isTQAdmin) navigateToTrafficMonitor();\r\n else if (isAdminOrConsultee) navigateToDashboard();\r\n }\r\n }, [\r\n hasPermission,\r\n isHomePage,\r\n isTQAdmin,\r\n isAdminOrConsultee,\r\n navigateToDashboard,\r\n navigateToTrafficMonitor,\r\n ]);\r\n\r\n useEffect(() => {\r\n const tqAdminPermissionRequired = isMonitorPage || isCreateOrganisationPage;\r\n const adminPermissionRequired = isManageTeamPage;\r\n\r\n if (isTQAdmin) setHasPageViewPermissions(true);\r\n else if (isAdmin) setHasPageViewPermissions(!tqAdminPermissionRequired);\r\n else if (isConsultee)\r\n setHasPageViewPermissions(!tqAdminPermissionRequired && !adminPermissionRequired);\r\n else setHasPageViewPermissions(isHomePage && !isAuthenticated);\r\n }, [\r\n isMonitorPage,\r\n isManageTeamPage,\r\n isTQAdmin,\r\n isAdmin,\r\n isConsultee,\r\n isHomePage,\r\n isAuthenticated,\r\n isCreateOrganisationPage,\r\n ]);\r\n\r\n useEffect(() => {\r\n setIsFetchingPermissions(\r\n isLoading || (!hasPermission && isAuthenticated) || (hasPermission && isHomePage)\r\n );\r\n }, [isLoading, hasPermission, isAuthenticated, isHomePage]);\r\n\r\n return {\r\n hasPageViewPermissions,\r\n isFetchingPermissions,\r\n };\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\nimport { useSetRecoilState } from 'recoil';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getConsulteePermission,\r\n GetConsulteePermissionResponse,\r\n PermissionsQueryDefaults,\r\n} from 'api';\r\nimport {\r\n consulteeEmailState,\r\n consulteeIdState,\r\n consulteeNameState,\r\n consulteeOrganisationIdsState,\r\n consulteeParentOrganisationIdsState,\r\n isAdminState,\r\n isConsulteeState,\r\n isTQAdminState,\r\n} from 'store';\r\nimport { Permission } from 'types';\r\n\r\nexport const useConsulteePermission = (\r\n isAuthenticated: boolean\r\n): QueryObserverResult => {\r\n const setConsulteeId = useSetRecoilState(consulteeIdState);\r\n const setName = useSetRecoilState(consulteeNameState);\r\n const setEmail = useSetRecoilState(consulteeEmailState);\r\n const setOrganisationIds = useSetRecoilState(consulteeOrganisationIdsState);\r\n const setParentOrganisationIds = useSetRecoilState(consulteeParentOrganisationIdsState);\r\n const setIsAdmin = useSetRecoilState(isAdminState);\r\n const setIsConsultee = useSetRecoilState(isConsulteeState);\r\n const setIsTQAdmin = useSetRecoilState(isTQAdminState);\r\n\r\n return useQuery([API_QUERY_KEYS.getConsulteePermission], getConsulteePermission, {\r\n ...PermissionsQueryDefaults,\r\n onSuccess(response: GetConsulteePermissionResponse) {\r\n setConsulteeId(response.consulteeId);\r\n setName(response.name);\r\n setEmail(response.email);\r\n setOrganisationIds(response.organisationIds);\r\n setParentOrganisationIds(response.parentOrganisationIds);\r\n setIsAdmin(response.permission === Permission.Admin);\r\n setIsConsultee(response.permission === Permission.Consultee);\r\n setIsTQAdmin(response.permission === Permission.TQAdmin);\r\n },\r\n enabled: isAuthenticated,\r\n });\r\n};\r\n","import React, { useLayoutEffect, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { useIsAuthenticated } from '@azure/msal-react';\r\nimport { AttentionMessage, Box, AnimatedSpinner, Center } from '@tq/ui-components';\r\n\r\nimport { AppBar, AppFooter } from 'components';\r\nimport { useNavigate, useNavigation } from 'hooks';\r\nimport { usePermissions } from './hooks';\r\n\r\nexport const Layout: React.FC = ({ children }) => {\r\n const { t } = useTranslation('layout');\r\n const location = useLocation();\r\n const isAuthenticated = useIsAuthenticated();\r\n\r\n const { hasPageViewPermissions, isFetchingPermissions } = usePermissions();\r\n\r\n const { isBreadcrumbPage, isHomePage, isLoginPage } = useNavigation(location.pathname);\r\n const { navigateToHome } = useNavigate();\r\n const layoutTopPadding = isBreadcrumbPage ? 154 : 96;\r\n\r\n useLayoutEffect(() => document.documentElement.scrollTo(0, 0), [location.pathname]);\r\n\r\n useLayoutEffect(() => {\r\n if (isLoginPage && isAuthenticated) navigateToHome();\r\n }, [isAuthenticated, isHomePage, navigateToHome, isLoginPage]);\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n // Check if the pressed key matches the target key (case insensitive)\r\n if (event.key?.toLowerCase() === 'h') {\r\n // Prevent default behavior if the key is pressed outside of input fields\r\n if (\r\n (event.target as HTMLElement).tagName &&\r\n (event.target as HTMLElement).tagName !== 'INPUT' &&\r\n (event.target as HTMLElement).tagName !== 'TEXTAREA'\r\n ) {\r\n event.preventDefault();\r\n\r\n const mainElement = document.getElementById('main');\r\n\r\n if (mainElement) {\r\n if (!mainElement.hasAttribute('tabindex')) {\r\n mainElement.setAttribute('tabindex', '-1');\r\n }\r\n mainElement.focus();\r\n }\r\n }\r\n }\r\n };\r\n\r\n document.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {hasPageViewPermissions ? (\r\n children\r\n ) : (\r\n
    \r\n {isFetchingPermissions ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n
    \r\n )}\r\n
    \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\nimport { Flex, Select, Text } from '@tq/ui-components/dist/components';\r\nimport { CSSObject } from '@tq/ui-components/dist/styled-system';\r\n\r\nimport { usePermissions } from 'api';\r\nimport { Permission } from 'types';\r\n\r\ntype ManageTeamFilterPermissionSelectProps = {\r\n permissionState: RecoilState;\r\n includeAllOption?: boolean;\r\n includePermissionDetails?: boolean;\r\n inputId?: string;\r\n sx?: CSSObject;\r\n disabled?: boolean;\r\n};\r\n\r\nexport const ManageTeamFilterPermissionSelect: React.FC =\r\n ({\r\n permissionState,\r\n includeAllOption = false,\r\n includePermissionDetails = false,\r\n inputId,\r\n disabled = false,\r\n sx,\r\n ...rest\r\n }) => {\r\n const { t } = useTranslation('manage_team');\r\n const { data: permissionData } = usePermissions();\r\n const [permission, setPermission] = useRecoilState(permissionState);\r\n const mountedRef = useRef(true);\r\n\r\n useEffect(() => {\r\n return () => {\r\n mountedRef.current = false;\r\n };\r\n }, []);\r\n\r\n const permissionOptions: { [key: string]: string[] } = {\r\n [Permission.Admin]: [\r\n t('permission_admin_1', 'Add and remove users'),\r\n t('permission_admin_2', 'Manage user permissions and teams'),\r\n t('permission_admin_3', 'View reports for the organisation'),\r\n t('permission_admin_4', 'Assign and respond to consultations'),\r\n ],\r\n [Permission.Consultee]: [\r\n t('permission_consultee_1', 'View reports for the organisation'),\r\n t('permission_consultee_2', 'Assign and respond to consultations'),\r\n ],\r\n };\r\n\r\n const selectablePermissions = permissionData?.permissions?.filter((o) => o.value !== 3);\r\n\r\n const selectedPermission = permissionData?.permissions?.find(\r\n (o) => o.value === permission\r\n );\r\n\r\n const permissionDetails = selectedPermission\r\n ? permissionOptions[selectedPermission?.label]\r\n : undefined;\r\n\r\n const handleSelect = (value: string) => {\r\n const selectedValue = selectablePermissions?.find((item) => item.value === +value);\r\n if (\r\n !mountedRef.current ||\r\n !selectedValue ||\r\n Number(value) === selectedPermission?.value\r\n ) {\r\n return;\r\n }\r\n\r\n setPermission(Number(value));\r\n };\r\n\r\n return (\r\n
    \r\n {mountedRef.current ? (\r\n handleSelect(value)}\r\n sx={sx}\r\n disabled={disabled}\r\n aria-label='Permission select dropdown'\r\n {...rest}\r\n >\r\n {includeAllOption ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n {selectablePermissions?.map((opt) => (\r\n \r\n ))}\r\n \r\n ) : null}\r\n {includePermissionDetails && permissionDetails && selectedPermission ? (\r\n \r\n \r\n {selectedPermission.label} {t('permission_can_text', 'can')}:\r\n \r\n {permissionDetails.map((p) => (\r\n - {p}\r\n ))}\r\n \r\n ) : null}\r\n
    \r\n );\r\n };\r\n","import { ValueLabelResponse } from '../../types';\r\nimport { FormControl, FormLabel } from '@tq/ui-components';\r\nimport { ConsultationFilterMultiSelect } from '../ConsultationFilterMultiSelect';\r\nimport { invitePermissionState, inviteTeamsState } from '../../store';\r\nimport { ManageTeamFilterPermissionSelect } from './ManageTeamFilterPermissionSelect';\r\nimport React from 'react';\r\nimport { PageTypeProps } from './fragments/ManageTeamInviteUserProps';\r\n\r\ntype InviteAdminUserFormProps = PageTypeProps & {\r\n teamsLabel: string;\r\n items: ValueLabelResponse[] | undefined;\r\n disabled: boolean;\r\n permissionLabel: string;\r\n};\r\n\r\nexport const InviteAdminUserForm: React.FC = ({\r\n pageType,\r\n teamsLabel,\r\n items,\r\n disabled,\r\n permissionLabel,\r\n}) => {\r\n return (\r\n <>\r\n {pageType !== 'ManageTQAdmin' && (\r\n <>\r\n \r\n \r\n \r\n \r\n {permissionLabel}:\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { UpdateAdminUserRequest, UpdateConsulteeRequest, useUpdateConsultee } from 'api';\r\n\r\ntype UseManageTeamRowProps = {\r\n updateUser: (\r\n isAdmin: boolean,\r\n user: UpdateAdminUserRequest,\r\n onSuccess: () => void,\r\n onFailure: () => void\r\n ) => void;\r\n isUpdatingUser: boolean;\r\n};\r\n\r\nexport const useManageTeamRow = (): UseManageTeamRowProps => {\r\n const { mutate: updateConsultee, isLoading: isUpdatingConsultee } = useUpdateConsultee();\r\n\r\n const onUpdateConsultee = (\r\n data: UpdateConsulteeRequest,\r\n onSuccess: () => void,\r\n onFailure: () => void\r\n ) => {\r\n updateConsultee(data, {\r\n onSuccess: () => {\r\n onSuccess();\r\n },\r\n onError: () => {\r\n onFailure();\r\n },\r\n });\r\n };\r\n\r\n const updateUser = (\r\n isAdmin: boolean,\r\n user: UpdateAdminUserRequest,\r\n onSuccess: () => void,\r\n onFailure: () => void\r\n ) => onUpdateConsultee(user, onSuccess, onFailure);\r\n\r\n return {\r\n updateUser,\r\n isUpdatingUser: isUpdatingConsultee,\r\n };\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { updateConsultee } from '../methods';\r\nimport { UpdateConsulteeRequest } from '../types';\r\n\r\nexport const useUpdateConsultee = (): UseMutationResult<\r\n unknown,\r\n unknown,\r\n UpdateConsulteeRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(updateConsultee, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageTeamConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getTQAdmins] });\r\n },\r\n });\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Form, FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n Button,\r\n Flex,\r\n FormControl,\r\n FormErrorMessage,\r\n FormLabel,\r\n Input,\r\n Stack,\r\n} from '@tq/ui-components';\r\nimport { ManageTeamInviteUserProps } from './fragments/ManageTeamInviteUserProps';\r\nimport { InviteAdminUserForm } from './InviteAdminUserForm';\r\nimport { UseInviteUserForm } from './hooks';\r\n\r\nexport const InviteUserForm: React.FC = ({\r\n buttonText,\r\n pageType,\r\n teamOptions,\r\n disabled = false,\r\n}) => {\r\n const { t } = useTranslation('manage_team');\r\n const {\r\n emailIsInvalid,\r\n nameIsInvalid,\r\n canSubmit,\r\n onUpdateEmail,\r\n emailOnBlur,\r\n onUpdateName,\r\n nameOnBlur,\r\n onSendInvite,\r\n inviteName,\r\n inviteEmail,\r\n } = UseInviteUserForm({ pageType });\r\n return (\r\n <>\r\n \r\n
    \r\n \r\n \r\n \r\n {t('name_label', 'Name')}:\r\n \r\n \r\n {t('name_error', 'Please add a name to continue')}\r\n \r\n \r\n \r\n {t('email_label', 'Email')}:\r\n \r\n \r\n {t('email_error', 'Please enter a valid email address')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {buttonText}\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import { useInviteConsultee, usePermissions } from '../../../api';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';\r\nimport {\r\n inviteEmailState,\r\n inviteNameState,\r\n invitePermissionState,\r\n inviteRequestState,\r\n inviteTeamsState,\r\n showInviteUserModalState,\r\n useResetInviteUserState,\r\n} from '../../../store';\r\nimport { Permission } from '../../../types';\r\nimport { isEmailValid, isNameValid } from '../../../tools';\r\nimport { isNumeric } from '@tq/ui-components';\r\nimport { UseInviteUserFormReturn } from '../fragments/UseInviteUserFormReturn';\r\nimport { PageTypeProps } from '../fragments/ManageTeamInviteUserProps';\r\n\r\nexport type useInviteUserFormProps = PageTypeProps & Record;\r\n\r\nexport const UseInviteUserForm = ({\r\n pageType,\r\n}: useInviteUserFormProps): UseInviteUserFormReturn => {\r\n const { data: permissionData } = usePermissions();\r\n const [emailIsInvalid, setEmailIsInvalid] = useState(false);\r\n const [nameIsInvalid, setNameIsInvalid] = useState(false);\r\n const [canSubmit, setCanSubmit] = useState(false);\r\n const [inviteEmail, setInviteEmail] = useRecoilState(inviteEmailState);\r\n const [inviteName, setInviteName] = useRecoilState(inviteNameState);\r\n const [inviteTeams] = useRecoilState(inviteTeamsState);\r\n const [invitePermission, setInvitePermission] = useRecoilState(invitePermissionState);\r\n const inviteRequest = useRecoilValue(inviteRequestState);\r\n const setShowInviteUserModal = useSetRecoilState(showInviteUserModalState);\r\n\r\n const { mutate: inviteConsultee } = useInviteConsultee();\r\n const resetInviteState = useResetInviteUserState();\r\n const isManageAdminUsersPage = pageType === 'ManageTQAdmin';\r\n const _adminPermissionId = permissionData?.permissions?.find(\r\n (o) => o.label === Permission.TQAdmin\r\n )?.value;\r\n\r\n useEffect(() => {\r\n if (isManageAdminUsersPage && _adminPermissionId) {\r\n setInvitePermission(_adminPermissionId);\r\n }\r\n });\r\n\r\n useEffect(() => {\r\n if (isManageAdminUsersPage) {\r\n setCanSubmit(\r\n isNameValid(inviteName) && isEmailValid(inviteEmail) && isNumeric(invitePermission)\r\n );\r\n } else {\r\n setCanSubmit(\r\n isNameValid(inviteName) &&\r\n isEmailValid(inviteEmail) &&\r\n inviteTeams.length > 0 &&\r\n isNumeric(invitePermission) &&\r\n invitePermission > 0\r\n );\r\n }\r\n }, [\r\n _adminPermissionId,\r\n inviteName,\r\n inviteEmail,\r\n invitePermission,\r\n inviteTeams,\r\n isManageAdminUsersPage,\r\n pageType,\r\n ]);\r\n\r\n const onUpdateEmail = (e: React.ChangeEvent): void => {\r\n const value = e.target.value;\r\n if (value === '') setEmailIsInvalid(false);\r\n setInviteEmail(value);\r\n };\r\n\r\n const emailOnBlur = (): void => {\r\n if (inviteEmail !== '') setEmailIsInvalid(!isEmailValid(inviteEmail));\r\n };\r\n\r\n const onUpdateName = (e: React.ChangeEvent): void => {\r\n const value = e.target.value;\r\n if (value === '') setNameIsInvalid(false);\r\n setInviteName(e.target.value);\r\n };\r\n\r\n const nameOnBlur = (): void => {\r\n if (inviteName !== '') setNameIsInvalid(!isNameValid(inviteName));\r\n };\r\n\r\n const onSendInvite = (): void => {\r\n if (pageType === 'ManageTeam') {\r\n inviteConsultee(inviteRequest, {\r\n onSuccess: () => {\r\n resetInviteState();\r\n },\r\n });\r\n } else setShowInviteUserModal(true);\r\n };\r\n return {\r\n emailIsInvalid,\r\n nameIsInvalid,\r\n canSubmit,\r\n onUpdateEmail,\r\n emailOnBlur,\r\n onUpdateName,\r\n nameOnBlur,\r\n onSendInvite,\r\n inviteName,\r\n inviteEmail,\r\n inviteTeams,\r\n invitePermission,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUserCircle } from 'react-icons/fa';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n useBanner,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { useInviteConsultee } from 'api';\r\nimport { MobileModal } from 'components';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport {\r\n inviteNameState,\r\n inviteEmailState,\r\n inviteRequestState,\r\n useResetInviteUserState,\r\n} from 'store';\r\n\r\ntype ManageTeamModalProps = {\r\n onClose: () => void;\r\n};\r\n\r\nexport const InviteUserModal: React.FC = ({ onClose }) => {\r\n const { t } = useTranslation('manage_team_modal');\r\n const isMobile = useIsMobile();\r\n const { mutate: inviteConsultee } = useInviteConsultee();\r\n\r\n const inviteName = useRecoilValue(inviteNameState);\r\n const inviteEmail = useRecoilValue(inviteEmailState);\r\n const inviteRequest = useRecoilValue(inviteRequestState);\r\n const resetInviteState = useResetInviteUserState();\r\n\r\n const banner = useBanner();\r\n const handleInvite = () => {\r\n inviteConsultee(inviteRequest, {\r\n onSuccess: () => {\r\n resetInviteState();\r\n onClose();\r\n banner({\r\n id: 'manage-team-banner',\r\n title: t('invite_submission_success', 'User invited'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n },\r\n onError: () => {\r\n banner({\r\n id: 'manage-team-banner-fail',\r\n title: t('invite_submission_failed', 'Failed to send invitation. Please try again.'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n },\r\n });\r\n };\r\n\r\n const content = (\r\n <>\r\n \r\n \r\n \r\n {t('invite_user_heading', 'Invite user')}\r\n \r\n \r\n \r\n \r\n \r\n {t('invite_user_body', 'You are about to invite the following user:')}\r\n \r\n {inviteName + ' <' + inviteEmail + '>'}\r\n \r\n \r\n );\r\n\r\n return isMobile ? (\r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaEdit, FaEnvelope, FaUserTimes } from 'react-icons/fa';\r\n\r\nimport { ActionMenuButtonEllipsis } from 'components';\r\nimport { MenuOption } from 'types';\r\n\r\ntype ManageTeamActionMenuProps = {\r\n onEdit: () => void;\r\n onRemove: () => void;\r\n onResendInvite: () => void;\r\n};\r\n\r\nexport const ManageTeamActionMenu: React.FC = ({\r\n onEdit,\r\n onRemove,\r\n onResendInvite,\r\n}) => {\r\n const { t } = useTranslation('manage_team');\r\n\r\n const options: MenuOption[] = [\r\n {\r\n label: t('edit', 'Edit'),\r\n onClick: onEdit,\r\n icon: FaEdit,\r\n },\r\n {\r\n label: t('resend_invite', 'Resend invite'),\r\n icon: FaEnvelope,\r\n onClick: onResendInvite,\r\n },\r\n {\r\n label: t('remove_user', 'Remove user'),\r\n onClick: onRemove,\r\n icon: FaUserTimes,\r\n },\r\n ];\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\nimport { Card, Heading } from '@tq/ui-components';\r\n\r\nimport { showInviteUserModalState } from 'store';\r\nimport { InviteUserForm, InviteUserModal } from '.';\r\nimport { ManageTeamInviteUserProps } from './fragments/ManageTeamInviteUserProps';\r\n\r\nexport const ManageTeamInviteUser: React.FC = ({\r\n title = 'Invite user',\r\n buttonText = 'submit',\r\n teamOptions = [],\r\n disabled = false,\r\n pageType = 'ManageTeam',\r\n}) => {\r\n const setShowInviteUserModal = useSetRecoilState(showInviteUserModalState);\r\n const showInviteUserModal = useRecoilValue(showInviteUserModalState);\r\n\r\n const onClose = () => setShowInviteUserModal(false);\r\n\r\n return (\r\n <>\r\n \r\n {title && (\r\n \r\n {title}\r\n \r\n )}\r\n \r\n \r\n {showInviteUserModal && }\r\n \r\n );\r\n};\r\n","import React, { useCallback, useRef } from 'react';\r\nimport { useRecoilValue, useResetRecoilState } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Grid, Heading } from '@tq/ui-components';\r\n\r\nimport { DataTablePagination } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport {\r\n showRemoveUserModalState,\r\n showInviteUserModalState,\r\n removeUserState,\r\n manageUsersPageSizeState,\r\n manageUsersPageNumberState,\r\n} from 'store';\r\nimport { ApplicationUser } from 'types';\r\nimport { ManageTeamRow, RemoveUserModal } from '.';\r\n\r\nexport type ManageTeamUsersProps = {\r\n applicationUsers: ApplicationUser[];\r\n isAdmin?: boolean;\r\n};\r\n\r\nexport const ManageTeamUsers: React.FC = ({\r\n applicationUsers,\r\n isAdmin = false,\r\n}) => {\r\n const { t } = useTranslation('manage_team');\r\n const isMobile = useIsMobile();\r\n const pageNumber = useRecoilValue(manageUsersPageNumberState);\r\n const pageSize = useRecoilValue(manageUsersPageSizeState);\r\n const showRemoveUserModal = useRecoilValue(showRemoveUserModalState);\r\n const resetShowRemoveUserModal = useResetRecoilState(showRemoveUserModalState);\r\n const removeUserData = useRecoilValue(removeUserState);\r\n const resetRemoveUserState = useResetRecoilState(removeUserState);\r\n const resetShowInviteUserModal = useResetRecoilState(showInviteUserModalState);\r\n\r\n const tableRef = useRef(null);\r\n\r\n const onClose = () => {\r\n resetRemoveUserState();\r\n resetShowRemoveUserModal();\r\n resetShowInviteUserModal();\r\n };\r\n\r\n const paginationInfo = useCallback(() => {\r\n return {\r\n pageSize,\r\n currentPage: pageNumber,\r\n totalCount: applicationUsers.length,\r\n totalPages: Math.ceil(applicationUsers.length / pageSize),\r\n };\r\n }, [applicationUsers, pageNumber, pageSize]);\r\n\r\n const ApplicationUsersPage = useCallback(() => {\r\n return applicationUsers.slice((pageNumber - 1) * pageSize, pageNumber * pageSize);\r\n }, [applicationUsers, pageNumber, pageSize]);\r\n\r\n const columnWidths = isAdmin ? '18% 45% 15% 15%' : '18% 27% 22% 16% 10% 5%';\r\n const getTableHeaderBackground = isAdmin ? COLOURS.blue[150] : COLOURS.gray[200];\r\n const getTableHeaderBorderColour = isAdmin ? COLOURS.transparent : COLOURS.gray[300];\r\n const getGridGap = isAdmin ? { base: 0 } : { base: 4, lg: 2 };\r\n const getTableHeaderBottomMargin = isAdmin ? 0 : 2;\r\n\r\n return (\r\n <>\r\n {!isMobile && (\r\n \r\n {t('name_label', 'Name')}\r\n {t('email_label', 'Email')}\r\n {!isAdmin && (\r\n <>\r\n {t('team_label', 'Team')}\r\n {t('permission_label', 'Permissions')}\r\n \r\n )}\r\n {t('registered_label', 'Invitation accepted')}\r\n \r\n )}\r\n \r\n {ApplicationUsersPage().map((data) => (\r\n \r\n ))}\r\n \r\n \r\n {showRemoveUserModal && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Form, FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n Box,\r\n Button,\r\n Card,\r\n Checkbox,\r\n Flex,\r\n FormControl,\r\n FormLabel,\r\n Input,\r\n Select,\r\n Stack,\r\n useBanner,\r\n} from '@tq/ui-components';\r\n\r\nimport { useConsulteeTeams, UpdateAdminUserRequest, usePermissions } from 'api';\r\nimport { MultiSelect } from 'components';\r\nimport { ApplicationUser, ValueLabelResponse } from 'types';\r\n\r\nimport { useManageTeamRow } from '../hooks';\r\nimport { BANNER_TIMEOUT } from '../../../config';\r\n\r\ninterface ManageTeamRowProps {\r\n data: ApplicationUser;\r\n isAdmin?: boolean;\r\n setEditable: (editable: boolean) => void;\r\n}\r\n\r\nexport const EditTeamRow: React.FC = ({\r\n data,\r\n isAdmin = false,\r\n setEditable,\r\n}) => {\r\n const { data: teamOptions } = useConsulteeTeams();\r\n const { t } = useTranslation('manage_team');\r\n const banner = useBanner();\r\n const { data: permissionData } = usePermissions();\r\n\r\n const [isRegistered, setIsRegistered] = React.useState(data.isRegistered);\r\n const [canSubmit, setCanSubmit] = React.useState(false);\r\n const [teams, setTeams] = React.useState(data?.teams);\r\n const [userName, setUserName] = React.useState(data?.name);\r\n const [permission, setPermission] = React.useState(data?.permission?.value);\r\n\r\n const { updateUser, isUpdatingUser } = useManageTeamRow();\r\n\r\n useEffect(() => {\r\n const sortNumbers = (a: number, b: number) => a - b;\r\n\r\n const permissionChanged = data?.permission?.value !== permission;\r\n const existingTeamValues = data?.teams?.map((r: ValueLabelResponse) => r.value);\r\n const selectedTeamValues = teams?.map((u) => u.value);\r\n const acceptedInviteChanged = data?.isRegistered !== isRegistered;\r\n const teamChanged =\r\n existingTeamValues?.slice().sort(sortNumbers).toString() !==\r\n selectedTeamValues?.slice().sort(sortNumbers).toString();\r\n const userNameChanged = userName !== data.name;\r\n\r\n const hasChanged =\r\n permissionChanged || teamChanged || userNameChanged || acceptedInviteChanged;\r\n\r\n setCanSubmit(isAdmin ? hasChanged : hasChanged && permission !== 0 && !!teams.length);\r\n }, [data, userName, teams, permission, isAdmin, isRegistered]);\r\n\r\n const onAddTeam = (selectedValue: string) => {\r\n const selectedTeam = teamOptions?.teams.find((r) => r.value === Number(selectedValue));\r\n\r\n if (selectedTeam && !teams.map((o) => o.label).includes(selectedTeam.label)) {\r\n setTeams((existingTeams) => [...existingTeams, selectedTeam]);\r\n }\r\n };\r\n\r\n const onRemoveTeam = (selectedValue: number | string) => {\r\n const teamToRemove = teams.find((r) => r.value === selectedValue);\r\n setTeams((existingTeams) => existingTeams.filter((v) => v.value !== teamToRemove?.value));\r\n };\r\n\r\n const onUpdateUser = () => {\r\n const user = {\r\n id: data.id as number,\r\n permissionId: Number(permission),\r\n teams: teams?.map((teamDetail) => teamDetail.value) ?? [],\r\n userName,\r\n isRegistered: isRegistered ?? false,\r\n } as UpdateAdminUserRequest;\r\n updateUser(isAdmin, user, showSuccessBanner, showFailedBanner);\r\n };\r\n\r\n const showSuccessBanner = () => {\r\n setEditable(false);\r\n banner({\r\n id: 'update-consultee-banner',\r\n title: t('user_updated', 'User updated'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n };\r\n\r\n function showFailedBanner() {\r\n banner({\r\n id: 'update-consultee-banner-fail',\r\n title: t('error_updating_user', 'User cannot be updated. Please try again'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n {t('name_label', 'Name')}:\r\n setUserName(event.target.value)}\r\n />\r\n \r\n \r\n {t('email_label', 'Email')}:\r\n \r\n \r\n {!isAdmin && (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n {t('permission_label', 'Permissions')}:\r\n \r\n setPermission(Number(value))}\r\n aria-label='Permission select dropdown'\r\n >\r\n {permissionData?.permissions.map((opt) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n )}\r\n \r\n {t('registered_label', 'Invitation accepted')}:\r\n ) =>\r\n setIsRegistered(event.target.checked)\r\n }\r\n mb={0}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {t('update_button_text', 'Update')}\r\n \r\n {\r\n setEditable(false);\r\n }}\r\n px={8}\r\n py={2}\r\n >\r\n {t('cancel_button_text', 'Cancel')}\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSetRecoilState } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Grid, HStack, Text, useBanner } from '@tq/ui-components';\r\n\r\nimport { useInviteConsultee, InviteConsulteeRequest } from 'api';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { showRemoveUserModalState, removeUserState } from 'store';\r\nimport { ApplicationUser, ValueLabelResponse } from 'types';\r\nimport { TableCellBadges } from 'components';\r\n\r\nimport { ManageTeamActionMenu } from '../ManageTeamActionMenu';\r\n\r\ninterface ManageTeamRowProps {\r\n data: ApplicationUser;\r\n columnWidths: string;\r\n isAdmin?: boolean;\r\n setEditable: (editable: boolean) => void;\r\n}\r\n\r\nexport const ViewTeamRow: React.FC = ({\r\n data,\r\n columnWidths,\r\n isAdmin = false,\r\n setEditable,\r\n}) => {\r\n const banner = useBanner();\r\n const { mutate: inviteConsultee } = useInviteConsultee();\r\n const { t } = useTranslation('manage_team');\r\n const isMobile = useIsMobile();\r\n\r\n const setShowManageTeamRemoveUserModal = useSetRecoilState(showRemoveUserModalState);\r\n const setRemoveUser = useSetRecoilState(removeUserState);\r\n\r\n const onEditItem = () => {\r\n setEditable(true);\r\n };\r\n\r\n const onRemoveItem = () => {\r\n setShowManageTeamRemoveUserModal(true);\r\n setRemoveUser(data);\r\n };\r\n\r\n const onResendInvite = () => {\r\n inviteConsultee(\r\n {\r\n name: data.name,\r\n email: data.email,\r\n permissionId: data.permission?.value ?? 0,\r\n teamIds: data.teams?.map((response: ValueLabelResponse) => response.value) ?? [],\r\n } as InviteConsulteeRequest,\r\n {\r\n onSuccess: () => {\r\n banner({\r\n id: 'resend-invite-banner-success',\r\n title: t('invite_sent_success', 'Invite sent'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n },\r\n onError: () => {\r\n banner({\r\n id: 'resend-invite-banner-fail',\r\n title: t('invite_sent_failed', 'Failed to resend invite. Please try again.'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n },\r\n }\r\n );\r\n };\r\n\r\n const getBaseTemplateAreas = isAdmin\r\n ? `'name menu'\r\n 'email registered'`\r\n : `'name menu'\r\n 'email registered'\r\n 'team permissions'`;\r\n const getLgTemplateAreas = isAdmin\r\n ? `'name email registered menu'`\r\n : `'name email team permissions registered menu'`;\r\n\r\n return (\r\n \r\n \r\n {data.name}\r\n \r\n \r\n {data.email}\r\n \r\n {!isAdmin && (\r\n <>\r\n \r\n \r\n {data.permission?.label}\r\n \r\n \r\n )}\r\n \r\n {isMobile && {t('registered_value', 'Registered')}}\r\n \r\n {data.isRegistered ? 'Yes' : 'No'}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { ApplicationUser } from 'types';\r\n\r\nimport { EditTeamRow } from './components/EditTeamRow';\r\nimport { ViewTeamRow } from './components/ViewTeamRow';\r\n\r\ninterface ManageTeamRowProps {\r\n data: ApplicationUser;\r\n columnWidths: string;\r\n isAdmin?: boolean;\r\n}\r\n\r\nexport const ManageTeamRow: React.FC = ({\r\n data,\r\n columnWidths,\r\n isAdmin = false,\r\n}) => {\r\n const [isEditable, setEditable] = React.useState(false);\r\n\r\n return isEditable ? (\r\n \r\n ) : (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUserCircle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n useBanner,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { useDeleteConsultee } from 'api';\r\nimport { MobileModal } from 'components';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { ApplicationUser } from 'types';\r\n\r\ntype ManageTeamModalProps = {\r\n removeUserData: ApplicationUser | undefined;\r\n onClose: () => void;\r\n};\r\n\r\nexport const RemoveUserModal: React.FC = ({\r\n removeUserData,\r\n onClose,\r\n}) => {\r\n const { t } = useTranslation('manage_team_modal');\r\n const isMobile = useIsMobile();\r\n const banner = useBanner();\r\n const { mutate: deleteConsultee } = useDeleteConsultee();\r\n\r\n const handleError = () => {\r\n onClose();\r\n banner({\r\n id: 'remove-user-banner-fail',\r\n title: t('banner_user_removed_failed', 'User cannot be removed. Please try again.'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n };\r\n\r\n const handleRemove = () => {\r\n if (removeUserData?.id) {\r\n deleteConsultee(removeUserData.id, {\r\n onSuccess: () => {\r\n onClose();\r\n banner({\r\n id: 'remove-user-banner-success',\r\n title: t('banner_user_removed', 'User removed'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'success',\r\n });\r\n },\r\n onError: () => {\r\n handleError();\r\n },\r\n });\r\n } else {\r\n handleError();\r\n }\r\n };\r\n\r\n const content = (\r\n <>\r\n \r\n \r\n \r\n {t('remove_user_heading', 'Remove user')}\r\n \r\n \r\n \r\n \r\n \r\n {t('remove_user_body', 'You are about to remove the following user:')}\r\n \r\n {removeUserData?.name + ' <' + removeUserData?.email + '>'}\r\n \r\n \r\n );\r\n\r\n return isMobile ? (\r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Modal, ModalContent, ModalContentProps, ModalProps } from '@tq/ui-components';\r\n\r\nexport type MobileModalProps = Pick &\r\n ModalContentProps;\r\n/**\r\n *\r\n * Use this to display a full-screen mobile modal\r\n */\r\nexport const MobileModal: React.FC = ({\r\n isOpen,\r\n onClose,\r\n children,\r\n\r\n ...contentProps\r\n}) => (\r\n \r\n \r\n {children}\r\n \r\n \r\n);\r\n","import { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Button, Menu, MenuButton, MenuList } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ntype Props = {\r\n isActive: boolean;\r\n};\r\n\r\nexport const MobileMoreTab: React.FC = ({ children, isActive }) => {\r\n const { t } = useTranslation('more');\r\n return (\r\n \r\n \r\n {t('more', 'More')}...\r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { TabList, Tab, TabText, MenuItem } from '@tq/ui-components';\r\n\r\nimport { MobileMoreTab } from '../MobileMoreTab';\r\n\r\nexport interface MobileTabListProps {\r\n activeTabIndex: number;\r\n tabLabels: string[];\r\n onChangeActiveTab: (index: number) => void;\r\n}\r\nexport const MobileTabList: React.FC = ({\r\n activeTabIndex,\r\n tabLabels,\r\n onChangeActiveTab,\r\n}) => {\r\n return (\r\n \r\n onChangeActiveTab(0)}>\r\n {tabLabels[0]}\r\n \r\n onChangeActiveTab(1)}>\r\n {tabLabels[1]}\r\n \r\n {tabLabels.length > 2 && (\r\n 1}>\r\n {tabLabels.slice(2).map((label, index) => (\r\n onChangeActiveTab(index + 2)}\r\n sx={{\r\n bgColor: activeTabIndex === index + 2 ? COLOURS.blue[900] : undefined,\r\n color: activeTabIndex === index + 2 ? COLOURS.white : undefined,\r\n '&:focus': {\r\n bgColor: 'neutral.4',\r\n },\r\n }}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Grid, GridProps, FormLabel, Select } from '@tq/ui-components/dist/components';\r\n\r\nimport { GenericValueLabel } from 'types';\r\nimport { MultiSelectItems } from '..';\r\n\r\nexport type MultiSelectProps = {\r\n label: string;\r\n items?: GenericValueLabel[];\r\n selectedItems?: GenericValueLabel[];\r\n handleSelect: (value: string) => void;\r\n handleRemoveSelection: (value: number | string) => void;\r\n fieldId?: string;\r\n isInModal?: boolean;\r\n allowMultiSelect?: boolean;\r\n disabled?: boolean;\r\n};\r\n\r\nexport const MultiSelect: React.FC = ({\r\n label,\r\n items,\r\n selectedItems,\r\n handleSelect,\r\n handleRemoveSelection,\r\n fieldId,\r\n isInModal,\r\n allowMultiSelect = true,\r\n disabled = false,\r\n ...stylingProps\r\n}) => {\r\n const { t } = useTranslation('multi_select');\r\n\r\n const getPlaceHolderText = () => {\r\n if (allowMultiSelect && selectedItems?.length)\r\n return `${selectedItems?.length} ${t('selected', 'selected')}`;\r\n return selectedItems?.length ? selectedItems[0].label : `- ${t('select', 'Select')} -`;\r\n };\r\n\r\n const isSelectedItem = (item: GenericValueLabel): boolean => {\r\n if (selectedItems === undefined) return false;\r\n return selectedItems.some((sitem) => sitem.value === item.value);\r\n };\r\n\r\n return (\r\n \r\n {label}\r\n \r\n {items &&\r\n items.map((filter: GenericValueLabel) => (\r\n \r\n ))}\r\n \r\n {allowMultiSelect && selectedItems && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { TiTimes } from 'react-icons/ti';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button, Text } from '@tq/ui-components';\r\n\r\nimport { GenericValueLabel } from 'types';\r\n\r\nexport type SelectedItemProps = {\r\n selectedItems: GenericValueLabel[];\r\n onClick: (value: number | string) => void;\r\n};\r\n\r\nexport const MultiSelectItems: React.FC = ({ selectedItems, onClick }) => {\r\n return (\r\n \r\n {selectedItems?.map((filter: GenericValueLabel) => (\r\n }\r\n onClick={() => onClick(filter.value)}\r\n >\r\n \r\n {filter.label}\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import { Badge, useThemedValueSwitch } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ConsultationNoteTypes } from 'types';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { CUSTOM_TQ_COLOURS } from 'styles';\r\n\r\nexport type InternalExternalTagProps = {\r\n noteType: ConsultationNoteTypes;\r\n};\r\nexport const InternalExternalTag: React.FC = ({ noteType }) => {\r\n const { t } = useTranslation('notes');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const label =\r\n noteType === 'External' ? t('external', 'External') : t('internal', 'Internal');\r\n\r\n const niStyle = {\r\n external: {\r\n bgColor: COLOURS.neutral[7],\r\n color: COLOURS.black,\r\n },\r\n internal: {\r\n bgColor: COLOURS.neutral[10],\r\n color: COLOURS.black,\r\n },\r\n };\r\n\r\n const tqStyle = {\r\n external: {\r\n bgColor: CUSTOM_TQ_COLOURS.blueA0C8DB,\r\n color: 'black',\r\n },\r\n internal: {\r\n bgColor: 'green.850',\r\n color: 'white',\r\n },\r\n };\r\n\r\n const variant = noteType === 'External' ? 'external' : 'internal';\r\n\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Stack, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { ToggleButton, ToggleButtonGroup } from 'components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ConsultationNoteTypes } from 'types';\r\n\r\nexport type NotesFilter = 'All' | ConsultationNoteTypes;\r\nexport interface NotesFilterButtonsProps {\r\n activeFilter: NotesFilter;\r\n onChangeActiveFilter: (filter: NotesFilter) => void;\r\n}\r\nexport const NotesFilterButtons: React.FC = ({\r\n activeFilter,\r\n onChangeActiveFilter,\r\n}) => {\r\n const { t } = useTranslation('notes');\r\n const { tvs } = useThemedValueSwitch();\r\n return (\r\n \r\n \r\n onChangeActiveFilter('All')}\r\n variant='tertiary'\r\n >\r\n {t('all', 'All')}\r\n \r\n onChangeActiveFilter('Internal')}\r\n >\r\n {t('internal', 'Internal')}\r\n \r\n onChangeActiveFilter('External')}\r\n >\r\n {t('external', 'External')}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n ActivityFeed,\r\n ActivityItem,\r\n AttentionMessage,\r\n Box,\r\n Link,\r\n Stack,\r\n Typography,\r\n SkeletonText,\r\n Container,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile, useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\nimport { ConsultationNote } from 'types';\r\nimport { InternalExternalTag, NotesFilter, NotesFilterButtons } from './components';\r\n\r\ntype NotesProps = {\r\n notes?: ConsultationNote[];\r\n maxNotesBeforePaging?: number;\r\n loading?: boolean;\r\n};\r\n\r\nexport const Notes: React.FC = ({ notes, loading, maxNotesBeforePaging = 5 }) => {\r\n const { t } = useTranslation('notes');\r\n const { tvs } = useThemedValueSwitch();\r\n const [activeFilter, setActiveFilter] = useState('All');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n const filteredNotes =\r\n notes?.filter((note) => note.noteType === activeFilter || activeFilter === 'All') || [];\r\n\r\n const sortNotes = (noteA: ConsultationNote, noteB: ConsultationNote) =>\r\n noteA.noteDate > noteB.noteDate ? -1 : 1;\r\n\r\n const sortedNotes = filteredNotes?.sort(sortNotes);\r\n\r\n const pagedNotes = sortedNotes?.slice(\r\n 0,\r\n isExpanded ? sortedNotes.length + 1 : maxNotesBeforePaging\r\n );\r\n\r\n const isMobile = useIsMobile();\r\n\r\n if (loading) {\r\n return ;\r\n }\r\n if (!notes?.length) {\r\n return ;\r\n }\r\n\r\n // SQ made me put this here, think its much uglier but oh well.\r\n const activityFeedStyle = isMobile\r\n ? {\r\n height: '100%',\r\n maxHeight: '100%',\r\n }\r\n : undefined;\r\n\r\n return (\r\n \r\n \r\n {!pagedNotes?.length && activeFilter === 'External' ? (\r\n \r\n ) : null}\r\n {!pagedNotes?.length && activeFilter === 'Internal' ? (\r\n \r\n ) : null}\r\n {pagedNotes?.length ? (\r\n \r\n {pagedNotes?.map((note) => (\r\n \r\n \r\n \r\n \r\n

    \r\n {note.consulteeName ?? note.caseOfficerName}\r\n

    \r\n
    \r\n \r\n
    \r\n \r\n

    \r\n {formatLocaleDate(note.noteDate, StandardDateFormats.dateAndTime)}\r\n

    \r\n
    \r\n \r\n

    {note.noteText}

    \r\n
    \r\n
    \r\n
    \r\n ))}\r\n
    \r\n ) : null}\r\n {!isExpanded && filteredNotes.length > pagedNotes.length ? (\r\n \r\n \r\n setIsExpanded(true)}\r\n >\r\n {t('show_more', 'Show more')}\r\n \r\n \r\n \r\n ) : null}\r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaInfoCircle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Flex, Heading, IconButton, Tooltip, useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport { useNotesInfoText } from 'components';\r\nimport { useCanAddNote } from 'hooks';\r\nimport { Consultation } from 'types';\r\n\r\ntype NotesHeadingProps = {\r\n consultation?: Consultation;\r\n};\r\nexport const NotesHeading: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('notes');\r\n const canAddNote = useCanAddNote(consultation);\r\n const notesInfoText = useNotesInfoText();\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n return (\r\n <>\r\n {canAddNote ? (\r\n \r\n \r\n {t('notes', 'Notes')}\r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n {t('notes', 'Notes')}\r\n )}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useNotesInfoText = (): string => {\r\n const { t } = useTranslation('notes');\r\n return t(\r\n 'notes_info_message',\r\n 'Notes are for use either internally (with own consultee colleagues) or externally (with planning authority case officers) for informal clarification or updates only. Any material information requests should be dealt with through the normal consultation process.'\r\n );\r\n};\r\n","import React from 'react';\r\nimport { AttentionMessage } from '@tq/ui-components';\r\n\r\nimport { useNotesInfoText } from './useNotesInfoText';\r\nimport { useCanAddNote } from 'hooks';\r\nimport { Consultation } from 'types';\r\n\r\nexport type NoteInfoMessageProps = {\r\n consultation?: Consultation;\r\n};\r\nexport const NotesInfoMessage: React.FC = ({ consultation }) => {\r\n const canAddNote = useCanAddNote(consultation);\r\n const notesInfo = useNotesInfoText();\r\n return canAddNote ? (\r\n \r\n ) : null;\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Flex } from '@tq/ui-components';\r\n\r\nexport type NumberBoxProps = {\r\n label: number | string;\r\n};\r\n\r\nexport const NumberBox: React.FC = ({ label }) => {\r\n return (\r\n \r\n {label}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Typography } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nexport type PageHeadingProps = {\r\n heading: string;\r\n mobileHeading?: string;\r\n};\r\n\r\nexport const PageHeading: React.FC = ({ heading, mobileHeading }) => {\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n \r\n \r\n {isMobile ? mobileHeading ?? heading : heading}\r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { useSetRecoilState, useRecoilValue, RecoilState } from 'recoil';\r\nimport { Text, FormControl, FormLabel } from '@tq/ui-components';\r\n\r\nimport { usePermissions } from 'api';\r\nimport { ManageTeamFilterPermissionSelect } from 'components';\r\n\r\ninterface PermissionsTableCellProps {\r\n rowValue: string;\r\n editingState: RecoilState;\r\n permissionState: RecoilState;\r\n rowIndex: number;\r\n label: string;\r\n}\r\n\r\nexport const PermissionsTableCell: React.FC = ({\r\n rowValue,\r\n editingState,\r\n permissionState,\r\n rowIndex,\r\n label,\r\n}) => {\r\n const currentEditRowIndex = useRecoilValue(editingState);\r\n const setPermissionsSate = useSetRecoilState(permissionState);\r\n const { data: permissionData } = usePermissions();\r\n\r\n useEffect(() => {\r\n if (currentEditRowIndex === rowIndex) {\r\n const defaultValue = permissionData?.permissions.find(\r\n (permission) => permission.label === rowValue\r\n );\r\n if (defaultValue) setPermissionsSate(defaultValue.value);\r\n }\r\n }, [rowValue, permissionData, setPermissionsSate, currentEditRowIndex, rowIndex]);\r\n\r\n return currentEditRowIndex === rowIndex ? (\r\n \r\n {label}:\r\n \r\n \r\n ) : (\r\n {rowValue}\r\n );\r\n};\r\n","import React from 'react';\r\nimport { HiRefresh } from 'react-icons/hi';\r\nimport { Box, Button, FormLabel, Grid } from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { GetIncomingConsultationsResponse } from 'api';\r\nimport { SearchText } from '..';\r\nimport { incomingConsultationsByReferenceNumberState } from 'store';\r\n\r\nexport interface SearchPlanningApplicationsProps {\r\n incomingConsultationsData?: GetIncomingConsultationsResponse;\r\n refetchData?: () => void;\r\n}\r\n\r\nconst DESKTOP_TEMPLATE = `\r\n \"view view\"\r\n \"searchText refreshButton \"`;\r\n\r\nconst MOBILE_TEMPLATE = `\r\n\"view\"\r\n\"searchText\"\r\n\"refreshButton\"\r\n / 1fr 1fr 1fr\r\n`;\r\n\r\nexport const SearchPlanningApplications: React.FC = ({\r\n incomingConsultationsData,\r\n refetchData,\r\n}) => {\r\n const { t } = useTranslation('traffic_monitor');\r\n\r\n return (\r\n <>\r\n \r\n \r\n {t('search_planning_applications', 'Search for planning applications:')}\r\n \r\n <>\r\n \r\n \r\n \r\n \r\n }\r\n width={250}\r\n onClick={() => refetchData && refetchData()}\r\n disabled={!incomingConsultationsData?.incomingConsultations?.items?.length}\r\n >\r\n {t('refresh_table', 'Refresh table')}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\nimport {\r\n Box,\r\n FormControl,\r\n FormControlProps,\r\n FormLabel,\r\n HStack,\r\n LinkButton,\r\n SearchInput,\r\n SearchInputButton,\r\n SearchInputField,\r\n Typography,\r\n} from '@tq/ui-components';\r\n\r\nexport interface SearchTextProps extends FormControlProps {\r\n searchState: RecoilState;\r\n placeholderText: string;\r\n recordCount?: number;\r\n totalCount?: number;\r\n hideSearchInfo?: boolean;\r\n onChanged?: (value: string) => void;\r\n}\r\n\r\nexport const SearchText: React.FC = ({\r\n searchState,\r\n placeholderText,\r\n recordCount,\r\n totalCount,\r\n hideSearchInfo = false,\r\n onChanged,\r\n ...props\r\n}) => {\r\n const { label, width } = props;\r\n const { t } = useTranslation('search_filter');\r\n // state is used if there is no recoil state used.\r\n const [text, setText] = useState('');\r\n const [searchText, setSearchText] = useRecoilState(searchState);\r\n\r\n useEffect(() => setText(searchText), [setText, searchText]);\r\n\r\n const handleSearch = (value: string) => {\r\n setText(value);\r\n setSearchText(value);\r\n if (onChanged) {\r\n onChanged(value);\r\n }\r\n };\r\n\r\n const isInvalidSearch = () => {\r\n return recordCount === 0 && !!searchText;\r\n };\r\n\r\n const totalCountText = totalCount && totalCount > 0 ? `${t('of', 'of')} ${totalCount} ` : '';\r\n\r\n return (\r\n \r\n \r\n {label && {label}}\r\n setText((event as ChangeEvent).target.value)}\r\n onSearch={(value) => handleSearch(value ?? '')}\r\n searchOnCharacterCount={1000}\r\n >\r\n \r\n \r\n \r\n {searchText ? (\r\n \r\n {!hideSearchInfo && (recordCount ?? 0) >= 0 ? (\r\n \r\n \r\n {`${t('showing', 'Showing')} ${recordCount} ${\r\n recordCount === 1\r\n ? t('search_result', 'search result')\r\n : t('search_results', 'search results')\r\n } ${totalCountText}${t('for', 'for')} '${searchText}'`}\r\n \r\n \r\n ) : null}\r\n handleSearch('')}\r\n whiteSpace='nowrap'\r\n >\r\n {t('clear_search', 'Clear search')}\r\n \r\n \r\n ) : null}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { Badge, Flex } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { ValueLabelResponse } from 'types';\r\n\r\ninterface TableCellBadgesProps {\r\n items?: ValueLabelResponse[];\r\n}\r\n\r\nexport const TableCellBadges: React.FC = ({ items }) => {\r\n return (\r\n \r\n {items?.map((item: ValueLabelResponse) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaChevronDown, FaChevronUp, FaSlidersH } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Flex, Grid, Link, Typography } from '@tq/ui-components';\r\n\r\nimport { DateFilter, MultiSelect, SearchText } from 'components';\r\nimport { FilterOption } from '../../types';\r\nimport { RecoilState } from 'recoil';\r\nimport { handleFilterChanged, handleFilterRemoval } from './filterUtils';\r\n\r\ntype TableFiltersWithDateProps = {\r\n filters: FilterOption[];\r\n onSetSelectedFilters: (filterOptions: FilterOption[]) => void;\r\n textSearchState: RecoilState;\r\n collapsible?: boolean;\r\n showDateFilter?: boolean;\r\n initialStartDate?: Date;\r\n initialEndDate?: Date;\r\n onSetStartDate?: (date: Date) => void;\r\n onSetEndDate?: (date: Date) => void;\r\n fromDateLabel?: string;\r\n toDateLabel?: string;\r\n};\r\n\r\nexport const TableFiltersWithDate: React.FC = ({\r\n filters,\r\n onSetSelectedFilters,\r\n textSearchState,\r\n collapsible,\r\n showDateFilter,\r\n initialStartDate,\r\n initialEndDate,\r\n onSetStartDate,\r\n onSetEndDate,\r\n fromDateLabel = undefined,\r\n toDateLabel = undefined,\r\n}) => {\r\n const { t } = useTranslation('monitor');\r\n const [showFilters, setShowFilters] = useState(!collapsible);\r\n\r\n const handleSelect = (filter: FilterOption | undefined, value: number | string) => {\r\n handleFilterChanged(filters, filter, value, onSetSelectedFilters);\r\n };\r\n\r\n const handleRemoveSelection = (filter: FilterOption, value: number | string) => {\r\n handleFilterRemoval(filters, filter, value, onSetSelectedFilters);\r\n };\r\n\r\n return (\r\n \r\n {collapsible && (\r\n \r\n \r\n \r\n \r\n {t('filters', 'Filters')}\r\n \r\n \r\n setShowFilters((prevShow) => !prevShow)}>\r\n \r\n \r\n \r\n {showFilters ? t('hide_filters', 'Hide') : t('show_filters', 'Show')}\r\n \r\n {showFilters ? : }\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {showFilters && (\r\n \r\n \r\n \r\n \r\n handleSelect(\r\n filters.find((x) => x.isSearchText),\r\n text\r\n )\r\n }\r\n />\r\n \r\n {showDateFilter && onSetStartDate && onSetEndDate && (\r\n \r\n )}\r\n \r\n \r\n {filters\r\n .filter((x) => !x.isSearchText)\r\n .map((filter: FilterOption) => (\r\n handleSelect(filter, value)}\r\n handleRemoveSelection={(value) => handleRemoveSelection(filter, value)}\r\n fieldId={filter.name.replace(/\\s/g, '-')}\r\n />\r\n ))}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { FilterOption, GenericValueLabel } from '../../types';\r\n\r\nexport const handleFilterChanged = (\r\n filters: FilterOption[],\r\n filter: FilterOption | undefined,\r\n value: number | string,\r\n callback: (value: FilterOption[]) => void\r\n): void => {\r\n if (!filter || filters.length === 0) return;\r\n const selectedValue = filter.items?.find((item: GenericValueLabel) => item.value === value);\r\n if (\r\n (!filter.isSearchText && !selectedValue) ||\r\n filter.selectedItems.find(\r\n (selectedItem: GenericValueLabel) => selectedItem.value === value\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n const newFilters = JSON.parse(JSON.stringify(filters));\r\n if (!filter.allowMultiSelect) {\r\n newFilters.find(\r\n (newFilter: FilterOption) => newFilter.header === filter.header\r\n ).selectedItems = [];\r\n }\r\n newFilters\r\n .find((newFilter: FilterOption) => newFilter.header === filter.header)\r\n .selectedItems?.push(filter.isSearchText ? value : selectedValue);\r\n\r\n callback(newFilters);\r\n};\r\n\r\nexport const handleFilterRemoval = (\r\n filters: FilterOption[],\r\n filter: FilterOption,\r\n value: number | string,\r\n callback: (value: FilterOption[]) => void\r\n): void => {\r\n if (!filter || filters.length === 0 || !value) return;\r\n const newFilters = JSON.parse(JSON.stringify(filters));\r\n if (!filter.allowMultiSelect) {\r\n newFilters.find(\r\n (newFilter: FilterOption) => newFilter.header === filter.header\r\n ).selectedItems = [];\r\n } else {\r\n newFilters.find(\r\n (newFilter: FilterOption) => newFilter.header === filter.header\r\n ).selectedItems = filter.selectedItems.filter(\r\n (item: GenericValueLabel) => item.value !== value\r\n );\r\n }\r\n callback(newFilters);\r\n};\r\n","import React, { useEffect } from 'react';\r\n\r\nimport { useRecoilValue, useSetRecoilState, RecoilState } from 'recoil';\r\nimport { FormControl } from '@tq/ui-components';\r\n\r\nimport { ConsultationFilterMultiSelect, TableCellBadges } from 'components';\r\nimport { ValueLabelResponse } from 'types';\r\n\r\ninterface TeamsTableCellProps {\r\n rowValue: ValueLabelResponse[];\r\n editingState: RecoilState;\r\n teamState: RecoilState;\r\n rowIndex: number;\r\n label: string;\r\n options: ValueLabelResponse[];\r\n}\r\n\r\nexport const TeamsTableCell: React.FC = ({\r\n rowValue,\r\n editingState,\r\n teamState,\r\n rowIndex,\r\n label,\r\n options,\r\n}) => {\r\n const currentEditRowIndex = useRecoilValue(editingState);\r\n const setTeamsState = useSetRecoilState(teamState);\r\n\r\n useEffect(() => {\r\n if (currentEditRowIndex === rowIndex) {\r\n if (rowValue.length) setTeamsState(rowValue);\r\n }\r\n }, [rowValue, currentEditRowIndex, rowIndex, setTeamsState]);\r\n\r\n return currentEditRowIndex === rowIndex ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n};\r\n","import React, { useRef, useState, useEffect } from 'react';\r\nimport { RecoilState, useRecoilValue, useRecoilState, useResetRecoilState } from 'recoil';\r\nimport { SortingRule } from 'react-table';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n DataTableColumns,\r\n DataTable,\r\n TableState,\r\n} from '@tq/ui-components';\r\n\r\nimport { DataTablePagination } from 'components';\r\nimport { PaginationInfo, Team } from 'types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { dataTableStyle } from '../../styles';\r\n\r\nexport type TeamTableProps = {\r\n teams: Team[];\r\n columns: Array>;\r\n pagination: PaginationInfo | undefined;\r\n pageNumberState: RecoilState;\r\n pageSizeState: RecoilState;\r\n sortByColumnState: RecoilState;\r\n sortByDescendingState: RecoilState;\r\n editingState: RecoilState;\r\n};\r\n\r\nexport const TeamTable: React.FC = ({\r\n teams,\r\n columns,\r\n pagination,\r\n pageNumberState,\r\n pageSizeState,\r\n sortByColumnState,\r\n sortByDescendingState,\r\n editingState,\r\n}) => {\r\n const { t } = useTranslation('manage_organisation');\r\n\r\n const tableRef = useRef(null);\r\n const resetEditingState = useResetRecoilState(editingState);\r\n const pageSize = useRecoilValue(pageSizeState);\r\n const pageNumber = useRecoilValue(pageNumberState);\r\n\r\n const [orderByDescending, setOrderBy] = useRecoilState(sortByDescendingState);\r\n const [orderByValue, setOrderByValue] = useRecoilState(sortByColumnState);\r\n const [sortBy, setSortBy] = useState[]>([\r\n {\r\n id: orderByValue,\r\n desc: orderByDescending,\r\n },\r\n ]);\r\n\r\n const handleStateChange = (state: TableState): void => {\r\n resetEditingState();\r\n if (!state.filters.length && !state.sortBy.length) return;\r\n const newOrderBy = state.sortBy?.[0]?.desc;\r\n const newOrderByValue = state.sortBy?.[0]?.id;\r\n if (state.sortBy !== sortBy) {\r\n setSortBy(state.sortBy);\r\n }\r\n if (newOrderByValue) {\r\n setOrderBy(newOrderBy);\r\n setOrderByValue(newOrderByValue);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n resetEditingState();\r\n }, [pageSize, pageNumber, resetEditingState]);\r\n\r\n return (\r\n \r\n \r\n {teams.length === 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { PP2Locale } from '@tq/ui-components/dist/pp2/utils';\r\n\r\nexport const getTheme = (locale: string): PP2Locale => {\r\n switch (locale) {\r\n default:\r\n case 'default':\r\n return 'default';\r\n case 'england':\r\n case 'wales':\r\n case 'northern-ireland':\r\n case 'tq':\r\n return locale;\r\n }\r\n};\r\n","import { PP2ThemeProvider, useThemedValueSwitch } from '@tq/ui-components';\r\nimport React from 'react';\r\n\r\nimport { NiGlobalStyle, TqGlobalStyle } from 'styles';\r\nimport { getTheme } from './getTheme';\r\nimport { theme } from '../../tools';\r\n\r\nconst ApplyGlobalStyle = () => {\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n return isTQ ? : ;\r\n};\r\n\r\nexport const ThemeProvider: React.FC = ({ children }) => {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { ButtonProps, Button, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport interface ToggleButtonProps extends ButtonProps {\r\n active?: boolean;\r\n value: string | number;\r\n}\r\nexport const ToggleButton: React.FC = ({\r\n children,\r\n active,\r\n ...buttonProps\r\n}) => {\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const defaultProps: ButtonProps = {\r\n cursor: 'pointer',\r\n maxWidth: 'auto',\r\n minWidth: 'auto !important',\r\n isFullWidth: true,\r\n };\r\n const activeStyles: ButtonProps = {\r\n bgColor: tvs({ tq: 'blue.100' }, COLOURS.blue[150]),\r\n color: COLOURS.black,\r\n sx: {\r\n ':focus': {\r\n bgColor: tvs({ ni: COLOURS.blue[150] }),\r\n color: COLOURS.black,\r\n outline: 'none',\r\n border: 'none',\r\n },\r\n },\r\n };\r\n const inactiveStyles: ButtonProps = {\r\n bgColor: tvs({ tq: 'grey.100' }, COLOURS.gray[240]),\r\n color: tvs({ tq: 'blue.600' }),\r\n };\r\n\r\n const styles = active ? activeStyles : inactiveStyles;\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { Grid, GridProps } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport { ToggleButtonProps } from '../ToggleButton';\r\n\r\nexport interface ToggleButtonGroupProps extends GridProps {\r\n value: string | number;\r\n children: React.ReactElement[];\r\n}\r\nexport const ToggleButtonGroup: React.FC = ({\r\n children,\r\n value,\r\n ...gridProps\r\n}) => {\r\n const buttons = React.Children.map(children, (child) =>\r\n React.cloneElement(child, { ...child.props, active: child.props.value === value })\r\n );\r\n\r\n return (\r\n \r\n {buttons}\r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUpload } from 'react-icons/fa';\r\nimport { useRecoilState } from 'recoil';\r\nimport { Button, FileUpload } from '@tq/ui-components';\r\nimport { UploadConsulteesSummaryModal } from 'components';\r\nimport { useUploadConsultees } from 'api';\r\nimport { manageConsulteeUploadState } from 'store';\r\n\r\nexport const UploadConsultees: React.FC = () => {\r\n const { t } = useTranslation('manage_consultees');\r\n\r\n const { mutate: uploadConsultees, data: response } = useUploadConsultees();\r\n const [showModal, setShowModal] = useRecoilState(manageConsulteeUploadState);\r\n\r\n const handleChange = (files: File[]) => {\r\n const formData = new FormData();\r\n formData.append('UploadedFile', files[0]);\r\n uploadConsultees(formData);\r\n };\r\n\r\n const handleClose = () => {\r\n setShowModal(false);\r\n };\r\n\r\n useEffect(() => {\r\n if (response) {\r\n setShowModal(true);\r\n }\r\n }, [response, setShowModal]);\r\n\r\n return (\r\n <>\r\n handleChange(file)}\r\n >\r\n \r\n \r\n {showModal && (\r\n <>\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\r\nimport { uploadConsultees } from '../methods';\r\nimport { UploadConsulteesResponse } from '../types';\r\n\r\nexport const useUploadConsultees = (): UseMutationResult<\r\n UploadConsulteesResponse,\r\n unknown,\r\n FormData\r\n> => {\r\n return useMutation(uploadConsultees);\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUserCircle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n AttentionMessage,\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n} from '@tq/ui-components';\r\nimport { UploadConsulteesResponse } from 'api';\r\n\r\ntype UploadConsulteesSummaryModalProps = {\r\n isOpen: boolean;\r\n uploadResponse?: UploadConsulteesResponse;\r\n onClose: () => void;\r\n};\r\n\r\nexport const UploadConsulteesSummaryModal: React.FC = ({\r\n isOpen,\r\n uploadResponse,\r\n onClose,\r\n}) => {\r\n const { t } = useTranslation('uploadconsuteessummary_modal');\r\n\r\n const handleCancel = () => {\r\n onClose();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('assign_header', 'Upload Summary')}\r\n \r\n \r\n \r\n \r\n \r\n {uploadResponse && (\r\n
    \r\n \r\n {uploadResponse.fail !== 0 && (\r\n
    \r\n \r\n
    \r\n {uploadResponse?.details?.map((detail, index) => {\r\n return (\r\n
  • \r\n {`${t('row', 'Row')} # ${detail.row}`} -\r\n {`${t('failure_reason', 'Failure Reason:')}`}\r\n {`${detail.message}`}\r\n
  • \r\n );\r\n })}\r\n
    \r\n
    \r\n )}\r\n
    \r\n )}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useRef, useState, useEffect } from 'react';\r\n\r\nimport { useRecoilState, RecoilState, useResetRecoilState, useRecoilValue } from 'recoil';\r\nimport { SortingRule } from 'react-table';\r\nimport { Box, DataTable, DataTableColumns, TableState } from '@tq/ui-components';\r\n\r\nimport { DataTablePagination } from 'components';\r\n\r\nimport {\r\n manageConsulteeSortByDescendingFilterState,\r\n manageConsulteeSortByColumnFilterState,\r\n} from 'store';\r\nimport { dataTableStyle } from '../../styles';\r\nimport { Consultee, PaginationInfo } from 'types';\r\n\r\ninterface UserTableProps {\r\n paginationInfo?: PaginationInfo;\r\n users?: Consultee[];\r\n columns: DataTableColumns[];\r\n pageNumberState: RecoilState;\r\n pageSizeState: RecoilState;\r\n editingState: RecoilState;\r\n}\r\n\r\nexport const UserTable: React.FC = ({\r\n paginationInfo,\r\n users,\r\n columns,\r\n pageNumberState,\r\n pageSizeState,\r\n editingState,\r\n}) => {\r\n const tableRef = useRef(null);\r\n const [orderByDescending, setOrderBy] = useRecoilState(\r\n manageConsulteeSortByDescendingFilterState\r\n );\r\n const [orderByValue, setOrderByValue] = useRecoilState(\r\n manageConsulteeSortByColumnFilterState\r\n );\r\n const resetEditingState = useResetRecoilState(editingState);\r\n const pageSize = useRecoilValue(pageSizeState);\r\n const pageNumber = useRecoilValue(pageNumberState);\r\n\r\n const [sortBy, setSortBy] = useState[]>([\r\n {\r\n id: orderByValue,\r\n desc: orderByDescending,\r\n },\r\n ]);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n resetEditingState();\r\n if (!state.sortBy.length) return;\r\n const newOrderBy = state.sortBy?.[0]?.desc;\r\n const newOrderByValue = state.sortBy?.[0]?.id;\r\n if (state.sortBy !== sortBy) {\r\n setSortBy(state.sortBy);\r\n }\r\n if (newOrderByValue) {\r\n setOrderBy(newOrderBy);\r\n setOrderByValue(newOrderByValue);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n resetEditingState();\r\n }, [pageSize, pageNumber, resetEditingState]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/tq-powered-by-logo.a326e6cb.svg\";","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Container,\r\n Link,\r\n Flex,\r\n Image,\r\n Typography,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport { CUSTOM_TQ_COLOURS } from 'styles';\r\nimport TQPoweredByLogo from 'assets/tq-powered-by-logo.svg';\r\n\r\nexport const Copyright: React.FC = () => {\r\n const { t } = useTranslation('footer');\r\n\r\n const { isTQ, tvs } = useThemedValueSwitch();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {isTQ ? (\r\n 'The Consultee Exchange Centre is developed and powered by TerraQuest. All content © 2023 Consultee Exchange Centre'\r\n ) : (\r\n <>\r\n {t(\r\n 'copyright',\r\n 'The Consultee Hub is developed and powered by TerraQuest. All content ©'\r\n )}{' '}\r\n {`${new Date().getFullYear()} Consultee Hub`}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Container,\r\n Grid,\r\n Link,\r\n Divider,\r\n Image,\r\n Typography,\r\n Flex,\r\n VStack,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\nimport { transparentize } from '@tq/ui-components/dist/theme-tools';\r\nimport { FaLinkedinIn, FaFacebookF, FaTwitter } from 'react-icons/fa';\r\n\r\nimport tqLogo from 'assets/tq-logo.svg';\r\nimport { Copyright } from './Copyright';\r\nimport { CUSTOM_TQ_COLOURS } from 'styles';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nexport const TqAppFooter: React.FC = () => {\r\n const { t } = useTranslation('footer');\r\n const isMobile = useIsMobile();\r\n\r\n const footerMenu = [\r\n t('development_management_practice_notes', 'Development management practice notes'),\r\n t('accessibility_statement', 'Accessibility statement'),\r\n t('cookie_notice', 'Cookie notice'),\r\n t('terms_and_conditions', 'Website terms and conditions'),\r\n t('help', 'Help'),\r\n t('contact_us', 'Contact us'),\r\n ];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <>\r\n \r\n {t('useful_links', 'Useful links')}\r\n \r\n \r\n {footerMenu.map((subMenu, id) => {\r\n return (\r\n \r\n \r\n {subMenu}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n );\r\n};\r\n","export default __webpack_public_path__ + \"static/media/white_logo.baab5df7.svg\";","import { AuthoritiesLogos } from './authoritiesLogos';\r\n\r\nexport default [\r\n {\r\n altText: 'Antrim Logo',\r\n logo: AuthoritiesLogos.antrim,\r\n href: 'https://antrimandnewtownabbey.gov.uk/',\r\n width: { base: '7.75rem', md: '10.25rem', lg: '11.25rem' },\r\n height: { base: '2.25rem', md: '3rem', lg: '3.5rem' },\r\n },\r\n {\r\n altText: 'Ards Logo',\r\n logo: AuthoritiesLogos.ards,\r\n href: 'https://www.ardsandnorthdown.gov.uk/',\r\n width: { base: '4rem', md: '4rem', lg: '4.5rem' },\r\n height: { base: '2.75rem', md: '3rem', lg: '3.5rem' },\r\n },\r\n {\r\n altText: 'Armagh Logo',\r\n logo: AuthoritiesLogos.armagh,\r\n href: 'https://www.armaghbanbridgecraigavon.gov.uk/',\r\n width: { base: '6.75rem', md: '7rem', lg: '8rem' },\r\n height: { base: '2.75rem', md: '3rem', lg: '3.5rem' },\r\n },\r\n {\r\n altText: 'Belfast',\r\n logo: AuthoritiesLogos.belfast,\r\n href: 'https://www.belfastcity.gov.uk/',\r\n width: { base: '8.5rem', md: '10.5rem' },\r\n height: { base: '2.75rem', md: '3.5rem' },\r\n },\r\n {\r\n altText: 'Causeway Logo',\r\n logo: AuthoritiesLogos.causeway,\r\n href: 'https://www.causewaycoastandglens.gov.uk/',\r\n width: { base: '9rem', md: '11rem', lg: '10.5rem' },\r\n height: { base: '2.75rem', md: '3.5rem', lg: '3.5rem' },\r\n },\r\n {\r\n altText: 'Derry Logo',\r\n logo: AuthoritiesLogos.derry,\r\n href: 'https://www.derrystrabane.com/',\r\n width: { base: '6.25rem', md: '7.25rem', lg: '6.75rem' },\r\n height: { base: '2.75rem', md: '3.5rem', lg: '3.25rem' },\r\n },\r\n {\r\n altText: 'Fermanagh Logo',\r\n logo: AuthoritiesLogos.fermanagh,\r\n href: 'https://www.fermanaghomagh.com/',\r\n width: { base: '9rem', md: '11rem', lg: '11.25rem' },\r\n height: { base: '2.5rem', md: '3.25rem' },\r\n },\r\n {\r\n altText: 'LCCC Logo',\r\n logo: AuthoritiesLogos.lccc,\r\n href: 'https://www.lisburncastlereagh.gov.uk/',\r\n width: { base: '3rem', md: '3.75rem', lg: '3.75rem' },\r\n height: { base: '2.5rem', md: '3.5rem', lg: '3.25rem' },\r\n },\r\n {\r\n altText: 'Mid East Antrim Logo',\r\n logo: AuthoritiesLogos.midEastAntrim,\r\n href: 'https://www.midandeastantrim.gov.uk/',\r\n width: { base: '6.5rem', lg: '8.75rem' },\r\n height: { base: '2.5rem', md: '3.25rem' },\r\n },\r\n {\r\n altText: 'Newry Logo',\r\n logo: AuthoritiesLogos.newry,\r\n href: 'https://www.newrymournedown.org/',\r\n width: { base: '6.75rem', md: '7.25rem', lg: '7rem' },\r\n height: { base: '3rem', md: '3.25rem' },\r\n },\r\n {\r\n altText: 'DFI Logo',\r\n logo: AuthoritiesLogos.dfi,\r\n href: 'https://www.infrastructure-ni.gov.uk/',\r\n width: { base: '8.75rem', md: '11.75rem', lg: '11.25rem' },\r\n height: { base: '2rem', md: '3rem', lg: '3.25rem' },\r\n },\r\n];\r\n","export const AuthoritiesLogos = {\r\n antrim:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALYAAAA2CAYAAABqQGPcAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkYmE0MmVkZi0wZTZmLTQ5ZGItOWNiYi04NzU0YjkwYmE3NGUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkI5NjVBRkFCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkI5NjVBRjlCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpkYmE0MmVkZi0wZTZmLTQ5ZGItOWNiYi04NzU0YjkwYmE3NGUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZGJhNDJlZGYtMGU2Zi00OWRiLTljYmItODc1NGI5MGJhNzRl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',\r\n ards: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAAA3CAYAAABAW2dtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkRDMjQ0QzZCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkRDMjQ0QzdCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyQjk2NUFGRkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyQjk2NUIwMEI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmlgSKcAAA1uSURBVHja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',\r\n armagh:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH4AAAA2CAYAAAABKC2JAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkRDMjQ0Q0FCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkRDMjQ0Q0JCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2REMyNDRDOEI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2REMyNDRDOUI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuZbj6sAABgeSURBVHja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',\r\n causeway:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKgAAAA3CAYAAACYewEiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkI5NjVBRkRCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkI5NjVBRkVCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyQjk2NUFGQkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyQjk2NUFGQ0I5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pg399UUAABdBSURBVHja7F0JfFXF1T/Z94SwI8gSQFlEdlncAPETpVQoiyLUWkWqVlvEUlG0KEqt36fVWisKoliFYnGhtUIRyiaIFWRHE5aQkEBIAiEhGwSS981J/uM7Gea+9xISfYGc3+/87nv33Tt37sx/zvmfM3PvCxjZexSdhwQoDVMaojRCaaTScOyLxL5wfI7C/ihoqNJosV8fw8c3VNpUaYzSdKWblP5D6T+rUrnYiFjalb6LtqVspXqpmxLs43E/Vnqj0q4AUiQApkEZBg2thTp2ht6tdLXSHykt9nkEBQTU9/IFDNAxSp9T2sFP6jtE6Q6lvZQWeDs4MCCQzpaere/lOiyBHn77mdIlfgROLR2VLvB6lKuCgBSfLqrv5QsQoN18AsEPJ6OVXubpgKCgICpS4Mw8ebS+ly9AgP5fHaj7m55+DAsJp2P5x+hkcX5VAr7Aekj4P0BbKb2pDtT9WgRPVgkJCqacohxfynlQ6Xqlx5XmKd2s9OF6aPgvQCfXofo/bTeFAeRyuSivMNfb+Z8o/TPAHk8Vaa8+Sv9YDw3/jeLH1KH6j1XaX+mXlQAaEEBny85ScYnHbNRUqkhZEUA6RynzgfZUkS5jlx8OPs7XaKz0iNIPlB7DeU1QRqHSD5WWKm2u9BZkGfQ+NgS3Ke2ptAgD42vDa41HeWzN/4X9A6kitfdvpWnYdwsG00J8j0DZ+bgeX/8qDDQOFTk1t05cq5/Slkq3K03GvmFKW+DaB/ypgwOMRD1HyHv9DIQudE4uOuEsOjwajbpN6UilJdKCRoVH0brEtZR2PM1KUeHOwwCGEQ7X/r3Sx4x9XIeJVDFpwAPk79gfp/Sk0klK5wkDwJMOmwB8k/Oy/Bx8WnozXac34NGeVzodx5TiGL53jgD7Kv0Kg6YJBkaUca1lSkehjXZi0P0F9IbEOZxSfNyfLag/WE8ewVugDL6NSk95OD5eglNb0DJXGZ0qcTytK8DJ8pqHspmPPqv0MwDzfgBmDgCqSW4JBhKJuuYBTPcBnCuUzqCKtF1zHNNJ6Vv4/EtYtAWwygOULsL1BuAYmbkYrnS+0gR8X44t05ODVJEvZhC/B6s7Flb3OI6T+bcjME4FfmaczgHoL36gehxCYy92sOCXKG2mtAE0HxY1Q+nhc0yu4p/BgcEUH92QsvOzbddrKj6neajXx1AeBFeKzo0XloeEVWMpM7bBwmqnG67919j+VwyUNwHkX4p44Bpsu1gAOhTfP8P2d9h2g5VOQ5tdbtRV1rnUqLNfAnSw0jbf8/X/AXf4qdjXG43eF1F6G4vLMl3uPliI5ApO4KIzpWeoQ7OOtDcjyXaOtLiRHsr+EYBzqbG/0AgyXcKCmkEou9I7lA6CS96t9A+wZu2FRS813Pw1sHK8kKAXKM3/wJVnIbALBf/Ug4lAOcZa6nKmrgdJt32P112rdJbSNfjOILwLdehcxbJi0IHPAggVfla59yYxjal5gxZ0NDfDPGefMTC/spTLgFiqNAju/C0EM6+KdgsSfPKs4eKDEWRlwX0+qnQc6voeeGmyGDActMTCM7Bl/ha/LcQ5j4L7Mh9NUfpXpb/C/a/AoPkFwFkEK7xL6VMAe5kxqE5ZLKhfp5lGfg/XO4lGHgxw9sHIT0FDdj6PssdLD+CCQWvbuK3t2DTwW0IQ1MsIoKLA3zQAb4W1/9hot1JxzinxWYNWWurn4R1W4/to8GsCl2WL2F3p9XDfv8Fv+pjpqBeD8T+GO38R26GCJryM4zKFlSdyL+hp6CWb41cWdCg4Xm0K88t7MLqZ2L9EFaukalL+JAdaQXEBJTRtT7vTd1HBqQIboBMRfX+NoKIIIOK0zk+MujPXfcAoY7cA7HJwSc0bt8OqTsF9bgJodcDzuTi/AyzmJxgUCSgnG9a9ABadUOeTwnuUijRSIrYTcAynqYaIdBQJzj4Z9e4i+Gmgv1rQqbV8nd8CEEUY9ftrAZza0rXQXzgXGqgwcV2n623L7pLAMbfge3eAJxRcsRQutAzUYyqCMoIrDgP/vR28kHOJM3H97Ugf6YBqMNI3jwEoryF3W4B2SEZEPw3XGSl4twvWm0AXNDj3CO5ZIgYoX7uR0icAzm2GMfodrheONNMQlOuXrp7zoFFIiQTVQvllyOctQ47uIxGRejvvKFxfAKLuJj5e8x3w2e8i+iaxTWhb6jb6+uAWp3M6gB6cAT+VpLU1OGQWOF1XWLPNgtdFIWqOFoGQlDbQEFi5w5Y69ITb5UGcijq4RCDXGv2k69YYeshIGbFcjYGwCt/7oUy5cuYm9PkygLgHAPsXfwPoBJD22pAecJ3cGB8IN+XECxfBWmyy/N4a/PVJjH5PcpkMhHhdaFxkA1rz7WpKyT5I9VJJ5ORMexG4+Y2LH1FLZV8NcI4Bp3MCJ3OvuwHA6QBnQwQN46A9YSl4ZqcluWdvnGSW/FJaVkrFJUXUv0N/ahDZ4GIH5HDQC56leleAc56/gVMD9NpaKJcDjC/A3ZZ4ARKT9LfhrmYhoueEOM8Lvw/dCnc/E9vbRARrE+aFzb9zE4p/FimARoVGUddWV1zsAA2Ay58Mj8Qyn/x0kVCw7MgakidA3Hsg+rVJCYKKNSItco+XcuORihqOrMMz4HRPOhz/Cqzvd26eLWn+qfyLHaD/AmduBQOVAW7rlxJI7oRwTQi79NmIcj93OOYowLsGUfQhH8AppS8i2Gawom85HDe2khWlihVOmbn1K+wRVO1FwJbnzxVlC7oaken5ikukjpY6cE4+pj8iyrvg2k05iVQJN+KlDnVrhSi6NcA9kionnrXw1CDPuFB4aDjlFOZQVn6WeUxj8PCOcH/JoBdJ30P7N4fmYKB6khik6hLQPoureK0bkErjvG82wLkOmYspMBYrqWJCwa8AymmZh2qgrBloZF6NPtgDQU9FUDTf8ju7cHMRMltKnsacZOxn8M4Fd+KBscFSXludaooIjaAdh3aUfxZyJ1VMXcYY52VT5QUltSU8W/QIjMQNHo5rDFC2FPt4ocn1ZKzkskgbZEa6Owzglciy3IC0k98BlGdROHF+Pk9vcsKZ1xJykttpNTpPx/FsyxALOEsB6s8BFraujVA3nl25lypW65jR+70AKU8H8ozLVbYLhwaHUm5hLu3PlFPw5dOb7+BzBiwtW+/LcT8B5M5DNoLlSfbAj5sBLE7HJKB99pE7IR6LbRTu20X2JW//C3AuAYXiRP9AWL2PPPQL12kLAK55eRKuy6uzToj7ZzliKUPPMiVZLLom9EHwZulkX5TSEfe2vzoAJQQafzsPgOopQKeH7fLJPbdsezvIEIBzDFyXnDTgxOVP0Tm3IaqXwnPO16ATPzB+K096svVMOppEJWcrGRsNTs6/XkHuGRopTZDamiQ6ki3Mn4SLXoY0mBamB4+Se5U/p9teAnfWNOdm8OeB2NdPXN+Wi+yE7QbwfA2M01765WmAkycUeN3Dtir06XW4zx74zv3DSwB5sqI3Yoj1oFpPibZkr7QW33W2pYuob4LDQHAMkgigyKomOHORT+OG+JXDMfdi+zydu3TuXdzoLQChOaPVDh3TDRbUbGQ9a/IhnTtV9+/y4R0YRDkFOabr1/mm2Q7gDIRVngRQcTDZAgNitgBwTwQcK5Eiuw4pNgIv3gBwsjfYhE5qAeulA5RigDLZwQK9QBXz+o+BDtwEYHzqpW9uFd7LF3Dq+eBu4Kc9sN2BdKQedKdgQYcDnPmCdunFMJcAV13QHnrFWFxVo3gtb1cToPrZmGkeAPw+Ouu3xm/cGQ8a5TjJC9jaZr1uwXaF2MfRfTanl06fPa0AelweLx+/cJr/HAkgnwAQuaHvw2+Pw63vRqdeDj7XC2ALQEfEiw69ChaTB9MCuOeX8fs61Kk92RdQfwTu3hxU6J8oLxjWahO5F4NI966zGCt97MtS4VG1BR4EoPKjIpEAr56OY8s8AJThegHySMGXD8CIsJcIr2rwKQE6p5oA1W7dKVX0IbYPO+Tk2HrxdKu3KZ5u2O6x/DYM202iUcqtdlhIWDn/5AjeQm2InBfy6gfqGAAa3QsEL22Hz2MAABei8VAxCFIxQMNBD17EeSS4G5H3dRCLjUF1KTxRKYDRn9zrUbWEW4AnB/u3wmDoeyoUlIPlMrjox0X/dBGB2VlhVbeL8hmc34h2SIKlbU5VXLUvAZpq4Xfe5GucdzUCCZsswvZ2y2/a4j1o7J+GyFxyLN14tvRVd2E1SlGf8oYICw6jfZl7zeg90whebKJX0ecYLlAXdAzpKaYlQ9Hhq8WxTdGBPQFg/j4Vblwv5QvxoY3HgstxZqEzAp2e6PS5Iq13xpKJOGUEOiQA2ElwZ5cxWPVTBuNhRWcjCNLHyIXaMSLTIAFaiMHzJYA+E4O0d3UBKt2or7IM26kegqPVGM22LMEOYY2kLEf0LlfpLBWc85xAXRD5QRqA/PKGvOI8SslOMY/fIzrPiZocEBGoljCq/JiH5tz3wbLcAIsp+VwK3D+74Gew7yUDEJ4exxgkvEMi0kuPAASTcO4Eh2R8oqAktns7buwPE7lollnkfoI2DP34GXlfWB4iAsYBAO8iUWa1AbqliqmA5R5AQ6KBBjn8fkSkaaTohP/dsD6LBJDusJSjl6/9XeZDQ5X15Nff8PNJFu6rKcdADKIHcT3mhRNhqXQ0Ow6d8pqwqkdErpStbSuRHtMWNhrWLwHXTDM6MEB4gKuhjR3acDBoyxUGTw3B/jYOqT1C3TjqHo1B1MmBWugAVgdfo4SVjUdwV2Dhu6Zk4vhRCJaOi1RWlRZF25b6vyI6x5toct7MQ0VJpFNMcRkdJRP262E1lxqBnO1a66yjT0XvPL3pIK+jXj9F5w82LOwV4M+jLdTnAVCJxcgnzoBKOQb3Z5vx0UHIKpzXUgys8cY5vE7hfgyQuUY5u1HPlzGITEPBASXPxE2HkTANRaxwyZLWPInAsxtVfgpV91WJGByBhhcjMXhtOdrfny9AX4cr8pYO0Navr4djNG90GnHNyf1ShiaGy96AjloDgj5RBEpSTjhlIJh3chTvQe4EAIYjT1gKi60X+o6B+56M+m3GRIQG03Oov47u/wCLMQydmIX873BYxn0IRleJAGwoym8JXrnRqGMx7vvX4KOROOYteLwRcJtOL9x4DFTsDnDPCPQdX1s/Y/U3WHido86DlZ0Eb8YZmEOC0mUghVcgqFIW9oVADyLAupncC7znkfEWGK95L4dXgL9I3h8D2QQLxNbEaRX2Uph52xs6NHd7Aw0+sBoZhEwk6ffbwNkgKp4On0inVbtXUr3UTXEyL76knLIEv3GSppYUhC1/+WI16l4Il2YFZ0hwSLn1TD+eVt/LFyBA94MDepI8g8fYpJORTrLlGhuBq+yrQr2LwP0OWMEZFELxkfH0xb4NlJiRWN/LFyBAWR71cu5ph0hQCnOXqwDmww7Xf1tYU1/WJuaDDiTbwBmswBkdEUMbFTiTMpIu1H4LECmhixagX5LnNYo6VeLtUVX9vqf5Dr+PQOS63yFqlFKKvNoOa68FBFB0eDRtTv6Kvjn8jbd7D0MqpCX5/sSov8hTCM7iqnl+W7R1rB/d0yWglvq9BpzY3+stJ/Wyh98aCIvmScZjO5ucE9Kc57wHjd4Hrv9T8NxSnMfmsDfZpzrL3yQSGxFHB7OTaU/6bl8ahOf+06FZSHnVlRfXtsagCq/ieePQXxxh74TH+tJP7qkDgmb9nBTPfnX0BtBXyTlxr63OYS9lRCD9UoJ0i5O8CaA2AjgZpJzzjEGHdHKynOWuoDyd5Cp/i4iP0gcpG+40PSHAyfvpdQCg+SKL4atwmup9gJJnom5HemoL1c47EaoqHPNwelG/AjTXm4snWC5eq5lh+U1PT+7w4eLMZ/sBBE94sbYMeF6Cxwn0vrDUHh8kYuvJrj39RLq5rM6TlMFqLgEP5ulInuKbYhzHMy+cLlsL1yo7k1NsnCfkfC7nj38uRv98NPrrcKlahqEcaf0SsK+LkQGZjety3pRnutqLurPwsjtO8fFExXPk/ABkLLxhGrIufwRYZ6JcXV43ci9/fIUqT4qMQB1DjEH+FLnn43lKlefdefaMZxl5Jf9oS31uxPVXo176OreTkev2ZdqJb6ozVZ7R0ZyB5b8+AmIVQM2NPoGcF9uGwczzCndeQ9jfe8QQUB657zu673xHcayRTXgS9e6LTpgJ16inBKegEzLAtXnaimd2EjHAIrCfXaqeMpyMciR/7IV9g8X3THR4NLwKv6Zcr5XQc+icGL8VwGTLv9UheJoiBpR9jFdwv50oj+v9EOqtB8VDqGOkkYWZSe7p3dmgYu8BM5yk50XkPxPn8OD4DJ6rOajdjQA+9/n9VQWoTimNQuPz80FHRABUQt4f+CI09C50NrtynlmZ6+Ucjuw/9m49Yyj1WCqlHT9UFTBmIxp+AVYoGY17rQgkZsHqtwT/vRRWTr/iW6e5JqIt34VHOQF31Zfc07j6BbPJluBSu+wU4e70gOkjwB1tbIfCIl4O8LVwoFF6Nma5Q1sEoZ0zcM2+5P7/1fUi9SitN8sx4Wm1bIT1b4s2YKwswG89QaPeQ7t0wcD/kNzTrJnVAaiWPbAqHXAhff5SH8+PglXk0V4AgPPNTAPvTIEVKgYXWe6L9QxV1jMxo8pPT2tQPILObQdLoDmQfiucnDtOByjHCwDpgMuFARxI564Km4cBGeSFN/L9X4l2ussSgGqvo63YfwwPRQad0NLIS8ZFDwD5yA73w2LhKX3lTivJ/ayT/q5FW9L7jXOKnXhwdV+3VwzuMEfcWFX+c5D5Eq8jvQOW7AW4i3YIiNqRe6GzR+sZFRZFGXkZdDjncFXvoTV994eJ5doA11wCHnXGsGpavrWAXIteUZRq7N8meKWn/8Zhb6QXfKzwkm4jqrzyKVIAy2kwOvV3S0HnpMj5/VM+tmtDC9fXop9vKnCICWoMoKakg+jf5yWPaQJkIUYbu5cZIOIZvkan/GrF4KBg2p66rSbuIY/ciz5+ItxXlIWqSNdoAozo3H99jhYdE2EcS2JwhzoAzO0wnCXIQ0dvEwGfUzBMdO4C6lDL5zOW+/X0AtzgaoC8xgGqucMb4EzDEBn7UqEGIOjMbbv7ejG2npFsPXMzyrUaYnMp2gIWik41l7D1E0GK+X77XQ5AGCks2SUWKxIhwLVRBCA11V86v+u05kEnjs33GQwVn+MsIAs1Bpg3WSuif1NCvKG7JmUF9EnkGMeR+ylKmxQhul3o6wWYe/L/cSZnVft/p7RrvxnbjoJvrkBq6yQG3Q4MwHsApgfE4JJyFACbALrA3oQXPPPUrH6sWz83tRhegzv5HRF0leBa80B/Csn9vNcRA9CBlr60RfFbQV3G4vNrqGsCePSzyMbwwmdeF/EN0m59yP2fqPqpzDkAfAS5V8dni+uGW/Lguq5zQe/WIz23F3TuILmnuSuVU9vvJmdi+Az0OoD1JnI/PHUQHfmSt1ynKfyse3pOGh3I3F/duiWicZaJfRmIgveKdA+ncuRsy29EVGp7q8e1uCe5WJej+zvxmdNSTyM9M1a4zRGivL4YJEtFVF9osVilRgBV4sGajQMQZ4gshB4wz8JTfGoEpq+S+60zC+HhpgkqlCuCyRgjkDPdegQCrRsxWFcCA4EoY43RpuVbp/WgtSkhcHNl5Pk/ijxKXGQcbU3dSrsO7axuEQ1hAaPQSFlkn5BgGYAO2EXnvn05nOyLhbsiBZRC9kdtG+MY5pybHcB+GTo8VUTVE1HvOKT3XIKyNIbV9/QfkPHwFsEo14wuu8OA7Cf73yK2EEHkFwb9SEBMIZ91agIrfdDgx1eiTdNRD33+cZTB9xL3QwC0RiQ2IpZ2pu2sqQDJ32UirDBz29V0EUlwXa685Y8RLhT5MaxLNgIVdqufXGzgrPMAvYCFZ60ehvtmnslTiE9cjA3x/wIMAEQ9FgK3yd42AAAAAElFTkSuQmCC',\r\n derry:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGwAAAAyCAYAAAC54j5KAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjI2QjRGRDdCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjI2QjRGRDhCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMjZCNEZENUI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjZCNEZENkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmLYX30AABifSURBVHja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',\r\n fermanagh:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALMAAAA0CAYAAADBoQmTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjI2QjRGREJCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjI2QjRGRENCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMjZCNEZEOUI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjZCNEZEQUI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjTdznkAABhgSURBVHja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',\r\n lccc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAA2CAYAAACWeYpTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTk5RkU5MTBCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTk5RkU5MTFCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFOTlGRTkwRUI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFOTlGRTkwRkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqcPWawAAA+7SURBVHja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',\r\n midEastAntrim:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI4AAAA1CAYAAACX8NO+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTk5RkU5MTRCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RTk5RkU5MTVCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFOTlGRTkxMkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFOTlGRTkxM0I5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgKXnFkAACHQSURBVHja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',\r\n newry:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHEAAAA2CAYAAADwI3YEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RTk5RkU5MThCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDEyREE3MTRCOTdEMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFOTlGRTkxNkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFOTlGRTkxN0I5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PueiVlQAABwtSURBVHja7FwHnBXV1T8zr27vsPQmCKIUQbAGUWJBgmLERD9LLJhEEw0hRvOZGBXxsxEVY5RYQA2KBIMiWECjiERRKSIIsjSpC7vL9n1tynfOm//w7j73bRNjPn7f5XeY9+bNvXPn1P85985qty35HrWz/YbpSqYipj1MB5jW43Mp0y6mtUz1KUfQiTxBiw4sLqDIlgAFs8Nk8UmNbP6nxS8prC6j10eeT2tGjCXiz0ntFKYMpiUtzPV3TK8wbUw6X8B0EtMifO/LdC7TjCbG6M10DNObTEY7eXYe03vN8qQdzdvOfk8zXa1874jjOUnXVTJ9zhRlOsj0V6Z32nIj3bbI9PA0hWybSNPcn37EdANTmOlLpn447mcaDUZxB1rNdDTTU7heFOsypo+Y/EwnM32Ka0YxnQkhioKUQDmHMf2RKZ3JZPqKqQ7KegkURMYagueUPjOZ7sB5aSuZTmTay5TmqDB98F0J8akkATbX8phcU5eHKmvqIjOkk22xdBwTbNQivgB1K91B66Ihni1P1zTdn6Yw/YrpX2DwCUzrmDoxFTNVw7LuYrqP6REw9TqmPky/YHoUHuNcnP8z0xamnzPdgs9jmCZDGaT/j5meh2L+HJYsAv+C6YdMOyHkIRBULtNj8AYVTAOZbmKadbiEqLfxern5NW3sIw8cYPoZmCwMHhcnmx/Qw+pdHCI9bHViHZ+qafZRaue69GwauHUddSlhA8rtwLZluT9FITBpv2R6mKmW6VSmvzC9yPQ+UyYsTJg2j+lxWIN4iRxQhGkOSJRhEub6BsYPK/e6Fhb+N4QTGSeIczL+CqZ8pgfw3L2YNsF1d8S1SzDHw9I8p1/eLW4ATZMVj0yIT6cxvdTG8e+FxpuIB4+C2ZczXcp0PVna4Iy+oWVW1LO/fnv6sEBa9DW+GwtSq2LaYes66aZNPUu30Wd9BpGdzbwIsSfT9J3x/s68lsAKSmA9wyEcNl/qwtQf7lXc4Ui4s0p8l5haCCGJezwLwuiKUCDudwPmP5HpQ6YqXCuCGcS0G+48Bowg1u2D2w7i+U3cNwfzEQ9ScziEqN27dEhzP/O/GIvSf3yNnbNKJ7MtY7/KdAE+38l0e5NXsWHpGdY+Pc0+rnRuUYWx3ftgWl5oimXHncTLrEC3hrT0LflVZbS7qCvNH/8zsnzMn/pqEWQhLG0HUwfEIhewRGGZ4s48YFgajhk4Z8CCfM5MDnmnGlhTGoAa4fq+sCofhLwd9zchrBCuq8c1GsZPxzkd1qlhfuHDIsSei55uzlD5rn4a4/vHqf30Tcsr7EL+brVm3DqFkRKPftvs1TykN89cFTngG37gpUIKeGJVutcUjRUvEDHI28PS9P3FFXtpa+c+tOCcayjsZV7EIvT/jTVjhzmCUtMw2maMvuml6KXsHrTBQQq3VnPeggCPalGA0H2j2jMs0Cl6YtbAOjLqPE+6Dp3/D7DiDBOUWpOVS10O7iNvHXszr+9w8qEAypaH792ZboSVfdMmY85nmtrMNRcD+LQT2Gjl1Az1In3Tw9XmcaOXGGev66iXnmyRpzWmuBLHHyrn6pGCdFfiZKLZcZrs72SQ7aG5Kko1bC9nkEEK1obok74nUl0nBpfhdqVaYwBYPgPj3CYA6L8QJwku+Ga46Jban4Fc71TOSfqzCqmHhef+fTNjvATX/a2kGHPj3NWq7aXRC2moZ82aQq1saKWd97FYSAvuVFoP5fvJAAoEyL0GEFtD+CXb1AfrPk73vdaeuBA1V9OsUGa0jsrzi2jlYMYxBhu5ZfXknPFyiP9ZgImTYVVu2iDgYZkyr81Mx+GzAJbx8BiPgIknAbh0gmXsABDqCDAjqcls3NNtbyP/HIp0xkR6It+XI9W5F2mZoPJuQMiSP44FEBPEvxUgbA9An4CpnoizOhSsE2LxX5QY3qwQJQcaEeekVnWMbfWmxbFxdH3g0XVVdu4YTLCl1MW90RcQYDpg+yVg8CogyUb9OGM0EgaqkVczKjONWqooKqJwBofKSFgu+h4s2gPQlA8E+d9M24ASs5AyfIrhduK+eRDoR/isAWF2weebkfRLmjIBQiEwelbSs4rQG/BsQ3GvLPy2TvEzMp97oEQiyIeYFsBtPw5kOxOp2BwljboHXqIvKmLHIve+uKU8sahxHuM5mfRSWm+MovXmICrQyj9g5l7cjBD74fgZjgMxmb9jAoNwfm8jlKXZ1bbNiY2l5zT2tHplhIFMXvVBCtRWuvHwOVjImUCCIoDb0OVWpmx8PitpbkG4Sze/dOP8Lco1v8AxH2MRmH10ilLaZliUa22iEJ/A0gi5sSjmYAhsMgofXzqGEv9tDVIPaU/Ae/WEm34diiJ8m870g9Yk+48mfe8bt2o7k5YaZ5FPi4mLE4HcnaL/KBwX4JgB9zQW8P1DBUA4ghJd9drPmjUcpiP2KGVm8tPeYDRMewu6UCSnwEWlk1DC+yOYUK7cfweOIaQZjQpESe4wpsRs93xD0m8W5txUjtUNFvMgFOp/mJZCKNmKx6vD+A0ozSGIHKqjNmAcQhoi6cs+pf9B9D+opFIphTgSgZka10b140nfTyXGqfSxcZJYo7i6P/Bv7zYxxiAg03Jou+seF+O3atxn8CFbD9q2Vet5vO6LDNIC9vUa+Mn3WM85Y4XGCX9JV1bUIANG00hHHfY1lMu88B4+BW0S4lx6o8TXSbazlOfPgksejN/da0jJ6XQlvie3wXjWmQBCx+JzDixJQ/xzx8yCN3CVuxjHXrgfARUXKPfIVPrn4nq9OSE+m2Ky58cVxU6jD4xTyKMZBEaPV4CMyqwXFfRWACaPQ13xaKwGaG7E8OYYN9ZuzDAjuwPdvenGMCe9cOJp/D78JeoLqCW397CS8hQsRQDHtMRc6XR8nqwI7Qy4+ixUel7B+WpUkaRdhdKau1LzBwUjaIijD+JcOgCUuN3OQOVhKNN4xLEfIu5nIR7m4PrTUP89H7EugBrsZVCMzsqCwoXoPwjeqwAlPzB7YSNDGo9KS1NtuRPPgtzJpF8Hp1Kxtpcq7XwR5u1JENttixBTNigPfSXQYNxqbEsjX0HsudhB35X75nQknxF725ceO1NiIyzxPsart+bXltPavsPpjTOvdKo1cf8bf+ASrFz0hRvNgIuqAppLQwrglsS6wC2Vot+xYM47sKRaWEoQymKDwTFY1GoI4AN4gGMV8BbAM7orHzHEvlw8r4sRhirLd/0gsM/wDPvxDEFghlIoQQwGkIsyYRm+f02Im1IEbwWwWCVkdacR/nl0lf8p2sWfWYgD8BCp2ia41J6HEmhEH2+B8RcrpN9QOrcjWfu136Xlhe5hYAMNsyVHPJ2FuMxnxcgfjdAzY6+jmo48TKj2uyiOZH/DeqcHQOZDBUDaSfH8G61iTGhBgHAv3IVj48ex8+KxsUg7INZS1UK//tDYTBcmaH673FdkXBXd7b+hbE4hmfu0K4O54UMChBVWMy0TJxbktKI+PYvMNB7CMuk7as0J8A6s2KyAtU5V1hLd9qUSZgiueHsriwqtEuIDrbj+OsevMzq0s2mlOZICWhyhn96qu0lo89imt8h40JNu9aj5MGt22YsFZJVr96cVhGeTrTUKqizAjZx2kM+Kcvph0aJTLqT6QgaD4ToX/p8BUstj3RGHjobyiIsaAHc2EN/d4NoLiLl30kxlBf/7WBN02/FItPsoa6Rq2wf3bsDV/h4xUsf9uyLH/K0itB3ICyswr6MBdEa3peTnVVKCPq3sw5qmX05a2cISc5C9m91pjlZ1SbWd6wKdpoXntU1PtjXLimh3N3yR/lXoszQKb/WP8GSY93mzjdMlNn69m7aAc0TyxQwqz+5A+4qYD6EaWb1wg/1jiBUNyBmPBQO3Iu48Aqb8CMBgKjxONvLHRxE/+ypWIxN5Ev2DSMqnYLkrE5bTH7nbD5SCxkzkd5LHLYRVfgyFugfgbyjimAhcVvlnIG7PQZHiJ8APA1F1Og6gq1WWOKkN1psVR3Va3Y6Y3XnKq7EJlKaFXki5usEC9OSYs/UMq1fDF8FJ5fPzvzr4Sm6f6A7vc4H8yEpvsGkBQogL5X/D46EsFl5WLadI+qEi01OwqBMRWwpRg9wAqxGf+08lia9TivEWPE8XCOK4pCruKUCRc4BKCQXygLKuOLaJNIAwJiHZd9OUp5UCx6tISdxMwLVKd6nu1wA73fAcrXKn2YC5bfXEjGjKHtxgjClaaw6bW6Qf2OpubnJQZ9z6KnwdY+fGSn1Xlc8v2FW5MLezucfzp0BOZIsvN3Z5fKXC1lKsTmmC3LaIdWew+9xb2JVCeWxssUMLKSOwOjAdAqtDjbI7UgAPBFqPlXtS1gbzYZEVqLQk54A/RXVppIIoyyDgbQqIUydvKEqgtjKgTHfi21GEUOdDQKFuGa8kxVgphTi2/UsuEhv9s96LfY8DTuxK3b0nH/SAvZuT9qHV72e/WTEvV49u9U7z50RLfDmxyfFidwrhuaiUBfxP0/YYtq2TxiLa0GswGRl5zKqYWzpbiZhyLQQWAXPd1foz4Vb7KzEwI6kCchTKi28pueQkuMVbYDWFivVqSumOlMoLKUKqUICOK5Q+SiGic9ICtFpJoqTVjNRAyrKcPUeFRfGHOfkb4SL9wHnbzBMHrTaHrzhOX7e81C4+TWcQ4s02Rx18N3dX9ZKsAekdGhb6Co2jxG02J7wkUS4SYeqMRCP+IJXlsMeMRd3dbiY0/HilzrmYEntq+qDWmaFUlGoosVFrMqwsF7naLqXktRPHmxDDRNAPo5Dugrhx+PwQKlLSnlFc5KOI0b/Gfb+EEHciRvtQwD5fKTAU4/M5SsrxO7juxsLj8EKdWBfqOM1a9m48T1yPQNrOxoPand/voK8d9dvgtCG1Vs4ayqNXGranTSifl98hmBHeofvtNNtu06Ah09YzBZJq3DG/poJePe0i2jCUAWPlfleQ+Vht2AWL7IpqvwGm3wRr1CDsi+EabdAGLPkYAB7qgvc5ENSrsJwI+gSxStEJMUtc9Tz0uQihqTOuWwhg47ZLUYlZgnx5I64vhosO4hnWAqydAAWY34gzfsZfmew0NrHTeetNos8/iwsx0kQ+0w5Zdjnh4uB9n34/sGTBV+m9ZlTMy3s3tt37RKAg8tNUwCWVKzXJ8xq70vFuuS23tpJKug2gBede48RE0Uahr2tGObR8OspopaiutJD62I5267LFoJX7gt09sDk5zlxqatylmMRRxmt6nm3gK/eXPUW5uc5RXOh8DtfzON0MBA6508Owz0EeKPzcu9GxxwwpWjtBX2uQtV3v5M+NTmqLABVU+tghkMRD1wSzqEfZTsqvL6ODxewpZXuGPFAgmGCSycyvru5OpjmFGTgIOdk9hxjqMtdlSrwPwlB6usMcTmUoj+NuZaUjTNH6WMz5zb1e+stYBQxMff64JVAah7EenHI2sGFmZTkbncOMXaLsoYNpDsqrrk70FRKlsezEFkxXKdx5yr1ECToWO+N8zBBg2zbnHmtW8/0LnXlbVtwSV7UWyrboVv09JvcLL334ooVzqCqUN48j0kSy2yzAGsP25sl+yTjA4f4Bj0ZBM0qzwgVU4WUPFOO0MIc1Mz/fYZgwLo0faMgQh2nCsAYGqxmZjusRQUQjzrUiwOoqh4nCBIOZFeLx3l7KDo5d1BlnEA1n4OtnLT/IGCWXhVqH+r4IK4gtpnLtambdB8udMa9mPHQUh88V/L2+3pnD/lIndp3A4bdnT6ev3E8ULhRy+smc4uskHue8q5RxBeVrSzYTLedQ/8nKhGLl5TuKZVmHUNrvkbh+Y2OkzNjwPbu7ULgyWOApMCeyS2zTEECli7W4AK1DylkQ0GlxqYcqNpY4+COuxZbzUK4bFKs4jg2wmMPVcA4n3bs7mrvkTUcIVSy4jAyHdjDKT89whC8ML2O8s3e3w+DZjE/WrnXc124Otz16OsKIxhyl6duXU3X+/sH7jjIUcZoXYQWZ/bTzeesWR2n8Pmdemzj0fcKh8SjuV1zs/CYCFiGKUOUBRSDiGmUucSFajgKKNa9b5yBysTx5Vtc1WxYlr2LcisXM9jdNNygrv9+o91/aPmL9CqrLynpWJ+sKm9rmTtkKT+I+H4lAZZoiwJJag/6xjWOhLm4oxXjifqrYDcqGvN7scrt2c4QlghAmxTXXdrRbGCbMEIYKo4WZIlT5LOOIcMS1ynnZCiIKIloqSmNDY8UTyDjCTOkn14kwxfI1LcFs+Sz3qa11hCHVJl1LWJKlulMdSYzmWKVYqcRcVXhNKn9iFeNqLLR62m6FfIP8jn/qvXH5lIlvvNi1Iqew1ueJGSyIKiZvGwS5lYV4aBu/uNEIP+NsFmA0zB8Cmpr+uuuEswHdL47XPHV9D9XXPUkNDY42iwv8JsAiFaBx2kTUWWX/0D9writqqPmIyVX0LTc12XwGE3qlzaP4fA2sibcN/nwNJ10d3imnwhkhO62eUeYdbXGlFul3xfdlaXacArpNFWGDPZkktlpy/WIo1jCXKuWuP7JmnxuPj+J+gsHsdgowtSJrWvLWDHnGlxVe3gyvdm0SaAy2cQ7+FHVuVXbeplb2N6McNR7LKa3QTGZwTt4jnTZvCGftqOlfmtm5X8QMXsoWJftwplEr3+VjAdbHbN9zJvczQGHLS2nsdrxerSlrkhWVStQZRyPxtlFELkDtcj2YeizywmPQ92PkYbJFcR0S9ruQA25E4WARJV7DexBj/TJpDg9RYh+OWzQ5EccbUVy4AKnOAdRh82G5E1GUkPtfjz4rseNhL0LcTBQwPkQlyK3jXoLcOL45K9VGqdewMj1R0fSmWyCjzlNZMe2sdW+Irk13NFXzWrbnTqeg6J2itQBR8fsMj2aywcVkiyKbgkGZHpPK2BKNqN1ULOyNGuNiALN81CXzsXWjFtWV+5Fkd8HKR38I8DJlpWAFmDUMiizF8WVY5tLhrgfiGrUNAjNjuNZ1pwaOUgJcgHTnCpT4RsMqx0OwPZWtFpKzn03OTj4p5uchz/0z5ngHQsgL5Ox1FR4/3dLm4fmgUUier2pkvWKFWXm3H/PpovpOe3cPXpd7/Fhhvs2CrLGyb/frkYd9FJvB329hQXVOFRv5vKQTU/naQ+KW6ly6R6caARhWCtk764HnoEb6OgQwACsDFSh7uVsnHkdVpRBepg8Yuxbf3VfcLsbxHSjAj1B6e1MphrutENfeD+FYUHoPCvEjlfIZQdiiRG+g6C6K5u59deusvSmxTXILlqLmQDHylXTwTNyj1e8nLoOP74W1NWdTrD/d9NSVPXT85k9pn7/LX6UuGq938rOIO6w2c6dKHZWaeR8DFZo/ROxAiImiIIuVtcrwU0m9oLkmLXkvHqoSC7gj4crKwNxKWIDUMNeABsO7TMB101D8VmOOWoD+O6zyx3BtTWGKNLjbPlivfBKltb709S2OPtRoiynxyoBXqZV6klYuapOWukKU2KtbAsssautLpuJW/hRnhqadTmnB0Uev+YQCu8IXHUgvHiE74FxrE9cYtf03cK6Yz7OaY5Fnd7JbRV54gAV+z9cWLX0afXIwRuU1rIC+Jqf5EB5aSmyr4G5yYY2zUVy+HC6sOwTiriLsVGqlK3CchtUOdS43wg0XAvCdm7T26gpPo8Re1/Uoyo+BlX4OpX8Nvz+PGHklzo2GNzkTa5Vd0ZdgMO77jKciPHRH7J4EXHBXe9/ZF5S2TOqY+XsOUkhP25ih110fs3wXsR0eY5FWLAJioEIVZuHLuZ7K0X4tep3eRFGBY+aFSlx01FvSJAYyG6vd1webdMP7sLLvQvjLUbgQTb8G2n0VmNiAgYTpyxU0Lkx+W6m7PpaUErhrfO6+mNexSvEkvkt+9i/EvtsAYmoQk0Vw+xF/VyJ+jsSY92IrRjoK9YMRJ+dAaVwkuwBz9OFe7sbnkXDv4lXmJu92a0NyoseT3ZFvLaVjtn1OkeygWF7cZbB1ncokgGFog51+fq5e+YM8T+UKnWxGjPZw1w5N0q9gQT//NQtlmWUzIp27M0x7qmOpLPHbbr/EWus5sPAQtlq8SP9hzXs4BnFeDNfd9wljOpnv8rd3xaWKL/dpZp6U4PjbOL5uFH+KcKzcyJ83JwtQiioZjEQ9bI5RM5URtrtlAjxUwz25bSCAQxHi3CrE/5Ph5qqTLPLIE2LTQtVcF1nHZ+rw0uh+BjHzCOCnyQxXdyo1C3eHqazOONxWWIctEWcnnZ+BFMFWkO85Crr9j27/Vj+l/lGHVC2HpbjsQIQ2lUacKk3qJkzfhPThasUFSunwdgAMtR58EVKEfsgn1XYzjlegCvMaYo7bHgUYckHNy8g53brzTxDLZkLwP0XcvBPzuPuIEWJLiyB+tsAo+9PPqsQCtZZcqQ8AQiozTwO2W2D0RCTyt6Ja0wXo9CsAl+SS1i4c94Dc9zIElDwCtLkKCiLVkhGo8BAUZRbA03WUeCPsWuSYOwF6Lj3ihShNwMyayphT7Pa2OLW3wMDXoQPZQJcEhp0LZNebnNffdqFKMoMS2wrVWKkeXV8/AaWucfj8IRDvKICdC2Dde1Dt+QA58UzE2MsAjkKUeGfj/0ZMbI8V5nDs291g0nt7I45qaS0WqF+B4NaC6TuU39OVCkkZrHSPIqjkgOy+77cfR3fT0lfgkZtgl6EitBupzBOoex6P9EBc+5fKY7k76KLUeHvikWeJUha1OC98Z39UFhRbioWEpHwcYtcTEOqlSplrOEpvmUiQl6CaMxZFAJ0SbzMTJf5AxAUYZzPi5jNwk8+j73iUIaMYW6pBC+FOOyhuehjc/QAg3hwAJf8RK0Q/pxOVUYv2hZpccmqqCWNlX+ivkMC/B9c1DnXQzkimV8P1vYB65fNImFdR4/dHxsKCrsB4UjcdCks+C6W1eShKu6+UP4fVEAMW+wkl3rA+D2U+P5RlNaw789vg32FJ9gdsW0/h7LR4hUbDjkAtUXqjDL2egpqz6ZlTjPgKhZd/k8+GpccRaciw6KmtITIMK/XqfdN5X50CdGItXJ9OiVe5U7npVK9cfdPX2o5MdBp/e5PZFuRZrCiPkRFrkwCJGr+hHGvF9Q0t/N7cO3P/kQL8zoUY/0Nn7EoX74vQ55IXtk2A/eDqhivf+7fQZww1foc/uXWDa81ux+N0QUpyDbX8nueRg07FAmsZyKyriDmxsG0ltmmUeKNoBiD8PwE6hkCgPREPc4EUpYT2NoBMGErgRxrRDwm6FJ/vR+pwCsDTUdC5KlirgKRyxNkxmIekMrWIwX4FpR65QpQaaTbHwvXlpoNI/W0ukn4BVCgVEdmktBio8AUAGPcvU8jSjiyfPYDE+yYUBGZB0O5+Gnl1TZZ4puD8HRhDKkMHIRj3LzcK0nTfphqPuRQC6LxBibewjlx3Gv/bkWx5NYxIPyqLtrfILZaVB2vbAGEWoCTmQbwUC/0bcsoHgDKnQ6jTkf89qYCajuDJz5FmyHqi+0dn11Lib8hMAzq9G0L7DSyvG4QZPOKF6NG0uPdctDdG9Zzgx0tsbW+CRs+GVU2HOyxCwp4F65Ccz/3DeL0Qt+5C9eU8VH1+DIu7EfmnJO37AGRk3e8eCOY8KEEPxL5RyCMHoq94tU7IDf3/Tn7+rwADACnwy0CpRlJVAAAAAElFTkSuQmCC',\r\n dfi: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAAA1CAYAAADbGt5GAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QjI2QjRGRDNCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QjI2QjRGRDRCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2REMyNDREMEI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpCMjZCNEZEMkI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PguAvKYAAB1qSURBVHja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',\r\n belfast:\r\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKYAAAA3CAYAAACGsjGRAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NkRDMjQ0Q0VCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NkRDMjQ0Q0ZCOTdDMTFFQ0I0ODhBMTlDQzI5RjM4QkMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2REMyNDRDQ0I5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo2REMyNDRDREI5N0MxMUVDQjQ4OEExOUNDMjlGMzhCQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmhVYEoAACcfSURBVHja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',\r\n};\r\n","import { Grid, Image, Link } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport authorityLinkData from './authorityLinkData';\r\n\r\nexport const NIFooterAuthorities: React.FC = () => {\r\n return (\r\n \r\n {authorityLinkData.map((item, index) => (\r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Container,\r\n Grid,\r\n Link,\r\n Divider,\r\n Image,\r\n Typography,\r\n VStack,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\nimport { transparentize } from '@tq/ui-components/dist/theme-tools';\r\n\r\nimport logo from 'assets/white_logo.svg';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Copyright } from './Copyright';\r\nimport { NIFooterAuthorities } from './authorities';\r\nimport { TERMS_CONDITIONS_URL } from 'config';\r\n\r\nexport const NiAppFooter: React.FC = () => {\r\n const { t } = useTranslation('footer');\r\n const isMobile = useIsMobile();\r\n\r\n const usefulLinksItem = {\r\n [t('useful_links', 'Useful links')]: {\r\n [t('development_management_practice_notes', 'Development Management Practice Notes')]:\r\n 'https://www.infrastructure-ni.gov.uk/publications/development-management-practice-notes',\r\n [t('contact_us', 'Contact us')]:\r\n 'https://www.nidirect.gov.uk/contacts/planning-offices-ni',\r\n [t('terms_and_conditions', 'Terms and Conditions')]: TERMS_CONDITIONS_URL,\r\n },\r\n };\r\n\r\n const footerMenu = [usefulLinksItem];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <>\r\n {footerMenu.map((subMenu, id) => {\r\n const subMenuTitle = Object.keys(subMenu)[0];\r\n const subMenuItems = Object.values(subMenu)[0];\r\n return (\r\n \r\n \r\n {subMenuTitle}\r\n \r\n \r\n {Object.entries(subMenuItems).map(([key, value], itemIndex) => (\r\n \r\n {key}\r\n \r\n ))}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n {t('participating_authorities', 'Participating authorities')}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport { TqAppFooter } from './components/TqAppFooter';\r\nimport { NiAppFooter } from './components/NiAppFooter';\r\n\r\nexport const AppFooter: React.FC = () => {\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n return isTQ ? : ;\r\n};\r\n","import i18n from 'i18next';\r\nimport { initReactI18next } from 'react-i18next';\r\nimport Backend from 'i18next-http-backend';\r\nimport { languageCode } from '../tools';\r\n\r\ni18n\r\n .use(Backend)\r\n .use(initReactI18next)\r\n .init({\r\n backend: {\r\n loadPath: '/locales/{{lng}}/{{ns}}.json',\r\n },\r\n react: {\r\n useSuspense: false,\r\n },\r\n lng: languageCode,\r\n load: 'all',\r\n fallbackLng: false,\r\n ns: ['common', 'home'],\r\n defaultNS: 'common',\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n lowerCaseLng: true,\r\n });\r\n\r\nexport default i18n;\r\n","import React from 'react';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport {\r\n ReactPlugin,\r\n withAITracking,\r\n AppInsightsContext,\r\n} from '@microsoft/applicationinsights-react-js';\r\nimport { appInsightsConnectionString } from '../../tools';\r\n\r\nconst reactPlugin = new ReactPlugin();\r\nconst appInsights = new ApplicationInsights({\r\n config: {\r\n connectionString: appInsightsConnectionString,\r\n enableAutoRouteTracking: false, // recommended by MS, use on RR6\r\n enableCorsCorrelation: true,\r\n enableRequestHeaderTracking: true,\r\n enableResponseHeaderTracking: true,\r\n enableAjaxPerfTracking: true,\r\n isBrowserLinkTrackingEnabled: true,\r\n extensions: [reactPlugin],\r\n },\r\n});\r\n\r\nappInsights.loadAppInsights();\r\n\r\nconst AzureAppInsights: React.FC = ({ children }) => {\r\n return (\r\n {children}\r\n );\r\n};\r\n\r\nexport default withAITracking(reactPlugin, AzureAppInsights);\r\n","import { useCallback, useState } from 'react';\r\n\r\nfunction isFunction(value: unknown): value is () => unknown {\r\n return typeof value === 'function';\r\n}\r\n\r\n/**\r\n * This hook stores values in local or session storage, as well as\r\n * in react state. This means that if a page is reloaded, the state\r\n * will be retrieved from the session storage if it exists. If it\r\n * doesn't exist, or is unparseable, the default value will be used\r\n * instead.\r\n *\r\n * The value must be convertable to JSON.\r\n *\r\n * If `session` is true, sessionStorage will be used, otherwise localStorage is used.\r\n *\r\n * Do not use this on any pages which will be server-side rendered.( not applicable to CH)\r\n *\r\n * Do not use this hook to set the same state in multiple components,\r\n * as the state is only loaded from storage when the component is initially rendered,\r\n * it's not synced across the components. It's recommended to use the useStickyState\r\n * in parent component and pass down the state setter to child components\r\n */\r\nexport function useStickyState(\r\n defaultValue: T | (() => T),\r\n key: string,\r\n session?: boolean\r\n): [T, React.Dispatch>, () => void] {\r\n const setStorage = useCallback(\r\n (storageValue: React.SetStateAction) => {\r\n (session ? window.sessionStorage : window.localStorage).setItem(\r\n key,\r\n JSON.stringify(storageValue)\r\n );\r\n },\r\n [key, session]\r\n );\r\n\r\n const [value, setValue] = useState(() => {\r\n const stickyValue = (session ? window.sessionStorage : window.localStorage).getItem(key);\r\n try {\r\n if (stickyValue === null) {\r\n if (isFunction(defaultValue)) {\r\n setStorage(defaultValue());\r\n return defaultValue();\r\n }\r\n setStorage(defaultValue);\r\n return defaultValue;\r\n }\r\n return JSON.parse(stickyValue);\r\n } catch (e) {\r\n if (isFunction(defaultValue)) {\r\n setStorage(defaultValue());\r\n return defaultValue();\r\n }\r\n setStorage(defaultValue);\r\n return defaultValue;\r\n }\r\n });\r\n\r\n const setStorageValue = useCallback(\r\n (newValue: React.SetStateAction) => {\r\n setValue(newValue);\r\n setStorage(newValue);\r\n },\r\n [setValue, setStorage]\r\n );\r\n\r\n const clearStorageValue = useCallback(() => {\r\n (session ? window.sessionStorage : window.localStorage).removeItem(key);\r\n }, [key, session]);\r\n\r\n return [value, setStorageValue, clearStorageValue];\r\n}\r\n","import { GrowthBook } from '@growthbook/growthbook-react';\r\nimport { useEffect } from 'react';\r\nimport { useStickyState } from './useStickyState';\r\nimport { tenantId, growthBookUrl } from 'tools';\r\n\r\nconst growthbook = new GrowthBook({\r\n // enableDevMode: true allows you to use the Chrome DevTools Extension to test/debug.\r\n enableDevMode: true,\r\n // Callback when a user is put into an A/B experiment\r\n trackingCallback: () => {},\r\n});\r\n\r\nexport const useGrowthBook = (): GrowthBook => {\r\n const IS_GROWTHBOOK_CALL = 'IS_GROWTHBOOK_CALL';\r\n const TenantID = tenantId;\r\n const [growthBookStickyData, setGrowthBookStickyData] = useStickyState(\r\n '',\r\n IS_GROWTHBOOK_CALL,\r\n true\r\n );\r\n\r\n /* This code is making a GET request to the URL specified in the `growthBookUrl` variable, and then\r\nparsing the response as JSON. If the `growthBookStickyData` state variable is empty (i.e. it has no\r\nkeys), it sets the state to the parsed JSON data. This allows the GrowthBook instance to use the\r\nfeatures defined in the JSON data to run experiments and variations. */\r\n fetch(growthBookUrl)\r\n .then((res) => res.json())\r\n .then((json) => {\r\n if (Object.keys(growthBookStickyData).length === 0) {\r\n setGrowthBookStickyData(json);\r\n }\r\n })\r\n .catch(() => {\r\n setGrowthBookStickyData('');\r\n });\r\n\r\n /* This is a React `useEffect` hook that sets the features of the `growthbook` instance. It takes\r\n`growthBookStickyData` as a dependency, and will re-run whenever this value changes. If\r\n`growthBookStickyData` is truthy, it parses the data and sets the features of the `growthbook`\r\ninstance to the `features` property of the parsed data. This allows GrowthBook to use the features\r\ndefined in the JSON data to run experiments and variations. */\r\n useEffect(() => {\r\n if (growthBookStickyData) {\r\n const parsedData = JSON.parse(JSON.stringify(growthBookStickyData));\r\n growthbook.setFeatures(parsedData.features);\r\n }\r\n }, [growthBookStickyData]);\r\n\r\n /* This is a React `useEffect` hook that sets the `tenantID` attribute of the `growthbook` instance. It\r\ntakes `TenantID` as a dependency, and will re-run whenever this value changes. This allows\r\nGrowthBook to track experiments and variations by the `tenantID` attribute. */\r\n useEffect(() => {\r\n growthbook.setAttributes({\r\n tenantID: TenantID,\r\n });\r\n }, [TenantID]);\r\n\r\n return growthbook;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { BadgeProps } from '@tq/ui-components/dist/components/badge';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { CUSTOM_COLOURS } from 'styles';\r\nimport { ApplicationStatus } from 'types';\r\n\r\ntype UseApplicationStatusReturn = {\r\n [key in ApplicationStatus]: ApplicationStatusItem;\r\n};\r\n\r\nexport type ApplicationStatusItem = {\r\n label: string;\r\n badgeProps: BadgeProps;\r\n};\r\n\r\nconst getStatusItem = (\r\n labelText: string,\r\n colour?: string,\r\n bgColour?: string,\r\n width?: string\r\n): ApplicationStatusItem => {\r\n return {\r\n label: labelText,\r\n badgeProps: {\r\n color: colour ?? 'inherit',\r\n bgColor: bgColour ?? 'inherit',\r\n width: width ?? STANDARD_WIDTH,\r\n },\r\n };\r\n};\r\n\r\nexport const STANDARD_WIDTH = spacing(24.5);\r\n\r\nexport const UnknownStatusItem = (): ApplicationStatusItem => {\r\n const { t } = useTranslation('application_status');\r\n return getStatusItem(\r\n t('not_available', 'Not available'),\r\n COLOURS.black,\r\n COLOURS.white,\r\n STANDARD_WIDTH\r\n );\r\n};\r\n\r\nexport const useApplicationStatuses = (): UseApplicationStatusReturn => {\r\n const { t } = useTranslation('application_status');\r\n\r\n return {\r\n Valid: getStatusItem(t('valid', 'Valid'), COLOURS.black, COLOURS.blue[300]),\r\n 'Consultation Open': getStatusItem(\r\n t('consultation_open', 'Consultation Open'),\r\n undefined,\r\n COLOURS.blue[600],\r\n spacing(34)\r\n ),\r\n 'Site Inspection Complete': getStatusItem(\r\n t('site_inspection_complete', 'Site Inspection Complete'),\r\n undefined,\r\n COLOURS.blue[600],\r\n spacing(44)\r\n ),\r\n 'Under Consideration': getStatusItem(\r\n t('under_consideration', 'Under Consideration'),\r\n COLOURS.black,\r\n CUSTOM_COLOURS.lightGreen,\r\n spacing(36)\r\n ),\r\n 'Decision Pending': getStatusItem(\r\n t('decision_pending', 'Decision Pending'),\r\n COLOURS.black,\r\n CUSTOM_COLOURS.lightGreen,\r\n spacing(32)\r\n ),\r\n 'Notice of Opinion Issued': getStatusItem(\r\n t('notice_of_opinion_issued', 'Notice of Opinion Issued'),\r\n undefined,\r\n CUSTOM_COLOURS.mediumGreen,\r\n spacing(44)\r\n ),\r\n Determined: getStatusItem(\r\n t('determined', 'Determined'),\r\n undefined,\r\n CUSTOM_COLOURS.mediumGreen\r\n ),\r\n 'Appeal in Progress': getStatusItem(\r\n t('appeal_in_progress', 'Appeal in Progress'),\r\n undefined,\r\n COLOURS.yellow[500],\r\n spacing(35)\r\n ),\r\n 'Public Local Inquiry - Referred to PAC': getStatusItem(\r\n t('public_local_inquiry_referred_to_pac', 'Public Local Inquiry - Referred to PAC'),\r\n undefined,\r\n COLOURS.yellow[500],\r\n spacing(63)\r\n ),\r\n 'Hearing - Referred to PAC': getStatusItem(\r\n t('hearing_referred_to_pac', 'Hearing - Referred to PAC'),\r\n undefined,\r\n COLOURS.yellow[500],\r\n spacing(45)\r\n ),\r\n 'Judicial Review in Progress': getStatusItem(\r\n t('judicial_review_in_progress', 'Judicial Review in Progress'),\r\n undefined,\r\n COLOURS.yellow[500],\r\n spacing(48)\r\n ),\r\n Revoked: getStatusItem(t('revoked', 'Revoked'), undefined, CUSTOM_COLOURS.mediumGreen),\r\n Withdrawn: getStatusItem(\r\n t('withdrawn', 'Withdrawn'),\r\n undefined,\r\n CUSTOM_COLOURS.mediumGreen\r\n ),\r\n };\r\n};\r\n","import { Badge, BadgeProps, HStack, VisuallyHidden } from '@tq/ui-components';\r\nimport React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { ApplicationStatus } from 'types';\r\nimport { UnknownStatusItem, useApplicationStatuses } from './hooks';\r\n\r\nexport interface StatusIndicatorProps extends BadgeProps {\r\n status: ApplicationStatus;\r\n separateLabel?: boolean;\r\n}\r\n\r\nexport const ApplicationStatusIndicator: React.FC = ({\r\n status,\r\n separateLabel = false,\r\n ...parentBadgeProps\r\n}) => {\r\n const statuses = useApplicationStatuses();\r\n const { t } = useTranslation('case_summary');\r\n\r\n const getApplicationStatus = (\r\n applicationStatusText: string\r\n ): {\r\n label: string;\r\n badgeProps: BadgeProps;\r\n } => {\r\n if (Object.keys(statuses).indexOf(applicationStatusText) > -1) {\r\n return statuses[applicationStatusText];\r\n }\r\n return { ...UnknownStatusItem(), label: applicationStatusText };\r\n };\r\n\r\n const applicationStatus = getApplicationStatus(status);\r\n\r\n return (\r\n <>\r\n {separateLabel ? (\r\n \r\n \r\n\r\n \r\n \r\n {t('application_status', 'Application status')}: {applicationStatus.label}\r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {t('application_status', 'Application status')}: {applicationStatus.label}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, DetailsCardBody } from '@tq/ui-components';\r\n\r\nimport { ExpandableParagraph } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { BaseApplicationResponse } from 'types';\r\n\r\nimport { ApplicationStatusIndicator } from '../ApplicationStatusIndicator';\r\nimport { CaseDetailCardToggleProps } from './types/CaseDetailCardToggleProps';\r\n\r\nexport type ApplicationCardBodyProps = CaseDetailCardToggleProps & {\r\n relatedCase: BaseApplicationResponse;\r\n textExpanded?: boolean;\r\n showExpanded?: boolean;\r\n};\r\n\r\nexport const ApplicationCardBody: React.FC = ({\r\n relatedCase,\r\n textExpanded,\r\n toggleClick,\r\n showExpanded = true,\r\n}) => {\r\n const isMobile = useIsMobile();\r\n return (\r\n \r\n \r\n {showExpanded ? (\r\n \r\n {relatedCase.proposalText}\r\n \r\n ) : (\r\n \r\n {relatedCase.proposalText}\r\n \r\n )}\r\n \r\n {isMobile && relatedCase?.applicationStatus && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","export const getSafeString = (value: string | undefined): string => {\r\n return value ?? '-';\r\n};\r\n","import { TFunction } from 'i18next';\r\nimport { ListRowProps } from '../../../../../tools';\r\nimport { getSafeString } from './utils';\r\nimport { ApplicationResponse, Consultation } from '../../../../../types';\r\nimport { StandardDateFormats, useFormatLocaleDate } from '../../../../../config';\r\n\r\nexport const useApplicationDetailItems = (\r\n t: TFunction,\r\n isTQ = false,\r\n application?: ApplicationResponse,\r\n consultation?: Consultation\r\n): ListRowProps[] => {\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const renderFormattedDate = (value: Date | undefined) =>\r\n value ? formatLocaleDate(value) : '-';\r\n\r\n return !consultation\r\n ? []\r\n : getDetails(t, isTQ, consultation, renderFormattedDate, formatLocaleDate, application);\r\n};\r\n\r\nconst getDetail = (label: string, value: string): ListRowProps => {\r\n return { label, value: value };\r\n};\r\n\r\nconst getDetails = (\r\n t: TFunction,\r\n isTQ: boolean,\r\n consultation: Consultation,\r\n renderFormattedDate: (value: Date | undefined) => string,\r\n formatLocaleDate: (\r\n dateValue: Date | string | undefined,\r\n format?: StandardDateFormats\r\n ) => string,\r\n application?: ApplicationResponse\r\n) => {\r\n return [\r\n getDetail(\r\n t('application_reference', 'Application reference'),\r\n isTQ\r\n ? getSafeString(consultation?.reference)\r\n : getSafeString(application?.planningPortalReference)\r\n ),\r\n getDetail(\r\n t('application_received', 'Application received'),\r\n renderFormattedDate(application?.dateReceived)\r\n ),\r\n getDetail(\r\n t('application_decided', 'Application decided'),\r\n application?.decisionDate ? formatLocaleDate(application?.decisionDate) : '-'\r\n ),\r\n getDetail(t('address', 'Address'), consultation?.address ?? ''),\r\n getDetail(\r\n t('status', 'Status'),\r\n getSafeString(application?.applicationStatus?.toString() ?? '')\r\n ),\r\n getDetail(t('decision', 'Decision'), getSafeString(application?.applicationDecisionType)),\r\n getDetail(\r\n isTQ ? t('municipality', 'Municipality') : t('authority', 'Authority'),\r\n consultation?.authority\r\n ),\r\n getDetail(\r\n t('district_electoral_area', 'District Electoral Area (DEA)'),\r\n getSafeString(application?.districtElectoralArea)\r\n ),\r\n getDetail(\r\n t('applicant_name', 'Applicant name'),\r\n getSafeString(application?.applicantsName)\r\n ),\r\n getDetail(\r\n consultation?.pacReference ? t('pac_reference', 'PAC Reference') : '',\r\n consultation?.pacReference ? getSafeString(consultation?.pacReference) : ''\r\n ),\r\n ];\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\nimport { ListRowProps } from 'tools';\r\nimport { Consultation, ApplicationResponse } from 'types';\r\nimport { DataItemConfiguration } from 'types/DataItemConfiguration';\r\nimport { getContactDetails } from './getContactDetails';\r\nimport { useImportantDates } from './useImportantDates';\r\nimport { useApplicationDetailItems } from './useApplicationDetailItems';\r\n\r\ntype ApplicationDetails = {\r\n applicationDetails: ListRowProps[];\r\n importantDates: ListRowProps[];\r\n contactDetails: ListRowProps[];\r\n};\r\n\r\nexport const useApplicationDetails = (\r\n application?: ApplicationResponse,\r\n consultation?: Consultation,\r\n dataItemsToDisplay?: DataItemConfiguration[]\r\n): ApplicationDetails => {\r\n const { t } = useTranslation('case_details_tab');\r\n const { isTQ } = useThemedValueSwitch();\r\n let applicationDetails = useApplicationDetailItems(t, isTQ, application, consultation);\r\n const contactDetails = getContactDetails(t, application, consultation);\r\n const importantDates = useImportantDates(t, application);\r\n\r\n let finalApplicationDetails: ListRowProps[] = [...applicationDetails];\r\n\r\n if (dataItemsToDisplay !== undefined) {\r\n const itemsNotToDisplay = dataItemsToDisplay\r\n .filter((item) => !item.shouldDisplayDataItem)\r\n .map((item) => item.dataItemName.toLowerCase());\r\n\r\n finalApplicationDetails = applicationDetails.filter(\r\n (item) => !itemsNotToDisplay.includes(item.label.toLocaleLowerCase())\r\n );\r\n applicationDetails = finalApplicationDetails;\r\n }\r\n\r\n return { applicationDetails, importantDates, contactDetails };\r\n};\r\n","import { TFunction } from 'i18next';\r\nimport { ListRowProps } from '../../../../../tools';\r\nimport { getSafeString } from './utils';\r\nimport { ApplicationResponse, Consultation } from '../../../../../types';\r\n\r\nexport const getContactDetails = (\r\n t: TFunction,\r\n application?: ApplicationResponse,\r\n consultation?: Consultation\r\n): ListRowProps[] => [\r\n {\r\n label: t('agent_name', 'Agent name'),\r\n value: getSafeString(application?.agentsName),\r\n },\r\n {\r\n label: t('agent_company', 'Agent company'),\r\n value: getSafeString(application?.agentsCompany),\r\n },\r\n {\r\n label: t('agent_phone_number', 'Agent phone number'),\r\n value: getSafeString(application?.agentsPhoneNumber),\r\n },\r\n {\r\n label: t('agent_email_address', 'Agent email address'),\r\n value: getSafeString(application?.agentsEmailAddress),\r\n },\r\n {\r\n label: t('contact_name_case_officer', 'Contact name (Case officer)'),\r\n value: getSafeString(consultation?.caseOfficerName),\r\n },\r\n {\r\n label: t('telephone_number_case_officer', 'Telephone number (Case officer)'),\r\n value: getSafeString(consultation?.caseOfficerContactNumber),\r\n },\r\n];\r\n","import { TFunction } from 'i18next';\r\nimport { ListRowProps } from '../../../../../tools';\r\nimport { ApplicationResponse } from '../../../../../types';\r\nimport { useFormatLocaleDate } from '../../../../../config';\r\n\r\nexport const useImportantDates = (\r\n t: TFunction,\r\n application?: ApplicationResponse\r\n): ListRowProps[] => {\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const renderFormattedDate = (value: Date | undefined) =>\r\n value ? formatLocaleDate(value) : '-';\r\n return [\r\n {\r\n label: t('application_received', 'Application received'),\r\n value: renderFormattedDate(application?.dateReceived),\r\n },\r\n {\r\n label: t('application_validated', 'Application validated'),\r\n value: renderFormattedDate(application?.dateValidated),\r\n },\r\n {\r\n label: t('last_neighbour_consultation', 'Last neighbour consultation'),\r\n value: renderFormattedDate(application?.latestNeighbourConsultationDate),\r\n },\r\n {\r\n label: t('neighbour_consultation_expiry', 'Neighbour consultation expiry'),\r\n value: renderFormattedDate(application?.neighbourConsultationExpiryDate),\r\n },\r\n {\r\n label: t('standard_consultation', 'Standard consultation'),\r\n value: renderFormattedDate(application?.standardConsultationDate),\r\n },\r\n {\r\n label: t('standard_consultation_expiry', 'Standard consultation expiry'),\r\n value: renderFormattedDate(application?.standardConsultationExpiry),\r\n },\r\n {\r\n label: t('date_last_advertised', 'Date last advertised'),\r\n value: renderFormattedDate(application?.dateLastAdvertised),\r\n },\r\n {\r\n label: t('latest_advert_expiry_date', 'Latest advertisement expiry date'),\r\n value: renderFormattedDate(application?.latestAdvertisementExpiryDate),\r\n },\r\n {\r\n label: t('decision_issued', 'Decision issued'),\r\n value: renderFormattedDate(application?.decisionDate),\r\n },\r\n {\r\n label: t('permission_expiry', 'Permission expiry'),\r\n value: renderFormattedDate(application?.permissionExpiryDate),\r\n },\r\n {\r\n label: t('committee', 'Committee'),\r\n value: renderFormattedDate(application?.committeeDate),\r\n },\r\n {\r\n label: t('application_called_into_committee', 'Application called into committee'),\r\n value: renderFormattedDate(application?.applicationCalledInDate),\r\n },\r\n {\r\n label: t('department_referral', 'Department referral'),\r\n value: renderFormattedDate(application?.departmentReferralDate),\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Accordion,\r\n AccordionHeader,\r\n AccordionIconButton,\r\n AccordionItem,\r\n AccordionPanel,\r\n Box,\r\n FormControl,\r\n ListRow,\r\n renderListRows,\r\n Skeleton,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Consultation, ApplicationResponse } from 'types';\r\nimport { useApplicationDetails } from './hooks';\r\nimport { DataItemConfiguration } from 'types/DataItemConfiguration';\r\n\r\nexport type DetailsProps = {\r\n consultation?: Consultation;\r\n application?: ApplicationResponse;\r\n dataItemsToDisplay?: DataItemConfiguration[];\r\n};\r\n\r\nexport const ApplicationDetails: React.FC = ({\r\n consultation,\r\n application,\r\n dataItemsToDisplay,\r\n}) => {\r\n const { t } = useTranslation('case_details_tab');\r\n const { tvs } = useThemedValueSwitch();\r\n const isMobile = useIsMobile();\r\n const columnLayout = isMobile ? '45% 55%' : '325px auto';\r\n const { applicationDetails, importantDates, contactDetails } = useApplicationDetails(\r\n application,\r\n consultation,\r\n dataItemsToDisplay\r\n );\r\n\r\n if (!consultation) {\r\n // Do proper skeletons\r\n return ;\r\n }\r\n\r\n const getRenderListConfig = () => {\r\n return {\r\n p: '4 6',\r\n addLabelColons: false,\r\n zebraRows: true,\r\n accessibleTextForEmptyValue: t('no_value', 'No value'),\r\n };\r\n };\r\n\r\n const rowMargin = -1;\r\n\r\n const accordionPanelPadding = tvs(\r\n {\r\n tq: {\r\n p: 0,\r\n },\r\n },\r\n {\r\n py: 0,\r\n }\r\n );\r\n\r\n return (\r\n \r\n \r\n

    \r\n \r\n \r\n {t('application_details', 'Application details')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n {renderListRows(applicationDetails, getRenderListConfig())}\r\n \r\n \r\n \r\n
    \r\n \r\n

    \r\n \r\n \r\n {t('contact_details', 'Contact details')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n {renderListRows(contactDetails, getRenderListConfig())}\r\n \r\n \r\n \r\n
    \r\n \r\n

    \r\n \r\n \r\n {t('important_dates', 'Important dates')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n {renderListRows(importantDates, getRenderListConfig())}\r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box, HStack } from '@tq/ui-components';\r\n\r\nimport { ActionMenuButton, AssigneeDetails, PageHeading } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Consultation } from 'types';\r\nimport { useDetailsMenuOptions } from '../../hooks';\r\n\r\nexport interface DetailsHeaderProps {\r\n consultation: Consultation | undefined;\r\n}\r\n\r\nexport const CaseDetailsHeader: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('case_details_header');\r\n const options = useDetailsMenuOptions(consultation);\r\n const isMobile = useIsMobile();\r\n const actionButton = (\r\n \r\n );\r\n return (\r\n <>\r\n \r\n \r\n {!isMobile && actionButton}\r\n \r\n \r\n {isMobile && {actionButton}}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FaIdCard, FaListUl, FaUser } from 'react-icons/fa';\r\n\r\nimport { useNavigate, useShowViewResponse } from 'hooks';\r\nimport { Consultation, MenuOption } from 'types';\r\n\r\nexport const useDetailsMenuOptions = (\r\n consultation: Consultation | undefined\r\n): MenuOption[] => {\r\n const { t } = useTranslation('details_header');\r\n\r\n const { navigateToDashboard, navigateToSummary, navigateToResponse } = useNavigate();\r\n const showViewResponse = useShowViewResponse(consultation);\r\n\r\n const consultationSummary: MenuOption = {\r\n label: t('consultation_summary', 'Consultation summary'),\r\n onClick: (consultationId) => consultationId && navigateToSummary(consultationId),\r\n icon: FaIdCard,\r\n };\r\n\r\n const respond: MenuOption = {\r\n label: t('respond', 'Respond'),\r\n onClick: (consultationId) => consultationId && navigateToResponse(consultationId),\r\n icon: FaUser,\r\n };\r\n\r\n const viewResponse: MenuOption = {\r\n label: t('view_response', 'View response'),\r\n onClick: (consultationId) => consultationId && navigateToResponse(consultationId),\r\n icon: FaUser,\r\n };\r\n\r\n const dashboard: MenuOption = {\r\n label: t('dashboard', 'Dashboard'),\r\n onClick: () => navigateToDashboard(),\r\n icon: FaListUl,\r\n };\r\n\r\n return consultation?.isArchived\r\n ? showViewResponse\r\n ? [consultationSummary, viewResponse, dashboard]\r\n : [consultationSummary, dashboard]\r\n : [consultationSummary, respond, dashboard];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n Grid,\r\n Heading,\r\n HStack,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport { ExpandableParagraph } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Consultation, GetCaseDetailsResponse } from 'types';\r\nimport { ApplicationStatusIndicator } from '..';\r\n\r\nexport interface CaseSummaryProps {\r\n consultation: Consultation | undefined;\r\n caseDetails: GetCaseDetailsResponse | undefined;\r\n isRpc: boolean;\r\n}\r\n\r\nexport const CaseDetailsSummary: React.FC = ({\r\n consultation,\r\n caseDetails,\r\n isRpc,\r\n}) => {\r\n const { t } = useTranslation('case_summary');\r\n const { tvs, isTQ } = useThemedValueSwitch();\r\n\r\n const isMobile = useIsMobile();\r\n\r\n const status = caseDetails && caseDetails?.application?.applicationStatus && (\r\n \r\n );\r\n\r\n const proposalText = consultation?.summaryDescription ? (\r\n <>\r\n \r\n {t('proposal_description', 'Proposal description')}\r\n \r\n \r\n \r\n {consultation.summaryDescription}\r\n \r\n \r\n \r\n ) : null;\r\n\r\n const warning = (\r\n \r\n );\r\n\r\n const applicationReference = (\r\n \r\n {t('application_reference', 'Application reference')}: {consultation?.reference}\r\n \r\n );\r\n\r\n return isMobile ? (\r\n \r\n {consultation?.address}\r\n {consultation?.reference}\r\n {caseDetails?.application?.applicationType}\r\n {!isRpc && status}\r\n {!isRpc && proposalText}\r\n {warning}\r\n \r\n ) : (\r\n \r\n \r\n \r\n {consultation?.address}\r\n \r\n {isRpc ? applicationReference : status}\r\n \r\n \r\n {caseDetails?.application?.applicationType}\r\n {!isRpc && applicationReference}\r\n \r\n {!isRpc && proposalText && {proposalText}}\r\n {warning}\r\n \r\n );\r\n};\r\n","import { useFileDownload } from 'hooks';\r\nimport { useCallback } from 'react';\r\nimport { Comment, Consultation } from 'types';\r\n\r\nexport const useViewComment = (): ((\r\n comment: Comment,\r\n consultation?: Consultation\r\n) => void) => {\r\n const { openApplicationDocument } = useFileDownload();\r\n return useCallback(\r\n (comment: Comment, consultation?: Consultation) => {\r\n if (!consultation) return;\r\n comment.documents?.forEach(({ id, name }) => {\r\n openApplicationDocument({\r\n documentId: id,\r\n fileName: name,\r\n applicationReferenceNumber: consultation.reference,\r\n });\r\n });\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n []\r\n );\r\n};\r\n","import React from 'react';\r\nimport { Badge, HStack } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Comment } from 'types';\r\n\r\nexport interface CommentTypeTagsProps {\r\n comment: Comment;\r\n}\r\nconst Tag: React.FC = ({ children }) => (\r\n \r\n {children}\r\n \r\n);\r\nexport const CommentTypeTags: React.FC = ({ comment }) => {\r\n const { isPetition, type } = comment;\r\n\r\n const { t } = useTranslation('comment_type');\r\n\r\n return (\r\n \r\n {isPetition ? {t('petition', 'Petition')} : null}\r\n {type}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Card, HStack, ListRow, renderListRows } from '@tq/ui-components';\r\n\r\nimport { Comment, Consultation } from 'types';\r\nimport { CommentTypeTags } from './CommentTypeTags';\r\nimport { useViewComment } from './hooks';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport interface CommentsMobileCardProps {\r\n consultation?: Consultation;\r\n comment: Comment;\r\n}\r\nexport const CommentsMobileCard: React.FC = ({\r\n consultation,\r\n comment,\r\n}) => {\r\n const { t } = useTranslation('case_details_comments');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const onViewComment = useViewComment();\r\n return (\r\n \r\n \r\n \r\n {renderListRows(\r\n [\r\n {\r\n label: t('published', 'Published'),\r\n value: formatLocaleDate(comment.datePublished),\r\n },\r\n {\r\n label: t('name', 'Name'),\r\n value: comment.name,\r\n },\r\n ],\r\n { mb: 2 }\r\n )}\r\n {renderListRows([\r\n {\r\n label: t('type', 'Type'),\r\n renderValue: () => ,\r\n },\r\n ])}\r\n \r\n {comment?.documents?.length && (\r\n onViewComment(comment, consultation)}\r\n >\r\n {t('view', 'View')}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUser, FaUsers } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Box,\r\n Button,\r\n Typography,\r\n ResponsiveDataTable,\r\n DataTableColumns,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { CellProps } from 'react-table';\r\nimport { EmptyDataCard, hiddenTableHeaderLabel } from '../../../../components';\r\nimport { useFormatLocaleDate } from '../../../../config';\r\nimport { Comment, Consultation } from '../../../../types';\r\n\r\nimport { useCommentFilters, useViewComment } from './hooks';\r\nimport { CommentsMobileCard } from './CommentsMobileCard';\r\nimport { CommentTypeTags } from './CommentTypeTags';\r\n\r\nexport type CommentsProps = {\r\n consultation?: Consultation;\r\n comments?: Comment[];\r\n};\r\n\r\nexport const Comments: React.FC = ({ consultation, comments }) => {\r\n const { t } = useTranslation('case_details_comments');\r\n\r\n const isMobile = useIsMobile();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const filters = useCommentFilters(comments);\r\n const filterColumnLayout = isMobile ? '100%' : '50% 50%';\r\n const onViewComment = useViewComment();\r\n const commentColumns: DataTableColumns[] = [\r\n {\r\n accessor: 'isGroup',\r\n Cell: (cellProps: { value: string }) => (\r\n \r\n {cellProps.value ? : }\r\n \r\n ),\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('is_group_label', 'is Group')),\r\n width: 60,\r\n },\r\n {\r\n accessor: 'name',\r\n Cell: (cellProps: { value: string }) => (\r\n <>\r\n \r\n {cellProps.value}\r\n \r\n \r\n ),\r\n disableSortBy: true,\r\n Header: () => t('name_header', 'Name'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'datePublished',\r\n Cell: (cellProps: { value: string }) => formatLocaleDate(cellProps.value),\r\n Header: () => t('date_published', 'Date published'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'type',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n \r\n ),\r\n disableSortBy: true,\r\n Header: () => t('type_header', 'Type'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'documents',\r\n Cell: ({ row: { original } }: CellProps) =>\r\n original?.documents?.length ? (\r\n onViewComment(original, consultation)}\r\n >\r\n {t('view', 'View')}\r\n \r\n ) : null,\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('view_label', 'view')),\r\n width: 110,\r\n },\r\n ];\r\n return (\r\n <>\r\n {isMobile && (\r\n \r\n

    {t('comments', 'Comments')}

    \r\n
    \r\n )}\r\n {!comments?.length ? (\r\n \r\n ) : (\r\n (\r\n \r\n )}\r\n filterColumnLayout={filterColumnLayout}\r\n filters={filters}\r\n size='sm'\r\n initialState={{\r\n sortBy: [\r\n {\r\n id: 'datePublished',\r\n desc: true,\r\n },\r\n ],\r\n }}\r\n columns={commentColumns}\r\n data={comments}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport { DefineFilters, useIsMobile } from '@tq/ui-components';\r\nimport { Comment } from 'types';\r\nimport { uniqBy } from 'tools';\r\n\r\nexport const useCommentFilters = (comments?: Comment[]): DefineFilters[] => {\r\n const { t } = useTranslation('case_details_comments');\r\n\r\n const isMobile = useIsMobile();\r\n\r\n return [\r\n {\r\n type: 'group',\r\n filtersInGroup: [\r\n {\r\n type: 'filter',\r\n controlLabel: `${t('comment_type', 'Comment type')}:`,\r\n filterModalHeader: t('comments_filter', 'Comments filter'),\r\n filterOptions: [\r\n {\r\n column: 'type',\r\n label: t('all', 'All'),\r\n },\r\n ...uniqBy(comments ?? [], (comment) => comment.type).map((comment) => ({\r\n column: 'type',\r\n value: comment.type,\r\n label: comment.type,\r\n })),\r\n ],\r\n },\r\n {\r\n type: 'sort',\r\n controlLabel: `${isMobile ? t('sort', 'Sort') : t('sort_by', 'Sort by')}:`,\r\n groupSortOptions: [\r\n {\r\n label: t('date_published', 'Date published'),\r\n options: [\r\n {\r\n column: 'datePublished',\r\n label: t('date_published_newest', 'Newest'),\r\n desc: true,\r\n },\r\n {\r\n column: 'datePublished',\r\n label: t('date_published_oldest', 'Oldest'),\r\n desc: false,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { TabList, Tab, TabText, Badge, useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport { GetCaseDetailsResponse } from 'types';\r\n\r\nexport interface DesktopTabListProps {\r\n tabLabels: string[];\r\n caseDetails: GetCaseDetailsResponse | undefined;\r\n isRpc: boolean;\r\n}\r\nexport const DesktopTabList: React.FC = ({\r\n tabLabels,\r\n caseDetails,\r\n isRpc,\r\n}) => {\r\n const { tvs, isTQ } = useThemedValueSwitch();\r\n const badgeCount = (count = 0): string | number => (count && count > 99 ? '99+' : count);\r\n const badge = (children: string | number) => {\r\n if (isTQ)\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n return {children};\r\n };\r\n return (\r\n \r\n \r\n {tabLabels[0]}\r\n \r\n {isRpc ? (\r\n <>\r\n \r\n {tabLabels[1]}\r\n {!!caseDetails?.application?.documents?.length &&\r\n badge(badgeCount(caseDetails?.application?.documents?.length))}\r\n \r\n \r\n ) : (\r\n <>\r\n {tabLabels.map((item, index) => {\r\n if (item === 'Map' || item === 'Related cases') {\r\n return (\r\n \r\n {item}\r\n \r\n );\r\n }\r\n if (item === 'Documents' && caseDetails?.application?.documents) {\r\n return (\r\n \r\n {item}\r\n {!!caseDetails?.application?.documents?.length &&\r\n badge(badgeCount(caseDetails?.application?.documents?.length))}\r\n \r\n );\r\n }\r\n if (item === 'Plans') {\r\n return (\r\n \r\n {item}\r\n {!!caseDetails?.application?.plans?.length &&\r\n badge(badgeCount(caseDetails?.application?.plans?.length))}\r\n \r\n );\r\n }\r\n if (item === 'Comments') {\r\n return (\r\n \r\n {item}\r\n {!!caseDetails?.application?.comments?.length &&\r\n badge(badgeCount(caseDetails?.application?.comments?.length))}\r\n \r\n );\r\n }\r\n })}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { ActionMenuButtonEllipsis } from 'components';\r\nimport { Consultation, Document, MenuOption } from 'types';\r\n\r\nexport const renderDocumentMenuActionButton = (\r\n consultation: Consultation | undefined,\r\n options: MenuOption[],\r\n document: Document\r\n): JSX.Element => (\r\n <>\r\n {consultation && (\r\n \r\n )}\r\n \r\n);\r\n","import React from 'react';\r\nimport { Badge, Card, Grid, HStack, Link, renderListRows } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { Consultation, Document, MenuOption } from 'types';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { renderDocumentMenuActionButton } from 'pages/CaseDetails/util';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport interface DocumentsMobileCardProps {\r\n consultation?: Consultation;\r\n document: Document;\r\n options: MenuOption[];\r\n}\r\nexport const DocumentsMobileCard: React.FC = ({\r\n consultation,\r\n document,\r\n options,\r\n}) => {\r\n const { t } = useTranslation('case_details_documents');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n \r\n \r\n \r\n {document.documentType}\r\n {renderDocumentMenuActionButton(consultation, options, document)}\r\n \r\n {document?.sensitive ? (\r\n \r\n {t('sensitive', 'Sensitive')}\r\n \r\n ) : null}\r\n {renderListRows([\r\n {\r\n label: t('published', 'Published'),\r\n value: formatLocaleDate(document.datePublished),\r\n },\r\n {\r\n label: t('drawing_number', 'Drawing number'),\r\n value: document.drawingNumber || '-',\r\n },\r\n {\r\n label: t('document_description', 'Document description'),\r\n value: document.description || '-',\r\n },\r\n ])}\r\n \r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { uniqBy } from 'tools';\r\n\r\nimport { DefineFilters, useIsMobile } from '@tq/ui-components';\r\nimport { Document } from 'types';\r\n\r\nexport const useDocumentFilters = (\r\n documents: Document[] | undefined,\r\n isDocuments: boolean\r\n): DefineFilters[] => {\r\n const { t } = useTranslation('case_details_documents');\r\n\r\n const isMobile = useIsMobile();\r\n\r\n return [\r\n {\r\n type: 'search',\r\n SearchInputProps: {\r\n placeholder: t('search_plans', 'Search documents'),\r\n 'aria-label': t(\r\n 'search_screen_reader_help',\r\n 'Search documents. Document list will be filtered when you input text.'\r\n ),\r\n },\r\n },\r\n {\r\n type: 'group',\r\n filtersInGroup: [\r\n {\r\n type: 'filter',\r\n controlLabel: `${t('document_type', 'Document type')}:`,\r\n filterModalHeader: isDocuments\r\n ? t('documents_filter', 'Documents filter')\r\n : t('plans_filter', 'Plans filter'),\r\n filterOptions: [\r\n {\r\n column: 'documentType',\r\n label: t('all', 'All'),\r\n },\r\n ...uniqBy(documents ?? [], (doc) => doc.documentType).map((doc) => ({\r\n column: 'documentType',\r\n value: doc.documentType,\r\n label: doc.documentType,\r\n })),\r\n ],\r\n },\r\n {\r\n type: 'sort',\r\n controlLabel: `${isMobile ? t('sort', 'Sort') : t('sort_by', 'Sort by')}:`,\r\n groupSortOptions: [\r\n {\r\n label: t('date_published', 'Date published'),\r\n options: [\r\n {\r\n column: 'datePublished',\r\n label: t('date_published_newest', 'Newest'),\r\n desc: true,\r\n },\r\n {\r\n column: 'datePublished',\r\n label: t('date_published_oldest', 'Oldest'),\r\n desc: false,\r\n },\r\n ],\r\n },\r\n {\r\n label: t('document_type', 'Document type'),\r\n options: [\r\n {\r\n column: 'documentType',\r\n label: t('document_type_a_to_z', 'A to Z'),\r\n desc: false,\r\n },\r\n {\r\n column: 'documentType',\r\n label: t('document_type_z_to_a', 'Z to A'),\r\n desc: true,\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Badge, ResponsiveDataTable, Typography } from '@tq/ui-components';\r\n\r\nimport { EmptyDataCard, hiddenTableHeaderLabel } from 'components';\r\nimport { Consultation, Document } from 'types';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { DocumentsMobileCard } from './DocumentsMobileCard';\r\nimport { useDocumentFilters } from './hooks';\r\nimport { useDocumentMenuOptions } from '../../hooks';\r\nimport { renderDocumentMenuActionButton } from '../../util';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport type DocumentsProps = {\r\n consultation?: Consultation;\r\n documents?: Document[];\r\n};\r\n\r\nexport const Documents: React.FC = ({ consultation, documents }) => {\r\n const { t } = useTranslation('case_details_documents');\r\n const options = useDocumentMenuOptions();\r\n\r\n const isMobile = useIsMobile();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const filters = useDocumentFilters(documents, true);\r\n const filterColumnLayout = isMobile ? '100%' : '33% 65%';\r\n\r\n const renderSensitiveLabel = () => (\r\n \r\n {t('sensitive', 'Sensitive')}\r\n \r\n );\r\n\r\n return (\r\n <>\r\n {isMobile && (\r\n \r\n

    {t('documents', 'Documents')}

    \r\n
    \r\n )}\r\n {documents?.length ? (\r\n (\r\n \r\n )}\r\n filterColumnLayout={filterColumnLayout}\r\n filters={filters}\r\n initialState={{\r\n sortBy: [\r\n {\r\n id: 'datePublished',\r\n desc: true,\r\n },\r\n ],\r\n }}\r\n data={documents}\r\n columns={[\r\n {\r\n accessor: 'datePublished',\r\n Cell: (cellProps: { value: string }) => formatLocaleDate(cellProps.value),\r\n Header: () => t('date_published', 'Date published'),\r\n width: 180,\r\n },\r\n {\r\n accessor: 'documentType',\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('document_type', 'Document type'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'description',\r\n disableSortBy: true,\r\n Header: () => t('document_description', 'Document description'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'sensitive',\r\n Cell: (cellProps: { value: boolean }) =>\r\n cellProps.value && renderSensitiveLabel(),\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('sensitive_label', 'is sensitive')),\r\n width: 20,\r\n },\r\n {\r\n accessor: 'actions',\r\n Cell: (cellProps: { row: { original: Document } }) =>\r\n renderDocumentMenuActionButton(consultation, options, cellProps.row.original),\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('actions_label', 'actions')),\r\n width: 20,\r\n },\r\n ]}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FaDownload, FaEye } from 'react-icons/fa';\r\n\r\nimport { useFileDownload } from 'hooks';\r\nimport { MenuOption } from 'types';\r\n\r\nexport const useDocumentMenuOptions = (): MenuOption[] => {\r\n const { t } = useTranslation('case_details_plans');\r\n const { downloadApplicationDocument, openApplicationDocument } = useFileDownload();\r\n\r\n return [\r\n {\r\n label: t('view_button', 'View'),\r\n icon: FaEye,\r\n onClick: (consultation, documentRequest) => openApplicationDocument(documentRequest),\r\n },\r\n {\r\n label: t('download_button', 'Download copy'),\r\n icon: FaDownload,\r\n onClick: (consultation, documentRequest) => downloadApplicationDocument(documentRequest),\r\n },\r\n ];\r\n};\r\n","import React, { useState } from 'react';\r\nimport { FaChevronUp, FaChevronDown } from 'react-icons/fa';\r\n\r\nimport { Box, Button, Radio, RadioGroup, Stack } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { ActiveLayer } from '.';\r\n\r\ntype LayerToggleProps = {\r\n handleOnChange: (value: ActiveLayer) => void;\r\n activeLayer: ActiveLayer;\r\n};\r\n\r\nexport const LayerToggle: React.FunctionComponent = ({\r\n handleOnChange,\r\n activeLayer,\r\n}) => {\r\n const [displayOptions, setDisplayViewOptions] = useState(false);\r\n\r\n const isMobile = useIsMobile();\r\n\r\n const toggleElements = (\r\n handleOnChange(value as unknown as ActiveLayer)}\r\n value={activeLayer}\r\n >\r\n \r\n Satellite view\r\n Map view\r\n \r\n \r\n );\r\n\r\n const icon = displayOptions ? : ;\r\n\r\n return (\r\n <>\r\n {isMobile ? (\r\n \r\n setDisplayViewOptions((s) => !s)}\r\n sx={{\r\n minWidth: 'unset !important',\r\n padding: '0',\r\n justifyContent: 'start',\r\n border: 'unset',\r\n color: '#1076BC !important',\r\n mb: displayOptions ? '0.8rem' : 'unset',\r\n '&:focus': {\r\n boxShadow: 'unset',\r\n },\r\n '&:hover': {\r\n background: 'unset',\r\n },\r\n '&:active': {\r\n background: 'unset',\r\n },\r\n }}\r\n >\r\n View options\r\n \r\n {displayOptions && toggleElements}\r\n \r\n ) : (\r\n \r\n {toggleElements}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","export const EMPTY_LAYER_DATA = {\r\n type: 'FeatureCollection',\r\n features: [],\r\n};\r\n","export const maxZoom = 14;\r\nexport const layerPadding = [50, 50, 50, 50];\r\nexport const mapReference = 'OSNI50k';\r\nexport const satelliteMapReference = 'Orthophotography';\r\n","import React, { useEffect, useMemo, useState } from 'react';\r\nimport {\r\n ControlBar,\r\n Geometry,\r\n LayerSwitcher,\r\n Map,\r\n ResetPosition,\r\n ScaleLine,\r\n useMapActions,\r\n View,\r\n Zoom,\r\n} from '@tq/web-maps';\r\nimport { Shape } from '@tq/web-maps/dist/react-ol/components/Shape';\r\nimport { drawStyle } from '@tq/web-maps/dist/styles/Map.styles';\r\nimport { ActiveLayer, MapWithPolygonMapProps, StyledControlBar } from '.';\r\nimport { LayerToggle } from './layer-toggle';\r\nimport { EMPTY_LAYER_DATA } from './empty-layer-data';\r\nimport { maxZoom, layerPadding, mapReference } from './constants';\r\nimport { tqc } from '@tq/ui-components';\r\n\r\n//This component is being used only in TQ theme at the moment\r\nexport const MapWithPolygon: React.FC = ({\r\n geoJson,\r\n displayLayerToggle,\r\n mapHeight = '480px',\r\n}) => {\r\n const [activeLayer, setActiveLayer] = useState(ActiveLayer.MAP);\r\n\r\n const { fitFeature } = useMapActions();\r\n\r\n useEffect(() => {\r\n const polygonLayerId = geoJson?.features?.[0]?.id;\r\n if (polygonLayerId) {\r\n fitFeature(polygonLayerId, { padding: layerPadding, maxZoom });\r\n }\r\n }, [geoJson, fitFeature]);\r\n\r\n const applicationPolygonLayer = (\r\n \r\n );\r\n\r\n const enabledLayers = useMemo(\r\n () => [{ reference: mapReference, display: activeLayer === ActiveLayer.MAP }],\r\n [activeLayer]\r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n {displayLayerToggle && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","export enum ActiveLayer {\r\n MAP = 'MAP',\r\n SATELLITE = 'SATELLITE',\r\n}\r\n","import styled from 'styled-components';\r\n\r\nexport const StyledControlBar = styled.div`\r\n position: absolute;\r\n display: flex;\r\n top: 0;\r\n right: 0;\r\n bottom: 0;\r\n left: 0;\r\n\r\n z-index: 1;\r\n\r\n #ol-control-bar {\r\n top: 0;\r\n max-width: 100%;\r\n margin: 0 auto;\r\n padding-left: 2rem;\r\n padding-right: 1rem;\r\n }\r\n #ol-controls-scale-line-target {\r\n .ol-scale-line-override {\r\n position: absolute;\r\n transform: none;\r\n padding: 0.5rem 0.875rem;\r\n box-shadow: unset;\r\n z-index: 2;\r\n left: 5%;\r\n bottom: 5%;\r\n }\r\n .ol-scale-line-override-inner {\r\n height: 1.25rem;\r\n line-height: 1.25rem;\r\n font-size: 0.75rem;\r\n }\r\n }\r\n\r\n #ol-controls-zoom-target {\r\n position: absolute;\r\n top: 2rem;\r\n right: 2rem;\r\n z-index: 1;\r\n\r\n display: flex;\r\n flex-direction: column;\r\n\r\n #ol-controls-reset-position-target {\r\n order: 2;\r\n margin-top: 1rem;\r\n\r\n button {\r\n width: 2rem;\r\n height: 2rem;\r\n }\r\n }\r\n\r\n .ol-zoom-override {\r\n width: 2rem;\r\n border: 1px solid #eaeaea;\r\n\r\n border-radius: 0.25rem !important;\r\n margin-top: 0;\r\n\r\n .ol-zoom-override-in,\r\n .ol-zoom-override-out {\r\n width: 2rem !important;\r\n height: 2.5rem !important;\r\n padding: 0.625rem !important;\r\n position: relative;\r\n\r\n &:before,\r\n &:after {\r\n content: '';\r\n display: block;\r\n width: 1rem;\r\n height: 0.25rem;\r\n background-color: #0d1f63;\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n border-radius: 1px;\r\n }\r\n\r\n img {\r\n display: none;\r\n }\r\n }\r\n .ol-zoom-override-in {\r\n border-bottom: 1px solid #eaeaea;\r\n\r\n &:after {\r\n width: 0.25rem;\r\n height: 1rem;\r\n }\r\n }\r\n .ol-zoom-override-out {\r\n &:after {\r\n display: none;\r\n }\r\n }\r\n .ol-zoom-in-label-override,\r\n .ol-zoom-out-label-override {\r\n padding: 0 !important;\r\n max-width: 100% !important;\r\n min-width: 0 !important;\r\n width: 100% !important;\r\n border-bottom: none !important;\r\n margin: 0 !important;\r\n }\r\n }\r\n }\r\n #ol-controls-toolbar-button-measurements-target {\r\n li {\r\n margin-left: 0 !important;\r\n }\r\n }\r\n`;\r\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaDownload } from 'react-icons/fa';\r\nimport { useParams } from 'react-router-dom';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n Button,\r\n Flex,\r\n Grid,\r\n Heading,\r\n HStack,\r\n Typography,\r\n useToast,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { MapProvider } from '@tq/web-maps';\r\nimport { MapWithPolygon, MapGeoJson } from '../MapWithPolygon';\r\nimport { useMapPolygon } from 'api';\r\nimport { useIsVisible } from 'hooks';\r\nimport { mapsApiKey, mapsApiUrl, uniqBy } from 'tools';\r\n\r\nimport { MapConstraintDetail } from '../../../../types/MapConstraintDetail';\r\nimport { MapDetailsProps } from './MapDetailsProps';\r\n\r\nconst downloadGeoJSON = (filename: string, json: MapGeoJson) => {\r\n const url = window.URL.createObjectURL(\r\n new Blob([JSON.stringify(json)], {\r\n type: 'text/json;charset=utf-8',\r\n })\r\n );\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.setAttribute('download', `${filename.replaceAll('/', '_')}.json`);\r\n link.click();\r\n};\r\n\r\nexport const MapDetails: React.FC = ({\r\n applicationReference,\r\n caseDetails,\r\n consultation,\r\n isRpc,\r\n}) => {\r\n const { t } = useTranslation('case_details_map');\r\n const toast = useToast();\r\n const isMobile = useIsMobile();\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const ref = useRef(null);\r\n const isVisible = useIsVisible(ref);\r\n const [showMap, setShowMap] = useState(false);\r\n\r\n const { id } = useParams();\r\n const { data: polygonData } = useMapPolygon(+(id ?? 0));\r\n\r\n const constraints =\r\n consultation &&\r\n uniqBy(\r\n consultation.consultationMapConstraintDetails,\r\n (constraint) => constraint.constraintCode\r\n );\r\n\r\n useEffect(() => {\r\n if (isVisible && caseDetails) {\r\n setShowMap(true);\r\n }\r\n }, [isVisible, caseDetails]);\r\n\r\n const handleDownloadSpatialClick = () => {\r\n if (polygonData?.geoJson) {\r\n downloadGeoJSON(applicationReference || 'geoJSON', polygonData.geoJson);\r\n }\r\n };\r\n\r\n const heading = () => (\r\n \r\n {t('site_boundary', 'Site boundary')}\r\n \r\n );\r\n\r\n const exportOptions = () => (\r\n <>\r\n \r\n {t('export_red_line_boundary', 'Export red line boundary')}\r\n \r\n }\r\n onClick={handleDownloadSpatialClick}\r\n >\r\n {t('spatial_file_download', 'Spatial file download')}\r\n \r\n \r\n );\r\n\r\n const eastingNorthing = () => (\r\n \r\n \r\n {t('easting', 'Easting')}:\r\n \r\n {caseDetails?.application?.easting}\r\n \r\n \r\n \r\n {t('northing', 'Northing')}:\r\n \r\n {caseDetails?.application?.northing}\r\n \r\n \r\n \r\n );\r\n\r\n const handleTileLoadError = useCallback(\r\n (e) => {\r\n const toastOptions = {\r\n id: 'tile-load-error',\r\n title: t('map_failed_load', 'Map failed to load.'),\r\n };\r\n\r\n if (e.status === 401 || e.status === 403) {\r\n return toast({\r\n ...toastOptions,\r\n description: t(\r\n 'no_access',\r\n `You don't have access to this project map. Please contact our help desk if you feel you should.`\r\n ),\r\n });\r\n }\r\n\r\n return toast({\r\n ...toastOptions,\r\n description: t(\r\n 'error_occured',\r\n 'An error seems to have occured. Please contact our help desk.'\r\n ),\r\n });\r\n },\r\n [toast, t]\r\n );\r\n\r\n /* This defaulting to 0 isnt optimal with this solution the fall \r\n back provided by the geoserver will not be utilised. */\r\n const defaultCenterMap: [number, number] = [\r\n caseDetails?.application?.easting ?? 0,\r\n caseDetails?.application?.northing ?? 0,\r\n ];\r\n\r\n const mapOverrides = {\r\n defaultCenter: defaultCenterMap,\r\n defaultZoom: 10,\r\n };\r\n\r\n const StyledMapCss = `\r\n height: 100%;\r\n width: 100%;\r\n @media only screen and (max-width: 768px) { \r\n max-width: 95vw;\r\n margin: 0 auto;\r\n }\r\n .ol-scale-line-override {\r\n left: 80%;\r\n }\r\n .layer-toggle {\r\n \r\n @media only screen and (max-width: 768px) { \r\n position: absolute;\r\n right: 10px;\r\n margin-top: 2rem;\r\n z-index: 2;\r\n bottom: unset;\r\n }\r\n }\r\n`;\r\n\r\n const mapComponent = () => (\r\n \r\n {showMap && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {isMobile && (\r\n \r\n {eastingNorthing()}\r\n \r\n )}\r\n \r\n );\r\n\r\n const noMapData = () => (\r\n <>\r\n \r\n {isMobile && (\r\n \r\n {eastingNorthing()}\r\n \r\n )}\r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n {!isMobile && heading()}\r\n {polygonData?.geoJson ? mapComponent() : noMapData()}\r\n \r\n \r\n {isMobile ? (\r\n exportOptions()\r\n ) : (\r\n <>\r\n {exportOptions()}\r\n {!isTQ && (\r\n <>\r\n \r\n {t('boundary_site_line', 'Boundary site line')}\r\n \r\n {eastingNorthing()}\r\n \r\n )}\r\n \r\n )}\r\n {!isRpc && (\r\n <>\r\n \r\n {t('constraints', 'Constraints')}\r\n \r\n \r\n {!constraints || constraints.length === 0 ? (\r\n {t('no_constraints_message', 'No data to display')}\r\n ) : (\r\n \r\n )}\r\n {constraints?.map((constraint, index) => (\r\n \r\n {constraint.description}\r\n \r\n ))}\r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { RefObject, useEffect, useState } from 'react';\r\n\r\nexport const useIsVisible = (ref: RefObject): boolean => {\r\n const [isIntersecting, setIntersecting] = useState(false);\r\n\r\n useEffect(() => {\r\n if (ref?.current) {\r\n const observer = new IntersectionObserver(([entry]) =>\r\n setIntersecting(entry.isIntersecting)\r\n );\r\n observer.observe(ref.current);\r\n return () => observer.disconnect();\r\n }\r\n }, [ref]);\r\n\r\n return isIntersecting;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n AttentionMessage,\r\n ResponsiveDataTable,\r\n Typography,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport { EmptyDataCard, hiddenTableHeaderLabel } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Consultation, Document } from 'types';\r\nimport { DocumentsMobileCard, useDocumentFilters } from '../Documents';\r\nimport { usePlansMenuOptions } from '../../hooks';\r\nimport { renderDocumentMenuActionButton } from '../../util';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport type PlansProps = {\r\n consultation?: Consultation;\r\n plans?: Document[];\r\n};\r\n\r\nexport const Plans: React.FC = ({ consultation, plans }) => {\r\n const { t } = useTranslation('case_details_plans');\r\n const options = usePlansMenuOptions();\r\n const { isNI } = useThemedValueSwitch();\r\n const isMobile = useIsMobile();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const filters = useDocumentFilters(plans, false);\r\n const filterColumnLayout = isMobile ? '100%' : '33% 65%';\r\n\r\n return (\r\n <>\r\n {isMobile && (\r\n \r\n

    {t('plans', 'Plans')}

    \r\n
    \r\n )}\r\n {!plans?.length ? (\r\n \r\n ) : (\r\n <>\r\n {isNI && (\r\n \r\n )}\r\n (\r\n \r\n )}\r\n filterColumnLayout={filterColumnLayout}\r\n filters={filters}\r\n initialState={{\r\n sortBy: [\r\n {\r\n id: 'datePublished',\r\n desc: true,\r\n },\r\n ],\r\n }}\r\n data={plans}\r\n columns={[\r\n {\r\n accessor: 'datePublished',\r\n Cell: (cellProps: { value: string }) => formatLocaleDate(cellProps.value),\r\n Header: () => t('date_published', 'Date published'),\r\n width: 181,\r\n },\r\n {\r\n accessor: 'documentType',\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('document_type', 'Document type'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'drawingNumber',\r\n disableSortBy: true,\r\n Header: () => t('drawing_number', 'Drawing number'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'description',\r\n disableSortBy: true,\r\n Header: () => t('document_description', 'Document description'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'actions',\r\n Cell: (cellProps: { row: { original: Document } }) =>\r\n renderDocumentMenuActionButton(\r\n consultation,\r\n options,\r\n cellProps.row.original\r\n ),\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('actions_label', 'actions')),\r\n width: 60,\r\n },\r\n ]}\r\n />\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FaDownload, FaEdit, FaEye } from 'react-icons/fa';\r\nimport { useFileDownload } from 'hooks';\r\nimport { MenuOption } from 'types';\r\nimport { useFeatureValue } from '@growthbook/growthbook-react';\r\nimport { GetApplicationDocumentRequest } from 'api';\r\n\r\nexport const usePlansMenuOptions = (): MenuOption[] => {\r\n const { t } = useTranslation('case_details_plans');\r\n const measurementTool = useFeatureValue('disable_consultee_measurement_tool', false);\r\n const { downloadApplicationDocument, openApplicationDocument, openMeasuringTool } =\r\n useFileDownload();\r\n\r\n const menuOptions = [\r\n {\r\n label: t('view_button', 'View'),\r\n icon: FaEye,\r\n onClick: (\r\n consultation: number | undefined,\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => openApplicationDocument(documentRequest),\r\n },\r\n {\r\n label: t('download_button', 'Download copy'),\r\n icon: FaDownload,\r\n onClick: (\r\n consultation: number | undefined,\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => downloadApplicationDocument(documentRequest),\r\n },\r\n ];\r\n\r\n if (!measurementTool) {\r\n const measuringToolOption = {\r\n label: t('measuring_tool_button', 'Measuring tool'),\r\n icon: FaEdit,\r\n onClick: (\r\n consultation: number | undefined,\r\n documentRequest: GetApplicationDocumentRequest | undefined\r\n ) => openMeasuringTool(consultation, documentRequest),\r\n };\r\n menuOptions.splice(1, 0, measuringToolOption);\r\n }\r\n\r\n return menuOptions;\r\n};\r\n","import React from 'react';\r\nimport { DetailsCardHeader, Grid, Link } from '@tq/ui-components';\r\n\r\nimport { PUBLIC_REGISTER_APPLICATION_URL } from 'config';\r\nimport { RelatedApplicationResponse } from 'types';\r\n\r\ntype RelatedApplicationCardHeaderProps = {\r\n relatedCase: RelatedApplicationResponse;\r\n};\r\n\r\nexport const RelatedApplicationCardHeader: React.FC = ({\r\n relatedCase,\r\n}) => {\r\n const FIRST_ROW_TEMPLATE = `\r\n \"link status\" \r\n / auto auto`;\r\n\r\n const getPublicRegisterUrl = (arn: string): string =>\r\n `${PUBLIC_REGISTER_APPLICATION_URL}${arn?.replaceAll('/', '_')}`;\r\n\r\n return (\r\n \r\n \r\n \r\n {relatedCase?.singleLineOfAddress ?? relatedCase?.address?.address}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { DetailsCard, DetailsCardFooter, Flex, Grid } from '@tq/ui-components';\r\n\r\nimport { RelatedApplicationResponse } from 'types';\r\nimport { ApplicationCardBody } from '../../ApplicationCard/ApplicationCardBody';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { renderCardLabelledValue } from 'components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { RelatedApplicationCardHeader } from './RelatedApplicationCardHeader';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport type RelatedApplicationCardProps = {\r\n relatedCase: RelatedApplicationResponse;\r\n textExpanded?: boolean;\r\n};\r\n\r\nexport const RelatedApplicationCard: React.FC = ({\r\n relatedCase,\r\n}) => {\r\n const { t } = useTranslation('case_details_related');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n \r\n \r\n {}}\r\n showExpanded={false}\r\n />\r\n \r\n \r\n \r\n {renderCardLabelledValue(\r\n t('application_reference', 'Application reference'),\r\n relatedCase.relatedApplicationReferenceNumber ?? '-'\r\n )}\r\n \r\n \r\n {renderCardLabelledValue(\r\n t('received', 'Received'),\r\n formatLocaleDate(relatedCase.dateReceived)\r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, ListRow, renderListRows } from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { AddressResponse } from 'types';\r\n\r\nexport type AddressDetailProps = {\r\n relatedAddress: AddressResponse;\r\n};\r\n\r\nexport const AddressDetail: React.FC = ({ relatedAddress }) => {\r\n const { t } = useTranslation('case_details_related');\r\n const isMobile = useIsMobile();\r\n const columnLayout = isMobile ? '35% 65%' : '30% 70%';\r\n const bodyRows = [\r\n {\r\n label: t('address_title', 'Address'),\r\n value: relatedAddress.address,\r\n },\r\n {\r\n label: t('postcode_title', 'Postcode'),\r\n value: relatedAddress.postcode,\r\n },\r\n {\r\n label: t('authority_title', 'Authority'),\r\n value: relatedAddress.authority,\r\n },\r\n ];\r\n return (\r\n \r\n \r\n {renderListRows(bodyRows, { fontSize: 'sm' })}\r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AttentionMessage, Box, DataTable, Grid, SimpleGrid, VStack } from '@tq/ui-components';\r\n\r\nimport { CardLayout, EmptyDataCard } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { AddressResponse, RelatedApplicationResponse } from 'types';\r\nimport { CaseDetailsProps } from '../../types';\r\nimport { RelatedApplicationCard } from './components';\r\nimport { AddressDetail } from './AddressDetail';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport const RelatedCases: React.FC = ({ caseDetails }) => {\r\n const { t } = useTranslation('case_details_related');\r\n const isMobile = useIsMobile();\r\n const [applications, setApplications] = useState([]);\r\n const [addresses, setAddresses] = useState([]);\r\n\r\n useEffect(() => {\r\n if (caseDetails?.relatedApplications) {\r\n setApplications(caseDetails.relatedApplications);\r\n setAddresses(caseDetails.relatedAddresses);\r\n }\r\n }, [caseDetails]);\r\n\r\n return (\r\n <>\r\n {isMobile && (\r\n \r\n )}\r\n \r\n \r\n {caseDetails?.relatedApplications?.length ? (\r\n <>\r\n {!isMobile && (\r\n \r\n )}\r\n (\r\n \r\n {applications.map(\r\n (application: RelatedApplicationResponse, index: number) => {\r\n return (\r\n \r\n );\r\n }\r\n )}\r\n \r\n )}\r\n />\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n {t('related_addresses', 'Related addresses')}\r\n \r\n (\r\n \r\n {addresses.map((address: AddressResponse, index: number) => {\r\n return (\r\n \r\n {address && }\r\n \r\n );\r\n })}\r\n \r\n )}\r\n />\r\n {!addresses?.length && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { useFeatureValue } from '@growthbook/growthbook-react';\r\nimport { useTabLabels } from './useTabLabels';\r\n\r\nexport const useCaseDetailsFeatures = (rpc: boolean): string[] => {\r\n const tabLabels = useTabLabels(rpc);\r\n if (\r\n useFeatureValue('disable_related_consultee_cases', false) &&\r\n tabLabels.indexOf('Related cases') !== -1\r\n ) {\r\n tabLabels.splice(tabLabels.indexOf('Related cases'), 1);\r\n }\r\n if (\r\n useFeatureValue('disable_consultee_comments', false) &&\r\n tabLabels.indexOf('Comments') !== -1\r\n ) {\r\n tabLabels.splice(tabLabels.indexOf('Comments'), 1);\r\n }\r\n\r\n return tabLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useTabLabels = (isRpc: boolean): string[] => {\r\n const { t } = useTranslation('case_details_tabs');\r\n return isRpc\r\n ? [t('map', 'Map'), t('documents', 'Documents')]\r\n : [\r\n t('details', 'Details'),\r\n t('map', 'Map'),\r\n t('related_cases', 'Related cases'),\r\n t('documents', 'Documents'),\r\n t('plans', 'Plans'),\r\n t('comments', 'Comments'),\r\n ];\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n AnimatedSpinner,\r\n Container,\r\n Flex,\r\n Grid,\r\n TabPanel,\r\n TabPanels,\r\n Tabs,\r\n} from '@tq/ui-components';\r\n\r\nimport { useCaseDetails, useConsultation } from 'api';\r\nimport { MobileTabList } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { isRpc, ToDisplayFeatureFlagged } from 'tools';\r\n\r\nimport {\r\n ApplicationDetails,\r\n CaseDetailsSummary,\r\n Comments,\r\n DesktopTabList,\r\n CaseDetailsHeader,\r\n Documents,\r\n MapDetails,\r\n Plans,\r\n RelatedCases,\r\n} from './components';\r\nimport { HttpError } from '../../types';\r\nimport { useNavigate } from '../../hooks';\r\nimport { useCaseDetailsFeatures } from './hooks/useCaseDetailsFeatures';\r\n\r\nexport const CaseDetails: React.FC = () => {\r\n const { id } = useParams();\r\n const { data: consultation, error, isError } = useConsultation(+(id ?? 0));\r\n const {\r\n data: caseDetails,\r\n isLoading,\r\n isLoadingError,\r\n isRefetchError,\r\n } = useCaseDetails(+(id ?? 0));\r\n const { navigateToErrorPage } = useNavigate();\r\n const rpc = isRpc(consultation);\r\n const isMobile = useIsMobile();\r\n const tabLabels = useCaseDetailsFeatures(rpc);\r\n const [tabIndex, setTabIndex] = useState(0);\r\n const tabPanelStyle = {\r\n border: { base: 'none', lg: `1px solid ${COLOURS.gray[400]}` },\r\n px: { base: 0, lg: 5 },\r\n py: { base: 0, lg: 4 },\r\n };\r\n const showSpinner = isLoading || isLoadingError || isRefetchError;\r\n\r\n useEffect(() => {\r\n if (isError && error) {\r\n navigateToErrorPage(error as HttpError);\r\n }\r\n }, [isError, error, navigateToErrorPage]);\r\n\r\n return showSpinner ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n {isMobile ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {!rpc && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {ToDisplayFeatureFlagged('disable_related_consultee_cases', true) && !rpc && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {!rpc && (\r\n \r\n \r\n \r\n )}\r\n {ToDisplayFeatureFlagged('disable_consultee_comments', true) && !rpc && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getCaseDetails, QueryDefaults } from 'api';\r\nimport { GetCaseDetailsResponse } from 'types';\r\n\r\nexport const useCaseDetails = (\r\n consultationId: number\r\n): UseQueryResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getCaseDetails, consultationId],\r\n () => getCaseDetails(consultationId),\r\n QueryDefaults\r\n );\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaFile } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Flex, Card, SkeletonText, FormLabel, Text, Button, Grid } from '@tq/ui-components';\r\n\r\nimport { useFileDownload } from 'hooks';\r\nimport { ConsultationResponseDocument } from 'types';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\n\r\nexport type UploadedDocumentCardProps = {\r\n uploadedDocuments: ConsultationResponseDocument[];\r\n consultationId: number;\r\n responseId: number;\r\n};\r\n\r\nexport const UploadedDocumentCard: React.FC = ({\r\n uploadedDocuments,\r\n consultationId,\r\n responseId,\r\n}) => {\r\n const { t } = useTranslation('case_details_card');\r\n const { openResponseDocument } = useFileDownload();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n if (!uploadedDocuments) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {uploadedDocuments.map((document) => (\r\n \r\n \r\n \r\n \r\n {t('document', 'Document')}:\r\n \r\n \r\n \r\n \r\n {document.name}\r\n \r\n \r\n \r\n {t('uploaded', 'Uploaded')}:\r\n \r\n {formatLocaleDate(document.dateModified, StandardDateFormats.dateAndTime)}\r\n \r\n \r\n \r\n openResponseDocument({\r\n consultationId: consultationId,\r\n responseId: responseId,\r\n documentId: document.id,\r\n })\r\n }\r\n >\r\n {t('view', 'View')}\r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Card, Divider, FormLabel, SkeletonText } from '@tq/ui-components';\r\n\r\nimport { Consultation, PastResponse } from 'types';\r\nimport { UploadedDocumentCard } from '../UploadedDocumentCard';\r\n\r\nexport type ArchivedPastResponseCardProps = {\r\n response: PastResponse | undefined;\r\n consultation: Consultation | undefined;\r\n};\r\nexport const ArchivedPastResponseCard: React.FC = ({\r\n response,\r\n consultation,\r\n}) => {\r\n const { t } = useTranslation('archived_details_view');\r\n\r\n if (!response) {\r\n return ;\r\n }\r\n\r\n return (\r\n \r\n {t('response_type', 'Response type')}\r\n {response.type}\r\n {!!response.response?.length && (\r\n <>\r\n \r\n {t('summary', 'Summary')}\r\n \r\n

    {response.response}

    \r\n \r\n )}\r\n {!!response.reasonForLateResponse && (\r\n <>\r\n \r\n {t('reason_for_late_response', 'Reason for late response')}\r\n \r\n

    \r\n {response.reasonForLateResponse}\r\n {response.reasonForLateResponseDetail &&\r\n ` - ${response.reasonForLateResponseDetail}`}\r\n

    \r\n \r\n )}\r\n\r\n {(!!response.document || !!response.supportingDocuments.length) && }\r\n\r\n {!!response.document && consultation?.id && (\r\n <>\r\n {t('uploaded_response', 'Uploaded response')}\r\n \r\n \r\n )}\r\n\r\n {!!response.supportingDocuments.length && consultation?.id && (\r\n \r\n \r\n {t('uploaded_supporting_documents', 'Uploaded supporting documents')}\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\ntype useResponseTypeDescriptionReturn = {\r\n getResponseTypeDescription: (responseType: string | undefined) => string | undefined;\r\n};\r\n\r\nexport const useResponseTypeDescription = (): useResponseTypeDescriptionReturn => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const getResponseTypeDescription = (\r\n responseType: string | undefined\r\n ): string | undefined => {\r\n const responseDescriptions: Record string | undefined> = {\r\n 'No response': () =>\r\n t('response_type_description_no_response', 'The consultee has no response to make.'),\r\n Content: () =>\r\n t(\r\n 'response_type_description_content',\r\n 'On the basis of the information available, the consultee is content with the development as proposed or content subject to conditions.'\r\n ),\r\n Advice: () =>\r\n t(\r\n 'response_type_description_advice',\r\n 'The planning authority is provided with advice to enable the determination of the application. This could include that the proposal is contrary to policy in its present form.'\r\n ),\r\n 'Standing advice': () =>\r\n t(\r\n 'response_type_description_standing_advice',\r\n 'The planning authority is referred to current standing advice by the consultee on the subject of the consultation.'\r\n ),\r\n 'Consulted in error': () =>\r\n t(\r\n 'response_type_description_consulted_in_error',\r\n 'The consultee considers they were consulted in error and will not be providing a response.'\r\n ),\r\n 'More information required': () =>\r\n t(\r\n 'response_type_description_more_information_required',\r\n 'More information is needed to make a determination on the application.'\r\n ),\r\n Supportive: () =>\r\n t(\r\n 'response_type_description_supportive',\r\n 'On the basis of the information available, the consultee is supportive with the development as proposed or supportive subject to conditions.'\r\n ),\r\n Unsupportive: () =>\r\n t(\r\n 'response_type_description_unsupportive',\r\n 'On the basis of the information available, the consultee is unsupportive with the development as proposed or unsupportive subject to conditions.'\r\n ),\r\n 'For comment': () =>\r\n t(\r\n 'response_type_description_for_comment',\r\n 'The consultee would like to make a comment about the application.'\r\n ),\r\n 'For information': () =>\r\n t(\r\n 'response_type_description_for_information',\r\n 'The consultee would like to provide information about the application.'\r\n ),\r\n 'No comment': () =>\r\n t('response_type_description_no_comment', 'The consultee has no comment to make.'),\r\n 'Consultation not required': () =>\r\n t(\r\n 'response_type_description_not_required',\r\n 'The consultee considers that a consultation is not required.'\r\n ),\r\n '': () => '',\r\n };\r\n return responseType ? responseDescriptions[responseType]?.() : '';\r\n };\r\n\r\n return {\r\n getResponseTypeDescription,\r\n };\r\n};\r\n","import { ConsultationResponseAnswer } from '../../../../types';\r\n\r\n/**\r\n * The function `sortAnswers` sorts an array of `ConsultationResponseAnswer` objects based on their\r\n * `questionNumber` and `id` properties.\r\n * @param {ConsultationResponseAnswer} answerA - The parameter `answerA` is of type\r\n * `ConsultationResponseAnswer`. It represents one answer to a consultation response.\r\n * @param {ConsultationResponseAnswer} answerB - The `answerB` parameter is of type\r\n * `ConsultationResponseAnswer`. It represents one of the answers given in a consultation response.\r\n * @returns The function `sortAnswers` returns a number.\r\n */\r\nexport const sortAnswers = (\r\n answerA: ConsultationResponseAnswer,\r\n answerB: ConsultationResponseAnswer\r\n): number => {\r\n if (answerA.questionNumber > answerB.questionNumber) return 1;\r\n if (answerA.questionNumber < answerB.questionNumber) return -1;\r\n return (answerA?.id ?? 0) > (answerB?.id ?? 0) ? 1 : -1;\r\n};\r\n","import { useResetRecoilState } from 'recoil';\r\n\r\nimport {\r\n reasonForLateReasonIsOtherState,\r\n reasonForLateResponseDetailState,\r\n reasonForLateResponseIdState,\r\n responseDetailState,\r\n responseFilesState,\r\n responseSupportingFilesState,\r\n responseTypeIdIsConsultedInErrorState,\r\n responseTypeIdState,\r\n} from 'store';\r\n\r\n/**\r\n * The `useResetResponseFormState` function is a custom hook in TypeScript that handles the logic for\r\n * resetting the response form states.\r\n */\r\nexport const useResetResponseFormState = (): { resetForm: () => void } => {\r\n const resetResponseTypeIdIsConsultedInError = useResetRecoilState(\r\n responseTypeIdIsConsultedInErrorState\r\n );\r\n const resetResponseTypeId = useResetRecoilState(responseTypeIdState);\r\n const resetResponseDetail = useResetRecoilState(responseDetailState);\r\n const resetReasonForLateReasonIsOther = useResetRecoilState(reasonForLateReasonIsOtherState);\r\n const resetReasonForLateResponseId = useResetRecoilState(reasonForLateResponseIdState);\r\n const resetReasonForLateResponseDetail = useResetRecoilState(\r\n reasonForLateResponseDetailState\r\n );\r\n const resetResponseFiles = useResetRecoilState(responseFilesState);\r\n const resetSupportingFiles = useResetRecoilState(responseSupportingFilesState);\r\n\r\n const resetForm = () => {\r\n resetResponseTypeIdIsConsultedInError();\r\n resetResponseTypeId();\r\n resetResponseDetail();\r\n resetReasonForLateReasonIsOther();\r\n resetReasonForLateResponseId();\r\n resetReasonForLateResponseDetail();\r\n resetResponseFiles();\r\n resetSupportingFiles();\r\n };\r\n\r\n return {\r\n resetForm,\r\n };\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useBanner } from '@tq/ui-components';\r\n\r\nimport { useConsultation, useResponses, useSubmitResponse } from 'api';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useNavigate } from 'hooks';\r\nimport {\r\n permissionValuesState,\r\n reasonForLateResponseState,\r\n responseTypeIdIsConsultedInErrorState,\r\n useResponseFilesState,\r\n} from 'store';\r\nimport { isOverdue, isRpc, isInspection } from 'tools';\r\nimport { useResponseTypeDescription } from './useResponseTypeDescription';\r\nimport { GetResponsesConsultationResponse } from '../../../api/responses/types/GetResponsesConsultationResponse';\r\nimport { UseResponseReturn } from './types/UseResponseReturn';\r\nimport { canSubmitStandard } from './fragments/canSubmitStandard';\r\nimport { canSubmitAnswers } from './fragments/canSubmitAnswers';\r\nimport { sortAnswers } from './fragments/sortAnswers';\r\nimport { getAnswers } from './fragments/getAnswers';\r\nimport { getPastResponses } from './fragments/getPastResponses';\r\nimport { useResetResponseFormState } from './useResetResponseFormState';\r\n\r\n/**\r\n * The `useResponse` function is a custom hook in TypeScript that handles the logic for submitting a\r\n * response to a consultation, including handling different response types and validation checks.\r\n * @param {number} consultationId - The `consultationId` parameter is the unique identifier of the\r\n * consultation for which the response is being handled.\r\n * @returns The function `useResponse` returns an object with the following properties:\r\n */\r\nexport const useResponse = (consultationId: number): UseResponseReturn => {\r\n const { t } = useTranslation('consultation_response');\r\n const { getResponseTypeDescription } = useResponseTypeDescription();\r\n const banner = useBanner();\r\n const { navigateToDashboard } = useNavigate();\r\n\r\n const { consulteeId, consulteeName, consulteeOrganisationIds } =\r\n useRecoilValue(permissionValuesState);\r\n const responseTypeIdIsConsultedInError = useRecoilValue(\r\n responseTypeIdIsConsultedInErrorState\r\n );\r\n const { responseTypeId, responseDetail, responseFiles, supportingFiles, requiredFiles } =\r\n useRecoilValue(useResponseFilesState);\r\n\r\n const { reasonForLateReasonIsOther, reasonForLateResponseId, reasonForLateResponseDetail } =\r\n useRecoilValue(reasonForLateResponseState);\r\n\r\n const { resetForm } = useResetResponseFormState();\r\n\r\n const { data: consultation, isLoading: isLoadingConsultation } =\r\n useConsultation(consultationId);\r\n const { data: responsesData, isLoading: isLoadingResponse } = useResponses(consultationId);\r\n const { mutate: submitResponseApi } = useSubmitResponse();\r\n\r\n const isRpcResponse = isRpc(consultation);\r\n const isInspectionResponse = isInspection(consultation);\r\n const isOverdueResponse = isOverdue(consultation);\r\n const isRespondedStatus = consultation?.status === 'Responded';\r\n const response = responsesData?.responses.find(\r\n (resp) => !resp.submittedDate && resp.consultationId === consultationId\r\n );\r\n const isRpcInspection = isRpcResponse || isInspectionResponse;\r\n const canSubmitIfLateResponse =\r\n !isOverdueResponse ||\r\n (!!reasonForLateResponseId &&\r\n (!reasonForLateReasonIsOther || !!reasonForLateResponseDetail));\r\n\r\n const buildResponseRequest = () => {\r\n return {\r\n consultationId: response?.consultationId ?? 0,\r\n responseId: response?.id ?? 0,\r\n responseTypeId,\r\n responseDetail,\r\n reasonForLateResponseId,\r\n reasonForLateResponseDetail,\r\n documents: [\r\n ...(responseFiles?.map((file) => ({\r\n name: file.file.name,\r\n path: file.uri,\r\n response: true,\r\n })) ?? []),\r\n ...(supportingFiles?.map((file) => ({\r\n name: file.file.name,\r\n path: file.uri,\r\n response: false,\r\n })) ?? []),\r\n ],\r\n };\r\n };\r\n\r\n const submitResponse = () => {\r\n if (!response) return;\r\n submitResponseApi(buildResponseRequest(), {\r\n onSuccess: () => {\r\n resetForm();\r\n banner({\r\n id: 'submit-response-banner',\r\n title: t('response_submitted', 'Response submitted successfully'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n navigateToDashboard();\r\n },\r\n onError: () =>\r\n banner({\r\n id: 'submit-response-failed-banner',\r\n title: t('response_submission_failed', 'Response submission failed'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n }),\r\n });\r\n };\r\n\r\n const filterResponses = (responses: GetResponsesConsultationResponse[] | undefined) => {\r\n return (\r\n responses\r\n ?.filter((resp) => resp.submittedDate)\r\n .flatMap((resp) => resp.answers)\r\n .sort(sortAnswers) ?? []\r\n );\r\n };\r\n\r\n const submittedAnswers = isRpcInspection ? filterResponses(responsesData?.responses) : null;\r\n\r\n const otherSubmittedAnswers = isRpcInspection\r\n ? filterResponses(responsesData?.otherResponses)\r\n : null;\r\n\r\n const pastAnswers = submittedAnswers?.filter((answer) =>\r\n consulteeOrganisationIds.includes(answer.organisation?.id)\r\n );\r\n\r\n const answers = consultation\r\n ? getAnswers(consultation, response, consulteeId, consulteeName)\r\n : [];\r\n\r\n const pastResponses = getPastResponses(responsesData, getResponseTypeDescription);\r\n\r\n const canSubmit =\r\n consultation && (isRpcResponse || isInspectionResponse)\r\n ? canSubmitAnswers(isRespondedStatus, consultation, canSubmitIfLateResponse, answers)\r\n : canSubmitStandard(\r\n isRespondedStatus,\r\n canSubmitIfLateResponse,\r\n responseTypeId,\r\n responseTypeIdIsConsultedInError,\r\n responseDetail,\r\n responseFiles,\r\n requiredFiles\r\n );\r\n\r\n return {\r\n isLoading: isLoadingConsultation || isLoadingResponse || !consultation || !responsesData,\r\n response,\r\n pastResponses,\r\n answers: answers ?? [],\r\n pastAnswers: pastAnswers ?? [],\r\n otherAnswers: otherSubmittedAnswers ?? [],\r\n canSubmit,\r\n canSubmitIfLateResponse,\r\n submitResponse,\r\n resetForm,\r\n };\r\n};\r\n","import {\r\n Consultation,\r\n ConsultationResponse,\r\n ConsultationResponseAnswer,\r\n} from '../../../../types';\r\n\r\n/**\r\n * The function `getAnswers` takes in a consultation, a response, a consultee ID, and a consultee\r\n * name, and returns an array of consultation response answers.\r\n * @param {Consultation} consultation - The consultation object that contains the questions for the\r\n * consultation.\r\n * @param {ConsultationResponse | undefined} response - The `response` parameter is of type\r\n * `ConsultationResponse | undefined`. It represents the response given by the consultee to the\r\n * consultation. It can be either a valid `ConsultationResponse` object or `undefined` if no response\r\n * has been given yet.\r\n * @param {number} consulteeId - The ID of the consultee who is providing the consultation response.\r\n * @param {string} consulteeName - The `consulteeName` parameter is a string that represents the name\r\n * of the consultee.\r\n */\r\nexport const getAnswers = (\r\n consultation: Consultation,\r\n response: ConsultationResponse | undefined,\r\n consulteeId: number,\r\n consulteeName: string\r\n): ConsultationResponseAnswer[] =>\r\n consultation.questions.map((question) => {\r\n const answer = response?.answers.find((a) => a.questionId === question.id);\r\n return {\r\n id: answer?.id,\r\n responseId: response?.id,\r\n consulteeId: answer?.consulteeId ?? consulteeId,\r\n consulteeName: answer?.consulteeName ?? consulteeName,\r\n questionId: question.id,\r\n question: answer?.question ?? question.text,\r\n answer: answer?.answer ?? question.defaultAnswer,\r\n approved: answer?.approved ?? false,\r\n questionNumber: answer?.questionNumber ?? question.questionNumber,\r\n dateCreated: answer?.dateCreated,\r\n dateModified: answer?.dateModified,\r\n dateApproved: answer?.dateApproved,\r\n organisation: answer?.organisation,\r\n };\r\n });\r\n","import { PastResponse } from '../../../../types';\r\nimport { GetResponsesResponse } from '../../../../api';\r\n\r\nexport const getPastResponses = (\r\n responsesData: GetResponsesResponse | undefined,\r\n typeFunc: (responseType: string | undefined) => string | undefined\r\n): PastResponse[] => {\r\n return responsesData\r\n ? responsesData.responses\r\n .filter((resp) => resp.submittedDate)\r\n .map((resp) => ({\r\n id: resp.id,\r\n type: resp.responseType,\r\n typeDefinition: typeFunc(resp.responseType),\r\n responseDate: resp.submittedDate,\r\n response: resp.response ?? '',\r\n reasonForLateResponse: resp.reasonForLateResponse,\r\n reasonForLateResponseDetail: resp.reasonForLateResponseDetail,\r\n document: resp.documents.find((doc) => doc.response),\r\n supportingDocuments: resp.documents.filter((doc) => !doc.response),\r\n }))\r\n : [];\r\n};\r\n","import { Consultation, ConsultationResponseAnswer } from '../../../../types';\r\n\r\n/**\r\n * The function `canSubmitAnswers` checks if a consultation response can be submitted based on various\r\n * conditions.\r\n * @param {boolean} isRespondedStatus - A boolean value indicating whether the consultation has already\r\n * been responded to.\r\n * @param {Consultation} consultation - The `consultation` parameter is an object that represents a\r\n * consultation. It likely contains information such as the consultation ID, the questions asked, and\r\n * any other relevant details.\r\n * @param {boolean} canSubmitIfLateResponse - A boolean value indicating whether the submission can be\r\n * made even if the response is late.\r\n * @param {ConsultationResponseAnswer[]} answers - An array of ConsultationResponseAnswer objects,\r\n * which represent the answers provided by the user for each question in the consultation.\r\n * @returns a boolean value.\r\n */\r\nexport const canSubmitAnswers = (\r\n isRespondedStatus: boolean,\r\n consultation: Consultation,\r\n canSubmitIfLateResponse: boolean,\r\n answers: ConsultationResponseAnswer[]\r\n): boolean => {\r\n const allAnswersApproved =\r\n consultation.questions.length === answers.length &&\r\n answers.every((answer) => answer.approved);\r\n\r\n return canSubmitIfLateResponse && allAnswersApproved && !isRespondedStatus;\r\n};\r\n","import { UploadedFile } from '../../../../types';\r\n\r\n/**\r\n * The function `canSubmitStandard` determines if a standard submission can be made based on various\r\n * conditions.\r\n * @param {boolean} isRespondedStatus - A boolean value indicating whether the response status is\r\n * already responded or not.\r\n * @param {boolean} canSubmitIfLateResponse - A boolean value indicating whether the submission can be\r\n * made even if the response is late.\r\n * @param {number | undefined} responseTypeId - The `responseTypeId` parameter is a number or\r\n * undefined. It represents the type of response for a particular submission.\r\n * @param {boolean} responseTypeIdIsConsultedInError - A boolean value indicating whether the response\r\n * type ID is consulted in error.\r\n * @param {string | undefined} responseDetail - A string representing the response detail.\r\n * @param {UploadedFile[] | undefined} responseFiles - An array of uploaded files that are part of the\r\n * response.\r\n * @param {boolean | undefined} requiredFiles - A boolean value indicating whether the submission\r\n * requires files to be attached\r\n */\r\nexport const canSubmitStandard = (\r\n isRespondedStatus: boolean,\r\n canSubmitIfLateResponse: boolean,\r\n responseTypeId: number | undefined,\r\n responseTypeIdIsConsultedInError: boolean,\r\n responseDetail: string | undefined,\r\n responseFiles: UploadedFile[] | undefined,\r\n requiredFiles: boolean | undefined\r\n): boolean =>\r\n canSubmitIfLateResponse &&\r\n !isRespondedStatus &&\r\n !!responseTypeId &&\r\n (!responseTypeIdIsConsultedInError || !!responseDetail) &&\r\n (requiredFiles ? !!responseFiles?.length : true);\r\n","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { DesktopResponses, MobileResponses } from '..';\r\nimport { useResponse } from '../../hooks';\r\n\r\nexport const ArchivedConsultationResponse: React.FC = () => {\r\n const { id } = useParams();\r\n const consultationId = +(id ?? 0);\r\n const { data: consultation, isLoading, isInitialLoading } = useConsultation(consultationId);\r\n const { pastResponses, otherAnswers, pastAnswers } = useResponse(consultationId);\r\n\r\n const isMobile = useIsMobile();\r\n\r\n if (isMobile) {\r\n return (\r\n \r\n );\r\n } else {\r\n return (\r\n \r\n );\r\n }\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button, FormLabel, Grid, Text, Typography } from '@tq/ui-components';\r\n\r\nimport { NumberBox } from 'components';\r\nimport { ConsultationResponseAnswer } from 'types';\r\nimport { FaChevronRight } from 'react-icons/fa';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ntype RpcOtherResponseProps = {\r\n answer: ConsultationResponseAnswer;\r\n};\r\n\r\nexport const RpcOtherResponseAnswers: React.FC = ({ answer }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const [showAnswer, setShowAnswer] = useState(false);\r\n const handleShowAnswer = () => {\r\n setShowAnswer(!showAnswer);\r\n };\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n <>\r\n \r\n \r\n {t('question_text', 'Question')}\r\n \r\n \r\n \r\n {answer.question}\r\n \r\n \r\n \r\n \r\n }\r\n onClick={handleShowAnswer}\r\n >\r\n {!showAnswer && t('show_answer', 'Show answer')}\r\n {showAnswer && t('hide_answer', 'Hide answer')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('responded_text', 'Responded')}:\r\n \r\n {formatLocaleDate(answer.dateCreated)}\r\n \r\n \r\n \r\n {t('by_text', 'By')}:\r\n \r\n {answer.consulteeName}\r\n \r\n \r\n \r\n {!showAnswer && t('show_answer', 'Show answer')}\r\n {showAnswer && t('hide_answer', 'Hide answer')}\r\n \r\n \r\n \r\n {showAnswer && (\r\n <>\r\n \r\n {t('answer', 'Answer')}\r\n {answer.answer}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button, FormLabel, Grid, Typography } from '@tq/ui-components';\r\n\r\nimport { NumberBox } from 'components';\r\nimport { ConsultationResponseAnswer } from 'types';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ntype RpcOtherResponseProps = {\r\n answer: ConsultationResponseAnswer;\r\n};\r\n\r\nexport const RpcOtherResponse: React.FC = ({ answer }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const [showAnswer, setShowAnswer] = useState(false);\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const handleShowAnswer = () => {\r\n setShowAnswer(!showAnswer);\r\n };\r\n return (\r\n <>\r\n \r\n \r\n \r\n {!showAnswer && t('show_answer', 'Show answer')}\r\n {showAnswer && t('hide_answer', 'Hide answer')}\r\n \r\n {t('question_text', 'Question')}\r\n \r\n \r\n \r\n {answer.question}\r\n \r\n {!showAnswer && t('show_answer', 'Show answer')}\r\n {showAnswer && t('hide_answer', 'Hide answer')}\r\n \r\n \r\n \r\n {showAnswer && (\r\n <>\r\n \r\n {t('answer', 'Answer')}\r\n {answer.answer}\r\n \r\n \r\n \r\n {t('added_text', 'Added')}:\r\n \r\n {formatLocaleDate(answer.dateCreated)}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { RpcOtherResponseAnswers } from '../RpcOtherResponse/RpcOtherResponseAnswers';\r\nimport { RpcOtherResponse } from '../RpcOtherResponse';\r\nimport { ConsultationResponseAnswer } from 'types';\r\n\r\nexport const ArchivedRpcResponses: React.FC<{\r\n otherAnswers: ConsultationResponseAnswer[];\r\n pastAnswers: ConsultationResponseAnswer[];\r\n}> = ({ otherAnswers, pastAnswers }) => {\r\n const { t } = useTranslation('consultation_response');\r\n return (\r\n <>\r\n <>\r\n \r\n \r\n

    \r\n {t('from_your_organisation_response', 'From your organisation')}\r\n

    \r\n
    \r\n \r\n {pastAnswers.map((answer) => (\r\n \r\n ))}\r\n {!pastAnswers?.length && (\r\n \r\n {t('no_other_answers_message', 'No responses to display')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n

    \r\n \r\n {t('other_organisation_responses', 'Other organisation responses')}\r\n \r\n

    \r\n
    \r\n \r\n {otherAnswers.map((answer) => (\r\n \r\n ))}\r\n {!otherAnswers?.length && (\r\n \r\n {t('no_other_answers_message', 'No responses to display')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box, Button, VStack, Flex, Text, Heading, Card } from '@tq/ui-components';\r\n\r\nimport { PastResponse } from 'types';\r\nimport { useFormatLocaleDate } from '../../../../config';\r\n\r\nexport const ResponseMobileCard: React.FC<\r\n Pick\r\n> = ({ type, response, responseDate }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n return (\r\n \r\n \r\n \r\n \r\n {t('response_type', 'Response type')}\r\n \r\n {type}\r\n \r\n \r\n \r\n \r\n \r\n {t('summary', 'Summary')}\r\n \r\n {response}\r\n \r\n \r\n \r\n {t('response_date', 'Response date')}\r\n \r\n {formatLocaleDate(responseDate)}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { CellProps } from 'react-table';\r\nimport { Button, ResponsiveDataTable } from '@tq/ui-components';\r\n\r\nimport { hiddenTableHeaderLabel } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport { PastResponse } from 'types';\r\nimport { ResponseMobileCard } from '../ResponseMobileCard';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ntype ArchivedResponsesDataTableProps = {\r\n consultationId: number | undefined;\r\n pastResponses: PastResponse[];\r\n};\r\n\r\nexport const ArchivedResponsesDataTable: React.FC = ({\r\n consultationId,\r\n pastResponses,\r\n}) => {\r\n const { t } = useTranslation('consultation_response');\r\n const { navigateToArchivedResponse } = useNavigate();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n (\r\n \r\n )}\r\n columns={[\r\n {\r\n accessor: 'type',\r\n disableSortBy: true,\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('response_type', 'Response type'),\r\n width: '170px',\r\n },\r\n {\r\n accessor: 'responseDate',\r\n Cell: (cellProps: { value: string }) => formatLocaleDate(cellProps.value),\r\n Header: () => t('response_date', 'Response date'),\r\n width: '200px',\r\n },\r\n {\r\n accessor: 'response',\r\n disableSortBy: true,\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('summary', 'Summary'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'id',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n \r\n consultationId && navigateToArchivedResponse(consultationId, original.id)\r\n }\r\n >\r\n {t('view_response', 'View response')}\r\n \r\n ),\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('view_label', 'view')),\r\n width: 20,\r\n },\r\n ]}\r\n />\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box, Heading, Flex, Link } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { PastResponse, Consultation, ConsultationResponseAnswer } from 'types';\r\nimport { Notes, NotesHeading } from 'components';\r\nimport { ArchivedRpcResponses } from '../ArchivedRpcResponses';\r\nimport { ArchivedResponsesDataTable } from '../ArchivedResponsesDataTable';\r\nimport { isRpc } from 'tools';\r\n\r\nexport const DesktopResponses: React.FC<{\r\n pastResponses: PastResponse[];\r\n pastAnswers: ConsultationResponseAnswer[];\r\n otherAnswers: ConsultationResponseAnswer[];\r\n isLoading: boolean;\r\n consultation?: Consultation;\r\n}> = ({ isLoading, pastResponses, consultation, pastAnswers, otherAnswers }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const [isShowingNotes, setIsShowingNotes] = useState(false);\r\n const notes = consultation?.notes || [];\r\n\r\n const notesSection = (\r\n \r\n \r\n <>\r\n \r\n\r\n setIsShowingNotes(false)}>\r\n {t('hide', 'Hide')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n const isRpcResponse = isRpc(consultation);\r\n return (\r\n \r\n \r\n \r\n \r\n {t('responses', 'Responses')}\r\n \r\n\r\n {!isShowingNotes && (\r\n setIsShowingNotes(true)}>\r\n {t('show_notes', 'Show notes')}\r\n \r\n )}\r\n \r\n {isRpcResponse ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {isShowingNotes && notesSection}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box, Tabs, TabList, Tab, TabText, TabPanel, TabPanels } from '@tq/ui-components';\r\n\r\nimport { PastResponse, Consultation, ConsultationResponseAnswer } from 'types';\r\nimport { Notes, NotesInfoMessage } from 'components';\r\nimport { ArchivedRpcResponses } from '../ArchivedRpcResponses';\r\nimport { ArchivedResponsesDataTable } from '../ArchivedResponsesDataTable';\r\nimport { isRpc } from 'tools';\r\n\r\nexport const MobileResponses: React.FC<{\r\n pastResponses: PastResponse[];\r\n consultation?: Consultation;\r\n pastAnswers: ConsultationResponseAnswer[];\r\n otherAnswers: ConsultationResponseAnswer[];\r\n isLoading: boolean;\r\n}> = ({ isLoading, pastResponses, consultation, pastAnswers, otherAnswers }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const isRpcResponse = isRpc(consultation);\r\n const notes = consultation?.notes || [];\r\n return (\r\n \r\n \r\n \r\n {t('responses', 'Responses')}\r\n \r\n \r\n {t('notes', 'Notes')}\r\n \r\n \r\n \r\n \r\n {isRpcResponse ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport {\r\n AnimatedSpinner,\r\n Box,\r\n Button,\r\n Flex,\r\n Grid,\r\n Link,\r\n Tab,\r\n TabList,\r\n TabPanel,\r\n TabPanels,\r\n Tabs,\r\n TabText,\r\n VStack,\r\n} from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Form, FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { AddNote, AddNoteButton, Notes, NotesHeading, NotesInfoMessage } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport { isInspection, isRpc } from 'tools';\r\n\r\nimport {\r\n PastResponses,\r\n StandardResponse,\r\n RpcOtherResponses,\r\n RpcPastResponses,\r\n RpcResponse,\r\n} from '../../components';\r\nimport { useResponse } from '../../hooks';\r\n\r\nexport const OpenConsultationResponse: React.FC = () => {\r\n const { t } = useTranslation('consultation_response');\r\n const { navigateToSummary } = useNavigate();\r\n\r\n const { id } = useParams();\r\n const consultationId = +(id ?? 0);\r\n const { data: consultation, isLoading } = useConsultation(consultationId);\r\n const isMobile = useIsMobile();\r\n\r\n const [isShowingNotes, setIsShowingNotes] = useState(false);\r\n const { canSubmit, submitResponse } = useResponse(consultationId);\r\n\r\n const isRpcOrInspection = isRpc(consultation) || isInspection(consultation);\r\n\r\n const notesSection = (\r\n \r\n \r\n {isMobile ? (\r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n \r\n setIsShowingNotes(false)}>\r\n {t('hide', 'Hide')}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n {t('my_response', 'My response')}\r\n \r\n \r\n {t('past_responses', 'Past responses')}\r\n \r\n {isMobile && (\r\n \r\n setIsShowingNotes(true)}>\r\n {t('notes', 'Notes')}\r\n \r\n \r\n )}\r\n {!isMobile && (\r\n \r\n {!isShowingNotes && (\r\n setIsShowingNotes(true)}>\r\n {t('show_notes', 'Show notes')}\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n {consultation &&\r\n (isRpcOrInspection ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n \r\n {consultation &&\r\n (isRpcOrInspection ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n {isMobile && (\r\n \r\n {isShowingNotes ? notesSection : null}\r\n \r\n )}\r\n \r\n {isRpcOrInspection && !isShowingNotes && }\r\n \r\n \r\n
    \r\n
    \r\n {isShowingNotes && !isMobile && {notesSection}}\r\n
    \r\n {isMobile ? (\r\n \r\n \r\n {t('submit', 'Submit')}\r\n \r\n consultation && navigateToSummary(consultation.id)}\r\n >\r\n {t('back_to_summary', 'Summary')}\r\n \r\n \r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaFileWord } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Box,\r\n Button,\r\n DataTable,\r\n Grid,\r\n GridItem,\r\n HStack,\r\n Text,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { EmptyDataCard, hiddenTableHeaderLabel } from 'components';\r\nimport { useFileDownload } from 'hooks';\r\nimport { Consultation, PastResponse } from 'types';\r\nimport { useResponse } from '../../hooks';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nexport type PastResponseProps = {\r\n consultation: Consultation;\r\n hideTypeDefinition: boolean;\r\n};\r\n\r\nexport const PastResponses: React.FC = ({\r\n consultation,\r\n hideTypeDefinition = false,\r\n}) => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const { tvs } = useThemedValueSwitch();\r\n const isMobile = useIsMobile();\r\n const { pastResponses } = useResponse(consultation.id);\r\n const { openResponseDocument } = useFileDownload();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const fileName = (response: PastResponse) => (\r\n \r\n \r\n \r\n {response.document?.name}\r\n \r\n \r\n );\r\n\r\n const handleOpenDocument = (pastResponse: PastResponse) =>\r\n pastResponse.document?.id &&\r\n openResponseDocument({\r\n consultationId: consultation.id,\r\n responseId: pastResponse.id,\r\n documentId: pastResponse.document.id,\r\n });\r\n\r\n const renderMobile = pastResponses?.length ? (\r\n <>\r\n {pastResponses.map((pastResponse) => (\r\n \r\n \r\n \r\n handleOpenDocument(pastResponse)}\r\n >\r\n {t('consultation_view', 'View')}\r\n \r\n {t('response_type', 'Response type')}\r\n \r\n {pastResponse.type}\r\n \r\n \r\n \r\n {t('response_document', 'Response document')}\r\n
    \r\n
    \r\n {fileName(pastResponse)}\r\n
    \r\n \r\n \r\n {t('response_date', 'Response date')}\r\n
    \r\n
    \r\n {formatLocaleDate(pastResponse.responseDate)}\r\n
    \r\n \r\n ))}\r\n \r\n ) : (\r\n \r\n \r\n \r\n );\r\n\r\n const renderDesktop = (\r\n <>\r\n {pastResponses?.length ? (\r\n t('response_type', 'Response type'),\r\n disableSortBy: true,\r\n width: 160,\r\n },\r\n ...(hideTypeDefinition\r\n ? []\r\n : [\r\n {\r\n accessor: 'typeDefinition',\r\n Header: () => t('response_type_definition', 'Response type definition'),\r\n disableSortBy: true,\r\n width: 'auto',\r\n },\r\n ]),\r\n {\r\n accessor: 'documentName',\r\n Header: () => t('response_document', 'Response document'),\r\n disableSortBy: true,\r\n width: 210,\r\n Cell: (cellProps: { row: { original: PastResponse } }) =>\r\n fileName(cellProps.row.original),\r\n },\r\n {\r\n accessor: 'responseDate',\r\n Header: () => t('response_date', 'Response date'),\r\n Cell: (cellProps: { value: string }) => formatLocaleDate(cellProps.value),\r\n width: 190,\r\n },\r\n {\r\n accessor: 'documentId',\r\n disableSortBy: true,\r\n Header: () => hiddenTableHeaderLabel(t('document_label', 'document id')),\r\n width: 100,\r\n Cell: (cellProps: { row: { original: PastResponse } }) => (\r\n handleOpenDocument(cellProps.row.original)}\r\n >\r\n {t('consultation_view', 'View')}\r\n \r\n ),\r\n },\r\n ]}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n );\r\n\r\n return isMobile ? renderMobile : renderDesktop;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Button, Box, HStack } from '@tq/ui-components';\r\n\r\nimport { AssigneeDetails, PageHeading } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Consultation } from 'types';\r\nimport { useResponse } from '../../hooks';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ntype ResponseHeaderProps = {\r\n consultation: Consultation | undefined;\r\n};\r\n\r\nexport const ResponseHeader: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('response_header');\r\n const isMobile = useIsMobile();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const { id } = useParams();\r\n const consultationId = +(id ?? 0);\r\n const { canSubmit, submitResponse } = useResponse(consultationId);\r\n\r\n const showButton = consultation && !consultation.isArchived;\r\n\r\n return (\r\n \r\n {isMobile ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n\r\n {showButton && (\r\n \r\n {t('submit', 'Submit')}\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","export const selectComponentWidth = 296;\r\nexport const contentWidth = 876;\r\n","import React, { ChangeEvent, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport {\r\n Form,\r\n FormProvider,\r\n ValidatedSelect,\r\n ValidatedTextArea,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport { AttentionMessage, Box } from '@tq/ui-components';\r\n\r\nimport { useReasonsForLateResponse } from 'api';\r\nimport { CharacterCount } from 'components';\r\nimport {\r\n reasonForLateResponseDetailState,\r\n reasonForLateResponseIdState,\r\n reasonForLateReasonIsOtherState,\r\n} from 'store';\r\nimport { isOverdue } from 'tools';\r\nimport { contentWidth, selectComponentWidth } from '../../constants';\r\nimport { ConsultationResponseProps } from '../../types';\r\n\r\nexport const ResponseOverdueForm: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const isConsultationOverdue = isOverdue(consultation);\r\n\r\n const [reasonForLateResponseId, setReasonForLateResponseId] = useRecoilState(\r\n reasonForLateResponseIdState\r\n );\r\n const [reasonForLateResponse, setReasonForLateResponseDetail] = useRecoilState(\r\n reasonForLateResponseDetailState\r\n );\r\n const [responseLateReasonIsOther, setResponseLateReasonIsOther] = useRecoilState(\r\n reasonForLateReasonIsOtherState\r\n );\r\n\r\n const { data: lateReasonsData } = useReasonsForLateResponse();\r\n\r\n useEffect(() => {\r\n setResponseLateReasonIsOther(\r\n reasonForLateResponseId ===\r\n lateReasonsData?.reasonsForLateResponse.find((r) => r.label === 'Other')?.value\r\n );\r\n }, [lateReasonsData, reasonForLateResponseId, setResponseLateReasonIsOther]);\r\n\r\n return (\r\n <>\r\n {isConsultationOverdue && (\r\n \r\n
    \r\n \r\n \r\n setReasonForLateResponseId(+value)}\r\n placeholder={`- ${t('select', 'Select')} -`}\r\n py={2}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t(\r\n 'late_response_required_error',\r\n 'Please select a late response reason'\r\n ),\r\n },\r\n }}\r\n w={{ base: '100%', lg: selectComponentWidth }}\r\n >\r\n {lateReasonsData?.reasonsForLateResponse.map((filter) => (\r\n \r\n ))}\r\n \r\n {responseLateReasonIsOther && (\r\n <>\r\n ) =>\r\n setReasonForLateResponseDetail(event.target.value)\r\n }\r\n data-testid='overdue-reason-textarea'\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t(\r\n 'late_response_detail_required_error',\r\n 'Please enter reason for late response'\r\n ),\r\n },\r\n maxLength: {\r\n value: 400,\r\n message: t(\r\n 'late_response_detail_length_error',\r\n 'You have exceeded the character limit'\r\n ),\r\n },\r\n }}\r\n w='100%'\r\n maxWidth={{ base: '100%', lg: contentWidth }}\r\n />\r\n \r\n \r\n )}\r\n \r\n
    \r\n
    \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box } from '@tq/ui-components';\r\nimport { EmptyDataCard } from 'components';\r\n\r\nimport { RpcOtherResponse } from '..';\r\nimport { useResponse } from '../../hooks';\r\n\r\nexport const RpcOtherResponses: React.FC = () => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const { id } = useParams();\r\n const { otherAnswers } = useResponse(+(id ?? 0));\r\n\r\n return (\r\n \r\n \r\n

    \r\n {t('other_organisation_responses', 'Other organisation responses')}\r\n

    \r\n
    \r\n \r\n {otherAnswers.map((answer) => (\r\n \r\n ))}\r\n {(!otherAnswers || otherAnswers.length === 0) && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box } from '@tq/ui-components';\r\nimport { EmptyDataCard } from 'components';\r\nimport { ConsultationResponseProps } from '../../types';\r\nimport { RpcResponseAnswers } from '..';\r\nimport { useResponse } from '../../hooks';\r\n\r\nexport const RpcPastResponses: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const { pastAnswers } = useResponse(consultation.id);\r\n\r\n return (\r\n \r\n \r\n

    \r\n {t('answered_questions', 'Answered questions')}\r\n

    \r\n
    \r\n {!pastAnswers?.length ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box } from '@tq/ui-components';\r\n\r\nimport { RpcResponseAnswers, ResponseOverdueForm } from '..';\r\nimport { useResponse } from '../../hooks';\r\nimport { ConsultationResponseProps } from '../../types';\r\n\r\nexport const RpcResponse: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const { answers } = useResponse(consultation.id);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

    \r\n {t('review_questions', 'Review questions')}\r\n

    \r\n
    \r\n \r\n {t(\r\n 'review_questions_help',\r\n 'Please review the details below and edit or approve the answer(s) as appropriate.'\r\n )}\r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { ConsultationResponseAnswer } from 'types';\r\nimport { RpcResponseAnswer } from '..';\r\n\r\nexport type ResponseAnswersProps = {\r\n answers: ConsultationResponseAnswer[];\r\n showEdit: boolean;\r\n};\r\n\r\nexport const RpcResponseAnswers: React.FC = ({ answers, showEdit }) => {\r\n return (\r\n <>\r\n {answers.map((answer) => (\r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, useState, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaEdit } from 'react-icons/fa';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useRecoilState, useRecoilValue } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n FormProvider,\r\n ValidatedTextArea,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport { Box, Button, Grid, GridItem, Typography } from '@tq/ui-components';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nimport { useUpdateAnswer } from 'api';\r\nimport { NumberBox } from 'components';\r\nimport {\r\n approveResponseState,\r\n reasonForLateResponseDetailState,\r\n reasonForLateResponseIdState,\r\n} from 'store';\r\nimport { ConsultationResponseAnswer } from 'types';\r\nimport { useResponse } from '../../hooks';\r\n\r\nexport type ResponseAnswerProps = {\r\n answer: ConsultationResponseAnswer;\r\n showEdit: boolean;\r\n};\r\n\r\nexport const RpcResponseAnswer: React.FC = ({ answer, showEdit }) => {\r\n const { t } = useTranslation('consultation_response');\r\n\r\n const { id } = useParams();\r\n const consultationId = +(id ?? 0);\r\n\r\n const { canSubmitIfLateResponse } = useResponse(consultationId);\r\n\r\n const [isApprovingResponse, setIsApprovingResponse] = useRecoilState(approveResponseState);\r\n const reasonForLateResponseId = useRecoilValue(reasonForLateResponseIdState);\r\n const reasonForLateResponseDetail = useRecoilValue(reasonForLateResponseDetailState);\r\n\r\n const [isEditing, setIsEditing] = useState(false);\r\n const [editedAnswer, setEditedAnswer] = useState(answer.answer);\r\n\r\n const answerUpdated = (): void => setIsApprovingResponse(true);\r\n\r\n const { mutate: approveAnswer } = useUpdateAnswer(answerUpdated);\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const borderColour = (): string => {\r\n if (answer.approved) {\r\n return COLOURS.green[500];\r\n }\r\n return isEditing ? 'unset' : COLOURS.gray[300];\r\n };\r\n\r\n const backgroundColour = (): string => {\r\n if (answer.approved) {\r\n return COLOURS.neutral[11];\r\n }\r\n return isEditing ? COLOURS.blue[200] : 'unset';\r\n };\r\n\r\n const questionBackgroundColour = (): string => {\r\n if (answer.approved) {\r\n return 'unset';\r\n }\r\n return isEditing ? 'unset' : COLOURS.gray[200];\r\n };\r\n\r\n const lastEditedFontColour = (): string => {\r\n if (answer.approved) {\r\n return COLOURS.gray[800];\r\n }\r\n return isEditing ? COLOURS.black : COLOURS.blue[600];\r\n };\r\n\r\n useEffect(() => {\r\n setIsApprovingResponse(false);\r\n }, [answer.approved, setIsApprovingResponse]);\r\n\r\n const saveAnswer = (approved: boolean): void => {\r\n approveAnswer({\r\n consultationId,\r\n responseId: answer.responseId,\r\n reasonForLateResponseId,\r\n reasonForLateResponseDetail,\r\n questionId: answer.questionId,\r\n question: answer.question,\r\n answerId: answer.id,\r\n answer: editedAnswer,\r\n approved,\r\n });\r\n setIsApprovingResponse(true);\r\n };\r\n\r\n const handleApprove = () => {\r\n saveAnswer(true);\r\n };\r\n\r\n const handleEdit = () => {\r\n setIsEditing(true);\r\n };\r\n\r\n const handleCancel = () => {\r\n setIsEditing(false);\r\n setEditedAnswer(answer.answer);\r\n };\r\n\r\n const handleSave = () => {\r\n saveAnswer(false);\r\n setIsEditing(false);\r\n };\r\n\r\n const lastEdited =\r\n showEdit && answer.dateModified ? (\r\n \r\n {t('last_edited', 'Last edited')} {formatLocaleDate(answer.dateModified)}{' '}\r\n {t('by', 'By').toLowerCase()} {answer.consulteeName}\r\n \r\n ) : null;\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t('question', 'Question')}\r\n \r\n \r\n {answer.question}\r\n \r\n \r\n {isEditing ? (\r\n \r\n ) =>\r\n setEditedAnswer(event.target.value)\r\n }\r\n placeholder={t('answer_text_placeholder', 'Enter your answer here')}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t('answer_text_required_error', 'Please answer the question.'),\r\n },\r\n }}\r\n />\r\n \r\n ) : (\r\n <>\r\n \r\n {t('answer', 'Answer')}\r\n \r\n \r\n {editedAnswer}\r\n \r\n \r\n {lastEdited}\r\n \r\n \r\n )}\r\n \r\n {showEdit && (\r\n \r\n \r\n {lastEdited}\r\n \r\n \r\n {isEditing ? (\r\n <>\r\n \r\n {t('cancel', 'Cancel')}\r\n \r\n \r\n {t('save', 'Save')}\r\n \r\n \r\n ) : (\r\n <>\r\n }\r\n fontSize='sm'\r\n variant='secondary'\r\n w={{ base: '100%', lg: 'unset' }}\r\n onClick={handleEdit}\r\n >\r\n {t('edit', 'Edit')}\r\n \r\n {!answer.approved && !isEditing && (\r\n \r\n {t('approve_answer', 'Approve answer')}\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { updateAnswer } from '../methods';\r\nimport { UpdateAnswerRequest, UpdateAnswerResponse } from '../types';\r\n\r\nexport const useUpdateAnswer = (\r\n answerUpdated: () => void\r\n): UseMutationResult => {\r\n const queryClient = useQueryClient();\r\n return useMutation(updateAnswer, {\r\n onSuccess: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultation] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getCaseDetails] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getResponses] });\r\n answerUpdated();\r\n },\r\n });\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSetRecoilState } from 'recoil';\r\nimport { Box, Typography } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { SubmitResponseRequest, useSubmitResponse } from 'api';\r\nimport { NumberBox, FileDragDrop } from 'components';\r\nimport {\r\n responseFilesState,\r\n responseSupportingFilesState,\r\n responseUploadRequiredState,\r\n} from 'store';\r\nimport { StandardResponseForm } from '..';\r\nimport { useResponse } from '../../hooks';\r\nimport { ConsultationResponseProps } from '../../types';\r\nimport { MAX_FILE_COUNT } from '../../../../constants';\r\nimport { FileInformation } from '../../../../components/FileDragDrop/components/FileInformation';\r\n\r\nexport const StandardResponse: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('consultation_response');\r\n const [uploadRequired, setUploadRequired] = useState(false);\r\n const headingFontSize = 16;\r\n\r\n const { response, isLoading } = useResponse(consultation.id);\r\n const { mutate: submitResponse } = useSubmitResponse();\r\n\r\n const setUploadRequiredState = useSetRecoilState(responseUploadRequiredState);\r\n const setResponseFiles = useSetRecoilState(responseFilesState);\r\n const setSupportingFiles = useSetRecoilState(responseSupportingFilesState);\r\n\r\n useEffect(() => {\r\n if (!isLoading && !response) {\r\n submitResponse({\r\n consultationId: consultation.id,\r\n } as SubmitResponseRequest);\r\n }\r\n }, [isLoading, response, submitResponse, consultation.id]);\r\n\r\n useEffect(() => {\r\n setUploadRequiredState(uploadRequired);\r\n }, [setUploadRequiredState, uploadRequired]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {t('set_response_type', 'Set response type')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('upload_response', 'Upload response')}\r\n \r\n {uploadRequired && (\r\n \r\n \r\n Required\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('upload_supporting_documents', 'Upload supporting documents (optional)')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport {\r\n FormProvider,\r\n ValidatedSelect,\r\n ValidatedTextArea,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport { Box, AttentionMessage } from '@tq/ui-components';\r\n\r\nimport { useResponseTypes } from 'api';\r\nimport { CharacterCount } from 'components';\r\nimport {\r\n responseDetailState,\r\n responseTypeIdIsConsultedInErrorState,\r\n responseTypeIdState,\r\n} from 'store';\r\nimport { contentWidth, selectComponentWidth } from '../../constants';\r\nimport { useResetResponseFormState, useResponseTypeDescription } from '../../hooks';\r\nimport { ConsultationResponseProps } from '../../types';\r\nimport { ResponseOverdueForm } from '..';\r\n\r\nexport const StandardResponseForm: React.FC = ({\r\n consultation,\r\n setUploadRequired,\r\n}) => {\r\n const { t } = useTranslation('consultation_response');\r\n const { getResponseTypeDescription } = useResponseTypeDescription();\r\n const { data: responseTypesData } = useResponseTypes();\r\n\r\n const [responseTypeIdIsConsultedInError, setResponseTypeIdIsConsultedInError] =\r\n useRecoilState(responseTypeIdIsConsultedInErrorState);\r\n const [selectedResponseTypeId, setSelectedResponseTypeId] =\r\n useRecoilState(responseTypeIdState);\r\n const [responseDetail, setResponseDetail] = useRecoilState(responseDetailState);\r\n const { resetForm } = useResetResponseFormState();\r\n\r\n useEffect(\r\n () => {\r\n resetForm();\r\n },\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n []\r\n );\r\n\r\n const responseType = selectedResponseTypeId\r\n ? responseTypesData?.responseTypes.find((type) => type.value === selectedResponseTypeId)\r\n ?.label\r\n : undefined;\r\n\r\n const responseTypeDescription = getResponseTypeDescription(responseType);\r\n\r\n useEffect(() => {\r\n setResponseTypeIdIsConsultedInError(\r\n selectedResponseTypeId ===\r\n responseTypesData?.responseTypes.find((r) => r.label === 'Consulted in error')?.value\r\n );\r\n }, [responseTypesData, selectedResponseTypeId, setResponseTypeIdIsConsultedInError]);\r\n\r\n const getSummaryTitle = responseTypeIdIsConsultedInError\r\n ? t('consulted_in_error_entry', 'Summary')\r\n : t('my_response_summary_entry', 'Summary (Optional)');\r\n\r\n const getSummaryRequiredStatus = responseTypeIdIsConsultedInError\r\n ? {\r\n required: {\r\n value: true,\r\n message: t('reason_text_required_error', 'Please enter reason'),\r\n },\r\n }\r\n : null;\r\n\r\n const handleOnChange = (value: string) => {\r\n setSelectedResponseTypeId(+value);\r\n const chosenResponse = responseTypesData?.responseTypes.find(\r\n (e) => e.value === parseInt(value)\r\n )?.documentsRequired;\r\n\r\n if (chosenResponse !== undefined) {\r\n setUploadRequired && setUploadRequired(chosenResponse);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n {t(\r\n 'set_response_type_summary',\r\n 'Please select a consultation response type from the dropdown list below. This can be amended if necessary prior to submission of the consultation response.'\r\n )}\r\n \r\n handleOnChange(value)}\r\n placeholder={`- ${t('select', 'Select')} -`}\r\n py={2}\r\n validation={{\r\n required: {\r\n value: true,\r\n message: t('response_type_required_error', 'Please select a response type'),\r\n },\r\n }}\r\n value={selectedResponseTypeId}\r\n w={{ base: '100%', lg: selectComponentWidth }}\r\n >\r\n {responseTypesData?.responseTypes.map((filter) => (\r\n \r\n ))}\r\n \r\n {selectedResponseTypeId && (\r\n \r\n )}\r\n \r\n ) =>\r\n setResponseDetail(event.target.value)\r\n }\r\n validation={{\r\n ...getSummaryRequiredStatus,\r\n maxLength: {\r\n value: 4000,\r\n message: t('error_text_length_error', 'You have exceeded the character limit'),\r\n },\r\n }}\r\n w='100%'\r\n maxWidth={{ base: '100%', lg: contentWidth }}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Container, Grid } from '@tq/ui-components';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { ArchivedPastResponseCard, ResponseHeader } from './components';\r\nimport { useResponse } from './hooks';\r\n\r\nexport const ArchivedResponse: React.FC = () => {\r\n const { id, responseId } = useParams();\r\n const consultationId = +(id ?? 0);\r\n const { data: consultation } = useConsultation(consultationId);\r\n const { pastResponses } = useResponse(consultationId);\r\n\r\n const response = pastResponses.find((r) => r.id === +(responseId ?? 0));\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { Container, Grid } from '@tq/ui-components';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { HttpError } from 'types';\r\nimport {\r\n ArchivedConsultationResponse,\r\n OpenConsultationResponse,\r\n ResponseHeader,\r\n} from './components';\r\nimport { useNavigate } from '../../hooks';\r\n\r\nexport const ConsultationResponse: React.FC = () => {\r\n const { id } = useParams();\r\n const consultationId = +(id ?? 0);\r\n const { data: consultation, error, isError } = useConsultation(+consultationId);\r\n const { navigateToErrorPage } = useNavigate();\r\n\r\n useEffect(() => {\r\n if (isError && error) {\r\n navigateToErrorPage(error as HttpError);\r\n }\r\n }, [isError, error, navigateToErrorPage]);\r\n\r\n return (\r\n \r\n \r\n \r\n {consultation?.isArchived ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Grid } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useNavigate, useShowViewResponse } from 'hooks';\r\nimport { Consultation } from 'types';\r\n\r\nexport interface ArchivedConsultationButtonsProps {\r\n consultation: Consultation;\r\n}\r\n\r\nexport const ArchivedConsultationButtons: React.FC = ({\r\n consultation,\r\n}) => {\r\n const { t } = useTranslation('summary_header');\r\n const { navigateToDetails, navigateToResponse } = useNavigate();\r\n const isMobile = useIsMobile();\r\n const showViewResponse = useShowViewResponse(consultation);\r\n\r\n return (\r\n \r\n consultation && navigateToDetails(consultation.id)}\r\n >\r\n {t('view_case_details', 'View case details')}\r\n \r\n {showViewResponse && (\r\n consultation && navigateToResponse(consultation.id)}\r\n >\r\n {t('view_response', 'View response')}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Box, Heading, Text, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport interface TitleDescriptionProps {\r\n title: string;\r\n description: string;\r\n}\r\n\r\nexport const TitleDescription: React.FC = ({ title, description }) => {\r\n const { tvs } = useThemedValueSwitch();\r\n return (\r\n \r\n \r\n {title}\r\n \r\n \r\n {description}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n DetailsCard,\r\n DetailsCardBody,\r\n DetailsCardFooter,\r\n ListRow,\r\n renderListRows,\r\n SkeletonText,\r\n useBreakpointValue,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Consultation } from 'types';\r\nimport { TitleDescription } from '../TitleDescription';\r\n\r\nexport type CaseDetailsCardProps = {\r\n consultation?: Consultation;\r\n};\r\n\r\nexport const CaseDetailsCard: React.FC = ({ consultation }) => {\r\n const { t } = useTranslation('case_details_card');\r\n const { tvs } = useThemedValueSwitch();\r\n const listItemColumns = useBreakpointValue({ base: '40% 60%', lg: '20% 80%' });\r\n if (!consultation) {\r\n return ;\r\n }\r\n const bodyRows = [\r\n {\r\n label: t('reference', 'Reference'),\r\n value: consultation.reference,\r\n },\r\n {\r\n label: t('authority', 'Authority'),\r\n value: consultation.authority,\r\n },\r\n {\r\n label: t('address', 'Address'),\r\n value: consultation.address,\r\n },\r\n {\r\n label: t('category', 'Category'),\r\n value: consultation.category,\r\n },\r\n {\r\n label: t('consultationType', 'Consultation Type'),\r\n value: consultation.consultationType,\r\n },\r\n ];\r\n\r\n const footerRows = [\r\n {\r\n label: t('description', 'Description:'),\r\n value: consultation.summaryDescription,\r\n },\r\n ];\r\n\r\n if (consultation.consultationType !== 'RPC') {\r\n footerRows.push({\r\n label: t('reason_for_consultation', 'Reason for consultation:'),\r\n value: consultation.reasonForConsultation,\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {renderListRows(bodyRows, {\r\n addLabelColons: true,\r\n p: tvs({ tq: 2 }, 1),\r\n gridGap: '1rem',\r\n })}\r\n \r\n \r\n {consultation.consultationType !== 'RPC' && (\r\n \r\n {footerRows.map((r, i) => (\r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n Card,\r\n ListRow,\r\n SkeletonText,\r\n useBreakpointValue,\r\n renderListRows,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { ListRowProps, RowDirection } from 'tools';\r\nimport { Consultation } from 'types';\r\n\r\nexport type CaseOfficerDetailsCardProps = {\r\n consultation?: Consultation;\r\n};\r\nexport const CaseOfficerDetailsCard: React.FC = ({\r\n consultation,\r\n}) => {\r\n const { t } = useTranslation('consultation_summary');\r\n const { tvs } = useThemedValueSwitch();\r\n const listItemColumns = useBreakpointValue({ base: '40% 60%', lg: '20% 80%' });\r\n const rowDirection: RowDirection | undefined = useBreakpointValue({\r\n base: 'vertical',\r\n md: 'horizontal',\r\n });\r\n\r\n if (!consultation) {\r\n return ;\r\n }\r\n const rows: ListRowProps[] = [\r\n {\r\n label: t('name', 'Name'),\r\n value: consultation.caseOfficerName,\r\n },\r\n {\r\n label: t('contact_number', 'Contact number'),\r\n value: consultation.caseOfficerContactNumber,\r\n },\r\n {\r\n label: t('contact_email', 'Contact email'),\r\n value: consultation.caseOfficerContactEmail,\r\n },\r\n ];\r\n return (\r\n \r\n \r\n {renderListRows(rows, {\r\n rowDirection,\r\n addLabelColons: true,\r\n p: tvs({ tq: 0 }, 1),\r\n gridGap: '1.25rem',\r\n })}\r\n \r\n \r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Card,\r\n Link,\r\n Flex,\r\n Typography,\r\n useThemedValueSwitch,\r\n Heading,\r\n} from '@tq/ui-components';\r\n\r\nimport { Notes, NotesHeading, AddNoteButton, AddNote } from 'components';\r\nimport { Consultation } from 'types';\r\nimport { CaseDetailsCard, CaseOfficerDetailsCard } from '../..';\r\n\r\nexport type DesktopSummaryProps = {\r\n consultation?: Consultation;\r\n isLoading: boolean;\r\n};\r\n\r\nexport const DesktopSummary: React.FC = ({ consultation, isLoading }) => {\r\n const [showNotes, setShowNotes] = useState(false);\r\n const { t } = useTranslation('summary_header');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n useEffect(() => {\r\n !isLoading &&\r\n consultation &&\r\n (consultation?.consultationType === 'RPC' || consultation?.isArchived)\r\n ? setShowNotes(false)\r\n : setShowNotes(true);\r\n }, [isLoading, consultation, setShowNotes]);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {t('case_details', 'Case details')}\r\n \r\n {!showNotes &&\r\n !isLoading &&\r\n consultation &&\r\n consultation?.consultationType !== 'RPC' && (\r\n setShowNotes(true)}>\r\n {t('show_notes', 'Show notes')}\r\n \r\n )}\r\n \r\n \r\n \r\n {t('case_officer_details', 'Case officer details')}\r\n \r\n \r\n \r\n {showNotes && (\r\n \r\n \r\n \r\n \r\n {showNotes && consultation?.isArchived && (\r\n setShowNotes(false)}>\r\n {t('hide', 'Hide')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Divider,\r\n Tab,\r\n Tabs,\r\n TabList,\r\n TabPanels,\r\n TabPanel,\r\n TabText,\r\n Typography,\r\n} from '@tq/ui-components';\r\n\r\nimport { AddNote, AddNoteButton, Notes, NotesInfoMessage } from 'components';\r\nimport { Consultation } from 'types';\r\nimport { CaseDetailsCard, CaseOfficerDetailsCard } from '..';\r\nimport { useCanAddNote } from 'hooks';\r\n\r\nexport type MobileSummaryProps = {\r\n consultation?: Consultation;\r\n isLoading: boolean;\r\n};\r\n\r\nexport const MobileSummary: React.FC = ({ consultation, isLoading }) => {\r\n const { t } = useTranslation('summary_header');\r\n const canAddNote = useCanAddNote(consultation);\r\n return (\r\n \r\n \r\n \r\n {t('case_details', 'Case details')}\r\n \r\n \r\n {t('notes', 'Notes')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n

    {t('case_officer_details', 'Case officer details')}

    \r\n
    \r\n \r\n
    \r\n \r\n {canAddNote && (\r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Box, Button, Grid } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { ActionMenuButton } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport { Consultation } from 'types';\r\nimport { useSummaryMenuOptions } from '../../hooks';\r\n\r\nexport interface OpenConsultationButtonsProps {\r\n consultation: Consultation;\r\n}\r\n\r\nexport const OpenConsultationButtons: React.FC = ({\r\n consultation,\r\n}) => {\r\n const { t } = useTranslation('summary_header');\r\n const options = useSummaryMenuOptions(consultation);\r\n const { navigateToResponse } = useNavigate();\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n consultation && navigateToResponse(consultation.id)}\r\n >\r\n {t('respond', 'Respond')}\r\n \r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FaClock, FaIdCard, FaUser } from 'react-icons/fa';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { useAssignModal, useNavigate } from 'hooks';\r\nimport { consulteeIdState, showRequestExtensionState } from 'store';\r\nimport { Consultation, MenuOption } from 'types';\r\n\r\nexport const useSummaryMenuOptions = (\r\n consultation: Consultation | undefined\r\n): MenuOption[] => {\r\n const { t } = useTranslation('consultation_summary');\r\n\r\n const consulteeId = useRecoilValue(consulteeIdState);\r\n\r\n const { navigateToDetails } = useNavigate();\r\n const { handleAssignConsultation } = useAssignModal();\r\n const setShowRequestExtension = useSetRecoilState(showRequestExtensionState);\r\n\r\n const options: MenuOption[] = [\r\n {\r\n label: t('case_details', 'Case details'),\r\n onClick: (consultationId) => consultationId && navigateToDetails(consultationId),\r\n icon: FaIdCard,\r\n },\r\n {\r\n label: t('assign', 'Assign'),\r\n onClick: (consultationId) => consultationId && handleAssignConsultation(consultationId),\r\n icon: FaUser,\r\n },\r\n ];\r\n\r\n if (\r\n consultation &&\r\n !consultation.hasExtensionRequest &&\r\n consultation.status !== 'Extension requested' &&\r\n consultation.assigneeId === consulteeId &&\r\n consultation.consultationType !== 'RPC'\r\n ) {\r\n options.push({\r\n label: t('request_extension', 'Request extension'),\r\n onClick: () => setShowRequestExtension(true),\r\n icon: FaClock,\r\n });\r\n }\r\n\r\n return options;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUserCircle } from 'react-icons/fa';\r\nimport { useRecoilState } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Form,\r\n FormProvider,\r\n ValidatedTextArea,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\nimport {\r\n AttentionMessage,\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n useBanner,\r\n} from '@tq/ui-components';\r\n\r\nimport { useRequestExtension } from 'api';\r\nimport { MobileModal } from 'components';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { showRequestExtensionState } from 'store';\r\n\r\ntype RequestExtensionModalProps = {\r\n consultationId: number;\r\n};\r\n\r\nexport const RequestExtensionModal: React.FC = ({\r\n consultationId,\r\n}) => {\r\n const { t } = useTranslation('request_extension_modal');\r\n const isMobile = useIsMobile();\r\n const [showRequestExtension, setShowRequestExtension] = useRecoilState(\r\n showRequestExtensionState\r\n );\r\n\r\n const banner = useBanner();\r\n const { mutate: requestExtension, isLoading } = useRequestExtension();\r\n\r\n const handleClose = () => {\r\n setShowRequestExtension(false);\r\n };\r\n\r\n const handleRequestExtension = (reason: string) => {\r\n requestExtension(\r\n {\r\n consultationId,\r\n extensionReason: reason,\r\n },\r\n {\r\n onSuccess: () => {\r\n banner({\r\n id: 'request-extension-banner',\r\n title: t('extension_request_sent', 'Extension request has been sent'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n handleClose();\r\n },\r\n onError: () =>\r\n banner({\r\n id: 'request-extension-failed-banner',\r\n title: t('extension_request_failed', 'Extension request failed'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n }),\r\n }\r\n );\r\n };\r\n\r\n const content = (\r\n <>\r\n \r\n \r\n \r\n {t('request_extension', 'Request extension')}\r\n \r\n \r\n \r\n \r\n \r\n handleRequestExtension(reason)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return isMobile ? (\r\n \r\n {content}\r\n\r\n \r\n \r\n \r\n {t('send_request_button_text', 'Send request')}\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {content}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { requestExtension } from '../methods';\r\nimport { RequestExtensionRequest, RequestExtensionResponse } from '../types';\r\n\r\nexport const useRequestExtension = (): UseMutationResult<\r\n RequestExtensionResponse,\r\n unknown,\r\n RequestExtensionRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(requestExtension, {\r\n onSuccess: () =>\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getConsultation] }),\r\n });\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Flex } from '@tq/ui-components';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { useParams } from 'react-router-dom';\r\nimport { PageHeading } from 'components';\r\nimport { ArchivedConsultationButtons, OpenConsultationButtons } from '..';\r\n\r\nexport const SummaryHeader: React.FC = () => {\r\n const { t } = useTranslation('summary_header');\r\n const { id } = useParams();\r\n const { data: consultation } = useConsultation(+(id ?? 0));\r\n\r\n return (\r\n \r\n \r\n {consultation &&\r\n (consultation?.isArchived ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport { AnimatedSpinner, Box, Container, Flex } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useConsultation } from 'api';\r\nimport { AssigneeDetails, AssignModal } from 'components';\r\nimport { useAssignModal, useNavigate } from 'hooks';\r\nimport { HttpError } from 'types';\r\nimport {\r\n RequestExtensionModal,\r\n SummaryHeader,\r\n DesktopSummary,\r\n MobileSummary,\r\n} from './components';\r\n\r\nexport const ConsultationSummary: React.FC = () => {\r\n const { id } = useParams();\r\n const isMobile = useIsMobile();\r\n const {\r\n data: consultation,\r\n error,\r\n isError,\r\n isLoading,\r\n isLoadingError,\r\n isRefetchError,\r\n } = useConsultation(+(id ?? 0));\r\n const { showAssignModal, handleClose } = useAssignModal();\r\n const { navigateToErrorPage } = useNavigate();\r\n\r\n const [showSpinner, setShowSpinner] = useState(true);\r\n useEffect(() => {\r\n setShowSpinner(isLoading || isLoadingError || isRefetchError);\r\n }, [isLoading, isLoadingError, isRefetchError]);\r\n\r\n useEffect(() => {\r\n if (isError && error) {\r\n navigateToErrorPage(error as HttpError);\r\n }\r\n }, [isError, error, navigateToErrorPage]);\r\n\r\n return showSpinner ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n {isMobile ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n {consultation && }\r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { useRecoilValue, RecoilState } from 'recoil';\r\nimport { FormControl, Text } from '@tq/ui-components';\r\n\r\nimport { IsRegisteredCheckbox } from 'components';\r\n\r\ninterface IsRegisteredTableCellProps {\r\n rowValue: string;\r\n isRegisteredRowValue: boolean;\r\n editingState: RecoilState;\r\n isRegisteredState: RecoilState;\r\n rowIndex: number;\r\n label: string;\r\n}\r\n\r\nexport const IsRegisteredTableCell: React.FC = ({\r\n rowValue,\r\n editingState,\r\n isRegisteredState,\r\n rowIndex,\r\n label,\r\n isRegisteredRowValue,\r\n}) => {\r\n const currentEditRowIndex = useRecoilValue(editingState);\r\n return currentEditRowIndex === rowIndex ? (\r\n \r\n \r\n \r\n ) : (\r\n {rowValue}\r\n );\r\n};\r\n","import React, { ChangeEvent, useState, useEffect } from 'react';\r\n\r\nimport {\r\n Flex,\r\n Button,\r\n Input,\r\n FormLabel,\r\n FormControl,\r\n FormErrorMessage,\r\n AttentionMessage,\r\n VStack,\r\n} from '@tq/ui-components';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { isEmailValid } from 'tools';\r\nimport { useUpsertParentOrganisation } from 'api';\r\nimport { organisationRequestState, organisationIdState } from 'store';\r\nimport { useMessageProps } from '../hooks';\r\nimport { Organisation } from 'types';\r\n\r\nexport type OrganisationDetailsPanelProps = {\r\n organisation?: Organisation;\r\n};\r\n\r\nexport const OrganisationDetailsPanel: React.FC = ({\r\n organisation,\r\n}) => {\r\n const { t } = useTranslation('manage_organisation');\r\n const latestSubmit = useRecoilValue(organisationRequestState);\r\n const organisationId = useRecoilValue(organisationIdState);\r\n\r\n const [name, setName] = useState(organisation?.organisationName ?? '');\r\n const [nameIsInvalid, setNameIsInvalid] = useState(false);\r\n const [email, setEmail] = useState(organisation?.email ?? '');\r\n const [emailIsInvalid, setEmailIsInvalid] = useState(false);\r\n const [submitDisabled, setSubmitDisabled] = useState(true);\r\n\r\n const { mutate: upsertResult, status, error, isLoading } = useUpsertParentOrganisation();\r\n const messageProps = useMessageProps(status, error, organisationId, latestSubmit);\r\n\r\n const isNameValid = (value: string) => value.length > 0;\r\n\r\n const handleNameChange = (e: ChangeEvent) => {\r\n setName(e.currentTarget.value);\r\n };\r\n\r\n const handleNameBlur = (e: ChangeEvent) => {\r\n setNameIsInvalid(!isNameValid(e.currentTarget.value));\r\n };\r\n\r\n const handleEmailChange = (e: ChangeEvent) => {\r\n const value = e.currentTarget.value;\r\n setEmail(value);\r\n if (value === '') setEmailIsInvalid(false);\r\n };\r\n\r\n const handleEmailBlur = (e: ChangeEvent) => {\r\n const value = e.currentTarget.value;\r\n if (value === '') setEmailIsInvalid(false);\r\n else setEmailIsInvalid(!isEmailValid(value));\r\n };\r\n\r\n useEffect(() => {\r\n if (name === '') setSubmitDisabled(true);\r\n else setSubmitDisabled(nameIsInvalid || emailIsInvalid);\r\n }, [nameIsInvalid, emailIsInvalid, name, email]);\r\n\r\n useEffect(() => {\r\n if (latestSubmit && name === latestSubmit.organisationName && email === latestSubmit.email)\r\n setSubmitDisabled(true);\r\n }, [latestSubmit, setSubmitDisabled, name, email]);\r\n\r\n const handleSubmit = () => {\r\n const payload = {\r\n organisationName: name,\r\n email: email,\r\n parentOrganisationId: organisationId,\r\n };\r\n upsertResult(payload);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {`${t('name_input_label', 'Organisation name')}:`}\r\n \r\n \r\n {t('name_input_error', 'Please add an organisation name to continue')}\r\n \r\n \r\n \r\n {`${t('email_input_label', 'Organisation email')}:`}\r\n \r\n \r\n {t('email_input_error', 'Please enter a valid email address')}\r\n \r\n \r\n \r\n \r\n {messageProps?.messageTitle ? (\r\n \r\n ) : null}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { useSetRecoilState } from 'recoil';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { upsertParentOrganisation } from '../methods';\r\nimport {\r\n organisationRequestState,\r\n organisationIdState,\r\n organisationCreatedState,\r\n} from 'store';\r\nimport { UpsertParentOrganisationRequest, UpsertParentOrganisationResponse } from '../types';\r\nimport { Organisation } from 'types';\r\n\r\nexport const useUpsertParentOrganisation = (): UseMutationResult<\r\n UpsertParentOrganisationResponse,\r\n unknown,\r\n UpsertParentOrganisationRequest\r\n> => {\r\n const setUpdateSuccessRequest = useSetRecoilState(organisationRequestState);\r\n const setUpdatedOrganisationId = useSetRecoilState(organisationIdState);\r\n const setNewOrganisation = useSetRecoilState(organisationCreatedState);\r\n const queryClient = useQueryClient();\r\n return useMutation(upsertParentOrganisation, {\r\n onSuccess: (data, variables) => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getAllParentOrganisations] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getParentOrganisations] });\r\n setUpdateSuccessRequest(variables);\r\n setUpdatedOrganisationId(data.id);\r\n const newOrg: Organisation = {\r\n id: data.id,\r\n organisationName: variables.organisationName,\r\n email: variables.email,\r\n };\r\n setNewOrganisation(newOrg);\r\n },\r\n });\r\n};\r\n","import { useMemo } from 'react';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { HttpError } from 'types';\r\nimport { UpsertParentOrganisationRequest } from '../../../api';\r\n\r\ninterface MessageProps {\r\n messageTitle: string;\r\n messageStatus: 'error' | 'success' | 'info';\r\n}\r\n\r\nexport const useMessageProps = (\r\n status: 'error' | 'success' | 'idle' | 'loading',\r\n error: unknown,\r\n organisationId?: number,\r\n latestOrganisationRequest?: UpsertParentOrganisationRequest\r\n): MessageProps => {\r\n const { t } = useTranslation('manage_organisation');\r\n const messagePropsMap = useMemo(() => {\r\n const memorizedMessageProps: Record = {\r\n idle: {\r\n messageTitle:\r\n organisationId || latestOrganisationRequest?.parentOrganisationId\r\n ? ''\r\n : t(\r\n 'info_message',\r\n \"You must select 'Create organisation' before continuing to set up teams and users.\"\r\n ),\r\n messageStatus: 'info',\r\n },\r\n error: {\r\n messageTitle:\r\n organisationId || latestOrganisationRequest?.parentOrganisationId\r\n ? t(\r\n 'update_error_message',\r\n 'The organisation could not be updated. Please try again.'\r\n )\r\n : t('error_message', 'The organisation could not be created. Please try again.'),\r\n messageStatus: 'error',\r\n },\r\n duplicateName: {\r\n messageTitle: t(\r\n 'duplicate_name_message',\r\n 'The organisation name already exists. Please use another name to continue.'\r\n ),\r\n messageStatus: 'error',\r\n },\r\n success: {\r\n messageTitle: latestOrganisationRequest?.parentOrganisationId\r\n ? t('update_success_message', 'The organisation has been successfully updated.')\r\n : t('success_message', 'The organisation has been successfully created.'),\r\n messageStatus: 'success',\r\n },\r\n };\r\n\r\n return memorizedMessageProps;\r\n }, [t, organisationId, latestOrganisationRequest]);\r\n\r\n return useMemo(() => {\r\n const organisationNameExists = (): boolean => {\r\n const isExisting = (error as HttpError)?.errors?.OrganisationName?.find((x) =>\r\n x.includes('already exists.')\r\n );\r\n return !!isExisting;\r\n };\r\n if (status === 'loading') {\r\n return messagePropsMap.idle;\r\n } else if (organisationNameExists()) {\r\n return messagePropsMap.duplicateName;\r\n } else {\r\n return messagePropsMap[status];\r\n }\r\n }, [error, status, messagePropsMap]);\r\n};\r\n","import React from 'react';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, Flex, VStack } from '@tq/ui-components';\r\nimport { RecoilState, useRecoilState } from 'recoil';\r\ninterface RowEditButtonsProps {\r\n rowIndex: number;\r\n width: number;\r\n editingState: RecoilState;\r\n submit: () => void;\r\n handleDelete?: () => void;\r\n disabled: boolean;\r\n hideDelete?: boolean;\r\n}\r\n\r\nexport const RowEditButtons: React.FC = ({\r\n rowIndex,\r\n width,\r\n editingState,\r\n submit,\r\n handleDelete,\r\n disabled,\r\n hideDelete,\r\n}) => {\r\n const { t } = useTranslation('create_organisation');\r\n const [editing, setEditing] = useRecoilState(editingState);\r\n\r\n const handleEdit = () => {\r\n setEditing(rowIndex);\r\n };\r\n\r\n const handleCancel = () => {\r\n setEditing(undefined);\r\n };\r\n\r\n return editing === rowIndex ? (\r\n \r\n \r\n {t('update', 'Update')}\r\n \r\n \r\n {t('cancel', 'Cancel')}\r\n \r\n \r\n ) : (\r\n \r\n {!hideDelete && (\r\n \r\n )}\r\n \r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, useEffect, useState } from 'react';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Button,\r\n Card,\r\n Flex,\r\n FormControl,\r\n FormErrorMessage,\r\n FormLabel,\r\n HStack,\r\n Input,\r\n useBanner,\r\n} from '@tq/ui-components';\r\n\r\nimport { isEmailValid } from 'tools';\r\nimport { AddTeamRequest, useAddTeam } from 'api';\r\nimport { useTeamMessageProps } from '../../hooks';\r\nimport { Organisation } from 'types';\r\nimport { BANNER_TIMEOUT } from 'config';\r\n\r\nexport type AddTeamProps = {\r\n organisation?: Organisation;\r\n};\r\n\r\nexport const AddTeam: React.FC = ({ organisation }) => {\r\n const { t } = useTranslation('manage_organisation');\r\n const banner = useBanner();\r\n\r\n const [addTeamRequest, SetAddTeamRequest] = useState();\r\n const [submitDisabled, setSubmitDisabled] = useState(true);\r\n const [isDisabled, setIsDisabled] = useState(true);\r\n const [teamEmailDisabled, setTeamEmailDisabled] = useState(true);\r\n const [teamName, setTeamName] = useState('');\r\n const [teamNameInvalid, setTeamNameInvalid] = useState(false);\r\n const [teamEmail, setTeamEmail] = useState('');\r\n const [teamEmailInvalid, setTeamEmailInvalid] = useState(false);\r\n const [backOfficeCode, setBackOfficeCode] = useState('');\r\n const [backOfficeCodeInvalid, setBackOfficeCodeInvalid] = useState(false);\r\n\r\n const isNameValid = (value: string) => value.length > 0;\r\n\r\n const { mutate: teamMutation, status, error, isError, isSuccess, reset } = useAddTeam();\r\n\r\n const addTeamMessageProps = useTeamMessageProps(status, error, addTeamRequest);\r\n\r\n useEffect(() => {\r\n if (organisation?.id) {\r\n setIsDisabled(false);\r\n if (isEmailValid(organisation.email)) {\r\n setTeamEmail('');\r\n setTeamEmailDisabled(true);\r\n setTeamEmailInvalid(false);\r\n } else {\r\n setTeamEmailDisabled(false);\r\n }\r\n }\r\n }, [organisation]);\r\n\r\n useEffect(() => {\r\n const isFormInvalidExcludingEmail = !isNameValid(teamName) || !isNameValid(backOfficeCode);\r\n if (teamEmailDisabled) {\r\n setSubmitDisabled(isFormInvalidExcludingEmail);\r\n } else {\r\n setSubmitDisabled(isFormInvalidExcludingEmail || !isEmailValid(teamEmail));\r\n }\r\n }, [teamName, backOfficeCode, teamEmailDisabled, teamEmail]);\r\n\r\n const emptyForm = teamName + teamEmail + backOfficeCode === '';\r\n\r\n useEffect(() => {\r\n if (emptyForm) {\r\n setTeamNameInvalid(false);\r\n setBackOfficeCodeInvalid(false);\r\n setTeamEmailInvalid(false);\r\n }\r\n }, [emptyForm]);\r\n\r\n useEffect(() => {\r\n const attentionMessageDescription = (\r\n <>\r\n {addTeamMessageProps.messageErrors?.map((errmsg, idx) => (\r\n
  • {errmsg}
  • \r\n ))}\r\n \r\n );\r\n\r\n if (\r\n (isError || isSuccess) &&\r\n (addTeamMessageProps.messageStatus === 'success' ||\r\n addTeamMessageProps.messageStatus === 'error')\r\n ) {\r\n banner({\r\n id: 'add_team_banner_id',\r\n title: addTeamMessageProps.messageTitle,\r\n status: addTeamMessageProps.messageStatus,\r\n description: attentionMessageDescription,\r\n duration: BANNER_TIMEOUT,\r\n });\r\n reset();\r\n }\r\n }, [\r\n addTeamMessageProps,\r\n addTeamRequest,\r\n isError,\r\n isSuccess,\r\n t,\r\n teamMutation,\r\n banner,\r\n reset,\r\n ]);\r\n\r\n const handleTeamNameChange = (e: ChangeEvent) => {\r\n setTeamName(e.currentTarget.value);\r\n };\r\n\r\n const handleTeamNameBlur = (e: ChangeEvent) => {\r\n if (!emptyForm) setTeamNameInvalid(!isNameValid(e.currentTarget.value));\r\n };\r\n\r\n const handleBackofficeCodeChange = (e: ChangeEvent) => {\r\n setBackOfficeCode(e.currentTarget.value);\r\n };\r\n\r\n const handleBackofficeCodeBlur = (e: ChangeEvent) => {\r\n if (!emptyForm) setBackOfficeCodeInvalid(!isNameValid(e.currentTarget.value));\r\n };\r\n\r\n const handleTeamEmailChange = (e: ChangeEvent) => {\r\n setTeamEmail(e.currentTarget.value);\r\n };\r\n\r\n const handleTeamEmailBlur = (e: ChangeEvent) => {\r\n if (!emptyForm) setTeamEmailInvalid(!isEmailValid(e.currentTarget.value));\r\n };\r\n\r\n const resetTeamForm = () => {\r\n setTeamName('');\r\n setBackOfficeCode('');\r\n setTeamEmail('');\r\n };\r\n\r\n const handleSubmit = () => {\r\n if (organisation) {\r\n const request: AddTeamRequest = {\r\n organisationId: organisation.id,\r\n teamName: teamName,\r\n teamEmail: teamEmail,\r\n backOfficeTeamName: backOfficeCode,\r\n };\r\n SetAddTeamRequest(request);\r\n teamMutation(request, {\r\n onSuccess: () => resetTeamForm(),\r\n });\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {`${t('team_name', 'Team name')}:`}\r\n \r\n \r\n {t('team_name_input_error', 'Please add a team name to continue')}\r\n \r\n \r\n \r\n \r\n {`${t('lpa_backoffice_code', 'LPA Backoffice code')}:`}\r\n \r\n \r\n \r\n {t(\r\n 'lpa_backoffice_code_input_error',\r\n 'Please add a LPA backoffice code to continue'\r\n )}\r\n \r\n \r\n \r\n {`${t('team_email', 'Team email')}:`}\r\n \r\n \r\n {t('team_email_input_error', 'Please enter a valid email address')}\r\n \r\n \r\n \r\n \r\n \r\n {t('add_team', 'Add team')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import {\r\n useMutation,\r\n UseMutationOptions,\r\n UseMutationResult,\r\n useQueryClient,\r\n} from '@tanstack/react-query';\r\nimport { addTeam, AddTeamRequest, AddTeamResponse, API_QUERY_KEYS } from 'api';\r\n\r\nexport const useAddTeam = (\r\n options?: UseMutationOptions\r\n): UseMutationResult => {\r\n const queryClient = useQueryClient();\r\n return useMutation(addTeam, {\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageTeamConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getTeams] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getAllTeams] });\r\n },\r\n ...options,\r\n });\r\n};\r\n","import { AddTeamRequest } from 'api';\r\nimport { useState, useEffect, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { HttpError, MessageProps } from 'types';\r\n\r\nexport const useTeamMessageProps = (\r\n status: 'error' | 'success' | 'idle' | 'loading',\r\n error: unknown,\r\n payload?: AddTeamRequest | undefined\r\n): MessageProps => {\r\n const { t } = useTranslation('manage_organisation');\r\n\r\n const messagePropsLookup = useMemo(() => {\r\n const memorizedMessageProps: Record = {\r\n idle: {\r\n messageTitle: t('team_idle_message', ''),\r\n messageStatus: 'info',\r\n },\r\n error: {\r\n messageTitle: t(\r\n 'team_error_message',\r\n 'The team could not be created. Please try again.'\r\n ),\r\n messageStatus: 'error',\r\n },\r\n success: {\r\n messageTitle: t(\r\n 'team_created_success_message',\r\n 'The team has been successfully created.'\r\n ),\r\n messageStatus: 'success',\r\n },\r\n };\r\n\r\n return memorizedMessageProps;\r\n }, [t]);\r\n\r\n const [messageProps, setMessageProps] = useState(messagePropsLookup.idle);\r\n\r\n useEffect(() => {\r\n const errorMessageMapping = (property: string, errMsg: string) => {\r\n switch (property) {\r\n case 'TeamName':\r\n return t('team_duplicate_teamname_message', errMsg);\r\n case 'BackOfficeTeamName':\r\n return t('team_duplicate_backofficecode_message', errMsg);\r\n default:\r\n return errMsg;\r\n }\r\n };\r\n\r\n if (status !== 'loading') {\r\n const responseError = error as HttpError;\r\n const message = messagePropsLookup[status];\r\n if (responseError?.errors && status === 'error') {\r\n const errors: string[] = [];\r\n for (const err in responseError.errors) {\r\n const errMsg = errorMessageMapping(err, responseError.errors[err][0]);\r\n errors.push(errMsg);\r\n }\r\n message.messageErrors = errors;\r\n }\r\n\r\n if (status === 'success' && payload?.teamName) {\r\n message.messageTitle = `${t('team', 'Team')} ${payload.teamName} ${t(\r\n 'successfully_added',\r\n 'successfully added'\r\n )}.`;\r\n }\r\n\r\n if (\r\n messageProps.messageStatus !== message.messageStatus &&\r\n messageProps.messageTitle !== message.messageTitle\r\n ) {\r\n setMessageProps(message);\r\n }\r\n }\r\n }, [\r\n status,\r\n error,\r\n messagePropsLookup,\r\n setMessageProps,\r\n t,\r\n payload,\r\n messageProps.messageStatus,\r\n messageProps.messageTitle,\r\n ]);\r\n\r\n return messageProps;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AttentionMessage, Box, VStack } from '@tq/ui-components';\r\nimport { useGetTeams } from 'api';\r\nimport { useTeamColumns } from '../../hooks';\r\nimport {\r\n teamPageNumberState,\r\n teamPageSizeState,\r\n teamSearchState,\r\n teamEditingRowIdState,\r\n teamSortByColumnFilterState,\r\n teamSortByDescendingFilterState,\r\n teamsGetRequestState,\r\n} from 'store';\r\nimport { Organisation } from 'types';\r\nimport { SearchText, TeamTable } from 'components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { AddTeam } from './';\r\n\r\nexport type TeamsPanelProps = {\r\n organisation: Organisation | undefined;\r\n};\r\n\r\nexport const TeamsPanel: React.FC = ({ organisation }) => {\r\n const { t } = useTranslation('manage_organisation');\r\n const infoMsg = t(\r\n 'team_info_message',\r\n 'You must create an organisation before adding teams.'\r\n );\r\n const isMobile = useIsMobile();\r\n\r\n const columns = useTeamColumns(!!organisation?.email);\r\n\r\n const { data: teamsData } = useGetTeams(\r\n teamsGetRequestState,\r\n teamPageNumberState,\r\n organisation?.id,\r\n {\r\n enabled: !!organisation,\r\n refetchOnMount: false,\r\n }\r\n );\r\n\r\n return (\r\n \r\n {!organisation && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Team } from 'types';\r\nimport { DataTableColumns, VisuallyHidden } from '@tq/ui-components';\r\nimport {\r\n teamEditingRowIdState,\r\n teamEditingRowTeamNameState,\r\n teamEditingRowEmailState,\r\n teamEditingRowBackofficeCodeState,\r\n} from 'store';\r\nimport { EditableTableCell } from 'components/EditableTableCell';\r\nimport { isEmailValid } from 'tools';\r\nimport { useMemo } from 'react';\r\nimport { TeamRowEditButtons } from '../components';\r\n\r\nexport const useTeamColumns = (disableEmail: boolean): DataTableColumns[] => {\r\n const { t } = useTranslation('manage_organisation');\r\n const width = 220;\r\n\r\n const handleNameValidation = (value: string): boolean => {\r\n return value.length > 0;\r\n };\r\n\r\n const handleEmailValidation = (value: string): boolean => {\r\n return isEmailValid(value);\r\n };\r\n\r\n return useMemo(\r\n () => [\r\n {\r\n accessor: 'teamName',\r\n disableSortBy: false,\r\n Header: () => t('team_name', 'Team name'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 300,\r\n },\r\n {\r\n accessor: 'backOfficeCode',\r\n disableSortBy: true,\r\n Header: () => t('backoffice_code', 'Back Office code'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 300,\r\n },\r\n {\r\n accessor: 'email',\r\n disableSortBy: true,\r\n Header: () => t('team_email', 'Team email'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'msgDetail',\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n Header: () => {t('teams_header', 'Teams')},\r\n width: width,\r\n disableSortBy: true,\r\n },\r\n ],\r\n [disableEmail, t]\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { useResetRecoilState, useRecoilValue } from 'recoil';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useBanner } from '@tq/ui-components';\r\n\r\nimport { Team } from 'types';\r\nimport { useUpdateTeam } from 'api';\r\nimport { RowEditButtons } from '../RowEditButtons';\r\nimport { teamEditingRowIdState, teamUpdateRequestState } from 'store';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useTeamCanUpdate } from '../../hooks';\r\n\r\ninterface TeamRowEditButtonsProps extends CellProps {\r\n width: number;\r\n emailRequired: boolean;\r\n}\r\n\r\nexport const TeamRowEditButtons: React.FC = ({\r\n emailRequired,\r\n row,\r\n width,\r\n}) => {\r\n const { t } = useTranslation('create_organisation');\r\n const banner = useBanner();\r\n const updateRequest = useRecoilValue(teamUpdateRequestState);\r\n const resetEditingState = useResetRecoilState(teamEditingRowIdState);\r\n const disableUpdate = useTeamCanUpdate(emailRequired);\r\n\r\n const { mutate: updateTeam } = useUpdateTeam();\r\n const { teamId: id } = row.original;\r\n\r\n const handleUpdate = () => {\r\n updateTeam(\r\n { ...updateRequest, id },\r\n {\r\n onSuccess: () => {\r\n banner({\r\n id: 'update_team_success_id',\r\n title: t('team_update_success', 'Team has been updated'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n resetEditingState();\r\n },\r\n onError: () => {\r\n banner({\r\n id: 'update_team_fail_id',\r\n title: t('team_update_fail', 'The team could not be updated. Please try again.'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n resetEditingState();\r\n },\r\n }\r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport {\r\n teamEditingRowTeamNameState,\r\n teamEditingRowEmailState,\r\n teamEditingRowBackofficeCodeState,\r\n} from 'store';\r\nimport { isEmailValid } from 'tools';\r\n\r\nexport const useTeamCanUpdate = (emailRequired: boolean): boolean => {\r\n const [canUpdate, setCanUpdate] = useState(false);\r\n\r\n const name = useRecoilValue(teamEditingRowTeamNameState);\r\n const email = useRecoilValue(teamEditingRowEmailState);\r\n const backofficeCode = useRecoilValue(teamEditingRowBackofficeCodeState);\r\n\r\n const isValidString = (value: string): boolean => {\r\n return value.length > 0;\r\n };\r\n\r\n useEffect(() => {\r\n if (emailRequired) {\r\n setCanUpdate(\r\n isValidString(name) && isValidString(backofficeCode) && isEmailValid(email)\r\n );\r\n } else {\r\n setCanUpdate(isValidString(name) && isValidString(backofficeCode));\r\n }\r\n }, [name, email, setCanUpdate, emailRequired, backofficeCode]);\r\n\r\n return !canUpdate;\r\n};\r\n","import { useMutation, UseMutationResult, useQueryClient } from '@tanstack/react-query';\r\nimport { UpdateTeamRequest, UpdateTeamResponse, API_QUERY_KEYS, updateTeam } from 'api';\r\n\r\nexport const useUpdateTeam = (): UseMutationResult<\r\n UpdateTeamResponse,\r\n unknown,\r\n UpdateTeamRequest\r\n> => {\r\n const queryClient = useQueryClient();\r\n return useMutation(updateTeam, {\r\n onSettled: () => {\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getManageTeamConsultees] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getTeams] });\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getAllTeams] });\r\n },\r\n });\r\n};\r\n","import React from 'react';\r\nimport { Trans, useTranslation } from 'react-i18next';\r\nimport { FaExclamationCircle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n useBanner,\r\n} from '@tq/ui-components';\r\nimport { FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport { Consultee } from 'types';\r\nimport { useDeleteConsultee } from 'api';\r\nimport { BANNER_TIMEOUT } from 'config';\r\n\r\ntype UserDeletionModalProps = {\r\n isOpen: boolean;\r\n userToDelete: Consultee | undefined;\r\n onClose: () => void;\r\n};\r\n\r\nexport const UserDeletionModal: React.FC = ({\r\n isOpen,\r\n userToDelete,\r\n onClose,\r\n}) => {\r\n const { t } = useTranslation('userdeletion_modal');\r\n const { mutate: deleteConsultee } = useDeleteConsultee();\r\n const banner = useBanner();\r\n\r\n const handleCancel = () => {\r\n onClose();\r\n };\r\n\r\n const handleError = () => {\r\n onClose();\r\n banner({\r\n id: 'delete-user-banner-fail',\r\n title: t(\r\n 'banner_user_removed_failed',\r\n '{{consulteeName}} could not be deleted. Please try again.',\r\n { consulteeName: userToDelete?.consulteeName }\r\n ),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n };\r\n\r\n const handleConfirm = () => {\r\n if (userToDelete)\r\n deleteConsultee(userToDelete?.consulteeId, {\r\n onSuccess: () => {\r\n onClose();\r\n banner({\r\n id: 'remove-user-banner-success',\r\n title: t(\r\n 'banner_user_removed_success',\r\n '{{consulteeName}} has been successfully deleted',\r\n {\r\n consulteeName: userToDelete?.consulteeName,\r\n }\r\n ),\r\n duration: BANNER_TIMEOUT,\r\n status: 'success',\r\n });\r\n },\r\n onError: () => {\r\n handleError();\r\n },\r\n });\r\n };\r\n\r\n return (\r\n handleCancel()}>\r\n \r\n \r\n \r\n \r\n \r\n {t('delete_user_header', 'Delete user')}\r\n \r\n \r\n \r\n \r\n \r\n {userToDelete && (\r\n

    \r\n }}\r\n />\r\n

    \r\n )}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport { RecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useBanner } from '@tq/ui-components';\r\n\r\nimport { Consultee } from 'types';\r\nimport { useUpdateAdminUser } from 'api';\r\nimport { useUserTableCanUpdate } from 'pages';\r\nimport {\r\n manageOrganisationUserTableRequestState,\r\n manageOrganisationUserTableEditingRowState,\r\n manageUserDeleteState,\r\n manageUserToDeleteState,\r\n} from 'store';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { RowEditButtons } from '../RowEditButtons';\r\n\r\ninterface UserRowEditButtonsProps extends CellProps {\r\n width: number;\r\n editingState: RecoilState;\r\n}\r\n\r\nexport const UserRowEditButtons: React.FC = (props) => {\r\n const disableUpdate = useUserTableCanUpdate();\r\n\r\n const { t } = useTranslation('create_organisation');\r\n const banner = useBanner();\r\n const setShowModal = useSetRecoilState(manageUserDeleteState);\r\n const setUserToDelete = useSetRecoilState(manageUserToDeleteState);\r\n const updateUserRequest = useRecoilValue(manageOrganisationUserTableRequestState);\r\n const resetEditingState = useResetRecoilState(manageOrganisationUserTableEditingRowState);\r\n\r\n const { mutate: updateUser } = useUpdateAdminUser();\r\n\r\n const { original: consultee, index } = props.row;\r\n const { consulteeId: id } = props.row.original;\r\n\r\n const handleDelete = () => {\r\n setUserToDelete(consultee);\r\n setShowModal(true);\r\n };\r\n\r\n const handleUpdate = () => {\r\n updateUser(\r\n { ...updateUserRequest, id },\r\n {\r\n onSuccess: () => {\r\n banner({\r\n id: 'manage-team-banner',\r\n title: t('update_user_success', 'User has been updated'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n resetEditingState();\r\n },\r\n onError: () => {\r\n banner({\r\n id: 'manage-team-banner-fail',\r\n title: t('update_user_failed', 'The user could not be updated. Please try again.'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n resetEditingState();\r\n },\r\n }\r\n );\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport {\r\n manageOrganisationUserTableNameInputState,\r\n manageOrganisationUserTableEmailInputState,\r\n manageOrganisationUserTablePermissionState,\r\n manageOrganisationUserTableTeamsState,\r\n} from 'store';\r\nimport { isNameValid } from 'tools';\r\nimport { usePermissions } from '../../../api';\r\nimport { isNumeric } from '@tq/ui-components';\r\n\r\nexport const useUserTableCanUpdate = (): boolean => {\r\n const [canUpdate, setCanUpdate] = useState(false);\r\n const { data: permissionData } = usePermissions();\r\n const name = useRecoilValue(manageOrganisationUserTableNameInputState);\r\n const email = useRecoilValue(manageOrganisationUserTableEmailInputState);\r\n const permissionId = useRecoilValue(manageOrganisationUserTablePermissionState);\r\n const teamIds = useRecoilValue(manageOrganisationUserTableTeamsState);\r\n\r\n useEffect(() => {\r\n setCanUpdate(\r\n isNameValid(name) && isNumeric(permissionId) && permissionId > 0 && teamIds.length > 0\r\n );\r\n }, [name, email, permissionId, teamIds, setCanUpdate, permissionData]);\r\n\r\n return !canUpdate;\r\n};\r\n","import React from 'react';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AttentionMessage, VStack, Box, Flex } from '@tq/ui-components';\r\nimport { useRecoilState, useRecoilValue } from 'recoil';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport {\r\n manageConsulteePageNumberState,\r\n manageConsulteePageSizeState,\r\n manageConsulteeSearchState,\r\n manageOrganisationUserTableEditingRowState,\r\n manageUserDeleteState,\r\n manageUserToDeleteState,\r\n} from 'store';\r\nimport { Organisation } from 'types';\r\nimport { ManageTeamInviteUser, SearchText, UserTable } from 'components';\r\nimport { useUserTableColumns, useUserPanelRecords } from '../../hooks';\r\nimport { UserDeletionModal } from './UserDeletionModal';\r\n\r\nexport type UserPanelProps = {\r\n organisation?: Organisation;\r\n};\r\n\r\nexport const UsersPanel: React.FC = ({ organisation }) => {\r\n const { t } = useTranslation('create_organisation');\r\n const isMobile = useIsMobile();\r\n const [showModal, setShowModal] = useRecoilState(manageUserDeleteState);\r\n const userToDelete = useRecoilValue(manageUserToDeleteState);\r\n\r\n const { recordCount, totalCount, teamOptions, users, paginationInfo } =\r\n useUserPanelRecords(organisation);\r\n\r\n const handleClose = () => {\r\n setShowModal(false);\r\n };\r\n\r\n const columns = useUserTableColumns(teamOptions);\r\n\r\n return (\r\n \r\n {!teamOptions?.length && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {!users && (\r\n \r\n \r\n \r\n )}\r\n {\r\n <>\r\n \r\n \r\n }\r\n \r\n );\r\n};\r\n","import { useManageConsultees, useManageAllTeams } from 'api';\r\nimport { Consultee, PaginationInfo, ValueLabelResponse, Organisation } from 'types';\r\n\r\ninterface UseUserPanelRecordsResponse {\r\n users?: Consultee[];\r\n teamOptions?: ValueLabelResponse[];\r\n recordCount: number;\r\n totalCount: number;\r\n paginationInfo?: PaginationInfo;\r\n}\r\n\r\nexport const useUserPanelRecords = (\r\n organisation?: Organisation\r\n): UseUserPanelRecordsResponse => {\r\n const { data: consulteesQuery } = useManageConsultees(organisation?.organisationName);\r\n const { data: allTeams } = useManageAllTeams({\r\n parentOrganisationId: organisation?.id,\r\n });\r\n\r\n const teamOptions = allTeams?.organisations;\r\n\r\n if (!teamOptions) {\r\n return {\r\n recordCount: 0,\r\n totalCount: 0,\r\n };\r\n }\r\n\r\n return {\r\n users: consulteesQuery?.consultees.items,\r\n teamOptions: teamOptions,\r\n recordCount: consulteesQuery?.consultees.items.length ?? 0,\r\n totalCount: consulteesQuery?.paginationInfo.totalCount ?? 0,\r\n paginationInfo: consulteesQuery?.paginationInfo,\r\n };\r\n};\r\n","import React, { useMemo } from 'react';\r\n\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { VisuallyHidden, DataTableColumns } from '@tq/ui-components';\r\n\r\nimport { Consultee, ConsulteeTeam, ValueLabelResponse } from 'types';\r\nimport { EditableTableCell, TeamsTableCell, PermissionsTableCell } from 'components';\r\nimport {\r\n manageOrganisationUserTableEditingRowState,\r\n manageOrganisationUserTableNameInputState,\r\n manageOrganisationUserTableIsRegisteredState,\r\n manageOrganisationUserTablePermissionState,\r\n manageOrganisationUserTableTeamsState,\r\n} from 'store';\r\nimport { UserRowEditButtons, IsRegisteredTableCell } from '../components';\r\n\r\nexport const useUserTableColumns = (\r\n teamOptions: ValueLabelResponse[] | undefined\r\n): DataTableColumns[] => {\r\n const { t } = useTranslation('create_organisation');\r\n\r\n const teamsToValueLabelResponse = (teams: ConsulteeTeam[]): ValueLabelResponse[] => {\r\n return teams.map((team) => {\r\n return {\r\n value: team.teamId,\r\n label: team.teamName,\r\n };\r\n });\r\n };\r\n\r\n return useMemo(\r\n () => [\r\n {\r\n accessor: 'consulteeName',\r\n disableSortBy: false,\r\n Header: () => t('name', 'Name'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 180,\r\n },\r\n {\r\n accessor: 'email',\r\n disableSortBy: true,\r\n Header: () => t('email', 'Email'),\r\n Cell: (props: CellProps) => <>{props.row.original.email},\r\n width: 280,\r\n },\r\n {\r\n accessor: 'permissionName',\r\n disableSortBy: true,\r\n Header: () => t('permission', 'Permission'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'teams',\r\n disableSortBy: true,\r\n Header: () => t('teams', 'Team(s)'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'isRegistered',\r\n disableSortBy: true,\r\n Header: () => t('is_registered', 'Registered'),\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n width: 130,\r\n },\r\n {\r\n accessor: 'id',\r\n disableSortBy: true,\r\n Cell: (props: CellProps) => (\r\n \r\n ),\r\n Header: () => {t('manage_header', 'Manage')},\r\n width: 220,\r\n },\r\n ],\r\n [teamOptions, t]\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport {\r\n Container,\r\n Accordion,\r\n AccordionPanel,\r\n AccordionItem,\r\n AccordionIconButton,\r\n AccordionHeader,\r\n} from '@tq/ui-components';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { PageHeading } from 'components';\r\nimport { OrganisationDetailsPanel, TeamsPanel, UsersPanel } from './components';\r\nimport { organisationCreatedState } from 'store';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { Organisation } from 'types';\r\n\r\nexport type ManageOrganisationProps = {\r\n organisation?: Organisation;\r\n};\r\n\r\nexport const ManageOrganisation: React.FC = ({ organisation }) => {\r\n /**\r\n * Returns the main container UI for creating an Organisation.\r\n *\r\n * @remarks\r\n * TQ admins only\r\n */\r\n const { t } = useTranslation('manage_organisation');\r\n const location = useLocation();\r\n const newOrganisation = useRecoilValue(organisationCreatedState);\r\n\r\n const getDefaultIndex = (): [number] => {\r\n let defaultIndex = 0;\r\n if (location.pathname.endsWith('teams')) {\r\n defaultIndex = 1;\r\n }\r\n if (location.pathname.endsWith('users')) {\r\n defaultIndex = 2;\r\n }\r\n return [defaultIndex];\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

    \r\n \r\n \r\n {t('organisation_details', 'Organisation details')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n
    \r\n \r\n

    \r\n \r\n \r\n {t('teams', 'Teams')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n
    \r\n \r\n

    \r\n \r\n \r\n {t('users', 'Users')}\r\n \r\n \r\n \r\n

    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { ManageOrganisation } from './ManageOrganisation';\r\nimport { useResetOrganisationState } from '../../store';\r\n\r\nexport const CreateOrganisation: React.FC = () => {\r\n const resetState = useResetOrganisationState();\r\n\r\n useEffect(() => {\r\n resetState();\r\n }, [resetState]);\r\n\r\n return ;\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { ManageOrganisation } from './ManageOrganisation';\r\nimport { useParentOrganisation } from 'api';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useSetRecoilState, useResetRecoilState } from 'recoil';\r\nimport {\r\n organisationIdState,\r\n useResetOrganisationState,\r\n manageConsulteeRegistrationFilterState,\r\n} from 'store';\r\n\r\nexport const EditOrganisation: React.FC = () => {\r\n const { id } = useParams();\r\n const setOrganisationId = useSetRecoilState(organisationIdState);\r\n const { data: organisation } = useParentOrganisation(+(id ?? 0));\r\n const resetOrganisation = useResetOrganisationState();\r\n const resetRegistrationFilter = useResetRecoilState(manageConsulteeRegistrationFilterState);\r\n\r\n useEffect(() => {\r\n resetOrganisation();\r\n resetRegistrationFilter();\r\n setOrganisationId(+(id ?? 0));\r\n }, [setOrganisationId, id, resetOrganisation, resetRegistrationFilter]);\r\n\r\n return <>{organisation && };\r\n};\r\n","import { UseQueryResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { useSetRecoilState } from 'recoil';\r\n\r\nimport {\r\n GetParentOrganisationRequest,\r\n getParentOrganisation,\r\n API_QUERY_KEYS,\r\n QueryDefaults,\r\n} from 'api';\r\nimport { organisationState } from 'store';\r\nimport { Organisation } from 'types';\r\n\r\nexport const useParentOrganisation = (id: number): UseQueryResult => {\r\n const setOrganisation = useSetRecoilState(organisationState);\r\n const request: GetParentOrganisationRequest = { id };\r\n return useQuery(\r\n [API_QUERY_KEYS.getParentOrganisation, request],\r\n () => getParentOrganisation(request),\r\n {\r\n ...QueryDefaults,\r\n onSuccess: (data) => {\r\n setOrganisation(data);\r\n },\r\n }\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaExternalLinkAlt } from 'react-icons/fa';\r\nimport { useMsal } from '@azure/msal-react';\r\nimport { AttentionMessage, Box, Button, Container } from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nexport const Home: React.FC = () => {\r\n const { t } = useTranslation('home');\r\n const isMobile = useIsMobile();\r\n const { instance } = useMsal();\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n await instance.loginRedirect({\r\n scopes: [process.env.REACT_APP_B2C_SCOPE || ''],\r\n });\r\n }}\r\n justifySelf='center'\r\n rightIcon={}\r\n w={isMobile ? '100%' : 'inherit'}\r\n >\r\n {t('log_in', 'Log in')}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useRef, useEffect } from 'react';\r\nimport { useParams } from 'react-router-dom';\r\nimport WebViewer from '@pdftron/webviewer';\r\nimport { Box, Container } from '@tq/ui-components';\r\n\r\nconst pdfJsExpressLicense = process.env.REACT_APP_PDF_JS_EXPRESS_LICENSE as string;\r\n\r\nexport const Measure: React.FC = () => {\r\n const { path } = useParams();\r\n const viewerDiv = useRef(null);\r\n\r\n useEffect(() => {\r\n const matches = path?.match(\r\n /^(.*)%3Fsv%3D(.*)%26se%3D(.*)%26sr%3D(.*)%26sp%3D(.*)%26sig%3D(.*)$/\r\n );\r\n const url = matches\r\n ? `${decodeURIComponent(matches[1])}?sv=${matches[2]}&se=${matches[3]}&sr=${\r\n matches[4]\r\n }&sp=${matches[5]}&sig=${matches[6]}`\r\n : path;\r\n\r\n WebViewer(\r\n {\r\n path: '/pdfjsexpress',\r\n initialDoc: url,\r\n enableMeasurement: true,\r\n disabledElements: [\r\n 'ribbons',\r\n 'toggleNotesButton',\r\n 'contextMenuPopup',\r\n 'annotationCommentButton',\r\n ],\r\n licenseKey: pdfJsExpressLicense,\r\n },\r\n viewerDiv.current as HTMLDivElement\r\n ).then((instance) => {\r\n instance.UI.setToolbarGroup('toolbarGroup-Measure');\r\n });\r\n }, [path]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n","import { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, DataTableColumns, HStack, Button, useBanner } from '@tq/ui-components';\r\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { IncomingConsultation, IncomingConsultationRequestStatus, ReportData } from 'types';\r\nimport { postRetryIncomingConsultation } from 'api';\r\nimport { useEffect, useState } from 'react';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\n\r\nexport const useIncomingConsultationsTrafficMonitorColumns = (\r\n isRefreshing: boolean\r\n): DataTableColumns[] => {\r\n const [disableButton, setDisabledButton] = useState(false);\r\n const { t } = useTranslation('traffic_monitor');\r\n const banner = useBanner();\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n useEffect(() => {\r\n if (isRefreshing && disableButton) {\r\n setDisabledButton(!disableButton);\r\n }\r\n }, [disableButton, isRefreshing]);\r\n\r\n const handleRetry = async (incomingConsultationId: number) => {\r\n setDisabledButton(!disableButton);\r\n const response = await postRetryIncomingConsultation({\r\n id: incomingConsultationId,\r\n topicName: 'IncomingConsultationReceived',\r\n });\r\n banner({\r\n id: 'retry-banner',\r\n title: response.body,\r\n });\r\n };\r\n\r\n return [\r\n {\r\n accessor: 'id',\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('request_id', 'Request ID'),\r\n width: 50,\r\n },\r\n {\r\n accessor: 'messageId',\r\n Cell: (cellProps: { value: string }) => cellProps.value,\r\n Header: () => t('message_id', 'Message ID'),\r\n disableSortBy: true,\r\n width: 260,\r\n },\r\n {\r\n accessor: 'newOrUpdate',\r\n Cell: (cellProps: { value: string }) => (cellProps.value === 'N' ? 'New' : 'Update'),\r\n Header: () => t('new_or_update', 'New or Update'),\r\n disableSortBy: true,\r\n width: 50,\r\n },\r\n {\r\n accessor: 'documentCount',\r\n Cell: (cellProps: { value: number }) =>\r\n cellProps.value > 0\r\n ? cellProps.value === 1\r\n ? '1 Document'\r\n : cellProps.value + ' Documents'\r\n : 'None',\r\n Header: () => t('documents_attached', 'Documents attached'),\r\n disableSortBy: true,\r\n width: 300,\r\n },\r\n {\r\n accessor: 'incomingStatus',\r\n Cell: (cellProps: { value: IncomingConsultationRequestStatus }) => (\r\n \r\n \r\n {cellProps.value === 'Processed' ? : }\r\n \r\n {cellProps.value}\r\n \r\n ),\r\n Header: () => t('status_header', 'Status'),\r\n disableSortBy: true,\r\n width: 100,\r\n },\r\n {\r\n accessor: 'dateCreated',\r\n Cell: (cellProps: { value: string }) =>\r\n formatLocaleDate(cellProps.value, StandardDateFormats.dateAndTime).toLowerCase(),\r\n Header: () => t('date_request_created', 'Date request created'),\r\n width: 420,\r\n },\r\n {\r\n accessor: 'retry',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n handleRetry(original.id)}\r\n disabled={disableButton}\r\n >\r\n {t('retry_label', 'Retry')}\r\n \r\n ),\r\n width: 50,\r\n disableSortBy: true,\r\n },\r\n ];\r\n};\r\n","import {\r\n apiPost,\r\n PostRetryIncomingConsultationRequest,\r\n PostRetryIncomingConsultationResponse,\r\n} from 'api';\r\n\r\nexport const postRetryIncomingConsultation = (\r\n request: PostRetryIncomingConsultationRequest\r\n): Promise =>\r\n apiPost(\r\n `admin/publishevent`,\r\n request\r\n );\r\n","import { useTranslation } from 'react-i18next';\r\nimport { CallDirection, FilterOption, GenericValueLabel } from '../../../types';\r\n\r\nexport const useTrafficMonitorFilters = (direction: CallDirection): FilterOption[] => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const httpCodes = [\r\n 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 305, 400, 401, 402, 403, 404, 405, 500,\r\n 501, 502, 503, 504, 505,\r\n ];\r\n const callTypes =\r\n direction === 'Inbound'\r\n ? [\r\n {\r\n value: 'InboundConsultationRequest',\r\n label: t('InboundConsultationRequest', 'Inbound Consultation Request'),\r\n },\r\n {\r\n value: 'InboundResponseResult',\r\n label: t('InboundResponseResult', 'Inbound Response Result'),\r\n },\r\n {\r\n value: 'InboundExtensionResult',\r\n label: t('InboundExtensionResult', 'Inbound Extension Result'),\r\n },\r\n ]\r\n : [\r\n {\r\n value: 'OutboundConsultationNote',\r\n label: t('OutboundConsultationNote', 'Outbound Consultation Note'),\r\n },\r\n {\r\n value: 'OutboundExtensionRequest',\r\n label: t('OutboundExtensionRequest', 'Outbound Extension Request'),\r\n },\r\n {\r\n value: 'OutboundConsultationResponse',\r\n label: t('OutboundConsultationResponse', 'Outbound Consultation Response'),\r\n },\r\n ];\r\n\r\n return [\r\n createFilterOptionItem(\r\n direction,\r\n 'keyword',\r\n t('keyword', 'Search for planning applications'),\r\n undefined,\r\n false,\r\n true\r\n ),\r\n createFilterOptionItem(direction, 'apiCalls', t('api_call_type', 'API Call'), [\r\n ...callTypes,\r\n ]),\r\n createFilterOptionItem(direction, 'statuses', t('status_type', 'Status'), [\r\n {\r\n value: 'success',\r\n label: t('success', 'Success'),\r\n },\r\n {\r\n value: 'fail',\r\n label: t('fail', 'Fail'),\r\n },\r\n ]),\r\n createFilterOptionItem(direction, 'httpCodes', t('httpcode_type', 'HTTP Code'), [\r\n ...httpCodes.map((httpCode) => ({\r\n value: httpCode,\r\n label: httpCode.toString(),\r\n })),\r\n ]),\r\n ];\r\n};\r\n\r\nexport const createFilterOptionItem = (\r\n direction: CallDirection,\r\n name: string,\r\n header: string,\r\n items: GenericValueLabel[] | undefined,\r\n allowMultiSelect?: boolean | null,\r\n isSearchText?: boolean | null\r\n): FilterOption => {\r\n return {\r\n name,\r\n header,\r\n items: items ?? [],\r\n selectedItems: [],\r\n allowMultiSelect: allowMultiSelect ?? true,\r\n isSearchText: isSearchText ?? false,\r\n };\r\n};\r\n","import React, { useState } from 'react';\r\nimport { FaFileAlt } from 'react-icons/fa';\r\nimport {\r\n Box,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n Button,\r\n LinkButton,\r\n Typography,\r\n} from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuditRequest } from 'types';\r\n\r\ntype RequestDetailsProps = {\r\n details: AuditRequest;\r\n};\r\n\r\nexport const RequestDetails: React.FC = ({ details }) => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const modalHeight = '100vh - 7.5rem';\r\n const modalHeaderHeight = '4.0625rem';\r\n const urlSubtitleHeight = '3.625rem';\r\n const jsonMessageMarginX = '4rem';\r\n const modalFooterHeight = '6.8125rem';\r\n const isInboundDirection = details.direction === 'Inbound';\r\n\r\n const formatJsonString = (jsonString: string) => {\r\n try {\r\n const dataObj = JSON.parse(jsonString);\r\n return JSON.stringify(dataObj, null, 4);\r\n } catch {\r\n return jsonString;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n setIsOpen(true)}>\r\n {t('view_details', 'View details')}\r\n \r\n setIsOpen(false)} isOpen={isOpen} scrollBehavior='inside'>\r\n \r\n \r\n \r\n \r\n \r\n {t('call_details', 'Call details')}\r\n \r\n \r\n \r\n \r\n \r\n

    {`${t('url', 'URL')}: ${details.apiUrl}`}

    \r\n \r\n \r\n \r\n {isInboundDirection && (\r\n
    \r\n \r\n

    {t('response_json', 'ResponseJson')}

    \r\n
    \r\n \r\n
    {formatJsonString(details.responseJson)}
    \r\n \r\n
    \r\n )}\r\n \r\n

    {t('msg_details', 'MsgDetails')}

    \r\n
    \r\n \r\n
    {formatJsonString(details.detail)}
    \r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\nimport { FilterOption, GenericValueLabel } from '../../../types';\r\n\r\nexport const useExceptionLogsFilters = (): FilterOption[] => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const exceptionLogTypes = [\r\n {\r\n value: 'ConsultationException',\r\n label: t('IncomingConsultation', 'Incoming Consultation'),\r\n },\r\n {\r\n value: 'ResponseException',\r\n label: t('IncomingResponse', 'Incoming Response'),\r\n },\r\n {\r\n value: 'ExtensionException',\r\n label: t('IncomingExtension', 'Incoming Extension'),\r\n },\r\n {\r\n value: 'DocumentException',\r\n label: t('IncomingDocument', 'Incoming Document'),\r\n },\r\n ];\r\n\r\n return [\r\n createFilterOptionItemWithDefaultValues(\r\n 'keyword',\r\n t('keyword', 'Search for planning applications'),\r\n undefined,\r\n false,\r\n true\r\n ),\r\n createFilterOptionItemWithDefaultValues(\r\n 'exceptionLogType',\r\n t('exception_type', 'Exception Type'),\r\n [...exceptionLogTypes],\r\n false,\r\n false,\r\n [{ value: 'ConsultationException', label: 'Incoming Consultation' }]\r\n ),\r\n ];\r\n};\r\n\r\nexport const createFilterOptionItemWithDefaultValues = (\r\n name: string,\r\n header: string,\r\n items: GenericValueLabel[] | undefined,\r\n allowMultiSelect?: boolean | null,\r\n isSearchText?: boolean | null,\r\n selectedItems?: GenericValueLabel[] | undefined\r\n): FilterOption => {\r\n return {\r\n name,\r\n header,\r\n items: items ?? [],\r\n selectedItems: selectedItems ?? [],\r\n allowMultiSelect: allowMultiSelect ?? true,\r\n isSearchText: isSearchText ?? false,\r\n };\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const GenerateGuidanceList: React.FC = () => {\r\n const { t } = useTranslation('traffic_monitor');\r\n\r\n const guidanceDefinitions = [\r\n t(\r\n 'When_attempting_to_retry_a_request,_always_retry_the_most_recent_first',\r\n 'When attempting to retry a request, always retry the most recent first'\r\n ),\r\n t('Only_one_request_at_a_time', 'Only one request at a time'),\r\n t(\r\n 'Refresh_the_table_in_order_to_see_the_updated_status',\r\n 'Refresh the table in order to see the updated status'\r\n ),\r\n t(\r\n 'If_a_request_fails_after_retrying,_please_move_to_the_next_-_request',\r\n 'If a request fails after retrying, please move to the next - request'\r\n ),\r\n t(\r\n 'Contact_the_system_administrator_if_a_request_continues_to_fail',\r\n 'Contact the system administrator if a request continues to fail'\r\n ),\r\n ];\r\n\r\n return (\r\n
      \r\n {guidanceDefinitions.map((e) => {\r\n return (\r\n
    • \r\n \r\n {e}\r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n );\r\n};\r\n","import React, { useRef, useState } from 'react';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n Container,\r\n DataTable,\r\n Flex,\r\n Grid,\r\n Spinner,\r\n TableState,\r\n} from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { useIncomingConsultations } from '../../../api';\r\nimport { DataTablePagination, SearchPlanningApplications } from '../../../components';\r\nimport { useIncomingConsultationsTrafficMonitorColumns } from '../hooks';\r\nimport { ReportData } from '../../../types';\r\nimport {\r\n UseIncomingConsultationsTrafficMonitorState,\r\n incomingConsultationsByReferenceNumberState,\r\n} from '../../../store';\r\n\r\nimport { GenerateGuidanceList } from './GenerateGuidanceList';\r\n\r\nexport const IncomingConsultationsMonitorTable: React.FC = () => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const [isRefreshing, setIsRefreshing] = useState(false);\r\n\r\n const incomingConsultationsByReferenceNumber = useRecoilValue(\r\n incomingConsultationsByReferenceNumberState\r\n );\r\n\r\n const {\r\n data: incomingConsultationsData,\r\n isLoading,\r\n isInitialLoading,\r\n error,\r\n status,\r\n fetchStatus,\r\n refetch,\r\n } = useIncomingConsultations({\r\n enabled: !!incomingConsultationsByReferenceNumber,\r\n networkMode: 'online',\r\n });\r\n\r\n const { pageNumberState, pageSizeState, orderByColumnState, orderByDescendingState } =\r\n UseIncomingConsultationsTrafficMonitorState();\r\n const columns = useIncomingConsultationsTrafficMonitorColumns(isRefreshing);\r\n const tableRef = useRef(null);\r\n const setOrderByColumn = useSetRecoilState(orderByColumnState);\r\n const setOrderByDescending = useSetRecoilState(orderByDescendingState);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n const orderByColumn = state.sortBy?.[0]?.id;\r\n const orderByDescending = state.sortBy?.[0]?.desc ?? false;\r\n\r\n if (orderByColumn) {\r\n setOrderByColumn(orderByColumn);\r\n setOrderByDescending(orderByDescending);\r\n }\r\n };\r\n\r\n const handleRefetch = () => {\r\n refetch()\r\n .then(() => {\r\n setIsRefreshing(true);\r\n })\r\n .finally(() => {\r\n setIsRefreshing(false);\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n }\r\n w='100%'\r\n maxWidth={{ base: '100%', lg: 'contentWidth' }}\r\n className='attention-message-small'\r\n />\r\n \r\n {isInitialLoading && isLoading ? (\r\n \r\n \r\n \r\n ) : !incomingConsultationsByReferenceNumber ? (\r\n \r\n ) : error ||\r\n (!incomingConsultationsData &&\r\n status === 'loading' &&\r\n fetchStatus === 'paused') ? (\r\n \r\n ) : !incomingConsultationsData?.incomingConsultations?.items?.length ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { QueryObserverResult, useQuery, UseQueryOptions } from '@tanstack/react-query';\r\nimport { API_QUERY_KEYS, QueryDefaults } from 'api';\r\nimport { GetExceptionLogsRequest, GetExceptionLogsResponse } from '../fragments';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\nimport { getExceptionLogs } from '../methods/getExceptionLogs';\r\n\r\nimport { exceptionLogsRequestState, exceptionLogsPageNumberState } from 'store';\r\n\r\nexport const useExceptionLogs = (\r\n options?: UseQueryOptions\r\n): QueryObserverResult => {\r\n const setPageNumberState = useSetRecoilState(exceptionLogsPageNumberState);\r\n const stateValue = useRecoilValue(exceptionLogsRequestState);\r\n const request = { ...stateValue } as unknown as GetExceptionLogsRequest;\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getExceptionLogs, request],\r\n () => getExceptionLogs(request),\r\n {\r\n ...QueryDefaults,\r\n ...options,\r\n onSuccess: (data: GetExceptionLogsResponse) => {\r\n if (data?.paginationInfo?.totalCount > 0 && data?.exceptions.items.length === 0) {\r\n setPageNumberState(1);\r\n }\r\n },\r\n onError: (err: unknown) => ({\r\n err,\r\n }),\r\n }\r\n );\r\n};\r\n","import { apiGet } from 'api';\r\nimport { GetExceptionLogsRequest, GetExceptionLogsResponse } from '../fragments';\r\n\r\nexport const getExceptionLogs = (\r\n request: GetExceptionLogsRequest\r\n): Promise =>\r\n apiGet('exceptions', request);\r\n","import React, { useEffect } from 'react';\r\nimport { useRecoilState } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { TableFiltersWithDate } from 'components';\r\nimport {\r\n exceptionLogsTextSearchState,\r\n exceptionLogsEndDateState,\r\n exceptionLogsFiltersState,\r\n exceptionLogsStartDateState,\r\n} from 'store';\r\nimport { FilterOption } from 'types';\r\n\r\ntype ExceptionLogsMonitorFiltersProps = {\r\n filters: FilterOption[];\r\n collapsible?: boolean;\r\n};\r\n\r\nexport const ExceptionLogsMonitorFilters: React.FC = ({\r\n filters,\r\n collapsible = true,\r\n}) => {\r\n const [monitorFilters, setMonitorFilters] = useRecoilState(exceptionLogsFiltersState);\r\n const [monitorStartDate, setMonitorStartDate] = useRecoilState(exceptionLogsStartDateState);\r\n const [monitorEndDate, setMonitorEndDate] = useRecoilState(exceptionLogsEndDateState);\r\n const { t } = useTranslation('monitor');\r\n\r\n useEffect(() => {\r\n setMonitorFilters(filters);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { QueryObserverResult, UseQueryOptions, useQuery } from '@tanstack/react-query';\r\nimport { GetExceptionLogDetailsRequest, GetExceptionLogDetailsResponse } from '../fragments';\r\nimport { API_QUERY_KEYS, QueryDefaults } from 'api/constants';\r\nimport { getExceptionLogDetails } from '../methods/getExceptionLogDetails';\r\n\r\nexport const useExceptionLogDetails = (\r\n request: GetExceptionLogDetailsRequest,\r\n options?: UseQueryOptions\r\n): QueryObserverResult => {\r\n return useQuery(\r\n [API_QUERY_KEYS.getExceptionLogDetails, request],\r\n () => getExceptionLogDetails(request),\r\n {\r\n ...QueryDefaults,\r\n ...options,\r\n onSuccess: (data: GetExceptionLogDetailsResponse) => data,\r\n onError: (err: unknown) => ({\r\n err,\r\n }),\r\n }\r\n );\r\n};\r\n","import { GetExceptionLogDetailsRequest, GetExceptionLogDetailsResponse } from '../fragments';\r\nimport { apiGet } from 'api/utils';\r\n\r\nexport const getExceptionLogDetails = (\r\n request: GetExceptionLogDetailsRequest\r\n): Promise =>\r\n apiGet(\r\n `exceptions/${request.exceptionLogType}/${request.exceptionId}/`\r\n );\r\n","import React, { useEffect, useState } from 'react';\r\nimport { FaFileAlt } from 'react-icons/fa';\r\nimport {\r\n Box,\r\n Grid,\r\n Modal,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalContent,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalOverlay,\r\n Button,\r\n Typography,\r\n} from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ExceptionLogDetails } from 'types';\r\nimport { exceptionLogsDetailsModalState, exceptionLogsDetailsState } from 'store';\r\nimport { useRecoilState, useRecoilValue } from 'recoil';\r\nimport { useExceptionLogDetails } from 'api/trafficMonitor/hooks/useExceptionLogDetails';\r\n\r\nexport const ExceptionLogMonitorDetails: React.FC = () => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const [isOpen, setIsOpen] = useRecoilState(exceptionLogsDetailsModalState);\r\n const detailsRequest = useRecoilValue(exceptionLogsDetailsState);\r\n const [exceptionDetails, setExceptionDetails] = useState();\r\n const modalHeight = '100vh - 7.5rem';\r\n const modalHeaderHeight = '4.0625rem';\r\n const urlSubtitleHeight = '3.625rem';\r\n const jsonMessageMarginX = '4rem';\r\n const modalFooterHeight = '6.8125rem';\r\n\r\n const { data: _exceptionDetails } = useExceptionLogDetails({\r\n exceptionLogType: detailsRequest?.exceptionLogType ?? 'ConsultationException',\r\n exceptionId: detailsRequest?.id ?? 0,\r\n });\r\n\r\n const formatJsonString = (jsonString: string) => {\r\n try {\r\n const dataObj = JSON.parse(jsonString);\r\n return JSON.stringify(dataObj, null, 4);\r\n } catch {\r\n return jsonString;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (detailsRequest && isOpen) {\r\n setExceptionDetails(_exceptionDetails as unknown as ExceptionLogDetails);\r\n }\r\n }, [_exceptionDetails, detailsRequest, isOpen]);\r\n\r\n const header = (\r\n \r\n \r\n \r\n {t('exception_details', 'Exception details')}\r\n \r\n \r\n \r\n );\r\n\r\n function getModalBody() {\r\n return (\r\n \r\n \r\n \r\n

    \r\n {t('exception_id', 'Id')}: {exceptionDetails?.id}\r\n

    \r\n

    \r\n {t('exception_log_type', 'Type')}: {exceptionDetails?.exceptionLogType}\r\n

    \r\n

    \r\n {t('application_reference_number', 'Application Reference Number')}:{' '}\r\n {exceptionDetails?.planningApplicationReferenceNo}\r\n

    \r\n

    \r\n {t('date', 'Date & time')}: {exceptionDetails?.date}\r\n

    \r\n

    \r\n {t('filename', 'File name')}: {exceptionDetails?.fileName}\r\n

    \r\n
    \r\n \r\n \r\n \r\n {\r\n
    \r\n \r\n

    {t('message', 'Message')}

    \r\n
    \r\n \r\n
    {formatJsonString(exceptionDetails?.message ?? '')}
    \r\n \r\n
    \r\n }\r\n \r\n

    {t('stackTrace', 'Stack Trace')}

    \r\n
    \r\n \r\n
    {formatJsonString(exceptionDetails?.stackTrace ?? '')}
    \r\n
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n setIsOpen(false)} isOpen={isOpen} scrollBehavior='inside'>\r\n \r\n \r\n {header}\r\n {getModalBody()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useRef } from 'react';\r\nimport { Box, Container, DataTable, Flex, Grid, Spinner, TableState } from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { DataTablePagination, EmptyDataCard } from '../../../components';\r\nimport { ReportData } from 'types';\r\nimport {\r\n exceptionLogsDetailsModalState,\r\n exceptionLogsOrderByColumnState,\r\n exceptionLogsOrderByDescendingState,\r\n exceptionLogsPageNumberState,\r\n exceptionLogsPageSizeState,\r\n exceptionLogsSortByState,\r\n} from 'store';\r\nimport { useExceptionLogs } from 'api/trafficMonitor/hooks/useExceptionLogs';\r\nimport { useExceptionLogsColumns, useExceptionLogsFilters } from '../hooks';\r\nimport { ExceptionLogsMonitorFilters } from './ExceptionLogsMonitorFilters';\r\nimport { ExceptionLogMonitorDetails } from './ExceptionLogMonitorDetails';\r\n\r\nexport const ExceptionLogsMonitorTable: React.FC = () => {\r\n const { t } = useTranslation('traffic_monitor');\r\n\r\n const { data: exceptionsRequestData, isLoading } = useExceptionLogs();\r\n const filters = useExceptionLogsFilters();\r\n const columns = useExceptionLogsColumns();\r\n const tableRef = useRef(null);\r\n const sortBy = useRecoilValue(exceptionLogsSortByState);\r\n const setOrderByColumn = useSetRecoilState(exceptionLogsOrderByColumnState);\r\n const setOrderByDescending = useSetRecoilState(exceptionLogsOrderByDescendingState);\r\n const isModalOpen = useRecoilValue(exceptionLogsDetailsModalState);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n const newOrderByColumn = state.sortBy?.[0]?.id;\r\n const newOrderByDescending = state.sortBy?.[0]?.desc ?? false;\r\n\r\n if (newOrderByColumn) {\r\n setOrderByColumn(newOrderByColumn);\r\n setOrderByDescending(newOrderByDescending);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : !exceptionsRequestData?.exceptions?.items.length ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n {isModalOpen && }\r\n \r\n );\r\n};\r\n","import { Box, LinkButton, DataTableColumns } from '@tq/ui-components';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSetRecoilState } from 'recoil';\r\nimport { ExceptionLog, ReportData } from 'types';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\nimport { useExceptionLogsFilters } from '../hooks';\r\nimport { exceptionLogsDetailsModalState, exceptionLogsDetailsState } from 'store';\r\n\r\nexport const useExceptionLogsColumns = (): DataTableColumns[] => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n const filter = useExceptionLogsFilters().find(\r\n (exLogFilter) => exLogFilter.name === 'exceptionLogType'\r\n );\r\n const setIsOpen = useSetRecoilState(exceptionLogsDetailsModalState);\r\n const setDetails = useSetRecoilState(exceptionLogsDetailsState);\r\n\r\n return [\r\n {\r\n accessor: 'date',\r\n Cell: (cellProps: { value: string }) =>\r\n formatLocaleDate(cellProps.value, StandardDateFormats.dateAndTime).toLowerCase(),\r\n disableSortBy: false,\r\n Header: () => t('date_time_call_header', 'Date & time'),\r\n width: 120,\r\n },\r\n {\r\n accessor: 'planningApplicationReferenceNo',\r\n Cell: (cellProps: { value: string }) => (\r\n <>\r\n \r\n {cellProps.value}\r\n \r\n \r\n ),\r\n Header: () => t('parn_header', 'Application reference number'),\r\n width: 150,\r\n },\r\n {\r\n accessor: 'exceptionLogType',\r\n Cell: (cellProps: { value: string }) => {\r\n const exceptionType = filter?.items.find((type) => type.value === cellProps.value);\r\n return (\r\n <>\r\n \r\n {exceptionType?.label}\r\n \r\n \r\n );\r\n },\r\n disableSortBy: false,\r\n Header: () => t('exception_type_header', 'Exception Type'),\r\n width: 120,\r\n },\r\n {\r\n accessor: 'message',\r\n Cell: (cellProps: { value: string }) => (\r\n <>{cellProps.value.substring(0, 80).concat('...')}\r\n ),\r\n disableSortBy: true,\r\n Header: () => t('message_header', 'Message'),\r\n width: 260,\r\n },\r\n {\r\n accessor: 'msgDetail',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n {\r\n setDetails(original);\r\n setIsOpen(true);\r\n }}\r\n >\r\n {t('view_details', 'View details')}\r\n \r\n ),\r\n Header: () => t('detail_header', 'Details'),\r\n width: 60,\r\n disableSortBy: true,\r\n },\r\n ];\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useRecoilState } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { TableFiltersWithDate } from 'components';\r\nimport { UseTrafficMonitorState } from 'store';\r\nimport { CallDirection, FilterOption } from 'types';\r\n\r\ntype MonitorFiltersProps = {\r\n direction: CallDirection;\r\n filters: FilterOption[];\r\n collapsible?: boolean;\r\n};\r\n\r\nexport const MonitorFilters: React.FC = ({\r\n direction,\r\n filters,\r\n collapsible = true,\r\n}) => {\r\n const { filterState, startDateState, endDateState, textSearchState } =\r\n UseTrafficMonitorState(direction);\r\n const [monitorFilters, setMonitorFilters] = useRecoilState(filterState);\r\n const [monitorStartDate, setMonitorStartDate] = useRecoilState(startDateState);\r\n const [monitorEndDate, setMonitorEndDate] = useRecoilState(endDateState);\r\n const { t } = useTranslation('monitor');\r\n useEffect(() => {\r\n setMonitorFilters(filters);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { useRef } from 'react';\r\nimport {\r\n AttentionMessage,\r\n Box,\r\n Container,\r\n DataTable,\r\n Flex,\r\n Grid,\r\n Spinner,\r\n TableState,\r\n} from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport { useAuditRequests } from 'api';\r\nimport { UseTrafficMonitorState } from 'store';\r\nimport { CallDirection, ReportData } from 'types';\r\nimport { DataTablePagination, EmptyDataCard } from '../../../components';\r\nimport { useTrafficMonitorColumns, useTrafficMonitorFilters } from '../hooks';\r\nimport { MonitorFilters } from './MonitorFilters';\r\n\r\ntype MonitorTableProps = {\r\n callDirection: CallDirection;\r\n};\r\n\r\nexport const MonitorTable: React.FC = ({ callDirection }) => {\r\n const { t } = useTranslation('traffic_monitor');\r\n\r\n const { isLoading } = useAuditRequests(callDirection);\r\n const {\r\n pageNumberState,\r\n pageSizeState,\r\n sortByState,\r\n orderByColumnState,\r\n orderByDescendingState,\r\n resultsDataState,\r\n paginationState,\r\n } = UseTrafficMonitorState(callDirection);\r\n const filters = useTrafficMonitorFilters(callDirection);\r\n const columns = useTrafficMonitorColumns();\r\n const tableRef = useRef(null);\r\n const sortBy = useRecoilValue(sortByState);\r\n const results = useRecoilValue(resultsDataState);\r\n const paginationInfo = useRecoilValue(paginationState);\r\n const setOrderByColumn = useSetRecoilState(orderByColumnState);\r\n const setOrderByDescending = useSetRecoilState(orderByDescendingState);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n const newOrderByColumn = state.sortBy?.[0]?.id;\r\n const newOrderByDescending = state.sortBy?.[0]?.desc ?? false;\r\n\r\n if (newOrderByColumn) {\r\n setOrderByColumn(newOrderByColumn);\r\n setOrderByDescending(newOrderByDescending);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {callDirection === 'Inbound' && (\r\n \r\n )}\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : !results?.length ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, DataTableColumns, HStack } from '@tq/ui-components';\r\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { AuditRequest, AuditRequestStatus, ReportData } from 'types';\r\nimport { RequestDetails } from '../components/RequestDetails';\r\nimport { useFormatLocaleDate, StandardDateFormats } from 'config';\r\n\r\nexport const useTrafficMonitorColumns = (): DataTableColumns[] => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return [\r\n {\r\n accessor: 'date',\r\n Cell: (cellProps: { value: string }) =>\r\n formatLocaleDate(cellProps.value, StandardDateFormats.dateAndTime).toLowerCase(),\r\n disableSortBy: false,\r\n Header: () => t('date_time_call_header', 'Date & time of call'),\r\n width: 250,\r\n },\r\n {\r\n accessor: 'planningApplicationReferenceNo',\r\n Cell: (cellProps: { value: string }) => (\r\n <>\r\n \r\n {cellProps.value}\r\n \r\n \r\n ),\r\n Header: () => t('parn_header', 'Application reference number'),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'apiCall',\r\n Cell: (cellProps: { value: string }) => (\r\n <>\r\n \r\n {cellProps.value}\r\n \r\n \r\n ),\r\n disableSortBy: false,\r\n Header: () => t('api_call_header', 'Type of API call'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'status',\r\n Cell: (cellProps: { value: AuditRequestStatus }) => (\r\n \r\n \r\n {cellProps.value === 'Success' ? : }\r\n \r\n \r\n {cellProps.value === 'Success' ? t('success', 'Success') : t('fail', 'Fail')}\r\n \r\n \r\n ),\r\n Header: () => t('status_header', 'Status'),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'httpCode',\r\n Cell: (cellProps: { value: string }) => (\r\n <>\r\n \r\n {cellProps.value}\r\n \r\n \r\n ),\r\n Header: () => t('httpcode_header', 'HTTP Code'),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'msgDetail',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n \r\n ),\r\n Header: () => t('detail_header', 'Details'),\r\n width: 200,\r\n disableSortBy: true,\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Container,\r\n Tab,\r\n TabList,\r\n TabPanel,\r\n TabPanels,\r\n Tabs,\r\n TabText,\r\n} from '@tq/ui-components';\r\n\r\nimport { PageHeading } from 'components';\r\nimport {\r\n IncomingConsultationsMonitorTable,\r\n MonitorTable,\r\n ExceptionLogsMonitorTable,\r\n} from './components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport const Monitor: React.FC = () => {\r\n const { t } = useTranslation('traffic_monitor');\r\n const tabLabels = [\r\n t('inbound_calls', 'Inbound calls'),\r\n t('outbound_calls', 'Outbound calls'),\r\n t('incoming_consultations', 'Incoming consultations'),\r\n t('exceptions', 'Exceptions'),\r\n ];\r\n\r\n const tabPanelStyle = {\r\n border: { base: 'none', lg: `1px solid ${COLOURS.gray[400]}` },\r\n px: { base: 0, lg: 5 },\r\n py: { base: 0, lg: 4 },\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {tabLabels.map((tabLabel) => (\r\n \r\n {tabLabel}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { FaCogs } from 'react-icons/fa';\r\nimport { AttentionMessage, Card, Container, Heading, HStack, VStack } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport const ErrorContent: React.FC<{ title: string; description: string }> = ({\r\n title,\r\n description,\r\n}) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorContent } from './ErrorContent';\r\n\r\nexport const PageNotFound: React.FC = () => {\r\n const { t } = useTranslation('errors');\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { ErrorContent } from './ErrorContent';\r\n\r\nexport const UnAuthorised: React.FC = () => {\r\n const { t } = useTranslation('errors');\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport {\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalContent,\r\n ModalFooter,\r\n ModalOverlay,\r\n useBanner,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\n\r\nimport {\r\n useUpdateDfiAnnualReport,\r\n useSetDataDfiAnnualReportCompleted,\r\n UpdateDfiReportRequest,\r\n} from 'api';\r\nimport { dfiReportUpdateValuesState } from 'store';\r\nimport { DfiReportMetrics, DfiReportResponse } from 'types';\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { MobileModal, ThemeProvider } from 'components';\r\nimport { CompletionModalContent, StaticExportDfiReport, WrapStyledHtmlTemplate } from './';\r\nimport { renderToStaticMarkup } from 'react-dom/server';\r\n\r\ntype CompletionModalProps = {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n report: DfiReportResponse;\r\n heading: string;\r\n};\r\n\r\nexport const CompletionModal: React.FC = ({\r\n isOpen,\r\n onClose,\r\n report,\r\n heading,\r\n}) => {\r\n const { t } = useTranslation('report_completion_modal');\r\n const banner = useBanner();\r\n const isMobile = useIsMobile();\r\n\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const updateDfiReportStoreValues = useRecoilValue(dfiReportUpdateValuesState);\r\n const { mutate: updateDfiAnnualMutate, isLoading } = useUpdateDfiAnnualReport();\r\n const setDfiReportQueryDataCompleted = useSetDataDfiAnnualReportCompleted();\r\n\r\n const handleCancel = () => {\r\n onClose();\r\n };\r\n\r\n const submitReport = () => {\r\n const metrics: DfiReportMetrics = {\r\n statutoryTimelinessResponseStats: report.statutoryTimelinessResponseStats,\r\n lateResponseStatItems: report.lateResponseStatItems,\r\n statutoryTimeframeExceededStats: report.statutoryTimeframeExceededStats,\r\n agreedExtensionStats: report.agreedExtensionStats,\r\n nonStatutoryTimelinessResponseStats: report.nonStatutoryTimelinessResponseStats,\r\n eiaConsultationStats: report.eiaConsultationStats,\r\n tqEnTimelinessResponseStats: report.tqEnTimelinessResponseStats,\r\n tqEnTimeframeExceededStats: report.tqEnTimeframeExceededStats,\r\n tqEnAgreedExtensionStats: report.tqEnAgreedExtensionStats,\r\n tqEnAppealConsultationStats: report.tqEnAppealConsultationStats,\r\n };\r\n\r\n if (isTQ) {\r\n metrics.statutoryTimelinessResponseStats = metrics.tqEnTimelinessResponseStats;\r\n metrics.statutoryTimeframeExceededStats = metrics.tqEnTimeframeExceededStats;\r\n metrics.agreedExtensionStats = metrics.tqEnAgreedExtensionStats;\r\n metrics.eiaConsultationStats = metrics.tqEnAppealConsultationStats;\r\n }\r\n\r\n const htmlBody = renderToStaticMarkup(\r\n \r\n \r\n \r\n );\r\n\r\n const data: UpdateDfiReportRequest = {\r\n ...updateDfiReportStoreValues,\r\n completed: true,\r\n metrics: JSON.stringify(metrics),\r\n html: WrapStyledHtmlTemplate(htmlBody),\r\n };\r\n\r\n updateDfiAnnualMutate(data, {\r\n onSuccess: () => {\r\n banner({\r\n id: 'submit-dfi-report-banner-success',\r\n title: t('report_submitted', 'Report complete'),\r\n duration: BANNER_TIMEOUT,\r\n });\r\n\r\n setDfiReportQueryDataCompleted(report);\r\n\r\n onClose();\r\n },\r\n onError: () => {\r\n banner({\r\n id: 'submit-dfi-report-banner-fail',\r\n title: t('report_submission_failed', 'Could not complete report. Please try again'),\r\n duration: BANNER_TIMEOUT,\r\n status: 'error',\r\n });\r\n onClose();\r\n },\r\n });\r\n };\r\n\r\n return isMobile ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useQueryClient } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS } from 'api';\r\nimport { DfiReportResponse } from 'types';\r\n\r\nexport const useSetDataDfiAnnualReportCompleted = (): ((\r\n report: DfiReportResponse\r\n) => void) => {\r\n const queryClient = useQueryClient();\r\n\r\n return (report: DfiReportResponse) => {\r\n queryClient.setQueryData([API_QUERY_KEYS.getDfiAnnualReport], {\r\n ...report,\r\n dateCompleted: new Date(),\r\n });\r\n };\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaExclamationTriangle } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Box,\r\n Flex,\r\n Grid,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalHeader,\r\n Spinner,\r\n} from '@tq/ui-components';\r\n\r\ninterface CompletionModalContentProps {\r\n isLoading: boolean;\r\n}\r\n\r\nexport const CompletionModalContent: React.FC = ({\r\n isLoading,\r\n}) => {\r\n const { t } = useTranslation('report_completion_modal');\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {t('complete_report', 'Complete report')}\r\n \r\n \r\n \r\n \r\n \r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n

    \r\n {t(\r\n 'complete_report_modal_warning',\r\n 'Do you wish to complete the report? You will no longer be able to edit once you select complete.'\r\n )}\r\n

    \r\n )}\r\n \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport {\r\n Accordion,\r\n AccordionHeader,\r\n AccordionItem,\r\n AccordionIconButton,\r\n AccordionPanel,\r\n Typography,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { DfiReportFormattedMetrics, KpiCategory, TqEnReportFormattedMetrics } from 'types';\r\nimport { KpiValueCard, KpiTableCard } from '.';\r\n\r\nexport type KpiAccordionProps = {\r\n kpiData: DfiReportFormattedMetrics | TqEnReportFormattedMetrics | undefined;\r\n titles: Record;\r\n};\r\n\r\nexport const KpiAccordion: React.FC = ({ kpiData, titles }) => {\r\n const getDataTestId = (key: string) => {\r\n const label = titles[key]\r\n ? titles[key]\r\n .toLowerCase()\r\n .replaceAll(/[\\W_]+/g, ' ')\r\n .trimEnd()\r\n .replaceAll(' ', '-')\r\n : '';\r\n return 'accordion-' + label;\r\n };\r\n\r\n if (kpiData !== undefined) {\r\n return (\r\n \r\n {Object.entries(kpiData).map(\r\n ([key, value]) =>\r\n !!value.length && (\r\n \r\n \r\n \r\n {titles[key]}\r\n \r\n \r\n \r\n \r\n {(key as KpiCategory) === KpiCategory.lateResponseStatItems ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )\r\n )}\r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n};\r\n","export enum ReviewResponse {\r\n BestPracticeResponse = 'bestPracticeResponse',\r\n InfoOnLateResponse = 'infoOnLateResponse',\r\n}\r\n","import { useRecoilState, SetterOrUpdater } from 'recoil';\r\n\r\nimport {\r\n dfiReportBestPracticeResponseIsEditingState,\r\n dfiReportInfoOnLateResponseIsEditingState,\r\n} from 'store';\r\nimport { ReviewResponse } from '../types';\r\n\r\nexport const useEditingReviewState = (\r\n responseType: ReviewResponse\r\n): [boolean, SetterOrUpdater] => {\r\n const bestPracticeResponseIsEditing = useRecoilState(\r\n dfiReportBestPracticeResponseIsEditingState\r\n );\r\n\r\n const infoOnLateResponseIsEditing = useRecoilState(\r\n dfiReportInfoOnLateResponseIsEditingState\r\n );\r\n\r\n return responseType === ReviewResponse.BestPracticeResponse\r\n ? bestPracticeResponseIsEditing\r\n : infoOnLateResponseIsEditing;\r\n};\r\n","import { KpiData, ValueLabelResponse } from '../../../../../../../types';\r\n\r\nexport const formatKpiData = (\r\n kpiData: KpiData,\r\n labels: Record\r\n): ValueLabelResponse[] => {\r\n return Object.entries(kpiData).map(([key, value]) => ({\r\n label: labels[key],\r\n value: value,\r\n }));\r\n};\r\n","import { TFunction } from 'i18next';\r\n\r\nexport const tqEnTitles = (t: TFunction): Record | undefined => {\r\n return {\r\n timelinessResponseStats: t(\r\n 'tqen_response_timeliness',\r\n 'Timeliness of Consultation Responses'\r\n ),\r\n lateResponseStatItems: t('tqen_late_responses', 'Late Responses'),\r\n timeframeExceededStats: t('tqen_timeframe_exceeded', 'Timeframe Exceeded – Breakdown'),\r\n agreedExtensionStats: t('agreed_extensions', 'Breakdown of Agreed Extensions'),\r\n outstandingResponseStats: t(\r\n 'tqen_number_of_outstanding_responses',\r\n 'Number of outstanding responses'\r\n ),\r\n totalAppealConsultationsReceived: t(\r\n 'tqen_total_appeal_consultations_received',\r\n 'Total number of Appeal consultations'\r\n ),\r\n averageDaysTakenToRespondToAppealConsultations: t(\r\n 'tqen_average_days_taken_to_respond_to_appeal_consultations',\r\n 'Average number of days taken to respond to Appeal consultations'\r\n ),\r\n };\r\n};\r\n","import { DfiReportResponse, TqEnAnnualReportResponse, DfiAnnualReport } from 'types';\r\n\r\nimport { formatKpiData } from './formatKpiData';\r\n\r\nimport {\r\n useTqEnAgreedExtensionStatsLabels,\r\n useTqEnAppealConsultationStatsLabels,\r\n useTqEnTimeframeExceededStatsLabels,\r\n useTqEnTimelinessResponseStatsLabels,\r\n} from '../../../TqEnAnnualReport/hooks';\r\nimport { useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\nimport { TFunction } from 'i18next';\r\nimport { tqEnTitles } from './tqTitles';\r\n\r\nexport const useTQFormattedDfiReport = (\r\n reportResponse: DfiReportResponse | TqEnAnnualReportResponse,\r\n t: TFunction\r\n): {\r\n tqFormattedReport: DfiAnnualReport | undefined;\r\n tqEnMetrics: Record | undefined;\r\n tqTitles: Record | undefined;\r\n} => {\r\n const tqEnAgreedExtensionStatsLabels = useTqEnAgreedExtensionStatsLabels();\r\n\r\n const tqEnAppealConsultationStatsLabels = useTqEnAppealConsultationStatsLabels();\r\n\r\n const tqEnTimeframeExceededStatsLabels = useTqEnTimeframeExceededStatsLabels();\r\n\r\n const tqEnTimelinessResponseStatsLabels = useTqEnTimelinessResponseStatsLabels();\r\n\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n let formattedReport = undefined;\r\n let tqEnMetrics = undefined;\r\n\r\n if (isTQ && reportResponse && 'tqEnTimelinessResponseStats' in reportResponse) {\r\n formattedReport = {\r\n ...reportResponse,\r\n statutoryTimelinessResponseStats: formatKpiData(\r\n reportResponse.tqEnTimelinessResponseStats,\r\n tqEnTimelinessResponseStatsLabels\r\n ),\r\n lateResponseStatItems: reportResponse.lateResponseStatItems,\r\n statutoryTimeframeExceededStats: formatKpiData(\r\n reportResponse.tqEnTimeframeExceededStats,\r\n tqEnTimeframeExceededStatsLabels\r\n ),\r\n agreedExtensionStats: formatKpiData(\r\n reportResponse.tqEnAgreedExtensionStats,\r\n tqEnAgreedExtensionStatsLabels\r\n ),\r\n outstandingResponseStats: formatKpiData(\r\n {\r\n totalConsultationsWithOutstandingResponses:\r\n reportResponse.tqEnTimelinessResponseStats\r\n .totalConsultationsWithOutstandingResponses,\r\n },\r\n tqEnTimelinessResponseStatsLabels\r\n ),\r\n totalEiaConsultationsReceived: formatKpiData(\r\n {\r\n totalEiaConsultationsReceived:\r\n reportResponse.tqEnAppealConsultationStats.totalAppealConsultationsReceived,\r\n },\r\n tqEnAppealConsultationStatsLabels\r\n ),\r\n averageDaysTakenToRespondToEiaConsultations: formatKpiData(\r\n {\r\n averageDaysTakenToRespondToEiaConsultations:\r\n reportResponse.tqEnAppealConsultationStats\r\n .averageDaysTakenToRespondToAppealConsultations,\r\n },\r\n tqEnAppealConsultationStatsLabels\r\n ),\r\n nonStatutoryTimelinessResponseStats: null,\r\n };\r\n\r\n tqEnMetrics = {\r\n timelinessResponseStats: formattedReport.statutoryTimelinessResponseStats,\r\n lateResponseStatItems: formattedReport.lateResponseStatItems,\r\n timeframeExceededStats: formattedReport.statutoryTimeframeExceededStats,\r\n agreedExtensionStats: formattedReport.agreedExtensionStats,\r\n outstandingResponseStats: formattedReport.outstandingResponseStats,\r\n totalAppealConsultationsReceived: formattedReport.totalEiaConsultationsReceived,\r\n averageDaysTakenToRespondToAppealConsultations:\r\n formattedReport.averageDaysTakenToRespondToEiaConsultations,\r\n };\r\n }\r\n\r\n return {\r\n tqFormattedReport: formattedReport,\r\n tqEnMetrics: tqEnMetrics,\r\n tqTitles: isTQ ? tqEnTitles(t) : undefined,\r\n };\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useTqEnAgreedExtensionStatsLabels = (): Record => {\r\n const { t } = useTranslation('tqen_agreed_extension_stats_annual_report');\r\n\r\n const tqEnAgreedExtensionStatsLabels: Record = {\r\n totalConsultationsWithExtensionsTimeframe: t(\r\n 'tqen_total_consultations_with_extensions_timeframe',\r\n 'Total number of consultations with agreed extensions of timeframe'\r\n ),\r\n totalConsultationResponsesWithinExtensionTimeframe: t(\r\n 'tqen_total_consultation_responses_within_extension_timeframe',\r\n 'Total number of consultation responses returned within an agreed extension timeframe'\r\n ),\r\n totalConsultationsWithExtensionsTimeframeExtended1To7Days: t(\r\n 'tqen_total_consultations_with_extensions_timeframe_extended_1_to_7_days',\r\n 'Total number of consultations with agreed extensions of timeframe extended by 1-7 days'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended1To7Days: t(\r\n 'tqen_percentage_consultations_with_extensions_timeframe_extended_1_to_7_days',\r\n 'Percentage of consultations with agreed extensions of timeframe extended by 1-7 days'\r\n ),\r\n totalConsultationsWithExtensionsTimeframeExtended8To14Days: t(\r\n 'tqen_total_consultations_with_extensions_timeframe_extended_8_to_14_days',\r\n 'Total number of consultations with agreed extensions of timeframe extended by 8-14 days'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended8To14Days: t(\r\n 'tqen_percentage_consultations_with_extensions_timeframe_extended_8_to_14_days',\r\n 'Percentage of consultations with agreed extensions of timeframe extended by 8-14 days'\r\n ),\r\n totalConsultationsWithExtensionsTimeframeExtended15To21Days: t(\r\n 'tqen_total_consultations_with_extensions_timeframe_extended_15_to_21_days',\r\n 'Total number of consultations with agreed extensions of timeframe extended by 15-21 days'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended15To21Days: t(\r\n 'tqen_percentage_consultations_with_extensions_timeframe_extended_15_to_21_days',\r\n 'Percentage of consultations with agreed extensions of timeframe extended by 15-21 days'\r\n ),\r\n totalConsultationsWithExtensionsTimeframeExtended22To28Days: t(\r\n 'tqen_total_consultations_with_extensions_timeframe_extended_22_to_28_days',\r\n 'Total number of consultations with agreed extensions of timeframe extended by 22-28 days'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended22To28Days: t(\r\n 'tqen_percentage_consultations_with_extensions_timeframe_extended_22_to_28_days',\r\n 'Percentage of consultations with agreed extensions of timeframe extended by 22-28 days'\r\n ),\r\n totalConsultationsWithExtensionsTimeframeExtended29PlusDays: t(\r\n 'tqen_total_consultations_with_extensions_timeframe_extended_29_plus_days',\r\n 'Total number of consultations with agreed extensions of timeframe extended by 29 days and over'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended29PlusDays: t(\r\n 'tqen_percentage_consultations_with_extensions_timeframe_extended_29_plus_days',\r\n 'Percentage of consultations with agreed extensions of timeframe extended by 29 days and over'\r\n ),\r\n };\r\n\r\n return tqEnAgreedExtensionStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useTqEnAppealConsultationStatsLabels = (): Record => {\r\n const { t } = useTranslation('tqen_appeal_consultation_stats_annual_report');\r\n\r\n const tqEnAppealConsultationStatsLabels: Record = {\r\n totalEiaConsultationsReceived: t(\r\n 'tqen_total_eia_consultations_received',\r\n 'Total number of Appeal consultations received'\r\n ),\r\n averageDaysTakenToRespondToEiaConsultations: t(\r\n 'tqen_average_days_taken_to_respond_to_eia_consultations',\r\n 'Average number of days taken to respond to Appeal consultations'\r\n ),\r\n };\r\n\r\n return tqEnAppealConsultationStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useTqEnTimeframeExceededStatsLabels = (): Record => {\r\n const { t } = useTranslation('tqen_timeframe_exceeded_stats_annual_report');\r\n\r\n const tqEnTimeframeExceededStatsLabels: Record = {\r\n totalConsultationsWithLateResponses: t(\r\n 'tqen_total_consultations_with_late_responses',\r\n 'Total number of consultations with late responses'\r\n ),\r\n submittedWithin1To7DaysAfterDeadline: t(\r\n 'tqen_total_consultations_with_late_responses_submitted_within_1_to_7_days_after_deadline',\r\n 'Total number of consultations with late responses submitted within 1-7 days after the agreed deadline'\r\n ),\r\n percentageConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline: t(\r\n 'tqen_percentage_consultations_with_late_responses_submitted_within_1_to_7_days_after_deadline',\r\n 'Percentage of consultations with late responses submitted within 1-7 days after the agreed deadline'\r\n ),\r\n submittedWithin8To14DaysAfterDeadline: t(\r\n 'tqen_total_consultations_with_late_responses_submitted_within_8_to_14_days_after_deadline',\r\n 'Total number of consultations with late responses submitted within 8-14 days after the agreed deadline'\r\n ),\r\n percentageConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline: t(\r\n 'tqen_percentage_consultations_with_late_responses_submitted_within_8_to_14_days_after_deadline',\r\n 'Percentage of consultations with late responses submitted within 8-14 days after the agreed deadline'\r\n ),\r\n submittedWithin15To28DaysAfterDeadline: t(\r\n 'tqen_total_consultations_with_late_responses_submitted_within_15_to_28_days_after_deadline',\r\n 'Total number of consultations with late responses submitted within 15-28 days after the agreed deadline'\r\n ),\r\n percentageConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline: t(\r\n 'tqen_percentage_consultations_with_late_responses_submitted_within_15_to_28_days_after_deadline',\r\n 'Percentage of consultations with late responses submitted within 15-28 days after the agreed deadline'\r\n ),\r\n submittedOver29DaysAfterDeadline: t(\r\n 'tqen_total_consultations_with_late_responses_submitted_over_29_days_after_deadline',\r\n 'Total number of consultations with late responses submitted over 29 days after the agreed deadline'\r\n ),\r\n percentageConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline: t(\r\n 'tqen_percentage_consultations_with_late_responses_submitted_over_29_days_after_deadline',\r\n 'Percentage of consultations with late responses submitted over 29 days after the agreed deadline'\r\n ),\r\n };\r\n\r\n return tqEnTimeframeExceededStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useTqEnTimelinessResponseStatsLabels = (): Record => {\r\n const { t } = useTranslation('tqen_timelines_response_stats_annual_report');\r\n\r\n const tqEnTimelinessResponseStatsLabels: Record = {\r\n totalConsultationRequestsReceived: t(\r\n 'tqen_total_consultation_requests_received',\r\n 'Total number of consultation requests received'\r\n ),\r\n totalConsultationsRespondedInAgreedTimeframe: t(\r\n 'tqen_total_consultations_responded_in_agreed_timeframe',\r\n 'Total number of consultation requests responded to with a substantive response within the agreed timeframe'\r\n ),\r\n percentageConsultationsRespondedInAgreedTimeframe: t(\r\n 'tqen_percentage_consultations_responded_in_agreed_timeframe',\r\n 'Percentage of consultation requests responded to with a substantive response within the agreed timeframe'\r\n ),\r\n totalConsultationsWithResponsesWithin21Days: t(\r\n 'tqen_total_consultations_with_responses_within_21_days',\r\n 'Total number of consultation requests responded to with a substantive response within 21 days'\r\n ),\r\n percentageConsultationsWithResponsesWithin21Days: t(\r\n 'tqen_percentage_consultations_with_responses_within_21_days',\r\n 'Percentage of consultation requests responded to with a substantive response within 21 days'\r\n ),\r\n totalConsultationsRespondedLate: t(\r\n 'tqen_total_consultations_responded_late',\r\n 'Total number of consultations with late responses issued'\r\n ),\r\n percentageConsultationsRespondedLate: t(\r\n 'tqen_percentage_consultations_responded_late',\r\n 'Percentage of consultations with late responses issued'\r\n ),\r\n totalConsultationsWithOutstandingResponses: t(\r\n 'tqen_total_consultations_with_outstanding_responses',\r\n 'Total number of consultations with outstanding responses'\r\n ),\r\n averageDaysTakenToRespondRequests: t(\r\n 'tqen_average_days_taken_to_respond_requests',\r\n 'Average number of days taken to make a substantive response to requests'\r\n ),\r\n };\r\n\r\n return tqEnTimelinessResponseStatsLabels;\r\n};\r\n","import { TFunction } from 'i18next';\r\n\r\nexport const northernIrelandTitles = (t: TFunction): Record => {\r\n return {\r\n agreedExtensionStats: t('agreed_extensions', 'Breakdown of Agreed Extensions'),\r\n averageDaysTakenToRespondToEiaConsultations: t(\r\n 'average_days_taken_to_respond_to_eia_consultations',\r\n 'Average number of days taken to respond to EIA consultations'\r\n ),\r\n lateResponseStatItems: t('late_responses', 'Late Responses (statutory consultations)'),\r\n nonStatutoryTimelinessResponseStats: t(\r\n 'response_timeliness_non_statutory',\r\n 'Timeliness of responses (non-statutory consultations)'\r\n ),\r\n outstandingResponseStats: t(\r\n 'number_of_outstanding_responses',\r\n 'Number of outstanding responses'\r\n ),\r\n statutoryTimeframeExceededStats: t(\r\n 'timeframe_exceeded_statutory',\r\n 'Statutory Timeframe Exceeded – Breakdown'\r\n ),\r\n statutoryTimelinessResponseStats: t(\r\n 'response_timeliness_statutory',\r\n 'Timeliness of Consultation Responses (statutory consultations)'\r\n ),\r\n totalEiaConsultationsReceived: t(\r\n 'total_eia_consultations_received',\r\n 'Total number of EIA consultations received'\r\n ),\r\n };\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport { DfiAnnualReport, DfiReportResponse, TqEnAnnualReportResponse } from 'types';\r\nimport { useTQFormattedDfiReport } from './fragments/useTQFormattedDfiReport';\r\nimport { useNorthernIrelandFormattedDfiReport } from './fragments/useNorthernIrelandFormattedDfiReport';\r\n\r\nexport const useFormattedDfiReport = (\r\n reportResponse: DfiReportResponse | TqEnAnnualReportResponse\r\n): {\r\n report: DfiAnnualReport | undefined;\r\n titles: Record;\r\n metrics: Record;\r\n} => {\r\n const { t } = useTranslation('annual_dfi_report');\r\n\r\n const { formattedReport, metrics, titles } = useNorthernIrelandFormattedDfiReport(\r\n reportResponse,\r\n t\r\n );\r\n\r\n const { tqFormattedReport, tqEnMetrics, tqTitles } = useTQFormattedDfiReport(\r\n reportResponse,\r\n t\r\n );\r\n\r\n return {\r\n report: tqFormattedReport ?? formattedReport,\r\n titles: tqTitles ?? titles ?? {},\r\n metrics: tqEnMetrics ?? metrics ?? {},\r\n };\r\n};\r\n","import { DfiAnnualReport, DfiReportResponse, TqEnAnnualReportResponse } from 'types';\r\n\r\nimport { formatKpiData } from './formatKpiData';\r\n\r\nimport {\r\n useAgreedExtensionStatsLabels,\r\n useEiaConsultationStatsLabels,\r\n useNonStatutoryTimelinessResponseStatsLabels,\r\n useStatutoryTimeframeExceededStatsLabels,\r\n useStatutoryTimelinessResponseStatsLabels,\r\n} from '../';\r\nimport { useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\nimport { TFunction } from 'i18next';\r\nimport { northernIrelandTitles } from './northernIrelandTitles';\r\n\r\nexport const useNorthernIrelandFormattedDfiReport = (\r\n reportResponse: DfiReportResponse | TqEnAnnualReportResponse,\r\n t: TFunction\r\n): {\r\n formattedReport: DfiAnnualReport | undefined;\r\n metrics: Record | undefined;\r\n titles: Record | undefined;\r\n} => {\r\n const agreedExtensionStatsLabels = useAgreedExtensionStatsLabels();\r\n\r\n const eiaConsultationStatsLabels = useEiaConsultationStatsLabels();\r\n\r\n const nonStatutoryTimelinessResponseStatsLabels =\r\n useNonStatutoryTimelinessResponseStatsLabels();\r\n\r\n const statutoryTimeframeExceededStatsLabels = useStatutoryTimeframeExceededStatsLabels();\r\n\r\n const statutoryTimelinessResponseStatsLabels = useStatutoryTimelinessResponseStatsLabels();\r\n\r\n let formattedReport = undefined;\r\n let formattedMetrics = undefined;\r\n\r\n const { isNI } = useThemedValueSwitch();\r\n\r\n if (isNI && reportResponse && 'statutoryTimelinessResponseStats' in reportResponse) {\r\n formattedReport = {\r\n ...reportResponse,\r\n statutoryTimelinessResponseStats: formatKpiData(\r\n reportResponse.statutoryTimelinessResponseStats,\r\n statutoryTimelinessResponseStatsLabels\r\n ),\r\n lateResponseStatItems: reportResponse.lateResponseStatItems,\r\n statutoryTimeframeExceededStats: formatKpiData(\r\n reportResponse.statutoryTimeframeExceededStats,\r\n statutoryTimeframeExceededStatsLabels\r\n ),\r\n agreedExtensionStats: formatKpiData(\r\n reportResponse.agreedExtensionStats,\r\n agreedExtensionStatsLabels\r\n ),\r\n outstandingResponseStats: formatKpiData(\r\n {\r\n totalConsultationsWithOutstandingResponses:\r\n reportResponse.statutoryTimelinessResponseStats\r\n .totalConsultationsWithOutstandingResponses,\r\n },\r\n statutoryTimelinessResponseStatsLabels\r\n ),\r\n totalEiaConsultationsReceived: formatKpiData(\r\n {\r\n totalEiaConsultationsReceived:\r\n reportResponse.eiaConsultationStats.totalEiaConsultationsReceived,\r\n },\r\n eiaConsultationStatsLabels\r\n ),\r\n averageDaysTakenToRespondToEiaConsultations: formatKpiData(\r\n {\r\n averageDaysTakenToRespondToEiaConsultations:\r\n reportResponse.eiaConsultationStats.averageDaysTakenToRespondToEiaConsultations,\r\n },\r\n eiaConsultationStatsLabels\r\n ),\r\n nonStatutoryTimelinessResponseStats: formatKpiData(\r\n reportResponse.nonStatutoryTimelinessResponseStats,\r\n nonStatutoryTimelinessResponseStatsLabels\r\n ),\r\n };\r\n\r\n formattedMetrics = {\r\n statutoryTimelinessResponseStats: formattedReport.statutoryTimelinessResponseStats,\r\n lateResponseStatItems: formattedReport.lateResponseStatItems,\r\n statutoryTimeframeExceededStats: formattedReport.statutoryTimeframeExceededStats,\r\n agreedExtensionStats: formattedReport.agreedExtensionStats,\r\n outstandingResponseStats: formattedReport.outstandingResponseStats,\r\n totalEiaConsultationsReceived: formattedReport.totalEiaConsultationsReceived,\r\n averageDaysTakenToRespondToEiaConsultations:\r\n formattedReport.averageDaysTakenToRespondToEiaConsultations,\r\n nonStatutoryTimelinessResponseStats: formattedReport.nonStatutoryTimelinessResponseStats,\r\n };\r\n }\r\n\r\n return {\r\n formattedReport: formattedReport,\r\n metrics: formattedMetrics,\r\n titles: northernIrelandTitles(t),\r\n };\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useAgreedExtensionStatsLabels = (): Record => {\r\n const { t } = useTranslation('agreed_extension_stats_annual_dfi_report');\r\n\r\n const agreedExtensionStatsLabels: Record = {\r\n totalStatutoryConsultationsWithExtensionsTimeframe: t(\r\n 'total_statutory_consultations_with_extensions_timeframe',\r\n 'Total number of statutory consultations with agreed extensions of timeframe'\r\n ),\r\n totalStatutoryConsultationResponsesWithinExtensionTimeframe: t(\r\n 'total_statutory_consultation_responses_within_extension_timeframe',\r\n 'Total number of statutory consultation responses returned within an agreed extension timeframe'\r\n ),\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days: t(\r\n 'total_statutory_consultations_with_extensions_timeframe_extended_1_to_7_days',\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 1-7 days'\r\n ),\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended1To7Days: t(\r\n 'percentage_statutory_consultations_with_extensions_timeframe_extended_1_to_7_days',\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 1-7 days'\r\n ),\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days: t(\r\n 'total_statutory_consultations_with_extensions_timeframe_extended_8_to_14_days',\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 8-14 days'\r\n ),\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended8To14Days: t(\r\n 'percentage_statutory_consultations_with_extensions_timeframe_extended_8_to_14_days',\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 8-14 days'\r\n ),\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days: t(\r\n 'total_statutory_consultations_with_extensions_timeframe_extended_15_to_21_days',\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 15-21 days'\r\n ),\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended15To21Days: t(\r\n 'percentage_statutory_consultations_with_extensions_timeframe_extended_15_to_21_days',\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 15-21 days'\r\n ),\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended22To28Days: t(\r\n 'total_statutory_consultations_with_extensions_timeframe_extended_22_to_28_days',\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 22-28 days'\r\n ),\r\n percentageConsultationsWithExtensionsTimeframeExtended22To28Days: t(\r\n 'percentage_consultations_with_extensions_timeframe_extended_22_to_28_days',\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 22-28 days'\r\n ),\r\n totalStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays: t(\r\n 'total_statutory_consultations_with_extensions_timeframe_extended_29_plus_days',\r\n 'Total number of statutory consultations with agreed extensions of timeframe extended by 29 days and over'\r\n ),\r\n percentageStatutoryConsultationsWithExtensionsTimeframeExtended29PlusDays: t(\r\n 'percentage_statutory_consultations_with_extensions_timeframe_extended_29_plus_days',\r\n 'Percentage of statutory consultations with agreed extensions of timeframe extended by 29 days and over'\r\n ),\r\n };\r\n\r\n return agreedExtensionStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useEiaConsultationStatsLabels = (): Record => {\r\n const { t } = useTranslation('eia_consultation_stats_annual_dfi_report');\r\n\r\n const eiaConsultationStatsLabels: Record = {\r\n totalEiaConsultationsReceived: t(\r\n 'total_eia_consultations_received',\r\n 'Total number of EIA consultations received'\r\n ),\r\n averageDaysTakenToRespondToEiaConsultations: t(\r\n 'average_days_taken_to_respond_to_eia_consultations',\r\n 'Average number of days taken to respond to EIA consultations'\r\n ),\r\n };\r\n\r\n return eiaConsultationStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useNonStatutoryTimelinessResponseStatsLabels = (): Record => {\r\n const { t } = useTranslation('non_statutory_timelines_response_stats_annual_dfi_report');\r\n\r\n const nonStatutoryTimelinessResponseStatsLabels: Record = {\r\n totalConsultationRequestsReceived: t(\r\n 'total_consultation_requests_received_non_statutory',\r\n 'Total number of non-statutory consultation requests received'\r\n ),\r\n totalConsultationsRespondedInAgreedTimeframe: t(\r\n 'total_consultations_responded_in_agreed_timeframe_non_statutory',\r\n 'Total number of non-statutory consultations responded to in the agreed timeframe'\r\n ),\r\n percentageConsultationsRespondedInAgreedTimeframe: t(\r\n 'percentage_non_statutory_consultations_responded_in_agreed_timeframe',\r\n 'Percentage of non-statutory consultations responded to in the agreed timeframe'\r\n ),\r\n totalConsultationsWithResponsesWithin21Days: t(\r\n 'total_consultations_with_responses_within_21_days_non_statutory',\r\n 'Total number of non-statutory consultations with substantive responses made within 21 calendar days'\r\n ),\r\n percentageConsultationsWithResponsesWithin21Days: t(\r\n 'percentage_non_statutory_consultations_with_responses_within_21_days',\r\n 'Percentage of of non-statutory consultations with substantive responses made within 21 calendar days'\r\n ),\r\n totalConsultationsRespondedLate: t(\r\n 'total_consultations_responded_late_non_statutory',\r\n 'Total number of non-statutory consultations responded to late'\r\n ),\r\n percentageConsultationsRespondedLate: t(\r\n 'percentage_non_statutory_consultations_responded_late',\r\n 'Percentage of non-statutory consultations responded to late'\r\n ),\r\n totalConsultationsWithOutstandingResponses: t(\r\n 'total_consultations_with_outstanding_responses_non_statutory',\r\n 'Total number of non-statutory consultations with outstanding responses'\r\n ),\r\n averageDaysTakenToRespondRequests: t(\r\n 'average_days_taken_to_respond_requests_non_statutory',\r\n 'Average number of days taken to make a substantive response to non statutory requests'\r\n ),\r\n };\r\n return nonStatutoryTimelinessResponseStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useStatutoryTimelinessResponseStatsLabels = (): Record => {\r\n const { t } = useTranslation('statutory_timelines_response_stats_annual_dfi_report');\r\n\r\n const statutoryTimelinessResponseStatsLabels: Record = {\r\n totalConsultationRequestsReceived: t(\r\n 'total_consultation_requests_received',\r\n 'Total number of statutory consultation requests received'\r\n ),\r\n totalConsultationsRespondedInAgreedTimeframe: t(\r\n 'total_consultations_responded_in_agreed_timeframe',\r\n 'Total number of statutory consultation requests responded to with a substantive response within the agreed timeframe'\r\n ),\r\n percentageConsultationsRespondedInAgreedTimeframe: t(\r\n 'percentage_consultations_responded_in_agreed_timeframe',\r\n 'Percentage of statutory consultation requests responded to with a substantive response within the agreed timeframe'\r\n ),\r\n totalConsultationsWithResponsesWithin21Days: t(\r\n 'total_consultations_with_responses_within_21_days',\r\n 'Total number of statutory consultation requests responded to with a substantive response within 21 days'\r\n ),\r\n percentageConsultationsWithResponsesWithin21Days: t(\r\n 'percentage_consultations_with_responses_within_21_days',\r\n 'Percentage of statutory consultation requests responded to with a substantive response within 21 days'\r\n ),\r\n totalConsultationsRespondedLate: t(\r\n 'total_consultations_responded_late',\r\n 'Total number of statutory consultations with late responses issued'\r\n ),\r\n percentageConsultationsRespondedLate: t(\r\n 'percentage_consultations_responded_late',\r\n 'Percentage of statutory consultations with late responses issued'\r\n ),\r\n totalConsultationsWithOutstandingResponses: t(\r\n 'total_consultations_with_outstanding_responses',\r\n 'Total number of statutory consultations with outstanding responses'\r\n ),\r\n averageDaysTakenToRespondRequests: t(\r\n 'average_days_taken_to_respond_requests',\r\n 'Average number of days taken to make a substantive response to statutory requests'\r\n ),\r\n };\r\n\r\n return statutoryTimelinessResponseStatsLabels;\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useStatutoryTimeframeExceededStatsLabels = (): Record => {\r\n const { t } = useTranslation('statutory_timeframe_exceeded_stats_annual_dfi_report');\r\n\r\n const statutoryTimeframeExceededStatsLabels: Record = {\r\n totalStatutoryConsultationsWithLateResponses: t(\r\n 'total_statutory_consultations_with_late_responses',\r\n 'Total number of statutory consultations with late responses'\r\n ),\r\n submittedWithin1To7DaysAfterDeadline: t(\r\n 'total_statutory_consultations_with_late_responses_submitted_within_1_to_7_days_after_deadline',\r\n 'Total number of statutory consultations with late responses submitted within 1-7 days after the agreed deadline'\r\n ),\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin1To7DaysAfterDeadline: t(\r\n 'percentage_statutory_consultations_with_late_responses_submitted_within_1_to_7_days_after_deadline',\r\n 'Percentage of statutory consultations with late responses submitted within 1-7 days after the agreed deadline'\r\n ),\r\n submittedWithin8To14DaysAfterDeadline: t(\r\n 'total_statutory_consultations_with_late_responses_submitted_within_8_to_14_days_after_deadline',\r\n 'Total number of statutory consultations with late responses submitted within 8-14 days after the agreed deadline'\r\n ),\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin8To14DaysAfterDeadline: t(\r\n 'percentage_statutory_consultations_with_late_responses_submitted_within_8_to_14_days_after_deadline',\r\n 'Percentage of statutory consultations with late responses submitted within 8-14 days after the agreed deadline'\r\n ),\r\n submittedWithin15To28DaysAfterDeadline: t(\r\n 'total_statutory_consultations_with_late_responses_submitted_within_15_to_28_days_after_deadline',\r\n 'Total number of statutory consultations with late responses submitted within 15-28 days after the agreed deadline'\r\n ),\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedWithin15To28DaysAfterDeadline: t(\r\n 'percentage_statutory_consultations_with_late_responses_submitted_within_15_to_28_days_after_deadline',\r\n 'Percentage of statutory consultations with late responses submitted within 15-28 days after the agreed deadline'\r\n ),\r\n submittedOver29DaysAfterDeadline: t(\r\n 'total_statutory_consultations_with_late_responses_submitted_over_29_days_after_deadline',\r\n 'Total number of statutory consultations with late responses submitted over 29 days after the agreed deadline'\r\n ),\r\n percentageStatutoryConsultationsWithLateResponsesSubmittedOver29DaysAfterDeadline: t(\r\n 'percentage_statutory_consultations_with_late_responses_submitted_over_29_days_after_deadline',\r\n 'Percentage of statutory consultations with late responses submitted over 29 days after the agreed deadline'\r\n ),\r\n };\r\n\r\n return statutoryTimeframeExceededStatsLabels;\r\n};\r\n","import React from 'react';\r\nimport { DataTable, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { KpiLateResponse } from 'types';\r\nimport { useKpiTableRowTranslations } from '../hooks';\r\n\r\nexport type KpiTableDataProps = {\r\n lateResponses: KpiLateResponse[];\r\n};\r\n\r\nexport const KpiTableCard: React.FC = ({ lateResponses }) => {\r\n const { t } = useTranslation('annual_dfi_report');\r\n const translatedResponses = useKpiTableRowTranslations(lateResponses);\r\n\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const translatedResponsesText = isTQ\r\n ? t('tqen_late_response', 'Principle reason for responses issued beyond the deadline')\r\n : t(\r\n 'late_response',\r\n 'Principle reason for responses issued beyond the statutory deadline'\r\n );\r\n\r\n return (\r\n t('number', 'Number'),\r\n accessor: 'lateResponseReasonCount',\r\n width: 'min-content',\r\n },\r\n {\r\n Header: () => t('percentage_header', 'Percentage (of total no. late responses)'),\r\n accessor: 'lateResponseReasonPercentage',\r\n width: 'min-content',\r\n Cell: (cellProps: { value: string }) => cellProps.value + '%',\r\n },\r\n ]}\r\n size='sm'\r\n disableSortRemove\r\n disablePagination\r\n />\r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport { KpiLateResponse } from 'types';\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nexport const useKpiTableRowTranslations = (\r\n lateResponses: KpiLateResponse[]\r\n): KpiLateResponse[] => {\r\n const { isTQ } = useThemedValueSwitch();\r\n const { t } = useTranslation(isTQ ? 'tqen_annual_report' : 'annual_dfi_report');\r\n\r\n const resourceIssues = isTQ ? 'Lack of resources' : 'Resource issues';\r\n const extensionRequest = isTQ ? 'Extension request denied' : 'Extension request refused';\r\n const techIssuesInternal = isTQ\r\n ? 'Tech issues - internal to the organization'\r\n : 'Tech issues - internal to the organisation';\r\n const techIssuesExternal = isTQ\r\n ? 'Tech issues - external to the organization'\r\n : 'Tech issues - external to the organisation';\r\n const additionalInformationRequired = isTQ\r\n ? 'Additional information required'\r\n : 'Additional information required after consultation';\r\n\r\n const ROW_TEXT_LOOKUP: Record = {\r\n [resourceIssues]: t(isTQ ? 'lack_of_resources' : 'resource_issues', resourceIssues),\r\n ['High volume of work']: t('high_volume_of_work', 'High volume of work'),\r\n [extensionRequest]: t(\r\n isTQ ? 'extension_request_denied' : 'extension_request_refused',\r\n extensionRequest\r\n ),\r\n [techIssuesInternal]: t(\r\n isTQ\r\n ? 'tech_issues_internal_to_the_organization'\r\n : 'tech_issues_internal_to_the_organisation',\r\n techIssuesInternal\r\n ),\r\n [techIssuesExternal]: t(\r\n isTQ\r\n ? 'tech_issues_external_to_the_organization'\r\n : 'tech_issues_external_to_the_organisation',\r\n techIssuesExternal\r\n ),\r\n ['Complexity of the case']: t('complexity_of_the_case', 'Complexity of the case'),\r\n [additionalInformationRequired]: t(\r\n isTQ\r\n ? 'additional_information_required'\r\n : 'additional_information_required_after_consultation',\r\n additionalInformationRequired\r\n ),\r\n ['Other']: t('other', 'Other'),\r\n };\r\n\r\n return lateResponses.map((row) => {\r\n return { ...row, lateResponseReason: ROW_TEXT_LOOKUP[row.lateResponseReason] };\r\n });\r\n};\r\n","import React from 'react';\r\nimport { Typography, Grid, Box } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { ValueLabelResponse } from 'types';\r\n\r\nexport type KpiValueCardProps = {\r\n kpiValues: ValueLabelResponse[];\r\n};\r\n\r\nexport const KpiValueCard: React.FC = ({ kpiValues }) => {\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n \r\n {kpiValues?.map(({ label, value }) => (\r\n \r\n \r\n {value}\r\n \r\n \r\n {label}\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Flex, Button } from '@tq/ui-components';\r\n\r\nimport { useEditingReviewState } from '../../hooks';\r\nimport { ReviewResponse } from '../../types';\r\n\r\nexport type ReviewCardFooterProps = {\r\n idReference: ReviewResponse;\r\n isLoading: boolean;\r\n};\r\n\r\nexport const ReviewCardFooter: React.FC = ({\r\n idReference,\r\n isLoading,\r\n}) => {\r\n const { t } = useTranslation('dfi_report_review');\r\n\r\n const [isEditing, setIsEditing] = useEditingReviewState(idReference);\r\n\r\n return (\r\n <>\r\n {isEditing ? (\r\n \r\n \r\n setIsEditing(false)}\r\n >\r\n {t('cancel', 'Cancel')}\r\n \r\n \r\n {t('save', 'Save')}\r\n \r\n \r\n \r\n ) : (\r\n \r\n setIsEditing(true)}\r\n >\r\n {t('edit', 'Edit')}\r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { ChangeEvent, useEffect, useState } from 'react';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Typography, Grid, GridItem, Box, Heading } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n FormProvider,\r\n ValidatedTextArea,\r\n Form,\r\n} from '@tq/ui-components/dist/components/forms-engine';\r\n\r\nimport { BANNER_TIMEOUT } from 'config';\r\nimport { dfiReportUpdateValuesState } from 'store';\r\nimport { useUpdateDfiAnnualReport, UpdateDfiReportRequest } from 'api';\r\nimport { ReviewResponse } from '../../types';\r\nimport { ReviewCardFooter } from './ReviewCardFooter';\r\nimport { useEditingReviewState, useReviewResponseState } from '../../hooks';\r\n\r\nexport type ReviewCardProps = {\r\n question: string;\r\n idReference: ReviewResponse;\r\n};\r\n\r\nexport const ReviewCard: React.FC = ({ question, idReference }) => {\r\n const { t } = useTranslation('dfi_report_review');\r\n\r\n const updateDfiReportStoreValues = useRecoilValue(dfiReportUpdateValuesState);\r\n\r\n const [isEditing, setIsEditing] = useEditingReviewState(idReference);\r\n const [response] = useReviewResponseState(idReference);\r\n\r\n const { mutate: updateDfiAnnualMutate, isLoading } = useUpdateDfiAnnualReport();\r\n\r\n const [editedAnswer, setEditedAnswer] = useState(response);\r\n const [isSuccess, setIsSuccess] = useState(false);\r\n\r\n const backgroundColour = (): string => {\r\n if (isEditing) return COLOURS.blue[200];\r\n return isSuccess ? COLOURS.neutral[11] : COLOURS.gray[200];\r\n };\r\n\r\n const borderColour = (): string => {\r\n return isSuccess ? COLOURS.green[500] : 'unset';\r\n };\r\n\r\n const handleSubmit = () => {\r\n let request: UpdateDfiReportRequest = {\r\n completed: false,\r\n ...updateDfiReportStoreValues,\r\n };\r\n\r\n if (editedAnswer) {\r\n if (idReference === ReviewResponse.BestPracticeResponse)\r\n request = { ...request, bestPracticeResponse: editedAnswer };\r\n\r\n if (idReference === ReviewResponse.InfoOnLateResponse)\r\n request = { ...request, infoOnLateResponse: editedAnswer };\r\n\r\n updateDfiAnnualMutate(request, {\r\n onSuccess: () => {\r\n setIsEditing(false);\r\n setIsSuccess(true);\r\n setTimeout(() => setIsSuccess(false), BANNER_TIMEOUT);\r\n },\r\n onError: () => {\r\n setIsEditing(false);\r\n },\r\n });\r\n } else {\r\n setIsEditing(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!isEditing) {\r\n setEditedAnswer(response);\r\n }\r\n }, [isEditing, response]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {question}\r\n \r\n \r\n \r\n \r\n {isEditing ? (\r\n \r\n
    \r\n ) =>\r\n setEditedAnswer(event.target.value)\r\n }\r\n placeholder={t('response_text_placeholder', 'Enter your response here')}\r\n validation={{\r\n maxLength: {\r\n value: 500,\r\n message: t(\r\n 'reason_text_length_error',\r\n 'You have exceeded the character limit'\r\n ),\r\n },\r\n }}\r\n />\r\n \r\n
    \r\n ) : (\r\n <>\r\n \r\n {t('your_response', 'Your response')}\r\n \r\n \r\n

    {response}

    \r\n
    \r\n \r\n )}\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useRecoilState, SetterOrUpdater } from 'recoil';\r\n\r\nimport { dfiReportBestPracticeResponseState, dfiReportInfoOnLateResponseState } from 'store';\r\nimport { ReviewResponse } from '../types';\r\n\r\nexport const useReviewResponseState = (\r\n responseType: ReviewResponse\r\n): [string, SetterOrUpdater] => {\r\n const bestPracticeResponse = useRecoilState(dfiReportBestPracticeResponseState);\r\n\r\n const infoOnLateResponse = useRecoilState(dfiReportInfoOnLateResponseState);\r\n\r\n return responseType === ReviewResponse.BestPracticeResponse\r\n ? bestPracticeResponse\r\n : infoOnLateResponse;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Typography, Grid, GridItem, Heading } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { ReviewResponse } from '../../types';\r\nimport { ReviewCard } from './ReviewCard';\r\n\r\nexport const Review: React.FC = () => {\r\n const { t } = useTranslation('dfi_report_review');\r\n\r\n return (\r\n <>\r\n {t('review', 'Review')}\r\n \r\n \r\n {t(\r\n 'review_sub_heading_text',\r\n 'Consultees can use the report to highlight to the Department any initiatives or practices that may improve the consultation process. This may be a consultee committing to providing guidance or standing advice for use by planning officers that will negate the need for a consultation or it may propose an approach to dealing with consultations within its own organisation in a more efficient manner.'\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Typography, Grid, GridItem, Box, Heading } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport type StaticReviewCardProps = {\r\n question: string;\r\n response: string | undefined;\r\n};\r\n\r\nexport const StaticReviewCard: React.FC = ({ question, response }) => {\r\n const { t } = useTranslation('dfi_report_review');\r\n\r\n return (\r\n \r\n \r\n \r\n {question}\r\n \r\n \r\n \r\n \r\n {t('your_response', 'Your response')}\r\n \r\n \r\n

    {response}

    \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Divider, Grid, GridItem, Typography, Heading } from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { PageHeading } from 'components';\r\nimport {\r\n DfiReportFormattedMetrics,\r\n DfiReportResponse,\r\n KpiCategory,\r\n KpiLateResponse,\r\n ValueLabelResponse,\r\n} from 'types';\r\nimport { StaticReviewCard, KpiTableCard, StaticKpiValueCard } from '../../components';\r\nimport { useFormattedDfiReport } from '../../hooks';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ninterface SaticExportDfiReportProps {\r\n heading: string;\r\n report: DfiReportResponse;\r\n}\r\n\r\nexport const StaticExportDfiReport: React.FC = ({\r\n heading,\r\n report,\r\n}) => {\r\n const { t } = useTranslation('annual_dfi_report_complete');\r\n\r\n const { report: dfiReport, titles, metrics: kpiData } = useFormattedDfiReport(report);\r\n\r\n const pageBreakCards: (keyof DfiReportFormattedMetrics)[] = [\r\n 'lateResponseStatItems',\r\n 'agreedExtensionStats',\r\n 'totalEiaConsultationsReceived',\r\n 'statutoryTimeframeExceededStats',\r\n ];\r\n\r\n const formatLocaleDate = useFormatLocaleDate();\r\n if (kpiData !== undefined) {\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n
    \r\n {Object.entries(kpiData).map(([key, value]) => (\r\n \r\n \r\n {titles[key]}\r\n \r\n
    \r\n {(key as KpiCategory) === KpiCategory.lateResponseStatItems ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
    \r\n \r\n ))}\r\n
    \r\n
    \r\n {t('review', 'Review')}\r\n \r\n \r\n {t(\r\n 'review_sub_heading_text',\r\n 'Consultees can use the report to highlight to the Department any initiatives or practices that may improve the consultation process. This may be a consultee committing to providing guidance or standing advice for use by planning officers that will negate the need for a consultation or it may propose an approach to dealing with consultations within its own organisation in a more efficient manner.'\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\n {`${t(\r\n 'report_completed',\r\n 'Report completed'\r\n )}: ${formatLocaleDate(new Date())}`}\r\n \r\n
    \r\n \r\n );\r\n } else {\r\n return null;\r\n }\r\n};\r\n","import React from 'react';\r\n\r\nimport { ValueLabelResponse } from 'types';\r\n\r\nexport type StaticKpiValueCardProps = {\r\n kpiValues: ValueLabelResponse[];\r\n};\r\n\r\nconst sliceArrayIntoChunks = (array: ValueLabelResponse[]): ValueLabelResponse[][] => {\r\n const chunks = [];\r\n\r\n for (let i = 0; i < array.length; i += 3) {\r\n const chunk = array.slice(i, i + 3);\r\n chunks.push(chunk);\r\n }\r\n\r\n return chunks;\r\n};\r\n\r\nexport const StaticKpiValueCard: React.FC = ({ kpiValues }) => {\r\n const tableRows = sliceArrayIntoChunks(kpiValues);\r\n\r\n return (\r\n
    \r\n \r\n \r\n {tableRows.map((row, i) => (\r\n \r\n {row.map((kpiValue) => (\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
    \r\n
    \r\n
    \r\n {kpiValue.value}\r\n
    \r\n

    {kpiValue.label}

    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","export const WrapStyledHtmlTemplate = (body: string): string => `\r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ${body}\r\n \r\n\r\n`;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { Container, useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nimport { annualDfiReportYearState } from 'store';\r\nimport { CompleteDfiReport, DraftDfiReport } from '../';\r\nimport { useDfiAnnualReport } from 'api';\r\n\r\nexport const AnnualDfiReport: React.FC = () => {\r\n const { t } = useTranslation('annual_dfi_report');\r\n\r\n const reportYear = useRecoilValue(annualDfiReportYearState);\r\n\r\n const { data: report } = useDfiAnnualReport();\r\n\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const organisationNameHeading = report?.parentOrganisationName\r\n ? ` ${t('for', 'for')} ${report?.parentOrganisationName}`\r\n : '';\r\n\r\n const fyStartDay = `${t('fy_start_day', '1st April')} ${reportYear}`;\r\n const fyEndDay = `${t('fy_end_day', '- 31st March')} ${reportYear + 1}`;\r\n const tqEnAnnualReportLabel = `${t('tqen_annual_report', 'Annual Report')}`;\r\n const AnnualDfiReportLabel = `${t('annual_dfi_report', 'Annual DfI Report')}`;\r\n\r\n const heading = `${\r\n isTQ ? tqEnAnnualReportLabel : AnnualDfiReportLabel\r\n } ${fyStartDay} ${fyEndDay} ${organisationNameHeading}`;\r\n\r\n return (\r\n \r\n {report &&\r\n (report.dateCompleted ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\r\n\r\nimport {\r\n annualDfiReportYearState,\r\n dfiReportBestPracticeResponseState,\r\n dfiReportInfoOnLateResponseState,\r\n} from 'store';\r\nimport { API_QUERY_KEYS, getDfiAnnualReport, QueryDefaults } from 'api';\r\nimport { DfiReportResponse } from 'types';\r\n\r\nexport const useDfiAnnualReport = (): UseQueryResult => {\r\n const reportYear = useRecoilValue(annualDfiReportYearState);\r\n const setInitiativesResponse = useSetRecoilState(dfiReportBestPracticeResponseState);\r\n const setIssuesResponse = useSetRecoilState(dfiReportInfoOnLateResponseState);\r\n\r\n return useQuery(\r\n [API_QUERY_KEYS.getDfiAnnualReport, reportYear],\r\n () => getDfiAnnualReport(reportYear),\r\n {\r\n ...QueryDefaults,\r\n onSuccess: (data: DfiReportResponse) => {\r\n setInitiativesResponse(data.bestPracticeResponse);\r\n setIssuesResponse(data.infoOnLateResponse);\r\n },\r\n }\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Button,\r\n Divider,\r\n Flex,\r\n Grid,\r\n GridItem,\r\n Typography,\r\n Heading,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nimport { useDfiAnnualReportPdf } from 'api';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { PageHeading } from 'components';\r\nimport { KpiAccordion, StaticReviewCard } from './components';\r\nimport { DfiReportResponse } from 'types';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nimport { useFormattedDfiReport } from './hooks';\r\n\r\ninterface CompleteDfiReportProps {\r\n heading: string;\r\n report: DfiReportResponse;\r\n}\r\n\r\nexport const CompleteDfiReport: React.FC = ({ heading, report }) => {\r\n const isMobile = useIsMobile();\r\n const { t } = useTranslation('annual_dfi_report_complete');\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const { mutate: downloadReportPdf, isLoading } = useDfiAnnualReportPdf(\r\n isTQ\r\n ? `${t('tqen_annual_dfi_report', 'Annual Report')} ${report.reportYear}`\r\n : `${t('annual_dfi_report', 'Annual Dfi Report')} ${report.reportYear}`\r\n );\r\n\r\n const { titles, metrics: kpiData } = useFormattedDfiReport(report);\r\n\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {t('download_report', 'Download report')}\r\n \r\n \r\n \r\n \r\n \r\n {t('review', 'Review')}\r\n \r\n \r\n {t(\r\n 'review_sub_heading_text',\r\n 'Consultees can use the report to highlight to the Department any initiatives or practices that may improve the consultation process. This may be a consultee committing to providing guidance or standing advice for use by planning officers that will negate the need for a consultation or it may propose an approach to dealing with consultations within its own organisation in a more efficient manner.'\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {`${t(\r\n 'report_completed_on',\r\n 'Report completed on'\r\n )} ${formatLocaleDate(report.dateCompleted)}`}\r\n \r\n \r\n );\r\n};\r\n","import { useMutation, UseMutationResult } from '@tanstack/react-query';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { getDfiAnnualReportDocumentPath } from 'api';\r\nimport { DfiReportDocumentPathResponse } from 'types';\r\nimport { annualDfiReportYearState } from 'store';\r\n\r\nexport const useDfiAnnualReportPdf = (\r\n fileName: string\r\n): UseMutationResult => {\r\n const reportYear = useRecoilValue(annualDfiReportYearState);\r\n return useMutation(() => getDfiAnnualReportDocumentPath(reportYear), {\r\n onSuccess: (data) => {\r\n const link = document.createElement('a');\r\n link.href = data.documentUri;\r\n link.target = '_blank';\r\n link.download = `${fileName.replaceAll(' ', '_')}.pdf`;\r\n link.click();\r\n },\r\n });\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { Button, Divider, Flex, Grid, AttentionMessage, Typography } from '@tq/ui-components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nimport { dfiReportIsEditingState, annualDfiReportYearState } from 'store';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { PageHeading } from 'components';\r\nimport { KpiAccordion, CompletionModal, Review } from './components';\r\nimport { useFormattedDfiReport } from './hooks';\r\nimport { DfiReportResponse } from 'types';\r\n\r\ninterface DraftDfiReportProps {\r\n heading: string;\r\n report: DfiReportResponse;\r\n}\r\n\r\nexport const DraftDfiReport: React.FC = ({ heading, report }) => {\r\n const isMobile = useIsMobile();\r\n\r\n const [modalOpen, setModalOpen] = useState(false);\r\n\r\n const { t } = useTranslation('annual_dfi_report_draft');\r\n\r\n const isEditing = useRecoilValue(dfiReportIsEditingState);\r\n const reportYear = useRecoilValue(annualDfiReportYearState);\r\n\r\n const { titles, metrics: kpiData } = useFormattedDfiReport(report);\r\n\r\n const handleClose = () => setModalOpen(false);\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n {report && }\r\n \r\n \r\n \r\n \r\n {report.dateModified && report.consulteeName && (\r\n \r\n \r\n {`${t('last_edited', 'Last edited')} ${formatLocaleDate(\r\n report.dateModified\r\n )} ${t('by', 'By').toLowerCase()} ${report.consulteeName}`}\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { DataTableColumns } from '@tq/ui-components';\r\nimport { FormatLocaleDateReturnType } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\nimport { ReportData, ReportFilter, ValueLabelResponse } from 'types';\r\n\r\nexport const createFilterItem = (\r\n name: string,\r\n header: string,\r\n items: ValueLabelResponse[] | undefined,\r\n allowMultiSelect?: boolean | undefined,\r\n isSearchText?: boolean | undefined\r\n): ReportFilter => {\r\n return {\r\n name,\r\n header,\r\n items: items ?? [],\r\n selectedItems: [],\r\n allowMultiSelect: allowMultiSelect ?? true,\r\n isSearchText: isSearchText ?? false,\r\n };\r\n};\r\n\r\nexport const createColumnItem = (\r\n filter: string,\r\n header: string,\r\n width = 'auto',\r\n allowSortBy = false,\r\n isDate = false,\r\n formatLocaleDate?: FormatLocaleDateReturnType\r\n): DataTableColumns => {\r\n const columnItem: DataTableColumns = {\r\n accessor: filter,\r\n disableSortBy: !allowSortBy,\r\n Header: () => header,\r\n width,\r\n };\r\n\r\n if (isDate) {\r\n columnItem.Cell = (cellProps: { value: string }) => {\r\n return formatLocaleDate ? formatLocaleDate(cellProps.value) : cellProps.value;\r\n };\r\n }\r\n\r\n return columnItem;\r\n};\r\n\r\nexport const createColumnItemDate = (\r\n filter: string,\r\n header: string,\r\n formatLocaleDate?: FormatLocaleDateReturnType,\r\n width = '130px',\r\n allowSortBy = true\r\n): DataTableColumns =>\r\n createColumnItem(filter, header, width, allowSortBy, true, formatLocaleDate);\r\n","import { useTranslation } from 'react-i18next';\r\nimport { DataTableColumns } from '@tq/ui-components';\r\n\r\nimport { createColumnItem, createColumnItemDate } from '../utils';\r\nimport { ReportData } from 'types';\r\nimport { useFormatLocaleDate } from 'config/DateFormats/useFormatLocaleDate';\r\n\r\ntype useReportColumnsProps = {\r\n applicationReference: DataTableColumns;\r\n authority: DataTableColumns;\r\n category: DataTableColumns;\r\n consultationRequestDate: DataTableColumns;\r\n consultationStatus: DataTableColumns;\r\n consultationType: DataTableColumns;\r\n consulteeResponseDueDate: DataTableColumns;\r\n dateConsultationRespondedTo: DataTableColumns;\r\n extensionRequestDate: DataTableColumns;\r\n extensionRequestReason: DataTableColumns;\r\n extensionRequestResponse: DataTableColumns;\r\n extensionResponseDate: DataTableColumns;\r\n lateResponseReason: DataTableColumns;\r\n otherReason: DataTableColumns;\r\n responseType: DataTableColumns;\r\n};\r\nexport const useReportColumns = (): useReportColumnsProps => {\r\n const { t } = useTranslation('reports');\r\n const formatLocaleDate = useFormatLocaleDate();\r\n\r\n const authority = createColumnItem('authority', t('authority', 'Authority'));\r\n const applicationReference = createColumnItem(\r\n 'applicationReference',\r\n t('application_reference', 'Application reference')\r\n );\r\n const category = createColumnItem('category', t('category', 'Category'));\r\n const consultationRequestDate = createColumnItemDate(\r\n 'consultationRequestDate',\r\n t('consultation_request_date', 'Consultation request date'),\r\n formatLocaleDate\r\n );\r\n const consultationStatus = createColumnItem(\r\n 'consultationStatus',\r\n t('consultation_status', 'Consultation status')\r\n );\r\n const consultationType = createColumnItem(\r\n 'consultationType',\r\n t('consultation_type', 'Consultation type')\r\n );\r\n const consulteeResponseDueDate = createColumnItemDate(\r\n 'consulteeResponseDueDate',\r\n t('consultee_response_due_date', 'Consultee response due date'),\r\n formatLocaleDate\r\n );\r\n const dateConsultationRespondedTo = createColumnItemDate(\r\n 'dateConsultationRespondedTo',\r\n t('date_consultation_responded_to', 'Date consultation responded to'),\r\n formatLocaleDate\r\n );\r\n const extensionRequestDate = createColumnItemDate(\r\n 'extensionRequestDate',\r\n t('extension_request_date', 'Date extension requested'),\r\n formatLocaleDate\r\n );\r\n const extensionRequestReason = createColumnItem(\r\n 'extensionRequestReason',\r\n t('extension_request_reason', 'Reason for extension')\r\n );\r\n const extensionRequestResponse = createColumnItem(\r\n 'extensionRequestResponse',\r\n t('extension_request_response', 'Extension approved / refused')\r\n );\r\n const extensionResponseDate = createColumnItemDate(\r\n 'extensionResponseDate',\r\n t('extension_response_date', 'Date extension approved / refused'),\r\n formatLocaleDate\r\n );\r\n\r\n const lateResponseReason = createColumnItem(\r\n 'lateResponseReason',\r\n t('late_response_reason', 'Late response reason')\r\n );\r\n\r\n const otherReason = createColumnItem('otherReason', t('other_reason', 'Other reason'));\r\n\r\n const responseType = createColumnItem('responseType', t('response_type', 'Response type'));\r\n\r\n return {\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consultationStatus,\r\n consultationType,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n extensionRequestDate,\r\n extensionRequestReason,\r\n extensionRequestResponse,\r\n extensionResponseDate,\r\n lateResponseReason,\r\n otherReason,\r\n responseType,\r\n };\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport {\r\n useExtensionRequestStatuses,\r\n useFilterAuthorities,\r\n useFilterCategories,\r\n useFilterConsultationTypes,\r\n useFilterStatusesAll,\r\n useReasonsForLateResponse,\r\n useResponseTypes,\r\n} from 'api';\r\nimport { ReportFilter } from 'types';\r\nimport { createFilterItem } from '../utils';\r\n\r\ntype useReportFiltersProps = {\r\n authorityIds: ReportFilter;\r\n consultationCategoryIds: ReportFilter;\r\n consultationStatusIds: ReportFilter;\r\n consultationTypeIds: ReportFilter;\r\n extensionRequestStatusIds: ReportFilter;\r\n lateResponseReasonIds: ReportFilter;\r\n responseTypeIds: ReportFilter;\r\n};\r\n\r\nexport const useReportFilters = (): useReportFiltersProps => {\r\n const { t } = useTranslation('reports');\r\n const { data: authoritiesData } = useFilterAuthorities();\r\n const { data: categoriesData } = useFilterCategories();\r\n const { data: consultationStatusesData } = useFilterStatusesAll();\r\n const { data: consultationTypesData } = useFilterConsultationTypes();\r\n const { data: extensionRequestStatusesData } = useExtensionRequestStatuses();\r\n const { data: reasonsForLateResponseData } = useReasonsForLateResponse();\r\n const { data: responseTypesData } = useResponseTypes();\r\n\r\n const authorityIds = createFilterItem(\r\n 'AuthorityIds',\r\n t('authority', 'Authority'),\r\n authoritiesData?.authorities\r\n );\r\n const consultationCategoryIds = createFilterItem(\r\n 'ConsultationCategoryIds',\r\n t('category', 'Category'),\r\n categoriesData?.categories\r\n );\r\n const consultationStatusIds = createFilterItem(\r\n 'ConsultationStatusIds',\r\n t('consultation_status', 'Consultation status'),\r\n consultationStatusesData?.statuses\r\n );\r\n const consultationTypeIds = createFilterItem(\r\n 'ConsultationTypeIds',\r\n t('consultation_type', 'Consultation type'),\r\n consultationTypesData?.consultationTypes\r\n );\r\n const extensionRequestStatusIds = createFilterItem(\r\n 'ExtensionRequestStatusIds',\r\n t('extension_request_status', 'Extension request status'),\r\n extensionRequestStatusesData?.statuses\r\n );\r\n const lateResponseReasonIds = createFilterItem(\r\n 'LateResponseReasonIds',\r\n t('late_response_reason', 'Late response reason'),\r\n reasonsForLateResponseData?.reasonsForLateResponse\r\n );\r\n const responseTypeIds = createFilterItem(\r\n 'ResponseTypeIds',\r\n t('response_type', 'Response type'),\r\n responseTypesData?.responseTypes\r\n );\r\n\r\n return {\r\n authorityIds,\r\n consultationCategoryIds,\r\n consultationStatusIds,\r\n consultationTypeIds,\r\n extensionRequestStatusIds,\r\n lateResponseReasonIds,\r\n responseTypeIds,\r\n };\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getFilterStatuses,\r\n GetFilterStatusesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useFilterStatusesAll = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getFilterStatuses], () => getFilterStatuses(), QueryDefaults);\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getExtensionRequestStatuses,\r\n GetExtensionRequestStatusesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useExtensionRequestStatuses =\r\n (): QueryObserverResult =>\r\n useQuery(\r\n [API_QUERY_KEYS.getExtensionRequestStatuses],\r\n getExtensionRequestStatuses,\r\n QueryDefaults\r\n );\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nimport { Report } from 'types';\r\nimport {\r\n useExtensionRequestsColumns,\r\n useLateResponseColumns,\r\n useOutstandingResponseColumns,\r\n useRespondedOnTimeColumns,\r\n useRespondedYearToDateColumns,\r\n} from '../components';\r\n\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nexport enum reports {\r\n annualReport = 'annualReport',\r\n annualDfi = 'annualDfi',\r\n extensionRequests = 'extensionRequests',\r\n lateResponses = 'lateResponses',\r\n outstandingResponses = 'outstandingResponses',\r\n respondedOnTime = 'respondedOnTime',\r\n respondedYearToDate = 'respondedYearToDate',\r\n}\r\n\r\nexport const useReports = (): Report[] => {\r\n const { t } = useTranslation('reports');\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const annualDfiReport: Report = {\r\n name: isTQ ? reports.annualReport : reports.annualDfi,\r\n header: isTQ\r\n ? t('tqen_annual_report', 'Annual report')\r\n : t('annual_dfi_report', 'Annual DfI report'),\r\n description: isTQ\r\n ? t(\r\n 'tqen_annual_report_description',\r\n 'View the annual report and submit your commentary.'\r\n )\r\n : t(\r\n 'annual_dfi_report_description',\r\n 'View the annual DfI report and submit your commentary.'\r\n ),\r\n columns: [],\r\n hasDateFilter: true,\r\n visibleOnMobile: false,\r\n };\r\n\r\n const extensionRequestsReport: Report = {\r\n name: reports.extensionRequests,\r\n header: t('extension_requests_report', 'Extension requests report'),\r\n description: t(\r\n 'extension_requests_report_description',\r\n 'View a report of consultations where an extension to the original deadline was requested.'\r\n ),\r\n columns: useExtensionRequestsColumns(),\r\n hasDateFilter: true,\r\n visibleOnMobile: true,\r\n };\r\n\r\n const lateResponsesReport: Report = {\r\n name: reports.lateResponses,\r\n header: t('late_response_report', 'Late responses report'),\r\n description: t(\r\n 'late_response_report_description',\r\n 'View a report of consultations that were responded to after the agreed deadline.'\r\n ),\r\n columns: useLateResponseColumns(),\r\n hasDateFilter: true,\r\n visibleOnMobile: true,\r\n };\r\n\r\n const outstandingResponsesReport: Report = {\r\n name: reports.outstandingResponses,\r\n header: t('outstanding_responses_report', 'Outstanding responses report'),\r\n description: t(\r\n 'outstanding_responses_report_description',\r\n 'View a report of consultations with an outstanding response.'\r\n ),\r\n columns: useOutstandingResponseColumns(),\r\n hasDateFilter: true,\r\n visibleOnMobile: true,\r\n };\r\n\r\n const respondedOnTimeReport: Report = {\r\n name: reports.respondedOnTime,\r\n header: t('responded_on_time_report', 'Responded on time report'),\r\n description: t(\r\n 'responded_on_time_report_description',\r\n 'View a report of consultations responded to within the agreed deadline.'\r\n ),\r\n columns: useRespondedOnTimeColumns(),\r\n hasDateFilter: true,\r\n visibleOnMobile: true,\r\n };\r\n\r\n const respondedYearToDateReport: Report = {\r\n name: reports.respondedYearToDate,\r\n header: t('responded_year_to_date_report', 'Responded - year to date report'),\r\n description: t(\r\n 'responded_year_to_date_report_description',\r\n 'View a report of all consultations that have been responded to financial year to date.'\r\n ),\r\n columns: useRespondedYearToDateColumns(),\r\n hasDateFilter: false,\r\n visibleOnMobile: true,\r\n };\r\n\r\n return [\r\n annualDfiReport,\r\n extensionRequestsReport,\r\n lateResponsesReport,\r\n outstandingResponsesReport,\r\n respondedOnTimeReport,\r\n respondedYearToDateReport,\r\n ];\r\n};\r\n","import { ReportColumn } from 'types';\r\nimport { useReportColumns } from '../../../../hooks';\r\n\r\nexport const useExtensionRequestsColumns = (): ReportColumn[] => {\r\n const {\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n extensionRequestDate,\r\n extensionResponseDate,\r\n dateConsultationRespondedTo,\r\n extensionRequestReason,\r\n extensionRequestResponse,\r\n } = useReportColumns();\r\n\r\n return [\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n extensionRequestDate,\r\n extensionResponseDate,\r\n dateConsultationRespondedTo,\r\n extensionRequestReason,\r\n extensionRequestResponse,\r\n ];\r\n};\r\n","import { ReportFilter } from 'types';\r\nimport { useReportFilters } from '../../../../hooks';\r\n\r\nexport const useExtensionRequestsFilters = (): ReportFilter[] => {\r\n const {\r\n consultationTypeIds,\r\n authorityIds,\r\n consultationCategoryIds,\r\n extensionRequestStatusIds,\r\n } = useReportFilters();\r\n\r\n return [\r\n consultationTypeIds,\r\n authorityIds,\r\n consultationCategoryIds,\r\n extensionRequestStatusIds,\r\n ];\r\n};\r\n","import React from 'react';\r\n\r\nimport { useExtensionRequestsReport, useExtensionRequestsReportCsv } from 'api';\r\nimport { useExtensionRequestsFilters } from './hooks';\r\nimport { BaseReport } from '../..';\r\n\r\nexport const ExtensionRequestsReport: React.FC = () => {\r\n useExtensionRequestsReport();\r\n const filters = useExtensionRequestsFilters();\r\n const { mutate: exportCsv } = useExtensionRequestsReportCsv();\r\n\r\n return ;\r\n};\r\n","import { UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getExtensionRequestsReport, useBaseReport } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const useExtensionRequestsReport = (): UseQueryResult =>\r\n useBaseReport(API_QUERY_KEYS.getExtensionRequestsReport, getExtensionRequestsReport);\r\n","import React from 'react';\r\n\r\nimport { useExtensionRequestsReportCsv } from 'api';\r\nimport { useExtensionRequestsFilters } from './hooks';\r\nimport { MobileReportModal } from '../..';\r\n\r\nexport const ExtensionRequestsReportMobile: React.FC = () => {\r\n const filters = useExtensionRequestsFilters();\r\n const { mutate: exportCsv } = useExtensionRequestsReportCsv();\r\n\r\n return ;\r\n};\r\n","import { ReportColumn } from 'types';\r\nimport { useReportColumns } from '../../../../hooks';\r\n\r\nexport const useLateResponseColumns = (): ReportColumn[] => {\r\n const {\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n lateResponseReason,\r\n otherReason,\r\n responseType,\r\n } = useReportColumns();\r\n\r\n return [\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n lateResponseReason,\r\n otherReason,\r\n responseType,\r\n ];\r\n};\r\n","import { ReportFilter } from 'types';\r\nimport { useReportFilters } from '../../../../hooks';\r\n\r\nexport const useLateResponseFilters = (): ReportFilter[] => {\r\n const {\r\n consultationTypeIds,\r\n authorityIds,\r\n consultationCategoryIds,\r\n lateResponseReasonIds,\r\n responseTypeIds,\r\n } = useReportFilters();\r\n\r\n return [\r\n consultationTypeIds,\r\n authorityIds,\r\n consultationCategoryIds,\r\n lateResponseReasonIds,\r\n responseTypeIds,\r\n ];\r\n};\r\n","import React from 'react';\r\n\r\nimport { useLateResponsesReport, useLateResponsesReportCsv } from 'api';\r\nimport { useLateResponseFilters } from './hooks';\r\nimport { BaseReport } from '../..';\r\n\r\nexport const LateResponsesReport: React.FC = () => {\r\n useLateResponsesReport();\r\n const filters = useLateResponseFilters();\r\n const { mutate: exportCsv } = useLateResponsesReportCsv();\r\n\r\n return ;\r\n};\r\n","import { UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getLateResponsesReport, useBaseReport } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const useLateResponsesReport = (): UseQueryResult =>\r\n useBaseReport(API_QUERY_KEYS.getLateResponsesReport, getLateResponsesReport);\r\n","import React from 'react';\r\n\r\nimport { useLateResponsesReportCsv } from 'api';\r\nimport { useLateResponseFilters } from './hooks';\r\nimport { MobileReportModal } from '../..';\r\n\r\nexport const LateResponsesReportMobile: React.FC = () => {\r\n const filters = useLateResponseFilters();\r\n const { mutate: exportCsv } = useLateResponsesReportCsv();\r\n\r\n return ;\r\n};\r\n","import { ReportColumn } from 'types';\r\nimport { useReportColumns } from '../../../../hooks';\r\n\r\nexport const useOutstandingResponseColumns = (): ReportColumn[] => {\r\n const {\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n consultationStatus,\r\n } = useReportColumns();\r\n\r\n return [\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n consultationStatus,\r\n ];\r\n};\r\n","import { ReportFilter } from 'types';\r\nimport { useReportFilters } from '../../../../hooks';\r\n\r\nexport const useOutstandingResponseFilters = (): ReportFilter[] => {\r\n const { consultationTypeIds, authorityIds, consultationCategoryIds, consultationStatusIds } =\r\n useReportFilters();\r\n\r\n return [consultationTypeIds, authorityIds, consultationCategoryIds, consultationStatusIds];\r\n};\r\n","import React from 'react';\r\n\r\nimport { useOutstandingResponsesReport, useOutstandingResponsesReportCsv } from 'api';\r\nimport { useOutstandingResponseFilters } from './hooks';\r\nimport { BaseReport } from '../..';\r\n\r\nexport const OutstandingResponsesReport: React.FC = () => {\r\n useOutstandingResponsesReport();\r\n const filters = useOutstandingResponseFilters();\r\n const { mutate: exportCsv } = useOutstandingResponsesReportCsv();\r\n\r\n return ;\r\n};\r\n","import { UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getOutstandingResponsesReport, useBaseReport } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const useOutstandingResponsesReport = (): UseQueryResult =>\r\n useBaseReport(API_QUERY_KEYS.getOutstandingResponsesReport, getOutstandingResponsesReport);\r\n","import React from 'react';\r\n\r\nimport { useOutstandingResponsesReportCsv } from 'api';\r\nimport { useOutstandingResponseFilters } from './hooks';\r\nimport { MobileReportModal } from '../..';\r\n\r\nexport const OutstandingResponsesReportMobile: React.FC = () => {\r\n const filters = useOutstandingResponseFilters();\r\n const { mutate: exportCsv } = useOutstandingResponsesReportCsv();\r\n\r\n return ;\r\n};\r\n","import { ReportColumn } from 'types';\r\nimport { useReportColumns } from '../../../../hooks';\r\n\r\nexport const useRespondedOnTimeColumns = (): ReportColumn[] => {\r\n const {\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n responseType,\r\n } = useReportColumns();\r\n\r\n return [\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n responseType,\r\n ];\r\n};\r\n","import { ReportFilter } from 'types';\r\nimport { useReportFilters } from '../../../../hooks';\r\n\r\nexport const useRespondedOnTimeFilters = (): ReportFilter[] => {\r\n const { consultationTypeIds, authorityIds, consultationCategoryIds, responseTypeIds } =\r\n useReportFilters();\r\n\r\n return [consultationTypeIds, authorityIds, consultationCategoryIds, responseTypeIds];\r\n};\r\n","import React from 'react';\r\n\r\nimport { useRespondedOnTimeReport, useRespondedOnTimeReportCsv } from 'api';\r\nimport { useRespondedOnTimeFilters } from './hooks';\r\nimport { BaseReport } from '../..';\r\n\r\nexport const RespondedOnTimeReport: React.FC = () => {\r\n useRespondedOnTimeReport();\r\n const filters = useRespondedOnTimeFilters();\r\n const { mutate: exportCsv } = useRespondedOnTimeReportCsv();\r\n\r\n return ;\r\n};\r\n","import { UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getRespondedOnTimeReport, useBaseReport } from 'api';\r\nimport { ReportResponse } from 'types';\r\n\r\nexport const useRespondedOnTimeReport = (): UseQueryResult =>\r\n useBaseReport(API_QUERY_KEYS.getRespondedOnTimeReport, getRespondedOnTimeReport);\r\n","import React from 'react';\r\n\r\nimport { useRespondedOnTimeReportCsv } from 'api';\r\nimport { useRespondedOnTimeFilters } from './hooks';\r\nimport { MobileReportModal } from '../..';\r\n\r\nexport const RespondedOnTimeReportMobile: React.FC = () => {\r\n const filters = useRespondedOnTimeFilters();\r\n const { mutate: exportCsv } = useRespondedOnTimeReportCsv();\r\n\r\n return ;\r\n};\r\n","import { ReportColumn } from 'types';\r\nimport { useReportColumns } from '../../../../hooks';\r\n\r\nexport const useRespondedYearToDateColumns = (): ReportColumn[] => {\r\n const {\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n responseType,\r\n } = useReportColumns();\r\n\r\n return [\r\n consultationType,\r\n applicationReference,\r\n authority,\r\n category,\r\n consultationRequestDate,\r\n consulteeResponseDueDate,\r\n dateConsultationRespondedTo,\r\n responseType,\r\n ];\r\n};\r\n","import { ReportFilter } from 'types';\r\nimport { useReportFilters } from '../../../../hooks';\r\n\r\nexport const useRespondedYearToDateFilters = (): ReportFilter[] => {\r\n const { consultationTypeIds, authorityIds, consultationCategoryIds, responseTypeIds } =\r\n useReportFilters();\r\n\r\n return [consultationTypeIds, authorityIds, consultationCategoryIds, responseTypeIds];\r\n};\r\n","import React from 'react';\r\n\r\nimport { useRespondedYearToDateReport, useRespondedYearToDateReportCsv } from 'api';\r\nimport { useRespondedYearToDateFilters } from './hooks';\r\nimport { BaseReport } from '../..';\r\n\r\nexport const RespondedYearToDateReport: React.FC = () => {\r\n useRespondedYearToDateReport();\r\n const filters = useRespondedYearToDateFilters();\r\n const { mutate: exportCsv } = useRespondedYearToDateReportCsv();\r\n\r\n return ;\r\n};\r\n","import { UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getRespondedYearToDateReport, useBaseReport } from '../../../api';\r\nimport { ReportResponse } from '../../../types';\r\n\r\nexport const useRespondedYearToDateReport = (): UseQueryResult =>\r\n useBaseReport(API_QUERY_KEYS.getRespondedYearToDateReport, getRespondedYearToDateReport);\r\n","import React from 'react';\r\n\r\nimport { useRespondedYearToDateReportCsv } from 'api';\r\nimport { useRespondedYearToDateFilters } from './hooks';\r\nimport { MobileReportModal } from '../..';\r\n\r\nexport const RespondedYearToDateReportMobile: React.FC = () => {\r\n const filters = useRespondedYearToDateFilters();\r\n const { mutate: exportCsv } = useRespondedYearToDateReportCsv();\r\n\r\n return ;\r\n};\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button, Container, DataTable, Flex, Grid, TableState } from '@tq/ui-components';\r\n\r\nimport { DataTablePagination, PageHeading } from 'components';\r\nimport {\r\n reportDataState,\r\n reportOrderByColumnState,\r\n reportOrderByDescendingState,\r\n reportPageNumberState,\r\n reportPageSizeState,\r\n reportPaginationState,\r\n reportSortByState,\r\n reportState,\r\n} from 'store';\r\nimport { ReportData, ReportFilter } from 'types';\r\nimport { ReportDates, ReportFilters } from '..';\r\nimport { useReports } from '../../hooks';\r\nimport { UseMutateFunction } from '@tanstack/react-query';\r\n\r\ntype BaseReportProps = {\r\n filters: ReportFilter[];\r\n exportCsv: UseMutateFunction;\r\n};\r\n\r\nexport const BaseReport: React.FC = ({ filters, exportCsv }) => {\r\n const { t } = useTranslation('report');\r\n const { name } = useParams();\r\n const reports = useReports();\r\n const tableRef = useRef(null);\r\n\r\n const [report, setReport] = useRecoilState(reportState);\r\n const reportData = useRecoilValue(reportDataState);\r\n const reportPagination = useRecoilValue(reportPaginationState);\r\n const reportSortBy = useRecoilValue(reportSortByState);\r\n const setReportOrderByColumn = useSetRecoilState(reportOrderByColumnState);\r\n const setReportOrderByDescending = useSetRecoilState(reportOrderByDescendingState);\r\n\r\n useEffect(() => {\r\n if (!report && name) {\r\n const currentReport = reports.find((x) => x.name === name);\r\n if (currentReport) {\r\n setReport(currentReport);\r\n }\r\n }\r\n }, [reports, report, setReport, name]);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n const newOrderByColumn = state.sortBy?.[0]?.id;\r\n const newOrderByDescending = state.sortBy?.[0]?.desc ?? false;\r\n\r\n if (newOrderByColumn) {\r\n setReportOrderByColumn(newOrderByColumn);\r\n setReportOrderByDescending(newOrderByDescending);\r\n }\r\n };\r\n\r\n return (\r\n \r\n {report && (\r\n \r\n \r\n \r\n \r\n \r\n \r\n exportCsv({})}\r\n >\r\n {t('export', 'Export CSV')}\r\n \r\n \r\n

    {report.description}

    \r\n
    \r\n {report.hasDateFilter && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { reports } from '../../hooks';\r\n\r\nimport {\r\n ExtensionRequestsReportMobile,\r\n LateResponsesReportMobile,\r\n OutstandingResponsesReportMobile,\r\n RespondedYearToDateReportMobile,\r\n RespondedOnTimeReportMobile,\r\n} from '../reports';\r\n\r\nexport const MobileReportFiltersModal: React.FC<{ reportName: reports }> = ({\r\n reportName,\r\n}) => {\r\n switch (reportName) {\r\n case reports.extensionRequests:\r\n return ;\r\n case reports.lateResponses:\r\n return ;\r\n case reports.outstandingResponses:\r\n return ;\r\n case reports.respondedOnTime:\r\n return ;\r\n case reports.respondedYearToDate:\r\n return ;\r\n default:\r\n return <>;\r\n }\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useParams } from 'react-router-dom';\r\nimport { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Box,\r\n Button,\r\n Grid,\r\n Heading,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalFooter,\r\n ModalHeader,\r\n Text,\r\n VStack,\r\n} from '@tq/ui-components';\r\n\r\nimport { MobileModal } from 'components';\r\nimport { reportState, openReportModalMobileState, reportStartDateState } from 'store';\r\nimport { ReportFilter } from 'types';\r\nimport { ReportDates, ReportFilters } from '..';\r\nimport { useReports } from '../../hooks';\r\nimport { UseMutateFunction } from '@tanstack/react-query';\r\n\r\nexport type MobileReportModalProps = {\r\n filters: ReportFilter[];\r\n exportCsv: UseMutateFunction;\r\n};\r\n\r\nexport const MobileReportModal: React.FC = ({\r\n filters,\r\n exportCsv,\r\n}) => {\r\n const { t } = useTranslation('reports');\r\n const { name } = useParams();\r\n const reports = useReports();\r\n\r\n const [report, setReport] = useRecoilState(reportState);\r\n const hasFromDateValue = useRecoilValue(reportStartDateState);\r\n const isOpen = useRecoilValue(openReportModalMobileState);\r\n const resetIsOpen = useResetRecoilState(openReportModalMobileState);\r\n\r\n useEffect(() => {\r\n if (!report && name) {\r\n const currentReport = reports.find((x) => x.name === name);\r\n if (currentReport) {\r\n setReport(currentReport);\r\n }\r\n }\r\n }, [reports, report, setReport, name]);\r\n\r\n const handleCloseClick = () => {\r\n resetIsOpen();\r\n };\r\n\r\n return (\r\n \r\n \r\n {t('configure_report', 'Configure report')}\r\n \r\n \r\n \r\n {report && (\r\n \r\n }\r\n >\r\n \r\n \r\n {report.hasDateFilter\r\n ? t(\r\n 'refine_report_date_filters',\r\n 'Please select a date range and any optional filters you would like to refine your report before exporting.'\r\n )\r\n : t(\r\n 'refine_report_filters',\r\n 'Please select any optional filters you would like to refine your report before exporting.'\r\n )}\r\n \r\n \r\n {t(\r\n 'export_report_csv',\r\n 'Your refined report will be exported to a .csv file.'\r\n )}\r\n \r\n \r\n\r\n \r\n {t('selected_report', 'Selected report')}\r\n {report.header}\r\n \r\n\r\n {report.hasDateFilter && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n\r\n \r\n \r\n exportCsv({})}\r\n >\r\n {t('export', 'Export CSV')}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaArrowRight } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Button, Grid, Typography } from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { Report } from 'types';\r\n\r\ntype ReportCardProps = {\r\n report: Report;\r\n runReport: () => void;\r\n};\r\n\r\nexport const ReportCard: React.FC = ({ report, runReport }) => {\r\n const { t } = useTranslation('reports');\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n

    {report.header}

    \r\n
    \r\n \r\n {report.description}\r\n \r\n
    \r\n }\r\n onClick={runReport}\r\n >\r\n {t('run_report', 'Run report')}\r\n \r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\n\r\nimport { reportStartDateState, reportEndDateState } from 'store';\r\nimport { DateFilter } from 'components';\r\n\r\ntype ReportDateProps = {\r\n onSubmit?: () => void;\r\n};\r\n\r\nexport const ReportDates: React.FC = ({ onSubmit }) => {\r\n const { t } = useTranslation('report');\r\n\r\n const [reportStartDate, setReportStartDate] = useRecoilState(reportStartDateState);\r\n const [reportEndDate, setReportEndDate] = useRecoilState(reportEndDateState);\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { useEffect } from 'react';\r\nimport { useRecoilState } from 'recoil';\r\n\r\nimport { TableFiltersWithDate } from 'components';\r\nimport { reportFiltersState, reportTextState } from 'store';\r\nimport { ReportFilter } from 'types';\r\n\r\ntype ReportFiltersProps = {\r\n filters: ReportFilter[];\r\n collapsible?: boolean;\r\n};\r\n\r\nexport const ReportFilters: React.FC = ({\r\n filters,\r\n collapsible = true,\r\n}) => {\r\n const [reportFilters, setReportFilters] = useRecoilState(reportFiltersState);\r\n useEffect(() => {\r\n setReportFilters(filters);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n setReportFilters(_filters as ReportFilter[])}\r\n collapsible={collapsible}\r\n showDateFilter={false}\r\n textSearchState={reportTextState}\r\n />\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Badge } from '@tq/ui-components/dist/components';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\ntype ReportDateProps = {\r\n complete: boolean;\r\n};\r\n\r\nexport const StatusIndicator: React.FC = ({ complete }) => {\r\n const { t } = useTranslation('report');\r\n\r\n return (\r\n \r\n {complete ? t('complete', 'complete') : t('draft', 'draft')}\r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport { useQueryClient } from '@tanstack/react-query';\r\nimport {\r\n FormControl,\r\n FormLabel,\r\n Select,\r\n Typography,\r\n Flex,\r\n Spinner,\r\n} from '@tq/ui-components/dist/components';\r\nimport { Form, FormProvider } from '@tq/ui-components/dist/components/forms-engine';\r\nimport { tqc } from '@tq/ui-components/dist/system';\r\n\r\nimport { useDfiAnnualReports, API_QUERY_KEYS } from 'api';\r\nimport { annualDfiReportYearState } from 'store';\r\nimport { StatusIndicator } from './StatusIndicator';\r\n\r\ntype ReportDateProps = {\r\n onSubmit?: () => void;\r\n};\r\n\r\nexport const ReportFiscalYear: React.FC = ({ onSubmit }) => {\r\n const { t } = useTranslation('report');\r\n const queryClient = useQueryClient();\r\n\r\n const [annualDfiReportYear, setAnnualDfiReportYear] = useRecoilState(\r\n annualDfiReportYearState\r\n );\r\n\r\n const [financialYear, setFinancialYear] = useState(annualDfiReportYear);\r\n\r\n const { data: response } = useDfiAnnualReports();\r\n\r\n const handleSubmit = () => {\r\n setAnnualDfiReportYear(financialYear);\r\n queryClient.invalidateQueries({ queryKey: [API_QUERY_KEYS.getDfiAnnualReport] });\r\n onSubmit?.();\r\n };\r\n\r\n const handleChange = (selectedOption: string) => {\r\n setFinancialYear(+selectedOption);\r\n };\r\n\r\n return response ? (\r\n \r\n
    \r\n \r\n \r\n {t('financial_year', 'Financial year')}:\r\n \r\n \r\n {response.listDfiAnnualReportItems?.map((report) => (\r\n \r\n ))}\r\n \r\n \r\n
    \r\n
    \r\n ) : (\r\n \r\n );\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, getDfiAnnualReports, QueryDefaults } from 'api';\r\nimport { DfiReportsResponse } from 'types';\r\n\r\nexport const useDfiAnnualReports = (): UseQueryResult =>\r\n useQuery([API_QUERY_KEYS.getDfiAnnualReports], getDfiAnnualReports, QueryDefaults);\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue, useResetRecoilState } from 'recoil';\r\nimport {\r\n Button,\r\n Grid,\r\n Modal,\r\n ModalContent,\r\n ModalFooter,\r\n ModalOverlay,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { MobileModal } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport { openReportModalState, reportState } from 'store';\r\nimport { ReportModalContentSwitch } from '..';\r\n\r\nexport const ReportModal: React.FC = () => {\r\n const { t } = useTranslation('report_modal');\r\n\r\n const report = useRecoilValue(reportState);\r\n const isMobile = useIsMobile();\r\n const { navigateToReport } = useNavigate();\r\n\r\n const isOpen = useRecoilValue(openReportModalState);\r\n const resetIsOpen = useResetRecoilState(openReportModalState);\r\n\r\n const handleClose = () => resetIsOpen();\r\n\r\n const handleSubmit = () => {\r\n if (report) {\r\n resetIsOpen();\r\n navigateToReport(report.name);\r\n }\r\n };\r\n\r\n return isMobile ? (\r\n \r\n {report && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n {report && }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaCalendarAlt } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Grid, ModalBody, ModalCloseButton, ModalHeader } from '@tq/ui-components';\r\n\r\ninterface ReportModalContentProps {\r\n titleText: string;\r\n subTitleText: string;\r\n}\r\n\r\nexport const ReportModalContent: React.FC = ({\r\n titleText,\r\n subTitleText,\r\n children,\r\n}) => {\r\n const { t } = useTranslation('report_modal');\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {titleText}\r\n \r\n \r\n \r\n \r\n \r\n

    {subTitleText}

    \r\n \r\n \r\n {children}\r\n \r\n
    \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Report } from 'types';\r\nimport { ReportDates, ReportFiscalYear, ReportModalContent } from '..';\r\nimport { reports } from '../../hooks';\r\n\r\ninterface ReportModalContentSwitchProps {\r\n report: Report;\r\n handleSubmit: () => void;\r\n}\r\n\r\nexport const ReportModalContentSwitch: React.FC = ({\r\n handleSubmit,\r\n report,\r\n}) => {\r\n const { t } = useTranslation('report_modal');\r\n\r\n return report.name === reports.annualDfi ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nimport { reports } from './hooks';\r\nimport {\r\n AnnualDfiReport,\r\n ExtensionRequestsReport,\r\n LateResponsesReport,\r\n OutstandingResponsesReport,\r\n RespondedYearToDateReport,\r\n} from './components';\r\nimport { RespondedOnTimeReport } from './components/reports/RespondedOnTimeReport';\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\n\r\nexport const Report: React.FC = () => {\r\n const { name } = useParams();\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n const annualOrDfiReport = isTQ ? reports.annualReport : reports.annualDfi;\r\n\r\n switch (name) {\r\n case annualOrDfiReport:\r\n return ;\r\n case reports.extensionRequests:\r\n return ;\r\n case reports.lateResponses:\r\n return ;\r\n case reports.outstandingResponses:\r\n return ;\r\n case reports.respondedOnTime:\r\n return ;\r\n case reports.respondedYearToDate:\r\n return ;\r\n default:\r\n return <>;\r\n }\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useResetRecoilState, useSetRecoilState } from 'recoil';\r\nimport { Box, Container, Flex, Grid } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { PageHeading } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport {\r\n annualDfiReportYearState,\r\n openReportModalState,\r\n openReportModalMobileState,\r\n reportStartDateState,\r\n reportEndDateState,\r\n reportFiltersState,\r\n reportState,\r\n} from 'store';\r\nimport { Report } from 'types';\r\nimport { ReportCard, ReportModal, MobileReportFiltersModal } from './components';\r\nimport { useReports, reports as resportType } from './hooks';\r\n\r\nexport const Reports: React.FC = () => {\r\n const { t } = useTranslation('reports');\r\n\r\n const reports = useReports();\r\n const { navigateToReport } = useNavigate();\r\n const isMobile = useIsMobile();\r\n\r\n const [reportName, setReportName] = useState('');\r\n const setOpenReportModal = useSetRecoilState(openReportModalState);\r\n const setOpenReportMobileModal = useSetRecoilState(openReportModalMobileState);\r\n const setReport = useSetRecoilState(reportState);\r\n const resetDfiReportYear = useResetRecoilState(annualDfiReportYearState);\r\n const resetStartDate = useResetRecoilState(reportStartDateState);\r\n const resetEndDate = useResetRecoilState(reportEndDateState);\r\n const resetReportFilters = useResetRecoilState(reportFiltersState);\r\n\r\n const runReport = (report: Report) => {\r\n setReportName(report.name);\r\n resetDfiReportYear();\r\n resetStartDate();\r\n resetEndDate();\r\n resetReportFilters();\r\n setReport(report);\r\n if (isMobile) {\r\n setOpenReportMobileModal(true);\r\n } else if (report.hasDateFilter) {\r\n setOpenReportModal(true);\r\n } else {\r\n navigateToReport(report?.name);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n

    {t('reports_summary', 'Select a report you would like to configure and run')}

    \r\n \r\n {reports\r\n .filter((report) => !isMobile || report.visibleOnMobile)\r\n .map((report) => (\r\n \r\n runReport(report)} />\r\n \r\n ))}\r\n \r\n
    \r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { GridProps } from '@tq/ui-components';\r\n\r\nimport { useConsultees } from 'api';\r\nimport { filterAssigneeState, searchAssignedToMeState } from 'store';\r\nimport { ConsultationFilterMultiSelect } from 'components';\r\n\r\nexport const ConsultationAssigneeFilter: React.FC = ({ ...stylingProps }) => {\r\n const { t } = useTranslation('filter');\r\n const assignedToMe = useRecoilValue(searchAssignedToMeState);\r\n const { data: consulteeData } = useConsultees();\r\n return (\r\n <>\r\n {!assignedToMe && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { useFilterAuthorities } from 'api';\r\nimport { filterAuthorityState } from 'store';\r\nimport { ConsultationFilterMultiSelect } from 'components';\r\nimport { useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\n\r\nexport const ConsultationAuthorityFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n const { data: authorityData } = useFilterAuthorities();\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { useFilterCategories } from 'api';\r\nimport { filterCategoryState, filterConsultationTypeState } from 'store';\r\nimport { ConsultationFilterMultiSelect } from 'components';\r\n\r\nexport const ConsultationCategoryFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n\r\n const { data: categoryData } = useFilterCategories();\r\n\r\n const selectedFilterTypes = useRecoilValue(filterConsultationTypeState);\r\n const isRpcOnly =\r\n selectedFilterTypes?.length === 1 && selectedFilterTypes[0].label === 'RPC';\r\n\r\n return (\r\n <>\r\n {!isRpcOnly && (\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import styled from 'styled-components';\r\n\r\nexport const TitleContainer = styled.div`\r\n flex: 0 0 100%; /* flex-grow, flex-shrink, flex-basis */\r\n font-weight: 600;\r\n margin-bottom: 10px;\r\n`;\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Grid,\r\n FormLabel,\r\n GridItem,\r\n DatePicker,\r\n isArray,\r\n FormControl,\r\n} from '@tq/ui-components';\r\n\r\nimport { TitleContainer } from 'pages/Search/Search.styles';\r\nimport { filterDateFromState, filterDateToState } from 'store';\r\nimport { useRecoilState } from 'recoil';\r\nimport { useLocaleDatePickerFormat } from 'config/DateFormats/useDatePickerFormat';\r\n\r\nexport const ConsultationDateFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n\r\n const [dateFrom, setDateFrom] = useRecoilState(filterDateFromState);\r\n const [dateTo, setDateTo] = useRecoilState(filterDateToState);\r\n\r\n const handleDateChange = (date: Date | [Date, Date] | null, dateType: 'to' | 'from') => {\r\n if (date && !isArray(date)) {\r\n switch (dateType) {\r\n case 'from':\r\n setDateFrom(date);\r\n break;\r\n case 'to':\r\n setDateTo(date);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n const epoch = new Date('1970-01-01');\r\n const now = new Date();\r\n const datePickerFormat = useLocaleDatePickerFormat();\r\n\r\n return (\r\n \r\n \r\n \r\n {t('date_range_title', 'Date range')}\r\n \r\n \r\n \r\n {t('date_range_from_title', 'From')}:\r\n handleDateChange(date as Date, 'from')}\r\n selected={dateFrom}\r\n />\r\n \r\n \r\n {t('date_range_to_title', 'To')}: \r\n handleDateChange(date as Date, 'to')}\r\n selected={dateTo}\r\n />\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { ChangeEvent } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Flex, FormControl, FormControlProps, FormLabel, Switch } from '@tq/ui-components';\r\nimport { ComponentWithAs } from '@tq/ui-components/dist/system';\r\n\r\nimport { searchAssignedToMeState } from 'store';\r\nimport { useRecoilState } from 'recoil';\r\n\r\nexport const ConsultationShow: ComponentWithAs<'div', FormControlProps> = (props) => {\r\n const { t } = useTranslation('search_filter');\r\n const [assignedToMe, setAssignedToMe] = useRecoilState(searchAssignedToMeState);\r\n\r\n return (\r\n \r\n \r\n {t('show_title', 'Show')}\r\n \r\n \r\n ) => setAssignedToMe(e.target.checked)}\r\n />\r\n \r\n \r\n {t('show_mine_all', 'All')}\r\n \r\n \r\n {t('show_mine', 'Assigned to me')}\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FormControl, FormControlProps, FormLabel, Select } from '@tq/ui-components';\r\nimport { ComponentWithAs } from '@tq/ui-components/dist/system';\r\nimport { useRecoilState } from 'recoil';\r\nimport { useSortOptions } from 'api';\r\n\r\nimport { searchSortState } from 'store';\r\n\r\nexport const ConsultationSort: ComponentWithAs<'div', FormControlProps> = (props) => {\r\n const { t } = useTranslation('search_filter');\r\n\r\n const { data } = useSortOptions();\r\n\r\n const [sort, setSort] = useRecoilState(searchSortState);\r\n\r\n return (\r\n \r\n {t('sort_by_title', 'Sort by')}\r\n setSort(+value)}\r\n menuZIndex={1}\r\n >\r\n {data &&\r\n data?.sortOptions?.map((filter) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { useFilterStatuses } from 'api';\r\nimport { filterStatusState } from 'store';\r\nimport { ConsultationFilterMultiSelect } from 'components';\r\n\r\nexport const ConsultationStatusFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n\r\n const { data: statusesData } = useFilterStatuses();\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n getFilterStatuses,\r\n GetFilterStatusesResponse,\r\n QueryDefaults,\r\n} from 'api';\r\nimport { filterArchiveRequestState } from 'store';\r\n\r\nexport const useFilterStatuses = (): QueryObserverResult => {\r\n const request = useRecoilValue(filterArchiveRequestState);\r\n return useQuery(\r\n [API_QUERY_KEYS.getFilterStatuses, request],\r\n () => getFilterStatuses(request),\r\n QueryDefaults\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Box,\r\n CheckboxGroup,\r\n Grid,\r\n Checkbox,\r\n Typography,\r\n FormLabel,\r\n useThemedValueSwitch,\r\n FormControl,\r\n} from '@tq/ui-components';\r\nimport { useRecoilState } from 'recoil';\r\n\r\nimport { ConsultationTypeCount, useConsultations, useFilterConsultationTypes } from 'api';\r\nimport { filterConsultationTypeState } from 'store';\r\n\r\nlet consultationTypeCounts: ConsultationTypeCount[];\r\n\r\nexport const ConsultationTypeFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const [selectedItems, setSelectedItems] = useRecoilState(filterConsultationTypeState);\r\n\r\n const { data: typeData } = useFilterConsultationTypes();\r\n const { data: consultationsData } = useConsultations();\r\n\r\n const consultationTypes = typeData?.consultationTypes || [];\r\n\r\n consultationTypes.sort((a, b) => {\r\n if (a.orderPosition !== undefined && b.orderPosition !== undefined) {\r\n return a.orderPosition - b.orderPosition;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n if (consultationsData) {\r\n consultationTypeCounts = consultationsData.consultationTypeCounts;\r\n }\r\n\r\n const getTypeCount = (consultationTypeId: number): number =>\r\n consultationTypeCounts?.find(\r\n (consultationTypeCount) =>\r\n consultationTypeCount.consultationTypeId === consultationTypeId\r\n )?.count ?? 0;\r\n\r\n const toggleSelectedType = (event: React.ChangeEvent) => {\r\n const activeType = typeData?.consultationTypes.find(\r\n (x) => x.value === +event.target.value\r\n );\r\n setSelectedItems(\r\n event.target.checked && activeType\r\n ? [...selectedItems.filter((type) => type.value !== +event.target.value), activeType]\r\n : selectedItems.filter((type) => type.value !== +event.target.value)\r\n );\r\n };\r\n\r\n return (\r\n \r\n \r\n {t('consultation_type', 'Consultation type')}:\r\n type.value)}\r\n >\r\n {consultationTypes.map((filter) => (\r\n \r\n \r\n \r\n {filter.label}\r\n \r\n \r\n ({getTypeCount(filter.value)})\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport { FormControl, FormControlProps, FormLabel, Select } from '@tq/ui-components';\r\nimport { ComponentWithAs } from '@tq/ui-components/dist/system';\r\n\r\nimport { searchViewTypeState } from 'store';\r\nimport { ConsultationViewTypes, ValueLabelResponse } from 'types';\r\n\r\nexport const ConsultationViewType: ComponentWithAs<'div', FormControlProps> = (props) => {\r\n const { t } = useTranslation('search_filter');\r\n const viewFilterItems: ValueLabelResponse[] = [\r\n {\r\n value: ConsultationViewTypes.Open,\r\n label: t('open_consultations', 'Open consultations'),\r\n },\r\n {\r\n value: ConsultationViewTypes.Archived,\r\n label: t('archived_consultations', 'Archived consultations'),\r\n },\r\n ];\r\n const [viewType, setViewType] = useRecoilState(searchViewTypeState);\r\n\r\n return (\r\n \r\n {t('view_title', 'View')}\r\n setViewType(+value)}\r\n menuZIndex={1}\r\n >\r\n {viewFilterItems.map((filter) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link } from '@tq/ui-components';\r\n\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport { useRecoilState } from 'recoil';\r\nimport { searchViewTypeState } from 'store';\r\nimport { ConsultationViewTypes } from 'types';\r\n\r\nexport const ConsultationViewTypeMobile: React.FC = () => {\r\n const { t } = useTranslation('search_filter');\r\n const isMobile = useIsMobile();\r\n\r\n const [viewType, setViewType] = useRecoilState(searchViewTypeState);\r\n\r\n const toggleViewType = () =>\r\n setViewType((currentViewType) =>\r\n currentViewType === ConsultationViewTypes.Open\r\n ? ConsultationViewTypes.Archived\r\n : ConsultationViewTypes.Open\r\n );\r\n\r\n return (\r\n <>\r\n {isMobile && (\r\n \r\n {viewType === ConsultationViewTypes.Open\r\n ? t('switch_to_archived', 'Switch to Archived')\r\n : t('switch_to_open', 'Switch to Open')}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { filterTeamState } from 'store';\r\nimport { ConsultationFilterMultiSelect } from 'components';\r\nimport { useConsulteeTeams } from 'api';\r\n\r\nexport const ConsultationTeamFilter: React.FC = () => {\r\n const { t } = useTranslation('filter');\r\n\r\n const { data: teamData } = useConsulteeTeams();\r\n\r\n return (\r\n <>\r\n {teamData?.teams?.length && teamData.teams.length > 1 ? (\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n LinkButton,\r\n Grid,\r\n Heading,\r\n Box,\r\n BoxProps,\r\n Divider,\r\n useThemedValueSwitch,\r\n FormControl,\r\n} from '@tq/ui-components';\r\n\r\nimport { ConsultationTypeFilter } from '../ConsultationTypeFilter';\r\nimport { ConsultationStatusFilter } from '../ConsultationStatusFilter';\r\nimport { ConsultationAssigneeFilter } from '../ConsultationAssigneeFilter';\r\nimport { ConsultationCategoryFilter } from '../ConsultationCategoryFilter';\r\nimport { ConsultationAuthorityFilter } from '../ConsultationAuthorityFilter';\r\nimport { ConsultationDateFilter } from '../ConsultationDateFilter';\r\nimport { ConsultationTeamFilter } from '../ConsultationTeamFilter';\r\nimport { useClearAllFilters } from 'hooks';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\n\r\nexport const SideFilter: React.FC = ({\r\n isLoading,\r\n ...stylingProps\r\n}) => {\r\n const { t } = useTranslation('filter');\r\n const { tvs } = useThemedValueSwitch();\r\n\r\n const clearAllFilters = useClearAllFilters();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {t('filter_options', 'Filter options')}\r\n \r\n \r\n {t('clear_all_filters', 'Clear all filters')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isLoading ? (\r\n \r\n ) : null}\r\n \r\n );\r\n};\r\n","import { useRecoilTransaction_UNSTABLE } from 'recoil';\r\n\r\nimport { filterAtoms } from 'store/search/filter';\r\n\r\nexport const useClearAllFilters = (): (() => void) =>\r\n useRecoilTransaction_UNSTABLE(({ reset }) => () => {\r\n Object.values(filterAtoms).forEach((atom) => reset(atom));\r\n });\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport {\r\n Box,\r\n Button,\r\n ModalBody,\r\n ModalCloseButton,\r\n ModalFooter,\r\n ModalHeader,\r\n ModalProps,\r\n VStack,\r\n} from '@tq/ui-components';\r\n\r\nimport { MobileModal } from 'components';\r\nimport { SideFilter } from '../SideFilter';\r\n\r\nexport type FilterModalProps = Pick;\r\nexport const FilterModal: React.FC = ({ ...modalProps }) => {\r\n const { t } = useTranslation('filter_modal');\r\n return (\r\n \r\n \r\n \r\n {t('filter_consultations', 'Filter consultations')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\n\r\nimport {\r\n Box,\r\n usePagination,\r\n IconDoubleChevronLeft,\r\n IconDoubleChevronRight,\r\n ResponsivePagination,\r\n} from '@tq/ui-components';\r\nimport { useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { StatisticsChart } from '..';\r\nimport { StatisticsReport } from 'types';\r\n\r\nexport const StatisticsChartDisplay: React.FC<{\r\n width?: string;\r\n statisticsResponse: StatisticsReport;\r\n}> = ({ width, statisticsResponse }) => {\r\n const { isTQ } = useThemedValueSwitch();\r\n const reportKeys = Object.keys(statisticsResponse.reportData);\r\n const itemsPerPage = 6;\r\n const { currentItems, jump, prev, next, currentPage, maxPage } = usePagination({\r\n items: Object.entries(reportKeys),\r\n itemsPerPage,\r\n });\r\n const customPaginationPrev = {\r\n iconPrev: ,\r\n justifyContent: 'flex-end',\r\n };\r\n\r\n const customPaginationNext = {\r\n iconNext: ,\r\n justifyContent: 'flex-start',\r\n };\r\n\r\n const tqPaginationStyles = {\r\n '& .tqc-stack > div': {\r\n justifyContent: 'center',\r\n },\r\n\r\n '& .tqc-pagination-previous': {\r\n flex: 0,\r\n\r\n '& button': {\r\n justifyContent: 'center',\r\n },\r\n\r\n '& + div': {\r\n flex: 0,\r\n mx: '1.5rem',\r\n },\r\n },\r\n\r\n '& .tqc-pagination-next': {\r\n flex: 0,\r\n\r\n '& button': {\r\n justifyContent: 'center',\r\n },\r\n },\r\n };\r\n\r\n return (\r\n <>\r\n {currentItems.map(([key, title]) => (\r\n \r\n \r\n \r\n ))}\r\n {!isTQ && (\r\n ) => {\r\n jump(Number(e.currentTarget.value));\r\n },\r\n\r\n onPrevClick: () => {\r\n prev();\r\n },\r\n\r\n onNextClick: () => {\r\n next();\r\n },\r\n\r\n sx: isTQ ? tqPaginationStyles : {},\r\n }}\r\n />\r\n )}\r\n \r\n );\r\n};\r\n","import React, { MouseEventHandler, useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaChartBar, FaChevronDown, FaChevronUp } from 'react-icons/fa';\r\n\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { spacing } from '@tq/ui-components/dist/components/mobile-options-accordion/styles/theme/spacing';\r\nimport { useThemedValueSwitch } from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\nimport {\r\n Box,\r\n Button,\r\n Flex,\r\n Grid,\r\n Link,\r\n Typography,\r\n Heading,\r\n} from '@tq/ui-components/dist/components';\r\n\r\nimport { useStatisticsReport } from '../../../../api';\r\nimport { useNavigate } from '../../../../hooks';\r\nimport { StatisticsChartDisplay } from './StatisticsChartDisplay';\r\n\r\nexport const StatisticsBar: React.FC = () => {\r\n const { tvs } = useThemedValueSwitch();\r\n const { t } = useTranslation('search_statistics');\r\n const { navigateToReports } = useNavigate();\r\n const isMobile = useIsMobile();\r\n const { data: statisticsResponse } = useStatisticsReport();\r\n\r\n const [showStatistics, setShowStatistics] = useState(false);\r\n const handleShowClick: MouseEventHandler = (e) => {\r\n e.preventDefault();\r\n setShowStatistics((prevShow) => !prevShow);\r\n };\r\n\r\n return isMobile ? (\r\n \r\n \r\n {statisticsResponse && (\r\n \r\n )}\r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {t('latest_statistics', 'Latest Statistics')}\r\n \r\n\r\n {showStatistics && (\r\n \r\n {t('view_reports', 'View reports')}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n {showStatistics ? t('hide_statistics', 'Hide') : t('show_statistics', 'Show')}\r\n \r\n {showStatistics ? : }\r\n \r\n \r\n \r\n \r\n {showStatistics && (\r\n \r\n {statisticsResponse && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import { useQuery, UseQueryResult } from '@tanstack/react-query';\r\nimport { useRecoilValue } from 'recoil';\r\n\r\nimport { API_QUERY_KEYS, getStatisticsReport, QueryDefaults } from 'api';\r\nimport { statisticsRequestState } from 'store';\r\nimport { StatisticsReport } from 'types';\r\n\r\nexport const useStatisticsReport = (): UseQueryResult => {\r\n const request = useRecoilValue(statisticsRequestState);\r\n return useQuery(\r\n [API_QUERY_KEYS.getStatisticsReport, request],\r\n () => getStatisticsReport(request),\r\n QueryDefaults\r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Cell, Pie, PieChart } from 'recharts';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Box, Flex, Grid, Typography, useThemedValueSwitch } from '@tq/ui-components';\r\nimport { searchViewTypeState } from 'store';\r\nimport { CUSTOM_COLOURS, CUSTOM_TQ_COLOURS } from 'styles';\r\nimport { ConsultationViewTypes, Statistics } from 'types';\r\nimport { useRecoilState } from 'recoil';\r\n\r\ntype StatisticsChartProps = {\r\n statistics: Statistics;\r\n title: string;\r\n};\r\n\r\ntype Statistic = {\r\n name: string;\r\n value: number;\r\n percentage: number;\r\n colour: string;\r\n badgeColour: string;\r\n};\r\n\r\nexport const StatisticsChart: React.FC = ({ statistics, title }) => {\r\n const { t } = useTranslation('search_statistics');\r\n const { tvs, isTQ } = useThemedValueSwitch();\r\n const [viewType] = useRecoilState(searchViewTypeState);\r\n const isTQArchived = isTQ && viewType === ConsultationViewTypes.Archived;\r\n\r\n const data: Statistic[] = [\r\n {\r\n name: isTQArchived ? t('responded', 'Responded') : t('on_track', 'On track'),\r\n value: isTQArchived ? statistics.respondedCount : statistics.onTrackCount,\r\n percentage: isTQArchived ? statistics.respondedPercentage : statistics.onTrackPercentage,\r\n colour: isTQ ? CUSTOM_TQ_COLOURS.darkBlue0D4E8A : CUSTOM_COLOURS.mediumWCAGGreen,\r\n badgeColour: COLOURS.white,\r\n },\r\n {\r\n name: isTQArchived ? t('closed', 'Closed') : t('overdue', 'Overdue'),\r\n value: isTQArchived ? statistics.closedCount : statistics.overdueCount,\r\n percentage: isTQArchived ? statistics.closedPercentage : statistics.overduePercentage,\r\n colour: isTQ ? CUSTOM_TQ_COLOURS.darkGreen2B8022 : COLOURS.red[700],\r\n badgeColour: COLOURS.white,\r\n },\r\n {\r\n name: isTQArchived\r\n ? t('withdrawn', 'Withdrawn')\r\n : t('nearing_deadline', 'Nearing deadline'),\r\n value: isTQArchived ? statistics.withdrawnCount : statistics.nearingDeadlineCount,\r\n percentage: isTQArchived\r\n ? statistics.withdrawnPercentage\r\n : statistics.nearingDeadlinePercentage,\r\n colour: isTQ ? CUSTOM_TQ_COLOURS.lightBlue4CAAF0 : COLOURS.yellow[500],\r\n badgeColour: COLOURS.white,\r\n },\r\n ];\r\n\r\n const StatisticsTq = [\r\n {\r\n name: t('determined', 'Determined'),\r\n value: statistics.determinedCount,\r\n percentage: statistics.determinedPercentage,\r\n colour: CUSTOM_TQ_COLOURS.lightGreenBDC549,\r\n badgeColour: COLOURS.white,\r\n },\r\n ];\r\n\r\n const finalStats = data.concat(isTQArchived ? StatisticsTq : []);\r\n\r\n const renderStat = (statistic: Statistic) => (\r\n \r\n \r\n {statistic.name} ({statistic.value})\r\n \r\n \r\n \r\n {Math.round(statistic.percentage)}\r\n \r\n \r\n %\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n {title}\r\n \r\n \r\n \r\n \r\n {finalStats.map((statistic) => renderStat(statistic))}\r\n \r\n \r\n \r\n \r\n {t('open', 'Open')}:\r\n \r\n {statistics.totalCount}\r\n \r\n \r\n \r\n \r\n \r\n {finalStats.map((statistic) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaChevronDown, FaChevronUp, FaSlidersH } from 'react-icons/fa';\r\nimport { Box, Button, Grid, HStack } from '@tq/ui-components';\r\n\r\nimport { useConsultations } from 'api';\r\n\r\nimport { SearchText } from 'components';\r\nimport { useIsMobile, useThemedValueSwitch } from '@tq/ui-components/dist/hooks';\r\nimport { ConsultationShow, ConsultationSort, ConsultationViewType, FilterModal } from '..';\r\nimport { searchTextState } from '../../../../store';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nconst DESKTOP_TEMPLATE = `\r\n\"view show search sort\"\r\n / 262px 162px auto 230px\r\n `;\r\n\r\nconst MOBILE_TEMPLATE = `\r\n\"search search\"\r\n\"filter optionsButton\"\r\n / 1fr 1fr\r\n`;\r\n\r\nconst MOBILE_TEMPLATE_OPTIONS = `\r\n\"search search\"\r\n\"filter optionsButton\"\r\n\"show_sort show_sort\"\r\n / 1fr 1fr\r\n`;\r\n\r\nexport const TopFilter: React.FC = () => {\r\n const { t } = useTranslation('search_filter');\r\n const { data: consultationsData } = useConsultations();\r\n\r\n const isMobile = useIsMobile();\r\n\r\n const [areOptionsVisible, setAreOptionsVisible] = useState(false);\r\n const [isFilterModalVisible, setIsFilterModalVisible] = useState(false);\r\n const { isTQ } = useThemedValueSwitch();\r\n\r\n let gridDominantSecondarySurface = {\r\n borderColor: COLOURS.gray[400],\r\n borderWidth: 1,\r\n borderRadius: 5,\r\n backgroundColor: COLOURS.gray[200],\r\n };\r\n\r\n if (isTQ) {\r\n gridDominantSecondarySurface = {\r\n borderColor: 'grey.300',\r\n borderWidth: 1,\r\n borderRadius: 3,\r\n backgroundColor: 'grey.50',\r\n };\r\n }\r\n\r\n return (\r\n \r\n {isMobile ? (\r\n <>\r\n \r\n \r\n \r\n setIsFilterModalVisible(true)}\r\n rightIcon={}\r\n >\r\n {t('filter', 'Filter')}\r\n \r\n : }\r\n onClick={() => setAreOptionsVisible((v) => !v)}\r\n >\r\n {areOptionsVisible\r\n ? t('hide_options', 'Hide options')\r\n : t('show_options', 'Show options')}\r\n \r\n {areOptionsVisible && (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n\r\n setIsFilterModalVisible((v) => !v)}\r\n />\r\n \r\n );\r\n};\r\n","import React, { useRef } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaUser } from 'react-icons/fa';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n AttentionMessage,\r\n Button,\r\n Container,\r\n Grid,\r\n TabPanel,\r\n TabPanels,\r\n Tabs,\r\n useThemedValueSwitch,\r\n} from '@tq/ui-components';\r\nimport { useIsMobile } from '@tq/ui-components/dist/hooks';\r\n\r\nimport { useConsultations } from 'api';\r\nimport {\r\n AssignModal,\r\n ConsultationCard,\r\n ConsultationCardLoading,\r\n DataTablePagination,\r\n MobileTabList,\r\n PageHeading,\r\n} from 'components';\r\nimport { useAssignModal } from 'hooks';\r\nimport { useRecoilState } from 'recoil';\r\nimport {\r\n searchPageNumberState,\r\n searchPageSizeState,\r\n searchViewTypeState,\r\n searchViewTabIndexState,\r\n} from 'store';\r\nimport { ConsultationViewTypes } from 'types';\r\nimport {\r\n ConsultationViewTypeMobile,\r\n SideFilter,\r\n StatisticsBar,\r\n TopFilter,\r\n} from './components';\r\n\r\nexport const Search: React.FC = () => {\r\n const { tvs } = useThemedValueSwitch();\r\n const { t } = useTranslation('search');\r\n const { data: consultationsData, isLoading } = useConsultations();\r\n const tableRef = useRef(null);\r\n\r\n const isMobile = useIsMobile();\r\n const [viewType] = useRecoilState(searchViewTypeState);\r\n const [tabIndex, setTabIndex] = useRecoilState(searchViewTabIndexState);\r\n\r\n const {\r\n showAssignModal,\r\n showAssignButton,\r\n isConsultationHighlighted,\r\n handleAssignSelected,\r\n handleClose,\r\n } = useAssignModal();\r\n\r\n const content = (\r\n \r\n \r\n \r\n {showAssignButton && (\r\n }\r\n width={isMobile ? '100%' : 'inherit'}\r\n onClick={handleAssignSelected}\r\n >\r\n {t('assign_selected', 'Assign selected')}\r\n \r\n )}\r\n \r\n {isLoading && }\r\n {!!consultationsData?.consultations?.items?.length && (\r\n <>\r\n \r\n {consultationsData?.consultations?.items?.map((consultation) => (\r\n \r\n ))}\r\n \r\n {consultationsData.paginationInfo && (\r\n \r\n )}\r\n \r\n )}\r\n\r\n {!isLoading && !consultationsData?.consultations?.items?.length && (\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n \r\n {viewType === ConsultationViewTypes.Open ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {isMobile ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {content}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n <>\r\n \r\n \r\n {content}\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\n","import { useRecoilValue } from 'recoil';\r\n\r\nimport { useGetAdminUsers } from 'api';\r\nimport { manageUsersSearchState } from 'store';\r\nimport { ApplicationUser } from 'types';\r\n\r\nexport type useGetAdminUsersRecordsReturn = {\r\n userData: ApplicationUser[];\r\n totalCount: number;\r\n};\r\n\r\nexport const useGetAdminUsersRecords = (): useGetAdminUsersRecordsReturn => {\r\n const { data: ApplicationUsers } = useGetAdminUsers();\r\n const searchText = useRecoilValue(manageUsersSearchState);\r\n const users = ApplicationUsers?.adminUsers ?? [];\r\n const totalCount = users.length;\r\n\r\n const userData = users.filter(\r\n (r: { name: string; email: string }) =>\r\n !searchText ||\r\n r.name.toLowerCase().includes(searchText.toLowerCase()) ||\r\n r.email.toLowerCase().includes(searchText.toLowerCase())\r\n );\r\n\r\n return {\r\n userData,\r\n totalCount,\r\n };\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport { API_QUERY_KEYS, QueryDefaults } from 'api';\r\nimport { getAdminUsers } from '../methods';\r\nimport { GetAdminUsersResponse } from '../types';\r\n\r\nexport const useGetAdminUsers = (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getTQAdmins], getAdminUsers, QueryDefaults);\r\n","import React from 'react';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { isTQAdminState } from '../../store';\r\nimport { UnAuthorised } from '../../pages';\r\n\r\nexport const TQAdminProvider: React.FC = ({ children }) => {\r\n const isTQAdmin = useRecoilValue(isTQAdminState);\r\n return isTQAdmin ? <>{children} : ;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Container, Flex, FormControl, FormLabel, Grid } from '@tq/ui-components';\r\n\r\nimport { ManageTeamInviteUser, ManageTeamUsers, PageHeading, SearchText } from 'components';\r\nimport { manageUsersSearchState } from 'store';\r\nimport { useGetAdminUsersRecords } from './hooks';\r\nimport { TQAdminProvider } from '../../components/TQAdminProvider';\r\n\r\nexport const ManageAdminUsers: React.FC = () => {\r\n const { t } = useTranslation('manage_tq');\r\n const { userData, totalCount } = useGetAdminUsersRecords();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('search_label', 'Search')}:\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport { Flex, FormControl } from '@tq/ui-components';\r\n\r\nimport { SearchText } from 'components';\r\nimport { mangeOrganisationsSearchState } from 'store';\r\nimport { useGetManageOrganisationRecords } from '../hooks';\r\n\r\nexport const OrganisationFilters: React.FC = () => {\r\n const { t } = useTranslation('manage_consultees');\r\n const { searchMatchCount, totalCount } = useGetManageOrganisationRecords();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useParentOrganisations } from 'api';\r\n\r\nexport type useGetManageOrganisationRecordsReturn = {\r\n searchMatchCount: number;\r\n totalCount: number;\r\n};\r\n\r\nexport const useGetManageOrganisationRecords = (): useGetManageOrganisationRecordsReturn => {\r\n const { data: organisationSearch } = useParentOrganisations();\r\n\r\n const searchMatchCount = organisationSearch?.parentOrganisations.items.length ?? 0;\r\n const totalCount = organisationSearch?.paginationInfo.totalCount ?? 0;\r\n\r\n return {\r\n searchMatchCount,\r\n totalCount,\r\n };\r\n};\r\n","import React, { useRef, useState } from 'react';\r\nimport { useRecoilState } from 'recoil';\r\nimport { Container, Box, DataTable, Grid, TableState } from '@tq/ui-components';\r\n\r\nimport { DataTablePagination } from 'components';\r\nimport { OrganisationFilters } from './components';\r\nimport {\r\n manageOrganisationsPageNumberState,\r\n manageOrganisationsPageSizeState,\r\n mangeOrganisationsOrderByColumnState,\r\n mangeOrganisationsOrderByDescendingState,\r\n} from 'store';\r\nimport { useParentOrganisations } from 'api';\r\nimport { useManageOrganisationColumns } from './hooks';\r\nimport { Organisation, Team } from 'types';\r\nimport { dataTableStyle } from '../../../../styles';\r\nimport { SortingRule } from 'react-table';\r\n\r\nexport const ManageOrganisations: React.FC = () => {\r\n const { data } = useParentOrganisations();\r\n const tableRef = useRef(null);\r\n const columns = useManageOrganisationColumns();\r\n const [orderBy, setOrderBy] = useRecoilState(mangeOrganisationsOrderByColumnState);\r\n const [orderByValue, setOrderByValue] = useRecoilState(\r\n mangeOrganisationsOrderByDescendingState\r\n );\r\n const [sortBy, setSortBy] = useState[]>([\r\n {\r\n id: orderBy,\r\n desc: orderByValue,\r\n },\r\n ]);\r\n\r\n const handleStateChange = (state: TableState) => {\r\n if (!state.filters.length && !state.sortBy.length) return;\r\n const newOrderByValue = state.sortBy?.[0]?.id;\r\n const newOrderByDescending = state.sortBy?.[0]?.desc ?? false;\r\n if (state.sortBy !== sortBy) {\r\n setSortBy(state.sortBy);\r\n }\r\n if (newOrderByValue) {\r\n setOrderBy(newOrderByValue);\r\n setOrderByValue(newOrderByDescending);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Button, DataTableColumns, VisuallyHidden } from '@tq/ui-components';\r\n\r\nimport { Organisation } from 'types';\r\nimport { useNavigate } from 'hooks';\r\n\r\nexport const useManageOrganisationColumns = (): DataTableColumns[] => {\r\n const { t } = useTranslation('manage_consultees');\r\n const { navigateToOrganisation } = useNavigate();\r\n return [\r\n {\r\n accessor: 'organisationName',\r\n disableSortBy: false,\r\n Header: () => t('organisation_name', 'Organisation name'),\r\n width: 300,\r\n },\r\n {\r\n accessor: 'email',\r\n disableSortBy: false,\r\n Header: () => t('email', 'Email'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'id',\r\n Cell: (props: CellProps) => (\r\n navigateToOrganisation(props.row?.original?.id)}\r\n >\r\n {t('manage', 'Manage')}\r\n \r\n ),\r\n Header: () => {t('manage_header', 'Manage')},\r\n width: 120,\r\n disableSortBy: true,\r\n },\r\n ];\r\n};\r\n","import { useGetTeams } from 'api';\r\nimport { manageTeamsRequestState, manageTeamPageNumberState } from 'store';\r\nimport { PaginationInfo, Team } from 'types';\r\n\r\nexport type useGetManageTeamRecordsReturn = {\r\n data: Team[];\r\n totalCount: number;\r\n paginationInfo: PaginationInfo | undefined;\r\n};\r\n\r\nexport const useGetManageTeamRecords = (): useGetManageTeamRecordsReturn => {\r\n const { data: teamsResponse } = useGetTeams(\r\n manageTeamsRequestState,\r\n manageTeamPageNumberState\r\n );\r\n\r\n const teams = teamsResponse?.teams?.items ?? [];\r\n const totalCount = teams?.length ?? 0;\r\n\r\n return {\r\n data: teams,\r\n totalCount,\r\n paginationInfo: teamsResponse?.paginationInfo,\r\n };\r\n};\r\n","import { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\n\r\nexport const filterContainerStyle = {\r\n width: { base: '100%', lg: '75%' },\r\n mb: { base: '1.25rem', lg: '2rem' },\r\n p: { base: '1.25rem', lg: 0 },\r\n flexDirection: { base: 'column', lg: 'row' },\r\n bg: { base: COLOURS.gray[200], lg: COLOURS.white },\r\n};\r\n\r\nexport const tabPanelsStyle = {\r\n my: { base: 5, lg: 0 },\r\n border: { base: 0, md: 'unset' },\r\n p: { base: 0, md: 'unset' },\r\n minH: { base: undefined, md: 400 },\r\n color: { base: COLOURS.black },\r\n overflow: { base: 'scroll', lg: 'auto' },\r\n};\r\n\r\nexport const tabPanelStyle = {\r\n border: { base: 'none', lg: `1px solid ${COLOURS.gray[400]}` },\r\n px: { base: 0, lg: 5 },\r\n py: { base: 0, lg: 4 },\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport { FormControl, FormLabel, HStack, Select } from '@tq/ui-components';\r\n\r\nimport { SearchText } from 'components';\r\nimport { manageTeamOrganisationFilterState, manageTeamSearchState } from 'store';\r\nimport { useGetManageTeamRecords } from '../../../hooks';\r\nimport { useAllParentOrganisations } from 'api';\r\nimport { filterFormControlStyle, filterSelectStyle } from 'styles';\r\nimport { filterContainerStyle } from '../../../styles';\r\n\r\nexport const TeamFilters: React.FC = () => {\r\n const { t } = useTranslation('manage_consultees');\r\n const { data, totalCount } = useGetManageTeamRecords();\r\n const { data: parentOrganisations } = useAllParentOrganisations();\r\n const [organisationFilter, setOrganisationFilter] = useRecoilState(\r\n manageTeamOrganisationFilterState\r\n );\r\n const organisations = parentOrganisations?.parentOrganisations ?? [];\r\n\r\n const handleOrganisationChange = (selectedId: number) => {\r\n let orgName = '';\r\n const selectedOrg = organisations.find((org) => org.value === selectedId);\r\n\r\n if (selectedOrg) orgName = selectedOrg.label;\r\n setOrganisationFilter(orgName);\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n {t('search_label', 'Search')}:\r\n \r\n \r\n \r\n \r\n \r\n {t('organisation_label', 'Organisation')}:\r\n \r\n handleOrganisationChange(Number(value))}\r\n defaultValue={organisationFilter.toString()}\r\n sx={filterSelectStyle}\r\n aria-label='Organisation selection dropdown'\r\n >\r\n \r\n {organisations?.map((org) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Container, Grid } from '@tq/ui-components';\r\n\r\nimport { TeamTable } from 'components';\r\nimport { TeamFilters } from './components/TeamFilters';\r\nimport { useManageTeamColumns } from './hooks/useManageTeamColumns';\r\nimport { useGetManageTeamRecords } from '../../hooks';\r\n\r\nimport {\r\n manageTeamPageNumberState,\r\n manageTeamPageSizeState,\r\n manageTeamSortByDescendingFilterState,\r\n manageTeamSortByColumnFilterState,\r\n teamEditingRowIdState,\r\n} from 'store';\r\n\r\nexport const ManageTeams: React.FC = () => {\r\n const { data, paginationInfo } = useGetManageTeamRecords();\r\n const columns = useManageTeamColumns();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Button, DataTableColumns, VisuallyHidden } from '@tq/ui-components';\r\n\r\nimport { useNavigate } from 'hooks';\r\nimport { Team } from 'types';\r\n\r\nexport const useManageTeamColumns = (): DataTableColumns[] => {\r\n const { t } = useTranslation('manage_teams');\r\n const { navigateToTeam } = useNavigate();\r\n\r\n return [\r\n {\r\n accessor: 'teamName',\r\n disableSortBy: false,\r\n Header: () => t('team_name', 'Team name'),\r\n width: 300,\r\n },\r\n {\r\n accessor: 'backOfficeCode',\r\n disableSortBy: false,\r\n Header: () => t('back_office_code', 'Back Office code'),\r\n width: 200,\r\n },\r\n {\r\n accessor: 'email',\r\n disableSortBy: false,\r\n Header: () => t('team_email', 'Team email'),\r\n width: 'auto',\r\n },\r\n {\r\n accessor: 'organisationName',\r\n disableSortBy: false,\r\n Header: () => t('organisation', 'Organisation'),\r\n width: 300,\r\n },\r\n {\r\n accessor: 'msgDetail',\r\n Cell: ({ row: { original } }: CellProps) => (\r\n navigateToTeam(original.organisationId)}\r\n >\r\n {t('manage', 'Manage')}\r\n \r\n ),\r\n Header: () => {t('manage_header', 'Manage')},\r\n width: 100,\r\n disableSortBy: true,\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useSetRecoilState } from 'recoil';\r\nimport { FormControl, FormLabel, Select, VStack } from '@tq/ui-components';\r\n\r\nimport { SearchText, UploadConsultees, IsRegisteredDropDown } from 'components';\r\nimport {\r\n manageConsulteeOrganisationFilterState,\r\n manageConsulteeRegistrationFilterState,\r\n manageConsulteeSearchState,\r\n} from 'store';\r\nimport { filterSelectStyle } from 'styles';\r\nimport { filterContainerStyle } from '../../../styles';\r\nimport { useAllParentOrganisations } from '../../../../../api';\r\nimport { Consultee, ValueLabel } from 'types';\r\n\r\ntype ManageUsersFiltersProps = {\r\n consultees: Consultee[];\r\n totalCount: number;\r\n};\r\n\r\nexport const UsersFilters: React.FC = ({\r\n consultees,\r\n totalCount,\r\n}) => {\r\n const { t } = useTranslation('manage_consultees');\r\n const { data: parentOrganisations } = useAllParentOrganisations();\r\n const organisations = parentOrganisations?.parentOrganisations ?? [];\r\n const setOrganisationFilter = useSetRecoilState(manageConsulteeOrganisationFilterState);\r\n\r\n const isRegisteredOptions: ValueLabel[] = [\r\n { value: 'NotDeleted', label: t('all', 'All') },\r\n { value: 'Registered', label: t('yes', 'Yes') },\r\n { value: 'NotRegistered', label: t('no', 'No') },\r\n ];\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {t('organisation_label', 'Organisation')}:\r\n \r\n setOrganisationFilter(value === 'All' ? '' : value)}\r\n defaultValue='All'\r\n sx={filterSelectStyle}\r\n aria-label='Organisation selection dropdown'\r\n >\r\n \r\n {organisations.map((org) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Container, Grid } from '@tq/ui-components';\r\n\r\nimport { UserTable } from 'components';\r\nimport { UsersFilters, useManageUsersColumns } from './';\r\nimport { useManageConsultees } from '../../../../api';\r\n\r\nimport {\r\n manageConsulteePageNumberState,\r\n manageConsulteePageSizeState,\r\n manageConsulteesUserTableEditingRowState,\r\n} from 'store';\r\n\r\nexport const ManageUsers: React.FC = () => {\r\n const { data } = useManageConsultees();\r\n\r\n const columns = useManageUsersColumns();\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { CellProps } from 'react-table';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nimport { Button, DataTableColumns, VisuallyHidden } from '@tq/ui-components';\r\n\r\nimport { useNavigate } from 'hooks';\r\nimport { Consultee } from 'types';\r\n\r\nexport const useManageUsersColumns = (): DataTableColumns[] => {\r\n const { t } = useTranslation('manage_teams');\r\n const { navigateToTeamUsers } = useNavigate();\r\n\r\n return [\r\n {\r\n accessor: 'consulteeName',\r\n disableSortBy: false,\r\n Header: () => t('name', 'Name'),\r\n width: 280,\r\n },\r\n {\r\n accessor: 'email',\r\n disableSortBy: true,\r\n Header: () => t('email', 'Email'),\r\n width: 280,\r\n },\r\n {\r\n accessor: 'teams[0].organisationName',\r\n disableSortBy: true,\r\n Header: () => t('organisation', 'Organisation'),\r\n width: 280,\r\n },\r\n {\r\n accessor: 'permissionName',\r\n disableSortBy: true,\r\n Header: () => t('permissions', 'Permissions'),\r\n width: 180,\r\n },\r\n {\r\n id: 'isRegistered',\r\n accessor: (d) => {\r\n return d.isRegistered ? 'Yes' : 'No';\r\n },\r\n disableSortBy: true,\r\n Header: () => t('is_registered', 'Is registered'),\r\n width: 180,\r\n },\r\n {\r\n accessor: 'msgDetail',\r\n disableSortBy: true,\r\n Header: () => {t('manage_header', 'Manage')},\r\n width: 100,\r\n Cell: ({ row: { original } }: CellProps) => (\r\n \r\n original?.teams[0]?.organisationId &&\r\n navigateToTeamUsers(original.teams[0].organisationId)\r\n }\r\n >\r\n {t('manage', 'Manage')}\r\n \r\n ),\r\n },\r\n ];\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { FaPlus } from 'react-icons/fa';\r\nimport { useRecoilState, useResetRecoilState } from 'recoil';\r\n\r\nimport { COLOURS } from '@tq/ui-components/dist/pp2/theme';\r\nimport {\r\n Container,\r\n Tab,\r\n TabList,\r\n TabPanel,\r\n TabPanels,\r\n Tabs,\r\n TabText,\r\n Button,\r\n Flex,\r\n} from '@tq/ui-components';\r\n\r\nimport { PageHeading } from 'components';\r\nimport { useNavigate } from 'hooks';\r\nimport {\r\n manageConsulteeActiveTab,\r\n organisationIdState,\r\n organisationRequestState,\r\n useResetGetConsulteeRequestState,\r\n} from 'store';\r\nimport { ManageOrganisations, ManageTeams, ManageUsers } from './components';\r\nimport { useManageTabLabels } from './hooks';\r\nimport { tabPanelStyle, tabPanelsStyle } from './styles';\r\n\r\nexport const ManageConsultees: React.FC = () => {\r\n /**\r\n * Returns the main container UI for maintaining Organisations, Teams and Consultees by TQ Admins.\r\n *\r\n * @remarks\r\n * TQ admins only\r\n */\r\n const { t } = useTranslation('manage_consultees');\r\n const tabLabels = useManageTabLabels();\r\n const { navigateToCreateOrganisation } = useNavigate();\r\n const resetManageConsulteesRequest = useResetGetConsulteeRequestState();\r\n const resetCreatedOrganisationId = useResetRecoilState(organisationIdState);\r\n const resetCreatedOrganisationRequest = useResetRecoilState(organisationRequestState);\r\n const [activeTab, setActiveTab] = useRecoilState(manageConsulteeActiveTab);\r\n\r\n const handleAddOrganisationClick = () => {\r\n resetCreatedOrganisationId();\r\n resetCreatedOrganisationRequest();\r\n navigateToCreateOrganisation();\r\n resetManageConsulteesRequest();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n }\r\n onClick={handleAddOrganisationClick}\r\n variant='secondary'\r\n >\r\n {t('add_organisation_button_text', 'Add new organisation')}\r\n \r\n \r\n \r\n \r\n {tabLabels.map((tabLabel, index) => (\r\n ) =>\r\n setActiveTab(Number(e.currentTarget.value))\r\n }\r\n >\r\n {tabLabel}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { useTranslation } from 'react-i18next';\r\n\r\nexport const useManageTabLabels = (): string[] => {\r\n const { t } = useTranslation('manage_consultees');\r\n return [t('organisations', 'Organisations'), t('teams', 'Teams'), t('users', 'Users')];\r\n};\r\n","import { useRecoilValue } from 'recoil';\r\n\r\nimport { useManageTeamConsultees } from 'api';\r\nimport {\r\n manageUsersFilterPermissionState,\r\n manageUsersFilterTeamState,\r\n manageUsersSearchState,\r\n} from 'store';\r\nimport { ApplicationUser } from 'types';\r\n\r\nexport type useGetManageTeamConsulteeRecordsReturn = {\r\n userData: ApplicationUser[];\r\n totalCount: number;\r\n};\r\n\r\nexport const useGetManageTeamConsulteeRecords = (): useGetManageTeamConsulteeRecordsReturn => {\r\n const { data: ApplicationUsers } = useManageTeamConsultees();\r\n const teamFilter = useRecoilValue(manageUsersFilterTeamState);\r\n const permissionFilter = useRecoilValue(manageUsersFilterPermissionState);\r\n const searchText = useRecoilValue(manageUsersSearchState);\r\n\r\n const users = ApplicationUsers?.consultees ?? [];\r\n const totalCount = users.length;\r\n\r\n const userData = users\r\n .filter((r) =>\r\n teamFilter === 0 ? r : r.teams.map((x) => x.value).includes(Number(teamFilter))\r\n )\r\n .filter((r) =>\r\n permissionFilter !== 0 && r.permission\r\n ? r.permission.value === Number(permissionFilter)\r\n : r\r\n )\r\n .filter(\r\n (r) =>\r\n !searchText ||\r\n r.name.toLowerCase().includes(searchText.toLowerCase()) ||\r\n r.email.toLowerCase().includes(searchText.toLowerCase())\r\n );\r\n\r\n return {\r\n userData,\r\n totalCount,\r\n };\r\n};\r\n","import { QueryObserverResult, useQuery } from '@tanstack/react-query';\r\n\r\nimport {\r\n API_QUERY_KEYS,\r\n GetManageTeamConsulteesResponse,\r\n getManageTeamConsultees,\r\n QueryDefaults,\r\n} from 'api';\r\n\r\nexport const useManageTeamConsultees =\r\n (): QueryObserverResult =>\r\n useQuery([API_QUERY_KEYS.getManageTeamConsultees], getManageTeamConsultees, QueryDefaults);\r\n","import React from 'react';\r\nimport { useRecoilValue } from 'recoil';\r\nimport { isAdminState, isTQAdminState } from '../../store';\r\nimport { UnAuthorised } from '../../pages';\r\n\r\nexport const ConsulteeAdminProvider: React.FC = ({ children }) => {\r\n const isConsulteeAdmin = useRecoilValue(isAdminState);\r\n const isTQAdmin = useRecoilValue(isTQAdminState);\r\n return isConsulteeAdmin || isTQAdmin ? <>{children} : ;\r\n};\r\n","import React from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useRecoilState } from 'recoil';\r\nimport { Container, FormControl, FormLabel, Grid, HStack, Select } from '@tq/ui-components';\r\n\r\nimport { useConsulteeTeams } from 'api';\r\nimport {\r\n ManageTeamFilterPermissionSelect,\r\n ManageTeamInviteUser,\r\n ManageTeamUsers,\r\n PageHeading,\r\n SearchText,\r\n} from 'components';\r\nimport { useGetManageTeamConsulteeRecords } from './hooks';\r\nimport {\r\n manageUsersFilterPermissionState,\r\n manageUsersFilterTeamState,\r\n manageUsersSearchState,\r\n} from 'store';\r\nimport { filterFormControlStyle, filterSelectStyle } from 'styles';\r\nimport { filterContainerStyle } from '../ManageConsultees/styles';\r\nimport { ConsulteeAdminProvider } from '../../components/ConsulteeAdminProvider';\r\n\r\nexport const ManageTeam: React.FC = () => {\r\n /**\r\n * Returns the main container UI for maintaining Consultees by Consultee Admins.\r\n *\r\n * @remarks\r\n *\r\n */\r\n const { t } = useTranslation('manage_team');\r\n const { data: teamOptions } = useConsulteeTeams();\r\n const { userData, totalCount } = useGetManageTeamConsulteeRecords();\r\n\r\n const [teamFilter, setTeamFilter] = useRecoilState(manageUsersFilterTeamState);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n

    \r\n {t(\r\n 'manage_team_summary',\r\n 'You can manage users in this space as well as invite team members.'\r\n )}\r\n

    \r\n \r\n \r\n \r\n \r\n {t('search_label', 'Search')}:\r\n \r\n \r\n \r\n \r\n \r\n {t('team_label', 'Team')}:\r\n \r\n setTeamFilter(Number(value))}\r\n defaultValue={teamFilter.toString()}\r\n sx={filterSelectStyle}\r\n aria-label='Team selection dropdown'\r\n >\r\n \r\n {teamOptions?.teams.map((team) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n {t('permission_label', 'Permissions')}:\r\n \r\n\r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from 'react';\r\nimport { Route, Routes } from 'react-router-dom';\r\nimport { ROUTES } from './config';\r\nimport {\r\n ArchivedResponse,\r\n CaseDetails,\r\n ConsultationResponse,\r\n ConsultationSummary,\r\n CreateOrganisation,\r\n EditOrganisation,\r\n Home,\r\n ManageAdminUsers,\r\n ManageConsultees,\r\n Measure,\r\n Monitor,\r\n PageNotFound,\r\n Report,\r\n Reports,\r\n Search,\r\n UnAuthorised,\r\n} from './pages';\r\nimport { ManageTeam } from './pages/ManageTeam';\r\n\r\nexport const App: React.FC = () => {\r\n return (\r\n \r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n } />\r\n \r\n );\r\n};\r\n","import React, { ReactElement, useCallback, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { RecoilRoot } from 'recoil';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\nimport { DocumentStoreClient, DocumentStoreProvider } from '@tq/document-store-js-client';\r\nimport {\r\n getTokenWithRedirectFallback,\r\n RouterNavigationClient,\r\n TqAuthProvider,\r\n} from '@tq/auth-components';\r\nimport { EventMessage, EventType, PublicClientApplication } from '@azure/msal-browser';\r\nimport { GrowthBookProvider } from '@growthbook/growthbook-react';\r\n\r\nimport { documentConfig } from 'config';\r\nimport { Layout, ThemeProvider } from 'components';\r\nimport 'i18n';\r\nimport { b2cAuthority, b2cPolicySignIn, b2cScope } from 'tools';\r\nimport AzureAppInsights from './components/AppInsights/AzureAppInsights';\r\nimport { useGrowthBook } from 'hooks/useGrowthBook';\r\nimport { App } from 'App';\r\nimport { setPca } from './api';\r\n\r\nconst queryClient = new QueryClient();\r\nconst documentStoreClient = new DocumentStoreClient(documentConfig);\r\n\r\nexport const Root = ({ pca }: { pca: PublicClientApplication }): ReactElement => {\r\n const navigate = useNavigate();\r\n const initializePca = useCallback(async () => {\r\n await pca.initialize();\r\n const navigationClient = new RouterNavigationClient(navigate);\r\n pca.setNavigationClient(navigationClient);\r\n pca.addEventCallback(async (message: EventMessage) => {\r\n if (message.eventType === EventType.LOGOUT_START) {\r\n localStorage.setItem('logout', 'true');\r\n }\r\n if (message.eventType === EventType.HANDLE_REDIRECT_END) {\r\n if (pca.getAllAccounts().length === 0) {\r\n getTokenWithRedirectFallback(pca, b2cScope, {\r\n authority: b2cAuthority,\r\n signInPolicyPath: b2cPolicySignIn,\r\n impersonatePolicyPath: '',\r\n }).catch(async () => {\r\n // if the getToken failed, and we are not logging out, perform a redirect.\r\n if (!localStorage.getItem('logout')) {\r\n await pca.loginRedirect({\r\n scopes: [process.env.REACT_APP_B2C_SCOPE || ''],\r\n });\r\n }\r\n localStorage.removeItem('logout');\r\n });\r\n }\r\n }\r\n });\r\n setPca(pca);\r\n }, [navigate, pca]);\r\n\r\n useEffect(() => {\r\n initializePca();\r\n }, [initializePca]);\r\n\r\n const growthBook = useGrowthBook();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n","import { DocumentStoreClientOptions } from '@tq/document-store-js-client';\r\n\r\nexport const documentConfig: DocumentStoreClientOptions = {\r\n documentStore: {\r\n baseUrl: process.env.REACT_APP_PP_DOC_STORE as string,\r\n },\r\n applicationApi: {\r\n baseUrl: process.env.REACT_APP_CONSULTEE_HUB_API as string,\r\n },\r\n};\r\n","import { PublicClientApplication } from '@azure/msal-browser';\r\nimport { getDefaultConfiguration } from '@tq/auth-components';\r\nimport { b2cAuthority, b2cClientId, b2cPolicySignIn, REDIRECT_PATH } from 'tools';\r\n\r\nconst config = getDefaultConfiguration(\r\n b2cAuthority,\r\n b2cPolicySignIn,\r\n b2cClientId,\r\n REDIRECT_PATH\r\n);\r\n\r\n/**\r\n * PublicClientApplication class should be initiated only once,\r\n * pca should have only instance in the app\r\n *\r\n * ***DO NOT create multiple instances of pca, this will cause login loop bug***\r\n */\r\nexport const pca = new PublicClientApplication(config);\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { Root } from './Root';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { pca } from './useInitMsal';\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}