@e-llm-studio/citation 0.0.251 → 0.0.253
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js +2 -0
- package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
- package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
- package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
- package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
- package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js +2 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js +2 -0
- package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
- package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
- package/dist/cjs/features/PdfViewer/PdfContainer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfContainer.js.map +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
- package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/RevertCard.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/RevertCard.js.map +1 -1
- package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
- package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
- package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
- package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
- package/dist/cjs/hooks/useOnDemandCitationFetch.js +1 -1
- package/dist/cjs/hooks/useOnDemandCitationFetch.js.map +1 -1
- package/dist/cjs/service/onDemandApi.js +1 -1
- package/dist/cjs/service/onDemandApi.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
- package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
- package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
- package/dist/features/CognitiveCompare/CitationRendererInner.js +2 -0
- package/dist/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
- package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
- package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
- package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js +1 -1
- package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
- package/dist/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
- package/dist/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
- package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
- package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
- package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
- package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
- package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
- package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
- package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
- package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
- package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
- package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
- package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
- package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
- package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
- package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
- package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
- package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
- package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
- package/dist/features/CognitiveCompare/onDemandCitations/href.js +2 -0
- package/dist/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
- package/dist/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
- package/dist/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
- package/dist/features/CognitiveCompare/onDemandCitations/response.js +2 -0
- package/dist/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
- package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
- package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
- package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
- package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
- package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
- package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
- package/dist/features/PdfViewer/PdfContainer.js +1 -1
- package/dist/features/PdfViewer/PdfContainer.js.map +1 -1
- package/dist/features/PdfViewer/PdfViewer.js +1 -1
- package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
- package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
- package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
- package/dist/features/SegmentReviewComponents/BoundaryCard.js +1 -1
- package/dist/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
- package/dist/features/SegmentReviewComponents/RevertCard.js +1 -1
- package/dist/features/SegmentReviewComponents/RevertCard.js.map +1 -1
- package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
- package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
- package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
- package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
- package/dist/hooks/useOnDemandCitationFetch.js +1 -1
- package/dist/hooks/useOnDemandCitationFetch.js.map +1 -1
- package/dist/service/onDemandApi.js +1 -1
- package/dist/service/onDemandApi.js.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +2 -0
- package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +8 -1
- package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts +13 -0
- package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +14 -1
- package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +12 -0
- package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts +10 -1
- package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts +7 -0
- package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts +3 -0
- package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts +3 -0
- package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +14 -1
- package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts +19 -0
- package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts +8 -0
- package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
- package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +2 -1
- package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts +10 -0
- package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
- package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts +3 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts +16 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts +6 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts +7 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts +4 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts +3 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts +134 -0
- package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts +7 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts +6 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts.map +1 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts +6 -0
- package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts.map +1 -0
- package/dist/types/features/PdfViewer/PdfContainer.d.ts +3 -2
- package/dist/types/features/PdfViewer/PdfContainer.d.ts.map +1 -1
- package/dist/types/features/PdfViewer/PdfViewer.d.ts +3 -2
- package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
- package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts +11 -0
- package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts.map +1 -0
- package/dist/types/features/SegmentReviewComponents/BoundaryCard.d.ts.map +1 -1
- package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts +9 -1
- package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts.map +1 -1
- package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts +15 -0
- package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts.map +1 -0
- package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts +14 -1
- package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts.map +1 -1
- package/dist/types/hooks/useOnDemandCitationFetch.d.ts.map +1 -1
- package/dist/types/service/onDemandApi.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/features/Bookemon/BookemonStyles.js +0 -2
- package/dist/cjs/features/Bookemon/BookemonStyles.js.map +0 -1
- package/dist/cjs/lib/ui/icons.js +0 -2
- package/dist/cjs/lib/ui/icons.js.map +0 -1
- package/dist/cjs/lib/ui/materialCompat.js +0 -2
- package/dist/cjs/lib/ui/materialCompat.js.map +0 -1
- package/dist/features/Bookemon/BookemonStyles.js +0 -2
- package/dist/features/Bookemon/BookemonStyles.js.map +0 -1
- package/dist/lib/ui/icons.js +0 -2
- package/dist/lib/ui/icons.js.map +0 -1
- package/dist/lib/ui/materialCompat.js +0 -2
- package/dist/lib/ui/materialCompat.js.map +0 -1
- package/dist/types/features/Bookemon/BookemonStyles.d.ts +0 -6
- package/dist/types/features/Bookemon/BookemonStyles.d.ts.map +0 -1
- package/dist/types/lib/ui/icons.d.ts +0 -46
- package/dist/types/lib/ui/icons.d.ts.map +0 -1
- package/dist/types/lib/ui/materialCompat.d.ts +0 -117
- package/dist/types/lib/ui/materialCompat.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SegmentReviewPdfWrapper.js","sources":["../../../src/features/SegmentReviewComponents/SegmentReviewPdfWrapper.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport { SpecialZoomLevel, type SetRenderRange } from '@react-pdf-viewer/core';\nimport PdfViewer, {\n type PdfNavigationRequest,\n type PdfNavigationSettledEvent,\n type PdfViewerProps,\n} from '../PdfViewer/PdfViewer';\nimport BoundaryCard, {\n BoundaryReviewActionEnum,\n isBoundaryReviewAction,\n type BoundaryReviewAction,\n type BoundaryReviewConfirmDetails,\n} from './BoundaryCard';\nimport CardWrapper from './CardWrapper';\nimport CognitiveIntegrity from './CognitiveIntegrity';\nimport LabelCheck, {\n type LabelReviewAction,\n type LabelReviewConfirmDetails,\n} from './LabelCheck';\nimport PageCheck, {\n PageCheckActionEnum,\n type PageCheckAction,\n type PageCheckConfirmDetails,\n type PageCheckPageType,\n} from './PageCheck';\nimport PageTypeChoiceCheck from './PageTypeChoiceCheck';\nimport {\n extractSegmentReviewData,\n getSegmentReviewKey,\n type ExtractedBoundaryReview,\n type ExtractedLabelReview,\n type ExtractedPageReview,\n type SegmentRevertInfo,\n type SegmentReviewSource,\n} from './reviewStepAdapters';\nimport { Check, CircleCheck, GitMerge } from 'lucide-react';\nimport { Box, Portal, Tooltip, Typography } from '@mui/material';\nimport ReviewedCard from './ReviewedCard';\nimport ReviewedBoundaryActions from './ReviewedBoundaryActions';\nimport RevertCard, {\n type RevertActionResult,\n type RevertData,\n type SegmentData,\n} from './RevertCard';\nimport RevertSuccessCard from './RevertSuccessCard';\nimport {\n formatScore,\n getBoundaryReviewActionBadgeLabel,\n getConfidenceColors,\n getOptimisticMergeImpactedSegmentKeys,\n getPendingMergeImpactedSegmentKeys,\n getReviewScoreBand,\n getResolvedScore,\n getTitleReviewActionBadgeLabel,\n hasPolledStructuralAction,\n isReviewStepResolved,\n isReviewStepResolutionCurrent,\n shouldHideStructuralBoundaryReview,\n} from './helper';\nimport ChartBreakoutCircle from './ChartBreakoutCircle';\n\ntype ForwardedPdfViewerProps = Partial<Omit<\n PdfViewerProps,\n | 'pdfUrl'\n | 'pdfName'\n | 'segments'\n | 'onCurrentPageChange'\n | 'navigationRequest'\n | 'onNavigationSettled'\n | 'renderPage'\n | 'setRenderRange'\n>>;\n\ntype ReviewItem =\n | (ExtractedBoundaryReview<SegmentReviewSource> & {\n kind: 'boundary';\n pageNumber: number;\n })\n | (ExtractedLabelReview<SegmentReviewSource> & {\n kind: 'label';\n pageNumber: number;\n })\n | (ExtractedPageReview<SegmentReviewSource> & {\n kind: 'page';\n pageNumber: number;\n });\n\ntype RevertSuccessState = {\n title: string;\n description: string | null;\n segment: SegmentData;\n position: {\n top: number;\n left: number;\n width: number;\n };\n};\n\nconst REVIEW_CARD_MAX_WIDTH = 260;\nconst REVIEW_LAYOUT_MIN_WIDTH = 700;\nconst BOUNDARY_TITLE_CHECK_BYPASS_SCORE = 85;\n\nexport type ReviewConfidence = 'low' | 'medium' | 'high';\nexport type ReviewConfidenceFilter = 'low' | 'high' | 'all';\nexport type ReviewRedirectionType = 'boundary' | 'label' | 'page' | 'pageGroup';\n\nexport enum SegmentPdfSpecialZoomLevel {\n ActualSize = 'ActualSize',\n PageFit = 'PageFit',\n PageWidth = 'PageWidth',\n}\n\nexport interface SelectedBadgeData {\n reviewId: string;\n segment_id: string | null;\n reviewStepIndex: number;\n kind: 'boundary' | 'label' | 'page';\n pageNumber: number;\n metadata: Record<string, any>;\n}\n\nconst SEGMENT_PDF_SPECIAL_ZOOM_LEVEL: Record<\n SegmentPdfSpecialZoomLevel,\n SpecialZoomLevel\n> = {\n [SegmentPdfSpecialZoomLevel.ActualSize]: SpecialZoomLevel.ActualSize,\n [SegmentPdfSpecialZoomLevel.PageFit]: SpecialZoomLevel.PageFit,\n [SegmentPdfSpecialZoomLevel.PageWidth]: SpecialZoomLevel.PageWidth,\n};\n\nexport interface SegmentReviewActionContext {\n reviewId: string;\n segment: SegmentReviewSource;\n pageNumber: number;\n}\n\nexport interface PageTypeRevertDetails {\n classification_id: string;\n human_verdict: 'No';\n}\n\nexport interface RedirectionData {\n /** Change for every redirect request, including repeated redirects to the same badge. */\n requestKey?: string | number;\n pageNumber?: string;\n type?: ReviewRedirectionType;\n /** Stable backend segment id used to disambiguate reviews on the same page. */\n segmentId?: string;\n /** Exact review id returned by the wrapper, if the parent has it. */\n reviewId?: string;\n /** Stable backend page_classifications[].questions[].id for page-type redirects. */\n classificationId?: string;\n /** Optional page-type disambiguation when table/drawing checks share a page. */\n pageType?: string;\n\n /** type: 'pageGroup' only — ordered pages to step through, e.g. a segment's tabular pages. */\n pages?: number[];\n /** type: 'pageGroup' only — which page in `pages` to land on first. Defaults to 0. */\n pageIndex?: number;\n /** type: 'pageGroup' only — short label for the floating pill, e.g. \"Tabular\". */\n groupLabel?: string;\n}\n\nexport interface SegmentReviewPdfWrapperProps {\n pdfUrl: string;\n pdfName?: string;\n /** Live backend segments. Changes are re-extracted automatically. */\n segments: readonly SegmentReviewSource[];\n pdfViewerProps?: ForwardedPdfViewerProps;\n totalPages?: number;\n /** Special PDF zoom mode. Defaults to PageFit. */\n specialZoomLevel?: SegmentPdfSpecialZoomLevel;\n heightBuffer?: number;\n showBadges?: boolean;\n /** @deprecated Reviewed steps are always hidden from badges and navigation. */\n showResolvedBadges?: boolean;\n /** Confidence group placed first in the badge navigator. */\n sortByConfidence?: ReviewConfidence;\n /** Only render and navigate badges matching this confidence. */\n filterByConfidence?: ReviewConfidenceFilter;\n showBadgeNavigation?: boolean;\n autoSelectReviewOnPageChange?: boolean;\n autoAdvanceAfterConfirm?: boolean;\n /** Restrict post-confirm auto-advance to pending reviews in this score band. */\n autoAdvanceScoreBand?: ReviewConfidence;\n /** Number of PDF page layers mounted before and after the visible range. */\n badgePreloadPages?: number;\n /** Vertical badge offset from the page's top-right edge. */\n badgeOffsetTop?: number;\n /** Horizontal inset from the external badge rail's right edge. */\n badgeOffsetRight?: number;\n badgeOffsetLeft?: number;\n initialReviewId?: string;\n\n onBoundaryAction?: (\n action: BoundaryReviewAction,\n details: BoundaryReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onLabelAction?: (\n action: LabelReviewAction,\n details: LabelReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onPageAction?: (\n action: PageCheckAction,\n details: PageCheckConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n /**\n * Revert a confirmed page-type decision by submitting `human_verdict: \"No\"`.\n * Refresh the latest classifications before resolving this callback.\n */\n onPageTypeRevert?: (\n details: PageTypeRevertDetails,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /**\n * Submit the operation-level revert, poll it to completion, and refresh the\n * latest segments before resolving this callback. `revert` is null when the\n * current segment does not include revert metadata.\n */\n onRevert?: (\n revert: SegmentRevertInfo | null,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /** Called when a badge is selected, with its complete source segment. */\n onActiveReviewChange?: (\n reviewId: string | null,\n segment: SegmentReviewSource | null\n ) => void;\n onBadgeSelected?: (data: SelectedBadgeData) => void;\n onCurrentPageChange?: (pageNumber: number) => void;\n onActionError?: (error: unknown, context: SegmentReviewActionContext) => void;\n onAdjustManually?: (context: SegmentReviewActionContext) => void;\n onCognitiveClick?: (context: SegmentReviewActionContext) => void;\n\n className?: string;\n style?: CSSProperties;\n viewerStyle?: CSSProperties;\n railStyle?: CSSProperties;\n redirectionData?: RedirectionData;\n styles?: Record<string, React.CSSProperties>;\n disableAllActions?: boolean;\n disablePdfAnnotations?: boolean;\n /** Disable the transparent PDF text layer that can overflow rotated pages. */\n disablePdfTextLayer?: boolean;\n disableTitleCheckUntilBoundaryCheckCompleted?: boolean;\n manualPrompt?: string;\n}\n\nconst getReviewContext = (item: ReviewItem): SegmentReviewActionContext => ({\n reviewId: item.id,\n segment: item.segment,\n pageNumber: item.pageNumber,\n});\n\n/** Converts a zero-based index to A, B, ... Z, AA, AB, and so on. */\nconst getBadgeSuffix = (index: number): string => {\n let value = index + 1;\n let suffix = '';\n\n while (value > 0) {\n value -= 1;\n suffix = String.fromCharCode(65 + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\n/**\n * Orchestrates the PDF, review badges, page navigation, active card and actions.\n * It consumes backend-shaped segments directly; cards never parse the raw payload.\n */\nexport default function SegmentReviewPdfWrapper({\n pdfUrl,\n pdfName,\n segments,\n totalPages,\n styles,\n pdfViewerProps,\n specialZoomLevel,\n showBadges = true,\n sortByConfidence = 'low',\n filterByConfidence = 'all',\n showBadgeNavigation = true,\n autoSelectReviewOnPageChange = false,\n autoAdvanceAfterConfirm = true,\n autoAdvanceScoreBand,\n badgePreloadPages = 8,\n badgeOffsetTop = 20,\n badgeOffsetRight = 68,\n badgeOffsetLeft = 0,\n initialReviewId,\n manualPrompt,\n heightBuffer,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n onRevert,\n onActiveReviewChange,\n onCurrentPageChange,\n onActionError,\n disableAllActions = false,\n disablePdfAnnotations = false,\n disablePdfTextLayer = true,\n disableTitleCheckUntilBoundaryCheckCompleted = false,\n onAdjustManually,\n onCognitiveClick,\n className,\n style,\n viewerStyle,\n railStyle,\n redirectionData,\n onBadgeSelected,\n}: SegmentReviewPdfWrapperProps) {\n console.log(\"LOG: TOTAL PAGE IN PARENT\", totalPages);\n const { boundaryReviews, labelReviews, pageReviews } = useMemo(\n () => extractSegmentReviewData(segments),\n [segments]\n );\n const [optimisticStructuralActions, setOptimisticStructuralActions] = useState<\n Map<string, BoundaryReviewAction>\n >(() => new Map());\n const [optimisticRangeAdjustedSegmentKeys, setOptimisticRangeAdjustedSegmentKeys] =\n useState<Set<string>>(() => new Set());\n\n const segmentNumberByKey = useMemo(\n () => {\n const numberByKey = new Map<string, number>();\n let nextSegmentNumber = 1;\n\n segments.forEach((segment, index) => {\n const segmentKey = getSegmentReviewKey(segment, index);\n if (!numberByKey.has(segmentKey)) {\n numberByKey.set(segmentKey, nextSegmentNumber);\n nextSegmentNumber += 1;\n }\n });\n\n return numberByKey;\n },\n [segments]\n );\n const segmentsWithTitleReviews = useMemo(\n () => new Set(labelReviews.map((review) => getSegmentReviewKey(review.segment))),\n [labelReviews]\n );\n const pendingMergeImpactedSegmentKeys = useMemo(\n () => getPendingMergeImpactedSegmentKeys(segments),\n [segments]\n );\n useEffect(() => {\n setOptimisticStructuralActions((current) => {\n let changed = false;\n const next = new Map(current);\n\n current.forEach((action, segmentKey) => {\n const segment = segments.find((item) =>\n getSegmentReviewKey(item) === segmentKey\n );\n if (!segment || hasPolledStructuralAction(segment, action)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [segments]);\n useEffect(() => {\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n let changed = false;\n const next = new Set(current);\n\n current.forEach((segmentKey) => {\n if (!optimisticStructuralActions.has(segmentKey)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [optimisticStructuralActions]);\n const optimisticMergeImpactedSegmentKeys = useMemo(() => {\n return getOptimisticMergeImpactedSegmentKeys(\n segments,\n optimisticStructuralActions,\n optimisticRangeAdjustedSegmentKeys\n );\n }, [optimisticRangeAdjustedSegmentKeys, optimisticStructuralActions, segments]);\n const asideRef = useRef(null as HTMLDivElement | null);\n const reviews = useMemo<ReviewItem[]>(() => [\n ...boundaryReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !shouldHideStructuralBoundaryReview(\n review.review_step,\n review.segment,\n segmentsWithTitleReviews.has(getSegmentReviewKey(review.segment)),\n optimisticStructuralActions.get(getSegmentReviewKey(review.segment))\n )\n )\n .map((review) => ({\n ...review,\n kind: 'boundary' as const,\n pageNumber: review.metadata.focus_page ?? review.segment.start_page,\n })),\n ...labelReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'label' as const,\n pageNumber: review.segment.start_page,\n })),\n ...pageReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'page' as const,\n pageNumber: review.metadata.page_num ?? review.segment.start_page,\n })),\n ].sort((left, right) => {\n const leftSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(left.segment)) ?? Number.MAX_SAFE_INTEGER;\n const rightSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(right.segment)) ?? Number.MAX_SAFE_INTEGER;\n\n return left.pageNumber - right.pageNumber ||\n leftSegmentNumber - rightSegmentNumber ||\n left.reviewStepIndex - right.reviewStepIndex ||\n left.id.localeCompare(right.id);\n }), [\n boundaryReviews,\n labelReviews,\n pageReviews,\n optimisticMergeImpactedSegmentKeys,\n optimisticStructuralActions,\n pendingMergeImpactedSegmentKeys,\n segmentNumberByKey,\n segmentsWithTitleReviews,\n ]);\n\n // PdfToolbar displays `segment.title`, while backend segment titles can be\n // generic values such as \"Document 1\". Preserve the complete segment object\n // and expose its human-readable label as the viewer-facing title.\n const pdfSegments = useMemo(() => segments.map((segment) => ({\n ...segment,\n title: segment.label?.trim() || segment.title,\n page_count: segment.page_count ?? segment.end_page - segment.start_page + 1,\n })), [segments]);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [activeReviewId, setActiveReviewId] = useState<string | null>(\n initialReviewId ?? null\n );\n const [selectedNavigationReviewId, setSelectedNavigationReviewId] = useState<\n string | null\n >(initialReviewId ?? null);\n const [isCognitiveIntegrityOpen, setIsCognitiveIntegrityOpen] = useState(false);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const [navigationRequest, setNavigationRequest] = useState<PdfNavigationRequest | null>(null);\n const [locallyResolvedReviewIds, setLocallyResolvedReviewIds] = useState<Set<string>>(\n () => new Set()\n );\n const [pendingReviewId, setPendingReviewId] = useState<string | null>(null);\n const [activePageGroup, setActivePageGroup] = useState<{\n pages: number[];\n index: number;\n label: string;\n } | null>(null);\n \n\n const [revertSuccess, setRevertSuccess] = useState<RevertSuccessState | null>(null);\n const [isRevertToastVisible, setIsRevertToastVisible] = useState(false);\n const navigationSequenceRef = useRef(0);\n const pendingNavigationRef = useRef<{\n requestId: number;\n pageNumber: number;\n reviewId: string;\n } | null>(null);\n const pendingStructuralAdvanceRef = useRef<{\n action: BoundaryReviewAction;\n originalSegmentIndex: number;\n segmentSignature: string;\n ready: boolean;\n } | null>(null);\n const badgeElementsRef = useRef(new Map<string, HTMLSpanElement>());\n const pageGroupElementRef = useRef<HTMLSpanElement | null>(null);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const viewerHostRef = useRef<HTMLDivElement | null>(null);\n const [asideWidth, setAsideWidth] = useState(REVIEW_CARD_MAX_WIDTH);\n const requestedRailWidth = styles?.aside?.width ?? '40%';\n const responsiveRailWidth = `min(${\n typeof requestedRailWidth === 'number' ? `${requestedRailWidth}px` : requestedRailWidth\n }, ${REVIEW_CARD_MAX_WIDTH}px, 100%)`;\n\n useEffect(() => {\n setLocallyResolvedReviewIds((current) => {\n if (current.size === 0) {\n return current;\n }\n\n const next = new Set(current);\n let changed = false;\n\n reviews.forEach((item) => {\n /**\n * Backend has now returned a definitive review object,\n * so optimistic state is no longer necessary.\n */\n if (\n item.review_step.review?.action != null &&\n next.has(item.id)\n ) {\n next.delete(item.id);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n}, [reviews]);\n\n useEffect(() => {\n const aside = asideRef.current;\n if (!aside || !showBadges) return;\n\n const updateAsideWidth = () => {\n const nextWidth = aside.getBoundingClientRect().width;\n if (nextWidth > 0) setAsideWidth(nextWidth);\n };\n\n updateAsideWidth();\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(updateAsideWidth);\n resizeObserver?.observe(aside);\n\n return () => resizeObserver?.disconnect();\n }, [showBadges]);\n\n const resolvedReviewIds = useMemo(() => {\n const resolvedIds = new Set<string>();\n\n reviews.forEach((item) => {\n const isResolved = item.review_step.review?.action != null;\n\n if (isResolved) {\n resolvedIds.add(item.id);\n }\n });\n\n return resolvedIds;\n}, [reviews]);\n\n const activeReview = useMemo(\n () => reviews.find((item) => item.id === activeReviewId) ?? null,\n [activeReviewId, reviews]\n );\n const isTitleConfirmationBlocked = useMemo(() => {\n if (\n !disableTitleCheckUntilBoundaryCheckCompleted ||\n activeReview?.kind !== 'label'\n ) {\n return false;\n }\n\n return boundaryReviews.some((review) => {\n if (\n getSegmentReviewKey(review.segment) !== getSegmentReviewKey(activeReview.segment) ||\n resolvedReviewIds.has(review.id)\n ) {\n return false;\n }\n\n const boundaryScore = getResolvedScore(\n review.review_step.score,\n review.review_step.confidence\n );\n\n // A high-confidence boundary can skip manual confirmation. Missing or\n // lower scores keep the existing boundary-first confirmation requirement.\n return boundaryScore == null ||\n boundaryScore < BOUNDARY_TITLE_CHECK_BYPASS_SCORE;\n });\n }, [\n activeReview,\n boundaryReviews,\n disableTitleCheckUntilBoundaryCheckCompleted,\n resolvedReviewIds,\n ]);\n const activeSegmentIndex = activeReview == null\n ? -1\n : segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(activeReview.segment)\n );\n const previousSegment = activeSegmentIndex > 0\n ? segments[activeSegmentIndex - 1]\n : undefined;\n const nextSegment = activeSegmentIndex >= 0\n ? segments[activeSegmentIndex + 1]\n : undefined;\n const previousSegmentTitle = previousSegment?.label?.trim() || previousSegment?.title;\n const nextSegmentTitle = nextSegment?.label?.trim() || nextSegment?.title;\n const activeReviewColors = getConfidenceColors(\n activeReview?.review_step.score,\n activeReview?.review_step.confidence,\n activeReview?.segment.confidence?.awaiting_llm\n );\n const activeCognitiveReasons = activeReview?.review_step.reasons?.length\n ? activeReview.review_step.reasons\n : activeReview?.segment.confidence?.reasons ?? [];\n const hasCognitiveIntegrityContent = Boolean(\n activeCognitiveReasons.some((item) =>\n item.text.trim() && ['evidence', 'gap'].includes(item.type.trim().toLowerCase())\n ) ||\n activeReview?.review_step.reason?.trim() || activeReview?.review_step.gap?.trim()\n );\n const activeReviewActionLabel = activeReview == null\n ? null\n : activeReview.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n )\n : getTitleReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n );\n const activeTitleDecisionValues = activeReview?.kind === 'label'\n ? [\n activeReviewActionLabel,\n activeReview.review_step.human_action_enum,\n activeReview.review_step.review?.action,\n activeReview.review_step.human_resolution?.action,\n ]\n : [];\n const isMergeOrSplitTitleReview = activeReview?.kind === 'label' &&\n activeTitleDecisionValues.some((value) => {\n const normalizedValue = value?.trim().toUpperCase() ?? '';\n return normalizedValue.includes('MERGE') || normalizedValue.includes('SPLIT');\n });\n const hasVisibleBoundaryReviewForActiveSegment = activeReview != null &&\n reviews.some(\n (review) =>\n review.kind === 'boundary' &&\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n const isHiddenBoundaryStructuralTitleReview =\n isMergeOrSplitTitleReview && !hasVisibleBoundaryReviewForActiveSegment;\n const shouldShowReviewedBoundaryActions =\n activeReview?.kind === 'boundary' || isHiddenBoundaryStructuralTitleReview;\n const activeBoundaryReview = !shouldShowReviewedBoundaryActions || activeReview == null\n ? undefined\n : (() => {\n if (activeReview.kind === 'boundary') return activeReview;\n\n const boundaryReview = boundaryReviews.find(\n (review) =>\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n\n if (boundaryReview) {\n return {\n ...boundaryReview,\n kind: 'boundary' as const,\n pageNumber:\n boundaryReview.metadata.focus_page ??\n boundaryReview.segment.start_page,\n };\n }\n\n return {\n ...activeReview,\n kind: 'boundary' as const,\n pageNumber:\n activeReview.segment.review_action?.focus_page ??\n activeReview.segment.start_page,\n metadata: {\n focus_page: activeReview.segment.review_action?.focus_page ?? null,\n boundary_margin: activeReview.segment.boundary_margin ?? null,\n user_actions: [],\n },\n };\n })();\n const activeReviewTitle = activeReview == null\n ? ''\n : activeReview.segment.label?.trim() || activeReview.segment.title;\n const activeStepRevertInfo =\n activeReview?.review_step.revert;\n\nconst segmentRevertInfo =\n activeReview?.segment.revert;\n\nconst normalizeRevertType = (\n type?: string | null\n) => type?.trim().toLowerCase();\n\nconst structuralStepRevertInfo =\n activeReview == null\n ? undefined\n : [...(activeReview.segment.review_steps ?? [])]\n .reverse()\n .find((step) => {\n const stepType = step.type\n ?.trim()\n .toLowerCase();\n\n if (\n stepType !== 'page_boundary' &&\n stepType !== 'page boundary review'\n ) {\n return false;\n }\n\n return (\n normalizeRevertType(step.revert?.type) ===\n 'boundary'\n );\n })\n ?.revert;\n const fallbackRevertInfo = activeStepRevertInfo ??\n activeReview?.segment.revert ??\n structuralStepRevertInfo;\n const fallbackRevertDecision = fallbackRevertInfo?.decision.trim().toUpperCase();\n const activeRevertActionLabel =\n activeReviewActionLabel ?? (\n fallbackRevertDecision\n ?.includes('SPLIT')\n ? 'Split'\n : fallbackRevertDecision\n ?.includes('MERGE')\n ? 'Merged'\n : null\n );\n const isSetRangeStructuralResult = activeReview?.kind === 'label' && structuralStepRevertInfo?.decision?.trim().toUpperCase() === 'SET_RANGE' && structuralStepRevertInfo.current_segment_ids.length !== structuralStepRevertInfo.previous_state.length;\n const isStructuralReviewResult = activeReviewActionLabel === 'Merged' || activeReviewActionLabel === 'Split' || isSetRangeStructuralResult;\n const activeRevertInfo =\n activeReview == null ? undefined : isStructuralReviewResult ? (\n normalizeRevertType(structuralStepRevertInfo?.type) === 'boundary' ? structuralStepRevertInfo :\n normalizeRevertType(segmentRevertInfo?.type) === 'boundary' ? segmentRevertInfo :\n normalizeRevertType(activeStepRevertInfo?.type) === 'boundary' ? activeStepRevertInfo : undefined\n )\n : activeReview.kind === 'label'\n ? (normalizeRevertType(activeStepRevertInfo?.type) === 'label' ? activeStepRevertInfo : undefined)\n : activeReview.kind === 'boundary'\n ? (\n normalizeRevertType(\n activeStepRevertInfo?.type\n ) === 'boundary'\n ? activeStepRevertInfo\n : normalizeRevertType(\n structuralStepRevertInfo?.type\n ) === 'boundary'\n ? structuralStepRevertInfo\n : normalizeRevertType(\n segmentRevertInfo?.type\n ) === 'boundary'\n ? segmentRevertInfo\n : undefined\n )\n : undefined;\n\n\n const structuralSummaryStep = isStructuralReviewResult && activeRevertInfo?.operation_id ? segments.flatMap((segment)=> segment.review_steps ?? []).find((step) => {\n const stepType = step.type?.trim().toLowerCase();\n\n const isBoundaryStep = stepType === 'page_boundary' || stepType === 'page boundary review';\n if(!isBoundaryStep) return false;\n\n const operationId = step.human_resolution?.operation_id ?? step.revert?.operation_id ?? step.operation_id;\n\n return (\n operationId === activeRevertInfo.operation_id && Boolean(step.human_resolution?.change_summary?.trim())\n );\n }) : undefined;\n const activeRevertSummary = activeRevertInfo?.summary?.trim() || null;\n const activeRevertDescription = isStructuralReviewResult ? (structuralSummaryStep?.human_resolution?.change_summary?.trim() || activeRevertInfo?.summary?.trim() || '') : (activeReview?.review_step?.human_resolution?.change_summary?.trim() || activeReview?.review_step?.summary?.trim() || '');\n const activeRevertData: RevertData | null = activeReview?.kind === 'page'\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: [],\n }\n : activeReview && activeRevertInfo\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: (activeRevertInfo.previous_state ?? []).flatMap<SegmentData>(\n (segment) => {\n const title = segment.label === null\n ? 'Untitled document'\n : segment.label?.trim();\n return title\n ? [{\n title,\n startPage: segment.start_page,\n endPage: segment.end_page,\n }]\n : [];\n }\n ),\n }\n : null;\n const activePageClassificationIds = activeReview?.kind === 'page'\n ? activeReview.metadata.type_choices?.map(\n (choice) => choice.classification_id\n ) ?? (\n activeReview.metadata.classification_id\n ? [activeReview.metadata.classification_id]\n : []\n )\n : [];\n const canRevertActiveReview = activeReview?.kind === 'page'\n ? Boolean(onPageTypeRevert && activePageClassificationIds.length > 0)\n : Boolean(\n activeRevertInfo?.operation_id &&\n activeRevertInfo?.type &&\n activeRevertInfo?.revertable !== false\n );\n const shouldShowRevert = Boolean(\n activeRevertData && canRevertActiveReview\n );\n\n const requestPageNavigation = useCallback((pageNumber: number, reviewId: string) => {\n navigationSequenceRef.current += 1;\n pendingNavigationRef.current = {\n requestId: navigationSequenceRef.current,\n pageNumber,\n reviewId,\n };\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, []);\n\n // const closeActiveReview = useCallback(() => {\n // pendingNavigationRef.current = null;\n // setIsCognitiveIntegrityOpen(false);\n // setActiveReviewId(null);\n // setAnchorElement(null);\n // onActiveReviewChange?.(null, null);\n // }, [onActiveReviewChange]);\n\n const selectReview = useCallback((item: ReviewItem) => {\n if (item.segment.confidence?.awaiting_llm === true) return;\n \n onBadgeSelected?.({\n reviewId: item.id,\n segment_id: item.segment.segment_id ?? null,\n reviewStepIndex: item.reviewStepIndex,\n kind: item.kind,\n pageNumber: item.pageNumber,\n metadata: item.metadata,\n });\n \n setActivePageGroup(null);\n setRevertSuccess(null);\n setActiveReviewId(item.id);\n setSelectedNavigationReviewId(item.id);\n setIsCognitiveIntegrityOpen(false);\n // The badge moves when page navigation scrolls the viewer. Keep the popup\n // closed until the badge reaches its final position.\n setAnchorElement(null);\n requestPageNavigation(item.pageNumber, item.id);\n onActiveReviewChange?.(item.id, item.segment);\n }, [onActiveReviewChange, onBadgeSelected, requestPageNavigation]);\n\n useEffect(() => {\n if (!revertSuccess) return;\n\n const frameId = requestAnimationFrame(() => setIsRevertToastVisible(true));\n const fadeTimeoutId = window.setTimeout(() => {\n setIsRevertToastVisible(false);\n }, 3500);\n const removeTimeoutId = window.setTimeout(() => {\n setRevertSuccess(null);\n }, 4000);\n\n return () => {\n cancelAnimationFrame(frameId);\n window.clearTimeout(fadeTimeoutId);\n window.clearTimeout(removeTimeoutId);\n };\n }, [revertSuccess]);\n\n useEffect(() => {\n if (!redirectionData) return;\n\n\n if (redirectionData.type === 'pageGroup') {\n const pages = redirectionData.pages ?? [];\n const index = redirectionData.pageIndex ?? 0;\n const targetPage = pages[index];\n if (targetPage == null) return;\n\n closeActiveReview();\n setActivePageGroup({ pages, index, label: redirectionData.groupLabel ?? '' });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: targetPage,\n requestId: navigationSequenceRef.current,\n });\n return;\n }\n setActivePageGroup(null);\n\n\n if (redirectionData.reviewId) {\n const matchingReview = reviews.find((item) =>\n item.id === redirectionData.reviewId &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (redirectionData.classificationId) {\n const matchingReview = reviews.find((item) =>\n item.kind === 'page' &&\n (\n item.metadata.classification_id === redirectionData.classificationId ||\n item.metadata.type_choices?.some(\n (choice) => choice.classification_id === redirectionData.classificationId\n )\n ) &&\n (!redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId) &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (!redirectionData.pageNumber || !redirectionData.type) return;\n\n const segmentStartPage = Number(redirectionData.pageNumber);\n if (!Number.isInteger(segmentStartPage) || segmentStartPage < 1) return;\n const redirectionPageType = redirectionData.pageType?.trim().toLowerCase();\n\n const matchingReview = reviews.find((item) => {\n const matchingPage = item.kind === 'page'\n ? item.pageNumber\n : item.segment.start_page;\n const matchesPageType = item.kind !== 'page' ||\n !redirectionPageType ||\n item.metadata.page_type === redirectionPageType ||\n item.metadata.type_choices?.some(\n (choice) => choice.page_type === redirectionPageType\n );\n const matchesSegment = !redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId;\n\n return matchesSegment &&\n matchingPage === segmentStartPage &&\n item.kind === redirectionData.type &&\n matchesPageType;\n });\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n\n // No review exists for this page (e.g. disableAllActions steps with no\n // page_classifications) — still jump the viewer directly.\n if (redirectionData.type === 'page') {\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segmentStartPage,\n requestId: navigationSequenceRef.current,\n });\n }\n \n }, [redirectionData, selectReview, reviews]);\n\n const closeActiveReview = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n const reviewRevertedSegment = useCallback((segment: RevertData['currentSegment']) => {\n setIsRevertToastVisible(false);\n setRevertSuccess(null);\n\n const targetReview = reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.kind === 'boundary' &&\n item.segment.start_page === segment.startPage &&\n item.segment.end_page === segment.endPage\n ) ?? reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.segment.start_page <= segment.startPage &&\n item.segment.end_page >= segment.startPage\n );\n\n if (targetReview) {\n selectReview(targetReview);\n return;\n }\n\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segment.startPage,\n requestId: navigationSequenceRef.current,\n });\n }, [closeActiveReview, resolvedReviewIds, reviews, selectReview]);\n\n const isEligibleAutoAdvanceReview = useCallback((\n item: ReviewItem,\n excludedReviewId?: string\n ) => {\n const scoreBand = getReviewScoreBand(\n item.review_step.score\n );\n const matchesScoreBand = autoAdvanceScoreBand == null ||\n scoreBand === autoAdvanceScoreBand;\n const hasCurrentLocalResolution =\n locallyResolvedReviewIds.has(item.id) &&\n isReviewStepResolutionCurrent(item.review_step, item.segment);\n\n return item.id !== excludedReviewId &&\n matchesScoreBand &&\n item.segment.confidence?.awaiting_llm !== true &&\n !isReviewStepResolved(item.review_step, item.segment) &&\n !hasCurrentLocalResolution;\n }, [autoAdvanceScoreBand, locallyResolvedReviewIds]);\n\n const selectNextReview = useCallback((completedReviewId: string) => {\n if (!autoAdvanceAfterConfirm) {\n closeActiveReview();\n return;\n }\n\n const completedIndex = reviews.findIndex(\n (item) => item.id === completedReviewId\n );\n const nextReview = reviews.find((item, index) =>\n index > completedIndex &&\n isEligibleAutoAdvanceReview(item, completedReviewId)\n ) ?? reviews.find((item) =>\n isEligibleAutoAdvanceReview(item, completedReviewId)\n );\n\n if (!nextReview) {\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => selectReview(nextReview));\n }, [\n autoAdvanceAfterConfirm,\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n selectReview,\n ]);\n\n const completePageTypeChoices = useCallback(async (\n item: Extract<ReviewItem, { kind: 'page' }>,\n selectedPageTypes: readonly PageCheckPageType[]\n ) => {\n if (disableAllActions || !onPageAction || selectedPageTypes.length === 0) return;\n\n const choices = item.metadata.type_choices ?? [];\n if (choices.length !== 2) return;\n\n const selectedTypes = new Set(selectedPageTypes);\n const context = getReviewContext(item);\n const orderedChoices = [...choices].sort((left, right) => {\n const isLeftSelected = selectedTypes.has(left.page_type);\n const isRightSelected = selectedTypes.has(right.page_type);\n return isLeftSelected === isRightSelected ? 0 : isLeftSelected ? -1 : 1;\n });\n\n setPendingReviewId(item.id);\n\n try {\n for (const choice of orderedChoices) {\n const action = selectedTypes.has(choice.page_type)\n ? PageCheckActionEnum.YES\n : PageCheckActionEnum.NO;\n\n await onPageAction(\n action,\n {\n action,\n pageType: choice.page_type,\n metadata: {\n user_actions: [PageCheckActionEnum.YES, PageCheckActionEnum.NO],\n page_num: item.metadata.page_num,\n page_type: choice.page_type,\n classification_id: choice.classification_id,\n },\n },\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n selectNextReview(item.id);\n } catch (error) {\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n disableAllActions,\n onActionError,\n onPageAction,\n selectNextReview,\n ]);\n\n const completeAction = useCallback(async (\n item: ReviewItem,\n action: BoundaryReviewAction | LabelReviewAction | PageCheckAction,\n details: BoundaryReviewConfirmDetails | LabelReviewConfirmDetails | PageCheckConfirmDetails\n ) => {\n if (disableAllActions) return;\n if (item.kind === 'boundary' && !onBoundaryAction) return;\n if (item.kind === 'label' && !onLabelAction) return;\n if (item.kind === 'page' && !onPageAction) return;\n\n const context = getReviewContext(item);\n const boundaryAction = action as BoundaryReviewAction;\n const boundaryDetails =\n details as BoundaryReviewConfirmDetails;\n\nconst effectiveBoundaryAction =\n boundaryAction ===\n BoundaryReviewActionEnum.SET_RANGE\n ? (() => {\n const newStart =\n boundaryDetails.startPage;\n\n const newEnd =\n boundaryDetails.endPage;\n\n if (\n newStart == null ||\n newEnd == null\n ) {\n return null;\n }\n\n const expanded =\n newStart <\n item.segment.start_page ||\n newEnd >\n item.segment.end_page;\n\n const shrunk =\n newStart >\n item.segment.start_page ||\n newEnd <\n item.segment.end_page;\n\n if (expanded && !shrunk) {\n return newStart <\n item.segment.start_page\n ? BoundaryReviewActionEnum.MERGE_PREV\n : BoundaryReviewActionEnum.MERGE_NEXT;\n }\n\n if (shrunk) {\n return BoundaryReviewActionEnum.SPLIT_HERE;\n }\n\n return null;\n })()\n : boundaryAction;\n const isStructuralBoundaryAction =\n item.kind === 'boundary' &&\n onBoundaryAction != null &&\n autoAdvanceAfterConfirm &&\n (\n effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS\n );\n const originalSegmentIndex = isStructuralBoundaryAction\n ? segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(item.segment)\n )\n : -1;\n\n if (isStructuralBoundaryAction && originalSegmentIndex >= 0 && effectiveBoundaryAction) {\n pendingStructuralAdvanceRef.current = {\n action: effectiveBoundaryAction as BoundaryReviewAction,\n originalSegmentIndex,\n\n segmentSignature: JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n ),\n\n ready: false,\n };\n }\n\n setPendingReviewId(item.id);\n\n try {\n if (item.kind === 'boundary') {\n await onBoundaryAction?.(\n action as BoundaryReviewAction,\n details as BoundaryReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'label') {\n await onLabelAction?.(\n action as LabelReviewAction,\n details as LabelReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'page') {\n await onPageAction?.(\n action as PageCheckAction,\n details as PageCheckConfirmDetails,\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n\n const isMergeAction = item.kind === 'boundary' && (effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS);\n\n const isSplitAction = item.kind === 'boundary' && effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE;\n if ((isSplitAction || isMergeAction) && effectiveBoundaryAction) {\n const segmentKey = getSegmentReviewKey(item.segment);\n\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n const next = new Set(current);\n\n if (boundaryAction === BoundaryReviewActionEnum.SET_RANGE) {\n next.add(segmentKey);\n } else {\n next.delete(segmentKey);\n }\n\n return next;\n });\n setOptimisticStructuralActions((current) => {\n const next = new Map(current);\n\n next.set(\n segmentKey,\n effectiveBoundaryAction as BoundaryReviewAction\n );\n\n return next;\n });\n }\n\n if (pendingStructuralAdvanceRef.current) {\n pendingStructuralAdvanceRef.current.ready = true;\n\n if (isMergeAction) {\n const titleReview = reviews.find(\n (review) =>\n review.kind === 'label' &&\n getSegmentReviewKey(review.segment) === getSegmentReviewKey(item.segment)\n );\n if (titleReview) requestAnimationFrame(() => selectReview(titleReview));\n }\n } else {\n selectNextReview(item.id);\n }\n } catch (error) {\n if (isStructuralBoundaryAction) {\n pendingStructuralAdvanceRef.current = null;\n }\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n autoAdvanceAfterConfirm,\n disableAllActions,\n onActionError,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n reviews,\n segments,\n selectReview,\n selectNextReview,\n ]);\n\n useEffect(() => {\n const pendingAdvance = pendingStructuralAdvanceRef.current;\n if (!pendingAdvance?.ready) return;\n\n const currentSegmentSignature =\n JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n );\n if (currentSegmentSignature === pendingAdvance.segmentSignature) return;\n\n const targetSegmentIndex = pendingAdvance.action === BoundaryReviewActionEnum.SPLIT_HERE\n ? pendingAdvance.originalSegmentIndex + 1\n : pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREV ||\n pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREVIOUS\n ? Math.max(0, pendingAdvance.originalSegmentIndex - 1)\n : pendingAdvance.originalSegmentIndex;\n const segmentIndexByKey = new Map(\n segments.map((segment, index) => [getSegmentReviewKey(segment, index), index])\n );\n const nextReview = reviews.find((item) => {\n const segmentIndex = segmentIndexByKey.get(getSegmentReviewKey(item.segment));\n\n return segmentIndex != null &&\n segmentIndex >= targetSegmentIndex &&\n isEligibleAutoAdvanceReview(item);\n });\n\n if (!nextReview) {\n pendingStructuralAdvanceRef.current = null;\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => {\n pendingStructuralAdvanceRef.current = null;\n selectReview(nextReview);\n });\n }, [\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n segments,\n selectReview,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (activeReviewId && !reviews.some((item) => item.id === activeReviewId)) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n useEffect(() => {\n if (!autoSelectReviewOnPageChange) return;\n if (pendingStructuralAdvanceRef.current) return;\n const pageReview = reviews.find((item) => item.pageNumber === currentPage);\n if (pageReview && pageReview.id !== activeReviewId) selectReview(pageReview);\n }, [\n activeReviewId,\n autoSelectReviewOnPageChange,\n currentPage,\n selectReview,\n reviews,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (\n activeReviewId &&\n !reviews.some(\n (item) =>\n item.id === activeReviewId &&\n item.segment.confidence?.awaiting_llm !== true\n )\n ) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n const navigationReviews = useMemo(() => {\n const availableReviews = reviews.filter(\n (item) => item.segment.confidence?.awaiting_llm !== true\n );\n\n // When all confidences are visible, navigation follows the badge/document\n // order so input positions and chevrons never jump over another confidence.\n if (filterByConfidence === 'all') return availableReviews;\n\n const remainingConfidenceOrder: ReviewConfidence[] = ['low', 'medium', 'high']\n .filter((confidence): confidence is ReviewConfidence =>\n confidence !== sortByConfidence\n );\n const confidenceOrder = [sortByConfidence, ...remainingConfidenceOrder];\n const confidenceRank = new Map(\n confidenceOrder.map((confidence, index) => [confidence, index])\n );\n\n return availableReviews\n .map((item, index) => ({ item, index }))\n .sort((left, right) => {\n const leftConfidence = left.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const rightConfidence = right.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const leftRank = leftConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(leftConfidence) ?? confidenceOrder.length;\n const rightRank = rightConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(rightConfidence) ?? confidenceOrder.length;\n\n return leftRank - rightRank || left.index - right.index;\n })\n .map(({ item }) => item);\n }, [filterByConfidence, sortByConfidence, reviews]);\n\n const selectedNavigationIndex = navigationReviews.findIndex(\n (item) => item.id === selectedNavigationReviewId\n );\n const displayedNavigationIndex = selectedNavigationIndex;\n const [navigationInputValue, setNavigationInputValue] = useState<string | null>(null);\n const [navigationInputError, setNavigationInputError] = useState<\n 'invalid-number' | 'out-of-range' | null\n >(null);\n const navigationInputChangedRef = useRef(false);\n\n const navigateToReviewIndex = useCallback((index: number) => {\n const review = navigationReviews[index];\n if (review) selectReview(review);\n }, [navigationReviews, selectReview]);\n\n const navigateToPageGroupIndex = useCallback((index: number) => {\n if (!activePageGroup || index < 0 || index >= activePageGroup.pages.length) {\n return;\n }\n\n const pageNumber = activePageGroup.pages[index];\n if (pageNumber == null) return;\n\n closeActiveReview();\n setActivePageGroup((current) => current == null ? current : {\n ...current,\n index,\n });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, [activePageGroup, closeActiveReview]);\n\n useEffect(() => {\n if (\n selectedNavigationReviewId &&\n !navigationReviews.some(\n (item) => item.id === selectedNavigationReviewId\n )\n ) {\n setSelectedNavigationReviewId(null);\n }\n }, [navigationReviews, selectedNavigationReviewId]);\n\n useEffect(() => {\n navigationInputChangedRef.current = false;\n setNavigationInputError(null);\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }, [displayedNavigationIndex, navigationReviews.length]);\n\n useEffect(() => {\n if (!navigationInputChangedRef.current || navigationInputValue == null) return;\n\n const timerId = window.setTimeout(() => {\n const requestedPosition = Number(navigationInputValue.trim());\n const requestedIndex = requestedPosition - 1;\n\n if (\n Number.isInteger(requestedPosition) &&\n requestedIndex >= 0 &&\n requestedIndex < navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n navigateToReviewIndex(requestedIndex);\n }\n }, 300);\n\n return () => window.clearTimeout(timerId);\n }, [navigateToReviewIndex, navigationInputValue, navigationReviews.length]);\n\n const badgeLabelById = useMemo(() => {\n const reviewsBySegment = new Map<string, ReviewItem[]>();\n\n reviews.forEach((item) => {\n const segmentReviews = reviewsBySegment.get(getSegmentReviewKey(item.segment)) ?? [];\n segmentReviews.push(item);\n reviewsBySegment.set(getSegmentReviewKey(item.segment), segmentReviews);\n });\n\n const labels = new Map<string, string>();\n reviewsBySegment.forEach((segmentReviews, segmentKey) => {\n const segmentNumber = segmentNumberByKey.get(segmentKey) ?? 1;\n\n segmentReviews\n .sort((left, right) => left.reviewStepIndex - right.reviewStepIndex)\n .forEach((item, index) => {\n labels.set(item.id, `${segmentNumber}${getBadgeSuffix(index)}`);\n });\n });\n\n return labels;\n }, [reviews, segmentNumberByKey]);\n\n const badgeSlotById = useMemo(() => {\n const byPage = new Map<number, ReviewItem[]>();\n reviews.forEach((item) => {\n const pageReviews = byPage.get(item.pageNumber) ?? [];\n pageReviews.push(item);\n byPage.set(item.pageNumber, pageReviews);\n });\n const slots = new Map<string, number>();\n byPage.forEach((pageReviews) => {\n pageReviews.forEach((item, index) => slots.set(item.id, index));\n });\n return slots;\n }, [reviews]);\n\n const setPreloadedRenderRange = useCallback<SetRenderRange>((visibleRange) => ({\n startPage: Math.max(0, visibleRange.startPage - badgePreloadPages),\n endPage: Math.min(\n visibleRange.numPages - 1,\n visibleRange.endPage + badgePreloadPages\n ),\n }), [badgePreloadPages]);\n\n const updateBadgePositions = useCallback(() => {\n const wrapper = wrapperRef.current;\n const viewerHost = viewerHostRef.current;\n if (!wrapper || !viewerHost) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const scrollContainer = viewerHost.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const visibleRect = scrollContainer?.getBoundingClientRect() ??\n viewerHost.getBoundingClientRect();\n\n reviews.forEach((item) => {\n const badge = badgeElementsRef.current.get(item.id);\n if (!badge) return;\n\n const page = viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${item.pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!page) {\n badge.style.visibility = 'hidden';\n return;\n }\n\n const pageRect = page.getBoundingClientRect();\n const slot = badgeSlotById.get(item.id) ?? 0;\n const badgeTop = pageRect.top + badgeOffsetTop + slot * 40;\n const badgeBottom = badgeTop + (badge.offsetHeight || 32);\n const isBadgePositionVisible =\n badgeTop >= visibleRect.top && badgeBottom <= visibleRect.bottom;\n\n badge.style.top = `${badgeTop - wrapperRect.top}px`;\n badge.style.visibility = isBadgePositionVisible ? 'visible' : 'hidden';\n });\n\n // Page-group redirects do not have review badges. Keep their pill aligned\n // with the redirected PDF page the same way individual badges are.\n const pill = pageGroupElementRef.current;\n if (pill) {\n const pageNumber = activePageGroup?.pages[activePageGroup.index];\n const page = pageNumber == null ? null : viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!activePageGroup || !page) {\n pill.style.visibility = 'hidden';\n } else {\n const pageRect = page.getBoundingClientRect();\n const pillTop = pageRect.top + badgeOffsetTop;\n const pillBottom = pillTop + (pill.offsetHeight || 25);\n const isPillPositionVisible =\n pillTop >= visibleRect.top && pillBottom <= visibleRect.bottom;\n\n pill.style.top = `${pillTop - wrapperRect.top}px`;\n pill.style.visibility = isPillPositionVisible ? 'visible' : 'hidden';\n }\n }\n\n // A page layer or badge can mount one frame after navigation settles.\n // Position updates therefore also recover the popup anchor instead of\n // relying exclusively on the one-time navigation-settled callback.\n if (activeReviewId && pendingNavigationRef.current == null) {\n const activeBadge = badgeElementsRef.current.get(activeReviewId);\n if (activeBadge && activeBadge.style.visibility !== 'hidden') {\n setAnchorElement((current) => current === activeBadge ? current : activeBadge);\n }\n }\n }, [activePageGroup, activeReviewId, badgeOffsetTop, badgeSlotById, reviews]);\n\n const handleNavigationSettled = useCallback((\n event: PdfNavigationSettledEvent\n ) => {\n const pendingNavigation = pendingNavigationRef.current;\n if (\n !pendingNavigation ||\n pendingNavigation.requestId !== event.requestId ||\n pendingNavigation.pageNumber !== event.pageNumber\n ) {\n return;\n }\n\n pendingNavigationRef.current = null;\n updateBadgePositions();\n\n requestAnimationFrame(() => {\n if (pendingNavigationRef.current != null) return;\n const badge = badgeElementsRef.current.get(pendingNavigation.reviewId);\n if (badge && badge.style.visibility !== 'hidden') setAnchorElement(badge);\n });\n }, [updateBadgePositions]);\n\n useEffect(() => {\n const viewerHost = viewerHostRef.current;\n if (!viewerHost || !showBadges) return;\n\n let frameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (frameId != null) return;\n frameId = requestAnimationFrame(() => {\n frameId = null;\n updateBadgePositions();\n });\n };\n\n viewerHost.addEventListener('scroll', schedulePositionUpdate, true);\n window.addEventListener('resize', schedulePositionUpdate);\n\n const mutationObserver = new MutationObserver(schedulePositionUpdate);\n mutationObserver.observe(viewerHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style'],\n });\n\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedulePositionUpdate);\n resizeObserver?.observe(viewerHost);\n\n schedulePositionUpdate();\n\n return () => {\n if (frameId != null) cancelAnimationFrame(frameId);\n viewerHost.removeEventListener('scroll', schedulePositionUpdate, true);\n window.removeEventListener('resize', schedulePositionUpdate);\n mutationObserver.disconnect();\n resizeObserver?.disconnect();\n };\n }, [showBadges, updateBadgePositions]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n ...style,\n display: 'block',\n position: 'relative',\n width: '100%',\n height: '100%',\n minWidth: 0,\n overflowX: 'auto',\n overflowY: 'hidden',\n }}\n >\n <div\n className=\"segment-review-wrapper__container\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 0,\n width: '100%',\n minWidth: REVIEW_LAYOUT_MIN_WIDTH,\n height: '100%',\n }}\n >\n <div\n ref={viewerHostRef}\n style={{\n ...viewerStyle,\n flex: '1 1 auto',\n width: showBadges ? 'auto' : '100%',\n minWidth: 0,\n height: '100%',\n boxSizing: 'border-box',\n }}\n >\n <PdfViewer\n highlightText={[]}\n highlightPages={{}}\n highlightCordinatePages={[]}\n useCoordinates={false}\n showRotateButton={true}\n {...pdfViewerProps}\n defaultScale={\n specialZoomLevel === undefined\n ? pdfViewerProps?.defaultScale ?? SpecialZoomLevel.PageFit\n : SEGMENT_PDF_SPECIAL_ZOOM_LEVEL[specialZoomLevel]\n }\n disablePdfAnnotations={disablePdfAnnotations}\n disablePdfTextLayer={disablePdfTextLayer}\n pdfUrl={pdfUrl}\n pdfName={pdfName}\n segments={pdfSegments}\n navigationRequest={navigationRequest}\n onNavigationSettled={handleNavigationSettled}\n setRenderRange={setPreloadedRenderRange}\n onCurrentPageChange={(pageNumber) => {\n setCurrentPage(pageNumber);\n if (\n pendingNavigationRef.current == null &&\n activeReview &&\n activeReview.pageNumber !== pageNumber\n ) {\n closeActiveReview();\n }\n onCurrentPageChange?.(pageNumber);\n }}\n />\n </div>\n\n {showBadges && (\n <aside\n aria-label=\"Page review badges\"\n ref={asideRef}\n style={{\n ...railStyle,\n position: 'relative',\n width: responsiveRailWidth,\n maxWidth: REVIEW_CARD_MAX_WIDTH,\n flex: `0 1 ${responsiveRailWidth}`,\n minHeight: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n\n {activePageGroup && (\n <span\n ref={pageGroupElementRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n zIndex: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n minHeight: 25,\n padding: '2px 8px',\n border: '1px solid #E2E8F0',\n borderRadius: 16,\n backgroundColor: '#F8FAFC',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n font: 'inherit',\n }}\n >\n <Typography\n fontFamily={'Inter'}\n sx={{ fontSize: 11, fontWeight: 500, color: '#475569', whiteSpace: 'nowrap' }}\n >\n {activePageGroup.label || 'Pages'} Pg: {activePageGroup.index + 1}\n </Typography>\n </span>\n )}\n\n\n {showBadgeNavigation && navigationReviews.length > 0 && !activePageGroup && (\n <nav\n aria-label=\"Review badge navigation\"\n style={{\n position: 'absolute',\n top: 8,\n right: badgeOffsetRight ? badgeOffsetRight : 'auto',\n left: badgeOffsetLeft ? badgeOffsetLeft : 'auto',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: 128,\n minHeight: 40,\n padding: '4px 6px',\n border: '1px solid #CBD5E1',\n borderRadius: 6,\n backgroundColor: '#FFFFFF',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.06)',\n font: 'inherit',\n }}\n >\n <Tooltip\n title={navigationInputError === 'out-of-range'\n ? 'Please enter valid number present in the range'\n : 'Please enter valid numbers'}\n open={navigationInputError != null}\n placement=\"top\"\n arrow\n >\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={navigationInputValue ?? '-'}\n min={0}\n max={navigationReviews.length}\n aria-label=\"Review badge number\"\n aria-invalid={navigationInputError != null}\n onFocus={() => {\n if (navigationInputValue == null) setNavigationInputValue('');\n }}\n onBlur={() => {\n setNavigationInputError(null);\n const numericValue = Number(navigationInputValue);\n if (\n navigationInputValue == null ||\n navigationInputValue === '' ||\n !Number.isInteger(numericValue) ||\n numericValue < 1 ||\n numericValue > navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }\n }}\n onChange={(event) => {\n const inputValue = event.target.value;\n if (!/^\\d*$/.test(inputValue)) {\n setNavigationInputError('invalid-number');\n return;\n }\n\n const numericValue = Number(inputValue);\n const isOutOfRange = inputValue !== '' && (\n numericValue < 1 || numericValue > navigationReviews.length\n );\n setNavigationInputError(isOutOfRange ? 'out-of-range' : null);\n navigationInputChangedRef.current = true;\n setNavigationInputValue(inputValue);\n }}\n style={{\n width: 30,\n height: 28,\n padding: 0,\n border: `1px solid ${navigationInputError ? '#DC2626' : '#A5B4FC'}`,\n borderRadius: 3,\n color: '#4F46E5',\n backgroundColor: '#FFFFFF',\n textAlign: 'center',\n font: 'inherit',\n fontSize: 15,\n outline: 'none',\n }}\n />\n </Tooltip>\n <span\n aria-label={`${navigationReviews.length} reviews`}\n style={{\n flex: 1,\n color: '#4F46E5',\n fontSize: 14,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n of {navigationReviews.length}\n </span>\n {(['previous', 'next'] as const).map((direction) => {\n const isPrevious = direction === 'previous';\n const targetIndex = displayedNavigationIndex + (isPrevious ? -1 : 1);\n const isDisabled = targetIndex < 0 || targetIndex >= navigationReviews.length;\n\n return (\n <button\n key={direction}\n type=\"button\"\n aria-label={`${isPrevious ? 'Previous' : 'Next'} review badge`}\n disabled={isDisabled}\n onClick={() => navigateToReviewIndex(targetIndex)}\n style={{\n display: 'grid',\n placeItems: 'center',\n width: 17,\n height: 28,\n padding: 0,\n border: 0,\n background: 'transparent',\n color: isDisabled ? '#C7D2FE' : '#4F46E5',\n cursor: isDisabled ? 'default' : 'pointer',\n }}\n >\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d={isPrevious ? 'M1 7L6 2L11 7' : 'M1 1L6 6L11 1'}\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n })}\n </nav>\n )}\n\n {!activePageGroup && reviews.map((item) => {\n const isActive = activeReviewId === item.id;\n const label = badgeLabelById.get(item.id) ?? '1A';\n const score = item.review_step.score;\n const confidence = item.review_step.confidence;\n const displayScore = formatScore(score, confidence);\n const humanActionBadgeLabel = item.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : item.kind === 'label'\n ? getTitleReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : null;\n const badgeValue = humanActionBadgeLabel ?? (\n displayScore === 'N/A' ? displayScore : `${displayScore}%`\n );\n const isAwaitingLlm = item.segment.confidence?.awaiting_llm === true;\n const confidenceColors = getConfidenceColors(\n score,\n confidence,\n isAwaitingLlm\n );\n const isReviewed = resolvedReviewIds.has(item.id);\n const isDisabled = isAwaitingLlm;\n return (\n <Tooltip\n key={item.id}\n title={isAwaitingLlm ? 'data is being processed' : ''}\n arrow\n >\n <span\n ref={(element) => {\n if (element) badgeElementsRef.current.set(item.id, element);\n else badgeElementsRef.current.delete(item.id);\n }}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n display: 'inline-flex',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n }}\n >\n <button\n disabled={isDisabled}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={isAwaitingLlm\n ? `${item.review_step.type} · Page ${item.pageNumber} · Data is being processed`\n : `${item.review_step.type} · Page ${item.pageNumber}`}\n onClick={() => selectReview(item)}\n style={{\n cursor: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n gap: 4,\n width: humanActionBadgeLabel\n ? (isReviewed && !isAwaitingLlm ? 115 : 90)\n : (isReviewed && !isAwaitingLlm ? 105 : 80),\n minHeight: 25,\n padding: '2px 5px',\n border: `1px solid ${isReviewed && !isAwaitingLlm ? \"#E2E8F0\" : confidenceColors.border}`,\n borderRadius: 16,\n backgroundColor: isReviewed && !isAwaitingLlm ? \"#F8FAFC\" : confidenceColors.background,\n color: isReviewed && !isAwaitingLlm ? \"#475569\" : confidenceColors.text,\n font: 'inherit',\n alignContent: \"center\",\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n }}\n >\n {isReviewed && !isAwaitingLlm ? (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex',gap:1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n\n </span>\n <span style={{ fontSize: 11, fontWeight: 500, display: 'flex', alignItems: 'center' }}>\n <svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ display: 'flex', marginLeft: '7px', alignItems: 'center' }}><CircleCheck height={14} width={14} strokeWidth={2} color='#16A34A' /></span>\n </span>\n </Typography>\n ) : (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex', gap: 1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={confidenceColors.divider} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n </span>\n </Typography>\n )}\n </button>\n </span>\n </Tooltip>\n );\n })}\n </aside>\n )}\n </div>\n\n {activeReview && anchorElement && (\n <CardWrapper\n anchorElement={anchorElement}\n placement=\"bottom-start\"\n offset={{ top: 8 }}\n width={Math.min(asideWidth, REVIEW_CARD_MAX_WIDTH)}\n maxWidth={REVIEW_CARD_MAX_WIDTH}\n heightBuffer={heightBuffer ?? 25}\n >\n {isCognitiveIntegrityOpen && (\n <CognitiveIntegrity\n width=\"100%\"\n maxWidth=\"100%\"\n score={activeReview.review_step.score}\n reasons={activeCognitiveReasons}\n reason={activeReview.review_step.reason}\n gap={activeReview.review_step.gap}\n onBack={() => setIsCognitiveIntegrityOpen(false)}\n onClose={closeActiveReview}\n />\n )}\n <div style={{ display: isCognitiveIntegrityOpen ? 'none' : 'block' }}>\n {resolvedReviewIds.has(activeReview.id) ?\n <ReviewedCard\n width=\"100%\"\n maxWidth=\"100%\"\n headerName={activeReview.kind === 'page'\n ? 'Page format approved'\n : activeReviewActionLabel === 'Split'\n ? 'Split approved'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge approved'\n : 'User approved'}\n headerIcon={activeReview.kind === 'page'\n ? <Check size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Merged'\n ? <GitMerge size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Split'\n ? <ChartBreakoutCircle width={18} height={18} />\n : <CircleCheck size={18} strokeWidth={2} />}\n title={activeReviewTitle}\n pageNo={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n summary={shouldShowRevert && activeRevertData ? (\n <RevertCard\n key={activeReview.id}\n icon={<CircleCheck size={14} strokeWidth={2} />}\n title={activeReviewTitle}\n pageRange={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n description={activeRevertDescription ?? null}\n revertData={activeRevertData}\n confirmDisabled={activeReview.kind === 'page' ? !canRevertActiveReview : onRevert == null || !canRevertActiveReview}\n showDocumentHeader={false}\n onRevert={async () => {\n if (activeReview.kind === 'page') {\n if (!onPageTypeRevert || activePageClassificationIds.length === 0) {\n const error = new Error(\n 'SegmentReviewPdfWrapper requires onPageTypeRevert and at least one classification id to revert a page-type decision.'\n );\n onActionError?.(error, getReviewContext(activeReview));\n throw error;\n }\n\n let result: void | RevertActionResult = undefined;\n for (const classificationId of activePageClassificationIds) {\n result = await onPageTypeRevert(\n {\n classification_id: classificationId,\n human_verdict: 'No',\n },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error(\n 'SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.'\n );\n }\n\n if (!activeRevertInfo) {\n throw new Error(\n 'There is no valid revert operation for this review.'\n );\n }\n\n const expectedRevertType =\n isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType =\n normalizeRevertType(activeRevertInfo.type);\n\n if (\n expectedRevertType &&\n actualRevertType !== expectedRevertType\n ) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(\n activeRevertInfo,\n getReviewContext(activeReview)\n );\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(\n () => new Set<string>()\n );\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(\n () => new Set<string>()\n );\n setOptimisticStructuralActions(\n () => new Map<string, BoundaryReviewAction>()\n );\n }\n const revertedReviewId = activeReview.id;\n\n const revertedSegment = activeRevertData.previousSegments[0] ??\n activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(\n REVIEW_CARD_MAX_WIDTH,\n Math.max(220, asideWidth)\n );\n const preferredLeft = anchorRect?.left ??\n ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(\n 8,\n Math.min(preferredLeft, window.innerWidth - toastWidth - 8)\n );\n const toastTop = anchorRect?.bottom == null\n ? Math.max(8, viewerRect?.top ?? 8)\n : anchorRect.bottom + 8;\n setLocallyResolvedReviewIds(() => new Set<string>());\n if (activeReview.kind !== 'page') {\n pendingStructuralAdvanceRef.current = null;\n }\n setIsRevertToastVisible(false);\n setRevertSuccess({\n title: activeReviewActionLabel === 'Split'\n ? 'Split reverted'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge reverted'\n : 'Approval reverted',\n description: result?.message?.trim() || null,\n segment: revertedSegment,\n position: {\n top: toastTop,\n left: toastLeft,\n width: toastWidth,\n },\n });\n closeActiveReview();\n }}\n />\n ) : undefined}\n additionalActions={activeBoundaryReview ? (\n <ReviewedBoundaryActions\n metadata={activeBoundaryReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n startPage={activeReview.segment.start_page}\n endPage={activeReview.segment.end_page}\n title={activeReviewTitle}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n disabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(action, details) => {\n void completeAction(activeBoundaryReview, action, details);\n }}\n />\n ) : undefined}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: { borderColor: '#16A34A' },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: '#16A34A',\n },\n },\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n : activeReview.kind === 'boundary' ? (\n <BoundaryCard\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n totalPages={totalPages}\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n manualPrompt={manualPrompt ?? \"Set a custom boundary\"}\n defaultStartPage={activeReview.segment.start_page}\n defaultEndPage={activeReview.segment.end_page}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(_selectedIndex, option, details) => {\n if (details && isBoundaryReviewAction(option.id)) {\n void completeAction(activeReview, option.id, details);\n }\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.kind === 'label' ? (\n <LabelCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={\n activeReview.metadata.current_label ||\n activeReview.segment.label ||\n activeReview.segment.title\n }\n pageNo={`Pages ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onLabelAction ||\n pendingReviewId === activeReview.id\n }\n confirmationBlocked={isTitleConfirmationBlocked}\n confirmationWarning={isTitleConfirmationBlocked\n ? 'Please confirm the boundary before confirming the title.'\n : undefined}\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.metadata.type_choices?.length === 2 ? (\n <PageTypeChoiceCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n choices={activeReview.metadata.type_choices}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(selectedPageTypes) => {\n void completePageTypeChoices(activeReview, selectedPageTypes);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : (\n <PageCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n cognitiveScore={activeReview.review_step.score}\n pageType={activeReview.metadata.page_type}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n )}\n </div>\n </CardWrapper>\n )}\n {revertSuccess && (\n <Portal>\n <Box\n aria-live=\"polite\"\n sx={{\n position: 'fixed',\n top: revertSuccess.position.top,\n left: revertSuccess.position.left,\n zIndex: 1600,\n width: revertSuccess.position.width,\n maxWidth: 'calc(100vw - 16px)',\n opacity: isRevertToastVisible ? 1 : 0,\n transform: isRevertToastVisible\n ? 'translateY(0)'\n : 'translateY(-6px)',\n transition: 'opacity 500ms ease, transform 500ms ease',\n filter: 'drop-shadow(0 12px 24px rgba(15, 23, 42, 0.18))',\n pointerEvents: isRevertToastVisible ? 'auto' : 'none',\n }}\n >\n <RevertSuccessCard\n title={revertSuccess.title}\n description={revertSuccess.description}\n onReview={() => reviewRevertedSegment(revertSuccess.segment)}\n />\n </Box>\n </Portal>\n )}\n </div>\n );\n}\n"],"names":["REVIEW_CARD_MAX_WIDTH","SegmentPdfSpecialZoomLevel","SEGMENT_PDF_SPECIAL_ZOOM_LEVEL","ActualSize","SpecialZoomLevel","PageFit","PageWidth","getReviewContext","item","reviewId","id","segment","pageNumber","SegmentReviewPdfWrapper","pdfUrl","pdfName","segments","totalPages","styles","pdfViewerProps","specialZoomLevel","showBadges","sortByConfidence","filterByConfidence","showBadgeNavigation","autoSelectReviewOnPageChange","autoAdvanceAfterConfirm","autoAdvanceScoreBand","badgePreloadPages","badgeOffsetTop","badgeOffsetRight","badgeOffsetLeft","initialReviewId","manualPrompt","heightBuffer","onBoundaryAction","onLabelAction","onPageAction","onPageTypeRevert","onRevert","onActiveReviewChange","onCurrentPageChange","onActionError","disableAllActions","disablePdfAnnotations","disablePdfTextLayer","disableTitleCheckUntilBoundaryCheckCompleted","onAdjustManually","onCognitiveClick","className","style","viewerStyle","railStyle","redirectionData","onBadgeSelected","console","log","boundaryReviews","labelReviews","pageReviews","useMemo","extractSegmentReviewData","optimisticStructuralActions","setOptimisticStructuralActions","useState","Map","optimisticRangeAdjustedSegmentKeys","setOptimisticRangeAdjustedSegmentKeys","Set","segmentNumberByKey","numberByKey","nextSegmentNumber","forEach","index","segmentKey","getSegmentReviewKey","has","set","segmentsWithTitleReviews","map","review","pendingMergeImpactedSegmentKeys","getPendingMergeImpactedSegmentKeys","useEffect","current","changed","next","action","find","hasPolledStructuralAction","delete","optimisticMergeImpactedSegmentKeys","getOptimisticMergeImpactedSegmentKeys","asideRef","useRef","reviews","filter","shouldHideStructuralBoundaryReview","review_step","get","kind","metadata","focus_page","start_page","page_num","sort","left","right","leftSegmentNumber","Number","MAX_SAFE_INTEGER","rightSegmentNumber","reviewStepIndex","localeCompare","pdfSegments","title","label","trim","page_count","end_page","currentPage","setCurrentPage","activeReviewId","setActiveReviewId","selectedNavigationReviewId","setSelectedNavigationReviewId","isCognitiveIntegrityOpen","setIsCognitiveIntegrityOpen","anchorElement","setAnchorElement","navigationRequest","setNavigationRequest","locallyResolvedReviewIds","setLocallyResolvedReviewIds","pendingReviewId","setPendingReviewId","activePageGroup","setActivePageGroup","revertSuccess","setRevertSuccess","isRevertToastVisible","setIsRevertToastVisible","navigationSequenceRef","pendingNavigationRef","pendingStructuralAdvanceRef","badgeElementsRef","pageGroupElementRef","wrapperRef","viewerHostRef","asideWidth","setAsideWidth","requestedRailWidth","aside","width","responsiveRailWidth","size","updateAsideWidth","nextWidth","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","resolvedReviewIds","resolvedIds","add","activeReview","isTitleConfirmationBlocked","some","boundaryScore","getResolvedScore","score","confidence","activeSegmentIndex","findIndex","previousSegment","nextSegment","previousSegmentTitle","nextSegmentTitle","activeReviewColors","getConfidenceColors","awaiting_llm","activeCognitiveReasons","reasons","length","hasCognitiveIntegrityContent","Boolean","text","includes","type","toLowerCase","reason","gap","activeReviewActionLabel","getBoundaryReviewActionBadgeLabel","stable_key","getTitleReviewActionBadgeLabel","activeTitleDecisionValues","human_action_enum","human_resolution","isMergeOrSplitTitleReview","value","normalizedValue","toUpperCase","hasVisibleBoundaryReviewForActiveSegment","isHiddenBoundaryStructuralTitleReview","activeBoundaryReview","boundaryReview","review_action","boundary_margin","user_actions","activeReviewTitle","activeStepRevertInfo","revert","segmentRevertInfo","normalizeRevertType","structuralStepRevertInfo","review_steps","reverse","step","stepType","fallbackRevertInfo","fallbackRevertDecision","decision","isSetRangeStructuralResult","current_segment_ids","previous_state","isStructuralReviewResult","activeRevertInfo","structuralSummaryStep","operation_id","flatMap","change_summary","activeRevertSummary","summary","activeRevertDescription","activeRevertData","currentSegment","startPage","endPage","previousSegments","activePageClassificationIds","type_choices","choice","classification_id","canRevertActiveReview","revertable","shouldShowRevert","requestPageNavigation","useCallback","requestId","selectReview","segment_id","frameId","requestAnimationFrame","fadeTimeoutId","window","setTimeout","removeTimeoutId","cancelAnimationFrame","clearTimeout","pages","pageIndex","targetPage","closeActiveReview","groupLabel","matchingReview","classificationId","segmentId","segmentStartPage","isInteger","redirectionPageType","pageType","matchingPage","matchesPageType","page_type","reviewRevertedSegment","targetReview","isEligibleAutoAdvanceReview","excludedReviewId","scoreBand","getReviewScoreBand","matchesScoreBand","hasCurrentLocalResolution","isReviewStepResolutionCurrent","isReviewStepResolved","selectNextReview","completedReviewId","completedIndex","nextReview","completePageTypeChoices","async","selectedPageTypes","choices","selectedTypes","context","orderedChoices","isLeftSelected","PageCheckActionEnum","YES","NO","error","completeAction","details","boundaryAction","boundaryDetails","effectiveBoundaryAction","BoundaryReviewActionEnum","SET_RANGE","newStart","newEnd","expanded","shrunk","MERGE_PREV","MERGE_NEXT","SPLIT_HERE","isStructuralBoundaryAction","MERGE_PREVIOUS","originalSegmentIndex","segmentSignature","JSON","stringify","key","version","ready","isMergeAction","titleReview","pendingAdvance","targetSegmentIndex","Math","max","segmentIndexByKey","segmentIndex","pageReview","navigationReviews","availableReviews","remainingConfidenceOrder","confidenceOrder","confidenceRank","leftConfidence","rightConfidence","displayedNavigationIndex","navigationInputValue","setNavigationInputValue","navigationInputError","setNavigationInputError","navigationInputChangedRef","navigateToReviewIndex","String","timerId","requestedPosition","requestedIndex","badgeLabelById","reviewsBySegment","segmentReviews","push","labels","segmentNumber","suffix","fromCharCode","floor","getBadgeSuffix","badgeSlotById","byPage","slots","setPreloadedRenderRange","visibleRange","min","numPages","updateBadgePositions","wrapper","viewerHost","wrapperRect","scrollContainer","querySelector","visibleRect","badge","page","visibility","pageRect","slot","badgeTop","top","badgeBottom","offsetHeight","isBadgePositionVisible","bottom","pill","pillTop","pillBottom","isPillPositionVisible","activeBadge","handleNavigationSettled","event","pendingNavigation","schedulePositionUpdate","addEventListener","mutationObserver","MutationObserver","childList","subtree","attributes","attributeFilter","removeEventListener","jsxs","ref","display","position","height","minWidth","overflowX","overflowY","children","alignItems","jsx","flex","boxSizing","PdfViewer","highlightText","highlightPages","highlightCordinatePages","useCoordinates","showRotateButton","defaultScale","onNavigationSettled","setRenderRange","maxWidth","minHeight","overflow","zIndex","justifyContent","padding","border","borderRadius","backgroundColor","boxShadow","font","Typography","fontFamily","sx","fontSize","fontWeight","color","whiteSpace","Tooltip","open","placement","arrow","inputMode","pattern","onFocus","onBlur","numericValue","onChange","inputValue","target","test","isOutOfRange","textAlign","outline","direction","isPrevious","targetIndex","isDisabled","disabled","onClick","placeItems","background","cursor","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","isActive","displayScore","formatScore","humanActionBadgeLabel","badgeValue","isAwaitingLlm","confidenceColors","isReviewed","element","alignContent","flexDirection","xmlns","marginLeft","CircleCheck","divider","CardWrapper","offset","CognitiveIntegrity","onBack","onClose","ReviewedCard","headerName","headerIcon","Check","GitMerge","ChartBreakoutCircle","pageNo","RevertCard","icon","pageRange","description","revertData","confirmDisabled","showDocumentHeader","Error","result","human_verdict","expectedRevertType","actualRevertType","onRevertError","onRevertComplete","revertedSegment","anchorRect","viewerRect","toastWidth","preferredLeft","innerWidth","toastLeft","toastTop","message","additionalActions","ReviewedBoundaryActions","reviewAction","onConfirm","cognitiveScore","root","borderColor","header","BoundaryCard","content","question","revertSummary","defaultStartPage","defaultEndPage","cardBorder","_selectedIndex","option","isBoundaryReviewAction","LabelCheck","current_label","confirmationBlocked","confirmationWarning","onActionConfirm","PageTypeChoiceCheck","PageCheck","Portal","Box","opacity","transform","transition","pointerEvents","RevertSuccessCard","onReview"],"mappings":"y2CAyGA,MAAMA,EAAwB,IAQlB,IAAAC,GAAAA,IACVA,EAAa,WAAA,aACbA,EAAU,QAAA,UACVA,EAAY,UAAA,YAHFA,IAAAA,GAAA,CAAA,GAeZ,MAAMC,EAGF,CACFC,WAAyCC,EAAiBD,WAC1DE,QAAsCD,EAAiBC,QACvDC,UAAwCF,EAAiBE,WA4HrDC,EAAoBC,IAAkD,CAC1EC,SAAUD,EAAKE,GACfC,QAASH,EAAKG,QACdC,WAAYJ,EAAKI,aAqBnB,SAAwBC,GAAwBC,OAC9CA,EAAAC,QACAA,EAAAC,SACAA,EAAAC,WACAA,EAAAC,OACAA,EAAAC,eACAA,EAAAC,iBACAA,EAAAC,WACAA,IAAa,EAAAC,iBACbA,GAAmB,MAAAC,mBACnBA,GAAqB,MAAAC,oBACrBA,IAAsB,EAAAC,6BACtBA,IAA+B,EAAAC,wBAC/BA,IAA0B,EAAAC,qBAC1BA,GAAAC,kBACAA,GAAoB,EAAAC,eACpBA,GAAiB,GAAAC,iBACjBA,GAAmB,GAAAC,gBACnBA,GAAkB,EAAAC,gBAClBA,GAAAC,aACAA,GAAAC,aACAA,GAAAC,iBACAA,GAAAC,cACAA,GAAAC,aACAA,GAAAC,iBACAA,GAAAC,SACAA,GAAAC,qBACAA,GAAAC,oBACAA,GAAAC,cACAA,GAAAC,kBACAA,IAAoB,EAAAC,sBACpBA,IAAwB,EAAAC,oBACxBA,IAAsB,EAAAC,6CACtBA,IAA+C,EAAAC,iBAC/CA,GAAAC,iBACAA,GAAAC,UACAA,GAAAC,MACAA,GAAAC,YACAA,GAAAC,UACAA,GAAAC,gBACAA,GAAAC,gBACAA,KAEQC,QAAAC,IAAI,4BAA6BvC,GACzC,MAAMwC,gBAAEA,GAAAC,aAAiBA,GAAcC,YAAAA,IAAgBC,EACrD,IAAMC,EAAyB7C,GAC/B,CAACA,KAEI8C,GAA6BC,IAAkCC,EAEpE,IAAM,IAAIC,MACLC,GAAoCC,IACzCH,EAAsB,IAAM,IAAII,KAE5BC,GAAqBT,EACzB,KACQ,MAAAU,MAAkBL,IACxB,IAAIM,EAAoB,EAUjB,OAREvD,EAAAwD,QAAQ,CAAC7D,EAAS8D,KACnB,MAAAC,EAAaC,EAAoBhE,EAAS8D,GAC3CH,EAAYM,IAAIF,KACPJ,EAAAO,IAAIH,EAAYH,GACPA,GAAA,KAIlBD,GAET,CAACtD,IAEG8D,GAA2BlB,EAC/B,IAAM,IAAIQ,IAAIV,GAAaqB,IAAKC,GAAWL,EAAoBK,EAAOrE,WACtE,CAAC+C,KAEGuB,GAAkCrB,EACtC,IAAMsB,EAAmClE,GACzC,CAACA,IAEHmE,EAAU,KACRpB,GAAgCqB,IAC9B,IAAIC,GAAU,EACR,MAAAC,EAAO,IAAIrB,IAAImB,GAYrB,OAVQA,EAAAZ,QAAQ,CAACe,EAAQb,KACvB,MAAM/D,EAAUK,EAASwE,KAAMhF,GAC7BmE,EAAoBnE,KAAUkE,GAE3B/D,IAAW8E,EAA0B9E,EAAS4E,KACjDD,EAAKI,OAAOhB,GACFW,GAAA,KAIPA,EAAUC,EAAOF,KAEzB,CAACpE,IACJmE,EAAU,KACRhB,GAAuCiB,IACrC,IAAIC,GAAU,EACR,MAAAC,EAAO,IAAIlB,IAAIgB,GASrB,OAPQA,EAAAZ,QAASE,IACVZ,GAA4Bc,IAAIF,KACnCY,EAAKI,OAAOhB,GACFW,GAAA,KAIPA,EAAUC,EAAOF,KAEzB,CAACtB,KACE,MAAA6B,GAAqC/B,EAAQ,IAC1CgC,EACL5E,EACA8C,GACAI,IAED,CAACA,GAAoCJ,GAA6B9C,IAC/D6E,GAAWC,EAAO,MAClBC,GAAUnC,EAAsB,IAAM,IACvCH,GACAuC,OAAQhB,IACNC,GAAgCL,IAAID,EAAoBK,EAAOrE,YAC/DgF,GAAmCf,IAAID,EAAoBK,EAAOrE,YAClEsF,EACCjB,EAAOkB,YACPlB,EAAOrE,QACPmE,GAAyBF,IAAID,EAAoBK,EAAOrE,UACxDmD,GAA4BqC,IAAIxB,EAAoBK,EAAOrE,YAG9DoE,IAAKC,IAAY,IACbA,EACHoB,KAAM,WACNxF,WAAYoE,EAAOqB,SAASC,YAActB,EAAOrE,QAAQ4F,iBAE1D7C,GACAsC,OAAQhB,IACNC,GAAgCL,IAAID,EAAoBK,EAAOrE,YAC/DgF,GAAmCf,IAAID,EAAoBK,EAAOrE,WAEpEoE,IAAKC,IAAY,IACbA,EACHoB,KAAM,QACNxF,WAAYoE,EAAOrE,QAAQ4F,iBAE5B5C,GACAqC,OAAQhB,IACNC,GAAgCL,IAAID,EAAoBK,EAAOrE,YAC/DgF,GAAmCf,IAAID,EAAoBK,EAAOrE,WAEpEoE,IAAKC,IAAY,IACbA,EACHoB,KAAM,OACNxF,WAAYoE,EAAOqB,SAASG,UAAYxB,EAAOrE,QAAQ4F,eAE3DE,KAAK,CAACC,EAAMC,KACN,MAAAC,EACJvC,GAAmB8B,IAAIxB,EAAoB+B,EAAK/F,WAAakG,OAAOC,iBAChEC,EACJ1C,GAAmB8B,IAAIxB,EAAoBgC,EAAMhG,WAAakG,OAAOC,iBAEvE,OAAOJ,EAAK9F,WAAa+F,EAAM/F,YAC7BgG,EAAoBG,GACpBL,EAAKM,gBAAkBL,EAAMK,iBAC7BN,EAAKhG,GAAGuG,cAAcN,EAAMjG,MAC5B,CACF+C,GACAC,GACAC,GACAgC,GACA7B,GACAmB,GACAZ,GACAS,KAMIoC,GAActD,EAAQ,IAAM5C,EAAS+D,IAAKpE,IAAa,IACxDA,EACHwG,MAAOxG,EAAQyG,OAAOC,QAAU1G,EAAQwG,MACxCG,WAAY3G,EAAQ2G,YAAc3G,EAAQ4G,SAAW5G,EAAQ4F,WAAa,KACvE,CAACvF,KAECwG,GAAaC,IAAkBzD,EAAS,IACxC0D,GAAgBC,IAAqB3D,EAC1ChC,IAAmB,OAEd4F,GAA4BC,IAAiC7D,EAElEhC,IAAmB,OACd8F,GAA0BC,IAA+B/D,GAAS,IAClEgE,GAAeC,IAAoBjE,EAA6B,OAChEkE,GAAmBC,IAAwBnE,EAAsC,OACjFoE,GAA0BC,IAA+BrE,EAC9D,QAAUI,MAELkE,GAAiBC,IAAsBvE,EAAwB,OAC/DwE,GAAiBC,IAAsBzE,EAIpC,OAGH0E,GAAeC,IAAoB3E,EAAoC,OACvE4E,GAAsBC,IAA2B7E,GAAS,GAC3D8E,GAAwBhD,EAAO,GAC/BiD,GAAuBjD,EAInB,MACJkD,GAA8BlD,EAK1B,MACJmD,GAAmBnD,EAAW,IAAA7B,KAC9BiF,GAAsBpD,EAA+B,MACrDqD,GAAarD,EAA8B,MAC3CsD,GAAgBtD,EAA8B,OAC7CuD,GAAYC,IAAiBtF,EAAShE,GACvCuJ,GAAqBrI,GAAQsI,OAAOC,OAAS,MAC7CC,GAAsB,OACI,iBAAvBH,GAAkC,GAAGA,OAAyBA,mBAGvEpE,EAAU,KACVkD,GAA6BjD,IACvB,GAAiB,IAAjBA,EAAQuE,KACH,OAAAvE,EAGH,MAAAE,EAAO,IAAIlB,IAAIgB,GACrB,IAAIC,GAAU,EAgBd,OAdQU,GAAAvB,QAAShE,IAMsB,MAAnCA,EAAK0F,YAAYlB,QAAQO,QACzBD,EAAKV,IAAIpE,EAAKE,MAET4E,EAAAI,OAAOlF,EAAKE,IACP2E,GAAA,KAIPA,EAAUC,EAAOF,KAEzB,CAACW,KAEFZ,EAAU,KACR,MAAMqE,EAAQ3D,GAAST,QACnB,IAACoE,IAAUnI,GAAY,OAE3B,MAAMuI,EAAmB,KACjB,MAAAC,EAAYL,EAAMM,wBAAwBL,MAC5CI,EAAY,GAAGP,GAAcO,IAGlBD,IACjB,MAAMG,EAA2C,oBAAnBC,eAC1B,KACA,IAAIA,eAAeJ,GAGhB,OAFPG,GAAgBE,QAAQT,GAEjB,IAAMO,GAAgBG,cAC5B,CAAC7I,KAEE,MAAA8I,GAAoBvG,EAAQ,KAC5B,MAAAwG,MAAkBhG,IAUjB,OARC2B,GAAAvB,QAAShE,IACuC,MAAnCA,EAAK0F,YAAYlB,QAAQO,QAG9B6E,EAAAC,IAAI7J,EAAKE,MAIlB0J,GACN,CAACrE,KAEIuE,GAAe1G,EACnB,IAAMmC,GAAQP,KAAMhF,GAASA,EAAKE,KAAOgH,KAAmB,KAC5D,CAACA,GAAgB3B,KAEbwE,GAA6B3G,EAAQ,OAEtCd,IACsB,UAAvBwH,IAAclE,OAKT3C,GAAgB+G,KAAMxF,IAC3B,GACEL,EAAoBK,EAAOrE,WAAagE,EAAoB2F,GAAa3J,UACzEwJ,GAAkBvF,IAAII,EAAOtE,IAEtB,OAAA,EAGT,MAAM+J,EAAgBC,EACpB1F,EAAOkB,YAAYyE,MACnB3F,EAAOkB,YAAY0E,YAKd,OAAiB,MAAjBH,GACLA,EA9ekC,KAgfrC,CACDH,GACA7G,GACAX,GACAqH,KAEIU,GAAqC,MAAhBP,IACvB,EACAtJ,EAAS8J,UACNnK,GAAYgE,EAAoBhE,KAAagE,EAAoB2F,GAAa3J,UAE/EoK,GAAkBF,GAAqB,EACzC7J,EAAS6J,GAAqB,QAC9B,EACEG,GAAcH,IAAsB,EACtC7J,EAAS6J,GAAqB,QAC9B,EACEI,GAAuBF,IAAiB3D,OAAOC,QAAU0D,IAAiB5D,MAC1E+D,GAAmBF,IAAa5D,OAAOC,QAAU2D,IAAa7D,MAC9DgE,GAAqBC,EACzBd,IAAcpE,YAAYyE,MAC1BL,IAAcpE,YAAY0E,WAC1BN,IAAc3J,QAAQiK,YAAYS,cAE9BC,GAAyBhB,IAAcpE,YAAYqF,SAASC,OAC9DlB,GAAapE,YAAYqF,QACzBjB,IAAc3J,QAAQiK,YAAYW,SAAW,GAC3CE,GAA+BC,QACnCJ,GAAuBd,KAAMhK,GAC3BA,EAAKmL,KAAKtE,QAAU,CAAC,WAAY,OAAOuE,SAASpL,EAAKqL,KAAKxE,OAAOyE,iBAEpExB,IAAcpE,YAAY6F,QAAQ1E,QAAUiD,IAAcpE,YAAY8F,KAAK3E,QAEvE4E,GAA0C,MAAhB3B,GAC5B,KACsB,aAAtBA,GAAalE,KACX8F,EACE5B,GAAapE,YACboE,GAAa3J,QACbmD,GAA4BqC,IAAImE,GAAa3J,QAAQwL,YAAc,KAErEC,EACE9B,GAAapE,YACboE,GAAa3J,QACbmD,GAA4BqC,IAAImE,GAAa3J,QAAQwL,YAAc,KAErEE,GAAmD,UAAvB/B,IAAclE,KAC5C,CACE6F,GACA3B,GAAapE,YAAYoG,kBACzBhC,GAAapE,YAAYlB,QAAQO,OACjC+E,GAAapE,YAAYqG,kBAAkBhH,QAE7C,GACEiH,GAAmD,UAAvBlC,IAAclE,MAC9CiG,GAA0B7B,KAAMiC,IAC9B,MAAMC,EAAkBD,GAAOpF,OAAOsF,eAAiB,GACvD,OAAOD,EAAgBd,SAAS,UAAYc,EAAgBd,SAAS,WAEnEgB,GAA2D,MAAhBtC,IAC/CvE,GAAQyE,KACLxF,GACiB,aAAhBA,EAAOoB,MACPzB,EAAoBK,EAAOrE,WACzBgE,EAAoB2F,GAAa3J,UAEnCkM,GACJL,KAA8BI,GAG1BE,IADmB,aAAvBxC,IAAclE,MAAuByG,KAC4C,MAAhBvC,SAGzD,GAAsB,aAAtBA,GAAalE,KAA4B,OAAAkE,GAE7C,MAAMyC,EAAiBtJ,GAAgB+B,KACpCR,GACCL,EAAoBK,EAAOrE,WAC3BgE,EAAoB2F,GAAa3J,UAGrC,OAAIoM,EACK,IACFA,EACH3G,KAAM,WACNxF,WACEmM,EAAe1G,SAASC,YACxByG,EAAepM,QAAQ4F,YAItB,IACF+D,GACHlE,KAAM,WACNxF,WACE0J,GAAa3J,QAAQqM,eAAe1G,YACpCgE,GAAa3J,QAAQ4F,WACvBF,SAAU,CACRC,WAAYgE,GAAa3J,QAAQqM,eAAe1G,YAAc,KAC9D2G,gBAAiB3C,GAAa3J,QAAQsM,iBAAmB,KACzDC,aAAc,IAGjB,YACDC,GAAoC,MAAhB7C,GACtB,GACAA,GAAa3J,QAAQyG,OAAOC,QAAUiD,GAAa3J,QAAQwG,MACzDiG,GACN9C,IAAcpE,YAAYmH,OAEtBC,GACJhD,IAAc3J,QAAQ0M,OAElBE,GACJ1B,GACGA,GAAMxE,OAAOyE,cAEZ0B,GACY,MAAhBlD,QAEI,EAAA,IAAKA,GAAa3J,QAAQ8M,cAAgB,IACvCC,UACAlI,KAAMmI,IACL,MAAMC,EAAWD,EAAK9B,MAClBxE,OACDyE,cAGD,OAAa,kBAAb8B,GACa,yBAAbA,IAOA,aADAL,GAAoBI,EAAKN,QAAQxB,SAInCwB,OACFQ,GAAqBT,IACzB9C,IAAc3J,QAAQ0M,QACtBG,GACIM,GAAyBD,IAAoBE,SAAS1G,OAAOsF,cAEnEV,KACE6B,IACIlC,SAAS,UAETkC,IACIlC,SAAS,UAInB,MAAMoC,GAAoD,UAAvB1D,IAAclE,MAAiF,cAA7DoH,IAA0BO,UAAU1G,OAAOsF,eAAiCa,GAAyBS,oBAAoBzC,SAAWgC,GAAyBU,eAAe1C,OAC3O2C,GAAuD,WAA5BlC,IAAoE,UAA5BA,IAAuC+B,GAC1GI,GACY,MAAhB9D,QAAmC,EAAA6D,GAC6B,aAAxDZ,GAAoBC,IAA0B3B,MAAuB2B,GACpB,aAAjDD,GAAoBD,IAAmBzB,MAAuByB,GACV,aAApDC,GAAoBH,IAAsBvB,MAAuBuB,QAEnE,EAAsB,UAAtB9C,GAAalE,KAC0C,UAApDmH,GAAoBH,IAAsBvB,MAAoBuB,QAC/D,EAAsB,aAAtB9C,GAAalE,KAIH,aAFNmH,GACEH,IAAsBvB,MAEpBuB,GAGQ,aAFRG,GACIC,IAA0B3B,MAE5B2B,GAGQ,aAFRD,GACID,IAAmBzB,MAErByB,QAGV,OAAA,EAGNe,GAAwBF,IAA4BC,IAAkBE,aAAetN,EAASuN,QAAS5N,GAAWA,EAAQ8M,cAAgB,IAAIjI,KAAMmI,IACxJ,MAAMC,EAAWD,EAAK9B,MAAMxE,OAAOyE,cAGhC,KADiC,kBAAb8B,GAA6C,yBAAbA,GAC5B,OAAA,EAKzB,OAHkBD,EAAKpB,kBAAkB+B,cAAgBX,EAAKN,QAAQiB,cAAgBX,EAAKW,gBAG1EF,GAAiBE,cAAgB5C,QAAQiC,EAAKpB,kBAAkBiC,gBAAgBnH,eAEhG,EACCoH,GAAsBL,IAAkBM,SAASrH,QAAU,KAC3DsH,GAA0BR,GAA4BE,IAAuB9B,kBAAkBiC,gBAAgBnH,QAAU+G,IAAkBM,SAASrH,QAAU,GAAOiD,IAAcpE,aAAaqG,kBAAkBiC,gBAAgBnH,QAAUiD,IAAcpE,aAAawI,SAASrH,QAAU,GAC1RuH,GAA6D,SAAvBtE,IAAclE,KACtD,CACEyI,eAAgB,CACd1H,MAAOgG,GACP2B,UAAWxE,GAAa3J,QAAQ4F,WAChCwI,QAASzE,GAAa3J,QAAQ4G,UAEhCyH,iBAAkB,IAEpB1E,IAAgB8D,GACd,CACES,eAAgB,CACd1H,MAAOgG,GACP2B,UAAWxE,GAAa3J,QAAQ4F,WAChCwI,QAASzE,GAAa3J,QAAQ4G,UAEhCyH,kBAAmBZ,GAAiBF,gBAAkB,IAAIK,QACvD5N,IACC,MAAMwG,EAA0B,OAAlBxG,EAAQyG,MAClB,oBACAzG,EAAQyG,OAAOC,OACnB,OAAOF,EACH,CAAC,CACCA,QACA2H,UAAWnO,EAAQ4F,WACnBwI,QAASpO,EAAQ4G,WAEnB,MAIV,KACA0H,GAAqD,SAAvB3E,IAAclE,KAC9CkE,GAAajE,SAAS6I,cAAcnK,IACjCoK,GAAWA,EAAOC,qBAEnB9E,GAAajE,SAAS+I,kBAClB,CAAC9E,GAAajE,SAAS+I,mBACvB,IAEN,GACEC,GAA+C,SAAvB/E,IAAclE,KACxCsF,QAAQpJ,IAAoB2M,GAA4BzD,OAAS,GACjEE,QACE0C,IAAkBE,cAClBF,IAAkBvC,OACe,IAAjCuC,IAAkBkB,YAElBC,GAAmB7D,QACvBkD,IAAoBS,IAGhBG,GAAwBC,EAAY,CAAC7O,EAAoBH,KAC7DqI,GAAsB1D,SAAW,EACjC2D,GAAqB3D,QAAU,CAC7BsK,UAAW5G,GAAsB1D,QACjCxE,aACAH,YAEmB0H,GAAA,CACnBvH,aACA8O,UAAW5G,GAAsB1D,WAElC,IAUGuK,GAAeF,EAAajP,KACc,IAA1CA,EAAKG,QAAQiK,YAAYS,eAEX/H,KAAA,CAChB7C,SAAUD,EAAKE,GACfkP,WAAYpP,EAAKG,QAAQiP,YAAc,KACvC5I,gBAAiBxG,EAAKwG,gBACtBZ,KAAM5F,EAAK4F,KACXxF,WAAYJ,EAAKI,WACjByF,SAAU7F,EAAK6F,WAGjBoC,GAAmB,MACnBE,GAAiB,MACjBhB,GAAkBnH,EAAKE,IACvBmH,GAA8BrH,EAAKE,IACnCqH,IAA4B,GAG5BE,GAAiB,MACKuH,GAAAhP,EAAKI,WAAYJ,EAAKE,IACrB8B,KAAAhC,EAAKE,GAAIF,EAAKG,WACpC,CAAC6B,GAAsBc,GAAiBkM,KAE3CrK,EAAU,KACR,IAAKuD,GAAe,OAEpB,MAAMmH,EAAUC,sBAAsB,IAAMjH,IAAwB,IAC9DkH,EAAgBC,OAAOC,WAAW,KACtCpH,IAAwB,IACvB,MACGqH,EAAkBF,OAAOC,WAAW,KACxCtH,GAAiB,OAChB,KAEH,MAAO,KACLwH,qBAAqBN,GACrBG,OAAOI,aAAaL,GACpBC,OAAOI,aAAaF,KAErB,CAACxH,KAEJvD,EAAU,KACR,IAAK9B,GAAiB,OAGlB,GAAyB,cAAzBA,GAAgBwI,KAAsB,CAClC,MAAAwE,EAAQhN,GAAgBgN,OAAS,GACjC5L,EAAQpB,GAAgBiN,WAAa,EACrCC,EAAaF,EAAM5L,GACzB,GAAkB,MAAd8L,EAAoB,OASxB,OAPkBC,KAClB/H,GAAmB,CAAE4H,QAAO5L,QAAO2C,MAAO/D,GAAgBoN,YAAc,KACxE3H,GAAsB1D,SAAW,OACZ+C,GAAA,CACnBvH,WAAY2P,EACZb,UAAW5G,GAAsB1D,SAGrC,CAIA,GAHAqD,GAAmB,MAGfpF,GAAgB5C,SAAU,CAC5B,MAAMiQ,EAAiB3K,GAAQP,KAAMhF,GACnCA,EAAKE,KAAO2C,GAAgB5C,YAC1B4C,GAAgBwI,MAAQrL,EAAK4F,OAAS/C,GAAgBwI,OAG1D,GAAI6E,EAEF,YADAf,GAAae,EAGjB,CAEA,GAAIrN,GAAgBsN,iBAAkB,CACpC,MAAMD,EAAiB3K,GAAQP,KAAMhF,GACrB,SAAdA,EAAK4F,OAEH5F,EAAK6F,SAAS+I,oBAAsB/L,GAAgBsN,kBACpDnQ,EAAK6F,SAAS6I,cAAc1E,KACzB2E,GAAWA,EAAOC,oBAAsB/L,GAAgBsN,sBAG3DtN,GAAgBuN,WAChBpQ,EAAKG,QAAQiP,aAAevM,GAAgBuN,cAC5CvN,GAAgBwI,MAAQrL,EAAK4F,OAAS/C,GAAgBwI,OAG1D,GAAI6E,EAEF,YADAf,GAAae,EAGjB,CAEA,IAAKrN,GAAgBzC,aAAeyC,GAAgBwI,KAAM,OAEpD,MAAAgF,EAAmBhK,OAAOxD,GAAgBzC,YAChD,IAAKiG,OAAOiK,UAAUD,IAAqBA,EAAmB,EAAG,OACjE,MAAME,EAAsB1N,GAAgB2N,UAAU3J,OAAOyE,cAEvD4E,EAAiB3K,GAAQP,KAAMhF,IACnC,MAAMyQ,EAA6B,SAAdzQ,EAAK4F,KACtB5F,EAAKI,WACLJ,EAAKG,QAAQ4F,WACX2K,EAAgC,SAAd1Q,EAAK4F,OAC1B2K,GACDvQ,EAAK6F,SAAS8K,YAAcJ,GAC5BvQ,EAAK6F,SAAS6I,cAAc1E,KACzB2E,GAAWA,EAAOgC,YAAcJ,GAKrC,QAHwB1N,GAAgBuN,WACtCpQ,EAAKG,QAAQiP,aAAevM,GAAgBuN,YAG5CK,IAAiBJ,GACjBrQ,EAAK4F,OAAS/C,GAAgBwI,MAC9BqF,IAGAR,EACFf,GAAae,GAMY,SAAzBrN,GAAgBwI,OACA2E,KAClB1H,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBvH,WAAYiQ,EACZnB,UAAW5G,GAAsB1D,YAIlC,CAAC/B,GAAiBsM,GAAc5J,KAE7B,MAAAyK,GAAoBf,EAAY,KACpC1G,GAAqB3D,QAAU,KAC/B2C,IAA4B,GAC5BJ,GAAkB,MAClBM,GAAiB,MACjBzF,KAAuB,KAAM,OAC5B,CAACA,KAEE4O,GAAwB3B,EAAa9O,IACzCkI,IAAwB,GACxBF,GAAiB,MAEjB,MAAM0I,EAAetL,GAAQP,KAAMhF,IAChC2J,GAAkBvF,IAAIpE,EAAKE,KACd,aAAdF,EAAK4F,MACL5F,EAAKG,QAAQ4F,aAAe5F,EAAQmO,WACpCtO,EAAKG,QAAQ4G,WAAa5G,EAAQoO,UAC/BhJ,GAAQP,KAAMhF,IAChB2J,GAAkBvF,IAAIpE,EAAKE,KAC5BF,EAAKG,QAAQ4F,YAAc5F,EAAQmO,WACnCtO,EAAKG,QAAQ4G,UAAY5G,EAAQmO,WAG/BuC,EACF1B,GAAa0B,IAIGb,KAClB1H,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBvH,WAAYD,EAAQmO,UACpBY,UAAW5G,GAAsB1D,YAElC,CAACoL,GAAmBrG,GAAmBpE,GAAS4J,KAE7C2B,GAA8B7B,EAAY,CAC9CjP,EACA+Q,KAEA,MAAMC,EAAYC,EAChBjR,EAAK0F,YAAYyE,OAEb+G,EAA2C,MAAxB/P,IACvB6P,IAAc7P,GACVgQ,EACJvJ,GAAyBxD,IAAIpE,EAAKE,KAClCkR,EAA8BpR,EAAK0F,YAAa1F,EAAKG,SAEvD,OAAOH,EAAKE,KAAO6Q,GACjBG,IAC0C,IAA1ClR,EAAKG,QAAQiK,YAAYS,eACxBwG,EAAqBrR,EAAK0F,YAAa1F,EAAKG,WAC5CgR,GACF,CAAChQ,GAAsByG,KAEpB0J,GAAmBrC,EAAasC,IACpC,IAAKrQ,GAEH,YADkB8O,KAIpB,MAAMwB,EAAiBjM,GAAQ+E,UAC5BtK,GAASA,EAAKE,KAAOqR,GAElBE,EAAalM,GAAQP,KAAK,CAAChF,EAAMiE,IACrCA,EAAQuN,GACRV,GAA4B9Q,EAAMuR,KAC/BhM,GAAQP,KAAMhF,GACjB8Q,GAA4B9Q,EAAMuR,IAG/BE,EAKiBnC,sBAAA,IAAMH,GAAasC,IAJrBzB,MAKnB,CACD9O,GACA8O,GACAc,GACAvL,GACA4J,KAGIuC,GAA0BzC,EAAY0C,MAC1C3R,EACA4R,KAEA,GAAIzP,KAAsBN,IAA6C,IAA7B+P,EAAkB5G,OAAc,OAE1E,MAAM6G,EAAU7R,EAAK6F,SAAS6I,cAAgB,GAC1C,GAAmB,IAAnBmD,EAAQ7G,OAAc,OAEpB,MAAA8G,EAAgB,IAAIlO,IAAIgO,GACxBG,EAAUhS,EAAiBC,GAC3BgS,EAAiB,IAAIH,GAAS5L,KAAK,CAACC,EAAMC,KAC9C,MAAM8L,EAAiBH,EAAc1N,IAAI8B,EAAKyK,WAE9C,OAAOsB,IADiBH,EAAc1N,IAAI+B,EAAMwK,WACJ,EAAIsB,GAAsB,EAAA,IAGxElK,GAAmB/H,EAAKE,IAEpB,IACF,IAAA,MAAWyO,KAAUqD,EAAgB,CAC7B,MAAAjN,EAAS+M,EAAc1N,IAAIuK,EAAOgC,WACpCuB,EAAoBC,IACpBD,EAAoBE,SAElBvQ,GACJkD,EACA,CACEA,SACAyL,SAAU7B,EAAOgC,UACjB9K,SAAU,CACR6G,aAAc,CAACwF,EAAoBC,IAAKD,EAAoBE,IAC5DpM,SAAUhG,EAAK6F,SAASG,SACxB2K,UAAWhC,EAAOgC,UAClB/B,kBAAmBD,EAAOC,oBAG9BmD,EAEJ,CAEAlK,GAA6BjD,IACrB,MAAAE,EAAO,IAAIlB,IAAIgB,GAEd,OADFE,EAAA+E,IAAI7J,EAAKE,IACP4E,IAETwM,GAAiBtR,EAAKE,UACfmS,GACPnQ,KAAgBmQ,EAAON,EAAO,CAC9B,QACAhK,GAAmB,KACrB,GACC,CACD5F,GACAD,GACAL,GACAyP,KAGIgB,GAAiBrD,EAAY0C,MACjC3R,EACA+E,EACAwN,KAEA,GAAIpQ,GAAmB,OACvB,GAAkB,aAAdnC,EAAK4F,OAAwBjE,GAAkB,OACnD,GAAkB,UAAd3B,EAAK4F,OAAqBhE,GAAe,OAC7C,GAAkB,SAAd5B,EAAK4F,OAAoB/D,GAAc,OAErC,MAAAkQ,EAAUhS,EAAiBC,GAC3BwS,EAAiBzN,EACjB0N,EACRF,EAEIG,EACJF,IACEG,EAAyBC,UAAA,MAErB,MAAMC,EACJJ,EAAgBnE,UAEZwE,EACJL,EAAgBlE,QAGhB,GAAY,MAAZsE,GACU,MAAVC,EAEO,OAAA,KAGT,MAAMC,EACJF,EACE7S,EAAKG,QAAQ4F,YACf+M,EACE9S,EAAKG,QAAQ4G,SAEXiM,EACJH,EACE7S,EAAKG,QAAQ4F,YACf+M,EACE9S,EAAKG,QAAQ4G,SAEb,OAAAgM,IAAaC,EACRH,EACL7S,EAAKG,QAAQ4F,WACX4M,EAAyBM,WACzBN,EAAyBO,WAG3BF,EACKL,EAAyBQ,WAG3B,MAtCc,GAwCvBX,EACIY,EACM,aAAdpT,EAAK4F,MACe,MAApBjE,IACAT,KAEEwR,IAA4BC,EAAyBQ,YACrDT,IAA4BC,EAAyBO,YACrDR,IAA4BC,EAAyBM,YACrDP,IAA4BC,EAAyBU,gBAE/CC,EAAuBF,EACzB5S,EAAS8J,UACNnK,GAAYgE,EAAoBhE,KAAagE,EAAoBnE,EAAKG,WAEzE,EAEAiT,GAA8BE,GAAwB,GAAKZ,IAC7DlK,GAA4B5D,QAAU,CACpCG,OAAQ2N,EACRY,uBAEAC,iBAAkBC,KAAKC,UACrBjT,EAAS+D,IAAI,CAACpE,EAAS8D,KAAW,CAChCyP,IAAKvP,EACHhE,EACA8D,GAEFqK,UAAWnO,EAAQ4F,WACnBwI,QAASpO,EAAQ4G,SACjB4M,QAASxT,EAAQwT,SAAW,SAIhCC,OAAO,IAIX7L,GAAmB/H,EAAKE,IAEpB,IACgB,aAAdF,EAAK4F,WACDjE,KACJoD,EACAwN,EACAR,IAEqB,UAAd/R,EAAK4F,WACRhE,KACJmD,EACAwN,EACAR,IAEqB,SAAd/R,EAAK4F,YACR/D,KACJkD,EACAwN,EACAR,IAIJlK,GAA6BjD,IACrB,MAAAE,EAAO,IAAIlB,IAAIgB,GAEd,OADFE,EAAA+E,IAAI7J,EAAKE,IACP4E,IAGH,MAAA+O,EAA8B,aAAd7T,EAAK4F,OAAwB8M,IAA4BC,EAAyBO,YAAcR,IAA4BC,EAAyBM,YAAcP,IAA4BC,EAAyBU,gBAGzO,IAD+B,aAAdrT,EAAK4F,MAAuB8M,IAA4BC,EAAyBQ,YACjFU,IAAkBnB,EAAyB,CACzD,MAAAxO,EAAaC,EAAoBnE,EAAKG,SAE5CwD,GAAuCiB,IAC/B,MAAAE,EAAO,IAAIlB,IAAIgB,GAQd,OANH4N,IAAmBG,EAAyBC,UAC9C9N,EAAK+E,IAAI3F,GAETY,EAAKI,OAAOhB,GAGPY,IAETvB,GAAgCqB,IACxB,MAAAE,EAAO,IAAIrB,IAAImB,GAOd,OALFE,EAAAT,IACHH,EACAwO,GAGK5N,GAEX,CAEA,GAAI0D,GAA4B5D,SAG9B,GAFA4D,GAA4B5D,QAAQgP,OAAQ,EAExCC,EAAe,CACjB,MAAMC,EAAcvO,GAAQP,KACzBR,GACiB,UAAhBA,EAAOoB,MACPzB,EAAoBK,EAAOrE,WAAagE,EAAoBnE,EAAKG,UAEjE2T,GAAaxE,sBAAsB,IAAMH,GAAa2E,GAC5D,OAEAxC,GAAiBtR,EAAKE,UAEjBmS,GACHe,IACF5K,GAA4B5D,QAAU,MAExC1C,KAAgBmQ,EAAON,EAAO,CAC9B,QACAhK,GAAmB,KACrB,GACC,CACD7G,GACAiB,GACAD,GACAP,GACAC,GACAC,GACAC,GACAyD,GACA/E,EACA2O,GACAmC,KAGF3M,EAAU,KACR,MAAMoP,EAAiBvL,GAA4B5D,QAC/C,IAACmP,GAAgBH,MAAO,OAcxB,GAXFJ,KAAKC,UACHjT,EAAS+D,IAAI,CAACpE,EAAS8D,KAAW,CAChCyP,IAAKvP,EACHhE,EACA8D,GAEFqK,UAAWnO,EAAQ4F,WACnBwI,QAASpO,EAAQ4G,SACjB4M,QAASxT,EAAQwT,SAAW,WAGFI,EAAeR,iBAAkB,OAE3D,MAAAS,EAAqBD,EAAehP,SAAW4N,EAAyBQ,WAC1EY,EAAeT,qBAAuB,EACtCS,EAAehP,SAAW4N,EAAyBM,YACnDc,EAAehP,SAAW4N,EAAyBU,eACnDY,KAAKC,IAAI,EAAGH,EAAeT,qBAAuB,GAClDS,EAAeT,qBACba,EAAoB,IAAI1Q,IAC5BjD,EAAS+D,IAAI,CAACpE,EAAS8D,IAAU,CAACE,EAAoBhE,EAAS8D,GAAQA,KAEnEwN,EAAalM,GAAQP,KAAMhF,IAC/B,MAAMoU,EAAeD,EAAkBxO,IAAIxB,EAAoBnE,EAAKG,UAEpE,OAAuB,MAAhBiU,GACLA,GAAgBJ,GAChBlD,GAA4B9Q,KAGhC,IAAKyR,EAGH,OAFAjJ,GAA4B5D,QAAU,UACpBoL,KAIpBV,sBAAsB,KACpB9G,GAA4B5D,QAAU,KACtCuK,GAAasC,MAEd,CACDzB,GACAc,GACAvL,GACA/E,EACA2O,KAGFxK,EAAU,KACJ6D,GAA4B5D,SAC5BsC,KAAmB3B,GAAQyE,KAAMhK,GAASA,EAAKE,KAAOgH,KACtC8I,MAEnB,CAAC9I,GAAgB8I,GAAmBzK,KAEvCZ,EAAU,KACR,IAAK1D,GAA8B,OACnC,GAAIuH,GAA4B5D,QAAS,OACzC,MAAMyP,EAAa9O,GAAQP,KAAMhF,GAASA,EAAKI,aAAe4G,IAC1DqN,GAAcA,EAAWnU,KAAOgH,OAA6BmN,IAChE,CACDnN,GACAjG,GACA+F,GACAmI,GACA5J,KAGFZ,EAAU,KACJ6D,GAA4B5D,SAE9BsC,KACC3B,GAAQyE,KACNhK,GACCA,EAAKE,KAAOgH,KAC8B,IAA1ClH,EAAKG,QAAQiK,YAAYS,eAGXmF,MAEnB,CAAC9I,GAAgB8I,GAAmBzK,KAEjC,MAAA+O,GAAoBlR,EAAQ,KAChC,MAAMmR,EAAmBhP,GAAQC,OAC9BxF,IAAmD,IAA1CA,EAAKG,QAAQiK,YAAYS,cAKjC,GAAuB,QAAvB9J,GAAqC,OAAAwT,EAEzC,MAAMC,EAA+C,CAAC,MAAO,SAAU,QACpEhP,OAAQ4E,GACPA,IAAetJ,IAEb2T,EAAkB,CAAC3T,MAAqB0T,GACxCE,EAAiB,IAAIjR,IACzBgR,EAAgBlQ,IAAI,CAAC6F,EAAYnG,IAAU,CAACmG,EAAYnG,KAG1D,OAAOsQ,EACJhQ,IAAI,CAACvE,EAAMiE,KAAW,CAAEjE,OAAMiE,WAC9BgC,KAAK,CAACC,EAAMC,KACX,MAAMwO,EAAiBzO,EAAKlG,KAAK0F,YAAY0E,YACzCvD,OACDyE,cACGsJ,EAAkBzO,EAAMnG,KAAK0F,YAAY0E,YAC3CvD,OACDyE,cAQH,OAPmC,MAAlBqJ,EACbF,EAAgBzJ,OAChB0J,EAAe/O,IAAIgP,IAAmBF,EAAgBzJ,SACrB,MAAnB4J,EACdH,EAAgBzJ,OAChB0J,EAAe/O,IAAIiP,IAAoBH,EAAgBzJ,SAE5B9E,EAAKjC,MAAQkC,EAAMlC,QAEnDM,IAAI,EAAGvE,UAAWA,IACpB,CAACe,GAAoBD,GAAkByE,KAKpCsP,GAH0BP,GAAkBhK,UAC/CtK,GAASA,EAAKE,KAAOkH,KAGjB0N,GAAsBC,IAA2BvR,EAAwB,OACzEwR,GAAsBC,IAA2BzR,EAEtD,MACI0R,GAA4B5P,GAAO,GAEnC6P,GAAwBlG,EAAahL,IACnC,MAAAO,EAAS8P,GAAkBrQ,GAC7BO,MAAqBA,IACxB,CAAC8P,GAAmBnF,KAEUF,EAAahL,IAC5C,IAAK+D,IAAmB/D,EAAQ,GAAKA,GAAS+D,GAAgB6H,MAAM7E,OAClE,OAGI,MAAA5K,EAAa4H,GAAgB6H,MAAM5L,GACvB,MAAd7D,IAEc4P,KAClB/H,GAAoBrD,GAAuB,MAAXA,EAAkBA,EAAU,IACvDA,EACHX,UAEFqE,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBvH,aACA8O,UAAW5G,GAAsB1D,YAElC,CAACoD,GAAiBgI,KAErBrL,EAAU,KAENyC,KACCkN,GAAkBtK,KAChBhK,GAASA,EAAKE,KAAOkH,KAGxBC,GAA8B,OAE/B,CAACiN,GAAmBlN,KAEvBzC,EAAU,KACRuQ,GAA0BtQ,SAAU,EACpCqQ,GAAwB,MACxBF,GACEF,IAA4B,EACxBO,OAAOP,GAA2B,GAClC,OAEL,CAACA,GAA0BP,GAAkBtJ,SAEhDrG,EAAU,KACR,IAAKuQ,GAA0BtQ,SAAmC,MAAxBkQ,GAA8B,OAElE,MAAAO,EAAU7F,OAAOC,WAAW,KAChC,MAAM6F,EAAoBjP,OAAOyO,GAAqBjO,QAChD0O,EAAiBD,EAAoB,EAGzCjP,OAAOiK,UAAUgF,IACjBC,GAAkB,GAClBA,EAAiBjB,GAAkBtJ,SAEnCkK,GAA0BtQ,SAAU,EACpCuQ,GAAsBI,KAEvB,KAEI,MAAA,IAAM/F,OAAOI,aAAayF,IAChC,CAACF,GAAuBL,GAAsBR,GAAkBtJ,SAE7D,MAAAwK,GAAiBpS,EAAQ,KACvB,MAAAqS,MAAuBhS,IAErB8B,GAAAvB,QAAShE,IACT,MAAA0V,EAAiBD,EAAiB9P,IAAIxB,EAAoBnE,EAAKG,WAAa,GAClFuV,EAAeC,KAAK3V,GACpByV,EAAiBpR,IAAIF,EAAoBnE,EAAKG,SAAUuV,KAGpD,MAAAE,MAAanS,IAWZ,OAVUgS,EAAAzR,QAAQ,CAAC0R,EAAgBxR,KACxC,MAAM2R,EAAgBhS,GAAmB8B,IAAIzB,IAAe,EAE5DwR,EACGzP,KAAK,CAACC,EAAMC,IAAUD,EAAKM,gBAAkBL,EAAMK,iBACnDxC,QAAQ,CAAChE,EAAMiE,KACP2R,EAAAvR,IAAIrE,EAAKE,GAAI,GAAG2V,IAnxCV,CAAC5R,IACtB,IAAIgI,EAAQhI,EAAQ,EAChB6R,EAAS,GAEb,KAAO7J,EAAQ,GACJA,GAAA,EACT6J,EAASV,OAAOW,aAAa,GAAM9J,EAAQ,IAAO6J,EAC1C7J,EAAAgI,KAAK+B,MAAM/J,EAAQ,IAGtB,OAAA6J,GAywCwCG,CAAehS,UAIrD2R,GACN,CAACrQ,GAAS1B,KAEPqS,GAAgB9S,EAAQ,KACtB,MAAA+S,MAAa1S,IACX8B,GAAAvB,QAAShE,IACf,MAAMmD,EAAcgT,EAAOxQ,IAAI3F,EAAKI,aAAe,GACnD+C,EAAYwS,KAAK3V,GACVmW,EAAA9R,IAAIrE,EAAKI,WAAY+C,KAExB,MAAAiT,MAAY3S,IAIX,OAHA0S,EAAAnS,QAASb,IACdA,EAAYa,QAAQ,CAAChE,EAAMiE,IAAUmS,EAAM/R,IAAIrE,EAAKE,GAAI+D,MAEnDmS,GACN,CAAC7Q,KAEE8Q,GAA0BpH,EAA6BqH,IAAkB,CAC7EhI,UAAW2F,KAAKC,IAAI,EAAGoC,EAAahI,UAAYlN,IAChDmN,QAAS0F,KAAKsC,IACZD,EAAaE,SAAW,EACxBF,EAAa/H,QAAUnN,MAEvB,CAACA,KAECqV,GAAuBxH,EAAY,KACvC,MAAMyH,EAAU/N,GAAW/D,QACrB+R,EAAa/N,GAAchE,QAC7B,IAAC8R,IAAYC,EAAY,OAEvB,MAAAC,EAAcF,EAAQpN,wBACtBuN,EAAkBF,EAAWG,cACjC,0BAEIC,EAAcF,GAAiBvN,yBACnCqN,EAAWrN,wBAEL/D,GAAAvB,QAAShE,IACf,MAAMgX,EAAQvO,GAAiB7D,QAAQe,IAAI3F,EAAKE,IAChD,IAAK8W,EAAO,OAEZ,MAAMC,EAAON,EAAWG,cACtB,kCAAkC9W,EAAKI,WAAa,OAGtD,IAAK6W,EAEH,YADAD,EAAMtU,MAAMwU,WAAa,UAIrB,MAAAC,EAAWF,EAAK3N,wBAChB8N,EAAOlB,GAAcvQ,IAAI3F,EAAKE,KAAO,EACrCmX,EAAWF,EAASG,IAAMjW,GAAwB,GAAP+V,EAC3CG,EAAcF,GAAYL,EAAMQ,cAAgB,IAChDC,EACJJ,GAAYN,EAAYO,KAAOC,GAAeR,EAAYW,OAE5DV,EAAMtU,MAAM4U,IAASD,EAAWT,EAAYU,IAA1B,KACZN,EAAAtU,MAAMwU,WAAaO,EAAyB,UAAY,WAKhE,MAAME,EAAOjP,GAAoB9D,QACjC,GAAI+S,EAAM,CACR,MAAMvX,EAAa4H,IAAiB6H,MAAM7H,GAAgB/D,OACpDgT,EAAqB,MAAd7W,EAAqB,KAAOuW,EAAWG,cAClD,kCAAkC1W,EAAa,OAG7C,GAAC4H,IAAoBiP,EAElB,CACC,MACAW,EADWX,EAAK3N,wBACGgO,IAAMjW,GACzBwW,EAAaD,GAAWD,EAAKH,cAAgB,IAC7CM,EACJF,GAAWb,EAAYO,KAAOO,GAAcd,EAAYW,OAE1DC,EAAKjV,MAAM4U,IAASM,EAAUhB,EAAYU,IAAzB,KACZK,EAAAjV,MAAMwU,WAAaY,EAAwB,UAAY,QAC9D,MAVEH,EAAKjV,MAAMwU,WAAa,QAW5B,CAKI,GAAAhQ,IAAkD,MAAhCqB,GAAqB3D,QAAiB,CAC1D,MAAMmT,EAActP,GAAiB7D,QAAQe,IAAIuB,IAC7C6Q,GAAgD,WAAjCA,EAAYrV,MAAMwU,YACnCzP,GAAkB7C,GAAYA,IAAYmT,EAAcnT,EAAUmT,EAEtE,GACC,CAAC/P,GAAiBd,GAAgB7F,GAAgB6U,GAAe3Q,KAE9DyS,GAA0B/I,EAC9BgJ,IAEA,MAAMC,EAAoB3P,GAAqB3D,QAE5CsT,GACDA,EAAkBhJ,YAAc+I,EAAM/I,WACtCgJ,EAAkB9X,aAAe6X,EAAM7X,aAKzCmI,GAAqB3D,QAAU,KACV6R,KAErBnH,sBAAsB,KAChB,GAAgC,MAAhC/G,GAAqB3D,QAAiB,OAC1C,MAAMoS,EAAQvO,GAAiB7D,QAAQe,IAAIuS,EAAkBjY,UACzD+W,GAAoC,WAA3BA,EAAMtU,MAAMwU,eAA0CF,OAEpE,CAACP,KA2CF,OAzCF9R,EAAU,KACR,MAAMgS,EAAa/N,GAAchE,QAC7B,IAAC+R,IAAe9V,GAAY,OAEhC,IAAIwO,EAAyB,KAC7B,MAAM8I,EAAyB,KACd,MAAX9I,IACJA,EAAUC,sBAAsB,KACpBD,EAAA,KACWoH,SAIdE,EAAAyB,iBAAiB,SAAUD,GAAwB,GACvD3I,OAAA4I,iBAAiB,SAAUD,GAE5B,MAAAE,EAAmB,IAAIC,iBAAiBH,GAC9CE,EAAiB5O,QAAQkN,EAAY,CACnC4B,WAAW,EACXC,SAAS,EACTC,YAAY,EACZC,gBAAiB,CAAC,WAGpB,MAAMnP,EAA2C,oBAAnBC,eAC1B,KACA,IAAIA,eAAe2O,GAKvB,OAJA5O,GAAgBE,QAAQkN,GAEDwB,IAEhB,KACU,MAAX9I,GAAiBM,qBAAqBN,GAC/BsH,EAAAgC,oBAAoB,SAAUR,GAAwB,GAC1D3I,OAAAmJ,oBAAoB,SAAUR,GACrCE,EAAiB3O,aACjBH,GAAgBG,eAEjB,CAAC7I,GAAY4V,KAGdmC,EAAC,MAAA,CACCC,IAAKlQ,GACLlG,aACAC,MAAO,IACFA,GACHoW,QAAS,QACTC,SAAU,WACV9P,MAAO,OACP+P,OAAQ,OACRC,SAAU,EACVC,UAAW,OACXC,UAAW,UAGbC,SAAA,CAAAR,EAAC,MAAA,CACCnW,UAAU,oCACVC,MAAO,CACLoW,QAAS,OACTO,WAAY,UACZ7N,IAAK,EACLvC,MAAO,OACPgQ,SAzmDsB,IA0mDtBD,OAAQ,QAGZI,SAAA,CAAAE,EAAC,MAAA,CACCT,IAAKjQ,GACLlG,MAAO,IACFC,GACH4W,KAAM,WACNtQ,MAAOpI,GAAa,OAAS,OAC7BoY,SAAU,EACVD,OAAQ,OACRQ,UAAW,cAGbJ,SAAAE,EAACG,EAAA,CACCC,cAAe,GACfC,eAAgB,CAAC,EACjBC,wBAAyB,GACzBC,gBAAgB,EAChBC,kBAAkB,KACdnZ,EACJoZ,kBAEM,IADJnZ,EACID,GAAgBoZ,cAAgBna,EAAiBC,QACjDH,EAA+BkB,GAErCwB,yBACAC,uBACA/B,SACAC,UACAC,SAAUkG,GACVgB,qBACAsS,oBAAqBhC,GACrBiC,eAAgB5D,GAChBpU,oBAAsB7B,IACpB6G,GAAe7G,GAEmB,MAAhCmI,GAAqB3D,SACrBkF,IACAA,GAAa1J,aAAeA,GAEV4P,KAEpB/N,KAAsB7B,QAK3BS,IACC+X,EAAC,QAAA,CACC,aAAW,qBACXC,IAAKxT,GACL3C,MAAO,IACFE,GACHmW,SAAU,WACV9P,MAAOC,GACPgR,SAAU1a,EACV+Z,KAAM,OAAOrQ,KACbiR,UAAW,EACXC,SAAU,SACVZ,UAAW,cAIZJ,SAAA,CACCpR,IAAAsR,EAAC,OAAA,CACCT,IAAKnQ,GACLhG,MAAO,CACLqW,SAAU,WACVzB,IAAK,EACLpR,KAAM,GACNgR,WAAY,SACZmD,OAAQ,EACRvB,QAAS,cACTO,WAAY,SACZiB,eAAgB,SAChB9O,IAAK,EACL2O,UAAW,GACXI,QAAS,UACTC,OAAQ,oBACRC,aAAc,GACdC,gBAAiB,UACjBlB,UAAW,aACXmB,UAAW,mCACXC,KAAM,WAGRxB,SAAAR,EAACiC,EAAA,CACCC,WAAY,QACZC,GAAI,CAAEC,SAAU,GAAIC,WAAY,IAAKC,MAAO,UAAWC,WAAY,UAElE/B,SAAA,CAAApR,GAAgBpB,OAAS,QAAQ,QAAMoB,GAAgB/D,MAAQ,OAMrEjD,IAAuBsT,GAAkBtJ,OAAS,IAAMhD,IACvD4Q,EAAC,MAAA,CACC,aAAW,0BACXlW,MAAO,CACLqW,SAAU,WACVzB,IAAK,EACLnR,MAAO7E,IAAsC,OAC7C4E,KAAM3E,IAAoC,OAC1C8Y,OAAQ,EACRvB,QAAS,OACTO,WAAY,SACZ7N,IAAK,EACLvC,MAAO,IACPkR,UAAW,GACXI,QAAS,UACTC,OAAQ,oBACRC,aAAc,EACdC,gBAAiB,UACjBlB,UAAW,aACXmB,UAAW,mCACXC,KAAM,WAGRxB,SAAA,CAAAE,EAAC8B,EAAA,CACCzU,MAAgC,iBAAzBqO,GACH,iDACA,6BACJqG,KAA8B,MAAxBrG,GACNsG,UAAU,MACVC,OAAK,EAELnC,SAAAE,EAAC,QAAA,CACCjO,KAAK,OACLmQ,UAAU,UACVC,QAAQ,SACRxP,MAAO6I,IAAwB,IAC/ByB,IAAK,EACLrC,IAAKI,GAAkBtJ,OACvB,aAAW,sBACX,eAAsC,MAAxBgK,GACd0G,QAAS,KACqB,MAAxB5G,IAA8BC,GAAwB,KAE5D4G,OAAQ,KACN1G,GAAwB,MAClB,MAAA2G,EAAevV,OAAOyO,KAEF,MAAxBA,IACyB,KAAzBA,KACCzO,OAAOiK,UAAUsL,IAClBA,EAAe,GACfA,EAAetH,GAAkBtJ,UAEjCkK,GAA0BtQ,SAAU,EACpCmQ,GACEF,IAA4B,EACxBO,OAAOP,GAA2B,GAClC,QAIVgH,SAAW5D,IACH,MAAA6D,EAAa7D,EAAM8D,OAAO9P,MAChC,IAAK,QAAQ+P,KAAKF,GAEhB,YADA7G,GAAwB,kBAIpB,MAAA2G,EAAevV,OAAOyV,GACtBG,EAA8B,KAAfH,IACnBF,EAAe,GAAKA,EAAetH,GAAkBtJ,QAE/BiK,GAAAgH,EAAe,eAAiB,MACxD/G,GAA0BtQ,SAAU,EACpCmQ,GAAwB+G,IAE1BpZ,MAAO,CACLuG,MAAO,GACP+P,OAAQ,GACRuB,QAAS,EACTC,OAAQ,cAAaxF,GAAuB,UAAY,WACxDyF,aAAc,EACdS,MAAO,UACPR,gBAAiB,UACjBwB,UAAW,SACXtB,KAAM,UACNI,SAAU,GACVmB,QAAS,YAIfvD,EAAC,OAAA,CACC,aAAY,GAAGtE,GAAkBtJ,iBACjCtI,MAAO,CACL6W,KAAM,EACN2B,MAAO,UACPF,SAAU,GACVG,WAAY,SACZe,UAAW,UAEd9C,SAAA,CAAA,MACK9E,GAAkBtJ,UAEtB,CAAC,WAAY,QAAkBzG,IAAK6X,IACpC,MAAMC,EAA2B,aAAdD,EACbE,EAAczH,IAA4BwH,GAAkB,EAAA,GAC5DE,EAAaD,EAAc,GAAKA,GAAehI,GAAkBtJ,OAGrE,OAAAsO,EAAC,SAAA,CAECjO,KAAK,SACL,cAAegR,EAAa,WAAa,QAA7B,gBACZG,SAAUD,EACVE,QAAS,IAAMtH,GAAsBmH,GACrC5Z,MAAO,CACLoW,QAAS,OACT4D,WAAY,SACZzT,MAAO,GACP+P,OAAQ,GACRuB,QAAS,EACTC,OAAQ,EACRmC,WAAY,cACZzB,MAAOqB,EAAa,UAAY,UAChCK,OAAQL,EAAa,UAAY,WAGnCnD,SAAAE,EAAC,OAAIrQ,MAAM,KAAK+P,OAAO,IAAI6D,QAAQ,WAAWC,KAAK,OACjD1D,SAAAE,EAAC,OAAA,CACCyD,EAAGV,EAAa,gBAAkB,gBAClCW,OAAO,eACPC,YAAY,MACZC,cAAc,QACdC,eAAe,aAvBdf,SAgCbpU,IAAmBzC,GAAQhB,IAAKvE,IAC1B,MAAAod,EAAWlW,KAAmBlH,EAAKE,GACnC0G,EAAQ4O,GAAe7P,IAAI3F,EAAKE,KAAO,KACvCiK,EAAQnK,EAAK0F,YAAYyE,MACzBC,EAAapK,EAAK0F,YAAY0E,WAC9BiT,EAAeC,EAAYnT,EAAOC,GAClCmT,EAAsC,aAAdvd,EAAK4F,KAC/B8F,EACE1L,EAAK0F,YACL1F,EAAKG,QACLmD,GAA4BqC,IAAIxB,EAAoBnE,EAAKG,WAE7C,UAAdH,EAAK4F,KACLgG,EACE5L,EAAK0F,YACL1F,EAAKG,QACLmD,GAA4BqC,IAAIxB,EAAoBnE,EAAKG,WAE3D,KACEqd,EAAaD,IACA,QAAjBF,EAAyBA,EAAe,GAAGA,MAEvCI,GAA0D,IAA1Czd,EAAKG,QAAQiK,YAAYS,aACzC6S,EAAmB9S,EACvBT,EACAC,EACAqT,GAEIE,EAAahU,GAAkBvF,IAAIpE,EAAKE,IAG5C,OAAAoZ,EAAC8B,EAAA,CAECzU,MAAO8W,EAAgB,0BAA4B,GACnDlC,OAAK,EAELnC,SAAAE,EAAC,OAAA,CACCT,IAAM+E,IACAA,EAA0BnV,GAAA7D,QAAQP,IAAIrE,EAAKE,GAAI0d,GAC7BnV,GAAA7D,QAAQM,OAAOlF,EAAKE,KAE5CwC,MAAO,CACLqW,SAAU,WACVzB,IAAK,EACLpR,KAAM,GACNgR,WAAY,SACZ4B,QAAS,cACT8D,OAlBWa,EAkBU,cAAgB,WAGvCrE,SAAAE,EAAC,SAAA,CACCkD,SAtBWiB,EAuBXpS,KAAK,SACL,eAAc+R,EACd,aAAYK,EACR,GAAGzd,EAAK0F,YAAY2F,eAAerL,EAAKI,uCACxC,GAAGJ,EAAK0F,YAAY2F,eAAerL,EAAKI,aAC5Cqc,QAAS,IAAMtN,GAAanP,GAC5B0C,MAAO,CACLka,OAAQ,UACR9D,QAAS,OACTO,WAAY,SACZiB,eAAgB,eAChB9O,IAAK,EACLvC,MAAOsU,EACFI,IAAeF,EAAgB,IAAM,GACrCE,IAAeF,EAAgB,IAAM,GAC1CtD,UAAW,GACXI,QAAS,UACTC,OAAQ,aAAamD,IAAeF,EAAgB,UAAYC,EAAiBlD,SACjFC,aAAc,GACdC,gBAAiBiD,IAAeF,EAAgB,UAAYC,EAAiBf,WAC7EzB,MAAOyC,IAAeF,EAAgB,UAAYC,EAAiBvS,KACnEyP,KAAM,UACNiD,aAAc,SACdlD,UAAW,oCAGhBvB,SACER,EAAAiC,MADa4C,EACb,CAAW3C,WAAY,QAASC,GAAI,CAAEjC,QAAS,OAAOtN,IAAI,EAAG6N,WAAY,SAAUyE,cAAe,OACjG1E,SAAA,CAACE,EAAA,OAAA,CAAK5W,MAAO,CAAEsY,SAAU,GAAIC,WAAY,KAAQ7B,SAAMxS,IACvDgS,EAAC,QAAKlW,MAAO,CAAEoW,QAAS,OAAQO,WAAY,UAAYD,SAAA,CAAAE,EAAC,OAAIrQ,MAAM,IAAI+P,OAAO,KAAK6D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BACtH3E,SAAAE,EAAC,QAAKyD,EAAE,iBAAiBC,OAAQ,UAAWC,YAAY,UAEvD3D,EAAA,OAAA,CAAK5W,MAAO,CAAEsY,SAAU,GAAIC,WAAY,IAAK+C,WAAY,MAAOlF,QAAS,OAAQO,WAAY,UAAaD,SAAWoE,OAGvH5E,EAAA,OAAA,CAAKlW,MAAO,CAAEsY,SAAU,GAAIC,WAAY,IAAKnC,QAAS,OAAQO,WAAY,UACzED,SAAA,CAAAE,EAAC,OAAIrQ,MAAM,IAAI+P,OAAO,KAAK6D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BAC9D3E,SAAAE,EAAC,QAAKyD,EAAE,iBAAiBC,OAAQ,UAAWC,YAAY,UAE1D3D,EAAC,QAAK5W,MAAO,CAAEoW,QAAS,OAAQkF,WAAY,MAAO3E,WAAY,UAAYD,SAACE,EAAA2E,EAAA,CAAYjF,OAAQ,GAAI/P,MAAO,GAAIgU,YAAa,EAAG/B,MAAM,mBAI7H,CAAAJ,WAAY,QAASC,GAAI,CAAEjC,QAAS,OAAQtN,IAAK,EAAG6N,WAAY,SAAUyE,cAAe,OACnG1E,SAAA,CAACE,EAAA,OAAA,CAAK5W,MAAO,CAAEsY,SAAU,GAAIC,WAAY,KAAQ7B,SAAMxS,IACvDgS,EAAC,QAAKlW,MAAO,CAAEoW,QAAS,OAAQO,WAAY,UAAYD,SAAA,CAACE,EAAA,MAAA,CAAIrQ,MAAM,IAAI+P,OAAO,KAAK6D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BACtH3E,SAACE,EAAA,OAAA,CAAKyD,EAAE,iBAAiBC,OAAQU,EAAiBQ,QAASjB,YAAY,UAEtE3D,EAAA,OAAA,CAAK5W,MAAO,CAAEsY,SAAU,GAAIC,WAAY,IAAK+C,WAAY,MAAOlF,QAAS,OAAQO,WAAY,UAAaD,SAAWoE,eApEvHxd,EAAKE,YAiFnB4J,IAAgBtC,IACfoR,EAACuF,EAAA,CACC3W,iBACA8T,UAAU,eACV8C,OAAQ,CAAE9G,IAAK,GACfrO,MAAOgL,KAAKsC,IAAI1N,GAAYrJ,GAC5B0a,SAAU1a,EACVkC,aAAcA,IAAgB,GAE7B0X,SAAA,CACC9R,IAAAgS,EAAC+E,EAAA,CACCpV,MAAM,OACNiR,SAAS,OACT/P,MAAOL,GAAapE,YAAYyE,MAChCY,QAASD,GACTS,OAAQzB,GAAapE,YAAY6F,OACjCC,IAAK1B,GAAapE,YAAY8F,IAC9B8S,OAAQ,IAAM/W,IAA4B,GAC1CgX,QAASvO,KAGZsJ,EAAA,MAAA,CAAI5W,MAAO,CAAEoW,QAASxR,GAA2B,OAAS,SACxD8R,SAAAzP,GAAkBvF,IAAI0F,GAAa5J,IAClCoZ,EAACkF,EAAA,CACCvV,MAAM,OACNiR,SAAS,OACTuE,WAAkC,SAAtB3U,GAAalE,KACrB,uBAC4B,UAA5B6F,GACE,iBAC4B,WAA5BA,GACE,iBACA,gBACRiT,WAAkC,SAAtB5U,GAAalE,OACpB+Y,EAAM,CAAAxV,KAAM,GAAI8T,YAAa,IACF,WAA5BxR,GACE6N,EAACsF,GAASzV,KAAM,GAAI8T,YAAa,IACL,UAA5BxR,GACE6N,EAACuF,GAAoB5V,MAAO,GAAI+P,OAAQ,KACvCM,EAAA2E,EAAA,CAAY9U,KAAM,GAAI8T,YAAa,IAC5CtW,MAAOgG,GACPmS,OAAQ,QAAQhV,GAAa3J,QAAQ4F,cAAc+D,GAAa3J,QAAQ4G,WACxEmH,QAASa,IAAoBX,GAC3BkL,EAACyF,EAAA,CAECC,KAAO1F,EAAA2E,EAAA,CAAY9U,KAAM,GAAI8T,YAAa,IAC1CtW,MAAOgG,GACPsS,UAAW,QAAQnV,GAAa3J,QAAQ4F,cAAc+D,GAAa3J,QAAQ4G,WAC3EmY,YAAa/Q,IAA2B,KACxCgR,WAAY/Q,GACZgR,gBAAuC,SAAtBtV,GAAalE,MAAmBiJ,GAAoC,MAAZ9M,KAAqB8M,GAC9FwQ,oBAAoB,EACpBtd,SAAU4P,UACJ,GAAsB,SAAtB7H,GAAalE,KAAiB,CAChC,IAAK9D,IAA2D,IAAvC2M,GAA4BzD,OAAc,CACjE,MAAMqH,EAAQ,IAAIiN,MAChB,wHAGI,MADUpd,KAAAmQ,EAAOtS,EAAiB+J,KAClCuI,CACR,CAEA,IAAIkN,EACJ,IAAA,MAAWpP,KAAoB1B,GAC7B8Q,QAAezd,GACb,CACE8M,kBAAmBuB,EACnBqP,cAAe,MAEjBzf,EAAiB+J,KAGd,OAAAyV,CACT,CAEA,IAAKxd,GACH,MAAM,IAAIud,MACR,8EAIJ,IAAK1R,GACH,MAAM,IAAI0R,MACR,uDAIE,MAAAG,EACJ9R,GACI,WACsB,UAAtB7D,GAAalE,KACX,QACsB,aAAtBkE,GAAalE,KACX,WACA,KAEJ8Z,EACJ3S,GAAoBa,GAAiBvC,MAGrC,GAAAoU,GACAC,IAAqBD,EAErB,MAAM,IAAIH,MACR,cAAcI,GAAoB,uDAAuDD,MAItF,OAAA1d,GACL6L,GACA7N,EAAiB+J,MAGrB6V,cAAgBtN,IACEnQ,KAAAmQ,EAAOtS,EAAiB+J,MAE1C8V,iBAAmBL,IACjB1X,GACE,QAAUjE,KAGc,SAAtBkG,GAAalE,OACfjC,GACE,QAAUC,KAEZL,GACE,QAAUE,MAGWqG,GAAa5J,GAEtC,MAAM2f,EAAkBzR,GAAiBI,iBAAiB,IACxDJ,GAAiBC,eACbyR,EAAatY,IAAe8B,wBAC5ByW,EAAanX,GAAchE,SAAS0E,wBACpC0W,EAAa/L,KAAKsC,IACtB/W,EACAyU,KAAKC,IAAI,IAAKrL,KAEVoX,EAAgBH,GAAY5Z,OAC9B6Z,GAAY5Z,OAASqJ,OAAO0Q,WAAaF,EAAa,GAAK,EACzDG,EAAYlM,KAAKC,IACrB,EACAD,KAAKsC,IAAI0J,EAAezQ,OAAO0Q,WAAaF,EAAa,IAErDI,EAAiC,MAAtBN,GAAYpI,OACzBzD,KAAKC,IAAI,EAAG6L,GAAYzI,KAAO,GAC/BwI,EAAWpI,OAAS,EACI7P,GAAA,IAAU,IAAAjE,KACZ,SAAtBkG,GAAalE,OACf4C,GAA4B5D,QAAU,MAExCyD,IAAwB,GACPF,GAAA,CACfxB,MAAmC,UAA5B8E,GACH,iBAC4B,WAA5BA,GACE,iBACA,oBACNyT,YAAaK,GAAQc,SAASxZ,QAAU,KACxC1G,QAAS0f,EACT9G,SAAU,CACRzB,IAAK8I,EACLla,KAAMia,EACNlX,MAAO+W,KAGOhQ,OA3HflG,GAAa5J,SA8HlB,EACJogB,kBAAmBhU,GACjBgN,EAACiH,EAAA,CACC1a,SAAUyG,GAAqBzG,SAC/B2a,aAAc1W,GAAa3J,QAAQqM,oBAAiB,EACpD8B,UAAWxE,GAAa3J,QAAQ4F,WAChCwI,QAASzE,GAAa3J,QAAQ4G,SAC9BJ,MAAOgG,GACPlC,wBACAC,oBACA8R,SACEra,KACCR,IACDmG,KAAoBgC,GAAa5J,GAEnCugB,UAAW,CAAC1b,EAAQwN,KACbD,GAAehG,GAAsBvH,EAAQwN,WAGpD,EACJmO,eAAgB5W,GAAapE,YAAYyE,MACzCzJ,OAAQ,CACNigB,KAAM,CAAEC,YAAa,WACrBC,OAAQ,CACN,8CAA+C,CAC7C3F,MAAO,aAIb1Y,iBAAkByI,GACd,KACA1D,IAA4B,GACT/E,KAAAzC,EAAiB+J,WAEpC,EACJyU,QAASvO,KAEW,aAAtBlG,GAAalE,KACb0T,EAACwH,EAAA,CAEC7X,MAAM,OACNiR,SAAS,OACTzZ,aACAkG,MAAOmD,GAAa3J,QAAQyG,OAASkD,GAAa3J,QAAQwG,MAC1DmY,OAAQ,QAAQhV,GAAa1J,aAC7B2gB,QAASjX,GAAapE,YAAYsb,UAAY,KAC9CC,cAAehT,GACfyS,eAAgB5W,GAAapE,YAAYyE,MACzCtE,SAAUiE,GAAajE,SACvB2a,aAAc1W,GAAa3J,QAAQqM,oBAAiB,EACpD/B,wBACAC,oBACAjJ,aAAcA,IAAgB,wBAC9Byf,iBAAkBpX,GAAa3J,QAAQ4F,WACvCob,eAAgBrX,GAAa3J,QAAQ4G,SACrCrG,OAAQ,CACNigB,KAAM,CACJC,YAAajW,GAAmByW,YAElCP,OAAQ,CACN,8CAA+C,CAC7C3F,MAAOvQ,GAAmBQ,QAIhCiU,gBACEjd,KACCR,IACDmG,KAAoBgC,GAAa5J,GAEnCugB,UAAW,CAACY,EAAgBC,EAAQ/O,KAC9BA,GAAWgP,EAAuBD,EAAOphB,KACtCoS,GAAexI,GAAcwX,EAAOphB,GAAIqS,IAGjDhQ,iBAAkB,IAAMA,KAAmBxC,EAAiB+J,KAC5DtH,iBAAkByI,GACd,KACA1D,IAA4B,GACT/E,KAAAzC,EAAiB+J,WAEpC,EACJyU,QAASvO,IA3CJlG,GAAa5J,IA6CI,UAAtB4J,GAAalE,KACf0T,EAACkI,EAAA,CAECvY,MAAM,OACNiR,SAAS,OACTvT,MACEmD,GAAajE,SAAS4b,eACtB3X,GAAa3J,QAAQyG,OACrBkD,GAAa3J,QAAQwG,MAEvBmY,OAAQ,SAAShV,GAAa3J,QAAQ4F,cAAc+D,GAAa3J,QAAQ4G,WACzEga,QAASjX,GAAapE,YAAYsb,UAAY,KAC9CC,cAAehT,GACfyS,eAAgB5W,GAAapE,YAAYyE,MACzCtE,SAAUiE,GAAajE,SACvBnF,OAAQ,CACNigB,KAAM,CACJC,YAAajW,GAAmByW,YAElCP,OAAQ,CACN,8CAA+C,CAC7C3F,MAAOvQ,GAAmBQ,QAIhCiU,gBACEjd,KACCP,IACDkG,KAAoBgC,GAAa5J,GAEnCwhB,oBAAqB3X,GACrB4X,oBAAqB5X,GACjB,gEACA,EACJ6X,gBAAiB,CAAC7c,EAAQwN,KACnBD,GAAexI,GAAc/E,EAAQwN,IAE5ChQ,iBAAkB,IAAMA,KAAmBxC,EAAiB+J,KAC5DtH,iBAAkByI,GACd,KACA1D,IAA4B,GACT/E,KAAAzC,EAAiB+J,WAEpC,EACJyU,QAASvO,IA1CJlG,GAAa5J,IA4C6B,IAA/C4J,GAAajE,SAAS6I,cAAc1D,OACtCsO,EAACuI,EAAA,CAEC5Y,MAAM,OACNiR,SAAS,OACTvT,MAAOmD,GAAa3J,QAAQyG,OAASkD,GAAa3J,QAAQwG,MAC1DmY,OAAQ,QAAQhV,GAAa1J,aAC7B2gB,QAASjX,GAAapE,YAAY6F,OAClCsG,QAAS/H,GAAajE,SAAS6I,aAC/BgS,eAAgB5W,GAAapE,YAAYyE,MACzCzJ,OAAQ,CACNigB,KAAM,CACJC,YAAajW,GAAmByW,YAElCP,OAAQ,CACN,8CAA+C,CAC7C3F,MAAOvQ,GAAmBQ,QAIhCiU,gBACEjd,KACCN,IACDiG,KAAoBgC,GAAa5J,GAEnCugB,UAAY7O,IACLF,GAAwB5H,GAAc8H,IAE7CpP,iBAAkByI,GACd,KACA1D,IAA4B,GACT/E,KAAAzC,EAAiB+J,WAEpC,EACJyU,QAASvO,IAhCJlG,GAAa5J,IAmCpBoZ,EAACwI,EAAA,CAEC7Y,MAAM,OACNiR,SAAS,OACTvT,MAAOmD,GAAa3J,QAAQyG,OAASkD,GAAa3J,QAAQwG,MAC1DmY,OAAQ,QAAQhV,GAAa1J,aAC7B2gB,QAASjX,GAAapE,YAAY6F,OAClCmV,eAAgB5W,GAAapE,YAAYyE,MACzCqG,SAAU1G,GAAajE,SAAS8K,UAChC9K,SAAUiE,GAAajE,SACvBnF,OAAQ,CACNigB,KAAM,CACJC,YAAajW,GAAmByW,YAElCP,OAAQ,CACN,8CAA+C,CAC7C3F,MAAOvQ,GAAmBQ,QAIhCiU,gBACEjd,KACCN,IACDiG,KAAoBgC,GAAa5J,GAEnC0hB,gBAAiB,CAAC7c,EAAQwN,KACnBD,GAAexI,GAAc/E,EAAQwN,IAE5C/P,iBAAkByI,GACd,KACA1D,IAA4B,GACT/E,KAAAzC,EAAiB+J,WAEpC,EACJyU,QAASvO,IAjCJlG,GAAa5J,SAuC3BgI,MACE6Z,EACC,CAAA3I,SAAAE,EAAC0I,EAAA,CACC,YAAU,SACVjH,GAAI,CACFhC,SAAU,QACVzB,IAAKpP,GAAc6Q,SAASzB,IAC5BpR,KAAMgC,GAAc6Q,SAAS7S,KAC7BmU,OAAQ,KACRpR,MAAOf,GAAc6Q,SAAS9P,MAC9BiR,SAAU,qBACV+H,QAAS7Z,GAAuB,EAAI,EACpC8Z,UAAW9Z,GACP,gBACA,mBACJ+Z,WAAY,2CACZ3c,OAAQ,kDACR4c,cAAeha,GAAuB,OAAS,QAGjDgR,SAAAE,EAAC+I,EAAA,CACC1b,MAAOuB,GAAcvB,MACrBuY,YAAahX,GAAcgX,YAC3BoD,SAAU,IAAM1R,GAAsB1I,GAAc/H,iBAOlE"}
|
|
1
|
+
{"version":3,"file":"SegmentReviewPdfWrapper.js","sources":["../../../src/features/SegmentReviewComponents/SegmentReviewPdfWrapper.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n} from 'react';\nimport { SpecialZoomLevel, type SetRenderRange } from '@react-pdf-viewer/core';\nimport PdfViewer, {\n type PdfNavigationRequest,\n type PdfNavigationSettledEvent,\n type PdfViewerProps,\n} from '../PdfViewer/PdfViewer';\nimport BoundaryCard, {\n BoundaryReviewActionEnum,\n isBoundaryReviewAction,\n type BoundaryReviewAction,\n type BoundaryReviewConfirmDetails,\n} from './BoundaryCard';\nimport CardWrapper from './CardWrapper';\nimport CognitiveIntegrity from './CognitiveIntegrity';\nimport LabelCheck, {\n type LabelReviewAction,\n type LabelReviewConfirmDetails,\n} from './LabelCheck';\nimport PageCheck, {\n PageCheckActionEnum,\n type PageCheckAction,\n type PageCheckConfirmDetails,\n type PageCheckPageType,\n} from './PageCheck';\nimport PageTypeChoiceCheck from './PageTypeChoiceCheck';\nimport {\n extractSegmentReviewData,\n getSegmentReviewKey,\n type ExtractedBoundaryReview,\n type ExtractedLabelReview,\n type ExtractedPageReview,\n type SegmentRevertInfo,\n type SegmentReviewSource,\n} from './reviewStepAdapters';\nimport { Check, CircleCheck, GitMerge } from 'lucide-react';\nimport { Box, Portal, Stack, Tooltip, Typography } from '@mui/material';\nimport ReviewedCard from './ReviewedCard';\nimport ReviewedBoundaryActions from './ReviewedBoundaryActions';\nimport RevertCard, {\n type RevertActionResult,\n type RevertData,\n type SegmentData,\n} from './RevertCard';\n\nimport SaveAsLearningCard, { type SaveAsLearningResult } from './SaveAsLearningCard';\nimport RevertSuccessCard from './RevertSuccessCard';\nimport {\n formatScore,\n getBoundaryReviewActionBadgeLabel,\n getConfidenceColors,\n getOptimisticMergeImpactedSegmentKeys,\n getPendingMergeImpactedSegmentKeys,\n getReviewScoreBand,\n getResolvedScore,\n getTitleReviewActionBadgeLabel,\n hasPolledStructuralAction,\n isReviewStepResolved,\n isReviewStepResolutionCurrent,\n shouldHideStructuralBoundaryReview,\n} from './helper';\nimport ChartBreakoutCircle from './ChartBreakoutCircle';\nimport ApprovalDescriptionBanner from './ApprovalDescriptionBanner';\n\ntype ForwardedPdfViewerProps = Partial<Omit<\n PdfViewerProps,\n | 'pdfUrl'\n | 'pdfName'\n | 'segments'\n | 'onCurrentPageChange'\n | 'navigationRequest'\n | 'onNavigationSettled'\n | 'renderPage'\n | 'setRenderRange'\n>>;\n\ntype ReviewItem =\n | (ExtractedBoundaryReview<SegmentReviewSource> & {\n kind: 'boundary';\n pageNumber: number;\n })\n | (ExtractedLabelReview<SegmentReviewSource> & {\n kind: 'label';\n pageNumber: number;\n })\n | (ExtractedPageReview<SegmentReviewSource> & {\n kind: 'page';\n pageNumber: number;\n });\n\ntype RevertSuccessState = {\n title: string;\n description: string | null;\n segment: SegmentData;\n position: {\n top: number;\n left: number;\n width: number;\n };\n};\n\nconst REVIEW_CARD_MAX_WIDTH = 260;\nconst REVIEW_LAYOUT_MIN_WIDTH = 700;\nconst BOUNDARY_TITLE_CHECK_BYPASS_SCORE = 85;\n\nexport type ReviewConfidence = 'low' | 'medium' | 'high';\nexport type ReviewConfidenceFilter = 'low' | 'high' | 'all';\nexport type ReviewRedirectionType = 'boundary' | 'label' | 'page' | 'pageGroup';\n\nexport enum SegmentPdfSpecialZoomLevel {\n ActualSize = 'ActualSize',\n PageFit = 'PageFit',\n PageWidth = 'PageWidth',\n}\n\nexport interface SelectedBadgeData {\n reviewId: string;\n segment_id: string | null;\n reviewStepIndex: number;\n kind: 'boundary' | 'label' | 'page';\n pageNumber: number;\n metadata: Record<string, any>;\n}\n\nconst SEGMENT_PDF_SPECIAL_ZOOM_LEVEL: Record<\n SegmentPdfSpecialZoomLevel,\n SpecialZoomLevel\n> = {\n [SegmentPdfSpecialZoomLevel.ActualSize]: SpecialZoomLevel.ActualSize,\n [SegmentPdfSpecialZoomLevel.PageFit]: SpecialZoomLevel.PageFit,\n [SegmentPdfSpecialZoomLevel.PageWidth]: SpecialZoomLevel.PageWidth,\n};\n\nexport interface SegmentReviewActionContext {\n reviewId: string;\n segment: SegmentReviewSource;\n pageNumber: number;\n}\n\nexport interface PageTypeRevertDetails {\n classification_id: string;\n human_verdict: 'No';\n}\n\nexport interface RedirectionData {\n /** Change for every redirect request, including repeated redirects to the same badge. */\n requestKey?: string | number;\n pageNumber?: string;\n type?: ReviewRedirectionType;\n /** Stable backend segment id used to disambiguate reviews on the same page. */\n segmentId?: string;\n /** Exact review id returned by the wrapper, if the parent has it. */\n reviewId?: string;\n /** Stable backend page_classifications[].questions[].id for page-type redirects. */\n classificationId?: string;\n /** Optional page-type disambiguation when table/drawing checks share a page. */\n pageType?: string;\n\n /** type: 'pageGroup' only — ordered pages to step through, e.g. a segment's tabular pages. */\n pages?: number[];\n /** type: 'pageGroup' only — which page in `pages` to land on first. Defaults to 0. */\n pageIndex?: number;\n /** type: 'pageGroup' only — short label for the floating pill, e.g. \"Tabular\". */\n groupLabel?: string;\n}\n\nexport interface SegmentReviewPdfWrapperProps {\n pdfUrl: string;\n pdfName?: string;\n /** Live backend segments. Changes are re-extracted automatically. */\n segments: readonly SegmentReviewSource[];\n pdfViewerProps?: ForwardedPdfViewerProps;\n totalPages?: number;\n /** Special PDF zoom mode. Defaults to PageFit. */\n specialZoomLevel?: SegmentPdfSpecialZoomLevel;\n heightBuffer?: number;\n showBadges?: boolean;\n /** @deprecated Reviewed steps are always hidden from badges and navigation. */\n showResolvedBadges?: boolean;\n /** Confidence group placed first in the badge navigator. */\n sortByConfidence?: ReviewConfidence;\n /** Only render and navigate badges matching this confidence. */\n filterByConfidence?: ReviewConfidenceFilter;\n showBadgeNavigation?: boolean;\n autoSelectReviewOnPageChange?: boolean;\n autoAdvanceAfterConfirm?: boolean;\n /** Restrict post-confirm auto-advance to pending reviews in this score band. */\n autoAdvanceScoreBand?: ReviewConfidence;\n /** Number of PDF page layers mounted before and after the visible range. */\n badgePreloadPages?: number;\n /** Vertical badge offset from the page's top-right edge. */\n badgeOffsetTop?: number;\n /** Horizontal inset from the external badge rail's right edge. */\n badgeOffsetRight?: number;\n badgeOffsetLeft?: number;\n initialReviewId?: string;\n\n onBoundaryAction?: (\n action: BoundaryReviewAction,\n details: BoundaryReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onLabelAction?: (\n action: LabelReviewAction,\n details: LabelReviewConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n onPageAction?: (\n action: PageCheckAction,\n details: PageCheckConfirmDetails,\n context: SegmentReviewActionContext\n ) => void | Promise<void>;\n /**\n * Revert a confirmed page-type decision by submitting `human_verdict: \"No\"`.\n * Refresh the latest classifications before resolving this callback.\n */\n onPageTypeRevert?: (\n details: PageTypeRevertDetails,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n /**\n * Submit the operation-level revert, poll it to completion, and refresh the\n * latest segments before resolving this callback. `revert` is null when the\n * current segment does not include revert metadata.\n */\n onRevert?: (\n revert: SegmentRevertInfo | null,\n context: SegmentReviewActionContext\n ) => void | RevertActionResult | Promise<void | RevertActionResult>;\n\n /**\n * Persist a confirmed review decision as an instant-learning example.\n * The wrapper supplies the operation id (when available) and review\n * context; the host owns the instant-learning id, auth token, and the\n * actual request.\n */\n onSaveAsLearning?: (\n details: { operationId: string | null },\n context: SegmentReviewActionContext\n ) => void | SaveAsLearningResult | Promise<void | SaveAsLearningResult>;\n\n /** Called when a badge is selected, with its complete source segment. */\n onActiveReviewChange?: (\n reviewId: string | null,\n segment: SegmentReviewSource | null\n ) => void;\n onBadgeSelected?: (data: SelectedBadgeData) => void;\n onCurrentPageChange?: (pageNumber: number) => void;\n onActionError?: (error: unknown, context: SegmentReviewActionContext) => void;\n onAdjustManually?: (context: SegmentReviewActionContext) => void;\n onCognitiveClick?: (context: SegmentReviewActionContext) => void;\n\n className?: string;\n style?: CSSProperties;\n viewerStyle?: CSSProperties;\n railStyle?: CSSProperties;\n redirectionData?: RedirectionData;\n styles?: Record<string, React.CSSProperties>;\n disableAllActions?: boolean;\n disablePdfAnnotations?: boolean;\n /** Disable the transparent PDF text layer that can overflow rotated pages. */\n disablePdfTextLayer?: boolean;\n disableTitleCheckUntilBoundaryCheckCompleted?: boolean;\n manualPrompt?: string;\n /** Closes any review card, Cognitive Integrity panel, or review popup. */\n closePopups?: boolean;\n onPdfLoadError?: PdfViewerProps['onError'];\n}\n\nconst getReviewContext = (item: ReviewItem): SegmentReviewActionContext => ({\n reviewId: item.id,\n segment: item.segment,\n pageNumber: item.pageNumber,\n});\n\n/** Converts a zero-based index to A, B, ... Z, AA, AB, and so on. */\nconst getBadgeSuffix = (index: number): string => {\n let value = index + 1;\n let suffix = '';\n\n while (value > 0) {\n value -= 1;\n suffix = String.fromCharCode(65 + (value % 26)) + suffix;\n value = Math.floor(value / 26);\n }\n\n return suffix;\n};\n\n/**\n * Orchestrates the PDF, review badges, page navigation, active card and actions.\n * It consumes backend-shaped segments directly; cards never parse the raw payload.\n */\nexport default function SegmentReviewPdfWrapper({\n pdfUrl,\n pdfName,\n segments,\n totalPages,\n styles,\n pdfViewerProps,\n specialZoomLevel,\n showBadges = true,\n sortByConfidence = 'low',\n filterByConfidence = 'all',\n showBadgeNavigation = true,\n autoSelectReviewOnPageChange = false,\n autoAdvanceAfterConfirm = true,\n autoAdvanceScoreBand,\n badgePreloadPages = 8,\n badgeOffsetTop = 20,\n badgeOffsetRight = 68,\n badgeOffsetLeft = 0,\n initialReviewId,\n manualPrompt,\n heightBuffer,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n onRevert,\n onActiveReviewChange,\n onCurrentPageChange,\n onActionError,\n disableAllActions = false,\n disablePdfAnnotations = false,\n disablePdfTextLayer = true,\n disableTitleCheckUntilBoundaryCheckCompleted = false,\n onAdjustManually,\n onCognitiveClick,\n className,\n style,\n viewerStyle,\n railStyle,\n redirectionData,\n onBadgeSelected,\n onSaveAsLearning,\n closePopups = false,\n onPdfLoadError,\n}: SegmentReviewPdfWrapperProps) {\n console.log(\"LOG: TOTAL PAGE IN PARENT\", totalPages);\n const { boundaryReviews, labelReviews, pageReviews } = useMemo(\n () => extractSegmentReviewData(segments),\n [segments]\n );\n const [optimisticStructuralActions, setOptimisticStructuralActions] = useState<\n Map<string, BoundaryReviewAction>\n >(() => new Map());\n const [optimisticRangeAdjustedSegmentKeys, setOptimisticRangeAdjustedSegmentKeys] =\n useState<Set<string>>(() => new Set());\n\n const segmentNumberByKey = useMemo(\n () => {\n const numberByKey = new Map<string, number>();\n let nextSegmentNumber = 1;\n\n segments.forEach((segment, index) => {\n const segmentKey = getSegmentReviewKey(segment, index);\n if (!numberByKey.has(segmentKey)) {\n numberByKey.set(segmentKey, nextSegmentNumber);\n nextSegmentNumber += 1;\n }\n });\n\n return numberByKey;\n },\n [segments]\n );\n const segmentsWithTitleReviews = useMemo(\n () => new Set(labelReviews.map((review) => getSegmentReviewKey(review.segment))),\n [labelReviews]\n );\n const pendingMergeImpactedSegmentKeys = useMemo(\n () => getPendingMergeImpactedSegmentKeys(segments),\n [segments]\n );\n useEffect(() => {\n setOptimisticStructuralActions((current) => {\n let changed = false;\n const next = new Map(current);\n\n current.forEach((action, segmentKey) => {\n const segment = segments.find((item) =>\n getSegmentReviewKey(item) === segmentKey\n );\n if (!segment || hasPolledStructuralAction(segment, action)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [segments]);\n useEffect(() => {\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n let changed = false;\n const next = new Set(current);\n\n current.forEach((segmentKey) => {\n if (!optimisticStructuralActions.has(segmentKey)) {\n next.delete(segmentKey);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n }, [optimisticStructuralActions]);\n const optimisticMergeImpactedSegmentKeys = useMemo(() => {\n return getOptimisticMergeImpactedSegmentKeys(\n segments,\n optimisticStructuralActions,\n optimisticRangeAdjustedSegmentKeys\n );\n }, [optimisticRangeAdjustedSegmentKeys, optimisticStructuralActions, segments]);\n const asideRef = useRef(null as HTMLDivElement | null);\n const reviews = useMemo<ReviewItem[]>(() => [\n ...boundaryReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !shouldHideStructuralBoundaryReview(\n review.review_step,\n review.segment,\n segmentsWithTitleReviews.has(getSegmentReviewKey(review.segment)),\n optimisticStructuralActions.get(getSegmentReviewKey(review.segment))\n )\n )\n .map((review) => ({\n ...review,\n kind: 'boundary' as const,\n pageNumber: review.metadata.focus_page ?? review.segment.start_page,\n })),\n ...labelReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'label' as const,\n pageNumber: review.segment.start_page,\n })),\n ...pageReviews\n .filter((review) =>\n !pendingMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment)) &&\n !optimisticMergeImpactedSegmentKeys.has(getSegmentReviewKey(review.segment))\n )\n .map((review) => ({\n ...review,\n kind: 'page' as const,\n pageNumber: review.metadata.page_num ?? review.segment.start_page,\n })),\n ].sort((left, right) => {\n const leftSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(left.segment)) ?? Number.MAX_SAFE_INTEGER;\n const rightSegmentNumber =\n segmentNumberByKey.get(getSegmentReviewKey(right.segment)) ?? Number.MAX_SAFE_INTEGER;\n\n return left.pageNumber - right.pageNumber ||\n leftSegmentNumber - rightSegmentNumber ||\n left.reviewStepIndex - right.reviewStepIndex ||\n left.id.localeCompare(right.id);\n }), [\n boundaryReviews,\n labelReviews,\n pageReviews,\n optimisticMergeImpactedSegmentKeys,\n optimisticStructuralActions,\n pendingMergeImpactedSegmentKeys,\n segmentNumberByKey,\n segmentsWithTitleReviews,\n ]);\n\n // PdfToolbar displays `segment.title`, while backend segment titles can be\n // generic values such as \"Document 1\". Preserve the complete segment object\n // and expose its human-readable label as the viewer-facing title.\n const pdfSegments = useMemo(() => segments.map((segment) => ({\n ...segment,\n title: segment.label?.trim() || segment.title,\n page_count: segment.page_count ?? segment.end_page - segment.start_page + 1,\n })), [segments]);\n\n const [currentPage, setCurrentPage] = useState(1);\n const [activeReviewId, setActiveReviewId] = useState<string | null>(\n initialReviewId ?? null\n );\n const [selectedNavigationReviewId, setSelectedNavigationReviewId] = useState<\n string | null\n >(initialReviewId ?? null);\n const [isCognitiveIntegrityOpen, setIsCognitiveIntegrityOpen] = useState(false);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n const [navigationRequest, setNavigationRequest] = useState<PdfNavigationRequest | null>(null);\n const [locallyResolvedReviewIds, setLocallyResolvedReviewIds] = useState<Set<string>>(\n () => new Set()\n );\n const [pendingReviewId, setPendingReviewId] = useState<string | null>(null);\n const [activePageGroup, setActivePageGroup] = useState<{\n pages: number[];\n index: number;\n label: string;\n } | null>(null);\n \n\n const [revertSuccess, setRevertSuccess] = useState<RevertSuccessState | null>(null);\n const [isRevertToastVisible, setIsRevertToastVisible] = useState(false);\n const navigationSequenceRef = useRef(0);\n const pendingNavigationRef = useRef<{\n requestId: number;\n pageNumber: number;\n reviewId: string;\n } | null>(null);\n const pendingStructuralAdvanceRef = useRef<{\n action: BoundaryReviewAction;\n originalSegmentIndex: number;\n segmentSignature: string;\n ready: boolean;\n } | null>(null);\n const badgeElementsRef = useRef(new Map<string, HTMLSpanElement>());\n const pageGroupElementRef = useRef<HTMLSpanElement | null>(null);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const viewerHostRef = useRef<HTMLDivElement | null>(null);\n const [asideWidth, setAsideWidth] = useState(REVIEW_CARD_MAX_WIDTH);\n const requestedRailWidth = styles?.aside?.width ?? '40%';\n const responsiveRailWidth = `min(${\n typeof requestedRailWidth === 'number' ? `${requestedRailWidth}px` : requestedRailWidth\n }, ${REVIEW_CARD_MAX_WIDTH}px, 100%)`;\n\n const closeAllPopups = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n setActivePageGroup(null);\n setRevertSuccess(null);\n setIsRevertToastVisible(false);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n useEffect(() => {\n if (closePopups) closeAllPopups();\n }, [closeAllPopups, closePopups]);\n\n useEffect(() => {\n setLocallyResolvedReviewIds((current) => {\n if (current.size === 0) {\n return current;\n }\n\n const next = new Set(current);\n let changed = false;\n\n reviews.forEach((item) => {\n /**\n * Backend has now returned a definitive review object,\n * so optimistic state is no longer necessary.\n */\n if (\n item.review_step.review?.action != null &&\n next.has(item.id)\n ) {\n next.delete(item.id);\n changed = true;\n }\n });\n\n return changed ? next : current;\n });\n}, [reviews]);\n\n useEffect(() => {\n const aside = asideRef.current;\n if (!aside || !showBadges) return;\n\n const updateAsideWidth = () => {\n const nextWidth = aside.getBoundingClientRect().width;\n if (nextWidth > 0) setAsideWidth(nextWidth);\n };\n\n updateAsideWidth();\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(updateAsideWidth);\n resizeObserver?.observe(aside);\n\n return () => resizeObserver?.disconnect();\n }, [showBadges]);\n\n const resolvedReviewIds = useMemo(() => {\n const resolvedIds = new Set<string>();\n\n reviews.forEach((item) => {\n const isResolved = item.review_step.review?.action != null;\n\n if (isResolved) {\n resolvedIds.add(item.id);\n }\n });\n\n return resolvedIds;\n}, [reviews]);\n\n const activeReview = useMemo(\n () => reviews.find((item) => item.id === activeReviewId) ?? null,\n [activeReviewId, reviews]\n );\n const isTitleConfirmationBlocked = useMemo(() => {\n if (\n !disableTitleCheckUntilBoundaryCheckCompleted ||\n activeReview?.kind !== 'label'\n ) {\n return false;\n }\n\n return boundaryReviews.some((review) => {\n if (\n getSegmentReviewKey(review.segment) !== getSegmentReviewKey(activeReview.segment) ||\n resolvedReviewIds.has(review.id)\n ) {\n return false;\n }\n\n const boundaryScore = getResolvedScore(\n review.review_step.score,\n review.review_step.confidence\n );\n\n // A high-confidence boundary can skip manual confirmation. Missing or\n // lower scores keep the existing boundary-first confirmation requirement.\n return boundaryScore == null ||\n boundaryScore < BOUNDARY_TITLE_CHECK_BYPASS_SCORE;\n });\n }, [\n activeReview,\n boundaryReviews,\n disableTitleCheckUntilBoundaryCheckCompleted,\n resolvedReviewIds,\n ]);\n const activeSegmentIndex = activeReview == null\n ? -1\n : segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(activeReview.segment)\n );\n const previousSegment = activeSegmentIndex > 0\n ? segments[activeSegmentIndex - 1]\n : undefined;\n const nextSegment = activeSegmentIndex >= 0\n ? segments[activeSegmentIndex + 1]\n : undefined;\n const previousSegmentTitle = previousSegment?.label?.trim() || previousSegment?.title;\n const nextSegmentTitle = nextSegment?.label?.trim() || nextSegment?.title;\n const activeReviewColors = getConfidenceColors(\n activeReview?.review_step.score,\n activeReview?.review_step.confidence,\n activeReview?.segment.confidence?.awaiting_llm\n );\n const activeCognitiveReasons = activeReview?.review_step.reasons?.length\n ? activeReview.review_step.reasons\n : activeReview?.segment.confidence?.reasons ?? [];\n const hasCognitiveIntegrityContent = Boolean(\n activeCognitiveReasons.some((item) =>\n item.text.trim() && ['evidence', 'gap'].includes(item.type.trim().toLowerCase())\n ) ||\n activeReview?.review_step.reason?.trim() || activeReview?.review_step.gap?.trim()\n );\n const activeReviewActionLabel = activeReview == null\n ? null\n : activeReview.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n )\n : getTitleReviewActionBadgeLabel(\n activeReview.review_step,\n activeReview.segment,\n optimisticStructuralActions.get(activeReview.segment.stable_key ?? \"\")\n );\n const activeTitleDecisionValues = activeReview?.kind === 'label'\n ? [\n activeReviewActionLabel,\n activeReview.review_step.human_action_enum,\n activeReview.review_step.review?.action,\n activeReview.review_step.human_resolution?.action,\n ]\n : [];\n const isMergeOrSplitTitleReview = activeReview?.kind === 'label' &&\n activeTitleDecisionValues.some((value) => {\n const normalizedValue = value?.trim().toUpperCase() ?? '';\n return normalizedValue.includes('MERGE') || normalizedValue.includes('SPLIT');\n });\n const hasVisibleBoundaryReviewForActiveSegment = activeReview != null &&\n reviews.some(\n (review) =>\n review.kind === 'boundary' &&\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n const isHiddenBoundaryStructuralTitleReview =\n isMergeOrSplitTitleReview && !hasVisibleBoundaryReviewForActiveSegment;\n const shouldShowReviewedBoundaryActions =\n activeReview?.kind === 'boundary' || isHiddenBoundaryStructuralTitleReview;\n const activeBoundaryReview = !shouldShowReviewedBoundaryActions || activeReview == null\n ? undefined\n : (() => {\n if (activeReview.kind === 'boundary') return activeReview;\n\n const boundaryReview = boundaryReviews.find(\n (review) =>\n getSegmentReviewKey(review.segment) ===\n getSegmentReviewKey(activeReview.segment)\n );\n\n if (boundaryReview) {\n return {\n ...boundaryReview,\n kind: 'boundary' as const,\n pageNumber:\n boundaryReview.metadata.focus_page ??\n boundaryReview.segment.start_page,\n };\n }\n\n return {\n ...activeReview,\n kind: 'boundary' as const,\n pageNumber:\n activeReview.segment.review_action?.focus_page ??\n activeReview.segment.start_page,\n metadata: {\n focus_page: activeReview.segment.review_action?.focus_page ?? null,\n boundary_margin: activeReview.segment.boundary_margin ?? null,\n user_actions: [],\n },\n };\n })();\n const activeReviewTitle = activeReview == null\n ? ''\n : activeReview.segment.label?.trim() || activeReview.segment.title;\n const activeStepRevertInfo =\n activeReview?.review_step.revert;\n\nconst segmentRevertInfo =\n activeReview?.segment.revert;\n\nconst normalizeRevertType = (\n type?: string | null\n) => type?.trim().toLowerCase();\n\nconst structuralStepRevertInfo =\n activeReview == null\n ? undefined\n : [...(activeReview.segment.review_steps ?? [])]\n .reverse()\n .find((step) => {\n const stepType = step.type\n ?.trim()\n .toLowerCase();\n\n if (\n stepType !== 'page_boundary' &&\n stepType !== 'page boundary review'\n ) {\n return false;\n }\n\n return (\n normalizeRevertType(step.revert?.type) ===\n 'boundary'\n );\n })\n ?.revert;\n const fallbackRevertInfo = activeStepRevertInfo ??\n activeReview?.segment.revert ??\n structuralStepRevertInfo;\n const fallbackRevertDecision = fallbackRevertInfo?.decision.trim().toUpperCase();\n const activeRevertActionLabel =\n activeReviewActionLabel ?? (\n fallbackRevertDecision\n ?.includes('SPLIT')\n ? 'Split'\n : fallbackRevertDecision\n ?.includes('MERGE')\n ? 'Merged'\n : null\n );\n const [learningSavedReviewIds, setLearningSavedReviewIds] = useState<Set<string>>(\n () => new Set()\n );\n const isSetRangeStructuralResult = activeReview?.kind === 'label' && structuralStepRevertInfo?.decision?.trim().toUpperCase() === 'SET_RANGE' && structuralStepRevertInfo.current_segment_ids.length !== structuralStepRevertInfo.previous_state.length;\n const isStructuralReviewResult = activeReviewActionLabel === 'Merged' || activeReviewActionLabel === 'Split' || isSetRangeStructuralResult;\n const activeRevertInfo =\n activeReview == null ? undefined : isStructuralReviewResult ? (\n normalizeRevertType(structuralStepRevertInfo?.type) === 'boundary' ? structuralStepRevertInfo :\n normalizeRevertType(segmentRevertInfo?.type) === 'boundary' ? segmentRevertInfo :\n normalizeRevertType(activeStepRevertInfo?.type) === 'boundary' ? activeStepRevertInfo : undefined\n )\n : activeReview.kind === 'label'\n ? (normalizeRevertType(activeStepRevertInfo?.type) === 'label' ? activeStepRevertInfo : undefined)\n : activeReview.kind === 'boundary'\n ? (\n normalizeRevertType(\n activeStepRevertInfo?.type\n ) === 'boundary'\n ? activeStepRevertInfo\n : normalizeRevertType(\n structuralStepRevertInfo?.type\n ) === 'boundary'\n ? structuralStepRevertInfo\n : normalizeRevertType(\n segmentRevertInfo?.type\n ) === 'boundary'\n ? segmentRevertInfo\n : undefined\n )\n : undefined;\n\n\n const structuralSummaryStep = isStructuralReviewResult && activeRevertInfo?.operation_id ? segments.flatMap((segment)=> segment.review_steps ?? []).find((step) => {\n const stepType = step.type?.trim().toLowerCase();\n\n const isBoundaryStep = stepType === 'page_boundary' || stepType === 'page boundary review';\n if(!isBoundaryStep) return false;\n\n const operationId = step.human_resolution?.operation_id ?? step.revert?.operation_id ?? step.operation_id;\n\n return (\n operationId === activeRevertInfo.operation_id && Boolean(step.human_resolution?.change_summary?.trim())\n );\n }) : undefined;\n const activeRevertSummary = activeRevertInfo?.summary?.trim() || null;\n const activeRevertDescription = isStructuralReviewResult ? (structuralSummaryStep?.human_resolution?.change_summary?.trim() || activeRevertInfo?.summary?.trim() || '') : (activeReview?.review_step?.human_resolution?.change_summary?.trim() || activeReview?.review_step?.summary?.trim() || '');\n const activeRevertData: RevertData | null = activeReview?.kind === 'page'\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: [],\n }\n : activeReview && activeRevertInfo\n ? {\n currentSegment: {\n title: activeReviewTitle,\n startPage: activeReview.segment.start_page,\n endPage: activeReview.segment.end_page,\n },\n previousSegments: (activeRevertInfo.previous_state ?? []).flatMap<SegmentData>(\n (segment) => {\n const title = segment.label === null\n ? 'Untitled document'\n : segment.label?.trim();\n return title\n ? [{\n title,\n startPage: segment.start_page,\n endPage: segment.end_page,\n }]\n : [];\n }\n ),\n }\n : null;\n const activePageClassificationIds = activeReview?.kind === 'page'\n ? activeReview.metadata.type_choices?.map(\n (choice) => choice.classification_id\n ) ?? (\n activeReview.metadata.classification_id\n ? [activeReview.metadata.classification_id]\n : []\n )\n : [];\n const canRevertActiveReview = activeReview?.kind === 'page'\n ? Boolean(onPageTypeRevert && activePageClassificationIds.length > 0)\n : Boolean(\n activeRevertInfo?.operation_id &&\n activeRevertInfo?.type &&\n activeRevertInfo?.revertable !== false\n );\n const shouldShowRevert = Boolean(\n activeRevertData && canRevertActiveReview\n );\n\n const requestPageNavigation = useCallback((pageNumber: number, reviewId: string) => {\n navigationSequenceRef.current += 1;\n pendingNavigationRef.current = {\n requestId: navigationSequenceRef.current,\n pageNumber,\n reviewId,\n };\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, []);\n\n // const closeActiveReview = useCallback(() => {\n // pendingNavigationRef.current = null;\n // setIsCognitiveIntegrityOpen(false);\n // setActiveReviewId(null);\n // setAnchorElement(null);\n // onActiveReviewChange?.(null, null);\n // }, [onActiveReviewChange]);\n\n const selectReview = useCallback((item: ReviewItem) => {\n if (item.segment.confidence?.awaiting_llm === true) return;\n \n onBadgeSelected?.({\n reviewId: item.id,\n segment_id: item.segment.segment_id ?? null,\n reviewStepIndex: item.reviewStepIndex,\n kind: item.kind,\n pageNumber: item.pageNumber,\n metadata: item.metadata,\n });\n \n setActivePageGroup(null);\n setRevertSuccess(null);\n setActiveReviewId(item.id);\n setSelectedNavigationReviewId(item.id);\n setIsCognitiveIntegrityOpen(false);\n // The badge moves when page navigation scrolls the viewer. Keep the popup\n // closed until the badge reaches its final position.\n setAnchorElement(null);\n requestPageNavigation(item.pageNumber, item.id);\n onActiveReviewChange?.(item.id, item.segment);\n }, [onActiveReviewChange, onBadgeSelected, requestPageNavigation]);\n\n useEffect(() => {\n if (!revertSuccess) return;\n\n const frameId = requestAnimationFrame(() => setIsRevertToastVisible(true));\n const fadeTimeoutId = window.setTimeout(() => {\n setIsRevertToastVisible(false);\n }, 3500);\n const removeTimeoutId = window.setTimeout(() => {\n setRevertSuccess(null);\n }, 4000);\n\n return () => {\n cancelAnimationFrame(frameId);\n window.clearTimeout(fadeTimeoutId);\n window.clearTimeout(removeTimeoutId);\n };\n }, [revertSuccess]);\n\n useEffect(() => {\n if (!redirectionData) return;\n\n\n if (redirectionData.type === 'pageGroup') {\n const pages = redirectionData.pages ?? [];\n const index = redirectionData.pageIndex ?? 0;\n const targetPage = pages[index];\n if (targetPage == null) return;\n\n closeActiveReview();\n setActivePageGroup({ pages, index, label: redirectionData.groupLabel ?? '' });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: targetPage,\n requestId: navigationSequenceRef.current,\n });\n return;\n }\n setActivePageGroup(null);\n\n\n if (redirectionData.reviewId) {\n const matchingReview = reviews.find((item) =>\n item.id === redirectionData.reviewId &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (redirectionData.classificationId) {\n const matchingReview = reviews.find((item) =>\n item.kind === 'page' &&\n (\n item.metadata.classification_id === redirectionData.classificationId ||\n item.metadata.type_choices?.some(\n (choice) => choice.classification_id === redirectionData.classificationId\n )\n ) &&\n (!redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId) &&\n (!redirectionData.type || item.kind === redirectionData.type)\n );\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n }\n\n if (!redirectionData.pageNumber || !redirectionData.type) return;\n\n const segmentStartPage = Number(redirectionData.pageNumber);\n if (!Number.isInteger(segmentStartPage) || segmentStartPage < 1) return;\n const redirectionPageType = redirectionData.pageType?.trim().toLowerCase();\n\n const matchingReview = reviews.find((item) => {\n const matchingPage = item.kind === 'page'\n ? item.pageNumber\n : item.segment.start_page;\n const matchesPageType = item.kind !== 'page' ||\n !redirectionPageType ||\n item.metadata.page_type === redirectionPageType ||\n item.metadata.type_choices?.some(\n (choice) => choice.page_type === redirectionPageType\n );\n const matchesSegment = !redirectionData.segmentId ||\n item.segment.segment_id === redirectionData.segmentId;\n\n return matchesSegment &&\n matchingPage === segmentStartPage &&\n item.kind === redirectionData.type &&\n matchesPageType;\n });\n\n if (matchingReview) {\n selectReview(matchingReview);\n return;\n }\n\n // No review exists for this page (e.g. disableAllActions steps with no\n // page_classifications) — still jump the viewer directly.\n if (redirectionData.type === 'page') {\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segmentStartPage,\n requestId: navigationSequenceRef.current,\n });\n }\n \n }, [redirectionData, selectReview, reviews]);\n\n const closeActiveReview = useCallback(() => {\n pendingNavigationRef.current = null;\n setIsCognitiveIntegrityOpen(false);\n setActiveReviewId(null);\n setAnchorElement(null);\n onActiveReviewChange?.(null, null);\n }, [onActiveReviewChange]);\n\n const reviewRevertedSegment = useCallback((segment: RevertData['currentSegment']) => {\n setIsRevertToastVisible(false);\n setRevertSuccess(null);\n\n const targetReview = reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.kind === 'boundary' &&\n item.segment.start_page === segment.startPage &&\n item.segment.end_page === segment.endPage\n ) ?? reviews.find((item) =>\n !resolvedReviewIds.has(item.id) &&\n item.segment.start_page <= segment.startPage &&\n item.segment.end_page >= segment.startPage\n );\n\n if (targetReview) {\n selectReview(targetReview);\n return;\n }\n\n closeActiveReview();\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber: segment.startPage,\n requestId: navigationSequenceRef.current,\n });\n }, [closeActiveReview, resolvedReviewIds, reviews, selectReview]);\n\n const isEligibleAutoAdvanceReview = useCallback((\n item: ReviewItem,\n excludedReviewId?: string\n ) => {\n const scoreBand = getReviewScoreBand(\n item.review_step.score\n );\n const matchesScoreBand = autoAdvanceScoreBand == null ||\n scoreBand === autoAdvanceScoreBand;\n const hasCurrentLocalResolution =\n locallyResolvedReviewIds.has(item.id) &&\n isReviewStepResolutionCurrent(item.review_step, item.segment);\n\n return item.id !== excludedReviewId &&\n matchesScoreBand &&\n item.segment.confidence?.awaiting_llm !== true &&\n !isReviewStepResolved(item.review_step, item.segment) &&\n !hasCurrentLocalResolution;\n }, [autoAdvanceScoreBand, locallyResolvedReviewIds]);\n\n const selectNextReview = useCallback((completedReviewId: string) => {\n if (!autoAdvanceAfterConfirm) {\n closeActiveReview();\n return;\n }\n\n const completedIndex = reviews.findIndex(\n (item) => item.id === completedReviewId\n );\n const nextReview = reviews.find((item, index) =>\n index > completedIndex &&\n isEligibleAutoAdvanceReview(item, completedReviewId)\n ) ?? reviews.find((item) =>\n isEligibleAutoAdvanceReview(item, completedReviewId)\n );\n\n if (!nextReview) {\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => selectReview(nextReview));\n }, [\n autoAdvanceAfterConfirm,\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n selectReview,\n ]);\n\n const completePageTypeChoices = useCallback(async (\n item: Extract<ReviewItem, { kind: 'page' }>,\n selectedPageTypes: readonly PageCheckPageType[]\n ) => {\n if (disableAllActions || !onPageAction || selectedPageTypes.length === 0) return;\n\n const choices = item.metadata.type_choices ?? [];\n if (choices.length !== 2) return;\n\n const selectedTypes = new Set(selectedPageTypes);\n const context = getReviewContext(item);\n const orderedChoices = [...choices].sort((left, right) => {\n const isLeftSelected = selectedTypes.has(left.page_type);\n const isRightSelected = selectedTypes.has(right.page_type);\n return isLeftSelected === isRightSelected ? 0 : isLeftSelected ? -1 : 1;\n });\n\n setPendingReviewId(item.id);\n\n try {\n for (const choice of orderedChoices) {\n const action = selectedTypes.has(choice.page_type)\n ? PageCheckActionEnum.YES\n : PageCheckActionEnum.NO;\n\n await onPageAction(\n action,\n {\n action,\n pageType: choice.page_type,\n metadata: {\n user_actions: [PageCheckActionEnum.YES, PageCheckActionEnum.NO],\n page_num: item.metadata.page_num,\n page_type: choice.page_type,\n classification_id: choice.classification_id,\n },\n },\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n selectNextReview(item.id);\n } catch (error) {\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n disableAllActions,\n onActionError,\n onPageAction,\n selectNextReview,\n ]);\n\n const completeAction = useCallback(async (\n item: ReviewItem,\n action: BoundaryReviewAction | LabelReviewAction | PageCheckAction,\n details: BoundaryReviewConfirmDetails | LabelReviewConfirmDetails | PageCheckConfirmDetails\n ) => {\n if (disableAllActions) return;\n if (item.kind === 'boundary' && !onBoundaryAction) return;\n if (item.kind === 'label' && !onLabelAction) return;\n if (item.kind === 'page' && !onPageAction) return;\n\n const context = getReviewContext(item);\n const boundaryAction = action as BoundaryReviewAction;\n const boundaryDetails =\n details as BoundaryReviewConfirmDetails;\n\nconst effectiveBoundaryAction =\n boundaryAction ===\n BoundaryReviewActionEnum.SET_RANGE\n ? (() => {\n const newStart =\n boundaryDetails.startPage;\n\n const newEnd =\n boundaryDetails.endPage;\n\n if (\n newStart == null ||\n newEnd == null\n ) {\n return null;\n }\n\n const expanded =\n newStart <\n item.segment.start_page ||\n newEnd >\n item.segment.end_page;\n\n const shrunk =\n newStart >\n item.segment.start_page ||\n newEnd <\n item.segment.end_page;\n\n if (expanded && !shrunk) {\n return newStart <\n item.segment.start_page\n ? BoundaryReviewActionEnum.MERGE_PREV\n : BoundaryReviewActionEnum.MERGE_NEXT;\n }\n\n if (shrunk) {\n return BoundaryReviewActionEnum.SPLIT_HERE;\n }\n\n return null;\n })()\n : boundaryAction;\n const isStructuralBoundaryAction =\n item.kind === 'boundary' &&\n onBoundaryAction != null &&\n autoAdvanceAfterConfirm &&\n (\n effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV ||\n effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS\n );\n const originalSegmentIndex = isStructuralBoundaryAction\n ? segments.findIndex(\n (segment) => getSegmentReviewKey(segment) === getSegmentReviewKey(item.segment)\n )\n : -1;\n\n if (isStructuralBoundaryAction && originalSegmentIndex >= 0 && effectiveBoundaryAction) {\n pendingStructuralAdvanceRef.current = {\n action: effectiveBoundaryAction as BoundaryReviewAction,\n originalSegmentIndex,\n\n segmentSignature: JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n ),\n\n ready: false,\n };\n }\n\n setPendingReviewId(item.id);\n\n try {\n if (item.kind === 'boundary') {\n await onBoundaryAction?.(\n action as BoundaryReviewAction,\n details as BoundaryReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'label') {\n await onLabelAction?.(\n action as LabelReviewAction,\n details as LabelReviewConfirmDetails,\n context\n );\n } else if (item.kind === 'page') {\n await onPageAction?.(\n action as PageCheckAction,\n details as PageCheckConfirmDetails,\n context\n );\n }\n\n setLocallyResolvedReviewIds((current) => {\n const next = new Set(current);\n next.add(item.id);\n return next;\n });\n\n const isMergeAction = item.kind === 'boundary' && (effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_NEXT || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREV || effectiveBoundaryAction === BoundaryReviewActionEnum.MERGE_PREVIOUS);\n\n const isSplitAction = item.kind === 'boundary' && effectiveBoundaryAction === BoundaryReviewActionEnum.SPLIT_HERE;\n if ((isSplitAction || isMergeAction) && effectiveBoundaryAction) {\n const segmentKey = getSegmentReviewKey(item.segment);\n\n setOptimisticRangeAdjustedSegmentKeys((current) => {\n const next = new Set(current);\n\n if (boundaryAction === BoundaryReviewActionEnum.SET_RANGE) {\n next.add(segmentKey);\n } else {\n next.delete(segmentKey);\n }\n\n return next;\n });\n setOptimisticStructuralActions((current) => {\n const next = new Map(current);\n\n next.set(\n segmentKey,\n effectiveBoundaryAction as BoundaryReviewAction\n );\n\n return next;\n });\n }\n\n if (pendingStructuralAdvanceRef.current) {\n pendingStructuralAdvanceRef.current.ready = true;\n\n if (isMergeAction) {\n const titleReview = reviews.find(\n (review) =>\n review.kind === 'label' &&\n getSegmentReviewKey(review.segment) === getSegmentReviewKey(item.segment)\n );\n if (titleReview) requestAnimationFrame(() => selectReview(titleReview));\n }\n } else {\n selectNextReview(item.id);\n }\n } catch (error) {\n if (isStructuralBoundaryAction) {\n pendingStructuralAdvanceRef.current = null;\n }\n onActionError?.(error, context);\n } finally {\n setPendingReviewId(null);\n }\n }, [\n autoAdvanceAfterConfirm,\n disableAllActions,\n onActionError,\n onBoundaryAction,\n onLabelAction,\n onPageAction,\n onPageTypeRevert,\n reviews,\n segments,\n selectReview,\n selectNextReview,\n ]);\n\n useEffect(() => {\n const pendingAdvance = pendingStructuralAdvanceRef.current;\n if (!pendingAdvance?.ready) return;\n\n const currentSegmentSignature =\n JSON.stringify(\n segments.map((segment, index) => ({\n key: getSegmentReviewKey(\n segment,\n index\n ),\n startPage: segment.start_page,\n endPage: segment.end_page,\n version: segment.version ?? null,\n }))\n );\n if (currentSegmentSignature === pendingAdvance.segmentSignature) return;\n\n const targetSegmentIndex = pendingAdvance.action === BoundaryReviewActionEnum.SPLIT_HERE\n ? pendingAdvance.originalSegmentIndex + 1\n : pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREV ||\n pendingAdvance.action === BoundaryReviewActionEnum.MERGE_PREVIOUS\n ? Math.max(0, pendingAdvance.originalSegmentIndex - 1)\n : pendingAdvance.originalSegmentIndex;\n const segmentIndexByKey = new Map(\n segments.map((segment, index) => [getSegmentReviewKey(segment, index), index])\n );\n const nextReview = reviews.find((item) => {\n const segmentIndex = segmentIndexByKey.get(getSegmentReviewKey(item.segment));\n\n return segmentIndex != null &&\n segmentIndex >= targetSegmentIndex &&\n isEligibleAutoAdvanceReview(item);\n });\n\n if (!nextReview) {\n pendingStructuralAdvanceRef.current = null;\n closeActiveReview();\n return;\n }\n\n requestAnimationFrame(() => {\n pendingStructuralAdvanceRef.current = null;\n selectReview(nextReview);\n });\n }, [\n closeActiveReview,\n isEligibleAutoAdvanceReview,\n reviews,\n segments,\n selectReview,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (activeReviewId && !reviews.some((item) => item.id === activeReviewId)) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n useEffect(() => {\n if (!autoSelectReviewOnPageChange) return;\n if (pendingStructuralAdvanceRef.current) return;\n const pageReview = reviews.find((item) => item.pageNumber === currentPage);\n if (pageReview && pageReview.id !== activeReviewId) selectReview(pageReview);\n }, [\n activeReviewId,\n autoSelectReviewOnPageChange,\n currentPage,\n selectReview,\n reviews,\n ]);\n\n useEffect(() => {\n if (pendingStructuralAdvanceRef.current) return;\n if (\n activeReviewId &&\n !reviews.some(\n (item) =>\n item.id === activeReviewId &&\n item.segment.confidence?.awaiting_llm !== true\n )\n ) {\n closeActiveReview();\n }\n }, [activeReviewId, closeActiveReview, reviews]);\n\n const navigationReviews = useMemo(() => {\n const availableReviews = reviews.filter(\n (item) => item.segment.confidence?.awaiting_llm !== true\n );\n\n // When all confidences are visible, navigation follows the badge/document\n // order so input positions and chevrons never jump over another confidence.\n if (filterByConfidence === 'all') return availableReviews;\n\n const remainingConfidenceOrder: ReviewConfidence[] = ['low', 'medium', 'high']\n .filter((confidence): confidence is ReviewConfidence =>\n confidence !== sortByConfidence\n );\n const confidenceOrder = [sortByConfidence, ...remainingConfidenceOrder];\n const confidenceRank = new Map(\n confidenceOrder.map((confidence, index) => [confidence, index])\n );\n\n return availableReviews\n .map((item, index) => ({ item, index }))\n .sort((left, right) => {\n const leftConfidence = left.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const rightConfidence = right.item.review_step.confidence\n ?.trim()\n .toLowerCase() as ReviewConfidence | undefined;\n const leftRank = leftConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(leftConfidence) ?? confidenceOrder.length;\n const rightRank = rightConfidence == null\n ? confidenceOrder.length\n : confidenceRank.get(rightConfidence) ?? confidenceOrder.length;\n\n return leftRank - rightRank || left.index - right.index;\n })\n .map(({ item }) => item);\n }, [filterByConfidence, sortByConfidence, reviews]);\n\n const selectedNavigationIndex = navigationReviews.findIndex(\n (item) => item.id === selectedNavigationReviewId\n );\n const displayedNavigationIndex = selectedNavigationIndex;\n const [navigationInputValue, setNavigationInputValue] = useState<string | null>(null);\n const [navigationInputError, setNavigationInputError] = useState<\n 'invalid-number' | 'out-of-range' | null\n >(null);\n const navigationInputChangedRef = useRef(false);\n\n const navigateToReviewIndex = useCallback((index: number) => {\n const review = navigationReviews[index];\n if (review) selectReview(review);\n }, [navigationReviews, selectReview]);\n\n const navigateToPageGroupIndex = useCallback((index: number) => {\n if (!activePageGroup || index < 0 || index >= activePageGroup.pages.length) {\n return;\n }\n\n const pageNumber = activePageGroup.pages[index];\n if (pageNumber == null) return;\n\n closeActiveReview();\n setActivePageGroup((current) => current == null ? current : {\n ...current,\n index,\n });\n navigationSequenceRef.current += 1;\n setNavigationRequest({\n pageNumber,\n requestId: navigationSequenceRef.current,\n });\n }, [activePageGroup, closeActiveReview]);\n\n useEffect(() => {\n if (\n selectedNavigationReviewId &&\n !navigationReviews.some(\n (item) => item.id === selectedNavigationReviewId\n )\n ) {\n setSelectedNavigationReviewId(null);\n }\n }, [navigationReviews, selectedNavigationReviewId]);\n\n useEffect(() => {\n navigationInputChangedRef.current = false;\n setNavigationInputError(null);\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }, [displayedNavigationIndex, navigationReviews.length]);\n\n useEffect(() => {\n if (!navigationInputChangedRef.current || navigationInputValue == null) return;\n\n const timerId = window.setTimeout(() => {\n const requestedPosition = Number(navigationInputValue.trim());\n const requestedIndex = requestedPosition - 1;\n\n if (\n Number.isInteger(requestedPosition) &&\n requestedIndex >= 0 &&\n requestedIndex < navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n navigateToReviewIndex(requestedIndex);\n }\n }, 300);\n\n return () => window.clearTimeout(timerId);\n }, [navigateToReviewIndex, navigationInputValue, navigationReviews.length]);\n\n const badgeLabelById = useMemo(() => {\n const reviewsBySegment = new Map<string, ReviewItem[]>();\n\n reviews.forEach((item) => {\n const segmentReviews = reviewsBySegment.get(getSegmentReviewKey(item.segment)) ?? [];\n segmentReviews.push(item);\n reviewsBySegment.set(getSegmentReviewKey(item.segment), segmentReviews);\n });\n\n const labels = new Map<string, string>();\n reviewsBySegment.forEach((segmentReviews, segmentKey) => {\n const segmentNumber = segmentNumberByKey.get(segmentKey) ?? 1;\n\n segmentReviews\n .sort((left, right) => left.reviewStepIndex - right.reviewStepIndex)\n .forEach((item, index) => {\n labels.set(item.id, `${segmentNumber}${getBadgeSuffix(index)}`);\n });\n });\n\n return labels;\n }, [reviews, segmentNumberByKey]);\n\n const badgeSlotById = useMemo(() => {\n const byPage = new Map<number, ReviewItem[]>();\n reviews.forEach((item) => {\n const pageReviews = byPage.get(item.pageNumber) ?? [];\n pageReviews.push(item);\n byPage.set(item.pageNumber, pageReviews);\n });\n const slots = new Map<string, number>();\n byPage.forEach((pageReviews) => {\n pageReviews.forEach((item, index) => slots.set(item.id, index));\n });\n return slots;\n }, [reviews]);\n\n const setPreloadedRenderRange = useCallback<SetRenderRange>((visibleRange) => ({\n startPage: Math.max(0, visibleRange.startPage - badgePreloadPages),\n endPage: Math.min(\n visibleRange.numPages - 1,\n visibleRange.endPage + badgePreloadPages\n ),\n }), [badgePreloadPages]);\n\n const updateBadgePositions = useCallback(() => {\n const wrapper = wrapperRef.current;\n const viewerHost = viewerHostRef.current;\n if (!wrapper || !viewerHost) return;\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const scrollContainer = viewerHost.querySelector(\n '.rpv-core__inner-pages'\n ) as HTMLElement | null;\n const visibleRect = scrollContainer?.getBoundingClientRect() ??\n viewerHost.getBoundingClientRect();\n\n reviews.forEach((item) => {\n const badge = badgeElementsRef.current.get(item.id);\n if (!badge) return;\n\n const page = viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${item.pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!page) {\n badge.style.visibility = 'hidden';\n return;\n }\n\n const pageRect = page.getBoundingClientRect();\n const slot = badgeSlotById.get(item.id) ?? 0;\n const badgeTop = pageRect.top + badgeOffsetTop + slot * 40;\n const badgeBottom = badgeTop + (badge.offsetHeight || 32);\n const isBadgePositionVisible =\n badgeTop >= visibleRect.top && badgeBottom <= visibleRect.bottom;\n\n badge.style.top = `${badgeTop - wrapperRect.top}px`;\n badge.style.visibility = isBadgePositionVisible ? 'visible' : 'hidden';\n });\n\n // Page-group redirects do not have review badges. Keep their pill aligned\n // with the redirected PDF page the same way individual badges are.\n const pill = pageGroupElementRef.current;\n if (pill) {\n const pageNumber = activePageGroup?.pages[activePageGroup.index];\n const page = pageNumber == null ? null : viewerHost.querySelector(\n `[data-testid=\"core__page-layer-${pageNumber - 1}\"]`\n ) as HTMLElement | null;\n\n if (!activePageGroup || !page) {\n pill.style.visibility = 'hidden';\n } else {\n const pageRect = page.getBoundingClientRect();\n const pillTop = pageRect.top + badgeOffsetTop;\n const pillBottom = pillTop + (pill.offsetHeight || 25);\n const isPillPositionVisible =\n pillTop >= visibleRect.top && pillBottom <= visibleRect.bottom;\n\n pill.style.top = `${pillTop - wrapperRect.top}px`;\n pill.style.visibility = isPillPositionVisible ? 'visible' : 'hidden';\n }\n }\n\n // A page layer or badge can mount one frame after navigation settles.\n // Position updates therefore also recover the popup anchor instead of\n // relying exclusively on the one-time navigation-settled callback.\n if (activeReviewId && pendingNavigationRef.current == null) {\n const activeBadge = badgeElementsRef.current.get(activeReviewId);\n if (activeBadge && activeBadge.style.visibility !== 'hidden') {\n setAnchorElement((current) => current === activeBadge ? current : activeBadge);\n }\n }\n }, [activePageGroup, activeReviewId, badgeOffsetTop, badgeSlotById, reviews]);\n\n const handleNavigationSettled = useCallback((\n event: PdfNavigationSettledEvent\n ) => {\n const pendingNavigation = pendingNavigationRef.current;\n if (\n !pendingNavigation ||\n pendingNavigation.requestId !== event.requestId ||\n pendingNavigation.pageNumber !== event.pageNumber\n ) {\n return;\n }\n\n pendingNavigationRef.current = null;\n updateBadgePositions();\n\n requestAnimationFrame(() => {\n if (pendingNavigationRef.current != null) return;\n const badge = badgeElementsRef.current.get(pendingNavigation.reviewId);\n if (badge && badge.style.visibility !== 'hidden') setAnchorElement(badge);\n });\n }, [updateBadgePositions]);\n\n useEffect(() => {\n const viewerHost = viewerHostRef.current;\n if (!viewerHost || !showBadges) return;\n\n let frameId: number | null = null;\n const schedulePositionUpdate = () => {\n if (frameId != null) return;\n frameId = requestAnimationFrame(() => {\n frameId = null;\n updateBadgePositions();\n });\n };\n\n viewerHost.addEventListener('scroll', schedulePositionUpdate, true);\n window.addEventListener('resize', schedulePositionUpdate);\n\n const mutationObserver = new MutationObserver(schedulePositionUpdate);\n mutationObserver.observe(viewerHost, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['style'],\n });\n\n const resizeObserver = typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(schedulePositionUpdate);\n resizeObserver?.observe(viewerHost);\n\n schedulePositionUpdate();\n\n return () => {\n if (frameId != null) cancelAnimationFrame(frameId);\n viewerHost.removeEventListener('scroll', schedulePositionUpdate, true);\n window.removeEventListener('resize', schedulePositionUpdate);\n mutationObserver.disconnect();\n resizeObserver?.disconnect();\n };\n }, [showBadges, updateBadgePositions]);\n\n return (\n <div\n ref={wrapperRef}\n className={className}\n style={{\n ...style,\n display: 'block',\n position: 'relative',\n width: '100%',\n height: '100%',\n minWidth: 0,\n overflowX: 'auto',\n overflowY: 'hidden',\n }}\n >\n <div\n className=\"segment-review-wrapper__container\"\n style={{\n display: 'flex',\n alignItems: 'stretch',\n gap: 0,\n width: '100%',\n minWidth: REVIEW_LAYOUT_MIN_WIDTH,\n height: '100%',\n }}\n >\n <div\n ref={viewerHostRef}\n style={{\n ...viewerStyle,\n flex: '1 1 auto',\n width: showBadges ? 'auto' : '100%',\n minWidth: 0,\n height: '100%',\n boxSizing: 'border-box',\n }}\n >\n <PdfViewer\n highlightText={[]}\n highlightPages={{}}\n highlightCordinatePages={[]}\n useCoordinates={false}\n showRotateButton={true}\n {...pdfViewerProps}\n onError={onPdfLoadError}\n defaultScale={\n specialZoomLevel === undefined\n ? pdfViewerProps?.defaultScale ?? SpecialZoomLevel.PageFit\n : SEGMENT_PDF_SPECIAL_ZOOM_LEVEL[specialZoomLevel]\n }\n disablePdfAnnotations={disablePdfAnnotations}\n disablePdfTextLayer={disablePdfTextLayer}\n pdfUrl={pdfUrl}\n pdfName={pdfName}\n segments={pdfSegments}\n navigationRequest={navigationRequest}\n onNavigationSettled={handleNavigationSettled}\n setRenderRange={setPreloadedRenderRange}\n onCurrentPageChange={(pageNumber) => {\n setCurrentPage(pageNumber);\n if (\n pendingNavigationRef.current == null &&\n activeReview &&\n activeReview.pageNumber !== pageNumber\n ) {\n closeActiveReview();\n }\n onCurrentPageChange?.(pageNumber);\n }}\n />\n </div>\n\n {showBadges && (\n <aside\n aria-label=\"Page review badges\"\n ref={asideRef}\n style={{\n ...railStyle,\n position: 'relative',\n width: responsiveRailWidth,\n maxWidth: REVIEW_CARD_MAX_WIDTH,\n flex: `0 1 ${responsiveRailWidth}`,\n minHeight: 0,\n overflow: 'hidden',\n boxSizing: 'border-box',\n }}\n >\n\n {activePageGroup && (\n <span\n ref={pageGroupElementRef}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n zIndex: 2,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n minHeight: 25,\n padding: '2px 8px',\n border: '1px solid #E2E8F0',\n borderRadius: 16,\n backgroundColor: '#F8FAFC',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n font: 'inherit',\n }}\n >\n <Typography\n fontFamily={'Inter'}\n sx={{ fontSize: 11, fontWeight: 500, color: '#475569', whiteSpace: 'nowrap' }}\n >\n {activePageGroup.label || 'Pages'} Pg: {activePageGroup.index + 1}\n </Typography>\n </span>\n )}\n\n\n {showBadgeNavigation && navigationReviews.length > 0 && !activePageGroup && (\n <nav\n aria-label=\"Review badge navigation\"\n style={{\n position: 'absolute',\n top: 8,\n right: badgeOffsetRight ? badgeOffsetRight : 'auto',\n left: badgeOffsetLeft ? badgeOffsetLeft : 'auto',\n zIndex: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 7,\n width: 128,\n minHeight: 40,\n padding: '4px 6px',\n border: '1px solid #CBD5E1',\n borderRadius: 6,\n backgroundColor: '#FFFFFF',\n boxSizing: 'border-box',\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.06)',\n font: 'inherit',\n }}\n >\n <Tooltip\n title={navigationInputError === 'out-of-range'\n ? 'Please enter valid number present in the range'\n : 'Please enter valid numbers'}\n open={navigationInputError != null}\n placement=\"top\"\n arrow\n >\n <input\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={navigationInputValue ?? '-'}\n min={0}\n max={navigationReviews.length}\n aria-label=\"Review badge number\"\n aria-invalid={navigationInputError != null}\n onFocus={() => {\n if (navigationInputValue == null) setNavigationInputValue('');\n }}\n onBlur={() => {\n setNavigationInputError(null);\n const numericValue = Number(navigationInputValue);\n if (\n navigationInputValue == null ||\n navigationInputValue === '' ||\n !Number.isInteger(numericValue) ||\n numericValue < 1 ||\n numericValue > navigationReviews.length\n ) {\n navigationInputChangedRef.current = false;\n setNavigationInputValue(\n displayedNavigationIndex >= 0\n ? String(displayedNavigationIndex + 1)\n : null\n );\n }\n }}\n onChange={(event) => {\n const inputValue = event.target.value;\n if (!/^\\d*$/.test(inputValue)) {\n setNavigationInputError('invalid-number');\n return;\n }\n\n const numericValue = Number(inputValue);\n const isOutOfRange = inputValue !== '' && (\n numericValue < 1 || numericValue > navigationReviews.length\n );\n setNavigationInputError(isOutOfRange ? 'out-of-range' : null);\n navigationInputChangedRef.current = true;\n setNavigationInputValue(inputValue);\n }}\n style={{\n width: 30,\n height: 28,\n padding: 0,\n border: `1px solid ${navigationInputError ? '#DC2626' : '#A5B4FC'}`,\n borderRadius: 3,\n color: '#4F46E5',\n backgroundColor: '#FFFFFF',\n textAlign: 'center',\n font: 'inherit',\n fontSize: 15,\n outline: 'none',\n }}\n />\n </Tooltip>\n <span\n aria-label={`${navigationReviews.length} reviews`}\n style={{\n flex: 1,\n color: '#4F46E5',\n fontSize: 14,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n of {navigationReviews.length}\n </span>\n {(['previous', 'next'] as const).map((direction) => {\n const isPrevious = direction === 'previous';\n const targetIndex = displayedNavigationIndex + (isPrevious ? -1 : 1);\n const isDisabled = targetIndex < 0 || targetIndex >= navigationReviews.length;\n\n return (\n <button\n key={direction}\n type=\"button\"\n aria-label={`${isPrevious ? 'Previous' : 'Next'} review badge`}\n disabled={isDisabled}\n onClick={() => navigateToReviewIndex(targetIndex)}\n style={{\n display: 'grid',\n placeItems: 'center',\n width: 17,\n height: 28,\n padding: 0,\n border: 0,\n background: 'transparent',\n color: isDisabled ? '#C7D2FE' : '#4F46E5',\n cursor: isDisabled ? 'default' : 'pointer',\n }}\n >\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d={isPrevious ? 'M1 7L6 2L11 7' : 'M1 1L6 6L11 1'}\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n );\n })}\n </nav>\n )}\n\n {!activePageGroup && reviews.map((item) => {\n const isActive = activeReviewId === item.id;\n const label = badgeLabelById.get(item.id) ?? '1A';\n const score = item.review_step.score;\n const confidence = item.review_step.confidence;\n const displayScore = formatScore(score, confidence);\n const humanActionBadgeLabel = item.kind === 'boundary'\n ? getBoundaryReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : item.kind === 'label'\n ? getTitleReviewActionBadgeLabel(\n item.review_step,\n item.segment,\n optimisticStructuralActions.get(getSegmentReviewKey(item.segment))\n )\n : null;\n const badgeValue = humanActionBadgeLabel ?? (\n displayScore === 'N/A' ? displayScore : `${displayScore}%`\n );\n const isAwaitingLlm = item.segment.confidence?.awaiting_llm === true;\n const confidenceColors = getConfidenceColors(\n score,\n confidence,\n isAwaitingLlm\n );\n const isReviewed = resolvedReviewIds.has(item.id);\n const isDisabled = isAwaitingLlm;\n return (\n <Tooltip\n key={item.id}\n title={isAwaitingLlm ? 'data is being processed' : ''}\n arrow\n >\n <span\n ref={(element) => {\n if (element) badgeElementsRef.current.set(item.id, element);\n else badgeElementsRef.current.delete(item.id);\n }}\n style={{\n position: 'absolute',\n top: 0,\n left: 10,\n visibility: 'hidden',\n display: 'inline-flex',\n cursor: isDisabled ? 'not-allowed' : 'pointer',\n }}\n >\n <button\n disabled={isDisabled}\n type=\"button\"\n aria-pressed={isActive}\n aria-label={isAwaitingLlm\n ? `${item.review_step.type} · Page ${item.pageNumber} · Data is being processed`\n : `${item.review_step.type} · Page ${item.pageNumber}`}\n onClick={() => selectReview(item)}\n style={{\n cursor: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-around',\n gap: 4,\n width: humanActionBadgeLabel\n ? (isReviewed && !isAwaitingLlm ? 115 : 90)\n : (isReviewed && !isAwaitingLlm ? 105 : 80),\n minHeight: 25,\n padding: '2px 5px',\n border: `1px solid ${isReviewed && !isAwaitingLlm ? \"#E2E8F0\" : confidenceColors.border}`,\n borderRadius: 16,\n backgroundColor: isReviewed && !isAwaitingLlm ? \"#F8FAFC\" : confidenceColors.background,\n color: isReviewed && !isAwaitingLlm ? \"#475569\" : confidenceColors.text,\n font: 'inherit',\n alignContent: \"center\",\n boxShadow: '0 1px 2px rgba(16, 24, 40, 0.08)',\n }}\n >\n {isReviewed && !isAwaitingLlm ? (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex',gap:1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n\n </span>\n <span style={{ fontSize: 11, fontWeight: 500, display: 'flex', alignItems: 'center' }}>\n <svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={\"#CBD5E1\"} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ display: 'flex', marginLeft: '7px', alignItems: 'center' }}><CircleCheck height={14} width={14} strokeWidth={2} color='#16A34A' /></span>\n </span>\n </Typography>\n ) : (\n <Typography fontFamily={'Inter'} sx={{ display: 'flex', gap: 1, alignItems: 'center', flexDirection: 'row' }}>\n <span style={{ fontSize: 11, fontWeight: 500 }}>{label}</span>\n <span style={{ display: 'flex', alignItems: \"center\" }}><svg width=\"2\" height=\"14\" viewBox=\"0 0 1 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0.399902 0V14\" stroke={confidenceColors.divider} strokeWidth=\"0.8\" />\n </svg>\n <span style={{ fontSize: 11, fontWeight: 500, marginLeft: \"7px\", display: 'flex', alignItems: 'center' }}>{badgeValue}</span>\n </span>\n </Typography>\n )}\n </button>\n </span>\n </Tooltip>\n );\n })}\n </aside>\n )}\n </div>\n\n {activeReview && anchorElement && (\n <CardWrapper\n anchorElement={anchorElement}\n placement=\"bottom-start\"\n offset={{ top: 8 }}\n width={Math.min(asideWidth, REVIEW_CARD_MAX_WIDTH)}\n maxWidth={REVIEW_CARD_MAX_WIDTH}\n heightBuffer={heightBuffer ?? 25}\n >\n {isCognitiveIntegrityOpen && (\n <CognitiveIntegrity\n width=\"100%\"\n maxWidth=\"100%\"\n score={activeReview.review_step.score}\n reasons={activeCognitiveReasons}\n reason={activeReview.review_step.reason}\n gap={activeReview.review_step.gap}\n onBack={() => setIsCognitiveIntegrityOpen(false)}\n onClose={closeActiveReview}\n />\n )}\n <div style={{ display: isCognitiveIntegrityOpen ? 'none' : 'block' }}>\n {resolvedReviewIds.has(activeReview.id) ?\n <ReviewedCard\n width=\"100%\"\n maxWidth=\"100%\"\n headerName={activeReview.kind === 'page'\n ? 'Page format approved'\n : activeReviewActionLabel === 'Split'\n ? 'Split approved'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge approved'\n : 'User approved'}\n headerIcon={activeReview.kind === 'page'\n ? <Check size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Merged'\n ? <GitMerge size={18} strokeWidth={2} />\n : activeReviewActionLabel === 'Split'\n ? <ChartBreakoutCircle width={18} height={18} />\n : <CircleCheck size={18} strokeWidth={2} />}\n title={activeReviewTitle}\n pageNo={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n summary={shouldShowRevert && activeRevertData ? (\n <Stack spacing={0.75}>\n {activeRevertDescription && (\n <ApprovalDescriptionBanner icon={<CircleCheck size={14} strokeWidth={2} />} description={activeRevertDescription} />\n )}\n\n {onSaveAsLearning && \n // !learningSavedReviewIds.has(activeReview.id) &&\n (\n <SaveAsLearningCard\n disabled={disableAllActions}\n onSave={async () => {\n const result = await onSaveAsLearning(\n { operationId: activeRevertInfo?.operation_id ?? null },\n getReviewContext(activeReview)\n );\n\n if (result && result.success) {\n closeActiveReview();\n }\n\n return result;\n }}\n onSaveComplete={() => {\n setLearningSavedReviewIds((current) => {\n const next = new Set(current);\n next.add(activeReview.id);\n return next;\n });\n closeActiveReview();\n }}\n onSaveError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n />\n )}\n <RevertCard\n icon={<CircleCheck size={14} strokeWidth={2} />}\n title={activeReviewTitle}\n pageRange={`Page ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n description={activeRevertDescription ?? null}\n revertData={activeRevertData}\n confirmDisabled={activeReview.kind === 'page' ? !canRevertActiveReview : onRevert == null || !canRevertActiveReview}\n showDocumentHeader={false}\n onRevert={async () => {\n if (activeReview.kind === 'page') {\n if (!onPageTypeRevert || activePageClassificationIds.length === 0) {\n const error = new Error(\n 'SegmentReviewPdfWrapper requires onPageTypeRevert and at least one classification id to revert a page-type decision.'\n );\n onActionError?.(error, getReviewContext(activeReview));\n throw error;\n }\n\n let result: void | RevertActionResult = undefined;\n for (const classificationId of activePageClassificationIds) {\n result = await onPageTypeRevert(\n { classification_id: classificationId, human_verdict: 'No' },\n getReviewContext(activeReview)\n );\n }\n return result;\n }\n\n if (!onRevert) {\n throw new Error('SegmentReviewPdfWrapper requires onRevert to handle a revert confirmation.');\n }\n\n if (!activeRevertInfo) {\n throw new Error('There is no valid revert operation for this review.');\n }\n\n const expectedRevertType = isStructuralReviewResult\n ? 'boundary'\n : activeReview.kind === 'label'\n ? 'label'\n : activeReview.kind === 'boundary'\n ? 'boundary'\n : null;\n\n const actualRevertType = normalizeRevertType(activeRevertInfo.type);\n\n if (expectedRevertType && actualRevertType !== expectedRevertType) {\n throw new Error(\n `Cannot use ${actualRevertType ?? 'unknown'} revert metadata for this review. Expected ${expectedRevertType}.`\n );\n }\n\n return onRevert(activeRevertInfo, getReviewContext(activeReview));\n }}\n onRevertError={(error) => {\n onActionError?.(error, getReviewContext(activeReview));\n }}\n onRevertComplete={(result) => {\n setLocallyResolvedReviewIds(() => new Set<string>());\n\n if (activeReview.kind !== 'page') {\n setOptimisticRangeAdjustedSegmentKeys(() => new Set<string>());\n setOptimisticStructuralActions(() => new Map<string, BoundaryReviewAction>());\n }\n\n const revertedSegment = activeRevertData.previousSegments[0] ?? activeRevertData.currentSegment;\n const anchorRect = anchorElement?.getBoundingClientRect();\n const viewerRect = viewerHostRef.current?.getBoundingClientRect();\n const toastWidth = Math.min(REVIEW_CARD_MAX_WIDTH, Math.max(220, asideWidth));\n const preferredLeft = anchorRect?.left ?? ((viewerRect?.right ?? window.innerWidth - toastWidth - 8) + 8);\n const toastLeft = Math.max(8, Math.min(preferredLeft, window.innerWidth - toastWidth - 8));\n const toastTop = anchorRect?.bottom == null ? Math.max(8, viewerRect?.top ?? 8) : anchorRect.bottom + 8;\n\n setLocallyResolvedReviewIds(() => new Set<string>());\n if (activeReview.kind !== 'page') {\n pendingStructuralAdvanceRef.current = null;\n }\n setIsRevertToastVisible(false);\n setRevertSuccess({\n title: activeReviewActionLabel === 'Split'\n ? 'Split reverted'\n : activeReviewActionLabel === 'Merged'\n ? 'Merge reverted'\n : 'Approval reverted',\n description: result?.message?.trim() || null,\n segment: revertedSegment,\n position: { top: toastTop, left: toastLeft, width: toastWidth },\n });\n closeActiveReview();\n }}\n />\n </Stack>\n ) : undefined}\n additionalActions={activeBoundaryReview ? (\n <ReviewedBoundaryActions\n metadata={activeBoundaryReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n startPage={activeReview.segment.start_page}\n endPage={activeReview.segment.end_page}\n title={activeReviewTitle}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n disabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(action, details) => {\n void completeAction(activeBoundaryReview, action, details);\n }}\n />\n ) : undefined}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: { borderColor: '#16A34A' },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: '#16A34A',\n },\n },\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n : activeReview.kind === 'boundary' ? (\n <BoundaryCard\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n totalPages={totalPages}\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n reviewAction={activeReview.segment.review_action ?? undefined}\n previousSegmentTitle={previousSegmentTitle}\n nextSegmentTitle={nextSegmentTitle}\n manualPrompt={manualPrompt ?? \"Set a custom boundary\"}\n defaultStartPage={activeReview.segment.start_page}\n defaultEndPage={activeReview.segment.end_page}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onBoundaryAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(_selectedIndex, option, details) => {\n if (details && isBoundaryReviewAction(option.id)) {\n void completeAction(activeReview, option.id, details);\n }\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.kind === 'label' ? (\n <LabelCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={\n activeReview.metadata.current_label ||\n activeReview.segment.label ||\n activeReview.segment.title\n }\n pageNo={`Pages ${activeReview.segment.start_page}-${activeReview.segment.end_page}`}\n content={activeReview.review_step.question ?? null}\n revertSummary={activeRevertSummary}\n cognitiveScore={activeReview.review_step.score}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onLabelAction ||\n pendingReviewId === activeReview.id\n }\n confirmationBlocked={isTitleConfirmationBlocked}\n confirmationWarning={isTitleConfirmationBlocked\n ? 'Please confirm the boundary before confirming the title.'\n : undefined}\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onAdjustManually={() => onAdjustManually?.(getReviewContext(activeReview))}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : activeReview.metadata.type_choices?.length === 2 ? (\n <PageTypeChoiceCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n choices={activeReview.metadata.type_choices}\n cognitiveScore={activeReview.review_step.score}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onConfirm={(selectedPageTypes) => {\n void completePageTypeChoices(activeReview, selectedPageTypes);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n ) : (\n <PageCheck\n key={activeReview.id}\n width=\"100%\"\n maxWidth=\"100%\"\n title={activeReview.segment.label || activeReview.segment.title}\n pageNo={`Page ${activeReview.pageNumber}`}\n content={activeReview.review_step.reason}\n cognitiveScore={activeReview.review_step.score}\n pageType={activeReview.metadata.page_type}\n metadata={activeReview.metadata}\n styles={{\n root: {\n borderColor: activeReviewColors.cardBorder,\n },\n header: {\n '& > .MuiSvgIcon-root, & .MuiTypography-root': {\n color: activeReviewColors.text,\n },\n },\n }}\n confirmDisabled={\n disableAllActions ||\n !onPageAction ||\n pendingReviewId === activeReview.id\n }\n onActionConfirm={(action, details) => {\n void completeAction(activeReview, action, details);\n }}\n onCognitiveClick={hasCognitiveIntegrityContent\n ? () => {\n setIsCognitiveIntegrityOpen(true);\n onCognitiveClick?.(getReviewContext(activeReview));\n }\n : undefined}\n onClose={closeActiveReview}\n />\n )}\n </div>\n </CardWrapper>\n )}\n {revertSuccess && (\n <Portal>\n <Box\n aria-live=\"polite\"\n sx={{\n position: 'fixed',\n top: revertSuccess.position.top,\n left: revertSuccess.position.left,\n zIndex: 1600,\n width: revertSuccess.position.width,\n maxWidth: 'calc(100vw - 16px)',\n opacity: isRevertToastVisible ? 1 : 0,\n transform: isRevertToastVisible\n ? 'translateY(0)'\n : 'translateY(-6px)',\n transition: 'opacity 500ms ease, transform 500ms ease',\n filter: 'drop-shadow(0 12px 24px rgba(15, 23, 42, 0.18))',\n pointerEvents: isRevertToastVisible ? 'auto' : 'none',\n }}\n >\n <RevertSuccessCard\n title={revertSuccess.title}\n description={revertSuccess.description}\n onReview={() => reviewRevertedSegment(revertSuccess.segment)}\n />\n </Box>\n </Portal>\n )}\n </div>\n );\n}\n"],"names":["REVIEW_CARD_MAX_WIDTH","SegmentPdfSpecialZoomLevel","SEGMENT_PDF_SPECIAL_ZOOM_LEVEL","ActualSize","SpecialZoomLevel","PageFit","PageWidth","getReviewContext","item","reviewId","id","segment","pageNumber","SegmentReviewPdfWrapper","pdfUrl","pdfName","segments","totalPages","styles","pdfViewerProps","specialZoomLevel","showBadges","sortByConfidence","filterByConfidence","showBadgeNavigation","autoSelectReviewOnPageChange","autoAdvanceAfterConfirm","autoAdvanceScoreBand","badgePreloadPages","badgeOffsetTop","badgeOffsetRight","badgeOffsetLeft","initialReviewId","manualPrompt","heightBuffer","onBoundaryAction","onLabelAction","onPageAction","onPageTypeRevert","onRevert","onActiveReviewChange","onCurrentPageChange","onActionError","disableAllActions","disablePdfAnnotations","disablePdfTextLayer","disableTitleCheckUntilBoundaryCheckCompleted","onAdjustManually","onCognitiveClick","className","style","viewerStyle","railStyle","redirectionData","onBadgeSelected","onSaveAsLearning","closePopups","onPdfLoadError","console","log","boundaryReviews","labelReviews","pageReviews","useMemo","extractSegmentReviewData","optimisticStructuralActions","setOptimisticStructuralActions","useState","Map","optimisticRangeAdjustedSegmentKeys","setOptimisticRangeAdjustedSegmentKeys","Set","segmentNumberByKey","numberByKey","nextSegmentNumber","forEach","index","segmentKey","getSegmentReviewKey","has","set","segmentsWithTitleReviews","map","review","pendingMergeImpactedSegmentKeys","getPendingMergeImpactedSegmentKeys","useEffect","current","changed","next","action","find","hasPolledStructuralAction","delete","optimisticMergeImpactedSegmentKeys","getOptimisticMergeImpactedSegmentKeys","asideRef","useRef","reviews","filter","shouldHideStructuralBoundaryReview","review_step","get","kind","metadata","focus_page","start_page","page_num","sort","left","right","leftSegmentNumber","Number","MAX_SAFE_INTEGER","rightSegmentNumber","reviewStepIndex","localeCompare","pdfSegments","title","label","trim","page_count","end_page","currentPage","setCurrentPage","activeReviewId","setActiveReviewId","selectedNavigationReviewId","setSelectedNavigationReviewId","isCognitiveIntegrityOpen","setIsCognitiveIntegrityOpen","anchorElement","setAnchorElement","navigationRequest","setNavigationRequest","locallyResolvedReviewIds","setLocallyResolvedReviewIds","pendingReviewId","setPendingReviewId","activePageGroup","setActivePageGroup","revertSuccess","setRevertSuccess","isRevertToastVisible","setIsRevertToastVisible","navigationSequenceRef","pendingNavigationRef","pendingStructuralAdvanceRef","badgeElementsRef","pageGroupElementRef","wrapperRef","viewerHostRef","asideWidth","setAsideWidth","requestedRailWidth","aside","width","responsiveRailWidth","closeAllPopups","useCallback","size","updateAsideWidth","nextWidth","getBoundingClientRect","resizeObserver","ResizeObserver","observe","disconnect","resolvedReviewIds","resolvedIds","add","activeReview","isTitleConfirmationBlocked","some","boundaryScore","getResolvedScore","score","confidence","activeSegmentIndex","findIndex","previousSegment","nextSegment","previousSegmentTitle","nextSegmentTitle","activeReviewColors","getConfidenceColors","awaiting_llm","activeCognitiveReasons","reasons","length","hasCognitiveIntegrityContent","Boolean","text","includes","type","toLowerCase","reason","gap","activeReviewActionLabel","getBoundaryReviewActionBadgeLabel","stable_key","getTitleReviewActionBadgeLabel","activeTitleDecisionValues","human_action_enum","human_resolution","isMergeOrSplitTitleReview","value","normalizedValue","toUpperCase","hasVisibleBoundaryReviewForActiveSegment","isHiddenBoundaryStructuralTitleReview","activeBoundaryReview","boundaryReview","review_action","boundary_margin","user_actions","activeReviewTitle","activeStepRevertInfo","revert","segmentRevertInfo","normalizeRevertType","structuralStepRevertInfo","review_steps","reverse","step","stepType","fallbackRevertInfo","fallbackRevertDecision","decision","learningSavedReviewIds","setLearningSavedReviewIds","isSetRangeStructuralResult","current_segment_ids","previous_state","isStructuralReviewResult","activeRevertInfo","structuralSummaryStep","operation_id","flatMap","change_summary","activeRevertSummary","summary","activeRevertDescription","activeRevertData","currentSegment","startPage","endPage","previousSegments","activePageClassificationIds","type_choices","choice","classification_id","canRevertActiveReview","revertable","shouldShowRevert","requestPageNavigation","requestId","selectReview","segment_id","frameId","requestAnimationFrame","fadeTimeoutId","window","setTimeout","removeTimeoutId","cancelAnimationFrame","clearTimeout","pages","pageIndex","targetPage","closeActiveReview","groupLabel","matchingReview","classificationId","segmentId","segmentStartPage","isInteger","redirectionPageType","pageType","matchingPage","matchesPageType","page_type","reviewRevertedSegment","targetReview","isEligibleAutoAdvanceReview","excludedReviewId","scoreBand","getReviewScoreBand","matchesScoreBand","hasCurrentLocalResolution","isReviewStepResolutionCurrent","isReviewStepResolved","selectNextReview","completedReviewId","completedIndex","nextReview","completePageTypeChoices","async","selectedPageTypes","choices","selectedTypes","context","orderedChoices","isLeftSelected","PageCheckActionEnum","YES","NO","error","completeAction","details","boundaryAction","boundaryDetails","effectiveBoundaryAction","BoundaryReviewActionEnum","SET_RANGE","newStart","newEnd","expanded","shrunk","MERGE_PREV","MERGE_NEXT","SPLIT_HERE","isStructuralBoundaryAction","MERGE_PREVIOUS","originalSegmentIndex","segmentSignature","JSON","stringify","key","version","ready","isMergeAction","titleReview","pendingAdvance","targetSegmentIndex","Math","max","segmentIndexByKey","segmentIndex","pageReview","navigationReviews","availableReviews","remainingConfidenceOrder","confidenceOrder","confidenceRank","leftConfidence","rightConfidence","displayedNavigationIndex","navigationInputValue","setNavigationInputValue","navigationInputError","setNavigationInputError","navigationInputChangedRef","navigateToReviewIndex","String","timerId","requestedPosition","requestedIndex","badgeLabelById","reviewsBySegment","segmentReviews","push","labels","segmentNumber","suffix","fromCharCode","floor","getBadgeSuffix","badgeSlotById","byPage","slots","setPreloadedRenderRange","visibleRange","min","numPages","updateBadgePositions","wrapper","viewerHost","wrapperRect","scrollContainer","querySelector","visibleRect","badge","page","visibility","pageRect","slot","badgeTop","top","badgeBottom","offsetHeight","isBadgePositionVisible","bottom","pill","pillTop","pillBottom","isPillPositionVisible","activeBadge","handleNavigationSettled","event","pendingNavigation","schedulePositionUpdate","addEventListener","mutationObserver","MutationObserver","childList","subtree","attributes","attributeFilter","removeEventListener","jsxs","ref","display","position","height","minWidth","overflowX","overflowY","children","alignItems","jsx","flex","boxSizing","PdfViewer","highlightText","highlightPages","highlightCordinatePages","useCoordinates","showRotateButton","onError","defaultScale","onNavigationSettled","setRenderRange","maxWidth","minHeight","overflow","zIndex","justifyContent","padding","border","borderRadius","backgroundColor","boxShadow","font","Typography","fontFamily","sx","fontSize","fontWeight","color","whiteSpace","Tooltip","open","placement","arrow","inputMode","pattern","onFocus","onBlur","numericValue","onChange","inputValue","target","test","isOutOfRange","textAlign","outline","direction","isPrevious","targetIndex","isDisabled","disabled","onClick","placeItems","background","cursor","viewBox","fill","d","stroke","strokeWidth","strokeLinecap","strokeLinejoin","isActive","displayScore","formatScore","humanActionBadgeLabel","badgeValue","isAwaitingLlm","confidenceColors","isReviewed","element","alignContent","flexDirection","xmlns","marginLeft","CircleCheck","divider","CardWrapper","offset","CognitiveIntegrity","onBack","onClose","ReviewedCard","headerName","headerIcon","Check","GitMerge","ChartBreakoutCircle","pageNo","Stack","spacing","ApprovalDescriptionBanner","icon","description","SaveAsLearningCard","onSave","result","operationId","success","onSaveComplete","onSaveError","RevertCard","pageRange","revertData","confirmDisabled","showDocumentHeader","Error","human_verdict","expectedRevertType","actualRevertType","onRevertError","onRevertComplete","revertedSegment","anchorRect","viewerRect","toastWidth","preferredLeft","innerWidth","toastLeft","toastTop","message","additionalActions","ReviewedBoundaryActions","reviewAction","onConfirm","cognitiveScore","root","borderColor","header","BoundaryCard","content","question","revertSummary","defaultStartPage","defaultEndPage","cardBorder","_selectedIndex","option","isBoundaryReviewAction","LabelCheck","current_label","confirmationBlocked","confirmationWarning","onActionConfirm","PageTypeChoiceCheck","PageCheck","Portal","Box","opacity","transform","transition","pointerEvents","RevertSuccessCard","onReview"],"mappings":"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"}
|