@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.
Files changed (271) hide show
  1. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js +1 -1
  2. package/dist/cjs/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  3. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js +1 -1
  4. package/dist/cjs/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  5. package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js +2 -0
  6. package/dist/cjs/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
  7. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js +1 -1
  8. package/dist/cjs/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  9. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  10. package/dist/cjs/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  11. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  12. package/dist/cjs/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  13. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js +1 -1
  14. package/dist/cjs/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  15. package/dist/cjs/features/CognitiveCompare/CompareContext.js +1 -1
  16. package/dist/cjs/features/CognitiveCompare/CompareContext.js.map +1 -1
  17. package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
  18. package/dist/cjs/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
  19. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  20. package/dist/cjs/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  21. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  22. package/dist/cjs/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  23. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
  24. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
  25. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
  26. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
  27. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  28. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  29. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
  30. package/dist/cjs/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
  31. package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
  32. package/dist/cjs/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
  33. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  34. package/dist/cjs/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  35. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  36. package/dist/cjs/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  37. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  38. package/dist/cjs/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  39. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  40. package/dist/cjs/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  41. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  42. package/dist/cjs/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  43. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  44. package/dist/cjs/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  45. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  46. package/dist/cjs/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  47. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  48. package/dist/cjs/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  49. package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
  50. package/dist/cjs/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
  51. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  52. package/dist/cjs/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  53. package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
  54. package/dist/cjs/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
  55. package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
  56. package/dist/cjs/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
  57. package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js +2 -0
  58. package/dist/cjs/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
  59. package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
  60. package/dist/cjs/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
  61. package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js +2 -0
  62. package/dist/cjs/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
  63. package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
  64. package/dist/cjs/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
  65. package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
  66. package/dist/cjs/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
  67. package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
  68. package/dist/cjs/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
  69. package/dist/cjs/features/PdfViewer/PdfContainer.js +1 -1
  70. package/dist/cjs/features/PdfViewer/PdfContainer.js.map +1 -1
  71. package/dist/cjs/features/PdfViewer/PdfViewer.js +1 -1
  72. package/dist/cjs/features/PdfViewer/PdfViewer.js.map +1 -1
  73. package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
  74. package/dist/cjs/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
  75. package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js +1 -1
  76. package/dist/cjs/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
  77. package/dist/cjs/features/SegmentReviewComponents/RevertCard.js +1 -1
  78. package/dist/cjs/features/SegmentReviewComponents/RevertCard.js.map +1 -1
  79. package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
  80. package/dist/cjs/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
  81. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  82. package/dist/cjs/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  83. package/dist/cjs/hooks/useOnDemandCitationFetch.js +1 -1
  84. package/dist/cjs/hooks/useOnDemandCitationFetch.js.map +1 -1
  85. package/dist/cjs/service/onDemandApi.js +1 -1
  86. package/dist/cjs/service/onDemandApi.js.map +1 -1
  87. package/dist/features/CognitiveCompare/CitationAnchor.js +1 -1
  88. package/dist/features/CognitiveCompare/CitationAnchor.js.map +1 -1
  89. package/dist/features/CognitiveCompare/CitationRenderer.js +1 -1
  90. package/dist/features/CognitiveCompare/CitationRenderer.js.map +1 -1
  91. package/dist/features/CognitiveCompare/CitationRendererInner.js +2 -0
  92. package/dist/features/CognitiveCompare/CitationRendererInner.js.map +1 -0
  93. package/dist/features/CognitiveCompare/CognitiveCompare.js +1 -1
  94. package/dist/features/CognitiveCompare/CognitiveCompare.js.map +1 -1
  95. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js +1 -1
  96. package/dist/features/CognitiveCompare/CognitiveCompareConstants.js.map +1 -1
  97. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js +1 -1
  98. package/dist/features/CognitiveCompare/CognitiveComparehelpers.js.map +1 -1
  99. package/dist/features/CognitiveCompare/CognitivePopup.js +1 -1
  100. package/dist/features/CognitiveCompare/CognitivePopup.js.map +1 -1
  101. package/dist/features/CognitiveCompare/CompareContext.js +1 -1
  102. package/dist/features/CognitiveCompare/CompareContext.js.map +1 -1
  103. package/dist/features/CognitiveCompare/GptWebCitationPanel.js +2 -0
  104. package/dist/features/CognitiveCompare/GptWebCitationPanel.js.map +1 -0
  105. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js +1 -1
  106. package/dist/features/CognitiveCompare/Guidelines/components/GuidelinePanel.js.map +1 -1
  107. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js +1 -1
  108. package/dist/features/CognitiveCompare/Guidelines/components/WebGptPanel.js.map +1 -1
  109. package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js +2 -0
  110. package/dist/features/CognitiveCompare/Guidelines/utils/guidelineTargets.js.map +1 -0
  111. package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js +2 -0
  112. package/dist/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.js.map +1 -0
  113. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js +1 -1
  114. package/dist/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.js.map +1 -1
  115. package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js +2 -0
  116. package/dist/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.js.map +1 -0
  117. package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js +2 -0
  118. package/dist/features/CognitiveCompare/components/GuidelineSkeletonLoader.js.map +1 -0
  119. package/dist/features/CognitiveCompare/components/LHSSectionRow.js +1 -1
  120. package/dist/features/CognitiveCompare/components/LHSSectionRow.js.map +1 -1
  121. package/dist/features/CognitiveCompare/components/RHSSectionRow.js +1 -1
  122. package/dist/features/CognitiveCompare/components/RHSSectionRow.js.map +1 -1
  123. package/dist/features/CognitiveCompare/components/SectionAccordion.js +1 -1
  124. package/dist/features/CognitiveCompare/components/SectionAccordion.js.map +1 -1
  125. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js +1 -1
  126. package/dist/features/CognitiveCompare/components/SubSectionAccordion.js.map +1 -1
  127. package/dist/features/CognitiveCompare/components/SvgConnectors.js +1 -1
  128. package/dist/features/CognitiveCompare/components/SvgConnectors.js.map +1 -1
  129. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js +1 -1
  130. package/dist/features/CognitiveCompare/hooks/memoizedMarkdown.js.map +1 -1
  131. package/dist/features/CognitiveCompare/hooks/useCompareData.js +1 -1
  132. package/dist/features/CognitiveCompare/hooks/useCompareData.js.map +1 -1
  133. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js +1 -1
  134. package/dist/features/CognitiveCompare/hooks/useLinesCalculator.js.map +1 -1
  135. package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js +2 -0
  136. package/dist/features/CognitiveCompare/hooks/useOnDemandCitationCache.js.map +1 -0
  137. package/dist/features/CognitiveCompare/hooks/useSideBySide.js +1 -1
  138. package/dist/features/CognitiveCompare/hooks/useSideBySide.js.map +1 -1
  139. package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js +2 -0
  140. package/dist/features/CognitiveCompare/onDemandCitations/cacheKey.js.map +1 -0
  141. package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js +2 -0
  142. package/dist/features/CognitiveCompare/onDemandCitations/contextBuilder.js.map +1 -0
  143. package/dist/features/CognitiveCompare/onDemandCitations/href.js +2 -0
  144. package/dist/features/CognitiveCompare/onDemandCitations/href.js.map +1 -0
  145. package/dist/features/CognitiveCompare/onDemandCitations/payload.js +2 -0
  146. package/dist/features/CognitiveCompare/onDemandCitations/payload.js.map +1 -0
  147. package/dist/features/CognitiveCompare/onDemandCitations/response.js +2 -0
  148. package/dist/features/CognitiveCompare/onDemandCitations/response.js.map +1 -0
  149. package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js +2 -0
  150. package/dist/features/CognitiveCompare/utils/normalizeCompactedGfmTables.js.map +1 -0
  151. package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js +2 -0
  152. package/dist/features/CognitiveCompare/utils/normalizeInlineMarkdown.js.map +1 -0
  153. package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js +2 -0
  154. package/dist/features/CognitiveCompare/utils/normalizeRedlineMarkdown.js.map +1 -0
  155. package/dist/features/PdfViewer/PdfContainer.js +1 -1
  156. package/dist/features/PdfViewer/PdfContainer.js.map +1 -1
  157. package/dist/features/PdfViewer/PdfViewer.js +1 -1
  158. package/dist/features/PdfViewer/PdfViewer.js.map +1 -1
  159. package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js +2 -0
  160. package/dist/features/SegmentReviewComponents/ApprovalDescriptionBanner.js.map +1 -0
  161. package/dist/features/SegmentReviewComponents/BoundaryCard.js +1 -1
  162. package/dist/features/SegmentReviewComponents/BoundaryCard.js.map +1 -1
  163. package/dist/features/SegmentReviewComponents/RevertCard.js +1 -1
  164. package/dist/features/SegmentReviewComponents/RevertCard.js.map +1 -1
  165. package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js +2 -0
  166. package/dist/features/SegmentReviewComponents/SaveAsLearningCard.js.map +1 -0
  167. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js +1 -1
  168. package/dist/features/SegmentReviewComponents/SegmentReviewPdfWrapper.js.map +1 -1
  169. package/dist/hooks/useOnDemandCitationFetch.js +1 -1
  170. package/dist/hooks/useOnDemandCitationFetch.js.map +1 -1
  171. package/dist/service/onDemandApi.js +1 -1
  172. package/dist/service/onDemandApi.js.map +1 -1
  173. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts +2 -0
  174. package/dist/types/features/CognitiveCompare/CitationAnchor.d.ts.map +1 -1
  175. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts +8 -1
  176. package/dist/types/features/CognitiveCompare/CitationRenderer.d.ts.map +1 -1
  177. package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts +13 -0
  178. package/dist/types/features/CognitiveCompare/CitationRendererInner.d.ts.map +1 -0
  179. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts +1 -1
  180. package/dist/types/features/CognitiveCompare/CognitiveCompare.d.ts.map +1 -1
  181. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts +1 -1
  182. package/dist/types/features/CognitiveCompare/CognitiveCompareConstants.d.ts.map +1 -1
  183. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts +14 -1
  184. package/dist/types/features/CognitiveCompare/CognitiveCompareTypes.d.ts.map +1 -1
  185. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts +12 -0
  186. package/dist/types/features/CognitiveCompare/CognitiveComparehelpers.d.ts.map +1 -1
  187. package/dist/types/features/CognitiveCompare/CognitivePopup.d.ts.map +1 -1
  188. package/dist/types/features/CognitiveCompare/CompareContext.d.ts +10 -1
  189. package/dist/types/features/CognitiveCompare/CompareContext.d.ts.map +1 -1
  190. package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts +7 -0
  191. package/dist/types/features/CognitiveCompare/GptWebCitationPanel.d.ts.map +1 -0
  192. package/dist/types/features/CognitiveCompare/Guidelines/components/GuidelinePanel.d.ts.map +1 -1
  193. package/dist/types/features/CognitiveCompare/Guidelines/components/WebGptPanel.d.ts.map +1 -1
  194. package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts +3 -0
  195. package/dist/types/features/CognitiveCompare/Guidelines/utils/guidelineTargets.d.ts.map +1 -0
  196. package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts +3 -0
  197. package/dist/types/features/CognitiveCompare/Guidelines/utils/hasGptCitationObjects.d.ts.map +1 -0
  198. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts +14 -1
  199. package/dist/types/features/CognitiveCompare/Guidelines/utils/processGuidelinesMarkdown.d.ts.map +1 -1
  200. package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts +19 -0
  201. package/dist/types/features/CognitiveCompare/Guidelines/utils/resolveGuidelineSelection.d.ts.map +1 -0
  202. package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts +8 -0
  203. package/dist/types/features/CognitiveCompare/components/GuidelineSkeletonLoader.d.ts.map +1 -0
  204. package/dist/types/features/CognitiveCompare/components/LHSSectionRow.d.ts.map +1 -1
  205. package/dist/types/features/CognitiveCompare/components/RHSSectionRow.d.ts.map +1 -1
  206. package/dist/types/features/CognitiveCompare/components/SectionAccordion.d.ts.map +1 -1
  207. package/dist/types/features/CognitiveCompare/components/SubSectionAccordion.d.ts.map +1 -1
  208. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts +3 -2
  209. package/dist/types/features/CognitiveCompare/components/SvgConnectors.d.ts.map +1 -1
  210. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts +2 -1
  211. package/dist/types/features/CognitiveCompare/hooks/memoizedMarkdown.d.ts.map +1 -1
  212. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts +1 -1
  213. package/dist/types/features/CognitiveCompare/hooks/useCompareData.d.ts.map +1 -1
  214. package/dist/types/features/CognitiveCompare/hooks/useLinesCalculator.d.ts.map +1 -1
  215. package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts +10 -0
  216. package/dist/types/features/CognitiveCompare/hooks/useOnDemandCitationCache.d.ts.map +1 -0
  217. package/dist/types/features/CognitiveCompare/hooks/useSideBySide.d.ts.map +1 -1
  218. package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts +3 -0
  219. package/dist/types/features/CognitiveCompare/onDemandCitations/cacheKey.d.ts.map +1 -0
  220. package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts +16 -0
  221. package/dist/types/features/CognitiveCompare/onDemandCitations/contextBuilder.d.ts.map +1 -0
  222. package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts +6 -0
  223. package/dist/types/features/CognitiveCompare/onDemandCitations/href.d.ts.map +1 -0
  224. package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts +7 -0
  225. package/dist/types/features/CognitiveCompare/onDemandCitations/index.d.ts.map +1 -0
  226. package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts +4 -0
  227. package/dist/types/features/CognitiveCompare/onDemandCitations/payload.d.ts.map +1 -0
  228. package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts +3 -0
  229. package/dist/types/features/CognitiveCompare/onDemandCitations/response.d.ts.map +1 -0
  230. package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts +134 -0
  231. package/dist/types/features/CognitiveCompare/onDemandCitations/types.d.ts.map +1 -0
  232. package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts +7 -0
  233. package/dist/types/features/CognitiveCompare/utils/normalizeCompactedGfmTables.d.ts.map +1 -0
  234. package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts +6 -0
  235. package/dist/types/features/CognitiveCompare/utils/normalizeInlineMarkdown.d.ts.map +1 -0
  236. package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts +6 -0
  237. package/dist/types/features/CognitiveCompare/utils/normalizeRedlineMarkdown.d.ts.map +1 -0
  238. package/dist/types/features/PdfViewer/PdfContainer.d.ts +3 -2
  239. package/dist/types/features/PdfViewer/PdfContainer.d.ts.map +1 -1
  240. package/dist/types/features/PdfViewer/PdfViewer.d.ts +3 -2
  241. package/dist/types/features/PdfViewer/PdfViewer.d.ts.map +1 -1
  242. package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts +11 -0
  243. package/dist/types/features/SegmentReviewComponents/ApprovalDescriptionBanner.d.ts.map +1 -0
  244. package/dist/types/features/SegmentReviewComponents/BoundaryCard.d.ts.map +1 -1
  245. package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts +9 -1
  246. package/dist/types/features/SegmentReviewComponents/RevertCard.d.ts.map +1 -1
  247. package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts +15 -0
  248. package/dist/types/features/SegmentReviewComponents/SaveAsLearningCard.d.ts.map +1 -0
  249. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts +14 -1
  250. package/dist/types/features/SegmentReviewComponents/SegmentReviewPdfWrapper.d.ts.map +1 -1
  251. package/dist/types/hooks/useOnDemandCitationFetch.d.ts.map +1 -1
  252. package/dist/types/service/onDemandApi.d.ts.map +1 -1
  253. package/package.json +1 -1
  254. package/dist/cjs/features/Bookemon/BookemonStyles.js +0 -2
  255. package/dist/cjs/features/Bookemon/BookemonStyles.js.map +0 -1
  256. package/dist/cjs/lib/ui/icons.js +0 -2
  257. package/dist/cjs/lib/ui/icons.js.map +0 -1
  258. package/dist/cjs/lib/ui/materialCompat.js +0 -2
  259. package/dist/cjs/lib/ui/materialCompat.js.map +0 -1
  260. package/dist/features/Bookemon/BookemonStyles.js +0 -2
  261. package/dist/features/Bookemon/BookemonStyles.js.map +0 -1
  262. package/dist/lib/ui/icons.js +0 -2
  263. package/dist/lib/ui/icons.js.map +0 -1
  264. package/dist/lib/ui/materialCompat.js +0 -2
  265. package/dist/lib/ui/materialCompat.js.map +0 -1
  266. package/dist/types/features/Bookemon/BookemonStyles.d.ts +0 -6
  267. package/dist/types/features/Bookemon/BookemonStyles.d.ts.map +0 -1
  268. package/dist/types/lib/ui/icons.d.ts +0 -46
  269. package/dist/types/lib/ui/icons.d.ts.map +0 -1
  270. package/dist/types/lib/ui/materialCompat.d.ts +0 -117
  271. 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","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":"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"}
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","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":"wxBA4GA,MAAMA,EAAwB,IAQlB,IAAAC,GAAAA,IACVA,EAAa,WAAA,aACbA,EAAU,QAAA,UACVA,EAAY,UAAA,YAHFA,IAAAA,GAAA,CAAA,GAeZ,MAAMC,EAGF,CACFC,WAAyCC,EAAAA,iBAAiBD,WAC1DE,QAAsCD,EAAAA,iBAAiBC,QACvDC,UAAwCF,EAAAA,iBAAiBE,WA2IrDC,EAAoBC,IAAkD,CAC1EC,SAAUD,EAAKE,GACfC,QAASH,EAAKG,QACdC,WAAYJ,EAAKI,kEAqBnB,UAAgDC,OAC9CA,EAAAC,QACAA,EAAAC,SACAA,EAAAC,WACAA,EAAAC,OACAA,EAAAC,eACAA,EAAAC,iBACAA,EAAAC,WACAA,GAAa,EAAAC,iBACbA,EAAmB,MAAAC,mBACnBA,EAAqB,MAAAC,oBACrBA,GAAsB,EAAAC,6BACtBA,GAA+B,EAAAC,wBAC/BA,GAA0B,EAAAC,qBAC1BA,EAAAC,kBACAA,EAAoB,EAAAC,eACpBA,EAAiB,GAAAC,iBACjBA,EAAmB,GAAAC,gBACnBA,EAAkB,EAAAC,gBAClBA,EAAAC,aACAA,EAAAC,aACAA,EAAAC,iBACAA,EAAAC,cACAA,EAAAC,aACAA,EAAAC,iBACAA,EAAAC,SACAA,EAAAC,qBACAA,EAAAC,oBACAA,EAAAC,cACAA,EAAAC,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,GAAAC,iBACAA,GAAAC,YACAA,IAAc,EAAAC,eACdA,KAEQC,QAAAC,IAAI,4BAA6B1C,GACzC,MAAM2C,gBAAEA,GAAAC,aAAiBA,GAAcC,YAAAA,IAAgBC,EAAAA,QACrD,IAAMC,EAAAA,yBAAyBhD,GAC/B,CAACA,KAEIiD,GAA6BC,IAAkCC,WAEpE,IAAM,IAAIC,MACLC,GAAoCC,IACzCH,WAAsB,IAAM,IAAII,KAE5BC,GAAqBT,EAAAA,QACzB,KACQ,MAAAU,MAAkBL,IACxB,IAAIM,EAAoB,EAUjB,OARE1D,EAAA2D,QAAQ,CAAC/D,EAASgE,KACnB,MAAAC,EAAaC,EAAAA,oBAAoBlE,EAASgE,GAC3CH,EAAYM,IAAIF,KACPJ,EAAAO,IAAIH,EAAYH,GACPA,GAAA,KAIlBD,GAET,CAACzD,IAEGiE,GAA2BlB,EAAAA,QAC/B,IAAM,IAAIQ,IAAIV,GAAaqB,IAAKC,GAAWL,sBAAoBK,EAAOvE,WACtE,CAACiD,KAEGuB,GAAkCrB,EAAAA,QACtC,IAAMsB,EAAAA,mCAAmCrE,GACzC,CAACA,IAEHsE,EAAAA,UAAU,KACRpB,GAAgCqB,IAC9B,IAAIC,GAAU,EACR,MAAAC,EAAO,IAAIrB,IAAImB,GAYrB,OAVQA,EAAAZ,QAAQ,CAACe,EAAQb,KACvB,MAAMjE,EAAUI,EAAS2E,KAAMlF,GAC7BqE,EAAAA,oBAAoBrE,KAAUoE,GAE3BjE,IAAWgF,EAAAA,0BAA0BhF,EAAS8E,KACjDD,EAAKI,OAAOhB,GACFW,GAAA,KAIPA,EAAUC,EAAOF,KAEzB,CAACvE,IACJsE,EAAAA,UAAU,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,EAAAA,QAAQ,IAC1CgC,EAAAA,sCACL/E,EACAiD,GACAI,IAED,CAACA,GAAoCJ,GAA6BjD,IAC/DgF,GAAWC,SAAO,MAClBC,GAAUnC,EAAAA,QAAsB,IAAM,IACvCH,GACAuC,OAAQhB,IACNC,GAAgCL,IAAID,EAAAA,oBAAoBK,EAAOvE,YAC/DkF,GAAmCf,IAAID,EAAAA,oBAAoBK,EAAOvE,YAClEwF,EAAAA,mCACCjB,EAAOkB,YACPlB,EAAOvE,QACPqE,GAAyBF,IAAID,EAAAA,oBAAoBK,EAAOvE,UACxDqD,GAA4BqC,IAAIxB,EAAAA,oBAAoBK,EAAOvE,YAG9DsE,IAAKC,IAAY,IACbA,EACHoB,KAAM,WACN1F,WAAYsE,EAAOqB,SAASC,YAActB,EAAOvE,QAAQ8F,iBAE1D7C,GACAsC,OAAQhB,IACNC,GAAgCL,IAAID,EAAAA,oBAAoBK,EAAOvE,YAC/DkF,GAAmCf,IAAID,EAAoBA,oBAAAK,EAAOvE,WAEpEsE,IAAKC,IAAY,IACbA,EACHoB,KAAM,QACN1F,WAAYsE,EAAOvE,QAAQ8F,iBAE5B5C,GACAqC,OAAQhB,IACNC,GAAgCL,IAAID,EAAAA,oBAAoBK,EAAOvE,YAC/DkF,GAAmCf,IAAID,EAAoBA,oBAAAK,EAAOvE,WAEpEsE,IAAKC,IAAY,IACbA,EACHoB,KAAM,OACN1F,WAAYsE,EAAOqB,SAASG,UAAYxB,EAAOvE,QAAQ8F,eAE3DE,KAAK,CAACC,EAAMC,KACN,MAAAC,EACJvC,GAAmB8B,IAAIxB,EAAAA,oBAAoB+B,EAAKjG,WAAaoG,OAAOC,iBAChEC,EACJ1C,GAAmB8B,IAAIxB,EAAAA,oBAAoBgC,EAAMlG,WAAaoG,OAAOC,iBAEvE,OAAOJ,EAAKhG,WAAaiG,EAAMjG,YAC7BkG,EAAoBG,GACpBL,EAAKM,gBAAkBL,EAAMK,iBAC7BN,EAAKlG,GAAGyG,cAAcN,EAAMnG,MAC5B,CACFiD,GACAC,GACAC,GACAgC,GACA7B,GACAmB,GACAZ,GACAS,KAMIoC,GAActD,EAAAA,QAAQ,IAAM/C,EAASkE,IAAKtE,IAAa,IACxDA,EACH0G,MAAO1G,EAAQ2G,OAAOC,QAAU5G,EAAQ0G,MACxCG,WAAY7G,EAAQ6G,YAAc7G,EAAQ8G,SAAW9G,EAAQ8F,WAAa,KACvE,CAAC1F,KAEC2G,GAAaC,IAAkBzD,WAAS,IACxC0D,GAAgBC,IAAqB3D,EAAAA,SAC1CnC,GAAmB,OAEd+F,GAA4BC,IAAiC7D,EAAAA,SAElEnC,GAAmB,OACdiG,GAA0BC,IAA+B/D,YAAS,IAClEgE,GAAeC,IAAoBjE,WAA6B,OAChEkE,GAAmBC,IAAwBnE,WAAsC,OACjFoE,GAA0BC,IAA+BrE,EAAAA,SAC9D,QAAUI,MAELkE,GAAiBC,IAAsBvE,WAAwB,OAC/DwE,GAAiBC,IAAsBzE,WAIpC,OAGH0E,GAAeC,IAAoB3E,WAAoC,OACvE4E,GAAsBC,IAA2B7E,YAAS,GAC3D8E,GAAwBhD,SAAO,GAC/BiD,GAAuBjD,SAInB,MACJkD,GAA8BlD,SAK1B,MACJmD,GAAmBnD,EAAAA,OAAW,IAAA7B,KAC9BiF,GAAsBpD,SAA+B,MACrDqD,GAAarD,SAA8B,MAC3CsD,GAAgBtD,SAA8B,OAC7CuD,GAAYC,IAAiBtF,WAASlE,GACvCyJ,GAAqBxI,GAAQyI,OAAOC,OAAS,MAC7CC,GAAsB,OACI,iBAAvBH,GAAkC,GAAGA,OAAyBA,mBAGjEI,GAAiBC,EAAAA,YAAY,KACjCb,GAAqB3D,QAAU,KAC/B2C,IAA4B,GAC5BJ,GAAkB,MAClBM,GAAiB,MACjBQ,GAAmB,MACnBE,GAAiB,MACjBE,IAAwB,GACxBxG,IAAuB,KAAM,OAC5B,CAACA,IAEJ8C,EAAAA,UAAU,KACJ9B,IAA4BsG,MAC/B,CAACA,GAAgBtG,KAEpB8B,EAAAA,UAAU,KACVkD,GAA6BjD,IACvB,GAAiB,IAAjBA,EAAQyE,KACH,OAAAzE,EAGH,MAAAE,EAAO,IAAIlB,IAAIgB,GACrB,IAAIC,GAAU,EAgBd,OAdQU,GAAAvB,QAASlE,IAMsB,MAAnCA,EAAK4F,YAAYlB,QAAQO,QACzBD,EAAKV,IAAItE,EAAKE,MAET8E,EAAAI,OAAOpF,EAAKE,IACP6E,GAAA,KAIPA,EAAUC,EAAOF,KAEzB,CAACW,KAEFZ,EAAAA,UAAU,KACR,MAAMqE,EAAQ3D,GAAST,QACnB,IAACoE,IAAUtI,EAAY,OAE3B,MAAM4I,EAAmB,KACjB,MAAAC,EAAYP,EAAMQ,wBAAwBP,MAC5CM,EAAY,GAAGT,GAAcS,IAGlBD,IACjB,MAAMG,EAA2C,oBAAnBC,eAC1B,KACA,IAAIA,eAAeJ,GAGhB,OAFPG,GAAgBE,QAAQX,GAEjB,IAAMS,GAAgBG,cAC5B,CAAClJ,IAEE,MAAAmJ,GAAoBzG,EAAAA,QAAQ,KAC5B,MAAA0G,MAAkBlG,IAUjB,OARC2B,GAAAvB,QAASlE,IACuC,MAAnCA,EAAK4F,YAAYlB,QAAQO,QAG9B+E,EAAAC,IAAIjK,EAAKE,MAIlB8J,GACN,CAACvE,KAEIyE,GAAe5G,EAAAA,QACnB,IAAMmC,GAAQP,KAAMlF,GAASA,EAAKE,KAAOkH,KAAmB,KAC5D,CAACA,GAAgB3B,KAEb0E,GAA6B7G,EAAAA,QAAQ,OAEtCjB,IACsB,UAAvB6H,IAAcpE,OAKT3C,GAAgBiH,KAAM1F,IAC3B,GACEL,sBAAoBK,EAAOvE,WAAakE,EAAAA,oBAAoB6F,GAAa/J,UACzE4J,GAAkBzF,IAAII,EAAOxE,IAEtB,OAAA,EAGT,MAAMmK,EAAgBC,EAAAA,iBACpB5F,EAAOkB,YAAY2E,MACnB7F,EAAOkB,YAAY4E,YAKd,OAAiB,MAAjBH,GACLA,EA/gBkC,KAihBrC,CACDH,GACA/G,GACAd,GACA0H,KAEIU,GAAqC,MAAhBP,IACvB,EACA3J,EAASmK,UACNvK,GAAYkE,EAAAA,oBAAoBlE,KAAakE,EAAAA,oBAAoB6F,GAAa/J,UAE/EwK,GAAkBF,GAAqB,EACzClK,EAASkK,GAAqB,QAC9B,EACEG,GAAcH,IAAsB,EACtClK,EAASkK,GAAqB,QAC9B,EACEI,GAAuBF,IAAiB7D,OAAOC,QAAU4D,IAAiB9D,MAC1EiE,GAAmBF,IAAa9D,OAAOC,QAAU6D,IAAa/D,MAC9DkE,GAAqBC,EAAAA,oBACzBd,IAActE,YAAY2E,MAC1BL,IAActE,YAAY4E,WAC1BN,IAAc/J,QAAQqK,YAAYS,cAE9BC,GAAyBhB,IAActE,YAAYuF,SAASC,OAC9DlB,GAAatE,YAAYuF,QACzBjB,IAAc/J,QAAQqK,YAAYW,SAAW,GAC3CE,GAA+BC,QACnCJ,GAAuBd,KAAMpK,GAC3BA,EAAKuL,KAAKxE,QAAU,CAAC,WAAY,OAAOyE,SAASxL,EAAKyL,KAAK1E,OAAO2E,iBAEpExB,IAActE,YAAY+F,QAAQ5E,QAAUmD,IAActE,YAAYgG,KAAK7E,QAEvE8E,GAA0C,MAAhB3B,GAC5B,KACsB,aAAtBA,GAAapE,KACXgG,EAAAA,kCACE5B,GAAatE,YACbsE,GAAa/J,QACbqD,GAA4BqC,IAAIqE,GAAa/J,QAAQ4L,YAAc,KAErEC,EAAAA,+BACE9B,GAAatE,YACbsE,GAAa/J,QACbqD,GAA4BqC,IAAIqE,GAAa/J,QAAQ4L,YAAc,KAErEE,GAAmD,UAAvB/B,IAAcpE,KAC5C,CACE+F,GACA3B,GAAatE,YAAYsG,kBACzBhC,GAAatE,YAAYlB,QAAQO,OACjCiF,GAAatE,YAAYuG,kBAAkBlH,QAE7C,GACEmH,GAAmD,UAAvBlC,IAAcpE,MAC9CmG,GAA0B7B,KAAMiC,IAC9B,MAAMC,EAAkBD,GAAOtF,OAAOwF,eAAiB,GACvD,OAAOD,EAAgBd,SAAS,UAAYc,EAAgBd,SAAS,WAEnEgB,GAA2D,MAAhBtC,IAC/CzE,GAAQ2E,KACL1F,GACiB,aAAhBA,EAAOoB,MACPzB,EAAAA,oBAAoBK,EAAOvE,WACzBkE,sBAAoB6F,GAAa/J,UAEnCsM,GACJL,KAA8BI,GAG1BE,IADmB,aAAvBxC,IAAcpE,MAAuB2G,KAC4C,MAAhBvC,SAGzD,GAAsB,aAAtBA,GAAapE,KAA4B,OAAAoE,GAE7C,MAAMyC,EAAiBxJ,GAAgB+B,KACpCR,GACCL,EAAAA,oBAAoBK,EAAOvE,WAC3BkE,EAAAA,oBAAoB6F,GAAa/J,UAGrC,OAAIwM,EACK,IACFA,EACH7G,KAAM,WACN1F,WACEuM,EAAe5G,SAASC,YACxB2G,EAAexM,QAAQ8F,YAItB,IACFiE,GACHpE,KAAM,WACN1F,WACE8J,GAAa/J,QAAQyM,eAAe5G,YACpCkE,GAAa/J,QAAQ8F,WACvBF,SAAU,CACRC,WAAYkE,GAAa/J,QAAQyM,eAAe5G,YAAc,KAC9D6G,gBAAiB3C,GAAa/J,QAAQ0M,iBAAmB,KACzDC,aAAc,IAGjB,YACDC,GAAoC,MAAhB7C,GACtB,GACAA,GAAa/J,QAAQ2G,OAAOC,QAAUmD,GAAa/J,QAAQ0G,MACzDmG,GACN9C,IAActE,YAAYqH,OAEtBC,GACJhD,IAAc/J,QAAQ8M,OAElBE,GACJ1B,GACGA,GAAM1E,OAAO2E,cAEZ0B,GACY,MAAhBlD,QAEI,EAAA,IAAKA,GAAa/J,QAAQkN,cAAgB,IACvCC,UACApI,KAAMqI,IACL,MAAMC,EAAWD,EAAK9B,MAClB1E,OACD2E,cAGD,OAAa,kBAAb8B,GACa,yBAAbA,IAOA,aADAL,GAAoBI,EAAKN,QAAQxB,SAInCwB,OACFQ,GAAqBT,IACzB9C,IAAc/J,QAAQ8M,QACtBG,GACIM,GAAyBD,IAAoBE,SAAS5G,OAAOwF,cAEnEV,KACE6B,IACIlC,SAAS,UAETkC,IACIlC,SAAS,UAIb,MAACoC,GAAwBC,IAA6BnK,EAAAA,SAC1D,QAAUI,KAENgK,GAAoD,UAAvB5D,IAAcpE,MAAiF,cAA7DsH,IAA0BO,UAAU5G,OAAOwF,eAAiCa,GAAyBW,oBAAoB3C,SAAWgC,GAAyBY,eAAe5C,OAC3O6C,GAAuD,WAA5BpC,IAAoE,UAA5BA,IAAuCiC,GAC1GI,GACY,MAAhBhE,QAAmC,EAAA+D,GAC6B,aAAxDd,GAAoBC,IAA0B3B,MAAuB2B,GACpB,aAAjDD,GAAoBD,IAAmBzB,MAAuByB,GACV,aAApDC,GAAoBH,IAAsBvB,MAAuBuB,QAEnE,EAAsB,UAAtB9C,GAAapE,KAC0C,UAApDqH,GAAoBH,IAAsBvB,MAAoBuB,QAC/D,EAAsB,aAAtB9C,GAAapE,KAIH,aAFNqH,GACEH,IAAsBvB,MAEpBuB,GAGQ,aAFRG,GACIC,IAA0B3B,MAE5B2B,GAGQ,aAFRD,GACID,IAAmBzB,MAErByB,QAGV,OAAA,EAGNiB,GAAwBF,IAA4BC,IAAkBE,aAAe7N,EAAS8N,QAASlO,GAAWA,EAAQkN,cAAgB,IAAInI,KAAMqI,IACxJ,MAAMC,EAAWD,EAAK9B,MAAM1E,OAAO2E,cAGhC,KADiC,kBAAb8B,GAA6C,yBAAbA,GAC5B,OAAA,EAKzB,OAHkBD,EAAKpB,kBAAkBiC,cAAgBb,EAAKN,QAAQmB,cAAgBb,EAAKa,gBAG1EF,GAAiBE,cAAgB9C,QAAQiC,EAAKpB,kBAAkBmC,gBAAgBvH,eAEhG,EACCwH,GAAsBL,IAAkBM,SAASzH,QAAU,KAC3D0H,GAA0BR,GAA4BE,IAAuBhC,kBAAkBmC,gBAAgBvH,QAAUmH,IAAkBM,SAASzH,QAAU,GAAOmD,IAActE,aAAauG,kBAAkBmC,gBAAgBvH,QAAUmD,IAActE,aAAa4I,SAASzH,QAAU,GAC1R2H,GAA6D,SAAvBxE,IAAcpE,KACtD,CACE6I,eAAgB,CACd9H,MAAOkG,GACP6B,UAAW1E,GAAa/J,QAAQ8F,WAChC4I,QAAS3E,GAAa/J,QAAQ8G,UAEhC6H,iBAAkB,IAEpB5E,IAAgBgE,GACd,CACES,eAAgB,CACd9H,MAAOkG,GACP6B,UAAW1E,GAAa/J,QAAQ8F,WAChC4I,QAAS3E,GAAa/J,QAAQ8G,UAEhC6H,kBAAmBZ,GAAiBF,gBAAkB,IAAIK,QACvDlO,IACC,MAAM0G,EAA0B,OAAlB1G,EAAQ2G,MAClB,oBACA3G,EAAQ2G,OAAOC,OACnB,OAAOF,EACH,CAAC,CACCA,QACA+H,UAAWzO,EAAQ8F,WACnB4I,QAAS1O,EAAQ8G,WAEnB,MAIV,KACA8H,GAAqD,SAAvB7E,IAAcpE,KAC9CoE,GAAanE,SAASiJ,cAAcvK,IACjCwK,GAAWA,EAAOC,qBAEnBhF,GAAanE,SAASmJ,kBAClB,CAAChF,GAAanE,SAASmJ,mBACvB,IAEN,GACEC,GAA+C,SAAvBjF,IAAcpE,KACxCwF,QAAQzJ,GAAoBkN,GAA4B3D,OAAS,GACjEE,QACE4C,IAAkBE,cAClBF,IAAkBzC,OACe,IAAjCyC,IAAkBkB,YAElBC,GAAmB/D,QACvBoD,IAAoBS,IAGhBG,GAAwBhG,EAAAA,YAAY,CAAClJ,EAAoBH,KAC7DuI,GAAsB1D,SAAW,EACjC2D,GAAqB3D,QAAU,CAC7ByK,UAAW/G,GAAsB1D,QACjC1E,aACAH,YAEmB4H,GAAA,CACnBzH,aACAmP,UAAW/G,GAAsB1D,WAElC,IAUG0K,GAAelG,cAAatJ,KACc,IAA1CA,EAAKG,QAAQqK,YAAYS,eAEXpI,KAAA,CAChB5C,SAAUD,EAAKE,GACfuP,WAAYzP,EAAKG,QAAQsP,YAAc,KACvC/I,gBAAiB1G,EAAK0G,gBACtBZ,KAAM9F,EAAK8F,KACX1F,WAAYJ,EAAKI,WACjB2F,SAAU/F,EAAK+F,WAGjBoC,GAAmB,MACnBE,GAAiB,MACjBhB,GAAkBrH,EAAKE,IACvBqH,GAA8BvH,EAAKE,IACnCuH,IAA4B,GAG5BE,GAAiB,MACK2H,GAAAtP,EAAKI,WAAYJ,EAAKE,IACrB6B,IAAA/B,EAAKE,GAAIF,EAAKG,WACpC,CAAC4B,EAAsBc,GAAiByM,KAE3CzK,EAAAA,UAAU,KACR,IAAKuD,GAAe,OAEpB,MAAMsH,EAAUC,sBAAsB,IAAMpH,IAAwB,IAC9DqH,EAAgBC,OAAOC,WAAW,KACtCvH,IAAwB,IACvB,MACGwH,EAAkBF,OAAOC,WAAW,KACxCzH,GAAiB,OAChB,KAEH,MAAO,KACL2H,qBAAqBN,GACrBG,OAAOI,aAAaL,GACpBC,OAAOI,aAAaF,KAErB,CAAC3H,KAEJvD,EAAAA,UAAU,KACR,IAAKjC,GAAiB,OAGlB,GAAyB,cAAzBA,GAAgB6I,KAAsB,CAClC,MAAAyE,EAAQtN,GAAgBsN,OAAS,GACjC/L,EAAQvB,GAAgBuN,WAAa,EACrCC,EAAaF,EAAM/L,GACzB,GAAkB,MAAdiM,EAAoB,OASxB,OAPkBC,KAClBlI,GAAmB,CAAE+H,QAAO/L,QAAO2C,MAAOlE,GAAgB0N,YAAc,KACxE9H,GAAsB1D,SAAW,OACZ+C,GAAA,CACnBzH,WAAYgQ,EACZb,UAAW/G,GAAsB1D,SAGrC,CAIA,GAHAqD,GAAmB,MAGfvF,GAAgB3C,SAAU,CAC5B,MAAMsQ,EAAiB9K,GAAQP,KAAMlF,GACnCA,EAAKE,KAAO0C,GAAgB3C,YAC1B2C,GAAgB6I,MAAQzL,EAAK8F,OAASlD,GAAgB6I,OAG1D,GAAI8E,EAEF,YADAf,GAAae,EAGjB,CAEA,GAAI3N,GAAgB4N,iBAAkB,CACpC,MAAMD,EAAiB9K,GAAQP,KAAMlF,GACrB,SAAdA,EAAK8F,OAEH9F,EAAK+F,SAASmJ,oBAAsBtM,GAAgB4N,kBACpDxQ,EAAK+F,SAASiJ,cAAc5E,KACzB6E,GAAWA,EAAOC,oBAAsBtM,GAAgB4N,sBAG3D5N,GAAgB6N,WAChBzQ,EAAKG,QAAQsP,aAAe7M,GAAgB6N,cAC5C7N,GAAgB6I,MAAQzL,EAAK8F,OAASlD,GAAgB6I,OAG1D,GAAI8E,EAEF,YADAf,GAAae,EAGjB,CAEA,IAAK3N,GAAgBxC,aAAewC,GAAgB6I,KAAM,OAEpD,MAAAiF,EAAmBnK,OAAO3D,GAAgBxC,YAChD,IAAKmG,OAAOoK,UAAUD,IAAqBA,EAAmB,EAAG,OACjE,MAAME,EAAsBhO,GAAgBiO,UAAU9J,OAAO2E,cAEvD6E,EAAiB9K,GAAQP,KAAMlF,IACnC,MAAM8Q,EAA6B,SAAd9Q,EAAK8F,KACtB9F,EAAKI,WACLJ,EAAKG,QAAQ8F,WACX8K,EAAgC,SAAd/Q,EAAK8F,OAC1B8K,GACD5Q,EAAK+F,SAASiL,YAAcJ,GAC5B5Q,EAAK+F,SAASiJ,cAAc5E,KACzB6E,GAAWA,EAAO+B,YAAcJ,GAKrC,QAHwBhO,GAAgB6N,WACtCzQ,EAAKG,QAAQsP,aAAe7M,GAAgB6N,YAG5CK,IAAiBJ,GACjB1Q,EAAK8F,OAASlD,GAAgB6I,MAC9BsF,IAGAR,EACFf,GAAae,GAMY,SAAzB3N,GAAgB6I,OACA4E,KAClB7H,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBzH,WAAYsQ,EACZnB,UAAW/G,GAAsB1D,YAIlC,CAAClC,GAAiB4M,GAAc/J,KAE7B,MAAA4K,GAAoB/G,EAAAA,YAAY,KACpCb,GAAqB3D,QAAU,KAC/B2C,IAA4B,GAC5BJ,GAAkB,MAClBM,GAAiB,MACjB5F,IAAuB,KAAM,OAC5B,CAACA,IAEEkP,GAAwB3H,cAAanJ,IACzCoI,IAAwB,GACxBF,GAAiB,MAEjB,MAAM6I,EAAezL,GAAQP,KAAMlF,IAChC+J,GAAkBzF,IAAItE,EAAKE,KACd,aAAdF,EAAK8F,MACL9F,EAAKG,QAAQ8F,aAAe9F,EAAQyO,WACpC5O,EAAKG,QAAQ8G,WAAa9G,EAAQ0O,UAC/BpJ,GAAQP,KAAMlF,IAChB+J,GAAkBzF,IAAItE,EAAKE,KAC5BF,EAAKG,QAAQ8F,YAAc9F,EAAQyO,WACnC5O,EAAKG,QAAQ8G,UAAY9G,EAAQyO,WAG/BsC,EACF1B,GAAa0B,IAIGb,KAClB7H,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBzH,WAAYD,EAAQyO,UACpBW,UAAW/G,GAAsB1D,YAElC,CAACuL,GAAmBtG,GAAmBtE,GAAS+J,KAE7C2B,GAA8B7H,EAAAA,YAAY,CAC9CtJ,EACAoR,KAEA,MAAMC,EAAYC,EAAAA,mBAChBtR,EAAK4F,YAAY2E,OAEbgH,EAA2C,MAAxBrQ,GACvBmQ,IAAcnQ,EACVsQ,EACJ1J,GAAyBxD,IAAItE,EAAKE,KAClCuR,EAA8BA,8BAAAzR,EAAK4F,YAAa5F,EAAKG,SAEvD,OAAOH,EAAKE,KAAOkR,GACjBG,IAC0C,IAA1CvR,EAAKG,QAAQqK,YAAYS,eACxByG,uBAAqB1R,EAAK4F,YAAa5F,EAAKG,WAC5CqR,GACF,CAACtQ,EAAsB4G,KAEpB6J,GAAmBrI,cAAasI,IACpC,IAAK3Q,EAEH,YADkBoP,KAIpB,MAAMwB,EAAiBpM,GAAQiF,UAC5B1K,GAASA,EAAKE,KAAO0R,GAElBE,EAAarM,GAAQP,KAAK,CAAClF,EAAMmE,IACrCA,EAAQ0N,GACRV,GAA4BnR,EAAM4R,KAC/BnM,GAAQP,KAAMlF,GACjBmR,GAA4BnR,EAAM4R,IAG/BE,EAKiBnC,sBAAA,IAAMH,GAAasC,IAJrBzB,MAKnB,CACDpP,EACAoP,GACAc,GACA1L,GACA+J,KAGIuC,GAA0BzI,EAAAA,YAAY0I,MAC1ChS,EACAiS,KAEA,GAAI/P,KAAsBN,GAA6C,IAA7BqQ,EAAkB7G,OAAc,OAE1E,MAAM8G,EAAUlS,EAAK+F,SAASiJ,cAAgB,GAC1C,GAAmB,IAAnBkD,EAAQ9G,OAAc,OAEpB,MAAA+G,EAAgB,IAAIrO,IAAImO,GACxBG,EAAUrS,EAAiBC,GAC3BqS,EAAiB,IAAIH,GAAS/L,KAAK,CAACC,EAAMC,KAC9C,MAAMiM,EAAiBH,EAAc7N,IAAI8B,EAAK4K,WAE9C,OAAOsB,IADiBH,EAAc7N,IAAI+B,EAAM2K,WACJ,EAAIsB,GAAsB,EAAA,IAGxErK,GAAmBjI,EAAKE,IAEpB,IACF,IAAA,MAAW+O,KAAUoD,EAAgB,CAC7B,MAAApN,EAASkN,EAAc7N,IAAI2K,EAAO+B,WACpCuB,sBAAoBC,IACpBD,EAAoBA,oBAAAE,SAElB7Q,EACJqD,EACA,CACEA,SACA4L,SAAU5B,EAAO+B,UACjBjL,SAAU,CACR+G,aAAc,CAACyF,EAAoBA,oBAAAC,IAAKD,EAAAA,oBAAoBE,IAC5DvM,SAAUlG,EAAK+F,SAASG,SACxB8K,UAAW/B,EAAO+B,UAClB9B,kBAAmBD,EAAOC,oBAG9BkD,EAEJ,CAEArK,GAA6BjD,IACrB,MAAAE,EAAO,IAAIlB,IAAIgB,GAEd,OADFE,EAAAiF,IAAIjK,EAAKE,IACP8E,IAET2M,GAAiB3R,EAAKE,UACfwS,GACPzQ,IAAgByQ,EAAON,EAAO,CAC9B,QACAnK,GAAmB,KACrB,GACC,CACD/F,GACAD,EACAL,EACA+P,KAGIgB,GAAiBrJ,EAAAA,YAAY0I,MACjChS,EACAiF,EACA2N,KAEA,GAAI1Q,GAAmB,OACvB,GAAkB,aAAdlC,EAAK8F,OAAwBpE,EAAkB,OACnD,GAAkB,UAAd1B,EAAK8F,OAAqBnE,EAAe,OAC7C,GAAkB,SAAd3B,EAAK8F,OAAoBlE,EAAc,OAErC,MAAAwQ,EAAUrS,EAAiBC,GAC3B6S,EAAiB5N,EACjB6N,EACRF,EAEIG,EACJF,IACEG,2BAAyBC,UAAA,MAErB,MAAMC,EACJJ,EAAgBlE,UAEZuE,EACJL,EAAgBjE,QAGhB,GAAY,MAAZqE,GACU,MAAVC,EAEO,OAAA,KAGT,MAAMC,EACJF,EACElT,EAAKG,QAAQ8F,YACfkN,EACEnT,EAAKG,QAAQ8G,SAEXoM,EACJH,EACElT,EAAKG,QAAQ8F,YACfkN,EACEnT,EAAKG,QAAQ8G,SAEb,OAAAmM,IAAaC,EACRH,EACLlT,EAAKG,QAAQ8F,WACX+M,EAAAA,yBAAyBM,WACzBN,EAAyBA,yBAAAO,WAG3BF,EACKL,EAAAA,yBAAyBQ,WAG3B,MAtCc,GAwCvBX,EACIY,EACM,aAAdzT,EAAK8F,MACe,MAApBpE,GACAT,IAEE8R,IAA4BC,EAAyBA,yBAAAQ,YACrDT,IAA4BC,EAAAA,yBAAyBO,YACrDR,IAA4BC,EAAAA,yBAAyBM,YACrDP,IAA4BC,2BAAyBU,gBAE/CC,EAAuBF,EACzBlT,EAASmK,UACNvK,GAAYkE,EAAAA,oBAAoBlE,KAAakE,EAAAA,oBAAoBrE,EAAKG,WAEzE,EAEAsT,GAA8BE,GAAwB,GAAKZ,IAC7DrK,GAA4B5D,QAAU,CACpCG,OAAQ8N,EACRY,uBAEAC,iBAAkBC,KAAKC,UACrBvT,EAASkE,IAAI,CAACtE,EAASgE,KAAW,CAChC4P,IAAK1P,EAAAA,oBACHlE,EACAgE,GAEFyK,UAAWzO,EAAQ8F,WACnB4I,QAAS1O,EAAQ8G,SACjB+M,QAAS7T,EAAQ6T,SAAW,SAIhCC,OAAO,IAIXhM,GAAmBjI,EAAKE,IAEpB,IACgB,aAAdF,EAAK8F,WACDpE,IACJuD,EACA2N,EACAR,IAEqB,UAAdpS,EAAK8F,WACRnE,IACJsD,EACA2N,EACAR,IAEqB,SAAdpS,EAAK8F,YACRlE,IACJqD,EACA2N,EACAR,IAIJrK,GAA6BjD,IACrB,MAAAE,EAAO,IAAIlB,IAAIgB,GAEd,OADFE,EAAAiF,IAAIjK,EAAKE,IACP8E,IAGH,MAAAkP,EAA8B,aAAdlU,EAAK8F,OAAwBiN,IAA4BC,EAAyBA,yBAAAO,YAAcR,IAA4BC,EAAAA,yBAAyBM,YAAcP,IAA4BC,EAAyBA,yBAAAU,gBAGzO,IAD+B,aAAd1T,EAAK8F,MAAuBiN,IAA4BC,EAAyBA,yBAAAQ,YACjFU,IAAkBnB,EAAyB,CACzD,MAAA3O,EAAaC,EAAAA,oBAAoBrE,EAAKG,SAE5C0D,GAAuCiB,IAC/B,MAAAE,EAAO,IAAIlB,IAAIgB,GAQd,OANH+N,IAAmBG,2BAAyBC,UAC9CjO,EAAKiF,IAAI7F,GAETY,EAAKI,OAAOhB,GAGPY,IAETvB,GAAgCqB,IACxB,MAAAE,EAAO,IAAIrB,IAAImB,GAOd,OALFE,EAAAT,IACHH,EACA2O,GAGK/N,GAEX,CAEA,GAAI0D,GAA4B5D,SAG9B,GAFA4D,GAA4B5D,QAAQmP,OAAQ,EAExCC,EAAe,CACjB,MAAMC,EAAc1O,GAAQP,KACzBR,GACiB,UAAhBA,EAAOoB,MACPzB,EAAAA,oBAAoBK,EAAOvE,WAAakE,sBAAoBrE,EAAKG,UAEjEgU,GAAaxE,sBAAsB,IAAMH,GAAa2E,GAC5D,OAEAxC,GAAiB3R,EAAKE,UAEjBwS,GACHe,IACF/K,GAA4B5D,QAAU,MAExC7C,IAAgByQ,EAAON,EAAO,CAC9B,QACAnK,GAAmB,KACrB,GACC,CACDhH,EACAiB,GACAD,EACAP,EACAC,EACAC,EACAC,EACA4D,GACAlF,EACAiP,GACAmC,KAGF9M,EAAAA,UAAU,KACR,MAAMuP,EAAiB1L,GAA4B5D,QAC/C,IAACsP,GAAgBH,MAAO,OAcxB,GAXFJ,KAAKC,UACHvT,EAASkE,IAAI,CAACtE,EAASgE,KAAW,CAChC4P,IAAK1P,EAAAA,oBACHlE,EACAgE,GAEFyK,UAAWzO,EAAQ8F,WACnB4I,QAAS1O,EAAQ8G,SACjB+M,QAAS7T,EAAQ6T,SAAW,WAGFI,EAAeR,iBAAkB,OAE3D,MAAAS,EAAqBD,EAAenP,SAAW+N,EAAAA,yBAAyBQ,WAC1EY,EAAeT,qBAAuB,EACtCS,EAAenP,SAAW+N,EAAAA,yBAAyBM,YACnDc,EAAenP,SAAW+N,EAAAA,yBAAyBU,eACnDY,KAAKC,IAAI,EAAGH,EAAeT,qBAAuB,GAClDS,EAAeT,qBACba,EAAoB,IAAI7Q,IAC5BpD,EAASkE,IAAI,CAACtE,EAASgE,IAAU,CAACE,EAAAA,oBAAoBlE,EAASgE,GAAQA,KAEnE2N,EAAarM,GAAQP,KAAMlF,IAC/B,MAAMyU,EAAeD,EAAkB3O,IAAIxB,EAAoBA,oBAAArE,EAAKG,UAEpE,OAAuB,MAAhBsU,GACLA,GAAgBJ,GAChBlD,GAA4BnR,KAGhC,IAAK8R,EAGH,OAFApJ,GAA4B5D,QAAU,UACpBuL,KAIpBV,sBAAsB,KACpBjH,GAA4B5D,QAAU,KACtC0K,GAAasC,MAEd,CACDzB,GACAc,GACA1L,GACAlF,EACAiP,KAGF3K,EAAAA,UAAU,KACJ6D,GAA4B5D,SAC5BsC,KAAmB3B,GAAQ2E,KAAMpK,GAASA,EAAKE,KAAOkH,KACtCiJ,MAEnB,CAACjJ,GAAgBiJ,GAAmB5K,KAEvCZ,EAAAA,UAAU,KACR,IAAK7D,EAA8B,OACnC,GAAI0H,GAA4B5D,QAAS,OACzC,MAAM4P,EAAajP,GAAQP,KAAMlF,GAASA,EAAKI,aAAe8G,IAC1DwN,GAAcA,EAAWxU,KAAOkH,OAA6BsN,IAChE,CACDtN,GACApG,EACAkG,GACAsI,GACA/J,KAGFZ,EAAAA,UAAU,KACJ6D,GAA4B5D,SAE9BsC,KACC3B,GAAQ2E,KACNpK,GACCA,EAAKE,KAAOkH,KAC8B,IAA1CpH,EAAKG,QAAQqK,YAAYS,eAGXoF,MAEnB,CAACjJ,GAAgBiJ,GAAmB5K,KAEjC,MAAAkP,GAAoBrR,EAAAA,QAAQ,KAChC,MAAMsR,EAAmBnP,GAAQC,OAC9B1F,IAAmD,IAA1CA,EAAKG,QAAQqK,YAAYS,cAKjC,GAAuB,QAAvBnK,EAAqC,OAAA8T,EAEzC,MAAMC,EAA+C,CAAC,MAAO,SAAU,QACpEnP,OAAQ8E,GACPA,IAAe3J,GAEbiU,EAAkB,CAACjU,KAAqBgU,GACxCE,EAAiB,IAAIpR,IACzBmR,EAAgBrQ,IAAI,CAAC+F,EAAYrG,IAAU,CAACqG,EAAYrG,KAG1D,OAAOyQ,EACJnQ,IAAI,CAACzE,EAAMmE,KAAW,CAAEnE,OAAMmE,WAC9BgC,KAAK,CAACC,EAAMC,KACX,MAAM2O,EAAiB5O,EAAKpG,KAAK4F,YAAY4E,YACzCzD,OACD2E,cACGuJ,EAAkB5O,EAAMrG,KAAK4F,YAAY4E,YAC3CzD,OACD2E,cAQH,OAPmC,MAAlBsJ,EACbF,EAAgB1J,OAChB2J,EAAelP,IAAImP,IAAmBF,EAAgB1J,SACrB,MAAnB6J,EACdH,EAAgB1J,OAChB2J,EAAelP,IAAIoP,IAAoBH,EAAgB1J,SAE5BhF,EAAKjC,MAAQkC,EAAMlC,QAEnDM,IAAI,EAAGzE,UAAWA,IACpB,CAACc,EAAoBD,EAAkB4E,KAKpCyP,GAH0BP,GAAkBjK,UAC/C1K,GAASA,EAAKE,KAAOoH,KAGjB6N,GAAsBC,IAA2B1R,WAAwB,OACzE2R,GAAsBC,IAA2B5R,WAEtD,MACI6R,GAA4B/P,UAAO,GAEnCgQ,GAAwBlM,cAAanF,IACnC,MAAAO,EAASiQ,GAAkBxQ,GAC7BO,MAAqBA,IACxB,CAACiQ,GAAmBnF,KAEUlG,EAAYA,YAACnF,IAC5C,IAAK+D,IAAmB/D,EAAQ,GAAKA,GAAS+D,GAAgBgI,MAAM9E,OAClE,OAGI,MAAAhL,EAAa8H,GAAgBgI,MAAM/L,GACvB,MAAd/D,IAEciQ,KAClBlI,GAAoBrD,GAAuB,MAAXA,EAAkBA,EAAU,IACvDA,EACHX,UAEFqE,GAAsB1D,SAAW,EACZ+C,GAAA,CACnBzH,aACAmP,UAAW/G,GAAsB1D,YAElC,CAACoD,GAAiBmI,KAErBxL,EAAAA,UAAU,KAENyC,KACCqN,GAAkBvK,KAChBpK,GAASA,EAAKE,KAAOoH,KAGxBC,GAA8B,OAE/B,CAACoN,GAAmBrN,KAEvBzC,EAAAA,UAAU,KACR0Q,GAA0BzQ,SAAU,EACpCwQ,GAAwB,MACxBF,GACEF,IAA4B,EACxBO,OAAOP,GAA2B,GAClC,OAEL,CAACA,GAA0BP,GAAkBvJ,SAEhDvG,EAAAA,UAAU,KACR,IAAK0Q,GAA0BzQ,SAAmC,MAAxBqQ,GAA8B,OAElE,MAAAO,EAAU7F,OAAOC,WAAW,KAChC,MAAM6F,EAAoBpP,OAAO4O,GAAqBpO,QAChD6O,EAAiBD,EAAoB,EAGzCpP,OAAOoK,UAAUgF,IACjBC,GAAkB,GAClBA,EAAiBjB,GAAkBvJ,SAEnCmK,GAA0BzQ,SAAU,EACpC0Q,GAAsBI,KAEvB,KAEI,MAAA,IAAM/F,OAAOI,aAAayF,IAChC,CAACF,GAAuBL,GAAsBR,GAAkBvJ,SAE7D,MAAAyK,GAAiBvS,EAAAA,QAAQ,KACvB,MAAAwS,MAAuBnS,IAErB8B,GAAAvB,QAASlE,IACT,MAAA+V,EAAiBD,EAAiBjQ,IAAIxB,EAAAA,oBAAoBrE,EAAKG,WAAa,GAClF4V,EAAeC,KAAKhW,GACpB8V,EAAiBvR,IAAIF,EAAAA,oBAAoBrE,EAAKG,SAAU4V,KAGpD,MAAAE,MAAatS,IAWZ,OAVUmS,EAAA5R,QAAQ,CAAC6R,EAAgB3R,KACxC,MAAM8R,EAAgBnS,GAAmB8B,IAAIzB,IAAe,EAE5D2R,EACG5P,KAAK,CAACC,EAAMC,IAAUD,EAAKM,gBAAkBL,EAAMK,iBACnDxC,QAAQ,CAAClE,EAAMmE,KACP8R,EAAA1R,IAAIvE,EAAKE,GAAI,GAAGgW,IAxyCV,CAAC/R,IACtB,IAAIkI,EAAQlI,EAAQ,EAChBgS,EAAS,GAEb,KAAO9J,EAAQ,GACJA,GAAA,EACT8J,EAASV,OAAOW,aAAa,GAAM/J,EAAQ,IAAO8J,EAC1C9J,EAAAiI,KAAK+B,MAAMhK,EAAQ,IAGtB,OAAA8J,GA8xCwCG,CAAenS,UAIrD8R,GACN,CAACxQ,GAAS1B,KAEPwS,GAAgBjT,EAAAA,QAAQ,KACtB,MAAAkT,MAAa7S,IACX8B,GAAAvB,QAASlE,IACf,MAAMqD,EAAcmT,EAAO3Q,IAAI7F,EAAKI,aAAe,GACnDiD,EAAY2S,KAAKhW,GACVwW,EAAAjS,IAAIvE,EAAKI,WAAYiD,KAExB,MAAAoT,MAAY9S,IAIX,OAHA6S,EAAAtS,QAASb,IACdA,EAAYa,QAAQ,CAAClE,EAAMmE,IAAUsS,EAAMlS,IAAIvE,EAAKE,GAAIiE,MAEnDsS,GACN,CAAChR,KAEEiR,GAA0BpN,cAA6BqN,IAAkB,CAC7E/H,UAAW0F,KAAKC,IAAI,EAAGoC,EAAa/H,UAAYzN,GAChD0N,QAASyF,KAAKsC,IACZD,EAAaE,SAAW,EACxBF,EAAa9H,QAAU1N,KAEvB,CAACA,IAEC2V,GAAuBxN,EAAAA,YAAY,KACvC,MAAMyN,EAAUlO,GAAW/D,QACrBkS,EAAalO,GAAchE,QAC7B,IAACiS,IAAYC,EAAY,OAEvB,MAAAC,EAAcF,EAAQrN,wBACtBwN,EAAkBF,EAAWG,cACjC,0BAEIC,EAAcF,GAAiBxN,yBACnCsN,EAAWtN,wBAELjE,GAAAvB,QAASlE,IACf,MAAMqX,EAAQ1O,GAAiB7D,QAAQe,IAAI7F,EAAKE,IAChD,IAAKmX,EAAO,OAEZ,MAAMC,EAAON,EAAWG,cACtB,kCAAkCnX,EAAKI,WAAa,OAGtD,IAAKkX,EAEH,YADAD,EAAM5U,MAAM8U,WAAa,UAIrB,MAAAC,EAAWF,EAAK5N,wBAChB+N,EAAOlB,GAAc1Q,IAAI7F,EAAKE,KAAO,EACrCwX,EAAWF,EAASG,IAAMvW,EAAwB,GAAPqW,EAC3CG,EAAcF,GAAYL,EAAMQ,cAAgB,IAChDC,EACJJ,GAAYN,EAAYO,KAAOC,GAAeR,EAAYW,OAE5DV,EAAM5U,MAAMkV,IAASD,EAAWT,EAAYU,IAA1B,KACZN,EAAA5U,MAAM8U,WAAaO,EAAyB,UAAY,WAKhE,MAAME,EAAOpP,GAAoB9D,QACjC,GAAIkT,EAAM,CACR,MAAM5X,EAAa8H,IAAiBgI,MAAMhI,GAAgB/D,OACpDmT,EAAqB,MAAdlX,EAAqB,KAAO4W,EAAWG,cAClD,kCAAkC/W,EAAa,OAG7C,GAAC8H,IAAoBoP,EAElB,CACC,MACAW,EADWX,EAAK5N,wBACGiO,IAAMvW,EACzB8W,EAAaD,GAAWD,EAAKH,cAAgB,IAC7CM,EACJF,GAAWb,EAAYO,KAAOO,GAAcd,EAAYW,OAE1DC,EAAKvV,MAAMkV,IAASM,EAAUhB,EAAYU,IAAzB,KACZK,EAAAvV,MAAM8U,WAAaY,EAAwB,UAAY,QAC9D,MAVEH,EAAKvV,MAAM8U,WAAa,QAW5B,CAKI,GAAAnQ,IAAkD,MAAhCqB,GAAqB3D,QAAiB,CAC1D,MAAMsT,EAAczP,GAAiB7D,QAAQe,IAAIuB,IAC7CgR,GAAgD,WAAjCA,EAAY3V,MAAM8U,YACnC5P,GAAkB7C,GAAYA,IAAYsT,EAActT,EAAUsT,EAEtE,GACC,CAAClQ,GAAiBd,GAAgBhG,EAAgBmV,GAAe9Q,KAE9D4S,GAA0B/O,cAC9BgP,IAEA,MAAMC,EAAoB9P,GAAqB3D,QAE5CyT,GACDA,EAAkBhJ,YAAc+I,EAAM/I,WACtCgJ,EAAkBnY,aAAekY,EAAMlY,aAKzCqI,GAAqB3D,QAAU,KACVgS,KAErBnH,sBAAsB,KAChB,GAAgC,MAAhClH,GAAqB3D,QAAiB,OAC1C,MAAMuS,EAAQ1O,GAAiB7D,QAAQe,IAAI0S,EAAkBtY,UACzDoX,GAAoC,WAA3BA,EAAM5U,MAAM8U,eAA0CF,OAEpE,CAACP,KA2CF,OAzCFjS,EAAAA,UAAU,KACR,MAAMmS,EAAalO,GAAchE,QAC7B,IAACkS,IAAepW,EAAY,OAEhC,IAAI8O,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,EAAiB7O,QAAQmN,EAAY,CACnC4B,WAAW,EACXC,SAAS,EACTC,YAAY,EACZC,gBAAiB,CAAC,WAGpB,MAAMpP,EAA2C,oBAAnBC,eAC1B,KACA,IAAIA,eAAe4O,GAKvB,OAJA7O,GAAgBE,QAAQmN,GAEDwB,IAEhB,KACU,MAAX9I,GAAiBM,qBAAqBN,GAC/BsH,EAAAgC,oBAAoB,SAAUR,GAAwB,GAC1D3I,OAAAmJ,oBAAoB,SAAUR,GACrCE,EAAiB5O,aACjBH,GAAgBG,eAEjB,CAAClJ,EAAYkW,KAGdmC,EAAAA,KAAC,MAAA,CACCC,IAAKrQ,GACLrG,aACAC,MAAO,IACFA,GACH0W,QAAS,QACTC,SAAU,WACVjQ,MAAO,OACPkQ,OAAQ,OACRC,SAAU,EACVC,UAAW,OACXC,UAAW,UAGbC,SAAA,CAAAR,EAAAA,KAAC,MAAA,CACCzW,UAAU,oCACVC,MAAO,CACL0W,QAAS,OACTO,WAAY,UACZ9N,IAAK,EACLzC,MAAO,OACPmQ,SA7oDsB,IA8oDtBD,OAAQ,QAGZI,SAAA,CAAAE,EAAAA,IAAC,MAAA,CACCT,IAAKpQ,GACLrG,MAAO,IACFC,GACHkX,KAAM,WACNzQ,MAAOvI,EAAa,OAAS,OAC7B0Y,SAAU,EACVD,OAAQ,OACRQ,UAAW,cAGbJ,SAAAE,EAAAA,IAACG,EAAA,QAAA,CACCC,cAAe,GACfC,eAAgB,CAAC,EACjBC,wBAAyB,GACzBC,gBAAgB,EAChBC,kBAAkB,KACdzZ,EACJ0Z,QAASpX,GACTqX,kBAEM,IADJ1Z,EACID,GAAgB2Z,cAAgBza,mBAAiBC,QACjDH,EAA+BiB,GAErCwB,yBACAC,uBACA/B,SACAC,UACAC,SAAUqG,GACVgB,qBACA0S,oBAAqBjC,GACrBkC,eAAgB7D,GAChB1U,oBAAsB5B,IACpB+G,GAAe/G,GAEmB,MAAhCqI,GAAqB3D,SACrBoF,IACAA,GAAa9J,aAAeA,GAEViQ,KAEpBrO,IAAsB5B,QAK3BQ,GACCqY,EAAAA,KAAC,QAAA,CACC,aAAW,qBACXC,IAAK3T,GACL9C,MAAO,IACFE,GACHyW,SAAU,WACVjQ,MAAOC,GACPoR,SAAUhb,EACVoa,KAAM,OAAOxQ,KACbqR,UAAW,EACXC,SAAU,SACVb,UAAW,cAIZJ,SAAA,CACCvR,IAAAyR,EAAAA,IAAC,OAAA,CACCT,IAAKtQ,GACLnG,MAAO,CACL2W,SAAU,WACVzB,IAAK,EACLvR,KAAM,GACNmR,WAAY,SACZoD,OAAQ,EACRxB,QAAS,cACTO,WAAY,SACZkB,eAAgB,SAChBhP,IAAK,EACL6O,UAAW,GACXI,QAAS,UACTC,OAAQ,oBACRC,aAAc,GACdC,gBAAiB,UACjBnB,UAAW,aACXoB,UAAW,mCACXC,KAAM,WAGRzB,SAAAR,EAAAA,KAACkC,EAAAA,WAAA,CACCC,WAAY,QACZC,GAAI,CAAEC,SAAU,GAAIC,WAAY,IAAKC,MAAO,UAAWC,WAAY,UAElEhC,SAAA,CAAAvR,GAAgBpB,OAAS,QAAQ,QAAMoB,GAAgB/D,MAAQ,OAMrEpD,GAAuB4T,GAAkBvJ,OAAS,IAAMlD,IACvD+Q,EAAAA,KAAC,MAAA,CACC,aAAW,0BACXxW,MAAO,CACL2W,SAAU,WACVzB,IAAK,EACLtR,MAAOhF,GAAsC,OAC7C+E,KAAM9E,GAAoC,OAC1CqZ,OAAQ,EACRxB,QAAS,OACTO,WAAY,SACZ9N,IAAK,EACLzC,MAAO,IACPsR,UAAW,GACXI,QAAS,UACTC,OAAQ,oBACRC,aAAc,EACdC,gBAAiB,UACjBnB,UAAW,aACXoB,UAAW,mCACXC,KAAM,WAGRzB,SAAA,CAAAE,EAAAA,IAAC+B,EAAAA,QAAA,CACC7U,MAAgC,iBAAzBwO,GACH,iDACA,6BACJsG,KAA8B,MAAxBtG,GACNuG,UAAU,MACVC,OAAK,EAELpC,SAAAE,EAAAA,IAAC,QAAA,CACClO,KAAK,OACLqQ,UAAU,UACVC,QAAQ,SACR1P,MAAO8I,IAAwB,IAC/ByB,IAAK,EACLrC,IAAKI,GAAkBvJ,OACvB,aAAW,sBACX,eAAsC,MAAxBiK,GACd2G,QAAS,KACqB,MAAxB7G,IAA8BC,GAAwB,KAE5D6G,OAAQ,KACN3G,GAAwB,MAClB,MAAA4G,EAAe3V,OAAO4O,KAEF,MAAxBA,IACyB,KAAzBA,KACC5O,OAAOoK,UAAUuL,IAClBA,EAAe,GACfA,EAAevH,GAAkBvJ,UAEjCmK,GAA0BzQ,SAAU,EACpCsQ,GACEF,IAA4B,EACxBO,OAAOP,GAA2B,GAClC,QAIViH,SAAW7D,IACH,MAAA8D,EAAa9D,EAAM+D,OAAOhQ,MAChC,IAAK,QAAQiQ,KAAKF,GAEhB,YADA9G,GAAwB,kBAIpB,MAAA4G,EAAe3V,OAAO6V,GACtBG,EAA8B,KAAfH,IACnBF,EAAe,GAAKA,EAAevH,GAAkBvJ,QAE/BkK,GAAAiH,EAAe,eAAiB,MACxDhH,GAA0BzQ,SAAU,EACpCsQ,GAAwBgH,IAE1B3Z,MAAO,CACL0G,MAAO,GACPkQ,OAAQ,GACRwB,QAAS,EACTC,OAAQ,cAAazF,GAAuB,UAAY,WACxD0F,aAAc,EACdS,MAAO,UACPR,gBAAiB,UACjBwB,UAAW,SACXtB,KAAM,UACNI,SAAU,GACVmB,QAAS,YAIfxD,EAAAA,KAAC,OAAA,CACC,aAAY,GAAGtE,GAAkBvJ,iBACjC3I,MAAO,CACLmX,KAAM,EACN4B,MAAO,UACPF,SAAU,GACVG,WAAY,SACZe,UAAW,UAEd/C,SAAA,CAAA,MACK9E,GAAkBvJ,UAEtB,CAAC,WAAY,QAAkB3G,IAAKiY,IACpC,MAAMC,EAA2B,aAAdD,EACbE,EAAc1H,IAA4ByH,GAAkB,EAAA,GAC5DE,EAAaD,EAAc,GAAKA,GAAejI,GAAkBvJ,OAGrE,OAAAuO,EAAAA,IAAC,SAAA,CAEClO,KAAK,SACL,cAAekR,EAAa,WAAa,QAA7B,gBACZG,SAAUD,EACVE,QAAS,IAAMvH,GAAsBoH,GACrCna,MAAO,CACL0W,QAAS,OACT6D,WAAY,SACZ7T,MAAO,GACPkQ,OAAQ,GACRwB,QAAS,EACTC,OAAQ,EACRmC,WAAY,cACZzB,MAAOqB,EAAa,UAAY,UAChCK,OAAQL,EAAa,UAAY,WAGnCpD,SAAAE,EAAAA,IAAC,OAAIxQ,MAAM,KAAKkQ,OAAO,IAAI8D,QAAQ,WAAWC,KAAK,OACjD3D,SAAAE,EAAAA,IAAC,OAAA,CACC0D,EAAGV,EAAa,gBAAkB,gBAClCW,OAAO,eACPC,YAAY,MACZC,cAAc,QACdC,eAAe,aAvBdf,SAgCbxU,IAAmBzC,GAAQhB,IAAKzE,IAC1B,MAAA0d,EAAWtW,KAAmBpH,EAAKE,GACnC4G,EAAQ+O,GAAehQ,IAAI7F,EAAKE,KAAO,KACvCqK,EAAQvK,EAAK4F,YAAY2E,MACzBC,EAAaxK,EAAK4F,YAAY4E,WAC9BmT,EAAeC,EAAAA,YAAYrT,EAAOC,GAClCqT,EAAsC,aAAd7d,EAAK8F,KAC/BgG,EAAAA,kCACE9L,EAAK4F,YACL5F,EAAKG,QACLqD,GAA4BqC,IAAIxB,EAAAA,oBAAoBrE,EAAKG,WAE7C,UAAdH,EAAK8F,KACLkG,EAAAA,+BACEhM,EAAK4F,YACL5F,EAAKG,QACLqD,GAA4BqC,IAAIxB,EAAAA,oBAAoBrE,EAAKG,WAE3D,KACE2d,EAAaD,IACA,QAAjBF,EAAyBA,EAAe,GAAGA,MAEvCI,GAA0D,IAA1C/d,EAAKG,QAAQqK,YAAYS,aACzC+S,EAAmBhT,EAAAA,oBACvBT,EACAC,EACAuT,GAEIE,EAAalU,GAAkBzF,IAAItE,EAAKE,IACxC2c,EAAakB,EAEjB,OAAApE,EAAAA,IAAC+B,EAAAA,QAAA,CAEC7U,MAAOkX,EAAgB,0BAA4B,GACnDlC,OAAK,EAELpC,SAAAE,EAAAA,IAAC,OAAA,CACCT,IAAMgF,IACAA,EAA0BvV,GAAA7D,QAAQP,IAAIvE,EAAKE,GAAIge,GAC7BvV,GAAA7D,QAAQM,OAAOpF,EAAKE,KAE5CuC,MAAO,CACL2W,SAAU,WACVzB,IAAK,EACLvR,KAAM,GACNmR,WAAY,SACZ4B,QAAS,cACT+D,OAAQL,EAAa,cAAgB,WAGvCpD,SAAAE,EAAAA,IAAC,SAAA,CACCmD,SAAUD,EACVpR,KAAK,SACL,eAAciS,EACd,aAAYK,EACR,GAAG/d,EAAK4F,YAAY6F,eAAezL,EAAKI,uCACxC,GAAGJ,EAAK4F,YAAY6F,eAAezL,EAAKI,aAC5C2c,QAAS,IAAMvN,GAAaxP,GAC5ByC,MAAO,CACLya,OAAQ,UACR/D,QAAS,OACTO,WAAY,SACZkB,eAAgB,eAChBhP,IAAK,EACLzC,MAAO0U,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,EAAiBzS,KACnE2P,KAAM,UACNiD,aAAc,SACdlD,UAAW,oCAGhBxB,aAAesE,EACb9E,EAAAA,KAAAkC,EAAAA,WAAA,CAAWC,WAAY,QAASC,GAAI,CAAElC,QAAS,OAAOvN,IAAI,EAAG8N,WAAY,SAAU0E,cAAe,OACjG3E,SAAA,CAACE,EAAAA,IAAA,OAAA,CAAKlX,MAAO,CAAE6Y,SAAU,GAAIC,WAAY,KAAQ9B,SAAM3S,IACvDmS,OAAC,QAAKxW,MAAO,CAAE0W,QAAS,OAAQO,WAAY,UAAYD,SAAA,CAAAE,EAAAA,IAAC,OAAIxQ,MAAM,IAAIkQ,OAAO,KAAK8D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BACtH5E,SAAAE,EAAAA,IAAC,QAAK0D,EAAE,iBAAiBC,OAAQ,UAAWC,YAAY,UAEvD5D,EAAAA,IAAA,OAAA,CAAKlX,MAAO,CAAE6Y,SAAU,GAAIC,WAAY,IAAK+C,WAAY,MAAOnF,QAAS,OAAQO,WAAY,UAAaD,SAAWqE,OAGvH7E,EAAAA,KAAA,OAAA,CAAKxW,MAAO,CAAE6Y,SAAU,GAAIC,WAAY,IAAKpC,QAAS,OAAQO,WAAY,UACzED,SAAA,CAAAE,EAAAA,IAAC,OAAIxQ,MAAM,IAAIkQ,OAAO,KAAK8D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BAC9D5E,SAAAE,EAAAA,IAAC,QAAK0D,EAAE,iBAAiBC,OAAQ,UAAWC,YAAY,UAE1D5D,EAAAA,IAAC,QAAKlX,MAAO,CAAE0W,QAAS,OAAQmF,WAAY,MAAO5E,WAAY,UAAYD,SAACE,MAAA4E,EAAAA,YAAA,CAAYlF,OAAQ,GAAIlQ,MAAO,GAAIoU,YAAa,EAAG/B,MAAM,oBAIzIvC,EAAAA,KAACkC,EAAWA,WAAA,CAAAC,WAAY,QAASC,GAAI,CAAElC,QAAS,OAAQvN,IAAK,EAAG8N,WAAY,SAAU0E,cAAe,OACnG3E,SAAA,CAACE,EAAAA,IAAA,OAAA,CAAKlX,MAAO,CAAE6Y,SAAU,GAAIC,WAAY,KAAQ9B,SAAM3S,IACvDmS,OAAC,QAAKxW,MAAO,CAAE0W,QAAS,OAAQO,WAAY,UAAYD,SAAA,CAACE,EAAAA,IAAA,MAAA,CAAIxQ,MAAM,IAAIkQ,OAAO,KAAK8D,QAAQ,WAAWC,KAAK,OAAOiB,MAAM,6BACtH5E,SAACE,MAAA,OAAA,CAAK0D,EAAE,iBAAiBC,OAAQU,EAAiBQ,QAASjB,YAAY,UAEtE5D,EAAAA,IAAA,OAAA,CAAKlX,MAAO,CAAE6Y,SAAU,GAAIC,WAAY,IAAK+C,WAAY,MAAOnF,QAAS,OAAQO,WAAY,UAAaD,SAAWqE,eApEvH9d,EAAKE,YAiFnBgK,IAAgBxC,IACfuR,EAAAA,KAACwF,EAAA,QAAA,CACC/W,iBACAkU,UAAU,eACV8C,OAAQ,CAAE/G,IAAK,GACfxO,MAAOmL,KAAKsC,IAAI7N,GAAYvJ,GAC5Bgb,SAAUhb,EACViC,aAAcA,GAAgB,GAE7BgY,SAAA,CACCjS,IAAAmS,EAAAA,IAACgF,EAAA,QAAA,CACCxV,MAAM,OACNqR,SAAS,OACTjQ,MAAOL,GAAatE,YAAY2E,MAChCY,QAASD,GACTS,OAAQzB,GAAatE,YAAY+F,OACjCC,IAAK1B,GAAatE,YAAYgG,IAC9BgT,OAAQ,IAAMnX,IAA4B,GAC1CoX,QAASxO,KAGZsJ,EAAAA,IAAA,MAAA,CAAIlX,MAAO,CAAE0W,QAAS3R,GAA2B,OAAS,SACxDiS,SAAA1P,GAAkBzF,IAAI4F,GAAahK,IAClCyZ,EAAAA,IAACmF,EAAA,QAAA,CACC3V,MAAM,OACNqR,SAAS,OACTuE,WAAkC,SAAtB7U,GAAapE,KACrB,uBAC4B,UAA5B+F,GACE,iBAC4B,WAA5BA,GACE,iBACA,gBACRmT,WAAkC,SAAtB9U,GAAapE,WACpBmZ,EAAMA,MAAA,CAAA1V,KAAM,GAAIgU,YAAa,IACF,WAA5B1R,GACE8N,EAAAA,IAACuF,YAAS3V,KAAM,GAAIgU,YAAa,IACL,UAA5B1R,GACE8N,EAAAA,IAACwF,WAAoBhW,MAAO,GAAIkQ,OAAQ,KACvCM,EAAAA,IAAA4E,cAAA,CAAYhV,KAAM,GAAIgU,YAAa,IAC5C1W,MAAOkG,GACPqS,OAAQ,QAAQlV,GAAa/J,QAAQ8F,cAAciE,GAAa/J,QAAQ8G,WACxEuH,QAASa,IAAoBX,GAC1BuK,EAAAA,KAAAoG,EAAAA,MAAA,CAAMC,QAAS,IACb7F,SAAA,CACChL,IAAAkL,EAAAA,IAAC4F,EAA0B,QAAA,CAAAC,KAAO7F,EAAAA,IAAA4E,EAAAA,YAAA,CAAYhV,KAAM,GAAIgU,YAAa,IAAOkC,YAAahR,KAG1F3L,IAGC6W,EAAAA,IAAC+F,EAAA,QAAA,CACC5C,SAAU5a,GACVyd,OAAQ3N,UACN,MAAM4N,QAAe9c,GACnB,CAAE+c,YAAa3R,IAAkBE,cAAgB,MACjDrO,EAAiBmK,KAOZ,OAJH0V,GAAUA,EAAOE,SACDzP,KAGbuP,GAETG,eAAgB,KACdlS,GAA2B/I,IACnB,MAAAE,EAAO,IAAIlB,IAAIgB,GAEd,OADFE,EAAAiF,IAAIC,GAAahK,IACf8E,IAESqL,MAEpB2P,YAActN,IACIzQ,IAAAyQ,EAAO3S,EAAiBmK,QAIhDyP,EAAAA,IAACsG,EAAA,QAAA,CACCT,KAAO7F,EAAAA,IAAA4E,cAAA,CAAYhV,KAAM,GAAIgU,YAAa,IAC1C1W,MAAOkG,GACPmT,UAAW,QAAQhW,GAAa/J,QAAQ8F,cAAciE,GAAa/J,QAAQ8G,WAC3EwY,YAAahR,IAA2B,KACxC0R,WAAYzR,GACZ0R,gBAAuC,SAAtBlW,GAAapE,MAAmBqJ,GAAoC,MAAZrN,IAAqBqN,GAC9FkR,oBAAoB,EACpBve,SAAUkQ,UACJ,GAAsB,SAAtB9H,GAAapE,KAAiB,CAChC,IAAKjE,GAA2D,IAAvCkN,GAA4B3D,OAAc,CACjE,MAAMsH,EAAQ,IAAI4N,MAChB,wHAGI,MADUre,IAAAyQ,EAAO3S,EAAiBmK,KAClCwI,CACR,CAEA,IAAIkN,EACJ,IAAA,MAAWpP,KAAoBzB,GAC7B6Q,QAAe/d,EACb,CAAEqN,kBAAmBsB,EAAkB+P,cAAe,MACtDxgB,EAAiBmK,KAGd,OAAA0V,CACT,CAEA,IAAK9d,EACG,MAAA,IAAIwe,MAAM,8EAGlB,IAAKpS,GACG,MAAA,IAAIoS,MAAM,uDAGZ,MAAAE,EAAqBvS,GACvB,WACsB,UAAtB/D,GAAapE,KACX,QACsB,aAAtBoE,GAAapE,KACX,WACA,KAEF2a,EAAmBtT,GAAoBe,GAAiBzC,MAE1D,GAAA+U,GAAsBC,IAAqBD,EAC7C,MAAM,IAAIF,MACR,cAAcG,GAAoB,uDAAuDD,MAI7F,OAAO1e,EAASoM,GAAkBnO,EAAiBmK,MAErDwW,cAAgBhO,IACEzQ,IAAAyQ,EAAO3S,EAAiBmK,MAE1CyW,iBAAmBf,IACW7X,GAAA,IAAU,IAAAjE,KAEZ,SAAtBoG,GAAapE,OACuBjC,GAAA,IAAU,IAAAC,KACjBL,GAAA,IAAU,IAAAE,MAG3C,MAAMid,EAAkBlS,GAAiBI,iBAAiB,IAAMJ,GAAiBC,eAC3EkS,EAAanZ,IAAegC,wBAC5BoX,EAAahY,GAAchE,SAAS4E,wBACpCqX,EAAazM,KAAKsC,IAAIpX,EAAuB8U,KAAKC,IAAI,IAAKxL,KAC3DiY,EAAgBH,GAAYza,OAAU0a,GAAYza,OAASwJ,OAAOoR,WAAaF,EAAa,GAAK,EACjGG,EAAY5M,KAAKC,IAAI,EAAGD,KAAKsC,IAAIoK,EAAenR,OAAOoR,WAAaF,EAAa,IACjFI,EAAiC,MAAtBN,GAAY9I,OAAiBzD,KAAKC,IAAI,EAAGuM,GAAYnJ,KAAO,GAAKkJ,EAAW9I,OAAS,EAE1EhQ,GAAA,IAAU,IAAAjE,KACZ,SAAtBoG,GAAapE,OACf4C,GAA4B5D,QAAU,MAExCyD,IAAwB,GACPF,GAAA,CACfxB,MAAmC,UAA5BgF,GACH,iBAC4B,WAA5BA,GACE,iBACA,oBACN4T,YAAaG,GAAQwB,SAASra,QAAU,KACxC5G,QAASygB,EACTxH,SAAU,CAAEzB,IAAKwJ,EAAU/a,KAAM8a,EAAW/X,MAAO4X,KAEnC1Q,gBAItB,EACFgR,kBAAmB3U,GACjBiN,EAAAA,IAAC2H,EAAA,QAAA,CACCvb,SAAU2G,GAAqB3G,SAC/Bwb,aAAcrX,GAAa/J,QAAQyM,oBAAiB,EACpDgC,UAAW1E,GAAa/J,QAAQ8F,WAChC4I,QAAS3E,GAAa/J,QAAQ8G,SAC9BJ,MAAOkG,GACPlC,wBACAC,oBACAgS,SACE5a,KACCR,GACDsG,KAAoBkC,GAAahK,GAEnCshB,UAAW,CAACvc,EAAQ2N,KACbD,GAAejG,GAAsBzH,EAAQ2N,WAGpD,EACJ6O,eAAgBvX,GAAatE,YAAY2E,MACzC9J,OAAQ,CACNihB,KAAM,CAAEC,YAAa,WACrBC,OAAQ,CACN,8CAA+C,CAC7CpG,MAAO,aAIbjZ,iBAAkB8I,GACd,KACA5D,IAA4B,GACTlF,KAAAxC,EAAiBmK,WAEpC,EACJ2U,QAASxO,KAEW,aAAtBnG,GAAapE,KACb6T,EAAAA,IAACkI,EAAA,QAAA,CAEC1Y,MAAM,OACNqR,SAAS,OACTha,aACAqG,MAAOqD,GAAa/J,QAAQ2G,OAASoD,GAAa/J,QAAQ0G,MAC1DuY,OAAQ,QAAQlV,GAAa9J,aAC7B0hB,QAAS5X,GAAatE,YAAYmc,UAAY,KAC9CC,cAAezT,GACfkT,eAAgBvX,GAAatE,YAAY2E,MACzCxE,SAAUmE,GAAanE,SACvBwb,aAAcrX,GAAa/J,QAAQyM,oBAAiB,EACpD/B,wBACAC,oBACAtJ,aAAcA,GAAgB,wBAC9BygB,iBAAkB/X,GAAa/J,QAAQ8F,WACvCic,eAAgBhY,GAAa/J,QAAQ8G,SACrCxG,OAAQ,CACNihB,KAAM,CACJC,YAAa5W,GAAmBoX,YAElCP,OAAQ,CACN,8CAA+C,CAC7CpG,MAAOzQ,GAAmBQ,QAIhC6U,gBACEle,KACCR,GACDsG,KAAoBkC,GAAahK,GAEnCshB,UAAW,CAACY,EAAgBC,EAAQzP,KAC9BA,GAAW0P,EAAAA,uBAAuBD,EAAOniB,KACtCyS,GAAezI,GAAcmY,EAAOniB,GAAI0S,IAGjDtQ,iBAAkB,IAAMA,KAAmBvC,EAAiBmK,KAC5D3H,iBAAkB8I,GACd,KACA5D,IAA4B,GACTlF,KAAAxC,EAAiBmK,WAEpC,EACJ2U,QAASxO,IA3CJnG,GAAahK,IA6CI,UAAtBgK,GAAapE,KACf6T,EAAAA,IAAC4I,EAAA,QAAA,CAECpZ,MAAM,OACNqR,SAAS,OACT3T,MACEqD,GAAanE,SAASyc,eACtBtY,GAAa/J,QAAQ2G,OACrBoD,GAAa/J,QAAQ0G,MAEvBuY,OAAQ,SAASlV,GAAa/J,QAAQ8F,cAAciE,GAAa/J,QAAQ8G,WACzE6a,QAAS5X,GAAatE,YAAYmc,UAAY,KAC9CC,cAAezT,GACfkT,eAAgBvX,GAAatE,YAAY2E,MACzCxE,SAAUmE,GAAanE,SACvBtF,OAAQ,CACNihB,KAAM,CACJC,YAAa5W,GAAmBoX,YAElCP,OAAQ,CACN,8CAA+C,CAC7CpG,MAAOzQ,GAAmBQ,QAIhC6U,gBACEle,KACCP,GACDqG,KAAoBkC,GAAahK,GAEnCuiB,oBAAqBtY,GACrBuY,oBAAqBvY,GACjB,gEACA,EACJwY,gBAAiB,CAAC1d,EAAQ2N,KACnBD,GAAezI,GAAcjF,EAAQ2N,IAE5CtQ,iBAAkB,IAAMA,KAAmBvC,EAAiBmK,KAC5D3H,iBAAkB8I,GACd,KACA5D,IAA4B,GACTlF,KAAAxC,EAAiBmK,WAEpC,EACJ2U,QAASxO,IA1CJnG,GAAahK,IA4C6B,IAA/CgK,GAAanE,SAASiJ,cAAc5D,OACtCuO,EAAAA,IAACiJ,EAAA,QAAA,CAECzZ,MAAM,OACNqR,SAAS,OACT3T,MAAOqD,GAAa/J,QAAQ2G,OAASoD,GAAa/J,QAAQ0G,MAC1DuY,OAAQ,QAAQlV,GAAa9J,aAC7B0hB,QAAS5X,GAAatE,YAAY+F,OAClCuG,QAAShI,GAAanE,SAASiJ,aAC/ByS,eAAgBvX,GAAatE,YAAY2E,MACzC9J,OAAQ,CACNihB,KAAM,CACJC,YAAa5W,GAAmBoX,YAElCP,OAAQ,CACN,8CAA+C,CAC7CpG,MAAOzQ,GAAmBQ,QAIhC6U,gBACEle,KACCN,GACDoG,KAAoBkC,GAAahK,GAEnCshB,UAAYvP,IACLF,GAAwB7H,GAAc+H,IAE7C1P,iBAAkB8I,GACd,KACA5D,IAA4B,GACTlF,KAAAxC,EAAiBmK,WAEpC,EACJ2U,QAASxO,IAhCJnG,GAAahK,IAmCpByZ,EAAAA,IAACkJ,EAAA,QAAA,CAEC1Z,MAAM,OACNqR,SAAS,OACT3T,MAAOqD,GAAa/J,QAAQ2G,OAASoD,GAAa/J,QAAQ0G,MAC1DuY,OAAQ,QAAQlV,GAAa9J,aAC7B0hB,QAAS5X,GAAatE,YAAY+F,OAClC8V,eAAgBvX,GAAatE,YAAY2E,MACzCsG,SAAU3G,GAAanE,SAASiL,UAChCjL,SAAUmE,GAAanE,SACvBtF,OAAQ,CACNihB,KAAM,CACJC,YAAa5W,GAAmBoX,YAElCP,OAAQ,CACN,8CAA+C,CAC7CpG,MAAOzQ,GAAmBQ,QAIhC6U,gBACEle,KACCN,GACDoG,KAAoBkC,GAAahK,GAEnCyiB,gBAAiB,CAAC1d,EAAQ2N,KACnBD,GAAezI,GAAcjF,EAAQ2N,IAE5CrQ,iBAAkB8I,GACd,KACA5D,IAA4B,GACTlF,KAAAxC,EAAiBmK,WAEpC,EACJ2U,QAASxO,IAjCJnG,GAAahK,SAuC3BkI,UACE0a,SACC,CAAArJ,SAAAE,EAAAA,IAACoJ,EAAAA,IAAA,CACC,YAAU,SACV1H,GAAI,CACFjC,SAAU,QACVzB,IAAKvP,GAAcgR,SAASzB,IAC5BvR,KAAMgC,GAAcgR,SAAShT,KAC7BuU,OAAQ,KACRxR,MAAOf,GAAcgR,SAASjQ,MAC9BqR,SAAU,qBACVwI,QAAS1a,GAAuB,EAAI,EACpC2a,UAAW3a,GACP,gBACA,mBACJ4a,WAAY,2CACZxd,OAAQ,kDACRyd,cAAe7a,GAAuB,OAAS,QAGjDmR,SAAAE,EAAAA,IAACyJ,EAAA,QAAA,CACCvc,MAAOuB,GAAcvB,MACrB4Y,YAAarX,GAAcqX,YAC3B4D,SAAU,IAAMpS,GAAsB7I,GAAcjI,iBAOlE"}